[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / AArch64 / GlobalISel / select-binop.mir
blobda05ea0cea5a10a2bd7414296ed4789ad5475bc6
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple=aarch64-- -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s
3 ---
4 # Check that we select a 32-bit GPR G_ADD into ADDWrr on GPR32.
5 # Also check that we constrain the register class of the COPY to GPR32.
6 name:            add_s32_gpr
7 legalized:       true
8 regBankSelected: true
10 registers:
11   - { id: 0, class: gpr }
12   - { id: 1, class: gpr }
13   - { id: 2, class: gpr }
15 body:             |
16   bb.0:
17     liveins: $w0, $w1
19     ; CHECK-LABEL: name: add_s32_gpr
20     ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
21     ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
22     ; CHECK: [[ADDWrr:%[0-9]+]]:gpr32 = ADDWrr [[COPY]], [[COPY1]]
23     ; CHECK: $w0 = COPY [[ADDWrr]]
24     %0(s32) = COPY $w0
25     %1(s32) = COPY $w1
26     %2(s32) = G_ADD %0, %1
27     $w0 = COPY %2(s32)
28 ...
30 ---
31 # Same as add_s32_gpr, for 64-bit operations.
32 name:            add_s64_gpr
33 legalized:       true
34 regBankSelected: true
36 registers:
37   - { id: 0, class: gpr }
38   - { id: 1, class: gpr }
39   - { id: 2, class: gpr }
41 body:             |
42   bb.0:
43     liveins: $x0, $x1
45     ; CHECK-LABEL: name: add_s64_gpr
46     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
47     ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
48     ; CHECK: [[ADDXrr:%[0-9]+]]:gpr64 = ADDXrr [[COPY]], [[COPY1]]
49     ; CHECK: $x0 = COPY [[ADDXrr]]
50     %0(s64) = COPY $x0
51     %1(s64) = COPY $x1
52     %2(s64) = G_ADD %0, %1
53     $x0 = COPY %2(s64)
54 ...
56 ---
57 name:            add_imm_s32_gpr
58 legalized:       true
59 regBankSelected: true
61 registers:
62   - { id: 0, class: gpr }
63   - { id: 1, class: gpr }
64   - { id: 2, class: gpr }
66 body:             |
67   bb.0:
68     liveins: $w0, $w1
70     ; CHECK-LABEL: name: add_imm_s32_gpr
71     ; CHECK: [[COPY:%[0-9]+]]:gpr32sp = COPY $w0
72     ; CHECK: [[ADDWri:%[0-9]+]]:gpr32sp = ADDWri [[COPY]], 1, 0
73     ; CHECK: $w0 = COPY [[ADDWri]]
74     %0(s32) = COPY $w0
75     %1(s32) = G_CONSTANT i32 1
76     %2(s32) = G_ADD %0, %1
77     $w0 = COPY %2(s32)
78 ...
80 ---
81 name:            add_imm_s64_gpr
82 legalized:       true
83 regBankSelected: true
85 registers:
86   - { id: 0, class: gpr }
87   - { id: 1, class: gpr }
88   - { id: 2, class: gpr }
90 body:             |
91   bb.0:
92     liveins: $x0, $w1
94     ; CHECK-LABEL: name: add_imm_s64_gpr
95     ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
96     ; CHECK: [[ADDXri:%[0-9]+]]:gpr64sp = ADDXri [[COPY]], 1, 0
97     ; CHECK: $x0 = COPY [[ADDXri]]
98     %0(s64) = COPY $x0
99     %1(s64) = G_CONSTANT i64 1
100     %2(s64) = G_ADD %0, %1
101     $x0 = COPY %2(s64)
105 name:            add_neg_s32_gpr
106 legalized:       true
107 regBankSelected: true
109 registers:
110   - { id: 0, class: gpr }
111   - { id: 1, class: gpr }
112   - { id: 2, class: gpr }
114 body:             |
115   bb.0:
116     liveins: $w1, $w2
117     ; We should be able to turn the ADD into a SUB.
118     ; CHECK-LABEL: name: add_neg_s32_gpr
119     ; CHECK: [[COPY:%[0-9]+]]:gpr32sp = COPY $w1
120     ; CHECK: [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[COPY]], 1, 0, implicit-def $nzcv
121     ; CHECK: $w2 = COPY [[SUBSWri]]
122     %0(s32) = COPY $w1
123     %1(s32) = G_CONSTANT i32 -1
124     %2(s32) = G_ADD %0, %1
125     $w2 = COPY %2(s32)
129 name:            add_neg_s64_gpr
130 legalized:       true
131 regBankSelected: true
133 registers:
134   - { id: 0, class: gpr }
135   - { id: 1, class: gpr }
136   - { id: 2, class: gpr }
138 body:             |
139   bb.0:
140     liveins: $x0, $x1
141     ; We should be able to turn the ADD into a SUB.
142     ; CHECK-LABEL: name: add_neg_s64_gpr
143     ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
144     ; CHECK: [[SUBSXri:%[0-9]+]]:gpr64 = SUBSXri [[COPY]], 1, 0, implicit-def $nzcv
145     ; CHECK: $x0 = COPY [[SUBSXri]]
146     %0(s64) = COPY $x0
147     %1(s64) = G_CONSTANT i64 -1
148     %2(s64) = G_ADD %0, %1
149     $x0 = COPY %2(s64)
153 name:            add_neg_invalid_immed_s32
154 legalized:       true
155 regBankSelected: true
157 registers:
158   - { id: 0, class: gpr }
159   - { id: 1, class: gpr }
160   - { id: 2, class: gpr }
162 body:             |
163   bb.0:
164     liveins: $x0, $x1
165     ; We can't select this if the value is out of range.
166     ; CHECK-LABEL: name: add_neg_invalid_immed_s32
167     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
168     ; CHECK: [[MOVi64imm:%[0-9]+]]:gpr64 = MOVi64imm -5000
169     ; CHECK: [[ADDXrr:%[0-9]+]]:gpr64 = ADDXrr [[COPY]], [[MOVi64imm]]
170     ; CHECK: $x0 = COPY [[ADDXrr]]
171     %0(s64) = COPY $x0
172     %1(s64) = G_CONSTANT i64 -5000
173     %2(s64) = G_ADD %0, %1
174     $x0 = COPY %2(s64)
178 name:            add_neg_invalid_immed_s64
179 legalized:       true
180 regBankSelected: true
182 registers:
183   - { id: 0, class: gpr }
184   - { id: 1, class: gpr }
185   - { id: 2, class: gpr }
187 body:             |
188   bb.0:
189     liveins: $x0, $x1
190     ; We can't select this if the value is out of range.
191     ; CHECK-LABEL: name: add_neg_invalid_immed_s64
192     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
193     ; CHECK: [[MOVi64imm:%[0-9]+]]:gpr64 = MOVi64imm -5000
194     ; CHECK: [[ADDXrr:%[0-9]+]]:gpr64 = ADDXrr [[COPY]], [[MOVi64imm]]
195     ; CHECK: $x0 = COPY [[ADDXrr]]
196     %0(s64) = COPY $x0
197     %1(s64) = G_CONSTANT i64 -5000
198     %2(s64) = G_ADD %0, %1
199     $x0 = COPY %2(s64)
203 name:            add_imm_0_s32
204 legalized:       true
205 regBankSelected: true
207 registers:
208   - { id: 0, class: gpr }
209   - { id: 1, class: gpr }
210   - { id: 2, class: gpr }
212 body:             |
213   bb.0:
214     liveins: $x0, $x1
215     ; We shouldn't get a SUB here, because "cmp wN, $0" and "cmp wN, #0" have
216     ; opposite effects on the C flag.
217     ; CHECK-LABEL: name: add_imm_0_s32
218     ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
219     ; CHECK: [[ADDXri:%[0-9]+]]:gpr64sp = ADDXri [[COPY]], 0, 0
220     ; CHECK: $x0 = COPY [[ADDXri]]
221     %0(s64) = COPY $x0
222     %1(s64) = G_CONSTANT i64 0
223     %2(s64) = G_ADD %0, %1
224     $x0 = COPY %2(s64)
228 name:            add_imm_0_s64
229 legalized:       true
230 regBankSelected: true
232 registers:
233   - { id: 0, class: gpr }
234   - { id: 1, class: gpr }
235   - { id: 2, class: gpr }
237 body:             |
238   bb.0:
239     liveins: $x0, $x1
240     ; We shouldn't get a SUB here, because "cmp xN, $0" and "cmp xN, #0" have
241     ; opposite effects on the C flag.
242     ; CHECK-LABEL: name: add_imm_0_s64
243     ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
244     ; CHECK: [[ADDXri:%[0-9]+]]:gpr64sp = ADDXri [[COPY]], 0, 0
245     ; CHECK: $x0 = COPY [[ADDXri]]
246     %0(s64) = COPY $x0
247     %1(s64) = G_CONSTANT i64 0
248     %2(s64) = G_ADD %0, %1
249     $x0 = COPY %2(s64)
253 name:            add_imm_s32_gpr_bb
254 legalized:       true
255 regBankSelected: true
257 registers:
258   - { id: 0, class: gpr }
259   - { id: 1, class: gpr }
260   - { id: 2, class: gpr }
262 body:             |
263   ; CHECK-LABEL: name: add_imm_s32_gpr_bb
264   ; CHECK: bb.0:
265   ; CHECK:   successors: %bb.1(0x80000000)
266   ; CHECK:   [[COPY:%[0-9]+]]:gpr32sp = COPY $w0
267   ; CHECK:   B %bb.1
268   ; CHECK: bb.1:
269   ; CHECK:   [[ADDWri:%[0-9]+]]:gpr32sp = ADDWri [[COPY]], 1, 0
270   ; CHECK:   $w0 = COPY [[ADDWri]]
271   bb.0:
272     liveins: $w0, $w1
273     successors: %bb.1
275     %0(s32) = COPY $w0
276     %1(s32) = G_CONSTANT i32 1
277     G_BR %bb.1
279   bb.1:
280     %2(s32) = G_ADD %0, %1
281     $w0 = COPY %2(s32)
285 # Same as add_s32_gpr, for G_SUB operations.
286 name:            sub_s32_gpr
287 legalized:       true
288 regBankSelected: true
290 registers:
291   - { id: 0, class: gpr }
292   - { id: 1, class: gpr }
293   - { id: 2, class: gpr }
295 body:             |
296   bb.0:
297     liveins: $w0, $w1
299     ; CHECK-LABEL: name: sub_s32_gpr
300     ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
301     ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
302     ; CHECK: [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY]], [[COPY1]], implicit-def $nzcv
303     ; CHECK: $w0 = COPY [[SUBSWrr]]
304     %0(s32) = COPY $w0
305     %1(s32) = COPY $w1
306     %2(s32) = G_SUB %0, %1
307     $w0 = COPY %2(s32)
311 # Same as add_s64_gpr, for G_SUB operations.
312 name:            sub_s64_gpr
313 legalized:       true
314 regBankSelected: true
316 registers:
317   - { id: 0, class: gpr }
318   - { id: 1, class: gpr }
319   - { id: 2, class: gpr }
321 body:             |
322   bb.0:
323     liveins: $x0, $x1
325     ; CHECK-LABEL: name: sub_s64_gpr
326     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
327     ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
328     ; CHECK: [[SUBSXrr:%[0-9]+]]:gpr64 = SUBSXrr [[COPY]], [[COPY1]], implicit-def $nzcv
329     ; CHECK: $x0 = COPY [[SUBSXrr]]
330     %0(s64) = COPY $x0
331     %1(s64) = COPY $x1
332     %2(s64) = G_SUB %0, %1
333     $x0 = COPY %2(s64)
337 # Same as add_s32_gpr, for G_OR operations.
338 name:            or_s32_gpr
339 legalized:       true
340 regBankSelected: true
342 registers:
343   - { id: 0, class: gpr }
344   - { id: 1, class: gpr }
345   - { id: 2, class: gpr }
347 body:             |
348   bb.0:
349     liveins: $w0, $w1
351     ; CHECK-LABEL: name: or_s32_gpr
352     ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
353     ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
354     ; CHECK: [[ORRWrr:%[0-9]+]]:gpr32 = ORRWrr [[COPY]], [[COPY1]]
355     ; CHECK: $w0 = COPY [[ORRWrr]]
356     %0(s32) = COPY $w0
357     %1(s32) = COPY $w1
358     %2(s32) = G_OR %0, %1
359     $w0 = COPY %2(s32)
363 # Same as add_s64_gpr, for G_OR operations.
364 name:            or_s64_gpr
365 legalized:       true
366 regBankSelected: true
368 registers:
369   - { id: 0, class: gpr }
370   - { id: 1, class: gpr }
371   - { id: 2, class: gpr }
373 body:             |
374   bb.0:
375     liveins: $x0, $x1
377     ; CHECK-LABEL: name: or_s64_gpr
378     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
379     ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
380     ; CHECK: [[ORRXrr:%[0-9]+]]:gpr64 = ORRXrr [[COPY]], [[COPY1]]
381     ; CHECK: $x0 = COPY [[ORRXrr]]
382     %0(s64) = COPY $x0
383     %1(s64) = COPY $x1
384     %2(s64) = G_OR %0, %1
385     $x0 = COPY %2(s64)
389 # 64-bit G_OR on vector registers.
390 name:            or_v2s32_fpr
391 legalized:       true
392 regBankSelected: true
394 registers:
395   - { id: 0, class: fpr }
396   - { id: 1, class: fpr }
397   - { id: 2, class: fpr }
399 # The actual OR does not matter as long as it is operating
400 # on 64-bit width vector.
401 body:             |
402   bb.0:
403     liveins: $d0, $d1
405     ; CHECK-LABEL: name: or_v2s32_fpr
406     ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY $d0
407     ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1
408     ; CHECK: [[ORRv8i8_:%[0-9]+]]:fpr64 = ORRv8i8 [[COPY]], [[COPY1]]
409     ; CHECK: $d0 = COPY [[ORRv8i8_]]
410       %0(<2 x s32>) = COPY $d0
411       %1(<2 x s32>) = COPY $d1
412       %2(<2 x s32>) = G_OR %0, %1
413       $d0 = COPY %2(<2 x s32>)
417 # Same as add_s32_gpr, for G_AND operations.
418 name:            and_s32_gpr
419 legalized:       true
420 regBankSelected: true
422 registers:
423   - { id: 0, class: gpr }
424   - { id: 1, class: gpr }
425   - { id: 2, class: gpr }
427 body:             |
428   bb.0:
429     liveins: $w0, $w1
431     ; CHECK-LABEL: name: and_s32_gpr
432     ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
433     ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
434     ; CHECK: [[ANDWrr:%[0-9]+]]:gpr32 = ANDWrr [[COPY]], [[COPY1]]
435     ; CHECK: $w0 = COPY [[ANDWrr]]
436     %0(s32) = COPY $w0
437     %1(s32) = COPY $w1
438     %2(s32) = G_AND %0, %1
439     $w0 = COPY %2(s32)
443 # Same as add_s64_gpr, for G_AND operations.
444 name:            and_s64_gpr
445 legalized:       true
446 regBankSelected: true
448 registers:
449   - { id: 0, class: gpr }
450   - { id: 1, class: gpr }
451   - { id: 2, class: gpr }
453 body:             |
454   bb.0:
455     liveins: $x0, $x1
457     ; CHECK-LABEL: name: and_s64_gpr
458     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
459     ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
460     ; CHECK: [[ANDXrr:%[0-9]+]]:gpr64 = ANDXrr [[COPY]], [[COPY1]]
461     ; CHECK: $x0 = COPY [[ANDXrr]]
462     %0(s64) = COPY $x0
463     %1(s64) = COPY $x1
464     %2(s64) = G_AND %0, %1
465     $x0 = COPY %2(s64)
469 # Same as add_s32_gpr, for G_SHL operations.
470 name:            shl_s32_gpr
471 legalized:       true
472 regBankSelected: true
474 registers:
475   - { id: 0, class: gpr }
476   - { id: 1, class: gpr }
477   - { id: 2, class: gpr }
479 body:             |
480   bb.0:
481     liveins: $w0, $w1
483     ; CHECK-LABEL: name: shl_s32_gpr
484     ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
485     ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
486     ; CHECK: [[LSLVWr:%[0-9]+]]:gpr32 = LSLVWr [[COPY]], [[COPY1]]
487     ; CHECK: $w0 = COPY [[LSLVWr]]
488     %0(s32) = COPY $w0
489     %1(s32) = COPY $w1
490     %2(s32) = G_SHL %0, %1
491     $w0 = COPY %2(s32)
495 # Same as add_s64_gpr, for G_SHL operations.
496 name:            shl_s64_gpr
497 legalized:       true
498 regBankSelected: true
500 registers:
501   - { id: 0, class: gpr }
502   - { id: 1, class: gpr }
503   - { id: 2, class: gpr }
505 body:             |
506   bb.0:
507     liveins: $x0, $x1
509     ; CHECK-LABEL: name: shl_s64_gpr
510     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
511     ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
512     ; CHECK: [[LSLVXr:%[0-9]+]]:gpr64 = LSLVXr [[COPY]], [[COPY1]]
513     ; CHECK: $x0 = COPY [[LSLVXr]]
514     %0(s64) = COPY $x0
515     %1(s64) = COPY $x1
516     %2(s64) = G_SHL %0, %1
517     $x0 = COPY %2(s64)
521 # Same as add_s32_gpr, for G_LSHR operations.
522 name:            lshr_s32_gpr
523 legalized:       true
524 regBankSelected: true
526 registers:
527   - { id: 0, class: gpr }
528   - { id: 1, class: gpr }
529   - { id: 2, class: gpr }
531 body:             |
532   bb.0:
533     liveins: $w0, $w1
535     ; CHECK-LABEL: name: lshr_s32_gpr
536     ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
537     ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
538     ; CHECK: [[LSRVWr:%[0-9]+]]:gpr32 = LSRVWr [[COPY]], [[COPY1]]
539     ; CHECK: $w0 = COPY [[LSRVWr]]
540     %0(s32) = COPY $w0
541     %1(s32) = COPY $w1
542     %2(s32) = G_LSHR %0, %1
543     $w0 = COPY %2(s32)
547 # Same as add_s64_gpr, for G_LSHR operations.
548 name:            lshr_s64_gpr
549 legalized:       true
550 regBankSelected: true
552 registers:
553   - { id: 0, class: gpr }
554   - { id: 1, class: gpr }
555   - { id: 2, class: gpr }
557 body:             |
558   bb.0:
559     liveins: $x0, $x1
561     ; CHECK-LABEL: name: lshr_s64_gpr
562     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
563     ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
564     ; CHECK: [[LSRVXr:%[0-9]+]]:gpr64 = LSRVXr [[COPY]], [[COPY1]]
565     ; CHECK: $x0 = COPY [[LSRVXr]]
566     %0(s64) = COPY $x0
567     %1(s64) = COPY $x1
568     %2(s64) = G_LSHR %0, %1
569     $x0 = COPY %2(s64)
573 # Same as add_s32_gpr, for G_ASHR operations.
574 name:            ashr_s32_gpr
575 legalized:       true
576 regBankSelected: true
578 registers:
579   - { id: 0, class: gpr }
580   - { id: 1, class: gpr }
581   - { id: 2, class: gpr }
583 body:             |
584   bb.0:
585     liveins: $w0, $w1
587     ; CHECK-LABEL: name: ashr_s32_gpr
588     ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
589     ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
590     ; CHECK: [[ASRVWr:%[0-9]+]]:gpr32 = ASRVWr [[COPY]], [[COPY1]]
591     ; CHECK: $w0 = COPY [[ASRVWr]]
592     %0(s32) = COPY $w0
593     %1(s32) = COPY $w1
594     %2(s32) = G_ASHR %0, %1
595     $w0 = COPY %2(s32)
599 # Same as add_s64_gpr, for G_ASHR operations.
600 name:            ashr_s64_gpr
601 legalized:       true
602 regBankSelected: true
604 registers:
605   - { id: 0, class: gpr }
606   - { id: 1, class: gpr }
607   - { id: 2, class: gpr }
609 body:             |
610   bb.0:
611     liveins: $x0, $x1
613     ; CHECK-LABEL: name: ashr_s64_gpr
614     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
615     ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
616     ; CHECK: [[ASRVXr:%[0-9]+]]:gpr64 = ASRVXr [[COPY]], [[COPY1]]
617     ; CHECK: $x0 = COPY [[ASRVXr]]
618     %0(s64) = COPY $x0
619     %1(s64) = COPY $x1
620     %2(s64) = G_ASHR %0, %1
621     $x0 = COPY %2(s64)
625 # Check that we select s32 GPR G_MUL. This is trickier than other binops because
626 # there is only MADDWrrr, and we have to use the WZR physreg.
627 name:            mul_s32_gpr
628 legalized:       true
629 regBankSelected: true
631 registers:
632   - { id: 0, class: gpr }
633   - { id: 1, class: gpr }
634   - { id: 2, class: gpr }
636 body:             |
637   bb.0:
638     liveins: $w0, $w1
640     ; CHECK-LABEL: name: mul_s32_gpr
641     ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
642     ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
643     ; CHECK: [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY]], [[COPY1]], $wzr
644     ; CHECK: $w0 = COPY [[MADDWrrr]]
645     %0(s32) = COPY $w0
646     %1(s32) = COPY $w1
647     %2(s32) = G_MUL %0, %1
648     $w0 = COPY %2(s32)
652 # Same as mul_s32_gpr for the s64 type.
653 name:            mul_s64_gpr
654 legalized:       true
655 regBankSelected: true
657 registers:
658   - { id: 0, class: gpr }
659   - { id: 1, class: gpr }
660   - { id: 2, class: gpr }
662 body:             |
663   bb.0:
664     liveins: $x0, $x1
666     ; CHECK-LABEL: name: mul_s64_gpr
667     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
668     ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
669     ; CHECK: [[MADDXrrr:%[0-9]+]]:gpr64 = MADDXrrr [[COPY]], [[COPY1]], $xzr
670     ; CHECK: $x0 = COPY [[MADDXrrr]]
671     %0(s64) = COPY $x0
672     %1(s64) = COPY $x1
673     %2(s64) = G_MUL %0, %1
674     $x0 = COPY %2(s64)
678 # Same as mul_s32_gpr for the s64 type.
679 name:            mulh_s64_gpr
680 legalized:       true
681 regBankSelected: true
684 body:             |
685   bb.0:
686     liveins: $x0, $x1
688     ; CHECK-LABEL: name: mulh_s64_gpr
689     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
690     ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
691     ; CHECK: [[SMULHrr:%[0-9]+]]:gpr64 = SMULHrr [[COPY]], [[COPY1]]
692     ; CHECK: [[UMULHrr:%[0-9]+]]:gpr64 = UMULHrr [[COPY]], [[COPY1]]
693     ; CHECK: $x0 = COPY [[SMULHrr]]
694     ; CHECK: $x0 = COPY [[UMULHrr]]
695     %0:gpr(s64) = COPY $x0
696     %1:gpr(s64) = COPY $x1
697     %2:gpr(s64) = G_SMULH %0, %1
698     %3:gpr(s64) = G_UMULH %0, %1
699     $x0 = COPY %2(s64)
700     $x0 = COPY %3(s64)
704 # Same as add_s32_gpr, for G_SDIV operations.
705 name:            sdiv_s32_gpr
706 legalized:       true
707 regBankSelected: true
709 registers:
710   - { id: 0, class: gpr }
711   - { id: 1, class: gpr }
712   - { id: 2, class: gpr }
714 body:             |
715   bb.0:
716     liveins: $w0, $w1
718     ; CHECK-LABEL: name: sdiv_s32_gpr
719     ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
720     ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
721     ; CHECK: [[SDIVWr:%[0-9]+]]:gpr32 = SDIVWr [[COPY]], [[COPY1]]
722     ; CHECK: $w0 = COPY [[SDIVWr]]
723     %0(s32) = COPY $w0
724     %1(s32) = COPY $w1
725     %2(s32) = G_SDIV %0, %1
726     $w0 = COPY %2(s32)
730 # Same as add_s64_gpr, for G_SDIV operations.
731 name:            sdiv_s64_gpr
732 legalized:       true
733 regBankSelected: true
735 registers:
736   - { id: 0, class: gpr }
737   - { id: 1, class: gpr }
738   - { id: 2, class: gpr }
740 body:             |
741   bb.0:
742     liveins: $x0, $x1
744     ; CHECK-LABEL: name: sdiv_s64_gpr
745     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
746     ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
747     ; CHECK: [[SDIVXr:%[0-9]+]]:gpr64 = SDIVXr [[COPY]], [[COPY1]]
748     ; CHECK: $x0 = COPY [[SDIVXr]]
749     %0(s64) = COPY $x0
750     %1(s64) = COPY $x1
751     %2(s64) = G_SDIV %0, %1
752     $x0 = COPY %2(s64)
756 # Same as add_s32_gpr, for G_UDIV operations.
757 name:            udiv_s32_gpr
758 legalized:       true
759 regBankSelected: true
761 registers:
762   - { id: 0, class: gpr }
763   - { id: 1, class: gpr }
764   - { id: 2, class: gpr }
766 body:             |
767   bb.0:
768     liveins: $w0, $w1
770     ; CHECK-LABEL: name: udiv_s32_gpr
771     ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
772     ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
773     ; CHECK: [[UDIVWr:%[0-9]+]]:gpr32 = UDIVWr [[COPY]], [[COPY1]]
774     ; CHECK: $w0 = COPY [[UDIVWr]]
775     %0(s32) = COPY $w0
776     %1(s32) = COPY $w1
777     %2(s32) = G_UDIV %0, %1
778     $w0 = COPY %2(s32)
782 # Same as add_s64_gpr, for G_UDIV operations.
783 name:            udiv_s64_gpr
784 legalized:       true
785 regBankSelected: true
787 registers:
788   - { id: 0, class: gpr }
789   - { id: 1, class: gpr }
790   - { id: 2, class: gpr }
792 body:             |
793   bb.0:
794     liveins: $x0, $x1
796     ; CHECK-LABEL: name: udiv_s64_gpr
797     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
798     ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
799     ; CHECK: [[UDIVXr:%[0-9]+]]:gpr64 = UDIVXr [[COPY]], [[COPY1]]
800     ; CHECK: $x0 = COPY [[UDIVXr]]
801     %0(s64) = COPY $x0
802     %1(s64) = COPY $x1
803     %2(s64) = G_UDIV %0, %1
804     $x0 = COPY %2(s64)
808 # Check that we select a s32 FPR G_FADD into FADDSrr.
809 name:            fadd_s32_fpr
810 legalized:       true
811 regBankSelected: true
813 registers:
814   - { id: 0, class: fpr }
815   - { id: 1, class: fpr }
816   - { id: 2, class: fpr }
818 body:             |
819   bb.0:
820     liveins: $s0, $s1
822     ; CHECK-LABEL: name: fadd_s32_fpr
823     ; CHECK: [[COPY:%[0-9]+]]:fpr32 = COPY $s0
824     ; CHECK: [[COPY1:%[0-9]+]]:fpr32 = COPY $s1
825     ; CHECK: [[FADDSrr:%[0-9]+]]:fpr32 = FADDSrr [[COPY]], [[COPY1]]
826     ; CHECK: $s0 = COPY [[FADDSrr]]
827     %0(s32) = COPY $s0
828     %1(s32) = COPY $s1
829     %2(s32) = G_FADD %0, %1
830     $s0 = COPY %2(s32)
834 name:            fadd_s64_fpr
835 legalized:       true
836 regBankSelected: true
838 registers:
839   - { id: 0, class: fpr }
840   - { id: 1, class: fpr }
841   - { id: 2, class: fpr }
843 body:             |
844   bb.0:
845     liveins: $d0, $d1
847     ; CHECK-LABEL: name: fadd_s64_fpr
848     ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY $d0
849     ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1
850     ; CHECK: [[FADDDrr:%[0-9]+]]:fpr64 = FADDDrr [[COPY]], [[COPY1]]
851     ; CHECK: $d0 = COPY [[FADDDrr]]
852     %0(s64) = COPY $d0
853     %1(s64) = COPY $d1
854     %2(s64) = G_FADD %0, %1
855     $d0 = COPY %2(s64)
859 name:            fsub_s32_fpr
860 legalized:       true
861 regBankSelected: true
863 registers:
864   - { id: 0, class: fpr }
865   - { id: 1, class: fpr }
866   - { id: 2, class: fpr }
868 body:             |
869   bb.0:
870     liveins: $s0, $s1
872     ; CHECK-LABEL: name: fsub_s32_fpr
873     ; CHECK: [[COPY:%[0-9]+]]:fpr32 = COPY $s0
874     ; CHECK: [[COPY1:%[0-9]+]]:fpr32 = COPY $s1
875     ; CHECK: [[FSUBSrr:%[0-9]+]]:fpr32 = FSUBSrr [[COPY]], [[COPY1]]
876     ; CHECK: $s0 = COPY [[FSUBSrr]]
877     %0(s32) = COPY $s0
878     %1(s32) = COPY $s1
879     %2(s32) = G_FSUB %0, %1
880     $s0 = COPY %2(s32)
884 name:            fsub_s64_fpr
885 legalized:       true
886 regBankSelected: true
888 registers:
889   - { id: 0, class: fpr }
890   - { id: 1, class: fpr }
891   - { id: 2, class: fpr }
893 body:             |
894   bb.0:
895     liveins: $d0, $d1
897     ; CHECK-LABEL: name: fsub_s64_fpr
898     ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY $d0
899     ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1
900     ; CHECK: [[FSUBDrr:%[0-9]+]]:fpr64 = FSUBDrr [[COPY]], [[COPY1]]
901     ; CHECK: $d0 = COPY [[FSUBDrr]]
902     %0(s64) = COPY $d0
903     %1(s64) = COPY $d1
904     %2(s64) = G_FSUB %0, %1
905     $d0 = COPY %2(s64)
909 name:            fmul_s32_fpr
910 legalized:       true
911 regBankSelected: true
913 registers:
914   - { id: 0, class: fpr }
915   - { id: 1, class: fpr }
916   - { id: 2, class: fpr }
918 body:             |
919   bb.0:
920     liveins: $s0, $s1
922     ; CHECK-LABEL: name: fmul_s32_fpr
923     ; CHECK: [[COPY:%[0-9]+]]:fpr32 = COPY $s0
924     ; CHECK: [[COPY1:%[0-9]+]]:fpr32 = COPY $s1
925     ; CHECK: [[FMULSrr:%[0-9]+]]:fpr32 = FMULSrr [[COPY]], [[COPY1]]
926     ; CHECK: $s0 = COPY [[FMULSrr]]
927     %0(s32) = COPY $s0
928     %1(s32) = COPY $s1
929     %2(s32) = G_FMUL %0, %1
930     $s0 = COPY %2(s32)
934 name:            fmul_s64_fpr
935 legalized:       true
936 regBankSelected: true
938 registers:
939   - { id: 0, class: fpr }
940   - { id: 1, class: fpr }
941   - { id: 2, class: fpr }
943 body:             |
944   bb.0:
945     liveins: $d0, $d1
947     ; CHECK-LABEL: name: fmul_s64_fpr
948     ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY $d0
949     ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1
950     ; CHECK: [[FMULDrr:%[0-9]+]]:fpr64 = FMULDrr [[COPY]], [[COPY1]]
951     ; CHECK: $d0 = COPY [[FMULDrr]]
952     %0(s64) = COPY $d0
953     %1(s64) = COPY $d1
954     %2(s64) = G_FMUL %0, %1
955     $d0 = COPY %2(s64)
959 name:            fdiv_s32_fpr
960 legalized:       true
961 regBankSelected: true
963 registers:
964   - { id: 0, class: fpr }
965   - { id: 1, class: fpr }
966   - { id: 2, class: fpr }
968 body:             |
969   bb.0:
970     liveins: $s0, $s1
972     ; CHECK-LABEL: name: fdiv_s32_fpr
973     ; CHECK: [[COPY:%[0-9]+]]:fpr32 = COPY $s0
974     ; CHECK: [[COPY1:%[0-9]+]]:fpr32 = COPY $s1
975     ; CHECK: [[FDIVSrr:%[0-9]+]]:fpr32 = FDIVSrr [[COPY]], [[COPY1]]
976     ; CHECK: $s0 = COPY [[FDIVSrr]]
977     %0(s32) = COPY $s0
978     %1(s32) = COPY $s1
979     %2(s32) = G_FDIV %0, %1
980     $s0 = COPY %2(s32)
984 name:            fdiv_s64_fpr
985 legalized:       true
986 regBankSelected: true
988 registers:
989   - { id: 0, class: fpr }
990   - { id: 1, class: fpr }
991   - { id: 2, class: fpr }
993 body:             |
994   bb.0:
995     liveins: $d0, $d1
997     ; CHECK-LABEL: name: fdiv_s64_fpr
998     ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY $d0
999     ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1
1000     ; CHECK: [[FDIVDrr:%[0-9]+]]:fpr64 = FDIVDrr [[COPY]], [[COPY1]]
1001     ; CHECK: $d0 = COPY [[FDIVDrr]]
1002     %0(s64) = COPY $d0
1003     %1(s64) = COPY $d1
1004     %2(s64) = G_FDIV %0, %1
1005     $d0 = COPY %2(s64)
1008 name:            add_v8i16
1009 alignment:       4
1010 legalized:       true
1011 regBankSelected: true
1012 tracksRegLiveness: true
1013 registers:
1014   - { id: 0, class: fpr }
1015   - { id: 1, class: fpr }
1016   - { id: 2, class: fpr }
1017 machineFunctionInfo: {}
1018 body:             |
1019   bb.1:
1020     liveins: $q0, $q1
1022     ; CHECK-LABEL: name: add_v8i16
1023     ; CHECK: liveins: $q0, $q1
1024     ; CHECK: [[COPY:%[0-9]+]]:fpr128 = COPY $q0
1025     ; CHECK: [[COPY1:%[0-9]+]]:fpr128 = COPY $q1
1026     ; CHECK: [[ADDv8i16_:%[0-9]+]]:fpr128 = ADDv8i16 [[COPY]], [[COPY1]]
1027     ; CHECK: $q0 = COPY [[ADDv8i16_]]
1028     ; CHECK: RET_ReallyLR implicit $q0
1029     %0:fpr(<8 x s16>) = COPY $q0
1030     %1:fpr(<8 x s16>) = COPY $q1
1031     %2:fpr(<8 x s16>) = G_ADD %0, %1
1032     $q0 = COPY %2(<8 x s16>)
1033     RET_ReallyLR implicit $q0
1037 name:            add_v16i8
1038 alignment:       4
1039 legalized:       true
1040 regBankSelected: true
1041 tracksRegLiveness: true
1042 registers:
1043   - { id: 0, class: fpr }
1044   - { id: 1, class: fpr }
1045   - { id: 2, class: fpr }
1046 machineFunctionInfo: {}
1047 body:             |
1048   bb.1:
1049     liveins: $q0, $q1
1051     ; CHECK-LABEL: name: add_v16i8
1052     ; CHECK: liveins: $q0, $q1
1053     ; CHECK: [[COPY:%[0-9]+]]:fpr128 = COPY $q0
1054     ; CHECK: [[COPY1:%[0-9]+]]:fpr128 = COPY $q1
1055     ; CHECK: [[ADDv16i8_:%[0-9]+]]:fpr128 = ADDv16i8 [[COPY]], [[COPY1]]
1056     ; CHECK: $q0 = COPY [[ADDv16i8_]]
1057     ; CHECK: RET_ReallyLR implicit $q0
1058     %0:fpr(<16 x s8>) = COPY $q0
1059     %1:fpr(<16 x s8>) = COPY $q1
1060     %2:fpr(<16 x s8>) = G_ADD %0, %1
1061     $q0 = COPY %2(<16 x s8>)
1062     RET_ReallyLR implicit $q0
1066 name:            add_v4i16
1067 legalized:       true
1068 regBankSelected: true
1069 tracksRegLiveness: true
1070 body:             |
1071   bb.1:
1072     liveins: $d0, $d1
1074     ; CHECK-LABEL: name: add_v4i16
1075     ; CHECK: liveins: $d0, $d1
1076     ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY $d0
1077     ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1
1078     ; CHECK: [[ADDv4i16_:%[0-9]+]]:fpr64 = ADDv4i16 [[COPY]], [[COPY1]]
1079     ; CHECK: $d0 = COPY [[ADDv4i16_]]
1080     ; CHECK: RET_ReallyLR implicit $d0
1081     %0:fpr(<4 x s16>) = COPY $d0
1082     %1:fpr(<4 x s16>) = COPY $d1
1083     %2:fpr(<4 x s16>) = G_ADD %0, %1
1084     $d0 = COPY %2(<4 x s16>)
1085     RET_ReallyLR implicit $d0
1088 name:            or_v4i16
1089 legalized:       true
1090 regBankSelected: true
1091 tracksRegLiveness: true
1092 body:             |
1093   bb.1:
1094     liveins: $d0, $d1
1096     ; CHECK-LABEL: name: or_v4i16
1097     ; CHECK: liveins: $d0, $d1
1098     ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY $d0
1099     ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1
1100     ; CHECK: [[ORRv8i8_:%[0-9]+]]:fpr64 = ORRv8i8 [[COPY]], [[COPY1]]
1101     ; CHECK: $d0 = COPY [[ORRv8i8_]]
1102     ; CHECK: RET_ReallyLR implicit $d0
1103     %0:fpr(<4 x s16>) = COPY $d0
1104     %1:fpr(<4 x s16>) = COPY $d1
1105     %2:fpr(<4 x s16>) = G_OR %0, %1
1106     $d0 = COPY %2(<4 x s16>)
1107     RET_ReallyLR implicit $d0
1110 name:            xor_v4i16
1111 legalized:       true
1112 regBankSelected: true
1113 tracksRegLiveness: true
1114 body:             |
1115   bb.1:
1116     liveins: $d0, $d1
1118     ; CHECK-LABEL: name: xor_v4i16
1119     ; CHECK: liveins: $d0, $d1
1120     ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY $d0
1121     ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1
1122     ; CHECK: [[EORv8i8_:%[0-9]+]]:fpr64 = EORv8i8 [[COPY]], [[COPY1]]
1123     ; CHECK: $d0 = COPY [[EORv8i8_]]
1124     ; CHECK: RET_ReallyLR implicit $d0
1125     %0:fpr(<4 x s16>) = COPY $d0
1126     %1:fpr(<4 x s16>) = COPY $d1
1127     %2:fpr(<4 x s16>) = G_XOR %0, %1
1128     $d0 = COPY %2(<4 x s16>)
1129     RET_ReallyLR implicit $d0
1132 name:            mul_v4i16
1133 legalized:       true
1134 regBankSelected: true
1135 tracksRegLiveness: true
1136 body:             |
1137   bb.1:
1138     liveins: $d0, $d1
1140     ; CHECK-LABEL: name: mul_v4i16
1141     ; CHECK: liveins: $d0, $d1
1142     ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY $d0
1143     ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1
1144     ; CHECK: [[MULv4i16_:%[0-9]+]]:fpr64 = MULv4i16 [[COPY]], [[COPY1]]
1145     ; CHECK: $d0 = COPY [[MULv4i16_]]
1146     ; CHECK: RET_ReallyLR implicit $d0
1147     %0:fpr(<4 x s16>) = COPY $d0
1148     %1:fpr(<4 x s16>) = COPY $d1
1149     %2:fpr(<4 x s16>) = G_MUL %0, %1
1150     $d0 = COPY %2(<4 x s16>)
1151     RET_ReallyLR implicit $d0