xref: /llvm-project/llvm/test/CodeGen/X86/srem-seteq-illegal-types.ll (revision abc1acf8df3b212a03650c314b7832b3aa7ccd42)
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
9
10define i1 @test_srem_odd(i29 %X) nounwind {
11; X86-LABEL: test_srem_odd:
12; X86:       # %bb.0:
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
17; X86-NEXT:    setb %al
18; X86-NEXT:    retl
19;
20; X64-LABEL: test_srem_odd:
21; X64:       # %bb.0:
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
26; X64-NEXT:    setb %al
27; X64-NEXT:    retq
28  %srem = srem i29 %X, 99
29  %cmp = icmp eq i29 %srem, 0
30  ret i1 %cmp
31}
32
33define i1 @test_srem_even(i4 %X) nounwind {
34; X86-LABEL: test_srem_even:
35; X86:       # %bb.0:
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
52; X86-NEXT:    sete %al
53; X86-NEXT:    retl
54;
55; X64-LABEL: test_srem_even:
56; X64:       # %bb.0:
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
72; X64-NEXT:    sete %al
73; X64-NEXT:    retq
74  %srem = srem i4 %X, 6
75  %cmp = icmp eq i4 %srem, 1
76  ret i1 %cmp
77}
78
79define i1 @test_srem_pow2_setne(i6 %X) nounwind {
80; X86-LABEL: test_srem_pow2_setne:
81; X86:       # %bb.0:
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
91; X86-NEXT:    setne %al
92; X86-NEXT:    retl
93;
94; X64-LABEL: test_srem_pow2_setne:
95; X64:       # %bb.0:
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
105; X64-NEXT:    retq
106  %srem = srem i6 %X, 4
107  %cmp = icmp ne i6 %srem, 0
108  ret i1 %cmp
109}
110
111define <3 x i1> @test_srem_vec(<3 x i33> %X) nounwind {
112; X86-LABEL: test_srem_vec:
113; X86:       # %bb.0:
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
137; X86-NEXT:    pushl $0
138; X86-NEXT:    pushl $9
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
146; X86-NEXT:    pushl $0
147; X86-NEXT:    pushl $9
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
167; X86-NEXT:    retl
168;
169; SSE2-LABEL: test_srem_vec:
170; SSE2:       # %bb.0:
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
222; SSE2-NEXT:    retq
223;
224; SSE41-LABEL: test_srem_vec:
225; SSE41:       # %bb.0:
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
278; SSE41-NEXT:    retq
279;
280; AVX1-LABEL: test_srem_vec:
281; AVX1:       # %bb.0:
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
335; AVX1-NEXT:    retq
336;
337; AVX2-LABEL: test_srem_vec:
338; AVX2:       # %bb.0:
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
390; AVX2-NEXT:    retq
391;
392; AVX512VL-LABEL: test_srem_vec:
393; AVX512VL:       # %bb.0:
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>
445  ret <3 x i1> %cmp
446}
447