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