| // compile | |
| //go:build amd64 && goexperiment.simd | |
| // Copyright 2025 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| // Test case for ICE on picking the wrong type for the spill slot. | |
| package p | |
| import ( | |
| "simd/archsimd" | |
| "unsafe" | |
| ) | |
| func F( | |
| dst *[2][4][4]float32, | |
| tos *[2][4][4]float32, | |
| blend int, | |
| ) { | |
| tiny := archsimd.BroadcastFloat32x8(0) | |
| for { | |
| dstCol12 := archsimd.LoadFloat32x8Array((*[8]float32)(unsafe.Pointer((*[2][4]float32)(dst[0][0:])))) | |
| dstCol34 := archsimd.LoadFloat32x8Array((*[8]float32)(unsafe.Pointer((*[2][4]float32)(dst[0][2:])))) | |
| dstCol56 := archsimd.LoadFloat32x8Array((*[8]float32)(unsafe.Pointer((*[2][4]float32)(dst[1][0:])))) | |
| dstCol78 := archsimd.LoadFloat32x8Array((*[8]float32)(unsafe.Pointer((*[2][4]float32)(dst[1][2:])))) | |
| tosCol12 := archsimd.LoadFloat32x8Array((*[8]float32)(unsafe.Pointer((*[2][4]float32)(tos[0][0:])))) | |
| tosCol34 := archsimd.LoadFloat32x8Array((*[8]float32)(unsafe.Pointer((*[2][4]float32)(tos[0][2:])))) | |
| tosCol56 := archsimd.LoadFloat32x8Array((*[8]float32)(unsafe.Pointer((*[2][4]float32)(tos[1][0:])))) | |
| tosCol78 := archsimd.LoadFloat32x8Array((*[8]float32)(unsafe.Pointer((*[2][4]float32)(tos[1][2:])))) | |
| var Cr0, Cr1, Cr2 archsimd.Float32x8 | |
| if blend != 0 { | |
| invas := tosCol78.Max(tiny) | |
| invad := dstCol78.Max(tiny) | |
| Cd0 := dstCol12.Mul(invad) | |
| Cd1 := dstCol34.Mul(invad) | |
| Cd2 := dstCol56.Mul(invad) | |
| Cs0 := tosCol12.Mul(invas) | |
| Cs1 := tosCol34.Mul(invas) | |
| Cs2 := tosCol56.Mul(invas) | |
| var Cm0, Cm1, Cm2 archsimd.Float32x8 | |
| switch blend { | |
| case 4: | |
| case 10: | |
| case 11: | |
| case 8: | |
| case 5: | |
| case 1: | |
| case 0: | |
| Cm1 = Cs1 | |
| case 2: | |
| Cm0 = Cd0.Add(Cs0) | |
| Cm1 = Cd1.Add(Cs1) | |
| Cm2 = Cd2.Add(Cs2) | |
| } | |
| Cr0 = dstCol78.Mul(Cs0).Mul(Cm0) | |
| Cr1 = dstCol78.Mul(Cs1).Mul(Cm1) | |
| Cr2 = dstCol78.Mul(Cs2).Mul(Cm2) | |
| } | |
| var resR, resG, resB, resA archsimd.Float32x8 | |
| if blend == 0 { | |
| resR = tosCol12 | |
| resG = tosCol34 | |
| resB = tosCol56 | |
| resA = tosCol78 | |
| } else { | |
| resR = Cr0.Add(dstCol12) | |
| resG = Cr1.Add(dstCol34) | |
| resB = Cr2.Add(dstCol56) | |
| } | |
| resR.StoreArray((*[8]float32)(unsafe.Pointer((*[2][4]float32)(dst[0][0:2])))) | |
| resG.StoreArray((*[8]float32)(unsafe.Pointer((*[2][4]float32)(dst[0][2:4])))) | |
| resB.StoreArray((*[8]float32)(unsafe.Pointer((*[2][4]float32)(dst[1][0:2])))) | |
| resA.StoreArray((*[8]float32)(unsafe.Pointer((*[2][4]float32)(dst[1][2:4])))) | |
| } | |
| } |