1
2
3 package arm64
4
5 import (
6 "cmd/compile/internal/ssa"
7 "cmd/compile/internal/ssagen"
8 "cmd/internal/obj"
9 "cmd/internal/obj/arm64"
10 )
11
12 func ssaGenSIMDValue(s *ssagen.State, v *ssa.Value) bool {
13 var p *obj.Prog
14 switch v.Op {
15 case ssa.OpARM64VABS16B,
16 ssa.OpARM64VCLS16B,
17 ssa.OpARM64VCLZ16B,
18 ssa.OpARM64VNEG16B,
19 ssa.OpARM64VNOT16B,
20 ssa.OpARM64VCNT16B:
21 p = simdV11(s, v, arm64.ARNG_16B)
22
23 case ssa.OpARM64VFABS2D,
24 ssa.OpARM64VABS2D,
25 ssa.OpARM64VFRINTP2D,
26 ssa.OpARM64VSCVTF2D,
27 ssa.OpARM64VUCVTF2D,
28 ssa.OpARM64VFCVTZS2D,
29 ssa.OpARM64VFCVTZU2D,
30 ssa.OpARM64VFRINTM2D,
31 ssa.OpARM64VFNEG2D,
32 ssa.OpARM64VNEG2D,
33 ssa.OpARM64VFRINTN2D,
34 ssa.OpARM64VFSQRT2D,
35 ssa.OpARM64VFRINTZ2D:
36 p = simdV11(s, v, arm64.ARNG_2D)
37
38 case ssa.OpARM64VFABS4S,
39 ssa.OpARM64VABS4S,
40 ssa.OpARM64VFRINTP4S,
41 ssa.OpARM64VSCVTF4S,
42 ssa.OpARM64VUCVTF4S,
43 ssa.OpARM64VFCVTZS4S,
44 ssa.OpARM64VFCVTZU4S,
45 ssa.OpARM64VFRINTM4S,
46 ssa.OpARM64VCLS4S,
47 ssa.OpARM64VCLZ4S,
48 ssa.OpARM64VFNEG4S,
49 ssa.OpARM64VNEG4S,
50 ssa.OpARM64VFRINTN4S,
51 ssa.OpARM64VFSQRT4S,
52 ssa.OpARM64VFRINTZ4S:
53 p = simdV11(s, v, arm64.ARNG_4S)
54
55 case ssa.OpARM64VABS8H,
56 ssa.OpARM64VCLS8H,
57 ssa.OpARM64VCLZ8H,
58 ssa.OpARM64VNEG8H:
59 p = simdV11(s, v, arm64.ARNG_8H)
60
61 case ssa.OpARM64VSHL16B,
62 ssa.OpARM64VSQSHL16Bconst,
63 ssa.OpARM64VUQSHL16Bconst,
64 ssa.OpARM64VSSHR16B,
65 ssa.OpARM64VUSHR16B:
66 p = simdV11Imm(s, v, arm64.ARNG_16B)
67
68 case ssa.OpARM64VSHL2D,
69 ssa.OpARM64VSQSHL2Dconst,
70 ssa.OpARM64VUQSHL2Dconst,
71 ssa.OpARM64VSSHR2D,
72 ssa.OpARM64VUSHR2D:
73 p = simdV11Imm(s, v, arm64.ARNG_2D)
74
75 case ssa.OpARM64VSHL4S,
76 ssa.OpARM64VSQSHL4Sconst,
77 ssa.OpARM64VUQSHL4Sconst,
78 ssa.OpARM64VSSHR4S,
79 ssa.OpARM64VUSHR4S:
80 p = simdV11Imm(s, v, arm64.ARNG_4S)
81
82 case ssa.OpARM64VSHL8H,
83 ssa.OpARM64VSQSHL8Hconst,
84 ssa.OpARM64VUQSHL8Hconst,
85 ssa.OpARM64VSSHR8H,
86 ssa.OpARM64VUSHR8H:
87 p = simdV11Imm(s, v, arm64.ARNG_8H)
88
89 case ssa.OpARM64VDUPBbcast:
90 p = simdV11ImmIn1(s, v, arm64.ARNG_B)
91
92 case ssa.OpARM64VDUPDbcast:
93 p = simdV11ImmIn1(s, v, arm64.ARNG_D)
94
95 case ssa.OpARM64VDUPHbcast:
96 p = simdV11ImmIn1(s, v, arm64.ARNG_H)
97
98 case ssa.OpARM64VDUPSbcast:
99 p = simdV11ImmIn1(s, v, arm64.ARNG_S)
100
101 case ssa.OpARM64VSMAXV16B,
102 ssa.OpARM64VUMAXV16B,
103 ssa.OpARM64VSMINV16B,
104 ssa.OpARM64VUMINV16B,
105 ssa.OpARM64VADDV16B:
106 p = simdV11Scalar(s, v, arm64.ARNG_16B)
107
108 case ssa.OpARM64VFMAXV4S,
109 ssa.OpARM64VSMAXV4S,
110 ssa.OpARM64VUMAXV4S,
111 ssa.OpARM64VFMINV4S,
112 ssa.OpARM64VSMINV4S,
113 ssa.OpARM64VUMINV4S,
114 ssa.OpARM64VADDV4S:
115 p = simdV11Scalar(s, v, arm64.ARNG_4S)
116
117 case ssa.OpARM64VSMAXV8H,
118 ssa.OpARM64VUMAXV8H,
119 ssa.OpARM64VSMINV8H,
120 ssa.OpARM64VUMINV8H,
121 ssa.OpARM64VADDV8H:
122 p = simdV11Scalar(s, v, arm64.ARNG_8H)
123
124 case ssa.OpARM64VDUPDextr:
125 p = simdV11ScalarImmIn1(s, v, arm64.ARNG_D)
126
127 case ssa.OpARM64VDUPSextr:
128 p = simdV11ScalarImmIn1(s, v, arm64.ARNG_S)
129
130 case ssa.OpARM64VADD16B,
131 ssa.OpARM64VSQADD16B,
132 ssa.OpARM64VUQADD16B,
133 ssa.OpARM64VAND16B,
134 ssa.OpARM64VBIC16B,
135 ssa.OpARM64VSRHADD16B,
136 ssa.OpARM64VURHADD16B,
137 ssa.OpARM64VUZP116B,
138 ssa.OpARM64VUZP216B,
139 ssa.OpARM64VCMEQ16B,
140 ssa.OpARM64VCMGT16B,
141 ssa.OpARM64VCMHI16B,
142 ssa.OpARM64VCMGE16B,
143 ssa.OpARM64VCMHS16B,
144 ssa.OpARM64VZIP216B,
145 ssa.OpARM64VZIP116B,
146 ssa.OpARM64VSMAX16B,
147 ssa.OpARM64VUMAX16B,
148 ssa.OpARM64VSMIN16B,
149 ssa.OpARM64VUMIN16B,
150 ssa.OpARM64VMUL16B,
151 ssa.OpARM64VORR16B,
152 ssa.OpARM64VORN16B,
153 ssa.OpARM64VSSHL16B,
154 ssa.OpARM64VUSHL16B,
155 ssa.OpARM64VSQSHL16B,
156 ssa.OpARM64VUQSHL16B,
157 ssa.OpARM64VSUB16B,
158 ssa.OpARM64VSQSUB16B,
159 ssa.OpARM64VUQSUB16B,
160 ssa.OpARM64VTRN116B,
161 ssa.OpARM64VTRN216B,
162 ssa.OpARM64VEOR16B:
163 p = simdV21(s, v, arm64.ARNG_16B)
164
165 case ssa.OpARM64VFADD2D,
166 ssa.OpARM64VADD2D,
167 ssa.OpARM64VSQADD2D,
168 ssa.OpARM64VUQADD2D,
169 ssa.OpARM64VFADDP2D,
170 ssa.OpARM64VADDP2D,
171 ssa.OpARM64VUZP12D,
172 ssa.OpARM64VUZP22D,
173 ssa.OpARM64VFDIV2D,
174 ssa.OpARM64VFCMEQ2D,
175 ssa.OpARM64VCMEQ2D,
176 ssa.OpARM64VFCMGT2D,
177 ssa.OpARM64VCMGT2D,
178 ssa.OpARM64VCMHI2D,
179 ssa.OpARM64VFCMGE2D,
180 ssa.OpARM64VCMGE2D,
181 ssa.OpARM64VCMHS2D,
182 ssa.OpARM64VZIP22D,
183 ssa.OpARM64VZIP12D,
184 ssa.OpARM64VFMAX2D,
185 ssa.OpARM64VFMIN2D,
186 ssa.OpARM64VFMUL2D,
187 ssa.OpARM64VSSHL2D,
188 ssa.OpARM64VUSHL2D,
189 ssa.OpARM64VSQSHL2D,
190 ssa.OpARM64VUQSHL2D,
191 ssa.OpARM64VFSUB2D,
192 ssa.OpARM64VSUB2D,
193 ssa.OpARM64VSQSUB2D,
194 ssa.OpARM64VUQSUB2D,
195 ssa.OpARM64VTRN12D,
196 ssa.OpARM64VTRN22D:
197 p = simdV21(s, v, arm64.ARNG_2D)
198
199 case ssa.OpARM64VFADD4S,
200 ssa.OpARM64VADD4S,
201 ssa.OpARM64VSQADD4S,
202 ssa.OpARM64VUQADD4S,
203 ssa.OpARM64VSRHADD4S,
204 ssa.OpARM64VURHADD4S,
205 ssa.OpARM64VFADDP4S,
206 ssa.OpARM64VADDP4S,
207 ssa.OpARM64VUZP14S,
208 ssa.OpARM64VUZP24S,
209 ssa.OpARM64VFDIV4S,
210 ssa.OpARM64VFCMEQ4S,
211 ssa.OpARM64VCMEQ4S,
212 ssa.OpARM64VFCMGT4S,
213 ssa.OpARM64VCMGT4S,
214 ssa.OpARM64VCMHI4S,
215 ssa.OpARM64VFCMGE4S,
216 ssa.OpARM64VCMGE4S,
217 ssa.OpARM64VCMHS4S,
218 ssa.OpARM64VZIP24S,
219 ssa.OpARM64VZIP14S,
220 ssa.OpARM64VFMAX4S,
221 ssa.OpARM64VSMAX4S,
222 ssa.OpARM64VUMAX4S,
223 ssa.OpARM64VFMIN4S,
224 ssa.OpARM64VSMIN4S,
225 ssa.OpARM64VUMIN4S,
226 ssa.OpARM64VFMUL4S,
227 ssa.OpARM64VMUL4S,
228 ssa.OpARM64VSSHL4S,
229 ssa.OpARM64VUSHL4S,
230 ssa.OpARM64VSQSHL4S,
231 ssa.OpARM64VUQSHL4S,
232 ssa.OpARM64VFSUB4S,
233 ssa.OpARM64VSUB4S,
234 ssa.OpARM64VSQSUB4S,
235 ssa.OpARM64VUQSUB4S,
236 ssa.OpARM64VTRN14S,
237 ssa.OpARM64VTRN24S:
238 p = simdV21(s, v, arm64.ARNG_4S)
239
240 case ssa.OpARM64VADD8H,
241 ssa.OpARM64VSQADD8H,
242 ssa.OpARM64VUQADD8H,
243 ssa.OpARM64VSRHADD8H,
244 ssa.OpARM64VURHADD8H,
245 ssa.OpARM64VADDP8H,
246 ssa.OpARM64VUZP18H,
247 ssa.OpARM64VUZP28H,
248 ssa.OpARM64VCMEQ8H,
249 ssa.OpARM64VCMGT8H,
250 ssa.OpARM64VCMHI8H,
251 ssa.OpARM64VCMGE8H,
252 ssa.OpARM64VCMHS8H,
253 ssa.OpARM64VZIP28H,
254 ssa.OpARM64VZIP18H,
255 ssa.OpARM64VSMAX8H,
256 ssa.OpARM64VUMAX8H,
257 ssa.OpARM64VSMIN8H,
258 ssa.OpARM64VUMIN8H,
259 ssa.OpARM64VMUL8H,
260 ssa.OpARM64VSSHL8H,
261 ssa.OpARM64VUSHL8H,
262 ssa.OpARM64VSQSHL8H,
263 ssa.OpARM64VUQSHL8H,
264 ssa.OpARM64VSUB8H,
265 ssa.OpARM64VSQSUB8H,
266 ssa.OpARM64VUQSUB8H,
267 ssa.OpARM64VTRN18H,
268 ssa.OpARM64VTRN28H:
269 p = simdV21(s, v, arm64.ARNG_8H)
270
271 case ssa.OpARM64VEXT16B:
272 p = simdV21Imm(s, v, arm64.ARNG_16B)
273
274 case ssa.OpARM64VMLA16B,
275 ssa.OpARM64VBIT16B,
276 ssa.OpARM64VBIF16B:
277 p = simdV31ResultInArg0(s, v, arm64.ARNG_16B)
278
279 case ssa.OpARM64VFMLA2D:
280 p = simdV31ResultInArg0(s, v, arm64.ARNG_2D)
281
282 case ssa.OpARM64VFMLA4S,
283 ssa.OpARM64VMLA4S:
284 p = simdV31ResultInArg0(s, v, arm64.ARNG_4S)
285
286 case ssa.OpARM64VMLA8H:
287 p = simdV31ResultInArg0(s, v, arm64.ARNG_8H)
288
289 case ssa.OpARM64VMOVBextr:
290 p = simdVgpImmIn1(s, v, arm64.ARNG_B)
291
292 case ssa.OpARM64VMOVDextr:
293 p = simdVgpImmIn1(s, v, arm64.ARNG_D)
294
295 case ssa.OpARM64VMOVHextr:
296 p = simdVgpImmIn1(s, v, arm64.ARNG_H)
297
298 case ssa.OpARM64VMOVSextr:
299 p = simdVgpImmIn1(s, v, arm64.ARNG_S)
300
301 case ssa.OpARM64VMOVBins:
302 p = simdVgpvResultInArg0ImmOutIn0(s, v, arm64.ARNG_B)
303
304 case ssa.OpARM64VMOVDins:
305 p = simdVgpvResultInArg0ImmOutIn0(s, v, arm64.ARNG_D)
306
307 case ssa.OpARM64VMOVHins:
308 p = simdVgpvResultInArg0ImmOutIn0(s, v, arm64.ARNG_H)
309
310 case ssa.OpARM64VMOVSins:
311 p = simdVgpvResultInArg0ImmOutIn0(s, v, arm64.ARNG_S)
312
313 case ssa.OpARM64VMOVDins0:
314 p = simdVfpvResultInArg0ImmOutIn1(s, v, arm64.ARNG_D)
315
316 case ssa.OpARM64VMOVSins0:
317 p = simdVfpvResultInArg0ImmOutIn1(s, v, arm64.ARNG_S)
318
319 case ssa.OpARM64VSXTL16B,
320 ssa.OpARM64VUXTL16B:
321 p = simdV11Long(s, v, arm64.ARNG_16B)
322
323 case ssa.OpARM64VFCVTL4S,
324 ssa.OpARM64VSXTL4S,
325 ssa.OpARM64VUXTL4S:
326 p = simdV11Long(s, v, arm64.ARNG_4S)
327
328 case ssa.OpARM64VSXTL8H,
329 ssa.OpARM64VUXTL8H:
330 p = simdV11Long(s, v, arm64.ARNG_8H)
331
332 case ssa.OpARM64VFCVTN2D,
333 ssa.OpARM64VSQXTN2D,
334 ssa.OpARM64VSQXTUN2D,
335 ssa.OpARM64VUQXTN2D,
336 ssa.OpARM64VXTN2D:
337 p = simdV11Narrow(s, v, arm64.ARNG_2D)
338
339 case ssa.OpARM64VSQXTN4S,
340 ssa.OpARM64VSQXTUN4S,
341 ssa.OpARM64VUQXTN4S,
342 ssa.OpARM64VXTN4S:
343 p = simdV11Narrow(s, v, arm64.ARNG_4S)
344
345 case ssa.OpARM64VSQXTN8H,
346 ssa.OpARM64VSQXTUN8H,
347 ssa.OpARM64VUQXTN8H,
348 ssa.OpARM64VXTN8H:
349 p = simdV11Narrow(s, v, arm64.ARNG_8H)
350
351 case ssa.OpARM64VSHRN2D:
352 p = simdV11ImmNarrow(s, v, arm64.ARNG_2D)
353
354 case ssa.OpARM64VSHRN4S:
355 p = simdV11ImmNarrow(s, v, arm64.ARNG_4S)
356
357 case ssa.OpARM64VSHRN8H:
358 p = simdV11ImmNarrow(s, v, arm64.ARNG_8H)
359
360 case ssa.OpARM64VSSHLL16B,
361 ssa.OpARM64VUSHLL16B:
362 p = simdV11ImmLong(s, v, arm64.ARNG_16B)
363
364 case ssa.OpARM64VSSHLL4S,
365 ssa.OpARM64VUSHLL4S:
366 p = simdV11ImmLong(s, v, arm64.ARNG_4S)
367
368 case ssa.OpARM64VSSHLL8H,
369 ssa.OpARM64VUSHLL8H:
370 p = simdV11ImmLong(s, v, arm64.ARNG_8H)
371
372 case ssa.OpARM64VSMULL16B,
373 ssa.OpARM64VUMULL16B:
374 p = simdV21Long(s, v, arm64.ARNG_16B)
375
376 case ssa.OpARM64VSMULL4S,
377 ssa.OpARM64VUMULL4S:
378 p = simdV21Long(s, v, arm64.ARNG_4S)
379
380 case ssa.OpARM64VSMULL8H,
381 ssa.OpARM64VUMULL8H:
382 p = simdV21Long(s, v, arm64.ARNG_8H)
383
384 case ssa.OpARM64VSXTL2_16B,
385 ssa.OpARM64VUXTL2_16B:
386 p = simdV11Long2(s, v, arm64.ARNG_16B)
387
388 case ssa.OpARM64VFCVTL2_4S,
389 ssa.OpARM64VSXTL2_4S,
390 ssa.OpARM64VUXTL2_4S:
391 p = simdV11Long2(s, v, arm64.ARNG_4S)
392
393 case ssa.OpARM64VSXTL2_8H,
394 ssa.OpARM64VUXTL2_8H:
395 p = simdV11Long2(s, v, arm64.ARNG_8H)
396
397 case ssa.OpARM64VFCVTN2_2D,
398 ssa.OpARM64VSQXTN2_2D,
399 ssa.OpARM64VSQXTUN2_2D,
400 ssa.OpARM64VUQXTN2_2D,
401 ssa.OpARM64VXTN2_2D:
402 p = simdV21Narrow2(s, v, arm64.ARNG_2D)
403
404 case ssa.OpARM64VSQXTN2_4S,
405 ssa.OpARM64VSQXTUN2_4S,
406 ssa.OpARM64VUQXTN2_4S,
407 ssa.OpARM64VXTN2_4S:
408 p = simdV21Narrow2(s, v, arm64.ARNG_4S)
409
410 case ssa.OpARM64VSQXTN2_8H,
411 ssa.OpARM64VSQXTUN2_8H,
412 ssa.OpARM64VUQXTN2_8H,
413 ssa.OpARM64VXTN2_8H:
414 p = simdV21Narrow2(s, v, arm64.ARNG_8H)
415
416 case ssa.OpARM64VSHRN2_2D:
417 p = simdV21ImmNarrow2(s, v, arm64.ARNG_2D)
418
419 case ssa.OpARM64VSHRN2_4S:
420 p = simdV21ImmNarrow2(s, v, arm64.ARNG_4S)
421
422 case ssa.OpARM64VSHRN2_8H:
423 p = simdV21ImmNarrow2(s, v, arm64.ARNG_8H)
424
425 case ssa.OpARM64VSSHLL2_16B,
426 ssa.OpARM64VUSHLL2_16B:
427 p = simdV11ImmLong2(s, v, arm64.ARNG_16B)
428
429 case ssa.OpARM64VSSHLL2_4S,
430 ssa.OpARM64VUSHLL2_4S:
431 p = simdV11ImmLong2(s, v, arm64.ARNG_4S)
432
433 case ssa.OpARM64VSSHLL2_8H,
434 ssa.OpARM64VUSHLL2_8H:
435 p = simdV11ImmLong2(s, v, arm64.ARNG_8H)
436
437 case ssa.OpARM64VSMULL2_16B,
438 ssa.OpARM64VUMULL2_16B:
439 p = simdV21Long2(s, v, arm64.ARNG_16B)
440
441 case ssa.OpARM64VSMULL2_4S,
442 ssa.OpARM64VUMULL2_4S:
443 p = simdV21Long2(s, v, arm64.ARNG_4S)
444
445 case ssa.OpARM64VSMULL2_8H,
446 ssa.OpARM64VUMULL2_8H:
447 p = simdV21Long2(s, v, arm64.ARNG_8H)
448
449 case ssa.OpARM64VTBL16B:
450 p = simdV21List(s, v, arm64.ARNG_16B)
451
452 case ssa.OpARM64VTBX16B:
453 p = simdV31ResultInArg0List(s, v, arm64.ARNG_16B)
454
455 default:
456
457 return false
458 }
459
460
461 _ = p
462 return true
463 }
464
View as plain text