| // 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 rematerialization ignoring the register constraint |
| // during regalloc's shuffle phase. |
| |
| package p |
| |
| import ( |
| "simd/archsimd" |
| ) |
| |
| func PackComplex(b bool) { |
| for { |
| if b { |
| var indices [4]uint32 |
| archsimd.Uint32x4{}.ShiftAllRight(20).Store(&indices) |
| _ = indices[indices[0]] |
| } |
| } |
| } |
| |
| func PackComplex2(x0 uint16, src [][4]float32, b, b2 bool) { |
| var out [][4]byte |
| if b2 { |
| for y := range x0 { |
| row := out[:x0] |
| for x := range row { |
| px := &src[y] |
| if b { |
| var indices [4]uint32 |
| fu := archsimd.LoadFloat32x4(px).AsUint32x4() |
| fu.ShiftAllRight(0).Store(nil) |
| entry := archsimd.LoadUint32x4(&[4]uint32{ |
| toSrgbTable[indices[0]], |
| }) |
| var res [4]uint32 |
| entry.ShiftAllRight(19).Store(nil) |
| row[x] = [4]uint8{ |
| uint8(res[0]), |
| uint8(res[1]), |
| uint8(res[2]), |
| } |
| } else { |
| row[x] = [4]uint8{ |
| float32ToSrgb8(0), |
| float32ToSrgb8(1), |
| float32ToSrgb8(2), |
| } |
| } |
| } |
| out = out[len(out):] |
| } |
| } |
| } |
| |
| var toSrgbTable = [4]uint32{} |
| |
| func float32ToSrgb8(f float32) uint8 { |
| f = min(0, f) |
| fu := uint32(f) |
| entry := toSrgbTable[fu] |
| return uint8(entry * fu) |
| } |