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
4
5define 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
13;
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
20entry:
21	%div = udiv i16 %x, 33
22	ret i16 %div
23}
24
25define 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
33;
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
40entry:
41  %div = udiv i16 %c, 3
42  ret i16 %div
43
44}
45
46define 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:    andl $65024, %eax # imm = 0xFE00
52; X32-NEXT:    shrl $9, %eax
53; X32-NEXT:    # kill: %AL<def> %AL<kill> %EAX<kill>
54; X32-NEXT:    retl
55;
56; X64-LABEL: test3:
57; X64:       # BB#0: # %entry
58; X64-NEXT:    imull $171, %esi, %eax
59; X64-NEXT:    andl $65024, %eax # imm = 0xFE00
60; X64-NEXT:    shrl $9, %eax
61; X64-NEXT:    # kill: %AL<def> %AL<kill> %EAX<kill>
62; X64-NEXT:    retq
63entry:
64  %div = udiv i8 %c, 3
65  ret i8 %div
66}
67
68define 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
79;
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
89entry:
90	%div = sdiv i16 %x, 33		; <i32> [#uses=1]
91	ret i16 %div
92}
93
94define 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
102;
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
112}
113
114define 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
125;
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
135entry:
136  %div = sdiv i16 %x, 10
137  ret i16 %div
138}
139
140define 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
149;
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
160}
161
162; PR13326
163define 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:    andl $24576, %eax # imm = 0x6000
171; X32-NEXT:    shrl $13, %eax
172; X32-NEXT:    # kill: %AL<def> %AL<kill> %EAX<kill>
173; X32-NEXT:    retl
174;
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:    andl $24576, %eax # imm = 0x6000
181; X64-NEXT:    shrl $13, %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
186}
187
188define 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:    andl $6144, %eax # imm = 0x1800
196; X32-NEXT:    shrl $11, %eax
197; X32-NEXT:    # kill: %AL<def> %AL<kill> %EAX<kill>
198; X32-NEXT:    retl
199;
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:    andl $6144, %eax # imm = 0x1800
206; X64-NEXT:    shrl $11, %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
211}
212
213define 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
222;
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
231entry:
232	%div = sdiv i32 %x, 32
233	ret i32 %div
234}
235
236define 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
245;
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
254entry:
255	%div = sdiv i32 %x, 33
256	ret i32 %div
257}
258
259define 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
265;
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
271entry:
272	%div = udiv i32 %x, 32
273	ret i32 %div
274}
275
276define 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
285;
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
294entry:
295	%div = udiv i32 %x, 33
296	ret i32 %div
297}
298
299define 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
316;
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
334entry:
335	%rem = urem i64 %x, 12345
336	%div = udiv i64 %rem, 7
337	ret i64 %div
338}
339