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 {
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>
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>
21 %div = udiv i16 %x, 33
25 define zeroext i16 @test2(i8 signext %x, i16 zeroext %c) nounwind readnone ssp noredzone {
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>
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>
46 define zeroext i8 @test3(i8 zeroext %x, i8 zeroext %c) nounwind readnone ssp noredzone {
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>
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>
68 define signext i16 @test4(i16 signext %x) nounwind {
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>
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>
90 %div = sdiv i16 %x, 33 ; <i32> [#uses=1]
94 define i32 @test5(i32 %A) nounwind {
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
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>
110 %tmp1 = udiv i32 %A, 1577682821 ; <i32> [#uses=1]
114 define signext i16 @test6(i16 signext %x) nounwind {
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>
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>
136 %div = sdiv i16 %x, 10
140 define i32 @test7(i32 %x) nounwind {
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
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>
158 %div = udiv i32 %x, 28
163 define i8 @test8(i8 %x) nounwind {
166 ; X32-NEXT: movb {{[0-9]+}}(%esp), %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>
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>
184 %div = udiv i8 %x, 78
188 define i8 @test9(i8 %x) nounwind {
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>
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>
209 %div = udiv i8 %x, 116
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
220 ; X32-NEXT: idivl %ecx
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
229 ; X64-NEXT: idivl %ecx
232 %div = sdiv i32 %x, 32
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
243 ; X32-NEXT: idivl %ecx
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
252 ; X64-NEXT: idivl %ecx
255 %div = sdiv i32 %x, 33
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
266 ; X64-LABEL: testsize3:
267 ; X64: # BB#0: # %entry
268 ; X64-NEXT: shrl $5, %edi
269 ; X64-NEXT: movl %edi, %eax
272 %div = udiv i32 %x, 32
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
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
295 %div = udiv i32 %x, 33
299 define i64 @PR23590(i64 %x) nounwind {
300 ; X32-LABEL: PR23590:
301 ; X32: # BB#0: # %entry
302 ; X32-NEXT: subl $12, %esp
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
311 ; X32-NEXT: pushl %edx
312 ; X32-NEXT: pushl %eax
313 ; X32-NEXT: calll __udivdi3
314 ; X32-NEXT: addl $28, %esp
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
335 %rem = urem i64 %x, 12345
336 %div = udiv i64 %rem, 7