[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / X86 / srem-seteq-vec-splat.ll
blob1d1f10f4d13a41d4fbcc5efb44eec5f43139ec98
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+sse2 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-SSE,CHECK-SSE2
3 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+sse4.1 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-SSE,CHECK-SSE41
4 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx < %s | FileCheck %s --check-prefixes=CHECK,CHECK-AVX,CHECK-AVX1
5 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx2 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-AVX,CHECK-AVX2
6 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f,+avx512vl < %s | FileCheck %s --check-prefixes=CHECK,CHECK-AVX,CHECK-AVX512VL
8 ; Odd divisor
9 define <4 x i32> @test_srem_odd_25(<4 x i32> %X) nounwind {
10 ; CHECK-SSE2-LABEL: test_srem_odd_25:
11 ; CHECK-SSE2:       # %bb.0:
12 ; CHECK-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [3264175145,3264175145,3264175145,3264175145]
13 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
14 ; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm0
15 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
16 ; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm2
17 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
18 ; CHECK-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
19 ; CHECK-SSE2-NEXT:    paddd {{.*}}(%rip), %xmm0
20 ; CHECK-SSE2-NEXT:    pxor {{.*}}(%rip), %xmm0
21 ; CHECK-SSE2-NEXT:    pcmpgtd {{.*}}(%rip), %xmm0
22 ; CHECK-SSE2-NEXT:    pandn {{.*}}(%rip), %xmm0
23 ; CHECK-SSE2-NEXT:    retq
25 ; CHECK-SSE41-LABEL: test_srem_odd_25:
26 ; CHECK-SSE41:       # %bb.0:
27 ; CHECK-SSE41-NEXT:    pmulld {{.*}}(%rip), %xmm0
28 ; CHECK-SSE41-NEXT:    paddd {{.*}}(%rip), %xmm0
29 ; CHECK-SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [171798690,171798690,171798690,171798690]
30 ; CHECK-SSE41-NEXT:    pminud %xmm0, %xmm1
31 ; CHECK-SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
32 ; CHECK-SSE41-NEXT:    psrld $31, %xmm0
33 ; CHECK-SSE41-NEXT:    retq
35 ; CHECK-AVX1-LABEL: test_srem_odd_25:
36 ; CHECK-AVX1:       # %bb.0:
37 ; CHECK-AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm0
38 ; CHECK-AVX1-NEXT:    vpaddd {{.*}}(%rip), %xmm0, %xmm0
39 ; CHECK-AVX1-NEXT:    vpminud {{.*}}(%rip), %xmm0, %xmm1
40 ; CHECK-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
41 ; CHECK-AVX1-NEXT:    vpsrld $31, %xmm0, %xmm0
42 ; CHECK-AVX1-NEXT:    retq
44 ; CHECK-AVX2-LABEL: test_srem_odd_25:
45 ; CHECK-AVX2:       # %bb.0:
46 ; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [3264175145,3264175145,3264175145,3264175145]
47 ; CHECK-AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
48 ; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [85899345,85899345,85899345,85899345]
49 ; CHECK-AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
50 ; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [171798690,171798690,171798690,171798690]
51 ; CHECK-AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm1
52 ; CHECK-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
53 ; CHECK-AVX2-NEXT:    vpsrld $31, %xmm0, %xmm0
54 ; CHECK-AVX2-NEXT:    retq
56 ; CHECK-AVX512VL-LABEL: test_srem_odd_25:
57 ; CHECK-AVX512VL:       # %bb.0:
58 ; CHECK-AVX512VL-NEXT:    vpmulld {{.*}}(%rip){1to4}, %xmm0, %xmm0
59 ; CHECK-AVX512VL-NEXT:    vpaddd {{.*}}(%rip){1to4}, %xmm0, %xmm0
60 ; CHECK-AVX512VL-NEXT:    vpminud {{.*}}(%rip){1to4}, %xmm0, %xmm1
61 ; CHECK-AVX512VL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
62 ; CHECK-AVX512VL-NEXT:    vpsrld $31, %xmm0, %xmm0
63 ; CHECK-AVX512VL-NEXT:    retq
64   %srem = srem <4 x i32> %X, <i32 25, i32 25, i32 25, i32 25>
65   %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>
66   %ret = zext <4 x i1> %cmp to <4 x i32>
67   ret <4 x i32> %ret
70 ; Even divisors
71 define <4 x i32> @test_srem_even_100(<4 x i32> %X) nounwind {
72 ; CHECK-SSE2-LABEL: test_srem_even_100:
73 ; CHECK-SSE2:       # %bb.0:
74 ; CHECK-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [1374389535,1374389535,1374389535,1374389535]
75 ; CHECK-SSE2-NEXT:    movdqa %xmm0, %xmm2
76 ; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm2
77 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
78 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
79 ; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm3
80 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]
81 ; CHECK-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
82 ; CHECK-SSE2-NEXT:    pxor %xmm3, %xmm3
83 ; CHECK-SSE2-NEXT:    pxor %xmm4, %xmm4
84 ; CHECK-SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
85 ; CHECK-SSE2-NEXT:    pand %xmm1, %xmm4
86 ; CHECK-SSE2-NEXT:    psubd %xmm4, %xmm2
87 ; CHECK-SSE2-NEXT:    movdqa %xmm2, %xmm1
88 ; CHECK-SSE2-NEXT:    psrld $31, %xmm1
89 ; CHECK-SSE2-NEXT:    psrad $5, %xmm2
90 ; CHECK-SSE2-NEXT:    paddd %xmm1, %xmm2
91 ; CHECK-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [100,100,100,100]
92 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
93 ; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm2
94 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
95 ; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm4
96 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[0,2,2,3]
97 ; CHECK-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
98 ; CHECK-SSE2-NEXT:    psubd %xmm2, %xmm0
99 ; CHECK-SSE2-NEXT:    pcmpeqd %xmm3, %xmm0
100 ; CHECK-SSE2-NEXT:    psrld $31, %xmm0
101 ; CHECK-SSE2-NEXT:    retq
103 ; CHECK-SSE41-LABEL: test_srem_even_100:
104 ; CHECK-SSE41:       # %bb.0:
105 ; CHECK-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
106 ; CHECK-SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [1374389535,1374389535,1374389535,1374389535]
107 ; CHECK-SSE41-NEXT:    pmuldq %xmm2, %xmm1
108 ; CHECK-SSE41-NEXT:    pmuldq %xmm0, %xmm2
109 ; CHECK-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
110 ; CHECK-SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
111 ; CHECK-SSE41-NEXT:    movdqa %xmm2, %xmm1
112 ; CHECK-SSE41-NEXT:    psrld $31, %xmm1
113 ; CHECK-SSE41-NEXT:    psrad $5, %xmm2
114 ; CHECK-SSE41-NEXT:    paddd %xmm1, %xmm2
115 ; CHECK-SSE41-NEXT:    pmulld {{.*}}(%rip), %xmm2
116 ; CHECK-SSE41-NEXT:    psubd %xmm2, %xmm0
117 ; CHECK-SSE41-NEXT:    pxor %xmm1, %xmm1
118 ; CHECK-SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
119 ; CHECK-SSE41-NEXT:    psrld $31, %xmm0
120 ; CHECK-SSE41-NEXT:    retq
122 ; CHECK-AVX1-LABEL: test_srem_even_100:
123 ; CHECK-AVX1:       # %bb.0:
124 ; CHECK-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
125 ; CHECK-AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [1374389535,1374389535,1374389535,1374389535]
126 ; CHECK-AVX1-NEXT:    vpmuldq %xmm2, %xmm1, %xmm1
127 ; CHECK-AVX1-NEXT:    vpmuldq %xmm2, %xmm0, %xmm2
128 ; CHECK-AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
129 ; CHECK-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
130 ; CHECK-AVX1-NEXT:    vpsrld $31, %xmm1, %xmm2
131 ; CHECK-AVX1-NEXT:    vpsrad $5, %xmm1, %xmm1
132 ; CHECK-AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
133 ; CHECK-AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm1, %xmm1
134 ; CHECK-AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
135 ; CHECK-AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
136 ; CHECK-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
137 ; CHECK-AVX1-NEXT:    vpsrld $31, %xmm0, %xmm0
138 ; CHECK-AVX1-NEXT:    retq
140 ; CHECK-AVX2-LABEL: test_srem_even_100:
141 ; CHECK-AVX2:       # %bb.0:
142 ; CHECK-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
143 ; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1374389535,1374389535,1374389535,1374389535]
144 ; CHECK-AVX2-NEXT:    vpmuldq %xmm2, %xmm1, %xmm1
145 ; CHECK-AVX2-NEXT:    vpmuldq %xmm2, %xmm0, %xmm2
146 ; CHECK-AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
147 ; CHECK-AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3]
148 ; CHECK-AVX2-NEXT:    vpsrld $31, %xmm1, %xmm2
149 ; CHECK-AVX2-NEXT:    vpsrad $5, %xmm1, %xmm1
150 ; CHECK-AVX2-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
151 ; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [100,100,100,100]
152 ; CHECK-AVX2-NEXT:    vpmulld %xmm2, %xmm1, %xmm1
153 ; CHECK-AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
154 ; CHECK-AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
155 ; CHECK-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
156 ; CHECK-AVX2-NEXT:    vpsrld $31, %xmm0, %xmm0
157 ; CHECK-AVX2-NEXT:    retq
159 ; CHECK-AVX512VL-LABEL: test_srem_even_100:
160 ; CHECK-AVX512VL:       # %bb.0:
161 ; CHECK-AVX512VL-NEXT:    vpmulld {{.*}}(%rip){1to4}, %xmm0, %xmm0
162 ; CHECK-AVX512VL-NEXT:    vpaddd {{.*}}(%rip){1to4}, %xmm0, %xmm0
163 ; CHECK-AVX512VL-NEXT:    vprord $2, %xmm0, %xmm0
164 ; CHECK-AVX512VL-NEXT:    vpminud {{.*}}(%rip){1to4}, %xmm0, %xmm1
165 ; CHECK-AVX512VL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
166 ; CHECK-AVX512VL-NEXT:    vpsrld $31, %xmm0, %xmm0
167 ; CHECK-AVX512VL-NEXT:    retq
168   %srem = srem <4 x i32> %X, <i32 100, i32 100, i32 100, i32 100>
169   %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>
170   %ret = zext <4 x i1> %cmp to <4 x i32>
171   ret <4 x i32> %ret
174 ; Negative divisors should be negated, and thus this is still splat vectors.
176 ; Odd divisor
177 define <4 x i32> @test_srem_odd_neg25(<4 x i32> %X) nounwind {
178 ; CHECK-SSE2-LABEL: test_srem_odd_neg25:
179 ; CHECK-SSE2:       # %bb.0:
180 ; CHECK-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [3264175145,3264175145,3264175145,3264175145]
181 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
182 ; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm0
183 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
184 ; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm2
185 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
186 ; CHECK-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
187 ; CHECK-SSE2-NEXT:    paddd {{.*}}(%rip), %xmm0
188 ; CHECK-SSE2-NEXT:    pxor {{.*}}(%rip), %xmm0
189 ; CHECK-SSE2-NEXT:    pcmpgtd {{.*}}(%rip), %xmm0
190 ; CHECK-SSE2-NEXT:    pandn {{.*}}(%rip), %xmm0
191 ; CHECK-SSE2-NEXT:    retq
193 ; CHECK-SSE41-LABEL: test_srem_odd_neg25:
194 ; CHECK-SSE41:       # %bb.0:
195 ; CHECK-SSE41-NEXT:    pmulld {{.*}}(%rip), %xmm0
196 ; CHECK-SSE41-NEXT:    paddd {{.*}}(%rip), %xmm0
197 ; CHECK-SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [171798690,171798690,171798690,171798690]
198 ; CHECK-SSE41-NEXT:    pminud %xmm0, %xmm1
199 ; CHECK-SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
200 ; CHECK-SSE41-NEXT:    psrld $31, %xmm0
201 ; CHECK-SSE41-NEXT:    retq
203 ; CHECK-AVX1-LABEL: test_srem_odd_neg25:
204 ; CHECK-AVX1:       # %bb.0:
205 ; CHECK-AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm0
206 ; CHECK-AVX1-NEXT:    vpaddd {{.*}}(%rip), %xmm0, %xmm0
207 ; CHECK-AVX1-NEXT:    vpminud {{.*}}(%rip), %xmm0, %xmm1
208 ; CHECK-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
209 ; CHECK-AVX1-NEXT:    vpsrld $31, %xmm0, %xmm0
210 ; CHECK-AVX1-NEXT:    retq
212 ; CHECK-AVX2-LABEL: test_srem_odd_neg25:
213 ; CHECK-AVX2:       # %bb.0:
214 ; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [3264175145,3264175145,3264175145,3264175145]
215 ; CHECK-AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
216 ; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [85899345,85899345,85899345,85899345]
217 ; CHECK-AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
218 ; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [171798690,171798690,171798690,171798690]
219 ; CHECK-AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm1
220 ; CHECK-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
221 ; CHECK-AVX2-NEXT:    vpsrld $31, %xmm0, %xmm0
222 ; CHECK-AVX2-NEXT:    retq
224 ; CHECK-AVX512VL-LABEL: test_srem_odd_neg25:
225 ; CHECK-AVX512VL:       # %bb.0:
226 ; CHECK-AVX512VL-NEXT:    vpmulld {{.*}}(%rip){1to4}, %xmm0, %xmm0
227 ; CHECK-AVX512VL-NEXT:    vpaddd {{.*}}(%rip){1to4}, %xmm0, %xmm0
228 ; CHECK-AVX512VL-NEXT:    vpminud {{.*}}(%rip){1to4}, %xmm0, %xmm1
229 ; CHECK-AVX512VL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
230 ; CHECK-AVX512VL-NEXT:    vpsrld $31, %xmm0, %xmm0
231 ; CHECK-AVX512VL-NEXT:    retq
232   %srem = srem <4 x i32> %X, <i32 25, i32 -25, i32 -25, i32 25>
233   %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>
234   %ret = zext <4 x i1> %cmp to <4 x i32>
235   ret <4 x i32> %ret
238 ; Even divisors
239 define <4 x i32> @test_srem_even_neg100(<4 x i32> %X) nounwind {
240 ; CHECK-SSE2-LABEL: test_srem_even_neg100:
241 ; CHECK-SSE2:       # %bb.0:
242 ; CHECK-SSE2-NEXT:    pxor %xmm1, %xmm1
243 ; CHECK-SSE2-NEXT:    pxor %xmm2, %xmm2
244 ; CHECK-SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
245 ; CHECK-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2920577761,1374389535,2920577761,1374389535]
246 ; CHECK-SSE2-NEXT:    pand %xmm3, %xmm2
247 ; CHECK-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [4294967295,0,4294967295,0]
248 ; CHECK-SSE2-NEXT:    pand %xmm0, %xmm4
249 ; CHECK-SSE2-NEXT:    paddd %xmm2, %xmm4
250 ; CHECK-SSE2-NEXT:    pmuludq %xmm0, %xmm3
251 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,3,2,3]
252 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
253 ; CHECK-SSE2-NEXT:    pmuludq {{.*}}(%rip), %xmm3
254 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]
255 ; CHECK-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
256 ; CHECK-SSE2-NEXT:    psubd %xmm4, %xmm2
257 ; CHECK-SSE2-NEXT:    movdqa %xmm2, %xmm3
258 ; CHECK-SSE2-NEXT:    psrld $31, %xmm3
259 ; CHECK-SSE2-NEXT:    psrad $5, %xmm2
260 ; CHECK-SSE2-NEXT:    paddd %xmm3, %xmm2
261 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
262 ; CHECK-SSE2-NEXT:    pmuludq {{.*}}(%rip), %xmm2
263 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
264 ; CHECK-SSE2-NEXT:    pmuludq {{.*}}(%rip), %xmm3
265 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
266 ; CHECK-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
267 ; CHECK-SSE2-NEXT:    psubd %xmm2, %xmm0
268 ; CHECK-SSE2-NEXT:    pcmpeqd %xmm1, %xmm0
269 ; CHECK-SSE2-NEXT:    psrld $31, %xmm0
270 ; CHECK-SSE2-NEXT:    retq
272 ; CHECK-SSE41-LABEL: test_srem_even_neg100:
273 ; CHECK-SSE41:       # %bb.0:
274 ; CHECK-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
275 ; CHECK-SSE41-NEXT:    pmuldq {{.*}}(%rip), %xmm1
276 ; CHECK-SSE41-NEXT:    movdqa {{.*#+}} xmm2 = <2920577761,u,2920577761,u>
277 ; CHECK-SSE41-NEXT:    pmuldq %xmm0, %xmm2
278 ; CHECK-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
279 ; CHECK-SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
280 ; CHECK-SSE41-NEXT:    movdqa %xmm2, %xmm1
281 ; CHECK-SSE41-NEXT:    psrld $31, %xmm1
282 ; CHECK-SSE41-NEXT:    psrad $5, %xmm2
283 ; CHECK-SSE41-NEXT:    paddd %xmm1, %xmm2
284 ; CHECK-SSE41-NEXT:    pmulld {{.*}}(%rip), %xmm2
285 ; CHECK-SSE41-NEXT:    psubd %xmm2, %xmm0
286 ; CHECK-SSE41-NEXT:    pxor %xmm1, %xmm1
287 ; CHECK-SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
288 ; CHECK-SSE41-NEXT:    psrld $31, %xmm0
289 ; CHECK-SSE41-NEXT:    retq
291 ; CHECK-AVX1-LABEL: test_srem_even_neg100:
292 ; CHECK-AVX1:       # %bb.0:
293 ; CHECK-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
294 ; CHECK-AVX1-NEXT:    vpmuldq {{.*}}(%rip), %xmm1, %xmm1
295 ; CHECK-AVX1-NEXT:    vpmuldq {{.*}}(%rip), %xmm0, %xmm2
296 ; CHECK-AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
297 ; CHECK-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
298 ; CHECK-AVX1-NEXT:    vpsrld $31, %xmm1, %xmm2
299 ; CHECK-AVX1-NEXT:    vpsrad $5, %xmm1, %xmm1
300 ; CHECK-AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
301 ; CHECK-AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm1, %xmm1
302 ; CHECK-AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
303 ; CHECK-AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
304 ; CHECK-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
305 ; CHECK-AVX1-NEXT:    vpsrld $31, %xmm0, %xmm0
306 ; CHECK-AVX1-NEXT:    retq
308 ; CHECK-AVX2-LABEL: test_srem_even_neg100:
309 ; CHECK-AVX2:       # %bb.0:
310 ; CHECK-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
311 ; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1374389535,1374389535,1374389535,1374389535]
312 ; CHECK-AVX2-NEXT:    vpmuldq %xmm2, %xmm1, %xmm1
313 ; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [2920577761,2920577761,2920577761,2920577761]
314 ; CHECK-AVX2-NEXT:    vpmuldq %xmm2, %xmm0, %xmm2
315 ; CHECK-AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
316 ; CHECK-AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3]
317 ; CHECK-AVX2-NEXT:    vpsrld $31, %xmm1, %xmm2
318 ; CHECK-AVX2-NEXT:    vpsrad $5, %xmm1, %xmm1
319 ; CHECK-AVX2-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
320 ; CHECK-AVX2-NEXT:    vpmulld {{.*}}(%rip), %xmm1, %xmm1
321 ; CHECK-AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
322 ; CHECK-AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
323 ; CHECK-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
324 ; CHECK-AVX2-NEXT:    vpsrld $31, %xmm0, %xmm0
325 ; CHECK-AVX2-NEXT:    retq
327 ; CHECK-AVX512VL-LABEL: test_srem_even_neg100:
328 ; CHECK-AVX512VL:       # %bb.0:
329 ; CHECK-AVX512VL-NEXT:    vpmulld {{.*}}(%rip){1to4}, %xmm0, %xmm0
330 ; CHECK-AVX512VL-NEXT:    vpaddd {{.*}}(%rip){1to4}, %xmm0, %xmm0
331 ; CHECK-AVX512VL-NEXT:    vprord $2, %xmm0, %xmm0
332 ; CHECK-AVX512VL-NEXT:    vpminud {{.*}}(%rip){1to4}, %xmm0, %xmm1
333 ; CHECK-AVX512VL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
334 ; CHECK-AVX512VL-NEXT:    vpsrld $31, %xmm0, %xmm0
335 ; CHECK-AVX512VL-NEXT:    retq
336   %srem = srem <4 x i32> %X, <i32 -100, i32 100, i32 -100, i32 100>
337   %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>
338   %ret = zext <4 x i1> %cmp to <4 x i32>
339   ret <4 x i32> %ret
342 ;------------------------------------------------------------------------------;
343 ; Comparison constant has undef elements.
344 ;------------------------------------------------------------------------------;
346 define <4 x i32> @test_srem_odd_undef1(<4 x i32> %X) nounwind {
347 ; CHECK-SSE2-LABEL: test_srem_odd_undef1:
348 ; CHECK-SSE2:       # %bb.0:
349 ; CHECK-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [1374389535,1374389535,1374389535,1374389535]
350 ; CHECK-SSE2-NEXT:    movdqa %xmm0, %xmm2
351 ; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm2
352 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
353 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
354 ; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm3
355 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]
356 ; CHECK-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
357 ; CHECK-SSE2-NEXT:    pxor %xmm3, %xmm3
358 ; CHECK-SSE2-NEXT:    pxor %xmm4, %xmm4
359 ; CHECK-SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
360 ; CHECK-SSE2-NEXT:    pand %xmm1, %xmm4
361 ; CHECK-SSE2-NEXT:    psubd %xmm4, %xmm2
362 ; CHECK-SSE2-NEXT:    movdqa %xmm2, %xmm1
363 ; CHECK-SSE2-NEXT:    psrld $31, %xmm1
364 ; CHECK-SSE2-NEXT:    psrad $3, %xmm2
365 ; CHECK-SSE2-NEXT:    paddd %xmm1, %xmm2
366 ; CHECK-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [25,25,25,25]
367 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
368 ; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm2
369 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
370 ; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm4
371 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[0,2,2,3]
372 ; CHECK-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
373 ; CHECK-SSE2-NEXT:    psubd %xmm2, %xmm0
374 ; CHECK-SSE2-NEXT:    pcmpeqd %xmm3, %xmm0
375 ; CHECK-SSE2-NEXT:    psrld $31, %xmm0
376 ; CHECK-SSE2-NEXT:    retq
378 ; CHECK-SSE41-LABEL: test_srem_odd_undef1:
379 ; CHECK-SSE41:       # %bb.0:
380 ; CHECK-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
381 ; CHECK-SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [1374389535,1374389535,1374389535,1374389535]
382 ; CHECK-SSE41-NEXT:    pmuldq %xmm2, %xmm1
383 ; CHECK-SSE41-NEXT:    pmuldq %xmm0, %xmm2
384 ; CHECK-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
385 ; CHECK-SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
386 ; CHECK-SSE41-NEXT:    movdqa %xmm2, %xmm1
387 ; CHECK-SSE41-NEXT:    psrld $31, %xmm1
388 ; CHECK-SSE41-NEXT:    psrad $3, %xmm2
389 ; CHECK-SSE41-NEXT:    paddd %xmm1, %xmm2
390 ; CHECK-SSE41-NEXT:    pmulld {{.*}}(%rip), %xmm2
391 ; CHECK-SSE41-NEXT:    psubd %xmm2, %xmm0
392 ; CHECK-SSE41-NEXT:    pxor %xmm1, %xmm1
393 ; CHECK-SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
394 ; CHECK-SSE41-NEXT:    psrld $31, %xmm0
395 ; CHECK-SSE41-NEXT:    retq
397 ; CHECK-AVX1-LABEL: test_srem_odd_undef1:
398 ; CHECK-AVX1:       # %bb.0:
399 ; CHECK-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
400 ; CHECK-AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [1374389535,1374389535,1374389535,1374389535]
401 ; CHECK-AVX1-NEXT:    vpmuldq %xmm2, %xmm1, %xmm1
402 ; CHECK-AVX1-NEXT:    vpmuldq %xmm2, %xmm0, %xmm2
403 ; CHECK-AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
404 ; CHECK-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
405 ; CHECK-AVX1-NEXT:    vpsrld $31, %xmm1, %xmm2
406 ; CHECK-AVX1-NEXT:    vpsrad $3, %xmm1, %xmm1
407 ; CHECK-AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
408 ; CHECK-AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm1, %xmm1
409 ; CHECK-AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
410 ; CHECK-AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
411 ; CHECK-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
412 ; CHECK-AVX1-NEXT:    vpsrld $31, %xmm0, %xmm0
413 ; CHECK-AVX1-NEXT:    retq
415 ; CHECK-AVX2-LABEL: test_srem_odd_undef1:
416 ; CHECK-AVX2:       # %bb.0:
417 ; CHECK-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
418 ; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1374389535,1374389535,1374389535,1374389535]
419 ; CHECK-AVX2-NEXT:    vpmuldq %xmm2, %xmm1, %xmm1
420 ; CHECK-AVX2-NEXT:    vpmuldq %xmm2, %xmm0, %xmm2
421 ; CHECK-AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
422 ; CHECK-AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3]
423 ; CHECK-AVX2-NEXT:    vpsrld $31, %xmm1, %xmm2
424 ; CHECK-AVX2-NEXT:    vpsrad $3, %xmm1, %xmm1
425 ; CHECK-AVX2-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
426 ; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [25,25,25,25]
427 ; CHECK-AVX2-NEXT:    vpmulld %xmm2, %xmm1, %xmm1
428 ; CHECK-AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
429 ; CHECK-AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
430 ; CHECK-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
431 ; CHECK-AVX2-NEXT:    vpsrld $31, %xmm0, %xmm0
432 ; CHECK-AVX2-NEXT:    retq
434 ; CHECK-AVX512VL-LABEL: test_srem_odd_undef1:
435 ; CHECK-AVX512VL:       # %bb.0:
436 ; CHECK-AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
437 ; CHECK-AVX512VL-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1374389535,1374389535,1374389535,1374389535]
438 ; CHECK-AVX512VL-NEXT:    vpmuldq %xmm2, %xmm1, %xmm1
439 ; CHECK-AVX512VL-NEXT:    vpmuldq %xmm2, %xmm0, %xmm2
440 ; CHECK-AVX512VL-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
441 ; CHECK-AVX512VL-NEXT:    vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3]
442 ; CHECK-AVX512VL-NEXT:    vpsrld $31, %xmm1, %xmm2
443 ; CHECK-AVX512VL-NEXT:    vpsrad $3, %xmm1, %xmm1
444 ; CHECK-AVX512VL-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
445 ; CHECK-AVX512VL-NEXT:    vpmulld {{.*}}(%rip){1to4}, %xmm1, %xmm1
446 ; CHECK-AVX512VL-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
447 ; CHECK-AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
448 ; CHECK-AVX512VL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
449 ; CHECK-AVX512VL-NEXT:    vpsrld $31, %xmm0, %xmm0
450 ; CHECK-AVX512VL-NEXT:    retq
451   %srem = srem <4 x i32> %X, <i32 25, i32 25, i32 25, i32 25>
452   %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 undef, i32 0>
453   %ret = zext <4 x i1> %cmp to <4 x i32>
454   ret <4 x i32> %ret
457 define <4 x i32> @test_srem_even_undef1(<4 x i32> %X) nounwind {
458 ; CHECK-SSE2-LABEL: test_srem_even_undef1:
459 ; CHECK-SSE2:       # %bb.0:
460 ; CHECK-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [1374389535,1374389535,1374389535,1374389535]
461 ; CHECK-SSE2-NEXT:    movdqa %xmm0, %xmm2
462 ; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm2
463 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
464 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
465 ; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm3
466 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]
467 ; CHECK-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
468 ; CHECK-SSE2-NEXT:    pxor %xmm3, %xmm3
469 ; CHECK-SSE2-NEXT:    pxor %xmm4, %xmm4
470 ; CHECK-SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
471 ; CHECK-SSE2-NEXT:    pand %xmm1, %xmm4
472 ; CHECK-SSE2-NEXT:    psubd %xmm4, %xmm2
473 ; CHECK-SSE2-NEXT:    movdqa %xmm2, %xmm1
474 ; CHECK-SSE2-NEXT:    psrld $31, %xmm1
475 ; CHECK-SSE2-NEXT:    psrad $5, %xmm2
476 ; CHECK-SSE2-NEXT:    paddd %xmm1, %xmm2
477 ; CHECK-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [100,100,100,100]
478 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
479 ; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm2
480 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
481 ; CHECK-SSE2-NEXT:    pmuludq %xmm1, %xmm4
482 ; CHECK-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[0,2,2,3]
483 ; CHECK-SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
484 ; CHECK-SSE2-NEXT:    psubd %xmm2, %xmm0
485 ; CHECK-SSE2-NEXT:    pcmpeqd %xmm3, %xmm0
486 ; CHECK-SSE2-NEXT:    psrld $31, %xmm0
487 ; CHECK-SSE2-NEXT:    retq
489 ; CHECK-SSE41-LABEL: test_srem_even_undef1:
490 ; CHECK-SSE41:       # %bb.0:
491 ; CHECK-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
492 ; CHECK-SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [1374389535,1374389535,1374389535,1374389535]
493 ; CHECK-SSE41-NEXT:    pmuldq %xmm2, %xmm1
494 ; CHECK-SSE41-NEXT:    pmuldq %xmm0, %xmm2
495 ; CHECK-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
496 ; CHECK-SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
497 ; CHECK-SSE41-NEXT:    movdqa %xmm2, %xmm1
498 ; CHECK-SSE41-NEXT:    psrld $31, %xmm1
499 ; CHECK-SSE41-NEXT:    psrad $5, %xmm2
500 ; CHECK-SSE41-NEXT:    paddd %xmm1, %xmm2
501 ; CHECK-SSE41-NEXT:    pmulld {{.*}}(%rip), %xmm2
502 ; CHECK-SSE41-NEXT:    psubd %xmm2, %xmm0
503 ; CHECK-SSE41-NEXT:    pxor %xmm1, %xmm1
504 ; CHECK-SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
505 ; CHECK-SSE41-NEXT:    psrld $31, %xmm0
506 ; CHECK-SSE41-NEXT:    retq
508 ; CHECK-AVX1-LABEL: test_srem_even_undef1:
509 ; CHECK-AVX1:       # %bb.0:
510 ; CHECK-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
511 ; CHECK-AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [1374389535,1374389535,1374389535,1374389535]
512 ; CHECK-AVX1-NEXT:    vpmuldq %xmm2, %xmm1, %xmm1
513 ; CHECK-AVX1-NEXT:    vpmuldq %xmm2, %xmm0, %xmm2
514 ; CHECK-AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
515 ; CHECK-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
516 ; CHECK-AVX1-NEXT:    vpsrld $31, %xmm1, %xmm2
517 ; CHECK-AVX1-NEXT:    vpsrad $5, %xmm1, %xmm1
518 ; CHECK-AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
519 ; CHECK-AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm1, %xmm1
520 ; CHECK-AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
521 ; CHECK-AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
522 ; CHECK-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
523 ; CHECK-AVX1-NEXT:    vpsrld $31, %xmm0, %xmm0
524 ; CHECK-AVX1-NEXT:    retq
526 ; CHECK-AVX2-LABEL: test_srem_even_undef1:
527 ; CHECK-AVX2:       # %bb.0:
528 ; CHECK-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
529 ; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1374389535,1374389535,1374389535,1374389535]
530 ; CHECK-AVX2-NEXT:    vpmuldq %xmm2, %xmm1, %xmm1
531 ; CHECK-AVX2-NEXT:    vpmuldq %xmm2, %xmm0, %xmm2
532 ; CHECK-AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
533 ; CHECK-AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3]
534 ; CHECK-AVX2-NEXT:    vpsrld $31, %xmm1, %xmm2
535 ; CHECK-AVX2-NEXT:    vpsrad $5, %xmm1, %xmm1
536 ; CHECK-AVX2-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
537 ; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [100,100,100,100]
538 ; CHECK-AVX2-NEXT:    vpmulld %xmm2, %xmm1, %xmm1
539 ; CHECK-AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
540 ; CHECK-AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
541 ; CHECK-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
542 ; CHECK-AVX2-NEXT:    vpsrld $31, %xmm0, %xmm0
543 ; CHECK-AVX2-NEXT:    retq
545 ; CHECK-AVX512VL-LABEL: test_srem_even_undef1:
546 ; CHECK-AVX512VL:       # %bb.0:
547 ; CHECK-AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
548 ; CHECK-AVX512VL-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1374389535,1374389535,1374389535,1374389535]
549 ; CHECK-AVX512VL-NEXT:    vpmuldq %xmm2, %xmm1, %xmm1
550 ; CHECK-AVX512VL-NEXT:    vpmuldq %xmm2, %xmm0, %xmm2
551 ; CHECK-AVX512VL-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
552 ; CHECK-AVX512VL-NEXT:    vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3]
553 ; CHECK-AVX512VL-NEXT:    vpsrld $31, %xmm1, %xmm2
554 ; CHECK-AVX512VL-NEXT:    vpsrad $5, %xmm1, %xmm1
555 ; CHECK-AVX512VL-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
556 ; CHECK-AVX512VL-NEXT:    vpmulld {{.*}}(%rip){1to4}, %xmm1, %xmm1
557 ; CHECK-AVX512VL-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
558 ; CHECK-AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
559 ; CHECK-AVX512VL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
560 ; CHECK-AVX512VL-NEXT:    vpsrld $31, %xmm0, %xmm0
561 ; CHECK-AVX512VL-NEXT:    retq
562   %srem = srem <4 x i32> %X, <i32 100, i32 100, i32 100, i32 100>
563   %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 undef, i32 0>
564   %ret = zext <4 x i1> %cmp to <4 x i32>
565   ret <4 x i32> %ret
568 ;------------------------------------------------------------------------------;
569 ; Negative tests
570 ;------------------------------------------------------------------------------;
572 define <4 x i32> @test_srem_one_eq(<4 x i32> %X) nounwind {
573 ; CHECK-SSE-LABEL: test_srem_one_eq:
574 ; CHECK-SSE:       # %bb.0:
575 ; CHECK-SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,1,1,1]
576 ; CHECK-SSE-NEXT:    retq
578 ; CHECK-AVX1-LABEL: test_srem_one_eq:
579 ; CHECK-AVX1:       # %bb.0:
580 ; CHECK-AVX1-NEXT:    vmovaps {{.*#+}} xmm0 = [1,1,1,1]
581 ; CHECK-AVX1-NEXT:    retq
583 ; CHECK-AVX2-LABEL: test_srem_one_eq:
584 ; CHECK-AVX2:       # %bb.0:
585 ; CHECK-AVX2-NEXT:    vbroadcastss {{.*#+}} xmm0 = [1,1,1,1]
586 ; CHECK-AVX2-NEXT:    retq
588 ; CHECK-AVX512VL-LABEL: test_srem_one_eq:
589 ; CHECK-AVX512VL:       # %bb.0:
590 ; CHECK-AVX512VL-NEXT:    vbroadcastss {{.*#+}} xmm0 = [1,1,1,1]
591 ; CHECK-AVX512VL-NEXT:    retq
592   %srem = srem <4 x i32> %X, <i32 1, i32 1, i32 1, i32 1>
593   %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>
594   %ret = zext <4 x i1> %cmp to <4 x i32>
595   ret <4 x i32> %ret
597 define <4 x i32> @test_srem_one_ne(<4 x i32> %X) nounwind {
598 ; CHECK-SSE-LABEL: test_srem_one_ne:
599 ; CHECK-SSE:       # %bb.0:
600 ; CHECK-SSE-NEXT:    xorps %xmm0, %xmm0
601 ; CHECK-SSE-NEXT:    retq
603 ; CHECK-AVX-LABEL: test_srem_one_ne:
604 ; CHECK-AVX:       # %bb.0:
605 ; CHECK-AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
606 ; CHECK-AVX-NEXT:    retq
607   %srem = srem <4 x i32> %X, <i32 1, i32 1, i32 1, i32 1>
608   %cmp = icmp ne <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>
609   %ret = zext <4 x i1> %cmp to <4 x i32>
610   ret <4 x i32> %ret
613 ; We can lower remainder of division by powers of two much better elsewhere.
614 define <4 x i32> @test_srem_pow2(<4 x i32> %X) nounwind {
615 ; CHECK-SSE-LABEL: test_srem_pow2:
616 ; CHECK-SSE:       # %bb.0:
617 ; CHECK-SSE-NEXT:    movdqa %xmm0, %xmm1
618 ; CHECK-SSE-NEXT:    psrad $31, %xmm1
619 ; CHECK-SSE-NEXT:    psrld $28, %xmm1
620 ; CHECK-SSE-NEXT:    paddd %xmm0, %xmm1
621 ; CHECK-SSE-NEXT:    pand {{.*}}(%rip), %xmm1
622 ; CHECK-SSE-NEXT:    psubd %xmm1, %xmm0
623 ; CHECK-SSE-NEXT:    pxor %xmm1, %xmm1
624 ; CHECK-SSE-NEXT:    pcmpeqd %xmm1, %xmm0
625 ; CHECK-SSE-NEXT:    psrld $31, %xmm0
626 ; CHECK-SSE-NEXT:    retq
628 ; CHECK-AVX1-LABEL: test_srem_pow2:
629 ; CHECK-AVX1:       # %bb.0:
630 ; CHECK-AVX1-NEXT:    vpsrad $31, %xmm0, %xmm1
631 ; CHECK-AVX1-NEXT:    vpsrld $28, %xmm1, %xmm1
632 ; CHECK-AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
633 ; CHECK-AVX1-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
634 ; CHECK-AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
635 ; CHECK-AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
636 ; CHECK-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
637 ; CHECK-AVX1-NEXT:    vpsrld $31, %xmm0, %xmm0
638 ; CHECK-AVX1-NEXT:    retq
640 ; CHECK-AVX2-LABEL: test_srem_pow2:
641 ; CHECK-AVX2:       # %bb.0:
642 ; CHECK-AVX2-NEXT:    vpsrad $31, %xmm0, %xmm1
643 ; CHECK-AVX2-NEXT:    vpsrld $28, %xmm1, %xmm1
644 ; CHECK-AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
645 ; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [4294967280,4294967280,4294967280,4294967280]
646 ; CHECK-AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
647 ; CHECK-AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
648 ; CHECK-AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
649 ; CHECK-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
650 ; CHECK-AVX2-NEXT:    vpsrld $31, %xmm0, %xmm0
651 ; CHECK-AVX2-NEXT:    retq
653 ; CHECK-AVX512VL-LABEL: test_srem_pow2:
654 ; CHECK-AVX512VL:       # %bb.0:
655 ; CHECK-AVX512VL-NEXT:    vpsrad $31, %xmm0, %xmm1
656 ; CHECK-AVX512VL-NEXT:    vpsrld $28, %xmm1, %xmm1
657 ; CHECK-AVX512VL-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
658 ; CHECK-AVX512VL-NEXT:    vpandd {{.*}}(%rip){1to4}, %xmm1, %xmm1
659 ; CHECK-AVX512VL-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
660 ; CHECK-AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
661 ; CHECK-AVX512VL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
662 ; CHECK-AVX512VL-NEXT:    vpsrld $31, %xmm0, %xmm0
663 ; CHECK-AVX512VL-NEXT:    retq
664   %srem = srem <4 x i32> %X, <i32 16, i32 16, i32 16, i32 16>
665   %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>
666   %ret = zext <4 x i1> %cmp to <4 x i32>
667   ret <4 x i32> %ret
670 ; We could lower remainder of division by INT_MIN much better elsewhere.
671 define <4 x i32> @test_srem_int_min(<4 x i32> %X) nounwind {
672 ; CHECK-SSE-LABEL: test_srem_int_min:
673 ; CHECK-SSE:       # %bb.0:
674 ; CHECK-SSE-NEXT:    movdqa %xmm0, %xmm1
675 ; CHECK-SSE-NEXT:    psrad $31, %xmm1
676 ; CHECK-SSE-NEXT:    psrld $1, %xmm1
677 ; CHECK-SSE-NEXT:    paddd %xmm0, %xmm1
678 ; CHECK-SSE-NEXT:    pand {{.*}}(%rip), %xmm1
679 ; CHECK-SSE-NEXT:    psubd %xmm1, %xmm0
680 ; CHECK-SSE-NEXT:    pxor %xmm1, %xmm1
681 ; CHECK-SSE-NEXT:    pcmpeqd %xmm1, %xmm0
682 ; CHECK-SSE-NEXT:    psrld $31, %xmm0
683 ; CHECK-SSE-NEXT:    retq
685 ; CHECK-AVX1-LABEL: test_srem_int_min:
686 ; CHECK-AVX1:       # %bb.0:
687 ; CHECK-AVX1-NEXT:    vpsrad $31, %xmm0, %xmm1
688 ; CHECK-AVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
689 ; CHECK-AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
690 ; CHECK-AVX1-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
691 ; CHECK-AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
692 ; CHECK-AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
693 ; CHECK-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
694 ; CHECK-AVX1-NEXT:    vpsrld $31, %xmm0, %xmm0
695 ; CHECK-AVX1-NEXT:    retq
697 ; CHECK-AVX2-LABEL: test_srem_int_min:
698 ; CHECK-AVX2:       # %bb.0:
699 ; CHECK-AVX2-NEXT:    vpsrad $31, %xmm0, %xmm1
700 ; CHECK-AVX2-NEXT:    vpsrld $1, %xmm1, %xmm1
701 ; CHECK-AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
702 ; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
703 ; CHECK-AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
704 ; CHECK-AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
705 ; CHECK-AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
706 ; CHECK-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
707 ; CHECK-AVX2-NEXT:    vpsrld $31, %xmm0, %xmm0
708 ; CHECK-AVX2-NEXT:    retq
710 ; CHECK-AVX512VL-LABEL: test_srem_int_min:
711 ; CHECK-AVX512VL:       # %bb.0:
712 ; CHECK-AVX512VL-NEXT:    vpsrad $31, %xmm0, %xmm1
713 ; CHECK-AVX512VL-NEXT:    vpsrld $1, %xmm1, %xmm1
714 ; CHECK-AVX512VL-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
715 ; CHECK-AVX512VL-NEXT:    vpandd {{.*}}(%rip){1to4}, %xmm1, %xmm1
716 ; CHECK-AVX512VL-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
717 ; CHECK-AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
718 ; CHECK-AVX512VL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
719 ; CHECK-AVX512VL-NEXT:    vpsrld $31, %xmm0, %xmm0
720 ; CHECK-AVX512VL-NEXT:    retq
721   %srem = srem <4 x i32> %X, <i32 2147483648, i32 2147483648, i32 2147483648, i32 2147483648>
722   %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>
723   %ret = zext <4 x i1> %cmp to <4 x i32>
724   ret <4 x i32> %ret
727 ; We could lower remainder of division by all-ones much better elsewhere.
728 define <4 x i32> @test_srem_allones(<4 x i32> %X) nounwind {
729 ; CHECK-SSE-LABEL: test_srem_allones:
730 ; CHECK-SSE:       # %bb.0:
731 ; CHECK-SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,1,1,1]
732 ; CHECK-SSE-NEXT:    retq
734 ; CHECK-AVX1-LABEL: test_srem_allones:
735 ; CHECK-AVX1:       # %bb.0:
736 ; CHECK-AVX1-NEXT:    vmovaps {{.*#+}} xmm0 = [1,1,1,1]
737 ; CHECK-AVX1-NEXT:    retq
739 ; CHECK-AVX2-LABEL: test_srem_allones:
740 ; CHECK-AVX2:       # %bb.0:
741 ; CHECK-AVX2-NEXT:    vbroadcastss {{.*#+}} xmm0 = [1,1,1,1]
742 ; CHECK-AVX2-NEXT:    retq
744 ; CHECK-AVX512VL-LABEL: test_srem_allones:
745 ; CHECK-AVX512VL:       # %bb.0:
746 ; CHECK-AVX512VL-NEXT:    vbroadcastss {{.*#+}} xmm0 = [1,1,1,1]
747 ; CHECK-AVX512VL-NEXT:    retq
748   %srem = srem <4 x i32> %X, <i32 4294967295, i32 4294967295, i32 4294967295, i32 4294967295>
749   %cmp = icmp eq <4 x i32> %srem, <i32 0, i32 0, i32 0, i32 0>
750   %ret = zext <4 x i1> %cmp to <4 x i32>
751   ret <4 x i32> %ret