1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=i686-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=X86
3 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=X64
4 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+sse2 < %s | FileCheck %s --check-prefixes=X64,SSE2
5 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+sse4.1 < %s | FileCheck %s --check-prefixes=X64,SSE41
6 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx < %s | FileCheck %s --check-prefixes=X64,AVX1
7 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx2 < %s | FileCheck %s --check-prefixes=X64,AVX2
8 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f,+avx512vl < %s | FileCheck %s --check-prefixes=X64,AVX512VL
10 define i1 @test_srem_odd(i29 %X) nounwind {
11 ; X86-LABEL: test_srem_odd:
13 ; X86-NEXT: imull $526025035, {{[0-9]+}}(%esp), %eax # imm = 0x1F5A814B
14 ; X86-NEXT: addl $2711469, %eax # imm = 0x295FAD
15 ; X86-NEXT: andl $536870911, %eax # imm = 0x1FFFFFFF
16 ; X86-NEXT: cmpl $5422939, %eax # imm = 0x52BF5B
20 ; X64-LABEL: test_srem_odd:
22 ; X64-NEXT: imull $526025035, %edi, %eax # imm = 0x1F5A814B
23 ; X64-NEXT: addl $2711469, %eax # imm = 0x295FAD
24 ; X64-NEXT: andl $536870911, %eax # imm = 0x1FFFFFFF
25 ; X64-NEXT: cmpl $5422939, %eax # imm = 0x52BF5B
28 %srem = srem i29 %X, 99
29 %cmp = icmp eq i29 %srem, 0
33 define i1 @test_srem_even(i4 %X) nounwind {
34 ; X86-LABEL: test_srem_even:
36 ; X86-NEXT: movb {{[0-9]+}}(%esp), %al
37 ; X86-NEXT: shlb $4, %al
38 ; X86-NEXT: sarb $4, %al
39 ; X86-NEXT: movsbl %al, %ecx
40 ; X86-NEXT: imull $43, %ecx, %ecx
41 ; X86-NEXT: movzwl %cx, %ecx
42 ; X86-NEXT: movl %ecx, %edx
43 ; X86-NEXT: shrl $15, %edx
44 ; X86-NEXT: addb %ch, %dl
45 ; X86-NEXT: movzbl %dl, %ecx
46 ; X86-NEXT: addl %ecx, %ecx
47 ; X86-NEXT: leal (%ecx,%ecx,2), %ecx
48 ; X86-NEXT: subb %cl, %al
49 ; X86-NEXT: cmpb $1, %al
53 ; X64-LABEL: test_srem_even:
55 ; X64-NEXT: shlb $4, %dil
56 ; X64-NEXT: sarb $4, %dil
57 ; X64-NEXT: movsbl %dil, %eax
58 ; X64-NEXT: imull $43, %eax, %ecx
59 ; X64-NEXT: movzwl %cx, %ecx
60 ; X64-NEXT: movl %ecx, %edx
61 ; X64-NEXT: shrl $15, %edx
62 ; X64-NEXT: shrl $8, %ecx
63 ; X64-NEXT: addb %dl, %cl
64 ; X64-NEXT: movzbl %cl, %ecx
65 ; X64-NEXT: addl %ecx, %ecx
66 ; X64-NEXT: leal (%rcx,%rcx,2), %ecx
67 ; X64-NEXT: subb %cl, %al
68 ; X64-NEXT: cmpb $1, %al
72 %cmp = icmp eq i4 %srem, 1
76 define i1 @test_srem_pow2_setne(i6 %X) nounwind {
77 ; X86-LABEL: test_srem_pow2_setne:
79 ; X86-NEXT: movb {{[0-9]+}}(%esp), %al
80 ; X86-NEXT: movl %eax, %ecx
81 ; X86-NEXT: shlb $2, %cl
82 ; X86-NEXT: sarb $5, %cl
83 ; X86-NEXT: shrb $4, %cl
84 ; X86-NEXT: andb $3, %cl
85 ; X86-NEXT: addb %al, %cl
86 ; X86-NEXT: andb $60, %cl
87 ; X86-NEXT: subb %cl, %al
88 ; X86-NEXT: testb $63, %al
92 ; X64-LABEL: test_srem_pow2_setne:
94 ; X64-NEXT: # kill: def $edi killed $edi def $rdi
95 ; X64-NEXT: leal (,%rdi,4), %eax
96 ; X64-NEXT: sarb $5, %al
97 ; X64-NEXT: shrb $4, %al
98 ; X64-NEXT: andb $3, %al
99 ; X64-NEXT: addb %dil, %al
100 ; X64-NEXT: andb $60, %al
101 ; X64-NEXT: subb %al, %dil
102 ; X64-NEXT: testb $63, %dil
103 ; X64-NEXT: setne %al
105 %srem = srem i6 %X, 4
106 %cmp = icmp ne i6 %srem, 0
110 define <3 x i1> @test_srem_vec(<3 x i33> %X) nounwind {
111 ; X86-LABEL: test_srem_vec:
113 ; X86-NEXT: pushl %ebp
114 ; X86-NEXT: pushl %ebx
115 ; X86-NEXT: pushl %edi
116 ; X86-NEXT: pushl %esi
117 ; X86-NEXT: subl $12, %esp
118 ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
119 ; X86-NEXT: andl $1, %edi
120 ; X86-NEXT: negl %edi
121 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx
122 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp
123 ; X86-NEXT: andl $1, %ebp
124 ; X86-NEXT: negl %ebp
125 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
126 ; X86-NEXT: andl $1, %eax
127 ; X86-NEXT: negl %eax
128 ; X86-NEXT: pushl $-1
129 ; X86-NEXT: pushl $-9
130 ; X86-NEXT: pushl %eax
131 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
132 ; X86-NEXT: calll __moddi3
133 ; X86-NEXT: addl $16, %esp
134 ; X86-NEXT: movl %eax, %esi
135 ; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
138 ; X86-NEXT: pushl %ebp
139 ; X86-NEXT: pushl %ebx
140 ; X86-NEXT: calll __moddi3
141 ; X86-NEXT: addl $16, %esp
142 ; X86-NEXT: movl %eax, %ebx
143 ; X86-NEXT: movl %edx, %ebp
144 ; X86-NEXT: notl %ebp
147 ; X86-NEXT: pushl %edi
148 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
149 ; X86-NEXT: calll __moddi3
150 ; X86-NEXT: addl $16, %esp
151 ; X86-NEXT: xorl $3, %eax
152 ; X86-NEXT: orl %edx, %eax
153 ; X86-NEXT: setne %al
154 ; X86-NEXT: xorl $3, %esi
155 ; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
156 ; X86-NEXT: setne %cl
157 ; X86-NEXT: xorl $-3, %ebx
158 ; X86-NEXT: andl $1, %ebp
159 ; X86-NEXT: orl %ebx, %ebp
160 ; X86-NEXT: setne %dl
161 ; X86-NEXT: addl $12, %esp
162 ; X86-NEXT: popl %esi
163 ; X86-NEXT: popl %edi
164 ; X86-NEXT: popl %ebx
165 ; X86-NEXT: popl %ebp
168 ; SSE2-LABEL: test_srem_vec:
170 ; SSE2-NEXT: movq %rdx, %rcx
171 ; SSE2-NEXT: shlq $31, %rcx
172 ; SSE2-NEXT: sarq $31, %rcx
173 ; SSE2-NEXT: shlq $31, %rdi
174 ; SSE2-NEXT: sarq $31, %rdi
175 ; SSE2-NEXT: shlq $31, %rsi
176 ; SSE2-NEXT: sarq $31, %rsi
177 ; SSE2-NEXT: movabsq $2049638230412172402, %r8 # imm = 0x1C71C71C71C71C72
178 ; SSE2-NEXT: movq %rsi, %rax
179 ; SSE2-NEXT: imulq %r8
180 ; SSE2-NEXT: movq %rdx, %rax
181 ; SSE2-NEXT: shrq $63, %rax
182 ; SSE2-NEXT: addq %rdx, %rax
183 ; SSE2-NEXT: leaq (%rax,%rax,8), %rax
184 ; SSE2-NEXT: subq %rax, %rsi
185 ; SSE2-NEXT: movq %rsi, %xmm1
186 ; SSE2-NEXT: movq %rdi, %rax
187 ; SSE2-NEXT: imulq %r8
188 ; SSE2-NEXT: movq %rdx, %rax
189 ; SSE2-NEXT: shrq $63, %rax
190 ; SSE2-NEXT: addq %rdx, %rax
191 ; SSE2-NEXT: leaq (%rax,%rax,8), %rax
192 ; SSE2-NEXT: subq %rax, %rdi
193 ; SSE2-NEXT: movq %rdi, %xmm0
194 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
195 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [8589934591,8589934591]
196 ; SSE2-NEXT: pand %xmm1, %xmm0
197 ; SSE2-NEXT: movabsq $2049638230412172401, %rdx # imm = 0x1C71C71C71C71C71
198 ; SSE2-NEXT: movq %rcx, %rax
199 ; SSE2-NEXT: imulq %rdx
200 ; SSE2-NEXT: subq %rcx, %rdx
201 ; SSE2-NEXT: movq %rdx, %rax
202 ; SSE2-NEXT: shrq $63, %rax
203 ; SSE2-NEXT: sarq $3, %rdx
204 ; SSE2-NEXT: addq %rax, %rdx
205 ; SSE2-NEXT: leaq (%rdx,%rdx,8), %rax
206 ; SSE2-NEXT: addq %rcx, %rax
207 ; SSE2-NEXT: movq %rax, %xmm2
208 ; SSE2-NEXT: pand %xmm1, %xmm2
209 ; SSE2-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
210 ; SSE2-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
211 ; SSE2-NEXT: movdqa %xmm0, %xmm1
212 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3],xmm2[1,2]
213 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,3]
214 ; SSE2-NEXT: andps %xmm1, %xmm0
215 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
216 ; SSE2-NEXT: pxor %xmm0, %xmm1
217 ; SSE2-NEXT: movdqa %xmm1, -{{[0-9]+}}(%rsp)
218 ; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %al
219 ; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %dl
220 ; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %cl
223 ; SSE41-LABEL: test_srem_vec:
225 ; SSE41-NEXT: movq %rdx, %rcx
226 ; SSE41-NEXT: shlq $31, %rcx
227 ; SSE41-NEXT: sarq $31, %rcx
228 ; SSE41-NEXT: shlq $31, %rdi
229 ; SSE41-NEXT: sarq $31, %rdi
230 ; SSE41-NEXT: shlq $31, %rsi
231 ; SSE41-NEXT: sarq $31, %rsi
232 ; SSE41-NEXT: movabsq $2049638230412172402, %r8 # imm = 0x1C71C71C71C71C72
233 ; SSE41-NEXT: movq %rsi, %rax
234 ; SSE41-NEXT: imulq %r8
235 ; SSE41-NEXT: movq %rdx, %rax
236 ; SSE41-NEXT: shrq $63, %rax
237 ; SSE41-NEXT: addq %rdx, %rax
238 ; SSE41-NEXT: leaq (%rax,%rax,8), %rax
239 ; SSE41-NEXT: subq %rax, %rsi
240 ; SSE41-NEXT: movq %rsi, %xmm1
241 ; SSE41-NEXT: movq %rdi, %rax
242 ; SSE41-NEXT: imulq %r8
243 ; SSE41-NEXT: movq %rdx, %rax
244 ; SSE41-NEXT: shrq $63, %rax
245 ; SSE41-NEXT: addq %rdx, %rax
246 ; SSE41-NEXT: leaq (%rax,%rax,8), %rax
247 ; SSE41-NEXT: subq %rax, %rdi
248 ; SSE41-NEXT: movq %rdi, %xmm0
249 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
250 ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [8589934591,8589934591]
251 ; SSE41-NEXT: pand %xmm1, %xmm0
252 ; SSE41-NEXT: movabsq $2049638230412172401, %rdx # imm = 0x1C71C71C71C71C71
253 ; SSE41-NEXT: movq %rcx, %rax
254 ; SSE41-NEXT: imulq %rdx
255 ; SSE41-NEXT: subq %rcx, %rdx
256 ; SSE41-NEXT: movq %rdx, %rax
257 ; SSE41-NEXT: shrq $63, %rax
258 ; SSE41-NEXT: sarq $3, %rdx
259 ; SSE41-NEXT: addq %rax, %rdx
260 ; SSE41-NEXT: leaq (%rdx,%rdx,8), %rax
261 ; SSE41-NEXT: addq %rcx, %rax
262 ; SSE41-NEXT: movq %rax, %xmm2
263 ; SSE41-NEXT: pand %xmm1, %xmm2
264 ; SSE41-NEXT: pcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
265 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
266 ; SSE41-NEXT: pxor %xmm1, %xmm0
267 ; SSE41-NEXT: pcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
268 ; SSE41-NEXT: pxor %xmm1, %xmm2
269 ; SSE41-NEXT: pextrb $0, %xmm0, %eax
270 ; SSE41-NEXT: pextrb $8, %xmm0, %edx
271 ; SSE41-NEXT: pextrb $0, %xmm2, %ecx
272 ; SSE41-NEXT: # kill: def $al killed $al killed $eax
273 ; SSE41-NEXT: # kill: def $dl killed $dl killed $edx
274 ; SSE41-NEXT: # kill: def $cl killed $cl killed $ecx
277 ; AVX1-LABEL: test_srem_vec:
279 ; AVX1-NEXT: movq %rdx, %rcx
280 ; AVX1-NEXT: shlq $31, %rcx
281 ; AVX1-NEXT: sarq $31, %rcx
282 ; AVX1-NEXT: shlq $31, %rdi
283 ; AVX1-NEXT: sarq $31, %rdi
284 ; AVX1-NEXT: shlq $31, %rsi
285 ; AVX1-NEXT: sarq $31, %rsi
286 ; AVX1-NEXT: movabsq $2049638230412172402, %r8 # imm = 0x1C71C71C71C71C72
287 ; AVX1-NEXT: movq %rsi, %rax
288 ; AVX1-NEXT: imulq %r8
289 ; AVX1-NEXT: movq %rdx, %rax
290 ; AVX1-NEXT: shrq $63, %rax
291 ; AVX1-NEXT: addq %rdx, %rax
292 ; AVX1-NEXT: leaq (%rax,%rax,8), %rax
293 ; AVX1-NEXT: subq %rax, %rsi
294 ; AVX1-NEXT: vmovq %rsi, %xmm0
295 ; AVX1-NEXT: movq %rdi, %rax
296 ; AVX1-NEXT: imulq %r8
297 ; AVX1-NEXT: movq %rdx, %rax
298 ; AVX1-NEXT: shrq $63, %rax
299 ; AVX1-NEXT: addq %rdx, %rax
300 ; AVX1-NEXT: leaq (%rax,%rax,8), %rax
301 ; AVX1-NEXT: subq %rax, %rdi
302 ; AVX1-NEXT: vmovq %rdi, %xmm1
303 ; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
304 ; AVX1-NEXT: movabsq $2049638230412172401, %rdx # imm = 0x1C71C71C71C71C71
305 ; AVX1-NEXT: movq %rcx, %rax
306 ; AVX1-NEXT: imulq %rdx
307 ; AVX1-NEXT: subq %rcx, %rdx
308 ; AVX1-NEXT: movq %rdx, %rax
309 ; AVX1-NEXT: shrq $63, %rax
310 ; AVX1-NEXT: sarq $3, %rdx
311 ; AVX1-NEXT: addq %rax, %rdx
312 ; AVX1-NEXT: leaq (%rdx,%rdx,8), %rax
313 ; AVX1-NEXT: addq %rcx, %rax
314 ; AVX1-NEXT: vmovq %rax, %xmm1
315 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
316 ; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
317 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
318 ; AVX1-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
319 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
320 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1
321 ; AVX1-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
322 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
323 ; AVX1-NEXT: vpextrb $0, %xmm0, %eax
324 ; AVX1-NEXT: vpextrb $8, %xmm0, %edx
325 ; AVX1-NEXT: vpextrb $0, %xmm1, %ecx
326 ; AVX1-NEXT: # kill: def $al killed $al killed $eax
327 ; AVX1-NEXT: # kill: def $dl killed $dl killed $edx
328 ; AVX1-NEXT: # kill: def $cl killed $cl killed $ecx
329 ; AVX1-NEXT: vzeroupper
332 ; AVX2-LABEL: test_srem_vec:
334 ; AVX2-NEXT: movq %rdx, %rcx
335 ; AVX2-NEXT: shlq $31, %rcx
336 ; AVX2-NEXT: sarq $31, %rcx
337 ; AVX2-NEXT: shlq $31, %rdi
338 ; AVX2-NEXT: sarq $31, %rdi
339 ; AVX2-NEXT: shlq $31, %rsi
340 ; AVX2-NEXT: sarq $31, %rsi
341 ; AVX2-NEXT: movabsq $2049638230412172402, %r8 # imm = 0x1C71C71C71C71C72
342 ; AVX2-NEXT: movq %rsi, %rax
343 ; AVX2-NEXT: imulq %r8
344 ; AVX2-NEXT: movq %rdx, %rax
345 ; AVX2-NEXT: shrq $63, %rax
346 ; AVX2-NEXT: addq %rdx, %rax
347 ; AVX2-NEXT: leaq (%rax,%rax,8), %rax
348 ; AVX2-NEXT: subq %rax, %rsi
349 ; AVX2-NEXT: vmovq %rsi, %xmm0
350 ; AVX2-NEXT: movq %rdi, %rax
351 ; AVX2-NEXT: imulq %r8
352 ; AVX2-NEXT: movq %rdx, %rax
353 ; AVX2-NEXT: shrq $63, %rax
354 ; AVX2-NEXT: addq %rdx, %rax
355 ; AVX2-NEXT: leaq (%rax,%rax,8), %rax
356 ; AVX2-NEXT: subq %rax, %rdi
357 ; AVX2-NEXT: vmovq %rdi, %xmm1
358 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
359 ; AVX2-NEXT: movabsq $2049638230412172401, %rdx # imm = 0x1C71C71C71C71C71
360 ; AVX2-NEXT: movq %rcx, %rax
361 ; AVX2-NEXT: imulq %rdx
362 ; AVX2-NEXT: subq %rcx, %rdx
363 ; AVX2-NEXT: movq %rdx, %rax
364 ; AVX2-NEXT: shrq $63, %rax
365 ; AVX2-NEXT: sarq $3, %rdx
366 ; AVX2-NEXT: addq %rax, %rdx
367 ; AVX2-NEXT: leaq (%rdx,%rdx,8), %rax
368 ; AVX2-NEXT: addq %rcx, %rax
369 ; AVX2-NEXT: vmovq %rax, %xmm1
370 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
371 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [8589934591,8589934591,8589934591,8589934591]
372 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
373 ; AVX2-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
374 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
375 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
376 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
377 ; AVX2-NEXT: vpextrb $0, %xmm0, %eax
378 ; AVX2-NEXT: vpextrb $8, %xmm0, %edx
379 ; AVX2-NEXT: vpextrb $0, %xmm1, %ecx
380 ; AVX2-NEXT: # kill: def $al killed $al killed $eax
381 ; AVX2-NEXT: # kill: def $dl killed $dl killed $edx
382 ; AVX2-NEXT: # kill: def $cl killed $cl killed $ecx
383 ; AVX2-NEXT: vzeroupper
386 ; AVX512VL-LABEL: test_srem_vec:
388 ; AVX512VL-NEXT: movq %rdx, %rcx
389 ; AVX512VL-NEXT: shlq $31, %rcx
390 ; AVX512VL-NEXT: sarq $31, %rcx
391 ; AVX512VL-NEXT: shlq $31, %rdi
392 ; AVX512VL-NEXT: sarq $31, %rdi
393 ; AVX512VL-NEXT: shlq $31, %rsi
394 ; AVX512VL-NEXT: sarq $31, %rsi
395 ; AVX512VL-NEXT: movabsq $2049638230412172402, %r8 # imm = 0x1C71C71C71C71C72
396 ; AVX512VL-NEXT: movq %rsi, %rax
397 ; AVX512VL-NEXT: imulq %r8
398 ; AVX512VL-NEXT: movq %rdx, %rax
399 ; AVX512VL-NEXT: shrq $63, %rax
400 ; AVX512VL-NEXT: addq %rdx, %rax
401 ; AVX512VL-NEXT: leaq (%rax,%rax,8), %rax
402 ; AVX512VL-NEXT: subq %rax, %rsi
403 ; AVX512VL-NEXT: vmovq %rsi, %xmm0
404 ; AVX512VL-NEXT: movq %rdi, %rax
405 ; AVX512VL-NEXT: imulq %r8
406 ; AVX512VL-NEXT: movq %rdx, %rax
407 ; AVX512VL-NEXT: shrq $63, %rax
408 ; AVX512VL-NEXT: addq %rdx, %rax
409 ; AVX512VL-NEXT: leaq (%rax,%rax,8), %rax
410 ; AVX512VL-NEXT: subq %rax, %rdi
411 ; AVX512VL-NEXT: vmovq %rdi, %xmm1
412 ; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
413 ; AVX512VL-NEXT: movabsq $2049638230412172401, %rdx # imm = 0x1C71C71C71C71C71
414 ; AVX512VL-NEXT: movq %rcx, %rax
415 ; AVX512VL-NEXT: imulq %rdx
416 ; AVX512VL-NEXT: subq %rcx, %rdx
417 ; AVX512VL-NEXT: movq %rdx, %rax
418 ; AVX512VL-NEXT: shrq $63, %rax
419 ; AVX512VL-NEXT: sarq $3, %rdx
420 ; AVX512VL-NEXT: addq %rax, %rdx
421 ; AVX512VL-NEXT: leaq (%rdx,%rdx,8), %rax
422 ; AVX512VL-NEXT: addq %rcx, %rax
423 ; AVX512VL-NEXT: vmovq %rax, %xmm1
424 ; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
425 ; AVX512VL-NEXT: vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
426 ; AVX512VL-NEXT: vpcmpneqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %k0
427 ; AVX512VL-NEXT: kshiftrw $1, %k0, %k1
428 ; AVX512VL-NEXT: kmovw %k1, %edx
429 ; AVX512VL-NEXT: kshiftrw $2, %k0, %k1
430 ; AVX512VL-NEXT: kmovw %k1, %ecx
431 ; AVX512VL-NEXT: kmovw %k0, %eax
432 ; AVX512VL-NEXT: # kill: def $al killed $al killed $eax
433 ; AVX512VL-NEXT: # kill: def $dl killed $dl killed $edx
434 ; AVX512VL-NEXT: # kill: def $cl killed $cl killed $ecx
435 ; AVX512VL-NEXT: vzeroupper
436 ; AVX512VL-NEXT: retq
437 %srem = srem <3 x i33> %X, <i33 9, i33 9, i33 -9>
438 %cmp = icmp ne <3 x i33> %srem, <i33 3, i33 -3, i33 3>