[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / usub_sat_vec.ll
blobd56f9150a84c19670fbb6cdc27b11ad7212ff202
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=+avx512bw,+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX,AVX512
9 declare <1 x i8> @llvm.usub.sat.v1i8(<1 x i8>, <1 x i8>)
10 declare <2 x i8> @llvm.usub.sat.v2i8(<2 x i8>, <2 x i8>)
11 declare <4 x i8> @llvm.usub.sat.v4i8(<4 x i8>, <4 x i8>)
12 declare <8 x i8> @llvm.usub.sat.v8i8(<8 x i8>, <8 x i8>)
13 declare <12 x i8> @llvm.usub.sat.v12i8(<12 x i8>, <12 x i8>)
14 declare <16 x i8> @llvm.usub.sat.v16i8(<16 x i8>, <16 x i8>)
15 declare <32 x i8> @llvm.usub.sat.v32i8(<32 x i8>, <32 x i8>)
16 declare <64 x i8> @llvm.usub.sat.v64i8(<64 x i8>, <64 x i8>)
18 declare <1 x i16> @llvm.usub.sat.v1i16(<1 x i16>, <1 x i16>)
19 declare <2 x i16> @llvm.usub.sat.v2i16(<2 x i16>, <2 x i16>)
20 declare <4 x i16> @llvm.usub.sat.v4i16(<4 x i16>, <4 x i16>)
21 declare <8 x i16> @llvm.usub.sat.v8i16(<8 x i16>, <8 x i16>)
22 declare <12 x i16> @llvm.usub.sat.v12i16(<12 x i16>, <12 x i16>)
23 declare <16 x i16> @llvm.usub.sat.v16i16(<16 x i16>, <16 x i16>)
24 declare <32 x i16> @llvm.usub.sat.v32i16(<32 x i16>, <32 x i16>)
26 declare <16 x i1> @llvm.usub.sat.v16i1(<16 x i1>, <16 x i1>)
27 declare <16 x i4> @llvm.usub.sat.v16i4(<16 x i4>, <16 x i4>)
29 declare <2 x i32> @llvm.usub.sat.v2i32(<2 x i32>, <2 x i32>)
30 declare <4 x i32> @llvm.usub.sat.v4i32(<4 x i32>, <4 x i32>)
31 declare <8 x i32> @llvm.usub.sat.v8i32(<8 x i32>, <8 x i32>)
32 declare <16 x i32> @llvm.usub.sat.v16i32(<16 x i32>, <16 x i32>)
33 declare <2 x i64> @llvm.usub.sat.v2i64(<2 x i64>, <2 x i64>)
34 declare <4 x i64> @llvm.usub.sat.v4i64(<4 x i64>, <4 x i64>)
35 declare <8 x i64> @llvm.usub.sat.v8i64(<8 x i64>, <8 x i64>)
37 declare <4 x i24> @llvm.usub.sat.v4i24(<4 x i24>, <4 x i24>)
38 declare <2 x i128> @llvm.usub.sat.v2i128(<2 x i128>, <2 x i128>)
40 ; Legal types, depending on architecture.
42 define <16 x i8> @v16i8(<16 x i8> %x, <16 x i8> %y) nounwind {
43 ; SSE-LABEL: v16i8:
44 ; SSE:       # %bb.0:
45 ; SSE-NEXT:    psubusb %xmm1, %xmm0
46 ; SSE-NEXT:    retq
48 ; AVX-LABEL: v16i8:
49 ; AVX:       # %bb.0:
50 ; AVX-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
51 ; AVX-NEXT:    retq
52   %z = call <16 x i8> @llvm.usub.sat.v16i8(<16 x i8> %x, <16 x i8> %y)
53   ret <16 x i8> %z
56 define <32 x i8> @v32i8(<32 x i8> %x, <32 x i8> %y) nounwind {
57 ; SSE-LABEL: v32i8:
58 ; SSE:       # %bb.0:
59 ; SSE-NEXT:    psubusb %xmm2, %xmm0
60 ; SSE-NEXT:    psubusb %xmm3, %xmm1
61 ; SSE-NEXT:    retq
63 ; AVX1-LABEL: v32i8:
64 ; AVX1:       # %bb.0:
65 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
66 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
67 ; AVX1-NEXT:    vpsubusb %xmm2, %xmm3, %xmm2
68 ; AVX1-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
69 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
70 ; AVX1-NEXT:    retq
72 ; AVX2-LABEL: v32i8:
73 ; AVX2:       # %bb.0:
74 ; AVX2-NEXT:    vpsubusb %ymm1, %ymm0, %ymm0
75 ; AVX2-NEXT:    retq
77 ; AVX512-LABEL: v32i8:
78 ; AVX512:       # %bb.0:
79 ; AVX512-NEXT:    vpsubusb %ymm1, %ymm0, %ymm0
80 ; AVX512-NEXT:    retq
81   %z = call <32 x i8> @llvm.usub.sat.v32i8(<32 x i8> %x, <32 x i8> %y)
82   ret <32 x i8> %z
85 define <64 x i8> @v64i8(<64 x i8> %x, <64 x i8> %y) nounwind {
86 ; SSE-LABEL: v64i8:
87 ; SSE:       # %bb.0:
88 ; SSE-NEXT:    psubusb %xmm4, %xmm0
89 ; SSE-NEXT:    psubusb %xmm5, %xmm1
90 ; SSE-NEXT:    psubusb %xmm6, %xmm2
91 ; SSE-NEXT:    psubusb %xmm7, %xmm3
92 ; SSE-NEXT:    retq
94 ; AVX1-LABEL: v64i8:
95 ; AVX1:       # %bb.0:
96 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
97 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
98 ; AVX1-NEXT:    vpsubusb %xmm4, %xmm5, %xmm4
99 ; AVX1-NEXT:    vpsubusb %xmm2, %xmm0, %xmm0
100 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
101 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
102 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
103 ; AVX1-NEXT:    vpsubusb %xmm2, %xmm4, %xmm2
104 ; AVX1-NEXT:    vpsubusb %xmm3, %xmm1, %xmm1
105 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
106 ; AVX1-NEXT:    retq
108 ; AVX2-LABEL: v64i8:
109 ; AVX2:       # %bb.0:
110 ; AVX2-NEXT:    vpsubusb %ymm2, %ymm0, %ymm0
111 ; AVX2-NEXT:    vpsubusb %ymm3, %ymm1, %ymm1
112 ; AVX2-NEXT:    retq
114 ; AVX512-LABEL: v64i8:
115 ; AVX512:       # %bb.0:
116 ; AVX512-NEXT:    vpsubusb %zmm1, %zmm0, %zmm0
117 ; AVX512-NEXT:    retq
118   %z = call <64 x i8> @llvm.usub.sat.v64i8(<64 x i8> %x, <64 x i8> %y)
119   ret <64 x i8> %z
122 define <8 x i16> @v8i16(<8 x i16> %x, <8 x i16> %y) nounwind {
123 ; SSE-LABEL: v8i16:
124 ; SSE:       # %bb.0:
125 ; SSE-NEXT:    psubusw %xmm1, %xmm0
126 ; SSE-NEXT:    retq
128 ; AVX-LABEL: v8i16:
129 ; AVX:       # %bb.0:
130 ; AVX-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
131 ; AVX-NEXT:    retq
132   %z = call <8 x i16> @llvm.usub.sat.v8i16(<8 x i16> %x, <8 x i16> %y)
133   ret <8 x i16> %z
136 define <16 x i16> @v16i16(<16 x i16> %x, <16 x i16> %y) nounwind {
137 ; SSE-LABEL: v16i16:
138 ; SSE:       # %bb.0:
139 ; SSE-NEXT:    psubusw %xmm2, %xmm0
140 ; SSE-NEXT:    psubusw %xmm3, %xmm1
141 ; SSE-NEXT:    retq
143 ; AVX1-LABEL: v16i16:
144 ; AVX1:       # %bb.0:
145 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
146 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
147 ; AVX1-NEXT:    vpsubusw %xmm2, %xmm3, %xmm2
148 ; AVX1-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
149 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
150 ; AVX1-NEXT:    retq
152 ; AVX2-LABEL: v16i16:
153 ; AVX2:       # %bb.0:
154 ; AVX2-NEXT:    vpsubusw %ymm1, %ymm0, %ymm0
155 ; AVX2-NEXT:    retq
157 ; AVX512-LABEL: v16i16:
158 ; AVX512:       # %bb.0:
159 ; AVX512-NEXT:    vpsubusw %ymm1, %ymm0, %ymm0
160 ; AVX512-NEXT:    retq
161   %z = call <16 x i16> @llvm.usub.sat.v16i16(<16 x i16> %x, <16 x i16> %y)
162   ret <16 x i16> %z
165 define <32 x i16> @v32i16(<32 x i16> %x, <32 x i16> %y) nounwind {
166 ; SSE-LABEL: v32i16:
167 ; SSE:       # %bb.0:
168 ; SSE-NEXT:    psubusw %xmm4, %xmm0
169 ; SSE-NEXT:    psubusw %xmm5, %xmm1
170 ; SSE-NEXT:    psubusw %xmm6, %xmm2
171 ; SSE-NEXT:    psubusw %xmm7, %xmm3
172 ; SSE-NEXT:    retq
174 ; AVX1-LABEL: v32i16:
175 ; AVX1:       # %bb.0:
176 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
177 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
178 ; AVX1-NEXT:    vpsubusw %xmm4, %xmm5, %xmm4
179 ; AVX1-NEXT:    vpsubusw %xmm2, %xmm0, %xmm0
180 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
181 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
182 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
183 ; AVX1-NEXT:    vpsubusw %xmm2, %xmm4, %xmm2
184 ; AVX1-NEXT:    vpsubusw %xmm3, %xmm1, %xmm1
185 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
186 ; AVX1-NEXT:    retq
188 ; AVX2-LABEL: v32i16:
189 ; AVX2:       # %bb.0:
190 ; AVX2-NEXT:    vpsubusw %ymm2, %ymm0, %ymm0
191 ; AVX2-NEXT:    vpsubusw %ymm3, %ymm1, %ymm1
192 ; AVX2-NEXT:    retq
194 ; AVX512-LABEL: v32i16:
195 ; AVX512:       # %bb.0:
196 ; AVX512-NEXT:    vpsubusw %zmm1, %zmm0, %zmm0
197 ; AVX512-NEXT:    retq
198   %z = call <32 x i16> @llvm.usub.sat.v32i16(<32 x i16> %x, <32 x i16> %y)
199   ret <32 x i16> %z
202 ; Too narrow vectors, legalized by widening.
204 define void @v8i8(<8 x i8>* %px, <8 x i8>* %py, <8 x i8>* %pz) nounwind {
205 ; SSE-LABEL: v8i8:
206 ; SSE:       # %bb.0:
207 ; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
208 ; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
209 ; SSE-NEXT:    psubusb %xmm1, %xmm0
210 ; SSE-NEXT:    movq %xmm0, (%rdx)
211 ; SSE-NEXT:    retq
213 ; AVX-LABEL: v8i8:
214 ; AVX:       # %bb.0:
215 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
216 ; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
217 ; AVX-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
218 ; AVX-NEXT:    vmovq %xmm0, (%rdx)
219 ; AVX-NEXT:    retq
220   %x = load <8 x i8>, <8 x i8>* %px
221   %y = load <8 x i8>, <8 x i8>* %py
222   %z = call <8 x i8> @llvm.usub.sat.v8i8(<8 x i8> %x, <8 x i8> %y)
223   store <8 x i8> %z, <8 x i8>* %pz
224   ret void
227 define void @v4i8(<4 x i8>* %px, <4 x i8>* %py, <4 x i8>* %pz) nounwind {
228 ; SSE-LABEL: v4i8:
229 ; SSE:       # %bb.0:
230 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
231 ; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
232 ; SSE-NEXT:    psubusb %xmm1, %xmm0
233 ; SSE-NEXT:    movd %xmm0, (%rdx)
234 ; SSE-NEXT:    retq
236 ; AVX-LABEL: v4i8:
237 ; AVX:       # %bb.0:
238 ; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
239 ; AVX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
240 ; AVX-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
241 ; AVX-NEXT:    vmovd %xmm0, (%rdx)
242 ; AVX-NEXT:    retq
243   %x = load <4 x i8>, <4 x i8>* %px
244   %y = load <4 x i8>, <4 x i8>* %py
245   %z = call <4 x i8> @llvm.usub.sat.v4i8(<4 x i8> %x, <4 x i8> %y)
246   store <4 x i8> %z, <4 x i8>* %pz
247   ret void
250 define void @v2i8(<2 x i8>* %px, <2 x i8>* %py, <2 x i8>* %pz) nounwind {
251 ; SSE2-LABEL: v2i8:
252 ; SSE2:       # %bb.0:
253 ; SSE2-NEXT:    movzwl (%rdi), %eax
254 ; SSE2-NEXT:    movd %eax, %xmm0
255 ; SSE2-NEXT:    movzwl (%rsi), %eax
256 ; SSE2-NEXT:    movd %eax, %xmm1
257 ; SSE2-NEXT:    psubusb %xmm1, %xmm0
258 ; SSE2-NEXT:    movd %xmm0, %eax
259 ; SSE2-NEXT:    movw %ax, (%rdx)
260 ; SSE2-NEXT:    retq
262 ; SSSE3-LABEL: v2i8:
263 ; SSSE3:       # %bb.0:
264 ; SSSE3-NEXT:    movzwl (%rdi), %eax
265 ; SSSE3-NEXT:    movd %eax, %xmm0
266 ; SSSE3-NEXT:    movzwl (%rsi), %eax
267 ; SSSE3-NEXT:    movd %eax, %xmm1
268 ; SSSE3-NEXT:    psubusb %xmm1, %xmm0
269 ; SSSE3-NEXT:    movd %xmm0, %eax
270 ; SSSE3-NEXT:    movw %ax, (%rdx)
271 ; SSSE3-NEXT:    retq
273 ; SSE41-LABEL: v2i8:
274 ; SSE41:       # %bb.0:
275 ; SSE41-NEXT:    movzwl (%rdi), %eax
276 ; SSE41-NEXT:    movd %eax, %xmm0
277 ; SSE41-NEXT:    movzwl (%rsi), %eax
278 ; SSE41-NEXT:    movd %eax, %xmm1
279 ; SSE41-NEXT:    psubusb %xmm1, %xmm0
280 ; SSE41-NEXT:    pextrw $0, %xmm0, (%rdx)
281 ; SSE41-NEXT:    retq
283 ; AVX-LABEL: v2i8:
284 ; AVX:       # %bb.0:
285 ; AVX-NEXT:    movzwl (%rdi), %eax
286 ; AVX-NEXT:    vmovd %eax, %xmm0
287 ; AVX-NEXT:    movzwl (%rsi), %eax
288 ; AVX-NEXT:    vmovd %eax, %xmm1
289 ; AVX-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
290 ; AVX-NEXT:    vpextrw $0, %xmm0, (%rdx)
291 ; AVX-NEXT:    retq
292   %x = load <2 x i8>, <2 x i8>* %px
293   %y = load <2 x i8>, <2 x i8>* %py
294   %z = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %x, <2 x i8> %y)
295   store <2 x i8> %z, <2 x i8>* %pz
296   ret void
299 define void @v4i16(<4 x i16>* %px, <4 x i16>* %py, <4 x i16>* %pz) nounwind {
300 ; SSE-LABEL: v4i16:
301 ; SSE:       # %bb.0:
302 ; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
303 ; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
304 ; SSE-NEXT:    psubusw %xmm1, %xmm0
305 ; SSE-NEXT:    movq %xmm0, (%rdx)
306 ; SSE-NEXT:    retq
308 ; AVX-LABEL: v4i16:
309 ; AVX:       # %bb.0:
310 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
311 ; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
312 ; AVX-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
313 ; AVX-NEXT:    vmovq %xmm0, (%rdx)
314 ; AVX-NEXT:    retq
315   %x = load <4 x i16>, <4 x i16>* %px
316   %y = load <4 x i16>, <4 x i16>* %py
317   %z = call <4 x i16> @llvm.usub.sat.v4i16(<4 x i16> %x, <4 x i16> %y)
318   store <4 x i16> %z, <4 x i16>* %pz
319   ret void
322 define void @v2i16(<2 x i16>* %px, <2 x i16>* %py, <2 x i16>* %pz) nounwind {
323 ; SSE-LABEL: v2i16:
324 ; SSE:       # %bb.0:
325 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
326 ; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
327 ; SSE-NEXT:    psubusw %xmm1, %xmm0
328 ; SSE-NEXT:    movd %xmm0, (%rdx)
329 ; SSE-NEXT:    retq
331 ; AVX-LABEL: v2i16:
332 ; AVX:       # %bb.0:
333 ; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
334 ; AVX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
335 ; AVX-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
336 ; AVX-NEXT:    vmovd %xmm0, (%rdx)
337 ; AVX-NEXT:    retq
338   %x = load <2 x i16>, <2 x i16>* %px
339   %y = load <2 x i16>, <2 x i16>* %py
340   %z = call <2 x i16> @llvm.usub.sat.v2i16(<2 x i16> %x, <2 x i16> %y)
341   store <2 x i16> %z, <2 x i16>* %pz
342   ret void
345 define <12 x i8> @v12i8(<12 x i8> %x, <12 x i8> %y) nounwind {
346 ; SSE-LABEL: v12i8:
347 ; SSE:       # %bb.0:
348 ; SSE-NEXT:    psubusb %xmm1, %xmm0
349 ; SSE-NEXT:    retq
351 ; AVX-LABEL: v12i8:
352 ; AVX:       # %bb.0:
353 ; AVX-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
354 ; AVX-NEXT:    retq
355   %z = call <12 x i8> @llvm.usub.sat.v12i8(<12 x i8> %x, <12 x i8> %y)
356   ret <12 x i8> %z
359 define void @v12i16(<12 x i16>* %px, <12 x i16>* %py, <12 x i16>* %pz) nounwind {
360 ; SSE-LABEL: v12i16:
361 ; SSE:       # %bb.0:
362 ; SSE-NEXT:    movdqa (%rdi), %xmm0
363 ; SSE-NEXT:    movdqa 16(%rdi), %xmm1
364 ; SSE-NEXT:    psubusw (%rsi), %xmm0
365 ; SSE-NEXT:    psubusw 16(%rsi), %xmm1
366 ; SSE-NEXT:    movq %xmm1, 16(%rdx)
367 ; SSE-NEXT:    movdqa %xmm0, (%rdx)
368 ; SSE-NEXT:    retq
370 ; AVX1-LABEL: v12i16:
371 ; AVX1:       # %bb.0:
372 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
373 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
374 ; AVX1-NEXT:    vpsubusw 16(%rsi), %xmm1, %xmm1
375 ; AVX1-NEXT:    vpsubusw (%rsi), %xmm0, %xmm0
376 ; AVX1-NEXT:    vmovdqa %xmm0, (%rdx)
377 ; AVX1-NEXT:    vmovq %xmm1, 16(%rdx)
378 ; AVX1-NEXT:    retq
380 ; AVX2-LABEL: v12i16:
381 ; AVX2:       # %bb.0:
382 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
383 ; AVX2-NEXT:    vpsubusw (%rsi), %ymm0, %ymm0
384 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
385 ; AVX2-NEXT:    vmovq %xmm1, 16(%rdx)
386 ; AVX2-NEXT:    vmovdqa %xmm0, (%rdx)
387 ; AVX2-NEXT:    vzeroupper
388 ; AVX2-NEXT:    retq
390 ; AVX512-LABEL: v12i16:
391 ; AVX512:       # %bb.0:
392 ; AVX512-NEXT:    vmovdqa (%rdi), %ymm0
393 ; AVX512-NEXT:    vpsubusw (%rsi), %ymm0, %ymm0
394 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
395 ; AVX512-NEXT:    vmovq %xmm1, 16(%rdx)
396 ; AVX512-NEXT:    vmovdqa %xmm0, (%rdx)
397 ; AVX512-NEXT:    vzeroupper
398 ; AVX512-NEXT:    retq
399   %x = load <12 x i16>, <12 x i16>* %px
400   %y = load <12 x i16>, <12 x i16>* %py
401   %z = call <12 x i16> @llvm.usub.sat.v12i16(<12 x i16> %x, <12 x i16> %y)
402   store <12 x i16> %z, <12 x i16>* %pz
403   ret void
406 ; Scalarization
408 define void @v1i8(<1 x i8>* %px, <1 x i8>* %py, <1 x i8>* %pz) nounwind {
409 ; SSE-LABEL: v1i8:
410 ; SSE:       # %bb.0:
411 ; SSE-NEXT:    movb (%rdi), %al
412 ; SSE-NEXT:    xorl %ecx, %ecx
413 ; SSE-NEXT:    subb (%rsi), %al
414 ; SSE-NEXT:    movzbl %al, %eax
415 ; SSE-NEXT:    cmovbl %ecx, %eax
416 ; SSE-NEXT:    movb %al, (%rdx)
417 ; SSE-NEXT:    retq
419 ; AVX-LABEL: v1i8:
420 ; AVX:       # %bb.0:
421 ; AVX-NEXT:    movb (%rdi), %al
422 ; AVX-NEXT:    xorl %ecx, %ecx
423 ; AVX-NEXT:    subb (%rsi), %al
424 ; AVX-NEXT:    movzbl %al, %eax
425 ; AVX-NEXT:    cmovbl %ecx, %eax
426 ; AVX-NEXT:    movb %al, (%rdx)
427 ; AVX-NEXT:    retq
428   %x = load <1 x i8>, <1 x i8>* %px
429   %y = load <1 x i8>, <1 x i8>* %py
430   %z = call <1 x i8> @llvm.usub.sat.v1i8(<1 x i8> %x, <1 x i8> %y)
431   store <1 x i8> %z, <1 x i8>* %pz
432   ret void
435 define void @v1i16(<1 x i16>* %px, <1 x i16>* %py, <1 x i16>* %pz) nounwind {
436 ; SSE-LABEL: v1i16:
437 ; SSE:       # %bb.0:
438 ; SSE-NEXT:    movzwl (%rdi), %eax
439 ; SSE-NEXT:    xorl %ecx, %ecx
440 ; SSE-NEXT:    subw (%rsi), %ax
441 ; SSE-NEXT:    cmovbl %ecx, %eax
442 ; SSE-NEXT:    movw %ax, (%rdx)
443 ; SSE-NEXT:    retq
445 ; AVX-LABEL: v1i16:
446 ; AVX:       # %bb.0:
447 ; AVX-NEXT:    movzwl (%rdi), %eax
448 ; AVX-NEXT:    xorl %ecx, %ecx
449 ; AVX-NEXT:    subw (%rsi), %ax
450 ; AVX-NEXT:    cmovbl %ecx, %eax
451 ; AVX-NEXT:    movw %ax, (%rdx)
452 ; AVX-NEXT:    retq
453   %x = load <1 x i16>, <1 x i16>* %px
454   %y = load <1 x i16>, <1 x i16>* %py
455   %z = call <1 x i16> @llvm.usub.sat.v1i16(<1 x i16> %x, <1 x i16> %y)
456   store <1 x i16> %z, <1 x i16>* %pz
457   ret void
460 ; Promotion
462 define <16 x i4> @v16i4(<16 x i4> %x, <16 x i4> %y) nounwind {
463 ; SSE-LABEL: v16i4:
464 ; SSE:       # %bb.0:
465 ; SSE-NEXT:    psllw $4, %xmm1
466 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
467 ; SSE-NEXT:    pand %xmm2, %xmm1
468 ; SSE-NEXT:    psllw $4, %xmm0
469 ; SSE-NEXT:    pand %xmm2, %xmm0
470 ; SSE-NEXT:    psubusb %xmm1, %xmm0
471 ; SSE-NEXT:    psrlw $4, %xmm0
472 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
473 ; SSE-NEXT:    retq
475 ; AVX-LABEL: v16i4:
476 ; AVX:       # %bb.0:
477 ; AVX-NEXT:    vpsllw $4, %xmm1, %xmm1
478 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
479 ; AVX-NEXT:    vpand %xmm2, %xmm1, %xmm1
480 ; AVX-NEXT:    vpsllw $4, %xmm0, %xmm0
481 ; AVX-NEXT:    vpand %xmm2, %xmm0, %xmm0
482 ; AVX-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
483 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
484 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
485 ; AVX-NEXT:    retq
486   %z = call <16 x i4> @llvm.usub.sat.v16i4(<16 x i4> %x, <16 x i4> %y)
487   ret <16 x i4> %z
490 define <16 x i1> @v16i1(<16 x i1> %x, <16 x i1> %y) nounwind {
491 ; SSE-LABEL: v16i1:
492 ; SSE:       # %bb.0:
493 ; SSE-NEXT:    psllw $7, %xmm1
494 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
495 ; SSE-NEXT:    pand %xmm2, %xmm1
496 ; SSE-NEXT:    psllw $7, %xmm0
497 ; SSE-NEXT:    pand %xmm2, %xmm0
498 ; SSE-NEXT:    psubusb %xmm1, %xmm0
499 ; SSE-NEXT:    psrlw $7, %xmm0
500 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
501 ; SSE-NEXT:    retq
503 ; AVX1-LABEL: v16i1:
504 ; AVX1:       # %bb.0:
505 ; AVX1-NEXT:    vpsllw $7, %xmm1, %xmm1
506 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
507 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
508 ; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
509 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
510 ; AVX1-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
511 ; AVX1-NEXT:    vpsrlw $7, %xmm0, %xmm0
512 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
513 ; AVX1-NEXT:    retq
515 ; AVX2-LABEL: v16i1:
516 ; AVX2:       # %bb.0:
517 ; AVX2-NEXT:    vpsllw $7, %xmm1, %xmm1
518 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
519 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
520 ; AVX2-NEXT:    vpsllw $7, %xmm0, %xmm0
521 ; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
522 ; AVX2-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
523 ; AVX2-NEXT:    vpsrlw $7, %xmm0, %xmm0
524 ; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
525 ; AVX2-NEXT:    retq
527 ; AVX512-LABEL: v16i1:
528 ; AVX512:       # %bb.0:
529 ; AVX512-NEXT:    vpsllw $7, %xmm0, %xmm0
530 ; AVX512-NEXT:    vpmovb2m %xmm0, %k0
531 ; AVX512-NEXT:    vpsllw $7, %xmm1, %xmm0
532 ; AVX512-NEXT:    vpmovb2m %xmm0, %k1
533 ; AVX512-NEXT:    kandnw %k0, %k1, %k0
534 ; AVX512-NEXT:    vpmovm2b %k0, %xmm0
535 ; AVX512-NEXT:    retq
536   %z = call <16 x i1> @llvm.usub.sat.v16i1(<16 x i1> %x, <16 x i1> %y)
537   ret <16 x i1> %z
540 ; Expanded
542 define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {
543 ; SSE2-LABEL: v2i32:
544 ; SSE2:       # %bb.0:
545 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
546 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
547 ; SSE2-NEXT:    pxor %xmm2, %xmm3
548 ; SSE2-NEXT:    pxor %xmm0, %xmm2
549 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
550 ; SSE2-NEXT:    psubd %xmm1, %xmm0
551 ; SSE2-NEXT:    pand %xmm2, %xmm0
552 ; SSE2-NEXT:    retq
554 ; SSSE3-LABEL: v2i32:
555 ; SSSE3:       # %bb.0:
556 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
557 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
558 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
559 ; SSSE3-NEXT:    pxor %xmm0, %xmm2
560 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2
561 ; SSSE3-NEXT:    psubd %xmm1, %xmm0
562 ; SSSE3-NEXT:    pand %xmm2, %xmm0
563 ; SSSE3-NEXT:    retq
565 ; SSE41-LABEL: v2i32:
566 ; SSE41:       # %bb.0:
567 ; SSE41-NEXT:    pmaxud %xmm1, %xmm0
568 ; SSE41-NEXT:    psubd %xmm1, %xmm0
569 ; SSE41-NEXT:    retq
571 ; AVX-LABEL: v2i32:
572 ; AVX:       # %bb.0:
573 ; AVX-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
574 ; AVX-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
575 ; AVX-NEXT:    retq
576   %z = call <2 x i32> @llvm.usub.sat.v2i32(<2 x i32> %x, <2 x i32> %y)
577   ret <2 x i32> %z
580 define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {
581 ; SSE2-LABEL: v4i32:
582 ; SSE2:       # %bb.0:
583 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
584 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
585 ; SSE2-NEXT:    pxor %xmm2, %xmm3
586 ; SSE2-NEXT:    pxor %xmm0, %xmm2
587 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
588 ; SSE2-NEXT:    psubd %xmm1, %xmm0
589 ; SSE2-NEXT:    pand %xmm2, %xmm0
590 ; SSE2-NEXT:    retq
592 ; SSSE3-LABEL: v4i32:
593 ; SSSE3:       # %bb.0:
594 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
595 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
596 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
597 ; SSSE3-NEXT:    pxor %xmm0, %xmm2
598 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2
599 ; SSSE3-NEXT:    psubd %xmm1, %xmm0
600 ; SSSE3-NEXT:    pand %xmm2, %xmm0
601 ; SSSE3-NEXT:    retq
603 ; SSE41-LABEL: v4i32:
604 ; SSE41:       # %bb.0:
605 ; SSE41-NEXT:    pmaxud %xmm1, %xmm0
606 ; SSE41-NEXT:    psubd %xmm1, %xmm0
607 ; SSE41-NEXT:    retq
609 ; AVX-LABEL: v4i32:
610 ; AVX:       # %bb.0:
611 ; AVX-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
612 ; AVX-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
613 ; AVX-NEXT:    retq
614   %z = call <4 x i32> @llvm.usub.sat.v4i32(<4 x i32> %x, <4 x i32> %y)
615   ret <4 x i32> %z
618 define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
619 ; SSE2-LABEL: v8i32:
620 ; SSE2:       # %bb.0:
621 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
622 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
623 ; SSE2-NEXT:    psubd %xmm2, %xmm0
624 ; SSE2-NEXT:    pxor %xmm4, %xmm2
625 ; SSE2-NEXT:    pxor %xmm4, %xmm5
626 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
627 ; SSE2-NEXT:    pand %xmm5, %xmm0
628 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
629 ; SSE2-NEXT:    pxor %xmm4, %xmm2
630 ; SSE2-NEXT:    pxor %xmm1, %xmm4
631 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
632 ; SSE2-NEXT:    psubd %xmm3, %xmm1
633 ; SSE2-NEXT:    pand %xmm4, %xmm1
634 ; SSE2-NEXT:    retq
636 ; SSSE3-LABEL: v8i32:
637 ; SSSE3:       # %bb.0:
638 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
639 ; SSSE3-NEXT:    movdqa %xmm0, %xmm5
640 ; SSSE3-NEXT:    psubd %xmm2, %xmm0
641 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
642 ; SSSE3-NEXT:    pxor %xmm4, %xmm5
643 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm5
644 ; SSSE3-NEXT:    pand %xmm5, %xmm0
645 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
646 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
647 ; SSSE3-NEXT:    pxor %xmm1, %xmm4
648 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
649 ; SSSE3-NEXT:    psubd %xmm3, %xmm1
650 ; SSSE3-NEXT:    pand %xmm4, %xmm1
651 ; SSSE3-NEXT:    retq
653 ; SSE41-LABEL: v8i32:
654 ; SSE41:       # %bb.0:
655 ; SSE41-NEXT:    pmaxud %xmm2, %xmm0
656 ; SSE41-NEXT:    psubd %xmm2, %xmm0
657 ; SSE41-NEXT:    pmaxud %xmm3, %xmm1
658 ; SSE41-NEXT:    psubd %xmm3, %xmm1
659 ; SSE41-NEXT:    retq
661 ; AVX1-LABEL: v8i32:
662 ; AVX1:       # %bb.0:
663 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
664 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
665 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm3, %xmm3
666 ; AVX1-NEXT:    vpsubd %xmm2, %xmm3, %xmm2
667 ; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
668 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
669 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
670 ; AVX1-NEXT:    retq
672 ; AVX2-LABEL: v8i32:
673 ; AVX2:       # %bb.0:
674 ; AVX2-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0
675 ; AVX2-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
676 ; AVX2-NEXT:    retq
678 ; AVX512-LABEL: v8i32:
679 ; AVX512:       # %bb.0:
680 ; AVX512-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0
681 ; AVX512-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
682 ; AVX512-NEXT:    retq
683   %z = call <8 x i32> @llvm.usub.sat.v8i32(<8 x i32> %x, <8 x i32> %y)
684   ret <8 x i32> %z
687 define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind {
688 ; SSE2-LABEL: v16i32:
689 ; SSE2:       # %bb.0:
690 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
691 ; SSE2-NEXT:    movdqa %xmm0, %xmm9
692 ; SSE2-NEXT:    psubd %xmm4, %xmm0
693 ; SSE2-NEXT:    pxor %xmm8, %xmm4
694 ; SSE2-NEXT:    pxor %xmm8, %xmm9
695 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm9
696 ; SSE2-NEXT:    pand %xmm9, %xmm0
697 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
698 ; SSE2-NEXT:    psubd %xmm5, %xmm1
699 ; SSE2-NEXT:    pxor %xmm8, %xmm5
700 ; SSE2-NEXT:    pxor %xmm8, %xmm4
701 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm4
702 ; SSE2-NEXT:    pand %xmm4, %xmm1
703 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
704 ; SSE2-NEXT:    psubd %xmm6, %xmm2
705 ; SSE2-NEXT:    pxor %xmm8, %xmm6
706 ; SSE2-NEXT:    pxor %xmm8, %xmm4
707 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm4
708 ; SSE2-NEXT:    pand %xmm4, %xmm2
709 ; SSE2-NEXT:    movdqa %xmm7, %xmm4
710 ; SSE2-NEXT:    pxor %xmm8, %xmm4
711 ; SSE2-NEXT:    pxor %xmm3, %xmm8
712 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm8
713 ; SSE2-NEXT:    psubd %xmm7, %xmm3
714 ; SSE2-NEXT:    pand %xmm8, %xmm3
715 ; SSE2-NEXT:    retq
717 ; SSSE3-LABEL: v16i32:
718 ; SSSE3:       # %bb.0:
719 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
720 ; SSSE3-NEXT:    movdqa %xmm0, %xmm9
721 ; SSSE3-NEXT:    psubd %xmm4, %xmm0
722 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
723 ; SSSE3-NEXT:    pxor %xmm8, %xmm9
724 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm9
725 ; SSSE3-NEXT:    pand %xmm9, %xmm0
726 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
727 ; SSSE3-NEXT:    psubd %xmm5, %xmm1
728 ; SSSE3-NEXT:    pxor %xmm8, %xmm5
729 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
730 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm4
731 ; SSSE3-NEXT:    pand %xmm4, %xmm1
732 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
733 ; SSSE3-NEXT:    psubd %xmm6, %xmm2
734 ; SSSE3-NEXT:    pxor %xmm8, %xmm6
735 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
736 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm4
737 ; SSSE3-NEXT:    pand %xmm4, %xmm2
738 ; SSSE3-NEXT:    movdqa %xmm7, %xmm4
739 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
740 ; SSSE3-NEXT:    pxor %xmm3, %xmm8
741 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm8
742 ; SSSE3-NEXT:    psubd %xmm7, %xmm3
743 ; SSSE3-NEXT:    pand %xmm8, %xmm3
744 ; SSSE3-NEXT:    retq
746 ; SSE41-LABEL: v16i32:
747 ; SSE41:       # %bb.0:
748 ; SSE41-NEXT:    pmaxud %xmm4, %xmm0
749 ; SSE41-NEXT:    psubd %xmm4, %xmm0
750 ; SSE41-NEXT:    pmaxud %xmm5, %xmm1
751 ; SSE41-NEXT:    psubd %xmm5, %xmm1
752 ; SSE41-NEXT:    pmaxud %xmm6, %xmm2
753 ; SSE41-NEXT:    psubd %xmm6, %xmm2
754 ; SSE41-NEXT:    pmaxud %xmm7, %xmm3
755 ; SSE41-NEXT:    psubd %xmm7, %xmm3
756 ; SSE41-NEXT:    retq
758 ; AVX1-LABEL: v16i32:
759 ; AVX1:       # %bb.0:
760 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
761 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
762 ; AVX1-NEXT:    vpmaxud %xmm4, %xmm5, %xmm5
763 ; AVX1-NEXT:    vpsubd %xmm4, %xmm5, %xmm4
764 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm0, %xmm0
765 ; AVX1-NEXT:    vpsubd %xmm2, %xmm0, %xmm0
766 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
767 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
768 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
769 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm4, %xmm4
770 ; AVX1-NEXT:    vpsubd %xmm2, %xmm4, %xmm2
771 ; AVX1-NEXT:    vpmaxud %xmm3, %xmm1, %xmm1
772 ; AVX1-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
773 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
774 ; AVX1-NEXT:    retq
776 ; AVX2-LABEL: v16i32:
777 ; AVX2:       # %bb.0:
778 ; AVX2-NEXT:    vpmaxud %ymm2, %ymm0, %ymm0
779 ; AVX2-NEXT:    vpsubd %ymm2, %ymm0, %ymm0
780 ; AVX2-NEXT:    vpmaxud %ymm3, %ymm1, %ymm1
781 ; AVX2-NEXT:    vpsubd %ymm3, %ymm1, %ymm1
782 ; AVX2-NEXT:    retq
784 ; AVX512-LABEL: v16i32:
785 ; AVX512:       # %bb.0:
786 ; AVX512-NEXT:    vpmaxud %zmm1, %zmm0, %zmm0
787 ; AVX512-NEXT:    vpsubd %zmm1, %zmm0, %zmm0
788 ; AVX512-NEXT:    retq
789   %z = call <16 x i32> @llvm.usub.sat.v16i32(<16 x i32> %x, <16 x i32> %y)
790   ret <16 x i32> %z
793 define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {
794 ; SSE2-LABEL: v2i64:
795 ; SSE2:       # %bb.0:
796 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
797 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
798 ; SSE2-NEXT:    pxor %xmm2, %xmm3
799 ; SSE2-NEXT:    pxor %xmm0, %xmm2
800 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
801 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
802 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
803 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
804 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
805 ; SSE2-NEXT:    pand %xmm5, %xmm2
806 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
807 ; SSE2-NEXT:    por %xmm2, %xmm3
808 ; SSE2-NEXT:    psubq %xmm1, %xmm0
809 ; SSE2-NEXT:    pand %xmm3, %xmm0
810 ; SSE2-NEXT:    retq
812 ; SSSE3-LABEL: v2i64:
813 ; SSSE3:       # %bb.0:
814 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
815 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
816 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
817 ; SSSE3-NEXT:    pxor %xmm0, %xmm2
818 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
819 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
820 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
821 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm2
822 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
823 ; SSSE3-NEXT:    pand %xmm5, %xmm2
824 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
825 ; SSSE3-NEXT:    por %xmm2, %xmm3
826 ; SSSE3-NEXT:    psubq %xmm1, %xmm0
827 ; SSSE3-NEXT:    pand %xmm3, %xmm0
828 ; SSSE3-NEXT:    retq
830 ; SSE41-LABEL: v2i64:
831 ; SSE41:       # %bb.0:
832 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
833 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
834 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
835 ; SSE41-NEXT:    pxor %xmm3, %xmm0
836 ; SSE41-NEXT:    pxor %xmm2, %xmm3
837 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
838 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
839 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
840 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
841 ; SSE41-NEXT:    pand %xmm4, %xmm0
842 ; SSE41-NEXT:    por %xmm3, %xmm0
843 ; SSE41-NEXT:    psubq %xmm1, %xmm2
844 ; SSE41-NEXT:    pxor %xmm1, %xmm1
845 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
846 ; SSE41-NEXT:    movapd %xmm1, %xmm0
847 ; SSE41-NEXT:    retq
849 ; AVX1-LABEL: v2i64:
850 ; AVX1:       # %bb.0:
851 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
852 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm3
853 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm2
854 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
855 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
856 ; AVX1-NEXT:    vpand %xmm0, %xmm2, %xmm0
857 ; AVX1-NEXT:    retq
859 ; AVX2-LABEL: v2i64:
860 ; AVX2:       # %bb.0:
861 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
862 ; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm3
863 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm2
864 ; AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
865 ; AVX2-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
866 ; AVX2-NEXT:    vpand %xmm0, %xmm2, %xmm0
867 ; AVX2-NEXT:    retq
869 ; AVX512-LABEL: v2i64:
870 ; AVX512:       # %bb.0:
871 ; AVX512-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
872 ; AVX512-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
873 ; AVX512-NEXT:    retq
874   %z = call <2 x i64> @llvm.usub.sat.v2i64(<2 x i64> %x, <2 x i64> %y)
875   ret <2 x i64> %z
878 define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
879 ; SSE2-LABEL: v4i64:
880 ; SSE2:       # %bb.0:
881 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
882 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
883 ; SSE2-NEXT:    psubq %xmm2, %xmm0
884 ; SSE2-NEXT:    pxor %xmm4, %xmm2
885 ; SSE2-NEXT:    pxor %xmm4, %xmm5
886 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
887 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
888 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
889 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm5
890 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
891 ; SSE2-NEXT:    pand %xmm7, %xmm2
892 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
893 ; SSE2-NEXT:    por %xmm2, %xmm5
894 ; SSE2-NEXT:    pand %xmm5, %xmm0
895 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
896 ; SSE2-NEXT:    pxor %xmm4, %xmm2
897 ; SSE2-NEXT:    pxor %xmm1, %xmm4
898 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
899 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
900 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
901 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
902 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
903 ; SSE2-NEXT:    pand %xmm6, %xmm2
904 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
905 ; SSE2-NEXT:    por %xmm2, %xmm4
906 ; SSE2-NEXT:    psubq %xmm3, %xmm1
907 ; SSE2-NEXT:    pand %xmm4, %xmm1
908 ; SSE2-NEXT:    retq
910 ; SSSE3-LABEL: v4i64:
911 ; SSSE3:       # %bb.0:
912 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
913 ; SSSE3-NEXT:    movdqa %xmm0, %xmm5
914 ; SSSE3-NEXT:    psubq %xmm2, %xmm0
915 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
916 ; SSSE3-NEXT:    pxor %xmm4, %xmm5
917 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
918 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm6
919 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
920 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm5
921 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
922 ; SSSE3-NEXT:    pand %xmm7, %xmm2
923 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
924 ; SSSE3-NEXT:    por %xmm2, %xmm5
925 ; SSSE3-NEXT:    pand %xmm5, %xmm0
926 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
927 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
928 ; SSSE3-NEXT:    pxor %xmm1, %xmm4
929 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
930 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm5
931 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
932 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm4
933 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
934 ; SSSE3-NEXT:    pand %xmm6, %xmm2
935 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
936 ; SSSE3-NEXT:    por %xmm2, %xmm4
937 ; SSSE3-NEXT:    psubq %xmm3, %xmm1
938 ; SSSE3-NEXT:    pand %xmm4, %xmm1
939 ; SSSE3-NEXT:    retq
941 ; SSE41-LABEL: v4i64:
942 ; SSE41:       # %bb.0:
943 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
944 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
945 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
946 ; SSE41-NEXT:    psubq %xmm2, %xmm4
947 ; SSE41-NEXT:    pxor %xmm6, %xmm2
948 ; SSE41-NEXT:    pxor %xmm6, %xmm5
949 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
950 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm0
951 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm5
952 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[0,0,2,2]
953 ; SSE41-NEXT:    pand %xmm2, %xmm0
954 ; SSE41-NEXT:    por %xmm5, %xmm0
955 ; SSE41-NEXT:    pxor %xmm2, %xmm2
956 ; SSE41-NEXT:    pxor %xmm5, %xmm5
957 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm5
958 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
959 ; SSE41-NEXT:    pxor %xmm6, %xmm0
960 ; SSE41-NEXT:    pxor %xmm1, %xmm6
961 ; SSE41-NEXT:    movdqa %xmm6, %xmm4
962 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
963 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
964 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
965 ; SSE41-NEXT:    pand %xmm4, %xmm0
966 ; SSE41-NEXT:    por %xmm6, %xmm0
967 ; SSE41-NEXT:    psubq %xmm3, %xmm1
968 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
969 ; SSE41-NEXT:    movapd %xmm5, %xmm0
970 ; SSE41-NEXT:    movapd %xmm2, %xmm1
971 ; SSE41-NEXT:    retq
973 ; AVX1-LABEL: v4i64:
974 ; AVX1:       # %bb.0:
975 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
976 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
977 ; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm4
978 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
979 ; AVX1-NEXT:    vpxor %xmm3, %xmm5, %xmm6
980 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
981 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm5, %xmm2, %xmm4
982 ; AVX1-NEXT:    vpsubq %xmm2, %xmm4, %xmm2
983 ; AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm4
984 ; AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm3
985 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm3, %xmm3
986 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
987 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
988 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
989 ; AVX1-NEXT:    retq
991 ; AVX2-LABEL: v4i64:
992 ; AVX2:       # %bb.0:
993 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
994 ; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm3
995 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm2
996 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm2, %ymm2
997 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
998 ; AVX2-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
999 ; AVX2-NEXT:    retq
1001 ; AVX512-LABEL: v4i64:
1002 ; AVX512:       # %bb.0:
1003 ; AVX512-NEXT:    vpmaxuq %ymm1, %ymm0, %ymm0
1004 ; AVX512-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
1005 ; AVX512-NEXT:    retq
1006   %z = call <4 x i64> @llvm.usub.sat.v4i64(<4 x i64> %x, <4 x i64> %y)
1007   ret <4 x i64> %z
1010 define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind {
1011 ; SSE2-LABEL: v8i64:
1012 ; SSE2:       # %bb.0:
1013 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
1014 ; SSE2-NEXT:    movdqa %xmm0, %xmm9
1015 ; SSE2-NEXT:    psubq %xmm4, %xmm0
1016 ; SSE2-NEXT:    pxor %xmm8, %xmm4
1017 ; SSE2-NEXT:    pxor %xmm8, %xmm9
1018 ; SSE2-NEXT:    movdqa %xmm9, %xmm10
1019 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm10
1020 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
1021 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm9
1022 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
1023 ; SSE2-NEXT:    pand %xmm11, %xmm9
1024 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm10[1,1,3,3]
1025 ; SSE2-NEXT:    por %xmm9, %xmm4
1026 ; SSE2-NEXT:    pand %xmm4, %xmm0
1027 ; SSE2-NEXT:    movdqa %xmm1, %xmm9
1028 ; SSE2-NEXT:    psubq %xmm5, %xmm1
1029 ; SSE2-NEXT:    pxor %xmm8, %xmm5
1030 ; SSE2-NEXT:    pxor %xmm8, %xmm9
1031 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
1032 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm4
1033 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
1034 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm9
1035 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm9[1,1,3,3]
1036 ; SSE2-NEXT:    pand %xmm10, %xmm5
1037 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1038 ; SSE2-NEXT:    por %xmm5, %xmm4
1039 ; SSE2-NEXT:    pand %xmm4, %xmm1
1040 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1041 ; SSE2-NEXT:    psubq %xmm6, %xmm2
1042 ; SSE2-NEXT:    pxor %xmm8, %xmm6
1043 ; SSE2-NEXT:    pxor %xmm8, %xmm4
1044 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
1045 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
1046 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
1047 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm4
1048 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1049 ; SSE2-NEXT:    pand %xmm9, %xmm4
1050 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1051 ; SSE2-NEXT:    por %xmm4, %xmm5
1052 ; SSE2-NEXT:    pand %xmm5, %xmm2
1053 ; SSE2-NEXT:    movdqa %xmm7, %xmm4
1054 ; SSE2-NEXT:    pxor %xmm8, %xmm4
1055 ; SSE2-NEXT:    pxor %xmm3, %xmm8
1056 ; SSE2-NEXT:    movdqa %xmm8, %xmm5
1057 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm5
1058 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1059 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm8
1060 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm8[1,1,3,3]
1061 ; SSE2-NEXT:    pand %xmm6, %xmm4
1062 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1063 ; SSE2-NEXT:    por %xmm4, %xmm5
1064 ; SSE2-NEXT:    psubq %xmm7, %xmm3
1065 ; SSE2-NEXT:    pand %xmm5, %xmm3
1066 ; SSE2-NEXT:    retq
1068 ; SSSE3-LABEL: v8i64:
1069 ; SSSE3:       # %bb.0:
1070 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
1071 ; SSSE3-NEXT:    movdqa %xmm0, %xmm9
1072 ; SSSE3-NEXT:    psubq %xmm4, %xmm0
1073 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
1074 ; SSSE3-NEXT:    pxor %xmm8, %xmm9
1075 ; SSSE3-NEXT:    movdqa %xmm9, %xmm10
1076 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm10
1077 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
1078 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm9
1079 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
1080 ; SSSE3-NEXT:    pand %xmm11, %xmm9
1081 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm10[1,1,3,3]
1082 ; SSSE3-NEXT:    por %xmm9, %xmm4
1083 ; SSSE3-NEXT:    pand %xmm4, %xmm0
1084 ; SSSE3-NEXT:    movdqa %xmm1, %xmm9
1085 ; SSSE3-NEXT:    psubq %xmm5, %xmm1
1086 ; SSSE3-NEXT:    pxor %xmm8, %xmm5
1087 ; SSSE3-NEXT:    pxor %xmm8, %xmm9
1088 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
1089 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm4
1090 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
1091 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm9
1092 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm9[1,1,3,3]
1093 ; SSSE3-NEXT:    pand %xmm10, %xmm5
1094 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1095 ; SSSE3-NEXT:    por %xmm5, %xmm4
1096 ; SSSE3-NEXT:    pand %xmm4, %xmm1
1097 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
1098 ; SSSE3-NEXT:    psubq %xmm6, %xmm2
1099 ; SSSE3-NEXT:    pxor %xmm8, %xmm6
1100 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
1101 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
1102 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm5
1103 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
1104 ; SSSE3-NEXT:    pcmpeqd %xmm6, %xmm4
1105 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1106 ; SSSE3-NEXT:    pand %xmm9, %xmm4
1107 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1108 ; SSSE3-NEXT:    por %xmm4, %xmm5
1109 ; SSSE3-NEXT:    pand %xmm5, %xmm2
1110 ; SSSE3-NEXT:    movdqa %xmm7, %xmm4
1111 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
1112 ; SSSE3-NEXT:    pxor %xmm3, %xmm8
1113 ; SSSE3-NEXT:    movdqa %xmm8, %xmm5
1114 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm5
1115 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1116 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm8
1117 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm8[1,1,3,3]
1118 ; SSSE3-NEXT:    pand %xmm6, %xmm4
1119 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1120 ; SSSE3-NEXT:    por %xmm4, %xmm5
1121 ; SSSE3-NEXT:    psubq %xmm7, %xmm3
1122 ; SSSE3-NEXT:    pand %xmm5, %xmm3
1123 ; SSSE3-NEXT:    retq
1125 ; SSE41-LABEL: v8i64:
1126 ; SSE41:       # %bb.0:
1127 ; SSE41-NEXT:    movdqa %xmm0, %xmm9
1128 ; SSE41-NEXT:    movdqa {{.*#+}} xmm10 = [9223372039002259456,9223372039002259456]
1129 ; SSE41-NEXT:    movdqa %xmm0, %xmm8
1130 ; SSE41-NEXT:    psubq %xmm4, %xmm9
1131 ; SSE41-NEXT:    pxor %xmm10, %xmm4
1132 ; SSE41-NEXT:    pxor %xmm10, %xmm8
1133 ; SSE41-NEXT:    movdqa %xmm8, %xmm0
1134 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm0
1135 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm8
1136 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm8[0,0,2,2]
1137 ; SSE41-NEXT:    pand %xmm4, %xmm0
1138 ; SSE41-NEXT:    por %xmm8, %xmm0
1139 ; SSE41-NEXT:    pxor %xmm8, %xmm8
1140 ; SSE41-NEXT:    xorpd %xmm11, %xmm11
1141 ; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm11
1142 ; SSE41-NEXT:    movdqa %xmm1, %xmm4
1143 ; SSE41-NEXT:    psubq %xmm5, %xmm1
1144 ; SSE41-NEXT:    pxor %xmm10, %xmm5
1145 ; SSE41-NEXT:    pxor %xmm10, %xmm4
1146 ; SSE41-NEXT:    movdqa %xmm4, %xmm9
1147 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm9
1148 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm4
1149 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
1150 ; SSE41-NEXT:    pand %xmm9, %xmm0
1151 ; SSE41-NEXT:    por %xmm4, %xmm0
1152 ; SSE41-NEXT:    pxor %xmm5, %xmm5
1153 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
1154 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
1155 ; SSE41-NEXT:    psubq %xmm6, %xmm2
1156 ; SSE41-NEXT:    pxor %xmm10, %xmm6
1157 ; SSE41-NEXT:    pxor %xmm10, %xmm1
1158 ; SSE41-NEXT:    movdqa %xmm1, %xmm4
1159 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm4
1160 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm1
1161 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
1162 ; SSE41-NEXT:    pand %xmm4, %xmm0
1163 ; SSE41-NEXT:    por %xmm1, %xmm0
1164 ; SSE41-NEXT:    pxor %xmm6, %xmm6
1165 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm6
1166 ; SSE41-NEXT:    movdqa %xmm7, %xmm0
1167 ; SSE41-NEXT:    pxor %xmm10, %xmm0
1168 ; SSE41-NEXT:    pxor %xmm3, %xmm10
1169 ; SSE41-NEXT:    movdqa %xmm10, %xmm1
1170 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
1171 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm10
1172 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[0,0,2,2]
1173 ; SSE41-NEXT:    pand %xmm1, %xmm0
1174 ; SSE41-NEXT:    por %xmm10, %xmm0
1175 ; SSE41-NEXT:    psubq %xmm7, %xmm3
1176 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm8
1177 ; SSE41-NEXT:    movapd %xmm11, %xmm0
1178 ; SSE41-NEXT:    movapd %xmm5, %xmm1
1179 ; SSE41-NEXT:    movapd %xmm6, %xmm2
1180 ; SSE41-NEXT:    movapd %xmm8, %xmm3
1181 ; SSE41-NEXT:    retq
1183 ; AVX1-LABEL: v8i64:
1184 ; AVX1:       # %bb.0:
1185 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1186 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]
1187 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm8
1188 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
1189 ; AVX1-NEXT:    vpxor %xmm5, %xmm7, %xmm6
1190 ; AVX1-NEXT:    vpcmpgtq %xmm8, %xmm6, %xmm6
1191 ; AVX1-NEXT:    vblendvpd %xmm6, %xmm7, %xmm4, %xmm6
1192 ; AVX1-NEXT:    vpsubq %xmm4, %xmm6, %xmm4
1193 ; AVX1-NEXT:    vpxor %xmm5, %xmm2, %xmm6
1194 ; AVX1-NEXT:    vpxor %xmm5, %xmm0, %xmm7
1195 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
1196 ; AVX1-NEXT:    vblendvpd %xmm6, %xmm0, %xmm2, %xmm0
1197 ; AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
1198 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
1199 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
1200 ; AVX1-NEXT:    vpxor %xmm5, %xmm2, %xmm4
1201 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm6
1202 ; AVX1-NEXT:    vpxor %xmm5, %xmm6, %xmm7
1203 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm7, %xmm4
1204 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm6, %xmm2, %xmm4
1205 ; AVX1-NEXT:    vpsubq %xmm2, %xmm4, %xmm2
1206 ; AVX1-NEXT:    vpxor %xmm5, %xmm3, %xmm4
1207 ; AVX1-NEXT:    vpxor %xmm5, %xmm1, %xmm5
1208 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
1209 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm1, %xmm3, %xmm1
1210 ; AVX1-NEXT:    vpsubq %xmm3, %xmm1, %xmm1
1211 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1212 ; AVX1-NEXT:    retq
1214 ; AVX2-LABEL: v8i64:
1215 ; AVX2:       # %bb.0:
1216 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1217 ; AVX2-NEXT:    vpxor %ymm4, %ymm2, %ymm5
1218 ; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm6
1219 ; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm6, %ymm5
1220 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm0, %ymm2, %ymm0
1221 ; AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
1222 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm2
1223 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm4
1224 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm4, %ymm2
1225 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm1, %ymm3, %ymm1
1226 ; AVX2-NEXT:    vpsubq %ymm3, %ymm1, %ymm1
1227 ; AVX2-NEXT:    retq
1229 ; AVX512-LABEL: v8i64:
1230 ; AVX512:       # %bb.0:
1231 ; AVX512-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
1232 ; AVX512-NEXT:    vpsubq %zmm1, %zmm0, %zmm0
1233 ; AVX512-NEXT:    retq
1234   %z = call <8 x i64> @llvm.usub.sat.v8i64(<8 x i64> %x, <8 x i64> %y)
1235   ret <8 x i64> %z
1238 define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind {
1239 ; SSE-LABEL: v2i128:
1240 ; SSE:       # %bb.0:
1241 ; SSE-NEXT:    movq %rdi, %rax
1242 ; SSE-NEXT:    xorl %edi, %edi
1243 ; SSE-NEXT:    subq %r9, %rsi
1244 ; SSE-NEXT:    sbbq {{[0-9]+}}(%rsp), %rdx
1245 ; SSE-NEXT:    cmovbq %rdi, %rsi
1246 ; SSE-NEXT:    cmovbq %rdi, %rdx
1247 ; SSE-NEXT:    subq {{[0-9]+}}(%rsp), %rcx
1248 ; SSE-NEXT:    sbbq {{[0-9]+}}(%rsp), %r8
1249 ; SSE-NEXT:    cmovbq %rdi, %r8
1250 ; SSE-NEXT:    cmovbq %rdi, %rcx
1251 ; SSE-NEXT:    movq %r8, 24(%rax)
1252 ; SSE-NEXT:    movq %rcx, 16(%rax)
1253 ; SSE-NEXT:    movq %rdx, 8(%rax)
1254 ; SSE-NEXT:    movq %rsi, (%rax)
1255 ; SSE-NEXT:    retq
1257 ; AVX-LABEL: v2i128:
1258 ; AVX:       # %bb.0:
1259 ; AVX-NEXT:    movq %rdi, %rax
1260 ; AVX-NEXT:    xorl %edi, %edi
1261 ; AVX-NEXT:    subq %r9, %rsi
1262 ; AVX-NEXT:    sbbq {{[0-9]+}}(%rsp), %rdx
1263 ; AVX-NEXT:    cmovbq %rdi, %rsi
1264 ; AVX-NEXT:    cmovbq %rdi, %rdx
1265 ; AVX-NEXT:    subq {{[0-9]+}}(%rsp), %rcx
1266 ; AVX-NEXT:    sbbq {{[0-9]+}}(%rsp), %r8
1267 ; AVX-NEXT:    cmovbq %rdi, %r8
1268 ; AVX-NEXT:    cmovbq %rdi, %rcx
1269 ; AVX-NEXT:    movq %r8, 24(%rax)
1270 ; AVX-NEXT:    movq %rcx, 16(%rax)
1271 ; AVX-NEXT:    movq %rdx, 8(%rax)
1272 ; AVX-NEXT:    movq %rsi, (%rax)
1273 ; AVX-NEXT:    retq
1274   %z = call <2 x i128> @llvm.usub.sat.v2i128(<2 x i128> %x, <2 x i128> %y)
1275   ret <2 x i128> %z