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: movzbl {{[0-9]+}}(%esp), %eax
37 ; X86-NEXT: movl %eax, %ecx
38 ; X86-NEXT: shlb $4, %cl
39 ; X86-NEXT: sarb $4, %cl
40 ; X86-NEXT: movzbl %cl, %ecx
41 ; X86-NEXT: leal (%ecx,%ecx,2), %ecx
42 ; X86-NEXT: movl %ecx, %edx
43 ; X86-NEXT: shrb $7, %dl
44 ; X86-NEXT: shrb $4, %cl
45 ; X86-NEXT: addb %dl, %cl
46 ; X86-NEXT: movzbl %cl, %ecx
47 ; X86-NEXT: addl %ecx, %ecx
48 ; X86-NEXT: leal (%ecx,%ecx,2), %ecx
49 ; X86-NEXT: subb %cl, %al
50 ; X86-NEXT: andb $15, %al
51 ; X86-NEXT: cmpb $1, %al
55 ; X64-LABEL: test_srem_even:
57 ; X64-NEXT: movl %edi, %eax
58 ; X64-NEXT: shlb $4, %al
59 ; X64-NEXT: sarb $4, %al
60 ; X64-NEXT: movzbl %al, %eax
61 ; X64-NEXT: leal (%rax,%rax,2), %eax
62 ; X64-NEXT: movl %eax, %ecx
63 ; X64-NEXT: shrb $7, %cl
64 ; X64-NEXT: shrb $4, %al
65 ; X64-NEXT: addb %cl, %al
66 ; X64-NEXT: movzbl %al, %eax
67 ; X64-NEXT: addl %eax, %eax
68 ; X64-NEXT: leal (%rax,%rax,2), %eax
69 ; X64-NEXT: subb %al, %dil
70 ; X64-NEXT: andb $15, %dil
71 ; X64-NEXT: cmpb $1, %dil
75 %cmp = icmp eq i4 %srem, 1
79 define i1 @test_srem_pow2_setne(i6 %X) nounwind {
80 ; X86-LABEL: test_srem_pow2_setne:
82 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
83 ; X86-NEXT: movl %eax, %ecx
84 ; X86-NEXT: shlb $2, %cl
85 ; X86-NEXT: sarb $7, %cl
86 ; X86-NEXT: andb $3, %cl
87 ; X86-NEXT: addb %al, %cl
88 ; X86-NEXT: andb $60, %cl
89 ; X86-NEXT: subb %cl, %al
90 ; X86-NEXT: testb $63, %al
94 ; X64-LABEL: test_srem_pow2_setne:
96 ; X64-NEXT: # kill: def $edi killed $edi def $rdi
97 ; X64-NEXT: leal (,%rdi,4), %eax
98 ; X64-NEXT: sarb $7, %al
99 ; X64-NEXT: andb $3, %al
100 ; X64-NEXT: addb %dil, %al
101 ; X64-NEXT: andb $60, %al
102 ; X64-NEXT: subb %al, %dil
103 ; X64-NEXT: testb $63, %dil
104 ; X64-NEXT: setne %al
106 %srem = srem i6 %X, 4
107 %cmp = icmp ne i6 %srem, 0
111 define <3 x i1> @test_srem_vec(<3 x i33> %X) nounwind {
112 ; X86-LABEL: test_srem_vec:
114 ; X86-NEXT: pushl %ebp
115 ; X86-NEXT: pushl %ebx
116 ; X86-NEXT: pushl %edi
117 ; X86-NEXT: pushl %esi
118 ; X86-NEXT: subl $12, %esp
119 ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
120 ; X86-NEXT: andl $1, %edi
121 ; X86-NEXT: negl %edi
122 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx
123 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp
124 ; X86-NEXT: andl $1, %ebp
125 ; X86-NEXT: negl %ebp
126 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
127 ; X86-NEXT: andl $1, %eax
128 ; X86-NEXT: negl %eax
129 ; X86-NEXT: pushl $-1
130 ; X86-NEXT: pushl $-9
131 ; X86-NEXT: pushl %eax
132 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
133 ; X86-NEXT: calll __moddi3
134 ; X86-NEXT: addl $16, %esp
135 ; X86-NEXT: movl %eax, %esi
136 ; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
139 ; X86-NEXT: pushl %ebp
140 ; X86-NEXT: pushl %ebx
141 ; X86-NEXT: calll __moddi3
142 ; X86-NEXT: addl $16, %esp
143 ; X86-NEXT: movl %eax, %ebx
144 ; X86-NEXT: movl %edx, %ebp
145 ; X86-NEXT: notl %ebp
148 ; X86-NEXT: pushl %edi
149 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
150 ; X86-NEXT: calll __moddi3
151 ; X86-NEXT: addl $16, %esp
152 ; X86-NEXT: xorl $3, %eax
153 ; X86-NEXT: orl %edx, %eax
154 ; X86-NEXT: setne %al
155 ; X86-NEXT: xorl $3, %esi
156 ; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
157 ; X86-NEXT: setne %cl
158 ; X86-NEXT: xorl $-3, %ebx
159 ; X86-NEXT: andl $1, %ebp
160 ; X86-NEXT: orl %ebx, %ebp
161 ; X86-NEXT: setne %dl
162 ; X86-NEXT: addl $12, %esp
163 ; X86-NEXT: popl %esi
164 ; X86-NEXT: popl %edi
165 ; X86-NEXT: popl %ebx
166 ; X86-NEXT: popl %ebp
169 ; SSE2-LABEL: test_srem_vec:
171 ; SSE2-NEXT: movq %rdx, %rcx
172 ; SSE2-NEXT: shlq $31, %rcx
173 ; SSE2-NEXT: sarq $31, %rcx
174 ; SSE2-NEXT: shlq $31, %rdi
175 ; SSE2-NEXT: sarq $31, %rdi
176 ; SSE2-NEXT: shlq $31, %rsi
177 ; SSE2-NEXT: sarq $31, %rsi
178 ; SSE2-NEXT: movabsq $2049638230412172402, %r8 # imm = 0x1C71C71C71C71C72
179 ; SSE2-NEXT: movq %rsi, %rax
180 ; SSE2-NEXT: imulq %r8
181 ; SSE2-NEXT: movq %rdx, %rax
182 ; SSE2-NEXT: shrq $63, %rax
183 ; SSE2-NEXT: addq %rdx, %rax
184 ; SSE2-NEXT: leaq (%rax,%rax,8), %rax
185 ; SSE2-NEXT: subq %rax, %rsi
186 ; SSE2-NEXT: movq %rsi, %xmm1
187 ; SSE2-NEXT: movq %rdi, %rax
188 ; SSE2-NEXT: imulq %r8
189 ; SSE2-NEXT: movq %rdx, %rax
190 ; SSE2-NEXT: shrq $63, %rax
191 ; SSE2-NEXT: addq %rdx, %rax
192 ; SSE2-NEXT: leaq (%rax,%rax,8), %rax
193 ; SSE2-NEXT: subq %rax, %rdi
194 ; SSE2-NEXT: movq %rdi, %xmm0
195 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
196 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [8589934591,8589934591]
197 ; SSE2-NEXT: pand %xmm1, %xmm0
198 ; SSE2-NEXT: movabsq $2049638230412172401, %rdx # imm = 0x1C71C71C71C71C71
199 ; SSE2-NEXT: movq %rcx, %rax
200 ; SSE2-NEXT: imulq %rdx
201 ; SSE2-NEXT: subq %rcx, %rdx
202 ; SSE2-NEXT: movq %rdx, %rax
203 ; SSE2-NEXT: shrq $63, %rax
204 ; SSE2-NEXT: sarq $3, %rdx
205 ; SSE2-NEXT: addq %rax, %rdx
206 ; SSE2-NEXT: leaq (%rdx,%rdx,8), %rax
207 ; SSE2-NEXT: addq %rcx, %rax
208 ; SSE2-NEXT: movq %rax, %xmm2
209 ; SSE2-NEXT: pand %xmm1, %xmm2
210 ; SSE2-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
211 ; SSE2-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
212 ; SSE2-NEXT: movdqa %xmm0, %xmm1
213 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3],xmm2[1,2]
214 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,3]
215 ; SSE2-NEXT: andps %xmm1, %xmm0
216 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
217 ; SSE2-NEXT: pxor %xmm0, %xmm1
218 ; SSE2-NEXT: movdqa %xmm1, -{{[0-9]+}}(%rsp)
219 ; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax
220 ; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %edx
221 ; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx
224 ; SSE41-LABEL: test_srem_vec:
226 ; SSE41-NEXT: movq %rdx, %rcx
227 ; SSE41-NEXT: shlq $31, %rcx
228 ; SSE41-NEXT: sarq $31, %rcx
229 ; SSE41-NEXT: shlq $31, %rdi
230 ; SSE41-NEXT: sarq $31, %rdi
231 ; SSE41-NEXT: shlq $31, %rsi
232 ; SSE41-NEXT: sarq $31, %rsi
233 ; SSE41-NEXT: movabsq $2049638230412172402, %r8 # imm = 0x1C71C71C71C71C72
234 ; SSE41-NEXT: movq %rsi, %rax
235 ; SSE41-NEXT: imulq %r8
236 ; SSE41-NEXT: movq %rdx, %rax
237 ; SSE41-NEXT: shrq $63, %rax
238 ; SSE41-NEXT: addq %rdx, %rax
239 ; SSE41-NEXT: leaq (%rax,%rax,8), %rax
240 ; SSE41-NEXT: subq %rax, %rsi
241 ; SSE41-NEXT: movq %rsi, %xmm1
242 ; SSE41-NEXT: movq %rdi, %rax
243 ; SSE41-NEXT: imulq %r8
244 ; SSE41-NEXT: movq %rdx, %rax
245 ; SSE41-NEXT: shrq $63, %rax
246 ; SSE41-NEXT: addq %rdx, %rax
247 ; SSE41-NEXT: leaq (%rax,%rax,8), %rax
248 ; SSE41-NEXT: subq %rax, %rdi
249 ; SSE41-NEXT: movq %rdi, %xmm0
250 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
251 ; SSE41-NEXT: pmovsxbd {{.*#+}} xmm1 = [4294967295,1,4294967295,1]
252 ; SSE41-NEXT: pand %xmm1, %xmm0
253 ; SSE41-NEXT: movabsq $2049638230412172401, %rdx # imm = 0x1C71C71C71C71C71
254 ; SSE41-NEXT: movq %rcx, %rax
255 ; SSE41-NEXT: imulq %rdx
256 ; SSE41-NEXT: subq %rcx, %rdx
257 ; SSE41-NEXT: movq %rdx, %rax
258 ; SSE41-NEXT: shrq $63, %rax
259 ; SSE41-NEXT: sarq $3, %rdx
260 ; SSE41-NEXT: addq %rax, %rdx
261 ; SSE41-NEXT: leaq (%rdx,%rdx,8), %rax
262 ; SSE41-NEXT: addq %rcx, %rax
263 ; SSE41-NEXT: movq %rax, %xmm2
264 ; SSE41-NEXT: pand %xmm1, %xmm2
265 ; SSE41-NEXT: pcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
266 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
267 ; SSE41-NEXT: pxor %xmm1, %xmm0
268 ; SSE41-NEXT: movl $3, %eax
269 ; SSE41-NEXT: movq %rax, %xmm3
270 ; SSE41-NEXT: pcmpeqq %xmm2, %xmm3
271 ; SSE41-NEXT: pxor %xmm1, %xmm3
272 ; SSE41-NEXT: movd %xmm0, %eax
273 ; SSE41-NEXT: pextrb $8, %xmm0, %edx
274 ; SSE41-NEXT: pextrb $0, %xmm3, %ecx
275 ; SSE41-NEXT: # kill: def $al killed $al killed $eax
276 ; SSE41-NEXT: # kill: def $dl killed $dl killed $edx
277 ; SSE41-NEXT: # kill: def $cl killed $cl killed $ecx
280 ; AVX1-LABEL: test_srem_vec:
282 ; AVX1-NEXT: movq %rdx, %rcx
283 ; AVX1-NEXT: shlq $31, %rcx
284 ; AVX1-NEXT: sarq $31, %rcx
285 ; AVX1-NEXT: shlq $31, %rdi
286 ; AVX1-NEXT: sarq $31, %rdi
287 ; AVX1-NEXT: shlq $31, %rsi
288 ; AVX1-NEXT: sarq $31, %rsi
289 ; AVX1-NEXT: movabsq $2049638230412172402, %r8 # imm = 0x1C71C71C71C71C72
290 ; AVX1-NEXT: movq %rsi, %rax
291 ; AVX1-NEXT: imulq %r8
292 ; AVX1-NEXT: movq %rdx, %rax
293 ; AVX1-NEXT: shrq $63, %rax
294 ; AVX1-NEXT: addq %rdx, %rax
295 ; AVX1-NEXT: leaq (%rax,%rax,8), %rax
296 ; AVX1-NEXT: subq %rax, %rsi
297 ; AVX1-NEXT: vmovq %rsi, %xmm0
298 ; AVX1-NEXT: movq %rdi, %rax
299 ; AVX1-NEXT: imulq %r8
300 ; AVX1-NEXT: movq %rdx, %rax
301 ; AVX1-NEXT: shrq $63, %rax
302 ; AVX1-NEXT: addq %rdx, %rax
303 ; AVX1-NEXT: leaq (%rax,%rax,8), %rax
304 ; AVX1-NEXT: subq %rax, %rdi
305 ; AVX1-NEXT: vmovq %rdi, %xmm1
306 ; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
307 ; AVX1-NEXT: movabsq $2049638230412172401, %rdx # imm = 0x1C71C71C71C71C71
308 ; AVX1-NEXT: movq %rcx, %rax
309 ; AVX1-NEXT: imulq %rdx
310 ; AVX1-NEXT: subq %rcx, %rdx
311 ; AVX1-NEXT: movq %rdx, %rax
312 ; AVX1-NEXT: shrq $63, %rax
313 ; AVX1-NEXT: sarq $3, %rdx
314 ; AVX1-NEXT: addq %rax, %rdx
315 ; AVX1-NEXT: leaq (%rdx,%rdx,8), %rax
316 ; AVX1-NEXT: addq %rcx, %rax
317 ; AVX1-NEXT: vmovq %rax, %xmm1
318 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
319 ; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
320 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
321 ; AVX1-NEXT: movl $3, %eax
322 ; AVX1-NEXT: vmovq %rax, %xmm2
323 ; AVX1-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1
324 ; AVX1-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
325 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
326 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
327 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
328 ; AVX1-NEXT: vmovd %xmm0, %eax
329 ; AVX1-NEXT: vpextrb $4, %xmm0, %edx
330 ; AVX1-NEXT: vpextrb $8, %xmm0, %ecx
331 ; AVX1-NEXT: # kill: def $al killed $al killed $eax
332 ; AVX1-NEXT: # kill: def $dl killed $dl killed $edx
333 ; AVX1-NEXT: # kill: def $cl killed $cl killed $ecx
334 ; AVX1-NEXT: vzeroupper
337 ; AVX2-LABEL: test_srem_vec:
339 ; AVX2-NEXT: movq %rdx, %rcx
340 ; AVX2-NEXT: shlq $31, %rcx
341 ; AVX2-NEXT: sarq $31, %rcx
342 ; AVX2-NEXT: shlq $31, %rdi
343 ; AVX2-NEXT: sarq $31, %rdi
344 ; AVX2-NEXT: shlq $31, %rsi
345 ; AVX2-NEXT: sarq $31, %rsi
346 ; AVX2-NEXT: movabsq $2049638230412172402, %r8 # imm = 0x1C71C71C71C71C72
347 ; AVX2-NEXT: movq %rsi, %rax
348 ; AVX2-NEXT: imulq %r8
349 ; AVX2-NEXT: movq %rdx, %rax
350 ; AVX2-NEXT: shrq $63, %rax
351 ; AVX2-NEXT: addq %rdx, %rax
352 ; AVX2-NEXT: leaq (%rax,%rax,8), %rax
353 ; AVX2-NEXT: subq %rax, %rsi
354 ; AVX2-NEXT: vmovq %rsi, %xmm0
355 ; AVX2-NEXT: movq %rdi, %rax
356 ; AVX2-NEXT: imulq %r8
357 ; AVX2-NEXT: movq %rdx, %rax
358 ; AVX2-NEXT: shrq $63, %rax
359 ; AVX2-NEXT: addq %rdx, %rax
360 ; AVX2-NEXT: leaq (%rax,%rax,8), %rax
361 ; AVX2-NEXT: subq %rax, %rdi
362 ; AVX2-NEXT: vmovq %rdi, %xmm1
363 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
364 ; AVX2-NEXT: movabsq $2049638230412172401, %rdx # imm = 0x1C71C71C71C71C71
365 ; AVX2-NEXT: movq %rcx, %rax
366 ; AVX2-NEXT: imulq %rdx
367 ; AVX2-NEXT: subq %rcx, %rdx
368 ; AVX2-NEXT: movq %rdx, %rax
369 ; AVX2-NEXT: shrq $63, %rax
370 ; AVX2-NEXT: sarq $3, %rdx
371 ; AVX2-NEXT: addq %rax, %rdx
372 ; AVX2-NEXT: leaq (%rdx,%rdx,8), %rax
373 ; AVX2-NEXT: addq %rcx, %rax
374 ; AVX2-NEXT: vmovq %rax, %xmm1
375 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
376 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [8589934591,8589934591,8589934591,8589934591]
377 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
378 ; AVX2-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
379 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
380 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1
381 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
382 ; AVX2-NEXT: vmovd %xmm0, %eax
383 ; AVX2-NEXT: notl %eax
384 ; AVX2-NEXT: vpextrb $8, %xmm1, %edx
385 ; AVX2-NEXT: vpextrb $0, %xmm2, %ecx
386 ; AVX2-NEXT: # kill: def $al killed $al killed $eax
387 ; AVX2-NEXT: # kill: def $dl killed $dl killed $edx
388 ; AVX2-NEXT: # kill: def $cl killed $cl killed $ecx
389 ; AVX2-NEXT: vzeroupper
392 ; AVX512VL-LABEL: test_srem_vec:
394 ; AVX512VL-NEXT: movq %rdx, %rcx
395 ; AVX512VL-NEXT: shlq $31, %rcx
396 ; AVX512VL-NEXT: sarq $31, %rcx
397 ; AVX512VL-NEXT: shlq $31, %rdi
398 ; AVX512VL-NEXT: sarq $31, %rdi
399 ; AVX512VL-NEXT: shlq $31, %rsi
400 ; AVX512VL-NEXT: sarq $31, %rsi
401 ; AVX512VL-NEXT: movabsq $2049638230412172402, %r8 # imm = 0x1C71C71C71C71C72
402 ; AVX512VL-NEXT: movq %rsi, %rax
403 ; AVX512VL-NEXT: imulq %r8
404 ; AVX512VL-NEXT: movq %rdx, %rax
405 ; AVX512VL-NEXT: shrq $63, %rax
406 ; AVX512VL-NEXT: addq %rdx, %rax
407 ; AVX512VL-NEXT: leaq (%rax,%rax,8), %rax
408 ; AVX512VL-NEXT: subq %rax, %rsi
409 ; AVX512VL-NEXT: vmovq %rsi, %xmm0
410 ; AVX512VL-NEXT: movq %rdi, %rax
411 ; AVX512VL-NEXT: imulq %r8
412 ; AVX512VL-NEXT: movq %rdx, %rax
413 ; AVX512VL-NEXT: shrq $63, %rax
414 ; AVX512VL-NEXT: addq %rdx, %rax
415 ; AVX512VL-NEXT: leaq (%rax,%rax,8), %rax
416 ; AVX512VL-NEXT: subq %rax, %rdi
417 ; AVX512VL-NEXT: vmovq %rdi, %xmm1
418 ; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
419 ; AVX512VL-NEXT: movabsq $2049638230412172401, %rdx # imm = 0x1C71C71C71C71C71
420 ; AVX512VL-NEXT: movq %rcx, %rax
421 ; AVX512VL-NEXT: imulq %rdx
422 ; AVX512VL-NEXT: subq %rcx, %rdx
423 ; AVX512VL-NEXT: movq %rdx, %rax
424 ; AVX512VL-NEXT: shrq $63, %rax
425 ; AVX512VL-NEXT: sarq $3, %rdx
426 ; AVX512VL-NEXT: addq %rax, %rdx
427 ; AVX512VL-NEXT: leaq (%rdx,%rdx,8), %rax
428 ; AVX512VL-NEXT: addq %rcx, %rax
429 ; AVX512VL-NEXT: vmovq %rax, %xmm1
430 ; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
431 ; AVX512VL-NEXT: vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
432 ; AVX512VL-NEXT: vpcmpneqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %k0
433 ; AVX512VL-NEXT: kshiftrw $1, %k0, %k1
434 ; AVX512VL-NEXT: kmovw %k1, %edx
435 ; AVX512VL-NEXT: kshiftrw $2, %k0, %k1
436 ; AVX512VL-NEXT: kmovw %k1, %ecx
437 ; AVX512VL-NEXT: kmovw %k0, %eax
438 ; AVX512VL-NEXT: # kill: def $al killed $al killed $eax
439 ; AVX512VL-NEXT: # kill: def $dl killed $dl killed $edx
440 ; AVX512VL-NEXT: # kill: def $cl killed $cl killed $ecx
441 ; AVX512VL-NEXT: vzeroupper
442 ; AVX512VL-NEXT: retq
443 %srem = srem <3 x i33> %X, <i33 9, i33 9, i33 -9>
444 %cmp = icmp ne <3 x i33> %srem, <i33 3, i33 -3, i33 3>