[PowerPC] Recommit r314244 with refactoring and off by default
[llvm-core.git] / test / CodeGen / X86 / divide-by-constant.ll
blobcb95da1b87e7b7aa7c20a4c94c9f04e4669d5459
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-pc-linux-gnu | FileCheck %s --check-prefix=X32
3 ; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu | FileCheck %s --check-prefix=X64
5 define zeroext i16 @test1(i16 zeroext %x) nounwind {
6 ; X32-LABEL: test1:
7 ; X32:       # BB#0: # %entry
8 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
9 ; X32-NEXT:    imull $63551, %eax, %eax # imm = 0xF83F
10 ; X32-NEXT:    shrl $21, %eax
11 ; X32-NEXT:    # kill: %ax<def> %ax<kill> %eax<kill>
12 ; X32-NEXT:    retl
14 ; X64-LABEL: test1:
15 ; X64:       # BB#0: # %entry
16 ; X64-NEXT:    imull $63551, %edi, %eax # imm = 0xF83F
17 ; X64-NEXT:    shrl $21, %eax
18 ; X64-NEXT:    # kill: %ax<def> %ax<kill> %eax<kill>
19 ; X64-NEXT:    retq
20 entry:
21         %div = udiv i16 %x, 33
22         ret i16 %div
25 define zeroext i16 @test2(i8 signext %x, i16 zeroext %c) nounwind readnone ssp noredzone {
26 ; X32-LABEL: test2:
27 ; X32:       # BB#0: # %entry
28 ; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
29 ; X32-NEXT:    imull $43691, %eax, %eax # imm = 0xAAAB
30 ; X32-NEXT:    shrl $17, %eax
31 ; X32-NEXT:    # kill: %ax<def> %ax<kill> %eax<kill>
32 ; X32-NEXT:    retl
34 ; X64-LABEL: test2:
35 ; X64:       # BB#0: # %entry
36 ; X64-NEXT:    imull $43691, %esi, %eax # imm = 0xAAAB
37 ; X64-NEXT:    shrl $17, %eax
38 ; X64-NEXT:    # kill: %ax<def> %ax<kill> %eax<kill>
39 ; X64-NEXT:    retq
40 entry:
41   %div = udiv i16 %c, 3
42   ret i16 %div
46 define zeroext i8 @test3(i8 zeroext %x, i8 zeroext %c) nounwind readnone ssp noredzone {
47 ; X32-LABEL: test3:
48 ; X32:       # BB#0: # %entry
49 ; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
50 ; X32-NEXT:    imull $171, %eax, %eax
51 ; X32-NEXT:    shrl $9, %eax
52 ; X32-NEXT:    movzwl %ax, %eax
53 ; X32-NEXT:    # kill: %al<def> %al<kill> %eax<kill>
54 ; X32-NEXT:    retl
56 ; X64-LABEL: test3:
57 ; X64:       # BB#0: # %entry
58 ; X64-NEXT:    imull $171, %esi, %eax
59 ; X64-NEXT:    shrl $9, %eax
60 ; X64-NEXT:    movzwl %ax, %eax
61 ; X64-NEXT:    # kill: %al<def> %al<kill> %eax<kill>
62 ; X64-NEXT:    retq
63 entry:
64   %div = udiv i8 %c, 3
65   ret i8 %div
68 define signext i16 @test4(i16 signext %x) nounwind {
69 ; X32-LABEL: test4:
70 ; X32:       # BB#0: # %entry
71 ; X32-NEXT:    movswl {{[0-9]+}}(%esp), %eax
72 ; X32-NEXT:    imull $1986, %eax, %eax # imm = 0x7C2
73 ; X32-NEXT:    movl %eax, %ecx
74 ; X32-NEXT:    shrl $31, %ecx
75 ; X32-NEXT:    shrl $16, %eax
76 ; X32-NEXT:    addl %ecx, %eax
77 ; X32-NEXT:    # kill: %ax<def> %ax<kill> %eax<kill>
78 ; X32-NEXT:    retl
80 ; X64-LABEL: test4:
81 ; X64:       # BB#0: # %entry
82 ; X64-NEXT:    imull $1986, %edi, %eax # imm = 0x7C2
83 ; X64-NEXT:    movl %eax, %ecx
84 ; X64-NEXT:    shrl $31, %ecx
85 ; X64-NEXT:    shrl $16, %eax
86 ; X64-NEXT:    addl %ecx, %eax
87 ; X64-NEXT:    # kill: %ax<def> %ax<kill> %eax<kill>
88 ; X64-NEXT:    retq
89 entry:
90         %div = sdiv i16 %x, 33          ; <i32> [#uses=1]
91         ret i16 %div
94 define i32 @test5(i32 %A) nounwind {
95 ; X32-LABEL: test5:
96 ; X32:       # BB#0:
97 ; X32-NEXT:    movl $365384439, %eax # imm = 0x15C752F7
98 ; X32-NEXT:    mull {{[0-9]+}}(%esp)
99 ; X32-NEXT:    shrl $27, %edx
100 ; X32-NEXT:    movl %edx, %eax
101 ; X32-NEXT:    retl
103 ; X64-LABEL: test5:
104 ; X64:       # BB#0:
105 ; X64-NEXT:    movl %edi, %eax
106 ; X64-NEXT:    imulq $365384439, %rax, %rax # imm = 0x15C752F7
107 ; X64-NEXT:    shrq $59, %rax
108 ; X64-NEXT:    # kill: %eax<def> %eax<kill> %rax<kill>
109 ; X64-NEXT:    retq
110         %tmp1 = udiv i32 %A, 1577682821         ; <i32> [#uses=1]
111         ret i32 %tmp1
114 define signext i16 @test6(i16 signext %x) nounwind {
115 ; X32-LABEL: test6:
116 ; X32:       # BB#0: # %entry
117 ; X32-NEXT:    movswl {{[0-9]+}}(%esp), %eax
118 ; X32-NEXT:    imull $26215, %eax, %eax # imm = 0x6667
119 ; X32-NEXT:    movl %eax, %ecx
120 ; X32-NEXT:    shrl $31, %ecx
121 ; X32-NEXT:    sarl $18, %eax
122 ; X32-NEXT:    addl %ecx, %eax
123 ; X32-NEXT:    # kill: %ax<def> %ax<kill> %eax<kill>
124 ; X32-NEXT:    retl
126 ; X64-LABEL: test6:
127 ; X64:       # BB#0: # %entry
128 ; X64-NEXT:    imull $26215, %edi, %eax # imm = 0x6667
129 ; X64-NEXT:    movl %eax, %ecx
130 ; X64-NEXT:    shrl $31, %ecx
131 ; X64-NEXT:    sarl $18, %eax
132 ; X64-NEXT:    addl %ecx, %eax
133 ; X64-NEXT:    # kill: %ax<def> %ax<kill> %eax<kill>
134 ; X64-NEXT:    retq
135 entry:
136   %div = sdiv i16 %x, 10
137   ret i16 %div
140 define i32 @test7(i32 %x) nounwind {
141 ; X32-LABEL: test7:
142 ; X32:       # BB#0:
143 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
144 ; X32-NEXT:    shrl $2, %eax
145 ; X32-NEXT:    movl $613566757, %ecx # imm = 0x24924925
146 ; X32-NEXT:    mull %ecx
147 ; X32-NEXT:    movl %edx, %eax
148 ; X32-NEXT:    retl
150 ; X64-LABEL: test7:
151 ; X64:       # BB#0:
152 ; X64-NEXT:    # kill: %edi<def> %edi<kill> %rdi<def>
153 ; X64-NEXT:    shrl $2, %edi
154 ; X64-NEXT:    imulq $613566757, %rdi, %rax # imm = 0x24924925
155 ; X64-NEXT:    shrq $32, %rax
156 ; X64-NEXT:    # kill: %eax<def> %eax<kill> %rax<kill>
157 ; X64-NEXT:    retq
158   %div = udiv i32 %x, 28
159   ret i32 %div
162 ; PR13326
163 define i8 @test8(i8 %x) nounwind {
164 ; X32-LABEL: test8:
165 ; X32:       # BB#0:
166 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
167 ; X32-NEXT:    shrb %al
168 ; X32-NEXT:    movzbl %al, %eax
169 ; X32-NEXT:    imull $211, %eax, %eax
170 ; X32-NEXT:    shrl $13, %eax
171 ; X32-NEXT:    movzwl %ax, %eax
172 ; X32-NEXT:    # kill: %al<def> %al<kill> %eax<kill>
173 ; X32-NEXT:    retl
175 ; X64-LABEL: test8:
176 ; X64:       # BB#0:
177 ; X64-NEXT:    shrb %dil
178 ; X64-NEXT:    movzbl %dil, %eax
179 ; X64-NEXT:    imull $211, %eax, %eax
180 ; X64-NEXT:    shrl $13, %eax
181 ; X64-NEXT:    movzwl %ax, %eax
182 ; X64-NEXT:    # kill: %al<def> %al<kill> %eax<kill>
183 ; X64-NEXT:    retq
184   %div = udiv i8 %x, 78
185   ret i8 %div
188 define i8 @test9(i8 %x) nounwind {
189 ; X32-LABEL: test9:
190 ; X32:       # BB#0:
191 ; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
192 ; X32-NEXT:    shrb $2, %al
193 ; X32-NEXT:    movzbl %al, %eax
194 ; X32-NEXT:    imull $71, %eax, %eax
195 ; X32-NEXT:    shrl $11, %eax
196 ; X32-NEXT:    movzwl %ax, %eax
197 ; X32-NEXT:    # kill: %al<def> %al<kill> %eax<kill>
198 ; X32-NEXT:    retl
200 ; X64-LABEL: test9:
201 ; X64:       # BB#0:
202 ; X64-NEXT:    shrb $2, %dil
203 ; X64-NEXT:    movzbl %dil, %eax
204 ; X64-NEXT:    imull $71, %eax, %eax
205 ; X64-NEXT:    shrl $11, %eax
206 ; X64-NEXT:    movzwl %ax, %eax
207 ; X64-NEXT:    # kill: %al<def> %al<kill> %eax<kill>
208 ; X64-NEXT:    retq
209   %div = udiv i8 %x, 116
210   ret i8 %div
213 define i32 @testsize1(i32 %x) minsize nounwind {
214 ; X32-LABEL: testsize1:
215 ; X32:       # BB#0: # %entry
216 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
217 ; X32-NEXT:    pushl $32
218 ; X32-NEXT:    popl %ecx
219 ; X32-NEXT:    cltd
220 ; X32-NEXT:    idivl %ecx
221 ; X32-NEXT:    retl
223 ; X64-LABEL: testsize1:
224 ; X64:       # BB#0: # %entry
225 ; X64-NEXT:    pushq $32
226 ; X64-NEXT:    popq %rcx
227 ; X64-NEXT:    movl %edi, %eax
228 ; X64-NEXT:    cltd
229 ; X64-NEXT:    idivl %ecx
230 ; X64-NEXT:    retq
231 entry:
232         %div = sdiv i32 %x, 32
233         ret i32 %div
236 define i32 @testsize2(i32 %x) minsize nounwind {
237 ; X32-LABEL: testsize2:
238 ; X32:       # BB#0: # %entry
239 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
240 ; X32-NEXT:    pushl $33
241 ; X32-NEXT:    popl %ecx
242 ; X32-NEXT:    cltd
243 ; X32-NEXT:    idivl %ecx
244 ; X32-NEXT:    retl
246 ; X64-LABEL: testsize2:
247 ; X64:       # BB#0: # %entry
248 ; X64-NEXT:    pushq $33
249 ; X64-NEXT:    popq %rcx
250 ; X64-NEXT:    movl %edi, %eax
251 ; X64-NEXT:    cltd
252 ; X64-NEXT:    idivl %ecx
253 ; X64-NEXT:    retq
254 entry:
255         %div = sdiv i32 %x, 33
256         ret i32 %div
259 define i32 @testsize3(i32 %x) minsize nounwind {
260 ; X32-LABEL: testsize3:
261 ; X32:       # BB#0: # %entry
262 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
263 ; X32-NEXT:    shrl $5, %eax
264 ; X32-NEXT:    retl
266 ; X64-LABEL: testsize3:
267 ; X64:       # BB#0: # %entry
268 ; X64-NEXT:    shrl $5, %edi
269 ; X64-NEXT:    movl %edi, %eax
270 ; X64-NEXT:    retq
271 entry:
272         %div = udiv i32 %x, 32
273         ret i32 %div
276 define i32 @testsize4(i32 %x) minsize nounwind {
277 ; X32-LABEL: testsize4:
278 ; X32:       # BB#0: # %entry
279 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
280 ; X32-NEXT:    pushl $33
281 ; X32-NEXT:    popl %ecx
282 ; X32-NEXT:    xorl %edx, %edx
283 ; X32-NEXT:    divl %ecx
284 ; X32-NEXT:    retl
286 ; X64-LABEL: testsize4:
287 ; X64:       # BB#0: # %entry
288 ; X64-NEXT:    pushq $33
289 ; X64-NEXT:    popq %rcx
290 ; X64-NEXT:    xorl %edx, %edx
291 ; X64-NEXT:    movl %edi, %eax
292 ; X64-NEXT:    divl %ecx
293 ; X64-NEXT:    retq
294 entry:
295         %div = udiv i32 %x, 33
296         ret i32 %div
299 define i64 @PR23590(i64 %x) nounwind {
300 ; X32-LABEL: PR23590:
301 ; X32:       # BB#0: # %entry
302 ; X32-NEXT:    subl $12, %esp
303 ; X32-NEXT:    pushl $0
304 ; X32-NEXT:    pushl $12345 # imm = 0x3039
305 ; X32-NEXT:    pushl {{[0-9]+}}(%esp)
306 ; X32-NEXT:    pushl {{[0-9]+}}(%esp)
307 ; X32-NEXT:    calll __umoddi3
308 ; X32-NEXT:    addl $16, %esp
309 ; X32-NEXT:    pushl $0
310 ; X32-NEXT:    pushl $7
311 ; X32-NEXT:    pushl %edx
312 ; X32-NEXT:    pushl %eax
313 ; X32-NEXT:    calll __udivdi3
314 ; X32-NEXT:    addl $28, %esp
315 ; X32-NEXT:    retl
317 ; X64-LABEL: PR23590:
318 ; X64:       # BB#0: # %entry
319 ; X64-NEXT:    movq %rdi, %rcx
320 ; X64-NEXT:    movabsq $6120523590596543007, %rdx # imm = 0x54F077C718E7C21F
321 ; X64-NEXT:    movq %rcx, %rax
322 ; X64-NEXT:    mulq %rdx
323 ; X64-NEXT:    shrq $12, %rdx
324 ; X64-NEXT:    imulq $12345, %rdx, %rax # imm = 0x3039
325 ; X64-NEXT:    subq %rax, %rcx
326 ; X64-NEXT:    movabsq $2635249153387078803, %rdx # imm = 0x2492492492492493
327 ; X64-NEXT:    movq %rcx, %rax
328 ; X64-NEXT:    mulq %rdx
329 ; X64-NEXT:    subq %rdx, %rcx
330 ; X64-NEXT:    shrq %rcx
331 ; X64-NEXT:    leaq (%rcx,%rdx), %rax
332 ; X64-NEXT:    shrq $2, %rax
333 ; X64-NEXT:    retq
334 entry:
335         %rem = urem i64 %x, 12345
336         %div = udiv i64 %rem, 7
337         ret i64 %div