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.OpARM64VSSHR16B,
63 ssa.OpARM64VUSHR16B,
64 ssa.OpARM64VSQSHL16Bconst,
65 ssa.OpARM64VUQSHL16Bconst:
66 p = simdV11Imm(s, v, arm64.ARNG_16B)
67
68 case ssa.OpARM64VSHL2D,
69 ssa.OpARM64VSSHR2D,
70 ssa.OpARM64VUSHR2D,
71 ssa.OpARM64VSQSHL2Dconst,
72 ssa.OpARM64VUQSHL2Dconst:
73 p = simdV11Imm(s, v, arm64.ARNG_2D)
74
75 case ssa.OpARM64VSHL4S,
76 ssa.OpARM64VSSHR4S,
77 ssa.OpARM64VUSHR4S,
78 ssa.OpARM64VSQSHL4Sconst,
79 ssa.OpARM64VUQSHL4Sconst:
80 p = simdV11Imm(s, v, arm64.ARNG_4S)
81
82 case ssa.OpARM64VSHL8H,
83 ssa.OpARM64VSSHR8H,
84 ssa.OpARM64VUSHR8H,
85 ssa.OpARM64VSQSHL8Hconst,
86 ssa.OpARM64VUQSHL8Hconst:
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.OpARM64VTRN116B,
145 ssa.OpARM64VZIP216B,
146 ssa.OpARM64VZIP116B,
147 ssa.OpARM64VTRN216B,
148 ssa.OpARM64VSMAX16B,
149 ssa.OpARM64VUMAX16B,
150 ssa.OpARM64VSMIN16B,
151 ssa.OpARM64VUMIN16B,
152 ssa.OpARM64VMUL16B,
153 ssa.OpARM64VORR16B,
154 ssa.OpARM64VORN16B,
155 ssa.OpARM64VSSHL16B,
156 ssa.OpARM64VUSHL16B,
157 ssa.OpARM64VSQSHL16B,
158 ssa.OpARM64VUQSHL16B,
159 ssa.OpARM64VSUB16B,
160 ssa.OpARM64VSQSUB16B,
161 ssa.OpARM64VUQSUB16B,
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.OpARM64VTRN12D,
183 ssa.OpARM64VZIP22D,
184 ssa.OpARM64VZIP12D,
185 ssa.OpARM64VTRN22D,
186 ssa.OpARM64VFMAX2D,
187 ssa.OpARM64VFMIN2D,
188 ssa.OpARM64VFMUL2D,
189 ssa.OpARM64VSSHL2D,
190 ssa.OpARM64VUSHL2D,
191 ssa.OpARM64VSQSHL2D,
192 ssa.OpARM64VUQSHL2D,
193 ssa.OpARM64VFSUB2D,
194 ssa.OpARM64VSUB2D,
195 ssa.OpARM64VSQSUB2D,
196 ssa.OpARM64VUQSUB2D:
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.OpARM64VTRN14S,
219 ssa.OpARM64VZIP24S,
220 ssa.OpARM64VZIP14S,
221 ssa.OpARM64VTRN24S,
222 ssa.OpARM64VFMAX4S,
223 ssa.OpARM64VSMAX4S,
224 ssa.OpARM64VUMAX4S,
225 ssa.OpARM64VFMIN4S,
226 ssa.OpARM64VSMIN4S,
227 ssa.OpARM64VUMIN4S,
228 ssa.OpARM64VFMUL4S,
229 ssa.OpARM64VMUL4S,
230 ssa.OpARM64VSSHL4S,
231 ssa.OpARM64VUSHL4S,
232 ssa.OpARM64VSQSHL4S,
233 ssa.OpARM64VUQSHL4S,
234 ssa.OpARM64VFSUB4S,
235 ssa.OpARM64VSUB4S,
236 ssa.OpARM64VSQSUB4S,
237 ssa.OpARM64VUQSUB4S:
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.OpARM64VTRN18H,
254 ssa.OpARM64VZIP28H,
255 ssa.OpARM64VZIP18H,
256 ssa.OpARM64VTRN28H,
257 ssa.OpARM64VSMAX8H,
258 ssa.OpARM64VUMAX8H,
259 ssa.OpARM64VSMIN8H,
260 ssa.OpARM64VUMIN8H,
261 ssa.OpARM64VMUL8H,
262 ssa.OpARM64VSSHL8H,
263 ssa.OpARM64VUSHL8H,
264 ssa.OpARM64VSQSHL8H,
265 ssa.OpARM64VUQSHL8H,
266 ssa.OpARM64VSUB8H,
267 ssa.OpARM64VSQSUB8H,
268 ssa.OpARM64VUQSUB8H:
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.OpARM64VPMULL2D:
377 p = simdV21Long(s, v, arm64.ARNG_2D)
378
379 case ssa.OpARM64VSMULL4S,
380 ssa.OpARM64VUMULL4S:
381 p = simdV21Long(s, v, arm64.ARNG_4S)
382
383 case ssa.OpARM64VSMULL8H,
384 ssa.OpARM64VUMULL8H:
385 p = simdV21Long(s, v, arm64.ARNG_8H)
386
387 case ssa.OpARM64VSXTL2_16B,
388 ssa.OpARM64VUXTL2_16B:
389 p = simdV11Long2(s, v, arm64.ARNG_16B)
390
391 case ssa.OpARM64VFCVTL2_4S,
392 ssa.OpARM64VSXTL2_4S,
393 ssa.OpARM64VUXTL2_4S:
394 p = simdV11Long2(s, v, arm64.ARNG_4S)
395
396 case ssa.OpARM64VSXTL2_8H,
397 ssa.OpARM64VUXTL2_8H:
398 p = simdV11Long2(s, v, arm64.ARNG_8H)
399
400 case ssa.OpARM64VFCVTN2_2D,
401 ssa.OpARM64VSQXTN2_2D,
402 ssa.OpARM64VSQXTUN2_2D,
403 ssa.OpARM64VUQXTN2_2D,
404 ssa.OpARM64VXTN2_2D:
405 p = simdV21Narrow2(s, v, arm64.ARNG_2D)
406
407 case ssa.OpARM64VSQXTN2_4S,
408 ssa.OpARM64VSQXTUN2_4S,
409 ssa.OpARM64VUQXTN2_4S,
410 ssa.OpARM64VXTN2_4S:
411 p = simdV21Narrow2(s, v, arm64.ARNG_4S)
412
413 case ssa.OpARM64VSQXTN2_8H,
414 ssa.OpARM64VSQXTUN2_8H,
415 ssa.OpARM64VUQXTN2_8H,
416 ssa.OpARM64VXTN2_8H:
417 p = simdV21Narrow2(s, v, arm64.ARNG_8H)
418
419 case ssa.OpARM64VSHRN2_2D:
420 p = simdV21ImmNarrow2(s, v, arm64.ARNG_2D)
421
422 case ssa.OpARM64VSHRN2_4S:
423 p = simdV21ImmNarrow2(s, v, arm64.ARNG_4S)
424
425 case ssa.OpARM64VSHRN2_8H:
426 p = simdV21ImmNarrow2(s, v, arm64.ARNG_8H)
427
428 case ssa.OpARM64VSSHLL2_16B,
429 ssa.OpARM64VUSHLL2_16B:
430 p = simdV11ImmLong2(s, v, arm64.ARNG_16B)
431
432 case ssa.OpARM64VSSHLL2_4S,
433 ssa.OpARM64VUSHLL2_4S:
434 p = simdV11ImmLong2(s, v, arm64.ARNG_4S)
435
436 case ssa.OpARM64VSSHLL2_8H,
437 ssa.OpARM64VUSHLL2_8H:
438 p = simdV11ImmLong2(s, v, arm64.ARNG_8H)
439
440 case ssa.OpARM64VSMULL2_16B,
441 ssa.OpARM64VUMULL2_16B:
442 p = simdV21Long2(s, v, arm64.ARNG_16B)
443
444 case ssa.OpARM64VPMULL2_2D:
445 p = simdV21Long2(s, v, arm64.ARNG_2D)
446
447 case ssa.OpARM64VSMULL2_4S,
448 ssa.OpARM64VUMULL2_4S:
449 p = simdV21Long2(s, v, arm64.ARNG_4S)
450
451 case ssa.OpARM64VSMULL2_8H,
452 ssa.OpARM64VUMULL2_8H:
453 p = simdV21Long2(s, v, arm64.ARNG_8H)
454
455 case ssa.OpARM64VTBL16B:
456 p = simdV21List(s, v, arm64.ARNG_16B)
457
458 case ssa.OpARM64VTBX16B:
459 p = simdV31ResultInArg0List(s, v, arm64.ARNG_16B)
460
461 default:
462
463 return false
464 }
465
466
467 _ = p
468 return true
469 }
470
View as plain text