1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX512
3 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX2
4 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE41
5 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE2
7 declare <4 x i64> @llvm.abs.v4i64(<4 x i64>, i1)
8 declare <4 x i32> @llvm.abs.v4i32(<4 x i32>, i1)
9 declare <4 x i16> @llvm.abs.v4i16(<4 x i16>, i1)
10 declare <4 x i8> @llvm.abs.v4i8(<4 x i8>, i1)
12 define <4 x i1> @illegal_abs_unchanged(<4 x i8> %x) {
13 ; AVX512-LABEL: illegal_abs_unchanged:
15 ; AVX512-NEXT: vpabsb %xmm0, %xmm0
16 ; AVX512-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
17 ; AVX512-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
20 ; AVX2-LABEL: illegal_abs_unchanged:
22 ; AVX2-NEXT: vpabsb %xmm0, %xmm0
23 ; AVX2-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
24 ; AVX2-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
27 ; SSE41-LABEL: illegal_abs_unchanged:
29 ; SSE41-NEXT: pabsb %xmm0, %xmm0
30 ; SSE41-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
31 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
34 ; SSE2-LABEL: illegal_abs_unchanged:
36 ; SSE2-NEXT: pxor %xmm1, %xmm1
37 ; SSE2-NEXT: psubb %xmm0, %xmm1
38 ; SSE2-NEXT: pminub %xmm1, %xmm0
39 ; SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
40 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
41 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
43 %abs = call <4 x i8> @llvm.abs.v4i8(<4 x i8> %x, i1 true)
44 %cmp = icmp eq <4 x i8> %abs, <i8 129, i8 129, i8 129, i8 129>
48 define <4 x i1> @illegal_abs_unchanged2(<4 x i8> %x) {
49 ; AVX512-LABEL: illegal_abs_unchanged2:
51 ; AVX512-NEXT: vpabsb %xmm0, %xmm0
52 ; AVX512-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
53 ; AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
54 ; AVX512-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
57 ; AVX2-LABEL: illegal_abs_unchanged2:
59 ; AVX2-NEXT: vpabsb %xmm0, %xmm0
60 ; AVX2-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
61 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
62 ; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
63 ; AVX2-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
66 ; SSE41-LABEL: illegal_abs_unchanged2:
68 ; SSE41-NEXT: pabsb %xmm0, %xmm0
69 ; SSE41-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
70 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
71 ; SSE41-NEXT: pxor %xmm0, %xmm1
72 ; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
75 ; SSE2-LABEL: illegal_abs_unchanged2:
77 ; SSE2-NEXT: pxor %xmm1, %xmm1
78 ; SSE2-NEXT: psubb %xmm0, %xmm1
79 ; SSE2-NEXT: pminub %xmm1, %xmm0
80 ; SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
81 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
82 ; SSE2-NEXT: pxor %xmm1, %xmm0
83 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
84 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
86 %abs = call <4 x i8> @llvm.abs.v4i8(<4 x i8> %x, i1 true)
87 %cmp = icmp ne <4 x i8> %abs, <i8 129, i8 129, i8 129, i8 129>
91 define <4 x i1> @illegal_abs_to_eq_or(<4 x i64> %x) {
92 ; AVX512-LABEL: illegal_abs_to_eq_or:
94 ; AVX512-NEXT: vpabsq %ymm0, %ymm0
95 ; AVX512-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %k1
96 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
97 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
98 ; AVX512-NEXT: vzeroupper
101 ; AVX2-LABEL: illegal_abs_to_eq_or:
103 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
104 ; AVX2-NEXT: vpsubq %ymm0, %ymm1, %ymm1
105 ; AVX2-NEXT: vblendvpd %ymm0, %ymm1, %ymm0, %ymm0
106 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [129,129,129,129]
107 ; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0
108 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
109 ; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
110 ; AVX2-NEXT: vzeroupper
113 ; SSE41-LABEL: illegal_abs_to_eq_or:
115 ; SSE41-NEXT: movdqa %xmm0, %xmm2
116 ; SSE41-NEXT: pxor %xmm3, %xmm3
117 ; SSE41-NEXT: pxor %xmm4, %xmm4
118 ; SSE41-NEXT: psubq %xmm0, %xmm4
119 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2
120 ; SSE41-NEXT: psubq %xmm1, %xmm3
121 ; SSE41-NEXT: movdqa %xmm1, %xmm0
122 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm1
123 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [129,129]
124 ; SSE41-NEXT: pcmpeqq %xmm0, %xmm1
125 ; SSE41-NEXT: pcmpeqq %xmm0, %xmm2
126 ; SSE41-NEXT: packssdw %xmm1, %xmm2
127 ; SSE41-NEXT: movdqa %xmm2, %xmm0
130 ; SSE2-LABEL: illegal_abs_to_eq_or:
132 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
133 ; SSE2-NEXT: psrad $31, %xmm2
134 ; SSE2-NEXT: pxor %xmm2, %xmm0
135 ; SSE2-NEXT: psubq %xmm2, %xmm0
136 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
137 ; SSE2-NEXT: psrad $31, %xmm2
138 ; SSE2-NEXT: pxor %xmm2, %xmm1
139 ; SSE2-NEXT: psubq %xmm2, %xmm1
140 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [129,129]
141 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm1
142 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm0
143 ; SSE2-NEXT: movdqa %xmm0, %xmm2
144 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,3],xmm1[1,3]
145 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
146 ; SSE2-NEXT: andps %xmm2, %xmm0
148 %abs = call <4 x i64> @llvm.abs.v4i64(<4 x i64> %x, i1 true)
149 %cmp = icmp eq <4 x i64> %abs, <i64 129, i64 129, i64 129, i64 129>
153 define <4 x i64> @illegal_abs_to_eq_or_sext(<4 x i64> %x) {
154 ; AVX512-LABEL: illegal_abs_to_eq_or_sext:
156 ; AVX512-NEXT: vpabsq %ymm0, %ymm0
157 ; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [129,129,129,129]
158 ; AVX512-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0
161 ; AVX2-LABEL: illegal_abs_to_eq_or_sext:
163 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
164 ; AVX2-NEXT: vpsubq %ymm0, %ymm1, %ymm1
165 ; AVX2-NEXT: vblendvpd %ymm0, %ymm1, %ymm0, %ymm0
166 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [129,129,129,129]
167 ; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0
170 ; SSE41-LABEL: illegal_abs_to_eq_or_sext:
172 ; SSE41-NEXT: movdqa %xmm0, %xmm2
173 ; SSE41-NEXT: pxor %xmm3, %xmm3
174 ; SSE41-NEXT: pxor %xmm4, %xmm4
175 ; SSE41-NEXT: psubq %xmm1, %xmm4
176 ; SSE41-NEXT: movdqa %xmm1, %xmm0
177 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm1
178 ; SSE41-NEXT: psubq %xmm2, %xmm3
179 ; SSE41-NEXT: movdqa %xmm2, %xmm0
180 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm2
181 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [129,129]
182 ; SSE41-NEXT: pcmpeqq %xmm0, %xmm2
183 ; SSE41-NEXT: pcmpeqq %xmm0, %xmm1
184 ; SSE41-NEXT: movdqa %xmm2, %xmm0
187 ; SSE2-LABEL: illegal_abs_to_eq_or_sext:
189 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
190 ; SSE2-NEXT: psrad $31, %xmm2
191 ; SSE2-NEXT: pxor %xmm2, %xmm1
192 ; SSE2-NEXT: psubq %xmm2, %xmm1
193 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
194 ; SSE2-NEXT: psrad $31, %xmm2
195 ; SSE2-NEXT: pxor %xmm2, %xmm0
196 ; SSE2-NEXT: psubq %xmm2, %xmm0
197 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [129,129]
198 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm0
199 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,0,3,2]
200 ; SSE2-NEXT: pand %xmm3, %xmm0
201 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm1
202 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,0,3,2]
203 ; SSE2-NEXT: pand %xmm2, %xmm1
205 %abs = call <4 x i64> @llvm.abs.v4i64(<4 x i64> %x, i1 true)
206 %cmp = icmp eq <4 x i64> %abs, <i64 129, i64 129, i64 129, i64 129>
207 %r = sext <4 x i1> %cmp to <4 x i64>
211 define <4 x i1> @illegal_abs_to_ne_and(<4 x i64> %x) {
212 ; AVX512-LABEL: illegal_abs_to_ne_and:
214 ; AVX512-NEXT: vpabsq %ymm0, %ymm0
215 ; AVX512-NEXT: vpcmpneqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %k1
216 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
217 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
218 ; AVX512-NEXT: vzeroupper
221 ; AVX2-LABEL: illegal_abs_to_ne_and:
223 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
224 ; AVX2-NEXT: vpsubq %ymm0, %ymm1, %ymm1
225 ; AVX2-NEXT: vblendvpd %ymm0, %ymm1, %ymm0, %ymm0
226 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [129,129,129,129]
227 ; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0
228 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
229 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
230 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
231 ; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
232 ; AVX2-NEXT: vzeroupper
235 ; SSE41-LABEL: illegal_abs_to_ne_and:
237 ; SSE41-NEXT: movdqa %xmm0, %xmm2
238 ; SSE41-NEXT: pxor %xmm3, %xmm3
239 ; SSE41-NEXT: pxor %xmm4, %xmm4
240 ; SSE41-NEXT: psubq %xmm0, %xmm4
241 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2
242 ; SSE41-NEXT: psubq %xmm1, %xmm3
243 ; SSE41-NEXT: movdqa %xmm1, %xmm0
244 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm1
245 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [129,129]
246 ; SSE41-NEXT: pcmpeqq %xmm0, %xmm1
247 ; SSE41-NEXT: pcmpeqq %xmm0, %xmm2
248 ; SSE41-NEXT: packssdw %xmm1, %xmm2
249 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm0
250 ; SSE41-NEXT: pxor %xmm2, %xmm0
253 ; SSE2-LABEL: illegal_abs_to_ne_and:
255 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
256 ; SSE2-NEXT: psrad $31, %xmm2
257 ; SSE2-NEXT: pxor %xmm2, %xmm0
258 ; SSE2-NEXT: psubq %xmm2, %xmm0
259 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
260 ; SSE2-NEXT: psrad $31, %xmm2
261 ; SSE2-NEXT: pxor %xmm2, %xmm1
262 ; SSE2-NEXT: psubq %xmm2, %xmm1
263 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [129,129]
264 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm1
265 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm0
266 ; SSE2-NEXT: movdqa %xmm0, %xmm2
267 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,3],xmm1[1,3]
268 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
269 ; SSE2-NEXT: andps %xmm2, %xmm0
270 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
271 ; SSE2-NEXT: xorps %xmm1, %xmm0
273 %abs = call <4 x i64> @llvm.abs.v4i64(<4 x i64> %x, i1 true)
274 %cmp = icmp ne <4 x i64> %abs, <i64 129, i64 129, i64 129, i64 129>
278 define <4 x i64> @illegal_abs_to_ne_and_sext(<4 x i64> %x) {
279 ; AVX512-LABEL: illegal_abs_to_ne_and_sext:
281 ; AVX512-NEXT: vpabsq %ymm0, %ymm0
282 ; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [129,129,129,129]
283 ; AVX512-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0
284 ; AVX512-NEXT: vpternlogq $15, %ymm0, %ymm0, %ymm0
287 ; AVX2-LABEL: illegal_abs_to_ne_and_sext:
289 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
290 ; AVX2-NEXT: vpsubq %ymm0, %ymm1, %ymm1
291 ; AVX2-NEXT: vblendvpd %ymm0, %ymm1, %ymm0, %ymm0
292 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [129,129,129,129]
293 ; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0
294 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
295 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
298 ; SSE41-LABEL: illegal_abs_to_ne_and_sext:
300 ; SSE41-NEXT: movdqa %xmm0, %xmm2
301 ; SSE41-NEXT: pxor %xmm3, %xmm3
302 ; SSE41-NEXT: pxor %xmm4, %xmm4
303 ; SSE41-NEXT: psubq %xmm1, %xmm4
304 ; SSE41-NEXT: movdqa %xmm1, %xmm0
305 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm1
306 ; SSE41-NEXT: psubq %xmm2, %xmm3
307 ; SSE41-NEXT: movdqa %xmm2, %xmm0
308 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm2
309 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [129,129]
310 ; SSE41-NEXT: pcmpeqq %xmm0, %xmm2
311 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm3
312 ; SSE41-NEXT: pxor %xmm3, %xmm2
313 ; SSE41-NEXT: pcmpeqq %xmm0, %xmm1
314 ; SSE41-NEXT: pxor %xmm3, %xmm1
315 ; SSE41-NEXT: movdqa %xmm2, %xmm0
318 ; SSE2-LABEL: illegal_abs_to_ne_and_sext:
320 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
321 ; SSE2-NEXT: psrad $31, %xmm2
322 ; SSE2-NEXT: pxor %xmm2, %xmm1
323 ; SSE2-NEXT: psubq %xmm2, %xmm1
324 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
325 ; SSE2-NEXT: psrad $31, %xmm2
326 ; SSE2-NEXT: pxor %xmm2, %xmm0
327 ; SSE2-NEXT: psubq %xmm2, %xmm0
328 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [129,129]
329 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm0
330 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,0,3,2]
331 ; SSE2-NEXT: pand %xmm3, %xmm0
332 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm3
333 ; SSE2-NEXT: pxor %xmm3, %xmm0
334 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm1
335 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,0,3,2]
336 ; SSE2-NEXT: pand %xmm2, %xmm1
337 ; SSE2-NEXT: pxor %xmm3, %xmm1
339 %abs = call <4 x i64> @llvm.abs.v4i64(<4 x i64> %x, i1 true)
340 %cmp = icmp ne <4 x i64> %abs, <i64 129, i64 129, i64 129, i64 129>
341 %r = sext <4 x i1> %cmp to <4 x i64>
345 define <4 x i1> @legal_abs_eq_unchanged(<4 x i32> %x) {
346 ; AVX512-LABEL: legal_abs_eq_unchanged:
348 ; AVX512-NEXT: vpabsd %xmm0, %xmm0
349 ; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm1 = [129,129,129,129]
350 ; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
353 ; AVX2-LABEL: legal_abs_eq_unchanged:
355 ; AVX2-NEXT: vpabsd %xmm0, %xmm0
356 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [129,129,129,129]
357 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
360 ; SSE41-LABEL: legal_abs_eq_unchanged:
362 ; SSE41-NEXT: pabsd %xmm0, %xmm0
363 ; SSE41-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
366 ; SSE2-LABEL: legal_abs_eq_unchanged:
368 ; SSE2-NEXT: movdqa %xmm0, %xmm1
369 ; SSE2-NEXT: psrad $31, %xmm1
370 ; SSE2-NEXT: pxor %xmm1, %xmm0
371 ; SSE2-NEXT: psubd %xmm1, %xmm0
372 ; SSE2-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
374 %abs = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %x, i1 true)
375 %cmp = icmp eq <4 x i32> %abs, <i32 129, i32 129, i32 129, i32 129>
379 define <4 x i32> @legal_abs_eq_unchanged_sext(<4 x i32> %x) {
380 ; AVX512-LABEL: legal_abs_eq_unchanged_sext:
382 ; AVX512-NEXT: vpabsd %xmm0, %xmm0
383 ; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm1 = [129,129,129,129]
384 ; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
387 ; AVX2-LABEL: legal_abs_eq_unchanged_sext:
389 ; AVX2-NEXT: vpabsd %xmm0, %xmm0
390 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [129,129,129,129]
391 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
394 ; SSE41-LABEL: legal_abs_eq_unchanged_sext:
396 ; SSE41-NEXT: pabsd %xmm0, %xmm0
397 ; SSE41-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
400 ; SSE2-LABEL: legal_abs_eq_unchanged_sext:
402 ; SSE2-NEXT: movdqa %xmm0, %xmm1
403 ; SSE2-NEXT: psrad $31, %xmm1
404 ; SSE2-NEXT: pxor %xmm1, %xmm0
405 ; SSE2-NEXT: psubd %xmm1, %xmm0
406 ; SSE2-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
408 %abs = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %x, i1 true)
409 %cmp = icmp eq <4 x i32> %abs, <i32 129, i32 129, i32 129, i32 129>
410 %r = sext <4 x i1> %cmp to <4 x i32>
414 define <4 x i1> @legal_abs_ne_unchangedd(<4 x i32> %x) {
415 ; AVX512-LABEL: legal_abs_ne_unchangedd:
417 ; AVX512-NEXT: vpabsd %xmm0, %xmm0
418 ; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm1 = [129,129,129,129]
419 ; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
420 ; AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
423 ; AVX2-LABEL: legal_abs_ne_unchangedd:
425 ; AVX2-NEXT: vpabsd %xmm0, %xmm0
426 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [129,129,129,129]
427 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
428 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
429 ; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
432 ; SSE41-LABEL: legal_abs_ne_unchangedd:
434 ; SSE41-NEXT: pabsd %xmm0, %xmm1
435 ; SSE41-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
436 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm0
437 ; SSE41-NEXT: pxor %xmm1, %xmm0
440 ; SSE2-LABEL: legal_abs_ne_unchangedd:
442 ; SSE2-NEXT: movdqa %xmm0, %xmm1
443 ; SSE2-NEXT: psrad $31, %xmm1
444 ; SSE2-NEXT: pxor %xmm1, %xmm0
445 ; SSE2-NEXT: psubd %xmm1, %xmm0
446 ; SSE2-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
447 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
448 ; SSE2-NEXT: pxor %xmm1, %xmm0
450 %abs = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %x, i1 true)
451 %cmp = icmp ne <4 x i32> %abs, <i32 129, i32 129, i32 129, i32 129>
455 define <4 x i32> @legal_abs_ne_unchangedd_sext(<4 x i32> %x) {
456 ; AVX512-LABEL: legal_abs_ne_unchangedd_sext:
458 ; AVX512-NEXT: vpabsd %xmm0, %xmm0
459 ; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm1 = [129,129,129,129]
460 ; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
461 ; AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
464 ; AVX2-LABEL: legal_abs_ne_unchangedd_sext:
466 ; AVX2-NEXT: vpabsd %xmm0, %xmm0
467 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [129,129,129,129]
468 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
469 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
470 ; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
473 ; SSE41-LABEL: legal_abs_ne_unchangedd_sext:
475 ; SSE41-NEXT: pabsd %xmm0, %xmm1
476 ; SSE41-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
477 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm0
478 ; SSE41-NEXT: pxor %xmm1, %xmm0
481 ; SSE2-LABEL: legal_abs_ne_unchangedd_sext:
483 ; SSE2-NEXT: movdqa %xmm0, %xmm1
484 ; SSE2-NEXT: psrad $31, %xmm1
485 ; SSE2-NEXT: pxor %xmm1, %xmm0
486 ; SSE2-NEXT: psubd %xmm1, %xmm0
487 ; SSE2-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
488 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
489 ; SSE2-NEXT: pxor %xmm1, %xmm0
491 %abs = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %x, i1 true)
492 %cmp = icmp ne <4 x i32> %abs, <i32 129, i32 129, i32 129, i32 129>
493 %r = sext <4 x i1> %cmp to <4 x i32>
497 define <4 x i1> @eq_or_to_abs_vec4x64(<4 x i64> %x) {
498 ; AVX512-LABEL: eq_or_to_abs_vec4x64:
500 ; AVX512-NEXT: vpabsq %ymm0, %ymm0
501 ; AVX512-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %k1
502 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
503 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
504 ; AVX512-NEXT: vzeroupper
507 ; AVX2-LABEL: eq_or_to_abs_vec4x64:
509 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [129,129,129,129]
510 ; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm1
511 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [18446744073709551487,18446744073709551487,18446744073709551487,18446744073709551487]
512 ; AVX2-NEXT: vpcmpeqq %ymm2, %ymm0, %ymm0
513 ; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0
514 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
515 ; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
516 ; AVX2-NEXT: vzeroupper
519 ; SSE41-LABEL: eq_or_to_abs_vec4x64:
521 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [129,129]
522 ; SSE41-NEXT: movdqa %xmm0, %xmm3
523 ; SSE41-NEXT: pcmpeqq %xmm2, %xmm3
524 ; SSE41-NEXT: pcmpeqq %xmm1, %xmm2
525 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [18446744073709551487,18446744073709551487]
526 ; SSE41-NEXT: pcmpeqq %xmm4, %xmm0
527 ; SSE41-NEXT: por %xmm3, %xmm0
528 ; SSE41-NEXT: pcmpeqq %xmm4, %xmm1
529 ; SSE41-NEXT: por %xmm2, %xmm1
530 ; SSE41-NEXT: packssdw %xmm1, %xmm0
533 ; SSE2-LABEL: eq_or_to_abs_vec4x64:
535 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [129,129]
536 ; SSE2-NEXT: movdqa %xmm1, %xmm3
537 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3
538 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm2
539 ; SSE2-NEXT: movdqa %xmm2, %xmm4
540 ; SSE2-NEXT: shufps {{.*#+}} xmm4 = xmm4[1,3],xmm3[1,3]
541 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]
542 ; SSE2-NEXT: andps %xmm4, %xmm2
543 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [18446744073709551487,18446744073709551487]
544 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm1
545 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm0
546 ; SSE2-NEXT: movdqa %xmm0, %xmm3
547 ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,3],xmm1[1,3]
548 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
549 ; SSE2-NEXT: andps %xmm3, %xmm0
550 ; SSE2-NEXT: orps %xmm2, %xmm0
552 %cmp1 = icmp eq <4 x i64> %x, <i64 129, i64 129, i64 129, i64 129>
553 %cmp2 = icmp eq <4 x i64> %x, <i64 -129, i64 -129, i64 -129, i64 -129>
554 %cmp = or <4 x i1> %cmp1, %cmp2
558 define <4 x i64> @eq_or_to_abs_vec4x64_sext(<4 x i64> %x) {
559 ; AVX512-LABEL: eq_or_to_abs_vec4x64_sext:
561 ; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [129,129,129,129]
562 ; AVX512-NEXT: vpabsq %ymm0, %ymm0
563 ; AVX512-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0
566 ; AVX2-LABEL: eq_or_to_abs_vec4x64_sext:
568 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [129,129,129,129]
569 ; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm1
570 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [18446744073709551487,18446744073709551487,18446744073709551487,18446744073709551487]
571 ; AVX2-NEXT: vpcmpeqq %ymm2, %ymm0, %ymm0
572 ; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0
575 ; SSE41-LABEL: eq_or_to_abs_vec4x64_sext:
577 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [129,129]
578 ; SSE41-NEXT: movdqa %xmm0, %xmm3
579 ; SSE41-NEXT: pcmpeqq %xmm2, %xmm3
580 ; SSE41-NEXT: pcmpeqq %xmm1, %xmm2
581 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [18446744073709551487,18446744073709551487]
582 ; SSE41-NEXT: pcmpeqq %xmm4, %xmm0
583 ; SSE41-NEXT: por %xmm3, %xmm0
584 ; SSE41-NEXT: pcmpeqq %xmm4, %xmm1
585 ; SSE41-NEXT: por %xmm2, %xmm1
586 ; SSE41-NEXT: packssdw %xmm1, %xmm0
587 ; SSE41-NEXT: pmovsxdq %xmm0, %xmm2
588 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
589 ; SSE41-NEXT: pslld $31, %xmm1
590 ; SSE41-NEXT: psrad $31, %xmm1
591 ; SSE41-NEXT: movdqa %xmm2, %xmm0
594 ; SSE2-LABEL: eq_or_to_abs_vec4x64_sext:
596 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [129,129]
597 ; SSE2-NEXT: movdqa %xmm1, %xmm3
598 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3
599 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm2
600 ; SSE2-NEXT: movdqa %xmm2, %xmm4
601 ; SSE2-NEXT: shufps {{.*#+}} xmm4 = xmm4[1,3],xmm3[1,3]
602 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]
603 ; SSE2-NEXT: andps %xmm4, %xmm2
604 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [18446744073709551487,18446744073709551487]
605 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm1
606 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm0
607 ; SSE2-NEXT: movdqa %xmm0, %xmm3
608 ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,3],xmm1[1,3]
609 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
610 ; SSE2-NEXT: andps %xmm3, %xmm0
611 ; SSE2-NEXT: orps %xmm2, %xmm0
612 ; SSE2-NEXT: xorps %xmm2, %xmm2
613 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
614 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
615 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
616 ; SSE2-NEXT: pslld $31, %xmm1
617 ; SSE2-NEXT: psrad $31, %xmm1
619 %cmp1 = icmp eq <4 x i64> %x, <i64 129, i64 129, i64 129, i64 129>
620 %cmp2 = icmp eq <4 x i64> %x, <i64 -129, i64 -129, i64 -129, i64 -129>
621 %cmp = or <4 x i1> %cmp1, %cmp2
622 %r = sext <4 x i1> %cmp to <4 x i64>
626 define <4 x i1> @ne_and_to_abs_vec4x64(<4 x i64> %x) {
627 ; AVX512-LABEL: ne_and_to_abs_vec4x64:
629 ; AVX512-NEXT: vpabsq %ymm0, %ymm0
630 ; AVX512-NEXT: vpcmpneqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %k1
631 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
632 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
633 ; AVX512-NEXT: vzeroupper
636 ; AVX2-LABEL: ne_and_to_abs_vec4x64:
638 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [129,129,129,129]
639 ; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm1
640 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2
641 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [18446744073709551487,18446744073709551487,18446744073709551487,18446744073709551487]
642 ; AVX2-NEXT: vpcmpeqq %ymm3, %ymm0, %ymm0
643 ; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0
644 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
645 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
646 ; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
647 ; AVX2-NEXT: vzeroupper
650 ; SSE41-LABEL: ne_and_to_abs_vec4x64:
652 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [129,129]
653 ; SSE41-NEXT: movdqa %xmm0, %xmm3
654 ; SSE41-NEXT: pcmpeqq %xmm2, %xmm3
655 ; SSE41-NEXT: pcmpeqq %xmm1, %xmm2
656 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm4
657 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [18446744073709551487,18446744073709551487]
658 ; SSE41-NEXT: pcmpeqq %xmm5, %xmm0
659 ; SSE41-NEXT: por %xmm3, %xmm0
660 ; SSE41-NEXT: pcmpeqq %xmm5, %xmm1
661 ; SSE41-NEXT: por %xmm2, %xmm1
662 ; SSE41-NEXT: packssdw %xmm1, %xmm0
663 ; SSE41-NEXT: pxor %xmm4, %xmm0
666 ; SSE2-LABEL: ne_and_to_abs_vec4x64:
668 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [129,129]
669 ; SSE2-NEXT: movdqa %xmm1, %xmm3
670 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3
671 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm2
672 ; SSE2-NEXT: movdqa %xmm2, %xmm4
673 ; SSE2-NEXT: shufps {{.*#+}} xmm4 = xmm4[1,3],xmm3[1,3]
674 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]
675 ; SSE2-NEXT: andps %xmm4, %xmm2
676 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm3
677 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [18446744073709551487,18446744073709551487]
678 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm1
679 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm0
680 ; SSE2-NEXT: movdqa %xmm0, %xmm4
681 ; SSE2-NEXT: shufps {{.*#+}} xmm4 = xmm4[1,3],xmm1[1,3]
682 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
683 ; SSE2-NEXT: andps %xmm4, %xmm0
684 ; SSE2-NEXT: orps %xmm2, %xmm0
685 ; SSE2-NEXT: xorps %xmm3, %xmm0
687 %cmp1 = icmp ne <4 x i64> %x, <i64 129, i64 129, i64 129, i64 129>
688 %cmp2 = icmp ne <4 x i64> %x, <i64 -129, i64 -129, i64 -129, i64 -129>
689 %cmp = and <4 x i1> %cmp1, %cmp2
693 define <4 x i64> @ne_and_to_abs_vec4x64_sext(<4 x i64> %x) {
694 ; AVX512-LABEL: ne_and_to_abs_vec4x64_sext:
696 ; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [129,129,129,129]
697 ; AVX512-NEXT: vpabsq %ymm0, %ymm0
698 ; AVX512-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0
699 ; AVX512-NEXT: vpternlogq $15, %ymm0, %ymm0, %ymm0
702 ; AVX2-LABEL: ne_and_to_abs_vec4x64_sext:
704 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [129,129,129,129]
705 ; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm1
706 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2
707 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [18446744073709551487,18446744073709551487,18446744073709551487,18446744073709551487]
708 ; AVX2-NEXT: vpcmpeqq %ymm3, %ymm0, %ymm0
709 ; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0
710 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
713 ; SSE41-LABEL: ne_and_to_abs_vec4x64_sext:
715 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [129,129]
716 ; SSE41-NEXT: movdqa %xmm0, %xmm3
717 ; SSE41-NEXT: pcmpeqq %xmm2, %xmm3
718 ; SSE41-NEXT: pcmpeqq %xmm1, %xmm2
719 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm4
720 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [18446744073709551487,18446744073709551487]
721 ; SSE41-NEXT: pcmpeqq %xmm5, %xmm0
722 ; SSE41-NEXT: por %xmm3, %xmm0
723 ; SSE41-NEXT: pcmpeqq %xmm5, %xmm1
724 ; SSE41-NEXT: por %xmm2, %xmm1
725 ; SSE41-NEXT: packssdw %xmm1, %xmm0
726 ; SSE41-NEXT: pxor %xmm4, %xmm0
727 ; SSE41-NEXT: pmovsxdq %xmm0, %xmm2
728 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
729 ; SSE41-NEXT: pslld $31, %xmm1
730 ; SSE41-NEXT: psrad $31, %xmm1
731 ; SSE41-NEXT: movdqa %xmm2, %xmm0
734 ; SSE2-LABEL: ne_and_to_abs_vec4x64_sext:
736 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [129,129]
737 ; SSE2-NEXT: movdqa %xmm1, %xmm3
738 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3
739 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm2
740 ; SSE2-NEXT: movdqa %xmm2, %xmm4
741 ; SSE2-NEXT: shufps {{.*#+}} xmm4 = xmm4[1,3],xmm3[1,3]
742 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]
743 ; SSE2-NEXT: andps %xmm4, %xmm2
744 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm3
745 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [18446744073709551487,18446744073709551487]
746 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm1
747 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm0
748 ; SSE2-NEXT: movdqa %xmm0, %xmm4
749 ; SSE2-NEXT: shufps {{.*#+}} xmm4 = xmm4[1,3],xmm1[1,3]
750 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
751 ; SSE2-NEXT: andps %xmm4, %xmm0
752 ; SSE2-NEXT: orps %xmm2, %xmm0
753 ; SSE2-NEXT: xorps %xmm3, %xmm0
754 ; SSE2-NEXT: xorps %xmm2, %xmm2
755 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
756 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
757 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
758 ; SSE2-NEXT: pslld $31, %xmm1
759 ; SSE2-NEXT: psrad $31, %xmm1
761 %cmp1 = icmp ne <4 x i64> %x, <i64 129, i64 129, i64 129, i64 129>
762 %cmp2 = icmp ne <4 x i64> %x, <i64 -129, i64 -129, i64 -129, i64 -129>
763 %cmp = and <4 x i1> %cmp1, %cmp2
764 %r = sext <4 x i1> %cmp to <4 x i64>
768 define <4 x i1> @eq_or_to_abs_vec4x32(<4 x i32> %x) {
769 ; AVX512-LABEL: eq_or_to_abs_vec4x32:
771 ; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]
772 ; AVX512-NEXT: vpabsd %xmm0, %xmm0
773 ; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
776 ; AVX2-LABEL: eq_or_to_abs_vec4x32:
778 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]
779 ; AVX2-NEXT: vpabsd %xmm0, %xmm0
780 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
783 ; SSE41-LABEL: eq_or_to_abs_vec4x32:
785 ; SSE41-NEXT: pabsd %xmm0, %xmm0
786 ; SSE41-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
789 ; SSE2-LABEL: eq_or_to_abs_vec4x32:
791 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [1,1,1,1]
792 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
793 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2
794 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm0
795 ; SSE2-NEXT: por %xmm1, %xmm0
797 %cmp1 = icmp eq <4 x i32> %x, <i32 1, i32 1, i32 1, i32 1>
798 %cmp2 = icmp eq <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1>
799 %cmp = or <4 x i1> %cmp1, %cmp2
803 define <4 x i32> @eq_or_to_abs_vec4x32_sext(<4 x i32> %x) {
804 ; AVX512-LABEL: eq_or_to_abs_vec4x32_sext:
806 ; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]
807 ; AVX512-NEXT: vpabsd %xmm0, %xmm0
808 ; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
811 ; AVX2-LABEL: eq_or_to_abs_vec4x32_sext:
813 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]
814 ; AVX2-NEXT: vpabsd %xmm0, %xmm0
815 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
818 ; SSE41-LABEL: eq_or_to_abs_vec4x32_sext:
820 ; SSE41-NEXT: pabsd %xmm0, %xmm0
821 ; SSE41-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
824 ; SSE2-LABEL: eq_or_to_abs_vec4x32_sext:
826 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [1,1,1,1]
827 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
828 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2
829 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm0
830 ; SSE2-NEXT: por %xmm1, %xmm0
832 %cmp1 = icmp eq <4 x i32> %x, <i32 1, i32 1, i32 1, i32 1>
833 %cmp2 = icmp eq <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1>
834 %cmp = or <4 x i1> %cmp1, %cmp2
835 %r = sext <4 x i1> %cmp to <4 x i32>
839 define <4 x i1> @ne_and_to_abs_vec4x32(<4 x i32> %x) {
840 ; AVX512-LABEL: ne_and_to_abs_vec4x32:
842 ; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]
843 ; AVX512-NEXT: vpabsd %xmm0, %xmm0
844 ; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
845 ; AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
848 ; AVX2-LABEL: ne_and_to_abs_vec4x32:
850 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]
851 ; AVX2-NEXT: vpabsd %xmm0, %xmm0
852 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
853 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
854 ; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
857 ; SSE41-LABEL: ne_and_to_abs_vec4x32:
859 ; SSE41-NEXT: pabsd %xmm0, %xmm1
860 ; SSE41-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
861 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm0
862 ; SSE41-NEXT: pxor %xmm1, %xmm0
865 ; SSE2-LABEL: ne_and_to_abs_vec4x32:
867 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [1,1,1,1]
868 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
869 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2
870 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm0
871 ; SSE2-NEXT: por %xmm1, %xmm0
872 ; SSE2-NEXT: pxor %xmm2, %xmm0
874 %cmp1 = icmp ne <4 x i32> %x, <i32 1, i32 1, i32 1, i32 1>
875 %cmp2 = icmp ne <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1>
876 %cmp = and <4 x i1> %cmp1, %cmp2
880 define <4 x i32> @ne_and_to_abs_vec4x32_sext(<4 x i32> %x) {
881 ; AVX512-LABEL: ne_and_to_abs_vec4x32_sext:
883 ; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]
884 ; AVX512-NEXT: vpabsd %xmm0, %xmm0
885 ; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
886 ; AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
889 ; AVX2-LABEL: ne_and_to_abs_vec4x32_sext:
891 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]
892 ; AVX2-NEXT: vpabsd %xmm0, %xmm0
893 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
894 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
895 ; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
898 ; SSE41-LABEL: ne_and_to_abs_vec4x32_sext:
900 ; SSE41-NEXT: pabsd %xmm0, %xmm1
901 ; SSE41-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
902 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm0
903 ; SSE41-NEXT: pxor %xmm1, %xmm0
906 ; SSE2-LABEL: ne_and_to_abs_vec4x32_sext:
908 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [1,1,1,1]
909 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
910 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2
911 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm0
912 ; SSE2-NEXT: por %xmm1, %xmm0
913 ; SSE2-NEXT: pxor %xmm2, %xmm0
915 %cmp1 = icmp ne <4 x i32> %x, <i32 1, i32 1, i32 1, i32 1>
916 %cmp2 = icmp ne <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1>
917 %cmp = and <4 x i1> %cmp1, %cmp2
918 %r = sext <4 x i1> %cmp to <4 x i32>
922 define <4 x i1> @eq_or_to_abs_vec4x16(<4 x i16> %x) {
923 ; AVX512-LABEL: eq_or_to_abs_vec4x16:
925 ; AVX512-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
926 ; AVX512-NEXT: vpmovsxwd %xmm1, %ymm1
927 ; AVX512-NEXT: vptestmd %ymm1, %ymm1, %k0
928 ; AVX512-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
929 ; AVX512-NEXT: vpmovsxwd %xmm0, %ymm0
930 ; AVX512-NEXT: vptestmd %ymm0, %ymm0, %k1
931 ; AVX512-NEXT: korw %k1, %k0, %k1
932 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
933 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
934 ; AVX512-NEXT: vzeroupper
937 ; AVX2-LABEL: eq_or_to_abs_vec4x16:
939 ; AVX2-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
940 ; AVX2-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
941 ; AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0
942 ; AVX2-NEXT: vpmovsxwd %xmm0, %xmm0
945 ; SSE41-LABEL: eq_or_to_abs_vec4x16:
947 ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [88,88,88,88,u,u,u,u]
948 ; SSE41-NEXT: pcmpeqw %xmm0, %xmm1
949 ; SSE41-NEXT: pcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
950 ; SSE41-NEXT: por %xmm1, %xmm0
951 ; SSE41-NEXT: pmovsxwd %xmm0, %xmm0
954 ; SSE2-LABEL: eq_or_to_abs_vec4x16:
956 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [88,88,88,88,u,u,u,u]
957 ; SSE2-NEXT: pcmpeqw %xmm0, %xmm1
958 ; SSE2-NEXT: pcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
959 ; SSE2-NEXT: por %xmm1, %xmm0
960 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
962 %cmp1 = icmp eq <4 x i16> %x, <i16 88, i16 88, i16 88, i16 88>
963 %cmp2 = icmp eq <4 x i16> %x, <i16 -88, i16 -88, i16 -88, i16 -88>
964 %cmp = or <4 x i1> %cmp1, %cmp2
968 define <4 x i8> @eq_or_to_abs_vec4x8_sext(<4 x i8> %x) {
969 ; AVX512-LABEL: eq_or_to_abs_vec4x8_sext:
971 ; AVX512-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
972 ; AVX512-NEXT: vpmovsxbd %xmm1, %zmm1
973 ; AVX512-NEXT: vptestmd %zmm1, %zmm1, %k0
974 ; AVX512-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
975 ; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0
976 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k1
977 ; AVX512-NEXT: korw %k1, %k0, %k1
978 ; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
979 ; AVX512-NEXT: vpmovdb %zmm0, %xmm0
980 ; AVX512-NEXT: vzeroupper
983 ; AVX2-LABEL: eq_or_to_abs_vec4x8_sext:
985 ; AVX2-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
986 ; AVX2-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
987 ; AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0
990 ; SSE41-LABEL: eq_or_to_abs_vec4x8_sext:
992 ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [88,88,88,88,u,u,u,u,u,u,u,u,u,u,u,u]
993 ; SSE41-NEXT: pcmpeqb %xmm0, %xmm1
994 ; SSE41-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
995 ; SSE41-NEXT: por %xmm1, %xmm0
998 ; SSE2-LABEL: eq_or_to_abs_vec4x8_sext:
1000 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [88,88,88,88,u,u,u,u,u,u,u,u,u,u,u,u]
1001 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
1002 ; SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1003 ; SSE2-NEXT: por %xmm1, %xmm0
1005 %cmp1 = icmp eq <4 x i8> %x, <i8 88, i8 88, i8 88, i8 88>
1006 %cmp2 = icmp eq <4 x i8> %x, <i8 -88, i8 -88, i8 -88, i8 -88>
1007 %cmp = or <4 x i1> %cmp1, %cmp2
1008 %r = sext <4 x i1> %cmp to <4 x i8>
1012 define <4 x i1> @ne_and_to_abs_vec4x8(<4 x i8> %x) {
1013 ; AVX512-LABEL: ne_and_to_abs_vec4x8:
1015 ; AVX512-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
1016 ; AVX512-NEXT: vpternlogq $15, %xmm1, %xmm1, %xmm1
1017 ; AVX512-NEXT: vpmovsxbd %xmm1, %zmm1
1018 ; AVX512-NEXT: vptestmd %zmm1, %zmm1, %k0
1019 ; AVX512-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1020 ; AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
1021 ; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0
1022 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k1
1023 ; AVX512-NEXT: kandw %k1, %k0, %k1
1024 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
1025 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
1026 ; AVX512-NEXT: vzeroupper
1029 ; AVX2-LABEL: ne_and_to_abs_vec4x8:
1031 ; AVX2-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
1032 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1033 ; AVX2-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1034 ; AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0
1035 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
1036 ; AVX2-NEXT: vpmovsxbd %xmm0, %xmm0
1039 ; SSE41-LABEL: ne_and_to_abs_vec4x8:
1041 ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [88,88,88,88,u,u,u,u,u,u,u,u,u,u,u,u]
1042 ; SSE41-NEXT: pcmpeqb %xmm0, %xmm1
1043 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm2
1044 ; SSE41-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1045 ; SSE41-NEXT: por %xmm1, %xmm0
1046 ; SSE41-NEXT: pxor %xmm2, %xmm0
1047 ; SSE41-NEXT: pmovsxbd %xmm0, %xmm0
1050 ; SSE2-LABEL: ne_and_to_abs_vec4x8:
1052 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [88,88,88,88,u,u,u,u,u,u,u,u,u,u,u,u]
1053 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
1054 ; SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1055 ; SSE2-NEXT: por %xmm1, %xmm0
1056 ; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1057 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1058 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
1059 ; SSE2-NEXT: pxor %xmm1, %xmm0
1061 %cmp1 = icmp ne <4 x i8> %x, <i8 88, i8 88, i8 88, i8 88>
1062 %cmp2 = icmp ne <4 x i8> %x, <i8 -88, i8 -88, i8 -88, i8 -88>
1063 %cmp = and <4 x i1> %cmp1, %cmp2
1067 define <4 x i16> @ne_and_to_abs_vec4x16_sext(<4 x i16> %x) {
1068 ; AVX512-LABEL: ne_and_to_abs_vec4x16_sext:
1070 ; AVX512-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
1071 ; AVX512-NEXT: vpternlogq $15, %xmm1, %xmm1, %xmm1
1072 ; AVX512-NEXT: vpmovsxwd %xmm1, %ymm1
1073 ; AVX512-NEXT: vptestmd %ymm1, %ymm1, %k0
1074 ; AVX512-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1075 ; AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
1076 ; AVX512-NEXT: vpmovsxwd %xmm0, %ymm0
1077 ; AVX512-NEXT: vptestmd %ymm0, %ymm0, %k1
1078 ; AVX512-NEXT: kandw %k1, %k0, %k1
1079 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
1080 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
1081 ; AVX512-NEXT: vpmovdw %ymm0, %xmm0
1082 ; AVX512-NEXT: vzeroupper
1085 ; AVX2-LABEL: ne_and_to_abs_vec4x16_sext:
1087 ; AVX2-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
1088 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1089 ; AVX2-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1090 ; AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0
1091 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
1094 ; SSE41-LABEL: ne_and_to_abs_vec4x16_sext:
1096 ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [88,88,88,88,u,u,u,u]
1097 ; SSE41-NEXT: pcmpeqw %xmm0, %xmm1
1098 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm2
1099 ; SSE41-NEXT: pcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1100 ; SSE41-NEXT: por %xmm1, %xmm0
1101 ; SSE41-NEXT: pxor %xmm2, %xmm0
1104 ; SSE2-LABEL: ne_and_to_abs_vec4x16_sext:
1106 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [88,88,88,88,u,u,u,u]
1107 ; SSE2-NEXT: pcmpeqw %xmm0, %xmm1
1108 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2
1109 ; SSE2-NEXT: pcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1110 ; SSE2-NEXT: por %xmm1, %xmm0
1111 ; SSE2-NEXT: pxor %xmm2, %xmm0
1113 %cmp1 = icmp ne <4 x i16> %x, <i16 88, i16 88, i16 88, i16 88>
1114 %cmp2 = icmp ne <4 x i16> %x, <i16 -88, i16 -88, i16 -88, i16 -88>
1115 %cmp = and <4 x i1> %cmp1, %cmp2
1116 %r = sext <4 x i1> %cmp to <4 x i16>