1
2
3 package ssa
4
5 type SIMDLogicalOP uint8
6
7 const (
8
9
10
11 sloInterior SIMDLogicalOP = 1
12 sloNone SIMDLogicalOP = 2 * iota
13 sloAnd
14 sloOr
15 sloAndNot
16 sloXor
17 sloNot
18 )
19
20 func classifyBooleanSIMD(v *Value) SIMDLogicalOP {
21 switch v.Op {
22 case OpAndInt8x16, OpAndInt16x8, OpAndInt32x4, OpAndInt64x2, OpAndInt8x32, OpAndInt16x16, OpAndInt32x8, OpAndInt64x4, OpAndInt8x64, OpAndInt16x32, OpAndInt32x16, OpAndInt64x8:
23 return sloAnd
24
25 case OpOrInt8x16, OpOrInt16x8, OpOrInt32x4, OpOrInt64x2, OpOrInt8x32, OpOrInt16x16, OpOrInt32x8, OpOrInt64x4, OpOrInt8x64, OpOrInt16x32, OpOrInt32x16, OpOrInt64x8:
26 return sloOr
27
28 case OpAndNotInt8x16, OpAndNotInt16x8, OpAndNotInt32x4, OpAndNotInt64x2, OpAndNotInt8x32, OpAndNotInt16x16, OpAndNotInt32x8, OpAndNotInt64x4, OpAndNotInt8x64, OpAndNotInt16x32, OpAndNotInt32x16, OpAndNotInt64x8:
29 return sloAndNot
30 case OpXorInt8x16:
31 if y := v.Args[1]; y.Op == OpEqualInt8x16 &&
32 y.Args[0] == y.Args[1] {
33 return sloNot
34 }
35 return sloXor
36 case OpXorInt16x8:
37 if y := v.Args[1]; y.Op == OpEqualInt16x8 &&
38 y.Args[0] == y.Args[1] {
39 return sloNot
40 }
41 return sloXor
42 case OpXorInt32x4:
43 if y := v.Args[1]; y.Op == OpEqualInt32x4 &&
44 y.Args[0] == y.Args[1] {
45 return sloNot
46 }
47 return sloXor
48 case OpXorInt64x2:
49 if y := v.Args[1]; y.Op == OpEqualInt64x2 &&
50 y.Args[0] == y.Args[1] {
51 return sloNot
52 }
53 return sloXor
54 case OpXorInt8x32:
55 if y := v.Args[1]; y.Op == OpEqualInt8x32 &&
56 y.Args[0] == y.Args[1] {
57 return sloNot
58 }
59 return sloXor
60 case OpXorInt16x16:
61 if y := v.Args[1]; y.Op == OpEqualInt16x16 &&
62 y.Args[0] == y.Args[1] {
63 return sloNot
64 }
65 return sloXor
66 case OpXorInt32x8:
67 if y := v.Args[1]; y.Op == OpEqualInt32x8 &&
68 y.Args[0] == y.Args[1] {
69 return sloNot
70 }
71 return sloXor
72 case OpXorInt64x4:
73 if y := v.Args[1]; y.Op == OpEqualInt64x4 &&
74 y.Args[0] == y.Args[1] {
75 return sloNot
76 }
77 return sloXor
78 case OpXorInt8x64:
79 if y := v.Args[1]; y.Op == OpEqualInt8x64 &&
80 y.Args[0] == y.Args[1] {
81 return sloNot
82 }
83 return sloXor
84 case OpXorInt16x32:
85 if y := v.Args[1]; y.Op == OpEqualInt16x32 &&
86 y.Args[0] == y.Args[1] {
87 return sloNot
88 }
89 return sloXor
90 case OpXorInt32x16:
91 if y := v.Args[1]; y.Op == OpEqualInt32x16 &&
92 y.Args[0] == y.Args[1] {
93 return sloNot
94 }
95 return sloXor
96 case OpXorInt64x8:
97 if y := v.Args[1]; y.Op == OpEqualInt64x8 &&
98 y.Args[0] == y.Args[1] {
99 return sloNot
100 }
101 return sloXor
102
103 }
104 return sloNone
105 }
106
107 func ternOpForLogical(op Op) Op {
108 switch op {
109 case OpAndInt8x16, OpOrInt8x16, OpXorInt8x16, OpAndNotInt8x16:
110 return OpternInt32x4
111 case OpAndUint8x16, OpOrUint8x16, OpXorUint8x16, OpAndNotUint8x16:
112 return OpternUint32x4
113 case OpAndInt16x8, OpOrInt16x8, OpXorInt16x8, OpAndNotInt16x8:
114 return OpternInt32x4
115 case OpAndUint16x8, OpOrUint16x8, OpXorUint16x8, OpAndNotUint16x8:
116 return OpternUint32x4
117 case OpAndInt32x4, OpOrInt32x4, OpXorInt32x4, OpAndNotInt32x4:
118 return OpternInt32x4
119 case OpAndUint32x4, OpOrUint32x4, OpXorUint32x4, OpAndNotUint32x4:
120 return OpternUint32x4
121 case OpAndInt64x2, OpOrInt64x2, OpXorInt64x2, OpAndNotInt64x2:
122 return OpternInt64x2
123 case OpAndUint64x2, OpOrUint64x2, OpXorUint64x2, OpAndNotUint64x2:
124 return OpternUint64x2
125 case OpAndInt8x32, OpOrInt8x32, OpXorInt8x32, OpAndNotInt8x32:
126 return OpternInt32x8
127 case OpAndUint8x32, OpOrUint8x32, OpXorUint8x32, OpAndNotUint8x32:
128 return OpternUint32x8
129 case OpAndInt16x16, OpOrInt16x16, OpXorInt16x16, OpAndNotInt16x16:
130 return OpternInt32x8
131 case OpAndUint16x16, OpOrUint16x16, OpXorUint16x16, OpAndNotUint16x16:
132 return OpternUint32x8
133 case OpAndInt32x8, OpOrInt32x8, OpXorInt32x8, OpAndNotInt32x8:
134 return OpternInt32x8
135 case OpAndUint32x8, OpOrUint32x8, OpXorUint32x8, OpAndNotUint32x8:
136 return OpternUint32x8
137 case OpAndInt64x4, OpOrInt64x4, OpXorInt64x4, OpAndNotInt64x4:
138 return OpternInt64x4
139 case OpAndUint64x4, OpOrUint64x4, OpXorUint64x4, OpAndNotUint64x4:
140 return OpternUint64x4
141 case OpAndInt8x64, OpOrInt8x64, OpXorInt8x64, OpAndNotInt8x64:
142 return OpternInt32x16
143 case OpAndUint8x64, OpOrUint8x64, OpXorUint8x64, OpAndNotUint8x64:
144 return OpternUint32x16
145 case OpAndInt16x32, OpOrInt16x32, OpXorInt16x32, OpAndNotInt16x32:
146 return OpternInt32x16
147 case OpAndUint16x32, OpOrUint16x32, OpXorUint16x32, OpAndNotUint16x32:
148 return OpternUint32x16
149 case OpAndInt32x16, OpOrInt32x16, OpXorInt32x16, OpAndNotInt32x16:
150 return OpternInt32x16
151 case OpAndUint32x16, OpOrUint32x16, OpXorUint32x16, OpAndNotUint32x16:
152 return OpternUint32x16
153 case OpAndInt64x8, OpOrInt64x8, OpXorInt64x8, OpAndNotInt64x8:
154 return OpternInt64x8
155 case OpAndUint64x8, OpOrUint64x8, OpXorUint64x8, OpAndNotUint64x8:
156 return OpternUint64x8
157
158 }
159 return op
160 }
161
View as plain text