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=+avx | FileCheck %s --check-prefixes=AVX,AVX1
4 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
5 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE41
6 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE2
8 declare void @use.v4.i32(<4 x i32>)
10 define <4 x i32> @eq_or_eq_ult_2(<4 x i32> %x) {
11 ; AVX512-LABEL: eq_or_eq_ult_2:
13 ; AVX512-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
14 ; AVX512-NEXT: vpcmpltud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %k1
15 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
16 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
19 ; AVX1-LABEL: eq_or_eq_ult_2:
21 ; AVX1-NEXT: vpcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
22 ; AVX1-NEXT: vpcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
23 ; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
26 ; AVX2-LABEL: eq_or_eq_ult_2:
28 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [6,6,6,6]
29 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm1
30 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [5,5,5,5]
31 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm0
32 ; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
35 ; SSE41-LABEL: eq_or_eq_ult_2:
37 ; SSE41-NEXT: pmovsxbd {{.*#+}} xmm1 = [6,6,6,6]
38 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
39 ; SSE41-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
40 ; SSE41-NEXT: por %xmm1, %xmm0
43 ; SSE2-LABEL: eq_or_eq_ult_2:
45 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [6,6,6,6]
46 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
47 ; SSE2-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
48 ; SSE2-NEXT: por %xmm1, %xmm0
50 %x_adj = add <4 x i32> %x, <i32 -5, i32 -5, i32 -5, i32 -5>
51 %cmp = icmp ult <4 x i32> %x_adj, <i32 2, i32 2, i32 2, i32 2>
52 %r = sext <4 x i1> %cmp to <4 x i32>
56 define <4 x i32> @eq_or_eq_ult_2_only_transform_sse2(<4 x i32> %x) {
57 ; AVX512-LABEL: eq_or_eq_ult_2_only_transform_sse2:
59 ; AVX512-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
60 ; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm0
61 ; AVX512-NEXT: vpcmpltud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %k1
62 ; AVX512-NEXT: vmovdqa32 %xmm1, %xmm0 {%k1} {z}
65 ; AVX1-LABEL: eq_or_eq_ult_2_only_transform_sse2:
67 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
68 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
69 ; AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
70 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
73 ; AVX2-LABEL: eq_or_eq_ult_2_only_transform_sse2:
75 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
76 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0
77 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]
78 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm1
79 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
82 ; SSE41-LABEL: eq_or_eq_ult_2_only_transform_sse2:
84 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
85 ; SSE41-NEXT: paddd %xmm1, %xmm0
86 ; SSE41-NEXT: pmovsxbd {{.*#+}} xmm1 = [1,1,1,1]
87 ; SSE41-NEXT: pminud %xmm0, %xmm1
88 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm0
91 ; SSE2-LABEL: eq_or_eq_ult_2_only_transform_sse2:
93 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2,2,2,2]
94 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
95 ; SSE2-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
96 ; SSE2-NEXT: por %xmm1, %xmm0
98 %x_adj = add <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1>
99 %cmp = icmp ult <4 x i32> %x_adj, <i32 2, i32 2, i32 2, i32 2>
100 %r = sext <4 x i1> %cmp to <4 x i32>
104 define <4 x i32> @eq_or_eq_ult_2_fail_multiuse(<4 x i32> %x) {
105 ; AVX512-LABEL: eq_or_eq_ult_2_fail_multiuse:
107 ; AVX512-NEXT: subq $24, %rsp
108 ; AVX512-NEXT: .cfi_def_cfa_offset 32
109 ; AVX512-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
110 ; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm0
111 ; AVX512-NEXT: vmovdqa %xmm0, (%rsp) # 16-byte Spill
112 ; AVX512-NEXT: callq use.v4.i32@PLT
113 ; AVX512-NEXT: vmovdqa (%rsp), %xmm0 # 16-byte Reload
114 ; AVX512-NEXT: vpcmpltud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %k1
115 ; AVX512-NEXT: vmovdqa32 {{.*#+}} xmm0 {%k1} {z} = [4294967295,4294967295,4294967295,4294967295]
116 ; AVX512-NEXT: addq $24, %rsp
117 ; AVX512-NEXT: .cfi_def_cfa_offset 8
120 ; AVX1-LABEL: eq_or_eq_ult_2_fail_multiuse:
122 ; AVX1-NEXT: subq $24, %rsp
123 ; AVX1-NEXT: .cfi_def_cfa_offset 32
124 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
125 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
126 ; AVX1-NEXT: vmovdqa %xmm0, (%rsp) # 16-byte Spill
127 ; AVX1-NEXT: callq use.v4.i32@PLT
128 ; AVX1-NEXT: vmovdqa (%rsp), %xmm1 # 16-byte Reload
129 ; AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm0
130 ; AVX1-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
131 ; AVX1-NEXT: addq $24, %rsp
132 ; AVX1-NEXT: .cfi_def_cfa_offset 8
135 ; AVX2-LABEL: eq_or_eq_ult_2_fail_multiuse:
137 ; AVX2-NEXT: subq $24, %rsp
138 ; AVX2-NEXT: .cfi_def_cfa_offset 32
139 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
140 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0
141 ; AVX2-NEXT: vmovdqa %xmm0, (%rsp) # 16-byte Spill
142 ; AVX2-NEXT: callq use.v4.i32@PLT
143 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm0 = [1,1,1,1]
144 ; AVX2-NEXT: vmovdqa (%rsp), %xmm1 # 16-byte Reload
145 ; AVX2-NEXT: vpminud %xmm0, %xmm1, %xmm0
146 ; AVX2-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
147 ; AVX2-NEXT: addq $24, %rsp
148 ; AVX2-NEXT: .cfi_def_cfa_offset 8
151 ; SSE41-LABEL: eq_or_eq_ult_2_fail_multiuse:
153 ; SSE41-NEXT: subq $24, %rsp
154 ; SSE41-NEXT: .cfi_def_cfa_offset 32
155 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
156 ; SSE41-NEXT: paddd %xmm1, %xmm0
157 ; SSE41-NEXT: movdqa %xmm0, (%rsp) # 16-byte Spill
158 ; SSE41-NEXT: callq use.v4.i32@PLT
159 ; SSE41-NEXT: pmovsxbd {{.*#+}} xmm0 = [1,1,1,1]
160 ; SSE41-NEXT: movdqa (%rsp), %xmm1 # 16-byte Reload
161 ; SSE41-NEXT: pminud %xmm1, %xmm0
162 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm0
163 ; SSE41-NEXT: addq $24, %rsp
164 ; SSE41-NEXT: .cfi_def_cfa_offset 8
167 ; SSE2-LABEL: eq_or_eq_ult_2_fail_multiuse:
169 ; SSE2-NEXT: subq $24, %rsp
170 ; SSE2-NEXT: .cfi_def_cfa_offset 32
171 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
172 ; SSE2-NEXT: paddd %xmm0, %xmm1
173 ; SSE2-NEXT: movdqa %xmm1, (%rsp) # 16-byte Spill
174 ; SSE2-NEXT: movdqa %xmm1, %xmm0
175 ; SSE2-NEXT: callq use.v4.i32@PLT
176 ; SSE2-NEXT: movdqa (%rsp), %xmm1 # 16-byte Reload
177 ; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
178 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [2147483650,2147483650,2147483650,2147483650]
179 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm0
180 ; SSE2-NEXT: addq $24, %rsp
181 ; SSE2-NEXT: .cfi_def_cfa_offset 8
183 %x_adj = add <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1>
184 call void @use.v4.i32(<4 x i32> %x_adj)
185 %cmp = icmp ult <4 x i32> %x_adj, <i32 2, i32 2, i32 2, i32 2>
186 %r = sext <4 x i1> %cmp to <4 x i32>
190 define <4 x i32> @eq_or_eq_ult_3_fail(<4 x i32> %x) {
191 ; AVX512-LABEL: eq_or_eq_ult_3_fail:
193 ; AVX512-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
194 ; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm0
195 ; AVX512-NEXT: vpcmpltud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %k1
196 ; AVX512-NEXT: vmovdqa32 %xmm1, %xmm0 {%k1} {z}
199 ; AVX1-LABEL: eq_or_eq_ult_3_fail:
201 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
202 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
203 ; AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
204 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
207 ; AVX2-LABEL: eq_or_eq_ult_3_fail:
209 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
210 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0
211 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [2,2,2,2]
212 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm1
213 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
216 ; SSE41-LABEL: eq_or_eq_ult_3_fail:
218 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
219 ; SSE41-NEXT: paddd %xmm1, %xmm0
220 ; SSE41-NEXT: pmovsxbd {{.*#+}} xmm1 = [2,2,2,2]
221 ; SSE41-NEXT: pminud %xmm0, %xmm1
222 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm0
225 ; SSE2-LABEL: eq_or_eq_ult_3_fail:
227 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
228 ; SSE2-NEXT: paddd %xmm0, %xmm1
229 ; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
230 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [2147483651,2147483651,2147483651,2147483651]
231 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm0
233 %x_adj = add <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1>
234 %cmp = icmp ult <4 x i32> %x_adj, <i32 3, i32 3, i32 3, i32 3>
235 %r = sext <4 x i1> %cmp to <4 x i32>
239 define <4 x i32> @eq_or_eq_ugt_m3(<4 x i32> %x) {
240 ; AVX512-LABEL: eq_or_eq_ugt_m3:
242 ; AVX512-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
243 ; AVX512-NEXT: vpcmpnleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %k1
244 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
245 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
248 ; AVX-LABEL: eq_or_eq_ugt_m3:
250 ; AVX-NEXT: vpcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
251 ; AVX-NEXT: vpcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
252 ; AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
255 ; SSE41-LABEL: eq_or_eq_ugt_m3:
257 ; SSE41-NEXT: pmovsxbd {{.*#+}} xmm1 = [9,12,9,9]
258 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
259 ; SSE41-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
260 ; SSE41-NEXT: por %xmm1, %xmm0
263 ; SSE2-LABEL: eq_or_eq_ugt_m3:
265 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [9,12,9,9]
266 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
267 ; SSE2-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
268 ; SSE2-NEXT: por %xmm1, %xmm0
270 %x_adj = add <4 x i32> %x, <i32 -11, i32 -14, i32 -11, i32 -11>
271 %cmp = icmp ugt <4 x i32> %x_adj, <i32 -3, i32 -3, i32 -3, i32 -3>
272 %r = sext <4 x i1> %cmp to <4 x i32>
276 define <4 x i32> @eq_or_eq_ule_1(<4 x i32> %x) {
277 ; AVX512-LABEL: eq_or_eq_ule_1:
279 ; AVX512-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
280 ; AVX512-NEXT: vpcmpleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %k1
281 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
282 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
285 ; AVX-LABEL: eq_or_eq_ule_1:
287 ; AVX-NEXT: vpcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
288 ; AVX-NEXT: vpcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
289 ; AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
292 ; SSE41-LABEL: eq_or_eq_ule_1:
294 ; SSE41-NEXT: pmovsxbd {{.*#+}} xmm1 = [0,4294967295,4294967294,4294967293]
295 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
296 ; SSE41-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
297 ; SSE41-NEXT: por %xmm1, %xmm0
300 ; SSE2-LABEL: eq_or_eq_ule_1:
302 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [0,4294967295,4294967294,4294967293]
303 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
304 ; SSE2-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
305 ; SSE2-NEXT: por %xmm1, %xmm0
307 %x_adj = add <4 x i32> %x, <i32 1, i32 2, i32 3, i32 4>
308 %cmp = icmp ule <4 x i32> %x_adj, <i32 1, i32 1, i32 1, i32 1>
309 %r = sext <4 x i1> %cmp to <4 x i32>
313 define <2 x i64> @eq_or_eq_uge_m2_i64(<2 x i64> %x) {
314 ; AVX512-LABEL: eq_or_eq_uge_m2_i64:
316 ; AVX512-NEXT: vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
317 ; AVX512-NEXT: vpcmpnltuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %k1
318 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
319 ; AVX512-NEXT: vmovdqa64 %xmm0, %xmm0 {%k1} {z}
322 ; AVX-LABEL: eq_or_eq_uge_m2_i64:
324 ; AVX-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
325 ; AVX-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
326 ; AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
329 ; SSE41-LABEL: eq_or_eq_uge_m2_i64:
331 ; SSE41-NEXT: pmovsxbq {{.*#+}} xmm1 = [18446744073709551613,18446744073709551612]
332 ; SSE41-NEXT: pcmpeqq %xmm0, %xmm1
333 ; SSE41-NEXT: pcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
334 ; SSE41-NEXT: por %xmm1, %xmm0
337 ; SSE2-LABEL: eq_or_eq_uge_m2_i64:
339 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [18446744073709551613,18446744073709551612]
340 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
341 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,0,3,2]
342 ; SSE2-NEXT: pand %xmm1, %xmm2
343 ; SSE2-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
344 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
345 ; SSE2-NEXT: pand %xmm1, %xmm0
346 ; SSE2-NEXT: por %xmm2, %xmm0
348 %x_adj = add <2 x i64> %x, <i64 1, i64 2>
349 %cmp = icmp uge <2 x i64> %x_adj, <i64 -2, i64 -2>
350 %r = sext <2 x i1> %cmp to <2 x i64>
355 define <2 x i64> @eq_or_eq_uge_m2_i64_m1(<2 x i64> %x) {
356 ; AVX512-LABEL: eq_or_eq_uge_m2_i64_m1:
358 ; AVX512-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
359 ; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm0
360 ; AVX512-NEXT: vpcmpnltuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %k1
361 ; AVX512-NEXT: vmovdqa64 %xmm1, %xmm0 {%k1} {z}
364 ; AVX-LABEL: eq_or_eq_uge_m2_i64_m1:
366 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
367 ; AVX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm1
368 ; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2
369 ; AVX-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm0
370 ; AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
373 ; SSE41-LABEL: eq_or_eq_uge_m2_i64_m1:
375 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
376 ; SSE41-NEXT: pcmpeqq %xmm0, %xmm1
377 ; SSE41-NEXT: pxor %xmm2, %xmm2
378 ; SSE41-NEXT: pcmpeqq %xmm2, %xmm0
379 ; SSE41-NEXT: por %xmm1, %xmm0
382 ; SSE2-LABEL: eq_or_eq_uge_m2_i64_m1:
384 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
385 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
386 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,0,3,2]
387 ; SSE2-NEXT: pand %xmm1, %xmm2
388 ; SSE2-NEXT: pxor %xmm1, %xmm1
389 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
390 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
391 ; SSE2-NEXT: pand %xmm1, %xmm0
392 ; SSE2-NEXT: por %xmm2, %xmm0
394 %x_adj = add <2 x i64> %x, <i64 -1, i64 -1>
395 %cmp = icmp uge <2 x i64> %x_adj, <i64 -2, i64 -2>
396 %r = sext <2 x i1> %cmp to <2 x i64>
400 define <4 x i32> @eq_or_eq_uge_2_fail_(<4 x i32> %x) {
401 ; AVX512-LABEL: eq_or_eq_uge_2_fail_:
403 ; AVX512-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
404 ; AVX512-NEXT: vpcmpnltud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %k1
405 ; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
406 ; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}
409 ; AVX1-LABEL: eq_or_eq_uge_2_fail_:
411 ; AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
412 ; AVX1-NEXT: vpmaxud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
413 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
416 ; AVX2-LABEL: eq_or_eq_uge_2_fail_:
418 ; AVX2-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
419 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [2,2,2,2]
420 ; AVX2-NEXT: vpmaxud %xmm1, %xmm0, %xmm1
421 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
424 ; SSE41-LABEL: eq_or_eq_uge_2_fail_:
426 ; SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
427 ; SSE41-NEXT: pmovsxbd {{.*#+}} xmm1 = [2,2,2,2]
428 ; SSE41-NEXT: pmaxud %xmm0, %xmm1
429 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm0
432 ; SSE2-LABEL: eq_or_eq_uge_2_fail_:
434 ; SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
435 ; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
436 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483650,2147483650,2147483650,2147483650]
437 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1
438 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
439 ; SSE2-NEXT: pxor %xmm1, %xmm0
441 %x_adj = add <4 x i32> %x, <i32 1, i32 2, i32 3, i32 4>
442 %cmp = icmp uge <4 x i32> %x_adj, <i32 2, i32 2, i32 2, i32 2>
443 %r = sext <4 x i1> %cmp to <4 x i32>
448 define <8 x i32> @eq_or_eq_ult_2_256(<8 x i32> %x) {
449 ; AVX512-LABEL: eq_or_eq_ult_2_256:
451 ; AVX512-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0
452 ; AVX512-NEXT: vpcmpltud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %k1
453 ; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
454 ; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}
457 ; AVX1-LABEL: eq_or_eq_ult_2_256:
459 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [4294967291,4294967291,4294967291,4294967291]
460 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm2
461 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
462 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
463 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [1,1,1,1]
464 ; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm3
465 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm0, %xmm0
466 ; AVX1-NEXT: vpminud %xmm1, %xmm2, %xmm1
467 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm1
468 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
471 ; AVX2-LABEL: eq_or_eq_ult_2_256:
473 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [6,6,6,6,6,6,6,6]
474 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm1
475 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [5,5,5,5,5,5,5,5]
476 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm0, %ymm0
477 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
480 ; SSE41-LABEL: eq_or_eq_ult_2_256:
482 ; SSE41-NEXT: pmovsxbd {{.*#+}} xmm2 = [6,6,6,6]
483 ; SSE41-NEXT: movdqa %xmm0, %xmm3
484 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm3
485 ; SSE41-NEXT: pmovsxbd {{.*#+}} xmm4 = [5,5,5,5]
486 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm0
487 ; SSE41-NEXT: por %xmm3, %xmm0
488 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm2
489 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm1
490 ; SSE41-NEXT: por %xmm2, %xmm1
493 ; SSE2-LABEL: eq_or_eq_ult_2_256:
495 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [6,6,6,6]
496 ; SSE2-NEXT: movdqa %xmm0, %xmm3
497 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3
498 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [5,5,5,5]
499 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm0
500 ; SSE2-NEXT: por %xmm3, %xmm0
501 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2
502 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm1
503 ; SSE2-NEXT: por %xmm2, %xmm1
505 %x_adj = add <8 x i32> %x, <i32 -5, i32 -5, i32 -5, i32 -5, i32 -5, i32 -5, i32 -5, i32 -5>
506 %cmp = icmp ult <8 x i32> %x_adj, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
507 %r = sext <8 x i1> %cmp to <8 x i32>
512 define <8 x i32> @eq_or_eq_ult_2_256_m1(<8 x i32> %x) {
513 ; AVX512-LABEL: eq_or_eq_ult_2_256_m1:
515 ; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
516 ; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm0
517 ; AVX512-NEXT: vpcmpltud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %k1
518 ; AVX512-NEXT: vmovdqa32 %ymm1, %ymm0 {%k1} {z}
521 ; AVX1-LABEL: eq_or_eq_ult_2_256_m1:
523 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
524 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm2
525 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
526 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
527 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [1,1,1,1]
528 ; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm3
529 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm0, %xmm0
530 ; AVX1-NEXT: vpminud %xmm1, %xmm2, %xmm1
531 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm1
532 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
535 ; AVX2-LABEL: eq_or_eq_ult_2_256_m1:
537 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
538 ; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0
539 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]
540 ; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm1
541 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0
544 ; SSE41-LABEL: eq_or_eq_ult_2_256_m1:
546 ; SSE41-NEXT: pmovsxbd {{.*#+}} xmm2 = [2,2,2,2]
547 ; SSE41-NEXT: movdqa %xmm0, %xmm3
548 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm3
549 ; SSE41-NEXT: pmovsxbd {{.*#+}} xmm4 = [1,1,1,1]
550 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm0
551 ; SSE41-NEXT: por %xmm3, %xmm0
552 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm2
553 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm1
554 ; SSE41-NEXT: por %xmm2, %xmm1
557 ; SSE2-LABEL: eq_or_eq_ult_2_256_m1:
559 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2,2,2,2]
560 ; SSE2-NEXT: movdqa %xmm0, %xmm3
561 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3
562 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [1,1,1,1]
563 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm0
564 ; SSE2-NEXT: por %xmm3, %xmm0
565 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2
566 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm1
567 ; SSE2-NEXT: por %xmm2, %xmm1
569 %x_adj = add <8 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
570 %cmp = icmp ult <8 x i32> %x_adj, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
571 %r = sext <8 x i1> %cmp to <8 x i32>
576 define <32 x i8> @eq_or_eq_ult_2_256_i8_m1(<32 x i8> %x) {
577 ; AVX512-LABEL: eq_or_eq_ult_2_256_i8_m1:
579 ; AVX512-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
580 ; AVX512-NEXT: vpaddb %ymm1, %ymm0, %ymm0
581 ; AVX512-NEXT: vpminub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1
582 ; AVX512-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0
585 ; AVX1-LABEL: eq_or_eq_ult_2_256_i8_m1:
587 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
588 ; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm2
589 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
590 ; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm0
591 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
592 ; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm3
593 ; AVX1-NEXT: vpcmpeqb %xmm3, %xmm0, %xmm0
594 ; AVX1-NEXT: vpminub %xmm1, %xmm2, %xmm1
595 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1
596 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
599 ; AVX2-LABEL: eq_or_eq_ult_2_256_i8_m1:
601 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
602 ; AVX2-NEXT: vpaddb %ymm1, %ymm0, %ymm0
603 ; AVX2-NEXT: vpminub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1
604 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0
607 ; SSE41-LABEL: eq_or_eq_ult_2_256_i8_m1:
609 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
610 ; SSE41-NEXT: movdqa %xmm0, %xmm3
611 ; SSE41-NEXT: pcmpeqb %xmm2, %xmm3
612 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
613 ; SSE41-NEXT: pcmpeqb %xmm4, %xmm0
614 ; SSE41-NEXT: por %xmm3, %xmm0
615 ; SSE41-NEXT: pcmpeqb %xmm1, %xmm2
616 ; SSE41-NEXT: pcmpeqb %xmm4, %xmm1
617 ; SSE41-NEXT: por %xmm2, %xmm1
620 ; SSE2-LABEL: eq_or_eq_ult_2_256_i8_m1:
622 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
623 ; SSE2-NEXT: movdqa %xmm0, %xmm3
624 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm3
625 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
626 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm0
627 ; SSE2-NEXT: por %xmm3, %xmm0
628 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm2
629 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm1
630 ; SSE2-NEXT: por %xmm2, %xmm1
632 %x_adj = add <32 x i8> %x, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
633 %cmp = icmp ult <32 x i8> %x_adj, <i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>
634 %r = sext <32 x i1> %cmp to <32 x i8>
639 define <16 x i8> @eq_or_eq_ult_2_128_i8_m1(<16 x i8> %x) {
640 ; AVX512-LABEL: eq_or_eq_ult_2_128_i8_m1:
642 ; AVX512-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
643 ; AVX512-NEXT: vpaddb %xmm1, %xmm0, %xmm0
644 ; AVX512-NEXT: vpminub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
645 ; AVX512-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
648 ; AVX-LABEL: eq_or_eq_ult_2_128_i8_m1:
650 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
651 ; AVX-NEXT: vpaddb %xmm1, %xmm0, %xmm0
652 ; AVX-NEXT: vpminub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
653 ; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
656 ; SSE41-LABEL: eq_or_eq_ult_2_128_i8_m1:
658 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
659 ; SSE41-NEXT: paddb %xmm1, %xmm0
660 ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
661 ; SSE41-NEXT: pminub %xmm0, %xmm1
662 ; SSE41-NEXT: pcmpeqb %xmm1, %xmm0
665 ; SSE2-LABEL: eq_or_eq_ult_2_128_i8_m1:
667 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
668 ; SSE2-NEXT: paddb %xmm1, %xmm0
669 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
670 ; SSE2-NEXT: pminub %xmm0, %xmm1
671 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm0
673 %x_adj = add <16 x i8> %x, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
674 %cmp = icmp ult <16 x i8> %x_adj, <i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>
675 %r = sext <16 x i1> %cmp to <16 x i8>
680 define <16 x i8> @eq_or_eq_ult_2_128_i8(<16 x i8> %x) {
681 ; AVX512-LABEL: eq_or_eq_ult_2_128_i8:
683 ; AVX512-NEXT: vpaddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
684 ; AVX512-NEXT: vpminub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
685 ; AVX512-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
688 ; AVX-LABEL: eq_or_eq_ult_2_128_i8:
690 ; AVX-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
691 ; AVX-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
692 ; AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
695 ; SSE41-LABEL: eq_or_eq_ult_2_128_i8:
697 ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232]
698 ; SSE41-NEXT: pcmpeqb %xmm0, %xmm1
699 ; SSE41-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
700 ; SSE41-NEXT: por %xmm1, %xmm0
703 ; SSE2-LABEL: eq_or_eq_ult_2_128_i8:
705 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232]
706 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
707 ; SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
708 ; SSE2-NEXT: por %xmm1, %xmm0
710 %x_adj = add <16 x i8> %x, <i8 25, i8 25, i8 25, i8 25, i8 25, i8 25, i8 25, i8 25, i8 25, i8 25, i8 25, i8 25, i8 25, i8 25, i8 25, i8 25>
711 %cmp = icmp ult <16 x i8> %x_adj, <i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>
712 %r = sext <16 x i1> %cmp to <16 x i8>