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