xref: /llvm-project/llvm/test/CodeGen/X86/eq-or-eq-range-of-2.ll (revision 9f96db8e310f79ec450c9cf6e6311f576dfd1d51)
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
7
8declare void @use.v4.i32(<4 x i32>)
9
10define <4 x i32> @eq_or_eq_ult_2(<4 x i32> %x) {
11; AVX512-LABEL: eq_or_eq_ult_2:
12; AVX512:       # %bb.0:
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}
17; AVX512-NEXT:    retq
18;
19; AVX1-LABEL: eq_or_eq_ult_2:
20; AVX1:       # %bb.0:
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
24; AVX1-NEXT:    retq
25;
26; AVX2-LABEL: eq_or_eq_ult_2:
27; AVX2:       # %bb.0:
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
33; AVX2-NEXT:    retq
34;
35; SSE41-LABEL: eq_or_eq_ult_2:
36; SSE41:       # %bb.0:
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
41; SSE41-NEXT:    retq
42;
43; SSE2-LABEL: eq_or_eq_ult_2:
44; SSE2:       # %bb.0:
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
49; SSE2-NEXT:    retq
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>
53  ret <4 x i32> %r
54}
55
56define <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:
58; AVX512:       # %bb.0:
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}
63; AVX512-NEXT:    retq
64;
65; AVX1-LABEL: eq_or_eq_ult_2_only_transform_sse2:
66; AVX1:       # %bb.0:
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
71; AVX1-NEXT:    retq
72;
73; AVX2-LABEL: eq_or_eq_ult_2_only_transform_sse2:
74; AVX2:       # %bb.0:
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
80; AVX2-NEXT:    retq
81;
82; SSE41-LABEL: eq_or_eq_ult_2_only_transform_sse2:
83; SSE41:       # %bb.0:
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
89; SSE41-NEXT:    retq
90;
91; SSE2-LABEL: eq_or_eq_ult_2_only_transform_sse2:
92; SSE2:       # %bb.0:
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
97; SSE2-NEXT:    retq
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>
101  ret <4 x i32> %r
102}
103
104define <4 x i32> @eq_or_eq_ult_2_fail_multiuse(<4 x i32> %x) {
105; AVX512-LABEL: eq_or_eq_ult_2_fail_multiuse:
106; AVX512:       # %bb.0:
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
118; AVX512-NEXT:    retq
119;
120; AVX1-LABEL: eq_or_eq_ult_2_fail_multiuse:
121; AVX1:       # %bb.0:
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
133; AVX1-NEXT:    retq
134;
135; AVX2-LABEL: eq_or_eq_ult_2_fail_multiuse:
136; AVX2:       # %bb.0:
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
149; AVX2-NEXT:    retq
150;
151; SSE41-LABEL: eq_or_eq_ult_2_fail_multiuse:
152; SSE41:       # %bb.0:
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
165; SSE41-NEXT:    retq
166;
167; SSE2-LABEL: eq_or_eq_ult_2_fail_multiuse:
168; SSE2:       # %bb.0:
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
182; SSE2-NEXT:    retq
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>
187  ret <4 x i32> %r
188}
189
190define <4 x i32> @eq_or_eq_ult_3_fail(<4 x i32> %x) {
191; AVX512-LABEL: eq_or_eq_ult_3_fail:
192; AVX512:       # %bb.0:
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}
197; AVX512-NEXT:    retq
198;
199; AVX1-LABEL: eq_or_eq_ult_3_fail:
200; AVX1:       # %bb.0:
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
205; AVX1-NEXT:    retq
206;
207; AVX2-LABEL: eq_or_eq_ult_3_fail:
208; AVX2:       # %bb.0:
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
214; AVX2-NEXT:    retq
215;
216; SSE41-LABEL: eq_or_eq_ult_3_fail:
217; SSE41:       # %bb.0:
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
223; SSE41-NEXT:    retq
224;
225; SSE2-LABEL: eq_or_eq_ult_3_fail:
226; SSE2:       # %bb.0:
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
232; SSE2-NEXT:    retq
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>
236  ret <4 x i32> %r
237}
238
239define <4 x i32> @eq_or_eq_ugt_m3(<4 x i32> %x) {
240; AVX512-LABEL: eq_or_eq_ugt_m3:
241; AVX512:       # %bb.0:
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}
246; AVX512-NEXT:    retq
247;
248; AVX-LABEL: eq_or_eq_ugt_m3:
249; AVX:       # %bb.0:
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
253; AVX-NEXT:    retq
254;
255; SSE41-LABEL: eq_or_eq_ugt_m3:
256; SSE41:       # %bb.0:
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
261; SSE41-NEXT:    retq
262;
263; SSE2-LABEL: eq_or_eq_ugt_m3:
264; SSE2:       # %bb.0:
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
269; SSE2-NEXT:    retq
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>
273  ret <4 x i32> %r
274}
275
276define <4 x i32> @eq_or_eq_ule_1(<4 x i32> %x) {
277; AVX512-LABEL: eq_or_eq_ule_1:
278; AVX512:       # %bb.0:
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}
283; AVX512-NEXT:    retq
284;
285; AVX-LABEL: eq_or_eq_ule_1:
286; AVX:       # %bb.0:
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
290; AVX-NEXT:    retq
291;
292; SSE41-LABEL: eq_or_eq_ule_1:
293; SSE41:       # %bb.0:
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
298; SSE41-NEXT:    retq
299;
300; SSE2-LABEL: eq_or_eq_ule_1:
301; SSE2:       # %bb.0:
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
306; SSE2-NEXT:    retq
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>
310  ret <4 x i32> %r
311}
312
313define <2 x i64> @eq_or_eq_uge_m2_i64(<2 x i64> %x) {
314; AVX512-LABEL: eq_or_eq_uge_m2_i64:
315; AVX512:       # %bb.0:
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}
320; AVX512-NEXT:    retq
321;
322; AVX-LABEL: eq_or_eq_uge_m2_i64:
323; AVX:       # %bb.0:
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
327; AVX-NEXT:    retq
328;
329; SSE41-LABEL: eq_or_eq_uge_m2_i64:
330; SSE41:       # %bb.0:
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
335; SSE41-NEXT:    retq
336;
337; SSE2-LABEL: eq_or_eq_uge_m2_i64:
338; SSE2:       # %bb.0:
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
347; SSE2-NEXT:    retq
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>
351  ret <2 x i64> %r
352}
353
354
355define <2 x i64> @eq_or_eq_uge_m2_i64_m1(<2 x i64> %x) {
356; AVX512-LABEL: eq_or_eq_uge_m2_i64_m1:
357; AVX512:       # %bb.0:
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}
362; AVX512-NEXT:    retq
363;
364; AVX-LABEL: eq_or_eq_uge_m2_i64_m1:
365; AVX:       # %bb.0:
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
371; AVX-NEXT:    retq
372;
373; SSE41-LABEL: eq_or_eq_uge_m2_i64_m1:
374; SSE41:       # %bb.0:
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
380; SSE41-NEXT:    retq
381;
382; SSE2-LABEL: eq_or_eq_uge_m2_i64_m1:
383; SSE2:       # %bb.0:
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
393; SSE2-NEXT:    retq
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>
397  ret <2 x i64> %r
398}
399
400define <4 x i32> @eq_or_eq_uge_2_fail_(<4 x i32> %x) {
401; AVX512-LABEL: eq_or_eq_uge_2_fail_:
402; AVX512:       # %bb.0:
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}
407; AVX512-NEXT:    retq
408;
409; AVX1-LABEL: eq_or_eq_uge_2_fail_:
410; AVX1:       # %bb.0:
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
414; AVX1-NEXT:    retq
415;
416; AVX2-LABEL: eq_or_eq_uge_2_fail_:
417; AVX2:       # %bb.0:
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
422; AVX2-NEXT:    retq
423;
424; SSE41-LABEL: eq_or_eq_uge_2_fail_:
425; SSE41:       # %bb.0:
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
430; SSE41-NEXT:    retq
431;
432; SSE2-LABEL: eq_or_eq_uge_2_fail_:
433; SSE2:       # %bb.0:
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
440; SSE2-NEXT:    retq
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>
444  ret <4 x i32> %r
445}
446
447
448define <8 x i32> @eq_or_eq_ult_2_256(<8 x i32> %x) {
449; AVX512-LABEL: eq_or_eq_ult_2_256:
450; AVX512:       # %bb.0:
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}
455; AVX512-NEXT:    retq
456;
457; AVX1-LABEL: eq_or_eq_ult_2_256:
458; AVX1:       # %bb.0:
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
469; AVX1-NEXT:    retq
470;
471; AVX2-LABEL: eq_or_eq_ult_2_256:
472; AVX2:       # %bb.0:
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
478; AVX2-NEXT:    retq
479;
480; SSE41-LABEL: eq_or_eq_ult_2_256:
481; SSE41:       # %bb.0:
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
491; SSE41-NEXT:    retq
492;
493; SSE2-LABEL: eq_or_eq_ult_2_256:
494; SSE2:       # %bb.0:
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
504; SSE2-NEXT:    retq
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>
508  ret <8 x i32> %r
509}
510
511
512define <8 x i32> @eq_or_eq_ult_2_256_m1(<8 x i32> %x) {
513; AVX512-LABEL: eq_or_eq_ult_2_256_m1:
514; AVX512:       # %bb.0:
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}
519; AVX512-NEXT:    retq
520;
521; AVX1-LABEL: eq_or_eq_ult_2_256_m1:
522; AVX1:       # %bb.0:
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
533; AVX1-NEXT:    retq
534;
535; AVX2-LABEL: eq_or_eq_ult_2_256_m1:
536; AVX2:       # %bb.0:
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
542; AVX2-NEXT:    retq
543;
544; SSE41-LABEL: eq_or_eq_ult_2_256_m1:
545; SSE41:       # %bb.0:
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
555; SSE41-NEXT:    retq
556;
557; SSE2-LABEL: eq_or_eq_ult_2_256_m1:
558; SSE2:       # %bb.0:
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
568; SSE2-NEXT:    retq
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>
572  ret <8 x i32> %r
573}
574
575
576define <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:
578; AVX512:       # %bb.0:
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
583; AVX512-NEXT:    retq
584;
585; AVX1-LABEL: eq_or_eq_ult_2_256_i8_m1:
586; AVX1:       # %bb.0:
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
597; AVX1-NEXT:    retq
598;
599; AVX2-LABEL: eq_or_eq_ult_2_256_i8_m1:
600; AVX2:       # %bb.0:
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
605; AVX2-NEXT:    retq
606;
607; SSE41-LABEL: eq_or_eq_ult_2_256_i8_m1:
608; SSE41:       # %bb.0:
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
618; SSE41-NEXT:    retq
619;
620; SSE2-LABEL: eq_or_eq_ult_2_256_i8_m1:
621; SSE2:       # %bb.0:
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
631; SSE2-NEXT:    retq
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>
635  ret <32 x i8> %r
636}
637
638
639define <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:
641; AVX512:       # %bb.0:
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
646; AVX512-NEXT:    retq
647;
648; AVX-LABEL: eq_or_eq_ult_2_128_i8_m1:
649; AVX:       # %bb.0:
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
654; AVX-NEXT:    retq
655;
656; SSE41-LABEL: eq_or_eq_ult_2_128_i8_m1:
657; SSE41:       # %bb.0:
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
663; SSE41-NEXT:    retq
664;
665; SSE2-LABEL: eq_or_eq_ult_2_128_i8_m1:
666; SSE2:       # %bb.0:
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
672; SSE2-NEXT:    retq
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>
676  ret <16 x i8> %r
677}
678
679
680define <16 x i8> @eq_or_eq_ult_2_128_i8(<16 x i8> %x) {
681; AVX512-LABEL: eq_or_eq_ult_2_128_i8:
682; AVX512:       # %bb.0:
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
686; AVX512-NEXT:    retq
687;
688; AVX-LABEL: eq_or_eq_ult_2_128_i8:
689; AVX:       # %bb.0:
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
693; AVX-NEXT:    retq
694;
695; SSE41-LABEL: eq_or_eq_ult_2_128_i8:
696; SSE41:       # %bb.0:
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
701; SSE41-NEXT:    retq
702;
703; SSE2-LABEL: eq_or_eq_ult_2_128_i8:
704; SSE2:       # %bb.0:
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
709; SSE2-NEXT:    retq
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>
713  ret <16 x i8> %r
714}
715