[Alignment][NFC] Use Align with TargetLowering::setMinFunctionAlignment
[llvm-core.git] / test / CodeGen / X86 / scalar_widen_div.ll
blob17ca5143836bab97a197034adb4bed49b38a6cbc
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.2 |  FileCheck %s
4 ; Verify when widening a divide/remainder operation, we only generate a
5 ; divide/rem per element since divide/remainder can trap.
7 ; CHECK: vectorDiv
8 define void @vectorDiv (<2 x i32> addrspace(1)* %nsource, <2 x i32> addrspace(1)* %dsource, <2 x i32> addrspace(1)* %qdest) nounwind {
9 ; CHECK-LABEL: vectorDiv:
10 ; CHECK:       # %bb.0: # %entry
11 ; CHECK-NEXT:    movq %rdx, %r8
12 ; CHECK-NEXT:    movq %rdi, -{{[0-9]+}}(%rsp)
13 ; CHECK-NEXT:    movq %rsi, -{{[0-9]+}}(%rsp)
14 ; CHECK-NEXT:    movq %rdx, -{{[0-9]+}}(%rsp)
15 ; CHECK-NEXT:    movslq -{{[0-9]+}}(%rsp), %rcx
16 ; CHECK-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
17 ; CHECK-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
18 ; CHECK-NEXT:    pextrd $1, %xmm0, %eax
19 ; CHECK-NEXT:    pextrd $1, %xmm1, %esi
20 ; CHECK-NEXT:    cltd
21 ; CHECK-NEXT:    idivl %esi
22 ; CHECK-NEXT:    movl %eax, %esi
23 ; CHECK-NEXT:    movd %xmm0, %eax
24 ; CHECK-NEXT:    movd %xmm1, %edi
25 ; CHECK-NEXT:    cltd
26 ; CHECK-NEXT:    idivl %edi
27 ; CHECK-NEXT:    movd %eax, %xmm0
28 ; CHECK-NEXT:    pinsrd $1, %esi, %xmm0
29 ; CHECK-NEXT:    movq %xmm0, (%r8,%rcx,8)
30 ; CHECK-NEXT:    retq
31 entry:
32   %nsource.addr = alloca <2 x i32> addrspace(1)*, align 4
33   %dsource.addr = alloca <2 x i32> addrspace(1)*, align 4
34   %qdest.addr = alloca <2 x i32> addrspace(1)*, align 4
35   %index = alloca i32, align 4
36   store <2 x i32> addrspace(1)* %nsource, <2 x i32> addrspace(1)** %nsource.addr
37   store <2 x i32> addrspace(1)* %dsource, <2 x i32> addrspace(1)** %dsource.addr
38   store <2 x i32> addrspace(1)* %qdest, <2 x i32> addrspace(1)** %qdest.addr
39   %tmp = load <2 x i32> addrspace(1)*, <2 x i32> addrspace(1)** %qdest.addr
40   %tmp1 = load i32, i32* %index
41   %arrayidx = getelementptr <2 x i32>, <2 x i32> addrspace(1)* %tmp, i32 %tmp1
42   %tmp2 = load <2 x i32> addrspace(1)*, <2 x i32> addrspace(1)** %nsource.addr
43   %tmp3 = load i32, i32* %index
44   %arrayidx4 = getelementptr <2 x i32>, <2 x i32> addrspace(1)* %tmp2, i32 %tmp3
45   %tmp5 = load <2 x i32>, <2 x i32> addrspace(1)* %arrayidx4
46   %tmp6 = load <2 x i32> addrspace(1)*, <2 x i32> addrspace(1)** %dsource.addr
47   %tmp7 = load i32, i32* %index
48   %arrayidx8 = getelementptr <2 x i32>, <2 x i32> addrspace(1)* %tmp6, i32 %tmp7
49   %tmp9 = load <2 x i32>, <2 x i32> addrspace(1)* %arrayidx8
50   %tmp10 = sdiv <2 x i32> %tmp5, %tmp9
51   store <2 x i32> %tmp10, <2 x i32> addrspace(1)* %arrayidx
52   ret void
55 ; CHECK: test_char_div
56 define <3 x i8> @test_char_div(<3 x i8> %num, <3 x i8> %div) {
57 ; CHECK-LABEL: test_char_div:
58 ; CHECK:       # %bb.0:
59 ; CHECK-NEXT:    movl %edx, %r10d
60 ; CHECK-NEXT:    movl %edi, %eax
61 ; CHECK-NEXT:    # kill: def $al killed $al killed $eax
62 ; CHECK-NEXT:    cbtw
63 ; CHECK-NEXT:    idivb %cl
64 ; CHECK-NEXT:    movl %eax, %edi
65 ; CHECK-NEXT:    movl %esi, %eax
66 ; CHECK-NEXT:    cbtw
67 ; CHECK-NEXT:    idivb %r8b
68 ; CHECK-NEXT:    movl %eax, %edx
69 ; CHECK-NEXT:    movl %r10d, %eax
70 ; CHECK-NEXT:    cbtw
71 ; CHECK-NEXT:    idivb %r9b
72 ; CHECK-NEXT:    movl %eax, %ecx
73 ; CHECK-NEXT:    movl %edi, %eax
74 ; CHECK-NEXT:    retq
75   %div.r = sdiv <3 x i8> %num, %div
76   ret <3 x i8>  %div.r
79 ; CHECK: test_uchar_div
80 define <3 x i8> @test_uchar_div(<3 x i8> %num, <3 x i8> %div) {
81 ; CHECK-LABEL: test_uchar_div:
82 ; CHECK:       # %bb.0:
83 ; CHECK-NEXT:    movzbl %dil, %eax
84 ; CHECK-NEXT:    # kill: def $eax killed $eax def $ax
85 ; CHECK-NEXT:    divb %cl
86 ; CHECK-NEXT:    movl %eax, %edi
87 ; CHECK-NEXT:    movzbl %sil, %eax
88 ; CHECK-NEXT:    # kill: def $eax killed $eax def $ax
89 ; CHECK-NEXT:    divb %r8b
90 ; CHECK-NEXT:    movl %eax, %esi
91 ; CHECK-NEXT:    movzbl %dl, %eax
92 ; CHECK-NEXT:    # kill: def $eax killed $eax def $ax
93 ; CHECK-NEXT:    divb %r9b
94 ; CHECK-NEXT:    movl %eax, %ecx
95 ; CHECK-NEXT:    movl %edi, %eax
96 ; CHECK-NEXT:    movl %esi, %edx
97 ; CHECK-NEXT:    retq
98   %div.r = udiv <3 x i8> %num, %div
99   ret <3 x i8>  %div.r
102 ; CHECK: test_short_div
103 define <5 x i16> @test_short_div(<5 x i16> %num, <5 x i16> %div) {
104 ; CHECK-LABEL: test_short_div:
105 ; CHECK:       # %bb.0:
106 ; CHECK-NEXT:    pextrw $4, %xmm0, %eax
107 ; CHECK-NEXT:    pextrw $4, %xmm1, %ecx
108 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
109 ; CHECK-NEXT:    cwtd
110 ; CHECK-NEXT:    idivw %cx
111 ; CHECK-NEXT:    movl %eax, %r8d
112 ; CHECK-NEXT:    pextrw $3, %xmm0, %eax
113 ; CHECK-NEXT:    pextrw $3, %xmm1, %ecx
114 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
115 ; CHECK-NEXT:    cwtd
116 ; CHECK-NEXT:    idivw %cx
117 ; CHECK-NEXT:    movl %eax, %r9d
118 ; CHECK-NEXT:    pextrw $2, %xmm0, %eax
119 ; CHECK-NEXT:    pextrw $2, %xmm1, %ecx
120 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
121 ; CHECK-NEXT:    cwtd
122 ; CHECK-NEXT:    idivw %cx
123 ; CHECK-NEXT:    movl %eax, %edi
124 ; CHECK-NEXT:    movd %xmm0, %eax
125 ; CHECK-NEXT:    movd %xmm1, %ecx
126 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
127 ; CHECK-NEXT:    cwtd
128 ; CHECK-NEXT:    idivw %cx
129 ; CHECK-NEXT:    movl %eax, %ecx
130 ; CHECK-NEXT:    pextrw $1, %xmm0, %eax
131 ; CHECK-NEXT:    pextrw $1, %xmm1, %esi
132 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
133 ; CHECK-NEXT:    cwtd
134 ; CHECK-NEXT:    idivw %si
135 ; CHECK-NEXT:    # kill: def $ax killed $ax def $eax
136 ; CHECK-NEXT:    movd %ecx, %xmm0
137 ; CHECK-NEXT:    pinsrw $1, %eax, %xmm0
138 ; CHECK-NEXT:    pinsrw $2, %edi, %xmm0
139 ; CHECK-NEXT:    pinsrw $3, %r9d, %xmm0
140 ; CHECK-NEXT:    pinsrw $4, %r8d, %xmm0
141 ; CHECK-NEXT:    retq
142   %div.r = sdiv <5 x i16> %num, %div
143   ret <5 x i16>  %div.r
146 ; CHECK: test_ushort_div
147 define <4 x i16> @test_ushort_div(<4 x i16> %num, <4 x i16> %div) {
148 ; CHECK-LABEL: test_ushort_div:
149 ; CHECK:       # %bb.0:
150 ; CHECK-NEXT:    pextrw $1, %xmm0, %eax
151 ; CHECK-NEXT:    pextrw $1, %xmm1, %ecx
152 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
153 ; CHECK-NEXT:    xorl %edx, %edx
154 ; CHECK-NEXT:    divw %cx
155 ; CHECK-NEXT:    movl %eax, %ecx
156 ; CHECK-NEXT:    movd %xmm0, %eax
157 ; CHECK-NEXT:    movd %xmm1, %esi
158 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
159 ; CHECK-NEXT:    xorl %edx, %edx
160 ; CHECK-NEXT:    divw %si
161 ; CHECK-NEXT:    # kill: def $ax killed $ax def $eax
162 ; CHECK-NEXT:    movd %eax, %xmm2
163 ; CHECK-NEXT:    pinsrw $1, %ecx, %xmm2
164 ; CHECK-NEXT:    pextrw $2, %xmm0, %eax
165 ; CHECK-NEXT:    pextrw $2, %xmm1, %ecx
166 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
167 ; CHECK-NEXT:    xorl %edx, %edx
168 ; CHECK-NEXT:    divw %cx
169 ; CHECK-NEXT:    # kill: def $ax killed $ax def $eax
170 ; CHECK-NEXT:    pinsrw $2, %eax, %xmm2
171 ; CHECK-NEXT:    pextrw $3, %xmm0, %eax
172 ; CHECK-NEXT:    pextrw $3, %xmm1, %ecx
173 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
174 ; CHECK-NEXT:    xorl %edx, %edx
175 ; CHECK-NEXT:    divw %cx
176 ; CHECK-NEXT:    # kill: def $ax killed $ax def $eax
177 ; CHECK-NEXT:    pinsrw $3, %eax, %xmm2
178 ; CHECK-NEXT:    movdqa %xmm2, %xmm0
179 ; CHECK-NEXT:    retq
180   %div.r = udiv <4 x i16> %num, %div
181   ret <4 x i16>  %div.r
184 ; CHECK: test_uint_div
185 define <3 x i32> @test_uint_div(<3 x i32> %num, <3 x i32> %div) {
186 ; CHECK-LABEL: test_uint_div:
187 ; CHECK:       # %bb.0:
188 ; CHECK-NEXT:    pextrd $2, %xmm0, %eax
189 ; CHECK-NEXT:    pextrd $2, %xmm1, %ecx
190 ; CHECK-NEXT:    xorl %edx, %edx
191 ; CHECK-NEXT:    divl %ecx
192 ; CHECK-NEXT:    movl %eax, %ecx
193 ; CHECK-NEXT:    pextrd $1, %xmm0, %eax
194 ; CHECK-NEXT:    pextrd $1, %xmm1, %esi
195 ; CHECK-NEXT:    xorl %edx, %edx
196 ; CHECK-NEXT:    divl %esi
197 ; CHECK-NEXT:    movl %eax, %esi
198 ; CHECK-NEXT:    movd %xmm0, %eax
199 ; CHECK-NEXT:    movd %xmm1, %edi
200 ; CHECK-NEXT:    xorl %edx, %edx
201 ; CHECK-NEXT:    divl %edi
202 ; CHECK-NEXT:    movd %eax, %xmm0
203 ; CHECK-NEXT:    pinsrd $1, %esi, %xmm0
204 ; CHECK-NEXT:    pinsrd $2, %ecx, %xmm0
205 ; CHECK-NEXT:    retq
206   %div.r = udiv <3 x i32> %num, %div
207   ret <3 x i32>  %div.r
210 ; CHECK: test_long_div
211 define <3 x i64> @test_long_div(<3 x i64> %num, <3 x i64> %div) {
212 ; CHECK-LABEL: test_long_div:
213 ; CHECK:       # %bb.0:
214 ; CHECK-NEXT:    movq %rdx, %r10
215 ; CHECK-NEXT:    movq %rdi, %rax
216 ; CHECK-NEXT:    cqto
217 ; CHECK-NEXT:    idivq %rcx
218 ; CHECK-NEXT:    movq %rax, %rcx
219 ; CHECK-NEXT:    movq %rsi, %rax
220 ; CHECK-NEXT:    cqto
221 ; CHECK-NEXT:    idivq %r8
222 ; CHECK-NEXT:    movq %rax, %rsi
223 ; CHECK-NEXT:    movq %r10, %rax
224 ; CHECK-NEXT:    cqto
225 ; CHECK-NEXT:    idivq %r9
226 ; CHECK-NEXT:    movq %rax, %rdi
227 ; CHECK-NEXT:    movq %rcx, %rax
228 ; CHECK-NEXT:    movq %rsi, %rdx
229 ; CHECK-NEXT:    movq %rdi, %rcx
230 ; CHECK-NEXT:    retq
231   %div.r = sdiv <3 x i64> %num, %div
232   ret <3 x i64>  %div.r
235 ; CHECK: test_ulong_div
236 define <3 x i64> @test_ulong_div(<3 x i64> %num, <3 x i64> %div) {
237 ; CHECK-LABEL: test_ulong_div:
238 ; CHECK:       # %bb.0:
239 ; CHECK-NEXT:    movq %rdx, %r10
240 ; CHECK-NEXT:    movq %rdi, %rax
241 ; CHECK-NEXT:    xorl %edx, %edx
242 ; CHECK-NEXT:    divq %rcx
243 ; CHECK-NEXT:    movq %rax, %rcx
244 ; CHECK-NEXT:    movq %rsi, %rax
245 ; CHECK-NEXT:    xorl %edx, %edx
246 ; CHECK-NEXT:    divq %r8
247 ; CHECK-NEXT:    movq %rax, %rsi
248 ; CHECK-NEXT:    movq %r10, %rax
249 ; CHECK-NEXT:    xorl %edx, %edx
250 ; CHECK-NEXT:    divq %r9
251 ; CHECK-NEXT:    movq %rax, %rdi
252 ; CHECK-NEXT:    movq %rcx, %rax
253 ; CHECK-NEXT:    movq %rsi, %rdx
254 ; CHECK-NEXT:    movq %rdi, %rcx
255 ; CHECK-NEXT:    retq
256   %div.r = udiv <3 x i64> %num, %div
257   ret <3 x i64>  %div.r
260 ; CHECK: test_char_rem
261 define <4 x i8> @test_char_rem(<4 x i8> %num, <4 x i8> %rem) {
262 ; CHECK-LABEL: test_char_rem:
263 ; CHECK:       # %bb.0:
264 ; CHECK-NEXT:    pextrb $1, %xmm0, %eax
265 ; CHECK-NEXT:    # kill: def $al killed $al killed $eax
266 ; CHECK-NEXT:    cbtw
267 ; CHECK-NEXT:    pextrb $1, %xmm1, %ecx
268 ; CHECK-NEXT:    idivb %cl
269 ; CHECK-NEXT:    movsbl %ah, %ecx
270 ; CHECK-NEXT:    pextrb $0, %xmm0, %eax
271 ; CHECK-NEXT:    # kill: def $al killed $al killed $eax
272 ; CHECK-NEXT:    cbtw
273 ; CHECK-NEXT:    pextrb $0, %xmm1, %edx
274 ; CHECK-NEXT:    idivb %dl
275 ; CHECK-NEXT:    movsbl %ah, %eax
276 ; CHECK-NEXT:    movd %eax, %xmm2
277 ; CHECK-NEXT:    pextrb $2, %xmm0, %eax
278 ; CHECK-NEXT:    # kill: def $al killed $al killed $eax
279 ; CHECK-NEXT:    cbtw
280 ; CHECK-NEXT:    pinsrb $1, %ecx, %xmm2
281 ; CHECK-NEXT:    pextrb $2, %xmm1, %ecx
282 ; CHECK-NEXT:    idivb %cl
283 ; CHECK-NEXT:    movsbl %ah, %ecx
284 ; CHECK-NEXT:    pextrb $3, %xmm0, %eax
285 ; CHECK-NEXT:    # kill: def $al killed $al killed $eax
286 ; CHECK-NEXT:    cbtw
287 ; CHECK-NEXT:    pinsrb $2, %ecx, %xmm2
288 ; CHECK-NEXT:    pextrb $3, %xmm1, %ecx
289 ; CHECK-NEXT:    idivb %cl
290 ; CHECK-NEXT:    movsbl %ah, %eax
291 ; CHECK-NEXT:    pinsrb $3, %eax, %xmm2
292 ; CHECK-NEXT:    movdqa %xmm2, %xmm0
293 ; CHECK-NEXT:    retq
294   %rem.r = srem <4 x i8> %num, %rem
295   ret <4 x i8>  %rem.r
298 ; CHECK: test_short_rem
299 define <5 x i16> @test_short_rem(<5 x i16> %num, <5 x i16> %rem) {
300 ; CHECK-LABEL: test_short_rem:
301 ; CHECK:       # %bb.0:
302 ; CHECK-NEXT:    pextrw $4, %xmm0, %eax
303 ; CHECK-NEXT:    pextrw $4, %xmm1, %ecx
304 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
305 ; CHECK-NEXT:    cwtd
306 ; CHECK-NEXT:    idivw %cx
307 ; CHECK-NEXT:    movl %edx, %r8d
308 ; CHECK-NEXT:    pextrw $3, %xmm0, %eax
309 ; CHECK-NEXT:    pextrw $3, %xmm1, %ecx
310 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
311 ; CHECK-NEXT:    cwtd
312 ; CHECK-NEXT:    idivw %cx
313 ; CHECK-NEXT:    movl %edx, %r9d
314 ; CHECK-NEXT:    pextrw $2, %xmm0, %eax
315 ; CHECK-NEXT:    pextrw $2, %xmm1, %ecx
316 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
317 ; CHECK-NEXT:    cwtd
318 ; CHECK-NEXT:    idivw %cx
319 ; CHECK-NEXT:    movl %edx, %edi
320 ; CHECK-NEXT:    movd %xmm0, %eax
321 ; CHECK-NEXT:    movd %xmm1, %ecx
322 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
323 ; CHECK-NEXT:    cwtd
324 ; CHECK-NEXT:    idivw %cx
325 ; CHECK-NEXT:    movl %edx, %ecx
326 ; CHECK-NEXT:    pextrw $1, %xmm0, %eax
327 ; CHECK-NEXT:    pextrw $1, %xmm1, %esi
328 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
329 ; CHECK-NEXT:    cwtd
330 ; CHECK-NEXT:    idivw %si
331 ; CHECK-NEXT:    # kill: def $dx killed $dx def $edx
332 ; CHECK-NEXT:    movd %ecx, %xmm0
333 ; CHECK-NEXT:    pinsrw $1, %edx, %xmm0
334 ; CHECK-NEXT:    pinsrw $2, %edi, %xmm0
335 ; CHECK-NEXT:    pinsrw $3, %r9d, %xmm0
336 ; CHECK-NEXT:    pinsrw $4, %r8d, %xmm0
337 ; CHECK-NEXT:    retq
338   %rem.r = srem <5 x i16> %num, %rem
339   ret <5 x i16>  %rem.r
342 ; CHECK: test_uint_rem
343 define <4 x i32> @test_uint_rem(<4 x i32> %num, <4 x i32> %rem) {
344 ; CHECK-LABEL: test_uint_rem:
345 ; CHECK:       # %bb.0:
346 ; CHECK-NEXT:    pextrd $1, %xmm0, %eax
347 ; CHECK-NEXT:    pextrd $1, %xmm1, %ecx
348 ; CHECK-NEXT:    cltd
349 ; CHECK-NEXT:    idivl %ecx
350 ; CHECK-NEXT:    movl %edx, %ecx
351 ; CHECK-NEXT:    movd %xmm0, %eax
352 ; CHECK-NEXT:    movd %xmm1, %esi
353 ; CHECK-NEXT:    cltd
354 ; CHECK-NEXT:    idivl %esi
355 ; CHECK-NEXT:    movd %edx, %xmm2
356 ; CHECK-NEXT:    pinsrd $1, %ecx, %xmm2
357 ; CHECK-NEXT:    pextrd $2, %xmm0, %eax
358 ; CHECK-NEXT:    pextrd $2, %xmm1, %ecx
359 ; CHECK-NEXT:    cltd
360 ; CHECK-NEXT:    idivl %ecx
361 ; CHECK-NEXT:    pinsrd $2, %edx, %xmm2
362 ; CHECK-NEXT:    pextrd $3, %xmm0, %eax
363 ; CHECK-NEXT:    pextrd $3, %xmm1, %ecx
364 ; CHECK-NEXT:    cltd
365 ; CHECK-NEXT:    idivl %ecx
366 ; CHECK-NEXT:    pinsrd $3, %edx, %xmm2
367 ; CHECK-NEXT:    movdqa %xmm2, %xmm0
368 ; CHECK-NEXT:    retq
369   %rem.r = srem <4 x i32> %num, %rem
370   ret <4 x i32>  %rem.r
374 ; CHECK: test_ulong_rem
375 define <5 x i64> @test_ulong_rem(<5 x i64> %num, <5 x i64> %rem) {
376 ; CHECK-LABEL: test_ulong_rem:
377 ; CHECK:       # %bb.0:
378 ; CHECK-NEXT:    movq %rdx, %rax
379 ; CHECK-NEXT:    xorl %edx, %edx
380 ; CHECK-NEXT:    divq {{[0-9]+}}(%rsp)
381 ; CHECK-NEXT:    movq %rdx, %xmm0
382 ; CHECK-NEXT:    movq %rsi, %rax
383 ; CHECK-NEXT:    xorl %edx, %edx
384 ; CHECK-NEXT:    divq {{[0-9]+}}(%rsp)
385 ; CHECK-NEXT:    movq %rdx, %xmm1
386 ; CHECK-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
387 ; CHECK-NEXT:    movq %r8, %rax
388 ; CHECK-NEXT:    xorl %edx, %edx
389 ; CHECK-NEXT:    divq {{[0-9]+}}(%rsp)
390 ; CHECK-NEXT:    movq %rdx, %xmm0
391 ; CHECK-NEXT:    movq %rcx, %rax
392 ; CHECK-NEXT:    xorl %edx, %edx
393 ; CHECK-NEXT:    divq {{[0-9]+}}(%rsp)
394 ; CHECK-NEXT:    movq %rdx, %xmm2
395 ; CHECK-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
396 ; CHECK-NEXT:    movq %r9, %rax
397 ; CHECK-NEXT:    xorl %edx, %edx
398 ; CHECK-NEXT:    divq {{[0-9]+}}(%rsp)
399 ; CHECK-NEXT:    movq %rdx, 32(%rdi)
400 ; CHECK-NEXT:    movdqa %xmm2, 16(%rdi)
401 ; CHECK-NEXT:    movdqa %xmm1, (%rdi)
402 ; CHECK-NEXT:    movq %rdi, %rax
403 ; CHECK-NEXT:    retq
404   %rem.r = urem <5 x i64> %num, %rem
405   ret <5 x i64>  %rem.r
408 ; CHECK: test_int_div
409 define void @test_int_div(<3 x i32>* %dest, <3 x i32>* %old, i32 %n) {
410 ; CHECK-LABEL: test_int_div:
411 ; CHECK:       # %bb.0: # %entry
412 ; CHECK-NEXT:    testl %edx, %edx
413 ; CHECK-NEXT:    jle .LBB12_3
414 ; CHECK-NEXT:  # %bb.1: # %bb.nph
415 ; CHECK-NEXT:    movl %edx, %r9d
416 ; CHECK-NEXT:    xorl %ecx, %ecx
417 ; CHECK-NEXT:    .p2align 4, 0x90
418 ; CHECK-NEXT:  .LBB12_2: # %for.body
419 ; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
420 ; CHECK-NEXT:    movdqa (%rdi,%rcx), %xmm0
421 ; CHECK-NEXT:    movdqa (%rsi,%rcx), %xmm1
422 ; CHECK-NEXT:    pextrd $1, %xmm0, %eax
423 ; CHECK-NEXT:    pextrd $1, %xmm1, %r8d
424 ; CHECK-NEXT:    cltd
425 ; CHECK-NEXT:    idivl %r8d
426 ; CHECK-NEXT:    movl %eax, %r8d
427 ; CHECK-NEXT:    movd %xmm0, %eax
428 ; CHECK-NEXT:    movd %xmm1, %r10d
429 ; CHECK-NEXT:    cltd
430 ; CHECK-NEXT:    idivl %r10d
431 ; CHECK-NEXT:    movd %eax, %xmm2
432 ; CHECK-NEXT:    pinsrd $1, %r8d, %xmm2
433 ; CHECK-NEXT:    pextrd $2, %xmm0, %eax
434 ; CHECK-NEXT:    pextrd $2, %xmm1, %r8d
435 ; CHECK-NEXT:    cltd
436 ; CHECK-NEXT:    idivl %r8d
437 ; CHECK-NEXT:    movl %eax, 8(%rdi,%rcx)
438 ; CHECK-NEXT:    movq %xmm2, (%rdi,%rcx)
439 ; CHECK-NEXT:    addq $16, %rcx
440 ; CHECK-NEXT:    decl %r9d
441 ; CHECK-NEXT:    jne .LBB12_2
442 ; CHECK-NEXT:  .LBB12_3: # %for.end
443 ; CHECK-NEXT:    retq
444 entry:
445   %cmp13 = icmp sgt i32 %n, 0
446   br i1 %cmp13, label %bb.nph, label %for.end
448 bb.nph:
449   br label %for.body
451 for.body:
452   %i.014 = phi i32 [ 0, %bb.nph ], [ %inc, %for.body ]
453   %arrayidx11 = getelementptr <3 x i32>, <3 x i32>* %dest, i32 %i.014
454   %tmp4 = load <3 x i32>, <3 x i32>* %arrayidx11 ; <<3 x i32>> [#uses=1]
455   %arrayidx7 = getelementptr inbounds <3 x i32>, <3 x i32>* %old, i32 %i.014
456   %tmp8 = load <3 x i32>, <3 x i32>* %arrayidx7 ; <<3 x i32>> [#uses=1]
457   %div = sdiv <3 x i32> %tmp4, %tmp8
458   store <3 x i32> %div, <3 x i32>* %arrayidx11
459   %inc = add nsw i32 %i.014, 1
460   %exitcond = icmp eq i32 %inc, %n
461   br i1 %exitcond, label %for.end, label %for.body
463 for.end:                                          ; preds = %for.body, %entry
464   ret void