Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / X86 / fast-isel-sext-zext.ll
blob7dae049d8e02356841f40006f51dcb051732d0e6
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-apple-darwin10 -fast-isel -fast-isel-abort=1 | FileCheck %s --check-prefix=X32
3 ; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -fast-isel -fast-isel-abort=1 | FileCheck %s --check-prefix=X64
5 define i8 @test1(i8 %x) nounwind {
6 ; X32-LABEL: test1:
7 ; X32:       ## %bb.0:
8 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
9 ; X32-NEXT:    andb $1, %al
10 ; X32-NEXT:    negb %al
11 ; X32-NEXT:    retl
13 ; X64-LABEL: test1:
14 ; X64:       ## %bb.0:
15 ; X64-NEXT:    movl %edi, %eax
16 ; X64-NEXT:    andb $1, %al
17 ; X64-NEXT:    negb %al
18 ; X64-NEXT:    ## kill: def $al killed $al killed $eax
19 ; X64-NEXT:    retq
20   %z = trunc i8 %x to i1
21   %u = sext i1 %z to i8
22   ret i8 %u
25 define i16 @test2(i16 %x) nounwind {
26 ; X32-LABEL: test2:
27 ; X32:       ## %bb.0:
28 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
29 ; X32-NEXT:    andb $1, %al
30 ; X32-NEXT:    negb %al
31 ; X32-NEXT:    movsbl %al, %eax
32 ; X32-NEXT:    ## kill: def $ax killed $ax killed $eax
33 ; X32-NEXT:    retl
35 ; X64-LABEL: test2:
36 ; X64:       ## %bb.0:
37 ; X64-NEXT:    andb $1, %dil
38 ; X64-NEXT:    negb %dil
39 ; X64-NEXT:    movsbl %dil, %eax
40 ; X64-NEXT:    ## kill: def $ax killed $ax killed $eax
41 ; X64-NEXT:    retq
42   %z = trunc i16 %x to i1
43   %u = sext i1 %z to i16
44   ret i16 %u
47 define i32 @test3(i32 %x) nounwind {
48 ; X32-LABEL: test3:
49 ; X32:       ## %bb.0:
50 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
51 ; X32-NEXT:    andb $1, %al
52 ; X32-NEXT:    negb %al
53 ; X32-NEXT:    movsbl %al, %eax
54 ; X32-NEXT:    retl
56 ; X64-LABEL: test3:
57 ; X64:       ## %bb.0:
58 ; X64-NEXT:    andb $1, %dil
59 ; X64-NEXT:    negb %dil
60 ; X64-NEXT:    movsbl %dil, %eax
61 ; X64-NEXT:    retq
62   %z = trunc i32 %x to i1
63   %u = sext i1 %z to i32
64   ret i32 %u
67 define i32 @test4(i32 %x) nounwind {
68 ; X32-LABEL: test4:
69 ; X32:       ## %bb.0:
70 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
71 ; X32-NEXT:    andb $1, %al
72 ; X32-NEXT:    negb %al
73 ; X32-NEXT:    movsbl %al, %eax
74 ; X32-NEXT:    retl
76 ; X64-LABEL: test4:
77 ; X64:       ## %bb.0:
78 ; X64-NEXT:    andb $1, %dil
79 ; X64-NEXT:    negb %dil
80 ; X64-NEXT:    movsbl %dil, %eax
81 ; X64-NEXT:    retq
82   %z = trunc i32 %x to i1
83   %u = sext i1 %z to i32
84   ret i32 %u
87 define i8 @test5(i8 %x) nounwind {
88 ; X32-LABEL: test5:
89 ; X32:       ## %bb.0:
90 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
91 ; X32-NEXT:    andb $1, %al
92 ; X32-NEXT:    retl
94 ; X64-LABEL: test5:
95 ; X64:       ## %bb.0:
96 ; X64-NEXT:    movl %edi, %eax
97 ; X64-NEXT:    andb $1, %al
98 ; X64-NEXT:    ## kill: def $al killed $al killed $eax
99 ; X64-NEXT:    retq
100   %z = trunc i8 %x to i1
101   %u = zext i1 %z to i8
102   ret i8 %u
105 define i16 @test6(i16 %x) nounwind {
106 ; X32-LABEL: test6:
107 ; X32:       ## %bb.0:
108 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
109 ; X32-NEXT:    andb $1, %al
110 ; X32-NEXT:    movzbl %al, %eax
111 ; X32-NEXT:    ## kill: def $ax killed $ax killed $eax
112 ; X32-NEXT:    retl
114 ; X64-LABEL: test6:
115 ; X64:       ## %bb.0:
116 ; X64-NEXT:    andb $1, %dil
117 ; X64-NEXT:    movzbl %dil, %eax
118 ; X64-NEXT:    ## kill: def $ax killed $ax killed $eax
119 ; X64-NEXT:    retq
120   %z = trunc i16 %x to i1
121   %u = zext i1 %z to i16
122   ret i16 %u
125 define i32 @test7(i32 %x) nounwind {
126 ; X32-LABEL: test7:
127 ; X32:       ## %bb.0:
128 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
129 ; X32-NEXT:    andb $1, %al
130 ; X32-NEXT:    movzbl %al, %eax
131 ; X32-NEXT:    retl
133 ; X64-LABEL: test7:
134 ; X64:       ## %bb.0:
135 ; X64-NEXT:    andb $1, %dil
136 ; X64-NEXT:    movzbl %dil, %eax
137 ; X64-NEXT:    retq
138   %z = trunc i32 %x to i1
139   %u = zext i1 %z to i32
140   ret i32 %u
143 define i32 @test8(i32 %x) nounwind {
144 ; X32-LABEL: test8:
145 ; X32:       ## %bb.0:
146 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
147 ; X32-NEXT:    andb $1, %al
148 ; X32-NEXT:    movzbl %al, %eax
149 ; X32-NEXT:    retl
151 ; X64-LABEL: test8:
152 ; X64:       ## %bb.0:
153 ; X64-NEXT:    andb $1, %dil
154 ; X64-NEXT:    movzbl %dil, %eax
155 ; X64-NEXT:    retq
156   %z = trunc i32 %x to i1
157   %u = zext i1 %z to i32
158   ret i32 %u
161 define i16 @test9(i8 %x) nounwind {
162 ; X32-LABEL: test9:
163 ; X32:       ## %bb.0:
164 ; X32-NEXT:    movsbl {{[0-9]+}}(%esp), %eax
165 ; X32-NEXT:    ## kill: def $ax killed $ax killed $eax
166 ; X32-NEXT:    retl
168 ; X64-LABEL: test9:
169 ; X64:       ## %bb.0:
170 ; X64-NEXT:    movsbl %dil, %eax
171 ; X64-NEXT:    ## kill: def $ax killed $ax killed $eax
172 ; X64-NEXT:    retq
173   %u = sext i8 %x to i16
174   ret i16 %u
177 define i32 @test10(i8 %x) nounwind {
178 ; X32-LABEL: test10:
179 ; X32:       ## %bb.0:
180 ; X32-NEXT:    movsbl {{[0-9]+}}(%esp), %eax
181 ; X32-NEXT:    retl
183 ; X64-LABEL: test10:
184 ; X64:       ## %bb.0:
185 ; X64-NEXT:    movsbl %dil, %eax
186 ; X64-NEXT:    retq
187   %u = sext i8 %x to i32
188   ret i32 %u
191 define i64 @test11(i8 %x) nounwind {
192 ; X32-LABEL: test11:
193 ; X32:       ## %bb.0:
194 ; X32-NEXT:    movsbl {{[0-9]+}}(%esp), %eax
195 ; X32-NEXT:    movl %eax, %edx
196 ; X32-NEXT:    sarl $31, %edx
197 ; X32-NEXT:    retl
199 ; X64-LABEL: test11:
200 ; X64:       ## %bb.0:
201 ; X64-NEXT:    movsbq %dil, %rax
202 ; X64-NEXT:    retq
203   %u = sext i8 %x to i64
204   ret i64 %u
207 define i16 @test12(i8 %x) nounwind {
208 ; X32-LABEL: test12:
209 ; X32:       ## %bb.0:
210 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
211 ; X32-NEXT:    ## kill: def $ax killed $ax killed $eax
212 ; X32-NEXT:    retl
214 ; X64-LABEL: test12:
215 ; X64:       ## %bb.0:
216 ; X64-NEXT:    movzbl %dil, %eax
217 ; X64-NEXT:    ## kill: def $ax killed $ax killed $eax
218 ; X64-NEXT:    retq
219   %u = zext i8 %x to i16
220   ret i16 %u
223 define i32 @test13(i8 %x) nounwind {
224 ; X32-LABEL: test13:
225 ; X32:       ## %bb.0:
226 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
227 ; X32-NEXT:    retl
229 ; X64-LABEL: test13:
230 ; X64:       ## %bb.0:
231 ; X64-NEXT:    movzbl %dil, %eax
232 ; X64-NEXT:    retq
233   %u = zext i8 %x to i32
234   ret i32 %u
237 define i64 @test14(i8 %x) nounwind {
238 ; X32-LABEL: test14:
239 ; X32:       ## %bb.0:
240 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
241 ; X32-NEXT:    xorl %edx, %edx
242 ; X32-NEXT:    retl
244 ; X64-LABEL: test14:
245 ; X64:       ## %bb.0:
246 ; X64-NEXT:    movzbl %dil, %eax
247 ; X64-NEXT:    retq
248   %u = zext i8 %x to i64
249   ret i64 %u
252 define i32 @test15(i16 %x) nounwind {
253 ; X32-LABEL: test15:
254 ; X32:       ## %bb.0:
255 ; X32-NEXT:    movswl {{[0-9]+}}(%esp), %eax
256 ; X32-NEXT:    retl
258 ; X64-LABEL: test15:
259 ; X64:       ## %bb.0:
260 ; X64-NEXT:    movswl %di, %eax
261 ; X64-NEXT:    retq
262   %u = sext i16 %x to i32
263   ret i32 %u
266 define i64 @test16(i16 %x) nounwind {
267 ; X32-LABEL: test16:
268 ; X32:       ## %bb.0:
269 ; X32-NEXT:    movswl {{[0-9]+}}(%esp), %eax
270 ; X32-NEXT:    movl %eax, %edx
271 ; X32-NEXT:    sarl $31, %edx
272 ; X32-NEXT:    retl
274 ; X64-LABEL: test16:
275 ; X64:       ## %bb.0:
276 ; X64-NEXT:    movswq %di, %rax
277 ; X64-NEXT:    retq
278   %u = sext i16 %x to i64
279   ret i64 %u
282 define i32 @test17(i16 %x) nounwind {
283 ; X32-LABEL: test17:
284 ; X32:       ## %bb.0:
285 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
286 ; X32-NEXT:    retl
288 ; X64-LABEL: test17:
289 ; X64:       ## %bb.0:
290 ; X64-NEXT:    movzwl %di, %eax
291 ; X64-NEXT:    retq
292   %u = zext i16 %x to i32
293   ret i32 %u
296 define i64 @test18(i16 %x) nounwind {
297 ; X32-LABEL: test18:
298 ; X32:       ## %bb.0:
299 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
300 ; X32-NEXT:    xorl %edx, %edx
301 ; X32-NEXT:    retl
303 ; X64-LABEL: test18:
304 ; X64:       ## %bb.0:
305 ; X64-NEXT:    movzwl %di, %eax
306 ; X64-NEXT:    retq
307   %u = zext i16 %x to i64
308   ret i64 %u
311 define i64 @test19(i32 %x) nounwind {
312 ; X32-LABEL: test19:
313 ; X32:       ## %bb.0:
314 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
315 ; X32-NEXT:    movl %eax, %edx
316 ; X32-NEXT:    sarl $31, %edx
317 ; X32-NEXT:    retl
319 ; X64-LABEL: test19:
320 ; X64:       ## %bb.0:
321 ; X64-NEXT:    movslq %edi, %rax
322 ; X64-NEXT:    retq
323   %u = sext i32 %x to i64
324   ret i64 %u
327 define i64 @test20(i32 %x) nounwind {
328 ; X32-LABEL: test20:
329 ; X32:       ## %bb.0:
330 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
331 ; X32-NEXT:    xorl %edx, %edx
332 ; X32-NEXT:    retl
334 ; X64-LABEL: test20:
335 ; X64:       ## %bb.0:
336 ; X64-NEXT:    movl %edi, %eax
337 ; X64-NEXT:    retq
338   %u = zext i32 %x to i64
339   ret i64 %u