[PowerPC] Recommit r314244 with refactoring and off by default
[llvm-core.git] / test / CodeGen / AArch64 / GlobalISel / select-binop.mir
blob1badcf35492d1e0c47a5e7fd4af227a765a00868
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple=aarch64-- -run-pass=instruction-select -verify-machineinstrs -global-isel %s -o - | FileCheck %s
4 --- |
5   target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
7   define void @add_s32_gpr() { ret void }
8   define void @add_s64_gpr() { ret void }
10   define void @add_imm_s32_gpr() { ret void }
11   define void @add_imm_s64_gpr() { ret void }
13   define void @add_imm_s32_gpr_bb() { ret void }
15   define void @sub_s32_gpr() { ret void }
16   define void @sub_s64_gpr() { ret void }
18   define void @or_s32_gpr() { ret void }
19   define void @or_s64_gpr() { ret void }
20   define void @or_v2s32_fpr() { ret void }
22   define void @and_s32_gpr() { ret void }
23   define void @and_s64_gpr() { ret void }
25   define void @shl_s32_gpr() { ret void }
26   define void @shl_s64_gpr() { ret void }
28   define void @lshr_s32_gpr() { ret void }
29   define void @lshr_s64_gpr() { ret void }
31   define void @ashr_s32_gpr() { ret void }
32   define void @ashr_s64_gpr() { ret void }
34   define void @mul_s32_gpr() { ret void }
35   define void @mul_s64_gpr() { ret void }
37   define void @mulh_s64_gpr() { ret void }
39   define void @sdiv_s32_gpr() { ret void }
40   define void @sdiv_s64_gpr() { ret void }
42   define void @udiv_s32_gpr() { ret void }
43   define void @udiv_s64_gpr() { ret void }
45   define void @fadd_s32_fpr() { ret void }
46   define void @fadd_s64_fpr() { ret void }
48   define void @fsub_s32_fpr() { ret void }
49   define void @fsub_s64_fpr() { ret void }
51   define void @fmul_s32_fpr() { ret void }
52   define void @fmul_s64_fpr() { ret void }
54   define void @fdiv_s32_fpr() { ret void }
55   define void @fdiv_s64_fpr() { ret void }
57 ...
59 ---
60 # Check that we select a 32-bit GPR G_ADD into ADDWrr on GPR32.
61 # Also check that we constrain the register class of the COPY to GPR32.
62 name:            add_s32_gpr
63 legalized:       true
64 regBankSelected: true
66 registers:
67   - { id: 0, class: gpr }
68   - { id: 1, class: gpr }
69   - { id: 2, class: gpr }
71 body:             |
72   bb.0:
73     liveins: %w0, %w1
75     ; CHECK-LABEL: name: add_s32_gpr
76     ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY %w0
77     ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY %w1
78     ; CHECK: [[ADDWrr:%[0-9]+]]:gpr32 = ADDWrr [[COPY]], [[COPY1]]
79     ; CHECK: %w0 = COPY [[ADDWrr]]
80     %0(s32) = COPY %w0
81     %1(s32) = COPY %w1
82     %2(s32) = G_ADD %0, %1
83     %w0 = COPY %2(s32)
84 ...
86 ---
87 # Same as add_s32_gpr, for 64-bit operations.
88 name:            add_s64_gpr
89 legalized:       true
90 regBankSelected: true
92 registers:
93   - { id: 0, class: gpr }
94   - { id: 1, class: gpr }
95   - { id: 2, class: gpr }
97 body:             |
98   bb.0:
99     liveins: %x0, %x1
101     ; CHECK-LABEL: name: add_s64_gpr
102     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY %x0
103     ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY %x1
104     ; CHECK: [[ADDXrr:%[0-9]+]]:gpr64 = ADDXrr [[COPY]], [[COPY1]]
105     ; CHECK: %x0 = COPY [[ADDXrr]]
106     %0(s64) = COPY %x0
107     %1(s64) = COPY %x1
108     %2(s64) = G_ADD %0, %1
109     %x0 = COPY %2(s64)
113 name:            add_imm_s32_gpr
114 legalized:       true
115 regBankSelected: true
117 registers:
118   - { id: 0, class: gpr }
119   - { id: 1, class: gpr }
120   - { id: 2, class: gpr }
122 body:             |
123   bb.0:
124     liveins: %w0, %w1
126     ; CHECK-LABEL: name: add_imm_s32_gpr
127     ; CHECK: [[COPY:%[0-9]+]]:gpr32sp = COPY %w0
128     ; CHECK: [[ADDWri:%[0-9]+]]:gpr32sp = ADDWri [[COPY]], 1, 0
129     ; CHECK: %w0 = COPY [[ADDWri]]
130     %0(s32) = COPY %w0
131     %1(s32) = G_CONSTANT i32 1
132     %2(s32) = G_ADD %0, %1
133     %w0 = COPY %2(s32)
137 name:            add_imm_s64_gpr
138 legalized:       true
139 regBankSelected: true
141 registers:
142   - { id: 0, class: gpr }
143   - { id: 1, class: gpr }
144   - { id: 2, class: gpr }
146 body:             |
147   bb.0:
148     liveins: %x0, %w1
150     ; CHECK-LABEL: name: add_imm_s64_gpr
151     ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY %x0
152     ; CHECK: [[ADDXri:%[0-9]+]]:gpr64sp = ADDXri [[COPY]], 1, 0
153     ; CHECK: %x0 = COPY [[ADDXri]]
154     %0(s64) = COPY %x0
155     %1(s64) = G_CONSTANT i32 1
156     %2(s64) = G_ADD %0, %1
157     %x0 = COPY %2(s64)
161 name:            add_imm_s32_gpr_bb
162 legalized:       true
163 regBankSelected: true
165 registers:
166   - { id: 0, class: gpr }
167   - { id: 1, class: gpr }
168   - { id: 2, class: gpr }
170 body:             |
171   ; CHECK-LABEL: name: add_imm_s32_gpr_bb
172   ; CHECK: bb.0:
173   ; CHECK:   successors: %bb.1(0x80000000)
174   ; CHECK:   [[COPY:%[0-9]+]]:gpr32sp = COPY %w0
175   ; CHECK:   B %bb.1
176   ; CHECK: bb.1:
177   ; CHECK:   [[ADDWri:%[0-9]+]]:gpr32sp = ADDWri [[COPY]], 1, 0
178   ; CHECK:   %w0 = COPY [[ADDWri]]
179   bb.0:
180     liveins: %w0, %w1
181     successors: %bb.1
183     %0(s32) = COPY %w0
184     %1(s32) = G_CONSTANT i32 1
185     G_BR %bb.1
187   bb.1:
188     %2(s32) = G_ADD %0, %1
189     %w0 = COPY %2(s32)
193 # Same as add_s32_gpr, for G_SUB operations.
194 name:            sub_s32_gpr
195 legalized:       true
196 regBankSelected: true
198 registers:
199   - { id: 0, class: gpr }
200   - { id: 1, class: gpr }
201   - { id: 2, class: gpr }
203 body:             |
204   bb.0:
205     liveins: %w0, %w1
207     ; CHECK-LABEL: name: sub_s32_gpr
208     ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY %w0
209     ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY %w1
210     ; CHECK: [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY]], [[COPY1]], implicit-def %nzcv
211     ; CHECK: %w0 = COPY [[SUBSWrr]]
212     %0(s32) = COPY %w0
213     %1(s32) = COPY %w1
214     %2(s32) = G_SUB %0, %1
215     %w0 = COPY %2(s32)
219 # Same as add_s64_gpr, for G_SUB operations.
220 name:            sub_s64_gpr
221 legalized:       true
222 regBankSelected: true
224 registers:
225   - { id: 0, class: gpr }
226   - { id: 1, class: gpr }
227   - { id: 2, class: gpr }
229 body:             |
230   bb.0:
231     liveins: %x0, %x1
233     ; CHECK-LABEL: name: sub_s64_gpr
234     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY %x0
235     ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY %x1
236     ; CHECK: [[SUBSXrr:%[0-9]+]]:gpr64 = SUBSXrr [[COPY]], [[COPY1]], implicit-def %nzcv
237     ; CHECK: %x0 = COPY [[SUBSXrr]]
238     %0(s64) = COPY %x0
239     %1(s64) = COPY %x1
240     %2(s64) = G_SUB %0, %1
241     %x0 = COPY %2(s64)
245 # Same as add_s32_gpr, for G_OR operations.
246 name:            or_s32_gpr
247 legalized:       true
248 regBankSelected: true
250 registers:
251   - { id: 0, class: gpr }
252   - { id: 1, class: gpr }
253   - { id: 2, class: gpr }
255 body:             |
256   bb.0:
257     liveins: %w0, %w1
259     ; CHECK-LABEL: name: or_s32_gpr
260     ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY %w0
261     ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY %w1
262     ; CHECK: [[ORRWrr:%[0-9]+]]:gpr32 = ORRWrr [[COPY]], [[COPY1]]
263     ; CHECK: %w0 = COPY [[ORRWrr]]
264     %0(s32) = COPY %w0
265     %1(s32) = COPY %w1
266     %2(s32) = G_OR %0, %1
267     %w0 = COPY %2(s32)
271 # Same as add_s64_gpr, for G_OR operations.
272 name:            or_s64_gpr
273 legalized:       true
274 regBankSelected: true
276 registers:
277   - { id: 0, class: gpr }
278   - { id: 1, class: gpr }
279   - { id: 2, class: gpr }
281 body:             |
282   bb.0:
283     liveins: %x0, %x1
285     ; CHECK-LABEL: name: or_s64_gpr
286     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY %x0
287     ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY %x1
288     ; CHECK: [[ORRXrr:%[0-9]+]]:gpr64 = ORRXrr [[COPY]], [[COPY1]]
289     ; CHECK: %x0 = COPY [[ORRXrr]]
290     %0(s64) = COPY %x0
291     %1(s64) = COPY %x1
292     %2(s64) = G_OR %0, %1
293     %x0 = COPY %2(s64)
297 # 64-bit G_OR on vector registers.
298 name:            or_v2s32_fpr
299 legalized:       true
300 regBankSelected: true
302 registers:
303   - { id: 0, class: fpr }
304   - { id: 1, class: fpr }
305   - { id: 2, class: fpr }
307 # The actual OR does not matter as long as it is operating
308 # on 64-bit width vector.
309 body:             |
310   bb.0:
311     liveins: %d0, %d1
313     ; CHECK-LABEL: name: or_v2s32_fpr
314     ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY %d0
315     ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY %d1
316     ; CHECK: [[ORRv8i8_:%[0-9]+]]:fpr64 = ORRv8i8 [[COPY]], [[COPY1]]
317     ; CHECK: %d0 = COPY [[ORRv8i8_]]
318       %0(<2 x s32>) = COPY %d0
319       %1(<2 x s32>) = COPY %d1
320       %2(<2 x s32>) = G_OR %0, %1
321       %d0 = COPY %2(<2 x s32>)
325 # Same as add_s32_gpr, for G_AND operations.
326 name:            and_s32_gpr
327 legalized:       true
328 regBankSelected: true
330 registers:
331   - { id: 0, class: gpr }
332   - { id: 1, class: gpr }
333   - { id: 2, class: gpr }
335 body:             |
336   bb.0:
337     liveins: %w0, %w1
339     ; CHECK-LABEL: name: and_s32_gpr
340     ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY %w0
341     ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY %w1
342     ; CHECK: [[ANDWrr:%[0-9]+]]:gpr32 = ANDWrr [[COPY]], [[COPY1]]
343     ; CHECK: %w0 = COPY [[ANDWrr]]
344     %0(s32) = COPY %w0
345     %1(s32) = COPY %w1
346     %2(s32) = G_AND %0, %1
347     %w0 = COPY %2(s32)
351 # Same as add_s64_gpr, for G_AND operations.
352 name:            and_s64_gpr
353 legalized:       true
354 regBankSelected: true
356 registers:
357   - { id: 0, class: gpr }
358   - { id: 1, class: gpr }
359   - { id: 2, class: gpr }
361 body:             |
362   bb.0:
363     liveins: %x0, %x1
365     ; CHECK-LABEL: name: and_s64_gpr
366     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY %x0
367     ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY %x1
368     ; CHECK: [[ANDXrr:%[0-9]+]]:gpr64 = ANDXrr [[COPY]], [[COPY1]]
369     ; CHECK: %x0 = COPY [[ANDXrr]]
370     %0(s64) = COPY %x0
371     %1(s64) = COPY %x1
372     %2(s64) = G_AND %0, %1
373     %x0 = COPY %2(s64)
377 # Same as add_s32_gpr, for G_SHL operations.
378 name:            shl_s32_gpr
379 legalized:       true
380 regBankSelected: true
382 registers:
383   - { id: 0, class: gpr }
384   - { id: 1, class: gpr }
385   - { id: 2, class: gpr }
387 body:             |
388   bb.0:
389     liveins: %w0, %w1
391     ; CHECK-LABEL: name: shl_s32_gpr
392     ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY %w0
393     ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY %w1
394     ; CHECK: [[LSLVWr:%[0-9]+]]:gpr32 = LSLVWr [[COPY]], [[COPY1]]
395     ; CHECK: %w0 = COPY [[LSLVWr]]
396     %0(s32) = COPY %w0
397     %1(s32) = COPY %w1
398     %2(s32) = G_SHL %0, %1
399     %w0 = COPY %2(s32)
403 # Same as add_s64_gpr, for G_SHL operations.
404 name:            shl_s64_gpr
405 legalized:       true
406 regBankSelected: true
408 registers:
409   - { id: 0, class: gpr }
410   - { id: 1, class: gpr }
411   - { id: 2, class: gpr }
413 body:             |
414   bb.0:
415     liveins: %x0, %x1
417     ; CHECK-LABEL: name: shl_s64_gpr
418     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY %x0
419     ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY %x1
420     ; CHECK: [[LSLVXr:%[0-9]+]]:gpr64 = LSLVXr [[COPY]], [[COPY1]]
421     ; CHECK: %x0 = COPY [[LSLVXr]]
422     %0(s64) = COPY %x0
423     %1(s64) = COPY %x1
424     %2(s64) = G_SHL %0, %1
425     %x0 = COPY %2(s64)
429 # Same as add_s32_gpr, for G_LSHR operations.
430 name:            lshr_s32_gpr
431 legalized:       true
432 regBankSelected: true
434 registers:
435   - { id: 0, class: gpr }
436   - { id: 1, class: gpr }
437   - { id: 2, class: gpr }
439 body:             |
440   bb.0:
441     liveins: %w0, %w1
443     ; CHECK-LABEL: name: lshr_s32_gpr
444     ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY %w0
445     ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY %w1
446     ; CHECK: [[LSRVWr:%[0-9]+]]:gpr32 = LSRVWr [[COPY]], [[COPY1]]
447     ; CHECK: %w0 = COPY [[LSRVWr]]
448     %0(s32) = COPY %w0
449     %1(s32) = COPY %w1
450     %2(s32) = G_LSHR %0, %1
451     %w0 = COPY %2(s32)
455 # Same as add_s64_gpr, for G_LSHR operations.
456 name:            lshr_s64_gpr
457 legalized:       true
458 regBankSelected: true
460 registers:
461   - { id: 0, class: gpr }
462   - { id: 1, class: gpr }
463   - { id: 2, class: gpr }
465 body:             |
466   bb.0:
467     liveins: %x0, %x1
469     ; CHECK-LABEL: name: lshr_s64_gpr
470     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY %x0
471     ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY %x1
472     ; CHECK: [[LSRVXr:%[0-9]+]]:gpr64 = LSRVXr [[COPY]], [[COPY1]]
473     ; CHECK: %x0 = COPY [[LSRVXr]]
474     %0(s64) = COPY %x0
475     %1(s64) = COPY %x1
476     %2(s64) = G_LSHR %0, %1
477     %x0 = COPY %2(s64)
481 # Same as add_s32_gpr, for G_ASHR operations.
482 name:            ashr_s32_gpr
483 legalized:       true
484 regBankSelected: true
486 registers:
487   - { id: 0, class: gpr }
488   - { id: 1, class: gpr }
489   - { id: 2, class: gpr }
491 body:             |
492   bb.0:
493     liveins: %w0, %w1
495     ; CHECK-LABEL: name: ashr_s32_gpr
496     ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY %w0
497     ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY %w1
498     ; CHECK: [[ASRVWr:%[0-9]+]]:gpr32 = ASRVWr [[COPY]], [[COPY1]]
499     ; CHECK: %w0 = COPY [[ASRVWr]]
500     %0(s32) = COPY %w0
501     %1(s32) = COPY %w1
502     %2(s32) = G_ASHR %0, %1
503     %w0 = COPY %2(s32)
507 # Same as add_s64_gpr, for G_ASHR operations.
508 name:            ashr_s64_gpr
509 legalized:       true
510 regBankSelected: true
512 registers:
513   - { id: 0, class: gpr }
514   - { id: 1, class: gpr }
515   - { id: 2, class: gpr }
517 body:             |
518   bb.0:
519     liveins: %x0, %x1
521     ; CHECK-LABEL: name: ashr_s64_gpr
522     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY %x0
523     ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY %x1
524     ; CHECK: [[ASRVXr:%[0-9]+]]:gpr64 = ASRVXr [[COPY]], [[COPY1]]
525     ; CHECK: %x0 = COPY [[ASRVXr]]
526     %0(s64) = COPY %x0
527     %1(s64) = COPY %x1
528     %2(s64) = G_ASHR %0, %1
529     %x0 = COPY %2(s64)
533 # Check that we select s32 GPR G_MUL. This is trickier than other binops because
534 # there is only MADDWrrr, and we have to use the WZR physreg.
535 name:            mul_s32_gpr
536 legalized:       true
537 regBankSelected: true
539 registers:
540   - { id: 0, class: gpr }
541   - { id: 1, class: gpr }
542   - { id: 2, class: gpr }
544 body:             |
545   bb.0:
546     liveins: %w0, %w1
548     ; CHECK-LABEL: name: mul_s32_gpr
549     ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY %w0
550     ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY %w1
551     ; CHECK: [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY]], [[COPY1]], %wzr
552     ; CHECK: %w0 = COPY [[MADDWrrr]]
553     %0(s32) = COPY %w0
554     %1(s32) = COPY %w1
555     %2(s32) = G_MUL %0, %1
556     %w0 = COPY %2(s32)
560 # Same as mul_s32_gpr for the s64 type.
561 name:            mul_s64_gpr
562 legalized:       true
563 regBankSelected: true
565 registers:
566   - { id: 0, class: gpr }
567   - { id: 1, class: gpr }
568   - { id: 2, class: gpr }
570 body:             |
571   bb.0:
572     liveins: %x0, %x1
574     ; CHECK-LABEL: name: mul_s64_gpr
575     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY %x0
576     ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY %x1
577     ; CHECK: [[MADDXrrr:%[0-9]+]]:gpr64 = MADDXrrr [[COPY]], [[COPY1]], %xzr
578     ; CHECK: %x0 = COPY [[MADDXrrr]]
579     %0(s64) = COPY %x0
580     %1(s64) = COPY %x1
581     %2(s64) = G_MUL %0, %1
582     %x0 = COPY %2(s64)
586 # Same as mul_s32_gpr for the s64 type.
587 name:            mulh_s64_gpr
588 legalized:       true
589 regBankSelected: true
592 body:             |
593   bb.0:
594     liveins: %x0, %x1
596     ; CHECK-LABEL: name: mulh_s64_gpr
597     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY %x0
598     ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY %x1
599     ; CHECK: [[SMULHrr:%[0-9]+]]:gpr64 = SMULHrr [[COPY]], [[COPY1]]
600     ; CHECK: [[UMULHrr:%[0-9]+]]:gpr64 = UMULHrr [[COPY]], [[COPY1]]
601     ; CHECK: %x0 = COPY [[SMULHrr]]
602     ; CHECK: %x0 = COPY [[UMULHrr]]
603     %0:gpr(s64) = COPY %x0
604     %1:gpr(s64) = COPY %x1
605     %2:gpr(s64) = G_SMULH %0, %1
606     %3:gpr(s64) = G_UMULH %0, %1
607     %x0 = COPY %2(s64)
608     %x0 = COPY %3(s64)
612 # Same as add_s32_gpr, for G_SDIV operations.
613 name:            sdiv_s32_gpr
614 legalized:       true
615 regBankSelected: true
617 registers:
618   - { id: 0, class: gpr }
619   - { id: 1, class: gpr }
620   - { id: 2, class: gpr }
622 body:             |
623   bb.0:
624     liveins: %w0, %w1
626     ; CHECK-LABEL: name: sdiv_s32_gpr
627     ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY %w0
628     ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY %w1
629     ; CHECK: [[SDIVWr:%[0-9]+]]:gpr32 = SDIVWr [[COPY]], [[COPY1]]
630     ; CHECK: %w0 = COPY [[SDIVWr]]
631     %0(s32) = COPY %w0
632     %1(s32) = COPY %w1
633     %2(s32) = G_SDIV %0, %1
634     %w0 = COPY %2(s32)
638 # Same as add_s64_gpr, for G_SDIV operations.
639 name:            sdiv_s64_gpr
640 legalized:       true
641 regBankSelected: true
643 registers:
644   - { id: 0, class: gpr }
645   - { id: 1, class: gpr }
646   - { id: 2, class: gpr }
648 body:             |
649   bb.0:
650     liveins: %x0, %x1
652     ; CHECK-LABEL: name: sdiv_s64_gpr
653     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY %x0
654     ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY %x1
655     ; CHECK: [[SDIVXr:%[0-9]+]]:gpr64 = SDIVXr [[COPY]], [[COPY1]]
656     ; CHECK: %x0 = COPY [[SDIVXr]]
657     %0(s64) = COPY %x0
658     %1(s64) = COPY %x1
659     %2(s64) = G_SDIV %0, %1
660     %x0 = COPY %2(s64)
664 # Same as add_s32_gpr, for G_UDIV operations.
665 name:            udiv_s32_gpr
666 legalized:       true
667 regBankSelected: true
669 registers:
670   - { id: 0, class: gpr }
671   - { id: 1, class: gpr }
672   - { id: 2, class: gpr }
674 body:             |
675   bb.0:
676     liveins: %w0, %w1
678     ; CHECK-LABEL: name: udiv_s32_gpr
679     ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY %w0
680     ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY %w1
681     ; CHECK: [[UDIVWr:%[0-9]+]]:gpr32 = UDIVWr [[COPY]], [[COPY1]]
682     ; CHECK: %w0 = COPY [[UDIVWr]]
683     %0(s32) = COPY %w0
684     %1(s32) = COPY %w1
685     %2(s32) = G_UDIV %0, %1
686     %w0 = COPY %2(s32)
690 # Same as add_s64_gpr, for G_UDIV operations.
691 name:            udiv_s64_gpr
692 legalized:       true
693 regBankSelected: true
695 registers:
696   - { id: 0, class: gpr }
697   - { id: 1, class: gpr }
698   - { id: 2, class: gpr }
700 body:             |
701   bb.0:
702     liveins: %x0, %x1
704     ; CHECK-LABEL: name: udiv_s64_gpr
705     ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY %x0
706     ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY %x1
707     ; CHECK: [[UDIVXr:%[0-9]+]]:gpr64 = UDIVXr [[COPY]], [[COPY1]]
708     ; CHECK: %x0 = COPY [[UDIVXr]]
709     %0(s64) = COPY %x0
710     %1(s64) = COPY %x1
711     %2(s64) = G_UDIV %0, %1
712     %x0 = COPY %2(s64)
716 # Check that we select a s32 FPR G_FADD into FADDSrr.
717 name:            fadd_s32_fpr
718 legalized:       true
719 regBankSelected: true
721 registers:
722   - { id: 0, class: fpr }
723   - { id: 1, class: fpr }
724   - { id: 2, class: fpr }
726 body:             |
727   bb.0:
728     liveins: %s0, %s1
730     ; CHECK-LABEL: name: fadd_s32_fpr
731     ; CHECK: [[COPY:%[0-9]+]]:fpr32 = COPY %s0
732     ; CHECK: [[COPY1:%[0-9]+]]:fpr32 = COPY %s1
733     ; CHECK: [[FADDSrr:%[0-9]+]]:fpr32 = FADDSrr [[COPY]], [[COPY1]]
734     ; CHECK: %s0 = COPY [[FADDSrr]]
735     %0(s32) = COPY %s0
736     %1(s32) = COPY %s1
737     %2(s32) = G_FADD %0, %1
738     %s0 = COPY %2(s32)
742 name:            fadd_s64_fpr
743 legalized:       true
744 regBankSelected: true
746 registers:
747   - { id: 0, class: fpr }
748   - { id: 1, class: fpr }
749   - { id: 2, class: fpr }
751 body:             |
752   bb.0:
753     liveins: %d0, %d1
755     ; CHECK-LABEL: name: fadd_s64_fpr
756     ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY %d0
757     ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY %d1
758     ; CHECK: [[FADDDrr:%[0-9]+]]:fpr64 = FADDDrr [[COPY]], [[COPY1]]
759     ; CHECK: %d0 = COPY [[FADDDrr]]
760     %0(s64) = COPY %d0
761     %1(s64) = COPY %d1
762     %2(s64) = G_FADD %0, %1
763     %d0 = COPY %2(s64)
767 name:            fsub_s32_fpr
768 legalized:       true
769 regBankSelected: true
771 registers:
772   - { id: 0, class: fpr }
773   - { id: 1, class: fpr }
774   - { id: 2, class: fpr }
776 body:             |
777   bb.0:
778     liveins: %s0, %s1
780     ; CHECK-LABEL: name: fsub_s32_fpr
781     ; CHECK: [[COPY:%[0-9]+]]:fpr32 = COPY %s0
782     ; CHECK: [[COPY1:%[0-9]+]]:fpr32 = COPY %s1
783     ; CHECK: [[FSUBSrr:%[0-9]+]]:fpr32 = FSUBSrr [[COPY]], [[COPY1]]
784     ; CHECK: %s0 = COPY [[FSUBSrr]]
785     %0(s32) = COPY %s0
786     %1(s32) = COPY %s1
787     %2(s32) = G_FSUB %0, %1
788     %s0 = COPY %2(s32)
792 name:            fsub_s64_fpr
793 legalized:       true
794 regBankSelected: true
796 registers:
797   - { id: 0, class: fpr }
798   - { id: 1, class: fpr }
799   - { id: 2, class: fpr }
801 body:             |
802   bb.0:
803     liveins: %d0, %d1
805     ; CHECK-LABEL: name: fsub_s64_fpr
806     ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY %d0
807     ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY %d1
808     ; CHECK: [[FSUBDrr:%[0-9]+]]:fpr64 = FSUBDrr [[COPY]], [[COPY1]]
809     ; CHECK: %d0 = COPY [[FSUBDrr]]
810     %0(s64) = COPY %d0
811     %1(s64) = COPY %d1
812     %2(s64) = G_FSUB %0, %1
813     %d0 = COPY %2(s64)
817 name:            fmul_s32_fpr
818 legalized:       true
819 regBankSelected: true
821 registers:
822   - { id: 0, class: fpr }
823   - { id: 1, class: fpr }
824   - { id: 2, class: fpr }
826 body:             |
827   bb.0:
828     liveins: %s0, %s1
830     ; CHECK-LABEL: name: fmul_s32_fpr
831     ; CHECK: [[COPY:%[0-9]+]]:fpr32 = COPY %s0
832     ; CHECK: [[COPY1:%[0-9]+]]:fpr32 = COPY %s1
833     ; CHECK: [[FMULSrr:%[0-9]+]]:fpr32 = FMULSrr [[COPY]], [[COPY1]]
834     ; CHECK: %s0 = COPY [[FMULSrr]]
835     %0(s32) = COPY %s0
836     %1(s32) = COPY %s1
837     %2(s32) = G_FMUL %0, %1
838     %s0 = COPY %2(s32)
842 name:            fmul_s64_fpr
843 legalized:       true
844 regBankSelected: true
846 registers:
847   - { id: 0, class: fpr }
848   - { id: 1, class: fpr }
849   - { id: 2, class: fpr }
851 body:             |
852   bb.0:
853     liveins: %d0, %d1
855     ; CHECK-LABEL: name: fmul_s64_fpr
856     ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY %d0
857     ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY %d1
858     ; CHECK: [[FMULDrr:%[0-9]+]]:fpr64 = FMULDrr [[COPY]], [[COPY1]]
859     ; CHECK: %d0 = COPY [[FMULDrr]]
860     %0(s64) = COPY %d0
861     %1(s64) = COPY %d1
862     %2(s64) = G_FMUL %0, %1
863     %d0 = COPY %2(s64)
867 name:            fdiv_s32_fpr
868 legalized:       true
869 regBankSelected: true
871 registers:
872   - { id: 0, class: fpr }
873   - { id: 1, class: fpr }
874   - { id: 2, class: fpr }
876 body:             |
877   bb.0:
878     liveins: %s0, %s1
880     ; CHECK-LABEL: name: fdiv_s32_fpr
881     ; CHECK: [[COPY:%[0-9]+]]:fpr32 = COPY %s0
882     ; CHECK: [[COPY1:%[0-9]+]]:fpr32 = COPY %s1
883     ; CHECK: [[FDIVSrr:%[0-9]+]]:fpr32 = FDIVSrr [[COPY]], [[COPY1]]
884     ; CHECK: %s0 = COPY [[FDIVSrr]]
885     %0(s32) = COPY %s0
886     %1(s32) = COPY %s1
887     %2(s32) = G_FDIV %0, %1
888     %s0 = COPY %2(s32)
892 name:            fdiv_s64_fpr
893 legalized:       true
894 regBankSelected: true
896 registers:
897   - { id: 0, class: fpr }
898   - { id: 1, class: fpr }
899   - { id: 2, class: fpr }
901 body:             |
902   bb.0:
903     liveins: %d0, %d1
905     ; CHECK-LABEL: name: fdiv_s64_fpr
906     ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY %d0
907     ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY %d1
908     ; CHECK: [[FDIVDrr:%[0-9]+]]:fpr64 = FDIVDrr [[COPY]], [[COPY1]]
909     ; CHECK: %d0 = COPY [[FDIVDrr]]
910     %0(s64) = COPY %d0
911     %1(s64) = COPY %d1
912     %2(s64) = G_FDIV %0, %1
913     %d0 = COPY %2(s64)