Use Align for TFL::TransientStackAlignment
[llvm-core.git] / test / CodeGen / X86 / urem-seteq.ll
blob1a16cf99b317124f6c41db2148bfc9c8fb1323bb
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=i686-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,X86
3 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,X64
5 ;------------------------------------------------------------------------------;
6 ; Odd divisors
7 ;------------------------------------------------------------------------------;
9 define i32 @test_urem_odd(i32 %X) nounwind {
10 ; X86-LABEL: test_urem_odd:
11 ; X86:       # %bb.0:
12 ; X86-NEXT:    imull $-858993459, {{[0-9]+}}(%esp), %ecx # imm = 0xCCCCCCCD
13 ; X86-NEXT:    xorl %eax, %eax
14 ; X86-NEXT:    cmpl $858993460, %ecx # imm = 0x33333334
15 ; X86-NEXT:    setb %al
16 ; X86-NEXT:    retl
18 ; X64-LABEL: test_urem_odd:
19 ; X64:       # %bb.0:
20 ; X64-NEXT:    imull $-858993459, %edi, %ecx # imm = 0xCCCCCCCD
21 ; X64-NEXT:    xorl %eax, %eax
22 ; X64-NEXT:    cmpl $858993460, %ecx # imm = 0x33333334
23 ; X64-NEXT:    setb %al
24 ; X64-NEXT:    retq
25   %urem = urem i32 %X, 5
26   %cmp = icmp eq i32 %urem, 0
27   %ret = zext i1 %cmp to i32
28   ret i32 %ret
31 define i32 @test_urem_odd_25(i32 %X) nounwind {
32 ; X86-LABEL: test_urem_odd_25:
33 ; X86:       # %bb.0:
34 ; X86-NEXT:    imull $-1030792151, {{[0-9]+}}(%esp), %ecx # imm = 0xC28F5C29
35 ; X86-NEXT:    xorl %eax, %eax
36 ; X86-NEXT:    cmpl $171798692, %ecx # imm = 0xA3D70A4
37 ; X86-NEXT:    setb %al
38 ; X86-NEXT:    retl
40 ; X64-LABEL: test_urem_odd_25:
41 ; X64:       # %bb.0:
42 ; X64-NEXT:    imull $-1030792151, %edi, %ecx # imm = 0xC28F5C29
43 ; X64-NEXT:    xorl %eax, %eax
44 ; X64-NEXT:    cmpl $171798692, %ecx # imm = 0xA3D70A4
45 ; X64-NEXT:    setb %al
46 ; X64-NEXT:    retq
47   %urem = urem i32 %X, 25
48   %cmp = icmp eq i32 %urem, 0
49   %ret = zext i1 %cmp to i32
50   ret i32 %ret
53 ; This is like test_urem_odd, except the divisor has bit 30 set.
54 define i32 @test_urem_odd_bit30(i32 %X) nounwind {
55 ; X86-LABEL: test_urem_odd_bit30:
56 ; X86:       # %bb.0:
57 ; X86-NEXT:    imull $1789569707, {{[0-9]+}}(%esp), %ecx # imm = 0x6AAAAAAB
58 ; X86-NEXT:    xorl %eax, %eax
59 ; X86-NEXT:    cmpl $4, %ecx
60 ; X86-NEXT:    setb %al
61 ; X86-NEXT:    retl
63 ; X64-LABEL: test_urem_odd_bit30:
64 ; X64:       # %bb.0:
65 ; X64-NEXT:    imull $1789569707, %edi, %ecx # imm = 0x6AAAAAAB
66 ; X64-NEXT:    xorl %eax, %eax
67 ; X64-NEXT:    cmpl $4, %ecx
68 ; X64-NEXT:    setb %al
69 ; X64-NEXT:    retq
70   %urem = urem i32 %X, 1073741827
71   %cmp = icmp eq i32 %urem, 0
72   %ret = zext i1 %cmp to i32
73   ret i32 %ret
76 ; This is like test_urem_odd, except the divisor has bit 31 set.
77 define i32 @test_urem_odd_bit31(i32 %X) nounwind {
78 ; X86-LABEL: test_urem_odd_bit31:
79 ; X86:       # %bb.0:
80 ; X86-NEXT:    imull $715827883, {{[0-9]+}}(%esp), %ecx # imm = 0x2AAAAAAB
81 ; X86-NEXT:    xorl %eax, %eax
82 ; X86-NEXT:    cmpl $2, %ecx
83 ; X86-NEXT:    setb %al
84 ; X86-NEXT:    retl
86 ; X64-LABEL: test_urem_odd_bit31:
87 ; X64:       # %bb.0:
88 ; X64-NEXT:    imull $715827883, %edi, %ecx # imm = 0x2AAAAAAB
89 ; X64-NEXT:    xorl %eax, %eax
90 ; X64-NEXT:    cmpl $2, %ecx
91 ; X64-NEXT:    setb %al
92 ; X64-NEXT:    retq
93   %urem = urem i32 %X, 2147483651
94   %cmp = icmp eq i32 %urem, 0
95   %ret = zext i1 %cmp to i32
96   ret i32 %ret
99 ;------------------------------------------------------------------------------;
100 ; Even divisors
101 ;------------------------------------------------------------------------------;
103 define i16 @test_urem_even(i16 %X) nounwind {
104 ; X86-LABEL: test_urem_even:
105 ; X86:       # %bb.0:
106 ; X86-NEXT:    imull $28087, {{[0-9]+}}(%esp), %eax # imm = 0x6DB7
107 ; X86-NEXT:    rorw %ax
108 ; X86-NEXT:    movzwl %ax, %ecx
109 ; X86-NEXT:    xorl %eax, %eax
110 ; X86-NEXT:    cmpl $4681, %ecx # imm = 0x1249
111 ; X86-NEXT:    seta %al
112 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
113 ; X86-NEXT:    retl
115 ; X64-LABEL: test_urem_even:
116 ; X64:       # %bb.0:
117 ; X64-NEXT:    imull $28087, %edi, %eax # imm = 0x6DB7
118 ; X64-NEXT:    rorw %ax
119 ; X64-NEXT:    movzwl %ax, %ecx
120 ; X64-NEXT:    xorl %eax, %eax
121 ; X64-NEXT:    cmpl $4681, %ecx # imm = 0x1249
122 ; X64-NEXT:    seta %al
123 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
124 ; X64-NEXT:    retq
125   %urem = urem i16 %X, 14
126   %cmp = icmp ne i16 %urem, 0
127   %ret = zext i1 %cmp to i16
128   ret i16 %ret
131 define i32 @test_urem_even_100(i32 %X) nounwind {
132 ; X86-LABEL: test_urem_even_100:
133 ; X86:       # %bb.0:
134 ; X86-NEXT:    imull $-1030792151, {{[0-9]+}}(%esp), %ecx # imm = 0xC28F5C29
135 ; X86-NEXT:    rorl $2, %ecx
136 ; X86-NEXT:    xorl %eax, %eax
137 ; X86-NEXT:    cmpl $42949673, %ecx # imm = 0x28F5C29
138 ; X86-NEXT:    setb %al
139 ; X86-NEXT:    retl
141 ; X64-LABEL: test_urem_even_100:
142 ; X64:       # %bb.0:
143 ; X64-NEXT:    imull $-1030792151, %edi, %ecx # imm = 0xC28F5C29
144 ; X64-NEXT:    rorl $2, %ecx
145 ; X64-NEXT:    xorl %eax, %eax
146 ; X64-NEXT:    cmpl $42949673, %ecx # imm = 0x28F5C29
147 ; X64-NEXT:    setb %al
148 ; X64-NEXT:    retq
149   %urem = urem i32 %X, 100
150   %cmp = icmp eq i32 %urem, 0
151   %ret = zext i1 %cmp to i32
152   ret i32 %ret
155 ; This is like test_urem_even, except the divisor has bit 30 set.
156 define i32 @test_urem_even_bit30(i32 %X) nounwind {
157 ; X86-LABEL: test_urem_even_bit30:
158 ; X86:       # %bb.0:
159 ; X86-NEXT:    imull $-51622203, {{[0-9]+}}(%esp), %ecx # imm = 0xFCEC4EC5
160 ; X86-NEXT:    rorl $3, %ecx
161 ; X86-NEXT:    xorl %eax, %eax
162 ; X86-NEXT:    cmpl $4, %ecx
163 ; X86-NEXT:    setb %al
164 ; X86-NEXT:    retl
166 ; X64-LABEL: test_urem_even_bit30:
167 ; X64:       # %bb.0:
168 ; X64-NEXT:    imull $-51622203, %edi, %ecx # imm = 0xFCEC4EC5
169 ; X64-NEXT:    rorl $3, %ecx
170 ; X64-NEXT:    xorl %eax, %eax
171 ; X64-NEXT:    cmpl $4, %ecx
172 ; X64-NEXT:    setb %al
173 ; X64-NEXT:    retq
174   %urem = urem i32 %X, 1073741928
175   %cmp = icmp eq i32 %urem, 0
176   %ret = zext i1 %cmp to i32
177   ret i32 %ret
180 ; This is like test_urem_odd, except the divisor has bit 31 set.
181 define i32 @test_urem_even_bit31(i32 %X) nounwind {
182 ; X86-LABEL: test_urem_even_bit31:
183 ; X86:       # %bb.0:
184 ; X86-NEXT:    imull $-1157956869, {{[0-9]+}}(%esp), %ecx # imm = 0xBAFAFAFB
185 ; X86-NEXT:    rorl %ecx
186 ; X86-NEXT:    xorl %eax, %eax
187 ; X86-NEXT:    cmpl $2, %ecx
188 ; X86-NEXT:    setb %al
189 ; X86-NEXT:    retl
191 ; X64-LABEL: test_urem_even_bit31:
192 ; X64:       # %bb.0:
193 ; X64-NEXT:    imull $-1157956869, %edi, %ecx # imm = 0xBAFAFAFB
194 ; X64-NEXT:    rorl %ecx
195 ; X64-NEXT:    xorl %eax, %eax
196 ; X64-NEXT:    cmpl $2, %ecx
197 ; X64-NEXT:    setb %al
198 ; X64-NEXT:    retq
199   %urem = urem i32 %X, 2147483750
200   %cmp = icmp eq i32 %urem, 0
201   %ret = zext i1 %cmp to i32
202   ret i32 %ret
205 ;------------------------------------------------------------------------------;
206 ; Special case
207 ;------------------------------------------------------------------------------;
209 ; 'NE' predicate is fine too.
210 define i32 @test_urem_odd_setne(i32 %X) nounwind {
211 ; X86-LABEL: test_urem_odd_setne:
212 ; X86:       # %bb.0:
213 ; X86-NEXT:    imull $-858993459, {{[0-9]+}}(%esp), %ecx # imm = 0xCCCCCCCD
214 ; X86-NEXT:    xorl %eax, %eax
215 ; X86-NEXT:    cmpl $858993459, %ecx # imm = 0x33333333
216 ; X86-NEXT:    seta %al
217 ; X86-NEXT:    retl
219 ; X64-LABEL: test_urem_odd_setne:
220 ; X64:       # %bb.0:
221 ; X64-NEXT:    imull $-858993459, %edi, %ecx # imm = 0xCCCCCCCD
222 ; X64-NEXT:    xorl %eax, %eax
223 ; X64-NEXT:    cmpl $858993459, %ecx # imm = 0x33333333
224 ; X64-NEXT:    seta %al
225 ; X64-NEXT:    retq
226   %urem = urem i32 %X, 5
227   %cmp = icmp ne i32 %urem, 0
228   %ret = zext i1 %cmp to i32
229   ret i32 %ret
232 ; The fold is only valid for positive divisors, negative-ones should be negated.
233 define i32 @test_urem_negative_odd(i32 %X) nounwind {
234 ; X86-LABEL: test_urem_negative_odd:
235 ; X86:       # %bb.0:
236 ; X86-NEXT:    imull $858993459, {{[0-9]+}}(%esp), %ecx # imm = 0x33333333
237 ; X86-NEXT:    xorl %eax, %eax
238 ; X86-NEXT:    cmpl $1, %ecx
239 ; X86-NEXT:    seta %al
240 ; X86-NEXT:    retl
242 ; X64-LABEL: test_urem_negative_odd:
243 ; X64:       # %bb.0:
244 ; X64-NEXT:    imull $858993459, %edi, %ecx # imm = 0x33333333
245 ; X64-NEXT:    xorl %eax, %eax
246 ; X64-NEXT:    cmpl $1, %ecx
247 ; X64-NEXT:    seta %al
248 ; X64-NEXT:    retq
249   %urem = urem i32 %X, -5
250   %cmp = icmp ne i32 %urem, 0
251   %ret = zext i1 %cmp to i32
252   ret i32 %ret
254 define i32 @test_urem_negative_even(i32 %X) nounwind {
255 ; X86-LABEL: test_urem_negative_even:
256 ; X86:       # %bb.0:
257 ; X86-NEXT:    imull $-920350135, {{[0-9]+}}(%esp), %ecx # imm = 0xC9249249
258 ; X86-NEXT:    rorl %ecx
259 ; X86-NEXT:    xorl %eax, %eax
260 ; X86-NEXT:    cmpl $1, %ecx
261 ; X86-NEXT:    seta %al
262 ; X86-NEXT:    retl
264 ; X64-LABEL: test_urem_negative_even:
265 ; X64:       # %bb.0:
266 ; X64-NEXT:    imull $-920350135, %edi, %ecx # imm = 0xC9249249
267 ; X64-NEXT:    rorl %ecx
268 ; X64-NEXT:    xorl %eax, %eax
269 ; X64-NEXT:    cmpl $1, %ecx
270 ; X64-NEXT:    seta %al
271 ; X64-NEXT:    retq
272   %urem = urem i32 %X, -14
273   %cmp = icmp ne i32 %urem, 0
274   %ret = zext i1 %cmp to i32
275   ret i32 %ret
278 ;------------------------------------------------------------------------------;
279 ; Negative tests
280 ;------------------------------------------------------------------------------;
282 ; We can lower remainder of division by one much better elsewhere.
283 define i32 @test_urem_one(i32 %X) nounwind {
284 ; CHECK-LABEL: test_urem_one:
285 ; CHECK:       # %bb.0:
286 ; CHECK-NEXT:    movl $1, %eax
287 ; CHECK-NEXT:    ret{{[l|q]}}
288   %urem = urem i32 %X, 1
289   %cmp = icmp eq i32 %urem, 0
290   %ret = zext i1 %cmp to i32
291   ret i32 %ret
294 ; We can lower remainder of division by powers of two much better elsewhere.
295 define i32 @test_urem_pow2(i32 %X) nounwind {
296 ; X86-LABEL: test_urem_pow2:
297 ; X86:       # %bb.0:
298 ; X86-NEXT:    xorl %eax, %eax
299 ; X86-NEXT:    testb $15, {{[0-9]+}}(%esp)
300 ; X86-NEXT:    sete %al
301 ; X86-NEXT:    retl
303 ; X64-LABEL: test_urem_pow2:
304 ; X64:       # %bb.0:
305 ; X64-NEXT:    xorl %eax, %eax
306 ; X64-NEXT:    testb $15, %dil
307 ; X64-NEXT:    sete %al
308 ; X64-NEXT:    retq
309   %urem = urem i32 %X, 16
310   %cmp = icmp eq i32 %urem, 0
311   %ret = zext i1 %cmp to i32
312   ret i32 %ret
315 ; The fold is only valid for positive divisors, and we can't negate INT_MIN.
316 define i32 @test_urem_int_min(i32 %X) nounwind {
317 ; X86-LABEL: test_urem_int_min:
318 ; X86:       # %bb.0:
319 ; X86-NEXT:    xorl %eax, %eax
320 ; X86-NEXT:    testl $2147483647, {{[0-9]+}}(%esp) # imm = 0x7FFFFFFF
321 ; X86-NEXT:    sete %al
322 ; X86-NEXT:    retl
324 ; X64-LABEL: test_urem_int_min:
325 ; X64:       # %bb.0:
326 ; X64-NEXT:    xorl %eax, %eax
327 ; X64-NEXT:    testl $2147483647, %edi # imm = 0x7FFFFFFF
328 ; X64-NEXT:    sete %al
329 ; X64-NEXT:    retq
330   %urem = urem i32 %X, 2147483648
331   %cmp = icmp eq i32 %urem, 0
332   %ret = zext i1 %cmp to i32
333   ret i32 %ret
336 ; We can lower remainder of division by all-ones much better elsewhere.
337 define i32 @test_urem_allones(i32 %X) nounwind {
338 ; X86-LABEL: test_urem_allones:
339 ; X86:       # %bb.0:
340 ; X86-NEXT:    xorl %ecx, %ecx
341 ; X86-NEXT:    subl {{[0-9]+}}(%esp), %ecx
342 ; X86-NEXT:    xorl %eax, %eax
343 ; X86-NEXT:    cmpl $2, %ecx
344 ; X86-NEXT:    setb %al
345 ; X86-NEXT:    retl
347 ; X64-LABEL: test_urem_allones:
348 ; X64:       # %bb.0:
349 ; X64-NEXT:    negl %edi
350 ; X64-NEXT:    xorl %eax, %eax
351 ; X64-NEXT:    cmpl $2, %edi
352 ; X64-NEXT:    setb %al
353 ; X64-NEXT:    retq
354   %urem = urem i32 %X, 4294967295
355   %cmp = icmp eq i32 %urem, 0
356   %ret = zext i1 %cmp to i32
357   ret i32 %ret