[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / ARM / GlobalISel / thumb-select-exts.mir
blob22f98045ceab934003218bba7be6cd12aa74fee3
1 # RUN: llc -O0 -mtriple thumb-- -mattr=+v6t2 -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s
2 --- |
3   define void @test_trunc_and_zext_s1_to_s32() { ret void }
4   define void @test_trunc_and_sext_s1_to_s32() { ret void }
5   define void @test_trunc_and_anyext_s1_to_s32() { ret void }
7   define void @test_trunc_and_zext_s8_to_s32() { ret void }
8   define void @test_trunc_and_sext_s8_to_s32() { ret void }
9   define void @test_trunc_and_anyext_s8_to_s32() { ret void }
11   define void @test_trunc_and_zext_s16_to_s32() { ret void }
12   define void @test_trunc_and_sext_s16_to_s32() { ret void }
13   define void @test_trunc_and_anyext_s16_to_s32() { ret void }
15   define void @test_trunc_and_zext_s1_to_s16() { ret void }
16   define void @test_trunc_and_sext_s1_to_s16() { ret void }
17   define void @test_trunc_and_anyext_s1_to_s16() { ret void }
19   define void @test_trunc_and_zext_s8_to_s16() { ret void }
20   define void @test_trunc_and_sext_s8_to_s16() { ret void }
21   define void @test_trunc_and_anyext_s8_to_s16() { ret void }
23   define void @test_trunc_and_zext_s1_to_s8() { ret void }
24   define void @test_trunc_and_sext_s1_to_s8() { ret void }
25   define void @test_trunc_and_anyext_s1_to_s8() { ret void }
26 ...
27 ---
28 name:            test_trunc_and_zext_s1_to_s32
29 # CHECK-LABEL: name: test_trunc_and_zext_s1_to_s32
30 legalized:       true
31 regBankSelected: true
32 selected:        false
33 # CHECK: selected: true
34 tracksRegLiveness: true
35 registers:
36   - { id: 0, class: gprb }
37   - { id: 1, class: gprb }
38   - { id: 2, class: gprb }
39 body:             |
40   bb.0:
41     liveins: $r0
43     %0(s32) = COPY $r0
44     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r0
46     %1(s1) = G_TRUNC %0(s32)
48     %2(s32) = G_ZEXT %1(s1)
49     ; CHECK: [[RVREG:%[0-9]+]]:rgpr = COPY [[VREG]]
50     ; CHECK: [[VREGEXT:%[0-9]+]]:rgpr = t2ANDri [[RVREG]], 1, 14, $noreg, $noreg
52     $r0 = COPY %2(s32)
53     ; CHECK: $r0 = COPY [[VREGEXT]]
55     BX_RET 14, $noreg, implicit $r0
56     ; CHECK: BX_RET 14, $noreg, implicit $r0
57 ...
58 ---
59 name:            test_trunc_and_sext_s1_to_s32
60 # CHECK-LABEL: name: test_trunc_and_sext_s1_to_s32
61 legalized:       true
62 regBankSelected: true
63 selected:        false
64 # CHECK: selected: true
65 tracksRegLiveness: true
66 registers:
67   - { id: 0, class: gprb }
68   - { id: 1, class: gprb }
69   - { id: 2, class: gprb }
70 body:             |
71   bb.0:
72     liveins: $r0
74     %0(s32) = COPY $r0
75     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r0
77     %1(s1) = G_TRUNC %0(s32)
79     %2(s32) = G_SEXT %1(s1)
80     ; CHECK: [[RVREG:%[0-9]+]]:rgpr = COPY [[VREG]]
81     ; CHECK: [[VREGAND:%[0-9]+]]:rgpr = t2ANDri [[RVREG]], 1, 14, $noreg, $noreg
82     ; CHECK: [[VREGEXT:%[0-9]+]]:rgpr = t2RSBri [[VREGAND]], 0, 14, $noreg, $noreg
84     $r0 = COPY %2(s32)
85     ; CHECK: $r0 = COPY [[VREGEXT]]
87     BX_RET 14, $noreg, implicit $r0
88     ; CHECK: BX_RET 14, $noreg, implicit $r0
89 ...
90 ---
91 name:            test_trunc_and_anyext_s1_to_s32
92 # CHECK-LABEL: name: test_trunc_and_anyext_s1_to_s32
93 legalized:       true
94 regBankSelected: true
95 selected:        false
96 # CHECK: selected: true
97 tracksRegLiveness: true
98 registers:
99   - { id: 0, class: gprb }
100   - { id: 1, class: gprb }
101   - { id: 2, class: gprb }
102 body:             |
103   bb.0:
104     liveins: $r0
106     %0(s32) = COPY $r0
107     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r0
109     %1(s1) = G_TRUNC %0(s32)
111     %2(s32) = G_ANYEXT %1(s1)
113     $r0 = COPY %2(s32)
114     ; CHECK: $r0 = COPY [[VREG]]
116     BX_RET 14, $noreg, implicit $r0
117     ; CHECK: BX_RET 14, $noreg, implicit $r0
120 name:            test_trunc_and_zext_s8_to_s32
121 # CHECK-LABEL: name: test_trunc_and_zext_s8_to_s32
122 legalized:       true
123 regBankSelected: true
124 selected:        false
125 # CHECK: selected: true
126 tracksRegLiveness: true
127 registers:
128   - { id: 0, class: gprb }
129   - { id: 1, class: gprb }
130   - { id: 2, class: gprb }
131 body:             |
132   bb.0:
133     liveins: $r0
135     %0(s32) = COPY $r0
136     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r0
138     %1(s8) = G_TRUNC %0(s32)
139     ; CHECK: [[VREGTRUNC:%[0-9]+]]:rgpr = COPY [[VREG]]
141     %2(s32) = G_ZEXT %1(s8)
142     ; CHECK: [[VREGEXT:%[0-9]+]]:rgpr = t2UXTB [[VREGTRUNC]], 0, 14, $noreg
144     $r0 = COPY %2(s32)
145     ; CHECK: $r0 = COPY [[VREGEXT]]
147     BX_RET 14, $noreg, implicit $r0
148     ; CHECK: BX_RET 14, $noreg, implicit $r0
151 name:            test_trunc_and_sext_s8_to_s32
152 # CHECK-LABEL: name: test_trunc_and_sext_s8_to_s32
153 legalized:       true
154 regBankSelected: true
155 selected:        false
156 # CHECK: selected: true
157 tracksRegLiveness: true
158 registers:
159   - { id: 0, class: gprb }
160   - { id: 1, class: gprb }
161   - { id: 2, class: gprb }
162 body:             |
163   bb.0:
164     liveins: $r0
166     %0(s32) = COPY $r0
167     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r0
169     %1(s8) = G_TRUNC %0(s32)
170     ; CHECK: [[VREGTRUNC:%[0-9]+]]:rgpr = COPY [[VREG]]
172     %2(s32) = G_SEXT %1(s8)
173     ; CHECK: [[VREGEXT:%[0-9]+]]:rgpr = t2SXTB [[VREGTRUNC]], 0, 14, $noreg
175     $r0 = COPY %2(s32)
176     ; CHECK: $r0 = COPY [[VREGEXT]]
178     BX_RET 14, $noreg, implicit $r0
179     ; CHECK: BX_RET 14, $noreg, implicit $r0
182 name:            test_trunc_and_anyext_s8_to_s32
183 # CHECK-LABEL: name: test_trunc_and_anyext_s8_to_s32
184 legalized:       true
185 regBankSelected: true
186 selected:        false
187 # CHECK: selected: true
188 tracksRegLiveness: true
189 registers:
190   - { id: 0, class: gprb }
191   - { id: 1, class: gprb }
192   - { id: 2, class: gprb }
193 body:             |
194   bb.0:
195     liveins: $r0
197     %0(s32) = COPY $r0
198     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r0
200     %1(s8) = G_TRUNC %0(s32)
202     %2(s32) = G_ANYEXT %1(s8)
204     $r0 = COPY %2(s32)
205     ; CHECK: $r0 = COPY [[VREG]]
207     BX_RET 14, $noreg, implicit $r0
208     ; CHECK: BX_RET 14, $noreg, implicit $r0
211 name:            test_trunc_and_zext_s16_to_s32
212 # CHECK-LABEL: name: test_trunc_and_zext_s16_to_s32
213 legalized:       true
214 regBankSelected: true
215 selected:        false
216 # CHECK: selected: true
217 tracksRegLiveness: true
218 registers:
219   - { id: 0, class: gprb }
220   - { id: 1, class: gprb }
221   - { id: 2, class: gprb }
222 body:             |
223   bb.0:
224     liveins: $r0
226     %0(s32) = COPY $r0
227     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r0
229     %1(s16) = G_TRUNC %0(s32)
230     ; CHECK: [[VREGTRUNC:%[0-9]+]]:rgpr = COPY [[VREG]]
232     %2(s32) = G_ZEXT %1(s16)
233     ; CHECK: [[VREGEXT:%[0-9]+]]:rgpr = t2UXTH [[VREGTRUNC]], 0, 14, $noreg
235     $r0 = COPY %2(s32)
236     ; CHECK: $r0 = COPY [[VREGEXT]]
238     BX_RET 14, $noreg, implicit $r0
239     ; CHECK: BX_RET 14, $noreg, implicit $r0
242 name:            test_trunc_and_sext_s16_to_s32
243 # CHECK-LABEL: name: test_trunc_and_sext_s16_to_s32
244 legalized:       true
245 regBankSelected: true
246 selected:        false
247 # CHECK: selected: true
248 tracksRegLiveness: 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
257     %0(s32) = COPY $r0
258     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r0
260     %1(s16) = G_TRUNC %0(s32)
261     ; CHECK: [[VREGTRUNC:%[0-9]+]]:rgpr = COPY [[VREG]]
263     %2(s32) = G_SEXT %1(s16)
264     ; CHECK: [[VREGEXT:%[0-9]+]]:rgpr = t2SXTH [[VREGTRUNC]], 0, 14, $noreg
266     $r0 = COPY %2(s32)
267     ; CHECK: $r0 = COPY [[VREGEXT]]
269     BX_RET 14, $noreg, implicit $r0
270     ; CHECK: BX_RET 14, $noreg, implicit $r0
273 name:            test_trunc_and_anyext_s16_to_s32
274 # CHECK-LABEL: name: test_trunc_and_anyext_s16_to_s32
275 legalized:       true
276 regBankSelected: true
277 selected:        false
278 # CHECK: selected: true
279 tracksRegLiveness: true
280 registers:
281   - { id: 0, class: gprb }
282   - { id: 1, class: gprb }
283   - { id: 2, class: gprb }
284 body:             |
285   bb.0:
286     liveins: $r0
288     %0(s32) = COPY $r0
289     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r0
291     %1(s16) = G_TRUNC %0(s32)
293     %2(s32) = G_ANYEXT %1(s16)
295     $r0 = COPY %2(s32)
296     ; CHECK: $r0 = COPY [[VREG]]
298     BX_RET 14, $noreg, implicit $r0
299     ; CHECK: BX_RET 14, $noreg, implicit $r0
302 name:            test_trunc_and_zext_s1_to_s16
303 # CHECK-LABEL: name: test_trunc_and_zext_s1_to_s16
304 legalized:       true
305 regBankSelected: true
306 selected:        false
307 # CHECK: selected: true
308 tracksRegLiveness: true
309 registers:
310   - { id: 0, class: gprb }
311   - { id: 1, class: gprb }
312   - { id: 2, class: gprb }
313   - { id: 3, class: gprb }
314 body:             |
315   bb.0:
316     liveins: $r0, $r1
318     %0(p0) = COPY $r0
319     ; CHECK: [[PTR:%[0-9]+]]:gpr = COPY $r0
321     %1(s32) = COPY $r1
322     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r1
324     %2(s1) = G_TRUNC %1(s32)
326     %3(s16) = G_ZEXT %2(s1)
327     ; CHECK: [[RVREG:%[0-9]+]]:rgpr = COPY [[VREG]]
328     ; CHECK: [[VREGEXT:%[0-9]+]]:rgpr = t2ANDri [[RVREG]], 1, 14, $noreg, $noreg
330     G_STORE %3(s16), %0(p0) :: (store 2)
331     ; CHECK: t2STRHi12 [[VREGEXT]], [[PTR]], 0, 14, $noreg :: (store 2)
333     BX_RET 14, $noreg
334     ; CHECK: BX_RET 14, $noreg
337 name:            test_trunc_and_sext_s1_to_s16
338 # CHECK-LABEL: name: test_trunc_and_sext_s1_to_s16
339 legalized:       true
340 regBankSelected: true
341 selected:        false
342 # CHECK: selected: true
343 tracksRegLiveness: true
344 registers:
345   - { id: 0, class: gprb }
346   - { id: 1, class: gprb }
347   - { id: 2, class: gprb }
348   - { id: 3, class: gprb }
349 body:             |
350   bb.0:
351     liveins: $r0, $r1
353     %0(p0) = COPY $r0
354     ; CHECK: [[PTR:%[0-9]+]]:gpr = COPY $r0
356     %1(s32) = COPY $r1
357     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r1
359     %2(s1) = G_TRUNC %1(s32)
361     %3(s16) = G_SEXT %2(s1)
362     ; CHECK: [[RVREG:%[0-9]+]]:rgpr = COPY [[VREG]]
363     ; CHECK: [[VREGAND:%[0-9]+]]:rgpr = t2ANDri [[RVREG]], 1, 14, $noreg, $noreg
364     ; CHECK: [[VREGEXT:%[0-9]+]]:rgpr = t2RSBri [[VREGAND]], 0, 14, $noreg, $noreg
366     G_STORE %3(s16), %0(p0) :: (store 2)
367     ; CHECK: t2STRHi12 [[VREGEXT]], [[PTR]], 0, 14, $noreg :: (store 2)
369     BX_RET 14, $noreg
370     ; CHECK: BX_RET 14, $noreg
373 name:            test_trunc_and_anyext_s1_to_s16
374 # CHECK-LABEL: name: test_trunc_and_anyext_s1_to_s16
375 legalized:       true
376 regBankSelected: true
377 selected:        false
378 # CHECK: selected: true
379 tracksRegLiveness: true
380 registers:
381   - { id: 0, class: gprb }
382   - { id: 1, class: gprb }
383   - { id: 2, class: gprb }
384   - { id: 3, class: gprb }
385 body:             |
386   bb.0:
387     liveins: $r0, $r1
389     %0(p0) = COPY $r0
390     ; CHECK: [[PTR:%[0-9]+]]:gpr = COPY $r0
392     %1(s32) = COPY $r1
393     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r1
395     %2(s1) = G_TRUNC %1(s32)
397     %3(s16) = G_ANYEXT %2(s1)
399     G_STORE %3(s16), %0(p0) :: (store 2)
400     ; CHECK: [[RVREG:%[0-9]+]]:rgpr = COPY [[VREG]]
401     ; CHECK: t2STRHi12 [[RVREG]], [[PTR]], 0, 14, $noreg :: (store 2)
403     BX_RET 14, $noreg
404     ; CHECK: BX_RET 14, $noreg
407 name:            test_trunc_and_zext_s8_to_s16
408 # CHECK-LABEL: name: test_trunc_and_zext_s8_to_s16
409 legalized:       true
410 regBankSelected: true
411 selected:        false
412 # CHECK: selected: true
413 tracksRegLiveness: true
414 registers:
415   - { id: 0, class: gprb }
416   - { id: 1, class: gprb }
417   - { id: 2, class: gprb }
418   - { id: 3, class: gprb }
419 body:             |
420   bb.0:
421     liveins: $r0, $r1
423     %0(p0) = COPY $r0
424     ; CHECK: [[PTR:%[0-9]+]]:gpr = COPY $r0
426     %1(s32) = COPY $r1
427     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r1
429     %2(s8) = G_TRUNC %1(s32)
430     ; CHECK: [[VREGTRUNC:%[1-9]+]]:rgpr = COPY [[VREG]]
432     %3(s16) = G_ZEXT %2(s8)
433     ; CHECK: [[VREGEXT:%[0-9]+]]:rgpr = t2UXTB [[VREGTRUNC]], 0, 14, $noreg
435     G_STORE %3(s16), %0(p0) :: (store 2)
436     ; CHECK: t2STRHi12 [[VREGEXT]], [[PTR]], 0, 14, $noreg :: (store 2)
438     BX_RET 14, $noreg
439     ; CHECK: BX_RET 14, $noreg
442 name:            test_trunc_and_sext_s8_to_s16
443 # CHECK-LABEL: name: test_trunc_and_sext_s8_to_s16
444 legalized:       true
445 regBankSelected: true
446 selected:        false
447 # CHECK: selected: true
448 tracksRegLiveness: true
449 registers:
450   - { id: 0, class: gprb }
451   - { id: 1, class: gprb }
452   - { id: 2, class: gprb }
453   - { id: 3, class: gprb }
454 body:             |
455   bb.0:
456     liveins: $r0, $r1
458     %0(p0) = COPY $r0
459     ; CHECK: [[PTR:%[0-9]+]]:gpr = COPY $r0
461     %1(s32) = COPY $r1
462     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r1
464     %2(s8) = G_TRUNC %1(s32)
465     ; CHECK: [[VREGTRUNC:%[1-9]+]]:rgpr = COPY [[VREG]]
467     %3(s16) = G_SEXT %2(s8)
468     ; CHECK: [[VREGEXT:%[0-9]+]]:rgpr = t2SXTB [[VREGTRUNC]], 0, 14, $noreg
470     G_STORE %3(s16), %0(p0) :: (store 2)
471     ; CHECK: t2STRHi12 [[VREGEXT]], [[PTR]], 0, 14, $noreg :: (store 2)
473     BX_RET 14, $noreg
474     ; CHECK: BX_RET 14, $noreg
477 name:            test_trunc_and_anyext_s8_to_s16
478 # CHECK-LABEL: name: test_trunc_and_anyext_s8_to_s16
479 legalized:       true
480 regBankSelected: true
481 selected:        false
482 # CHECK: selected: true
483 tracksRegLiveness: true
484 registers:
485   - { id: 0, class: gprb }
486   - { id: 1, class: gprb }
487   - { id: 2, class: gprb }
488   - { id: 3, class: gprb }
489 body:             |
490   bb.0:
491     liveins: $r0, $r1
493     %0(p0) = COPY $r0
494     ; CHECK: [[PTR:%[0-9]+]]:gpr = COPY $r0
496     %1(s32) = COPY $r1
497     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r1
499     %2(s8) = G_TRUNC %1(s32)
501     %3(s16) = G_ANYEXT %2(s8)
503     G_STORE %3(s16), %0(p0) :: (store 2)
504     ; CHECK: [[VREGR:%[0-9]+]]:rgpr = COPY [[VREG]]
505     ; CHECK: t2STRHi12 [[VREGR]], [[PTR]], 0, 14, $noreg :: (store 2)
507     BX_RET 14, $noreg
508     ; CHECK: BX_RET 14, $noreg
511 name:            test_trunc_and_zext_s1_to_s8
512 # CHECK-LABEL: name: test_trunc_and_zext_s1_to_s8
513 legalized:       true
514 regBankSelected: true
515 selected:        false
516 # CHECK: selected: true
517 tracksRegLiveness: true
518 registers:
519   - { id: 0, class: gprb }
520   - { id: 1, class: gprb }
521   - { id: 2, class: gprb }
522   - { id: 3, class: gprb }
523 body:             |
524   bb.0:
525     liveins: $r0, $r1
527     %0(p0) = COPY $r0
528     ; CHECK: [[PTR:%[0-9]+]]:gpr = COPY $r0
530     %1(s32) = COPY $r1
531     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r1
533     %2(s1) = G_TRUNC %1(s32)
535     %3(s8) = G_ZEXT %2(s1)
536     ; CHECK: [[RVREG:%[0-9]+]]:rgpr = COPY [[VREG]]
537     ; CHECK: [[VREGEXT:%[0-9]+]]:rgpr = t2ANDri [[RVREG]], 1, 14, $noreg, $noreg
539     G_STORE %3(s8), %0(p0) :: (store 1)
540     ; CHECK: t2STRBi12 [[VREGEXT]], [[PTR]], 0, 14, $noreg :: (store 1)
542     BX_RET 14, $noreg
543     ; CHECK: BX_RET 14, $noreg
546 name:            test_trunc_and_sext_s1_to_s8
547 # CHECK-LABEL: name: test_trunc_and_sext_s1_to_s8
548 legalized:       true
549 regBankSelected: true
550 selected:        false
551 # CHECK: selected: true
552 tracksRegLiveness: true
553 registers:
554   - { id: 0, class: gprb }
555   - { id: 1, class: gprb }
556   - { id: 2, class: gprb }
557   - { id: 3, class: gprb }
558 body:             |
559   bb.0:
560     liveins: $r0, $r1
562     %0(p0) = COPY $r0
563     ; CHECK: [[PTR:%[0-9]+]]:gpr = COPY $r0
565     %1(s32) = COPY $r1
566     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r1
568     %2(s1) = G_TRUNC %1(s32)
570     %3(s8) = G_SEXT %2(s1)
571     ; CHECK: [[RVREG:%[0-9]+]]:rgpr = COPY [[VREG]]
572     ; CHECK: [[VREGAND:%[0-9]+]]:rgpr = t2ANDri [[RVREG]], 1, 14, $noreg, $noreg
573     ; CHECK: [[VREGEXT:%[0-9]+]]:rgpr = t2RSBri [[VREGAND]], 0, 14, $noreg, $noreg
575     G_STORE %3(s8), %0(p0) :: (store 1)
576     ; CHECK: t2STRBi12 [[VREGEXT]], [[PTR]], 0, 14, $noreg :: (store 1)
578     BX_RET 14, $noreg
579     ; CHECK: BX_RET 14, $noreg
582 name:            test_trunc_and_anyext_s1_to_s8
583 # CHECK-LABEL: name: test_trunc_and_anyext_s1_to_s8
584 legalized:       true
585 regBankSelected: true
586 selected:        false
587 # CHECK: selected: true
588 tracksRegLiveness: true
589 registers:
590   - { id: 0, class: gprb }
591   - { id: 1, class: gprb }
592   - { id: 2, class: gprb }
593   - { id: 3, class: gprb }
594 body:             |
595   bb.0:
596     liveins: $r0, $r1
598     %0(p0) = COPY $r0
599     ; CHECK: [[PTR:%[0-9]+]]:gpr = COPY $r0
601     %1(s32) = COPY $r1
602     ; CHECK: [[VREG:%[0-9]+]]:gpr = COPY $r1
604     %2(s1) = G_TRUNC %1(s32)
606     %3(s8) = G_ANYEXT %2(s1)
608     G_STORE %3(s8), %0(p0) :: (store 1)
609     ; CHECK: [[RVREG:%[0-9]+]]:rgpr = COPY [[VREG]]
610     ; CHECK: t2STRBi12 [[RVREG]], [[PTR]], 0, 14, $noreg :: (store 1)
612     BX_RET 14, $noreg
613     ; CHECK: BX_RET 14, $noreg