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,AVX2-SLOW
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX,AVX512
9
10define <8 x i16> @test1(<8 x i16> %x) nounwind {
11; SSE-LABEL: test1:
12; SSE:       # %bb.0: # %vector.ph
13; SSE-NEXT:    psubusw {{.*}}(%rip), %xmm0
14; SSE-NEXT:    retq
15;
16; AVX-LABEL: test1:
17; AVX:       # %bb.0: # %vector.ph
18; AVX-NEXT:    vpsubusw {{.*}}(%rip), %xmm0, %xmm0
19; AVX-NEXT:    retq
20vector.ph:
21  %0 = icmp slt <8 x i16> %x, zeroinitializer
22  %1 = xor <8 x i16> %x, <i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768, i16 -32768>
23  %res = select <8 x i1> %0, <8 x i16> %1, <8 x i16> zeroinitializer
24  ret <8 x i16> %res
25}
26
27define <8 x i16> @test2(<8 x i16> %x) nounwind {
28; SSE-LABEL: test2:
29; SSE:       # %bb.0: # %vector.ph
30; SSE-NEXT:    psubusw {{.*}}(%rip), %xmm0
31; SSE-NEXT:    retq
32;
33; AVX-LABEL: test2:
34; AVX:       # %bb.0: # %vector.ph
35; AVX-NEXT:    vpsubusw {{.*}}(%rip), %xmm0, %xmm0
36; AVX-NEXT:    retq
37vector.ph:
38  %0 = icmp ugt <8 x i16> %x, <i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766>
39  %1 = add <8 x i16> %x, <i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767, i16 -32767>
40  %res = select <8 x i1> %0, <8 x i16> %1, <8 x i16> zeroinitializer
41  ret <8 x i16> %res
42}
43
44define <8 x i16> @test3(<8 x i16> %x, i16 zeroext %w) nounwind {
45; SSE-LABEL: test3:
46; SSE:       # %bb.0: # %vector.ph
47; SSE-NEXT:    movd %edi, %xmm1
48; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
49; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
50; SSE-NEXT:    psubusw %xmm1, %xmm0
51; SSE-NEXT:    retq
52;
53; AVX1-LABEL: test3:
54; AVX1:       # %bb.0: # %vector.ph
55; AVX1-NEXT:    vmovd %edi, %xmm1
56; AVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
57; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
58; AVX1-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
59; AVX1-NEXT:    retq
60;
61; AVX2-LABEL: test3:
62; AVX2:       # %bb.0: # %vector.ph
63; AVX2-NEXT:    vmovd %edi, %xmm1
64; AVX2-NEXT:    vpbroadcastw %xmm1, %xmm1
65; AVX2-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
66; AVX2-NEXT:    retq
67;
68; AVX512-LABEL: test3:
69; AVX512:       # %bb.0: # %vector.ph
70; AVX512-NEXT:    vpbroadcastw %edi, %xmm1
71; AVX512-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
72; AVX512-NEXT:    retq
73vector.ph:
74  %0 = insertelement <8 x i16> undef, i16 %w, i32 0
75  %broadcast15 = shufflevector <8 x i16> %0, <8 x i16> undef, <8 x i32> zeroinitializer
76  %1 = icmp ult <8 x i16> %x, %broadcast15
77  %2 = sub <8 x i16> %x, %broadcast15
78  %res = select <8 x i1> %1, <8 x i16> zeroinitializer, <8 x i16> %2
79  ret <8 x i16> %res
80}
81
82define <16 x i8> @test4(<16 x i8> %x) nounwind {
83; SSE-LABEL: test4:
84; SSE:       # %bb.0: # %vector.ph
85; SSE-NEXT:    psubusb {{.*}}(%rip), %xmm0
86; SSE-NEXT:    retq
87;
88; AVX-LABEL: test4:
89; AVX:       # %bb.0: # %vector.ph
90; AVX-NEXT:    vpsubusb {{.*}}(%rip), %xmm0, %xmm0
91; AVX-NEXT:    retq
92vector.ph:
93  %0 = icmp slt <16 x i8> %x, zeroinitializer
94  %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>
95  %res = select <16 x i1> %0, <16 x i8> %1, <16 x i8> zeroinitializer
96  ret <16 x i8> %res
97}
98
99define <16 x i8> @test5(<16 x i8> %x) nounwind {
100; SSE-LABEL: test5:
101; SSE:       # %bb.0: # %vector.ph
102; SSE-NEXT:    psubusb {{.*}}(%rip), %xmm0
103; SSE-NEXT:    retq
104;
105; AVX-LABEL: test5:
106; AVX:       # %bb.0: # %vector.ph
107; AVX-NEXT:    vpsubusb {{.*}}(%rip), %xmm0, %xmm0
108; AVX-NEXT:    retq
109vector.ph:
110  %0 = 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>
111  %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>
112  %res = select <16 x i1> %0, <16 x i8> %1, <16 x i8> zeroinitializer
113  ret <16 x i8> %res
114}
115
116define <16 x i8> @test6(<16 x i8> %x, i8 zeroext %w) nounwind {
117; SSE2-LABEL: test6:
118; SSE2:       # %bb.0: # %vector.ph
119; SSE2-NEXT:    movd %edi, %xmm1
120; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
121; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
122; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
123; SSE2-NEXT:    psubusb %xmm1, %xmm0
124; SSE2-NEXT:    retq
125;
126; SSSE3-LABEL: test6:
127; SSSE3:       # %bb.0: # %vector.ph
128; SSSE3-NEXT:    movd %edi, %xmm1
129; SSSE3-NEXT:    pxor %xmm2, %xmm2
130; SSSE3-NEXT:    pshufb %xmm2, %xmm1
131; SSSE3-NEXT:    psubusb %xmm1, %xmm0
132; SSSE3-NEXT:    retq
133;
134; SSE41-LABEL: test6:
135; SSE41:       # %bb.0: # %vector.ph
136; SSE41-NEXT:    movd %edi, %xmm1
137; SSE41-NEXT:    pxor %xmm2, %xmm2
138; SSE41-NEXT:    pshufb %xmm2, %xmm1
139; SSE41-NEXT:    psubusb %xmm1, %xmm0
140; SSE41-NEXT:    retq
141;
142; AVX1-LABEL: test6:
143; AVX1:       # %bb.0: # %vector.ph
144; AVX1-NEXT:    vmovd %edi, %xmm1
145; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
146; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
147; AVX1-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
148; AVX1-NEXT:    retq
149;
150; AVX2-LABEL: test6:
151; AVX2:       # %bb.0: # %vector.ph
152; AVX2-NEXT:    vmovd %edi, %xmm1
153; AVX2-NEXT:    vpbroadcastb %xmm1, %xmm1
154; AVX2-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
155; AVX2-NEXT:    retq
156;
157; AVX512-LABEL: test6:
158; AVX512:       # %bb.0: # %vector.ph
159; AVX512-NEXT:    vpbroadcastb %edi, %xmm1
160; AVX512-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
161; AVX512-NEXT:    retq
162vector.ph:
163  %0 = insertelement <16 x i8> undef, i8 %w, i32 0
164  %broadcast15 = shufflevector <16 x i8> %0, <16 x i8> undef, <16 x i32> zeroinitializer
165  %1 = icmp ult <16 x i8> %x, %broadcast15
166  %2 = sub <16 x i8> %x, %broadcast15
167  %res = select <16 x i1> %1, <16 x i8> zeroinitializer, <16 x i8> %2
168  ret <16 x i8> %res
169}
170
171define <16 x i16> @test7(<16 x i16> %x) nounwind {
172; SSE-LABEL: test7:
173; SSE:       # %bb.0: # %vector.ph
174; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
175; SSE-NEXT:    psubusw %xmm2, %xmm0
176; SSE-NEXT:    psubusw %xmm2, %xmm1
177; SSE-NEXT:    retq
178;
179; AVX1-LABEL: test7:
180; AVX1:       # %bb.0: # %vector.ph
181; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
182; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
183; AVX1-NEXT:    vpsubusw %xmm2, %xmm1, %xmm1
184; AVX1-NEXT:    vpsubusw %xmm2, %xmm0, %xmm0
185; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
186; AVX1-NEXT:    retq
187;
188; AVX2-LABEL: test7:
189; AVX2:       # %bb.0: # %vector.ph
190; AVX2-NEXT:    vpsubusw {{.*}}(%rip), %ymm0, %ymm0
191; AVX2-NEXT:    retq
192;
193; AVX512-LABEL: test7:
194; AVX512:       # %bb.0: # %vector.ph
195; AVX512-NEXT:    vpsubusw {{.*}}(%rip), %ymm0, %ymm0
196; AVX512-NEXT:    retq
197vector.ph:
198  %0 = icmp slt <16 x i16> %x, zeroinitializer
199  %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>
200  %res = select <16 x i1> %0, <16 x i16> %1, <16 x i16> zeroinitializer
201  ret <16 x i16> %res
202}
203
204define <16 x i16> @test8(<16 x i16> %x) nounwind {
205; SSE-LABEL: test8:
206; SSE:       # %bb.0: # %vector.ph
207; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [32767,32767,32767,32767,32767,32767,32767,32767]
208; SSE-NEXT:    psubusw %xmm2, %xmm0
209; SSE-NEXT:    psubusw %xmm2, %xmm1
210; SSE-NEXT:    retq
211;
212; AVX1-LABEL: test8:
213; AVX1:       # %bb.0: # %vector.ph
214; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
215; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [32767,32767,32767,32767,32767,32767,32767,32767]
216; AVX1-NEXT:    vpsubusw %xmm2, %xmm1, %xmm1
217; AVX1-NEXT:    vpsubusw %xmm2, %xmm0, %xmm0
218; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
219; AVX1-NEXT:    retq
220;
221; AVX2-LABEL: test8:
222; AVX2:       # %bb.0: # %vector.ph
223; AVX2-NEXT:    vpsubusw {{.*}}(%rip), %ymm0, %ymm0
224; AVX2-NEXT:    retq
225;
226; AVX512-LABEL: test8:
227; AVX512:       # %bb.0: # %vector.ph
228; AVX512-NEXT:    vpsubusw {{.*}}(%rip), %ymm0, %ymm0
229; AVX512-NEXT:    retq
230vector.ph:
231  %0 = 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>
232  %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>
233  %res = select <16 x i1> %0, <16 x i16> %1, <16 x i16> zeroinitializer
234  ret <16 x i16> %res
235}
236
237define <16 x i16> @test8a(<16 x i16> %x) nounwind {
238; SSE-LABEL: test8a:
239; SSE:       # %bb.0: # %vector.ph
240; SSE-NEXT:    psubusw {{.*}}(%rip), %xmm0
241; SSE-NEXT:    psubusw {{.*}}(%rip), %xmm1
242; SSE-NEXT:    retq
243;
244; AVX1-LABEL: test8a:
245; AVX1:       # %bb.0: # %vector.ph
246; AVX1-NEXT:    vpsubusw {{.*}}(%rip), %xmm0, %xmm1
247; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
248; AVX1-NEXT:    vpsubusw {{.*}}(%rip), %xmm0, %xmm0
249; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
250; AVX1-NEXT:    retq
251;
252; AVX2-LABEL: test8a:
253; AVX2:       # %bb.0: # %vector.ph
254; AVX2-NEXT:    vpsubusw {{.*}}(%rip), %ymm0, %ymm0
255; AVX2-NEXT:    retq
256;
257; AVX512-LABEL: test8a:
258; AVX512:       # %bb.0: # %vector.ph
259; AVX512-NEXT:    vpsubusw {{.*}}(%rip), %ymm0, %ymm0
260; AVX512-NEXT:    retq
261vector.ph:
262  %0 = icmp ugt <16 x i16> %x, <i16 32766, i16 32765, i16 32764, i16 32763, i16 32762, i16 32761, i16 32760, i16 32759, i16 32758, i16 32757, i16 32756, i16 32755, i16 32754, i16 32753, i16 32752, i16 32751>
263  %1 = add <16 x i16> %x, <i16 -32767, i16 -32766, i16 -32765, i16 -32764, i16 -32763, i16 -32762, i16 -32761, i16 -32760, i16 -32759, i16 -32758, i16 -32757, i16 -32756, i16 -32755, i16 -32754, i16 -32753, i16 -32752>
264  %res = select <16 x i1> %0, <16 x i16> %1, <16 x i16> zeroinitializer
265  ret <16 x i16> %res
266}
267
268define <16 x i16> @test9(<16 x i16> %x, i16 zeroext %w) nounwind {
269; SSE-LABEL: test9:
270; SSE:       # %bb.0: # %vector.ph
271; SSE-NEXT:    movd %edi, %xmm2
272; SSE-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,0,2,3,4,5,6,7]
273; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]
274; SSE-NEXT:    psubusw %xmm2, %xmm0
275; SSE-NEXT:    psubusw %xmm2, %xmm1
276; SSE-NEXT:    retq
277;
278; AVX1-LABEL: test9:
279; AVX1:       # %bb.0: # %vector.ph
280; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
281; AVX1-NEXT:    vmovd %edi, %xmm2
282; AVX1-NEXT:    vpshuflw {{.*#+}} xmm2 = xmm2[0,0,2,3,4,5,6,7]
283; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]
284; AVX1-NEXT:    vpsubusw %xmm2, %xmm1, %xmm1
285; AVX1-NEXT:    vpsubusw %xmm2, %xmm0, %xmm0
286; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
287; AVX1-NEXT:    retq
288;
289; AVX2-LABEL: test9:
290; AVX2:       # %bb.0: # %vector.ph
291; AVX2-NEXT:    vmovd %edi, %xmm1
292; AVX2-NEXT:    vpbroadcastw %xmm1, %ymm1
293; AVX2-NEXT:    vpsubusw %ymm1, %ymm0, %ymm0
294; AVX2-NEXT:    retq
295;
296; AVX512-LABEL: test9:
297; AVX512:       # %bb.0: # %vector.ph
298; AVX512-NEXT:    vpbroadcastw %edi, %ymm1
299; AVX512-NEXT:    vpsubusw %ymm1, %ymm0, %ymm0
300; AVX512-NEXT:    retq
301vector.ph:
302  %0 = insertelement <16 x i16> undef, i16 %w, i32 0
303  %broadcast15 = shufflevector <16 x i16> %0, <16 x i16> undef, <16 x i32> zeroinitializer
304  %1 = icmp ult <16 x i16> %x, %broadcast15
305  %2 = sub <16 x i16> %x, %broadcast15
306  %res = select <16 x i1> %1, <16 x i16> zeroinitializer, <16 x i16> %2
307  ret <16 x i16> %res
308}
309
310define <32 x i8> @test10(<32 x i8> %x) nounwind {
311; SSE-LABEL: test10:
312; SSE:       # %bb.0: # %vector.ph
313; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
314; SSE-NEXT:    psubusb %xmm2, %xmm0
315; SSE-NEXT:    psubusb %xmm2, %xmm1
316; SSE-NEXT:    retq
317;
318; AVX1-LABEL: test10:
319; AVX1:       # %bb.0: # %vector.ph
320; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
321; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
322; AVX1-NEXT:    vpsubusb %xmm2, %xmm1, %xmm1
323; AVX1-NEXT:    vpsubusb %xmm2, %xmm0, %xmm0
324; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
325; AVX1-NEXT:    retq
326;
327; AVX2-LABEL: test10:
328; AVX2:       # %bb.0: # %vector.ph
329; AVX2-NEXT:    vpsubusb {{.*}}(%rip), %ymm0, %ymm0
330; AVX2-NEXT:    retq
331;
332; AVX512-LABEL: test10:
333; AVX512:       # %bb.0: # %vector.ph
334; AVX512-NEXT:    vpsubusb {{.*}}(%rip), %ymm0, %ymm0
335; AVX512-NEXT:    retq
336vector.ph:
337  %0 = icmp slt <32 x i8> %x, zeroinitializer
338  %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>
339  %res = select <32 x i1> %0, <32 x i8> %1, <32 x i8> zeroinitializer
340  ret <32 x i8> %res
341}
342
343define <32 x i8> @test11(<32 x i8> %x) nounwind {
344; SSE-LABEL: test11:
345; SSE:       # %bb.0: # %vector.ph
346; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
347; SSE-NEXT:    psubusb %xmm2, %xmm0
348; SSE-NEXT:    psubusb %xmm2, %xmm1
349; SSE-NEXT:    retq
350;
351; AVX1-LABEL: test11:
352; AVX1:       # %bb.0: # %vector.ph
353; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
354; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
355; AVX1-NEXT:    vpsubusb %xmm2, %xmm1, %xmm1
356; AVX1-NEXT:    vpsubusb %xmm2, %xmm0, %xmm0
357; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
358; AVX1-NEXT:    retq
359;
360; AVX2-LABEL: test11:
361; AVX2:       # %bb.0: # %vector.ph
362; AVX2-NEXT:    vpsubusb {{.*}}(%rip), %ymm0, %ymm0
363; AVX2-NEXT:    retq
364;
365; AVX512-LABEL: test11:
366; AVX512:       # %bb.0: # %vector.ph
367; AVX512-NEXT:    vpsubusb {{.*}}(%rip), %ymm0, %ymm0
368; AVX512-NEXT:    retq
369vector.ph:
370  %0 = 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>
371  %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>
372  %res = select <32 x i1> %0, <32 x i8> %1, <32 x i8> zeroinitializer
373  ret <32 x i8> %res
374}
375
376define <32 x i8> @test11a(<32 x i8> %x) nounwind {
377; SSE-LABEL: test11a:
378; SSE:       # %bb.0: # %vector.ph
379; SSE-NEXT:    psubusb {{.*}}(%rip), %xmm0
380; SSE-NEXT:    psubusb {{.*}}(%rip), %xmm1
381; SSE-NEXT:    retq
382;
383; AVX1-LABEL: test11a:
384; AVX1:       # %bb.0: # %vector.ph
385; AVX1-NEXT:    vpsubusb {{.*}}(%rip), %xmm0, %xmm1
386; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
387; AVX1-NEXT:    vpsubusb {{.*}}(%rip), %xmm0, %xmm0
388; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
389; AVX1-NEXT:    retq
390;
391; AVX2-LABEL: test11a:
392; AVX2:       # %bb.0: # %vector.ph
393; AVX2-NEXT:    vpsubusb {{.*}}(%rip), %ymm0, %ymm0
394; AVX2-NEXT:    retq
395;
396; AVX512-LABEL: test11a:
397; AVX512:       # %bb.0: # %vector.ph
398; AVX512-NEXT:    vpsubusb {{.*}}(%rip), %ymm0, %ymm0
399; AVX512-NEXT:    retq
400vector.ph:
401  %0 = icmp ugt <32 x i8> %x, <i8 126, i8 125, i8 124, i8 123, i8 122, i8 121, i8 120, i8 119, i8 118, i8 117, i8 116, i8 115, i8 114, i8 113, i8 112, i8 111, i8 110, i8 109, i8 108, i8 107, i8 106, i8 105, i8 104, i8 103, i8 102, i8 101, i8 100, i8 99, i8 98, i8 97, i8 96, i8 95>
402  %1 = add <32 x i8> %x, <i8 -127, i8 -126, i8 -125, i8 -124, i8 -123, i8 -122, i8 -121, i8 -120, i8 -119, i8 -118, i8 -117, i8 -116, i8 -115, i8 -114, i8 -113, i8 -112, i8 -111, i8 -110, i8 -109, i8 -108, i8 -107, i8 -106, i8 -105, i8 -104, i8 -103, i8 -102, i8 -101, i8 -100, i8 -99, i8 -98, i8 -97, i8 -96>
403  %res = select <32 x i1> %0, <32 x i8> %1, <32 x i8> zeroinitializer
404  ret <32 x i8> %res
405}
406
407define <32 x i8> @test12(<32 x i8> %x, i8 zeroext %w) nounwind {
408; SSE2-LABEL: test12:
409; SSE2:       # %bb.0: # %vector.ph
410; SSE2-NEXT:    movd %edi, %xmm2
411; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
412; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,0,2,3,4,5,6,7]
413; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]
414; SSE2-NEXT:    psubusb %xmm2, %xmm0
415; SSE2-NEXT:    psubusb %xmm2, %xmm1
416; SSE2-NEXT:    retq
417;
418; SSSE3-LABEL: test12:
419; SSSE3:       # %bb.0: # %vector.ph
420; SSSE3-NEXT:    movd %edi, %xmm2
421; SSSE3-NEXT:    pxor %xmm3, %xmm3
422; SSSE3-NEXT:    pshufb %xmm3, %xmm2
423; SSSE3-NEXT:    psubusb %xmm2, %xmm0
424; SSSE3-NEXT:    psubusb %xmm2, %xmm1
425; SSSE3-NEXT:    retq
426;
427; SSE41-LABEL: test12:
428; SSE41:       # %bb.0: # %vector.ph
429; SSE41-NEXT:    movd %edi, %xmm2
430; SSE41-NEXT:    pxor %xmm3, %xmm3
431; SSE41-NEXT:    pshufb %xmm3, %xmm2
432; SSE41-NEXT:    psubusb %xmm2, %xmm0
433; SSE41-NEXT:    psubusb %xmm2, %xmm1
434; SSE41-NEXT:    retq
435;
436; AVX1-LABEL: test12:
437; AVX1:       # %bb.0: # %vector.ph
438; AVX1-NEXT:    vmovd %edi, %xmm1
439; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
440; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
441; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
442; AVX1-NEXT:    vpsubusb %xmm1, %xmm2, %xmm2
443; AVX1-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
444; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
445; AVX1-NEXT:    retq
446;
447; AVX2-LABEL: test12:
448; AVX2:       # %bb.0: # %vector.ph
449; AVX2-NEXT:    vmovd %edi, %xmm1
450; AVX2-NEXT:    vpbroadcastb %xmm1, %ymm1
451; AVX2-NEXT:    vpsubusb %ymm1, %ymm0, %ymm0
452; AVX2-NEXT:    retq
453;
454; AVX512-LABEL: test12:
455; AVX512:       # %bb.0: # %vector.ph
456; AVX512-NEXT:    vpbroadcastb %edi, %ymm1
457; AVX512-NEXT:    vpsubusb %ymm1, %ymm0, %ymm0
458; AVX512-NEXT:    retq
459vector.ph:
460  %0 = insertelement <32 x i8> undef, i8 %w, i32 0
461  %broadcast15 = shufflevector <32 x i8> %0, <32 x i8> undef, <32 x i32> zeroinitializer
462  %1 = icmp ult <32 x i8> %x, %broadcast15
463  %2 = sub <32 x i8> %x, %broadcast15
464  %res = select <32 x i1> %1, <32 x i8> zeroinitializer, <32 x i8> %2
465  ret <32 x i8> %res
466}
467
468define <8 x i16> @test13(<8 x i16> %x, <8 x i32> %y) nounwind {
469; SSE2-LABEL: test13:
470; SSE2:       # %bb.0: # %vector.ph
471; SSE2-NEXT:    pxor %xmm4, %xmm4
472; SSE2-NEXT:    movdqa %xmm0, %xmm3
473; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3]
474; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
475; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
476; SSE2-NEXT:    movdqa %xmm0, %xmm5
477; SSE2-NEXT:    psubd %xmm2, %xmm0
478; SSE2-NEXT:    movdqa %xmm2, %xmm6
479; SSE2-NEXT:    pxor %xmm4, %xmm6
480; SSE2-NEXT:    por %xmm4, %xmm5
481; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
482; SSE2-NEXT:    movdqa %xmm1, %xmm2
483; SSE2-NEXT:    pxor %xmm4, %xmm2
484; SSE2-NEXT:    por %xmm3, %xmm4
485; SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
486; SSE2-NEXT:    packssdw %xmm6, %xmm2
487; SSE2-NEXT:    psubd %xmm1, %xmm3
488; SSE2-NEXT:    pslld $16, %xmm0
489; SSE2-NEXT:    psrad $16, %xmm0
490; SSE2-NEXT:    pslld $16, %xmm3
491; SSE2-NEXT:    psrad $16, %xmm3
492; SSE2-NEXT:    packssdw %xmm0, %xmm3
493; SSE2-NEXT:    pandn %xmm3, %xmm2
494; SSE2-NEXT:    movdqa %xmm2, %xmm0
495; SSE2-NEXT:    retq
496;
497; SSSE3-LABEL: test13:
498; SSSE3:       # %bb.0: # %vector.ph
499; SSSE3-NEXT:    pxor %xmm3, %xmm3
500; SSSE3-NEXT:    movdqa %xmm0, %xmm4
501; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]
502; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
503; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
504; SSSE3-NEXT:    movdqa %xmm0, %xmm5
505; SSSE3-NEXT:    psubd %xmm2, %xmm0
506; SSSE3-NEXT:    movdqa %xmm2, %xmm6
507; SSSE3-NEXT:    pxor %xmm3, %xmm6
508; SSSE3-NEXT:    por %xmm3, %xmm5
509; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm6
510; SSSE3-NEXT:    movdqa %xmm1, %xmm2
511; SSSE3-NEXT:    pxor %xmm3, %xmm2
512; SSSE3-NEXT:    por %xmm4, %xmm3
513; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2
514; SSSE3-NEXT:    packssdw %xmm6, %xmm2
515; SSSE3-NEXT:    psubd %xmm1, %xmm4
516; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
517; SSSE3-NEXT:    pshufb %xmm1, %xmm0
518; SSSE3-NEXT:    pshufb %xmm1, %xmm4
519; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm0[0]
520; SSSE3-NEXT:    pandn %xmm4, %xmm2
521; SSSE3-NEXT:    movdqa %xmm2, %xmm0
522; SSSE3-NEXT:    retq
523;
524; SSE41-LABEL: test13:
525; SSE41:       # %bb.0: # %vector.ph
526; SSE41-NEXT:    pxor %xmm3, %xmm3
527; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm4 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
528; SSE41-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
529; SSE41-NEXT:    movdqa %xmm0, %xmm5
530; SSE41-NEXT:    pmaxud %xmm2, %xmm5
531; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
532; SSE41-NEXT:    pcmpeqd %xmm6, %xmm6
533; SSE41-NEXT:    pxor %xmm6, %xmm5
534; SSE41-NEXT:    movdqa %xmm4, %xmm3
535; SSE41-NEXT:    pmaxud %xmm1, %xmm3
536; SSE41-NEXT:    pcmpeqd %xmm4, %xmm3
537; SSE41-NEXT:    pxor %xmm6, %xmm3
538; SSE41-NEXT:    packssdw %xmm5, %xmm3
539; SSE41-NEXT:    psubd %xmm1, %xmm4
540; SSE41-NEXT:    psubd %xmm2, %xmm0
541; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
542; SSE41-NEXT:    pshufb %xmm1, %xmm0
543; SSE41-NEXT:    pshufb %xmm1, %xmm4
544; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm0[0]
545; SSE41-NEXT:    pandn %xmm4, %xmm3
546; SSE41-NEXT:    movdqa %xmm3, %xmm0
547; SSE41-NEXT:    retq
548;
549; AVX1-LABEL: test13:
550; AVX1:       # %bb.0: # %vector.ph
551; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
552; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm2 = xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
553; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
554; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
555; AVX1-NEXT:    vpmaxud %xmm3, %xmm2, %xmm4
556; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm2, %xmm4
557; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
558; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
559; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm6
560; AVX1-NEXT:    vpcmpeqd %xmm6, %xmm0, %xmm6
561; AVX1-NEXT:    vpxor %xmm5, %xmm6, %xmm5
562; AVX1-NEXT:    vpackssdw %xmm4, %xmm5, %xmm4
563; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
564; AVX1-NEXT:    vpsubd %xmm3, %xmm2, %xmm1
565; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
566; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
567; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
568; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
569; AVX1-NEXT:    vpandn %xmm0, %xmm4, %xmm0
570; AVX1-NEXT:    vzeroupper
571; AVX1-NEXT:    retq
572;
573; AVX2-LABEL: test13:
574; AVX2:       # %bb.0: # %vector.ph
575; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
576; AVX2-NEXT:    vpmaxud %ymm1, %ymm0, %ymm2
577; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm0, %ymm2
578; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
579; AVX2-NEXT:    vpxor %ymm3, %ymm2, %ymm2
580; AVX2-NEXT:    vextracti128 $1, %ymm2, %xmm3
581; AVX2-NEXT:    vpackssdw %xmm3, %xmm2, %xmm2
582; AVX2-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
583; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
584; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
585; AVX2-NEXT:    vpandn %xmm0, %xmm2, %xmm0
586; AVX2-NEXT:    vzeroupper
587; AVX2-NEXT:    retq
588;
589; AVX512-LABEL: test13:
590; AVX512:       # %bb.0: # %vector.ph
591; AVX512-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
592; AVX512-NEXT:    vpcmpnltud %ymm1, %ymm0, %k1
593; AVX512-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
594; AVX512-NEXT:    vpmovdw %ymm0, %xmm0 {%k1} {z}
595; AVX512-NEXT:    vzeroupper
596; AVX512-NEXT:    retq
597vector.ph:
598  %lhs = zext <8 x i16> %x to <8 x i32>
599  %cond = icmp ult <8 x i32> %lhs, %y
600  %sub = sub <8 x i32> %lhs, %y
601  %trunc = trunc <8 x i32> %sub to <8 x i16>
602  %res = select <8 x i1> %cond, <8 x i16> zeroinitializer, <8 x i16> %trunc
603  ret <8 x i16> %res
604}
605
606define <16 x i8> @test14(<16 x i8> %x, <16 x i32> %y) nounwind {
607; SSE2-LABEL: test14:
608; SSE2:       # %bb.0: # %vector.ph
609; SSE2-NEXT:    movdqa %xmm0, %xmm5
610; SSE2-NEXT:    pxor %xmm0, %xmm0
611; SSE2-NEXT:    movdqa %xmm5, %xmm6
612; SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm0[0],xmm6[1],xmm0[1],xmm6[2],xmm0[2],xmm6[3],xmm0[3],xmm6[4],xmm0[4],xmm6[5],xmm0[5],xmm6[6],xmm0[6],xmm6[7],xmm0[7]
613; SSE2-NEXT:    movdqa %xmm6, %xmm8
614; SSE2-NEXT:    punpcklwd {{.*#+}} xmm8 = xmm8[0],xmm0[0],xmm8[1],xmm0[1],xmm8[2],xmm0[2],xmm8[3],xmm0[3]
615; SSE2-NEXT:    punpckhwd {{.*#+}} xmm6 = xmm6[4],xmm0[4],xmm6[5],xmm0[5],xmm6[6],xmm0[6],xmm6[7],xmm0[7]
616; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
617; SSE2-NEXT:    movdqa %xmm5, %xmm10
618; SSE2-NEXT:    punpcklwd {{.*#+}} xmm10 = xmm10[0],xmm0[0],xmm10[1],xmm0[1],xmm10[2],xmm0[2],xmm10[3],xmm0[3]
619; SSE2-NEXT:    punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7]
620; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
621; SSE2-NEXT:    movdqa %xmm4, %xmm9
622; SSE2-NEXT:    pxor %xmm0, %xmm9
623; SSE2-NEXT:    psubd %xmm5, %xmm4
624; SSE2-NEXT:    por %xmm0, %xmm5
625; SSE2-NEXT:    pcmpgtd %xmm9, %xmm5
626; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [255,255,255,255]
627; SSE2-NEXT:    pand %xmm9, %xmm5
628; SSE2-NEXT:    movdqa %xmm3, %xmm7
629; SSE2-NEXT:    pxor %xmm0, %xmm7
630; SSE2-NEXT:    psubd %xmm10, %xmm3
631; SSE2-NEXT:    por %xmm0, %xmm10
632; SSE2-NEXT:    pcmpgtd %xmm7, %xmm10
633; SSE2-NEXT:    pand %xmm9, %xmm10
634; SSE2-NEXT:    packuswb %xmm5, %xmm10
635; SSE2-NEXT:    movdqa %xmm2, %xmm5
636; SSE2-NEXT:    pxor %xmm0, %xmm5
637; SSE2-NEXT:    psubd %xmm6, %xmm2
638; SSE2-NEXT:    por %xmm0, %xmm6
639; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
640; SSE2-NEXT:    pand %xmm9, %xmm6
641; SSE2-NEXT:    movdqa %xmm1, %xmm5
642; SSE2-NEXT:    pxor %xmm0, %xmm5
643; SSE2-NEXT:    por %xmm8, %xmm0
644; SSE2-NEXT:    pcmpgtd %xmm5, %xmm0
645; SSE2-NEXT:    pand %xmm9, %xmm0
646; SSE2-NEXT:    packuswb %xmm6, %xmm0
647; SSE2-NEXT:    packuswb %xmm10, %xmm0
648; SSE2-NEXT:    psubd %xmm8, %xmm1
649; SSE2-NEXT:    pand %xmm9, %xmm4
650; SSE2-NEXT:    pand %xmm9, %xmm3
651; SSE2-NEXT:    packuswb %xmm4, %xmm3
652; SSE2-NEXT:    pand %xmm9, %xmm2
653; SSE2-NEXT:    pand %xmm9, %xmm1
654; SSE2-NEXT:    packuswb %xmm2, %xmm1
655; SSE2-NEXT:    packuswb %xmm3, %xmm1
656; SSE2-NEXT:    pandn %xmm1, %xmm0
657; SSE2-NEXT:    retq
658;
659; SSSE3-LABEL: test14:
660; SSSE3:       # %bb.0: # %vector.ph
661; SSSE3-NEXT:    movdqa %xmm0, %xmm5
662; SSSE3-NEXT:    pxor %xmm0, %xmm0
663; SSSE3-NEXT:    movdqa %xmm5, %xmm7
664; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm0[8],xmm7[9],xmm0[9],xmm7[10],xmm0[10],xmm7[11],xmm0[11],xmm7[12],xmm0[12],xmm7[13],xmm0[13],xmm7[14],xmm0[14],xmm7[15],xmm0[15]
665; SSSE3-NEXT:    movdqa %xmm7, %xmm8
666; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm8 = xmm8[0],xmm0[0],xmm8[1],xmm0[1],xmm8[2],xmm0[2],xmm8[3],xmm0[3]
667; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm7 = xmm7[4],xmm0[4],xmm7[5],xmm0[5],xmm7[6],xmm0[6],xmm7[7],xmm0[7]
668; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1],xmm5[2],xmm0[2],xmm5[3],xmm0[3],xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7]
669; SSSE3-NEXT:    movdqa %xmm5, %xmm10
670; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm10 = xmm10[0],xmm0[0],xmm10[1],xmm0[1],xmm10[2],xmm0[2],xmm10[3],xmm0[3]
671; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7]
672; SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
673; SSSE3-NEXT:    movdqa %xmm2, %xmm9
674; SSSE3-NEXT:    pxor %xmm0, %xmm9
675; SSSE3-NEXT:    psubd %xmm5, %xmm2
676; SSSE3-NEXT:    por %xmm0, %xmm5
677; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm5
678; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
679; SSSE3-NEXT:    pshufb %xmm9, %xmm5
680; SSSE3-NEXT:    movdqa %xmm1, %xmm6
681; SSSE3-NEXT:    pxor %xmm0, %xmm6
682; SSSE3-NEXT:    psubd %xmm10, %xmm1
683; SSSE3-NEXT:    por %xmm0, %xmm10
684; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm10
685; SSSE3-NEXT:    pshufb %xmm9, %xmm10
686; SSSE3-NEXT:    punpckldq {{.*#+}} xmm10 = xmm10[0],xmm5[0],xmm10[1],xmm5[1]
687; SSSE3-NEXT:    movdqa %xmm4, %xmm5
688; SSSE3-NEXT:    pxor %xmm0, %xmm5
689; SSSE3-NEXT:    psubd %xmm7, %xmm4
690; SSSE3-NEXT:    por %xmm0, %xmm7
691; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm7
692; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = <u,u,u,u,0,4,8,12,u,u,u,u,u,u,u,u>
693; SSSE3-NEXT:    pshufb %xmm5, %xmm7
694; SSSE3-NEXT:    movdqa %xmm3, %xmm6
695; SSSE3-NEXT:    pxor %xmm0, %xmm6
696; SSSE3-NEXT:    por %xmm8, %xmm0
697; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm0
698; SSSE3-NEXT:    pshufb %xmm5, %xmm0
699; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1]
700; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm10[0],xmm0[1]
701; SSSE3-NEXT:    psubd %xmm8, %xmm3
702; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
703; SSSE3-NEXT:    pand %xmm5, %xmm4
704; SSSE3-NEXT:    pand %xmm5, %xmm3
705; SSSE3-NEXT:    packuswb %xmm4, %xmm3
706; SSSE3-NEXT:    pand %xmm5, %xmm2
707; SSSE3-NEXT:    pand %xmm5, %xmm1
708; SSSE3-NEXT:    packuswb %xmm2, %xmm1
709; SSSE3-NEXT:    packuswb %xmm3, %xmm1
710; SSSE3-NEXT:    andnpd %xmm1, %xmm0
711; SSSE3-NEXT:    retq
712;
713; SSE41-LABEL: test14:
714; SSE41:       # %bb.0: # %vector.ph
715; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,2,3]
716; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm11 = xmm5[0],zero,zero,zero,xmm5[1],zero,zero,zero,xmm5[2],zero,zero,zero,xmm5[3],zero,zero,zero
717; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm8 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
718; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[2,3,0,1]
719; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm9 = xmm6[0],zero,zero,zero,xmm6[1],zero,zero,zero,xmm6[2],zero,zero,zero,xmm6[3],zero,zero,zero
720; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
721; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm10 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
722; SSE41-NEXT:    movdqa %xmm4, %xmm0
723; SSE41-NEXT:    pmaxud %xmm10, %xmm0
724; SSE41-NEXT:    pcmpeqd %xmm4, %xmm0
725; SSE41-NEXT:    pcmpeqd %xmm6, %xmm6
726; SSE41-NEXT:    pxor %xmm6, %xmm0
727; SSE41-NEXT:    movdqa {{.*#+}} xmm7 = <u,u,u,u,0,4,8,12,u,u,u,u,u,u,u,u>
728; SSE41-NEXT:    pshufb %xmm7, %xmm0
729; SSE41-NEXT:    movdqa %xmm3, %xmm5
730; SSE41-NEXT:    pmaxud %xmm9, %xmm5
731; SSE41-NEXT:    pcmpeqd %xmm3, %xmm5
732; SSE41-NEXT:    pxor %xmm6, %xmm5
733; SSE41-NEXT:    pshufb %xmm7, %xmm5
734; SSE41-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1]
735; SSE41-NEXT:    movdqa %xmm1, %xmm0
736; SSE41-NEXT:    pmaxud %xmm8, %xmm0
737; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
738; SSE41-NEXT:    pxor %xmm6, %xmm0
739; SSE41-NEXT:    movdqa {{.*#+}} xmm12 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
740; SSE41-NEXT:    pshufb %xmm12, %xmm0
741; SSE41-NEXT:    movdqa %xmm2, %xmm7
742; SSE41-NEXT:    pmaxud %xmm11, %xmm7
743; SSE41-NEXT:    pcmpeqd %xmm2, %xmm7
744; SSE41-NEXT:    pxor %xmm6, %xmm7
745; SSE41-NEXT:    pshufb %xmm12, %xmm7
746; SSE41-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1]
747; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm5[4,5,6,7]
748; SSE41-NEXT:    psubd %xmm11, %xmm2
749; SSE41-NEXT:    psubd %xmm8, %xmm1
750; SSE41-NEXT:    psubd %xmm9, %xmm3
751; SSE41-NEXT:    psubd %xmm10, %xmm4
752; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
753; SSE41-NEXT:    pand %xmm5, %xmm4
754; SSE41-NEXT:    pand %xmm5, %xmm3
755; SSE41-NEXT:    packusdw %xmm4, %xmm3
756; SSE41-NEXT:    pand %xmm5, %xmm1
757; SSE41-NEXT:    pand %xmm5, %xmm2
758; SSE41-NEXT:    packusdw %xmm2, %xmm1
759; SSE41-NEXT:    packuswb %xmm3, %xmm1
760; SSE41-NEXT:    pandn %xmm1, %xmm0
761; SSE41-NEXT:    retq
762;
763; AVX1-LABEL: test14:
764; AVX1:       # %bb.0: # %vector.ph
765; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,2,3]
766; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm8 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
767; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm9 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
768; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm0[2,3,0,1]
769; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm11 = xmm5[0],zero,zero,zero,xmm5[1],zero,zero,zero,xmm5[2],zero,zero,zero,xmm5[3],zero,zero,zero
770; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[3,3,0,1]
771; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
772; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm6
773; AVX1-NEXT:    vpmaxud %xmm0, %xmm6, %xmm7
774; AVX1-NEXT:    vpcmpeqd %xmm7, %xmm6, %xmm7
775; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
776; AVX1-NEXT:    vpxor %xmm3, %xmm7, %xmm7
777; AVX1-NEXT:    vpmaxud %xmm11, %xmm2, %xmm4
778; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm2, %xmm4
779; AVX1-NEXT:    vpxor %xmm3, %xmm4, %xmm4
780; AVX1-NEXT:    vpackssdw %xmm7, %xmm4, %xmm10
781; AVX1-NEXT:    vpmaxud %xmm9, %xmm1, %xmm7
782; AVX1-NEXT:    vpcmpeqd %xmm7, %xmm1, %xmm7
783; AVX1-NEXT:    vpxor %xmm3, %xmm7, %xmm7
784; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
785; AVX1-NEXT:    vpmaxud %xmm8, %xmm4, %xmm5
786; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm4, %xmm5
787; AVX1-NEXT:    vpxor %xmm3, %xmm5, %xmm3
788; AVX1-NEXT:    vpackssdw %xmm3, %xmm7, %xmm3
789; AVX1-NEXT:    vpacksswb %xmm10, %xmm3, %xmm3
790; AVX1-NEXT:    vpsubd %xmm8, %xmm4, %xmm4
791; AVX1-NEXT:    vpsubd %xmm9, %xmm1, %xmm1
792; AVX1-NEXT:    vpsubd %xmm11, %xmm2, %xmm2
793; AVX1-NEXT:    vpsubd %xmm0, %xmm6, %xmm0
794; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm5 = [3.57331108E-43,3.57331108E-43,3.57331108E-43,3.57331108E-43]
795; AVX1-NEXT:    vpand %xmm5, %xmm0, %xmm0
796; AVX1-NEXT:    vpand %xmm5, %xmm2, %xmm2
797; AVX1-NEXT:    vpackusdw %xmm0, %xmm2, %xmm0
798; AVX1-NEXT:    vpand %xmm5, %xmm1, %xmm1
799; AVX1-NEXT:    vpand %xmm5, %xmm4, %xmm2
800; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
801; AVX1-NEXT:    vpackuswb %xmm0, %xmm1, %xmm0
802; AVX1-NEXT:    vpandn %xmm0, %xmm3, %xmm0
803; AVX1-NEXT:    vzeroupper
804; AVX1-NEXT:    retq
805;
806; AVX2-LABEL: test14:
807; AVX2:       # %bb.0: # %vector.ph
808; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[2,3,0,1]
809; AVX2-NEXT:    vpmovzxbd {{.*#+}} ymm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero,xmm3[4],zero,zero,zero,xmm3[5],zero,zero,zero,xmm3[6],zero,zero,zero,xmm3[7],zero,zero,zero
810; AVX2-NEXT:    vpmovzxbd {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
811; AVX2-NEXT:    vpmaxud %ymm0, %ymm1, %ymm4
812; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm1, %ymm4
813; AVX2-NEXT:    vpcmpeqd %ymm5, %ymm5, %ymm5
814; AVX2-NEXT:    vpxor %ymm5, %ymm4, %ymm4
815; AVX2-NEXT:    vextracti128 $1, %ymm4, %xmm6
816; AVX2-NEXT:    vpackssdw %xmm6, %xmm4, %xmm4
817; AVX2-NEXT:    vpmaxud %ymm3, %ymm2, %ymm6
818; AVX2-NEXT:    vpcmpeqd %ymm6, %ymm2, %ymm6
819; AVX2-NEXT:    vpxor %ymm5, %ymm6, %ymm5
820; AVX2-NEXT:    vextracti128 $1, %ymm5, %xmm6
821; AVX2-NEXT:    vpackssdw %xmm6, %xmm5, %xmm5
822; AVX2-NEXT:    vpacksswb %xmm5, %xmm4, %xmm4
823; AVX2-NEXT:    vpsubd %ymm3, %ymm2, %ymm2
824; AVX2-NEXT:    vpsubd %ymm0, %ymm1, %ymm0
825; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
826; AVX2-NEXT:    vpshufb %ymm1, %ymm0, %ymm0
827; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
828; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
829; AVX2-NEXT:    vpand %xmm3, %xmm0, %xmm0
830; AVX2-NEXT:    vpshufb %ymm1, %ymm2, %ymm1
831; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
832; AVX2-NEXT:    vpand %xmm3, %xmm1, %xmm1
833; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
834; AVX2-NEXT:    vpandn %xmm0, %xmm4, %xmm0
835; AVX2-NEXT:    vzeroupper
836; AVX2-NEXT:    retq
837;
838; AVX512-LABEL: test14:
839; AVX512:       # %bb.0: # %vector.ph
840; AVX512-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
841; AVX512-NEXT:    vpcmpnltud %zmm0, %zmm1, %k1
842; AVX512-NEXT:    vpsubd %zmm0, %zmm1, %zmm0
843; AVX512-NEXT:    vpmovdb %zmm0, %xmm0 {%k1} {z}
844; AVX512-NEXT:    vzeroupper
845; AVX512-NEXT:    retq
846vector.ph:
847  %rhs = zext <16 x i8> %x to <16 x i32>
848  %cond = icmp ult <16 x i32> %y, %rhs
849  %sub = sub <16 x i32> %y, %rhs
850  %truncsub = trunc <16 x i32> %sub to <16 x i8>
851  %res = select <16 x i1> %cond, <16 x i8> zeroinitializer, <16 x i8> %truncsub
852  ret <16 x i8> %res
853}
854
855define <8 x i16> @test15(<8 x i16> %x, <8 x i32> %y) nounwind {
856; SSE2-LABEL: test15:
857; SSE2:       # %bb.0: # %vector.ph
858; SSE2-NEXT:    movdqa %xmm0, %xmm3
859; SSE2-NEXT:    pxor %xmm4, %xmm4
860; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3]
861; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
862; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
863; SSE2-NEXT:    movdqa %xmm3, %xmm5
864; SSE2-NEXT:    psubd %xmm2, %xmm3
865; SSE2-NEXT:    pxor %xmm4, %xmm2
866; SSE2-NEXT:    por %xmm4, %xmm5
867; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
868; SSE2-NEXT:    movdqa %xmm1, %xmm2
869; SSE2-NEXT:    pxor %xmm4, %xmm2
870; SSE2-NEXT:    por %xmm0, %xmm4
871; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
872; SSE2-NEXT:    packssdw %xmm5, %xmm4
873; SSE2-NEXT:    psubd %xmm1, %xmm0
874; SSE2-NEXT:    pslld $16, %xmm3
875; SSE2-NEXT:    psrad $16, %xmm3
876; SSE2-NEXT:    pslld $16, %xmm0
877; SSE2-NEXT:    psrad $16, %xmm0
878; SSE2-NEXT:    packssdw %xmm3, %xmm0
879; SSE2-NEXT:    pand %xmm4, %xmm0
880; SSE2-NEXT:    retq
881;
882; SSSE3-LABEL: test15:
883; SSSE3:       # %bb.0: # %vector.ph
884; SSSE3-NEXT:    pxor %xmm4, %xmm4
885; SSSE3-NEXT:    movdqa %xmm0, %xmm3
886; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3]
887; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
888; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
889; SSSE3-NEXT:    movdqa %xmm0, %xmm5
890; SSSE3-NEXT:    psubd %xmm2, %xmm0
891; SSSE3-NEXT:    pxor %xmm4, %xmm2
892; SSSE3-NEXT:    por %xmm4, %xmm5
893; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm5
894; SSSE3-NEXT:    movdqa %xmm1, %xmm2
895; SSSE3-NEXT:    pxor %xmm4, %xmm2
896; SSSE3-NEXT:    por %xmm3, %xmm4
897; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
898; SSSE3-NEXT:    packssdw %xmm5, %xmm4
899; SSSE3-NEXT:    psubd %xmm1, %xmm3
900; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
901; SSSE3-NEXT:    pshufb %xmm1, %xmm0
902; SSSE3-NEXT:    pshufb %xmm1, %xmm3
903; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]
904; SSSE3-NEXT:    pand %xmm4, %xmm3
905; SSSE3-NEXT:    movdqa %xmm3, %xmm0
906; SSSE3-NEXT:    retq
907;
908; SSE41-LABEL: test15:
909; SSE41:       # %bb.0: # %vector.ph
910; SSE41-NEXT:    pxor %xmm4, %xmm4
911; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
912; SSE41-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
913; SSE41-NEXT:    movdqa %xmm0, %xmm4
914; SSE41-NEXT:    pminud %xmm2, %xmm4
915; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
916; SSE41-NEXT:    pcmpeqd %xmm5, %xmm5
917; SSE41-NEXT:    pxor %xmm5, %xmm4
918; SSE41-NEXT:    movdqa %xmm3, %xmm6
919; SSE41-NEXT:    pminud %xmm1, %xmm6
920; SSE41-NEXT:    pcmpeqd %xmm3, %xmm6
921; SSE41-NEXT:    pxor %xmm5, %xmm6
922; SSE41-NEXT:    packssdw %xmm4, %xmm6
923; SSE41-NEXT:    psubd %xmm1, %xmm3
924; SSE41-NEXT:    psubd %xmm2, %xmm0
925; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
926; SSE41-NEXT:    pshufb %xmm1, %xmm0
927; SSE41-NEXT:    pshufb %xmm1, %xmm3
928; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]
929; SSE41-NEXT:    pand %xmm6, %xmm3
930; SSE41-NEXT:    movdqa %xmm3, %xmm0
931; SSE41-NEXT:    retq
932;
933; AVX1-LABEL: test15:
934; AVX1:       # %bb.0: # %vector.ph
935; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
936; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm2 = xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
937; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
938; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
939; AVX1-NEXT:    vpminud %xmm3, %xmm2, %xmm4
940; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm2, %xmm4
941; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm5
942; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm0, %xmm5
943; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
944; AVX1-NEXT:    vpandn %xmm0, %xmm5, %xmm0
945; AVX1-NEXT:    vpsubd %xmm3, %xmm2, %xmm1
946; AVX1-NEXT:    vpandn %xmm1, %xmm4, %xmm1
947; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
948; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
949; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
950; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
951; AVX1-NEXT:    vzeroupper
952; AVX1-NEXT:    retq
953;
954; AVX2-LABEL: test15:
955; AVX2:       # %bb.0: # %vector.ph
956; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
957; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm2
958; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm0, %ymm2
959; AVX2-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
960; AVX2-NEXT:    vpandn %ymm0, %ymm2, %ymm0
961; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
962; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
963; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
964; AVX2-NEXT:    vzeroupper
965; AVX2-NEXT:    retq
966;
967; AVX512-LABEL: test15:
968; AVX512:       # %bb.0: # %vector.ph
969; AVX512-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
970; AVX512-NEXT:    vpcmpnleud %ymm1, %ymm0, %k1
971; AVX512-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
972; AVX512-NEXT:    vpmovdw %ymm0, %xmm0 {%k1} {z}
973; AVX512-NEXT:    vzeroupper
974; AVX512-NEXT:    retq
975vector.ph:
976  %lhs = zext <8 x i16> %x to <8 x i32>
977  %cond = icmp ugt <8 x i32> %lhs, %y
978  %sub = sub <8 x i32> %lhs, %y
979  %truncsub = trunc <8 x i32> %sub to <8 x i16>
980  %res = select <8 x i1> %cond, <8 x i16> %truncsub, <8 x i16> zeroinitializer
981  ret <8 x i16> %res
982}
983
984define <8 x i16> @test16(<8 x i16> %x, <8 x i32> %y) nounwind {
985; SSE2-LABEL: test16:
986; SSE2:       # %bb.0: # %vector.ph
987; SSE2-NEXT:    movdqa %xmm0, %xmm3
988; SSE2-NEXT:    pxor %xmm4, %xmm4
989; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3]
990; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
991; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
992; SSE2-NEXT:    movdqa %xmm3, %xmm5
993; SSE2-NEXT:    psubd %xmm2, %xmm3
994; SSE2-NEXT:    pxor %xmm4, %xmm2
995; SSE2-NEXT:    por %xmm4, %xmm5
996; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
997; SSE2-NEXT:    movdqa %xmm1, %xmm2
998; SSE2-NEXT:    pxor %xmm4, %xmm2
999; SSE2-NEXT:    por %xmm0, %xmm4
1000; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
1001; SSE2-NEXT:    packssdw %xmm5, %xmm4
1002; SSE2-NEXT:    psubd %xmm1, %xmm0
1003; SSE2-NEXT:    pslld $16, %xmm3
1004; SSE2-NEXT:    psrad $16, %xmm3
1005; SSE2-NEXT:    pslld $16, %xmm0
1006; SSE2-NEXT:    psrad $16, %xmm0
1007; SSE2-NEXT:    packssdw %xmm3, %xmm0
1008; SSE2-NEXT:    pand %xmm4, %xmm0
1009; SSE2-NEXT:    retq
1010;
1011; SSSE3-LABEL: test16:
1012; SSSE3:       # %bb.0: # %vector.ph
1013; SSSE3-NEXT:    pxor %xmm4, %xmm4
1014; SSSE3-NEXT:    movdqa %xmm0, %xmm3
1015; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3]
1016; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
1017; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
1018; SSSE3-NEXT:    movdqa %xmm0, %xmm5
1019; SSSE3-NEXT:    psubd %xmm2, %xmm0
1020; SSSE3-NEXT:    pxor %xmm4, %xmm2
1021; SSSE3-NEXT:    por %xmm4, %xmm5
1022; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm5
1023; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1024; SSSE3-NEXT:    pxor %xmm4, %xmm2
1025; SSSE3-NEXT:    por %xmm3, %xmm4
1026; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
1027; SSSE3-NEXT:    packssdw %xmm5, %xmm4
1028; SSSE3-NEXT:    psubd %xmm1, %xmm3
1029; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1030; SSSE3-NEXT:    pshufb %xmm1, %xmm0
1031; SSSE3-NEXT:    pshufb %xmm1, %xmm3
1032; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]
1033; SSSE3-NEXT:    pand %xmm4, %xmm3
1034; SSSE3-NEXT:    movdqa %xmm3, %xmm0
1035; SSSE3-NEXT:    retq
1036;
1037; SSE41-LABEL: test16:
1038; SSE41:       # %bb.0: # %vector.ph
1039; SSE41-NEXT:    pxor %xmm4, %xmm4
1040; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1041; SSE41-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
1042; SSE41-NEXT:    movdqa %xmm2, %xmm4
1043; SSE41-NEXT:    pmaxud %xmm0, %xmm4
1044; SSE41-NEXT:    pcmpeqd %xmm2, %xmm4
1045; SSE41-NEXT:    pcmpeqd %xmm5, %xmm5
1046; SSE41-NEXT:    pxor %xmm5, %xmm4
1047; SSE41-NEXT:    movdqa %xmm1, %xmm6
1048; SSE41-NEXT:    pmaxud %xmm3, %xmm6
1049; SSE41-NEXT:    pcmpeqd %xmm1, %xmm6
1050; SSE41-NEXT:    pxor %xmm6, %xmm5
1051; SSE41-NEXT:    packssdw %xmm4, %xmm5
1052; SSE41-NEXT:    psubd %xmm1, %xmm3
1053; SSE41-NEXT:    psubd %xmm2, %xmm0
1054; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1055; SSE41-NEXT:    pshufb %xmm1, %xmm0
1056; SSE41-NEXT:    pshufb %xmm1, %xmm3
1057; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]
1058; SSE41-NEXT:    pand %xmm5, %xmm3
1059; SSE41-NEXT:    movdqa %xmm3, %xmm0
1060; SSE41-NEXT:    retq
1061;
1062; AVX1-LABEL: test16:
1063; AVX1:       # %bb.0: # %vector.ph
1064; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1065; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm2 = xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
1066; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1067; AVX1-NEXT:    vpmaxud %xmm0, %xmm1, %xmm3
1068; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm3
1069; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
1070; AVX1-NEXT:    vpmaxud %xmm2, %xmm4, %xmm5
1071; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm4, %xmm5
1072; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
1073; AVX1-NEXT:    vpandn %xmm0, %xmm3, %xmm0
1074; AVX1-NEXT:    vpsubd %xmm4, %xmm2, %xmm1
1075; AVX1-NEXT:    vpandn %xmm1, %xmm5, %xmm1
1076; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1077; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1078; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1079; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1080; AVX1-NEXT:    vzeroupper
1081; AVX1-NEXT:    retq
1082;
1083; AVX2-LABEL: test16:
1084; AVX2:       # %bb.0: # %vector.ph
1085; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1086; AVX2-NEXT:    vpmaxud %ymm0, %ymm1, %ymm2
1087; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm1, %ymm2
1088; AVX2-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
1089; AVX2-NEXT:    vpandn %ymm0, %ymm2, %ymm0
1090; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
1091; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
1092; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1093; AVX2-NEXT:    vzeroupper
1094; AVX2-NEXT:    retq
1095;
1096; AVX512-LABEL: test16:
1097; AVX512:       # %bb.0: # %vector.ph
1098; AVX512-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1099; AVX512-NEXT:    vpcmpltud %ymm0, %ymm1, %k1
1100; AVX512-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
1101; AVX512-NEXT:    vpmovdw %ymm0, %xmm0 {%k1} {z}
1102; AVX512-NEXT:    vzeroupper
1103; AVX512-NEXT:    retq
1104vector.ph:
1105  %lhs = zext <8 x i16> %x to <8 x i32>
1106  %cond = icmp ult <8 x i32> %y, %lhs
1107  %sub = sub <8 x i32> %lhs, %y
1108  %truncsub = trunc <8 x i32> %sub to <8 x i16>
1109  %res = select <8 x i1> %cond, <8 x i16> %truncsub, <8 x i16> zeroinitializer
1110  ret <8 x i16> %res
1111}
1112
1113define <64 x i8> @test17(<64 x i8> %x, i8 zeroext %w) nounwind {
1114; SSE2-LABEL: test17:
1115; SSE2:       # %bb.0: # %vector.ph
1116; SSE2-NEXT:    movd %edi, %xmm4
1117; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1118; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[0,0,2,3,4,5,6,7]
1119; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,0,0,0]
1120; SSE2-NEXT:    psubusb %xmm4, %xmm0
1121; SSE2-NEXT:    psubusb %xmm4, %xmm1
1122; SSE2-NEXT:    psubusb %xmm4, %xmm2
1123; SSE2-NEXT:    psubusb %xmm4, %xmm3
1124; SSE2-NEXT:    retq
1125;
1126; SSSE3-LABEL: test17:
1127; SSSE3:       # %bb.0: # %vector.ph
1128; SSSE3-NEXT:    movd %edi, %xmm4
1129; SSSE3-NEXT:    pxor %xmm5, %xmm5
1130; SSSE3-NEXT:    pshufb %xmm5, %xmm4
1131; SSSE3-NEXT:    psubusb %xmm4, %xmm0
1132; SSSE3-NEXT:    psubusb %xmm4, %xmm1
1133; SSSE3-NEXT:    psubusb %xmm4, %xmm2
1134; SSSE3-NEXT:    psubusb %xmm4, %xmm3
1135; SSSE3-NEXT:    retq
1136;
1137; SSE41-LABEL: test17:
1138; SSE41:       # %bb.0: # %vector.ph
1139; SSE41-NEXT:    movd %edi, %xmm4
1140; SSE41-NEXT:    pxor %xmm5, %xmm5
1141; SSE41-NEXT:    pshufb %xmm5, %xmm4
1142; SSE41-NEXT:    psubusb %xmm4, %xmm0
1143; SSE41-NEXT:    psubusb %xmm4, %xmm1
1144; SSE41-NEXT:    psubusb %xmm4, %xmm2
1145; SSE41-NEXT:    psubusb %xmm4, %xmm3
1146; SSE41-NEXT:    retq
1147;
1148; AVX1-LABEL: test17:
1149; AVX1:       # %bb.0: # %vector.ph
1150; AVX1-NEXT:    vmovd %edi, %xmm2
1151; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1152; AVX1-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
1153; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1154; AVX1-NEXT:    vpsubusb %xmm2, %xmm3, %xmm3
1155; AVX1-NEXT:    vpsubusb %xmm2, %xmm0, %xmm0
1156; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
1157; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1158; AVX1-NEXT:    vpsubusb %xmm2, %xmm3, %xmm3
1159; AVX1-NEXT:    vpsubusb %xmm2, %xmm1, %xmm1
1160; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1161; AVX1-NEXT:    retq
1162;
1163; AVX2-LABEL: test17:
1164; AVX2:       # %bb.0: # %vector.ph
1165; AVX2-NEXT:    vmovd %edi, %xmm2
1166; AVX2-NEXT:    vpbroadcastb %xmm2, %ymm2
1167; AVX2-NEXT:    vpsubusb %ymm2, %ymm0, %ymm0
1168; AVX2-NEXT:    vpsubusb %ymm2, %ymm1, %ymm1
1169; AVX2-NEXT:    retq
1170;
1171; AVX512-LABEL: test17:
1172; AVX512:       # %bb.0: # %vector.ph
1173; AVX512-NEXT:    vpbroadcastb %edi, %zmm1
1174; AVX512-NEXT:    vpsubusb %zmm1, %zmm0, %zmm0
1175; AVX512-NEXT:    retq
1176vector.ph:
1177  %0 = insertelement <64 x i8> undef, i8 %w, i32 0
1178  %broadcast15 = shufflevector <64 x i8> %0, <64 x i8> undef, <64 x i32> zeroinitializer
1179  %1 = icmp ult <64 x i8> %x, %broadcast15
1180  %2 = sub <64 x i8> %x, %broadcast15
1181  %res = select <64 x i1> %1, <64 x i8> zeroinitializer, <64 x i8> %2
1182  ret <64 x i8> %res
1183}
1184
1185define <32 x i16> @test18(<32 x i16> %x, i16 zeroext %w) nounwind {
1186; SSE-LABEL: test18:
1187; SSE:       # %bb.0: # %vector.ph
1188; SSE-NEXT:    movd %edi, %xmm4
1189; SSE-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[0,0,2,3,4,5,6,7]
1190; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,0,0,0]
1191; SSE-NEXT:    psubusw %xmm4, %xmm0
1192; SSE-NEXT:    psubusw %xmm4, %xmm1
1193; SSE-NEXT:    psubusw %xmm4, %xmm2
1194; SSE-NEXT:    psubusw %xmm4, %xmm3
1195; SSE-NEXT:    retq
1196;
1197; AVX1-LABEL: test18:
1198; AVX1:       # %bb.0: # %vector.ph
1199; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1200; AVX1-NEXT:    vmovd %edi, %xmm3
1201; AVX1-NEXT:    vpshuflw {{.*#+}} xmm3 = xmm3[0,0,2,3,4,5,6,7]
1202; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[0,0,0,0]
1203; AVX1-NEXT:    vpsubusw %xmm3, %xmm2, %xmm2
1204; AVX1-NEXT:    vpsubusw %xmm3, %xmm0, %xmm0
1205; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1206; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1207; AVX1-NEXT:    vpsubusw %xmm3, %xmm2, %xmm2
1208; AVX1-NEXT:    vpsubusw %xmm3, %xmm1, %xmm1
1209; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1210; AVX1-NEXT:    retq
1211;
1212; AVX2-LABEL: test18:
1213; AVX2:       # %bb.0: # %vector.ph
1214; AVX2-NEXT:    vmovd %edi, %xmm2
1215; AVX2-NEXT:    vpbroadcastw %xmm2, %ymm2
1216; AVX2-NEXT:    vpsubusw %ymm2, %ymm0, %ymm0
1217; AVX2-NEXT:    vpsubusw %ymm2, %ymm1, %ymm1
1218; AVX2-NEXT:    retq
1219;
1220; AVX512-LABEL: test18:
1221; AVX512:       # %bb.0: # %vector.ph
1222; AVX512-NEXT:    vpbroadcastw %edi, %zmm1
1223; AVX512-NEXT:    vpsubusw %zmm1, %zmm0, %zmm0
1224; AVX512-NEXT:    retq
1225vector.ph:
1226  %0 = insertelement <32 x i16> undef, i16 %w, i32 0
1227  %broadcast15 = shufflevector <32 x i16> %0, <32 x i16> undef, <32 x i32> zeroinitializer
1228  %1 = icmp ult <32 x i16> %x, %broadcast15
1229  %2 = sub <32 x i16> %x, %broadcast15
1230  %res = select <32 x i1> %1, <32 x i16> zeroinitializer, <32 x i16> %2
1231  ret <32 x i16> %res
1232}
1233
1234define <8 x i16> @psubus_8i16_max(<8 x i16> %x, <8 x i16> %y) nounwind {
1235; SSE-LABEL: psubus_8i16_max:
1236; SSE:       # %bb.0: # %vector.ph
1237; SSE-NEXT:    psubusw %xmm1, %xmm0
1238; SSE-NEXT:    retq
1239;
1240; AVX-LABEL: psubus_8i16_max:
1241; AVX:       # %bb.0: # %vector.ph
1242; AVX-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
1243; AVX-NEXT:    retq
1244vector.ph:
1245  %cmp = icmp ult <8 x i16> %x, %y
1246  %max = select <8 x i1> %cmp, <8 x i16> %y, <8 x i16> %x
1247  %res = sub <8 x i16> %max, %y
1248  ret <8 x i16> %res
1249}
1250
1251define <16 x i8> @psubus_16i8_max(<16 x i8> %x, <16 x i8> %y) nounwind {
1252; SSE-LABEL: psubus_16i8_max:
1253; SSE:       # %bb.0: # %vector.ph
1254; SSE-NEXT:    psubusb %xmm1, %xmm0
1255; SSE-NEXT:    retq
1256;
1257; AVX-LABEL: psubus_16i8_max:
1258; AVX:       # %bb.0: # %vector.ph
1259; AVX-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
1260; AVX-NEXT:    retq
1261vector.ph:
1262  %cmp = icmp ult <16 x i8> %x, %y
1263  %max = select <16 x i1> %cmp, <16 x i8> %y, <16 x i8> %x
1264  %res = sub <16 x i8> %max, %y
1265  ret <16 x i8> %res
1266}
1267
1268define <16 x i16> @psubus_16i16_max(<16 x i16> %x, <16 x i16> %y) nounwind {
1269; SSE-LABEL: psubus_16i16_max:
1270; SSE:       # %bb.0: # %vector.ph
1271; SSE-NEXT:    psubusw %xmm2, %xmm0
1272; SSE-NEXT:    psubusw %xmm3, %xmm1
1273; SSE-NEXT:    retq
1274;
1275; AVX1-LABEL: psubus_16i16_max:
1276; AVX1:       # %bb.0: # %vector.ph
1277; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1278; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1279; AVX1-NEXT:    vpsubusw %xmm2, %xmm3, %xmm2
1280; AVX1-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
1281; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1282; AVX1-NEXT:    retq
1283;
1284; AVX2-LABEL: psubus_16i16_max:
1285; AVX2:       # %bb.0: # %vector.ph
1286; AVX2-NEXT:    vpsubusw %ymm1, %ymm0, %ymm0
1287; AVX2-NEXT:    retq
1288;
1289; AVX512-LABEL: psubus_16i16_max:
1290; AVX512:       # %bb.0: # %vector.ph
1291; AVX512-NEXT:    vpsubusw %ymm1, %ymm0, %ymm0
1292; AVX512-NEXT:    retq
1293vector.ph:
1294  %cmp = icmp ult <16 x i16> %x, %y
1295  %max = select <16 x i1> %cmp, <16 x i16> %y, <16 x i16> %x
1296  %res = sub <16 x i16> %max, %y
1297  ret <16 x i16> %res
1298}
1299
1300define <32 x i16> @psubus_32i16_max(<32 x i16> %x, <32 x i16> %y) nounwind {
1301; SSE-LABEL: psubus_32i16_max:
1302; SSE:       # %bb.0: # %vector.ph
1303; SSE-NEXT:    psubusw %xmm4, %xmm0
1304; SSE-NEXT:    psubusw %xmm5, %xmm1
1305; SSE-NEXT:    psubusw %xmm6, %xmm2
1306; SSE-NEXT:    psubusw %xmm7, %xmm3
1307; SSE-NEXT:    retq
1308;
1309; AVX1-LABEL: psubus_32i16_max:
1310; AVX1:       # %bb.0: # %vector.ph
1311; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1312; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1313; AVX1-NEXT:    vpsubusw %xmm4, %xmm5, %xmm4
1314; AVX1-NEXT:    vpsubusw %xmm2, %xmm0, %xmm0
1315; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
1316; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
1317; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
1318; AVX1-NEXT:    vpsubusw %xmm2, %xmm4, %xmm2
1319; AVX1-NEXT:    vpsubusw %xmm3, %xmm1, %xmm1
1320; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1321; AVX1-NEXT:    retq
1322;
1323; AVX2-LABEL: psubus_32i16_max:
1324; AVX2:       # %bb.0: # %vector.ph
1325; AVX2-NEXT:    vpsubusw %ymm2, %ymm0, %ymm0
1326; AVX2-NEXT:    vpsubusw %ymm3, %ymm1, %ymm1
1327; AVX2-NEXT:    retq
1328;
1329; AVX512-LABEL: psubus_32i16_max:
1330; AVX512:       # %bb.0: # %vector.ph
1331; AVX512-NEXT:    vpsubusw %zmm1, %zmm0, %zmm0
1332; AVX512-NEXT:    retq
1333vector.ph:
1334  %cmp = icmp ult <32 x i16> %x, %y
1335  %max = select <32 x i1> %cmp, <32 x i16> %y, <32 x i16> %x
1336  %res = sub <32 x i16> %max, %y
1337  ret <32 x i16> %res
1338}
1339
1340define <64 x i8> @psubus_64i8_max(<64 x i8> %x, <64 x i8> %y) nounwind {
1341; SSE-LABEL: psubus_64i8_max:
1342; SSE:       # %bb.0: # %vector.ph
1343; SSE-NEXT:    psubusb %xmm4, %xmm0
1344; SSE-NEXT:    psubusb %xmm5, %xmm1
1345; SSE-NEXT:    psubusb %xmm6, %xmm2
1346; SSE-NEXT:    psubusb %xmm7, %xmm3
1347; SSE-NEXT:    retq
1348;
1349; AVX1-LABEL: psubus_64i8_max:
1350; AVX1:       # %bb.0: # %vector.ph
1351; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1352; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1353; AVX1-NEXT:    vpsubusb %xmm4, %xmm5, %xmm4
1354; AVX1-NEXT:    vpsubusb %xmm2, %xmm0, %xmm0
1355; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
1356; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
1357; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
1358; AVX1-NEXT:    vpsubusb %xmm2, %xmm4, %xmm2
1359; AVX1-NEXT:    vpsubusb %xmm3, %xmm1, %xmm1
1360; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1361; AVX1-NEXT:    retq
1362;
1363; AVX2-LABEL: psubus_64i8_max:
1364; AVX2:       # %bb.0: # %vector.ph
1365; AVX2-NEXT:    vpsubusb %ymm2, %ymm0, %ymm0
1366; AVX2-NEXT:    vpsubusb %ymm3, %ymm1, %ymm1
1367; AVX2-NEXT:    retq
1368;
1369; AVX512-LABEL: psubus_64i8_max:
1370; AVX512:       # %bb.0: # %vector.ph
1371; AVX512-NEXT:    vpsubusb %zmm1, %zmm0, %zmm0
1372; AVX512-NEXT:    retq
1373vector.ph:
1374  %cmp = icmp ult <64 x i8> %x, %y
1375  %max = select <64 x i1> %cmp, <64 x i8> %y, <64 x i8> %x
1376  %res = sub <64 x i8> %max, %y
1377  ret <64 x i8> %res
1378}
1379
1380define <32 x i8> @psubus_32i8_max(<32 x i8> %x, <32 x i8> %y) nounwind {
1381; SSE-LABEL: psubus_32i8_max:
1382; SSE:       # %bb.0: # %vector.ph
1383; SSE-NEXT:    psubusb %xmm2, %xmm0
1384; SSE-NEXT:    psubusb %xmm3, %xmm1
1385; SSE-NEXT:    retq
1386;
1387; AVX1-LABEL: psubus_32i8_max:
1388; AVX1:       # %bb.0: # %vector.ph
1389; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1390; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1391; AVX1-NEXT:    vpsubusb %xmm2, %xmm3, %xmm2
1392; AVX1-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
1393; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1394; AVX1-NEXT:    retq
1395;
1396; AVX2-LABEL: psubus_32i8_max:
1397; AVX2:       # %bb.0: # %vector.ph
1398; AVX2-NEXT:    vpsubusb %ymm1, %ymm0, %ymm0
1399; AVX2-NEXT:    retq
1400;
1401; AVX512-LABEL: psubus_32i8_max:
1402; AVX512:       # %bb.0: # %vector.ph
1403; AVX512-NEXT:    vpsubusb %ymm1, %ymm0, %ymm0
1404; AVX512-NEXT:    retq
1405vector.ph:
1406  %cmp = icmp ult <32 x i8> %x, %y
1407  %max = select <32 x i1> %cmp, <32 x i8> %y, <32 x i8> %x
1408  %res = sub <32 x i8> %max, %y
1409  ret <32 x i8> %res
1410}
1411
1412define <8 x i16> @psubus_8i32_max(<8 x i16> %x, <8 x i32> %y) nounwind {
1413; SSE2-LABEL: psubus_8i32_max:
1414; SSE2:       # %bb.0: # %vector.ph
1415; SSE2-NEXT:    movdqa %xmm0, %xmm3
1416; SSE2-NEXT:    pxor %xmm4, %xmm4
1417; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3]
1418; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
1419; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]
1420; SSE2-NEXT:    movdqa %xmm2, %xmm6
1421; SSE2-NEXT:    pxor %xmm5, %xmm6
1422; SSE2-NEXT:    movdqa %xmm3, %xmm4
1423; SSE2-NEXT:    por %xmm5, %xmm4
1424; SSE2-NEXT:    pcmpgtd %xmm6, %xmm4
1425; SSE2-NEXT:    pand %xmm4, %xmm3
1426; SSE2-NEXT:    pandn %xmm2, %xmm4
1427; SSE2-NEXT:    por %xmm3, %xmm4
1428; SSE2-NEXT:    movdqa %xmm1, %xmm3
1429; SSE2-NEXT:    pxor %xmm5, %xmm3
1430; SSE2-NEXT:    por %xmm0, %xmm5
1431; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
1432; SSE2-NEXT:    pand %xmm5, %xmm0
1433; SSE2-NEXT:    pandn %xmm1, %xmm5
1434; SSE2-NEXT:    por %xmm5, %xmm0
1435; SSE2-NEXT:    psubd %xmm1, %xmm0
1436; SSE2-NEXT:    psubd %xmm2, %xmm4
1437; SSE2-NEXT:    pslld $16, %xmm4
1438; SSE2-NEXT:    psrad $16, %xmm4
1439; SSE2-NEXT:    pslld $16, %xmm0
1440; SSE2-NEXT:    psrad $16, %xmm0
1441; SSE2-NEXT:    packssdw %xmm4, %xmm0
1442; SSE2-NEXT:    retq
1443;
1444; SSSE3-LABEL: psubus_8i32_max:
1445; SSSE3:       # %bb.0: # %vector.ph
1446; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1447; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
1448; SSSE3-NEXT:    movdqa %xmm2, %xmm5
1449; SSSE3-NEXT:    pxor %xmm4, %xmm5
1450; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [2147549183,2147549183,2147549183,2147549183]
1451; SSSE3-NEXT:    movdqa %xmm6, %xmm7
1452; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm7
1453; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [65535,65535,65535,65535]
1454; SSSE3-NEXT:    pand %xmm7, %xmm2
1455; SSSE3-NEXT:    pandn %xmm5, %xmm7
1456; SSSE3-NEXT:    por %xmm2, %xmm7
1457; SSSE3-NEXT:    pshufb %xmm3, %xmm7
1458; SSSE3-NEXT:    pxor %xmm1, %xmm4
1459; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
1460; SSSE3-NEXT:    pand %xmm6, %xmm1
1461; SSSE3-NEXT:    pandn %xmm5, %xmm6
1462; SSSE3-NEXT:    por %xmm1, %xmm6
1463; SSSE3-NEXT:    pshufb %xmm3, %xmm6
1464; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm6 = xmm6[0],xmm7[0]
1465; SSSE3-NEXT:    psubusw %xmm6, %xmm0
1466; SSSE3-NEXT:    retq
1467;
1468; SSE41-LABEL: psubus_8i32_max:
1469; SSE41:       # %bb.0: # %vector.ph
1470; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [65535,65535,65535,65535]
1471; SSE41-NEXT:    pminud %xmm3, %xmm2
1472; SSE41-NEXT:    pminud %xmm3, %xmm1
1473; SSE41-NEXT:    packusdw %xmm2, %xmm1
1474; SSE41-NEXT:    psubusw %xmm1, %xmm0
1475; SSE41-NEXT:    retq
1476;
1477; AVX1-LABEL: psubus_8i32_max:
1478; AVX1:       # %bb.0: # %vector.ph
1479; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1480; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [65535,65535,65535,65535]
1481; AVX1-NEXT:    vpminud %xmm3, %xmm2, %xmm2
1482; AVX1-NEXT:    vpminud %xmm3, %xmm1, %xmm1
1483; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
1484; AVX1-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
1485; AVX1-NEXT:    vzeroupper
1486; AVX1-NEXT:    retq
1487;
1488; AVX2-LABEL: psubus_8i32_max:
1489; AVX2:       # %bb.0: # %vector.ph
1490; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535]
1491; AVX2-NEXT:    vpminud %ymm2, %ymm1, %ymm1
1492; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
1493; AVX2-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
1494; AVX2-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
1495; AVX2-NEXT:    vzeroupper
1496; AVX2-NEXT:    retq
1497;
1498; AVX512-LABEL: psubus_8i32_max:
1499; AVX512:       # %bb.0: # %vector.ph
1500; AVX512-NEXT:    vpmovusdw %ymm1, %xmm1
1501; AVX512-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
1502; AVX512-NEXT:    vzeroupper
1503; AVX512-NEXT:    retq
1504vector.ph:
1505  %lhs = zext <8 x i16> %x to <8 x i32>
1506  %cond = icmp ult <8 x i32> %lhs, %y
1507  %max = select <8 x i1> %cond, <8 x i32> %y, <8 x i32> %lhs
1508  %sub = sub <8 x i32> %max, %y
1509  %res = trunc <8 x i32> %sub to <8 x i16>
1510  ret <8 x i16> %res
1511}
1512
1513define <8 x i16> @psubus_8i64_max(<8 x i16> %x, <8 x i64> %y) nounwind {
1514; SSE2-LABEL: psubus_8i64_max:
1515; SSE2:       # %bb.0: # %vector.ph
1516; SSE2-NEXT:    pxor %xmm5, %xmm5
1517; SSE2-NEXT:    movdqa %xmm0, %xmm10
1518; SSE2-NEXT:    punpckhwd {{.*#+}} xmm10 = xmm10[4],xmm5[4],xmm10[5],xmm5[5],xmm10[6],xmm5[6],xmm10[7],xmm5[7]
1519; SSE2-NEXT:    movdqa %xmm10, %xmm8
1520; SSE2-NEXT:    punpckldq {{.*#+}} xmm8 = xmm8[0],xmm5[0],xmm8[1],xmm5[1]
1521; SSE2-NEXT:    punpckhdq {{.*#+}} xmm10 = xmm10[2],xmm5[2],xmm10[3],xmm5[3]
1522; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1],xmm0[2],xmm5[2],xmm0[3],xmm5[3]
1523; SSE2-NEXT:    movdqa %xmm0, %xmm9
1524; SSE2-NEXT:    punpckldq {{.*#+}} xmm9 = xmm9[0],xmm5[0],xmm9[1],xmm5[1]
1525; SSE2-NEXT:    punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm5[2],xmm0[3],xmm5[3]
1526; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [9223372039002259456,9223372039002259456]
1527; SSE2-NEXT:    movdqa %xmm2, %xmm6
1528; SSE2-NEXT:    pxor %xmm11, %xmm6
1529; SSE2-NEXT:    movdqa %xmm0, %xmm7
1530; SSE2-NEXT:    por %xmm11, %xmm7
1531; SSE2-NEXT:    movdqa %xmm7, %xmm5
1532; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
1533; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm5[0,0,2,2]
1534; SSE2-NEXT:    pcmpeqd %xmm6, %xmm7
1535; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1536; SSE2-NEXT:    pand %xmm12, %xmm7
1537; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm5[1,1,3,3]
1538; SSE2-NEXT:    por %xmm7, %xmm13
1539; SSE2-NEXT:    pand %xmm13, %xmm0
1540; SSE2-NEXT:    pandn %xmm2, %xmm13
1541; SSE2-NEXT:    por %xmm0, %xmm13
1542; SSE2-NEXT:    movdqa %xmm1, %xmm0
1543; SSE2-NEXT:    pxor %xmm11, %xmm0
1544; SSE2-NEXT:    movdqa %xmm9, %xmm5
1545; SSE2-NEXT:    por %xmm11, %xmm5
1546; SSE2-NEXT:    movdqa %xmm5, %xmm7
1547; SSE2-NEXT:    pcmpgtd %xmm0, %xmm7
1548; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm7[0,0,2,2]
1549; SSE2-NEXT:    pcmpeqd %xmm0, %xmm5
1550; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1551; SSE2-NEXT:    pand %xmm12, %xmm5
1552; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
1553; SSE2-NEXT:    por %xmm5, %xmm0
1554; SSE2-NEXT:    pand %xmm0, %xmm9
1555; SSE2-NEXT:    pandn %xmm1, %xmm0
1556; SSE2-NEXT:    por %xmm9, %xmm0
1557; SSE2-NEXT:    movdqa %xmm4, %xmm5
1558; SSE2-NEXT:    pxor %xmm11, %xmm5
1559; SSE2-NEXT:    movdqa %xmm10, %xmm7
1560; SSE2-NEXT:    por %xmm11, %xmm7
1561; SSE2-NEXT:    movdqa %xmm7, %xmm6
1562; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
1563; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm6[0,0,2,2]
1564; SSE2-NEXT:    pcmpeqd %xmm5, %xmm7
1565; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1566; SSE2-NEXT:    pand %xmm9, %xmm5
1567; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
1568; SSE2-NEXT:    por %xmm5, %xmm7
1569; SSE2-NEXT:    pand %xmm7, %xmm10
1570; SSE2-NEXT:    pandn %xmm4, %xmm7
1571; SSE2-NEXT:    por %xmm10, %xmm7
1572; SSE2-NEXT:    movdqa %xmm3, %xmm5
1573; SSE2-NEXT:    pxor %xmm11, %xmm5
1574; SSE2-NEXT:    por %xmm8, %xmm11
1575; SSE2-NEXT:    movdqa %xmm11, %xmm6
1576; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
1577; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm6[0,0,2,2]
1578; SSE2-NEXT:    pcmpeqd %xmm5, %xmm11
1579; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm11[1,1,3,3]
1580; SSE2-NEXT:    pand %xmm9, %xmm5
1581; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1582; SSE2-NEXT:    por %xmm5, %xmm6
1583; SSE2-NEXT:    pand %xmm6, %xmm8
1584; SSE2-NEXT:    pandn %xmm3, %xmm6
1585; SSE2-NEXT:    por %xmm8, %xmm6
1586; SSE2-NEXT:    psubq %xmm3, %xmm6
1587; SSE2-NEXT:    psubq %xmm4, %xmm7
1588; SSE2-NEXT:    psubq %xmm1, %xmm0
1589; SSE2-NEXT:    psubq %xmm2, %xmm13
1590; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm13[0,2,2,3]
1591; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1592; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1593; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm0[0,2,2,3,4,5,6,7]
1594; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
1595; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,2,2,3]
1596; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7]
1597; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,2,2,3]
1598; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
1599; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1600; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
1601; SSE2-NEXT:    retq
1602;
1603; SSSE3-LABEL: psubus_8i64_max:
1604; SSSE3:       # %bb.0: # %vector.ph
1605; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
1606; SSSE3-NEXT:    movdqa %xmm2, %xmm7
1607; SSSE3-NEXT:    pxor %xmm5, %xmm7
1608; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [9223372039002324991,9223372039002324991]
1609; SSSE3-NEXT:    movdqa %xmm8, %xmm6
1610; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm6
1611; SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm6[0,0,2,2]
1612; SSSE3-NEXT:    pcmpeqd %xmm8, %xmm7
1613; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1614; SSSE3-NEXT:    pand %xmm9, %xmm7
1615; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1616; SSSE3-NEXT:    por %xmm7, %xmm6
1617; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [65535,65535]
1618; SSSE3-NEXT:    pand %xmm6, %xmm2
1619; SSSE3-NEXT:    pandn %xmm9, %xmm6
1620; SSSE3-NEXT:    por %xmm2, %xmm6
1621; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[0,2,2,3]
1622; SSSE3-NEXT:    pshuflw {{.*#+}} xmm10 = xmm2[0,2,2,3,4,5,6,7]
1623; SSSE3-NEXT:    movdqa %xmm1, %xmm6
1624; SSSE3-NEXT:    pxor %xmm5, %xmm6
1625; SSSE3-NEXT:    movdqa %xmm8, %xmm7
1626; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm7
1627; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm7[0,0,2,2]
1628; SSSE3-NEXT:    pcmpeqd %xmm8, %xmm6
1629; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1630; SSSE3-NEXT:    pand %xmm2, %xmm6
1631; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]
1632; SSSE3-NEXT:    por %xmm6, %xmm2
1633; SSSE3-NEXT:    pand %xmm2, %xmm1
1634; SSSE3-NEXT:    pandn %xmm9, %xmm2
1635; SSSE3-NEXT:    por %xmm1, %xmm2
1636; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
1637; SSSE3-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1638; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm10[0],xmm1[1],xmm10[1]
1639; SSSE3-NEXT:    movdqa %xmm4, %xmm2
1640; SSSE3-NEXT:    pxor %xmm5, %xmm2
1641; SSSE3-NEXT:    movdqa %xmm8, %xmm6
1642; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm6
1643; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1644; SSSE3-NEXT:    pcmpeqd %xmm8, %xmm2
1645; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1646; SSSE3-NEXT:    pand %xmm7, %xmm2
1647; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1648; SSSE3-NEXT:    por %xmm2, %xmm6
1649; SSSE3-NEXT:    pand %xmm6, %xmm4
1650; SSSE3-NEXT:    pandn %xmm9, %xmm6
1651; SSSE3-NEXT:    por %xmm4, %xmm6
1652; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[0,2,2,3]
1653; SSSE3-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,1,0,2,4,5,6,7]
1654; SSSE3-NEXT:    pxor %xmm3, %xmm5
1655; SSSE3-NEXT:    movdqa %xmm8, %xmm4
1656; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm4
1657; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1658; SSSE3-NEXT:    pcmpeqd %xmm8, %xmm5
1659; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1660; SSSE3-NEXT:    pand %xmm6, %xmm5
1661; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1662; SSSE3-NEXT:    por %xmm5, %xmm4
1663; SSSE3-NEXT:    pand %xmm4, %xmm3
1664; SSSE3-NEXT:    pandn %xmm9, %xmm4
1665; SSSE3-NEXT:    por %xmm3, %xmm4
1666; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[0,2,2,3]
1667; SSSE3-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,1,0,2,4,5,6,7]
1668; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
1669; SSSE3-NEXT:    movsd {{.*#+}} xmm3 = xmm1[0],xmm3[1]
1670; SSSE3-NEXT:    psubusw %xmm3, %xmm0
1671; SSSE3-NEXT:    retq
1672;
1673; SSE41-LABEL: psubus_8i64_max:
1674; SSE41:       # %bb.0: # %vector.ph
1675; SSE41-NEXT:    movdqa %xmm0, %xmm8
1676; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
1677; SSE41-NEXT:    movdqa %xmm4, %xmm0
1678; SSE41-NEXT:    pxor %xmm6, %xmm0
1679; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002324991,9223372039002324991]
1680; SSE41-NEXT:    movdqa %xmm9, %xmm7
1681; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
1682; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]
1683; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
1684; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1685; SSE41-NEXT:    pand %xmm5, %xmm0
1686; SSE41-NEXT:    por %xmm7, %xmm0
1687; SSE41-NEXT:    movapd {{.*#+}} xmm7 = [65535,65535]
1688; SSE41-NEXT:    movapd %xmm7, %xmm5
1689; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm5
1690; SSE41-NEXT:    movdqa %xmm3, %xmm0
1691; SSE41-NEXT:    pxor %xmm6, %xmm0
1692; SSE41-NEXT:    movdqa %xmm9, %xmm4
1693; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
1694; SSE41-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
1695; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
1696; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1697; SSE41-NEXT:    pand %xmm10, %xmm0
1698; SSE41-NEXT:    por %xmm4, %xmm0
1699; SSE41-NEXT:    movapd %xmm7, %xmm4
1700; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm4
1701; SSE41-NEXT:    packusdw %xmm5, %xmm4
1702; SSE41-NEXT:    movdqa %xmm2, %xmm0
1703; SSE41-NEXT:    pxor %xmm6, %xmm0
1704; SSE41-NEXT:    movdqa %xmm9, %xmm3
1705; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
1706; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
1707; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
1708; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1709; SSE41-NEXT:    pand %xmm5, %xmm0
1710; SSE41-NEXT:    por %xmm3, %xmm0
1711; SSE41-NEXT:    movapd %xmm7, %xmm3
1712; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
1713; SSE41-NEXT:    pxor %xmm1, %xmm6
1714; SSE41-NEXT:    movdqa %xmm9, %xmm2
1715; SSE41-NEXT:    pcmpgtd %xmm6, %xmm2
1716; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
1717; SSE41-NEXT:    pcmpeqd %xmm9, %xmm6
1718; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
1719; SSE41-NEXT:    pand %xmm5, %xmm0
1720; SSE41-NEXT:    por %xmm2, %xmm0
1721; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm7
1722; SSE41-NEXT:    packusdw %xmm3, %xmm7
1723; SSE41-NEXT:    packusdw %xmm4, %xmm7
1724; SSE41-NEXT:    psubusw %xmm7, %xmm8
1725; SSE41-NEXT:    movdqa %xmm8, %xmm0
1726; SSE41-NEXT:    retq
1727;
1728; AVX1-LABEL: psubus_8i64_max:
1729; AVX1:       # %bb.0: # %vector.ph
1730; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
1731; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
1732; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
1733; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [9223372036854841343,9223372036854841343]
1734; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm5, %xmm3
1735; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm6
1736; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm5, %xmm6
1737; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm6, %ymm3
1738; AVX1-NEXT:    vmovapd {{.*#+}} ymm6 = [65535,65535,65535,65535]
1739; AVX1-NEXT:    vblendvpd %ymm3, %ymm2, %ymm6, %ymm2
1740; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
1741; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
1742; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1743; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
1744; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm5, %xmm3
1745; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm4
1746; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
1747; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
1748; AVX1-NEXT:    vblendvpd %ymm3, %ymm1, %ymm6, %ymm1
1749; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1750; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
1751; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
1752; AVX1-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
1753; AVX1-NEXT:    vzeroupper
1754; AVX1-NEXT:    retq
1755;
1756; AVX2-LABEL: psubus_8i64_max:
1757; AVX2:       # %bb.0: # %vector.ph
1758; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1759; AVX2-NEXT:    vpxor %ymm3, %ymm2, %ymm4
1760; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343]
1761; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
1762; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm6 = [65535,65535,65535,65535]
1763; AVX2-NEXT:    vblendvpd %ymm4, %ymm2, %ymm6, %ymm2
1764; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm3
1765; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm5, %ymm3
1766; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm6, %ymm1
1767; AVX2-NEXT:    vpackusdw %ymm2, %ymm1, %ymm1
1768; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
1769; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
1770; AVX2-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
1771; AVX2-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
1772; AVX2-NEXT:    vzeroupper
1773; AVX2-NEXT:    retq
1774;
1775; AVX512-LABEL: psubus_8i64_max:
1776; AVX512:       # %bb.0: # %vector.ph
1777; AVX512-NEXT:    vpmovusqw %zmm1, %xmm1
1778; AVX512-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
1779; AVX512-NEXT:    vzeroupper
1780; AVX512-NEXT:    retq
1781vector.ph:
1782  %lhs = zext <8 x i16> %x to <8 x i64>
1783  %cond = icmp ult <8 x i64> %lhs, %y
1784  %max = select <8 x i1> %cond, <8 x i64> %y, <8 x i64> %lhs
1785  %sub = sub <8 x i64> %max, %y
1786  %res = trunc <8 x i64> %sub to <8 x i16>
1787  ret <8 x i16> %res
1788}
1789
1790define <16 x i16> @psubus_16i32_max(<16 x i16> %x, <16 x i32> %y) nounwind {
1791; SSE2-LABEL: psubus_16i32_max:
1792; SSE2:       # %bb.0: # %vector.ph
1793; SSE2-NEXT:    movdqa %xmm1, %xmm8
1794; SSE2-NEXT:    pxor %xmm7, %xmm7
1795; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm7[0],xmm1[1],xmm7[1],xmm1[2],xmm7[2],xmm1[3],xmm7[3]
1796; SSE2-NEXT:    punpckhwd {{.*#+}} xmm8 = xmm8[4],xmm7[4],xmm8[5],xmm7[5],xmm8[6],xmm7[6],xmm8[7],xmm7[7]
1797; SSE2-NEXT:    movdqa %xmm0, %xmm10
1798; SSE2-NEXT:    punpcklwd {{.*#+}} xmm10 = xmm10[0],xmm7[0],xmm10[1],xmm7[1],xmm10[2],xmm7[2],xmm10[3],xmm7[3]
1799; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm7[4],xmm0[5],xmm7[5],xmm0[6],xmm7[6],xmm0[7],xmm7[7]
1800; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648]
1801; SSE2-NEXT:    movdqa %xmm3, %xmm6
1802; SSE2-NEXT:    pxor %xmm7, %xmm6
1803; SSE2-NEXT:    movdqa %xmm0, %xmm9
1804; SSE2-NEXT:    por %xmm7, %xmm9
1805; SSE2-NEXT:    pcmpgtd %xmm6, %xmm9
1806; SSE2-NEXT:    pand %xmm9, %xmm0
1807; SSE2-NEXT:    pandn %xmm3, %xmm9
1808; SSE2-NEXT:    por %xmm0, %xmm9
1809; SSE2-NEXT:    movdqa %xmm2, %xmm6
1810; SSE2-NEXT:    pxor %xmm7, %xmm6
1811; SSE2-NEXT:    movdqa %xmm10, %xmm0
1812; SSE2-NEXT:    por %xmm7, %xmm0
1813; SSE2-NEXT:    pcmpgtd %xmm6, %xmm0
1814; SSE2-NEXT:    pand %xmm0, %xmm10
1815; SSE2-NEXT:    pandn %xmm2, %xmm0
1816; SSE2-NEXT:    por %xmm10, %xmm0
1817; SSE2-NEXT:    movdqa %xmm5, %xmm10
1818; SSE2-NEXT:    pxor %xmm7, %xmm10
1819; SSE2-NEXT:    movdqa %xmm8, %xmm6
1820; SSE2-NEXT:    por %xmm7, %xmm6
1821; SSE2-NEXT:    pcmpgtd %xmm10, %xmm6
1822; SSE2-NEXT:    pand %xmm6, %xmm8
1823; SSE2-NEXT:    pandn %xmm5, %xmm6
1824; SSE2-NEXT:    por %xmm8, %xmm6
1825; SSE2-NEXT:    movdqa %xmm4, %xmm8
1826; SSE2-NEXT:    pxor %xmm7, %xmm8
1827; SSE2-NEXT:    por %xmm1, %xmm7
1828; SSE2-NEXT:    pcmpgtd %xmm8, %xmm7
1829; SSE2-NEXT:    pand %xmm7, %xmm1
1830; SSE2-NEXT:    pandn %xmm4, %xmm7
1831; SSE2-NEXT:    por %xmm7, %xmm1
1832; SSE2-NEXT:    psubd %xmm4, %xmm1
1833; SSE2-NEXT:    psubd %xmm5, %xmm6
1834; SSE2-NEXT:    psubd %xmm2, %xmm0
1835; SSE2-NEXT:    psubd %xmm3, %xmm9
1836; SSE2-NEXT:    pslld $16, %xmm9
1837; SSE2-NEXT:    psrad $16, %xmm9
1838; SSE2-NEXT:    pslld $16, %xmm0
1839; SSE2-NEXT:    psrad $16, %xmm0
1840; SSE2-NEXT:    packssdw %xmm9, %xmm0
1841; SSE2-NEXT:    pslld $16, %xmm6
1842; SSE2-NEXT:    psrad $16, %xmm6
1843; SSE2-NEXT:    pslld $16, %xmm1
1844; SSE2-NEXT:    psrad $16, %xmm1
1845; SSE2-NEXT:    packssdw %xmm6, %xmm1
1846; SSE2-NEXT:    retq
1847;
1848; SSSE3-LABEL: psubus_16i32_max:
1849; SSSE3:       # %bb.0: # %vector.ph
1850; SSSE3-NEXT:    movdqa %xmm1, %xmm8
1851; SSSE3-NEXT:    pxor %xmm7, %xmm7
1852; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm7[0],xmm1[1],xmm7[1],xmm1[2],xmm7[2],xmm1[3],xmm7[3]
1853; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm8 = xmm8[4],xmm7[4],xmm8[5],xmm7[5],xmm8[6],xmm7[6],xmm8[7],xmm7[7]
1854; SSSE3-NEXT:    movdqa %xmm0, %xmm10
1855; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm10 = xmm10[0],xmm7[0],xmm10[1],xmm7[1],xmm10[2],xmm7[2],xmm10[3],xmm7[3]
1856; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm7[4],xmm0[5],xmm7[5],xmm0[6],xmm7[6],xmm0[7],xmm7[7]
1857; SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648]
1858; SSSE3-NEXT:    movdqa %xmm3, %xmm6
1859; SSSE3-NEXT:    pxor %xmm7, %xmm6
1860; SSSE3-NEXT:    movdqa %xmm0, %xmm9
1861; SSSE3-NEXT:    por %xmm7, %xmm9
1862; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm9
1863; SSSE3-NEXT:    pand %xmm9, %xmm0
1864; SSSE3-NEXT:    pandn %xmm3, %xmm9
1865; SSSE3-NEXT:    por %xmm0, %xmm9
1866; SSSE3-NEXT:    movdqa %xmm2, %xmm6
1867; SSSE3-NEXT:    pxor %xmm7, %xmm6
1868; SSSE3-NEXT:    movdqa %xmm10, %xmm0
1869; SSSE3-NEXT:    por %xmm7, %xmm0
1870; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm0
1871; SSSE3-NEXT:    pand %xmm0, %xmm10
1872; SSSE3-NEXT:    pandn %xmm2, %xmm0
1873; SSSE3-NEXT:    por %xmm10, %xmm0
1874; SSSE3-NEXT:    movdqa %xmm5, %xmm10
1875; SSSE3-NEXT:    pxor %xmm7, %xmm10
1876; SSSE3-NEXT:    movdqa %xmm8, %xmm6
1877; SSSE3-NEXT:    por %xmm7, %xmm6
1878; SSSE3-NEXT:    pcmpgtd %xmm10, %xmm6
1879; SSSE3-NEXT:    pand %xmm6, %xmm8
1880; SSSE3-NEXT:    pandn %xmm5, %xmm6
1881; SSSE3-NEXT:    por %xmm8, %xmm6
1882; SSSE3-NEXT:    movdqa %xmm4, %xmm8
1883; SSSE3-NEXT:    pxor %xmm7, %xmm8
1884; SSSE3-NEXT:    por %xmm1, %xmm7
1885; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm7
1886; SSSE3-NEXT:    pand %xmm7, %xmm1
1887; SSSE3-NEXT:    pandn %xmm4, %xmm7
1888; SSSE3-NEXT:    por %xmm7, %xmm1
1889; SSSE3-NEXT:    psubd %xmm4, %xmm1
1890; SSSE3-NEXT:    psubd %xmm5, %xmm6
1891; SSSE3-NEXT:    psubd %xmm2, %xmm0
1892; SSSE3-NEXT:    psubd %xmm3, %xmm9
1893; SSSE3-NEXT:    pslld $16, %xmm9
1894; SSSE3-NEXT:    psrad $16, %xmm9
1895; SSSE3-NEXT:    pslld $16, %xmm0
1896; SSSE3-NEXT:    psrad $16, %xmm0
1897; SSSE3-NEXT:    packssdw %xmm9, %xmm0
1898; SSSE3-NEXT:    pslld $16, %xmm6
1899; SSSE3-NEXT:    psrad $16, %xmm6
1900; SSSE3-NEXT:    pslld $16, %xmm1
1901; SSSE3-NEXT:    psrad $16, %xmm1
1902; SSSE3-NEXT:    packssdw %xmm6, %xmm1
1903; SSSE3-NEXT:    retq
1904;
1905; SSE41-LABEL: psubus_16i32_max:
1906; SSE41:       # %bb.0: # %vector.ph
1907; SSE41-NEXT:    pxor %xmm8, %xmm8
1908; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm6 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
1909; SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm8[4],xmm1[5],xmm8[5],xmm1[6],xmm8[6],xmm1[7],xmm8[7]
1910; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm7 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1911; SSE41-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm8[4],xmm0[5],xmm8[5],xmm0[6],xmm8[6],xmm0[7],xmm8[7]
1912; SSE41-NEXT:    pmaxud %xmm3, %xmm0
1913; SSE41-NEXT:    pmaxud %xmm2, %xmm7
1914; SSE41-NEXT:    pmaxud %xmm5, %xmm1
1915; SSE41-NEXT:    pmaxud %xmm4, %xmm6
1916; SSE41-NEXT:    psubd %xmm4, %xmm6
1917; SSE41-NEXT:    psubd %xmm5, %xmm1
1918; SSE41-NEXT:    psubd %xmm2, %xmm7
1919; SSE41-NEXT:    psubd %xmm3, %xmm0
1920; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm8[1],xmm0[2],xmm8[3],xmm0[4],xmm8[5],xmm0[6],xmm8[7]
1921; SSE41-NEXT:    pblendw {{.*#+}} xmm7 = xmm7[0],xmm8[1],xmm7[2],xmm8[3],xmm7[4],xmm8[5],xmm7[6],xmm8[7]
1922; SSE41-NEXT:    packusdw %xmm0, %xmm7
1923; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0],xmm8[1],xmm1[2],xmm8[3],xmm1[4],xmm8[5],xmm1[6],xmm8[7]
1924; SSE41-NEXT:    pblendw {{.*#+}} xmm6 = xmm6[0],xmm8[1],xmm6[2],xmm8[3],xmm6[4],xmm8[5],xmm6[6],xmm8[7]
1925; SSE41-NEXT:    packusdw %xmm1, %xmm6
1926; SSE41-NEXT:    movdqa %xmm7, %xmm0
1927; SSE41-NEXT:    movdqa %xmm6, %xmm1
1928; SSE41-NEXT:    retq
1929;
1930; AVX1-LABEL: psubus_16i32_max:
1931; AVX1:       # %bb.0: # %vector.ph
1932; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1933; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [65535,65535,65535,65535]
1934; AVX1-NEXT:    vpminud %xmm4, %xmm3, %xmm3
1935; AVX1-NEXT:    vpminud %xmm4, %xmm1, %xmm1
1936; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
1937; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
1938; AVX1-NEXT:    vpminud %xmm4, %xmm3, %xmm3
1939; AVX1-NEXT:    vpminud %xmm4, %xmm2, %xmm2
1940; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
1941; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1942; AVX1-NEXT:    vpsubusw %xmm2, %xmm3, %xmm2
1943; AVX1-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
1944; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1945; AVX1-NEXT:    retq
1946;
1947; AVX2-LABEL: psubus_16i32_max:
1948; AVX2:       # %bb.0: # %vector.ph
1949; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [65535,65535,65535,65535,65535,65535,65535,65535]
1950; AVX2-NEXT:    vpminud %ymm3, %ymm1, %ymm1
1951; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm4
1952; AVX2-NEXT:    vpackusdw %xmm4, %xmm1, %xmm1
1953; AVX2-NEXT:    vpminud %ymm3, %ymm2, %ymm2
1954; AVX2-NEXT:    vextracti128 $1, %ymm2, %xmm3
1955; AVX2-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
1956; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
1957; AVX2-NEXT:    vpsubusw %xmm2, %xmm3, %xmm2
1958; AVX2-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
1959; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
1960; AVX2-NEXT:    retq
1961;
1962; AVX512-LABEL: psubus_16i32_max:
1963; AVX512:       # %bb.0: # %vector.ph
1964; AVX512-NEXT:    vpmovusdw %zmm1, %ymm1
1965; AVX512-NEXT:    vpsubusw %ymm1, %ymm0, %ymm0
1966; AVX512-NEXT:    retq
1967vector.ph:
1968  %lhs = zext <16 x i16> %x to <16 x i32>
1969  %cond = icmp ult <16 x i32> %lhs, %y
1970  %max = select <16 x i1> %cond, <16 x i32> %y, <16 x i32> %lhs
1971  %sub = sub <16 x i32> %max, %y
1972  %res = trunc <16 x i32> %sub to <16 x i16>
1973  ret <16 x i16> %res
1974}
1975
1976define <8 x i16> @psubus_i16_i32_max_swapped(<8 x i16> %x, <8 x i32> %y) nounwind {
1977; SSE2-LABEL: psubus_i16_i32_max_swapped:
1978; SSE2:       # %bb.0: # %vector.ph
1979; SSE2-NEXT:    pxor %xmm3, %xmm3
1980; SSE2-NEXT:    movdqa %xmm0, %xmm4
1981; SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]
1982; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
1983; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]
1984; SSE2-NEXT:    movdqa %xmm2, %xmm3
1985; SSE2-NEXT:    pxor %xmm5, %xmm3
1986; SSE2-NEXT:    movdqa %xmm0, %xmm6
1987; SSE2-NEXT:    por %xmm5, %xmm6
1988; SSE2-NEXT:    pcmpgtd %xmm6, %xmm3
1989; SSE2-NEXT:    movdqa %xmm2, %xmm6
1990; SSE2-NEXT:    pand %xmm3, %xmm6
1991; SSE2-NEXT:    pandn %xmm0, %xmm3
1992; SSE2-NEXT:    por %xmm6, %xmm3
1993; SSE2-NEXT:    movdqa %xmm1, %xmm0
1994; SSE2-NEXT:    pxor %xmm5, %xmm0
1995; SSE2-NEXT:    por %xmm4, %xmm5
1996; SSE2-NEXT:    pcmpgtd %xmm5, %xmm0
1997; SSE2-NEXT:    movdqa %xmm1, %xmm5
1998; SSE2-NEXT:    pand %xmm0, %xmm5
1999; SSE2-NEXT:    pandn %xmm4, %xmm0
2000; SSE2-NEXT:    por %xmm5, %xmm0
2001; SSE2-NEXT:    psubd %xmm1, %xmm0
2002; SSE2-NEXT:    psubd %xmm2, %xmm3
2003; SSE2-NEXT:    pslld $16, %xmm3
2004; SSE2-NEXT:    psrad $16, %xmm3
2005; SSE2-NEXT:    pslld $16, %xmm0
2006; SSE2-NEXT:    psrad $16, %xmm0
2007; SSE2-NEXT:    packssdw %xmm3, %xmm0
2008; SSE2-NEXT:    retq
2009;
2010; SSSE3-LABEL: psubus_i16_i32_max_swapped:
2011; SSSE3:       # %bb.0: # %vector.ph
2012; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
2013; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
2014; SSSE3-NEXT:    movdqa %xmm2, %xmm5
2015; SSSE3-NEXT:    pxor %xmm4, %xmm5
2016; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [2147549183,2147549183,2147549183,2147549183]
2017; SSSE3-NEXT:    movdqa %xmm6, %xmm7
2018; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm7
2019; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [65535,65535,65535,65535]
2020; SSSE3-NEXT:    pand %xmm7, %xmm2
2021; SSSE3-NEXT:    pandn %xmm5, %xmm7
2022; SSSE3-NEXT:    por %xmm2, %xmm7
2023; SSSE3-NEXT:    pshufb %xmm3, %xmm7
2024; SSSE3-NEXT:    pxor %xmm1, %xmm4
2025; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
2026; SSSE3-NEXT:    pand %xmm6, %xmm1
2027; SSSE3-NEXT:    pandn %xmm5, %xmm6
2028; SSSE3-NEXT:    por %xmm1, %xmm6
2029; SSSE3-NEXT:    pshufb %xmm3, %xmm6
2030; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm6 = xmm6[0],xmm7[0]
2031; SSSE3-NEXT:    psubusw %xmm6, %xmm0
2032; SSSE3-NEXT:    retq
2033;
2034; SSE41-LABEL: psubus_i16_i32_max_swapped:
2035; SSE41:       # %bb.0: # %vector.ph
2036; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [65535,65535,65535,65535]
2037; SSE41-NEXT:    pminud %xmm3, %xmm2
2038; SSE41-NEXT:    pminud %xmm3, %xmm1
2039; SSE41-NEXT:    packusdw %xmm2, %xmm1
2040; SSE41-NEXT:    psubusw %xmm1, %xmm0
2041; SSE41-NEXT:    retq
2042;
2043; AVX1-LABEL: psubus_i16_i32_max_swapped:
2044; AVX1:       # %bb.0: # %vector.ph
2045; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2046; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [65535,65535,65535,65535]
2047; AVX1-NEXT:    vpminud %xmm3, %xmm2, %xmm2
2048; AVX1-NEXT:    vpminud %xmm3, %xmm1, %xmm1
2049; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
2050; AVX1-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
2051; AVX1-NEXT:    vzeroupper
2052; AVX1-NEXT:    retq
2053;
2054; AVX2-LABEL: psubus_i16_i32_max_swapped:
2055; AVX2:       # %bb.0: # %vector.ph
2056; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535]
2057; AVX2-NEXT:    vpminud %ymm2, %ymm1, %ymm1
2058; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
2059; AVX2-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
2060; AVX2-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
2061; AVX2-NEXT:    vzeroupper
2062; AVX2-NEXT:    retq
2063;
2064; AVX512-LABEL: psubus_i16_i32_max_swapped:
2065; AVX512:       # %bb.0: # %vector.ph
2066; AVX512-NEXT:    vpmovusdw %ymm1, %xmm1
2067; AVX512-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
2068; AVX512-NEXT:    vzeroupper
2069; AVX512-NEXT:    retq
2070vector.ph:
2071  %lhs = zext <8 x i16> %x to <8 x i32>
2072  %cond = icmp ult <8 x i32> %y, %lhs
2073  %max = select <8 x i1> %cond, <8 x i32> %lhs, <8 x i32> %y
2074  %sub = sub <8 x i32> %max, %y
2075  %res = trunc <8 x i32> %sub to <8 x i16>
2076  ret <8 x i16> %res
2077}
2078
2079define <8 x i16> @psubus_i16_i32_min(<8 x i16> %x, <8 x i32> %y) nounwind {
2080; SSE2-LABEL: psubus_i16_i32_min:
2081; SSE2:       # %bb.0: # %vector.ph
2082; SSE2-NEXT:    pxor %xmm4, %xmm4
2083; SSE2-NEXT:    movdqa %xmm0, %xmm3
2084; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3]
2085; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
2086; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
2087; SSE2-NEXT:    movdqa %xmm2, %xmm5
2088; SSE2-NEXT:    pxor %xmm4, %xmm5
2089; SSE2-NEXT:    movdqa %xmm0, %xmm6
2090; SSE2-NEXT:    por %xmm4, %xmm6
2091; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
2092; SSE2-NEXT:    movdqa %xmm0, %xmm6
2093; SSE2-NEXT:    pand %xmm5, %xmm6
2094; SSE2-NEXT:    pandn %xmm2, %xmm5
2095; SSE2-NEXT:    por %xmm6, %xmm5
2096; SSE2-NEXT:    movdqa %xmm1, %xmm2
2097; SSE2-NEXT:    pxor %xmm4, %xmm2
2098; SSE2-NEXT:    por %xmm3, %xmm4
2099; SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
2100; SSE2-NEXT:    movdqa %xmm3, %xmm4
2101; SSE2-NEXT:    pand %xmm2, %xmm4
2102; SSE2-NEXT:    pandn %xmm1, %xmm2
2103; SSE2-NEXT:    por %xmm4, %xmm2
2104; SSE2-NEXT:    psubd %xmm2, %xmm3
2105; SSE2-NEXT:    psubd %xmm5, %xmm0
2106; SSE2-NEXT:    pslld $16, %xmm0
2107; SSE2-NEXT:    psrad $16, %xmm0
2108; SSE2-NEXT:    pslld $16, %xmm3
2109; SSE2-NEXT:    psrad $16, %xmm3
2110; SSE2-NEXT:    packssdw %xmm0, %xmm3
2111; SSE2-NEXT:    movdqa %xmm3, %xmm0
2112; SSE2-NEXT:    retq
2113;
2114; SSSE3-LABEL: psubus_i16_i32_min:
2115; SSSE3:       # %bb.0: # %vector.ph
2116; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
2117; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
2118; SSSE3-NEXT:    movdqa %xmm2, %xmm5
2119; SSSE3-NEXT:    pxor %xmm4, %xmm5
2120; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [2147549183,2147549183,2147549183,2147549183]
2121; SSSE3-NEXT:    movdqa %xmm6, %xmm7
2122; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm7
2123; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [65535,65535,65535,65535]
2124; SSSE3-NEXT:    pand %xmm7, %xmm2
2125; SSSE3-NEXT:    pandn %xmm5, %xmm7
2126; SSSE3-NEXT:    por %xmm2, %xmm7
2127; SSSE3-NEXT:    pshufb %xmm3, %xmm7
2128; SSSE3-NEXT:    pxor %xmm1, %xmm4
2129; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
2130; SSSE3-NEXT:    pand %xmm6, %xmm1
2131; SSSE3-NEXT:    pandn %xmm5, %xmm6
2132; SSSE3-NEXT:    por %xmm1, %xmm6
2133; SSSE3-NEXT:    pshufb %xmm3, %xmm6
2134; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm6 = xmm6[0],xmm7[0]
2135; SSSE3-NEXT:    psubusw %xmm6, %xmm0
2136; SSSE3-NEXT:    retq
2137;
2138; SSE41-LABEL: psubus_i16_i32_min:
2139; SSE41:       # %bb.0: # %vector.ph
2140; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [65535,65535,65535,65535]
2141; SSE41-NEXT:    pminud %xmm3, %xmm2
2142; SSE41-NEXT:    pminud %xmm3, %xmm1
2143; SSE41-NEXT:    packusdw %xmm2, %xmm1
2144; SSE41-NEXT:    psubusw %xmm1, %xmm0
2145; SSE41-NEXT:    retq
2146;
2147; AVX1-LABEL: psubus_i16_i32_min:
2148; AVX1:       # %bb.0: # %vector.ph
2149; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2150; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [65535,65535,65535,65535]
2151; AVX1-NEXT:    vpminud %xmm3, %xmm2, %xmm2
2152; AVX1-NEXT:    vpminud %xmm3, %xmm1, %xmm1
2153; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
2154; AVX1-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
2155; AVX1-NEXT:    vzeroupper
2156; AVX1-NEXT:    retq
2157;
2158; AVX2-LABEL: psubus_i16_i32_min:
2159; AVX2:       # %bb.0: # %vector.ph
2160; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535]
2161; AVX2-NEXT:    vpminud %ymm2, %ymm1, %ymm1
2162; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
2163; AVX2-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
2164; AVX2-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
2165; AVX2-NEXT:    vzeroupper
2166; AVX2-NEXT:    retq
2167;
2168; AVX512-LABEL: psubus_i16_i32_min:
2169; AVX512:       # %bb.0: # %vector.ph
2170; AVX512-NEXT:    vpmovusdw %ymm1, %xmm1
2171; AVX512-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
2172; AVX512-NEXT:    vzeroupper
2173; AVX512-NEXT:    retq
2174vector.ph:
2175  %lhs = zext <8 x i16> %x to <8 x i32>
2176  %cond = icmp ult <8 x i32> %lhs, %y
2177  %min = select <8 x i1> %cond, <8 x i32> %lhs, <8 x i32> %y
2178  %sub = sub <8 x i32> %lhs, %min
2179  %res = trunc <8 x i32> %sub to <8 x i16>
2180  ret <8 x i16> %res
2181}
2182
2183define void @subus_v8i8(<8 x i8>* %p1, <8 x i8>* %p2) {
2184; SSE-LABEL: subus_v8i8:
2185; SSE:       # %bb.0:
2186; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2187; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
2188; SSE-NEXT:    psubusb %xmm1, %xmm0
2189; SSE-NEXT:    movq %xmm0, (%rdi)
2190; SSE-NEXT:    retq
2191;
2192; AVX1-LABEL: subus_v8i8:
2193; AVX1:       # %bb.0:
2194; AVX1-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
2195; AVX1-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
2196; AVX1-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
2197; AVX1-NEXT:    vmovq %xmm0, (%rdi)
2198; AVX1-NEXT:    retq
2199;
2200; AVX2-LABEL: subus_v8i8:
2201; AVX2:       # %bb.0:
2202; AVX2-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
2203; AVX2-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
2204; AVX2-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
2205; AVX2-NEXT:    vmovq %xmm0, (%rdi)
2206; AVX2-NEXT:    retq
2207;
2208; AVX512-LABEL: subus_v8i8:
2209; AVX512:       # %bb.0:
2210; AVX512-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
2211; AVX512-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
2212; AVX512-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
2213; AVX512-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2214; AVX512-NEXT:    vpmovwb %xmm0, (%rdi)
2215; AVX512-NEXT:    retq
2216  %ld1 = load <8 x i8>, <8 x i8>* %p1, align 8
2217  %ld2 = load <8 x i8>, <8 x i8>* %p2, align 8
2218  %1 = sub <8 x i8> %ld1, %ld2
2219  %2 = icmp ugt <8 x i8> %ld1, %ld2
2220  %sh3 = select <8 x i1> %2, <8 x i8> %1, <8 x i8> zeroinitializer
2221  store <8 x i8> %sh3, <8 x i8>* %p1, align 8
2222  ret void
2223}
2224
2225define void @subus_v4i8(<4 x i8>* %p1, <4 x i8>* %p2) {
2226; SSE-LABEL: subus_v4i8:
2227; SSE:       # %bb.0:
2228; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2229; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2230; SSE-NEXT:    psubusb %xmm1, %xmm0
2231; SSE-NEXT:    movd %xmm0, (%rdi)
2232; SSE-NEXT:    retq
2233;
2234; AVX1-LABEL: subus_v4i8:
2235; AVX1:       # %bb.0:
2236; AVX1-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2237; AVX1-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2238; AVX1-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
2239; AVX1-NEXT:    vmovd %xmm0, (%rdi)
2240; AVX1-NEXT:    retq
2241;
2242; AVX2-LABEL: subus_v4i8:
2243; AVX2:       # %bb.0:
2244; AVX2-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2245; AVX2-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2246; AVX2-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
2247; AVX2-NEXT:    vmovd %xmm0, (%rdi)
2248; AVX2-NEXT:    retq
2249;
2250; AVX512-LABEL: subus_v4i8:
2251; AVX512:       # %bb.0:
2252; AVX512-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2253; AVX512-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2254; AVX512-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
2255; AVX512-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2256; AVX512-NEXT:    vpmovdb %xmm0, (%rdi)
2257; AVX512-NEXT:    retq
2258  %ld1 = load <4 x i8>, <4 x i8>* %p1, align 8
2259  %ld2 = load <4 x i8>, <4 x i8>* %p2, align 8
2260  %1 = sub <4 x i8> %ld1, %ld2
2261  %2 = icmp ugt <4 x i8> %ld1, %ld2
2262  %sh3 = select <4 x i1> %2, <4 x i8> %1, <4 x i8> zeroinitializer
2263  store <4 x i8> %sh3, <4 x i8>* %p1, align 8
2264  ret void
2265}
2266
2267define void @subus_v2i8(<2 x i8>* %p1, <2 x i8>* %p2) {
2268; SSE2-LABEL: subus_v2i8:
2269; SSE2:       # %bb.0:
2270; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2271; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2272; SSE2-NEXT:    psubusb %xmm1, %xmm0
2273; SSE2-NEXT:    movd %xmm0, %eax
2274; SSE2-NEXT:    movw %ax, (%rdi)
2275; SSE2-NEXT:    retq
2276;
2277; SSSE3-LABEL: subus_v2i8:
2278; SSSE3:       # %bb.0:
2279; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2280; SSSE3-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2281; SSSE3-NEXT:    psubusb %xmm1, %xmm0
2282; SSSE3-NEXT:    movd %xmm0, %eax
2283; SSSE3-NEXT:    movw %ax, (%rdi)
2284; SSSE3-NEXT:    retq
2285;
2286; SSE41-LABEL: subus_v2i8:
2287; SSE41:       # %bb.0:
2288; SSE41-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2289; SSE41-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2290; SSE41-NEXT:    psubusb %xmm1, %xmm0
2291; SSE41-NEXT:    pextrw $0, %xmm0, (%rdi)
2292; SSE41-NEXT:    retq
2293;
2294; AVX1-LABEL: subus_v2i8:
2295; AVX1:       # %bb.0:
2296; AVX1-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2297; AVX1-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2298; AVX1-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
2299; AVX1-NEXT:    vpextrw $0, %xmm0, (%rdi)
2300; AVX1-NEXT:    retq
2301;
2302; AVX2-LABEL: subus_v2i8:
2303; AVX2:       # %bb.0:
2304; AVX2-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2305; AVX2-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2306; AVX2-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
2307; AVX2-NEXT:    vpextrw $0, %xmm0, (%rdi)
2308; AVX2-NEXT:    retq
2309;
2310; AVX512-LABEL: subus_v2i8:
2311; AVX512:       # %bb.0:
2312; AVX512-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2313; AVX512-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2314; AVX512-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
2315; AVX512-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
2316; AVX512-NEXT:    vpmovqb %xmm0, (%rdi)
2317; AVX512-NEXT:    retq
2318  %ld1 = load <2 x i8>, <2 x i8>* %p1, align 8
2319  %ld2 = load <2 x i8>, <2 x i8>* %p2, align 8
2320  %1 = sub <2 x i8> %ld1, %ld2
2321  %2 = icmp ugt <2 x i8> %ld1, %ld2
2322  %sh3 = select <2 x i1> %2, <2 x i8> %1, <2 x i8> zeroinitializer
2323  store <2 x i8> %sh3, <2 x i8>* %p1, align 8
2324  ret void
2325}
2326
2327define void @subus_v4i16(<4 x i16>* %p1, <4 x i16>* %p2) {
2328; SSE-LABEL: subus_v4i16:
2329; SSE:       # %bb.0:
2330; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
2331; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
2332; SSE-NEXT:    psubusw %xmm1, %xmm0
2333; SSE-NEXT:    movq %xmm0, (%rdi)
2334; SSE-NEXT:    retq
2335;
2336; AVX1-LABEL: subus_v4i16:
2337; AVX1:       # %bb.0:
2338; AVX1-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
2339; AVX1-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
2340; AVX1-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
2341; AVX1-NEXT:    vmovq %xmm0, (%rdi)
2342; AVX1-NEXT:    retq
2343;
2344; AVX2-LABEL: subus_v4i16:
2345; AVX2:       # %bb.0:
2346; AVX2-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
2347; AVX2-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
2348; AVX2-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
2349; AVX2-NEXT:    vmovq %xmm0, (%rdi)
2350; AVX2-NEXT:    retq
2351;
2352; AVX512-LABEL: subus_v4i16:
2353; AVX512:       # %bb.0:
2354; AVX512-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
2355; AVX512-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
2356; AVX512-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
2357; AVX512-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2358; AVX512-NEXT:    vpmovdw %xmm0, (%rdi)
2359; AVX512-NEXT:    retq
2360  %ld1 = load <4 x i16>, <4 x i16>* %p1, align 8
2361  %ld2 = load <4 x i16>, <4 x i16>* %p2, align 8
2362  %1 = sub <4 x i16> %ld1, %ld2
2363  %2 = icmp ugt <4 x i16> %ld1, %ld2
2364  %sh3 = select <4 x i1> %2, <4 x i16> %1, <4 x i16> zeroinitializer
2365  store <4 x i16> %sh3, <4 x i16>* %p1, align 8
2366  ret void
2367}
2368
2369define void @subus_v2i16(<2 x i16>* %p1, <2 x i16>* %p2) {
2370; SSE-LABEL: subus_v2i16:
2371; SSE:       # %bb.0:
2372; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2373; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2374; SSE-NEXT:    psubusw %xmm1, %xmm0
2375; SSE-NEXT:    movd %xmm0, (%rdi)
2376; SSE-NEXT:    retq
2377;
2378; AVX1-LABEL: subus_v2i16:
2379; AVX1:       # %bb.0:
2380; AVX1-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2381; AVX1-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2382; AVX1-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
2383; AVX1-NEXT:    vmovd %xmm0, (%rdi)
2384; AVX1-NEXT:    retq
2385;
2386; AVX2-LABEL: subus_v2i16:
2387; AVX2:       # %bb.0:
2388; AVX2-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2389; AVX2-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2390; AVX2-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
2391; AVX2-NEXT:    vmovd %xmm0, (%rdi)
2392; AVX2-NEXT:    retq
2393;
2394; AVX512-LABEL: subus_v2i16:
2395; AVX512:       # %bb.0:
2396; AVX512-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2397; AVX512-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2398; AVX512-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
2399; AVX512-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
2400; AVX512-NEXT:    vpmovqw %xmm0, (%rdi)
2401; AVX512-NEXT:    retq
2402  %ld1 = load <2 x i16>, <2 x i16>* %p1, align 8
2403  %ld2 = load <2 x i16>, <2 x i16>* %p2, align 8
2404  %1 = sub <2 x i16> %ld1, %ld2
2405  %2 = icmp ugt <2 x i16> %ld1, %ld2
2406  %sh3 = select <2 x i1> %2, <2 x i16> %1, <2 x i16> zeroinitializer
2407  store <2 x i16> %sh3, <2 x i16>* %p1, align 8
2408  ret void
2409}
2410
2411define <16 x i8> @test19(<16 x i8> %x) {
2412; SSE-LABEL: test19:
2413; SSE:       # %bb.0: # %entry
2414; SSE-NEXT:    psubusb {{.*}}(%rip), %xmm0
2415; SSE-NEXT:    retq
2416;
2417; AVX-LABEL: test19:
2418; AVX:       # %bb.0: # %entry
2419; AVX-NEXT:    vpsubusb {{.*}}(%rip), %xmm0, %xmm0
2420; AVX-NEXT:    retq
2421entry:
2422  %0 = icmp ugt <16 x i8> %x, <i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70>
2423  %1 = select <16 x i1> %0, <16 x i8> %x, <16 x i8> <i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70>
2424  %2 = add <16 x i8> %1, <i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70>
2425  ret <16 x i8> %2
2426}
2427
2428define <16 x i8> @test20(<16 x i8> %x) {
2429; SSE-LABEL: test20:
2430; SSE:       # %bb.0: # %entry
2431; SSE-NEXT:    psubusb {{.*}}(%rip), %xmm0
2432; SSE-NEXT:    retq
2433;
2434; AVX-LABEL: test20:
2435; AVX:       # %bb.0: # %entry
2436; AVX-NEXT:    vpsubusb {{.*}}(%rip), %xmm0, %xmm0
2437; AVX-NEXT:    retq
2438entry:
2439  %0 = icmp ugt <16 x i8> %x, <i8 1, i8 -22, i8 -50, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 100, i8 25, i8 34, i8 55, i8 70>
2440  %1 = select <16 x i1> %0, <16 x i8> %x, <16 x i8> <i8 1, i8 -22, i8 -50, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 100, i8 25, i8 34, i8 55, i8 70>
2441  %2 = add <16 x i8> %1, <i8 -1, i8 22, i8 50, i8 114, i8 77, i8 70, i8 -123, i8 -98, i8 -63, i8 -19, i8 22, i8 -100, i8 -25, i8 -34, i8 -55, i8 -70>
2442  ret <16 x i8> %2
2443}
2444
2445define <8 x i16> @test21(<8 x i16> %x) {
2446; SSE-LABEL: test21:
2447; SSE:       # %bb.0: # %entry
2448; SSE-NEXT:    psubusw {{.*}}(%rip), %xmm0
2449; SSE-NEXT:    retq
2450;
2451; AVX-LABEL: test21:
2452; AVX:       # %bb.0: # %entry
2453; AVX-NEXT:    vpsubusw {{.*}}(%rip), %xmm0, %xmm0
2454; AVX-NEXT:    retq
2455entry:
2456  %0 = icmp ugt <8 x i16> %x, <i16 700, i16 700, i16 700, i16 700, i16 700, i16 700, i16 700, i16 700>
2457  %1 = select <8 x i1> %0, <8 x i16> %x, <8 x i16> <i16 700, i16 700, i16 700, i16 700, i16 700, i16 700, i16 700, i16 700>
2458  %2 = add <8 x i16> %1, <i16 -700, i16 -700, i16 -700, i16 -700, i16 -700, i16 -700, i16 -700, i16 -700>
2459  ret <8 x i16> %2
2460}
2461
2462define <8 x i16> @test22(<8 x i16> %x) {
2463; SSE-LABEL: test22:
2464; SSE:       # %bb.0: # %entry
2465; SSE-NEXT:    psubusw {{.*}}(%rip), %xmm0
2466; SSE-NEXT:    retq
2467;
2468; AVX-LABEL: test22:
2469; AVX:       # %bb.0: # %entry
2470; AVX-NEXT:    vpsubusw {{.*}}(%rip), %xmm0, %xmm0
2471; AVX-NEXT:    retq
2472entry:
2473  %0 = icmp ugt <8 x i16> %x, <i16 1, i16 -22000, i16 -770, i16 98, i16 19, i16 1000, i16 3456, i16 70>
2474  %1 = select <8 x i1> %0, <8 x i16> %x, <8 x i16> <i16 1, i16 -22000, i16 -770, i16 98, i16 19, i16 1000, i16 3456, i16 70>
2475  %2 = add <8 x i16> %1, <i16 -1, i16 22000, i16 770, i16 -98, i16 -19, i16 -1000, i16 -3456, i16 -70>
2476  ret <8 x i16> %2
2477}
2478
2479define <32 x i8> @test23(<32 x i8> %x) {
2480; SSE-LABEL: test23:
2481; SSE:       # %bb.0: # %entry
2482; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70]
2483; SSE-NEXT:    psubusb %xmm2, %xmm0
2484; SSE-NEXT:    psubusb %xmm2, %xmm1
2485; SSE-NEXT:    retq
2486;
2487; AVX1-LABEL: test23:
2488; AVX1:       # %bb.0: # %entry
2489; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2490; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70]
2491; AVX1-NEXT:    vpsubusb %xmm2, %xmm1, %xmm1
2492; AVX1-NEXT:    vpsubusb %xmm2, %xmm0, %xmm0
2493; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2494; AVX1-NEXT:    retq
2495;
2496; AVX2-LABEL: test23:
2497; AVX2:       # %bb.0: # %entry
2498; AVX2-NEXT:    vpsubusb {{.*}}(%rip), %ymm0, %ymm0
2499; AVX2-NEXT:    retq
2500;
2501; AVX512-LABEL: test23:
2502; AVX512:       # %bb.0: # %entry
2503; AVX512-NEXT:    vpsubusb {{.*}}(%rip), %ymm0, %ymm0
2504; AVX512-NEXT:    retq
2505entry:
2506  %0 = icmp ugt <32 x i8> %x, <i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70>
2507  %1 = select <32 x i1> %0, <32 x i8> %x, <32 x i8> <i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70>
2508  %2 = add <32 x i8> %1, <i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70, i8 -70>
2509  ret <32 x i8> %2
2510}
2511
2512define <32 x i8> @test24(<32 x i8> %x) {
2513; SSE-LABEL: test24:
2514; SSE:       # %bb.0: # %entry
2515; SSE-NEXT:    psubusb {{.*}}(%rip), %xmm0
2516; SSE-NEXT:    psubusb {{.*}}(%rip), %xmm1
2517; SSE-NEXT:    retq
2518;
2519; AVX1-LABEL: test24:
2520; AVX1:       # %bb.0: # %entry
2521; AVX1-NEXT:    vpsubusb {{.*}}(%rip), %xmm0, %xmm1
2522; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2523; AVX1-NEXT:    vpsubusb {{.*}}(%rip), %xmm0, %xmm0
2524; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2525; AVX1-NEXT:    retq
2526;
2527; AVX2-LABEL: test24:
2528; AVX2:       # %bb.0: # %entry
2529; AVX2-NEXT:    vpsubusb {{.*}}(%rip), %ymm0, %ymm0
2530; AVX2-NEXT:    retq
2531;
2532; AVX512-LABEL: test24:
2533; AVX512:       # %bb.0: # %entry
2534; AVX512-NEXT:    vpsubusb {{.*}}(%rip), %ymm0, %ymm0
2535; AVX512-NEXT:    retq
2536entry:
2537  %0 = icmp ugt <32 x i8> %x, <i8 1, i8 -22, i8 -50, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 100, i8 25, i8 34, i8 55, i8 70, i8 2, i8 -23, i8 -49, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 110, i8 25, i8 34, i8 55, i8 70>
2538  %1 = select <32 x i1> %0, <32 x i8> %x, <32 x i8> <i8 1, i8 -22, i8 -50, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 100, i8 25, i8 34, i8 55, i8 70, i8 2, i8 -23, i8 -49, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 110, i8 25, i8 34, i8 55, i8 70>
2539  %2 = add <32 x i8> %1, <i8 -1, i8 22, i8 50, i8 114, i8 77, i8 70, i8 -123, i8 -98, i8 -63, i8 -19, i8 22, i8 -100, i8 -25, i8 -34, i8 -55, i8 -70, i8 -2, i8 23, i8 49, i8 114, i8 77, i8 70, i8 -123, i8 -98, i8 -63, i8 -19, i8 22, i8 -110, i8 -25, i8 -34, i8 -55, i8 -70>
2540  ret <32 x i8> %2
2541}
2542
2543define <16 x i16> @test25(<16 x i16> %x) {
2544; SSE-LABEL: test25:
2545; SSE:       # %bb.0: # %entry
2546; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [5000,5000,5000,5000,5000,5000,5000,5000]
2547; SSE-NEXT:    psubusw %xmm2, %xmm0
2548; SSE-NEXT:    psubusw %xmm2, %xmm1
2549; SSE-NEXT:    retq
2550;
2551; AVX1-LABEL: test25:
2552; AVX1:       # %bb.0: # %entry
2553; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2554; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [5000,5000,5000,5000,5000,5000,5000,5000]
2555; AVX1-NEXT:    vpsubusw %xmm2, %xmm1, %xmm1
2556; AVX1-NEXT:    vpsubusw %xmm2, %xmm0, %xmm0
2557; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2558; AVX1-NEXT:    retq
2559;
2560; AVX2-LABEL: test25:
2561; AVX2:       # %bb.0: # %entry
2562; AVX2-NEXT:    vpsubusw {{.*}}(%rip), %ymm0, %ymm0
2563; AVX2-NEXT:    retq
2564;
2565; AVX512-LABEL: test25:
2566; AVX512:       # %bb.0: # %entry
2567; AVX512-NEXT:    vpsubusw {{.*}}(%rip), %ymm0, %ymm0
2568; AVX512-NEXT:    retq
2569entry:
2570  %0 = icmp ugt <16 x i16> %x, <i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000>
2571  %1 = select <16 x i1> %0, <16 x i16> %x, <16 x i16> <i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000, i16 5000>
2572  %2 = add <16 x i16> %1, <i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000, i16 -5000>
2573  ret <16 x i16> %2
2574}
2575
2576define <16 x i16> @test26(<16 x i16> %x) {
2577; SSE-LABEL: test26:
2578; SSE:       # %bb.0: # %entry
2579; SSE-NEXT:    psubusw {{.*}}(%rip), %xmm0
2580; SSE-NEXT:    psubusw {{.*}}(%rip), %xmm1
2581; SSE-NEXT:    retq
2582;
2583; AVX1-LABEL: test26:
2584; AVX1:       # %bb.0: # %entry
2585; AVX1-NEXT:    vpsubusw {{.*}}(%rip), %xmm0, %xmm1
2586; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2587; AVX1-NEXT:    vpsubusw {{.*}}(%rip), %xmm0, %xmm0
2588; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2589; AVX1-NEXT:    retq
2590;
2591; AVX2-LABEL: test26:
2592; AVX2:       # %bb.0: # %entry
2593; AVX2-NEXT:    vpsubusw {{.*}}(%rip), %ymm0, %ymm0
2594; AVX2-NEXT:    retq
2595;
2596; AVX512-LABEL: test26:
2597; AVX512:       # %bb.0: # %entry
2598; AVX512-NEXT:    vpsubusw {{.*}}(%rip), %ymm0, %ymm0
2599; AVX512-NEXT:    retq
2600entry:
2601  %0 = icmp ugt <16 x i16> %x, <i16 1, i16 -2200, i16 -50, i16 -114, i16 -77, i16 -70, i16 123, i16 9800, i16 635, i16 19567, i16 -22, i16 100, i16 2534, i16 34, i16 55, i16 70>
2602  %1 = select <16 x i1> %0, <16 x i16> %x, <16 x i16> <i16 1, i16 -2200, i16 -50, i16 -114, i16 -77, i16 -70, i16 123, i16 9800, i16 635, i16 19567, i16 -22, i16 100, i16 2534, i16 34, i16 55, i16 70>
2603  %2 = add <16 x i16> %1, <i16 -1, i16 2200, i16 50, i16 114, i16 77, i16 70, i16 -123, i16 -9800, i16 -635, i16 -19567, i16 22, i16 -100, i16 -2534, i16 -34, i16 -55, i16 -70>
2604  ret <16 x i16> %2
2605}
2606
2607define <64 x i8> @test27(<64 x i8> %x) {
2608; SSE-LABEL: test27:
2609; SSE:       # %bb.0: # %entry
2610; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154]
2611; SSE-NEXT:    psubusb %xmm4, %xmm0
2612; SSE-NEXT:    psubusb %xmm4, %xmm1
2613; SSE-NEXT:    psubusb %xmm4, %xmm2
2614; SSE-NEXT:    psubusb %xmm4, %xmm3
2615; SSE-NEXT:    retq
2616;
2617; AVX1-LABEL: test27:
2618; AVX1:       # %bb.0: # %entry
2619; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2620; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154]
2621; AVX1-NEXT:    vpsubusb %xmm3, %xmm2, %xmm2
2622; AVX1-NEXT:    vpsubusb %xmm3, %xmm0, %xmm0
2623; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2624; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2625; AVX1-NEXT:    vpsubusb %xmm3, %xmm2, %xmm2
2626; AVX1-NEXT:    vpsubusb %xmm3, %xmm1, %xmm1
2627; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2628; AVX1-NEXT:    retq
2629;
2630; AVX2-LABEL: test27:
2631; AVX2:       # %bb.0: # %entry
2632; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154]
2633; AVX2-NEXT:    vpsubusb %ymm2, %ymm0, %ymm0
2634; AVX2-NEXT:    vpsubusb %ymm2, %ymm1, %ymm1
2635; AVX2-NEXT:    retq
2636;
2637; AVX512-LABEL: test27:
2638; AVX512:       # %bb.0: # %entry
2639; AVX512-NEXT:    vpsubusb {{.*}}(%rip), %zmm0, %zmm0
2640; AVX512-NEXT:    retq
2641entry:
2642  %0 = icmp ugt <64 x i8> %x, <i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154>
2643  %1 = select <64 x i1> %0, <64 x i8> %x, <64 x i8> <i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154, i8 154>
2644  %2 = add <64 x i8> %1, <i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154, i8 -154>
2645  ret <64 x i8> %2
2646}
2647
2648define <64 x i8> @test28(<64 x i8> %x) {
2649; SSE-LABEL: test28:
2650; SSE:       # %bb.0: # %entry
2651; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [1,234,206,142,179,186,123,98,63,19,234,100,25,34,55,70]
2652; SSE-NEXT:    psubusb %xmm4, %xmm0
2653; SSE-NEXT:    psubusb %xmm4, %xmm2
2654; SSE-NEXT:    psubusb {{.*}}(%rip), %xmm1
2655; SSE-NEXT:    psubusb {{.*}}(%rip), %xmm3
2656; SSE-NEXT:    retq
2657;
2658; AVX1-LABEL: test28:
2659; AVX1:       # %bb.0: # %entry
2660; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [1,234,206,142,179,186,123,98,63,19,234,100,25,34,55,70]
2661; AVX1-NEXT:    vpsubusb %xmm2, %xmm0, %xmm3
2662; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2663; AVX1-NEXT:    vpsubusb {{.*}}(%rip), %xmm0, %xmm0
2664; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm3, %ymm0
2665; AVX1-NEXT:    vpsubusb %xmm2, %xmm1, %xmm2
2666; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2667; AVX1-NEXT:    vpsubusb {{.*}}(%rip), %xmm1, %xmm1
2668; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
2669; AVX1-NEXT:    retq
2670;
2671; AVX2-LABEL: test28:
2672; AVX2:       # %bb.0: # %entry
2673; AVX2-NEXT:    vpsubusb {{.*}}(%rip), %ymm0, %ymm0
2674; AVX2-NEXT:    vpsubusb {{.*}}(%rip), %ymm1, %ymm1
2675; AVX2-NEXT:    retq
2676;
2677; AVX512-LABEL: test28:
2678; AVX512:       # %bb.0: # %entry
2679; AVX512-NEXT:    vpsubusb {{.*}}(%rip), %zmm0, %zmm0
2680; AVX512-NEXT:    retq
2681entry:
2682  %0 = icmp ugt <64 x i8> %x, <i8 1, i8 -22, i8 -50, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 100, i8 25, i8 34, i8 55, i8 70, i8 2, i8 -23, i8 -49, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 110, i8 25, i8 34, i8 55, i8 70, i8 1, i8 -22, i8 -50, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 100, i8 25, i8 34, i8 55, i8 70, i8 2, i8 -23, i8 -49, i8 -116, i8 -77, i8 -70, i8 123, i8 98, i8 67, i8 19, i8 -22, i8 110, i8 25, i8 34, i8 55, i8 70>
2683  %1 = select <64 x i1> %0, <64 x i8> %x, <64 x i8> <i8 1, i8 -22, i8 -50, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 100, i8 25, i8 34, i8 55, i8 70, i8 2, i8 -23, i8 -49, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 110, i8 25, i8 34, i8 55, i8 70, i8 1, i8 -22, i8 -50, i8 -114, i8 -77, i8 -70, i8 123, i8 98, i8 63, i8 19, i8 -22, i8 100, i8 25, i8 34, i8 55, i8 70, i8 2, i8 -23, i8 -49, i8 -116, i8 -77, i8 -70, i8 123, i8 98, i8 67, i8 19, i8 -22, i8 110, i8 25, i8 34, i8 55, i8 70>
2684  %2 = add <64 x i8> %1, <i8 -1, i8 22, i8 50, i8 114, i8 77, i8 70, i8 -123, i8 -98, i8 -63, i8 -19, i8 22, i8 -100, i8 -25, i8 -34, i8 -55, i8 -70, i8 -2, i8 23, i8 49, i8 114, i8 77, i8 70, i8 -123, i8 -98, i8 -63, i8 -19, i8 22, i8 -110, i8 -25, i8 -34, i8 -55, i8 -70, i8 -1, i8 22, i8 50, i8 114, i8 77, i8 70, i8 -123, i8 -98, i8 -63, i8 -19, i8 22, i8 -100, i8 -25, i8 -34, i8 -55, i8 -70, i8 -2, i8 23, i8 49, i8 116, i8 77, i8 70, i8 -123, i8 -98, i8 -67, i8 -19, i8 22, i8 -110, i8 -25, i8 -34, i8 -55, i8 -70>
2685  ret <64 x i8> %2
2686}
2687
2688define <32 x i16> @test29(<32 x i16> %x) {
2689; SSE-LABEL: test29:
2690; SSE:       # %bb.0: # %entry
2691; SSE-NEXT:    psubusw {{.*}}(%rip), %xmm0
2692; SSE-NEXT:    psubusw {{.*}}(%rip), %xmm1
2693; SSE-NEXT:    psubusw {{.*}}(%rip), %xmm2
2694; SSE-NEXT:    psubusw {{.*}}(%rip), %xmm3
2695; SSE-NEXT:    retq
2696;
2697; AVX1-LABEL: test29:
2698; AVX1:       # %bb.0: # %entry
2699; AVX1-NEXT:    vpsubusw {{.*}}(%rip), %xmm0, %xmm2
2700; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2701; AVX1-NEXT:    vpsubusw {{.*}}(%rip), %xmm0, %xmm0
2702; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
2703; AVX1-NEXT:    vpsubusw {{.*}}(%rip), %xmm1, %xmm2
2704; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2705; AVX1-NEXT:    vpsubusw {{.*}}(%rip), %xmm1, %xmm1
2706; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
2707; AVX1-NEXT:    retq
2708;
2709; AVX2-LABEL: test29:
2710; AVX2:       # %bb.0: # %entry
2711; AVX2-NEXT:    vpsubusw {{.*}}(%rip), %ymm0, %ymm0
2712; AVX2-NEXT:    vpsubusw {{.*}}(%rip), %ymm1, %ymm1
2713; AVX2-NEXT:    retq
2714;
2715; AVX512-LABEL: test29:
2716; AVX512:       # %bb.0: # %entry
2717; AVX512-NEXT:    vpsubusw {{.*}}(%rip), %zmm0, %zmm0
2718; AVX512-NEXT:    retq
2719entry:
2720  %0 = icmp ugt <32 x i16> %x, <i16 1, i16 -2200, i16 -50, i16 -114, i16 -77, i16 -70, i16 123, i16 9800, i16 635, i16 19567, i16 -22, i16 100, i16 2534, i16 34, i16 55, i16 70, i16 1, i16 -2200, i16 -50, i16 -114, i16 -77, i16 -70, i16 123, i16 9805, i16 635, i16 19567, i16 -22, i16 100, i16 2534, i16 346, i16 55, i16 70>
2721  %1 = select <32 x i1> %0, <32 x i16> %x, <32 x i16> <i16 1, i16 -2200, i16 -50, i16 -114, i16 -77, i16 -70, i16 123, i16 9800, i16 635, i16 19567, i16 -22, i16 100, i16 2534, i16 34, i16 55, i16 70, i16 1, i16 -2200, i16 -50, i16 -114, i16 -77, i16 -70, i16 123, i16 9805, i16 635, i16 19567, i16 -22, i16 100, i16 2534, i16 346, i16 55, i16 70>
2722  %2 = add <32 x i16> %1, <i16 -1, i16 2200, i16 50, i16 114, i16 77, i16 70, i16 -123, i16 -9800, i16 -635, i16 -19567, i16 22, i16 -100, i16 -2534, i16 -34, i16 -55, i16 -70, i16 -1, i16 2200, i16 50, i16 114, i16 77, i16 70, i16 -123, i16 -9805, i16 -635, i16 -19567, i16 22, i16 -100, i16 -2534, i16 -346, i16 -55, i16 -70>
2723  ret <32 x i16> %2
2724}
2725
2726; PR40083
2727define i64 @test30(<8 x i16> %x) {
2728; SSE-LABEL: test30:
2729; SSE:       # %bb.0: # %entry
2730; SSE-NEXT:    psubusw {{.*}}(%rip), %xmm0
2731; SSE-NEXT:    movq %xmm0, %rax
2732; SSE-NEXT:    retq
2733;
2734; AVX-LABEL: test30:
2735; AVX:       # %bb.0: # %entry
2736; AVX-NEXT:    vpsubusw {{.*}}(%rip), %xmm0, %xmm0
2737; AVX-NEXT:    vmovq %xmm0, %rax
2738; AVX-NEXT:    retq
2739entry:
2740  %0 = icmp ugt <8 x i16> %x, <i16 1, i16 -2200, i16 -50, i16 -114, i16 undef, i16 undef, i16 undef, i16 undef>
2741  %1 = select <8 x i1> %0, <8 x i16> %x, <8 x i16> <i16 1, i16 -2200, i16 -50, i16 -114, i16 undef, i16 undef, i16 undef, i16 undef>
2742  %2 = add <8 x i16> %1, <i16 -1, i16 2200, i16 50, i16 114, i16 undef, i16 undef, i16 undef, i16 undef>
2743  %3 = bitcast <8 x i16> %2 to <2 x i64>
2744  %4 = extractelement <2 x i64> %3, i32 0
2745  ret i64 %4
2746}
2747
2748; PR40083
2749define i64 @test31(<2 x i64> %x) {
2750; SSE-LABEL: test31:
2751; SSE:       # %bb.0:
2752; SSE-NEXT:    psubusb {{.*}}(%rip), %xmm0
2753; SSE-NEXT:    movq %xmm0, %rax
2754; SSE-NEXT:    retq
2755;
2756; AVX-LABEL: test31:
2757; AVX:       # %bb.0:
2758; AVX-NEXT:    vpsubusb {{.*}}(%rip), %xmm0, %xmm0
2759; AVX-NEXT:    vmovq %xmm0, %rax
2760; AVX-NEXT:    retq
2761  %t0 = bitcast <2 x i64> %x to <16 x i8>
2762  %cmp = icmp ugt <16 x i8> %t0, <i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 70, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>
2763  %bop = add <16 x i8> %t0, <i8 -71, i8 -71, i8 -71, i8 -71, i8 -71, i8 -71, i8 -71, i8 -71, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>
2764  %sel = select <16 x i1> %cmp, <16 x i8> %bop, <16 x i8> zeroinitializer
2765  %bc = bitcast <16 x i8> %sel to <2 x i64>
2766  %ext = extractelement <2 x i64> %bc, i32 0
2767  ret i64 %ext
2768}
2769