1 # RUN: llc -O0 -mtriple=aarch64-apple-ios -run-pass=instruction-select -verify-machineinstrs -global-isel %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=IOS
2 # RUN: llc -O0 -mtriple=aarch64-linux-gnu -run-pass=instruction-select -verify-machineinstrs -global-isel %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=LINUX-DEFAULT
3 # RUN: llc -O0 -mtriple=aarch64-linux-gnu -relocation-model=pic -run-pass=instruction-select -verify-machineinstrs -global-isel %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=LINUX-PIC
5 # Test the instruction selector.
6 # As we support more instructions, we need to split this up.
9 target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
11 define void @add_s8_gpr() { ret void }
12 define void @add_s16_gpr() { ret void }
13 define void @add_s32_gpr() { ret void }
14 define void @add_s64_gpr() { ret void }
16 define void @sub_s8_gpr() { ret void }
17 define void @sub_s16_gpr() { ret void }
18 define void @sub_s32_gpr() { ret void }
19 define void @sub_s64_gpr() { ret void }
21 define void @or_s1_gpr() { ret void }
22 define void @or_s16_gpr() { ret void }
23 define void @or_s32_gpr() { ret void }
24 define void @or_s64_gpr() { ret void }
25 define void @or_v2s32_fpr() { ret void }
27 define void @xor_s8_gpr() { ret void }
28 define void @xor_s16_gpr() { ret void }
29 define void @xor_s32_gpr() { ret void }
30 define void @xor_s64_gpr() { ret void }
32 define void @and_s8_gpr() { ret void }
33 define void @and_s16_gpr() { ret void }
34 define void @and_s32_gpr() { ret void }
35 define void @and_s64_gpr() { ret void }
37 define void @shl_s8_gpr() { ret void }
38 define void @shl_s16_gpr() { ret void }
39 define void @shl_s32_gpr() { ret void }
40 define void @shl_s64_gpr() { ret void }
42 define void @lshr_s32_gpr() { ret void }
43 define void @lshr_s64_gpr() { ret void }
45 define void @ashr_s32_gpr() { ret void }
46 define void @ashr_s64_gpr() { ret void }
48 define void @mul_s8_gpr() { ret void }
49 define void @mul_s16_gpr() { ret void }
50 define void @mul_s32_gpr() { ret void }
51 define void @mul_s64_gpr() { ret void }
53 define void @sdiv_s32_gpr() { ret void }
54 define void @sdiv_s64_gpr() { ret void }
56 define void @udiv_s32_gpr() { ret void }
57 define void @udiv_s64_gpr() { ret void }
59 define void @fadd_s32_gpr() { ret void }
60 define void @fadd_s64_gpr() { ret void }
62 define void @fsub_s32_gpr() { ret void }
63 define void @fsub_s64_gpr() { ret void }
65 define void @fmul_s32_gpr() { ret void }
66 define void @fmul_s64_gpr() { ret void }
68 define void @fdiv_s32_gpr() { ret void }
69 define void @fdiv_s64_gpr() { ret void }
71 define void @sitofp_s32_s32_fpr() { ret void }
72 define void @sitofp_s32_s64_fpr() { ret void }
73 define void @sitofp_s64_s32_fpr() { ret void }
74 define void @sitofp_s64_s64_fpr() { ret void }
76 define void @uitofp_s32_s32_fpr() { ret void }
77 define void @uitofp_s32_s64_fpr() { ret void }
78 define void @uitofp_s64_s32_fpr() { ret void }
79 define void @uitofp_s64_s64_fpr() { ret void }
81 define void @fptosi_s32_s32_gpr() { ret void }
82 define void @fptosi_s32_s64_gpr() { ret void }
83 define void @fptosi_s64_s32_gpr() { ret void }
84 define void @fptosi_s64_s64_gpr() { ret void }
86 define void @fptoui_s32_s32_gpr() { ret void }
87 define void @fptoui_s32_s64_gpr() { ret void }
88 define void @fptoui_s64_s32_gpr() { ret void }
89 define void @fptoui_s64_s64_gpr() { ret void }
91 define void @fptrunc() { ret void }
92 define void @fpext() { ret void }
94 define void @unconditional_br() { ret void }
95 define void @conditional_br() { ret void }
97 define void @load_s64_gpr(i64* %addr) { ret void }
98 define void @load_s32_gpr(i32* %addr) { ret void }
99 define void @load_s16_gpr(i16* %addr) { ret void }
100 define void @load_s8_gpr(i8* %addr) { ret void }
101 define void @load_s64_fpr(i64* %addr) { ret void }
102 define void @load_s32_fpr(i32* %addr) { ret void }
103 define void @load_s16_fpr(i16* %addr) { ret void }
104 define void @load_s8_fpr(i8* %addr) { ret void }
106 define void @store_s64_gpr(i64* %addr) { ret void }
107 define void @store_s32_gpr(i32* %addr) { ret void }
108 define void @store_s16_gpr(i16* %addr) { ret void }
109 define void @store_s8_gpr(i8* %addr) { ret void }
110 define void @store_s64_fpr(i64* %addr) { ret void }
111 define void @store_s32_fpr(i32* %addr) { ret void }
113 define void @frame_index() {
118 define void @selected_property() { ret void }
120 define i32 @const_s32() { ret i32 42 }
121 define i64 @const_s64() { ret i64 1234567890123 }
123 define i32 @fconst_s32() { ret i32 42 }
124 define i64 @fconst_s64() { ret i64 1234567890123 }
126 define i8* @gep(i8* %in) { ret i8* undef }
128 @var_local = global i8 0
129 define i8* @global_local() { ret i8* undef }
131 @var_got = external global i8
132 define i8* @global_got() { ret i8* undef }
134 define void @trunc() { ret void }
136 define void @anyext_gpr() { ret void }
137 define void @zext_gpr() { ret void }
138 define void @sext_gpr() { ret void }
140 define void @casts() { ret void }
142 define void @bitcast_s32_gpr() { ret void }
143 define void @bitcast_s32_fpr() { ret void }
144 define void @bitcast_s32_gpr_fpr() { ret void }
145 define void @bitcast_s32_fpr_gpr() { ret void }
146 define void @bitcast_s64_gpr() { ret void }
147 define void @bitcast_s64_fpr() { ret void }
148 define void @bitcast_s64_gpr_fpr() { ret void }
149 define void @bitcast_s64_fpr_gpr() { ret void }
151 define void @icmp() { ret void }
152 define void @fcmp() { ret void }
154 define void @phi() { ret void }
156 define void @select() { ret void }
160 # CHECK-LABEL: name: add_s8_gpr
163 regBankSelected: true
166 # CHECK-NEXT: - { id: 0, class: gpr32 }
167 # CHECK-NEXT: - { id: 1, class: gpr32 }
168 # CHECK-NEXT: - { id: 2, class: gpr32 }
170 - { id: 0, class: gpr }
171 - { id: 1, class: gpr }
172 - { id: 2, class: gpr }
175 # CHECK: %0 = COPY %w0
176 # CHECK: %1 = COPY %w1
177 # CHECK: %2 = ADDWrr %0, %1
184 %2(s8) = G_ADD %0, %1
188 # CHECK-LABEL: name: add_s16_gpr
191 regBankSelected: true
194 # CHECK-NEXT: - { id: 0, class: gpr32 }
195 # CHECK-NEXT: - { id: 1, class: gpr32 }
196 # CHECK-NEXT: - { id: 2, class: gpr32 }
198 - { id: 0, class: gpr }
199 - { id: 1, class: gpr }
200 - { id: 2, class: gpr }
203 # CHECK: %0 = COPY %w0
204 # CHECK: %1 = COPY %w1
205 # CHECK: %2 = ADDWrr %0, %1
212 %2(s16) = G_ADD %0, %1
216 # Check that we select a 32-bit GPR G_ADD into ADDWrr on GPR32.
217 # Also check that we constrain the register class of the COPY to GPR32.
218 # CHECK-LABEL: name: add_s32_gpr
221 regBankSelected: true
224 # CHECK-NEXT: - { id: 0, class: gpr32 }
225 # CHECK-NEXT: - { id: 1, class: gpr32 }
226 # CHECK-NEXT: - { id: 2, class: gpr32 }
228 - { id: 0, class: gpr }
229 - { id: 1, class: gpr }
230 - { id: 2, class: gpr }
233 # CHECK: %0 = COPY %w0
234 # CHECK: %1 = COPY %w1
235 # CHECK: %2 = ADDWrr %0, %1
242 %2(s32) = G_ADD %0, %1
246 # Same as add_s32_gpr, for 64-bit operations.
247 # CHECK-LABEL: name: add_s64_gpr
250 regBankSelected: true
253 # CHECK-NEXT: - { id: 0, class: gpr64 }
254 # CHECK-NEXT: - { id: 1, class: gpr64 }
255 # CHECK-NEXT: - { id: 2, class: gpr64 }
257 - { id: 0, class: gpr }
258 - { id: 1, class: gpr }
259 - { id: 2, class: gpr }
262 # CHECK: %0 = COPY %x0
263 # CHECK: %1 = COPY %x1
264 # CHECK: %2 = ADDXrr %0, %1
271 %2(s64) = G_ADD %0, %1
275 # CHECK-LABEL: name: sub_s8_gpr
278 regBankSelected: true
281 # CHECK-NEXT: - { id: 0, class: gpr32 }
282 # CHECK-NEXT: - { id: 1, class: gpr32 }
283 # CHECK-NEXT: - { id: 2, class: gpr32 }
285 - { id: 0, class: gpr }
286 - { id: 1, class: gpr }
287 - { id: 2, class: gpr }
290 # CHECK: %0 = COPY %w0
291 # CHECK: %1 = COPY %w1
292 # CHECK: %2 = SUBWrr %0, %1
299 %2(s8) = G_SUB %0, %1
303 # CHECK-LABEL: name: sub_s16_gpr
306 regBankSelected: true
309 # CHECK-NEXT: - { id: 0, class: gpr32 }
310 # CHECK-NEXT: - { id: 1, class: gpr32 }
311 # CHECK-NEXT: - { id: 2, class: gpr32 }
313 - { id: 0, class: gpr }
314 - { id: 1, class: gpr }
315 - { id: 2, class: gpr }
318 # CHECK: %0 = COPY %w0
319 # CHECK: %1 = COPY %w1
320 # CHECK: %2 = SUBWrr %0, %1
327 %2(s16) = G_SUB %0, %1
331 # Same as add_s32_gpr, for G_SUB operations.
332 # CHECK-LABEL: name: sub_s32_gpr
335 regBankSelected: true
338 # CHECK-NEXT: - { id: 0, class: gpr32 }
339 # CHECK-NEXT: - { id: 1, class: gpr32 }
340 # CHECK-NEXT: - { id: 2, class: gpr32 }
342 - { id: 0, class: gpr }
343 - { id: 1, class: gpr }
344 - { id: 2, class: gpr }
347 # CHECK: %0 = COPY %w0
348 # CHECK: %1 = COPY %w1
349 # CHECK: %2 = SUBWrr %0, %1
356 %2(s32) = G_SUB %0, %1
360 # Same as add_s64_gpr, for G_SUB operations.
361 # CHECK-LABEL: name: sub_s64_gpr
364 regBankSelected: true
367 # CHECK-NEXT: - { id: 0, class: gpr64 }
368 # CHECK-NEXT: - { id: 1, class: gpr64 }
369 # CHECK-NEXT: - { id: 2, class: gpr64 }
371 - { id: 0, class: gpr }
372 - { id: 1, class: gpr }
373 - { id: 2, class: gpr }
376 # CHECK: %0 = COPY %x0
377 # CHECK: %1 = COPY %x1
378 # CHECK: %2 = SUBXrr %0, %1
385 %2(s64) = G_SUB %0, %1
389 # CHECK-LABEL: name: or_s1_gpr
392 regBankSelected: true
395 # CHECK-NEXT: - { id: 0, class: gpr32 }
396 # CHECK-NEXT: - { id: 1, class: gpr32 }
397 # CHECK-NEXT: - { id: 2, class: gpr32 }
399 - { id: 0, class: gpr }
400 - { id: 1, class: gpr }
401 - { id: 2, class: gpr }
404 # CHECK: %0 = COPY %w0
405 # CHECK: %1 = COPY %w1
406 # CHECK: %2 = ORRWrr %0, %1
417 # CHECK-LABEL: name: or_s16_gpr
420 regBankSelected: true
423 # CHECK-NEXT: - { id: 0, class: gpr32 }
424 # CHECK-NEXT: - { id: 1, class: gpr32 }
425 # CHECK-NEXT: - { id: 2, class: gpr32 }
427 - { id: 0, class: gpr }
428 - { id: 1, class: gpr }
429 - { id: 2, class: gpr }
432 # CHECK: %0 = COPY %w0
433 # CHECK: %1 = COPY %w1
434 # CHECK: %2 = ORRWrr %0, %1
441 %2(s16) = G_OR %0, %1
445 # Same as add_s32_gpr, for G_OR operations.
446 # CHECK-LABEL: name: or_s32_gpr
449 regBankSelected: true
452 # CHECK-NEXT: - { id: 0, class: gpr32 }
453 # CHECK-NEXT: - { id: 1, class: gpr32 }
454 # CHECK-NEXT: - { id: 2, class: gpr32 }
456 - { id: 0, class: gpr }
457 - { id: 1, class: gpr }
458 - { id: 2, class: gpr }
461 # CHECK: %0 = COPY %w0
462 # CHECK: %1 = COPY %w1
463 # CHECK: %2 = ORRWrr %0, %1
470 %2(s32) = G_OR %0, %1
474 # Same as add_s64_gpr, for G_OR operations.
475 # CHECK-LABEL: name: or_s64_gpr
478 regBankSelected: true
481 # CHECK-NEXT: - { id: 0, class: gpr64 }
482 # CHECK-NEXT: - { id: 1, class: gpr64 }
483 # CHECK-NEXT: - { id: 2, class: gpr64 }
485 - { id: 0, class: gpr }
486 - { id: 1, class: gpr }
487 - { id: 2, class: gpr }
490 # CHECK: %0 = COPY %x0
491 # CHECK: %1 = COPY %x1
492 # CHECK: %2 = ORRXrr %0, %1
499 %2(s64) = G_OR %0, %1
503 # 64-bit G_OR on vector registers.
504 # CHECK-LABEL: name: or_v2s32_fpr
507 regBankSelected: true
510 # CHECK-NEXT: - { id: 0, class: fpr64 }
511 # CHECK-NEXT: - { id: 1, class: fpr64 }
512 # CHECK-NEXT: - { id: 2, class: fpr64 }
514 - { id: 0, class: fpr }
515 - { id: 1, class: fpr }
516 - { id: 2, class: fpr }
519 # CHECK: %0 = COPY %d0
520 # CHECK: %1 = COPY %d1
521 # The actual OR does not matter as long as it is operating
522 # on 64-bit width vector.
523 # CHECK: %2 = ORRv8i8 %0, %1
528 %0(<2 x s32>) = COPY %d0
529 %1(<2 x s32>) = COPY %d1
530 %2(<2 x s32>) = G_OR %0, %1
534 # CHECK-LABEL: name: xor_s8_gpr
537 regBankSelected: true
540 # CHECK-NEXT: - { id: 0, class: gpr32 }
541 # CHECK-NEXT: - { id: 1, class: gpr32 }
542 # CHECK-NEXT: - { id: 2, class: gpr32 }
544 - { id: 0, class: gpr }
545 - { id: 1, class: gpr }
546 - { id: 2, class: gpr }
549 # CHECK: %0 = COPY %w0
550 # CHECK: %1 = COPY %w1
551 # CHECK: %2 = EORWrr %0, %1
558 %2(s8) = G_XOR %0, %1
562 # CHECK-LABEL: name: xor_s16_gpr
565 regBankSelected: true
568 # CHECK-NEXT: - { id: 0, class: gpr32 }
569 # CHECK-NEXT: - { id: 1, class: gpr32 }
570 # CHECK-NEXT: - { id: 2, class: gpr32 }
572 - { id: 0, class: gpr }
573 - { id: 1, class: gpr }
574 - { id: 2, class: gpr }
577 # CHECK: %0 = COPY %w0
578 # CHECK: %1 = COPY %w1
579 # CHECK: %2 = EORWrr %0, %1
586 %2(s16) = G_XOR %0, %1
590 # Same as add_s32_gpr, for G_XOR operations.
591 # CHECK-LABEL: name: xor_s32_gpr
594 regBankSelected: true
597 # CHECK-NEXT: - { id: 0, class: gpr32 }
598 # CHECK-NEXT: - { id: 1, class: gpr32 }
599 # CHECK-NEXT: - { id: 2, class: gpr32 }
601 - { id: 0, class: gpr }
602 - { id: 1, class: gpr }
603 - { id: 2, class: gpr }
606 # CHECK: %0 = COPY %w0
607 # CHECK: %1 = COPY %w1
608 # CHECK: %2 = EORWrr %0, %1
615 %2(s32) = G_XOR %0, %1
619 # Same as add_s64_gpr, for G_XOR operations.
620 # CHECK-LABEL: name: xor_s64_gpr
623 regBankSelected: true
626 # CHECK-NEXT: - { id: 0, class: gpr64 }
627 # CHECK-NEXT: - { id: 1, class: gpr64 }
628 # CHECK-NEXT: - { id: 2, class: gpr64 }
630 - { id: 0, class: gpr }
631 - { id: 1, class: gpr }
632 - { id: 2, class: gpr }
635 # CHECK: %0 = COPY %x0
636 # CHECK: %1 = COPY %x1
637 # CHECK: %2 = EORXrr %0, %1
644 %2(s64) = G_XOR %0, %1
648 # CHECK-LABEL: name: and_s8_gpr
651 regBankSelected: true
654 # CHECK-NEXT: - { id: 0, class: gpr32 }
655 # CHECK-NEXT: - { id: 1, class: gpr32 }
656 # CHECK-NEXT: - { id: 2, class: gpr32 }
658 - { id: 0, class: gpr }
659 - { id: 1, class: gpr }
660 - { id: 2, class: gpr }
663 # CHECK: %0 = COPY %w0
664 # CHECK: %1 = COPY %w1
665 # CHECK: %2 = ANDWrr %0, %1
672 %2(s8) = G_AND %0, %1
676 # CHECK-LABEL: name: and_s16_gpr
679 regBankSelected: true
682 # CHECK-NEXT: - { id: 0, class: gpr32 }
683 # CHECK-NEXT: - { id: 1, class: gpr32 }
684 # CHECK-NEXT: - { id: 2, class: gpr32 }
686 - { id: 0, class: gpr }
687 - { id: 1, class: gpr }
688 - { id: 2, class: gpr }
691 # CHECK: %0 = COPY %w0
692 # CHECK: %1 = COPY %w1
693 # CHECK: %2 = ANDWrr %0, %1
700 %2(s16) = G_AND %0, %1
704 # Same as add_s32_gpr, for G_AND operations.
705 # CHECK-LABEL: name: and_s32_gpr
708 regBankSelected: true
711 # CHECK-NEXT: - { id: 0, class: gpr32 }
712 # CHECK-NEXT: - { id: 1, class: gpr32 }
713 # CHECK-NEXT: - { id: 2, class: gpr32 }
715 - { id: 0, class: gpr }
716 - { id: 1, class: gpr }
717 - { id: 2, class: gpr }
720 # CHECK: %0 = COPY %w0
721 # CHECK: %1 = COPY %w1
722 # CHECK: %2 = ANDWrr %0, %1
729 %2(s32) = G_AND %0, %1
733 # Same as add_s64_gpr, for G_AND operations.
734 # CHECK-LABEL: name: and_s64_gpr
737 regBankSelected: true
740 # CHECK-NEXT: - { id: 0, class: gpr64 }
741 # CHECK-NEXT: - { id: 1, class: gpr64 }
742 # CHECK-NEXT: - { id: 2, class: gpr64 }
744 - { id: 0, class: gpr }
745 - { id: 1, class: gpr }
746 - { id: 2, class: gpr }
749 # CHECK: %0 = COPY %x0
750 # CHECK: %1 = COPY %x1
751 # CHECK: %2 = ANDXrr %0, %1
758 %2(s64) = G_AND %0, %1
762 # CHECK-LABEL: name: shl_s8_gpr
765 regBankSelected: true
768 # CHECK-NEXT: - { id: 0, class: gpr32 }
769 # CHECK-NEXT: - { id: 1, class: gpr32 }
770 # CHECK-NEXT: - { id: 2, class: gpr32 }
772 - { id: 0, class: gpr }
773 - { id: 1, class: gpr }
774 - { id: 2, class: gpr }
777 # CHECK: %0 = COPY %w0
778 # CHECK: %1 = COPY %w1
779 # CHECK: %2 = LSLVWr %0, %1
786 %2(s8) = G_SHL %0, %1
790 # CHECK-LABEL: name: shl_s16_gpr
793 regBankSelected: true
796 # CHECK-NEXT: - { id: 0, class: gpr32 }
797 # CHECK-NEXT: - { id: 1, class: gpr32 }
798 # CHECK-NEXT: - { id: 2, class: gpr32 }
800 - { id: 0, class: gpr }
801 - { id: 1, class: gpr }
802 - { id: 2, class: gpr }
805 # CHECK: %0 = COPY %w0
806 # CHECK: %1 = COPY %w1
807 # CHECK: %2 = LSLVWr %0, %1
814 %2(s16) = G_SHL %0, %1
818 # Same as add_s32_gpr, for G_SHL operations.
819 # CHECK-LABEL: name: shl_s32_gpr
822 regBankSelected: true
825 # CHECK-NEXT: - { id: 0, class: gpr32 }
826 # CHECK-NEXT: - { id: 1, class: gpr32 }
827 # CHECK-NEXT: - { id: 2, class: gpr32 }
829 - { id: 0, class: gpr }
830 - { id: 1, class: gpr }
831 - { id: 2, class: gpr }
834 # CHECK: %0 = COPY %w0
835 # CHECK: %1 = COPY %w1
836 # CHECK: %2 = LSLVWr %0, %1
843 %2(s32) = G_SHL %0, %1
847 # Same as add_s64_gpr, for G_SHL operations.
848 # CHECK-LABEL: name: shl_s64_gpr
851 regBankSelected: true
854 # CHECK-NEXT: - { id: 0, class: gpr64 }
855 # CHECK-NEXT: - { id: 1, class: gpr64 }
856 # CHECK-NEXT: - { id: 2, class: gpr64 }
858 - { id: 0, class: gpr }
859 - { id: 1, class: gpr }
860 - { id: 2, class: gpr }
863 # CHECK: %0 = COPY %x0
864 # CHECK: %1 = COPY %x1
865 # CHECK: %2 = LSLVXr %0, %1
872 %2(s64) = G_SHL %0, %1
876 # Same as add_s32_gpr, for G_LSHR operations.
877 # CHECK-LABEL: name: lshr_s32_gpr
880 regBankSelected: true
883 # CHECK-NEXT: - { id: 0, class: gpr32 }
884 # CHECK-NEXT: - { id: 1, class: gpr32 }
885 # CHECK-NEXT: - { id: 2, class: gpr32 }
887 - { id: 0, class: gpr }
888 - { id: 1, class: gpr }
889 - { id: 2, class: gpr }
892 # CHECK: %0 = COPY %w0
893 # CHECK: %1 = COPY %w1
894 # CHECK: %2 = LSRVWr %0, %1
901 %2(s32) = G_LSHR %0, %1
905 # Same as add_s64_gpr, for G_LSHR operations.
906 # CHECK-LABEL: name: lshr_s64_gpr
909 regBankSelected: true
912 # CHECK-NEXT: - { id: 0, class: gpr64 }
913 # CHECK-NEXT: - { id: 1, class: gpr64 }
914 # CHECK-NEXT: - { id: 2, class: gpr64 }
916 - { id: 0, class: gpr }
917 - { id: 1, class: gpr }
918 - { id: 2, class: gpr }
921 # CHECK: %0 = COPY %x0
922 # CHECK: %1 = COPY %x1
923 # CHECK: %2 = LSRVXr %0, %1
930 %2(s64) = G_LSHR %0, %1
934 # Same as add_s32_gpr, for G_ASHR operations.
935 # CHECK-LABEL: name: ashr_s32_gpr
938 regBankSelected: true
941 # CHECK-NEXT: - { id: 0, class: gpr32 }
942 # CHECK-NEXT: - { id: 1, class: gpr32 }
943 # CHECK-NEXT: - { id: 2, class: gpr32 }
945 - { id: 0, class: gpr }
946 - { id: 1, class: gpr }
947 - { id: 2, class: gpr }
950 # CHECK: %0 = COPY %w0
951 # CHECK: %1 = COPY %w1
952 # CHECK: %2 = ASRVWr %0, %1
959 %2(s32) = G_ASHR %0, %1
963 # Same as add_s64_gpr, for G_ASHR operations.
964 # CHECK-LABEL: name: ashr_s64_gpr
967 regBankSelected: true
970 # CHECK-NEXT: - { id: 0, class: gpr64 }
971 # CHECK-NEXT: - { id: 1, class: gpr64 }
972 # CHECK-NEXT: - { id: 2, class: gpr64 }
974 - { id: 0, class: gpr }
975 - { id: 1, class: gpr }
976 - { id: 2, class: gpr }
979 # CHECK: %0 = COPY %x0
980 # CHECK: %1 = COPY %x1
981 # CHECK: %2 = ASRVXr %0, %1
988 %2(s64) = G_ASHR %0, %1
992 # CHECK-LABEL: name: mul_s8_gpr
995 regBankSelected: true
998 # CHECK-NEXT: - { id: 0, class: gpr32 }
999 # CHECK-NEXT: - { id: 1, class: gpr32 }
1000 # CHECK-NEXT: - { id: 2, class: gpr32 }
1002 - { id: 0, class: gpr }
1003 - { id: 1, class: gpr }
1004 - { id: 2, class: gpr }
1007 # CHECK: %0 = COPY %w0
1008 # CHECK: %1 = COPY %w1
1009 # CHECK: %2 = MADDWrrr %0, %1, %wzr
1016 %2(s8) = G_MUL %0, %1
1020 # CHECK-LABEL: name: mul_s16_gpr
1023 regBankSelected: true
1026 # CHECK-NEXT: - { id: 0, class: gpr32 }
1027 # CHECK-NEXT: - { id: 1, class: gpr32 }
1028 # CHECK-NEXT: - { id: 2, class: gpr32 }
1030 - { id: 0, class: gpr }
1031 - { id: 1, class: gpr }
1032 - { id: 2, class: gpr }
1035 # CHECK: %0 = COPY %w0
1036 # CHECK: %1 = COPY %w1
1037 # CHECK: %2 = MADDWrrr %0, %1, %wzr
1044 %2(s16) = G_MUL %0, %1
1048 # Check that we select s32 GPR G_MUL. This is trickier than other binops because
1049 # there is only MADDWrrr, and we have to use the WZR physreg.
1050 # CHECK-LABEL: name: mul_s32_gpr
1053 regBankSelected: true
1056 # CHECK-NEXT: - { id: 0, class: gpr32 }
1057 # CHECK-NEXT: - { id: 1, class: gpr32 }
1058 # CHECK-NEXT: - { id: 2, class: gpr32 }
1060 - { id: 0, class: gpr }
1061 - { id: 1, class: gpr }
1062 - { id: 2, class: gpr }
1065 # CHECK: %0 = COPY %w0
1066 # CHECK: %1 = COPY %w1
1067 # CHECK: %2 = MADDWrrr %0, %1, %wzr
1074 %2(s32) = G_MUL %0, %1
1078 # Same as mul_s32_gpr for the s64 type.
1079 # CHECK-LABEL: name: mul_s64_gpr
1082 regBankSelected: true
1085 # CHECK-NEXT: - { id: 0, class: gpr64 }
1086 # CHECK-NEXT: - { id: 1, class: gpr64 }
1087 # CHECK-NEXT: - { id: 2, class: gpr64 }
1089 - { id: 0, class: gpr }
1090 - { id: 1, class: gpr }
1091 - { id: 2, class: gpr }
1094 # CHECK: %0 = COPY %x0
1095 # CHECK: %1 = COPY %x1
1096 # CHECK: %2 = MADDXrrr %0, %1, %xzr
1103 %2(s64) = G_MUL %0, %1
1107 # Same as add_s32_gpr, for G_SDIV operations.
1108 # CHECK-LABEL: name: sdiv_s32_gpr
1111 regBankSelected: true
1114 # CHECK-NEXT: - { id: 0, class: gpr32 }
1115 # CHECK-NEXT: - { id: 1, class: gpr32 }
1116 # CHECK-NEXT: - { id: 2, class: gpr32 }
1118 - { id: 0, class: gpr }
1119 - { id: 1, class: gpr }
1120 - { id: 2, class: gpr }
1123 # CHECK: %0 = COPY %w0
1124 # CHECK: %1 = COPY %w1
1125 # CHECK: %2 = SDIVWr %0, %1
1132 %2(s32) = G_SDIV %0, %1
1136 # Same as add_s64_gpr, for G_SDIV operations.
1137 # CHECK-LABEL: name: sdiv_s64_gpr
1140 regBankSelected: true
1143 # CHECK-NEXT: - { id: 0, class: gpr64 }
1144 # CHECK-NEXT: - { id: 1, class: gpr64 }
1145 # CHECK-NEXT: - { id: 2, class: gpr64 }
1147 - { id: 0, class: gpr }
1148 - { id: 1, class: gpr }
1149 - { id: 2, class: gpr }
1152 # CHECK: %0 = COPY %x0
1153 # CHECK: %1 = COPY %x1
1154 # CHECK: %2 = SDIVXr %0, %1
1161 %2(s64) = G_SDIV %0, %1
1165 # Same as add_s32_gpr, for G_UDIV operations.
1166 # CHECK-LABEL: name: udiv_s32_gpr
1169 regBankSelected: true
1172 # CHECK-NEXT: - { id: 0, class: gpr32 }
1173 # CHECK-NEXT: - { id: 1, class: gpr32 }
1174 # CHECK-NEXT: - { id: 2, class: gpr32 }
1176 - { id: 0, class: gpr }
1177 - { id: 1, class: gpr }
1178 - { id: 2, class: gpr }
1181 # CHECK: %0 = COPY %w0
1182 # CHECK: %1 = COPY %w1
1183 # CHECK: %2 = UDIVWr %0, %1
1190 %2(s32) = G_UDIV %0, %1
1194 # Same as add_s64_gpr, for G_UDIV operations.
1195 # CHECK-LABEL: name: udiv_s64_gpr
1198 regBankSelected: true
1201 # CHECK-NEXT: - { id: 0, class: gpr64 }
1202 # CHECK-NEXT: - { id: 1, class: gpr64 }
1203 # CHECK-NEXT: - { id: 2, class: gpr64 }
1205 - { id: 0, class: gpr }
1206 - { id: 1, class: gpr }
1207 - { id: 2, class: gpr }
1210 # CHECK: %0 = COPY %x0
1211 # CHECK: %1 = COPY %x1
1212 # CHECK: %2 = UDIVXr %0, %1
1219 %2(s64) = G_UDIV %0, %1
1223 # Check that we select a s32 FPR G_FADD into FADDSrr.
1224 # CHECK-LABEL: name: fadd_s32_gpr
1227 regBankSelected: true
1230 # CHECK-NEXT: - { id: 0, class: fpr32 }
1231 # CHECK-NEXT: - { id: 1, class: fpr32 }
1232 # CHECK-NEXT: - { id: 2, class: fpr32 }
1234 - { id: 0, class: fpr }
1235 - { id: 1, class: fpr }
1236 - { id: 2, class: fpr }
1239 # CHECK: %0 = COPY %s0
1240 # CHECK: %1 = COPY %s1
1241 # CHECK: %2 = FADDSrr %0, %1
1248 %2(s32) = G_FADD %0, %1
1252 # CHECK-LABEL: name: fadd_s64_gpr
1255 regBankSelected: true
1258 # CHECK-NEXT: - { id: 0, class: fpr64 }
1259 # CHECK-NEXT: - { id: 1, class: fpr64 }
1260 # CHECK-NEXT: - { id: 2, class: fpr64 }
1262 - { id: 0, class: fpr }
1263 - { id: 1, class: fpr }
1264 - { id: 2, class: fpr }
1267 # CHECK: %0 = COPY %d0
1268 # CHECK: %1 = COPY %d1
1269 # CHECK: %2 = FADDDrr %0, %1
1276 %2(s64) = G_FADD %0, %1
1280 # CHECK-LABEL: name: fsub_s32_gpr
1283 regBankSelected: true
1286 # CHECK-NEXT: - { id: 0, class: fpr32 }
1287 # CHECK-NEXT: - { id: 1, class: fpr32 }
1288 # CHECK-NEXT: - { id: 2, class: fpr32 }
1290 - { id: 0, class: fpr }
1291 - { id: 1, class: fpr }
1292 - { id: 2, class: fpr }
1295 # CHECK: %0 = COPY %s0
1296 # CHECK: %1 = COPY %s1
1297 # CHECK: %2 = FSUBSrr %0, %1
1304 %2(s32) = G_FSUB %0, %1
1308 # CHECK-LABEL: name: fsub_s64_gpr
1311 regBankSelected: true
1314 # CHECK-NEXT: - { id: 0, class: fpr64 }
1315 # CHECK-NEXT: - { id: 1, class: fpr64 }
1316 # CHECK-NEXT: - { id: 2, class: fpr64 }
1318 - { id: 0, class: fpr }
1319 - { id: 1, class: fpr }
1320 - { id: 2, class: fpr }
1323 # CHECK: %0 = COPY %d0
1324 # CHECK: %1 = COPY %d1
1325 # CHECK: %2 = FSUBDrr %0, %1
1332 %2(s64) = G_FSUB %0, %1
1336 # CHECK-LABEL: name: fmul_s32_gpr
1339 regBankSelected: true
1342 # CHECK-NEXT: - { id: 0, class: fpr32 }
1343 # CHECK-NEXT: - { id: 1, class: fpr32 }
1344 # CHECK-NEXT: - { id: 2, class: fpr32 }
1346 - { id: 0, class: fpr }
1347 - { id: 1, class: fpr }
1348 - { id: 2, class: fpr }
1351 # CHECK: %0 = COPY %s0
1352 # CHECK: %1 = COPY %s1
1353 # CHECK: %2 = FMULSrr %0, %1
1360 %2(s32) = G_FMUL %0, %1
1364 # CHECK-LABEL: name: fmul_s64_gpr
1367 regBankSelected: true
1370 # CHECK-NEXT: - { id: 0, class: fpr64 }
1371 # CHECK-NEXT: - { id: 1, class: fpr64 }
1372 # CHECK-NEXT: - { id: 2, class: fpr64 }
1374 - { id: 0, class: fpr }
1375 - { id: 1, class: fpr }
1376 - { id: 2, class: fpr }
1379 # CHECK: %0 = COPY %d0
1380 # CHECK: %1 = COPY %d1
1381 # CHECK: %2 = FMULDrr %0, %1
1388 %2(s64) = G_FMUL %0, %1
1392 # CHECK-LABEL: name: fdiv_s32_gpr
1395 regBankSelected: true
1398 # CHECK-NEXT: - { id: 0, class: fpr32 }
1399 # CHECK-NEXT: - { id: 1, class: fpr32 }
1400 # CHECK-NEXT: - { id: 2, class: fpr32 }
1402 - { id: 0, class: fpr }
1403 - { id: 1, class: fpr }
1404 - { id: 2, class: fpr }
1407 # CHECK: %0 = COPY %s0
1408 # CHECK: %1 = COPY %s1
1409 # CHECK: %2 = FDIVSrr %0, %1
1416 %2(s32) = G_FDIV %0, %1
1420 # CHECK-LABEL: name: fdiv_s64_gpr
1423 regBankSelected: true
1426 # CHECK-NEXT: - { id: 0, class: fpr64 }
1427 # CHECK-NEXT: - { id: 1, class: fpr64 }
1428 # CHECK-NEXT: - { id: 2, class: fpr64 }
1430 - { id: 0, class: fpr }
1431 - { id: 1, class: fpr }
1432 - { id: 2, class: fpr }
1435 # CHECK: %0 = COPY %d0
1436 # CHECK: %1 = COPY %d1
1437 # CHECK: %2 = FDIVDrr %0, %1
1444 %2(s64) = G_FDIV %0, %1
1448 # CHECK-LABEL: name: sitofp_s32_s32_fpr
1449 name: sitofp_s32_s32_fpr
1451 regBankSelected: true
1454 # CHECK-NEXT: - { id: 0, class: gpr32 }
1455 # CHECK-NEXT: - { id: 1, class: fpr32 }
1457 - { id: 0, class: gpr }
1458 - { id: 1, class: fpr }
1461 # CHECK: %0 = COPY %w0
1462 # CHECK: %1 = SCVTFUWSri %0
1468 %1(s32) = G_SITOFP %0
1472 # CHECK-LABEL: name: sitofp_s32_s64_fpr
1473 name: sitofp_s32_s64_fpr
1475 regBankSelected: true
1478 # CHECK-NEXT: - { id: 0, class: gpr64 }
1479 # CHECK-NEXT: - { id: 1, class: fpr32 }
1481 - { id: 0, class: gpr }
1482 - { id: 1, class: fpr }
1485 # CHECK: %0 = COPY %x0
1486 # CHECK: %1 = SCVTFUXSri %0
1492 %1(s32) = G_SITOFP %0
1496 # CHECK-LABEL: name: sitofp_s64_s32_fpr
1497 name: sitofp_s64_s32_fpr
1499 regBankSelected: true
1502 # CHECK-NEXT: - { id: 0, class: gpr32 }
1503 # CHECK-NEXT: - { id: 1, class: fpr64 }
1505 - { id: 0, class: gpr }
1506 - { id: 1, class: fpr }
1509 # CHECK: %0 = COPY %w0
1510 # CHECK: %1 = SCVTFUWDri %0
1516 %1(s64) = G_SITOFP %0
1520 # CHECK-LABEL: name: sitofp_s64_s64_fpr
1521 name: sitofp_s64_s64_fpr
1523 regBankSelected: true
1526 # CHECK-NEXT: - { id: 0, class: gpr64 }
1527 # CHECK-NEXT: - { id: 1, class: fpr64 }
1529 - { id: 0, class: gpr }
1530 - { id: 1, class: fpr }
1533 # CHECK: %0 = COPY %x0
1534 # CHECK: %1 = SCVTFUXDri %0
1540 %1(s64) = G_SITOFP %0
1544 # CHECK-LABEL: name: uitofp_s32_s32_fpr
1545 name: uitofp_s32_s32_fpr
1547 regBankSelected: true
1550 # CHECK-NEXT: - { id: 0, class: gpr32 }
1551 # CHECK-NEXT: - { id: 1, class: fpr32 }
1553 - { id: 0, class: gpr }
1554 - { id: 1, class: fpr }
1557 # CHECK: %0 = COPY %w0
1558 # CHECK: %1 = UCVTFUWSri %0
1564 %1(s32) = G_UITOFP %0
1568 # CHECK-LABEL: name: uitofp_s32_s64_fpr
1569 name: uitofp_s32_s64_fpr
1571 regBankSelected: true
1574 # CHECK-NEXT: - { id: 0, class: gpr64 }
1575 # CHECK-NEXT: - { id: 1, class: fpr32 }
1577 - { id: 0, class: gpr }
1578 - { id: 1, class: fpr }
1581 # CHECK: %0 = COPY %x0
1582 # CHECK: %1 = UCVTFUXSri %0
1588 %1(s32) = G_UITOFP %0
1592 # CHECK-LABEL: name: uitofp_s64_s32_fpr
1593 name: uitofp_s64_s32_fpr
1595 regBankSelected: true
1598 # CHECK-NEXT: - { id: 0, class: gpr32 }
1599 # CHECK-NEXT: - { id: 1, class: fpr64 }
1601 - { id: 0, class: gpr }
1602 - { id: 1, class: fpr }
1605 # CHECK: %0 = COPY %w0
1606 # CHECK: %1 = UCVTFUWDri %0
1612 %1(s64) = G_UITOFP %0
1616 # CHECK-LABEL: name: uitofp_s64_s64_fpr
1617 name: uitofp_s64_s64_fpr
1619 regBankSelected: true
1622 # CHECK-NEXT: - { id: 0, class: gpr64 }
1623 # CHECK-NEXT: - { id: 1, class: fpr64 }
1625 - { id: 0, class: gpr }
1626 - { id: 1, class: fpr }
1629 # CHECK: %0 = COPY %x0
1630 # CHECK: %1 = UCVTFUXDri %0
1636 %1(s64) = G_UITOFP %0
1640 # CHECK-LABEL: name: fptosi_s32_s32_gpr
1641 name: fptosi_s32_s32_gpr
1643 regBankSelected: true
1646 # CHECK-NEXT: - { id: 0, class: fpr32 }
1647 # CHECK-NEXT: - { id: 1, class: gpr32 }
1649 - { id: 0, class: fpr }
1650 - { id: 1, class: gpr }
1653 # CHECK: %0 = COPY %s0
1654 # CHECK: %1 = FCVTZSUWSr %0
1660 %1(s32) = G_FPTOSI %0
1664 # CHECK-LABEL: name: fptosi_s32_s64_gpr
1665 name: fptosi_s32_s64_gpr
1667 regBankSelected: true
1670 # CHECK-NEXT: - { id: 0, class: fpr64 }
1671 # CHECK-NEXT: - { id: 1, class: gpr32 }
1673 - { id: 0, class: fpr }
1674 - { id: 1, class: gpr }
1677 # CHECK: %0 = COPY %d0
1678 # CHECK: %1 = FCVTZSUWDr %0
1684 %1(s32) = G_FPTOSI %0
1688 # CHECK-LABEL: name: fptosi_s64_s32_gpr
1689 name: fptosi_s64_s32_gpr
1691 regBankSelected: true
1694 # CHECK-NEXT: - { id: 0, class: fpr32 }
1695 # CHECK-NEXT: - { id: 1, class: gpr64 }
1697 - { id: 0, class: fpr }
1698 - { id: 1, class: gpr }
1701 # CHECK: %0 = COPY %s0
1702 # CHECK: %1 = FCVTZSUXSr %0
1708 %1(s64) = G_FPTOSI %0
1712 # CHECK-LABEL: name: fptosi_s64_s64_gpr
1713 name: fptosi_s64_s64_gpr
1715 regBankSelected: true
1718 # CHECK-NEXT: - { id: 0, class: fpr64 }
1719 # CHECK-NEXT: - { id: 1, class: gpr64 }
1721 - { id: 0, class: fpr }
1722 - { id: 1, class: gpr }
1725 # CHECK: %0 = COPY %d0
1726 # CHECK: %1 = FCVTZSUXDr %0
1732 %1(s64) = G_FPTOSI %0
1736 # CHECK-LABEL: name: fptoui_s32_s32_gpr
1737 name: fptoui_s32_s32_gpr
1739 regBankSelected: true
1742 # CHECK-NEXT: - { id: 0, class: fpr32 }
1743 # CHECK-NEXT: - { id: 1, class: gpr32 }
1745 - { id: 0, class: fpr }
1746 - { id: 1, class: gpr }
1749 # CHECK: %0 = COPY %s0
1750 # CHECK: %1 = FCVTZUUWSr %0
1756 %1(s32) = G_FPTOUI %0
1760 # CHECK-LABEL: name: fptoui_s32_s64_gpr
1761 name: fptoui_s32_s64_gpr
1763 regBankSelected: true
1766 # CHECK-NEXT: - { id: 0, class: fpr64 }
1767 # CHECK-NEXT: - { id: 1, class: gpr32 }
1769 - { id: 0, class: fpr }
1770 - { id: 1, class: gpr }
1773 # CHECK: %0 = COPY %d0
1774 # CHECK: %1 = FCVTZUUWDr %0
1780 %1(s32) = G_FPTOUI %0
1784 # CHECK-LABEL: name: fptoui_s64_s32_gpr
1785 name: fptoui_s64_s32_gpr
1787 regBankSelected: true
1790 # CHECK-NEXT: - { id: 0, class: fpr32 }
1791 # CHECK-NEXT: - { id: 1, class: gpr64 }
1793 - { id: 0, class: fpr }
1794 - { id: 1, class: gpr }
1797 # CHECK: %0 = COPY %s0
1798 # CHECK: %1 = FCVTZUUXSr %0
1804 %1(s64) = G_FPTOUI %0
1808 # CHECK-LABEL: name: fptoui_s64_s64_gpr
1809 name: fptoui_s64_s64_gpr
1811 regBankSelected: true
1814 # CHECK-NEXT: - { id: 0, class: fpr64 }
1815 # CHECK-NEXT: - { id: 1, class: gpr64 }
1817 - { id: 0, class: fpr }
1818 - { id: 1, class: gpr }
1821 # CHECK: %0 = COPY %d0
1822 # CHECK: %1 = FCVTZUUXDr %0
1828 %1(s64) = G_FPTOUI %0
1832 # CHECK-LABEL: name: fptrunc
1835 regBankSelected: true
1838 # CHECK: - { id: 0, class: fpr64 }
1839 # CHECK: - { id: 1, class: fpr32 }
1841 - { id: 0, class: fpr }
1842 - { id: 1, class: fpr }
1845 # CHECK: %0 = COPY %d0
1846 # CHECK: %1 = FCVTSDr %0
1852 %1(s32) = G_FPTRUNC %0
1856 # CHECK-LABEL: name: fpext
1859 regBankSelected: true
1862 # CHECK: - { id: 0, class: fpr32 }
1863 # CHECK: - { id: 1, class: fpr64 }
1865 - { id: 0, class: fpr }
1866 - { id: 1, class: fpr }
1869 # CHECK: %0 = COPY %s0
1870 # CHECK: %1 = FCVTDSr %0
1876 %1(s64) = G_FPEXT %0
1880 # CHECK-LABEL: name: unconditional_br
1881 name: unconditional_br
1883 regBankSelected: true
1887 # CHECK: successors: %bb.0
1897 # CHECK-LABEL: name: conditional_br
1898 name: conditional_br
1900 regBankSelected: true
1903 - { id: 0, class: gpr }
1907 # CHECK: TBNZW %0, 0, %bb.1
1911 successors: %bb.0, %bb.1
1913 G_BRCOND %0(s1), %bb.1
1920 # CHECK-LABEL: name: load_s64_gpr
1923 regBankSelected: true
1926 # CHECK-NEXT: - { id: 0, class: gpr64sp }
1927 # CHECK-NEXT: - { id: 1, class: gpr64 }
1929 - { id: 0, class: gpr }
1930 - { id: 1, class: gpr }
1933 # CHECK: %0 = COPY %x0
1934 # CHECK: %1 = LDRXui %0, 0 :: (load 8 from %ir.addr)
1940 %1(s64) = G_LOAD %0 :: (load 8 from %ir.addr)
1945 # CHECK-LABEL: name: load_s32_gpr
1948 regBankSelected: true
1951 # CHECK-NEXT: - { id: 0, class: gpr64sp }
1952 # CHECK-NEXT: - { id: 1, class: gpr32 }
1954 - { id: 0, class: gpr }
1955 - { id: 1, class: gpr }
1958 # CHECK: %0 = COPY %x0
1959 # CHECK: %1 = LDRWui %0, 0 :: (load 4 from %ir.addr)
1965 %1(s32) = G_LOAD %0 :: (load 4 from %ir.addr)
1970 # CHECK-LABEL: name: load_s16_gpr
1973 regBankSelected: true
1976 # CHECK-NEXT: - { id: 0, class: gpr64sp }
1977 # CHECK-NEXT: - { id: 1, class: gpr32 }
1979 - { id: 0, class: gpr }
1980 - { id: 1, class: gpr }
1983 # CHECK: %0 = COPY %x0
1984 # CHECK: %1 = LDRHHui %0, 0 :: (load 2 from %ir.addr)
1990 %1(s16) = G_LOAD %0 :: (load 2 from %ir.addr)
1995 # CHECK-LABEL: name: load_s8_gpr
1998 regBankSelected: true
2001 # CHECK-NEXT: - { id: 0, class: gpr64sp }
2002 # CHECK-NEXT: - { id: 1, class: gpr32 }
2004 - { id: 0, class: gpr }
2005 - { id: 1, class: gpr }
2008 # CHECK: %0 = COPY %x0
2009 # CHECK: %1 = LDRBBui %0, 0 :: (load 1 from %ir.addr)
2015 %1(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
2020 # CHECK-LABEL: name: load_s64_fpr
2023 regBankSelected: true
2026 # CHECK-NEXT: - { id: 0, class: gpr64sp }
2027 # CHECK-NEXT: - { id: 1, class: fpr64 }
2029 - { id: 0, class: gpr }
2030 - { id: 1, class: fpr }
2033 # CHECK: %0 = COPY %x0
2034 # CHECK: %1 = LDRDui %0, 0 :: (load 8 from %ir.addr)
2040 %1(s64) = G_LOAD %0 :: (load 8 from %ir.addr)
2045 # CHECK-LABEL: name: load_s32_fpr
2048 regBankSelected: true
2051 # CHECK-NEXT: - { id: 0, class: gpr64sp }
2052 # CHECK-NEXT: - { id: 1, class: fpr32 }
2054 - { id: 0, class: gpr }
2055 - { id: 1, class: fpr }
2058 # CHECK: %0 = COPY %x0
2059 # CHECK: %1 = LDRSui %0, 0 :: (load 4 from %ir.addr)
2065 %1(s32) = G_LOAD %0 :: (load 4 from %ir.addr)
2070 # CHECK-LABEL: name: load_s16_fpr
2073 regBankSelected: true
2076 # CHECK-NEXT: - { id: 0, class: gpr64sp }
2077 # CHECK-NEXT: - { id: 1, class: fpr16 }
2079 - { id: 0, class: gpr }
2080 - { id: 1, class: fpr }
2083 # CHECK: %0 = COPY %x0
2084 # CHECK: %1 = LDRHui %0, 0 :: (load 2 from %ir.addr)
2090 %1(s16) = G_LOAD %0 :: (load 2 from %ir.addr)
2095 # CHECK-LABEL: name: load_s8_fpr
2098 regBankSelected: true
2101 # CHECK-NEXT: - { id: 0, class: gpr64sp }
2102 # CHECK-NEXT: - { id: 1, class: fpr8 }
2104 - { id: 0, class: gpr }
2105 - { id: 1, class: fpr }
2108 # CHECK: %0 = COPY %x0
2109 # CHECK: %1 = LDRBui %0, 0 :: (load 1 from %ir.addr)
2115 %1(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
2120 # CHECK-LABEL: name: store_s64_gpr
2123 regBankSelected: true
2126 # CHECK-NEXT: - { id: 0, class: gpr64sp }
2127 # CHECK-NEXT: - { id: 1, class: gpr64 }
2129 - { id: 0, class: gpr }
2130 - { id: 1, class: gpr }
2133 # CHECK: %0 = COPY %x0
2134 # CHECK: %1 = COPY %x1
2135 # CHECK: STRXui %1, %0, 0 :: (store 8 into %ir.addr)
2142 G_STORE %1, %0 :: (store 8 into %ir.addr)
2147 # CHECK-LABEL: name: store_s32_gpr
2150 regBankSelected: true
2153 # CHECK-NEXT: - { id: 0, class: gpr64sp }
2154 # CHECK-NEXT: - { id: 1, class: gpr32 }
2156 - { id: 0, class: gpr }
2157 - { id: 1, class: gpr }
2160 # CHECK: %0 = COPY %x0
2161 # CHECK: %1 = COPY %w1
2162 # CHECK: STRWui %1, %0, 0 :: (store 4 into %ir.addr)
2169 G_STORE %1, %0 :: (store 4 into %ir.addr)
2174 # CHECK-LABEL: name: store_s16_gpr
2177 regBankSelected: true
2180 # CHECK-NEXT: - { id: 0, class: gpr64sp }
2181 # CHECK-NEXT: - { id: 1, class: gpr32 }
2183 - { id: 0, class: gpr }
2184 - { id: 1, class: gpr }
2187 # CHECK: %0 = COPY %x0
2188 # CHECK: %1 = COPY %w1
2189 # CHECK: STRHHui %1, %0, 0 :: (store 2 into %ir.addr)
2196 G_STORE %1, %0 :: (store 2 into %ir.addr)
2201 # CHECK-LABEL: name: store_s8_gpr
2204 regBankSelected: true
2207 # CHECK-NEXT: - { id: 0, class: gpr64sp }
2208 # CHECK-NEXT: - { id: 1, class: gpr32 }
2210 - { id: 0, class: gpr }
2211 - { id: 1, class: gpr }
2214 # CHECK: %0 = COPY %x0
2215 # CHECK: %1 = COPY %w1
2216 # CHECK: STRBBui %1, %0, 0 :: (store 1 into %ir.addr)
2223 G_STORE %1, %0 :: (store 1 into %ir.addr)
2228 # CHECK-LABEL: name: store_s64_fpr
2231 regBankSelected: true
2234 # CHECK-NEXT: - { id: 0, class: gpr64sp }
2235 # CHECK-NEXT: - { id: 1, class: fpr64 }
2237 - { id: 0, class: gpr }
2238 - { id: 1, class: fpr }
2241 # CHECK: %0 = COPY %x0
2242 # CHECK: %1 = COPY %d1
2243 # CHECK: STRDui %1, %0, 0 :: (store 8 into %ir.addr)
2250 G_STORE %1, %0 :: (store 8 into %ir.addr)
2255 # CHECK-LABEL: name: store_s32_fpr
2258 regBankSelected: true
2261 # CHECK-NEXT: - { id: 0, class: gpr64sp }
2262 # CHECK-NEXT: - { id: 1, class: fpr32 }
2264 - { id: 0, class: gpr }
2265 - { id: 1, class: fpr }
2268 # CHECK: %0 = COPY %x0
2269 # CHECK: %1 = COPY %s1
2270 # CHECK: STRSui %1, %0, 0 :: (store 4 into %ir.addr)
2277 G_STORE %1, %0 :: (store 4 into %ir.addr)
2282 # CHECK-LABEL: name: frame_index
2285 regBankSelected: true
2288 # CHECK-NEXT: - { id: 0, class: gpr64sp }
2290 - { id: 0, class: gpr }
2293 - { id: 0, name: ptr0, offset: 0, size: 8, alignment: 8 }
2296 # CHECK: %0 = ADDXri %stack.0.ptr0, 0, 0
2299 %0(p0) = G_FRAME_INDEX %stack.0.ptr0
2303 # Check that we set the "selected" property.
2304 # CHECK-LABEL: name: selected_property
2305 # CHECK: legalized: true
2306 # CHECK-NEXT: regBankSelected: true
2307 # CHECK-NEXT: selected: true
2308 name: selected_property
2310 regBankSelected: true
2317 # CHECK-LABEL: name: const_s32
2320 regBankSelected: true
2322 - { id: 0, class: gpr }
2325 # CHECK: %0 = MOVi32imm 42
2328 %0(s32) = G_CONSTANT i32 42
2332 # CHECK-LABEL: name: const_s64
2335 regBankSelected: true
2337 - { id: 0, class: gpr }
2340 # CHECK: %0 = MOVi64imm 1234567890123
2343 %0(s64) = G_CONSTANT i64 1234567890123
2347 # CHECK-LABEL: name: fconst_s32
2350 regBankSelected: true
2352 - { id: 0, class: fpr }
2355 # CHECK: [[TMP:%[0-9]+]] = MOVi32imm 1080033280
2356 # CHECK: %0 = COPY [[TMP]]
2359 %0(s32) = G_FCONSTANT float 3.5
2363 # CHECK-LABEL: name: fconst_s64
2366 regBankSelected: true
2368 - { id: 0, class: fpr }
2371 # CHECK: [[TMP:%[0-9]+]] = MOVi64imm 4607182418800017408
2372 # CHECK: %0 = COPY [[TMP]]
2375 %0(s64) = G_FCONSTANT double 1.0
2379 # CHECK-LABEL: name: gep
2382 regBankSelected: true
2384 - { id: 0, class: gpr }
2385 - { id: 1, class: gpr }
2386 - { id: 2, class: gpr }
2389 # CHECK: %1 = MOVi64imm 42
2390 # CHECK: %2 = ADDXrr %0, %1
2395 %1(s64) = G_CONSTANT i64 42
2396 %2(p0) = G_GEP %0, %1(s64)
2400 # Global defined in the same linkage unit so no GOT is needed
2401 # CHECK-LABEL: name: global_local
2404 regBankSelected: true
2406 - { id: 0, class: gpr }
2409 # IOS: %0 = MOVaddr target-flags(aarch64-page) @var_local, target-flags(aarch64-pageoff, aarch64-nc) @var_local
2410 # LINUX-DEFAULT: %0 = MOVaddr target-flags(aarch64-page) @var_local, target-flags(aarch64-pageoff, aarch64-nc) @var_local
2411 # LINUX-PIC: %0 = LOADgot target-flags(aarch64-got) @var_local
2414 %0(p0) = G_GLOBAL_VALUE @var_local
2418 # CHECK-LABEL: name: global_got
2421 regBankSelected: true
2423 - { id: 0, class: gpr }
2426 # IOS: %0 = LOADgot target-flags(aarch64-got) @var_got
2427 # LINUX-DEFAULT: %0 = MOVaddr target-flags(aarch64-page) @var_got, target-flags(aarch64-pageoff, aarch64-nc) @var_got
2428 # LINUX-PIC: %0 = LOADgot target-flags(aarch64-got) @var_got
2431 %0(p0) = G_GLOBAL_VALUE @var_got
2435 # CHECK-LABEL: name: trunc
2438 regBankSelected: true
2441 # CHECK-NEXT: - { id: 0, class: gpr32 }
2442 # CHECK-NEXT: - { id: 1, class: gpr32 }
2443 # CHECK-NEXT: - { id: 2, class: gpr64 }
2444 # CHECK-NEXT: - { id: 3, class: gpr32 }
2445 # CHECK-NEXT: - { id: 4, class: gpr32 }
2447 - { id: 0, class: gpr }
2448 - { id: 1, class: gpr }
2449 - { id: 2, class: gpr }
2450 - { id: 3, class: gpr }
2451 - { id: 4, class: gpr }
2454 # CHECK: %1 = COPY %0
2455 # CHECK: %3 = COPY %2.sub_32
2456 # CHECK: %4 = COPY %2.sub_32
2465 %3(s32) = G_TRUNC %2
2470 # CHECK-LABEL: name: anyext_gpr
2473 regBankSelected: true
2476 # CHECK-NEXT: - { id: 0, class: gpr32all }
2477 # CHECK-NEXT: - { id: 1, class: gpr64all }
2478 # CHECK-NEXT: - { id: 2, class: gpr32all }
2479 # CHECK-NEXT: - { id: 3, class: gpr32all }
2480 # CHECK-NEXT: - { id: 4, class: gpr64all }
2482 - { id: 0, class: gpr }
2483 - { id: 1, class: gpr }
2484 - { id: 2, class: gpr }
2485 - { id: 3, class: gpr }
2488 # CHECK: %0 = COPY %w0
2489 # CHECK: %4 = SUBREG_TO_REG 0, %0, 15
2490 # CHECK: %1 = COPY %4
2491 # CHECK: %2 = COPY %w0
2492 # CHECK: %3 = COPY %2
2498 %1(s64) = G_ANYEXT %0
2500 %3(s32) = G_ANYEXT %2
2504 # CHECK-LABEL: name: zext_gpr
2507 regBankSelected: true
2510 # CHECK-NEXT: - { id: 0, class: gpr32 }
2511 # CHECK-NEXT: - { id: 1, class: gpr64 }
2512 # CHECK-NEXT: - { id: 2, class: gpr32 }
2513 # CHECK-NEXT: - { id: 3, class: gpr32 }
2514 # CHECK-NEXT: - { id: 4, class: gpr32 }
2515 # CHECK-NEXT: - { id: 5, class: gpr64 }
2517 - { id: 0, class: gpr }
2518 - { id: 1, class: gpr }
2519 - { id: 2, class: gpr }
2520 - { id: 3, class: gpr }
2521 - { id: 4, class: gpr }
2524 # CHECK: %0 = COPY %w0
2525 # CHECK: %5 = SUBREG_TO_REG 0, %0, 15
2526 # CHECK: %1 = UBFMXri %5, 0, 31
2527 # CHECK: %2 = COPY %w0
2528 # CHECK: %3 = UBFMWri %2, 0, 7
2529 # CHECK: %4 = UBFMWri %2, 0, 7
2542 # CHECK-LABEL: name: sext_gpr
2545 regBankSelected: true
2548 # CHECK-NEXT: - { id: 0, class: gpr32 }
2549 # CHECK-NEXT: - { id: 1, class: gpr64 }
2550 # CHECK-NEXT: - { id: 2, class: gpr32 }
2551 # CHECK-NEXT: - { id: 3, class: gpr32 }
2552 # CHECK-NEXT: - { id: 4, class: gpr32 }
2553 # CHECK-NEXT: - { id: 5, class: gpr64 }
2555 - { id: 0, class: gpr }
2556 - { id: 1, class: gpr }
2557 - { id: 2, class: gpr }
2558 - { id: 3, class: gpr }
2559 - { id: 4, class: gpr }
2562 # CHECK: %0 = COPY %w0
2563 # CHECK: %5 = SUBREG_TO_REG 0, %0, 15
2564 # CHECK: %1 = SBFMXri %5, 0, 31
2565 # CHECK: %2 = COPY %w0
2566 # CHECK: %3 = SBFMWri %2, 0, 7
2567 # CHECK: %4 = SBFMWri %2, 0, 7
2580 # CHECK-LABEL: name: casts
2583 regBankSelected: true
2586 # CHECK-NEXT: - { id: 0, class: gpr64all }
2587 # CHECK-NEXT: - { id: 1, class: fpr64 }
2588 # CHECK-NEXT: - { id: 2, class: gpr64 }
2589 # CHECK-NEXT: - { id: 3, class: gpr64 }
2590 # CHECK-NEXT: - { id: 4, class: gpr32 }
2591 # CHECK-NEXT: - { id: 5, class: gpr32 }
2592 # CHECK-NEXT: - { id: 6, class: gpr32 }
2593 # CHECK-NEXT: - { id: 7, class: gpr32 }
2595 - { id: 0, class: gpr }
2596 - { id: 1, class: fpr }
2597 - { id: 2, class: gpr }
2598 - { id: 3, class: gpr }
2599 - { id: 4, class: gpr }
2600 - { id: 5, class: gpr }
2601 - { id: 6, class: gpr }
2602 - { id: 7, class: gpr }
2604 # CHECK: %0 = COPY %x0
2605 # CHECK: %1 = COPY %0
2606 # CHECK: %2 = COPY %0
2607 # CHECK: %3 = COPY %2
2608 # CHECK: %4 = COPY %2.sub_32
2609 # CHECK: %5 = COPY %2.sub_32
2610 # CHECK: %6 = COPY %2.sub_32
2611 # CHECK: %7 = COPY %2.sub_32
2616 %1(<8 x s8>) = G_BITCAST %0(s64)
2617 %2(p0) = G_INTTOPTR %0
2619 %3(s64) = G_PTRTOINT %2
2620 %4(s32) = G_PTRTOINT %2
2621 %5(s16) = G_PTRTOINT %2
2622 %6(s8) = G_PTRTOINT %2
2623 %7(s1) = G_PTRTOINT %2
2627 # CHECK-LABEL: name: bitcast_s32_gpr
2628 name: bitcast_s32_gpr
2630 regBankSelected: true
2632 # CHECK-NEXT: - { id: 0, class: gpr32all }
2633 # CHECK-NEXT: - { id: 1, class: gpr32all }
2635 - { id: 0, class: gpr }
2636 - { id: 1, class: gpr }
2639 # CHECK: %0 = COPY %w0
2640 # CHECK: %1 = COPY %0
2646 %1(s32) = G_BITCAST %0
2650 # CHECK-LABEL: name: bitcast_s32_fpr
2651 name: bitcast_s32_fpr
2653 regBankSelected: true
2656 # CHECK-NEXT: - { id: 0, class: fpr32 }
2657 # CHECK-NEXT: - { id: 1, class: fpr32 }
2659 - { id: 0, class: fpr }
2660 - { id: 1, class: fpr }
2663 # CHECK: %0 = COPY %s0
2664 # CHECK: %1 = COPY %0
2670 %1(s32) = G_BITCAST %0
2674 # CHECK-LABEL: name: bitcast_s32_gpr_fpr
2675 name: bitcast_s32_gpr_fpr
2677 regBankSelected: true
2680 # CHECK-NEXT: - { id: 0, class: gpr32all }
2681 # CHECK-NEXT: - { id: 1, class: fpr32 }
2683 - { id: 0, class: gpr }
2684 - { id: 1, class: fpr }
2687 # CHECK: %0 = COPY %w0
2688 # CHECK: %1 = COPY %0
2694 %1(s32) = G_BITCAST %0
2698 # CHECK-LABEL: name: bitcast_s32_fpr_gpr
2699 name: bitcast_s32_fpr_gpr
2701 regBankSelected: true
2704 # CHECK-NEXT: - { id: 0, class: fpr32 }
2705 # CHECK-NEXT: - { id: 1, class: gpr32all }
2707 - { id: 0, class: fpr }
2708 - { id: 1, class: gpr }
2711 # CHECK: %0 = COPY %s0
2712 # CHECK: %1 = COPY %0
2718 %1(s32) = G_BITCAST %0
2722 # CHECK-LABEL: name: bitcast_s64_gpr
2723 name: bitcast_s64_gpr
2725 regBankSelected: true
2728 # CHECK-NEXT: - { id: 0, class: gpr64all }
2729 # CHECK-NEXT: - { id: 1, class: gpr64all }
2731 - { id: 0, class: gpr }
2732 - { id: 1, class: gpr }
2735 # CHECK: %0 = COPY %x0
2736 # CHECK: %1 = COPY %0
2742 %1(s64) = G_BITCAST %0
2746 # CHECK-LABEL: name: bitcast_s64_fpr
2747 name: bitcast_s64_fpr
2749 regBankSelected: true
2752 # CHECK-NEXT: - { id: 0, class: fpr64 }
2753 # CHECK-NEXT: - { id: 1, class: fpr64 }
2755 - { id: 0, class: fpr }
2756 - { id: 1, class: fpr }
2759 # CHECK: %0 = COPY %d0
2760 # CHECK: %1 = COPY %0
2766 %1(s64) = G_BITCAST %0
2770 # CHECK-LABEL: name: bitcast_s64_gpr_fpr
2771 name: bitcast_s64_gpr_fpr
2773 regBankSelected: true
2776 # CHECK-NEXT: - { id: 0, class: gpr64all }
2777 # CHECK-NEXT: - { id: 1, class: fpr64 }
2779 - { id: 0, class: gpr }
2780 - { id: 1, class: fpr }
2782 # CHECK: %0 = COPY %x0
2783 # CHECK: %1 = COPY %0
2789 %1(s64) = G_BITCAST %0
2793 # CHECK-LABEL: name: bitcast_s64_fpr_gpr
2794 name: bitcast_s64_fpr_gpr
2796 regBankSelected: true
2799 # CHECK-NEXT: - { id: 0, class: fpr64 }
2800 # CHECK-NEXT: - { id: 1, class: gpr64all }
2802 - { id: 0, class: fpr }
2803 - { id: 1, class: gpr }
2806 # CHECK: %0 = COPY %d0
2807 # CHECK: %1 = COPY %0
2813 %1(s64) = G_BITCAST %0
2817 # CHECK-LABEL: name: icmp
2820 regBankSelected: true
2823 # CHECK-NEXT: - { id: 0, class: gpr32 }
2824 # CHECK-NEXT: - { id: 1, class: gpr32 }
2825 # CHECK-NEXT: - { id: 2, class: gpr64 }
2826 # CHECK-NEXT: - { id: 3, class: gpr32 }
2827 # CHECK-NEXT: - { id: 4, class: gpr64 }
2828 # CHECK-NEXT: - { id: 5, class: gpr32 }
2830 - { id: 0, class: gpr }
2831 - { id: 1, class: gpr }
2832 - { id: 2, class: gpr }
2833 - { id: 3, class: gpr }
2834 - { id: 4, class: gpr }
2835 - { id: 5, class: gpr }
2838 # CHECK: %wzr = SUBSWrr %0, %0, implicit-def %nzcv
2839 # CHECK: %1 = CSINCWr %wzr, %wzr, 1, implicit %nzcv
2841 # CHECK: %xzr = SUBSXrr %2, %2, implicit-def %nzcv
2842 # CHECK: %3 = CSINCWr %wzr, %wzr, 3, implicit %nzcv
2844 # CHECK: %xzr = SUBSXrr %4, %4, implicit-def %nzcv
2845 # CHECK: %5 = CSINCWr %wzr, %wzr, 0, implicit %nzcv
2852 %1(s1) = G_ICMP intpred(eq), %0, %0
2855 %3(s1) = G_ICMP intpred(uge), %2, %2
2858 %5(s1) = G_ICMP intpred(ne), %4, %4
2862 # CHECK-LABEL: name: fcmp
2865 regBankSelected: true
2868 # CHECK-NEXT: - { id: 0, class: fpr32 }
2869 # CHECK-NEXT: - { id: 1, class: gpr32 }
2870 # CHECK-NEXT: - { id: 2, class: fpr64 }
2871 # CHECK-NEXT: - { id: 3, class: gpr32 }
2872 # CHECK-NEXT: - { id: 4, class: gpr32 }
2873 # CHECK-NEXT: - { id: 5, class: gpr32 }
2875 - { id: 0, class: fpr }
2876 - { id: 1, class: gpr }
2877 - { id: 2, class: fpr }
2878 - { id: 3, class: gpr }
2881 # CHECK: FCMPSrr %0, %0, implicit-def %nzcv
2882 # CHECK: [[TST_MI:%[0-9]+]] = CSINCWr %wzr, %wzr, 4, implicit %nzcv
2883 # CHECK: [[TST_GT:%[0-9]+]] = CSINCWr %wzr, %wzr, 12, implicit %nzcv
2884 # CHECK: %1 = ORRWrr [[TST_MI]], [[TST_GT]]
2886 # CHECK: FCMPDrr %2, %2, implicit-def %nzcv
2887 # CHECK: %3 = CSINCWr %wzr, %wzr, 5, implicit %nzcv
2894 %1(s1) = G_FCMP floatpred(one), %0, %0
2897 %3(s1) = G_FCMP floatpred(uge), %2, %2
2902 # CHECK-LABEL: name: phi
2905 regBankSelected: true
2906 tracksRegLiveness: true
2909 # CHECK-NEXT: - { id: 0, class: fpr32 }
2910 # CHECK-NEXT: - { id: 1, class: gpr32 }
2911 # CHECK-NEXT: - { id: 2, class: fpr32 }
2913 - { id: 0, class: fpr }
2914 - { id: 1, class: gpr }
2915 - { id: 2, class: fpr }
2919 # CHECK: %2 = PHI %0, %bb.0, %2, %bb.1
2929 successors: %bb.1, %bb.2
2930 %2(s32) = PHI %0, %bb.0, %2, %bb.1
2935 RET_ReallyLR implicit %s0
2939 # CHECK-LABEL: name: select
2942 regBankSelected: true
2943 tracksRegLiveness: true
2946 # CHECK-NEXT: - { id: 0, class: gpr32 }
2947 # CHECK-NEXT: - { id: 1, class: gpr32 }
2948 # CHECK-NEXT: - { id: 2, class: gpr32 }
2949 # CHECK-NEXT: - { id: 3, class: gpr32 }
2950 # CHECK-NEXT: - { id: 4, class: gpr64 }
2951 # CHECK-NEXT: - { id: 5, class: gpr64 }
2952 # CHECK-NEXT: - { id: 6, class: gpr64 }
2954 - { id: 0, class: gpr }
2955 - { id: 1, class: gpr }
2956 - { id: 2, class: gpr }
2957 - { id: 3, class: gpr }
2958 - { id: 4, class: gpr }
2959 - { id: 5, class: gpr }
2960 - { id: 6, class: gpr }
2963 # CHECK: %wzr = ANDSWri %0, 0, implicit-def %nzcv
2964 # CHECK: %3 = CSELWr %1, %2, 1, implicit %nzcv
2965 # CHECK: %wzr = ANDSWri %0, 0, implicit-def %nzcv
2966 # CHECK: %6 = CSELXr %4, %5, 1, implicit %nzcv
2969 liveins: %w0, %w1, %w2
2974 %3(s32) = G_SELECT %0, %1, %2
2978 %6(s64) = G_SELECT %0, %4, %5