@@ -48,309 +48,15 @@ define i128 @test2(i128 %x) nounwind {
4848; X64-NEXT: callq __udivti3@PLT
4949; X64-NEXT: popq %rcx
5050; X64-NEXT: retq
51+ ; X86 doesn't have __divti3, so the urem is expanded into a loop.
5152 %tmp = udiv i128 %x , -73786976294838206464
5253 ret i128 %tmp
5354}
5455
5556define i128 @test3 (i128 %x ) nounwind {
5657; X86-LABEL: test3:
57- ; X86: # %bb.0: # %_udiv-special-cases
58- ; X86-NEXT: pushl %ebp
59- ; X86-NEXT: movl %esp, %ebp
60- ; X86-NEXT: pushl %ebx
61- ; X86-NEXT: pushl %edi
62- ; X86-NEXT: pushl %esi
63- ; X86-NEXT: andl $-16, %esp
64- ; X86-NEXT: subl $160, %esp
65- ; X86-NEXT: movl 32(%ebp), %edx
66- ; X86-NEXT: movl 24(%ebp), %edi
67- ; X86-NEXT: movl 36(%ebp), %esi
68- ; X86-NEXT: movl 28(%ebp), %eax
69- ; X86-NEXT: orl %esi, %eax
70- ; X86-NEXT: movl %edi, %ecx
71- ; X86-NEXT: orl %edx, %ecx
72- ; X86-NEXT: orl %eax, %ecx
73- ; X86-NEXT: sete %al
74- ; X86-NEXT: testl %esi, %esi
75- ; X86-NEXT: jne .LBB2_1
76- ; X86-NEXT: # %bb.2: # %_udiv-special-cases
77- ; X86-NEXT: bsrl %edx, %ebx
78- ; X86-NEXT: xorl $31, %ebx
79- ; X86-NEXT: addl $32, %ebx
80- ; X86-NEXT: jmp .LBB2_3
81- ; X86-NEXT: .LBB2_1:
82- ; X86-NEXT: bsrl %esi, %ebx
83- ; X86-NEXT: xorl $31, %ebx
84- ; X86-NEXT: .LBB2_3: # %_udiv-special-cases
85- ; X86-NEXT: movb %al, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
86- ; X86-NEXT: movl 28(%ebp), %eax
87- ; X86-NEXT: testl %eax, %eax
88- ; X86-NEXT: jne .LBB2_4
89- ; X86-NEXT: # %bb.5: # %_udiv-special-cases
90- ; X86-NEXT: bsrl %edi, %ecx
91- ; X86-NEXT: xorl $31, %ecx
92- ; X86-NEXT: addl $32, %ecx
93- ; X86-NEXT: orl %esi, %edx
94- ; X86-NEXT: je .LBB2_7
95- ; X86-NEXT: jmp .LBB2_8
96- ; X86-NEXT: .LBB2_4:
97- ; X86-NEXT: bsrl %eax, %ecx
98- ; X86-NEXT: xorl $31, %ecx
99- ; X86-NEXT: orl %esi, %edx
100- ; X86-NEXT: jne .LBB2_8
101- ; X86-NEXT: .LBB2_7: # %_udiv-special-cases
102- ; X86-NEXT: addl $64, %ecx
103- ; X86-NEXT: movl %ecx, %ebx
104- ; X86-NEXT: .LBB2_8: # %_udiv-special-cases
105- ; X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
106- ; X86-NEXT: negl %ebx
107- ; X86-NEXT: movl $0, %edx
108- ; X86-NEXT: sbbl %edx, %edx
109- ; X86-NEXT: movl $0, %eax
110- ; X86-NEXT: sbbl %eax, %eax
111- ; X86-NEXT: movl $0, %esi
112- ; X86-NEXT: sbbl %esi, %esi
113- ; X86-NEXT: movl $127, %ecx
114- ; X86-NEXT: cmpl %ebx, %ecx
115- ; X86-NEXT: movl $0, %ecx
116- ; X86-NEXT: sbbl %edx, %ecx
117- ; X86-NEXT: movl $0, %ecx
118- ; X86-NEXT: sbbl %eax, %ecx
119- ; X86-NEXT: movl $0, %ecx
120- ; X86-NEXT: sbbl %esi, %ecx
121- ; X86-NEXT: setb %cl
122- ; X86-NEXT: movl %ebx, %edi
123- ; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 1-byte Folded Reload
124- ; X86-NEXT: orb %cl, %bl
125- ; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
126- ; X86-NEXT: movl %edi, %ecx
127- ; X86-NEXT: xorl $127, %ecx
128- ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
129- ; X86-NEXT: orl %eax, %ecx
130- ; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
131- ; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
132- ; X86-NEXT: orl %esi, %edx
133- ; X86-NEXT: orl %ecx, %edx
134- ; X86-NEXT: sete %cl
135- ; X86-NEXT: testb %bl, %bl
136- ; X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
137- ; X86-NEXT: movl $0, %esi
138- ; X86-NEXT: movl $0, %edi
139- ; X86-NEXT: movl 32(%ebp), %eax
140- ; X86-NEXT: jne .LBB2_10
141- ; X86-NEXT: # %bb.9: # %_udiv-special-cases
142- ; X86-NEXT: movl 36(%ebp), %esi
143- ; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
144- ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
145- ; X86-NEXT: movl 28(%ebp), %esi
146- ; X86-NEXT: movl 24(%ebp), %edi
147- ; X86-NEXT: .LBB2_10: # %_udiv-special-cases
148- ; X86-NEXT: orb %cl, %bl
149- ; X86-NEXT: jne .LBB2_17
150- ; X86-NEXT: # %bb.11: # %udiv-bb1
151- ; X86-NEXT: movl 24(%ebp), %ecx
152- ; X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)
153- ; X86-NEXT: movl 28(%ebp), %ecx
154- ; X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)
155- ; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
156- ; X86-NEXT: movl 36(%ebp), %edi
157- ; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
158- ; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
159- ; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
160- ; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
161- ; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
162- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
163- ; X86-NEXT: movl %eax, %ecx
164- ; X86-NEXT: xorb $127, %cl
165- ; X86-NEXT: movl %ecx, %edx
166- ; X86-NEXT: shrb $3, %dl
167- ; X86-NEXT: andb $12, %dl
168- ; X86-NEXT: negb %dl
169- ; X86-NEXT: movsbl %dl, %edx
170- ; X86-NEXT: movl 136(%esp,%edx), %ebx
171- ; X86-NEXT: movl 140(%esp,%edx), %esi
172- ; X86-NEXT: shldl %cl, %ebx, %esi
173- ; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
174- ; X86-NEXT: movl 128(%esp,%edx), %esi
175- ; X86-NEXT: movl 132(%esp,%edx), %edx
176- ; X86-NEXT: shldl %cl, %edx, %ebx
177- ; X86-NEXT: shldl %cl, %esi, %edx
178- ; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
179- ; X86-NEXT: shll %cl, %esi
180- ; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
181- ; X86-NEXT: addl $1, %eax
182- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
183- ; X86-NEXT: adcl $0, %ecx
184- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
185- ; X86-NEXT: adcl $0, %edx
186- ; X86-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
187- ; X86-NEXT: jae .LBB2_12
188- ; X86-NEXT: # %bb.15:
189- ; X86-NEXT: xorl %eax, %eax
190- ; X86-NEXT: xorl %ecx, %ecx
191- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
192- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
193- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
194- ; X86-NEXT: jmp .LBB2_16
195- ; X86-NEXT: .LBB2_12: # %udiv-preheader
196- ; X86-NEXT: movl 24(%ebp), %esi
197- ; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
198- ; X86-NEXT: movl 28(%ebp), %esi
199- ; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
200- ; X86-NEXT: movl 32(%ebp), %esi
201- ; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
202- ; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
203- ; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
204- ; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
205- ; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
206- ; X86-NEXT: movl $0, {{[0-9]+}}(%esp)
207- ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
208- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
209- ; X86-NEXT: # kill: def $al killed $al killed $eax
210- ; X86-NEXT: shrb $3, %al
211- ; X86-NEXT: andb $12, %al
212- ; X86-NEXT: movzbl %al, %eax
213- ; X86-NEXT: movl 92(%esp,%eax), %edi
214- ; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
215- ; X86-NEXT: movl 88(%esp,%eax), %esi
216- ; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
217- ; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
218- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
219- ; X86-NEXT: # kill: def $cl killed $cl killed $ecx
220- ; X86-NEXT: shrdl %cl, %edi, %esi
221- ; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
222- ; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
223- ; X86-NEXT: movl 80(%esp,%eax), %edx
224- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
225- ; X86-NEXT: movl 84(%esp,%eax), %eax
226- ; X86-NEXT: movl %eax, %ebx
227- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
228- ; X86-NEXT: shrdl %cl, %esi, %ebx
229- ; X86-NEXT: movl %ebx, %esi
230- ; X86-NEXT: shrl %cl, %edi
231- ; X86-NEXT: movl %edi, %ebx
232- ; X86-NEXT: # kill: def $cl killed $cl killed $ecx
233- ; X86-NEXT: shrdl %cl, %eax, %edx
234- ; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
235- ; X86-NEXT: movl $-3, %eax
236- ; X86-NEXT: addl $-1, %eax
237- ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
238- ; X86-NEXT: movl $-1, %eax
239- ; X86-NEXT: adcl $-1, %eax
240- ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
241- ; X86-NEXT: movl $-5, %eax
242- ; X86-NEXT: adcl $-1, %eax
243- ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
244- ; X86-NEXT: movl $-1, %eax
245- ; X86-NEXT: adcl $-1, %eax
246- ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
247- ; X86-NEXT: xorl %ecx, %ecx
248- ; X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
249- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
250- ; X86-NEXT: .p2align 4
251- ; X86-NEXT: .LBB2_13: # %udiv-do-while
252- ; X86-NEXT: # =>This Inner Loop Header: Depth=1
253- ; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
254- ; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
255- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
256- ; X86-NEXT: shldl $1, %eax, %ebx
257- ; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
258- ; X86-NEXT: movl %esi, %edi
259- ; X86-NEXT: shldl $1, %esi, %eax
260- ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
261- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
262- ; X86-NEXT: shldl $1, %esi, %edi
263- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
264- ; X86-NEXT: shldl $1, %edx, %esi
265- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
266- ; X86-NEXT: shldl $1, %ebx, %edx
267- ; X86-NEXT: orl %ecx, %edx
268- ; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
269- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
270- ; X86-NEXT: shldl $1, %eax, %ebx
271- ; X86-NEXT: orl %ecx, %ebx
272- ; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
273- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
274- ; X86-NEXT: shldl $1, %edx, %eax
275- ; X86-NEXT: orl %ecx, %eax
276- ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
277- ; X86-NEXT: addl %edx, %edx
278- ; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
279- ; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
280- ; X86-NEXT: cmpl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
281- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
282- ; X86-NEXT: sbbl %edi, %ecx
283- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
284- ; X86-NEXT: sbbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
285- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
286- ; X86-NEXT: sbbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
287- ; X86-NEXT: sarl $31, %ecx
288- ; X86-NEXT: movl %ecx, %eax
289- ; X86-NEXT: andl $1, %eax
290- ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
291- ; X86-NEXT: movl %ecx, %ebx
292- ; X86-NEXT: movl $-1, %edx
293- ; X86-NEXT: andl %edx, %ebx
294- ; X86-NEXT: movl %ecx, %edx
295- ; X86-NEXT: movl $-5, %eax
296- ; X86-NEXT: andl %eax, %edx
297- ; X86-NEXT: movl $-3, %eax
298- ; X86-NEXT: andl %eax, %ecx
299- ; X86-NEXT: subl %ecx, %esi
300- ; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
301- ; X86-NEXT: sbbl %ebx, %edi
302- ; X86-NEXT: movl %edi, %esi
303- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
304- ; X86-NEXT: sbbl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
305- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
306- ; X86-NEXT: sbbl %ebx, %eax
307- ; X86-NEXT: movl %eax, %ebx
308- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
309- ; X86-NEXT: addl $-1, %edx
310- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
311- ; X86-NEXT: adcl $-1, %ecx
312- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
313- ; X86-NEXT: adcl $-1, %eax
314- ; X86-NEXT: adcl $-1, %edi
315- ; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
316- ; X86-NEXT: orl %edi, %ecx
317- ; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
318- ; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
319- ; X86-NEXT: orl %eax, %edx
320- ; X86-NEXT: orl %ecx, %edx
321- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
322- ; X86-NEXT: jne .LBB2_13
323- ; X86-NEXT: # %bb.14:
324- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
325- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
326- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
327- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
328- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
329- ; X86-NEXT: .LBB2_16: # %udiv-loop-exit
330- ; X86-NEXT: shldl $1, %ebx, %edx
331- ; X86-NEXT: orl %ecx, %edx
332- ; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
333- ; X86-NEXT: shldl $1, %esi, %ebx
334- ; X86-NEXT: orl %ecx, %ebx
335- ; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
336- ; X86-NEXT: shldl $1, %edi, %esi
337- ; X86-NEXT: orl %ecx, %esi
338- ; X86-NEXT: addl %edi, %edi
339- ; X86-NEXT: orl %eax, %edi
340- ; X86-NEXT: .LBB2_17: # %udiv-end
341- ; X86-NEXT: movl 8(%ebp), %eax
342- ; X86-NEXT: movl %edi, (%eax)
343- ; X86-NEXT: movl %esi, 4(%eax)
344- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
345- ; X86-NEXT: movl %ecx, 8(%eax)
346- ; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
347- ; X86-NEXT: movl %ecx, 12(%eax)
348- ; X86-NEXT: leal -12(%ebp), %esp
349- ; X86-NEXT: popl %esi
350- ; X86-NEXT: popl %edi
351- ; X86-NEXT: popl %ebx
352- ; X86-NEXT: popl %ebp
353- ; X86-NEXT: retl $4
58+ ; X86 doesn't have __divti3, so the urem is expanded into a loop.
59+ ; X86: udiv-do-while
35460;
35561; X64-LABEL: test3:
35662; X64: # %bb.0:
0 commit comments