Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / udiv_fix.ll
blob5b1e0545502b8172e59aa0e3ef1b79316defedb7
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s --check-prefix=X64
3 ; RUN: llc < %s -mtriple=i686 -mattr=cmov | FileCheck %s --check-prefix=X86
5 declare  i4  @llvm.udiv.fix.i4   (i4,  i4,  i32)
6 declare  i15 @llvm.udiv.fix.i15  (i15, i15, i32)
7 declare  i16 @llvm.udiv.fix.i16  (i16, i16, i32)
8 declare  i18 @llvm.udiv.fix.i18  (i18, i18, i32)
9 declare  i64 @llvm.udiv.fix.i64  (i64, i64, i32)
10 declare  <4 x i32> @llvm.udiv.fix.v4i32(<4 x i32>, <4 x i32>, i32)
12 define i16 @func(i16 %x, i16 %y) nounwind {
13 ; X64-LABEL: func:
14 ; X64:       # %bb.0:
15 ; X64-NEXT:    movzwl %si, %ecx
16 ; X64-NEXT:    movzwl %di, %eax
17 ; X64-NEXT:    shll $7, %eax
18 ; X64-NEXT:    xorl %edx, %edx
19 ; X64-NEXT:    divl %ecx
20 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
21 ; X64-NEXT:    retq
23 ; X86-LABEL: func:
24 ; X86:       # %bb.0:
25 ; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
26 ; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
27 ; X86-NEXT:    shll $7, %eax
28 ; X86-NEXT:    xorl %edx, %edx
29 ; X86-NEXT:    divl %ecx
30 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
31 ; X86-NEXT:    retl
32   %tmp = call i16 @llvm.udiv.fix.i16(i16 %x, i16 %y, i32 7)
33   ret i16 %tmp
36 define i16 @func2(i8 %x, i8 %y) nounwind {
37 ; X64-LABEL: func2:
38 ; X64:       # %bb.0:
39 ; X64-NEXT:    movsbl %dil, %eax
40 ; X64-NEXT:    andl $32767, %eax # imm = 0x7FFF
41 ; X64-NEXT:    movsbl %sil, %ecx
42 ; X64-NEXT:    andl $32767, %ecx # imm = 0x7FFF
43 ; X64-NEXT:    shll $14, %eax
44 ; X64-NEXT:    xorl %edx, %edx
45 ; X64-NEXT:    divl %ecx
46 ; X64-NEXT:    addl %eax, %eax
47 ; X64-NEXT:    cwtl
48 ; X64-NEXT:    shrl %eax
49 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
50 ; X64-NEXT:    retq
52 ; X86-LABEL: func2:
53 ; X86:       # %bb.0:
54 ; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %ecx
55 ; X86-NEXT:    andl $32767, %ecx # imm = 0x7FFF
56 ; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax
57 ; X86-NEXT:    andl $32767, %eax # imm = 0x7FFF
58 ; X86-NEXT:    shll $14, %eax
59 ; X86-NEXT:    xorl %edx, %edx
60 ; X86-NEXT:    divl %ecx
61 ; X86-NEXT:    addl %eax, %eax
62 ; X86-NEXT:    cwtl
63 ; X86-NEXT:    shrl %eax
64 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
65 ; X86-NEXT:    retl
66   %x2 = sext i8 %x to i15
67   %y2 = sext i8 %y to i15
68   %tmp = call i15 @llvm.udiv.fix.i15(i15 %x2, i15 %y2, i32 14)
69   %tmp2 = sext i15 %tmp to i16
70   ret i16 %tmp2
73 define i16 @func3(i15 %x, i8 %y) nounwind {
74 ; X64-LABEL: func3:
75 ; X64:       # %bb.0:
76 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
77 ; X64-NEXT:    leal (%rdi,%rdi), %eax
78 ; X64-NEXT:    movzbl %sil, %ecx
79 ; X64-NEXT:    shll $4, %ecx
80 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
81 ; X64-NEXT:    xorl %edx, %edx
82 ; X64-NEXT:    divw %cx
83 ; X64-NEXT:    # kill: def $ax killed $ax def $eax
84 ; X64-NEXT:    addl %eax, %eax
85 ; X64-NEXT:    cwtl
86 ; X64-NEXT:    shrl %eax
87 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
88 ; X64-NEXT:    retq
90 ; X86-LABEL: func3:
91 ; X86:       # %bb.0:
92 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
93 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
94 ; X86-NEXT:    addl %eax, %eax
95 ; X86-NEXT:    movzbl %cl, %ecx
96 ; X86-NEXT:    shll $4, %ecx
97 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
98 ; X86-NEXT:    xorl %edx, %edx
99 ; X86-NEXT:    divw %cx
100 ; X86-NEXT:    # kill: def $ax killed $ax def $eax
101 ; X86-NEXT:    addl %eax, %eax
102 ; X86-NEXT:    cwtl
103 ; X86-NEXT:    shrl %eax
104 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
105 ; X86-NEXT:    retl
106   %y2 = sext i8 %y to i15
107   %y3 = shl i15 %y2, 7
108   %tmp = call i15 @llvm.udiv.fix.i15(i15 %x, i15 %y3, i32 4)
109   %tmp2 = sext i15 %tmp to i16
110   ret i16 %tmp2
113 define i4 @func4(i4 %x, i4 %y) nounwind {
114 ; X64-LABEL: func4:
115 ; X64:       # %bb.0:
116 ; X64-NEXT:    andb $15, %sil
117 ; X64-NEXT:    andb $15, %dil
118 ; X64-NEXT:    shlb $2, %dil
119 ; X64-NEXT:    movzbl %dil, %eax
120 ; X64-NEXT:    divb %sil
121 ; X64-NEXT:    retq
123 ; X86-LABEL: func4:
124 ; X86:       # %bb.0:
125 ; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
126 ; X86-NEXT:    andb $15, %cl
127 ; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
128 ; X86-NEXT:    andb $15, %al
129 ; X86-NEXT:    shlb $2, %al
130 ; X86-NEXT:    movzbl %al, %eax
131 ; X86-NEXT:    divb %cl
132 ; X86-NEXT:    retl
133   %tmp = call i4 @llvm.udiv.fix.i4(i4 %x, i4 %y, i32 2)
134   ret i4 %tmp
137 define i64 @func5(i64 %x, i64 %y) nounwind {
138 ; X64-LABEL: func5:
139 ; X64:       # %bb.0:
140 ; X64-NEXT:    pushq %rax
141 ; X64-NEXT:    movq %rsi, %rdx
142 ; X64-NEXT:    movq %rdi, %rsi
143 ; X64-NEXT:    shlq $31, %rdi
144 ; X64-NEXT:    shrq $33, %rsi
145 ; X64-NEXT:    xorl %ecx, %ecx
146 ; X64-NEXT:    callq __udivti3@PLT
147 ; X64-NEXT:    popq %rcx
148 ; X64-NEXT:    retq
150 ; X86-LABEL: func5:
151 ; X86:       # %bb.0:
152 ; X86-NEXT:    pushl %ebp
153 ; X86-NEXT:    movl %esp, %ebp
154 ; X86-NEXT:    pushl %esi
155 ; X86-NEXT:    andl $-16, %esp
156 ; X86-NEXT:    subl $32, %esp
157 ; X86-NEXT:    movl 8(%ebp), %eax
158 ; X86-NEXT:    movl 12(%ebp), %ecx
159 ; X86-NEXT:    movl %ecx, %edx
160 ; X86-NEXT:    shrl %edx
161 ; X86-NEXT:    shldl $31, %eax, %ecx
162 ; X86-NEXT:    shll $31, %eax
163 ; X86-NEXT:    movl %esp, %esi
164 ; X86-NEXT:    pushl $0
165 ; X86-NEXT:    pushl $0
166 ; X86-NEXT:    pushl 20(%ebp)
167 ; X86-NEXT:    pushl 16(%ebp)
168 ; X86-NEXT:    pushl $0
169 ; X86-NEXT:    pushl %edx
170 ; X86-NEXT:    pushl %ecx
171 ; X86-NEXT:    pushl %eax
172 ; X86-NEXT:    pushl %esi
173 ; X86-NEXT:    calll __udivti3
174 ; X86-NEXT:    addl $32, %esp
175 ; X86-NEXT:    movl (%esp), %eax
176 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
177 ; X86-NEXT:    leal -4(%ebp), %esp
178 ; X86-NEXT:    popl %esi
179 ; X86-NEXT:    popl %ebp
180 ; X86-NEXT:    retl
181   %tmp = call i64 @llvm.udiv.fix.i64(i64 %x, i64 %y, i32 31)
182   ret i64 %tmp
185 define i18 @func6(i16 %x, i16 %y) nounwind {
186 ; X64-LABEL: func6:
187 ; X64:       # %bb.0:
188 ; X64-NEXT:    movswl %di, %eax
189 ; X64-NEXT:    andl $262143, %eax # imm = 0x3FFFF
190 ; X64-NEXT:    movswl %si, %ecx
191 ; X64-NEXT:    andl $262143, %ecx # imm = 0x3FFFF
192 ; X64-NEXT:    shll $7, %eax
193 ; X64-NEXT:    xorl %edx, %edx
194 ; X64-NEXT:    divl %ecx
195 ; X64-NEXT:    retq
197 ; X86-LABEL: func6:
198 ; X86:       # %bb.0:
199 ; X86-NEXT:    movswl {{[0-9]+}}(%esp), %ecx
200 ; X86-NEXT:    andl $262143, %ecx # imm = 0x3FFFF
201 ; X86-NEXT:    movswl {{[0-9]+}}(%esp), %eax
202 ; X86-NEXT:    andl $262143, %eax # imm = 0x3FFFF
203 ; X86-NEXT:    shll $7, %eax
204 ; X86-NEXT:    xorl %edx, %edx
205 ; X86-NEXT:    divl %ecx
206 ; X86-NEXT:    retl
207   %x2 = sext i16 %x to i18
208   %y2 = sext i16 %y to i18
209   %tmp = call i18 @llvm.udiv.fix.i18(i18 %x2, i18 %y2, i32 7)
210   ret i18 %tmp
213 define i16 @func7(i16 %x, i16 %y) nounwind {
214 ; X64-LABEL: func7:
215 ; X64:       # %bb.0:
216 ; X64-NEXT:    movl %edi, %eax
217 ; X64-NEXT:    shll $16, %eax
218 ; X64-NEXT:    movzwl %si, %ecx
219 ; X64-NEXT:    xorl %edx, %edx
220 ; X64-NEXT:    divl %ecx
221 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
222 ; X64-NEXT:    retq
224 ; X86-LABEL: func7:
225 ; X86:       # %bb.0:
226 ; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
227 ; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
228 ; X86-NEXT:    shll $16, %eax
229 ; X86-NEXT:    xorl %edx, %edx
230 ; X86-NEXT:    divl %ecx
231 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
232 ; X86-NEXT:    retl
233   %tmp = call i16 @llvm.udiv.fix.i16(i16 %x, i16 %y, i32 16)
234   ret i16 %tmp
237 define <4 x i32> @vec(<4 x i32> %x, <4 x i32> %y) nounwind {
238 ; X64-LABEL: vec:
239 ; X64:       # %bb.0:
240 ; X64-NEXT:    pxor %xmm2, %xmm2
241 ; X64-NEXT:    movdqa %xmm1, %xmm3
242 ; X64-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm2[2],xmm3[3],xmm2[3]
243 ; X64-NEXT:    movq %xmm3, %rcx
244 ; X64-NEXT:    movdqa %xmm0, %xmm4
245 ; X64-NEXT:    punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm2[2],xmm4[3],xmm2[3]
246 ; X64-NEXT:    psllq $31, %xmm4
247 ; X64-NEXT:    movq %xmm4, %rax
248 ; X64-NEXT:    xorl %edx, %edx
249 ; X64-NEXT:    divq %rcx
250 ; X64-NEXT:    movq %rax, %xmm3
251 ; X64-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[2,3,2,3]
252 ; X64-NEXT:    movq %xmm4, %rax
253 ; X64-NEXT:    movdqa %xmm1, %xmm4
254 ; X64-NEXT:    psrldq {{.*#+}} xmm4 = xmm4[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
255 ; X64-NEXT:    movq %xmm4, %rcx
256 ; X64-NEXT:    xorl %edx, %edx
257 ; X64-NEXT:    divq %rcx
258 ; X64-NEXT:    movq %rax, %xmm4
259 ; X64-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm4[0]
260 ; X64-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
261 ; X64-NEXT:    psllq $31, %xmm0
262 ; X64-NEXT:    movq %xmm0, %rax
263 ; X64-NEXT:    movd %xmm1, %ecx
264 ; X64-NEXT:    xorl %edx, %edx
265 ; X64-NEXT:    divq %rcx
266 ; X64-NEXT:    movq %rax, %xmm2
267 ; X64-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
268 ; X64-NEXT:    movq %xmm0, %rax
269 ; X64-NEXT:    psrlq $32, %xmm1
270 ; X64-NEXT:    movq %xmm1, %rcx
271 ; X64-NEXT:    xorl %edx, %edx
272 ; X64-NEXT:    divq %rcx
273 ; X64-NEXT:    movq %rax, %xmm0
274 ; X64-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
275 ; X64-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]
276 ; X64-NEXT:    movaps %xmm2, %xmm0
277 ; X64-NEXT:    retq
279 ; X86-LABEL: vec:
280 ; X86:       # %bb.0:
281 ; X86-NEXT:    pushl %ebp
282 ; X86-NEXT:    pushl %ebx
283 ; X86-NEXT:    pushl %edi
284 ; X86-NEXT:    pushl %esi
285 ; X86-NEXT:    pushl %eax
286 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
287 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
288 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebp
289 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx
290 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
291 ; X86-NEXT:    movl %eax, %ecx
292 ; X86-NEXT:    shrl %ecx
293 ; X86-NEXT:    shll $31, %eax
294 ; X86-NEXT:    pushl $0
295 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
296 ; X86-NEXT:    pushl %ecx
297 ; X86-NEXT:    pushl %eax
298 ; X86-NEXT:    calll __udivdi3
299 ; X86-NEXT:    addl $16, %esp
300 ; X86-NEXT:    movl %eax, (%esp) # 4-byte Spill
301 ; X86-NEXT:    movl %ebx, %eax
302 ; X86-NEXT:    shrl %eax
303 ; X86-NEXT:    shll $31, %ebx
304 ; X86-NEXT:    pushl $0
305 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
306 ; X86-NEXT:    pushl %eax
307 ; X86-NEXT:    pushl %ebx
308 ; X86-NEXT:    calll __udivdi3
309 ; X86-NEXT:    addl $16, %esp
310 ; X86-NEXT:    movl %eax, %ebx
311 ; X86-NEXT:    movl %ebp, %eax
312 ; X86-NEXT:    shrl %eax
313 ; X86-NEXT:    shll $31, %ebp
314 ; X86-NEXT:    pushl $0
315 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
316 ; X86-NEXT:    pushl %eax
317 ; X86-NEXT:    pushl %ebp
318 ; X86-NEXT:    calll __udivdi3
319 ; X86-NEXT:    addl $16, %esp
320 ; X86-NEXT:    movl %eax, %ebp
321 ; X86-NEXT:    movl %edi, %eax
322 ; X86-NEXT:    shrl %eax
323 ; X86-NEXT:    shll $31, %edi
324 ; X86-NEXT:    pushl $0
325 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
326 ; X86-NEXT:    pushl %eax
327 ; X86-NEXT:    pushl %edi
328 ; X86-NEXT:    calll __udivdi3
329 ; X86-NEXT:    addl $16, %esp
330 ; X86-NEXT:    movl %eax, 12(%esi)
331 ; X86-NEXT:    movl %ebp, 8(%esi)
332 ; X86-NEXT:    movl %ebx, 4(%esi)
333 ; X86-NEXT:    movl (%esp), %eax # 4-byte Reload
334 ; X86-NEXT:    movl %eax, (%esi)
335 ; X86-NEXT:    movl %esi, %eax
336 ; X86-NEXT:    addl $4, %esp
337 ; X86-NEXT:    popl %esi
338 ; X86-NEXT:    popl %edi
339 ; X86-NEXT:    popl %ebx
340 ; X86-NEXT:    popl %ebp
341 ; X86-NEXT:    retl $4
342   %tmp = call <4 x i32> @llvm.udiv.fix.v4i32(<4 x i32> %x, <4 x i32> %y, i32 31)
343   ret <4 x i32> %tmp