• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=i686-unknown | FileCheck %s --check-prefix=X32
3; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefix=X64
4
5define void @si64(i64 %x, i64 %y, i64* %p, i64* %q) nounwind {
6; X32-LABEL: si64:
7; X32:       # %bb.0:
8; X32-NEXT:    pushl %ebp
9; X32-NEXT:    pushl %ebx
10; X32-NEXT:    pushl %edi
11; X32-NEXT:    pushl %esi
12; X32-NEXT:    movl {{[0-9]+}}(%esp), %ebx
13; X32-NEXT:    movl {{[0-9]+}}(%esp), %ebp
14; X32-NEXT:    pushl %ebp
15; X32-NEXT:    pushl %ebx
16; X32-NEXT:    pushl {{[0-9]+}}(%esp)
17; X32-NEXT:    pushl {{[0-9]+}}(%esp)
18; X32-NEXT:    calll __divdi3
19; X32-NEXT:    addl $16, %esp
20; X32-NEXT:    movl %eax, %esi
21; X32-NEXT:    movl %edx, %edi
22; X32-NEXT:    pushl %ebp
23; X32-NEXT:    pushl %ebx
24; X32-NEXT:    pushl {{[0-9]+}}(%esp)
25; X32-NEXT:    pushl {{[0-9]+}}(%esp)
26; X32-NEXT:    calll __moddi3
27; X32-NEXT:    addl $16, %esp
28; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
29; X32-NEXT:    movl %edi, 4(%ecx)
30; X32-NEXT:    movl %esi, (%ecx)
31; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
32; X32-NEXT:    movl %edx, 4(%ecx)
33; X32-NEXT:    movl %eax, (%ecx)
34; X32-NEXT:    popl %esi
35; X32-NEXT:    popl %edi
36; X32-NEXT:    popl %ebx
37; X32-NEXT:    popl %ebp
38; X32-NEXT:    retl
39;
40; X64-LABEL: si64:
41; X64:       # %bb.0:
42; X64-NEXT:    movq %rdx, %r8
43; X64-NEXT:    movq %rdi, %rax
44; X64-NEXT:    cqto
45; X64-NEXT:    idivq %rsi
46; X64-NEXT:    movq %rax, (%r8)
47; X64-NEXT:    movq %rdx, (%rcx)
48; X64-NEXT:    retq
49	%r = sdiv i64 %x, %y
50	%t = srem i64 %x, %y
51	store i64 %r, i64* %p
52	store i64 %t, i64* %q
53	ret void
54}
55
56define void @si32(i32 %x, i32 %y, i32* %p, i32* %q) nounwind {
57; X32-LABEL: si32:
58; X32:       # %bb.0:
59; X32-NEXT:    pushl %esi
60; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
61; X32-NEXT:    movl {{[0-9]+}}(%esp), %esi
62; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
63; X32-NEXT:    cltd
64; X32-NEXT:    idivl {{[0-9]+}}(%esp)
65; X32-NEXT:    movl %eax, (%esi)
66; X32-NEXT:    movl %edx, (%ecx)
67; X32-NEXT:    popl %esi
68; X32-NEXT:    retl
69;
70; X64-LABEL: si32:
71; X64:       # %bb.0:
72; X64-NEXT:    movq %rdx, %r8
73; X64-NEXT:    movl %edi, %eax
74; X64-NEXT:    cltd
75; X64-NEXT:    idivl %esi
76; X64-NEXT:    movl %eax, (%r8)
77; X64-NEXT:    movl %edx, (%rcx)
78; X64-NEXT:    retq
79	%r = sdiv i32 %x, %y
80	%t = srem i32 %x, %y
81	store i32 %r, i32* %p
82	store i32 %t, i32* %q
83	ret void
84}
85
86define void @si16(i16 %x, i16 %y, i16* %p, i16* %q) nounwind {
87; X32-LABEL: si16:
88; X32:       # %bb.0:
89; X32-NEXT:    pushl %esi
90; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
91; X32-NEXT:    movl {{[0-9]+}}(%esp), %esi
92; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
93; X32-NEXT:    cwtd
94; X32-NEXT:    idivw {{[0-9]+}}(%esp)
95; X32-NEXT:    movw %ax, (%esi)
96; X32-NEXT:    movw %dx, (%ecx)
97; X32-NEXT:    popl %esi
98; X32-NEXT:    retl
99;
100; X64-LABEL: si16:
101; X64:       # %bb.0:
102; X64-NEXT:    movq %rdx, %r8
103; X64-NEXT:    movl %edi, %eax
104; X64-NEXT:    cwtd
105; X64-NEXT:    idivw %si
106; X64-NEXT:    movw %ax, (%r8)
107; X64-NEXT:    movw %dx, (%rcx)
108; X64-NEXT:    retq
109	%r = sdiv i16 %x, %y
110	%t = srem i16 %x, %y
111	store i16 %r, i16* %p
112	store i16 %t, i16* %q
113	ret void
114}
115
116define void @si8(i8 %x, i8 %y, i8* %p, i8* %q) nounwind {
117; X32-LABEL: si8:
118; X32:       # %bb.0:
119; X32-NEXT:    pushl %ebx
120; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
121; X32-NEXT:    movl {{[0-9]+}}(%esp), %edx
122; X32-NEXT:    movb {{[0-9]+}}(%esp), %al
123; X32-NEXT:    cbtw
124; X32-NEXT:    idivb {{[0-9]+}}(%esp)
125; X32-NEXT:    movsbl %ah, %ebx
126; X32-NEXT:    movb %al, (%edx)
127; X32-NEXT:    movb %bl, (%ecx)
128; X32-NEXT:    popl %ebx
129; X32-NEXT:    retl
130;
131; X64-LABEL: si8:
132; X64:       # %bb.0:
133; X64-NEXT:    movl %edi, %eax
134; X64-NEXT:    cbtw
135; X64-NEXT:    idivb %sil
136; X64-NEXT:    movsbl %ah, %esi
137; X64-NEXT:    movb %al, (%rdx)
138; X64-NEXT:    movb %sil, (%rcx)
139; X64-NEXT:    retq
140	%r = sdiv i8 %x, %y
141	%t = srem i8 %x, %y
142	store i8 %r, i8* %p
143	store i8 %t, i8* %q
144	ret void
145}
146
147define void @ui64(i64 %x, i64 %y, i64* %p, i64* %q) nounwind {
148; X32-LABEL: ui64:
149; X32:       # %bb.0:
150; X32-NEXT:    pushl %ebp
151; X32-NEXT:    pushl %ebx
152; X32-NEXT:    pushl %edi
153; X32-NEXT:    pushl %esi
154; X32-NEXT:    movl {{[0-9]+}}(%esp), %ebx
155; X32-NEXT:    movl {{[0-9]+}}(%esp), %ebp
156; X32-NEXT:    pushl %ebp
157; X32-NEXT:    pushl %ebx
158; X32-NEXT:    pushl {{[0-9]+}}(%esp)
159; X32-NEXT:    pushl {{[0-9]+}}(%esp)
160; X32-NEXT:    calll __udivdi3
161; X32-NEXT:    addl $16, %esp
162; X32-NEXT:    movl %eax, %esi
163; X32-NEXT:    movl %edx, %edi
164; X32-NEXT:    pushl %ebp
165; X32-NEXT:    pushl %ebx
166; X32-NEXT:    pushl {{[0-9]+}}(%esp)
167; X32-NEXT:    pushl {{[0-9]+}}(%esp)
168; X32-NEXT:    calll __umoddi3
169; X32-NEXT:    addl $16, %esp
170; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
171; X32-NEXT:    movl %edi, 4(%ecx)
172; X32-NEXT:    movl %esi, (%ecx)
173; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
174; X32-NEXT:    movl %edx, 4(%ecx)
175; X32-NEXT:    movl %eax, (%ecx)
176; X32-NEXT:    popl %esi
177; X32-NEXT:    popl %edi
178; X32-NEXT:    popl %ebx
179; X32-NEXT:    popl %ebp
180; X32-NEXT:    retl
181;
182; X64-LABEL: ui64:
183; X64:       # %bb.0:
184; X64-NEXT:    movq %rdx, %r8
185; X64-NEXT:    xorl %edx, %edx
186; X64-NEXT:    movq %rdi, %rax
187; X64-NEXT:    divq %rsi
188; X64-NEXT:    movq %rax, (%r8)
189; X64-NEXT:    movq %rdx, (%rcx)
190; X64-NEXT:    retq
191	%r = udiv i64 %x, %y
192	%t = urem i64 %x, %y
193	store i64 %r, i64* %p
194	store i64 %t, i64* %q
195	ret void
196}
197
198define void @ui32(i32 %x, i32 %y, i32* %p, i32* %q) nounwind {
199; X32-LABEL: ui32:
200; X32:       # %bb.0:
201; X32-NEXT:    pushl %esi
202; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
203; X32-NEXT:    movl {{[0-9]+}}(%esp), %esi
204; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
205; X32-NEXT:    xorl %edx, %edx
206; X32-NEXT:    divl {{[0-9]+}}(%esp)
207; X32-NEXT:    movl %eax, (%esi)
208; X32-NEXT:    movl %edx, (%ecx)
209; X32-NEXT:    popl %esi
210; X32-NEXT:    retl
211;
212; X64-LABEL: ui32:
213; X64:       # %bb.0:
214; X64-NEXT:    movq %rdx, %r8
215; X64-NEXT:    xorl %edx, %edx
216; X64-NEXT:    movl %edi, %eax
217; X64-NEXT:    divl %esi
218; X64-NEXT:    movl %eax, (%r8)
219; X64-NEXT:    movl %edx, (%rcx)
220; X64-NEXT:    retq
221	%r = udiv i32 %x, %y
222	%t = urem i32 %x, %y
223	store i32 %r, i32* %p
224	store i32 %t, i32* %q
225	ret void
226}
227
228define void @ui16(i16 %x, i16 %y, i16* %p, i16* %q) nounwind {
229; X32-LABEL: ui16:
230; X32:       # %bb.0:
231; X32-NEXT:    pushl %esi
232; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
233; X32-NEXT:    movl {{[0-9]+}}(%esp), %esi
234; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
235; X32-NEXT:    xorl %edx, %edx
236; X32-NEXT:    divw {{[0-9]+}}(%esp)
237; X32-NEXT:    movw %ax, (%esi)
238; X32-NEXT:    movw %dx, (%ecx)
239; X32-NEXT:    popl %esi
240; X32-NEXT:    retl
241;
242; X64-LABEL: ui16:
243; X64:       # %bb.0:
244; X64-NEXT:    movq %rdx, %r8
245; X64-NEXT:    xorl %edx, %edx
246; X64-NEXT:    movl %edi, %eax
247; X64-NEXT:    divw %si
248; X64-NEXT:    movw %ax, (%r8)
249; X64-NEXT:    movw %dx, (%rcx)
250; X64-NEXT:    retq
251	%r = udiv i16 %x, %y
252	%t = urem i16 %x, %y
253	store i16 %r, i16* %p
254	store i16 %t, i16* %q
255	ret void
256}
257
258define void @ui8(i8 %x, i8 %y, i8* %p, i8* %q) nounwind {
259; X32-LABEL: ui8:
260; X32:       # %bb.0:
261; X32-NEXT:    pushl %ebx
262; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
263; X32-NEXT:    movl {{[0-9]+}}(%esp), %edx
264; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
265; X32-NEXT:    # kill: def $eax killed $eax def $ax
266; X32-NEXT:    divb {{[0-9]+}}(%esp)
267; X32-NEXT:    movzbl %ah, %ebx
268; X32-NEXT:    movb %al, (%edx)
269; X32-NEXT:    movb %bl, (%ecx)
270; X32-NEXT:    popl %ebx
271; X32-NEXT:    retl
272;
273; X64-LABEL: ui8:
274; X64:       # %bb.0:
275; X64-NEXT:    movzbl %dil, %eax
276; X64-NEXT:    # kill: def $eax killed $eax def $ax
277; X64-NEXT:    divb %sil
278; X64-NEXT:    movzbl %ah, %esi
279; X64-NEXT:    movb %al, (%rdx)
280; X64-NEXT:    movb %sil, (%rcx)
281; X64-NEXT:    retq
282	%r = udiv i8 %x, %y
283	%t = urem i8 %x, %y
284	store i8 %r, i8* %p
285	store i8 %t, i8* %q
286	ret void
287}
288