[AArch64,ELF] Restrict MOVZ/MOVK to non-PIC large code model (#70178)
[llvm-project.git] / llvm / test / CodeGen / X86 / setcc.ll
blob60ac6df3f77af29811dbe5c746b8c2cc7a6e4b90
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-apple-darwin | FileCheck %s --check-prefixes=X86
3 ; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck %s --check-prefixes=X64,X64-NOTBM,X64-NOBMI2
4 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+tbm | FileCheck %s --check-prefixes=X64,X64-NOBMI2,X64-TBM
5 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+bmi2 | FileCheck %s --check-prefixes=X64,X64-NOTBM,X64-BMI2
6 ; rdar://7329206
8 define zeroext i16 @t1(i16 zeroext %x) nounwind readnone ssp {
9 ; X86-LABEL: t1:
10 ; X86:       ## %bb.0:
11 ; X86-NEXT:    xorl %eax, %eax
12 ; X86-NEXT:    cmpw $27, {{[0-9]+}}(%esp)
13 ; X86-NEXT:    setae %al
14 ; X86-NEXT:    shll $5, %eax
15 ; X86-NEXT:    retl
17 ; X64-LABEL: t1:
18 ; X64:       ## %bb.0:
19 ; X64-NEXT:    xorl %eax, %eax
20 ; X64-NEXT:    cmpw $27, %di
21 ; X64-NEXT:    setae %al
22 ; X64-NEXT:    shll $5, %eax
23 ; X64-NEXT:    retq
24   %t0 = icmp ugt i16 %x, 26
25   %if = select i1 %t0, i16 32, i16 0
26   ret i16 %if
29 define zeroext i16 @t2(i16 zeroext %x) nounwind readnone ssp {
30 ; X86-LABEL: t2:
31 ; X86:       ## %bb.0:
32 ; X86-NEXT:    xorl %eax, %eax
33 ; X86-NEXT:    cmpw $26, {{[0-9]+}}(%esp)
34 ; X86-NEXT:    setb %al
35 ; X86-NEXT:    shll $5, %eax
36 ; X86-NEXT:    retl
38 ; X64-LABEL: t2:
39 ; X64:       ## %bb.0:
40 ; X64-NEXT:    xorl %eax, %eax
41 ; X64-NEXT:    cmpw $26, %di
42 ; X64-NEXT:    setb %al
43 ; X64-NEXT:    shll $5, %eax
44 ; X64-NEXT:    retq
45   %t0 = icmp ult i16 %x, 26
46   %if = select i1 %t0, i16 32, i16 0
47   ret i16 %if
50 define i64 @t3(i64 %x) nounwind readnone ssp {
51 ; X86-LABEL: t3:
52 ; X86:       ## %bb.0:
53 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
54 ; X86-NEXT:    cmpl $18, {{[0-9]+}}(%esp)
55 ; X86-NEXT:    sbbl $0, %eax
56 ; X86-NEXT:    setb %al
57 ; X86-NEXT:    movzbl %al, %eax
58 ; X86-NEXT:    shll $6, %eax
59 ; X86-NEXT:    xorl %edx, %edx
60 ; X86-NEXT:    retl
62 ; X64-LABEL: t3:
63 ; X64:       ## %bb.0:
64 ; X64-NEXT:    xorl %eax, %eax
65 ; X64-NEXT:    cmpq $18, %rdi
66 ; X64-NEXT:    setb %al
67 ; X64-NEXT:    shll $6, %eax
68 ; X64-NEXT:    retq
69   %t0 = icmp ult i64 %x, 18
70   %if = select i1 %t0, i64 64, i64 0
71   ret i64 %if
74 @v4 = common global i32 0, align 4
76 define i32 @t4(i32 %a) {
77 ; X86-LABEL: t4:
78 ; X86:       ## %bb.0:
79 ; X86-NEXT:    movl L_v4$non_lazy_ptr, %ecx
80 ; X86-NEXT:    xorl %eax, %eax
81 ; X86-NEXT:    cmpl $1, (%ecx)
82 ; X86-NEXT:    adcw $1, %ax
83 ; X86-NEXT:    shll $16, %eax
84 ; X86-NEXT:    retl
86 ; X64-LABEL: t4:
87 ; X64:       ## %bb.0:
88 ; X64-NEXT:    movq _v4@GOTPCREL(%rip), %rcx
89 ; X64-NEXT:    xorl %eax, %eax
90 ; X64-NEXT:    cmpl $1, (%rcx)
91 ; X64-NEXT:    adcw $1, %ax
92 ; X64-NEXT:    shll $16, %eax
93 ; X64-NEXT:    retq
94   %t0 = load i32, ptr @v4, align 4
95   %not.tobool = icmp eq i32 %t0, 0
96   %conv.i = sext i1 %not.tobool to i16
97   %call.lobit = lshr i16 %conv.i, 15
98   %add.i.1 = add nuw nsw i16 %call.lobit, 1
99   %conv4.2 = zext i16 %add.i.1 to i32
100   %add = shl nuw nsw i32 %conv4.2, 16
101   ret i32 %add
104 define i8 @t5(i32 %a) {
105 ; X86-LABEL: t5:
106 ; X86:       ## %bb.0:
107 ; X86-NEXT:    cmpl $0, {{[0-9]+}}(%esp)
108 ; X86-NEXT:    setns %al
109 ; X86-NEXT:    retl
111 ; X64-LABEL: t5:
112 ; X64:       ## %bb.0:
113 ; X64-NEXT:    testl %edi, %edi
114 ; X64-NEXT:    setns %al
115 ; X64-NEXT:    retq
116   %.lobit = lshr i32 %a, 31
117   %trunc = trunc i32 %.lobit to i8
118   %.not = xor i8 %trunc, 1
119   ret i8 %.not
122 define zeroext i1 @t6(i32 %a) {
123 ; X86-LABEL: t6:
124 ; X86:       ## %bb.0:
125 ; X86-NEXT:    cmpl $0, {{[0-9]+}}(%esp)
126 ; X86-NEXT:    setns %al
127 ; X86-NEXT:    retl
129 ; X64-LABEL: t6:
130 ; X64:       ## %bb.0:
131 ; X64-NEXT:    testl %edi, %edi
132 ; X64-NEXT:    setns %al
133 ; X64-NEXT:    retq
134   %.lobit = lshr i32 %a, 31
135   %trunc = trunc i32 %.lobit to i1
136   %.not = xor i1 %trunc, 1
137   ret i1 %.not
140 ; PR39174
141 define zeroext i1 @t7(i32 %0) {
142 ; X86-LABEL: t7:
143 ; X86:       ## %bb.0:
144 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
145 ; X86-NEXT:    movl $19, %ecx
146 ; X86-NEXT:    btl %eax, %ecx
147 ; X86-NEXT:    setb %al
148 ; X86-NEXT:    retl
150 ; X64-LABEL: t7:
151 ; X64:       ## %bb.0:
152 ; X64-NEXT:    movl $19, %eax
153 ; X64-NEXT:    btl %edi, %eax
154 ; X64-NEXT:    setb %al
155 ; X64-NEXT:    retq
156   %2 = trunc i32 %0 to i5
157   %3 = lshr i5 -13, %2
158   %4 = and i5 %3, 1
159   %5 = icmp ne i5 %4, 0
160   ret i1 %5
163 define zeroext i1 @t8(i8 %0, i8 %1) {
164 ; X86-LABEL: t8:
165 ; X86:       ## %bb.0:
166 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
167 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
168 ; X86-NEXT:    btl %eax, %ecx
169 ; X86-NEXT:    setb %al
170 ; X86-NEXT:    retl
172 ; X64-LABEL: t8:
173 ; X64:       ## %bb.0:
174 ; X64-NEXT:    btl %esi, %edi
175 ; X64-NEXT:    setb %al
176 ; X64-NEXT:    retq
177   %3 = lshr i8 %0, %1
178   %4 = and i8 %3, 1
179   %5 = icmp ne i8 %4, 0
180   ret i1 %5
183 define i64 @t9(i32 %0, i32 %1) {
184 ; X86-LABEL: t9:
185 ; X86:       ## %bb.0:
186 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
187 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
188 ; X86-NEXT:    xorl %eax, %eax
189 ; X86-NEXT:    btl %edx, %ecx
190 ; X86-NEXT:    setb %al
191 ; X86-NEXT:    xorl %edx, %edx
192 ; X86-NEXT:    retl
194 ; X64-NOBMI2-LABEL: t9:
195 ; X64-NOBMI2:       ## %bb.0:
196 ; X64-NOBMI2-NEXT:    xorl %eax, %eax
197 ; X64-NOBMI2-NEXT:    btl %esi, %edi
198 ; X64-NOBMI2-NEXT:    setb %al
199 ; X64-NOBMI2-NEXT:    retq
201 ; X64-BMI2-LABEL: t9:
202 ; X64-BMI2:       ## %bb.0:
203 ; X64-BMI2-NEXT:    shrxl %esi, %edi, %eax
204 ; X64-BMI2-NEXT:    andl $1, %eax
205 ; X64-BMI2-NEXT:    retq
206   %3 = lshr i32 %0, %1
207   %4 = and i32 %3, 1
208   %5 = icmp ne i32 %4, 0
209   %6 = zext i1 %5 to i64
210   ret i64 %6
213 define i32 @t10(i32 %0, i32 %1) {
214 ; X86-LABEL: t10:
215 ; X86:       ## %bb.0:
216 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
217 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
218 ; X86-NEXT:    xorl %eax, %eax
219 ; X86-NEXT:    btl %edx, %ecx
220 ; X86-NEXT:    setae %al
221 ; X86-NEXT:    retl
223 ; X64-LABEL: t10:
224 ; X64:       ## %bb.0:
225 ; X64-NEXT:    xorl %eax, %eax
226 ; X64-NEXT:    btl %esi, %edi
227 ; X64-NEXT:    setae %al
228 ; X64-NEXT:    retq
229   %3 = lshr i32 %0, %1
230   %4 = and i32 %3, 1
231   %5 = xor i32 %4, 1
232   ret i32 %5
235 define i32 @t11(i32 %0, i32 %1) {
236 ; X86-LABEL: t11:
237 ; X86:       ## %bb.0:
238 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
239 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
240 ; X86-NEXT:    xorl %eax, %eax
241 ; X86-NEXT:    btl %edx, %ecx
242 ; X86-NEXT:    setae %al
243 ; X86-NEXT:    retl
245 ; X64-LABEL: t11:
246 ; X64:       ## %bb.0:
247 ; X64-NEXT:    xorl %eax, %eax
248 ; X64-NEXT:    btl %esi, %edi
249 ; X64-NEXT:    setae %al
250 ; X64-NEXT:    retq
251   %3 = xor i32 %0, -1
252   %4 = lshr i32 %3, %1
253   %5 = and i32 %4, 1
254   ret i32 %5
257 define i32 @t12(i32 %0, i32 %1) {
258 ; X86-LABEL: t12:
259 ; X86:       ## %bb.0:
260 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
261 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
262 ; X86-NEXT:    xorl %eax, %eax
263 ; X86-NEXT:    btl %edx, %ecx
264 ; X86-NEXT:    setb %al
265 ; X86-NEXT:    retl
267 ; X64-LABEL: t12:
268 ; X64:       ## %bb.0:
269 ; X64-NEXT:    xorl %eax, %eax
270 ; X64-NEXT:    btl %esi, %edi
271 ; X64-NEXT:    setb %al
272 ; X64-NEXT:    retq
273   %3 = xor i32 %0, -1
274   %4 = lshr i32 %3, %1
275   %5 = and i32 %4, 1
276   %6 = xor i32 %5, 1
277   ret i32 %6
280 define i16 @shift_and(i16 %a) {
281 ; X86-LABEL: shift_and:
282 ; X86:       ## %bb.0:
283 ; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
284 ; X86-NEXT:    andb $4, %al
285 ; X86-NEXT:    shrb $2, %al
286 ; X86-NEXT:    movzbl %al, %eax
287 ; X86-NEXT:    ## kill: def $ax killed $ax killed $eax
288 ; X86-NEXT:    retl
290 ; X64-NOTBM-LABEL: shift_and:
291 ; X64-NOTBM:       ## %bb.0:
292 ; X64-NOTBM-NEXT:    movl %edi, %eax
293 ; X64-NOTBM-NEXT:    shrl $10, %eax
294 ; X64-NOTBM-NEXT:    andl $1, %eax
295 ; X64-NOTBM-NEXT:    ## kill: def $ax killed $ax killed $eax
296 ; X64-NOTBM-NEXT:    retq
298 ; X64-TBM-LABEL: shift_and:
299 ; X64-TBM:       ## %bb.0:
300 ; X64-TBM-NEXT:    bextrl $266, %edi, %eax ## imm = 0x10A
301 ; X64-TBM-NEXT:    ## kill: def $ax killed $ax killed $eax
302 ; X64-TBM-NEXT:    retq
303   %and = and i16 %a, 1024
304   %cmp = icmp ne i16 %and, 0
305   %conv = zext i1 %cmp to i16
306   ret i16 %conv
309 define i32 @PR55138(i32 %x) {
310 ; X86-LABEL: PR55138:
311 ; X86:       ## %bb.0:
312 ; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
313 ; X86-NEXT:    andl $15, %ecx
314 ; X86-NEXT:    movl $27030, %edx ## imm = 0x6996
315 ; X86-NEXT:    xorl %eax, %eax
316 ; X86-NEXT:    btl %ecx, %edx
317 ; X86-NEXT:    setb %al
318 ; X86-NEXT:    retl
320 ; X64-NOBMI2-LABEL: PR55138:
321 ; X64-NOBMI2:       ## %bb.0:
322 ; X64-NOBMI2-NEXT:    andl $15, %edi
323 ; X64-NOBMI2-NEXT:    movl $27030, %ecx ## imm = 0x6996
324 ; X64-NOBMI2-NEXT:    xorl %eax, %eax
325 ; X64-NOBMI2-NEXT:    btl %edi, %ecx
326 ; X64-NOBMI2-NEXT:    setb %al
327 ; X64-NOBMI2-NEXT:    retq
329 ; X64-BMI2-LABEL: PR55138:
330 ; X64-BMI2:       ## %bb.0:
331 ; X64-BMI2-NEXT:    andb $15, %dil
332 ; X64-BMI2-NEXT:    movl $27030, %eax ## imm = 0x6996
333 ; X64-BMI2-NEXT:    shrxl %edi, %eax, %eax
334 ; X64-BMI2-NEXT:    andl $1, %eax
335 ; X64-BMI2-NEXT:    retq
336   %urem = and i32 %x, 15
337   %shr = lshr i32 27030, %urem
338   %and = and i32 %shr, 1
339   ret i32 %and
342 define i64 @pr63055(double %arg) {
343 ; X86-LABEL: pr63055:
344 ; X86:       ## %bb.0:
345 ; X86-NEXT:    movl $1, %eax
346 ; X86-NEXT:    xorl %edx, %edx
347 ; X86-NEXT:    retl
349 ; X64-LABEL: pr63055:
350 ; X64:       ## %bb.0:
351 ; X64-NEXT:    movl $1, %eax
352 ; X64-NEXT:    retq
353   %fcmp = fcmp une double 0x7FF8000000000000, %arg
354   %ext = zext i1 %fcmp to i64
355   ret i64 %ext