1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=SSE --check-prefix=SSSE3
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512
9
10; FIXME: should be paddusb
11define <16 x i8> @test1(<16 x i8> %x) {
12; SSE-LABEL: test1:
13; SSE:       # %bb.0:
14; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
15; SSE-NEXT:    movdqa %xmm0, %xmm2
16; SSE-NEXT:    psubb %xmm1, %xmm2
17; SSE-NEXT:    pcmpeqb %xmm1, %xmm0
18; SSE-NEXT:    por %xmm2, %xmm0
19; SSE-NEXT:    retq
20;
21; AVX1-LABEL: test1:
22; AVX1:       # %bb.0:
23; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
24; AVX1-NEXT:    vpsubb %xmm1, %xmm0, %xmm2
25; AVX1-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
26; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
27; AVX1-NEXT:    retq
28;
29; AVX2-LABEL: test1:
30; AVX2:       # %bb.0:
31; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
32; AVX2-NEXT:    vpsubb %xmm1, %xmm0, %xmm2
33; AVX2-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
34; AVX2-NEXT:    vpor %xmm2, %xmm0, %xmm0
35; AVX2-NEXT:    retq
36;
37; AVX512-LABEL: test1:
38; AVX512:       # %bb.0:
39; AVX512-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
40; AVX512-NEXT:    vpsubb %xmm2, %xmm0, %xmm1
41; AVX512-NEXT:    vpcmpeqb %xmm2, %xmm0, %k1
42; AVX512-NEXT:    vmovdqu8 %xmm2, %xmm1 {%k1}
43; AVX512-NEXT:    vmovdqa %xmm1, %xmm0
44; AVX512-NEXT:    retq
45  %1 = 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>
46  %2 = icmp eq <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>
47  %3 = select <16 x i1> %2, <16 x i8> <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>, <16 x i8> %1
48  ret <16 x i8> %3
49}
50
51define <16 x i8> @test2(<16 x i8> %x) {
52; SSE-LABEL: test2:
53; SSE:       # %bb.0:
54; SSE-NEXT:    paddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
55; SSE-NEXT:    retq
56;
57; AVX-LABEL: test2:
58; AVX:       # %bb.0:
59; AVX-NEXT:    vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
60; AVX-NEXT:    retq
61  %1 = add <16 x i8> %x, <i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127>
62  %2 = icmp ugt <16 x i8> %x, <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>
63  %3 = select <16 x i1> %2, <16 x i8> <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>, <16 x i8> %1
64  ret <16 x i8> %3
65}
66
67define <16 x i8> @test3(<16 x i8> %x) {
68; SSE-LABEL: test3:
69; SSE:       # %bb.0:
70; SSE-NEXT:    paddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
71; SSE-NEXT:    retq
72;
73; AVX-LABEL: test3:
74; AVX:       # %bb.0:
75; AVX-NEXT:    vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
76; AVX-NEXT:    retq
77  %1 = add <16 x i8> %x, <i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127>
78  %2 = icmp ugt <16 x i8> %x, <i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126>
79  %3 = select <16 x i1> %2, <16 x i8> <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>, <16 x i8> %1
80  ret <16 x i8> %3
81}
82
83define <16 x i8> @test4(<16 x i8> %x) {
84; SSE-LABEL: test4:
85; SSE:       # %bb.0:
86; SSE-NEXT:    paddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
87; SSE-NEXT:    retq
88;
89; AVX-LABEL: test4:
90; AVX:       # %bb.0:
91; AVX-NEXT:    vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
92; AVX-NEXT:    retq
93  %1 = add <16 x i8> %x, <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>
94  %2 = icmp ugt <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>
95  %3 = select <16 x i1> %2, <16 x i8> <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>, <16 x i8> %1
96  ret <16 x i8> %3
97}
98
99; FIXME: should be paddusb
100define <16 x i8> @test5(<16 x i8> %x) {
101; SSE-LABEL: test5:
102; SSE:       # %bb.0:
103; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
104; SSE-NEXT:    pxor %xmm0, %xmm1
105; SSE-NEXT:    pmaxub %xmm1, %xmm0
106; SSE-NEXT:    pcmpeqb %xmm1, %xmm0
107; SSE-NEXT:    pcmpeqd %xmm2, %xmm2
108; SSE-NEXT:    pxor %xmm2, %xmm0
109; SSE-NEXT:    por %xmm1, %xmm0
110; SSE-NEXT:    retq
111;
112; AVX1-LABEL: test5:
113; AVX1:       # %bb.0:
114; AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
115; AVX1-NEXT:    vpmaxub %xmm0, %xmm1, %xmm0
116; AVX1-NEXT:    vpcmpeqb %xmm0, %xmm1, %xmm0
117; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
118; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
119; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
120; AVX1-NEXT:    retq
121;
122; AVX2-LABEL: test5:
123; AVX2:       # %bb.0:
124; AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
125; AVX2-NEXT:    vpmaxub %xmm0, %xmm1, %xmm0
126; AVX2-NEXT:    vpcmpeqb %xmm0, %xmm1, %xmm0
127; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
128; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
129; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
130; AVX2-NEXT:    retq
131;
132; AVX512-LABEL: test5:
133; AVX512:       # %bb.0:
134; AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
135; AVX512-NEXT:    vpcmpltub %xmm0, %xmm1, %k1
136; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
137; AVX512-NEXT:    vmovdqu8 %xmm0, %xmm1 {%k1}
138; AVX512-NEXT:    vmovdqa %xmm1, %xmm0
139; AVX512-NEXT:    retq
140  %1 = xor <16 x i8> %x, <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>
141  %2 = icmp ult <16 x i8> %1, %x
142  %3 = select <16 x i1> %2, <16 x i8> <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>, <16 x i8> %1
143  ret <16 x i8> %3
144}
145
146define <16 x i8> @test6(<16 x i8> %x) {
147; SSE-LABEL: test6:
148; SSE:       # %bb.0:
149; SSE-NEXT:    paddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
150; SSE-NEXT:    retq
151;
152; AVX-LABEL: test6:
153; AVX:       # %bb.0:
154; AVX-NEXT:    vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
155; AVX-NEXT:    retq
156  %1 = add <16 x i8> %x, <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>
157  %2 = icmp ugt <16 x i8> %x, <i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3>
158  %3 = select <16 x i1> %2, <16 x i8> <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>, <16 x i8> %1
159  ret <16 x i8> %3
160}
161
162define <32 x i8> @test7(<32 x i8> %x) {
163; SSE-LABEL: test7:
164; SSE:       # %bb.0:
165; SSE-NEXT:    pcmpeqd %xmm2, %xmm2
166; SSE-NEXT:    movdqa %xmm1, %xmm3
167; SSE-NEXT:    psubb %xmm2, %xmm3
168; SSE-NEXT:    movdqa %xmm0, %xmm4
169; SSE-NEXT:    psubb %xmm2, %xmm4
170; SSE-NEXT:    pcmpeqb %xmm2, %xmm1
171; SSE-NEXT:    por %xmm3, %xmm1
172; SSE-NEXT:    pcmpeqb %xmm2, %xmm0
173; SSE-NEXT:    por %xmm4, %xmm0
174; SSE-NEXT:    retq
175;
176; AVX1-LABEL: test7:
177; AVX1:       # %bb.0:
178; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
179; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
180; AVX1-NEXT:    vpsubb %xmm2, %xmm1, %xmm3
181; AVX1-NEXT:    vpsubb %xmm2, %xmm0, %xmm4
182; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
183; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm1, %xmm1
184; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm0
185; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
186; AVX1-NEXT:    vorps %ymm3, %ymm0, %ymm0
187; AVX1-NEXT:    retq
188;
189; AVX2-LABEL: test7:
190; AVX2:       # %bb.0:
191; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
192; AVX2-NEXT:    vpsubb %ymm1, %ymm0, %ymm2
193; AVX2-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
194; AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm0
195; AVX2-NEXT:    retq
196;
197; AVX512-LABEL: test7:
198; AVX512:       # %bb.0:
199; AVX512-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
200; AVX512-NEXT:    vpsubb %ymm2, %ymm0, %ymm1
201; AVX512-NEXT:    vpcmpeqb %ymm2, %ymm0, %k1
202; AVX512-NEXT:    vmovdqu8 %ymm2, %ymm1 {%k1}
203; AVX512-NEXT:    vmovdqa %ymm1, %ymm0
204; AVX512-NEXT:    retq
205  %1 = 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>
206  %2 = icmp eq <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>
207  %3 = select <32 x i1> %2, <32 x i8> <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>, <32 x i8> %1
208  ret <32 x i8> %3
209}
210
211define <32 x i8> @test8(<32 x i8> %x) {
212; SSE-LABEL: test8:
213; SSE:       # %bb.0:
214; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
215; SSE-NEXT:    paddusb %xmm2, %xmm0
216; SSE-NEXT:    paddusb %xmm2, %xmm1
217; SSE-NEXT:    retq
218;
219; AVX1-LABEL: test8:
220; AVX1:       # %bb.0:
221; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
222; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
223; AVX1-NEXT:    vpaddusb %xmm2, %xmm1, %xmm1
224; AVX1-NEXT:    vpaddusb %xmm2, %xmm0, %xmm0
225; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
226; AVX1-NEXT:    retq
227;
228; AVX2-LABEL: test8:
229; AVX2:       # %bb.0:
230; AVX2-NEXT:    vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
231; AVX2-NEXT:    retq
232;
233; AVX512-LABEL: test8:
234; AVX512:       # %bb.0:
235; AVX512-NEXT:    vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
236; AVX512-NEXT:    retq
237  %1 = add <32 x i8> %x, <i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127>
238  %2 = icmp ugt <32 x i8> %x, <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>
239  %3 = select <32 x i1> %2, <32 x i8> <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>, <32 x i8> %1
240  ret <32 x i8> %3
241}
242
243define <32 x i8> @test9(<32 x i8> %x) {
244; SSE-LABEL: test9:
245; SSE:       # %bb.0:
246; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129]
247; SSE-NEXT:    paddusb %xmm2, %xmm0
248; SSE-NEXT:    paddusb %xmm2, %xmm1
249; SSE-NEXT:    retq
250;
251; AVX1-LABEL: test9:
252; AVX1:       # %bb.0:
253; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
254; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129]
255; AVX1-NEXT:    vpaddusb %xmm2, %xmm1, %xmm1
256; AVX1-NEXT:    vpaddusb %xmm2, %xmm0, %xmm0
257; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
258; AVX1-NEXT:    retq
259;
260; AVX2-LABEL: test9:
261; AVX2:       # %bb.0:
262; AVX2-NEXT:    vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
263; AVX2-NEXT:    retq
264;
265; AVX512-LABEL: test9:
266; AVX512:       # %bb.0:
267; AVX512-NEXT:    vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
268; AVX512-NEXT:    retq
269  %1 = add <32 x i8> %x, <i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127>
270  %2 = icmp ugt <32 x i8> %x, <i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126>
271  %3 = select <32 x i1> %2, <32 x i8> <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>, <32 x i8> %1
272  ret <32 x i8> %3
273}
274
275define <32 x i8> @test10(<32 x i8> %x) {
276; SSE-LABEL: test10:
277; SSE:       # %bb.0:
278; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254]
279; SSE-NEXT:    paddusb %xmm2, %xmm0
280; SSE-NEXT:    paddusb %xmm2, %xmm1
281; SSE-NEXT:    retq
282;
283; AVX1-LABEL: test10:
284; AVX1:       # %bb.0:
285; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
286; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254]
287; AVX1-NEXT:    vpaddusb %xmm2, %xmm1, %xmm1
288; AVX1-NEXT:    vpaddusb %xmm2, %xmm0, %xmm0
289; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
290; AVX1-NEXT:    retq
291;
292; AVX2-LABEL: test10:
293; AVX2:       # %bb.0:
294; AVX2-NEXT:    vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
295; AVX2-NEXT:    retq
296;
297; AVX512-LABEL: test10:
298; AVX512:       # %bb.0:
299; AVX512-NEXT:    vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
300; AVX512-NEXT:    retq
301  %1 = add <32 x i8> %x, <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>
302  %2 = icmp ugt <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>
303  %3 = select <32 x i1> %2, <32 x i8> <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>, <32 x i8> %1
304  ret <32 x i8> %3
305}
306
307define <32 x i8> @test11(<32 x i8> %x) {
308; SSE-LABEL: test11:
309; SSE:       # %bb.0:
310; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
311; SSE-NEXT:    movdqa %xmm0, %xmm3
312; SSE-NEXT:    pxor %xmm2, %xmm3
313; SSE-NEXT:    pxor %xmm1, %xmm2
314; SSE-NEXT:    pmaxub %xmm2, %xmm1
315; SSE-NEXT:    pcmpeqb %xmm2, %xmm1
316; SSE-NEXT:    pcmpeqd %xmm4, %xmm4
317; SSE-NEXT:    pxor %xmm4, %xmm1
318; SSE-NEXT:    pmaxub %xmm3, %xmm0
319; SSE-NEXT:    pcmpeqb %xmm3, %xmm0
320; SSE-NEXT:    pxor %xmm4, %xmm0
321; SSE-NEXT:    por %xmm3, %xmm0
322; SSE-NEXT:    por %xmm2, %xmm1
323; SSE-NEXT:    retq
324;
325; AVX1-LABEL: test11:
326; AVX1:       # %bb.0:
327; AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1
328; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
329; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
330; AVX1-NEXT:    vpmaxub %xmm2, %xmm3, %xmm2
331; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm3, %xmm2
332; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
333; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm2
334; AVX1-NEXT:    vpmaxub %xmm0, %xmm1, %xmm0
335; AVX1-NEXT:    vpcmpeqb %xmm0, %xmm1, %xmm0
336; AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm0
337; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
338; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
339; AVX1-NEXT:    retq
340;
341; AVX2-LABEL: test11:
342; AVX2:       # %bb.0:
343; AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1
344; AVX2-NEXT:    vpmaxub %ymm0, %ymm1, %ymm0
345; AVX2-NEXT:    vpcmpeqb %ymm0, %ymm1, %ymm0
346; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
347; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
348; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
349; AVX2-NEXT:    retq
350;
351; AVX512-LABEL: test11:
352; AVX512:       # %bb.0:
353; AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1
354; AVX512-NEXT:    vpcmpltub %ymm0, %ymm1, %k1
355; AVX512-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
356; AVX512-NEXT:    vmovdqu8 %ymm0, %ymm1 {%k1}
357; AVX512-NEXT:    vmovdqa %ymm1, %ymm0
358; AVX512-NEXT:    retq
359  %1 = xor <32 x i8> %x, <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>
360  %2 = icmp ult <32 x i8> %1, %x
361  %3 = select <32 x i1> %2, <32 x i8> <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>, <32 x i8> %1
362  ret <32 x i8> %3
363}
364
365define <32 x i8> @test12(<32 x i8> %x) {
366; SSE-LABEL: test12:
367; SSE:       # %bb.0:
368; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
369; SSE-NEXT:    paddusb %xmm2, %xmm0
370; SSE-NEXT:    paddusb %xmm2, %xmm1
371; SSE-NEXT:    retq
372;
373; AVX1-LABEL: test12:
374; AVX1:       # %bb.0:
375; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
376; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
377; AVX1-NEXT:    vpaddusb %xmm2, %xmm1, %xmm1
378; AVX1-NEXT:    vpaddusb %xmm2, %xmm0, %xmm0
379; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
380; AVX1-NEXT:    retq
381;
382; AVX2-LABEL: test12:
383; AVX2:       # %bb.0:
384; AVX2-NEXT:    vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
385; AVX2-NEXT:    retq
386;
387; AVX512-LABEL: test12:
388; AVX512:       # %bb.0:
389; AVX512-NEXT:    vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
390; AVX512-NEXT:    retq
391  %1 = add <32 x i8> %x, <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>
392  %2 = icmp ugt <32 x i8> %x, <i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3>
393  %3 = select <32 x i1> %2, <32 x i8> <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>, <32 x i8> %1
394  ret <32 x i8> %3
395}
396
397define <64 x i8> @test13(<64 x i8> %x) {
398; SSE-LABEL: test13:
399; SSE:       # %bb.0:
400; SSE-NEXT:    pcmpeqd %xmm8, %xmm8
401; SSE-NEXT:    movdqa %xmm3, %xmm5
402; SSE-NEXT:    psubb %xmm8, %xmm5
403; SSE-NEXT:    movdqa %xmm2, %xmm6
404; SSE-NEXT:    psubb %xmm8, %xmm6
405; SSE-NEXT:    movdqa %xmm1, %xmm7
406; SSE-NEXT:    psubb %xmm8, %xmm7
407; SSE-NEXT:    movdqa %xmm0, %xmm4
408; SSE-NEXT:    psubb %xmm8, %xmm4
409; SSE-NEXT:    pcmpeqb %xmm8, %xmm3
410; SSE-NEXT:    por %xmm5, %xmm3
411; SSE-NEXT:    pcmpeqb %xmm8, %xmm2
412; SSE-NEXT:    por %xmm6, %xmm2
413; SSE-NEXT:    pcmpeqb %xmm8, %xmm1
414; SSE-NEXT:    por %xmm7, %xmm1
415; SSE-NEXT:    pcmpeqb %xmm8, %xmm0
416; SSE-NEXT:    por %xmm4, %xmm0
417; SSE-NEXT:    retq
418;
419; AVX1-LABEL: test13:
420; AVX1:       # %bb.0:
421; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
422; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
423; AVX1-NEXT:    vpsubb %xmm3, %xmm2, %xmm4
424; AVX1-NEXT:    vpsubb %xmm3, %xmm1, %xmm5
425; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm5, %ymm4
426; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
427; AVX1-NEXT:    vpsubb %xmm3, %xmm5, %xmm6
428; AVX1-NEXT:    vpsubb %xmm3, %xmm0, %xmm7
429; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm7, %ymm6
430; AVX1-NEXT:    vpcmpeqb %xmm3, %xmm2, %xmm2
431; AVX1-NEXT:    vpcmpeqb %xmm3, %xmm1, %xmm1
432; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
433; AVX1-NEXT:    vorps %ymm4, %ymm1, %ymm1
434; AVX1-NEXT:    vpcmpeqb %xmm3, %xmm5, %xmm2
435; AVX1-NEXT:    vpcmpeqb %xmm3, %xmm0, %xmm0
436; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
437; AVX1-NEXT:    vorps %ymm6, %ymm0, %ymm0
438; AVX1-NEXT:    retq
439;
440; AVX2-LABEL: test13:
441; AVX2:       # %bb.0:
442; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
443; AVX2-NEXT:    vpsubb %ymm2, %ymm1, %ymm3
444; AVX2-NEXT:    vpsubb %ymm2, %ymm0, %ymm4
445; AVX2-NEXT:    vpcmpeqb %ymm2, %ymm1, %ymm1
446; AVX2-NEXT:    vpor %ymm3, %ymm1, %ymm1
447; AVX2-NEXT:    vpcmpeqb %ymm2, %ymm0, %ymm0
448; AVX2-NEXT:    vpor %ymm4, %ymm0, %ymm0
449; AVX2-NEXT:    retq
450;
451; AVX512-LABEL: test13:
452; AVX512:       # %bb.0:
453; AVX512-NEXT:    vpternlogd $255, %zmm2, %zmm2, %zmm2
454; AVX512-NEXT:    vpsubb %zmm2, %zmm0, %zmm1
455; AVX512-NEXT:    vpcmpeqb %zmm2, %zmm0, %k1
456; AVX512-NEXT:    vmovdqu8 %zmm2, %zmm1 {%k1}
457; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm0
458; AVX512-NEXT:    retq
459  %1 = add <64 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, 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>
460  %2 = icmp eq <64 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, 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>
461  %3 = select <64 x i1> %2, <64 x i8> <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, 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>, <64 x i8> %1
462  ret <64 x i8> %3
463}
464
465define <64 x i8> @test14(<64 x i8> %x) {
466; SSE-LABEL: test14:
467; SSE:       # %bb.0:
468; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
469; SSE-NEXT:    paddusb %xmm4, %xmm0
470; SSE-NEXT:    paddusb %xmm4, %xmm1
471; SSE-NEXT:    paddusb %xmm4, %xmm2
472; SSE-NEXT:    paddusb %xmm4, %xmm3
473; SSE-NEXT:    retq
474;
475; AVX1-LABEL: test14:
476; AVX1:       # %bb.0:
477; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
478; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
479; AVX1-NEXT:    vpaddusb %xmm3, %xmm2, %xmm2
480; AVX1-NEXT:    vpaddusb %xmm3, %xmm0, %xmm0
481; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
482; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
483; AVX1-NEXT:    vpaddusb %xmm3, %xmm2, %xmm2
484; AVX1-NEXT:    vpaddusb %xmm3, %xmm1, %xmm1
485; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
486; AVX1-NEXT:    retq
487;
488; AVX2-LABEL: test14:
489; AVX2:       # %bb.0:
490; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
491; AVX2-NEXT:    vpaddusb %ymm2, %ymm0, %ymm0
492; AVX2-NEXT:    vpaddusb %ymm2, %ymm1, %ymm1
493; AVX2-NEXT:    retq
494;
495; AVX512-LABEL: test14:
496; AVX512:       # %bb.0:
497; AVX512-NEXT:    vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
498; AVX512-NEXT:    retq
499  %1 = add <64 x i8> %x, <i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127, i8 127>
500  %2 = icmp ugt <64 x i8> %x, <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>
501  %3 = select <64 x i1> %2, <64 x i8> <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, 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>, <64 x i8> %1
502  ret <64 x i8> %3
503}
504
505define <64 x i8> @test15(<64 x i8> %x) {
506; SSE-LABEL: test15:
507; SSE:       # %bb.0:
508; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129]
509; SSE-NEXT:    paddusb %xmm4, %xmm0
510; SSE-NEXT:    paddusb %xmm4, %xmm1
511; SSE-NEXT:    paddusb %xmm4, %xmm2
512; SSE-NEXT:    paddusb %xmm4, %xmm3
513; SSE-NEXT:    retq
514;
515; AVX1-LABEL: test15:
516; AVX1:       # %bb.0:
517; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
518; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129]
519; AVX1-NEXT:    vpaddusb %xmm3, %xmm2, %xmm2
520; AVX1-NEXT:    vpaddusb %xmm3, %xmm0, %xmm0
521; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
522; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
523; AVX1-NEXT:    vpaddusb %xmm3, %xmm2, %xmm2
524; AVX1-NEXT:    vpaddusb %xmm3, %xmm1, %xmm1
525; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
526; AVX1-NEXT:    retq
527;
528; AVX2-LABEL: test15:
529; AVX2:       # %bb.0:
530; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129]
531; AVX2-NEXT:    vpaddusb %ymm2, %ymm0, %ymm0
532; AVX2-NEXT:    vpaddusb %ymm2, %ymm1, %ymm1
533; AVX2-NEXT:    retq
534;
535; AVX512-LABEL: test15:
536; AVX512:       # %bb.0:
537; AVX512-NEXT:    vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
538; AVX512-NEXT:    retq
539  %1 = add <64 x i8> %x, <i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127, i8 -127>
540  %2 = icmp ugt <64 x i8> %x, <i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126, i8 126>
541  %3 = select <64 x i1> %2, <64 x i8> <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, 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>, <64 x i8> %1
542  ret <64 x i8> %3
543}
544
545define <64 x i8> @test16(<64 x i8> %x) {
546; SSE-LABEL: test16:
547; SSE:       # %bb.0:
548; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254]
549; SSE-NEXT:    paddusb %xmm4, %xmm0
550; SSE-NEXT:    paddusb %xmm4, %xmm1
551; SSE-NEXT:    paddusb %xmm4, %xmm2
552; SSE-NEXT:    paddusb %xmm4, %xmm3
553; SSE-NEXT:    retq
554;
555; AVX1-LABEL: test16:
556; AVX1:       # %bb.0:
557; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
558; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254]
559; AVX1-NEXT:    vpaddusb %xmm3, %xmm2, %xmm2
560; AVX1-NEXT:    vpaddusb %xmm3, %xmm0, %xmm0
561; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
562; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
563; AVX1-NEXT:    vpaddusb %xmm3, %xmm2, %xmm2
564; AVX1-NEXT:    vpaddusb %xmm3, %xmm1, %xmm1
565; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
566; AVX1-NEXT:    retq
567;
568; AVX2-LABEL: test16:
569; AVX2:       # %bb.0:
570; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254]
571; AVX2-NEXT:    vpaddusb %ymm2, %ymm0, %ymm0
572; AVX2-NEXT:    vpaddusb %ymm2, %ymm1, %ymm1
573; AVX2-NEXT:    retq
574;
575; AVX512-LABEL: test16:
576; AVX512:       # %bb.0:
577; AVX512-NEXT:    vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
578; AVX512-NEXT:    retq
579  %1 = add <64 x i8> %x, <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, 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>
580  %2 = icmp ugt <64 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, 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>
581  %3 = select <64 x i1> %2, <64 x i8> <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, 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>, <64 x i8> %1
582  ret <64 x i8> %3
583}
584
585define <64 x i8> @test17(<64 x i8> %x) {
586; SSE-LABEL: test17:
587; SSE:       # %bb.0:
588; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
589; SSE-NEXT:    movdqa %xmm0, %xmm5
590; SSE-NEXT:    pxor %xmm4, %xmm5
591; SSE-NEXT:    movdqa %xmm1, %xmm6
592; SSE-NEXT:    pxor %xmm4, %xmm6
593; SSE-NEXT:    movdqa %xmm2, %xmm7
594; SSE-NEXT:    pxor %xmm4, %xmm7
595; SSE-NEXT:    pxor %xmm3, %xmm4
596; SSE-NEXT:    pmaxub %xmm4, %xmm3
597; SSE-NEXT:    pcmpeqb %xmm4, %xmm3
598; SSE-NEXT:    pcmpeqd %xmm8, %xmm8
599; SSE-NEXT:    pxor %xmm8, %xmm3
600; SSE-NEXT:    pmaxub %xmm7, %xmm2
601; SSE-NEXT:    pcmpeqb %xmm7, %xmm2
602; SSE-NEXT:    pxor %xmm8, %xmm2
603; SSE-NEXT:    pmaxub %xmm6, %xmm1
604; SSE-NEXT:    pcmpeqb %xmm6, %xmm1
605; SSE-NEXT:    pxor %xmm8, %xmm1
606; SSE-NEXT:    pmaxub %xmm5, %xmm0
607; SSE-NEXT:    pcmpeqb %xmm5, %xmm0
608; SSE-NEXT:    pxor %xmm8, %xmm0
609; SSE-NEXT:    por %xmm5, %xmm0
610; SSE-NEXT:    por %xmm6, %xmm1
611; SSE-NEXT:    por %xmm7, %xmm2
612; SSE-NEXT:    por %xmm4, %xmm3
613; SSE-NEXT:    retq
614;
615; AVX1-LABEL: test17:
616; AVX1:       # %bb.0:
617; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
618; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm3
619; AVX1-NEXT:    vxorps %ymm2, %ymm1, %ymm2
620; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
621; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
622; AVX1-NEXT:    vpmaxub %xmm5, %xmm4, %xmm5
623; AVX1-NEXT:    vpcmpeqb %xmm5, %xmm4, %xmm4
624; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
625; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
626; AVX1-NEXT:    vpmaxub %xmm1, %xmm2, %xmm1
627; AVX1-NEXT:    vpcmpeqb %xmm1, %xmm2, %xmm1
628; AVX1-NEXT:    vpxor %xmm5, %xmm1, %xmm1
629; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm1
630; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
631; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
632; AVX1-NEXT:    vpmaxub %xmm6, %xmm4, %xmm6
633; AVX1-NEXT:    vpcmpeqb %xmm6, %xmm4, %xmm4
634; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
635; AVX1-NEXT:    vpmaxub %xmm0, %xmm3, %xmm0
636; AVX1-NEXT:    vpcmpeqb %xmm0, %xmm3, %xmm0
637; AVX1-NEXT:    vpxor %xmm5, %xmm0, %xmm0
638; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
639; AVX1-NEXT:    vorps %ymm3, %ymm0, %ymm0
640; AVX1-NEXT:    vorps %ymm2, %ymm1, %ymm1
641; AVX1-NEXT:    retq
642;
643; AVX2-LABEL: test17:
644; AVX2:       # %bb.0:
645; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
646; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm3
647; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm2
648; AVX2-NEXT:    vpmaxub %ymm1, %ymm2, %ymm1
649; AVX2-NEXT:    vpcmpeqb %ymm1, %ymm2, %ymm1
650; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4
651; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm1
652; AVX2-NEXT:    vpmaxub %ymm0, %ymm3, %ymm0
653; AVX2-NEXT:    vpcmpeqb %ymm0, %ymm3, %ymm0
654; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm0
655; AVX2-NEXT:    vpor %ymm3, %ymm0, %ymm0
656; AVX2-NEXT:    vpor %ymm2, %ymm1, %ymm1
657; AVX2-NEXT:    retq
658;
659; AVX512-LABEL: test17:
660; AVX512:       # %bb.0:
661; AVX512-NEXT:    vpxorq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm1
662; AVX512-NEXT:    vpcmpltub %zmm0, %zmm1, %k1
663; AVX512-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0
664; AVX512-NEXT:    vmovdqu8 %zmm0, %zmm1 {%k1}
665; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm0
666; AVX512-NEXT:    retq
667  %1 = xor <64 x i8> %x, <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>
668  %2 = icmp ult <64 x i8> %1, %x
669  %3 = select <64 x i1> %2, <64 x i8> <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, 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>, <64 x i8> %1
670  ret <64 x i8> %3
671}
672
673define <64 x i8> @test18(<64 x i8> %x) {
674; SSE-LABEL: test18:
675; SSE:       # %bb.0:
676; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
677; SSE-NEXT:    paddusb %xmm4, %xmm0
678; SSE-NEXT:    paddusb %xmm4, %xmm1
679; SSE-NEXT:    paddusb %xmm4, %xmm2
680; SSE-NEXT:    paddusb %xmm4, %xmm3
681; SSE-NEXT:    retq
682;
683; AVX1-LABEL: test18:
684; AVX1:       # %bb.0:
685; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
686; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
687; AVX1-NEXT:    vpaddusb %xmm3, %xmm2, %xmm2
688; AVX1-NEXT:    vpaddusb %xmm3, %xmm0, %xmm0
689; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
690; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
691; AVX1-NEXT:    vpaddusb %xmm3, %xmm2, %xmm2
692; AVX1-NEXT:    vpaddusb %xmm3, %xmm1, %xmm1
693; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
694; AVX1-NEXT:    retq
695;
696; AVX2-LABEL: test18:
697; AVX2:       # %bb.0:
698; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
699; AVX2-NEXT:    vpaddusb %ymm2, %ymm0, %ymm0
700; AVX2-NEXT:    vpaddusb %ymm2, %ymm1, %ymm1
701; AVX2-NEXT:    retq
702;
703; AVX512-LABEL: test18:
704; AVX512:       # %bb.0:
705; AVX512-NEXT:    vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
706; AVX512-NEXT:    retq
707  %1 = add <64 x i8> %x, <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, 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>
708  %2 = icmp ugt <64 x i8> %x, <i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3, i8 -3>
709  %3 = select <64 x i1> %2, <64 x i8> <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, 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>, <64 x i8> %1
710  ret <64 x i8> %3
711}
712
713define <8 x i16> @test19(<8 x i16> %x) {
714; SSE-LABEL: test19:
715; SSE:       # %bb.0:
716; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
717; SSE-NEXT:    movdqa %xmm0, %xmm2
718; SSE-NEXT:    psubw %xmm1, %xmm2
719; SSE-NEXT:    pcmpeqw %xmm1, %xmm0
720; SSE-NEXT:    por %xmm2, %xmm0
721; SSE-NEXT:    retq
722;
723; AVX1-LABEL: test19:
724; AVX1:       # %bb.0:
725; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
726; AVX1-NEXT:    vpsubw %xmm1, %xmm0, %xmm2
727; AVX1-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
728; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
729; AVX1-NEXT:    retq
730;
731; AVX2-LABEL: test19:
732; AVX2:       # %bb.0:
733; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
734; AVX2-NEXT:    vpsubw %xmm1, %xmm0, %xmm2
735; AVX2-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
736; AVX2-NEXT:    vpor %xmm2, %xmm0, %xmm0
737; AVX2-NEXT:    retq
738;
739; AVX512-LABEL: test19:
740; AVX512:       # %bb.0:
741; AVX512-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
742; AVX512-NEXT:    vpsubw %xmm2, %xmm0, %xmm1
743; AVX512-NEXT:    vpcmpeqw %xmm2, %xmm0, %k1
744; AVX512-NEXT:    vmovdqu16 %xmm2, %xmm1 {%k1}
745; AVX512-NEXT:    vmovdqa %xmm1, %xmm0
746; AVX512-NEXT:    retq
747  %1 = add <8 x i16> %x, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
748  %2 = icmp eq <8 x i16> %x, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
749  %3 = select <8 x i1> %2, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> %1
750  ret <8 x i16> %3
751}
752
753define <8 x i16> @test20(<8 x i16> %x) {
754; SSE-LABEL: test20:
755; SSE:       # %bb.0:
756; SSE-NEXT:    paddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
757; SSE-NEXT:    retq
758;
759; AVX-LABEL: test20:
760; AVX:       # %bb.0:
761; AVX-NEXT:    vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
762; AVX-NEXT:    retq
763  %1 = add <8 x i16> %x, <i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767>
764  %2 = icmp ugt <8 x i16> %x, <i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768>
765  %3 = select <8 x i1> %2, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> %1
766  ret <8 x i16> %3
767}
768
769define <8 x i16> @test21(<8 x i16> %x) {
770; SSE-LABEL: test21:
771; SSE:       # %bb.0:
772; SSE-NEXT:    paddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
773; SSE-NEXT:    retq
774;
775; AVX-LABEL: test21:
776; AVX:       # %bb.0:
777; AVX-NEXT:    vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
778; AVX-NEXT:    retq
779  %1 = add <8 x i16> %x, <i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767>
780  %2 = icmp ugt <8 x i16> %x, <i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766>
781  %3 = select <8 x i1> %2, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> %1
782  ret <8 x i16> %3
783}
784
785define <8 x i16> @test22(<8 x i16> %x) {
786; SSE-LABEL: test22:
787; SSE:       # %bb.0:
788; SSE-NEXT:    paddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
789; SSE-NEXT:    retq
790;
791; AVX-LABEL: test22:
792; AVX:       # %bb.0:
793; AVX-NEXT:    vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
794; AVX-NEXT:    retq
795  %1 = add <8 x i16> %x, <i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2>
796  %2 = icmp ugt <8 x i16> %x, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
797  %3 = select <8 x i1> %2, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> %1
798  ret <8 x i16> %3
799}
800
801define <8 x i16> @test23(<8 x i16> %x) {
802; SSE2-LABEL: test23:
803; SSE2:       # %bb.0:
804; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
805; SSE2-NEXT:    pxor %xmm0, %xmm2
806; SSE2-NEXT:    movdqa %xmm2, %xmm1
807; SSE2-NEXT:    pcmpgtw %xmm0, %xmm1
808; SSE2-NEXT:    por %xmm2, %xmm1
809; SSE2-NEXT:    movdqa %xmm1, %xmm0
810; SSE2-NEXT:    retq
811;
812; SSSE3-LABEL: test23:
813; SSSE3:       # %bb.0:
814; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
815; SSSE3-NEXT:    pxor %xmm0, %xmm2
816; SSSE3-NEXT:    movdqa %xmm2, %xmm1
817; SSSE3-NEXT:    pcmpgtw %xmm0, %xmm1
818; SSSE3-NEXT:    por %xmm2, %xmm1
819; SSSE3-NEXT:    movdqa %xmm1, %xmm0
820; SSSE3-NEXT:    retq
821;
822; SSE41-LABEL: test23:
823; SSE41:       # %bb.0:
824; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [32768,32768,32768,32768,32768,32768,32768,32768]
825; SSE41-NEXT:    pxor %xmm0, %xmm1
826; SSE41-NEXT:    pmaxuw %xmm1, %xmm0
827; SSE41-NEXT:    pcmpeqw %xmm1, %xmm0
828; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
829; SSE41-NEXT:    pxor %xmm2, %xmm0
830; SSE41-NEXT:    por %xmm1, %xmm0
831; SSE41-NEXT:    retq
832;
833; AVX1-LABEL: test23:
834; AVX1:       # %bb.0:
835; AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
836; AVX1-NEXT:    vpmaxuw %xmm0, %xmm1, %xmm0
837; AVX1-NEXT:    vpcmpeqw %xmm0, %xmm1, %xmm0
838; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
839; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
840; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
841; AVX1-NEXT:    retq
842;
843; AVX2-LABEL: test23:
844; AVX2:       # %bb.0:
845; AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
846; AVX2-NEXT:    vpmaxuw %xmm0, %xmm1, %xmm0
847; AVX2-NEXT:    vpcmpeqw %xmm0, %xmm1, %xmm0
848; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
849; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
850; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
851; AVX2-NEXT:    retq
852;
853; AVX512-LABEL: test23:
854; AVX512:       # %bb.0:
855; AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
856; AVX512-NEXT:    vpcmpltuw %xmm0, %xmm1, %k1
857; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
858; AVX512-NEXT:    vmovdqu16 %xmm0, %xmm1 {%k1}
859; AVX512-NEXT:    vmovdqa %xmm1, %xmm0
860; AVX512-NEXT:    retq
861  %1 = xor <8 x i16> %x, <i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768>
862  %2 = icmp ult <8 x i16> %1, %x
863  %3 = select <8 x i1> %2, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> %1
864  ret <8 x i16> %3
865}
866
867define <8 x i16> @test24(<8 x i16> %x) {
868; SSE-LABEL: test24:
869; SSE:       # %bb.0:
870; SSE-NEXT:    paddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
871; SSE-NEXT:    retq
872;
873; AVX-LABEL: test24:
874; AVX:       # %bb.0:
875; AVX-NEXT:    vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
876; AVX-NEXT:    retq
877  %1 = add <8 x i16> %x, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
878  %2 = icmp ugt <8 x i16> %x, <i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3>
879  %3 = select <8 x i1> %2, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> %1
880  ret <8 x i16> %3
881}
882
883define <16 x i16> @test25(<16 x i16> %x) {
884; SSE-LABEL: test25:
885; SSE:       # %bb.0:
886; SSE-NEXT:    pcmpeqd %xmm2, %xmm2
887; SSE-NEXT:    movdqa %xmm1, %xmm3
888; SSE-NEXT:    psubw %xmm2, %xmm3
889; SSE-NEXT:    movdqa %xmm0, %xmm4
890; SSE-NEXT:    psubw %xmm2, %xmm4
891; SSE-NEXT:    pcmpeqw %xmm2, %xmm1
892; SSE-NEXT:    por %xmm3, %xmm1
893; SSE-NEXT:    pcmpeqw %xmm2, %xmm0
894; SSE-NEXT:    por %xmm4, %xmm0
895; SSE-NEXT:    retq
896;
897; AVX1-LABEL: test25:
898; AVX1:       # %bb.0:
899; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
900; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
901; AVX1-NEXT:    vpsubw %xmm2, %xmm1, %xmm3
902; AVX1-NEXT:    vpsubw %xmm2, %xmm0, %xmm4
903; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
904; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm1, %xmm1
905; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm0, %xmm0
906; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
907; AVX1-NEXT:    vorps %ymm3, %ymm0, %ymm0
908; AVX1-NEXT:    retq
909;
910; AVX2-LABEL: test25:
911; AVX2:       # %bb.0:
912; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
913; AVX2-NEXT:    vpsubw %ymm1, %ymm0, %ymm2
914; AVX2-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
915; AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm0
916; AVX2-NEXT:    retq
917;
918; AVX512-LABEL: test25:
919; AVX512:       # %bb.0:
920; AVX512-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
921; AVX512-NEXT:    vpsubw %ymm2, %ymm0, %ymm1
922; AVX512-NEXT:    vpcmpeqw %ymm2, %ymm0, %k1
923; AVX512-NEXT:    vmovdqu16 %ymm2, %ymm1 {%k1}
924; AVX512-NEXT:    vmovdqa %ymm1, %ymm0
925; AVX512-NEXT:    retq
926  %1 = add <16 x i16> %x, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
927  %2 = icmp eq <16 x i16> %x, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
928  %3 = select <16 x i1> %2, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> %1
929  ret <16 x i16> %3
930}
931
932define <16 x i16> @test26(<16 x i16> %x) {
933; SSE-LABEL: test26:
934; SSE:       # %bb.0:
935; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [32767,32767,32767,32767,32767,32767,32767,32767]
936; SSE-NEXT:    paddusw %xmm2, %xmm0
937; SSE-NEXT:    paddusw %xmm2, %xmm1
938; SSE-NEXT:    retq
939;
940; AVX1-LABEL: test26:
941; AVX1:       # %bb.0:
942; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
943; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [32767,32767,32767,32767,32767,32767,32767,32767]
944; AVX1-NEXT:    vpaddusw %xmm2, %xmm1, %xmm1
945; AVX1-NEXT:    vpaddusw %xmm2, %xmm0, %xmm0
946; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
947; AVX1-NEXT:    retq
948;
949; AVX2-LABEL: test26:
950; AVX2:       # %bb.0:
951; AVX2-NEXT:    vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
952; AVX2-NEXT:    retq
953;
954; AVX512-LABEL: test26:
955; AVX512:       # %bb.0:
956; AVX512-NEXT:    vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
957; AVX512-NEXT:    retq
958  %1 = add <16 x i16> %x, <i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767>
959  %2 = icmp ugt <16 x i16> %x, <i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768>
960  %3 = select <16 x i1> %2, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> %1
961  ret <16 x i16> %3
962}
963
964define <16 x i16> @test27(<16 x i16> %x) {
965; SSE-LABEL: test27:
966; SSE:       # %bb.0:
967; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [32769,32769,32769,32769,32769,32769,32769,32769]
968; SSE-NEXT:    paddusw %xmm2, %xmm0
969; SSE-NEXT:    paddusw %xmm2, %xmm1
970; SSE-NEXT:    retq
971;
972; AVX1-LABEL: test27:
973; AVX1:       # %bb.0:
974; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
975; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [32769,32769,32769,32769,32769,32769,32769,32769]
976; AVX1-NEXT:    vpaddusw %xmm2, %xmm1, %xmm1
977; AVX1-NEXT:    vpaddusw %xmm2, %xmm0, %xmm0
978; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
979; AVX1-NEXT:    retq
980;
981; AVX2-LABEL: test27:
982; AVX2:       # %bb.0:
983; AVX2-NEXT:    vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
984; AVX2-NEXT:    retq
985;
986; AVX512-LABEL: test27:
987; AVX512:       # %bb.0:
988; AVX512-NEXT:    vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
989; AVX512-NEXT:    retq
990  %1 = add <16 x i16> %x, <i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767>
991  %2 = icmp ugt <16 x i16> %x, <i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766>
992  %3 = select <16 x i1> %2, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> %1
993  ret <16 x i16> %3
994}
995
996define <16 x i16> @test28(<16 x i16> %x) {
997; SSE-LABEL: test28:
998; SSE:       # %bb.0:
999; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [65534,65534,65534,65534,65534,65534,65534,65534]
1000; SSE-NEXT:    paddusw %xmm2, %xmm0
1001; SSE-NEXT:    paddusw %xmm2, %xmm1
1002; SSE-NEXT:    retq
1003;
1004; AVX1-LABEL: test28:
1005; AVX1:       # %bb.0:
1006; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1007; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [65534,65534,65534,65534,65534,65534,65534,65534]
1008; AVX1-NEXT:    vpaddusw %xmm2, %xmm1, %xmm1
1009; AVX1-NEXT:    vpaddusw %xmm2, %xmm0, %xmm0
1010; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1011; AVX1-NEXT:    retq
1012;
1013; AVX2-LABEL: test28:
1014; AVX2:       # %bb.0:
1015; AVX2-NEXT:    vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1016; AVX2-NEXT:    retq
1017;
1018; AVX512-LABEL: test28:
1019; AVX512:       # %bb.0:
1020; AVX512-NEXT:    vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1021; AVX512-NEXT:    retq
1022  %1 = add <16 x i16> %x, <i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2>
1023  %2 = icmp ugt <16 x i16> %x, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1024  %3 = select <16 x i1> %2, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> %1
1025  ret <16 x i16> %3
1026}
1027
1028define <16 x i16> @test29(<16 x i16> %x) {
1029; SSE2-LABEL: test29:
1030; SSE2:       # %bb.0:
1031; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [32768,32768,32768,32768,32768,32768,32768,32768]
1032; SSE2-NEXT:    movdqa %xmm0, %xmm4
1033; SSE2-NEXT:    pxor %xmm3, %xmm4
1034; SSE2-NEXT:    pxor %xmm1, %xmm3
1035; SSE2-NEXT:    movdqa %xmm3, %xmm2
1036; SSE2-NEXT:    pcmpgtw %xmm1, %xmm2
1037; SSE2-NEXT:    movdqa %xmm4, %xmm1
1038; SSE2-NEXT:    pcmpgtw %xmm0, %xmm1
1039; SSE2-NEXT:    por %xmm4, %xmm1
1040; SSE2-NEXT:    por %xmm3, %xmm2
1041; SSE2-NEXT:    movdqa %xmm1, %xmm0
1042; SSE2-NEXT:    movdqa %xmm2, %xmm1
1043; SSE2-NEXT:    retq
1044;
1045; SSSE3-LABEL: test29:
1046; SSSE3:       # %bb.0:
1047; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [32768,32768,32768,32768,32768,32768,32768,32768]
1048; SSSE3-NEXT:    movdqa %xmm0, %xmm4
1049; SSSE3-NEXT:    pxor %xmm3, %xmm4
1050; SSSE3-NEXT:    pxor %xmm1, %xmm3
1051; SSSE3-NEXT:    movdqa %xmm3, %xmm2
1052; SSSE3-NEXT:    pcmpgtw %xmm1, %xmm2
1053; SSSE3-NEXT:    movdqa %xmm4, %xmm1
1054; SSSE3-NEXT:    pcmpgtw %xmm0, %xmm1
1055; SSSE3-NEXT:    por %xmm4, %xmm1
1056; SSSE3-NEXT:    por %xmm3, %xmm2
1057; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1058; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1059; SSSE3-NEXT:    retq
1060;
1061; SSE41-LABEL: test29:
1062; SSE41:       # %bb.0:
1063; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
1064; SSE41-NEXT:    movdqa %xmm0, %xmm3
1065; SSE41-NEXT:    pxor %xmm2, %xmm3
1066; SSE41-NEXT:    pxor %xmm1, %xmm2
1067; SSE41-NEXT:    pmaxuw %xmm2, %xmm1
1068; SSE41-NEXT:    pcmpeqw %xmm2, %xmm1
1069; SSE41-NEXT:    pcmpeqd %xmm4, %xmm4
1070; SSE41-NEXT:    pxor %xmm4, %xmm1
1071; SSE41-NEXT:    pmaxuw %xmm3, %xmm0
1072; SSE41-NEXT:    pcmpeqw %xmm3, %xmm0
1073; SSE41-NEXT:    pxor %xmm4, %xmm0
1074; SSE41-NEXT:    por %xmm3, %xmm0
1075; SSE41-NEXT:    por %xmm2, %xmm1
1076; SSE41-NEXT:    retq
1077;
1078; AVX1-LABEL: test29:
1079; AVX1:       # %bb.0:
1080; AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1
1081; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1082; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1083; AVX1-NEXT:    vpmaxuw %xmm2, %xmm3, %xmm2
1084; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm3, %xmm2
1085; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
1086; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm2
1087; AVX1-NEXT:    vpmaxuw %xmm0, %xmm1, %xmm0
1088; AVX1-NEXT:    vpcmpeqw %xmm0, %xmm1, %xmm0
1089; AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm0
1090; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1091; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1092; AVX1-NEXT:    retq
1093;
1094; AVX2-LABEL: test29:
1095; AVX2:       # %bb.0:
1096; AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1
1097; AVX2-NEXT:    vpmaxuw %ymm0, %ymm1, %ymm0
1098; AVX2-NEXT:    vpcmpeqw %ymm0, %ymm1, %ymm0
1099; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1100; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
1101; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1102; AVX2-NEXT:    retq
1103;
1104; AVX512-LABEL: test29:
1105; AVX512:       # %bb.0:
1106; AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1
1107; AVX512-NEXT:    vpcmpltuw %ymm0, %ymm1, %k1
1108; AVX512-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
1109; AVX512-NEXT:    vmovdqu16 %ymm0, %ymm1 {%k1}
1110; AVX512-NEXT:    vmovdqa %ymm1, %ymm0
1111; AVX512-NEXT:    retq
1112  %1 = xor <16 x i16> %x, <i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768>
1113  %2 = icmp ult <16 x i16> %1, %x
1114  %3 = select <16 x i1> %2, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> %1
1115  ret <16 x i16> %3
1116}
1117
1118define <16 x i16> @test30(<16 x i16> %x) {
1119; SSE-LABEL: test30:
1120; SSE:       # %bb.0:
1121; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2]
1122; SSE-NEXT:    paddusw %xmm2, %xmm0
1123; SSE-NEXT:    paddusw %xmm2, %xmm1
1124; SSE-NEXT:    retq
1125;
1126; AVX1-LABEL: test30:
1127; AVX1:       # %bb.0:
1128; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1129; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2]
1130; AVX1-NEXT:    vpaddusw %xmm2, %xmm1, %xmm1
1131; AVX1-NEXT:    vpaddusw %xmm2, %xmm0, %xmm0
1132; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1133; AVX1-NEXT:    retq
1134;
1135; AVX2-LABEL: test30:
1136; AVX2:       # %bb.0:
1137; AVX2-NEXT:    vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1138; AVX2-NEXT:    retq
1139;
1140; AVX512-LABEL: test30:
1141; AVX512:       # %bb.0:
1142; AVX512-NEXT:    vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1143; AVX512-NEXT:    retq
1144  %1 = add <16 x i16> %x, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
1145  %2 = icmp ugt <16 x i16> %x, <i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3>
1146  %3 = select <16 x i1> %2, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> %1
1147  ret <16 x i16> %3
1148}
1149
1150define <32 x i16> @test31(<32 x i16> %x) {
1151; SSE-LABEL: test31:
1152; SSE:       # %bb.0:
1153; SSE-NEXT:    pcmpeqd %xmm8, %xmm8
1154; SSE-NEXT:    movdqa %xmm3, %xmm5
1155; SSE-NEXT:    psubw %xmm8, %xmm5
1156; SSE-NEXT:    movdqa %xmm2, %xmm6
1157; SSE-NEXT:    psubw %xmm8, %xmm6
1158; SSE-NEXT:    movdqa %xmm1, %xmm7
1159; SSE-NEXT:    psubw %xmm8, %xmm7
1160; SSE-NEXT:    movdqa %xmm0, %xmm4
1161; SSE-NEXT:    psubw %xmm8, %xmm4
1162; SSE-NEXT:    pcmpeqw %xmm8, %xmm3
1163; SSE-NEXT:    por %xmm5, %xmm3
1164; SSE-NEXT:    pcmpeqw %xmm8, %xmm2
1165; SSE-NEXT:    por %xmm6, %xmm2
1166; SSE-NEXT:    pcmpeqw %xmm8, %xmm1
1167; SSE-NEXT:    por %xmm7, %xmm1
1168; SSE-NEXT:    pcmpeqw %xmm8, %xmm0
1169; SSE-NEXT:    por %xmm4, %xmm0
1170; SSE-NEXT:    retq
1171;
1172; AVX1-LABEL: test31:
1173; AVX1:       # %bb.0:
1174; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1175; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
1176; AVX1-NEXT:    vpsubw %xmm3, %xmm2, %xmm4
1177; AVX1-NEXT:    vpsubw %xmm3, %xmm1, %xmm5
1178; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm5, %ymm4
1179; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1180; AVX1-NEXT:    vpsubw %xmm3, %xmm5, %xmm6
1181; AVX1-NEXT:    vpsubw %xmm3, %xmm0, %xmm7
1182; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm7, %ymm6
1183; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm2, %xmm2
1184; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm1, %xmm1
1185; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1186; AVX1-NEXT:    vorps %ymm4, %ymm1, %ymm1
1187; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm5, %xmm2
1188; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm0, %xmm0
1189; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1190; AVX1-NEXT:    vorps %ymm6, %ymm0, %ymm0
1191; AVX1-NEXT:    retq
1192;
1193; AVX2-LABEL: test31:
1194; AVX2:       # %bb.0:
1195; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
1196; AVX2-NEXT:    vpsubw %ymm2, %ymm1, %ymm3
1197; AVX2-NEXT:    vpsubw %ymm2, %ymm0, %ymm4
1198; AVX2-NEXT:    vpcmpeqw %ymm2, %ymm1, %ymm1
1199; AVX2-NEXT:    vpor %ymm3, %ymm1, %ymm1
1200; AVX2-NEXT:    vpcmpeqw %ymm2, %ymm0, %ymm0
1201; AVX2-NEXT:    vpor %ymm4, %ymm0, %ymm0
1202; AVX2-NEXT:    retq
1203;
1204; AVX512-LABEL: test31:
1205; AVX512:       # %bb.0:
1206; AVX512-NEXT:    vpternlogd $255, %zmm2, %zmm2, %zmm2
1207; AVX512-NEXT:    vpsubw %zmm2, %zmm0, %zmm1
1208; AVX512-NEXT:    vpcmpeqw %zmm2, %zmm0, %k1
1209; AVX512-NEXT:    vmovdqu16 %zmm2, %zmm1 {%k1}
1210; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm0
1211; AVX512-NEXT:    retq
1212  %1 = add <32 x i16> %x, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1213  %2 = icmp eq <32 x i16> %x, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
1214  %3 = select <32 x i1> %2, <32 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <32 x i16> %1
1215  ret <32 x i16> %3
1216}
1217
1218define <32 x i16> @test32(<32 x i16> %x) {
1219; SSE-LABEL: test32:
1220; SSE:       # %bb.0:
1221; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [32767,32767,32767,32767,32767,32767,32767,32767]
1222; SSE-NEXT:    paddusw %xmm4, %xmm0
1223; SSE-NEXT:    paddusw %xmm4, %xmm1
1224; SSE-NEXT:    paddusw %xmm4, %xmm2
1225; SSE-NEXT:    paddusw %xmm4, %xmm3
1226; SSE-NEXT:    retq
1227;
1228; AVX1-LABEL: test32:
1229; AVX1:       # %bb.0:
1230; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1231; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [32767,32767,32767,32767,32767,32767,32767,32767]
1232; AVX1-NEXT:    vpaddusw %xmm3, %xmm2, %xmm2
1233; AVX1-NEXT:    vpaddusw %xmm3, %xmm0, %xmm0
1234; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1235; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1236; AVX1-NEXT:    vpaddusw %xmm3, %xmm2, %xmm2
1237; AVX1-NEXT:    vpaddusw %xmm3, %xmm1, %xmm1
1238; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1239; AVX1-NEXT:    retq
1240;
1241; AVX2-LABEL: test32:
1242; AVX2:       # %bb.0:
1243; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767]
1244; AVX2-NEXT:    vpaddusw %ymm2, %ymm0, %ymm0
1245; AVX2-NEXT:    vpaddusw %ymm2, %ymm1, %ymm1
1246; AVX2-NEXT:    retq
1247;
1248; AVX512-LABEL: test32:
1249; AVX512:       # %bb.0:
1250; AVX512-NEXT:    vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
1251; AVX512-NEXT:    retq
1252  %1 = add <32 x i16> %x, <i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767>
1253  %2 = icmp ugt <32 x i16> %x, <i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768>
1254  %3 = select <32 x i1> %2, <32 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <32 x i16> %1
1255  ret <32 x i16> %3
1256}
1257
1258define <32 x i16> @test33(<32 x i16> %x) {
1259; SSE-LABEL: test33:
1260; SSE:       # %bb.0:
1261; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [32769,32769,32769,32769,32769,32769,32769,32769]
1262; SSE-NEXT:    paddusw %xmm4, %xmm0
1263; SSE-NEXT:    paddusw %xmm4, %xmm1
1264; SSE-NEXT:    paddusw %xmm4, %xmm2
1265; SSE-NEXT:    paddusw %xmm4, %xmm3
1266; SSE-NEXT:    retq
1267;
1268; AVX1-LABEL: test33:
1269; AVX1:       # %bb.0:
1270; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1271; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [32769,32769,32769,32769,32769,32769,32769,32769]
1272; AVX1-NEXT:    vpaddusw %xmm3, %xmm2, %xmm2
1273; AVX1-NEXT:    vpaddusw %xmm3, %xmm0, %xmm0
1274; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1275; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1276; AVX1-NEXT:    vpaddusw %xmm3, %xmm2, %xmm2
1277; AVX1-NEXT:    vpaddusw %xmm3, %xmm1, %xmm1
1278; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1279; AVX1-NEXT:    retq
1280;
1281; AVX2-LABEL: test33:
1282; AVX2:       # %bb.0:
1283; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [32769,32769,32769,32769,32769,32769,32769,32769,32769,32769,32769,32769,32769,32769,32769,32769]
1284; AVX2-NEXT:    vpaddusw %ymm2, %ymm0, %ymm0
1285; AVX2-NEXT:    vpaddusw %ymm2, %ymm1, %ymm1
1286; AVX2-NEXT:    retq
1287;
1288; AVX512-LABEL: test33:
1289; AVX512:       # %bb.0:
1290; AVX512-NEXT:    vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
1291; AVX512-NEXT:    retq
1292  %1 = add <32 x i16> %x, <i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767>
1293  %2 = icmp ugt <32 x i16> %x, <i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766>
1294  %3 = select <32 x i1> %2, <32 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <32 x i16> %1
1295  ret <32 x i16> %3
1296}
1297
1298define <32 x i16> @test34(<32 x i16> %x) {
1299; SSE-LABEL: test34:
1300; SSE:       # %bb.0:
1301; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [65534,65534,65534,65534,65534,65534,65534,65534]
1302; SSE-NEXT:    paddusw %xmm4, %xmm0
1303; SSE-NEXT:    paddusw %xmm4, %xmm1
1304; SSE-NEXT:    paddusw %xmm4, %xmm2
1305; SSE-NEXT:    paddusw %xmm4, %xmm3
1306; SSE-NEXT:    retq
1307;
1308; AVX1-LABEL: test34:
1309; AVX1:       # %bb.0:
1310; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1311; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [65534,65534,65534,65534,65534,65534,65534,65534]
1312; AVX1-NEXT:    vpaddusw %xmm3, %xmm2, %xmm2
1313; AVX1-NEXT:    vpaddusw %xmm3, %xmm0, %xmm0
1314; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1315; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1316; AVX1-NEXT:    vpaddusw %xmm3, %xmm2, %xmm2
1317; AVX1-NEXT:    vpaddusw %xmm3, %xmm1, %xmm1
1318; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1319; AVX1-NEXT:    retq
1320;
1321; AVX2-LABEL: test34:
1322; AVX2:       # %bb.0:
1323; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [65534,65534,65534,65534,65534,65534,65534,65534,65534,65534,65534,65534,65534,65534,65534,65534]
1324; AVX2-NEXT:    vpaddusw %ymm2, %ymm0, %ymm0
1325; AVX2-NEXT:    vpaddusw %ymm2, %ymm1, %ymm1
1326; AVX2-NEXT:    retq
1327;
1328; AVX512-LABEL: test34:
1329; AVX512:       # %bb.0:
1330; AVX512-NEXT:    vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
1331; AVX512-NEXT:    retq
1332  %1 = add <32 x i16> %x, <i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2>
1333  %2 = icmp ugt <32 x i16> %x, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1334  %3 = select <32 x i1> %2, <32 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <32 x i16> %1
1335  ret <32 x i16> %3
1336}
1337
1338define <32 x i16> @test35(<32 x i16> %x) {
1339; SSE2-LABEL: test35:
1340; SSE2:       # %bb.0:
1341; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [32768,32768,32768,32768,32768,32768,32768,32768]
1342; SSE2-NEXT:    movdqa %xmm0, %xmm6
1343; SSE2-NEXT:    pxor %xmm5, %xmm6
1344; SSE2-NEXT:    movdqa %xmm1, %xmm7
1345; SSE2-NEXT:    pxor %xmm5, %xmm7
1346; SSE2-NEXT:    movdqa %xmm2, %xmm8
1347; SSE2-NEXT:    pxor %xmm5, %xmm8
1348; SSE2-NEXT:    pxor %xmm3, %xmm5
1349; SSE2-NEXT:    movdqa %xmm5, %xmm4
1350; SSE2-NEXT:    pcmpgtw %xmm3, %xmm4
1351; SSE2-NEXT:    movdqa %xmm8, %xmm3
1352; SSE2-NEXT:    pcmpgtw %xmm2, %xmm3
1353; SSE2-NEXT:    movdqa %xmm7, %xmm2
1354; SSE2-NEXT:    pcmpgtw %xmm1, %xmm2
1355; SSE2-NEXT:    movdqa %xmm6, %xmm1
1356; SSE2-NEXT:    pcmpgtw %xmm0, %xmm1
1357; SSE2-NEXT:    por %xmm6, %xmm1
1358; SSE2-NEXT:    por %xmm7, %xmm2
1359; SSE2-NEXT:    por %xmm8, %xmm3
1360; SSE2-NEXT:    por %xmm5, %xmm4
1361; SSE2-NEXT:    movdqa %xmm1, %xmm0
1362; SSE2-NEXT:    movdqa %xmm2, %xmm1
1363; SSE2-NEXT:    movdqa %xmm3, %xmm2
1364; SSE2-NEXT:    movdqa %xmm4, %xmm3
1365; SSE2-NEXT:    retq
1366;
1367; SSSE3-LABEL: test35:
1368; SSSE3:       # %bb.0:
1369; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [32768,32768,32768,32768,32768,32768,32768,32768]
1370; SSSE3-NEXT:    movdqa %xmm0, %xmm6
1371; SSSE3-NEXT:    pxor %xmm5, %xmm6
1372; SSSE3-NEXT:    movdqa %xmm1, %xmm7
1373; SSSE3-NEXT:    pxor %xmm5, %xmm7
1374; SSSE3-NEXT:    movdqa %xmm2, %xmm8
1375; SSSE3-NEXT:    pxor %xmm5, %xmm8
1376; SSSE3-NEXT:    pxor %xmm3, %xmm5
1377; SSSE3-NEXT:    movdqa %xmm5, %xmm4
1378; SSSE3-NEXT:    pcmpgtw %xmm3, %xmm4
1379; SSSE3-NEXT:    movdqa %xmm8, %xmm3
1380; SSSE3-NEXT:    pcmpgtw %xmm2, %xmm3
1381; SSSE3-NEXT:    movdqa %xmm7, %xmm2
1382; SSSE3-NEXT:    pcmpgtw %xmm1, %xmm2
1383; SSSE3-NEXT:    movdqa %xmm6, %xmm1
1384; SSSE3-NEXT:    pcmpgtw %xmm0, %xmm1
1385; SSSE3-NEXT:    por %xmm6, %xmm1
1386; SSSE3-NEXT:    por %xmm7, %xmm2
1387; SSSE3-NEXT:    por %xmm8, %xmm3
1388; SSSE3-NEXT:    por %xmm5, %xmm4
1389; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1390; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1391; SSSE3-NEXT:    movdqa %xmm3, %xmm2
1392; SSSE3-NEXT:    movdqa %xmm4, %xmm3
1393; SSSE3-NEXT:    retq
1394;
1395; SSE41-LABEL: test35:
1396; SSE41:       # %bb.0:
1397; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
1398; SSE41-NEXT:    movdqa %xmm0, %xmm5
1399; SSE41-NEXT:    pxor %xmm4, %xmm5
1400; SSE41-NEXT:    movdqa %xmm1, %xmm6
1401; SSE41-NEXT:    pxor %xmm4, %xmm6
1402; SSE41-NEXT:    movdqa %xmm2, %xmm7
1403; SSE41-NEXT:    pxor %xmm4, %xmm7
1404; SSE41-NEXT:    pxor %xmm3, %xmm4
1405; SSE41-NEXT:    pmaxuw %xmm4, %xmm3
1406; SSE41-NEXT:    pcmpeqw %xmm4, %xmm3
1407; SSE41-NEXT:    pcmpeqd %xmm8, %xmm8
1408; SSE41-NEXT:    pxor %xmm8, %xmm3
1409; SSE41-NEXT:    pmaxuw %xmm7, %xmm2
1410; SSE41-NEXT:    pcmpeqw %xmm7, %xmm2
1411; SSE41-NEXT:    pxor %xmm8, %xmm2
1412; SSE41-NEXT:    pmaxuw %xmm6, %xmm1
1413; SSE41-NEXT:    pcmpeqw %xmm6, %xmm1
1414; SSE41-NEXT:    pxor %xmm8, %xmm1
1415; SSE41-NEXT:    pmaxuw %xmm5, %xmm0
1416; SSE41-NEXT:    pcmpeqw %xmm5, %xmm0
1417; SSE41-NEXT:    pxor %xmm8, %xmm0
1418; SSE41-NEXT:    por %xmm5, %xmm0
1419; SSE41-NEXT:    por %xmm6, %xmm1
1420; SSE41-NEXT:    por %xmm7, %xmm2
1421; SSE41-NEXT:    por %xmm4, %xmm3
1422; SSE41-NEXT:    retq
1423;
1424; AVX1-LABEL: test35:
1425; AVX1:       # %bb.0:
1426; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768]
1427; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm3
1428; AVX1-NEXT:    vxorps %ymm2, %ymm1, %ymm2
1429; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1430; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
1431; AVX1-NEXT:    vpmaxuw %xmm5, %xmm4, %xmm5
1432; AVX1-NEXT:    vpcmpeqw %xmm5, %xmm4, %xmm4
1433; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
1434; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
1435; AVX1-NEXT:    vpmaxuw %xmm1, %xmm2, %xmm1
1436; AVX1-NEXT:    vpcmpeqw %xmm1, %xmm2, %xmm1
1437; AVX1-NEXT:    vpxor %xmm5, %xmm1, %xmm1
1438; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm1
1439; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
1440; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
1441; AVX1-NEXT:    vpmaxuw %xmm6, %xmm4, %xmm6
1442; AVX1-NEXT:    vpcmpeqw %xmm6, %xmm4, %xmm4
1443; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
1444; AVX1-NEXT:    vpmaxuw %xmm0, %xmm3, %xmm0
1445; AVX1-NEXT:    vpcmpeqw %xmm0, %xmm3, %xmm0
1446; AVX1-NEXT:    vpxor %xmm5, %xmm0, %xmm0
1447; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
1448; AVX1-NEXT:    vorps %ymm3, %ymm0, %ymm0
1449; AVX1-NEXT:    vorps %ymm2, %ymm1, %ymm1
1450; AVX1-NEXT:    retq
1451;
1452; AVX2-LABEL: test35:
1453; AVX2:       # %bb.0:
1454; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768]
1455; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm3
1456; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm2
1457; AVX2-NEXT:    vpmaxuw %ymm1, %ymm2, %ymm1
1458; AVX2-NEXT:    vpcmpeqw %ymm1, %ymm2, %ymm1
1459; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4
1460; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm1
1461; AVX2-NEXT:    vpmaxuw %ymm0, %ymm3, %ymm0
1462; AVX2-NEXT:    vpcmpeqw %ymm0, %ymm3, %ymm0
1463; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm0
1464; AVX2-NEXT:    vpor %ymm3, %ymm0, %ymm0
1465; AVX2-NEXT:    vpor %ymm2, %ymm1, %ymm1
1466; AVX2-NEXT:    retq
1467;
1468; AVX512-LABEL: test35:
1469; AVX512:       # %bb.0:
1470; AVX512-NEXT:    vpxorq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm1
1471; AVX512-NEXT:    vpcmpltuw %zmm0, %zmm1, %k1
1472; AVX512-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0
1473; AVX512-NEXT:    vmovdqu16 %zmm0, %zmm1 {%k1}
1474; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm0
1475; AVX512-NEXT:    retq
1476  %1 = xor <32 x i16> %x, <i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768>
1477  %2 = icmp ult <32 x i16> %1, %x
1478  %3 = select <32 x i1> %2, <32 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <32 x i16> %1
1479  ret <32 x i16> %3
1480}
1481
1482define <32 x i16> @test36(<32 x i16> %x) {
1483; SSE-LABEL: test36:
1484; SSE:       # %bb.0:
1485; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [2,2,2,2,2,2,2,2]
1486; SSE-NEXT:    paddusw %xmm4, %xmm0
1487; SSE-NEXT:    paddusw %xmm4, %xmm1
1488; SSE-NEXT:    paddusw %xmm4, %xmm2
1489; SSE-NEXT:    paddusw %xmm4, %xmm3
1490; SSE-NEXT:    retq
1491;
1492; AVX1-LABEL: test36:
1493; AVX1:       # %bb.0:
1494; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1495; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [2,2,2,2,2,2,2,2]
1496; AVX1-NEXT:    vpaddusw %xmm3, %xmm2, %xmm2
1497; AVX1-NEXT:    vpaddusw %xmm3, %xmm0, %xmm0
1498; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1499; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1500; AVX1-NEXT:    vpaddusw %xmm3, %xmm2, %xmm2
1501; AVX1-NEXT:    vpaddusw %xmm3, %xmm1, %xmm1
1502; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1503; AVX1-NEXT:    retq
1504;
1505; AVX2-LABEL: test36:
1506; AVX2:       # %bb.0:
1507; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
1508; AVX2-NEXT:    vpaddusw %ymm2, %ymm0, %ymm0
1509; AVX2-NEXT:    vpaddusw %ymm2, %ymm1, %ymm1
1510; AVX2-NEXT:    retq
1511;
1512; AVX512-LABEL: test36:
1513; AVX512:       # %bb.0:
1514; AVX512-NEXT:    vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
1515; AVX512-NEXT:    retq
1516  %1 = add <32 x i16> %x, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
1517  %2 = icmp ugt <32 x i16> %x, <i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3, i16 -3>
1518  %3 = select <32 x i1> %2, <32 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <32 x i16> %1
1519  ret <32 x i16> %3
1520}
1521
1522define void @addus_v8i8(<8 x i8>* %p1, <8 x i8>* %p2) {
1523; SSE-LABEL: addus_v8i8:
1524; SSE:       # %bb.0:
1525; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
1526; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
1527; SSE-NEXT:    paddusb %xmm0, %xmm1
1528; SSE-NEXT:    movq %xmm1, (%rdi)
1529; SSE-NEXT:    retq
1530;
1531; AVX-LABEL: addus_v8i8:
1532; AVX:       # %bb.0:
1533; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
1534; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
1535; AVX-NEXT:    vpaddusb %xmm0, %xmm1, %xmm0
1536; AVX-NEXT:    vmovq %xmm0, (%rdi)
1537; AVX-NEXT:    retq
1538  %ld1 = load <8 x i8>, <8 x i8>* %p1, align 8
1539  %ld2 = load <8 x i8>, <8 x i8>* %p2, align 8
1540  %1 = add <8 x i8> %ld2, %ld1
1541  %2 = icmp ugt <8 x i8> %ld1, %1
1542  %sh3 = select <8 x i1> %2, <8 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <8 x i8> %1
1543  store <8 x i8> %sh3, <8 x i8>* %p1, align 8
1544  ret void
1545}
1546
1547define void @addus_v4i8(<4 x i8>* %p1, <4 x i8>* %p2) {
1548; SSE-LABEL: addus_v4i8:
1549; SSE:       # %bb.0:
1550; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1551; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
1552; SSE-NEXT:    paddusb %xmm0, %xmm1
1553; SSE-NEXT:    movd %xmm1, (%rdi)
1554; SSE-NEXT:    retq
1555;
1556; AVX-LABEL: addus_v4i8:
1557; AVX:       # %bb.0:
1558; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1559; AVX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
1560; AVX-NEXT:    vpaddusb %xmm0, %xmm1, %xmm0
1561; AVX-NEXT:    vmovd %xmm0, (%rdi)
1562; AVX-NEXT:    retq
1563  %ld1 = load <4 x i8>, <4 x i8>* %p1, align 4
1564  %ld2 = load <4 x i8>, <4 x i8>* %p2, align 4
1565  %1 = add <4 x i8> %ld2, %ld1
1566  %2 = icmp ugt <4 x i8> %ld1, %1
1567  %sh3 = select <4 x i1> %2, <4 x i8> <i8 -1, i8 -1, i8 -1, i8 -1>, <4 x i8> %1
1568  store <4 x i8> %sh3, <4 x i8>* %p1, align 4
1569  ret void
1570}
1571
1572define void @addus_v2i8(<2 x i8>* %p1, <2 x i8>* %p2) {
1573; SSE2-LABEL: addus_v2i8:
1574; SSE2:       # %bb.0:
1575; SSE2-NEXT:    movzwl (%rdi), %eax
1576; SSE2-NEXT:    movd %eax, %xmm0
1577; SSE2-NEXT:    movzwl (%rsi), %eax
1578; SSE2-NEXT:    movd %eax, %xmm1
1579; SSE2-NEXT:    paddusb %xmm0, %xmm1
1580; SSE2-NEXT:    movd %xmm1, %eax
1581; SSE2-NEXT:    movw %ax, (%rdi)
1582; SSE2-NEXT:    retq
1583;
1584; SSSE3-LABEL: addus_v2i8:
1585; SSSE3:       # %bb.0:
1586; SSSE3-NEXT:    movzwl (%rdi), %eax
1587; SSSE3-NEXT:    movd %eax, %xmm0
1588; SSSE3-NEXT:    movzwl (%rsi), %eax
1589; SSSE3-NEXT:    movd %eax, %xmm1
1590; SSSE3-NEXT:    paddusb %xmm0, %xmm1
1591; SSSE3-NEXT:    movd %xmm1, %eax
1592; SSSE3-NEXT:    movw %ax, (%rdi)
1593; SSSE3-NEXT:    retq
1594;
1595; SSE41-LABEL: addus_v2i8:
1596; SSE41:       # %bb.0:
1597; SSE41-NEXT:    movzwl (%rdi), %eax
1598; SSE41-NEXT:    movd %eax, %xmm0
1599; SSE41-NEXT:    movzwl (%rsi), %eax
1600; SSE41-NEXT:    movd %eax, %xmm1
1601; SSE41-NEXT:    paddusb %xmm0, %xmm1
1602; SSE41-NEXT:    pextrw $0, %xmm1, (%rdi)
1603; SSE41-NEXT:    retq
1604;
1605; AVX-LABEL: addus_v2i8:
1606; AVX:       # %bb.0:
1607; AVX-NEXT:    movzwl (%rdi), %eax
1608; AVX-NEXT:    vmovd %eax, %xmm0
1609; AVX-NEXT:    movzwl (%rsi), %eax
1610; AVX-NEXT:    vmovd %eax, %xmm1
1611; AVX-NEXT:    vpaddusb %xmm0, %xmm1, %xmm0
1612; AVX-NEXT:    vpextrw $0, %xmm0, (%rdi)
1613; AVX-NEXT:    retq
1614  %ld1 = load <2 x i8>, <2 x i8>* %p1, align 2
1615  %ld2 = load <2 x i8>, <2 x i8>* %p2, align 2
1616  %1 = add <2 x i8> %ld2, %ld1
1617  %2 = icmp ugt <2 x i8> %ld1, %1
1618  %sh3 = select <2 x i1> %2, <2 x i8> <i8 -1, i8 -1>, <2 x i8> %1
1619  store <2 x i8> %sh3, <2 x i8>* %p1, align 2
1620  ret void
1621}
1622
1623define void @addus_v4i16(<4 x i16>* %p1, <4 x i16>* %p2) {
1624; SSE-LABEL: addus_v4i16:
1625; SSE:       # %bb.0:
1626; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
1627; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
1628; SSE-NEXT:    paddusw %xmm0, %xmm1
1629; SSE-NEXT:    movq %xmm1, (%rdi)
1630; SSE-NEXT:    retq
1631;
1632; AVX-LABEL: addus_v4i16:
1633; AVX:       # %bb.0:
1634; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
1635; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
1636; AVX-NEXT:    vpaddusw %xmm0, %xmm1, %xmm0
1637; AVX-NEXT:    vmovq %xmm0, (%rdi)
1638; AVX-NEXT:    retq
1639  %ld1 = load <4 x i16>, <4 x i16>* %p1, align 4
1640  %ld2 = load <4 x i16>, <4 x i16>* %p2, align 4
1641  %1 = add <4 x i16> %ld2, %ld1
1642  %2 = icmp ugt <4 x i16> %ld1, %1
1643  %sh3 = select <4 x i1> %2, <4 x i16> <i16 -1, i16 -1, i16 -1, i16 -1>, <4 x i16> %1
1644  store <4 x i16> %sh3, <4 x i16>* %p1, align 4
1645  ret void
1646}
1647
1648define void @addus_v2i16(<2 x i16>* %p1, <2 x i16>* %p2) {
1649; SSE-LABEL: addus_v2i16:
1650; SSE:       # %bb.0:
1651; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1652; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
1653; SSE-NEXT:    paddusw %xmm0, %xmm1
1654; SSE-NEXT:    movd %xmm1, (%rdi)
1655; SSE-NEXT:    retq
1656;
1657; AVX-LABEL: addus_v2i16:
1658; AVX:       # %bb.0:
1659; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1660; AVX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
1661; AVX-NEXT:    vpaddusw %xmm0, %xmm1, %xmm0
1662; AVX-NEXT:    vmovd %xmm0, (%rdi)
1663; AVX-NEXT:    retq
1664  %ld1 = load <2 x i16>, <2 x i16>* %p1, align 2
1665  %ld2 = load <2 x i16>, <2 x i16>* %p2, align 2
1666  %1 = add <2 x i16> %ld2, %ld1
1667  %2 = icmp ugt <2 x i16> %ld1, %1
1668  %sh3 = select <2 x i1> %2, <2 x i16> <i16 -1, i16 -1>, <2 x i16> %1
1669  store <2 x i16> %sh3, <2 x i16>* %p1, align 2
1670  ret void
1671}
1672