]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/ARM/GlobalISel/arm-instruction-select.mir
Vendor import of llvm trunk r351319 (just before the release_80 branch
[FreeBSD/FreeBSD.git] / test / CodeGen / ARM / GlobalISel / arm-instruction-select.mir
1 # RUN: llc -O0 -mtriple arm-- -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s
2 --- |
3   define void @test_trunc_and_zext_s1() { ret void }
4   define void @test_trunc_and_sext_s1() { ret void }
5   define void @test_trunc_and_sext_s8() { ret void }
6   define void @test_trunc_and_zext_s16() { ret void }
7   define void @test_trunc_and_anyext_s8() { ret void }
8   define void @test_trunc_and_anyext_s16() { ret void }
9   define void @test_trunc_s64() #0 { ret void }
10
11   define void @test_add_s32() { ret void }
12   define void @test_add_fold_imm_s32() { ret void }
13   define void @test_add_no_fold_imm_s32() #3 { ret void }
14
15   define void @test_fadd_s32() #0 { ret void }
16   define void @test_fadd_s64() #0 { ret void }
17
18   define void @test_fsub_s32() #0 { ret void }
19   define void @test_fsub_s64() #0 { ret void }
20
21   define void @test_fmul_s32() #0 { ret void }
22   define void @test_fmul_s64() #0 { ret void }
23
24   define void @test_fdiv_s32() #0 { ret void }
25   define void @test_fdiv_s64() #0 { ret void }
26
27   define void @test_fneg_s32() #0 { ret void }
28   define void @test_fneg_s64() #0 { ret void }
29
30   define void @test_fma_s32() #4 { ret void }
31   define void @test_fma_s64() #4 { ret void }
32
33   define void @test_fpext_s32_to_s64() #0 { ret void }
34   define void @test_fptrunc_s64_to_s32() #0 {ret void }
35
36   define void @test_fptosi_s32() #0 { ret void }
37   define void @test_fptosi_s64() #0 { ret void }
38   define void @test_fptoui_s32() #0 { ret void }
39   define void @test_fptoui_s64() #0 { ret void }
40
41   define void @test_sitofp_s32() #0 { ret void }
42   define void @test_sitofp_s64() #0 { ret void }
43   define void @test_uitofp_s32() #0 { ret void }
44   define void @test_uitofp_s64() #0 { ret void }
45
46   define void @test_sub_s32() { ret void }
47   define void @test_sub_imm_s32() { ret void }
48   define void @test_sub_rev_imm_s32() { ret void }
49
50   define void @test_mul_s32() #1 { ret void }
51   define void @test_mulv5_s32() { ret void }
52
53   define void @test_sdiv_s32() #2 { ret void }
54   define void @test_udiv_s32() #2 { ret void }
55
56   define void @test_lshr_s32() { ret void }
57   define void @test_ashr_s32() { ret void }
58   define void @test_shl_s32() { ret void }
59
60   define void @test_load_from_stack() { ret void }
61   define void @test_load_f32() #0 { ret void }
62   define void @test_load_f64() #0 { ret void }
63
64   define void @test_stores() #0 { ret void }
65
66   define void @test_gep() { ret void }
67
68   define void @test_MOVi32imm() #3 { ret void }
69
70   define void @test_constant_imm() { ret void }
71   define void @test_constant_cimm() { ret void }
72
73   define void @test_pointer_constant_unconstrained() { ret void }
74   define void @test_pointer_constant_constrained() { ret void }
75
76   define void @test_inttoptr_s32() { ret void }
77   define void @test_ptrtoint_s32() { ret void }
78
79   define void @test_select_s32() { ret void }
80   define void @test_select_ptr() { ret void }
81
82   define void @test_br() { ret void }
83
84   define void @test_phi_s32() { ret void }
85   define void @test_phi_s64() #0 { ret void }
86
87   define void @test_soft_fp_double() #0 { ret void }
88
89   attributes #0 = { "target-features"="+vfp2,-neonfp" }
90   attributes #1 = { "target-features"="+v6" }
91   attributes #2 = { "target-features"="+hwdiv-arm" }
92   attributes #3 = { "target-features"="+v6t2" }
93   attributes #4 = { "target-features"="+vfp4,-neonfp" }
94 ...
95 ---
96 name:            test_trunc_and_zext_s1
97 # CHECK-LABEL: name: test_trunc_and_zext_s1
98 legalized:       true
99 regBankSelected: true
100 selected:        false
101 # CHECK: selected: true
102 registers:
103   - { id: 0, class: gprb }
104   - { id: 1, class: gprb }
105   - { id: 2, class: gprb }
106 body:             |
107   bb.0:
108     liveins: $r0
109
110     %0(s32) = COPY $r0
111     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r0
112
113     %1(s1) = G_TRUNC %0(s32)
114
115     %2(s32) = G_ZEXT %1(s1)
116     ; CHECK: [[VREGEXT:%[0-9]+]]:gpr = ANDri [[VREG]], 1, 14, $noreg, $noreg
117
118     $r0 = COPY %2(s32)
119     ; CHECK: $r0 = COPY [[VREGEXT]]
120
121     BX_RET 14, $noreg, implicit $r0
122     ; CHECK: BX_RET 14, $noreg, implicit $r0
123 ...
124 ---
125 name:            test_trunc_and_sext_s1
126 # CHECK-LABEL: name: test_trunc_and_sext_s1
127 legalized:       true
128 regBankSelected: true
129 selected:        false
130 # CHECK: selected: true
131 registers:
132   - { id: 0, class: gprb }
133   - { id: 1, class: gprb }
134   - { id: 2, class: gprb }
135 body:             |
136   bb.0:
137     liveins: $r0
138
139     %0(s32) = COPY $r0
140     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r0
141
142     %1(s1) = G_TRUNC %0(s32)
143
144     %2(s32) = G_SEXT %1(s1)
145     ; CHECK: [[VREGAND:%[0-9]+]]:gpr = ANDri [[VREG]], 1, 14, $noreg, $noreg
146     ; CHECK: [[VREGEXT:%[0-9]+]]:gpr = RSBri [[VREGAND]], 0, 14, $noreg, $noreg
147
148     $r0 = COPY %2(s32)
149     ; CHECK: $r0 = COPY [[VREGEXT]]
150
151     BX_RET 14, $noreg, implicit $r0
152     ; CHECK: BX_RET 14, $noreg, implicit $r0
153 ...
154 ---
155 name:            test_trunc_and_sext_s8
156 # CHECK-LABEL: name: test_trunc_and_sext_s8
157 legalized:       true
158 regBankSelected: true
159 selected:        false
160 # CHECK: selected: true
161 registers:
162   - { id: 0, class: gprb }
163   - { id: 1, class: gprb }
164   - { id: 2, class: gprb }
165 body:             |
166   bb.0:
167     liveins: $r0
168
169     %0(s32) = COPY $r0
170     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r0
171
172     %1(s8) = G_TRUNC %0(s32)
173     ; CHECK: [[VREGTRUNC:%[0-9]+]]:gprnopc = COPY [[VREG]]
174
175     %2(s32) = G_SEXT %1(s8)
176     ; CHECK: [[VREGEXT:%[0-9]+]]:gprnopc = SXTB [[VREGTRUNC]], 0, 14, $noreg
177
178     $r0 = COPY %2(s32)
179     ; CHECK: $r0 = COPY [[VREGEXT]]
180
181     BX_RET 14, $noreg, implicit $r0
182     ; CHECK: BX_RET 14, $noreg, implicit $r0
183 ...
184 ---
185 name:            test_trunc_and_zext_s16
186 # CHECK-LABEL: name: test_trunc_and_zext_s16
187 legalized:       true
188 regBankSelected: true
189 selected:        false
190 # CHECK: selected: true
191 registers:
192   - { id: 0, class: gprb }
193   - { id: 1, class: gprb }
194   - { id: 2, class: gprb }
195 body:             |
196   bb.0:
197     liveins: $r0
198
199     %0(s32) = COPY $r0
200     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r0
201
202     %1(s16) = G_TRUNC %0(s32)
203     ; CHECK: [[VREGTRUNC:%[0-9]+]]:gprnopc = COPY [[VREG]]
204
205     %2(s32) = G_ZEXT %1(s16)
206     ; CHECK: [[VREGEXT:%[0-9]+]]:gprnopc = UXTH [[VREGTRUNC]], 0, 14, $noreg
207
208     $r0 = COPY %2(s32)
209     ; CHECK: $r0 = COPY [[VREGEXT]]
210
211     BX_RET 14, $noreg, implicit $r0
212     ; CHECK: BX_RET 14, $noreg, implicit $r0
213 ...
214 ---
215 name:            test_trunc_and_anyext_s8
216 # CHECK-LABEL: name: test_trunc_and_anyext_s8
217 legalized:       true
218 regBankSelected: true
219 selected:        false
220 # CHECK: selected: true
221 registers:
222   - { id: 0, class: gprb }
223   - { id: 1, class: gprb }
224   - { id: 2, class: gprb }
225 body:             |
226   bb.0:
227     liveins: $r0
228
229     %0(s32) = COPY $r0
230     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r0
231
232     %1(s8) = G_TRUNC %0(s32)
233
234     %2(s32) = G_ANYEXT %1(s8)
235
236     $r0 = COPY %2(s32)
237     ; CHECK: $r0 = COPY [[VREG]]
238
239     BX_RET 14, $noreg, implicit $r0
240     ; CHECK: BX_RET 14, $noreg, implicit $r0
241 ...
242 ---
243 name:            test_trunc_and_anyext_s16
244 # CHECK-LABEL: name: test_trunc_and_anyext_s16
245 legalized:       true
246 regBankSelected: true
247 selected:        false
248 # CHECK: selected: true
249 registers:
250   - { id: 0, class: gprb }
251   - { id: 1, class: gprb }
252   - { id: 2, class: gprb }
253 body:             |
254   bb.0:
255     liveins: $r0
256
257     %0(s32) = COPY $r0
258     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r0
259
260     %1(s16) = G_TRUNC %0(s32)
261
262     %2(s32) = G_ANYEXT %1(s16)
263
264     $r0 = COPY %2(s32)
265     ; CHECK: $r0 = COPY [[VREG]]
266
267     BX_RET 14, $noreg, implicit $r0
268     ; CHECK: BX_RET 14, $noreg, implicit $r0
269 ...
270 ---
271 name:            test_trunc_s64
272 # CHECK-LABEL: name: test_trunc_s64
273 legalized:       true
274 regBankSelected: true
275 selected:        false
276 # CHECK: selected: true
277 registers:
278   - { id: 0, class: fprb }
279   - { id: 1, class: gprb }
280   - { id: 2, class: gprb }
281 body:             |
282   bb.0:
283     liveins: $r0, $d0
284
285     %0(s64) = COPY $d0
286     ; CHECK: [[VREG:%[0-9]+]]:dpr = COPY $d0
287
288     %2(p0) = COPY $r0
289     ; CHECK: [[PTR:%[0-9]+]]:gpr = COPY $r0
290
291     %1(s32) = G_TRUNC %0(s64)
292     ; CHECK: [[VREGTRUNC:%[0-9]+]]:gpr, [[UNINTERESTING:%[0-9]+]]:gpr = VMOVRRD [[VREG]]
293
294     G_STORE %1(s32), %2 :: (store 4)
295     ; CHECK: STRi12 [[VREGTRUNC]], [[PTR]], 0, 14, $noreg
296
297     BX_RET 14, $noreg
298     ; CHECK: BX_RET 14, $noreg
299 ...
300 ---
301 name:            test_add_s32
302 # CHECK-LABEL: name: test_add_s32
303 legalized:       true
304 regBankSelected: true
305 selected:        false
306 # CHECK: selected: true
307 registers:
308   - { id: 0, class: gprb }
309   - { id: 1, class: gprb }
310   - { id: 2, class: gprb }
311 body:             |
312   bb.0:
313     liveins: $r0, $r1
314
315     %0(s32) = COPY $r0
316     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
317
318     %1(s32) = COPY $r1
319     ; CHECK: [[VREGY:%[0-9]+]]:gpr = COPY $r1
320
321     %2(s32) = G_ADD %0, %1
322     ; CHECK: [[VREGSUM:%[0-9]+]]:gpr = ADDrr [[VREGX]], [[VREGY]], 14, $noreg, $noreg
323
324     $r0 = COPY %2(s32)
325     ; CHECK: $r0 = COPY [[VREGSUM]]
326
327     BX_RET 14, $noreg, implicit $r0
328     ; CHECK: BX_RET 14, $noreg, implicit $r0
329 ...
330 ---
331 name:            test_add_fold_imm_s32
332 # CHECK-LABEL: name: test_add_fold_imm_s32
333 legalized:       true
334 regBankSelected: true
335 selected:        false
336 # CHECK: selected: true
337 registers:
338   - { id: 0, class: gprb }
339   - { id: 1, class: gprb }
340   - { id: 2, class: gprb }
341 body:             |
342   bb.0:
343     liveins: $r0
344
345     %0(s32) = COPY $r0
346     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
347
348     %1(s32) = G_CONSTANT i32 255
349     %2(s32) = G_ADD %0, %1
350     ; CHECK: [[VREGSUM:%[0-9]+]]:gpr = ADDri [[VREGX]], 255, 14, $noreg, $noreg
351
352     $r0 = COPY %2(s32)
353     ; CHECK: $r0 = COPY [[VREGSUM]]
354
355     BX_RET 14, $noreg, implicit $r0
356     ; CHECK: BX_RET 14, $noreg, implicit $r0
357 ...
358 ---
359 name:            test_add_no_fold_imm_s32
360 # CHECK-LABEL: name: test_add_no_fold_imm_s32
361 legalized:       true
362 regBankSelected: true
363 selected:        false
364 # CHECK: selected: true
365 registers:
366   - { id: 0, class: gprb }
367   - { id: 1, class: gprb }
368   - { id: 2, class: gprb }
369 body:             |
370   bb.0:
371     liveins: $r0
372
373     %0(s32) = COPY $r0
374     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
375
376     %1(s32) = G_CONSTANT i32 65535
377     ; CHECK: [[VREGY:%[0-9]+]]:gpr = MOVi16 65535, 14, $noreg
378
379     %2(s32) = G_ADD %0, %1
380     ; CHECK: [[VREGSUM:%[0-9]+]]:gpr = ADDrr [[VREGX]], [[VREGY]], 14, $noreg, $noreg
381
382     $r0 = COPY %2(s32)
383     ; CHECK: $r0 = COPY [[VREGSUM]]
384
385     BX_RET 14, $noreg, implicit $r0
386     ; CHECK: BX_RET 14, $noreg, implicit $r0
387 ...
388 ---
389 name:            test_fadd_s32
390 # CHECK-LABEL: name: test_fadd_s32
391 legalized:       true
392 regBankSelected: true
393 selected:        false
394 # CHECK: selected: true
395 registers:
396   - { id: 0, class: fprb }
397   - { id: 1, class: fprb }
398   - { id: 2, class: fprb }
399 body:             |
400   bb.0:
401     liveins: $s0, $s1
402
403     %0(s32) = COPY $s0
404     ; CHECK: [[VREGX:%[0-9]+]]:spr = COPY $s0
405
406     %1(s32) = COPY $s1
407     ; CHECK: [[VREGY:%[0-9]+]]:spr = COPY $s1
408
409     %2(s32) = G_FADD %0, %1
410     ; CHECK: [[VREGSUM:%[0-9]+]]:spr = VADDS [[VREGX]], [[VREGY]], 14, $noreg
411
412     $s0 = COPY %2(s32)
413     ; CHECK: $s0 = COPY [[VREGSUM]]
414
415     BX_RET 14, $noreg, implicit $s0
416     ; CHECK: BX_RET 14, $noreg, implicit $s0
417 ...
418 ---
419 name:            test_fadd_s64
420 # CHECK-LABEL: name: test_fadd_s64
421 legalized:       true
422 regBankSelected: true
423 selected:        false
424 # CHECK: selected: true
425 registers:
426   - { id: 0, class: fprb }
427   - { id: 1, class: fprb }
428   - { id: 2, class: fprb }
429 body:             |
430   bb.0:
431     liveins: $d0, $d1
432
433     %0(s64) = COPY $d0
434     ; CHECK: [[VREGX:%[0-9]+]]:dpr = COPY $d0
435
436     %1(s64) = COPY $d1
437     ; CHECK: [[VREGY:%[0-9]+]]:dpr = COPY $d1
438
439     %2(s64) = G_FADD %0, %1
440     ; CHECK: [[VREGSUM:%[0-9]+]]:dpr = VADDD [[VREGX]], [[VREGY]], 14, $noreg
441
442     $d0 = COPY %2(s64)
443     ; CHECK: $d0 = COPY [[VREGSUM]]
444
445     BX_RET 14, $noreg, implicit $d0
446     ; CHECK: BX_RET 14, $noreg, implicit $d0
447 ...
448 ---
449 name:            test_fsub_s32
450 # CHECK-LABEL: name: test_fsub_s32
451 legalized:       true
452 regBankSelected: true
453 selected:        false
454 # CHECK: selected: true
455 registers:
456   - { id: 0, class: fprb }
457   - { id: 1, class: fprb }
458   - { id: 2, class: fprb }
459 body:             |
460   bb.0:
461     liveins: $s0, $s1
462
463     %0(s32) = COPY $s0
464     ; CHECK: [[VREGX:%[0-9]+]]:spr = COPY $s0
465
466     %1(s32) = COPY $s1
467     ; CHECK: [[VREGY:%[0-9]+]]:spr = COPY $s1
468
469     %2(s32) = G_FSUB %0, %1
470     ; CHECK: [[VREGSUM:%[0-9]+]]:spr = VSUBS [[VREGX]], [[VREGY]], 14, $noreg
471
472     $s0 = COPY %2(s32)
473     ; CHECK: $s0 = COPY [[VREGSUM]]
474
475     BX_RET 14, $noreg, implicit $s0
476     ; CHECK: BX_RET 14, $noreg, implicit $s0
477 ...
478 ---
479 name:            test_fsub_s64
480 # CHECK-LABEL: name: test_fsub_s64
481 legalized:       true
482 regBankSelected: true
483 selected:        false
484 # CHECK: selected: true
485 registers:
486   - { id: 0, class: fprb }
487   - { id: 1, class: fprb }
488   - { id: 2, class: fprb }
489 body:             |
490   bb.0:
491     liveins: $d0, $d1
492
493     %0(s64) = COPY $d0
494     ; CHECK: [[VREGX:%[0-9]+]]:dpr = COPY $d0
495
496     %1(s64) = COPY $d1
497     ; CHECK: [[VREGY:%[0-9]+]]:dpr = COPY $d1
498
499     %2(s64) = G_FSUB %0, %1
500     ; CHECK: [[VREGSUM:%[0-9]+]]:dpr = VSUBD [[VREGX]], [[VREGY]], 14, $noreg
501
502     $d0 = COPY %2(s64)
503     ; CHECK: $d0 = COPY [[VREGSUM]]
504
505     BX_RET 14, $noreg, implicit $d0
506     ; CHECK: BX_RET 14, $noreg, implicit $d0
507 ...
508 ---
509 name:            test_fmul_s32
510 # CHECK-LABEL: name: test_fmul_s32
511 legalized:       true
512 regBankSelected: true
513 selected:        false
514 # CHECK: selected: true
515 registers:
516   - { id: 0, class: fprb }
517   - { id: 1, class: fprb }
518   - { id: 2, class: fprb }
519 body:             |
520   bb.0:
521     liveins: $s0, $s1
522
523     %0(s32) = COPY $s0
524     ; CHECK: [[VREGX:%[0-9]+]]:spr = COPY $s0
525
526     %1(s32) = COPY $s1
527     ; CHECK: [[VREGY:%[0-9]+]]:spr = COPY $s1
528
529     %2(s32) = G_FMUL %0, %1
530     ; CHECK: [[VREGSUM:%[0-9]+]]:spr = VMULS [[VREGX]], [[VREGY]], 14, $noreg
531
532     $s0 = COPY %2(s32)
533     ; CHECK: $s0 = COPY [[VREGSUM]]
534
535     BX_RET 14, $noreg, implicit $s0
536     ; CHECK: BX_RET 14, $noreg, implicit $s0
537 ...
538 ---
539 name:            test_fmul_s64
540 # CHECK-LABEL: name: test_fmul_s64
541 legalized:       true
542 regBankSelected: true
543 selected:        false
544 # CHECK: selected: true
545 registers:
546   - { id: 0, class: fprb }
547   - { id: 1, class: fprb }
548   - { id: 2, class: fprb }
549 body:             |
550   bb.0:
551     liveins: $d0, $d1
552
553     %0(s64) = COPY $d0
554     ; CHECK: [[VREGX:%[0-9]+]]:dpr = COPY $d0
555
556     %1(s64) = COPY $d1
557     ; CHECK: [[VREGY:%[0-9]+]]:dpr = COPY $d1
558
559     %2(s64) = G_FMUL %0, %1
560     ; CHECK: [[VREGSUM:%[0-9]+]]:dpr = VMULD [[VREGX]], [[VREGY]], 14, $noreg
561
562     $d0 = COPY %2(s64)
563     ; CHECK: $d0 = COPY [[VREGSUM]]
564
565     BX_RET 14, $noreg, implicit $d0
566     ; CHECK: BX_RET 14, $noreg, implicit $d0
567 ...
568 ---
569 name:            test_fdiv_s32
570 # CHECK-LABEL: name: test_fdiv_s32
571 legalized:       true
572 regBankSelected: true
573 selected:        false
574 # CHECK: selected: true
575 registers:
576   - { id: 0, class: fprb }
577   - { id: 1, class: fprb }
578   - { id: 2, class: fprb }
579 body:             |
580   bb.0:
581     liveins: $s0, $s1
582
583     %0(s32) = COPY $s0
584     ; CHECK: [[VREGX:%[0-9]+]]:spr = COPY $s0
585
586     %1(s32) = COPY $s1
587     ; CHECK: [[VREGY:%[0-9]+]]:spr = COPY $s1
588
589     %2(s32) = G_FDIV %0, %1
590     ; CHECK: [[VREGSUM:%[0-9]+]]:spr = VDIVS [[VREGX]], [[VREGY]], 14, $noreg
591
592     $s0 = COPY %2(s32)
593     ; CHECK: $s0 = COPY [[VREGSUM]]
594
595     BX_RET 14, $noreg, implicit $s0
596     ; CHECK: BX_RET 14, $noreg, implicit $s0
597 ...
598 ---
599 name:            test_fdiv_s64
600 # CHECK-LABEL: name: test_fdiv_s64
601 legalized:       true
602 regBankSelected: true
603 selected:        false
604 # CHECK: selected: true
605 registers:
606   - { id: 0, class: fprb }
607   - { id: 1, class: fprb }
608   - { id: 2, class: fprb }
609 body:             |
610   bb.0:
611     liveins: $d0, $d1
612
613     %0(s64) = COPY $d0
614     ; CHECK: [[VREGX:%[0-9]+]]:dpr = COPY $d0
615
616     %1(s64) = COPY $d1
617     ; CHECK: [[VREGY:%[0-9]+]]:dpr = COPY $d1
618
619     %2(s64) = G_FDIV %0, %1
620     ; CHECK: [[VREGSUM:%[0-9]+]]:dpr = VDIVD [[VREGX]], [[VREGY]], 14, $noreg
621
622     $d0 = COPY %2(s64)
623     ; CHECK: $d0 = COPY [[VREGSUM]]
624
625     BX_RET 14, $noreg, implicit $d0
626     ; CHECK: BX_RET 14, $noreg, implicit $d0
627 ...
628 ---
629 name:            test_fneg_s32
630 # CHECK-LABEL: name: test_fneg_s32
631 legalized:       true
632 regBankSelected: true
633 selected:        false
634 # CHECK: selected: true
635 registers:
636   - { id: 0, class: fprb }
637   - { id: 1, class: fprb }
638 body:             |
639   bb.0:
640     liveins: $s0
641
642     %0(s32) = COPY $s0
643     ; CHECK: [[VREGX:%[0-9]+]]:spr = COPY $s0
644
645     %1(s32) = G_FNEG %0
646     ; CHECK: [[VREGSUM:%[0-9]+]]:spr = VNEGS [[VREGX]], 14, $noreg
647
648     $s0 = COPY %1(s32)
649     ; CHECK: $s0 = COPY [[VREGSUM]]
650
651     BX_RET 14, $noreg, implicit $s0
652     ; CHECK: BX_RET 14, $noreg, implicit $s0
653 ...
654 ---
655 name:            test_fneg_s64
656 # CHECK-LABEL: name: test_fneg_s64
657 legalized:       true
658 regBankSelected: true
659 selected:        false
660 # CHECK: selected: true
661 registers:
662   - { id: 0, class: fprb }
663   - { id: 1, class: fprb }
664   - { id: 2, class: fprb }
665 body:             |
666   bb.0:
667     liveins: $d0
668
669     %0(s64) = COPY $d0
670     ; CHECK: [[VREGX:%[0-9]+]]:dpr = COPY $d0
671
672     %1(s64) = G_FNEG %0
673     ; CHECK: [[VREGSUM:%[0-9]+]]:dpr = VNEGD [[VREGX]], 14, $noreg
674
675     $d0 = COPY %1(s64)
676     ; CHECK: $d0 = COPY [[VREGSUM]]
677
678     BX_RET 14, $noreg, implicit $d0
679     ; CHECK: BX_RET 14, $noreg, implicit $d0
680 ...
681 ---
682 name:            test_fma_s32
683 # CHECK-LABEL: name: test_fma_s32
684 legalized:       true
685 regBankSelected: true
686 selected:        false
687 # CHECK: selected: true
688 registers:
689   - { id: 0, class: fprb }
690   - { id: 1, class: fprb }
691   - { id: 2, class: fprb }
692   - { id: 3, class: fprb }
693 body:             |
694   bb.0:
695     liveins: $s0, $s1, $s2
696
697     %0(s32) = COPY $s0
698     ; CHECK: [[VREGX:%[0-9]+]]:spr = COPY $s0
699
700     %1(s32) = COPY $s1
701     ; CHECK: [[VREGY:%[0-9]+]]:spr = COPY $s1
702
703     %2(s32) = COPY $s2
704     ; CHECK: [[VREGZ:%[0-9]+]]:spr = COPY $s2
705
706     %3(s32) = G_FMA %0, %1, %2
707     ; CHECK: [[VREGR:%[0-9]+]]:spr = VFMAS [[VREGZ]], [[VREGX]], [[VREGY]], 14, $noreg
708
709     $s0 = COPY %3(s32)
710     ; CHECK: $s0 = COPY [[VREGR]]
711
712     BX_RET 14, $noreg, implicit $s0
713     ; CHECK: BX_RET 14, $noreg, implicit $s0
714 ...
715 ---
716 name:            test_fma_s64
717 # CHECK-LABEL: name: test_fma_s64
718 legalized:       true
719 regBankSelected: true
720 selected:        false
721 # CHECK: selected: true
722 registers:
723   - { id: 0, class: fprb }
724   - { id: 1, class: fprb }
725   - { id: 2, class: fprb }
726   - { id: 3, class: fprb }
727 body:             |
728   bb.0:
729     liveins: $d0, $d1, $d2
730
731     %0(s64) = COPY $d0
732     ; CHECK: [[VREGX:%[0-9]+]]:dpr = COPY $d0
733
734     %1(s64) = COPY $d1
735     ; CHECK: [[VREGY:%[0-9]+]]:dpr = COPY $d1
736
737     %2(s64) = COPY $d2
738     ; CHECK: [[VREGZ:%[0-9]+]]:dpr = COPY $d2
739
740     %3(s64) = G_FMA %0, %1, %2
741     ; CHECK: [[VREGR:%[0-9]+]]:dpr = VFMAD [[VREGZ]], [[VREGX]], [[VREGY]], 14, $noreg
742
743     $d0 = COPY %3(s64)
744     ; CHECK: $d0 = COPY [[VREGR]]
745
746     BX_RET 14, $noreg, implicit $d0
747     ; CHECK: BX_RET 14, $noreg, implicit $d0
748 ...
749 ---
750 name:            test_fpext_s32_to_s64
751 # CHECK-LABEL: name: test_fpext_s32_to_s64
752 legalized:       true
753 regBankSelected: true
754 selected:        false
755 # CHECK: selected: true
756 registers:
757   - { id: 0, class: fprb }
758   - { id: 1, class: fprb }
759 body:             |
760   bb.0:
761     liveins: $s0
762
763     %0(s32) = COPY $s0
764     ; CHECK: [[VREGX:%[0-9]+]]:spr = COPY $s0
765
766     %1(s64) = G_FPEXT %0(s32)
767     ; CHECK: [[VREGR:%[0-9]+]]:dpr = VCVTDS [[VREGX]], 14, $noreg
768
769     $d0 = COPY %1(s64)
770     ; CHECK: $d0 = COPY [[VREGR]]
771
772     BX_RET 14, $noreg, implicit $d0
773     ; CHECK: BX_RET 14, $noreg, implicit $d0
774 ...
775 ---
776 name:            test_fptrunc_s64_to_s32
777 # CHECK-LABEL: name: test_fptrunc_s64_to_s32
778 legalized:       true
779 regBankSelected: true
780 selected:        false
781 # CHECK: selected: true
782 registers:
783   - { id: 0, class: fprb }
784   - { id: 1, class: fprb }
785 body:             |
786   bb.0:
787     liveins: $d0
788
789     %0(s64) = COPY $d0
790     ; CHECK: [[VREGX:%[0-9]+]]:dpr = COPY $d0
791
792     %1(s32) = G_FPTRUNC %0(s64)
793     ; CHECK: [[VREGR:%[0-9]+]]:spr = VCVTSD [[VREGX]], 14, $noreg
794
795     $s0 = COPY %1(s32)
796     ; CHECK: $s0 = COPY [[VREGR]]
797
798     BX_RET 14, $noreg, implicit $s0
799     ; CHECK: BX_RET 14, $noreg, implicit $s0
800 ...
801 ---
802 name:            test_fptosi_s32
803 # CHECK-LABEL: name: test_fptosi_s32
804 legalized:       true
805 regBankSelected: true
806 selected:        false
807 # CHECK: selected: true
808 registers:
809   - { id: 0, class: fprb }
810   - { id: 1, class: gprb }
811 body:             |
812   bb.0:
813     liveins: $s0
814
815     %0(s32) = COPY $s0
816     ; CHECK: [[VREGX:%[0-9]+]]:spr = COPY $s0
817
818     %1(s32) = G_FPTOSI %0(s32)
819     ; CHECK: [[VREGI:%[0-9]+]]:spr = VTOSIZS [[VREGX]], 14, $noreg
820     ; CHECK: [[VREGR:%[0-9]+]]:gpr = COPY [[VREGI]]
821
822     $r0 = COPY %1(s32)
823     ; CHECK: $r0 = COPY [[VREGR]]
824
825     BX_RET 14, $noreg, implicit $r0
826     ; CHECK: BX_RET 14, $noreg, implicit $r0
827 ...
828 ---
829 name:            test_fptosi_s64
830 # CHECK-LABEL: name: test_fptosi_s64
831 legalized:       true
832 regBankSelected: true
833 selected:        false
834 # CHECK: selected: true
835 registers:
836   - { id: 0, class: fprb }
837   - { id: 1, class: gprb }
838 body:             |
839   bb.0:
840     liveins: $d0
841
842     %0(s64) = COPY $d0
843     ; CHECK: [[VREGX:%[0-9]+]]:dpr = COPY $d0
844
845     %1(s32) = G_FPTOSI %0(s64)
846     ; CHECK: [[VREGI:%[0-9]+]]:spr = VTOSIZD [[VREGX]], 14, $noreg
847     ; CHECK: [[VREGR:%[0-9]+]]:gpr = COPY [[VREGI]]
848
849     $r0 = COPY %1(s32)
850     ; CHECK: $r0 = COPY [[VREGR]]
851
852     BX_RET 14, $noreg, implicit $r0
853     ; CHECK: BX_RET 14, $noreg, implicit $r0
854 ...
855 ---
856 name:            test_fptoui_s32
857 # CHECK-LABEL: name: test_fptoui_s32
858 legalized:       true
859 regBankSelected: true
860 selected:        false
861 # CHECK: selected: true
862 registers:
863   - { id: 0, class: fprb }
864   - { id: 1, class: gprb }
865 body:             |
866   bb.0:
867     liveins: $s0
868
869     %0(s32) = COPY $s0
870     ; CHECK: [[VREGX:%[0-9]+]]:spr = COPY $s0
871
872     %1(s32) = G_FPTOUI %0(s32)
873     ; CHECK: [[VREGI:%[0-9]+]]:spr = VTOUIZS [[VREGX]], 14, $noreg
874     ; CHECK: [[VREGR:%[0-9]+]]:gpr = COPY [[VREGI]]
875
876     $r0 = COPY %1(s32)
877     ; CHECK: $r0 = COPY [[VREGR]]
878
879     BX_RET 14, $noreg, implicit $r0
880     ; CHECK: BX_RET 14, $noreg, implicit $r0
881 ...
882 ---
883 name:            test_fptoui_s64
884 # CHECK-LABEL: name: test_fptoui_s64
885 legalized:       true
886 regBankSelected: true
887 selected:        false
888 # CHECK: selected: true
889 registers:
890   - { id: 0, class: fprb }
891   - { id: 1, class: gprb }
892 body:             |
893   bb.0:
894     liveins: $d0
895
896     %0(s64) = COPY $d0
897     ; CHECK: [[VREGX:%[0-9]+]]:dpr = COPY $d0
898
899     %1(s32) = G_FPTOUI %0(s64)
900     ; CHECK: [[VREGI:%[0-9]+]]:spr = VTOUIZD [[VREGX]], 14, $noreg
901     ; CHECK: [[VREGR:%[0-9]+]]:gpr = COPY [[VREGI]]
902
903     $r0 = COPY %1(s32)
904     ; CHECK: $r0 = COPY [[VREGR]]
905
906     BX_RET 14, $noreg, implicit $r0
907     ; CHECK: BX_RET 14, $noreg, implicit $r0
908 ...
909 ---
910 name:            test_sitofp_s32
911 # CHECK-LABEL: name: test_sitofp_s32
912 legalized:       true
913 regBankSelected: true
914 selected:        false
915 # CHECK: selected: true
916 registers:
917   - { id: 0, class: gprb }
918   - { id: 1, class: fprb }
919 body:             |
920   bb.0:
921     liveins: $r0
922
923     %0(s32) = COPY $r0
924     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
925
926     %1(s32) = G_SITOFP %0(s32)
927     ; CHECK: [[VREGF:%[0-9]+]]:spr = COPY [[VREGX]]
928     ; CHECK: [[VREGR:%[0-9]+]]:spr = VSITOS [[VREGF]], 14, $noreg
929
930     $s0 = COPY %1(s32)
931     ; CHECK: $s0 = COPY [[VREGR]]
932
933     BX_RET 14, $noreg, implicit $s0
934     ; CHECK: BX_RET 14, $noreg, implicit $s0
935 ...
936 ---
937 name:            test_sitofp_s64
938 # CHECK-LABEL: name: test_sitofp_s64
939 legalized:       true
940 regBankSelected: true
941 selected:        false
942 # CHECK: selected: true
943 registers:
944   - { id: 0, class: gprb }
945   - { id: 1, class: fprb }
946 body:             |
947   bb.0:
948     liveins: $r0
949
950     %0(s32) = COPY $r0
951     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
952
953     %1(s64) = G_SITOFP %0(s32)
954     ; CHECK: [[VREGF:%[0-9]+]]:spr = COPY [[VREGX]]
955     ; CHECK: [[VREGR:%[0-9]+]]:dpr = VSITOD [[VREGF]], 14, $noreg
956
957     $d0 = COPY %1(s64)
958     ; CHECK: $d0 = COPY [[VREGR]]
959
960     BX_RET 14, $noreg, implicit $d0
961     ; CHECK: BX_RET 14, $noreg, implicit $d0
962 ...
963 ---
964 name:            test_uitofp_s32
965 # CHECK-LABEL: name: test_uitofp_s32
966 legalized:       true
967 regBankSelected: true
968 selected:        false
969 # CHECK: selected: true
970 registers:
971   - { id: 0, class: gprb }
972   - { id: 1, class: fprb }
973 body:             |
974   bb.0:
975     liveins: $r0
976
977     %0(s32) = COPY $r0
978     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
979
980     %1(s32) = G_UITOFP %0(s32)
981     ; CHECK: [[VREGF:%[0-9]+]]:spr = COPY [[VREGX]]
982     ; CHECK: [[VREGR:%[0-9]+]]:spr = VUITOS [[VREGF]], 14, $noreg
983
984     $s0 = COPY %1(s32)
985     ; CHECK: $s0 = COPY [[VREGR]]
986
987     BX_RET 14, $noreg, implicit $s0
988     ; CHECK: BX_RET 14, $noreg, implicit $s0
989 ...
990 ---
991 name:            test_uitofp_s64
992 # CHECK-LABEL: name: test_uitofp_s64
993 legalized:       true
994 regBankSelected: true
995 selected:        false
996 # CHECK: selected: true
997 registers:
998   - { id: 0, class: gprb }
999   - { id: 1, class: fprb }
1000 body:             |
1001   bb.0:
1002     liveins: $r0
1003
1004     %0(s32) = COPY $r0
1005     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
1006
1007     %1(s64) = G_UITOFP %0(s32)
1008     ; CHECK: [[VREGF:%[0-9]+]]:spr = COPY [[VREGX]]
1009     ; CHECK: [[VREGR:%[0-9]+]]:dpr = VUITOD [[VREGF]], 14, $noreg
1010
1011     $d0 = COPY %1(s64)
1012     ; CHECK: $d0 = COPY [[VREGR]]
1013
1014     BX_RET 14, $noreg, implicit $d0
1015     ; CHECK: BX_RET 14, $noreg, implicit $d0
1016 ...
1017 ---
1018 name:            test_sub_s32
1019 # CHECK-LABEL: name: test_sub_s32
1020 legalized:       true
1021 regBankSelected: true
1022 selected:        false
1023 # CHECK: selected: true
1024 registers:
1025   - { id: 0, class: gprb }
1026   - { id: 1, class: gprb }
1027   - { id: 2, class: gprb }
1028 body:             |
1029   bb.0:
1030     liveins: $r0, $r1
1031
1032     %0(s32) = COPY $r0
1033     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
1034
1035     %1(s32) = COPY $r1
1036     ; CHECK: [[VREGY:%[0-9]+]]:gpr = COPY $r1
1037
1038     %2(s32) = G_SUB %0, %1
1039     ; CHECK: [[VREGRES:%[0-9]+]]:gpr = SUBrr [[VREGX]], [[VREGY]], 14, $noreg, $noreg
1040
1041     $r0 = COPY %2(s32)
1042     ; CHECK: $r0 = COPY [[VREGRES]]
1043
1044     BX_RET 14, $noreg, implicit $r0
1045     ; CHECK: BX_RET 14, $noreg, implicit $r0
1046 ...
1047 ---
1048 name:            test_sub_imm_s32
1049 # CHECK-LABEL: name: test_sub_imm_s32
1050 legalized:       true
1051 regBankSelected: true
1052 selected:        false
1053 # CHECK: selected: true
1054 registers:
1055   - { id: 0, class: gprb }
1056   - { id: 1, class: gprb }
1057   - { id: 2, class: gprb }
1058 body:             |
1059   bb.0:
1060     liveins: $r0, $r1
1061
1062     %0(s32) = COPY $r0
1063     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
1064
1065     %1(s32) = G_CONSTANT i32 17
1066     %2(s32) = G_SUB %0, %1
1067     ; CHECK: [[VREGRES:%[0-9]+]]:gpr = SUBri [[VREGX]], 17, 14, $noreg, $noreg
1068
1069     $r0 = COPY %2(s32)
1070     ; CHECK: $r0 = COPY [[VREGRES]]
1071
1072     BX_RET 14, $noreg, implicit $r0
1073     ; CHECK: BX_RET 14, $noreg, implicit $r0
1074 ...
1075 ---
1076 name:            test_sub_rev_imm_s32
1077 # CHECK-LABEL: name: test_sub_rev_imm_s32
1078 legalized:       true
1079 regBankSelected: true
1080 selected:        false
1081 # CHECK: selected: true
1082 registers:
1083   - { id: 0, class: gprb }
1084   - { id: 1, class: gprb }
1085   - { id: 2, class: gprb }
1086 body:             |
1087   bb.0:
1088     liveins: $r0, $r1
1089
1090     %0(s32) = COPY $r0
1091     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
1092
1093     %1(s32) = G_CONSTANT i32 17
1094     %2(s32) = G_SUB %1, %0
1095     ; CHECK: [[VREGRES:%[0-9]+]]:gpr = RSBri [[VREGX]], 17, 14, $noreg, $noreg
1096
1097     $r0 = COPY %2(s32)
1098     ; CHECK: $r0 = COPY [[VREGRES]]
1099
1100     BX_RET 14, $noreg, implicit $r0
1101     ; CHECK: BX_RET 14, $noreg, implicit $r0
1102 ...
1103 ---
1104 name:            test_mul_s32
1105 # CHECK-LABEL: name: test_mul_s32
1106 legalized:       true
1107 regBankSelected: true
1108 selected:        false
1109 # CHECK: selected: true
1110 registers:
1111   - { id: 0, class: gprb }
1112   - { id: 1, class: gprb }
1113   - { id: 2, class: gprb }
1114 body:             |
1115   bb.0:
1116     liveins: $r0, $r1
1117
1118     %0(s32) = COPY $r0
1119     ; CHECK: [[VREGX:%[0-9]+]]:gprnopc = COPY $r0
1120
1121     %1(s32) = COPY $r1
1122     ; CHECK: [[VREGY:%[0-9]+]]:gprnopc = COPY $r1
1123
1124     %2(s32) = G_MUL %0, %1
1125     ; CHECK: [[VREGRES:%[0-9]+]]:gprnopc = MUL [[VREGX]], [[VREGY]], 14, $noreg, $noreg
1126
1127     $r0 = COPY %2(s32)
1128     ; CHECK: $r0 = COPY [[VREGRES]]
1129
1130     BX_RET 14, $noreg, implicit $r0
1131     ; CHECK: BX_RET 14, $noreg, implicit $r0
1132 ...
1133 ---
1134 name:            test_mulv5_s32
1135 # CHECK-LABEL: name: test_mulv5_s32
1136 legalized:       true
1137 regBankSelected: true
1138 selected:        false
1139 # CHECK: selected: true
1140 registers:
1141   - { id: 0, class: gprb }
1142   - { id: 1, class: gprb }
1143   - { id: 2, class: gprb }
1144 body:             |
1145   bb.0:
1146     liveins: $r0, $r1
1147
1148     %0(s32) = COPY $r0
1149     ; CHECK: [[VREGX:%[0-9]+]]:gprnopc = COPY $r0
1150
1151     %1(s32) = COPY $r1
1152     ; CHECK: [[VREGY:%[0-9]+]]:gprnopc = COPY $r1
1153
1154     %2(s32) = G_MUL %0, %1
1155     ; CHECK: early-clobber [[VREGRES:%[0-9]+]]:gprnopc = MULv5 [[VREGX]], [[VREGY]], 14, $noreg, $noreg
1156
1157     $r0 = COPY %2(s32)
1158     ; CHECK: $r0 = COPY [[VREGRES]]
1159
1160     BX_RET 14, $noreg, implicit $r0
1161     ; CHECK: BX_RET 14, $noreg, implicit $r0
1162 ...
1163 ---
1164 name:            test_sdiv_s32
1165 # CHECK-LABEL: name: test_sdiv_s32
1166 legalized:       true
1167 regBankSelected: true
1168 selected:        false
1169 # CHECK: selected: true
1170 registers:
1171   - { id: 0, class: gprb }
1172   - { id: 1, class: gprb }
1173   - { id: 2, class: gprb }
1174 body:             |
1175   bb.0:
1176     liveins: $r0, $r1
1177
1178     %0(s32) = COPY $r0
1179     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
1180
1181     %1(s32) = COPY $r1
1182     ; CHECK: [[VREGY:%[0-9]+]]:gpr = COPY $r1
1183
1184     %2(s32) = G_SDIV %0, %1
1185     ; CHECK: [[VREGRES:%[0-9]+]]:gpr = SDIV [[VREGX]], [[VREGY]], 14, $noreg
1186
1187     $r0 = COPY %2(s32)
1188     ; CHECK: $r0 = COPY [[VREGRES]]
1189
1190     BX_RET 14, $noreg, implicit $r0
1191     ; CHECK: BX_RET 14, $noreg, implicit $r0
1192 ...
1193 ---
1194 name:            test_udiv_s32
1195 # CHECK-LABEL: name: test_udiv_s32
1196 legalized:       true
1197 regBankSelected: true
1198 selected:        false
1199 # CHECK: selected: true
1200 registers:
1201   - { id: 0, class: gprb }
1202   - { id: 1, class: gprb }
1203   - { id: 2, class: gprb }
1204 body:             |
1205   bb.0:
1206     liveins: $r0, $r1
1207
1208     %0(s32) = COPY $r0
1209     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
1210
1211     %1(s32) = COPY $r1
1212     ; CHECK: [[VREGY:%[0-9]+]]:gpr = COPY $r1
1213
1214     %2(s32) = G_UDIV %0, %1
1215     ; CHECK: [[VREGRES:%[0-9]+]]:gpr = UDIV [[VREGX]], [[VREGY]], 14, $noreg
1216
1217     $r0 = COPY %2(s32)
1218     ; CHECK: $r0 = COPY [[VREGRES]]
1219
1220     BX_RET 14, $noreg, implicit $r0
1221     ; CHECK: BX_RET 14, $noreg, implicit $r0
1222 ...
1223 ---
1224 name:            test_lshr_s32
1225 # CHECK-LABEL: name: test_lshr_s32
1226 legalized:       true
1227 regBankSelected: true
1228 selected:        false
1229 # CHECK: selected: true
1230 registers:
1231   - { id: 0, class: gprb }
1232   - { id: 1, class: gprb }
1233   - { id: 2, class: gprb }
1234 body:             |
1235   bb.0:
1236     liveins: $r0, $r1
1237
1238     %0(s32) = COPY $r0
1239     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
1240
1241     %1(s32) = COPY $r1
1242     ; CHECK: [[VREGY:%[0-9]+]]:gpr = COPY $r1
1243
1244     %2(s32) = G_LSHR %0, %1
1245     ; CHECK: [[VREGRES:%[0-9]+]]:gprnopc = MOVsr [[VREGX]], [[VREGY]], 3, 14, $noreg, $noreg
1246
1247     $r0 = COPY %2(s32)
1248     ; CHECK: $r0 = COPY [[VREGRES]]
1249
1250     BX_RET 14, $noreg, implicit $r0
1251     ; CHECK: BX_RET 14, $noreg, implicit $r0
1252 ...
1253 ---
1254 name:            test_ashr_s32
1255 # CHECK-LABEL: name: test_ashr_s32
1256 legalized:       true
1257 regBankSelected: true
1258 selected:        false
1259 # CHECK: selected: true
1260 registers:
1261   - { id: 0, class: gprb }
1262   - { id: 1, class: gprb }
1263   - { id: 2, class: gprb }
1264 body:             |
1265   bb.0:
1266     liveins: $r0, $r1
1267
1268     %0(s32) = COPY $r0
1269     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
1270
1271     %1(s32) = COPY $r1
1272     ; CHECK: [[VREGY:%[0-9]+]]:gpr = COPY $r1
1273
1274     %2(s32) = G_ASHR %0, %1
1275     ; CHECK: [[VREGRES:%[0-9]+]]:gprnopc = MOVsr [[VREGX]], [[VREGY]], 1, 14, $noreg, $noreg
1276
1277     $r0 = COPY %2(s32)
1278     ; CHECK: $r0 = COPY [[VREGRES]]
1279
1280     BX_RET 14, $noreg, implicit $r0
1281     ; CHECK: BX_RET 14, $noreg, implicit $r0
1282 ...
1283 ---
1284 name:            test_shl_s32
1285 # CHECK-LABEL: name: test_shl_s32
1286 legalized:       true
1287 regBankSelected: true
1288 selected:        false
1289 # CHECK: selected: true
1290 registers:
1291   - { id: 0, class: gprb }
1292   - { id: 1, class: gprb }
1293   - { id: 2, class: gprb }
1294 body:             |
1295   bb.0:
1296     liveins: $r0, $r1
1297
1298     %0(s32) = COPY $r0
1299     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
1300
1301     %1(s32) = COPY $r1
1302     ; CHECK: [[VREGY:%[0-9]+]]:gpr = COPY $r1
1303
1304     %2(s32) = G_SHL %0, %1
1305     ; CHECK: [[VREGRES:%[0-9]+]]:gprnopc = MOVsr [[VREGX]], [[VREGY]], 2, 14, $noreg, $noreg
1306
1307     $r0 = COPY %2(s32)
1308     ; CHECK: $r0 = COPY [[VREGRES]]
1309
1310     BX_RET 14, $noreg, implicit $r0
1311     ; CHECK: BX_RET 14, $noreg, implicit $r0
1312 ...
1313 ---
1314 name:            test_load_from_stack
1315 # CHECK-LABEL: name: test_load_from_stack
1316 legalized:       true
1317 regBankSelected: true
1318 selected:        false
1319 # CHECK: selected: true
1320 registers:
1321   - { id: 0, class: gprb }
1322   - { id: 1, class: gprb }
1323   - { id: 2, class: gprb }
1324   - { id: 3, class: gprb }
1325   - { id: 4, class: gprb }
1326 fixedStack:
1327   - { id: 0, offset: 0, size: 1, alignment: 4, isImmutable: true, isAliased: false }
1328   - { id: 1, offset: 4, size: 4, alignment: 4, isImmutable: true, isAliased: false }
1329   - { id: 2, offset: 8, size: 4, alignment: 4, isImmutable: true, isAliased: false }
1330 # CHECK-DAG: id: [[FI1:[0-9]+]], type: default, offset: 0, size: 1
1331 # CHECK-DAG: id: [[FI32:[0-9]+]], type: default, offset: 8
1332 body:             |
1333   bb.0:
1334     liveins: $r0, $r1, $r2, $r3
1335
1336     %0(p0) = G_FRAME_INDEX %fixed-stack.2
1337     ; CHECK: [[FI32VREG:%[0-9]+]]:gpr = ADDri %fixed-stack.[[FI32]], 0, 14, $noreg, $noreg
1338
1339     %1(s32) = G_LOAD %0(p0) :: (load 4)
1340     ; CHECK: [[LD32VREG:%[0-9]+]]:gpr = LDRi12 [[FI32VREG]], 0, 14, $noreg
1341
1342     $r0 = COPY %1
1343     ; CHECK: $r0 = COPY [[LD32VREG]]
1344
1345     %2(p0) = G_FRAME_INDEX %fixed-stack.0
1346     ; CHECK: [[FI1VREG:%[0-9]+]]:gpr = ADDri %fixed-stack.[[FI1]], 0, 14, $noreg, $noreg
1347
1348     %3(s1) = G_LOAD %2(p0) :: (load 1)
1349     ; CHECK: [[LD1VREG:%[0-9]+]]:gprnopc = LDRBi12 [[FI1VREG]], 0, 14, $noreg
1350
1351     %4(s32) = G_ANYEXT %3(s1)
1352     ; CHECK: [[RES:%[0-9]+]]:gpr = COPY [[LD1VREG]]
1353
1354     $r0 = COPY %4
1355     ; CHECK: $r0 = COPY [[RES]]
1356
1357     BX_RET 14, $noreg
1358     ; CHECK: BX_RET 14, $noreg
1359 ...
1360 ---
1361 name:            test_load_f32
1362 # CHECK-LABEL: name: test_load_f32
1363 legalized:       true
1364 regBankSelected: true
1365 selected:        false
1366 # CHECK: selected: true
1367 registers:
1368   - { id: 0, class: gprb }
1369   - { id: 1, class: fprb }
1370 body:             |
1371   bb.0:
1372     liveins: $r0
1373
1374     %0(p0) = COPY $r0
1375     ; CHECK: %[[P:[0-9]+]]:gpr = COPY $r0
1376
1377     %1(s32) = G_LOAD %0(p0) :: (load 4)
1378     ; CHECK: %[[V:[0-9]+]]:spr = VLDRS %[[P]], 0, 14, $noreg
1379
1380     $s0 = COPY %1
1381     ; CHECK: $s0 = COPY %[[V]]
1382
1383     BX_RET 14, $noreg, implicit $s0
1384     ; CHECK: BX_RET 14, $noreg, implicit $s0
1385 ...
1386 ---
1387 name:            test_load_f64
1388 # CHECK-LABEL: name: test_load_f64
1389 legalized:       true
1390 regBankSelected: true
1391 selected:        false
1392 # CHECK: selected: true
1393 registers:
1394   - { id: 0, class: gprb }
1395   - { id: 1, class: fprb }
1396 body:             |
1397   bb.0:
1398     liveins: $r0
1399
1400     %0(p0) = COPY $r0
1401     ; CHECK: %[[P:[0-9]+]]:gpr = COPY $r0
1402
1403     %1(s64) = G_LOAD %0(p0) :: (load 8)
1404     ; CHECK: %[[V:[0-9]+]]:dpr = VLDRD %[[P]], 0, 14, $noreg
1405
1406     $d0 = COPY %1
1407     ; CHECK: $d0 = COPY %[[V]]
1408
1409     BX_RET 14, $noreg, implicit $d0
1410     ; CHECK: BX_RET 14, $noreg, implicit $d0
1411 ...
1412 ---
1413 name:            test_stores
1414 # CHECK-LABEL: name: test_stores
1415 legalized:       true
1416 regBankSelected: true
1417 selected:        false
1418 # CHECK: selected: true
1419 registers:
1420   - { id: 0, class: gprb }
1421   - { id: 1, class: gprb }
1422   - { id: 2, class: gprb }
1423   - { id: 3, class: gprb }
1424   - { id: 4, class: fprb }
1425   - { id: 5, class: fprb }
1426 # CHECK: id: [[P:[0-9]+]], class: gpr
1427 # CHECK: id: [[I8:[0-9]+]], class: gpr
1428 # CHECK: id: [[I16:[0-9]+]], class: gpr
1429 # CHECK: id: [[I32:[0-9]+]], class: gpr
1430 # CHECK: id: [[F32:[0-9]+]], class: spr
1431 # CHECK: id: [[F64:[0-9]+]], class: dpr
1432 body:             |
1433   bb.0:
1434     liveins: $r0, $r1, $s0, $d0
1435
1436     %0(p0) = COPY $r0
1437     %3(s32) = COPY $r1
1438     %4(s32) = COPY $s0
1439     %5(s64) = COPY $d2
1440     %1(s8) = G_TRUNC %3(s32)
1441     %2(s16) = G_TRUNC %3(s32)
1442
1443     G_STORE %1(s8), %0(p0) :: (store 1)
1444     ; CHECK: STRBi12 %[[I8]], %[[P]], 0, 14, $noreg
1445
1446     G_STORE %2(s16), %0(p0) :: (store 2)
1447     ; CHECK: STRH %[[I32]], %[[P]], $noreg, 0, 14, $noreg
1448
1449     G_STORE %3(s32), %0(p0) :: (store 4)
1450     ; CHECK: STRi12 %[[I32]], %[[P]], 0, 14, $noreg
1451
1452     G_STORE %4(s32), %0(p0) :: (store 4)
1453     ; CHECK: VSTRS %[[F32]], %[[P]], 0, 14, $noreg
1454
1455     G_STORE %5(s64), %0(p0) :: (store 8)
1456     ; CHECK: VSTRD %[[F64]], %[[P]], 0, 14, $noreg
1457
1458     BX_RET 14, $noreg
1459 ...
1460 ---
1461 name:            test_gep
1462 # CHECK-LABEL: name: test_gep
1463 legalized:       true
1464 regBankSelected: true
1465 selected:        false
1466 # CHECK: selected: true
1467 registers:
1468   - { id: 0, class: gprb }
1469   - { id: 1, class: gprb }
1470   - { id: 2, class: gprb }
1471 body:             |
1472   bb.0:
1473     liveins: $r0, $r1
1474
1475     %0(p0) = COPY $r0
1476     ; CHECK: %[[PTR:[0-9]+]]:gpr = COPY $r0
1477
1478     %1(s32) = COPY $r1
1479     ; CHECK: %[[OFF:[0-9]+]]:gpr = COPY $r1
1480
1481     %2(p0) = G_GEP %0, %1(s32)
1482     ; CHECK: %[[GEP:[0-9]+]]:gpr = ADDrr %[[PTR]], %[[OFF]], 14, $noreg, $noreg
1483
1484     $r0 = COPY %2(p0)
1485     BX_RET 14, $noreg, implicit $r0
1486 ...
1487 ---
1488 name:            test_MOVi32imm
1489 # CHECK-LABEL: name: test_MOVi32imm
1490 legalized:       true
1491 regBankSelected: true
1492 selected:        false
1493 # CHECK: selected: true
1494 registers:
1495   - { id: 0, class: gprb }
1496 body:             |
1497   bb.0:
1498     %0(s32) = G_CONSTANT 65537
1499     ; CHECK: %[[C:[0-9]+]]:gpr = MOVi32imm 65537
1500
1501     $r0 = COPY %0(s32)
1502     BX_RET 14, $noreg, implicit $r0
1503 ...
1504 ---
1505 name:            test_constant_imm
1506 # CHECK-LABEL: name: test_constant_imm
1507 legalized:       true
1508 regBankSelected: true
1509 selected:        false
1510 # CHECK: selected: true
1511 registers:
1512   - { id: 0, class: gprb }
1513 body:             |
1514   bb.0:
1515     %0(s32) = G_CONSTANT 42
1516     ; CHECK: %[[C:[0-9]+]]:gpr = MOVi 42, 14, $noreg, $noreg
1517
1518     $r0 = COPY %0(s32)
1519     BX_RET 14, $noreg, implicit $r0
1520 ...
1521 ---
1522 name:            test_constant_cimm
1523 # CHECK-LABEL: name: test_constant_cimm
1524 legalized:       true
1525 regBankSelected: true
1526 selected:        false
1527 # CHECK: selected: true
1528 registers:
1529   - { id: 0, class: gprb }
1530 body:             |
1531   bb.0:
1532     ; Adding a type on G_CONSTANT changes its operand from an Imm into a CImm.
1533     ; We still want to see the same thing in the output though.
1534     %0(s32) = G_CONSTANT i32 42
1535     ; CHECK: %[[C:[0-9]+]]:gpr = MOVi 42, 14, $noreg, $noreg
1536
1537     $r0 = COPY %0(s32)
1538     BX_RET 14, $noreg, implicit $r0
1539 ...
1540 ---
1541 name:            test_pointer_constant_unconstrained
1542 # CHECK-LABEL: name: test_pointer_constant_unconstrained
1543 legalized:       true
1544 regBankSelected: true
1545 selected:        false
1546 # CHECK: selected: true
1547 registers:
1548   - { id: 0, class: gprb }
1549 body:             |
1550   bb.0:
1551     %0(p0) = G_CONSTANT i32 0
1552     ; CHECK: %[[C:[0-9]+]]:gpr = MOVi 0, 14, $noreg, $noreg
1553
1554     ; This leaves %0 unconstrained before the G_CONSTANT is selected.
1555     $r0 = COPY %0(p0)
1556     BX_RET 14, $noreg, implicit $r0
1557 ...
1558 ---
1559 name:            test_pointer_constant_constrained
1560 # CHECK-LABEL: name: test_pointer_constant_constrained
1561 legalized:       true
1562 regBankSelected: true
1563 selected:        false
1564 # CHECK: selected: true
1565 registers:
1566   - { id: 0, class: gprb }
1567 body:             |
1568   bb.0:
1569     %0(p0) = G_CONSTANT i32 0
1570     ; CHECK: %[[C:[0-9]+]]:gpr = MOVi 0, 14, $noreg, $noreg
1571
1572     ; This constrains %0 before the G_CONSTANT is selected.
1573     G_STORE %0(p0), %0(p0) :: (store 4)
1574 ...
1575 ---
1576 name:            test_inttoptr_s32
1577 # CHECK-LABEL: name: test_inttoptr_s32
1578 legalized:       true
1579 regBankSelected: true
1580 selected:        false
1581 # CHECK: selected: true
1582 registers:
1583   - { id: 0, class: gprb }
1584   - { id: 1, class: gprb }
1585 body:             |
1586   bb.0:
1587     liveins: $r0
1588
1589     %0(s32) = COPY $r0
1590     %1(p0) = G_INTTOPTR %0(s32)
1591     ; CHECK: [[INT:%[0-9]+]]:gpr = COPY $r0
1592
1593     $r0 = COPY %1(p0)
1594     ; CHECK: $r0 = COPY [[INT]]
1595
1596     BX_RET 14, $noreg, implicit $r0
1597 ...
1598 ---
1599 name:            test_ptrtoint_s32
1600 # CHECK-LABEL: name: test_ptrtoint_s32
1601 legalized:       true
1602 regBankSelected: true
1603 selected:        false
1604 # CHECK: selected: true
1605 registers:
1606   - { id: 0, class: gprb }
1607   - { id: 1, class: gprb }
1608 body:             |
1609   bb.0:
1610     liveins: $r0
1611
1612     %0(p0) = COPY $r0
1613     %1(s32) = G_PTRTOINT %0(p0)
1614     ; CHECK: [[PTR:%[0-9]+]]:gpr = COPY $r0
1615
1616     $r0 = COPY %1(s32)
1617     ; CHECK: $r0 = COPY [[PTR]]
1618
1619     BX_RET 14, $noreg, implicit $r0
1620 ...
1621 ---
1622 name:            test_select_s32
1623 # CHECK-LABEL: name: test_select_s32
1624 legalized:       true
1625 regBankSelected: true
1626 selected:        false
1627 # CHECK: selected: true
1628 registers:
1629   - { id: 0, class: gprb }
1630   - { id: 1, class: gprb }
1631   - { id: 2, class: gprb }
1632   - { id: 3, class: gprb }
1633 body:             |
1634   bb.0:
1635     liveins: $r0, $r1
1636
1637     %0(s32) = COPY $r0
1638     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
1639
1640     %1(s32) = COPY $r1
1641     ; CHECK: [[VREGY:%[0-9]+]]:gpr = COPY $r1
1642
1643     %2(s1) = G_TRUNC %1(s32)
1644
1645     %3(s32) = G_SELECT %2(s1),  %0, %1
1646     ; CHECK: CMPri [[VREGY]], 0, 14, $noreg, implicit-def $cpsr
1647     ; CHECK: [[RES:%[0-9]+]]:gpr = MOVCCr [[VREGX]], [[VREGY]], 0, $cpsr
1648
1649     $r0 = COPY %3(s32)
1650     ; CHECK: $r0 = COPY [[RES]]
1651
1652     BX_RET 14, $noreg, implicit $r0
1653     ; CHECK: BX_RET 14, $noreg, implicit $r0
1654 ...
1655 ---
1656 name:            test_select_ptr
1657 # CHECK-LABEL: name: test_select_ptr
1658 legalized:       true
1659 regBankSelected: true
1660 selected:        false
1661 # CHECK: selected: true
1662 registers:
1663   - { id: 0, class: gprb }
1664   - { id: 1, class: gprb }
1665   - { id: 2, class: gprb }
1666   - { id: 3, class: gprb }
1667   - { id: 4, class: gprb }
1668 body:             |
1669   bb.0:
1670     liveins: $r0, $r1, $r2
1671
1672     %0(p0) = COPY $r0
1673     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
1674
1675     %1(p0) = COPY $r1
1676     ; CHECK: [[VREGY:%[0-9]+]]:gpr = COPY $r1
1677
1678     %2(s32) = COPY $r2
1679     ; CHECK: [[VREGC:%[0-9]+]]:gpr = COPY $r2
1680
1681     %3(s1) = G_TRUNC %2(s32)
1682
1683     %4(p0) = G_SELECT %3(s1),  %0, %1
1684     ; CHECK: CMPri [[VREGC]], 0, 14, $noreg, implicit-def $cpsr
1685     ; CHECK: [[RES:%[0-9]+]]:gpr = MOVCCr [[VREGX]], [[VREGY]], 0, $cpsr
1686
1687     $r0 = COPY %4(p0)
1688     ; CHECK: $r0 = COPY [[RES]]
1689
1690     BX_RET 14, $noreg, implicit $r0
1691     ; CHECK: BX_RET 14, $noreg, implicit $r0
1692 ...
1693 ---
1694 name:            test_br
1695 # CHECK-LABEL: name: test_br
1696 legalized:       true
1697 regBankSelected: true
1698 selected:        false
1699 # CHECK: selected: true
1700 registers:
1701   - { id: 0, class: gprb }
1702   - { id: 1, class: gprb }
1703 body:             |
1704   bb.0:
1705   ; CHECK: bb.0
1706     successors: %bb.1(0x40000000), %bb.2(0x40000000)
1707     liveins: $r0
1708
1709     %0(s32) = COPY $r0
1710     ; CHECK: [[COND32:%[0-9]+]]:gpr = COPY $r0
1711     %1(s1) = G_TRUNC %0(s32)
1712
1713     G_BRCOND %1(s1), %bb.1
1714     ; CHECK: TSTri [[COND32]], 1, 14, $noreg, implicit-def $cpsr
1715     ; CHECK: Bcc %bb.1, 1, $cpsr
1716     G_BR %bb.2
1717     ; CHECK: B %bb.2
1718
1719   bb.1:
1720   ; CHECK: bb.1
1721     successors: %bb.2(0x80000000)
1722
1723     G_BR %bb.2
1724     ; CHECK: B %bb.2
1725
1726   bb.2:
1727   ; CHECK: bb.2
1728
1729     BX_RET 14, $noreg
1730     ; CHECK: BX_RET 14, $noreg
1731 ...
1732 ---
1733 name:            test_phi_s32
1734 # CHECK-LABEL: name: test_phi_s32
1735 legalized:       true
1736 regBankSelected: true
1737 selected:        false
1738 # CHECK: selected: true
1739 tracksRegLiveness: true
1740 registers:
1741   - { id: 0, class: gprb }
1742   - { id: 1, class: gprb }
1743   - { id: 2, class: gprb }
1744   - { id: 3, class: gprb }
1745   - { id: 4, class: gprb }
1746 body:             |
1747   bb.0:
1748   ; CHECK: [[BB1:bb.0]]:
1749     successors: %bb.1(0x40000000), %bb.2(0x40000000)
1750     liveins: $r0, $r1, $r2
1751
1752     %0(s32) = COPY $r0
1753     %1(s1) = G_TRUNC %0(s32)
1754
1755     %2(s32) = COPY $r1
1756     %3(s32) = COPY $r2
1757     ; CHECK: [[V1:%[0-9]+]]:gpr = COPY $r1
1758     ; CHECK: [[V2:%[0-9]+]]:gpr = COPY $r2
1759
1760     G_BRCOND %1(s1), %bb.1
1761     G_BR %bb.2
1762
1763   bb.1:
1764   ; CHECK: [[BB2:bb.1]]:
1765     successors: %bb.2(0x80000000)
1766
1767     G_BR %bb.2
1768     ; CHECK: B %bb.2
1769
1770   bb.2:
1771   ; CHECK: bb.2
1772     %4(s32) = G_PHI %2(s32), %bb.0, %3(s32), %bb.1
1773     ; CHECK: {{%[0-9]+}}:gpr = PHI [[V1]], %[[BB1]], [[V2]], %[[BB2]]
1774
1775     $r0 = COPY %4(s32)
1776     BX_RET 14, $noreg, implicit $r0
1777 ...
1778 ---
1779 name:            test_phi_s64
1780 # CHECK-LABEL: name: test_phi_s64
1781 legalized:       true
1782 regBankSelected: true
1783 selected:        false
1784 # CHECK: selected: true
1785 tracksRegLiveness: true
1786 registers:
1787   - { id: 0, class: gprb }
1788   - { id: 1, class: gprb }
1789   - { id: 2, class: fprb }
1790   - { id: 3, class: fprb }
1791   - { id: 4, class: fprb }
1792 body:             |
1793   bb.0:
1794   ; CHECK: [[BB1:bb.0]]:
1795     successors: %bb.1(0x40000000), %bb.2(0x40000000)
1796     liveins: $r0, $d0, $d1
1797
1798     %0(s32) = COPY $r0
1799     %1(s1) = G_TRUNC %0(s32)
1800
1801     %2(s64) = COPY $d0
1802     %3(s64) = COPY $d1
1803     ; CHECK: [[V1:%[0-9]+]]:dpr = COPY $d0
1804     ; CHECK: [[V2:%[0-9]+]]:dpr = COPY $d1
1805
1806     G_BRCOND %1(s1), %bb.1
1807     G_BR %bb.2
1808
1809   bb.1:
1810   ; CHECK: [[BB2:bb.1]]:
1811     successors: %bb.2(0x80000000)
1812
1813     G_BR %bb.2
1814     ; CHECK: B %bb.2
1815
1816   bb.2:
1817   ; CHECK: bb.2
1818     %4(s64) = G_PHI %2(s64), %bb.0, %3(s64), %bb.1
1819     ; CHECK: {{%[0-9]+}}:dpr = PHI [[V1]], %[[BB1]], [[V2]], %[[BB2]]
1820
1821     $d0 = COPY %4(s64)
1822     BX_RET 14, $noreg, implicit $d0
1823 ...
1824 ---
1825 name:            test_soft_fp_double
1826 # CHECK-LABEL: name: test_soft_fp_double
1827 legalized:       true
1828 regBankSelected: true
1829 selected:        false
1830 # CHECK: selected: true
1831 registers:
1832   - { id: 0, class: gprb }
1833   - { id: 1, class: gprb }
1834   - { id: 2, class: fprb }
1835   - { id: 3, class: gprb }
1836   - { id: 4, class: gprb }
1837 body:             |
1838   bb.0:
1839     liveins: $r0, $r1, $r2, $r3
1840
1841     %0(s32) = COPY $r2
1842     ; CHECK: [[IN1:%[0-9]+]]:gpr = COPY $r2
1843
1844     %1(s32) = COPY $r3
1845     ; CHECK: [[IN2:%[0-9]+]]:gpr = COPY $r3
1846
1847     %2(s64) = G_MERGE_VALUES %0(s32), %1(s32)
1848     ; CHECK: %[[DREG:[0-9]+]]:dpr = VMOVDRR [[IN1]], [[IN2]]
1849
1850     %3(s32), %4(s32) = G_UNMERGE_VALUES %2(s64)
1851     ; CHECK: [[OUT1:%[0-9]+]]:gpr, [[OUT2:%[0-9]+]]:gpr = VMOVRRD %[[DREG]]
1852
1853     $r0 = COPY %3
1854     ; CHECK: $r0 = COPY [[OUT1]]
1855
1856     $r1 = COPY %4
1857     ; CHECK: $r1 = COPY [[OUT2]]
1858
1859     BX_RET 14, $noreg, implicit $r0, implicit $r1
1860     ; CHECK: BX_RET 14, $noreg, implicit $r0, implicit $r1
1861 ...