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