[DAGCombiner] Eliminate dead stores to stack.
[llvm-complete.git] / test / CodeGen / X86 / usub_sat_vec.ll
blob72c0c51ab741cddf629dcb4c77fbc729a2d386b1
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 ; AVX1-LABEL: v8i8:
214 ; AVX1:       # %bb.0:
215 ; AVX1-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
216 ; AVX1-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
217 ; AVX1-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
218 ; AVX1-NEXT:    vmovq %xmm0, (%rdx)
219 ; AVX1-NEXT:    retq
221 ; AVX2-LABEL: v8i8:
222 ; AVX2:       # %bb.0:
223 ; AVX2-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
224 ; AVX2-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
225 ; AVX2-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
226 ; AVX2-NEXT:    vmovq %xmm0, (%rdx)
227 ; AVX2-NEXT:    retq
229 ; AVX512-LABEL: v8i8:
230 ; AVX512:       # %bb.0:
231 ; AVX512-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
232 ; AVX512-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
233 ; AVX512-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
234 ; AVX512-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
235 ; AVX512-NEXT:    vpmovwb %xmm0, (%rdx)
236 ; AVX512-NEXT:    retq
237   %x = load <8 x i8>, <8 x i8>* %px
238   %y = load <8 x i8>, <8 x i8>* %py
239   %z = call <8 x i8> @llvm.usub.sat.v8i8(<8 x i8> %x, <8 x i8> %y)
240   store <8 x i8> %z, <8 x i8>* %pz
241   ret void
244 define void @v4i8(<4 x i8>* %px, <4 x i8>* %py, <4 x i8>* %pz) nounwind {
245 ; SSE-LABEL: v4i8:
246 ; SSE:       # %bb.0:
247 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
248 ; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
249 ; SSE-NEXT:    psubusb %xmm1, %xmm0
250 ; SSE-NEXT:    movd %xmm0, (%rdx)
251 ; SSE-NEXT:    retq
253 ; AVX1-LABEL: v4i8:
254 ; AVX1:       # %bb.0:
255 ; AVX1-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
256 ; AVX1-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
257 ; AVX1-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
258 ; AVX1-NEXT:    vmovd %xmm0, (%rdx)
259 ; AVX1-NEXT:    retq
261 ; AVX2-LABEL: v4i8:
262 ; AVX2:       # %bb.0:
263 ; AVX2-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
264 ; AVX2-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
265 ; AVX2-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
266 ; AVX2-NEXT:    vmovd %xmm0, (%rdx)
267 ; AVX2-NEXT:    retq
269 ; AVX512-LABEL: v4i8:
270 ; AVX512:       # %bb.0:
271 ; AVX512-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
272 ; AVX512-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
273 ; AVX512-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
274 ; AVX512-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
275 ; AVX512-NEXT:    vpmovdb %xmm0, (%rdx)
276 ; AVX512-NEXT:    retq
277   %x = load <4 x i8>, <4 x i8>* %px
278   %y = load <4 x i8>, <4 x i8>* %py
279   %z = call <4 x i8> @llvm.usub.sat.v4i8(<4 x i8> %x, <4 x i8> %y)
280   store <4 x i8> %z, <4 x i8>* %pz
281   ret void
284 define void @v2i8(<2 x i8>* %px, <2 x i8>* %py, <2 x i8>* %pz) nounwind {
285 ; SSE2-LABEL: v2i8:
286 ; SSE2:       # %bb.0:
287 ; SSE2-NEXT:    movzwl (%rdi), %eax
288 ; SSE2-NEXT:    movd %eax, %xmm0
289 ; SSE2-NEXT:    movzwl (%rsi), %eax
290 ; SSE2-NEXT:    movd %eax, %xmm1
291 ; SSE2-NEXT:    psubusb %xmm1, %xmm0
292 ; SSE2-NEXT:    movd %xmm0, %eax
293 ; SSE2-NEXT:    movw %ax, (%rdx)
294 ; SSE2-NEXT:    retq
296 ; SSSE3-LABEL: v2i8:
297 ; SSSE3:       # %bb.0:
298 ; SSSE3-NEXT:    movzwl (%rdi), %eax
299 ; SSSE3-NEXT:    movd %eax, %xmm0
300 ; SSSE3-NEXT:    movzwl (%rsi), %eax
301 ; SSSE3-NEXT:    movd %eax, %xmm1
302 ; SSSE3-NEXT:    psubusb %xmm1, %xmm0
303 ; SSSE3-NEXT:    movd %xmm0, %eax
304 ; SSSE3-NEXT:    movw %ax, (%rdx)
305 ; SSSE3-NEXT:    retq
307 ; SSE41-LABEL: v2i8:
308 ; SSE41:       # %bb.0:
309 ; SSE41-NEXT:    movzwl (%rdi), %eax
310 ; SSE41-NEXT:    movd %eax, %xmm0
311 ; SSE41-NEXT:    movzwl (%rsi), %eax
312 ; SSE41-NEXT:    movd %eax, %xmm1
313 ; SSE41-NEXT:    psubusb %xmm1, %xmm0
314 ; SSE41-NEXT:    pextrw $0, %xmm0, (%rdx)
315 ; SSE41-NEXT:    retq
317 ; AVX1-LABEL: v2i8:
318 ; AVX1:       # %bb.0:
319 ; AVX1-NEXT:    movzwl (%rdi), %eax
320 ; AVX1-NEXT:    vmovd %eax, %xmm0
321 ; AVX1-NEXT:    movzwl (%rsi), %eax
322 ; AVX1-NEXT:    vmovd %eax, %xmm1
323 ; AVX1-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
324 ; AVX1-NEXT:    vpextrw $0, %xmm0, (%rdx)
325 ; AVX1-NEXT:    retq
327 ; AVX2-LABEL: v2i8:
328 ; AVX2:       # %bb.0:
329 ; AVX2-NEXT:    movzwl (%rdi), %eax
330 ; AVX2-NEXT:    vmovd %eax, %xmm0
331 ; AVX2-NEXT:    movzwl (%rsi), %eax
332 ; AVX2-NEXT:    vmovd %eax, %xmm1
333 ; AVX2-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
334 ; AVX2-NEXT:    vpextrw $0, %xmm0, (%rdx)
335 ; AVX2-NEXT:    retq
337 ; AVX512-LABEL: v2i8:
338 ; AVX512:       # %bb.0:
339 ; AVX512-NEXT:    movzwl (%rdi), %eax
340 ; AVX512-NEXT:    vmovd %eax, %xmm0
341 ; AVX512-NEXT:    movzwl (%rsi), %eax
342 ; AVX512-NEXT:    vmovd %eax, %xmm1
343 ; AVX512-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
344 ; AVX512-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
345 ; AVX512-NEXT:    vpmovqb %xmm0, (%rdx)
346 ; AVX512-NEXT:    retq
347   %x = load <2 x i8>, <2 x i8>* %px
348   %y = load <2 x i8>, <2 x i8>* %py
349   %z = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %x, <2 x i8> %y)
350   store <2 x i8> %z, <2 x i8>* %pz
351   ret void
354 define void @v4i16(<4 x i16>* %px, <4 x i16>* %py, <4 x i16>* %pz) nounwind {
355 ; SSE-LABEL: v4i16:
356 ; SSE:       # %bb.0:
357 ; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
358 ; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
359 ; SSE-NEXT:    psubusw %xmm1, %xmm0
360 ; SSE-NEXT:    movq %xmm0, (%rdx)
361 ; SSE-NEXT:    retq
363 ; AVX1-LABEL: v4i16:
364 ; AVX1:       # %bb.0:
365 ; AVX1-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
366 ; AVX1-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
367 ; AVX1-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
368 ; AVX1-NEXT:    vmovq %xmm0, (%rdx)
369 ; AVX1-NEXT:    retq
371 ; AVX2-LABEL: v4i16:
372 ; AVX2:       # %bb.0:
373 ; AVX2-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
374 ; AVX2-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
375 ; AVX2-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
376 ; AVX2-NEXT:    vmovq %xmm0, (%rdx)
377 ; AVX2-NEXT:    retq
379 ; AVX512-LABEL: v4i16:
380 ; AVX512:       # %bb.0:
381 ; AVX512-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
382 ; AVX512-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
383 ; AVX512-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
384 ; AVX512-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
385 ; AVX512-NEXT:    vpmovdw %xmm0, (%rdx)
386 ; AVX512-NEXT:    retq
387   %x = load <4 x i16>, <4 x i16>* %px
388   %y = load <4 x i16>, <4 x i16>* %py
389   %z = call <4 x i16> @llvm.usub.sat.v4i16(<4 x i16> %x, <4 x i16> %y)
390   store <4 x i16> %z, <4 x i16>* %pz
391   ret void
394 define void @v2i16(<2 x i16>* %px, <2 x i16>* %py, <2 x i16>* %pz) nounwind {
395 ; SSE-LABEL: v2i16:
396 ; SSE:       # %bb.0:
397 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
398 ; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
399 ; SSE-NEXT:    psubusw %xmm1, %xmm0
400 ; SSE-NEXT:    movd %xmm0, (%rdx)
401 ; SSE-NEXT:    retq
403 ; AVX1-LABEL: v2i16:
404 ; AVX1:       # %bb.0:
405 ; AVX1-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
406 ; AVX1-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
407 ; AVX1-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
408 ; AVX1-NEXT:    vmovd %xmm0, (%rdx)
409 ; AVX1-NEXT:    retq
411 ; AVX2-LABEL: v2i16:
412 ; AVX2:       # %bb.0:
413 ; AVX2-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
414 ; AVX2-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
415 ; AVX2-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
416 ; AVX2-NEXT:    vmovd %xmm0, (%rdx)
417 ; AVX2-NEXT:    retq
419 ; AVX512-LABEL: v2i16:
420 ; AVX512:       # %bb.0:
421 ; AVX512-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
422 ; AVX512-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
423 ; AVX512-NEXT:    vpsubusw %xmm1, %xmm0, %xmm0
424 ; AVX512-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
425 ; AVX512-NEXT:    vpmovqw %xmm0, (%rdx)
426 ; AVX512-NEXT:    retq
427   %x = load <2 x i16>, <2 x i16>* %px
428   %y = load <2 x i16>, <2 x i16>* %py
429   %z = call <2 x i16> @llvm.usub.sat.v2i16(<2 x i16> %x, <2 x i16> %y)
430   store <2 x i16> %z, <2 x i16>* %pz
431   ret void
434 define <12 x i8> @v12i8(<12 x i8> %x, <12 x i8> %y) nounwind {
435 ; SSE-LABEL: v12i8:
436 ; SSE:       # %bb.0:
437 ; SSE-NEXT:    psubusb %xmm1, %xmm0
438 ; SSE-NEXT:    retq
440 ; AVX-LABEL: v12i8:
441 ; AVX:       # %bb.0:
442 ; AVX-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
443 ; AVX-NEXT:    retq
444   %z = call <12 x i8> @llvm.usub.sat.v12i8(<12 x i8> %x, <12 x i8> %y)
445   ret <12 x i8> %z
448 define void @v12i16(<12 x i16>* %px, <12 x i16>* %py, <12 x i16>* %pz) nounwind {
449 ; SSE-LABEL: v12i16:
450 ; SSE:       # %bb.0:
451 ; SSE-NEXT:    movdqa (%rdi), %xmm0
452 ; SSE-NEXT:    movdqa 16(%rdi), %xmm1
453 ; SSE-NEXT:    psubusw (%rsi), %xmm0
454 ; SSE-NEXT:    psubusw 16(%rsi), %xmm1
455 ; SSE-NEXT:    movq %xmm1, 16(%rdx)
456 ; SSE-NEXT:    movdqa %xmm0, (%rdx)
457 ; SSE-NEXT:    retq
459 ; AVX1-LABEL: v12i16:
460 ; AVX1:       # %bb.0:
461 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
462 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
463 ; AVX1-NEXT:    vpsubusw (%rsi), %xmm0, %xmm0
464 ; AVX1-NEXT:    vpsubusw 16(%rsi), %xmm1, %xmm1
465 ; AVX1-NEXT:    vmovq %xmm1, 16(%rdx)
466 ; AVX1-NEXT:    vmovdqa %xmm0, (%rdx)
467 ; AVX1-NEXT:    retq
469 ; AVX2-LABEL: v12i16:
470 ; AVX2:       # %bb.0:
471 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
472 ; AVX2-NEXT:    vpsubusw (%rsi), %ymm0, %ymm0
473 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
474 ; AVX2-NEXT:    vmovq %xmm1, 16(%rdx)
475 ; AVX2-NEXT:    vmovdqa %xmm0, (%rdx)
476 ; AVX2-NEXT:    vzeroupper
477 ; AVX2-NEXT:    retq
479 ; AVX512-LABEL: v12i16:
480 ; AVX512:       # %bb.0:
481 ; AVX512-NEXT:    vmovdqa (%rdi), %ymm0
482 ; AVX512-NEXT:    vpsubusw (%rsi), %ymm0, %ymm0
483 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
484 ; AVX512-NEXT:    vmovq %xmm1, 16(%rdx)
485 ; AVX512-NEXT:    vmovdqa %xmm0, (%rdx)
486 ; AVX512-NEXT:    vzeroupper
487 ; AVX512-NEXT:    retq
488   %x = load <12 x i16>, <12 x i16>* %px
489   %y = load <12 x i16>, <12 x i16>* %py
490   %z = call <12 x i16> @llvm.usub.sat.v12i16(<12 x i16> %x, <12 x i16> %y)
491   store <12 x i16> %z, <12 x i16>* %pz
492   ret void
495 ; Scalarization
497 define void @v1i8(<1 x i8>* %px, <1 x i8>* %py, <1 x i8>* %pz) nounwind {
498 ; SSE-LABEL: v1i8:
499 ; SSE:       # %bb.0:
500 ; SSE-NEXT:    movb (%rdi), %al
501 ; SSE-NEXT:    subb (%rsi), %al
502 ; SSE-NEXT:    jae .LBB13_2
503 ; SSE-NEXT:  # %bb.1:
504 ; SSE-NEXT:    xorl %eax, %eax
505 ; SSE-NEXT:  .LBB13_2:
506 ; SSE-NEXT:    movb %al, (%rdx)
507 ; SSE-NEXT:    retq
509 ; AVX-LABEL: v1i8:
510 ; AVX:       # %bb.0:
511 ; AVX-NEXT:    movb (%rdi), %al
512 ; AVX-NEXT:    subb (%rsi), %al
513 ; AVX-NEXT:    jae .LBB13_2
514 ; AVX-NEXT:  # %bb.1:
515 ; AVX-NEXT:    xorl %eax, %eax
516 ; AVX-NEXT:  .LBB13_2:
517 ; AVX-NEXT:    movb %al, (%rdx)
518 ; AVX-NEXT:    retq
519   %x = load <1 x i8>, <1 x i8>* %px
520   %y = load <1 x i8>, <1 x i8>* %py
521   %z = call <1 x i8> @llvm.usub.sat.v1i8(<1 x i8> %x, <1 x i8> %y)
522   store <1 x i8> %z, <1 x i8>* %pz
523   ret void
526 define void @v1i16(<1 x i16>* %px, <1 x i16>* %py, <1 x i16>* %pz) nounwind {
527 ; SSE-LABEL: v1i16:
528 ; SSE:       # %bb.0:
529 ; SSE-NEXT:    movzwl (%rdi), %eax
530 ; SSE-NEXT:    xorl %ecx, %ecx
531 ; SSE-NEXT:    subw (%rsi), %ax
532 ; SSE-NEXT:    cmovbl %ecx, %eax
533 ; SSE-NEXT:    movw %ax, (%rdx)
534 ; SSE-NEXT:    retq
536 ; AVX-LABEL: v1i16:
537 ; AVX:       # %bb.0:
538 ; AVX-NEXT:    movzwl (%rdi), %eax
539 ; AVX-NEXT:    xorl %ecx, %ecx
540 ; AVX-NEXT:    subw (%rsi), %ax
541 ; AVX-NEXT:    cmovbl %ecx, %eax
542 ; AVX-NEXT:    movw %ax, (%rdx)
543 ; AVX-NEXT:    retq
544   %x = load <1 x i16>, <1 x i16>* %px
545   %y = load <1 x i16>, <1 x i16>* %py
546   %z = call <1 x i16> @llvm.usub.sat.v1i16(<1 x i16> %x, <1 x i16> %y)
547   store <1 x i16> %z, <1 x i16>* %pz
548   ret void
551 ; Promotion
553 define <16 x i4> @v16i4(<16 x i4> %x, <16 x i4> %y) nounwind {
554 ; SSE-LABEL: v16i4:
555 ; SSE:       # %bb.0:
556 ; SSE-NEXT:    psllw $4, %xmm1
557 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
558 ; SSE-NEXT:    pand %xmm2, %xmm1
559 ; SSE-NEXT:    psllw $4, %xmm0
560 ; SSE-NEXT:    pand %xmm2, %xmm0
561 ; SSE-NEXT:    psubusb %xmm1, %xmm0
562 ; SSE-NEXT:    psrlw $4, %xmm0
563 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
564 ; SSE-NEXT:    retq
566 ; AVX-LABEL: v16i4:
567 ; AVX:       # %bb.0:
568 ; AVX-NEXT:    vpsllw $4, %xmm1, %xmm1
569 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
570 ; AVX-NEXT:    vpand %xmm2, %xmm1, %xmm1
571 ; AVX-NEXT:    vpsllw $4, %xmm0, %xmm0
572 ; AVX-NEXT:    vpand %xmm2, %xmm0, %xmm0
573 ; AVX-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
574 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
575 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
576 ; AVX-NEXT:    retq
577   %z = call <16 x i4> @llvm.usub.sat.v16i4(<16 x i4> %x, <16 x i4> %y)
578   ret <16 x i4> %z
581 define <16 x i1> @v16i1(<16 x i1> %x, <16 x i1> %y) nounwind {
582 ; SSE-LABEL: v16i1:
583 ; SSE:       # %bb.0:
584 ; SSE-NEXT:    psllw $7, %xmm1
585 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
586 ; SSE-NEXT:    pand %xmm2, %xmm1
587 ; SSE-NEXT:    psllw $7, %xmm0
588 ; SSE-NEXT:    pand %xmm2, %xmm0
589 ; SSE-NEXT:    psubusb %xmm1, %xmm0
590 ; SSE-NEXT:    psrlw $7, %xmm0
591 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
592 ; SSE-NEXT:    retq
594 ; AVX1-LABEL: v16i1:
595 ; AVX1:       # %bb.0:
596 ; AVX1-NEXT:    vpsllw $7, %xmm1, %xmm1
597 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
598 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
599 ; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
600 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
601 ; AVX1-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
602 ; AVX1-NEXT:    vpsrlw $7, %xmm0, %xmm0
603 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
604 ; AVX1-NEXT:    retq
606 ; AVX2-LABEL: v16i1:
607 ; AVX2:       # %bb.0:
608 ; AVX2-NEXT:    vpsllw $7, %xmm1, %xmm1
609 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
610 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
611 ; AVX2-NEXT:    vpsllw $7, %xmm0, %xmm0
612 ; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
613 ; AVX2-NEXT:    vpsubusb %xmm1, %xmm0, %xmm0
614 ; AVX2-NEXT:    vpsrlw $7, %xmm0, %xmm0
615 ; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
616 ; AVX2-NEXT:    retq
618 ; AVX512-LABEL: v16i1:
619 ; AVX512:       # %bb.0:
620 ; AVX512-NEXT:    vpsllw $7, %xmm0, %xmm0
621 ; AVX512-NEXT:    vpmovb2m %xmm0, %k0
622 ; AVX512-NEXT:    vpsllw $7, %xmm1, %xmm0
623 ; AVX512-NEXT:    vpmovb2m %xmm0, %k1
624 ; AVX512-NEXT:    kandnw %k0, %k1, %k0
625 ; AVX512-NEXT:    vpmovm2b %k0, %xmm0
626 ; AVX512-NEXT:    retq
627   %z = call <16 x i1> @llvm.usub.sat.v16i1(<16 x i1> %x, <16 x i1> %y)
628   ret <16 x i1> %z
631 ; Expanded
633 define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {
634 ; SSE2-LABEL: v2i32:
635 ; SSE2:       # %bb.0:
636 ; SSE2-NEXT:    psllq $32, %xmm1
637 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
638 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
639 ; SSE2-NEXT:    pxor %xmm2, %xmm3
640 ; SSE2-NEXT:    psllq $32, %xmm0
641 ; SSE2-NEXT:    pxor %xmm0, %xmm2
642 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
643 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
644 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
645 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
646 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
647 ; SSE2-NEXT:    pand %xmm5, %xmm2
648 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
649 ; SSE2-NEXT:    por %xmm2, %xmm3
650 ; SSE2-NEXT:    pand %xmm3, %xmm0
651 ; SSE2-NEXT:    pandn %xmm1, %xmm3
652 ; SSE2-NEXT:    por %xmm3, %xmm0
653 ; SSE2-NEXT:    psubq %xmm1, %xmm0
654 ; SSE2-NEXT:    psrlq $32, %xmm0
655 ; SSE2-NEXT:    retq
657 ; SSSE3-LABEL: v2i32:
658 ; SSSE3:       # %bb.0:
659 ; SSSE3-NEXT:    psllq $32, %xmm1
660 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
661 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
662 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
663 ; SSSE3-NEXT:    psllq $32, %xmm0
664 ; SSSE3-NEXT:    pxor %xmm0, %xmm2
665 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
666 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
667 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
668 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm2
669 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
670 ; SSSE3-NEXT:    pand %xmm5, %xmm2
671 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
672 ; SSSE3-NEXT:    por %xmm2, %xmm3
673 ; SSSE3-NEXT:    pand %xmm3, %xmm0
674 ; SSSE3-NEXT:    pandn %xmm1, %xmm3
675 ; SSSE3-NEXT:    por %xmm3, %xmm0
676 ; SSSE3-NEXT:    psubq %xmm1, %xmm0
677 ; SSSE3-NEXT:    psrlq $32, %xmm0
678 ; SSSE3-NEXT:    retq
680 ; SSE41-LABEL: v2i32:
681 ; SSE41:       # %bb.0:
682 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
683 ; SSE41-NEXT:    psllq $32, %xmm1
684 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
685 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
686 ; SSE41-NEXT:    pxor %xmm0, %xmm3
687 ; SSE41-NEXT:    psllq $32, %xmm2
688 ; SSE41-NEXT:    pxor %xmm2, %xmm0
689 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
690 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm4
691 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
692 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
693 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
694 ; SSE41-NEXT:    pand %xmm5, %xmm0
695 ; SSE41-NEXT:    por %xmm4, %xmm0
696 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
697 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
698 ; SSE41-NEXT:    psubq %xmm1, %xmm3
699 ; SSE41-NEXT:    psrlq $32, %xmm3
700 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
701 ; SSE41-NEXT:    retq
703 ; AVX1-LABEL: v2i32:
704 ; AVX1:       # %bb.0:
705 ; AVX1-NEXT:    vpsllq $32, %xmm1, %xmm1
706 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
707 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm3
708 ; AVX1-NEXT:    vpsllq $32, %xmm0, %xmm0
709 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm2
710 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
711 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
712 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
713 ; AVX1-NEXT:    vpsrlq $32, %xmm0, %xmm0
714 ; AVX1-NEXT:    retq
716 ; AVX2-LABEL: v2i32:
717 ; AVX2:       # %bb.0:
718 ; AVX2-NEXT:    vpsllq $32, %xmm1, %xmm1
719 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
720 ; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm3
721 ; AVX2-NEXT:    vpsllq $32, %xmm0, %xmm0
722 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm2
723 ; AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
724 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
725 ; AVX2-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
726 ; AVX2-NEXT:    vpsrlq $32, %xmm0, %xmm0
727 ; AVX2-NEXT:    retq
729 ; AVX512-LABEL: v2i32:
730 ; AVX512:       # %bb.0:
731 ; AVX512-NEXT:    vpsllq $32, %xmm1, %xmm1
732 ; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
733 ; AVX512-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
734 ; AVX512-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
735 ; AVX512-NEXT:    vpsrlq $32, %xmm0, %xmm0
736 ; AVX512-NEXT:    retq
737   %z = call <2 x i32> @llvm.usub.sat.v2i32(<2 x i32> %x, <2 x i32> %y)
738   ret <2 x i32> %z
741 define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {
742 ; SSE2-LABEL: v4i32:
743 ; SSE2:       # %bb.0:
744 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
745 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
746 ; SSE2-NEXT:    pxor %xmm2, %xmm3
747 ; SSE2-NEXT:    pxor %xmm0, %xmm2
748 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
749 ; SSE2-NEXT:    pand %xmm2, %xmm0
750 ; SSE2-NEXT:    pandn %xmm1, %xmm2
751 ; SSE2-NEXT:    por %xmm2, %xmm0
752 ; SSE2-NEXT:    psubd %xmm1, %xmm0
753 ; SSE2-NEXT:    retq
755 ; SSSE3-LABEL: v4i32:
756 ; SSSE3:       # %bb.0:
757 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
758 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
759 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
760 ; SSSE3-NEXT:    pxor %xmm0, %xmm2
761 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2
762 ; SSSE3-NEXT:    pand %xmm2, %xmm0
763 ; SSSE3-NEXT:    pandn %xmm1, %xmm2
764 ; SSSE3-NEXT:    por %xmm2, %xmm0
765 ; SSSE3-NEXT:    psubd %xmm1, %xmm0
766 ; SSSE3-NEXT:    retq
768 ; SSE41-LABEL: v4i32:
769 ; SSE41:       # %bb.0:
770 ; SSE41-NEXT:    pmaxud %xmm1, %xmm0
771 ; SSE41-NEXT:    psubd %xmm1, %xmm0
772 ; SSE41-NEXT:    retq
774 ; AVX-LABEL: v4i32:
775 ; AVX:       # %bb.0:
776 ; AVX-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
777 ; AVX-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
778 ; AVX-NEXT:    retq
779   %z = call <4 x i32> @llvm.usub.sat.v4i32(<4 x i32> %x, <4 x i32> %y)
780   ret <4 x i32> %z
783 define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
784 ; SSE2-LABEL: v8i32:
785 ; SSE2:       # %bb.0:
786 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]
787 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
788 ; SSE2-NEXT:    pxor %xmm5, %xmm6
789 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
790 ; SSE2-NEXT:    pxor %xmm5, %xmm4
791 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm4
792 ; SSE2-NEXT:    pand %xmm4, %xmm0
793 ; SSE2-NEXT:    pandn %xmm2, %xmm4
794 ; SSE2-NEXT:    por %xmm0, %xmm4
795 ; SSE2-NEXT:    psubd %xmm2, %xmm4
796 ; SSE2-NEXT:    movdqa %xmm3, %xmm0
797 ; SSE2-NEXT:    pxor %xmm5, %xmm0
798 ; SSE2-NEXT:    pxor %xmm1, %xmm5
799 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
800 ; SSE2-NEXT:    pand %xmm5, %xmm1
801 ; SSE2-NEXT:    pandn %xmm3, %xmm5
802 ; SSE2-NEXT:    por %xmm5, %xmm1
803 ; SSE2-NEXT:    psubd %xmm3, %xmm1
804 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
805 ; SSE2-NEXT:    retq
807 ; SSSE3-LABEL: v8i32:
808 ; SSSE3:       # %bb.0:
809 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]
810 ; SSSE3-NEXT:    movdqa %xmm2, %xmm6
811 ; SSSE3-NEXT:    pxor %xmm5, %xmm6
812 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
813 ; SSSE3-NEXT:    pxor %xmm5, %xmm4
814 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm4
815 ; SSSE3-NEXT:    pand %xmm4, %xmm0
816 ; SSSE3-NEXT:    pandn %xmm2, %xmm4
817 ; SSSE3-NEXT:    por %xmm0, %xmm4
818 ; SSSE3-NEXT:    psubd %xmm2, %xmm4
819 ; SSSE3-NEXT:    movdqa %xmm3, %xmm0
820 ; SSSE3-NEXT:    pxor %xmm5, %xmm0
821 ; SSSE3-NEXT:    pxor %xmm1, %xmm5
822 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm5
823 ; SSSE3-NEXT:    pand %xmm5, %xmm1
824 ; SSSE3-NEXT:    pandn %xmm3, %xmm5
825 ; SSSE3-NEXT:    por %xmm5, %xmm1
826 ; SSSE3-NEXT:    psubd %xmm3, %xmm1
827 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
828 ; SSSE3-NEXT:    retq
830 ; SSE41-LABEL: v8i32:
831 ; SSE41:       # %bb.0:
832 ; SSE41-NEXT:    pmaxud %xmm2, %xmm0
833 ; SSE41-NEXT:    psubd %xmm2, %xmm0
834 ; SSE41-NEXT:    pmaxud %xmm3, %xmm1
835 ; SSE41-NEXT:    psubd %xmm3, %xmm1
836 ; SSE41-NEXT:    retq
838 ; AVX1-LABEL: v8i32:
839 ; AVX1:       # %bb.0:
840 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
841 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
842 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm3, %xmm3
843 ; AVX1-NEXT:    vpsubd %xmm2, %xmm3, %xmm2
844 ; AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
845 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
846 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
847 ; AVX1-NEXT:    retq
849 ; AVX2-LABEL: v8i32:
850 ; AVX2:       # %bb.0:
851 ; AVX2-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0
852 ; AVX2-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
853 ; AVX2-NEXT:    retq
855 ; AVX512-LABEL: v8i32:
856 ; AVX512:       # %bb.0:
857 ; AVX512-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0
858 ; AVX512-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
859 ; AVX512-NEXT:    retq
860   %z = call <8 x i32> @llvm.usub.sat.v8i32(<8 x i32> %x, <8 x i32> %y)
861   ret <8 x i32> %z
864 define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind {
865 ; SSE2-LABEL: v16i32:
866 ; SSE2:       # %bb.0:
867 ; SSE2-NEXT:    movdqa %xmm1, %xmm8
868 ; SSE2-NEXT:    movdqa %xmm0, %xmm10
869 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648,2147483648,2147483648]
870 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
871 ; SSE2-NEXT:    pxor %xmm9, %xmm1
872 ; SSE2-NEXT:    pxor %xmm9, %xmm0
873 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm0
874 ; SSE2-NEXT:    pand %xmm0, %xmm10
875 ; SSE2-NEXT:    pandn %xmm4, %xmm0
876 ; SSE2-NEXT:    por %xmm10, %xmm0
877 ; SSE2-NEXT:    psubd %xmm4, %xmm0
878 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
879 ; SSE2-NEXT:    pxor %xmm9, %xmm4
880 ; SSE2-NEXT:    movdqa %xmm8, %xmm1
881 ; SSE2-NEXT:    pxor %xmm9, %xmm1
882 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm1
883 ; SSE2-NEXT:    pand %xmm1, %xmm8
884 ; SSE2-NEXT:    pandn %xmm5, %xmm1
885 ; SSE2-NEXT:    por %xmm8, %xmm1
886 ; SSE2-NEXT:    psubd %xmm5, %xmm1
887 ; SSE2-NEXT:    movdqa %xmm6, %xmm5
888 ; SSE2-NEXT:    pxor %xmm9, %xmm5
889 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
890 ; SSE2-NEXT:    pxor %xmm9, %xmm4
891 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm4
892 ; SSE2-NEXT:    pand %xmm4, %xmm2
893 ; SSE2-NEXT:    pandn %xmm6, %xmm4
894 ; SSE2-NEXT:    por %xmm2, %xmm4
895 ; SSE2-NEXT:    psubd %xmm6, %xmm4
896 ; SSE2-NEXT:    movdqa %xmm7, %xmm2
897 ; SSE2-NEXT:    pxor %xmm9, %xmm2
898 ; SSE2-NEXT:    pxor %xmm3, %xmm9
899 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm9
900 ; SSE2-NEXT:    pand %xmm9, %xmm3
901 ; SSE2-NEXT:    pandn %xmm7, %xmm9
902 ; SSE2-NEXT:    por %xmm9, %xmm3
903 ; SSE2-NEXT:    psubd %xmm7, %xmm3
904 ; SSE2-NEXT:    movdqa %xmm4, %xmm2
905 ; SSE2-NEXT:    retq
907 ; SSSE3-LABEL: v16i32:
908 ; SSSE3:       # %bb.0:
909 ; SSSE3-NEXT:    movdqa %xmm1, %xmm8
910 ; SSSE3-NEXT:    movdqa %xmm0, %xmm10
911 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648,2147483648,2147483648]
912 ; SSSE3-NEXT:    movdqa %xmm4, %xmm1
913 ; SSSE3-NEXT:    pxor %xmm9, %xmm1
914 ; SSSE3-NEXT:    pxor %xmm9, %xmm0
915 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0
916 ; SSSE3-NEXT:    pand %xmm0, %xmm10
917 ; SSSE3-NEXT:    pandn %xmm4, %xmm0
918 ; SSSE3-NEXT:    por %xmm10, %xmm0
919 ; SSSE3-NEXT:    psubd %xmm4, %xmm0
920 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
921 ; SSSE3-NEXT:    pxor %xmm9, %xmm4
922 ; SSSE3-NEXT:    movdqa %xmm8, %xmm1
923 ; SSSE3-NEXT:    pxor %xmm9, %xmm1
924 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm1
925 ; SSSE3-NEXT:    pand %xmm1, %xmm8
926 ; SSSE3-NEXT:    pandn %xmm5, %xmm1
927 ; SSSE3-NEXT:    por %xmm8, %xmm1
928 ; SSSE3-NEXT:    psubd %xmm5, %xmm1
929 ; SSSE3-NEXT:    movdqa %xmm6, %xmm5
930 ; SSSE3-NEXT:    pxor %xmm9, %xmm5
931 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
932 ; SSSE3-NEXT:    pxor %xmm9, %xmm4
933 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm4
934 ; SSSE3-NEXT:    pand %xmm4, %xmm2
935 ; SSSE3-NEXT:    pandn %xmm6, %xmm4
936 ; SSSE3-NEXT:    por %xmm2, %xmm4
937 ; SSSE3-NEXT:    psubd %xmm6, %xmm4
938 ; SSSE3-NEXT:    movdqa %xmm7, %xmm2
939 ; SSSE3-NEXT:    pxor %xmm9, %xmm2
940 ; SSSE3-NEXT:    pxor %xmm3, %xmm9
941 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm9
942 ; SSSE3-NEXT:    pand %xmm9, %xmm3
943 ; SSSE3-NEXT:    pandn %xmm7, %xmm9
944 ; SSSE3-NEXT:    por %xmm9, %xmm3
945 ; SSSE3-NEXT:    psubd %xmm7, %xmm3
946 ; SSSE3-NEXT:    movdqa %xmm4, %xmm2
947 ; SSSE3-NEXT:    retq
949 ; SSE41-LABEL: v16i32:
950 ; SSE41:       # %bb.0:
951 ; SSE41-NEXT:    pmaxud %xmm4, %xmm0
952 ; SSE41-NEXT:    psubd %xmm4, %xmm0
953 ; SSE41-NEXT:    pmaxud %xmm5, %xmm1
954 ; SSE41-NEXT:    psubd %xmm5, %xmm1
955 ; SSE41-NEXT:    pmaxud %xmm6, %xmm2
956 ; SSE41-NEXT:    psubd %xmm6, %xmm2
957 ; SSE41-NEXT:    pmaxud %xmm7, %xmm3
958 ; SSE41-NEXT:    psubd %xmm7, %xmm3
959 ; SSE41-NEXT:    retq
961 ; AVX1-LABEL: v16i32:
962 ; AVX1:       # %bb.0:
963 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
964 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
965 ; AVX1-NEXT:    vpmaxud %xmm4, %xmm5, %xmm5
966 ; AVX1-NEXT:    vpsubd %xmm4, %xmm5, %xmm4
967 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm0, %xmm0
968 ; AVX1-NEXT:    vpsubd %xmm2, %xmm0, %xmm0
969 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
970 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
971 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
972 ; AVX1-NEXT:    vpmaxud %xmm2, %xmm4, %xmm4
973 ; AVX1-NEXT:    vpsubd %xmm2, %xmm4, %xmm2
974 ; AVX1-NEXT:    vpmaxud %xmm3, %xmm1, %xmm1
975 ; AVX1-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
976 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
977 ; AVX1-NEXT:    retq
979 ; AVX2-LABEL: v16i32:
980 ; AVX2:       # %bb.0:
981 ; AVX2-NEXT:    vpmaxud %ymm2, %ymm0, %ymm0
982 ; AVX2-NEXT:    vpsubd %ymm2, %ymm0, %ymm0
983 ; AVX2-NEXT:    vpmaxud %ymm3, %ymm1, %ymm1
984 ; AVX2-NEXT:    vpsubd %ymm3, %ymm1, %ymm1
985 ; AVX2-NEXT:    retq
987 ; AVX512-LABEL: v16i32:
988 ; AVX512:       # %bb.0:
989 ; AVX512-NEXT:    vpmaxud %zmm1, %zmm0, %zmm0
990 ; AVX512-NEXT:    vpsubd %zmm1, %zmm0, %zmm0
991 ; AVX512-NEXT:    retq
992   %z = call <16 x i32> @llvm.usub.sat.v16i32(<16 x i32> %x, <16 x i32> %y)
993   ret <16 x i32> %z
996 define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {
997 ; SSE2-LABEL: v2i64:
998 ; SSE2:       # %bb.0:
999 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
1000 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
1001 ; SSE2-NEXT:    pxor %xmm2, %xmm3
1002 ; SSE2-NEXT:    pxor %xmm0, %xmm2
1003 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1004 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
1005 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1006 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
1007 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1008 ; SSE2-NEXT:    pand %xmm5, %xmm2
1009 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1010 ; SSE2-NEXT:    por %xmm2, %xmm3
1011 ; SSE2-NEXT:    pand %xmm3, %xmm0
1012 ; SSE2-NEXT:    pandn %xmm1, %xmm3
1013 ; SSE2-NEXT:    por %xmm3, %xmm0
1014 ; SSE2-NEXT:    psubq %xmm1, %xmm0
1015 ; SSE2-NEXT:    retq
1017 ; SSSE3-LABEL: v2i64:
1018 ; SSSE3:       # %bb.0:
1019 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
1020 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
1021 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
1022 ; SSSE3-NEXT:    pxor %xmm0, %xmm2
1023 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
1024 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
1025 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1026 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm2
1027 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1028 ; SSSE3-NEXT:    pand %xmm5, %xmm2
1029 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1030 ; SSSE3-NEXT:    por %xmm2, %xmm3
1031 ; SSSE3-NEXT:    pand %xmm3, %xmm0
1032 ; SSSE3-NEXT:    pandn %xmm1, %xmm3
1033 ; SSSE3-NEXT:    por %xmm3, %xmm0
1034 ; SSSE3-NEXT:    psubq %xmm1, %xmm0
1035 ; SSSE3-NEXT:    retq
1037 ; SSE41-LABEL: v2i64:
1038 ; SSE41:       # %bb.0:
1039 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1040 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
1041 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
1042 ; SSE41-NEXT:    pxor %xmm0, %xmm3
1043 ; SSE41-NEXT:    pxor %xmm2, %xmm0
1044 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
1045 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm4
1046 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1047 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
1048 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1049 ; SSE41-NEXT:    pand %xmm5, %xmm0
1050 ; SSE41-NEXT:    por %xmm4, %xmm0
1051 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
1052 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
1053 ; SSE41-NEXT:    psubq %xmm1, %xmm3
1054 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
1055 ; SSE41-NEXT:    retq
1057 ; AVX1-LABEL: v2i64:
1058 ; AVX1:       # %bb.0:
1059 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1060 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm3
1061 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm2
1062 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
1063 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1064 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
1065 ; AVX1-NEXT:    retq
1067 ; AVX2-LABEL: v2i64:
1068 ; AVX2:       # %bb.0:
1069 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1070 ; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm3
1071 ; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm2
1072 ; AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
1073 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1074 ; AVX2-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
1075 ; AVX2-NEXT:    retq
1077 ; AVX512-LABEL: v2i64:
1078 ; AVX512:       # %bb.0:
1079 ; AVX512-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
1080 ; AVX512-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
1081 ; AVX512-NEXT:    retq
1082   %z = call <2 x i64> @llvm.usub.sat.v2i64(<2 x i64> %x, <2 x i64> %y)
1083   ret <2 x i64> %z
1086 define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
1087 ; SSE2-LABEL: v4i64:
1088 ; SSE2:       # %bb.0:
1089 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
1090 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
1091 ; SSE2-NEXT:    pxor %xmm4, %xmm5
1092 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
1093 ; SSE2-NEXT:    pxor %xmm4, %xmm6
1094 ; SSE2-NEXT:    movdqa %xmm6, %xmm7
1095 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
1096 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
1097 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
1098 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
1099 ; SSE2-NEXT:    pand %xmm8, %xmm5
1100 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
1101 ; SSE2-NEXT:    por %xmm5, %xmm6
1102 ; SSE2-NEXT:    pand %xmm6, %xmm0
1103 ; SSE2-NEXT:    pandn %xmm2, %xmm6
1104 ; SSE2-NEXT:    por %xmm6, %xmm0
1105 ; SSE2-NEXT:    psubq %xmm2, %xmm0
1106 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
1107 ; SSE2-NEXT:    pxor %xmm4, %xmm2
1108 ; SSE2-NEXT:    pxor %xmm1, %xmm4
1109 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
1110 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
1111 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1112 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
1113 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
1114 ; SSE2-NEXT:    pand %xmm6, %xmm2
1115 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1116 ; SSE2-NEXT:    por %xmm2, %xmm4
1117 ; SSE2-NEXT:    pand %xmm4, %xmm1
1118 ; SSE2-NEXT:    pandn %xmm3, %xmm4
1119 ; SSE2-NEXT:    por %xmm4, %xmm1
1120 ; SSE2-NEXT:    psubq %xmm3, %xmm1
1121 ; SSE2-NEXT:    retq
1123 ; SSSE3-LABEL: v4i64:
1124 ; SSSE3:       # %bb.0:
1125 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
1126 ; SSSE3-NEXT:    movdqa %xmm2, %xmm5
1127 ; SSSE3-NEXT:    pxor %xmm4, %xmm5
1128 ; SSSE3-NEXT:    movdqa %xmm0, %xmm6
1129 ; SSSE3-NEXT:    pxor %xmm4, %xmm6
1130 ; SSSE3-NEXT:    movdqa %xmm6, %xmm7
1131 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm7
1132 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
1133 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm6
1134 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
1135 ; SSSE3-NEXT:    pand %xmm8, %xmm5
1136 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
1137 ; SSSE3-NEXT:    por %xmm5, %xmm6
1138 ; SSSE3-NEXT:    pand %xmm6, %xmm0
1139 ; SSSE3-NEXT:    pandn %xmm2, %xmm6
1140 ; SSSE3-NEXT:    por %xmm6, %xmm0
1141 ; SSSE3-NEXT:    psubq %xmm2, %xmm0
1142 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
1143 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
1144 ; SSSE3-NEXT:    pxor %xmm1, %xmm4
1145 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
1146 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm5
1147 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1148 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm4
1149 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
1150 ; SSSE3-NEXT:    pand %xmm6, %xmm2
1151 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1152 ; SSSE3-NEXT:    por %xmm2, %xmm4
1153 ; SSSE3-NEXT:    pand %xmm4, %xmm1
1154 ; SSSE3-NEXT:    pandn %xmm3, %xmm4
1155 ; SSSE3-NEXT:    por %xmm4, %xmm1
1156 ; SSSE3-NEXT:    psubq %xmm3, %xmm1
1157 ; SSSE3-NEXT:    retq
1159 ; SSE41-LABEL: v4i64:
1160 ; SSE41:       # %bb.0:
1161 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
1162 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
1163 ; SSE41-NEXT:    movdqa %xmm2, %xmm5
1164 ; SSE41-NEXT:    pxor %xmm6, %xmm5
1165 ; SSE41-NEXT:    movdqa %xmm0, %xmm7
1166 ; SSE41-NEXT:    pxor %xmm6, %xmm7
1167 ; SSE41-NEXT:    movdqa %xmm7, %xmm0
1168 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm0
1169 ; SSE41-NEXT:    pshufd {{.*#+}} xmm8 = xmm0[0,0,2,2]
1170 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm7
1171 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1172 ; SSE41-NEXT:    pand %xmm8, %xmm5
1173 ; SSE41-NEXT:    por %xmm5, %xmm0
1174 ; SSE41-NEXT:    movdqa %xmm2, %xmm5
1175 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm5
1176 ; SSE41-NEXT:    psubq %xmm2, %xmm5
1177 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
1178 ; SSE41-NEXT:    pxor %xmm6, %xmm0
1179 ; SSE41-NEXT:    pxor %xmm1, %xmm6
1180 ; SSE41-NEXT:    movdqa %xmm6, %xmm2
1181 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
1182 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1183 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
1184 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
1185 ; SSE41-NEXT:    pand %xmm4, %xmm0
1186 ; SSE41-NEXT:    por %xmm2, %xmm0
1187 ; SSE41-NEXT:    movdqa %xmm3, %xmm2
1188 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
1189 ; SSE41-NEXT:    psubq %xmm3, %xmm2
1190 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
1191 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
1192 ; SSE41-NEXT:    retq
1194 ; AVX1-LABEL: v4i64:
1195 ; AVX1:       # %bb.0:
1196 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1197 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1198 ; AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm4
1199 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1200 ; AVX1-NEXT:    vpxor %xmm3, %xmm5, %xmm5
1201 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
1202 ; AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm5
1203 ; AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm3
1204 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm3, %xmm3
1205 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm3
1206 ; AVX1-NEXT:    vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
1207 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1208 ; AVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm2
1209 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
1210 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1211 ; AVX1-NEXT:    retq
1213 ; AVX2-LABEL: v4i64:
1214 ; AVX2:       # %bb.0:
1215 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1216 ; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm3
1217 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm2
1218 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm2, %ymm2
1219 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1220 ; AVX2-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
1221 ; AVX2-NEXT:    retq
1223 ; AVX512-LABEL: v4i64:
1224 ; AVX512:       # %bb.0:
1225 ; AVX512-NEXT:    vpmaxuq %ymm1, %ymm0, %ymm0
1226 ; AVX512-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
1227 ; AVX512-NEXT:    retq
1228   %z = call <4 x i64> @llvm.usub.sat.v4i64(<4 x i64> %x, <4 x i64> %y)
1229   ret <4 x i64> %z
1232 define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind {
1233 ; SSE2-LABEL: v8i64:
1234 ; SSE2:       # %bb.0:
1235 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
1236 ; SSE2-NEXT:    movdqa %xmm4, %xmm9
1237 ; SSE2-NEXT:    pxor %xmm8, %xmm9
1238 ; SSE2-NEXT:    movdqa %xmm0, %xmm10
1239 ; SSE2-NEXT:    pxor %xmm8, %xmm10
1240 ; SSE2-NEXT:    movdqa %xmm10, %xmm11
1241 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm11
1242 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1243 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm10
1244 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm10[1,1,3,3]
1245 ; SSE2-NEXT:    pand %xmm12, %xmm9
1246 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm11[1,1,3,3]
1247 ; SSE2-NEXT:    por %xmm9, %xmm10
1248 ; SSE2-NEXT:    pand %xmm10, %xmm0
1249 ; SSE2-NEXT:    pandn %xmm4, %xmm10
1250 ; SSE2-NEXT:    por %xmm10, %xmm0
1251 ; SSE2-NEXT:    psubq %xmm4, %xmm0
1252 ; SSE2-NEXT:    movdqa %xmm5, %xmm9
1253 ; SSE2-NEXT:    pxor %xmm8, %xmm9
1254 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1255 ; SSE2-NEXT:    pxor %xmm8, %xmm4
1256 ; SSE2-NEXT:    movdqa %xmm4, %xmm10
1257 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm10
1258 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
1259 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm4
1260 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm4[1,1,3,3]
1261 ; SSE2-NEXT:    pand %xmm11, %xmm9
1262 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm10[1,1,3,3]
1263 ; SSE2-NEXT:    por %xmm9, %xmm4
1264 ; SSE2-NEXT:    pand %xmm4, %xmm1
1265 ; SSE2-NEXT:    pandn %xmm5, %xmm4
1266 ; SSE2-NEXT:    por %xmm4, %xmm1
1267 ; SSE2-NEXT:    psubq %xmm5, %xmm1
1268 ; SSE2-NEXT:    movdqa %xmm6, %xmm4
1269 ; SSE2-NEXT:    pxor %xmm8, %xmm4
1270 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
1271 ; SSE2-NEXT:    pxor %xmm8, %xmm5
1272 ; SSE2-NEXT:    movdqa %xmm5, %xmm9
1273 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm9
1274 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
1275 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm5
1276 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1277 ; SSE2-NEXT:    pand %xmm10, %xmm4
1278 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm9[1,1,3,3]
1279 ; SSE2-NEXT:    por %xmm4, %xmm5
1280 ; SSE2-NEXT:    pand %xmm5, %xmm2
1281 ; SSE2-NEXT:    pandn %xmm6, %xmm5
1282 ; SSE2-NEXT:    por %xmm5, %xmm2
1283 ; SSE2-NEXT:    psubq %xmm6, %xmm2
1284 ; SSE2-NEXT:    movdqa %xmm7, %xmm4
1285 ; SSE2-NEXT:    pxor %xmm8, %xmm4
1286 ; SSE2-NEXT:    pxor %xmm3, %xmm8
1287 ; SSE2-NEXT:    movdqa %xmm8, %xmm5
1288 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm5
1289 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1290 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm8
1291 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm8[1,1,3,3]
1292 ; SSE2-NEXT:    pand %xmm6, %xmm4
1293 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1294 ; SSE2-NEXT:    por %xmm4, %xmm5
1295 ; SSE2-NEXT:    pand %xmm5, %xmm3
1296 ; SSE2-NEXT:    pandn %xmm7, %xmm5
1297 ; SSE2-NEXT:    por %xmm5, %xmm3
1298 ; SSE2-NEXT:    psubq %xmm7, %xmm3
1299 ; SSE2-NEXT:    retq
1301 ; SSSE3-LABEL: v8i64:
1302 ; SSSE3:       # %bb.0:
1303 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
1304 ; SSSE3-NEXT:    movdqa %xmm4, %xmm9
1305 ; SSSE3-NEXT:    pxor %xmm8, %xmm9
1306 ; SSSE3-NEXT:    movdqa %xmm0, %xmm10
1307 ; SSSE3-NEXT:    pxor %xmm8, %xmm10
1308 ; SSSE3-NEXT:    movdqa %xmm10, %xmm11
1309 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm11
1310 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1311 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm10
1312 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm10[1,1,3,3]
1313 ; SSSE3-NEXT:    pand %xmm12, %xmm9
1314 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm11[1,1,3,3]
1315 ; SSSE3-NEXT:    por %xmm9, %xmm10
1316 ; SSSE3-NEXT:    pand %xmm10, %xmm0
1317 ; SSSE3-NEXT:    pandn %xmm4, %xmm10
1318 ; SSSE3-NEXT:    por %xmm10, %xmm0
1319 ; SSSE3-NEXT:    psubq %xmm4, %xmm0
1320 ; SSSE3-NEXT:    movdqa %xmm5, %xmm9
1321 ; SSSE3-NEXT:    pxor %xmm8, %xmm9
1322 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
1323 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
1324 ; SSSE3-NEXT:    movdqa %xmm4, %xmm10
1325 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm10
1326 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
1327 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm4
1328 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm4[1,1,3,3]
1329 ; SSSE3-NEXT:    pand %xmm11, %xmm9
1330 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm10[1,1,3,3]
1331 ; SSSE3-NEXT:    por %xmm9, %xmm4
1332 ; SSSE3-NEXT:    pand %xmm4, %xmm1
1333 ; SSSE3-NEXT:    pandn %xmm5, %xmm4
1334 ; SSSE3-NEXT:    por %xmm4, %xmm1
1335 ; SSSE3-NEXT:    psubq %xmm5, %xmm1
1336 ; SSSE3-NEXT:    movdqa %xmm6, %xmm4
1337 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
1338 ; SSSE3-NEXT:    movdqa %xmm2, %xmm5
1339 ; SSSE3-NEXT:    pxor %xmm8, %xmm5
1340 ; SSSE3-NEXT:    movdqa %xmm5, %xmm9
1341 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm9
1342 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
1343 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm5
1344 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1345 ; SSSE3-NEXT:    pand %xmm10, %xmm4
1346 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm9[1,1,3,3]
1347 ; SSSE3-NEXT:    por %xmm4, %xmm5
1348 ; SSSE3-NEXT:    pand %xmm5, %xmm2
1349 ; SSSE3-NEXT:    pandn %xmm6, %xmm5
1350 ; SSSE3-NEXT:    por %xmm5, %xmm2
1351 ; SSSE3-NEXT:    psubq %xmm6, %xmm2
1352 ; SSSE3-NEXT:    movdqa %xmm7, %xmm4
1353 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
1354 ; SSSE3-NEXT:    pxor %xmm3, %xmm8
1355 ; SSSE3-NEXT:    movdqa %xmm8, %xmm5
1356 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm5
1357 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1358 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm8
1359 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm8[1,1,3,3]
1360 ; SSSE3-NEXT:    pand %xmm6, %xmm4
1361 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1362 ; SSSE3-NEXT:    por %xmm4, %xmm5
1363 ; SSSE3-NEXT:    pand %xmm5, %xmm3
1364 ; SSSE3-NEXT:    pandn %xmm7, %xmm5
1365 ; SSSE3-NEXT:    por %xmm5, %xmm3
1366 ; SSSE3-NEXT:    psubq %xmm7, %xmm3
1367 ; SSSE3-NEXT:    retq
1369 ; SSE41-LABEL: v8i64:
1370 ; SSE41:       # %bb.0:
1371 ; SSE41-NEXT:    movdqa %xmm1, %xmm8
1372 ; SSE41-NEXT:    movdqa %xmm0, %xmm11
1373 ; SSE41-NEXT:    movdqa {{.*#+}} xmm10 = [9223372039002259456,9223372039002259456]
1374 ; SSE41-NEXT:    movdqa %xmm4, %xmm9
1375 ; SSE41-NEXT:    pxor %xmm10, %xmm9
1376 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
1377 ; SSE41-NEXT:    pxor %xmm10, %xmm1
1378 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1379 ; SSE41-NEXT:    pcmpgtd %xmm9, %xmm0
1380 ; SSE41-NEXT:    pshufd {{.*#+}} xmm12 = xmm0[0,0,2,2]
1381 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm1
1382 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1383 ; SSE41-NEXT:    pand %xmm12, %xmm1
1384 ; SSE41-NEXT:    por %xmm1, %xmm0
1385 ; SSE41-NEXT:    movdqa %xmm4, %xmm9
1386 ; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm9
1387 ; SSE41-NEXT:    psubq %xmm4, %xmm9
1388 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
1389 ; SSE41-NEXT:    pxor %xmm10, %xmm0
1390 ; SSE41-NEXT:    movdqa %xmm8, %xmm1
1391 ; SSE41-NEXT:    pxor %xmm10, %xmm1
1392 ; SSE41-NEXT:    movdqa %xmm1, %xmm4
1393 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
1394 ; SSE41-NEXT:    pshufd {{.*#+}} xmm11 = xmm4[0,0,2,2]
1395 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
1396 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1397 ; SSE41-NEXT:    pand %xmm11, %xmm0
1398 ; SSE41-NEXT:    por %xmm4, %xmm0
1399 ; SSE41-NEXT:    movdqa %xmm5, %xmm1
1400 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm1
1401 ; SSE41-NEXT:    psubq %xmm5, %xmm1
1402 ; SSE41-NEXT:    movdqa %xmm6, %xmm0
1403 ; SSE41-NEXT:    pxor %xmm10, %xmm0
1404 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
1405 ; SSE41-NEXT:    pxor %xmm10, %xmm4
1406 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
1407 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
1408 ; SSE41-NEXT:    pshufd {{.*#+}} xmm8 = xmm5[0,0,2,2]
1409 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
1410 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1411 ; SSE41-NEXT:    pand %xmm8, %xmm0
1412 ; SSE41-NEXT:    por %xmm5, %xmm0
1413 ; SSE41-NEXT:    movdqa %xmm6, %xmm4
1414 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
1415 ; SSE41-NEXT:    psubq %xmm6, %xmm4
1416 ; SSE41-NEXT:    movdqa %xmm7, %xmm0
1417 ; SSE41-NEXT:    pxor %xmm10, %xmm0
1418 ; SSE41-NEXT:    pxor %xmm3, %xmm10
1419 ; SSE41-NEXT:    movdqa %xmm10, %xmm2
1420 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
1421 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
1422 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm10
1423 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]
1424 ; SSE41-NEXT:    pand %xmm5, %xmm0
1425 ; SSE41-NEXT:    por %xmm2, %xmm0
1426 ; SSE41-NEXT:    movdqa %xmm7, %xmm5
1427 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm5
1428 ; SSE41-NEXT:    psubq %xmm7, %xmm5
1429 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
1430 ; SSE41-NEXT:    movdqa %xmm4, %xmm2
1431 ; SSE41-NEXT:    movdqa %xmm5, %xmm3
1432 ; SSE41-NEXT:    retq
1434 ; AVX1-LABEL: v8i64:
1435 ; AVX1:       # %bb.0:
1436 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1437 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]
1438 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm6
1439 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
1440 ; AVX1-NEXT:    vpxor %xmm5, %xmm7, %xmm7
1441 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm8
1442 ; AVX1-NEXT:    vpxor %xmm5, %xmm2, %xmm7
1443 ; AVX1-NEXT:    vpxor %xmm5, %xmm0, %xmm6
1444 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm6
1445 ; AVX1-NEXT:    vinsertf128 $1, %xmm8, %ymm6, %ymm6
1446 ; AVX1-NEXT:    vblendvpd %ymm6, %ymm0, %ymm2, %ymm0
1447 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
1448 ; AVX1-NEXT:    vpsubq %xmm4, %xmm6, %xmm4
1449 ; AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
1450 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
1451 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
1452 ; AVX1-NEXT:    vpxor %xmm5, %xmm2, %xmm4
1453 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm6
1454 ; AVX1-NEXT:    vpxor %xmm5, %xmm6, %xmm6
1455 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
1456 ; AVX1-NEXT:    vpxor %xmm5, %xmm3, %xmm6
1457 ; AVX1-NEXT:    vpxor %xmm5, %xmm1, %xmm5
1458 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm5, %xmm5
1459 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm5, %ymm4
1460 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
1461 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
1462 ; AVX1-NEXT:    vpsubq %xmm2, %xmm4, %xmm2
1463 ; AVX1-NEXT:    vpsubq %xmm3, %xmm1, %xmm1
1464 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1465 ; AVX1-NEXT:    retq
1467 ; AVX2-LABEL: v8i64:
1468 ; AVX2:       # %bb.0:
1469 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1470 ; AVX2-NEXT:    vpxor %ymm4, %ymm2, %ymm5
1471 ; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm6
1472 ; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm6, %ymm5
1473 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm0, %ymm2, %ymm0
1474 ; AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
1475 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm2
1476 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm4
1477 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm4, %ymm2
1478 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm1, %ymm3, %ymm1
1479 ; AVX2-NEXT:    vpsubq %ymm3, %ymm1, %ymm1
1480 ; AVX2-NEXT:    retq
1482 ; AVX512-LABEL: v8i64:
1483 ; AVX512:       # %bb.0:
1484 ; AVX512-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
1485 ; AVX512-NEXT:    vpsubq %zmm1, %zmm0, %zmm0
1486 ; AVX512-NEXT:    retq
1487   %z = call <8 x i64> @llvm.usub.sat.v8i64(<8 x i64> %x, <8 x i64> %y)
1488   ret <8 x i64> %z
1491 define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind {
1492 ; SSE-LABEL: v2i128:
1493 ; SSE:       # %bb.0:
1494 ; SSE-NEXT:    movq %rdi, %rax
1495 ; SSE-NEXT:    xorl %edi, %edi
1496 ; SSE-NEXT:    subq %r9, %rsi
1497 ; SSE-NEXT:    sbbq {{[0-9]+}}(%rsp), %rdx
1498 ; SSE-NEXT:    cmovbq %rdi, %rsi
1499 ; SSE-NEXT:    cmovbq %rdi, %rdx
1500 ; SSE-NEXT:    subq {{[0-9]+}}(%rsp), %rcx
1501 ; SSE-NEXT:    sbbq {{[0-9]+}}(%rsp), %r8
1502 ; SSE-NEXT:    cmovbq %rdi, %r8
1503 ; SSE-NEXT:    cmovbq %rdi, %rcx
1504 ; SSE-NEXT:    movq %r8, 24(%rax)
1505 ; SSE-NEXT:    movq %rcx, 16(%rax)
1506 ; SSE-NEXT:    movq %rdx, 8(%rax)
1507 ; SSE-NEXT:    movq %rsi, (%rax)
1508 ; SSE-NEXT:    retq
1510 ; AVX-LABEL: v2i128:
1511 ; AVX:       # %bb.0:
1512 ; AVX-NEXT:    movq %rdi, %rax
1513 ; AVX-NEXT:    xorl %edi, %edi
1514 ; AVX-NEXT:    subq %r9, %rsi
1515 ; AVX-NEXT:    sbbq {{[0-9]+}}(%rsp), %rdx
1516 ; AVX-NEXT:    cmovbq %rdi, %rsi
1517 ; AVX-NEXT:    cmovbq %rdi, %rdx
1518 ; AVX-NEXT:    subq {{[0-9]+}}(%rsp), %rcx
1519 ; AVX-NEXT:    sbbq {{[0-9]+}}(%rsp), %r8
1520 ; AVX-NEXT:    cmovbq %rdi, %r8
1521 ; AVX-NEXT:    cmovbq %rdi, %rcx
1522 ; AVX-NEXT:    movq %r8, 24(%rax)
1523 ; AVX-NEXT:    movq %rcx, 16(%rax)
1524 ; AVX-NEXT:    movq %rdx, 8(%rax)
1525 ; AVX-NEXT:    movq %rsi, (%rax)
1526 ; AVX-NEXT:    retq
1527   %z = call <2 x i128> @llvm.usub.sat.v2i128(<2 x i128> %x, <2 x i128> %y)
1528   ret <2 x i128> %z