Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / usub_sat_vec.ll
blob8823b98c4ff8a637766e94311de8b6182ec2ae8c
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-prefixes=SSE,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE,SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,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=+avx512f,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
12 declare <1 x i8> @llvm.usub.sat.v1i8(<1 x i8>, <1 x i8>)
13 declare <2 x i8> @llvm.usub.sat.v2i8(<2 x i8>, <2 x i8>)
14 declare <4 x i8> @llvm.usub.sat.v4i8(<4 x i8>, <4 x i8>)
15 declare <8 x i8> @llvm.usub.sat.v8i8(<8 x i8>, <8 x i8>)
16 declare <12 x i8> @llvm.usub.sat.v12i8(<12 x i8>, <12 x i8>)
17 declare <16 x i8> @llvm.usub.sat.v16i8(<16 x i8>, <16 x i8>)
18 declare <32 x i8> @llvm.usub.sat.v32i8(<32 x i8>, <32 x i8>)
19 declare <64 x i8> @llvm.usub.sat.v64i8(<64 x i8>, <64 x i8>)
21 declare <1 x i16> @llvm.usub.sat.v1i16(<1 x i16>, <1 x i16>)
22 declare <2 x i16> @llvm.usub.sat.v2i16(<2 x i16>, <2 x i16>)
23 declare <4 x i16> @llvm.usub.sat.v4i16(<4 x i16>, <4 x i16>)
24 declare <8 x i16> @llvm.usub.sat.v8i16(<8 x i16>, <8 x i16>)
25 declare <12 x i16> @llvm.usub.sat.v12i16(<12 x i16>, <12 x i16>)
26 declare <16 x i16> @llvm.usub.sat.v16i16(<16 x i16>, <16 x i16>)
27 declare <32 x i16> @llvm.usub.sat.v32i16(<32 x i16>, <32 x i16>)
29 declare <16 x i1> @llvm.usub.sat.v16i1(<16 x i1>, <16 x i1>)
30 declare <16 x i4> @llvm.usub.sat.v16i4(<16 x i4>, <16 x i4>)
32 declare <2 x i32> @llvm.usub.sat.v2i32(<2 x i32>, <2 x i32>)
33 declare <4 x i32> @llvm.usub.sat.v4i32(<4 x i32>, <4 x i32>)
34 declare <8 x i32> @llvm.usub.sat.v8i32(<8 x i32>, <8 x i32>)
35 declare <16 x i32> @llvm.usub.sat.v16i32(<16 x i32>, <16 x i32>)
36 declare <2 x i64> @llvm.usub.sat.v2i64(<2 x i64>, <2 x i64>)
37 declare <4 x i64> @llvm.usub.sat.v4i64(<4 x i64>, <4 x i64>)
38 declare <8 x i64> @llvm.usub.sat.v8i64(<8 x i64>, <8 x i64>)
40 declare <4 x i24> @llvm.usub.sat.v4i24(<4 x i24>, <4 x i24>)
41 declare <2 x i128> @llvm.usub.sat.v2i128(<2 x i128>, <2 x i128>)
43 ; Legal types, depending on architecture.
45 define <16 x i8> @v16i8(<16 x i8> %x, <16 x i8> %y) nounwind {
46 ; SSE-LABEL: v16i8:
47 ; SSE:       # %bb.0:
48 ; SSE-NEXT:    psubusb %xmm1, %xmm0
49 ; SSE-NEXT:    retq
51 ; AVX-LABEL: v16i8:
52 ; AVX:       # %bb.0:
53 ; AVX-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
54 ; AVX-NEXT:    retq
55   %z = call <16 x i8> @llvm.usub.sat.v16i8(<16 x i8> %x, <16 x i8> %y)
56   ret <16 x i8> %z
59 define <32 x i8> @v32i8(<32 x i8> %x, <32 x i8> %y) nounwind {
60 ; SSE-LABEL: v32i8:
61 ; SSE:       # %bb.0:
62 ; SSE-NEXT:    psubusb %xmm2, %xmm0
63 ; SSE-NEXT:    psubusb %xmm3, %xmm1
64 ; SSE-NEXT:    retq
66 ; AVX1-LABEL: v32i8:
67 ; AVX1:       # %bb.0:
68 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
69 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
70 ; AVX1-NEXT:    vpsubusb %xmm2, %xmm3, %xmm2
71 ; AVX1-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
72 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
73 ; AVX1-NEXT:    retq
75 ; AVX2-LABEL: v32i8:
76 ; AVX2:       # %bb.0:
77 ; AVX2-NEXT:    vpsubusb %ymm1, %ymm0, %ymm0
78 ; AVX2-NEXT:    retq
80 ; AVX512-LABEL: v32i8:
81 ; AVX512:       # %bb.0:
82 ; AVX512-NEXT:    vpsubusb %ymm1, %ymm0, %ymm0
83 ; AVX512-NEXT:    retq
84   %z = call <32 x i8> @llvm.usub.sat.v32i8(<32 x i8> %x, <32 x i8> %y)
85   ret <32 x i8> %z
88 define <64 x i8> @v64i8(<64 x i8> %x, <64 x i8> %y) nounwind {
89 ; SSE-LABEL: v64i8:
90 ; SSE:       # %bb.0:
91 ; SSE-NEXT:    psubusb %xmm4, %xmm0
92 ; SSE-NEXT:    psubusb %xmm5, %xmm1
93 ; SSE-NEXT:    psubusb %xmm6, %xmm2
94 ; SSE-NEXT:    psubusb %xmm7, %xmm3
95 ; SSE-NEXT:    retq
97 ; AVX1-LABEL: v64i8:
98 ; AVX1:       # %bb.0:
99 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
100 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
101 ; AVX1-NEXT:    vpsubusb %xmm4, %xmm5, %xmm4
102 ; AVX1-NEXT:    vpsubusb %xmm2, %xmm0, %xmm0
103 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
104 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
105 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
106 ; AVX1-NEXT:    vpsubusb %xmm2, %xmm4, %xmm2
107 ; AVX1-NEXT:    vpsubusb %xmm3, %xmm1, %xmm1
108 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
109 ; AVX1-NEXT:    retq
111 ; AVX2-LABEL: v64i8:
112 ; AVX2:       # %bb.0:
113 ; AVX2-NEXT:    vpsubusb %ymm2, %ymm0, %ymm0
114 ; AVX2-NEXT:    vpsubusb %ymm3, %ymm1, %ymm1
115 ; AVX2-NEXT:    retq
117 ; AVX512F-LABEL: v64i8:
118 ; AVX512F:       # %bb.0:
119 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm2
120 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm3
121 ; AVX512F-NEXT:    vpsubusb %ymm2, %ymm3, %ymm2
122 ; AVX512F-NEXT:    vpsubusb %ymm1, %ymm0, %ymm0
123 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
124 ; AVX512F-NEXT:    retq
126 ; AVX512BW-LABEL: v64i8:
127 ; AVX512BW:       # %bb.0:
128 ; AVX512BW-NEXT:    vpsubusb %zmm1, %zmm0, %zmm0
129 ; AVX512BW-NEXT:    retq
130   %z = call <64 x i8> @llvm.usub.sat.v64i8(<64 x i8> %x, <64 x i8> %y)
131   ret <64 x i8> %z
134 define <8 x i16> @v8i16(<8 x i16> %x, <8 x i16> %y) nounwind {
135 ; SSE-LABEL: v8i16:
136 ; SSE:       # %bb.0:
137 ; SSE-NEXT:    psubusw %xmm1, %xmm0
138 ; SSE-NEXT:    retq
140 ; AVX-LABEL: v8i16:
141 ; AVX:       # %bb.0:
142 ; AVX-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
143 ; AVX-NEXT:    retq
144   %z = call <8 x i16> @llvm.usub.sat.v8i16(<8 x i16> %x, <8 x i16> %y)
145   ret <8 x i16> %z
148 define <16 x i16> @v16i16(<16 x i16> %x, <16 x i16> %y) nounwind {
149 ; SSE-LABEL: v16i16:
150 ; SSE:       # %bb.0:
151 ; SSE-NEXT:    psubusw %xmm2, %xmm0
152 ; SSE-NEXT:    psubusw %xmm3, %xmm1
153 ; SSE-NEXT:    retq
155 ; AVX1-LABEL: v16i16:
156 ; AVX1:       # %bb.0:
157 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
158 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
159 ; AVX1-NEXT:    vpsubusw %xmm2, %xmm3, %xmm2
160 ; AVX1-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
161 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
162 ; AVX1-NEXT:    retq
164 ; AVX2-LABEL: v16i16:
165 ; AVX2:       # %bb.0:
166 ; AVX2-NEXT:    vpsubusw %ymm1, %ymm0, %ymm0
167 ; AVX2-NEXT:    retq
169 ; AVX512-LABEL: v16i16:
170 ; AVX512:       # %bb.0:
171 ; AVX512-NEXT:    vpsubusw %ymm1, %ymm0, %ymm0
172 ; AVX512-NEXT:    retq
173   %z = call <16 x i16> @llvm.usub.sat.v16i16(<16 x i16> %x, <16 x i16> %y)
174   ret <16 x i16> %z
177 define <32 x i16> @v32i16(<32 x i16> %x, <32 x i16> %y) nounwind {
178 ; SSE-LABEL: v32i16:
179 ; SSE:       # %bb.0:
180 ; SSE-NEXT:    psubusw %xmm4, %xmm0
181 ; SSE-NEXT:    psubusw %xmm5, %xmm1
182 ; SSE-NEXT:    psubusw %xmm6, %xmm2
183 ; SSE-NEXT:    psubusw %xmm7, %xmm3
184 ; SSE-NEXT:    retq
186 ; AVX1-LABEL: v32i16:
187 ; AVX1:       # %bb.0:
188 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
189 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
190 ; AVX1-NEXT:    vpsubusw %xmm4, %xmm5, %xmm4
191 ; AVX1-NEXT:    vpsubusw %xmm2, %xmm0, %xmm0
192 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
193 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
194 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
195 ; AVX1-NEXT:    vpsubusw %xmm2, %xmm4, %xmm2
196 ; AVX1-NEXT:    vpsubusw %xmm3, %xmm1, %xmm1
197 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
198 ; AVX1-NEXT:    retq
200 ; AVX2-LABEL: v32i16:
201 ; AVX2:       # %bb.0:
202 ; AVX2-NEXT:    vpsubusw %ymm2, %ymm0, %ymm0
203 ; AVX2-NEXT:    vpsubusw %ymm3, %ymm1, %ymm1
204 ; AVX2-NEXT:    retq
206 ; AVX512F-LABEL: v32i16:
207 ; AVX512F:       # %bb.0:
208 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm2
209 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm3
210 ; AVX512F-NEXT:    vpsubusw %ymm2, %ymm3, %ymm2
211 ; AVX512F-NEXT:    vpsubusw %ymm1, %ymm0, %ymm0
212 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
213 ; AVX512F-NEXT:    retq
215 ; AVX512BW-LABEL: v32i16:
216 ; AVX512BW:       # %bb.0:
217 ; AVX512BW-NEXT:    vpsubusw %zmm1, %zmm0, %zmm0
218 ; AVX512BW-NEXT:    retq
219   %z = call <32 x i16> @llvm.usub.sat.v32i16(<32 x i16> %x, <32 x i16> %y)
220   ret <32 x i16> %z
223 ; Too narrow vectors, legalized by widening.
225 define void @v8i8(ptr %px, ptr %py, ptr %pz) nounwind {
226 ; SSE-LABEL: v8i8:
227 ; SSE:       # %bb.0:
228 ; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
229 ; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
230 ; SSE-NEXT:    psubusb %xmm1, %xmm0
231 ; SSE-NEXT:    movq %xmm0, (%rdx)
232 ; SSE-NEXT:    retq
234 ; AVX-LABEL: v8i8:
235 ; AVX:       # %bb.0:
236 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
237 ; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
238 ; AVX-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
239 ; AVX-NEXT:    vmovq %xmm0, (%rdx)
240 ; AVX-NEXT:    retq
241   %x = load <8 x i8>, ptr %px
242   %y = load <8 x i8>, ptr %py
243   %z = call <8 x i8> @llvm.usub.sat.v8i8(<8 x i8> %x, <8 x i8> %y)
244   store <8 x i8> %z, ptr %pz
245   ret void
248 define void @v4i8(ptr %px, ptr %py, ptr %pz) nounwind {
249 ; SSE-LABEL: v4i8:
250 ; SSE:       # %bb.0:
251 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
252 ; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
253 ; SSE-NEXT:    psubusb %xmm1, %xmm0
254 ; SSE-NEXT:    movd %xmm0, (%rdx)
255 ; SSE-NEXT:    retq
257 ; AVX-LABEL: v4i8:
258 ; AVX:       # %bb.0:
259 ; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
260 ; AVX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
261 ; AVX-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
262 ; AVX-NEXT:    vmovd %xmm0, (%rdx)
263 ; AVX-NEXT:    retq
264   %x = load <4 x i8>, ptr %px
265   %y = load <4 x i8>, ptr %py
266   %z = call <4 x i8> @llvm.usub.sat.v4i8(<4 x i8> %x, <4 x i8> %y)
267   store <4 x i8> %z, ptr %pz
268   ret void
271 define void @v2i8(ptr %px, ptr %py, ptr %pz) nounwind {
272 ; SSE2-LABEL: v2i8:
273 ; SSE2:       # %bb.0:
274 ; SSE2-NEXT:    movzwl (%rdi), %eax
275 ; SSE2-NEXT:    movd %eax, %xmm0
276 ; SSE2-NEXT:    movzwl (%rsi), %eax
277 ; SSE2-NEXT:    movd %eax, %xmm1
278 ; SSE2-NEXT:    psubusb %xmm1, %xmm0
279 ; SSE2-NEXT:    movd %xmm0, %eax
280 ; SSE2-NEXT:    movw %ax, (%rdx)
281 ; SSE2-NEXT:    retq
283 ; SSSE3-LABEL: v2i8:
284 ; SSSE3:       # %bb.0:
285 ; SSSE3-NEXT:    movzwl (%rdi), %eax
286 ; SSSE3-NEXT:    movd %eax, %xmm0
287 ; SSSE3-NEXT:    movzwl (%rsi), %eax
288 ; SSSE3-NEXT:    movd %eax, %xmm1
289 ; SSSE3-NEXT:    psubusb %xmm1, %xmm0
290 ; SSSE3-NEXT:    movd %xmm0, %eax
291 ; SSSE3-NEXT:    movw %ax, (%rdx)
292 ; SSSE3-NEXT:    retq
294 ; SSE41-LABEL: v2i8:
295 ; SSE41:       # %bb.0:
296 ; SSE41-NEXT:    movzwl (%rdi), %eax
297 ; SSE41-NEXT:    movd %eax, %xmm0
298 ; SSE41-NEXT:    movzwl (%rsi), %eax
299 ; SSE41-NEXT:    movd %eax, %xmm1
300 ; SSE41-NEXT:    psubusb %xmm1, %xmm0
301 ; SSE41-NEXT:    pextrw $0, %xmm0, (%rdx)
302 ; SSE41-NEXT:    retq
304 ; AVX-LABEL: v2i8:
305 ; AVX:       # %bb.0:
306 ; AVX-NEXT:    movzwl (%rdi), %eax
307 ; AVX-NEXT:    vmovd %eax, %xmm0
308 ; AVX-NEXT:    movzwl (%rsi), %eax
309 ; AVX-NEXT:    vmovd %eax, %xmm1
310 ; AVX-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
311 ; AVX-NEXT:    vpextrw $0, %xmm0, (%rdx)
312 ; AVX-NEXT:    retq
313   %x = load <2 x i8>, ptr %px
314   %y = load <2 x i8>, ptr %py
315   %z = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %x, <2 x i8> %y)
316   store <2 x i8> %z, ptr %pz
317   ret void
320 define void @v4i16(ptr %px, ptr %py, ptr %pz) nounwind {
321 ; SSE-LABEL: v4i16:
322 ; SSE:       # %bb.0:
323 ; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
324 ; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
325 ; SSE-NEXT:    psubusw %xmm1, %xmm0
326 ; SSE-NEXT:    movq %xmm0, (%rdx)
327 ; SSE-NEXT:    retq
329 ; AVX-LABEL: v4i16:
330 ; AVX:       # %bb.0:
331 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
332 ; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
333 ; AVX-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
334 ; AVX-NEXT:    vmovq %xmm0, (%rdx)
335 ; AVX-NEXT:    retq
336   %x = load <4 x i16>, ptr %px
337   %y = load <4 x i16>, ptr %py
338   %z = call <4 x i16> @llvm.usub.sat.v4i16(<4 x i16> %x, <4 x i16> %y)
339   store <4 x i16> %z, ptr %pz
340   ret void
343 define void @v2i16(ptr %px, ptr %py, ptr %pz) nounwind {
344 ; SSE-LABEL: v2i16:
345 ; SSE:       # %bb.0:
346 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
347 ; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
348 ; SSE-NEXT:    psubusw %xmm1, %xmm0
349 ; SSE-NEXT:    movd %xmm0, (%rdx)
350 ; SSE-NEXT:    retq
352 ; AVX-LABEL: v2i16:
353 ; AVX:       # %bb.0:
354 ; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
355 ; AVX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
356 ; AVX-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
357 ; AVX-NEXT:    vmovd %xmm0, (%rdx)
358 ; AVX-NEXT:    retq
359   %x = load <2 x i16>, ptr %px
360   %y = load <2 x i16>, ptr %py
361   %z = call <2 x i16> @llvm.usub.sat.v2i16(<2 x i16> %x, <2 x i16> %y)
362   store <2 x i16> %z, ptr %pz
363   ret void
366 define <12 x i8> @v12i8(<12 x i8> %x, <12 x i8> %y) nounwind {
367 ; SSE-LABEL: v12i8:
368 ; SSE:       # %bb.0:
369 ; SSE-NEXT:    psubusb %xmm1, %xmm0
370 ; SSE-NEXT:    retq
372 ; AVX-LABEL: v12i8:
373 ; AVX:       # %bb.0:
374 ; AVX-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
375 ; AVX-NEXT:    retq
376   %z = call <12 x i8> @llvm.usub.sat.v12i8(<12 x i8> %x, <12 x i8> %y)
377   ret <12 x i8> %z
380 define void @v12i16(ptr %px, ptr %py, ptr %pz) nounwind {
381 ; SSE-LABEL: v12i16:
382 ; SSE:       # %bb.0:
383 ; SSE-NEXT:    movdqa (%rdi), %xmm0
384 ; SSE-NEXT:    movdqa 16(%rdi), %xmm1
385 ; SSE-NEXT:    psubusw 16(%rsi), %xmm1
386 ; SSE-NEXT:    psubusw (%rsi), %xmm0
387 ; SSE-NEXT:    movdqa %xmm0, (%rdx)
388 ; SSE-NEXT:    movq %xmm1, 16(%rdx)
389 ; SSE-NEXT:    retq
391 ; AVX1-LABEL: v12i16:
392 ; AVX1:       # %bb.0:
393 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
394 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
395 ; AVX1-NEXT:    vpsubusw 16(%rsi), %xmm1, %xmm1
396 ; AVX1-NEXT:    vpsubusw (%rsi), %xmm0, %xmm0
397 ; AVX1-NEXT:    vmovdqa %xmm0, (%rdx)
398 ; AVX1-NEXT:    vmovq %xmm1, 16(%rdx)
399 ; AVX1-NEXT:    retq
401 ; AVX2-LABEL: v12i16:
402 ; AVX2:       # %bb.0:
403 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
404 ; AVX2-NEXT:    vpsubusw (%rsi), %ymm0, %ymm0
405 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
406 ; AVX2-NEXT:    vmovq %xmm1, 16(%rdx)
407 ; AVX2-NEXT:    vmovdqa %xmm0, (%rdx)
408 ; AVX2-NEXT:    vzeroupper
409 ; AVX2-NEXT:    retq
411 ; AVX512-LABEL: v12i16:
412 ; AVX512:       # %bb.0:
413 ; AVX512-NEXT:    vmovdqa (%rdi), %ymm0
414 ; AVX512-NEXT:    vpsubusw (%rsi), %ymm0, %ymm0
415 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
416 ; AVX512-NEXT:    vmovq %xmm1, 16(%rdx)
417 ; AVX512-NEXT:    vmovdqa %xmm0, (%rdx)
418 ; AVX512-NEXT:    vzeroupper
419 ; AVX512-NEXT:    retq
420   %x = load <12 x i16>, ptr %px
421   %y = load <12 x i16>, ptr %py
422   %z = call <12 x i16> @llvm.usub.sat.v12i16(<12 x i16> %x, <12 x i16> %y)
423   store <12 x i16> %z, ptr %pz
424   ret void
427 ; Scalarization
429 define void @v1i8(ptr %px, ptr %py, ptr %pz) nounwind {
430 ; SSE-LABEL: v1i8:
431 ; SSE:       # %bb.0:
432 ; SSE-NEXT:    movzbl (%rdi), %eax
433 ; SSE-NEXT:    xorl %ecx, %ecx
434 ; SSE-NEXT:    subb (%rsi), %al
435 ; SSE-NEXT:    movzbl %al, %eax
436 ; SSE-NEXT:    cmovbl %ecx, %eax
437 ; SSE-NEXT:    movb %al, (%rdx)
438 ; SSE-NEXT:    retq
440 ; AVX-LABEL: v1i8:
441 ; AVX:       # %bb.0:
442 ; AVX-NEXT:    movzbl (%rdi), %eax
443 ; AVX-NEXT:    xorl %ecx, %ecx
444 ; AVX-NEXT:    subb (%rsi), %al
445 ; AVX-NEXT:    movzbl %al, %eax
446 ; AVX-NEXT:    cmovbl %ecx, %eax
447 ; AVX-NEXT:    movb %al, (%rdx)
448 ; AVX-NEXT:    retq
449   %x = load <1 x i8>, ptr %px
450   %y = load <1 x i8>, ptr %py
451   %z = call <1 x i8> @llvm.usub.sat.v1i8(<1 x i8> %x, <1 x i8> %y)
452   store <1 x i8> %z, ptr %pz
453   ret void
456 define void @v1i16(ptr %px, ptr %py, ptr %pz) nounwind {
457 ; SSE-LABEL: v1i16:
458 ; SSE:       # %bb.0:
459 ; SSE-NEXT:    movzwl (%rdi), %eax
460 ; SSE-NEXT:    xorl %ecx, %ecx
461 ; SSE-NEXT:    subw (%rsi), %ax
462 ; SSE-NEXT:    cmovbl %ecx, %eax
463 ; SSE-NEXT:    movw %ax, (%rdx)
464 ; SSE-NEXT:    retq
466 ; AVX-LABEL: v1i16:
467 ; AVX:       # %bb.0:
468 ; AVX-NEXT:    movzwl (%rdi), %eax
469 ; AVX-NEXT:    xorl %ecx, %ecx
470 ; AVX-NEXT:    subw (%rsi), %ax
471 ; AVX-NEXT:    cmovbl %ecx, %eax
472 ; AVX-NEXT:    movw %ax, (%rdx)
473 ; AVX-NEXT:    retq
474   %x = load <1 x i16>, ptr %px
475   %y = load <1 x i16>, ptr %py
476   %z = call <1 x i16> @llvm.usub.sat.v1i16(<1 x i16> %x, <1 x i16> %y)
477   store <1 x i16> %z, ptr %pz
478   ret void
481 ; Promotion
483 define <16 x i4> @v16i4(<16 x i4> %x, <16 x i4> %y) nounwind {
484 ; SSE-LABEL: v16i4:
485 ; SSE:       # %bb.0:
486 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
487 ; SSE-NEXT:    pand %xmm2, %xmm1
488 ; SSE-NEXT:    pand %xmm2, %xmm0
489 ; SSE-NEXT:    psubusb %xmm1, %xmm0
490 ; SSE-NEXT:    retq
492 ; AVX1-LABEL: v16i4:
493 ; AVX1:       # %bb.0:
494 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
495 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
496 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
497 ; AVX1-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
498 ; AVX1-NEXT:    retq
500 ; AVX2-LABEL: v16i4:
501 ; AVX2:       # %bb.0:
502 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
503 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
504 ; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
505 ; AVX2-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
506 ; AVX2-NEXT:    retq
508 ; AVX512-LABEL: v16i4:
509 ; AVX512:       # %bb.0:
510 ; AVX512-NEXT:    vpbroadcastb {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
511 ; AVX512-NEXT:    vpand %xmm2, %xmm1, %xmm1
512 ; AVX512-NEXT:    vpand %xmm2, %xmm0, %xmm0
513 ; AVX512-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
514 ; AVX512-NEXT:    retq
515   %z = call <16 x i4> @llvm.usub.sat.v16i4(<16 x i4> %x, <16 x i4> %y)
516   ret <16 x i4> %z
519 define <16 x i1> @v16i1(<16 x i1> %x, <16 x i1> %y) nounwind {
520 ; SSE-LABEL: v16i1:
521 ; SSE:       # %bb.0:
522 ; SSE-NEXT:    xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
523 ; SSE-NEXT:    andps %xmm1, %xmm0
524 ; SSE-NEXT:    retq
526 ; AVX1-LABEL: v16i1:
527 ; AVX1:       # %bb.0:
528 ; AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
529 ; AVX1-NEXT:    vandps %xmm1, %xmm0, %xmm0
530 ; AVX1-NEXT:    retq
532 ; AVX2-LABEL: v16i1:
533 ; AVX2:       # %bb.0:
534 ; AVX2-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
535 ; AVX2-NEXT:    vandps %xmm1, %xmm0, %xmm0
536 ; AVX2-NEXT:    retq
538 ; AVX512F-LABEL: v16i1:
539 ; AVX512F:       # %bb.0:
540 ; AVX512F-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
541 ; AVX512F-NEXT:    vandps %xmm1, %xmm0, %xmm0
542 ; AVX512F-NEXT:    retq
544 ; AVX512BW-LABEL: v16i1:
545 ; AVX512BW:       # %bb.0:
546 ; AVX512BW-NEXT:    vpternlogd $96, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm0
547 ; AVX512BW-NEXT:    retq
548   %z = call <16 x i1> @llvm.usub.sat.v16i1(<16 x i1> %x, <16 x i1> %y)
549   ret <16 x i1> %z
552 ; Expanded
554 define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {
555 ; SSE2-LABEL: v2i32:
556 ; SSE2:       # %bb.0:
557 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
558 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
559 ; SSE2-NEXT:    pxor %xmm2, %xmm3
560 ; SSE2-NEXT:    pxor %xmm0, %xmm2
561 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
562 ; SSE2-NEXT:    psubd %xmm1, %xmm0
563 ; SSE2-NEXT:    pand %xmm2, %xmm0
564 ; SSE2-NEXT:    retq
566 ; SSSE3-LABEL: v2i32:
567 ; SSSE3:       # %bb.0:
568 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
569 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
570 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
571 ; SSSE3-NEXT:    pxor %xmm0, %xmm2
572 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2
573 ; SSSE3-NEXT:    psubd %xmm1, %xmm0
574 ; SSSE3-NEXT:    pand %xmm2, %xmm0
575 ; SSSE3-NEXT:    retq
577 ; SSE41-LABEL: v2i32:
578 ; SSE41:       # %bb.0:
579 ; SSE41-NEXT:    pmaxud %xmm1, %xmm0
580 ; SSE41-NEXT:    psubd %xmm1, %xmm0
581 ; SSE41-NEXT:    retq
583 ; AVX-LABEL: v2i32:
584 ; AVX:       # %bb.0:
585 ; AVX-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
586 ; AVX-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
587 ; AVX-NEXT:    retq
588   %z = call <2 x i32> @llvm.usub.sat.v2i32(<2 x i32> %x, <2 x i32> %y)
589   ret <2 x i32> %z
592 define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {
593 ; SSE2-LABEL: v4i32:
594 ; SSE2:       # %bb.0:
595 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
596 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
597 ; SSE2-NEXT:    pxor %xmm2, %xmm3
598 ; SSE2-NEXT:    pxor %xmm0, %xmm2
599 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
600 ; SSE2-NEXT:    psubd %xmm1, %xmm0
601 ; SSE2-NEXT:    pand %xmm2, %xmm0
602 ; SSE2-NEXT:    retq
604 ; SSSE3-LABEL: v4i32:
605 ; SSSE3:       # %bb.0:
606 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
607 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
608 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
609 ; SSSE3-NEXT:    pxor %xmm0, %xmm2
610 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2
611 ; SSSE3-NEXT:    psubd %xmm1, %xmm0
612 ; SSSE3-NEXT:    pand %xmm2, %xmm0
613 ; SSSE3-NEXT:    retq
615 ; SSE41-LABEL: v4i32:
616 ; SSE41:       # %bb.0:
617 ; SSE41-NEXT:    pmaxud %xmm1, %xmm0
618 ; SSE41-NEXT:    psubd %xmm1, %xmm0
619 ; SSE41-NEXT:    retq
621 ; AVX-LABEL: v4i32:
622 ; AVX:       # %bb.0:
623 ; AVX-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
624 ; AVX-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
625 ; AVX-NEXT:    retq
626   %z = call <4 x i32> @llvm.usub.sat.v4i32(<4 x i32> %x, <4 x i32> %y)
627   ret <4 x i32> %z
630 define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
631 ; SSE2-LABEL: v8i32:
632 ; SSE2:       # %bb.0:
633 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
634 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
635 ; SSE2-NEXT:    psubd %xmm2, %xmm0
636 ; SSE2-NEXT:    pxor %xmm4, %xmm2
637 ; SSE2-NEXT:    pxor %xmm4, %xmm5
638 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
639 ; SSE2-NEXT:    pand %xmm5, %xmm0
640 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
641 ; SSE2-NEXT:    pxor %xmm4, %xmm2
642 ; SSE2-NEXT:    pxor %xmm1, %xmm4
643 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
644 ; SSE2-NEXT:    psubd %xmm3, %xmm1
645 ; SSE2-NEXT:    pand %xmm4, %xmm1
646 ; SSE2-NEXT:    retq
648 ; SSSE3-LABEL: v8i32:
649 ; SSSE3:       # %bb.0:
650 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
651 ; SSSE3-NEXT:    movdqa %xmm0, %xmm5
652 ; SSSE3-NEXT:    psubd %xmm2, %xmm0
653 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
654 ; SSSE3-NEXT:    pxor %xmm4, %xmm5
655 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm5
656 ; SSSE3-NEXT:    pand %xmm5, %xmm0
657 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
658 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
659 ; SSSE3-NEXT:    pxor %xmm1, %xmm4
660 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
661 ; SSSE3-NEXT:    psubd %xmm3, %xmm1
662 ; SSSE3-NEXT:    pand %xmm4, %xmm1
663 ; SSSE3-NEXT:    retq
665 ; SSE41-LABEL: v8i32:
666 ; SSE41:       # %bb.0:
667 ; SSE41-NEXT:    pmaxud %xmm2, %xmm0
668 ; SSE41-NEXT:    psubd %xmm2, %xmm0
669 ; SSE41-NEXT:    pmaxud %xmm3, %xmm1
670 ; SSE41-NEXT:    psubd %xmm3, %xmm1
671 ; SSE41-NEXT:    retq
673 ; AVX1-LABEL: v8i32:
674 ; AVX1:       # %bb.0:
675 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
676 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
677 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm3, %xmm3
678 ; AVX1-NEXT:    vpsubd %xmm2, %xmm3, %xmm2
679 ; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
680 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
681 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
682 ; AVX1-NEXT:    retq
684 ; AVX2-LABEL: v8i32:
685 ; AVX2:       # %bb.0:
686 ; AVX2-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0
687 ; AVX2-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
688 ; AVX2-NEXT:    retq
690 ; AVX512-LABEL: v8i32:
691 ; AVX512:       # %bb.0:
692 ; AVX512-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0
693 ; AVX512-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
694 ; AVX512-NEXT:    retq
695   %z = call <8 x i32> @llvm.usub.sat.v8i32(<8 x i32> %x, <8 x i32> %y)
696   ret <8 x i32> %z
699 define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind {
700 ; SSE2-LABEL: v16i32:
701 ; SSE2:       # %bb.0:
702 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
703 ; SSE2-NEXT:    movdqa %xmm0, %xmm9
704 ; SSE2-NEXT:    psubd %xmm4, %xmm0
705 ; SSE2-NEXT:    pxor %xmm8, %xmm4
706 ; SSE2-NEXT:    pxor %xmm8, %xmm9
707 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm9
708 ; SSE2-NEXT:    pand %xmm9, %xmm0
709 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
710 ; SSE2-NEXT:    psubd %xmm5, %xmm1
711 ; SSE2-NEXT:    pxor %xmm8, %xmm5
712 ; SSE2-NEXT:    pxor %xmm8, %xmm4
713 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm4
714 ; SSE2-NEXT:    pand %xmm4, %xmm1
715 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
716 ; SSE2-NEXT:    psubd %xmm6, %xmm2
717 ; SSE2-NEXT:    pxor %xmm8, %xmm6
718 ; SSE2-NEXT:    pxor %xmm8, %xmm4
719 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm4
720 ; SSE2-NEXT:    pand %xmm4, %xmm2
721 ; SSE2-NEXT:    movdqa %xmm7, %xmm4
722 ; SSE2-NEXT:    pxor %xmm8, %xmm4
723 ; SSE2-NEXT:    pxor %xmm3, %xmm8
724 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm8
725 ; SSE2-NEXT:    psubd %xmm7, %xmm3
726 ; SSE2-NEXT:    pand %xmm8, %xmm3
727 ; SSE2-NEXT:    retq
729 ; SSSE3-LABEL: v16i32:
730 ; SSSE3:       # %bb.0:
731 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
732 ; SSSE3-NEXT:    movdqa %xmm0, %xmm9
733 ; SSSE3-NEXT:    psubd %xmm4, %xmm0
734 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
735 ; SSSE3-NEXT:    pxor %xmm8, %xmm9
736 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm9
737 ; SSSE3-NEXT:    pand %xmm9, %xmm0
738 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
739 ; SSSE3-NEXT:    psubd %xmm5, %xmm1
740 ; SSSE3-NEXT:    pxor %xmm8, %xmm5
741 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
742 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm4
743 ; SSSE3-NEXT:    pand %xmm4, %xmm1
744 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
745 ; SSSE3-NEXT:    psubd %xmm6, %xmm2
746 ; SSSE3-NEXT:    pxor %xmm8, %xmm6
747 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
748 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm4
749 ; SSSE3-NEXT:    pand %xmm4, %xmm2
750 ; SSSE3-NEXT:    movdqa %xmm7, %xmm4
751 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
752 ; SSSE3-NEXT:    pxor %xmm3, %xmm8
753 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm8
754 ; SSSE3-NEXT:    psubd %xmm7, %xmm3
755 ; SSSE3-NEXT:    pand %xmm8, %xmm3
756 ; SSSE3-NEXT:    retq
758 ; SSE41-LABEL: v16i32:
759 ; SSE41:       # %bb.0:
760 ; SSE41-NEXT:    pmaxud %xmm4, %xmm0
761 ; SSE41-NEXT:    psubd %xmm4, %xmm0
762 ; SSE41-NEXT:    pmaxud %xmm5, %xmm1
763 ; SSE41-NEXT:    psubd %xmm5, %xmm1
764 ; SSE41-NEXT:    pmaxud %xmm6, %xmm2
765 ; SSE41-NEXT:    psubd %xmm6, %xmm2
766 ; SSE41-NEXT:    pmaxud %xmm7, %xmm3
767 ; SSE41-NEXT:    psubd %xmm7, %xmm3
768 ; SSE41-NEXT:    retq
770 ; AVX1-LABEL: v16i32:
771 ; AVX1:       # %bb.0:
772 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
773 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
774 ; AVX1-NEXT:    vpmaxud %xmm4, %xmm5, %xmm5
775 ; AVX1-NEXT:    vpsubd %xmm4, %xmm5, %xmm4
776 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm0, %xmm0
777 ; AVX1-NEXT:    vpsubd %xmm2, %xmm0, %xmm0
778 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
779 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
780 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
781 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm4, %xmm4
782 ; AVX1-NEXT:    vpsubd %xmm2, %xmm4, %xmm2
783 ; AVX1-NEXT:    vpmaxud %xmm3, %xmm1, %xmm1
784 ; AVX1-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
785 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
786 ; AVX1-NEXT:    retq
788 ; AVX2-LABEL: v16i32:
789 ; AVX2:       # %bb.0:
790 ; AVX2-NEXT:    vpmaxud %ymm2, %ymm0, %ymm0
791 ; AVX2-NEXT:    vpsubd %ymm2, %ymm0, %ymm0
792 ; AVX2-NEXT:    vpmaxud %ymm3, %ymm1, %ymm1
793 ; AVX2-NEXT:    vpsubd %ymm3, %ymm1, %ymm1
794 ; AVX2-NEXT:    retq
796 ; AVX512-LABEL: v16i32:
797 ; AVX512:       # %bb.0:
798 ; AVX512-NEXT:    vpmaxud %zmm1, %zmm0, %zmm0
799 ; AVX512-NEXT:    vpsubd %zmm1, %zmm0, %zmm0
800 ; AVX512-NEXT:    retq
801   %z = call <16 x i32> @llvm.usub.sat.v16i32(<16 x i32> %x, <16 x i32> %y)
802   ret <16 x i32> %z
805 define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {
806 ; SSE-LABEL: v2i64:
807 ; SSE:       # %bb.0:
808 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
809 ; SSE-NEXT:    movdqa %xmm1, %xmm3
810 ; SSE-NEXT:    pxor %xmm2, %xmm3
811 ; SSE-NEXT:    pxor %xmm0, %xmm2
812 ; SSE-NEXT:    movdqa %xmm2, %xmm4
813 ; SSE-NEXT:    pcmpgtd %xmm3, %xmm4
814 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
815 ; SSE-NEXT:    pcmpeqd %xmm3, %xmm2
816 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
817 ; SSE-NEXT:    pand %xmm5, %xmm2
818 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
819 ; SSE-NEXT:    por %xmm2, %xmm3
820 ; SSE-NEXT:    psubq %xmm1, %xmm0
821 ; SSE-NEXT:    pand %xmm3, %xmm0
822 ; SSE-NEXT:    retq
824 ; AVX1-LABEL: v2i64:
825 ; AVX1:       # %bb.0:
826 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
827 ; AVX1-NEXT:    # xmm2 = mem[0,0]
828 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm3
829 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm2
830 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
831 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
832 ; AVX1-NEXT:    vpand %xmm0, %xmm2, %xmm0
833 ; AVX1-NEXT:    retq
835 ; AVX2-LABEL: v2i64:
836 ; AVX2:       # %bb.0:
837 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
838 ; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm3
839 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm2
840 ; AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
841 ; AVX2-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
842 ; AVX2-NEXT:    vpand %xmm0, %xmm2, %xmm0
843 ; AVX2-NEXT:    retq
845 ; AVX512F-LABEL: v2i64:
846 ; AVX512F:       # %bb.0:
847 ; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
848 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
849 ; AVX512F-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
850 ; AVX512F-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
851 ; AVX512F-NEXT:    vzeroupper
852 ; AVX512F-NEXT:    retq
854 ; AVX512BW-LABEL: v2i64:
855 ; AVX512BW:       # %bb.0:
856 ; AVX512BW-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
857 ; AVX512BW-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
858 ; AVX512BW-NEXT:    retq
859   %z = call <2 x i64> @llvm.usub.sat.v2i64(<2 x i64> %x, <2 x i64> %y)
860   ret <2 x i64> %z
863 define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
864 ; SSE-LABEL: v4i64:
865 ; SSE:       # %bb.0:
866 ; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
867 ; SSE-NEXT:    movdqa %xmm0, %xmm5
868 ; SSE-NEXT:    psubq %xmm2, %xmm0
869 ; SSE-NEXT:    pxor %xmm4, %xmm2
870 ; SSE-NEXT:    pxor %xmm4, %xmm5
871 ; SSE-NEXT:    movdqa %xmm5, %xmm6
872 ; SSE-NEXT:    pcmpgtd %xmm2, %xmm6
873 ; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
874 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm5
875 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
876 ; SSE-NEXT:    pand %xmm7, %xmm2
877 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
878 ; SSE-NEXT:    por %xmm2, %xmm5
879 ; SSE-NEXT:    pand %xmm5, %xmm0
880 ; SSE-NEXT:    movdqa %xmm3, %xmm2
881 ; SSE-NEXT:    pxor %xmm4, %xmm2
882 ; SSE-NEXT:    pxor %xmm1, %xmm4
883 ; SSE-NEXT:    movdqa %xmm4, %xmm5
884 ; SSE-NEXT:    pcmpgtd %xmm2, %xmm5
885 ; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
886 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm4
887 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
888 ; SSE-NEXT:    pand %xmm6, %xmm2
889 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
890 ; SSE-NEXT:    por %xmm2, %xmm4
891 ; SSE-NEXT:    psubq %xmm3, %xmm1
892 ; SSE-NEXT:    pand %xmm4, %xmm1
893 ; SSE-NEXT:    retq
895 ; AVX1-LABEL: v4i64:
896 ; AVX1:       # %bb.0:
897 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
898 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
899 ; AVX1-NEXT:    # xmm3 = mem[0,0]
900 ; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm4
901 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
902 ; AVX1-NEXT:    vpxor %xmm3, %xmm5, %xmm6
903 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
904 ; AVX1-NEXT:    vpsubq %xmm2, %xmm5, %xmm2
905 ; AVX1-NEXT:    vpand %xmm2, %xmm4, %xmm2
906 ; AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm4
907 ; AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm3
908 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm3, %xmm3
909 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
910 ; AVX1-NEXT:    vpand %xmm0, %xmm3, %xmm0
911 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
912 ; AVX1-NEXT:    retq
914 ; AVX2-LABEL: v4i64:
915 ; AVX2:       # %bb.0:
916 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
917 ; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm3
918 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm2
919 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm2, %ymm2
920 ; AVX2-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
921 ; AVX2-NEXT:    vpand %ymm0, %ymm2, %ymm0
922 ; AVX2-NEXT:    retq
924 ; AVX512F-LABEL: v4i64:
925 ; AVX512F:       # %bb.0:
926 ; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
927 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
928 ; AVX512F-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
929 ; AVX512F-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
930 ; AVX512F-NEXT:    retq
932 ; AVX512BW-LABEL: v4i64:
933 ; AVX512BW:       # %bb.0:
934 ; AVX512BW-NEXT:    vpmaxuq %ymm1, %ymm0, %ymm0
935 ; AVX512BW-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
936 ; AVX512BW-NEXT:    retq
937   %z = call <4 x i64> @llvm.usub.sat.v4i64(<4 x i64> %x, <4 x i64> %y)
938   ret <4 x i64> %z
941 define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind {
942 ; SSE-LABEL: v8i64:
943 ; SSE:       # %bb.0:
944 ; SSE-NEXT:    movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
945 ; SSE-NEXT:    movdqa %xmm0, %xmm9
946 ; SSE-NEXT:    psubq %xmm4, %xmm0
947 ; SSE-NEXT:    pxor %xmm8, %xmm4
948 ; SSE-NEXT:    pxor %xmm8, %xmm9
949 ; SSE-NEXT:    movdqa %xmm9, %xmm10
950 ; SSE-NEXT:    pcmpgtd %xmm4, %xmm10
951 ; SSE-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
952 ; SSE-NEXT:    pcmpeqd %xmm4, %xmm9
953 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm9[1,1,3,3]
954 ; SSE-NEXT:    pand %xmm11, %xmm4
955 ; SSE-NEXT:    pshufd {{.*#+}} xmm9 = xmm10[1,1,3,3]
956 ; SSE-NEXT:    por %xmm4, %xmm9
957 ; SSE-NEXT:    pand %xmm9, %xmm0
958 ; SSE-NEXT:    movdqa %xmm1, %xmm4
959 ; SSE-NEXT:    psubq %xmm5, %xmm1
960 ; SSE-NEXT:    pxor %xmm8, %xmm5
961 ; SSE-NEXT:    pxor %xmm8, %xmm4
962 ; SSE-NEXT:    movdqa %xmm4, %xmm9
963 ; SSE-NEXT:    pcmpgtd %xmm5, %xmm9
964 ; SSE-NEXT:    pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
965 ; SSE-NEXT:    pcmpeqd %xmm5, %xmm4
966 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
967 ; SSE-NEXT:    pand %xmm10, %xmm4
968 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm9[1,1,3,3]
969 ; SSE-NEXT:    por %xmm4, %xmm5
970 ; SSE-NEXT:    pand %xmm5, %xmm1
971 ; SSE-NEXT:    movdqa %xmm2, %xmm4
972 ; SSE-NEXT:    psubq %xmm6, %xmm2
973 ; SSE-NEXT:    pxor %xmm8, %xmm6
974 ; SSE-NEXT:    pxor %xmm8, %xmm4
975 ; SSE-NEXT:    movdqa %xmm4, %xmm5
976 ; SSE-NEXT:    pcmpgtd %xmm6, %xmm5
977 ; SSE-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
978 ; SSE-NEXT:    pcmpeqd %xmm6, %xmm4
979 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
980 ; SSE-NEXT:    pand %xmm9, %xmm4
981 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
982 ; SSE-NEXT:    por %xmm4, %xmm5
983 ; SSE-NEXT:    pand %xmm5, %xmm2
984 ; SSE-NEXT:    movdqa %xmm7, %xmm4
985 ; SSE-NEXT:    pxor %xmm8, %xmm4
986 ; SSE-NEXT:    pxor %xmm3, %xmm8
987 ; SSE-NEXT:    movdqa %xmm8, %xmm5
988 ; SSE-NEXT:    pcmpgtd %xmm4, %xmm5
989 ; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
990 ; SSE-NEXT:    pcmpeqd %xmm4, %xmm8
991 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm8[1,1,3,3]
992 ; SSE-NEXT:    pand %xmm6, %xmm4
993 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
994 ; SSE-NEXT:    por %xmm4, %xmm5
995 ; SSE-NEXT:    psubq %xmm7, %xmm3
996 ; SSE-NEXT:    pand %xmm5, %xmm3
997 ; SSE-NEXT:    retq
999 ; AVX1-LABEL: v8i64:
1000 ; AVX1:       # %bb.0:
1001 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1002 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]
1003 ; AVX1-NEXT:    # xmm5 = mem[0,0]
1004 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm6
1005 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
1006 ; AVX1-NEXT:    vpxor %xmm5, %xmm7, %xmm8
1007 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm8, %xmm6
1008 ; AVX1-NEXT:    vpsubq %xmm4, %xmm7, %xmm4
1009 ; AVX1-NEXT:    vpand %xmm4, %xmm6, %xmm4
1010 ; AVX1-NEXT:    vpxor %xmm5, %xmm2, %xmm6
1011 ; AVX1-NEXT:    vpxor %xmm5, %xmm0, %xmm7
1012 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
1013 ; AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
1014 ; AVX1-NEXT:    vpand %xmm0, %xmm6, %xmm0
1015 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
1016 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
1017 ; AVX1-NEXT:    vpxor %xmm5, %xmm2, %xmm4
1018 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm6
1019 ; AVX1-NEXT:    vpxor %xmm5, %xmm6, %xmm7
1020 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm7, %xmm4
1021 ; AVX1-NEXT:    vpsubq %xmm2, %xmm6, %xmm2
1022 ; AVX1-NEXT:    vpand %xmm2, %xmm4, %xmm2
1023 ; AVX1-NEXT:    vpxor %xmm5, %xmm3, %xmm4
1024 ; AVX1-NEXT:    vpxor %xmm5, %xmm1, %xmm5
1025 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
1026 ; AVX1-NEXT:    vpsubq %xmm3, %xmm1, %xmm1
1027 ; AVX1-NEXT:    vpand %xmm1, %xmm4, %xmm1
1028 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1029 ; AVX1-NEXT:    retq
1031 ; AVX2-LABEL: v8i64:
1032 ; AVX2:       # %bb.0:
1033 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1034 ; AVX2-NEXT:    vpxor %ymm4, %ymm2, %ymm5
1035 ; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm6
1036 ; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm6, %ymm5
1037 ; AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
1038 ; AVX2-NEXT:    vpand %ymm0, %ymm5, %ymm0
1039 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm2
1040 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm4
1041 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm4, %ymm2
1042 ; AVX2-NEXT:    vpsubq %ymm3, %ymm1, %ymm1
1043 ; AVX2-NEXT:    vpand %ymm1, %ymm2, %ymm1
1044 ; AVX2-NEXT:    retq
1046 ; AVX512-LABEL: v8i64:
1047 ; AVX512:       # %bb.0:
1048 ; AVX512-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
1049 ; AVX512-NEXT:    vpsubq %zmm1, %zmm0, %zmm0
1050 ; AVX512-NEXT:    retq
1051   %z = call <8 x i64> @llvm.usub.sat.v8i64(<8 x i64> %x, <8 x i64> %y)
1052   ret <8 x i64> %z
1055 define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind {
1056 ; SSE-LABEL: v2i128:
1057 ; SSE:       # %bb.0:
1058 ; SSE-NEXT:    movq %rdi, %rax
1059 ; SSE-NEXT:    xorl %edi, %edi
1060 ; SSE-NEXT:    subq {{[0-9]+}}(%rsp), %rsi
1061 ; SSE-NEXT:    sbbq {{[0-9]+}}(%rsp), %rdx
1062 ; SSE-NEXT:    cmovbq %rdi, %rdx
1063 ; SSE-NEXT:    cmovbq %rdi, %rsi
1064 ; SSE-NEXT:    subq {{[0-9]+}}(%rsp), %rcx
1065 ; SSE-NEXT:    sbbq {{[0-9]+}}(%rsp), %r8
1066 ; SSE-NEXT:    cmovbq %rdi, %r8
1067 ; SSE-NEXT:    cmovbq %rdi, %rcx
1068 ; SSE-NEXT:    movq %r8, 24(%rax)
1069 ; SSE-NEXT:    movq %rcx, 16(%rax)
1070 ; SSE-NEXT:    movq %rdx, 8(%rax)
1071 ; SSE-NEXT:    movq %rsi, (%rax)
1072 ; SSE-NEXT:    retq
1074 ; AVX-LABEL: v2i128:
1075 ; AVX:       # %bb.0:
1076 ; AVX-NEXT:    movq %rdi, %rax
1077 ; AVX-NEXT:    xorl %edi, %edi
1078 ; AVX-NEXT:    subq {{[0-9]+}}(%rsp), %rsi
1079 ; AVX-NEXT:    sbbq {{[0-9]+}}(%rsp), %rdx
1080 ; AVX-NEXT:    cmovbq %rdi, %rdx
1081 ; AVX-NEXT:    cmovbq %rdi, %rsi
1082 ; AVX-NEXT:    subq {{[0-9]+}}(%rsp), %rcx
1083 ; AVX-NEXT:    sbbq {{[0-9]+}}(%rsp), %r8
1084 ; AVX-NEXT:    cmovbq %rdi, %r8
1085 ; AVX-NEXT:    cmovbq %rdi, %rcx
1086 ; AVX-NEXT:    movq %r8, 24(%rax)
1087 ; AVX-NEXT:    movq %rcx, 16(%rax)
1088 ; AVX-NEXT:    movq %rdx, 8(%rax)
1089 ; AVX-NEXT:    movq %rsi, (%rax)
1090 ; AVX-NEXT:    retq
1091   %z = call <2 x i128> @llvm.usub.sat.v2i128(<2 x i128> %x, <2 x i128> %y)
1092   ret <2 x i128> %z
1095 define void @PR48223(ptr %p0) {
1096 ; SSE-LABEL: PR48223:
1097 ; SSE:       # %bb.0:
1098 ; SSE-NEXT:    movdqa (%rdi), %xmm0
1099 ; SSE-NEXT:    movdqa 16(%rdi), %xmm1
1100 ; SSE-NEXT:    movdqa 32(%rdi), %xmm2
1101 ; SSE-NEXT:    movdqa 48(%rdi), %xmm3
1102 ; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [64,64,64,64,64,64,64,64]
1103 ; SSE-NEXT:    psubusw %xmm4, %xmm1
1104 ; SSE-NEXT:    psubusw %xmm4, %xmm0
1105 ; SSE-NEXT:    psubusw %xmm4, %xmm3
1106 ; SSE-NEXT:    psubusw %xmm4, %xmm2
1107 ; SSE-NEXT:    movdqa %xmm2, 32(%rdi)
1108 ; SSE-NEXT:    movdqa %xmm3, 48(%rdi)
1109 ; SSE-NEXT:    movdqa %xmm0, (%rdi)
1110 ; SSE-NEXT:    movdqa %xmm1, 16(%rdi)
1111 ; SSE-NEXT:    retq
1113 ; AVX1-LABEL: PR48223:
1114 ; AVX1:       # %bb.0:
1115 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
1116 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
1117 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm2
1118 ; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm3
1119 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm4 = [64,64,64,64,64,64,64,64]
1120 ; AVX1-NEXT:    vpsubusw %xmm4, %xmm3, %xmm3
1121 ; AVX1-NEXT:    vpsubusw %xmm4, %xmm2, %xmm2
1122 ; AVX1-NEXT:    vpsubusw %xmm4, %xmm1, %xmm1
1123 ; AVX1-NEXT:    vpsubusw %xmm4, %xmm0, %xmm0
1124 ; AVX1-NEXT:    vmovdqa %xmm0, (%rdi)
1125 ; AVX1-NEXT:    vmovdqa %xmm1, 16(%rdi)
1126 ; AVX1-NEXT:    vmovdqa %xmm2, 32(%rdi)
1127 ; AVX1-NEXT:    vmovdqa %xmm3, 48(%rdi)
1128 ; AVX1-NEXT:    retq
1130 ; AVX2-LABEL: PR48223:
1131 ; AVX2:       # %bb.0:
1132 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
1133 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
1134 ; AVX2-NEXT:    vpbroadcastw {{.*#+}} ymm2 = [64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64]
1135 ; AVX2-NEXT:    vpsubusw %ymm2, %ymm1, %ymm1
1136 ; AVX2-NEXT:    vpsubusw %ymm2, %ymm0, %ymm0
1137 ; AVX2-NEXT:    vmovdqa %ymm0, (%rdi)
1138 ; AVX2-NEXT:    vmovdqa %ymm1, 32(%rdi)
1139 ; AVX2-NEXT:    vzeroupper
1140 ; AVX2-NEXT:    retq
1142 ; AVX512F-LABEL: PR48223:
1143 ; AVX512F:       # %bb.0:
1144 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
1145 ; AVX512F-NEXT:    vmovdqa 32(%rdi), %ymm1
1146 ; AVX512F-NEXT:    vpbroadcastw {{.*#+}} ymm2 = [64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64]
1147 ; AVX512F-NEXT:    vpsubusw %ymm2, %ymm1, %ymm1
1148 ; AVX512F-NEXT:    vpsubusw %ymm2, %ymm0, %ymm0
1149 ; AVX512F-NEXT:    vmovdqa %ymm0, (%rdi)
1150 ; AVX512F-NEXT:    vmovdqa %ymm1, 32(%rdi)
1151 ; AVX512F-NEXT:    vzeroupper
1152 ; AVX512F-NEXT:    retq
1154 ; AVX512BW-LABEL: PR48223:
1155 ; AVX512BW:       # %bb.0:
1156 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
1157 ; AVX512BW-NEXT:    vpsubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
1158 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, (%rdi)
1159 ; AVX512BW-NEXT:    vzeroupper
1160 ; AVX512BW-NEXT:    retq
1161   %1 = load <32 x i16>, ptr %p0, align 64
1162   %2 = icmp ugt <32 x i16> %1, <i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63, i16 63>
1163   %3 = add <32 x i16> %1, <i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64, i16 -64>
1164   %4 = select <32 x i1> %2, <32 x i16> %3, <32 x i16> zeroinitializer
1165   store <32 x i16> %4, ptr %p0, align 64
1166   ret void