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