Source file
test/codegen/simd_arm64.go
1
2
3
4
5
6
7
8
9
10
11 package codegen
12
13 import (
14 "simd/archsimd"
15 )
16
17
18 func forceSpill() {}
19
20 func spillAroundCall(a archsimd.Int8x16) archsimd.Int8x16 {
21 forceSpill()
22
23 return a
24 }
25
26 var (
27 sinkU8 archsimd.Uint8x16
28 sinkI8 archsimd.Int8x16
29 sinkU16 archsimd.Uint16x8
30 sinkU32 archsimd.Uint32x4
31 sinkU64 archsimd.Uint64x2
32 sinkF32 archsimd.Float32x4
33 sinkF64 archsimd.Float64x2
34 )
35
36 func broadcastConstImmFold(k int) {
37 switch k {
38 case 0:
39
40 sinkU8 = archsimd.BroadcastUint8x16(0)
41 case 1:
42
43 sinkU8 = archsimd.BroadcastUint8x16(1)
44 case 127:
45
46 sinkI8 = archsimd.BroadcastInt8x16(127)
47 case 128:
48
49 sinkU8 = archsimd.BroadcastUint8x16(128)
50 case -128:
51
52 sinkI8 = archsimd.BroadcastInt8x16(-128)
53 case 255:
54
55 sinkU8 = archsimd.BroadcastUint8x16(255)
56 case -1:
57
58 sinkI8 = archsimd.BroadcastInt8x16(-1)
59 case -2:
60
61 sinkI8 = archsimd.BroadcastInt8x16(-2)
62 default:
63
64 sinkI8 = archsimd.BroadcastInt8x16(int8(k))
65 }
66 }
67
68 func shiftAllImmFold(k int) {
69 switch k {
70 case 100:
71
72 sinkI8 = sinkI8.ShiftAllLeft(100)
73
74 sinkU8 = sinkU8.ShiftAllRight(100)
75 }
76 }
77
78 func setHiUint32(x, lo archsimd.Uint32x4) {
79
80 sinkU32 = loToHiUint32Vec(x, lo)
81 }
82
83 func setHiFloat64(x, lo archsimd.Float64x2) {
84
85 sinkF64 = x.SetElem(1, lo.GetElem(0))
86 }
87
88 func getHiFloat32(x archsimd.Float32x4) {
89
90 sinkF32 = x.HiToLo()
91 }
92
93 func getHiFloat64(x archsimd.Float64x2) {
94
95 sinkF64 = x.HiToLo()
96 }
97
98 func foldGetHiSetHiMuls(a, b archsimd.Uint16x8) archsimd.Uint16x8 {
99 wLo := a.MulWidenLo(b)
100 wHi := a.HiToLo().MulWidenLo(b.HiToLo())
101 narrowLo := wLo.TruncToUint16()
102 narrowHi := wHi.TruncToUint16()
103 return loToHiUint16Vec(narrowLo, narrowHi)
104 }
105
106 func carrylessMultiplies(x, y archsimd.Uint64x2) archsimd.Uint64x2 {
107 lo := x.CarrylessMultiplyEven(y)
108 hi := x.HiToLo().CarrylessMultiplyEven(y.HiToLo())
109 return lo.Xor(hi)
110 }
111
112 func mergeWithNotMask(x, y archsimd.Int8x16, mask archsimd.Mask8x16, f1, f2 archsimd.Float32x4) {
113
114 sinkI8 = x.IfElse(mask.Not(), y)
115
116 eq := f1.Equal(f2)
117
118 ne := f1.NotEqual(f2)
119 feq := f1.IfElse(eq, f2)
120 fne := f1.IfElse(ne, f2)
121 sinkF32 = fne.Add(feq)
122 }
123
124
125
126
127
128 func loToHiUint32Vec(x, lo archsimd.Uint32x4) archsimd.Uint32x4 {
129 return x.ReshapeToUint64s().BitsToFloat64().SetElem(1, lo.ReshapeToUint64s().BitsToFloat64().GetElem(0)).ToBits().ReshapeToUint32s()
130 }
131
132
133
134
135
136 func loToHiUint16Vec(x, lo archsimd.Uint16x8) archsimd.Uint16x8 {
137 return x.ReshapeToUint64s().BitsToFloat64().SetElem(1, lo.ReshapeToUint64s().BitsToFloat64().GetElem(0)).ToBits().ReshapeToUint16s()
138 }
139
View as plain text