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