[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / X86 / GlobalISel / select-ext.mir
blobdc077dda88024f64c93b2b9db2de4103388c1e51
1 # RUN: llc -mtriple=i386-linux-gnu   -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X32
2 # RUN: llc -mtriple=x86_64-linux-gnu -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X64
4 --- |
5   define i8 @test_zext_i1toi8(i1 %a) {
6     %r = zext i1 %a to i8
7     ret i8 %r
8   }
10   define i16 @test_zext_i1toi16(i1 %a) {
11     %r = zext i1 %a to i16
12     ret i16 %r
13   }
15   define i32 @test_zext_i1(i1 %a) {
16     %r = zext i1 %a to i32
17     ret i32 %r
18   }
20   define i32 @test_zext_i8(i8 %val) {
21     %r = zext i8 %val to i32
22     ret i32 %r
23   }
25   define i32 @test_zext_i16(i16 %val) {
26     %r = zext i16 %val to i32
27     ret i32 %r
28   }
30   define i32 @test_sext_i8(i8 %val) {
31     %r = sext i8 %val to i32
32     ret i32 %r
33   }
35   define i32 @test_sext_i16(i16 %val) {
36     %r = sext i16 %val to i32
37     ret i32 %r
38   }
40   define void @test_anyext_i1toi8() { ret void }
41   define void @test_anyext_i1toi16() { ret void }
42   define void @test_anyext_i1toi32() { ret void }
43   define void @test_anyext_i8toi16() { ret void }
44   define void @test_anyext_i8toi32() { ret void }
45   define void @test_anyext_i16toi32() { ret void }
47 ...
48 ---
49 name:            test_zext_i1toi8
50 # ALL-LABEL: name:  test_zext_i1toi8
51 alignment:       4
52 legalized:       true
53 regBankSelected: true
54 # X32:      registers:
55 # X32-NEXT:   - { id: 0, class: gr32_abcd, preferred-register: '' }
56 # X32-NEXT:   - { id: 1, class: gr8, preferred-register: '' }
57 # X32-NEXT:   - { id: 2, class: gr8, preferred-register: '' }
59 # X64:      registers:
60 # X64-NEXT:   - { id: 0, class: gr32, preferred-register: '' }
61 # X64-NEXT:   - { id: 1, class: gr8, preferred-register: '' }
62 # X64-NEXT:   - { id: 2, class: gr8, preferred-register: '' }
63 registers:
64   - { id: 0, class: gpr, preferred-register: '' }
65   - { id: 1, class: gpr, preferred-register: '' }
66   - { id: 2, class: gpr, preferred-register: '' }
67 # X32:          %0:gr32_abcd = COPY $edi
68 # X64:          %0:gr32 = COPY $edi
69 # ALL_NEXT:     %1:gr8 = COPY %0.sub_8bit
70 # ALL_NEXT:     %2:gr8 = AND8ri %1, 1, implicit-def $eflags
71 # ALL_NEXT:     $al = COPY %2
72 # ALL_NEXT:     RET 0, implicit $al
73 body:             |
74   bb.1 (%ir-block.0):
75     liveins: $edi
77     %0(s32) = COPY $edi
78     %1(s1) = G_TRUNC %0(s32)
79     %2(s8) = G_ZEXT %1(s1)
80     $al = COPY %2(s8)
81     RET 0, implicit $al
83 ...
84 ---
85 name:            test_zext_i1toi16
86 # ALL-LABEL: name:  test_zext_i1toi16
87 alignment:       4
88 legalized:       true
89 regBankSelected: true
90 # X32:      registers:
91 # X32-NEXT:   - { id: 0, class: gr32_abcd, preferred-register: '' }
92 # X32-NEXT:   - { id: 1, class: gr8, preferred-register: '' }
93 # X32-NEXT:   - { id: 2, class: gr16, preferred-register: '' }
94 # X32-NEXT:   - { id: 3, class: gr16, preferred-register: '' }
96 # X64:      registers:
97 # X64-NEXT:   - { id: 0, class: gr32, preferred-register: '' }
98 # X64-NEXT:   - { id: 1, class: gr8, preferred-register: '' }
99 # X64-NEXT:   - { id: 2, class: gr16, preferred-register: '' }
100 # X64-NEXT:   - { id: 3, class: gr16, preferred-register: '' }
101 registers:
102   - { id: 0, class: gpr, preferred-register: '' }
103   - { id: 1, class: gpr, preferred-register: '' }
104   - { id: 2, class: gpr, preferred-register: '' }
105 # X32:          %0:gr32_abcd = COPY $edi
106 # X64:          %0:gr32 = COPY $edi
107 # ALL_NEXT:     %1:gr8 = COPY %0.sub_8bit
108 # ALL_NEXT:     %3:gr16 = SUBREG_TO_REG 0, %1, %subreg.sub_8bit
109 # ALL_NEXT:     %2:gr16 = AND16ri8 %3, 1, implicit-def $eflags
110 # ALL_NEXT:     $ax = COPY %2
111 # ALL_NEXT:     RET 0, implicit $ax
112 body:             |
113   bb.1 (%ir-block.0):
114     liveins: $edi
116     %0(s32) = COPY $edi
117     %1(s1) = G_TRUNC %0(s32)
118     %2(s16) = G_ZEXT %1(s1)
119     $ax = COPY %2(s16)
120     RET 0, implicit $ax
124 name:            test_zext_i1
125 # ALL-LABEL: name:  test_zext_i1
126 alignment:       4
127 legalized:       true
128 regBankSelected: true
129 # X32:      registers:
130 # X32-NEXT:   - { id: 0, class: gr32_abcd, preferred-register: '' }
131 # X32-NEXT:   - { id: 1, class: gr8, preferred-register: '' }
132 # X32-NEXT:   - { id: 2, class: gr32, preferred-register: '' }
133 # X32-NEXT:   - { id: 3, class: gr32, preferred-register: '' }
135 # X64:      registers:
136 # X64-NEXT:   - { id: 0, class: gr32, preferred-register: '' }
137 # X64-NEXT:   - { id: 1, class: gr8, preferred-register: '' }
138 # X64-NEXT:   - { id: 2, class: gr32, preferred-register: '' }
139 # X64-NEXT:   - { id: 3, class: gr32, preferred-register: '' }
140 registers:
141   - { id: 0, class: gpr }
142   - { id: 1, class: gpr }
143   - { id: 2, class: gpr }
144 # X32:          %0:gr32_abcd = COPY $edi
145 # X64:          %0:gr32 = COPY $edi
146 # ALL_NEXT:     %1:gr8 = COPY %0.sub_8bit
147 # ALL_NEXT:     %3:gr32 = SUBREG_TO_REG 0, %1, %subreg.sub_8bit
148 # ALL_NEXT:     %2:gr32 = AND32ri8 %3, 1, implicit-def $eflags
149 # ALL_NEXT:     $eax = COPY %2
150 # ALL_NEXT:     RET 0, implicit $eax
151 body:             |
152   bb.1 (%ir-block.0):
153     liveins: $edi
155     %0(s32) = COPY $edi
156     %1(s1) = G_TRUNC %0(s32)
157     %2(s32) = G_ZEXT %1(s1)
158     $eax = COPY %2(s32)
159     RET 0, implicit $eax
163 name:            test_zext_i8
164 # ALL-LABEL: name:  test_zext_i8
165 alignment:       4
166 legalized:       true
167 regBankSelected: true
168 # ALL:      registers:
169 # ALL-NEXT:   - { id: 0, class: gr8, preferred-register: '' }
170 # ALL-NEXT:   - { id: 1, class: gr32, preferred-register: '' }
171 registers:
172   - { id: 0, class: gpr }
173   - { id: 1, class: gpr }
174 # ALL:          %0:gr8 = COPY $dil
175 # ALL-NEXT:     %1:gr32 = MOVZX32rr8 %0
176 # ALL-NEXT:     $eax = COPY %1
177 # ALL-NEXT:     RET 0, implicit $eax
178 body:             |
179   bb.1 (%ir-block.0):
180     liveins: $edi
182     %0(s8) = COPY $dil
183     %1(s32) = G_ZEXT %0(s8)
184     $eax = COPY %1(s32)
185     RET 0, implicit $eax
189 name:            test_zext_i16
190 # ALL-LABEL: name:  test_zext_i16
191 alignment:       4
192 legalized:       true
193 regBankSelected: true
194 # ALL:      registers:
195 # ALL-NEXT:   - { id: 0, class: gr16, preferred-register: '' }
196 # ALL-NEXT:   - { id: 1, class: gr32, preferred-register: '' }
197 registers:
198   - { id: 0, class: gpr }
199   - { id: 1, class: gpr }
200 # ALL:          %0:gr16 = COPY $di
201 # ALL-NEXT:     %1:gr32 = MOVZX32rr16 %0
202 # ALL-NEXT:     $eax = COPY %1
203 # ALL-NEXT:     RET 0, implicit $eax
204 body:             |
205   bb.1 (%ir-block.0):
206     liveins: $edi
208     %0(s16) = COPY $di
209     %1(s32) = G_ZEXT %0(s16)
210     $eax = COPY %1(s32)
211     RET 0, implicit $eax
215 name:            test_sext_i8
216 # ALL-LABEL: name:  test_sext_i8
217 alignment:       4
218 legalized:       true
219 regBankSelected: true
220 # ALL:      registers:
221 # ALL-NEXT:   - { id: 0, class: gr8, preferred-register: '' }
222 # ALL-NEXT:   - { id: 1, class: gr32, preferred-register: '' }
223 registers:
224   - { id: 0, class: gpr }
225   - { id: 1, class: gpr }
226 # ALL:          %0:gr8 = COPY $dil
227 # ALL-NEXT:     %1:gr32 = MOVSX32rr8 %0
228 # ALL-NEXT:     $eax = COPY %1
229 # ALL-NEXT:     RET 0, implicit $eax
230 body:             |
231   bb.1 (%ir-block.0):
232     liveins: $edi
234     %0(s8) = COPY $dil
235     %1(s32) = G_SEXT %0(s8)
236     $eax = COPY %1(s32)
237     RET 0, implicit $eax
241 name:            test_sext_i16
242 # ALL-LABEL: name:  test_sext_i16
243 alignment:       4
244 legalized:       true
245 regBankSelected: true
246 # ALL:      registers:
247 # ALL-NEXT:   - { id: 0, class: gr16, preferred-register: '' }
248 # ALL-NEXT:   - { id: 1, class: gr32, preferred-register: '' }
249 registers:
250   - { id: 0, class: gpr }
251   - { id: 1, class: gpr }
252 # ALL:          %0:gr16 = COPY $di
253 # ALL-NEXT:     %1:gr32 = MOVSX32rr16 %0
254 # ALL-NEXT:     $eax = COPY %1
255 # ALL-NEXT:     RET 0, implicit $eax
256 body:             |
257   bb.1 (%ir-block.0):
258     liveins: $edi
260     %0(s16) = COPY $di
261     %1(s32) = G_SEXT %0(s16)
262     $eax = COPY %1(s32)
263     RET 0, implicit $eax
267 name:            test_anyext_i1toi8
268 # ALL-LABEL: name:  test_anyext_i1toi8
269 alignment:       4
270 legalized:       true
271 regBankSelected: true
272 # X32:      registers:
273 # X32-NEXT:   - { id: 0, class: gr32_abcd, preferred-register: '' }
274 # X32-NEXT:   - { id: 1, class: gr8, preferred-register: '' }
275 # X32-NEXT:   - { id: 2, class: gr8, preferred-register: '' }
277 # X64:      registers:
278 # X64-NEXT:   - { id: 0, class: gr32, preferred-register: '' }
279 # X64-NEXT:   - { id: 1, class: gr8, preferred-register: '' }
280 # X64-NEXT:   - { id: 2, class: gr8, preferred-register: '' }
281 registers:
282   - { id: 0, class: gpr }
283   - { id: 1, class: gpr }
284   - { id: 2, class: gpr }
285 # X32:          %0:gr32_abcd = COPY $edi
286 # X64:          %0:gr32 = COPY $edi
287 # ALL-NEXT:     %1:gr8 = COPY %0.sub_8bit
288 # ALL-NEXT:     $al = COPY %1
289 # ALL-NEXT:     RET 0, implicit $al
290 body:             |
291   bb.1 (%ir-block.0):
292     liveins: $edi
294     %0(s32) = COPY $edi
295     %1(s1) = G_TRUNC %0(s32)
296     %2(s8) = G_ANYEXT %1(s1)
297     $al = COPY %2(s8)
298     RET 0, implicit $al
301 name:            test_anyext_i1toi16
302 # ALL-LABEL: name:  test_anyext_i1toi16
303 alignment:       4
304 legalized:       true
305 regBankSelected: true
306 # X32:      registers:
307 # X32-NEXT:   - { id: 0, class: gr32_abcd, preferred-register: '' }
308 # X32-NEXT:   - { id: 1, class: gr8, preferred-register: '' }
309 # X32-NEXT:   - { id: 2, class: gr16, preferred-register: '' }
311 # X64:      registers:
312 # X64-NEXT:   - { id: 0, class: gr32, preferred-register: '' }
313 # X64-NEXT:   - { id: 1, class: gr8, preferred-register: '' }
314 # X64-NEXT:   - { id: 2, class: gr16, preferred-register: '' }
315 registers:
316   - { id: 0, class: gpr }
317   - { id: 1, class: gpr }
318   - { id: 2, class: gpr }
319 # X32:          %0:gr32_abcd = COPY $edi
320 # X64:          %0:gr32 = COPY $edi
321 # ALL-NEXT:     %1:gr8 = COPY %0.sub_8bit
322 # ALL-NEXT:     %2:gr16 = SUBREG_TO_REG 0, %1, %subreg.sub_8bit
323 # ALL-NEXT:     $ax = COPY %2
324 # ALL-NEXT:     RET 0, implicit $ax
325 body:             |
326   bb.1 (%ir-block.0):
327     liveins: $edi
329     %0(s32) = COPY $edi
330     %1(s1) = G_TRUNC %0(s32)
331     %2(s16) = G_ANYEXT %1(s1)
332     $ax = COPY %2(s16)
333     RET 0, implicit $ax
336 name:            test_anyext_i1toi32
337 # ALL-LABEL: name:  test_anyext_i1toi32
338 alignment:       4
339 legalized:       true
340 regBankSelected: true
341 # X32:      registers:
342 # X32-NEXT:   - { id: 0, class: gr32_abcd, preferred-register: '' }
343 # X32-NEXT:   - { id: 1, class: gr8, preferred-register: '' }
344 # X32-NEXT:   - { id: 2, class: gr32, preferred-register: '' }
346 # X64:      registers:
347 # X64-NEXT:   - { id: 0, class: gr32, preferred-register: '' }
348 # X64-NEXT:   - { id: 1, class: gr8, preferred-register: '' }
349 # X64-NEXT:   - { id: 2, class: gr32, preferred-register: '' }
350 registers:
351   - { id: 0, class: gpr }
352   - { id: 1, class: gpr }
353   - { id: 2, class: gpr }
354 # X32:          %0:gr32_abcd = COPY $edi
355 # X64:          %0:gr32 = COPY $edi
356 # ALL-NEXT:     %1:gr8 = COPY %0.sub_8bit
357 # ALL-NEXT:     %2:gr32 = SUBREG_TO_REG 0, %1, %subreg.sub_8bit
358 # ALL-NEXT:     $eax = COPY %2
359 # ALL-NEXT:     RET 0, implicit $eax
360 body:             |
361   bb.1 (%ir-block.0):
362     liveins: $edi
364     %0(s32) = COPY $edi
365     %1(s1) = G_TRUNC %0(s32)
366     %2(s32) = G_ANYEXT %1(s1)
367     $eax = COPY %2(s32)
368     RET 0, implicit $eax
371 name:            test_anyext_i8toi16
372 # ALL-LABEL: name:  test_anyext_i8toi16
373 alignment:       4
374 legalized:       true
375 regBankSelected: true
376 # X32:      registers:
377 # X32-NEXT:   - { id: 0, class: gr32_abcd, preferred-register: '' }
378 # X32-NEXT:   - { id: 1, class: gr8, preferred-register: '' }
379 # X32-NEXT:   - { id: 2, class: gr16, preferred-register: '' }
381 # X64:      registers:
382 # X64-NEXT:   - { id: 0, class: gr32, preferred-register: '' }
383 # X64-NEXT:   - { id: 1, class: gr8, preferred-register: '' }
384 # X64-NEXT:   - { id: 2, class: gr16, preferred-register: '' }
385 registers:
386   - { id: 0, class: gpr }
387   - { id: 1, class: gpr }
388   - { id: 2, class: gpr }
389 # X32:          %0:gr32_abcd = COPY $edi
390 # X64:          %0:gr32 = COPY $edi
391 # ALL-NEXT:     %1:gr8 = COPY %0.sub_8bit
392 # ALL-NEXT:     %2:gr16 = SUBREG_TO_REG 0, %1, %subreg.sub_8bit
393 # ALL-NEXT:     $ax = COPY %2
394 # ALL-NEXT:     RET 0, implicit $ax
395 body:             |
396   bb.1 (%ir-block.0):
397     liveins: $edi
399     %0(s32) = COPY $edi
400     %1(s8) = G_TRUNC %0(s32)
401     %2(s16) = G_ANYEXT %1(s8)
402     $ax = COPY %2(s16)
403     RET 0, implicit $ax
406 name:            test_anyext_i8toi32
407 # ALL-LABEL: name:  test_anyext_i8toi32
408 alignment:       4
409 legalized:       true
410 regBankSelected: true
411 # X32:      registers:
412 # X32-NEXT:   - { id: 0, class: gr32_abcd, preferred-register: '' }
413 # X32-NEXT:   - { id: 1, class: gr8, preferred-register: '' }
414 # X32-NEXT:   - { id: 2, class: gr32, preferred-register: '' }
416 # X64:      registers:
417 # X64-NEXT:   - { id: 0, class: gr32, preferred-register: '' }
418 # X64-NEXT:   - { id: 1, class: gr8, preferred-register: '' }
419 # X64-NEXT:   - { id: 2, class: gr32, preferred-register: '' }
420 registers:
421   - { id: 0, class: gpr }
422   - { id: 1, class: gpr }
423   - { id: 2, class: gpr }
424 # X32:          %0:gr32_abcd = COPY $edi
425 # X64:          %0:gr32 = COPY $edi
426 # ALL-NEXT:     %1:gr8 = COPY %0.sub_8bit
427 # ALL-NEXT:     %2:gr32 = MOVZX32rr8 %1
428 # ALL-NEXT:     $eax = COPY %2
429 # ALL-NEXT:     RET 0, implicit $eax
430 body:             |
431   bb.1 (%ir-block.0):
432     liveins: $edi
434     %0(s32) = COPY $edi
435     %1(s8) = G_TRUNC %0(s32)
436     %2(s32) = G_ANYEXT %1(s8)
437     $eax = COPY %2(s32)
438     RET 0, implicit $eax
441 name:            test_anyext_i16toi32
442 # ALL-LABEL: name:  test_anyext_i16toi32
443 alignment:       4
444 legalized:       true
445 regBankSelected: true
446 # ALL:      registers:
447 # ALL-NEXT:   - { id: 0, class: gr32, preferred-register: '' }
448 # ALL-NEXT:   - { id: 1, class: gr16, preferred-register: '' }
449 # ALL-NEXT:   - { id: 2, class: gr32, preferred-register: '' }
450 registers:
451   - { id: 0, class: gpr }
452   - { id: 1, class: gpr }
453   - { id: 2, class: gpr }
454 # ALL:          %0:gr32 = COPY $edi
455 # ALL-NEXT:     %1:gr16 = COPY %0.sub_16bit
456 # ALL-NEXT:     %2:gr32 = SUBREG_TO_REG 0, %1, %subreg.sub_16bit
457 # ALL-NEXT:     $eax = COPY %2
458 # ALL-NEXT:     RET 0, implicit $eax
459 body:             |
460   bb.1 (%ir-block.0):
461     liveins: $edi
463     %0(s32) = COPY $edi
464     %1(s16) = G_TRUNC %0(s32)
465     %2(s32) = G_ANYEXT %1(s16)
466     $eax = COPY %2(s32)
467     RET 0, implicit $eax