[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / X86 / ssub_sat_vec.ll
blob64aead704157593fdeff70b538f7843d3c8cbf72
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE,SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
12 declare <1 x i8> @llvm.ssub.sat.v1i8(<1 x i8>, <1 x i8>)
13 declare <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8>, <2 x i8>)
14 declare <4 x i8> @llvm.ssub.sat.v4i8(<4 x i8>, <4 x i8>)
15 declare <8 x i8> @llvm.ssub.sat.v8i8(<8 x i8>, <8 x i8>)
16 declare <12 x i8> @llvm.ssub.sat.v12i8(<12 x i8>, <12 x i8>)
17 declare <16 x i8> @llvm.ssub.sat.v16i8(<16 x i8>, <16 x i8>)
18 declare <32 x i8> @llvm.ssub.sat.v32i8(<32 x i8>, <32 x i8>)
19 declare <64 x i8> @llvm.ssub.sat.v64i8(<64 x i8>, <64 x i8>)
21 declare <1 x i16> @llvm.ssub.sat.v1i16(<1 x i16>, <1 x i16>)
22 declare <2 x i16> @llvm.ssub.sat.v2i16(<2 x i16>, <2 x i16>)
23 declare <4 x i16> @llvm.ssub.sat.v4i16(<4 x i16>, <4 x i16>)
24 declare <8 x i16> @llvm.ssub.sat.v8i16(<8 x i16>, <8 x i16>)
25 declare <12 x i16> @llvm.ssub.sat.v12i16(<12 x i16>, <12 x i16>)
26 declare <16 x i16> @llvm.ssub.sat.v16i16(<16 x i16>, <16 x i16>)
27 declare <32 x i16> @llvm.ssub.sat.v32i16(<32 x i16>, <32 x i16>)
29 declare <16 x i1> @llvm.ssub.sat.v16i1(<16 x i1>, <16 x i1>)
30 declare <16 x i4> @llvm.ssub.sat.v16i4(<16 x i4>, <16 x i4>)
32 declare <2 x i32> @llvm.ssub.sat.v2i32(<2 x i32>, <2 x i32>)
33 declare <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32>, <4 x i32>)
34 declare <8 x i32> @llvm.ssub.sat.v8i32(<8 x i32>, <8 x i32>)
35 declare <16 x i32> @llvm.ssub.sat.v16i32(<16 x i32>, <16 x i32>)
36 declare <2 x i64> @llvm.ssub.sat.v2i64(<2 x i64>, <2 x i64>)
37 declare <4 x i64> @llvm.ssub.sat.v4i64(<4 x i64>, <4 x i64>)
38 declare <8 x i64> @llvm.ssub.sat.v8i64(<8 x i64>, <8 x i64>)
40 declare <4 x i24> @llvm.ssub.sat.v4i24(<4 x i24>, <4 x i24>)
41 declare <2 x i128> @llvm.ssub.sat.v2i128(<2 x i128>, <2 x i128>)
43 ; Legal types, depending on architecture.
45 define <16 x i8> @v16i8(<16 x i8> %x, <16 x i8> %y) nounwind {
46 ; SSE-LABEL: v16i8:
47 ; SSE:       # %bb.0:
48 ; SSE-NEXT:    psubsb %xmm1, %xmm0
49 ; SSE-NEXT:    retq
51 ; AVX-LABEL: v16i8:
52 ; AVX:       # %bb.0:
53 ; AVX-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
54 ; AVX-NEXT:    retq
55   %z = call <16 x i8> @llvm.ssub.sat.v16i8(<16 x i8> %x, <16 x i8> %y)
56   ret <16 x i8> %z
59 define <32 x i8> @v32i8(<32 x i8> %x, <32 x i8> %y) nounwind {
60 ; SSE-LABEL: v32i8:
61 ; SSE:       # %bb.0:
62 ; SSE-NEXT:    psubsb %xmm2, %xmm0
63 ; SSE-NEXT:    psubsb %xmm3, %xmm1
64 ; SSE-NEXT:    retq
66 ; AVX1-LABEL: v32i8:
67 ; AVX1:       # %bb.0:
68 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
69 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
70 ; AVX1-NEXT:    vpsubsb %xmm2, %xmm3, %xmm2
71 ; AVX1-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
72 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
73 ; AVX1-NEXT:    retq
75 ; AVX2-LABEL: v32i8:
76 ; AVX2:       # %bb.0:
77 ; AVX2-NEXT:    vpsubsb %ymm1, %ymm0, %ymm0
78 ; AVX2-NEXT:    retq
80 ; AVX512-LABEL: v32i8:
81 ; AVX512:       # %bb.0:
82 ; AVX512-NEXT:    vpsubsb %ymm1, %ymm0, %ymm0
83 ; AVX512-NEXT:    retq
84   %z = call <32 x i8> @llvm.ssub.sat.v32i8(<32 x i8> %x, <32 x i8> %y)
85   ret <32 x i8> %z
88 define <64 x i8> @v64i8(<64 x i8> %x, <64 x i8> %y) nounwind {
89 ; SSE-LABEL: v64i8:
90 ; SSE:       # %bb.0:
91 ; SSE-NEXT:    psubsb %xmm4, %xmm0
92 ; SSE-NEXT:    psubsb %xmm5, %xmm1
93 ; SSE-NEXT:    psubsb %xmm6, %xmm2
94 ; SSE-NEXT:    psubsb %xmm7, %xmm3
95 ; SSE-NEXT:    retq
97 ; AVX1-LABEL: v64i8:
98 ; AVX1:       # %bb.0:
99 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
100 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
101 ; AVX1-NEXT:    vpsubsb %xmm4, %xmm5, %xmm4
102 ; AVX1-NEXT:    vpsubsb %xmm2, %xmm0, %xmm0
103 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
104 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
105 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
106 ; AVX1-NEXT:    vpsubsb %xmm2, %xmm4, %xmm2
107 ; AVX1-NEXT:    vpsubsb %xmm3, %xmm1, %xmm1
108 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
109 ; AVX1-NEXT:    retq
111 ; AVX2-LABEL: v64i8:
112 ; AVX2:       # %bb.0:
113 ; AVX2-NEXT:    vpsubsb %ymm2, %ymm0, %ymm0
114 ; AVX2-NEXT:    vpsubsb %ymm3, %ymm1, %ymm1
115 ; AVX2-NEXT:    retq
117 ; AVX512F-LABEL: v64i8:
118 ; AVX512F:       # %bb.0:
119 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm2
120 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm3
121 ; AVX512F-NEXT:    vpsubsb %ymm2, %ymm3, %ymm2
122 ; AVX512F-NEXT:    vpsubsb %ymm1, %ymm0, %ymm0
123 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
124 ; AVX512F-NEXT:    retq
126 ; AVX512BW-LABEL: v64i8:
127 ; AVX512BW:       # %bb.0:
128 ; AVX512BW-NEXT:    vpsubsb %zmm1, %zmm0, %zmm0
129 ; AVX512BW-NEXT:    retq
130   %z = call <64 x i8> @llvm.ssub.sat.v64i8(<64 x i8> %x, <64 x i8> %y)
131   ret <64 x i8> %z
134 define <8 x i16> @v8i16(<8 x i16> %x, <8 x i16> %y) nounwind {
135 ; SSE-LABEL: v8i16:
136 ; SSE:       # %bb.0:
137 ; SSE-NEXT:    psubsw %xmm1, %xmm0
138 ; SSE-NEXT:    retq
140 ; AVX-LABEL: v8i16:
141 ; AVX:       # %bb.0:
142 ; AVX-NEXT:    vpsubsw %xmm1, %xmm0, %xmm0
143 ; AVX-NEXT:    retq
144   %z = call <8 x i16> @llvm.ssub.sat.v8i16(<8 x i16> %x, <8 x i16> %y)
145   ret <8 x i16> %z
148 define <16 x i16> @v16i16(<16 x i16> %x, <16 x i16> %y) nounwind {
149 ; SSE-LABEL: v16i16:
150 ; SSE:       # %bb.0:
151 ; SSE-NEXT:    psubsw %xmm2, %xmm0
152 ; SSE-NEXT:    psubsw %xmm3, %xmm1
153 ; SSE-NEXT:    retq
155 ; AVX1-LABEL: v16i16:
156 ; AVX1:       # %bb.0:
157 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
158 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
159 ; AVX1-NEXT:    vpsubsw %xmm2, %xmm3, %xmm2
160 ; AVX1-NEXT:    vpsubsw %xmm1, %xmm0, %xmm0
161 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
162 ; AVX1-NEXT:    retq
164 ; AVX2-LABEL: v16i16:
165 ; AVX2:       # %bb.0:
166 ; AVX2-NEXT:    vpsubsw %ymm1, %ymm0, %ymm0
167 ; AVX2-NEXT:    retq
169 ; AVX512-LABEL: v16i16:
170 ; AVX512:       # %bb.0:
171 ; AVX512-NEXT:    vpsubsw %ymm1, %ymm0, %ymm0
172 ; AVX512-NEXT:    retq
173   %z = call <16 x i16> @llvm.ssub.sat.v16i16(<16 x i16> %x, <16 x i16> %y)
174   ret <16 x i16> %z
177 define <32 x i16> @v32i16(<32 x i16> %x, <32 x i16> %y) nounwind {
178 ; SSE-LABEL: v32i16:
179 ; SSE:       # %bb.0:
180 ; SSE-NEXT:    psubsw %xmm4, %xmm0
181 ; SSE-NEXT:    psubsw %xmm5, %xmm1
182 ; SSE-NEXT:    psubsw %xmm6, %xmm2
183 ; SSE-NEXT:    psubsw %xmm7, %xmm3
184 ; SSE-NEXT:    retq
186 ; AVX1-LABEL: v32i16:
187 ; AVX1:       # %bb.0:
188 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
189 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
190 ; AVX1-NEXT:    vpsubsw %xmm4, %xmm5, %xmm4
191 ; AVX1-NEXT:    vpsubsw %xmm2, %xmm0, %xmm0
192 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
193 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
194 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
195 ; AVX1-NEXT:    vpsubsw %xmm2, %xmm4, %xmm2
196 ; AVX1-NEXT:    vpsubsw %xmm3, %xmm1, %xmm1
197 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
198 ; AVX1-NEXT:    retq
200 ; AVX2-LABEL: v32i16:
201 ; AVX2:       # %bb.0:
202 ; AVX2-NEXT:    vpsubsw %ymm2, %ymm0, %ymm0
203 ; AVX2-NEXT:    vpsubsw %ymm3, %ymm1, %ymm1
204 ; AVX2-NEXT:    retq
206 ; AVX512F-LABEL: v32i16:
207 ; AVX512F:       # %bb.0:
208 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm2
209 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm3
210 ; AVX512F-NEXT:    vpsubsw %ymm2, %ymm3, %ymm2
211 ; AVX512F-NEXT:    vpsubsw %ymm1, %ymm0, %ymm0
212 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
213 ; AVX512F-NEXT:    retq
215 ; AVX512BW-LABEL: v32i16:
216 ; AVX512BW:       # %bb.0:
217 ; AVX512BW-NEXT:    vpsubsw %zmm1, %zmm0, %zmm0
218 ; AVX512BW-NEXT:    retq
219   %z = call <32 x i16> @llvm.ssub.sat.v32i16(<32 x i16> %x, <32 x i16> %y)
220   ret <32 x i16> %z
223 ; Too narrow vectors, legalized by widening.
225 define void @v8i8(ptr %px, ptr %py, ptr %pz) nounwind {
226 ; SSE-LABEL: v8i8:
227 ; SSE:       # %bb.0:
228 ; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
229 ; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
230 ; SSE-NEXT:    psubsb %xmm1, %xmm0
231 ; SSE-NEXT:    movq %xmm0, (%rdx)
232 ; SSE-NEXT:    retq
234 ; AVX-LABEL: v8i8:
235 ; AVX:       # %bb.0:
236 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
237 ; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
238 ; AVX-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
239 ; AVX-NEXT:    vmovq %xmm0, (%rdx)
240 ; AVX-NEXT:    retq
241   %x = load <8 x i8>, ptr %px
242   %y = load <8 x i8>, ptr %py
243   %z = call <8 x i8> @llvm.ssub.sat.v8i8(<8 x i8> %x, <8 x i8> %y)
244   store <8 x i8> %z, ptr %pz
245   ret void
248 define void @v4i8(ptr %px, ptr %py, ptr %pz) nounwind {
249 ; SSE-LABEL: v4i8:
250 ; SSE:       # %bb.0:
251 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
252 ; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
253 ; SSE-NEXT:    psubsb %xmm1, %xmm0
254 ; SSE-NEXT:    movd %xmm0, (%rdx)
255 ; SSE-NEXT:    retq
257 ; AVX-LABEL: v4i8:
258 ; AVX:       # %bb.0:
259 ; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
260 ; AVX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
261 ; AVX-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
262 ; AVX-NEXT:    vmovd %xmm0, (%rdx)
263 ; AVX-NEXT:    retq
264   %x = load <4 x i8>, ptr %px
265   %y = load <4 x i8>, ptr %py
266   %z = call <4 x i8> @llvm.ssub.sat.v4i8(<4 x i8> %x, <4 x i8> %y)
267   store <4 x i8> %z, ptr %pz
268   ret void
271 define void @v2i8(ptr %px, ptr %py, ptr %pz) nounwind {
272 ; SSE2-LABEL: v2i8:
273 ; SSE2:       # %bb.0:
274 ; SSE2-NEXT:    movzwl (%rdi), %eax
275 ; SSE2-NEXT:    movd %eax, %xmm0
276 ; SSE2-NEXT:    movzwl (%rsi), %eax
277 ; SSE2-NEXT:    movd %eax, %xmm1
278 ; SSE2-NEXT:    psubsb %xmm1, %xmm0
279 ; SSE2-NEXT:    movd %xmm0, %eax
280 ; SSE2-NEXT:    movw %ax, (%rdx)
281 ; SSE2-NEXT:    retq
283 ; SSSE3-LABEL: v2i8:
284 ; SSSE3:       # %bb.0:
285 ; SSSE3-NEXT:    movzwl (%rdi), %eax
286 ; SSSE3-NEXT:    movd %eax, %xmm0
287 ; SSSE3-NEXT:    movzwl (%rsi), %eax
288 ; SSSE3-NEXT:    movd %eax, %xmm1
289 ; SSSE3-NEXT:    psubsb %xmm1, %xmm0
290 ; SSSE3-NEXT:    movd %xmm0, %eax
291 ; SSSE3-NEXT:    movw %ax, (%rdx)
292 ; SSSE3-NEXT:    retq
294 ; SSE41-LABEL: v2i8:
295 ; SSE41:       # %bb.0:
296 ; SSE41-NEXT:    movzwl (%rdi), %eax
297 ; SSE41-NEXT:    movd %eax, %xmm0
298 ; SSE41-NEXT:    movzwl (%rsi), %eax
299 ; SSE41-NEXT:    movd %eax, %xmm1
300 ; SSE41-NEXT:    psubsb %xmm1, %xmm0
301 ; SSE41-NEXT:    pextrw $0, %xmm0, (%rdx)
302 ; SSE41-NEXT:    retq
304 ; AVX-LABEL: v2i8:
305 ; AVX:       # %bb.0:
306 ; AVX-NEXT:    movzwl (%rdi), %eax
307 ; AVX-NEXT:    vmovd %eax, %xmm0
308 ; AVX-NEXT:    movzwl (%rsi), %eax
309 ; AVX-NEXT:    vmovd %eax, %xmm1
310 ; AVX-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
311 ; AVX-NEXT:    vpextrw $0, %xmm0, (%rdx)
312 ; AVX-NEXT:    retq
313   %x = load <2 x i8>, ptr %px
314   %y = load <2 x i8>, ptr %py
315   %z = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %x, <2 x i8> %y)
316   store <2 x i8> %z, ptr %pz
317   ret void
320 define void @v4i16(ptr %px, ptr %py, ptr %pz) nounwind {
321 ; SSE-LABEL: v4i16:
322 ; SSE:       # %bb.0:
323 ; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
324 ; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
325 ; SSE-NEXT:    psubsw %xmm1, %xmm0
326 ; SSE-NEXT:    movq %xmm0, (%rdx)
327 ; SSE-NEXT:    retq
329 ; AVX-LABEL: v4i16:
330 ; AVX:       # %bb.0:
331 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
332 ; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
333 ; AVX-NEXT:    vpsubsw %xmm1, %xmm0, %xmm0
334 ; AVX-NEXT:    vmovq %xmm0, (%rdx)
335 ; AVX-NEXT:    retq
336   %x = load <4 x i16>, ptr %px
337   %y = load <4 x i16>, ptr %py
338   %z = call <4 x i16> @llvm.ssub.sat.v4i16(<4 x i16> %x, <4 x i16> %y)
339   store <4 x i16> %z, ptr %pz
340   ret void
343 define void @v2i16(ptr %px, ptr %py, ptr %pz) nounwind {
344 ; SSE-LABEL: v2i16:
345 ; SSE:       # %bb.0:
346 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
347 ; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
348 ; SSE-NEXT:    psubsw %xmm1, %xmm0
349 ; SSE-NEXT:    movd %xmm0, (%rdx)
350 ; SSE-NEXT:    retq
352 ; AVX-LABEL: v2i16:
353 ; AVX:       # %bb.0:
354 ; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
355 ; AVX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
356 ; AVX-NEXT:    vpsubsw %xmm1, %xmm0, %xmm0
357 ; AVX-NEXT:    vmovd %xmm0, (%rdx)
358 ; AVX-NEXT:    retq
359   %x = load <2 x i16>, ptr %px
360   %y = load <2 x i16>, ptr %py
361   %z = call <2 x i16> @llvm.ssub.sat.v2i16(<2 x i16> %x, <2 x i16> %y)
362   store <2 x i16> %z, ptr %pz
363   ret void
366 define <12 x i8> @v12i8(<12 x i8> %x, <12 x i8> %y) nounwind {
367 ; SSE-LABEL: v12i8:
368 ; SSE:       # %bb.0:
369 ; SSE-NEXT:    psubsb %xmm1, %xmm0
370 ; SSE-NEXT:    retq
372 ; AVX-LABEL: v12i8:
373 ; AVX:       # %bb.0:
374 ; AVX-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
375 ; AVX-NEXT:    retq
376   %z = call <12 x i8> @llvm.ssub.sat.v12i8(<12 x i8> %x, <12 x i8> %y)
377   ret <12 x i8> %z
380 define void @v12i16(ptr %px, ptr %py, ptr %pz) nounwind {
381 ; SSE-LABEL: v12i16:
382 ; SSE:       # %bb.0:
383 ; SSE-NEXT:    movdqa (%rdi), %xmm0
384 ; SSE-NEXT:    movdqa 16(%rdi), %xmm1
385 ; SSE-NEXT:    psubsw 16(%rsi), %xmm1
386 ; SSE-NEXT:    psubsw (%rsi), %xmm0
387 ; SSE-NEXT:    movdqa %xmm0, (%rdx)
388 ; SSE-NEXT:    movq %xmm1, 16(%rdx)
389 ; SSE-NEXT:    retq
391 ; AVX1-LABEL: v12i16:
392 ; AVX1:       # %bb.0:
393 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
394 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
395 ; AVX1-NEXT:    vpsubsw 16(%rsi), %xmm1, %xmm1
396 ; AVX1-NEXT:    vpsubsw (%rsi), %xmm0, %xmm0
397 ; AVX1-NEXT:    vmovdqa %xmm0, (%rdx)
398 ; AVX1-NEXT:    vmovq %xmm1, 16(%rdx)
399 ; AVX1-NEXT:    retq
401 ; AVX2-LABEL: v12i16:
402 ; AVX2:       # %bb.0:
403 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
404 ; AVX2-NEXT:    vpsubsw (%rsi), %ymm0, %ymm0
405 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
406 ; AVX2-NEXT:    vmovq %xmm1, 16(%rdx)
407 ; AVX2-NEXT:    vmovdqa %xmm0, (%rdx)
408 ; AVX2-NEXT:    vzeroupper
409 ; AVX2-NEXT:    retq
411 ; AVX512-LABEL: v12i16:
412 ; AVX512:       # %bb.0:
413 ; AVX512-NEXT:    vmovdqa (%rdi), %ymm0
414 ; AVX512-NEXT:    vpsubsw (%rsi), %ymm0, %ymm0
415 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
416 ; AVX512-NEXT:    vmovq %xmm1, 16(%rdx)
417 ; AVX512-NEXT:    vmovdqa %xmm0, (%rdx)
418 ; AVX512-NEXT:    vzeroupper
419 ; AVX512-NEXT:    retq
420   %x = load <12 x i16>, ptr %px
421   %y = load <12 x i16>, ptr %py
422   %z = call <12 x i16> @llvm.ssub.sat.v12i16(<12 x i16> %x, <12 x i16> %y)
423   store <12 x i16> %z, ptr %pz
424   ret void
427 ; Scalarization
429 define void @v1i8(ptr %px, ptr %py, ptr %pz) nounwind {
430 ; SSE-LABEL: v1i8:
431 ; SSE:       # %bb.0:
432 ; SSE-NEXT:    movzbl (%rdi), %eax
433 ; SSE-NEXT:    movzbl (%rsi), %ecx
434 ; SSE-NEXT:    xorl %esi, %esi
435 ; SSE-NEXT:    cmpb %cl, %al
436 ; SSE-NEXT:    setns %sil
437 ; SSE-NEXT:    addl $127, %esi
438 ; SSE-NEXT:    subb %cl, %al
439 ; SSE-NEXT:    movzbl %al, %eax
440 ; SSE-NEXT:    cmovol %esi, %eax
441 ; SSE-NEXT:    movb %al, (%rdx)
442 ; SSE-NEXT:    retq
444 ; AVX-LABEL: v1i8:
445 ; AVX:       # %bb.0:
446 ; AVX-NEXT:    movzbl (%rdi), %eax
447 ; AVX-NEXT:    movzbl (%rsi), %ecx
448 ; AVX-NEXT:    xorl %esi, %esi
449 ; AVX-NEXT:    cmpb %cl, %al
450 ; AVX-NEXT:    setns %sil
451 ; AVX-NEXT:    addl $127, %esi
452 ; AVX-NEXT:    subb %cl, %al
453 ; AVX-NEXT:    movzbl %al, %eax
454 ; AVX-NEXT:    cmovol %esi, %eax
455 ; AVX-NEXT:    movb %al, (%rdx)
456 ; AVX-NEXT:    retq
457   %x = load <1 x i8>, ptr %px
458   %y = load <1 x i8>, ptr %py
459   %z = call <1 x i8> @llvm.ssub.sat.v1i8(<1 x i8> %x, <1 x i8> %y)
460   store <1 x i8> %z, ptr %pz
461   ret void
464 define void @v1i16(ptr %px, ptr %py, ptr %pz) nounwind {
465 ; SSE-LABEL: v1i16:
466 ; SSE:       # %bb.0:
467 ; SSE-NEXT:    movzwl (%rdi), %eax
468 ; SSE-NEXT:    movzwl (%rsi), %ecx
469 ; SSE-NEXT:    xorl %esi, %esi
470 ; SSE-NEXT:    cmpw %cx, %ax
471 ; SSE-NEXT:    setns %sil
472 ; SSE-NEXT:    addl $32767, %esi # imm = 0x7FFF
473 ; SSE-NEXT:    subw %cx, %ax
474 ; SSE-NEXT:    cmovol %esi, %eax
475 ; SSE-NEXT:    movw %ax, (%rdx)
476 ; SSE-NEXT:    retq
478 ; AVX-LABEL: v1i16:
479 ; AVX:       # %bb.0:
480 ; AVX-NEXT:    movzwl (%rdi), %eax
481 ; AVX-NEXT:    movzwl (%rsi), %ecx
482 ; AVX-NEXT:    xorl %esi, %esi
483 ; AVX-NEXT:    cmpw %cx, %ax
484 ; AVX-NEXT:    setns %sil
485 ; AVX-NEXT:    addl $32767, %esi # imm = 0x7FFF
486 ; AVX-NEXT:    subw %cx, %ax
487 ; AVX-NEXT:    cmovol %esi, %eax
488 ; AVX-NEXT:    movw %ax, (%rdx)
489 ; AVX-NEXT:    retq
490   %x = load <1 x i16>, ptr %px
491   %y = load <1 x i16>, ptr %py
492   %z = call <1 x i16> @llvm.ssub.sat.v1i16(<1 x i16> %x, <1 x i16> %y)
493   store <1 x i16> %z, ptr %pz
494   ret void
497 ; Promotion
499 define <16 x i4> @v16i4(<16 x i4> %x, <16 x i4> %y) nounwind {
500 ; SSE-LABEL: v16i4:
501 ; SSE:       # %bb.0:
502 ; SSE-NEXT:    psllw $4, %xmm1
503 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
504 ; SSE-NEXT:    pand %xmm2, %xmm1
505 ; SSE-NEXT:    psllw $4, %xmm0
506 ; SSE-NEXT:    pand %xmm2, %xmm0
507 ; SSE-NEXT:    psubsb %xmm1, %xmm0
508 ; SSE-NEXT:    psrlw $4, %xmm0
509 ; SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
510 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
511 ; SSE-NEXT:    pxor %xmm1, %xmm0
512 ; SSE-NEXT:    psubb %xmm1, %xmm0
513 ; SSE-NEXT:    retq
515 ; AVX1-LABEL: v16i4:
516 ; AVX1:       # %bb.0:
517 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
518 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
519 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
520 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm0
521 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
522 ; AVX1-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
523 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
524 ; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
525 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
526 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
527 ; AVX1-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
528 ; AVX1-NEXT:    retq
530 ; AVX2-LABEL: v16i4:
531 ; AVX2:       # %bb.0:
532 ; AVX2-NEXT:    vpsllw $4, %xmm1, %xmm1
533 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
534 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
535 ; AVX2-NEXT:    vpsllw $4, %xmm0, %xmm0
536 ; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
537 ; AVX2-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
538 ; AVX2-NEXT:    vpsrlw $4, %xmm0, %xmm0
539 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
540 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
541 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
542 ; AVX2-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
543 ; AVX2-NEXT:    retq
545 ; AVX512F-LABEL: v16i4:
546 ; AVX512F:       # %bb.0:
547 ; AVX512F-NEXT:    vpsllw $4, %xmm1, %xmm1
548 ; AVX512F-NEXT:    vpbroadcastb {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
549 ; AVX512F-NEXT:    vpand %xmm2, %xmm1, %xmm1
550 ; AVX512F-NEXT:    vpsllw $4, %xmm0, %xmm0
551 ; AVX512F-NEXT:    vpand %xmm2, %xmm0, %xmm0
552 ; AVX512F-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
553 ; AVX512F-NEXT:    vpsrlw $4, %xmm0, %xmm0
554 ; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
555 ; AVX512F-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
556 ; AVX512F-NEXT:    vpxor %xmm1, %xmm0, %xmm0
557 ; AVX512F-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
558 ; AVX512F-NEXT:    retq
560 ; AVX512BW-LABEL: v16i4:
561 ; AVX512BW:       # %bb.0:
562 ; AVX512BW-NEXT:    vpsllw $4, %xmm1, %xmm1
563 ; AVX512BW-NEXT:    vpbroadcastb {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
564 ; AVX512BW-NEXT:    vpand %xmm2, %xmm1, %xmm1
565 ; AVX512BW-NEXT:    vpsllw $4, %xmm0, %xmm0
566 ; AVX512BW-NEXT:    vpand %xmm2, %xmm0, %xmm0
567 ; AVX512BW-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
568 ; AVX512BW-NEXT:    vpsrlw $4, %xmm0, %xmm0
569 ; AVX512BW-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
570 ; AVX512BW-NEXT:    vpternlogd $108, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm0
571 ; AVX512BW-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
572 ; AVX512BW-NEXT:    retq
573   %z = call <16 x i4> @llvm.ssub.sat.v16i4(<16 x i4> %x, <16 x i4> %y)
574   ret <16 x i4> %z
577 define <16 x i1> @v16i1(<16 x i1> %x, <16 x i1> %y) nounwind {
578 ; SSE-LABEL: v16i1:
579 ; SSE:       # %bb.0:
580 ; SSE-NEXT:    xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
581 ; SSE-NEXT:    andps %xmm1, %xmm0
582 ; SSE-NEXT:    retq
584 ; AVX1-LABEL: v16i1:
585 ; AVX1:       # %bb.0:
586 ; AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
587 ; AVX1-NEXT:    vandps %xmm1, %xmm0, %xmm0
588 ; AVX1-NEXT:    retq
590 ; AVX2-LABEL: v16i1:
591 ; AVX2:       # %bb.0:
592 ; AVX2-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
593 ; AVX2-NEXT:    vandps %xmm1, %xmm0, %xmm0
594 ; AVX2-NEXT:    retq
596 ; AVX512F-LABEL: v16i1:
597 ; AVX512F:       # %bb.0:
598 ; AVX512F-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
599 ; AVX512F-NEXT:    vandps %xmm1, %xmm0, %xmm0
600 ; AVX512F-NEXT:    retq
602 ; AVX512BW-LABEL: v16i1:
603 ; AVX512BW:       # %bb.0:
604 ; AVX512BW-NEXT:    vpternlogd $96, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm0
605 ; AVX512BW-NEXT:    retq
606   %z = call <16 x i1> @llvm.ssub.sat.v16i1(<16 x i1> %x, <16 x i1> %y)
607   ret <16 x i1> %z
610 ; Expanded
612 define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {
613 ; SSE2-LABEL: v2i32:
614 ; SSE2:       # %bb.0:
615 ; SSE2-NEXT:    pxor %xmm2, %xmm2
616 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
617 ; SSE2-NEXT:    psubd %xmm1, %xmm3
618 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
619 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm0
620 ; SSE2-NEXT:    pxor %xmm1, %xmm0
621 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
622 ; SSE2-NEXT:    pandn %xmm3, %xmm1
623 ; SSE2-NEXT:    psrad $31, %xmm3
624 ; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
625 ; SSE2-NEXT:    pand %xmm3, %xmm0
626 ; SSE2-NEXT:    por %xmm1, %xmm0
627 ; SSE2-NEXT:    retq
629 ; SSSE3-LABEL: v2i32:
630 ; SSSE3:       # %bb.0:
631 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
632 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
633 ; SSSE3-NEXT:    psubd %xmm1, %xmm3
634 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm1
635 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm0
636 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
637 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
638 ; SSSE3-NEXT:    pandn %xmm3, %xmm1
639 ; SSSE3-NEXT:    psrad $31, %xmm3
640 ; SSSE3-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
641 ; SSSE3-NEXT:    pand %xmm3, %xmm0
642 ; SSSE3-NEXT:    por %xmm1, %xmm0
643 ; SSSE3-NEXT:    retq
645 ; SSE41-LABEL: v2i32:
646 ; SSE41:       # %bb.0:
647 ; SSE41-NEXT:    pxor %xmm3, %xmm3
648 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
649 ; SSE41-NEXT:    psubd %xmm1, %xmm2
650 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm1
651 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm0
652 ; SSE41-NEXT:    pxor %xmm1, %xmm0
653 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
654 ; SSE41-NEXT:    psrad $31, %xmm1
655 ; SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
656 ; SSE41-NEXT:    blendvps %xmm0, %xmm1, %xmm2
657 ; SSE41-NEXT:    movaps %xmm2, %xmm0
658 ; SSE41-NEXT:    retq
660 ; AVX1-LABEL: v2i32:
661 ; AVX1:       # %bb.0:
662 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
663 ; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm1, %xmm2
664 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
665 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
666 ; AVX1-NEXT:    vpxor %xmm0, %xmm2, %xmm0
667 ; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm2
668 ; AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
669 ; AVX1-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
670 ; AVX1-NEXT:    retq
672 ; AVX2-LABEL: v2i32:
673 ; AVX2:       # %bb.0:
674 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
675 ; AVX2-NEXT:    vpcmpgtd %xmm2, %xmm1, %xmm2
676 ; AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
677 ; AVX2-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
678 ; AVX2-NEXT:    vpxor %xmm0, %xmm2, %xmm0
679 ; AVX2-NEXT:    vpsrad $31, %xmm1, %xmm2
680 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
681 ; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
682 ; AVX2-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
683 ; AVX2-NEXT:    retq
685 ; AVX512F-LABEL: v2i32:
686 ; AVX512F:       # %bb.0:
687 ; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2
688 ; AVX512F-NEXT:    vpcmpgtd %xmm2, %xmm1, %xmm2
689 ; AVX512F-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
690 ; AVX512F-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
691 ; AVX512F-NEXT:    vpxor %xmm0, %xmm2, %xmm0
692 ; AVX512F-NEXT:    vpsrad $31, %xmm1, %xmm2
693 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
694 ; AVX512F-NEXT:    vpxor %xmm3, %xmm2, %xmm2
695 ; AVX512F-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
696 ; AVX512F-NEXT:    retq
698 ; AVX512BW-LABEL: v2i32:
699 ; AVX512BW:       # %bb.0:
700 ; AVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
701 ; AVX512BW-NEXT:    vpcmpgtd %xmm2, %xmm1, %k0
702 ; AVX512BW-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
703 ; AVX512BW-NEXT:    vpcmpgtd %xmm1, %xmm0, %k1
704 ; AVX512BW-NEXT:    kxorw %k1, %k0, %k1
705 ; AVX512BW-NEXT:    vpsrad $31, %xmm1, %xmm0
706 ; AVX512BW-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm1 {%k1}
707 ; AVX512BW-NEXT:    vmovdqa %xmm1, %xmm0
708 ; AVX512BW-NEXT:    retq
709   %z = call <2 x i32> @llvm.ssub.sat.v2i32(<2 x i32> %x, <2 x i32> %y)
710   ret <2 x i32> %z
713 define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {
714 ; SSE2-LABEL: v4i32:
715 ; SSE2:       # %bb.0:
716 ; SSE2-NEXT:    pxor %xmm2, %xmm2
717 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
718 ; SSE2-NEXT:    psubd %xmm1, %xmm3
719 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
720 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm0
721 ; SSE2-NEXT:    pxor %xmm1, %xmm0
722 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
723 ; SSE2-NEXT:    pandn %xmm3, %xmm1
724 ; SSE2-NEXT:    psrad $31, %xmm3
725 ; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
726 ; SSE2-NEXT:    pand %xmm3, %xmm0
727 ; SSE2-NEXT:    por %xmm1, %xmm0
728 ; SSE2-NEXT:    retq
730 ; SSSE3-LABEL: v4i32:
731 ; SSSE3:       # %bb.0:
732 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
733 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
734 ; SSSE3-NEXT:    psubd %xmm1, %xmm3
735 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm1
736 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm0
737 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
738 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
739 ; SSSE3-NEXT:    pandn %xmm3, %xmm1
740 ; SSSE3-NEXT:    psrad $31, %xmm3
741 ; SSSE3-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
742 ; SSSE3-NEXT:    pand %xmm3, %xmm0
743 ; SSSE3-NEXT:    por %xmm1, %xmm0
744 ; SSSE3-NEXT:    retq
746 ; SSE41-LABEL: v4i32:
747 ; SSE41:       # %bb.0:
748 ; SSE41-NEXT:    pxor %xmm3, %xmm3
749 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
750 ; SSE41-NEXT:    psubd %xmm1, %xmm2
751 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm1
752 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm0
753 ; SSE41-NEXT:    pxor %xmm1, %xmm0
754 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
755 ; SSE41-NEXT:    psrad $31, %xmm1
756 ; SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
757 ; SSE41-NEXT:    blendvps %xmm0, %xmm1, %xmm2
758 ; SSE41-NEXT:    movaps %xmm2, %xmm0
759 ; SSE41-NEXT:    retq
761 ; AVX1-LABEL: v4i32:
762 ; AVX1:       # %bb.0:
763 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
764 ; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm1, %xmm2
765 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
766 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
767 ; AVX1-NEXT:    vpxor %xmm0, %xmm2, %xmm0
768 ; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm2
769 ; AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
770 ; AVX1-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
771 ; AVX1-NEXT:    retq
773 ; AVX2-LABEL: v4i32:
774 ; AVX2:       # %bb.0:
775 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
776 ; AVX2-NEXT:    vpcmpgtd %xmm2, %xmm1, %xmm2
777 ; AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
778 ; AVX2-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
779 ; AVX2-NEXT:    vpxor %xmm0, %xmm2, %xmm0
780 ; AVX2-NEXT:    vpsrad $31, %xmm1, %xmm2
781 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
782 ; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
783 ; AVX2-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
784 ; AVX2-NEXT:    retq
786 ; AVX512F-LABEL: v4i32:
787 ; AVX512F:       # %bb.0:
788 ; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2
789 ; AVX512F-NEXT:    vpcmpgtd %xmm2, %xmm1, %xmm2
790 ; AVX512F-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
791 ; AVX512F-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
792 ; AVX512F-NEXT:    vpxor %xmm0, %xmm2, %xmm0
793 ; AVX512F-NEXT:    vpsrad $31, %xmm1, %xmm2
794 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
795 ; AVX512F-NEXT:    vpxor %xmm3, %xmm2, %xmm2
796 ; AVX512F-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
797 ; AVX512F-NEXT:    retq
799 ; AVX512BW-LABEL: v4i32:
800 ; AVX512BW:       # %bb.0:
801 ; AVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
802 ; AVX512BW-NEXT:    vpcmpgtd %xmm2, %xmm1, %k0
803 ; AVX512BW-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
804 ; AVX512BW-NEXT:    vpcmpgtd %xmm1, %xmm0, %k1
805 ; AVX512BW-NEXT:    kxorw %k1, %k0, %k1
806 ; AVX512BW-NEXT:    vpsrad $31, %xmm1, %xmm0
807 ; AVX512BW-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm1 {%k1}
808 ; AVX512BW-NEXT:    vmovdqa %xmm1, %xmm0
809 ; AVX512BW-NEXT:    retq
810   %z = call <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32> %x, <4 x i32> %y)
811   ret <4 x i32> %z
814 define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
815 ; SSE2-LABEL: v8i32:
816 ; SSE2:       # %bb.0:
817 ; SSE2-NEXT:    pxor %xmm4, %xmm4
818 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
819 ; SSE2-NEXT:    psubd %xmm2, %xmm5
820 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
821 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm0
822 ; SSE2-NEXT:    pxor %xmm2, %xmm0
823 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
824 ; SSE2-NEXT:    pandn %xmm5, %xmm2
825 ; SSE2-NEXT:    psrad $31, %xmm5
826 ; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
827 ; SSE2-NEXT:    pxor %xmm6, %xmm5
828 ; SSE2-NEXT:    pand %xmm5, %xmm0
829 ; SSE2-NEXT:    por %xmm2, %xmm0
830 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
831 ; SSE2-NEXT:    psubd %xmm3, %xmm2
832 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm3
833 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
834 ; SSE2-NEXT:    pxor %xmm3, %xmm1
835 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
836 ; SSE2-NEXT:    pandn %xmm2, %xmm3
837 ; SSE2-NEXT:    psrad $31, %xmm2
838 ; SSE2-NEXT:    pxor %xmm6, %xmm2
839 ; SSE2-NEXT:    pand %xmm2, %xmm1
840 ; SSE2-NEXT:    por %xmm3, %xmm1
841 ; SSE2-NEXT:    retq
843 ; SSSE3-LABEL: v8i32:
844 ; SSSE3:       # %bb.0:
845 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
846 ; SSSE3-NEXT:    movdqa %xmm0, %xmm5
847 ; SSSE3-NEXT:    psubd %xmm2, %xmm5
848 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm2
849 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm0
850 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
851 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
852 ; SSSE3-NEXT:    pandn %xmm5, %xmm2
853 ; SSSE3-NEXT:    psrad $31, %xmm5
854 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
855 ; SSSE3-NEXT:    pxor %xmm6, %xmm5
856 ; SSSE3-NEXT:    pand %xmm5, %xmm0
857 ; SSSE3-NEXT:    por %xmm2, %xmm0
858 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
859 ; SSSE3-NEXT:    psubd %xmm3, %xmm2
860 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm3
861 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm1
862 ; SSSE3-NEXT:    pxor %xmm3, %xmm1
863 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
864 ; SSSE3-NEXT:    pandn %xmm2, %xmm3
865 ; SSSE3-NEXT:    psrad $31, %xmm2
866 ; SSSE3-NEXT:    pxor %xmm6, %xmm2
867 ; SSSE3-NEXT:    pand %xmm2, %xmm1
868 ; SSSE3-NEXT:    por %xmm3, %xmm1
869 ; SSSE3-NEXT:    retq
871 ; SSE41-LABEL: v8i32:
872 ; SSE41:       # %bb.0:
873 ; SSE41-NEXT:    movdqa %xmm1, %xmm5
874 ; SSE41-NEXT:    pxor %xmm6, %xmm6
875 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
876 ; SSE41-NEXT:    psubd %xmm2, %xmm4
877 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm2
878 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm0
879 ; SSE41-NEXT:    pxor %xmm2, %xmm0
880 ; SSE41-NEXT:    movdqa %xmm4, %xmm1
881 ; SSE41-NEXT:    psrad $31, %xmm1
882 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
883 ; SSE41-NEXT:    pxor %xmm2, %xmm1
884 ; SSE41-NEXT:    blendvps %xmm0, %xmm1, %xmm4
885 ; SSE41-NEXT:    movdqa %xmm5, %xmm1
886 ; SSE41-NEXT:    psubd %xmm3, %xmm1
887 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm3
888 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm5
889 ; SSE41-NEXT:    pxor %xmm3, %xmm5
890 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
891 ; SSE41-NEXT:    psrad $31, %xmm3
892 ; SSE41-NEXT:    pxor %xmm2, %xmm3
893 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
894 ; SSE41-NEXT:    blendvps %xmm0, %xmm3, %xmm1
895 ; SSE41-NEXT:    movaps %xmm4, %xmm0
896 ; SSE41-NEXT:    retq
898 ; AVX1-LABEL: v8i32:
899 ; AVX1:       # %bb.0:
900 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
901 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
902 ; AVX1-NEXT:    vpcmpgtd %xmm3, %xmm2, %xmm4
903 ; AVX1-NEXT:    vpcmpgtd %xmm3, %xmm1, %xmm3
904 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm3
905 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
906 ; AVX1-NEXT:    vpsubd %xmm2, %xmm4, %xmm2
907 ; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm4, %xmm4
908 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
909 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
910 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
911 ; AVX1-NEXT:    vxorps %ymm0, %ymm3, %ymm0
912 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm3
913 ; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm1
914 ; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm2
915 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
916 ; AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
917 ; AVX1-NEXT:    vblendvps %ymm0, %ymm1, %ymm3, %ymm0
918 ; AVX1-NEXT:    retq
920 ; AVX2-LABEL: v8i32:
921 ; AVX2:       # %bb.0:
922 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
923 ; AVX2-NEXT:    vpcmpgtd %ymm2, %ymm1, %ymm2
924 ; AVX2-NEXT:    vpsubd %ymm1, %ymm0, %ymm1
925 ; AVX2-NEXT:    vpcmpgtd %ymm1, %ymm0, %ymm0
926 ; AVX2-NEXT:    vpxor %ymm0, %ymm2, %ymm0
927 ; AVX2-NEXT:    vpsrad $31, %ymm1, %ymm2
928 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
929 ; AVX2-NEXT:    vpxor %ymm3, %ymm2, %ymm2
930 ; AVX2-NEXT:    vblendvps %ymm0, %ymm2, %ymm1, %ymm0
931 ; AVX2-NEXT:    retq
933 ; AVX512F-LABEL: v8i32:
934 ; AVX512F:       # %bb.0:
935 ; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2
936 ; AVX512F-NEXT:    vpcmpgtd %ymm2, %ymm1, %ymm2
937 ; AVX512F-NEXT:    vpsubd %ymm1, %ymm0, %ymm1
938 ; AVX512F-NEXT:    vpcmpgtd %ymm1, %ymm0, %ymm0
939 ; AVX512F-NEXT:    vpxor %ymm0, %ymm2, %ymm0
940 ; AVX512F-NEXT:    vpsrad $31, %ymm1, %ymm2
941 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
942 ; AVX512F-NEXT:    vpxor %ymm3, %ymm2, %ymm2
943 ; AVX512F-NEXT:    vblendvps %ymm0, %ymm2, %ymm1, %ymm0
944 ; AVX512F-NEXT:    retq
946 ; AVX512BW-LABEL: v8i32:
947 ; AVX512BW:       # %bb.0:
948 ; AVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
949 ; AVX512BW-NEXT:    vpcmpgtd %ymm2, %ymm1, %k0
950 ; AVX512BW-NEXT:    vpsubd %ymm1, %ymm0, %ymm1
951 ; AVX512BW-NEXT:    vpcmpgtd %ymm1, %ymm0, %k1
952 ; AVX512BW-NEXT:    kxorw %k1, %k0, %k1
953 ; AVX512BW-NEXT:    vpsrad $31, %ymm1, %ymm0
954 ; AVX512BW-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm1 {%k1}
955 ; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm0
956 ; AVX512BW-NEXT:    retq
957   %z = call <8 x i32> @llvm.ssub.sat.v8i32(<8 x i32> %x, <8 x i32> %y)
958   ret <8 x i32> %z
961 define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind {
962 ; SSE2-LABEL: v16i32:
963 ; SSE2:       # %bb.0:
964 ; SSE2-NEXT:    pxor %xmm8, %xmm8
965 ; SSE2-NEXT:    movdqa %xmm0, %xmm9
966 ; SSE2-NEXT:    psubd %xmm4, %xmm9
967 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm4
968 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm0
969 ; SSE2-NEXT:    pxor %xmm4, %xmm0
970 ; SSE2-NEXT:    movdqa %xmm0, %xmm10
971 ; SSE2-NEXT:    pandn %xmm9, %xmm10
972 ; SSE2-NEXT:    psrad $31, %xmm9
973 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
974 ; SSE2-NEXT:    pxor %xmm4, %xmm9
975 ; SSE2-NEXT:    pand %xmm9, %xmm0
976 ; SSE2-NEXT:    por %xmm10, %xmm0
977 ; SSE2-NEXT:    movdqa %xmm1, %xmm9
978 ; SSE2-NEXT:    psubd %xmm5, %xmm9
979 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm5
980 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm1
981 ; SSE2-NEXT:    pxor %xmm5, %xmm1
982 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
983 ; SSE2-NEXT:    pandn %xmm9, %xmm5
984 ; SSE2-NEXT:    psrad $31, %xmm9
985 ; SSE2-NEXT:    pxor %xmm4, %xmm9
986 ; SSE2-NEXT:    pand %xmm9, %xmm1
987 ; SSE2-NEXT:    por %xmm5, %xmm1
988 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
989 ; SSE2-NEXT:    psubd %xmm6, %xmm5
990 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm6
991 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm2
992 ; SSE2-NEXT:    pxor %xmm6, %xmm2
993 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
994 ; SSE2-NEXT:    pandn %xmm5, %xmm6
995 ; SSE2-NEXT:    psrad $31, %xmm5
996 ; SSE2-NEXT:    pxor %xmm4, %xmm5
997 ; SSE2-NEXT:    pand %xmm5, %xmm2
998 ; SSE2-NEXT:    por %xmm6, %xmm2
999 ; SSE2-NEXT:    movdqa %xmm3, %xmm5
1000 ; SSE2-NEXT:    psubd %xmm7, %xmm5
1001 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm7
1002 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm3
1003 ; SSE2-NEXT:    pxor %xmm7, %xmm3
1004 ; SSE2-NEXT:    movdqa %xmm3, %xmm6
1005 ; SSE2-NEXT:    pandn %xmm5, %xmm6
1006 ; SSE2-NEXT:    psrad $31, %xmm5
1007 ; SSE2-NEXT:    pxor %xmm4, %xmm5
1008 ; SSE2-NEXT:    pand %xmm5, %xmm3
1009 ; SSE2-NEXT:    por %xmm6, %xmm3
1010 ; SSE2-NEXT:    retq
1012 ; SSSE3-LABEL: v16i32:
1013 ; SSSE3:       # %bb.0:
1014 ; SSSE3-NEXT:    pxor %xmm8, %xmm8
1015 ; SSSE3-NEXT:    movdqa %xmm0, %xmm9
1016 ; SSSE3-NEXT:    psubd %xmm4, %xmm9
1017 ; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm4
1018 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm0
1019 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
1020 ; SSSE3-NEXT:    movdqa %xmm0, %xmm10
1021 ; SSSE3-NEXT:    pandn %xmm9, %xmm10
1022 ; SSSE3-NEXT:    psrad $31, %xmm9
1023 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
1024 ; SSSE3-NEXT:    pxor %xmm4, %xmm9
1025 ; SSSE3-NEXT:    pand %xmm9, %xmm0
1026 ; SSSE3-NEXT:    por %xmm10, %xmm0
1027 ; SSSE3-NEXT:    movdqa %xmm1, %xmm9
1028 ; SSSE3-NEXT:    psubd %xmm5, %xmm9
1029 ; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm5
1030 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm1
1031 ; SSSE3-NEXT:    pxor %xmm5, %xmm1
1032 ; SSSE3-NEXT:    movdqa %xmm1, %xmm5
1033 ; SSSE3-NEXT:    pandn %xmm9, %xmm5
1034 ; SSSE3-NEXT:    psrad $31, %xmm9
1035 ; SSSE3-NEXT:    pxor %xmm4, %xmm9
1036 ; SSSE3-NEXT:    pand %xmm9, %xmm1
1037 ; SSSE3-NEXT:    por %xmm5, %xmm1
1038 ; SSSE3-NEXT:    movdqa %xmm2, %xmm5
1039 ; SSSE3-NEXT:    psubd %xmm6, %xmm5
1040 ; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm6
1041 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm2
1042 ; SSSE3-NEXT:    pxor %xmm6, %xmm2
1043 ; SSSE3-NEXT:    movdqa %xmm2, %xmm6
1044 ; SSSE3-NEXT:    pandn %xmm5, %xmm6
1045 ; SSSE3-NEXT:    psrad $31, %xmm5
1046 ; SSSE3-NEXT:    pxor %xmm4, %xmm5
1047 ; SSSE3-NEXT:    pand %xmm5, %xmm2
1048 ; SSSE3-NEXT:    por %xmm6, %xmm2
1049 ; SSSE3-NEXT:    movdqa %xmm3, %xmm5
1050 ; SSSE3-NEXT:    psubd %xmm7, %xmm5
1051 ; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm7
1052 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm3
1053 ; SSSE3-NEXT:    pxor %xmm7, %xmm3
1054 ; SSSE3-NEXT:    movdqa %xmm3, %xmm6
1055 ; SSSE3-NEXT:    pandn %xmm5, %xmm6
1056 ; SSSE3-NEXT:    psrad $31, %xmm5
1057 ; SSSE3-NEXT:    pxor %xmm4, %xmm5
1058 ; SSSE3-NEXT:    pand %xmm5, %xmm3
1059 ; SSSE3-NEXT:    por %xmm6, %xmm3
1060 ; SSSE3-NEXT:    retq
1062 ; SSE41-LABEL: v16i32:
1063 ; SSE41:       # %bb.0:
1064 ; SSE41-NEXT:    movdqa %xmm3, %xmm11
1065 ; SSE41-NEXT:    movdqa %xmm2, %xmm10
1066 ; SSE41-NEXT:    movdqa %xmm1, %xmm9
1067 ; SSE41-NEXT:    pxor %xmm12, %xmm12
1068 ; SSE41-NEXT:    movdqa %xmm0, %xmm8
1069 ; SSE41-NEXT:    psubd %xmm4, %xmm8
1070 ; SSE41-NEXT:    pcmpgtd %xmm12, %xmm4
1071 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm0
1072 ; SSE41-NEXT:    pxor %xmm4, %xmm0
1073 ; SSE41-NEXT:    movdqa %xmm8, %xmm1
1074 ; SSE41-NEXT:    psrad $31, %xmm1
1075 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
1076 ; SSE41-NEXT:    pxor %xmm4, %xmm1
1077 ; SSE41-NEXT:    blendvps %xmm0, %xmm1, %xmm8
1078 ; SSE41-NEXT:    movdqa %xmm9, %xmm1
1079 ; SSE41-NEXT:    psubd %xmm5, %xmm1
1080 ; SSE41-NEXT:    pcmpgtd %xmm12, %xmm5
1081 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm9
1082 ; SSE41-NEXT:    pxor %xmm5, %xmm9
1083 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
1084 ; SSE41-NEXT:    psrad $31, %xmm2
1085 ; SSE41-NEXT:    pxor %xmm4, %xmm2
1086 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
1087 ; SSE41-NEXT:    blendvps %xmm0, %xmm2, %xmm1
1088 ; SSE41-NEXT:    movdqa %xmm10, %xmm2
1089 ; SSE41-NEXT:    psubd %xmm6, %xmm2
1090 ; SSE41-NEXT:    pcmpgtd %xmm12, %xmm6
1091 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm10
1092 ; SSE41-NEXT:    pxor %xmm6, %xmm10
1093 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
1094 ; SSE41-NEXT:    psrad $31, %xmm3
1095 ; SSE41-NEXT:    pxor %xmm4, %xmm3
1096 ; SSE41-NEXT:    movdqa %xmm10, %xmm0
1097 ; SSE41-NEXT:    blendvps %xmm0, %xmm3, %xmm2
1098 ; SSE41-NEXT:    movdqa %xmm11, %xmm3
1099 ; SSE41-NEXT:    psubd %xmm7, %xmm3
1100 ; SSE41-NEXT:    pcmpgtd %xmm12, %xmm7
1101 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm11
1102 ; SSE41-NEXT:    pxor %xmm7, %xmm11
1103 ; SSE41-NEXT:    movdqa %xmm3, %xmm5
1104 ; SSE41-NEXT:    psrad $31, %xmm5
1105 ; SSE41-NEXT:    pxor %xmm4, %xmm5
1106 ; SSE41-NEXT:    movdqa %xmm11, %xmm0
1107 ; SSE41-NEXT:    blendvps %xmm0, %xmm5, %xmm3
1108 ; SSE41-NEXT:    movaps %xmm8, %xmm0
1109 ; SSE41-NEXT:    retq
1111 ; AVX1-LABEL: v16i32:
1112 ; AVX1:       # %bb.0:
1113 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1114 ; AVX1-NEXT:    vpxor %xmm5, %xmm5, %xmm5
1115 ; AVX1-NEXT:    vpcmpgtd %xmm5, %xmm4, %xmm6
1116 ; AVX1-NEXT:    vpcmpgtd %xmm5, %xmm2, %xmm7
1117 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm7, %ymm6
1118 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
1119 ; AVX1-NEXT:    vpsubd %xmm4, %xmm7, %xmm4
1120 ; AVX1-NEXT:    vpcmpgtd %xmm4, %xmm7, %xmm7
1121 ; AVX1-NEXT:    vpsubd %xmm2, %xmm0, %xmm2
1122 ; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm0, %xmm0
1123 ; AVX1-NEXT:    vinsertf128 $1, %xmm7, %ymm0, %ymm0
1124 ; AVX1-NEXT:    vxorps %ymm0, %ymm6, %ymm0
1125 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm6
1126 ; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm2
1127 ; AVX1-NEXT:    vpsrad $31, %xmm4, %xmm4
1128 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
1129 ; AVX1-NEXT:    vbroadcastss {{.*#+}} ymm4 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1130 ; AVX1-NEXT:    vxorps %ymm4, %ymm2, %ymm2
1131 ; AVX1-NEXT:    vblendvps %ymm0, %ymm2, %ymm6, %ymm0
1132 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
1133 ; AVX1-NEXT:    vpcmpgtd %xmm5, %xmm2, %xmm6
1134 ; AVX1-NEXT:    vpcmpgtd %xmm5, %xmm3, %xmm5
1135 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm5, %ymm5
1136 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm6
1137 ; AVX1-NEXT:    vpsubd %xmm2, %xmm6, %xmm2
1138 ; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm6, %xmm6
1139 ; AVX1-NEXT:    vpsubd %xmm3, %xmm1, %xmm3
1140 ; AVX1-NEXT:    vpcmpgtd %xmm3, %xmm1, %xmm1
1141 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
1142 ; AVX1-NEXT:    vxorps %ymm1, %ymm5, %ymm1
1143 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm5
1144 ; AVX1-NEXT:    vpsrad $31, %xmm3, %xmm3
1145 ; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm2
1146 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
1147 ; AVX1-NEXT:    vxorps %ymm4, %ymm2, %ymm2
1148 ; AVX1-NEXT:    vblendvps %ymm1, %ymm2, %ymm5, %ymm1
1149 ; AVX1-NEXT:    retq
1151 ; AVX2-LABEL: v16i32:
1152 ; AVX2:       # %bb.0:
1153 ; AVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1154 ; AVX2-NEXT:    vpcmpgtd %ymm4, %ymm2, %ymm5
1155 ; AVX2-NEXT:    vpsubd %ymm2, %ymm0, %ymm2
1156 ; AVX2-NEXT:    vpcmpgtd %ymm2, %ymm0, %ymm0
1157 ; AVX2-NEXT:    vpxor %ymm0, %ymm5, %ymm0
1158 ; AVX2-NEXT:    vpsrad $31, %ymm2, %ymm5
1159 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm6 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1160 ; AVX2-NEXT:    vpxor %ymm6, %ymm5, %ymm5
1161 ; AVX2-NEXT:    vblendvps %ymm0, %ymm5, %ymm2, %ymm0
1162 ; AVX2-NEXT:    vpcmpgtd %ymm4, %ymm3, %ymm2
1163 ; AVX2-NEXT:    vpsubd %ymm3, %ymm1, %ymm3
1164 ; AVX2-NEXT:    vpcmpgtd %ymm3, %ymm1, %ymm1
1165 ; AVX2-NEXT:    vpxor %ymm1, %ymm2, %ymm1
1166 ; AVX2-NEXT:    vpsrad $31, %ymm3, %ymm2
1167 ; AVX2-NEXT:    vpxor %ymm6, %ymm2, %ymm2
1168 ; AVX2-NEXT:    vblendvps %ymm1, %ymm2, %ymm3, %ymm1
1169 ; AVX2-NEXT:    retq
1171 ; AVX512-LABEL: v16i32:
1172 ; AVX512:       # %bb.0:
1173 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1174 ; AVX512-NEXT:    vpcmpgtd %zmm2, %zmm1, %k0
1175 ; AVX512-NEXT:    vpsubd %zmm1, %zmm0, %zmm1
1176 ; AVX512-NEXT:    vpcmpgtd %zmm1, %zmm0, %k1
1177 ; AVX512-NEXT:    kxorw %k1, %k0, %k1
1178 ; AVX512-NEXT:    vpsrad $31, %zmm1, %zmm0
1179 ; AVX512-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm1 {%k1}
1180 ; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm0
1181 ; AVX512-NEXT:    retq
1182   %z = call <16 x i32> @llvm.ssub.sat.v16i32(<16 x i32> %x, <16 x i32> %y)
1183   ret <16 x i32> %z
1186 define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {
1187 ; SSE2-LABEL: v2i64:
1188 ; SSE2:       # %bb.0:
1189 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1190 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1191 ; SSE2-NEXT:    pxor %xmm2, %xmm3
1192 ; SSE2-NEXT:    psubq %xmm1, %xmm0
1193 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
1194 ; SSE2-NEXT:    pxor %xmm2, %xmm4
1195 ; SSE2-NEXT:    movdqa %xmm3, %xmm5
1196 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm5
1197 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1198 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
1199 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1200 ; SSE2-NEXT:    pand %xmm6, %xmm3
1201 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1202 ; SSE2-NEXT:    por %xmm3, %xmm4
1203 ; SSE2-NEXT:    pxor %xmm2, %xmm1
1204 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
1205 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
1206 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
1207 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm1
1208 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1209 ; SSE2-NEXT:    pand %xmm5, %xmm1
1210 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1211 ; SSE2-NEXT:    por %xmm1, %xmm2
1212 ; SSE2-NEXT:    pxor %xmm4, %xmm2
1213 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
1214 ; SSE2-NEXT:    psrad $31, %xmm1
1215 ; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1216 ; SSE2-NEXT:    pand %xmm2, %xmm1
1217 ; SSE2-NEXT:    pandn %xmm0, %xmm2
1218 ; SSE2-NEXT:    por %xmm2, %xmm1
1219 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1220 ; SSE2-NEXT:    retq
1222 ; SSSE3-LABEL: v2i64:
1223 ; SSSE3:       # %bb.0:
1224 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1225 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
1226 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
1227 ; SSSE3-NEXT:    psubq %xmm1, %xmm0
1228 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
1229 ; SSSE3-NEXT:    pxor %xmm2, %xmm4
1230 ; SSSE3-NEXT:    movdqa %xmm3, %xmm5
1231 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm5
1232 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1233 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm4
1234 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1235 ; SSSE3-NEXT:    pand %xmm6, %xmm3
1236 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1237 ; SSSE3-NEXT:    por %xmm3, %xmm4
1238 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
1239 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
1240 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
1241 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
1242 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm1
1243 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1244 ; SSSE3-NEXT:    pand %xmm5, %xmm1
1245 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1246 ; SSSE3-NEXT:    por %xmm1, %xmm2
1247 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
1248 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
1249 ; SSSE3-NEXT:    psrad $31, %xmm1
1250 ; SSSE3-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1251 ; SSSE3-NEXT:    pand %xmm2, %xmm1
1252 ; SSSE3-NEXT:    pandn %xmm0, %xmm2
1253 ; SSSE3-NEXT:    por %xmm2, %xmm1
1254 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1255 ; SSSE3-NEXT:    retq
1257 ; SSE41-LABEL: v2i64:
1258 ; SSE41:       # %bb.0:
1259 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1260 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = [2147483648,2147483648]
1261 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
1262 ; SSE41-NEXT:    pxor %xmm0, %xmm3
1263 ; SSE41-NEXT:    psubq %xmm1, %xmm2
1264 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
1265 ; SSE41-NEXT:    pxor %xmm0, %xmm4
1266 ; SSE41-NEXT:    movdqa %xmm3, %xmm5
1267 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm5
1268 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm3
1269 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1270 ; SSE41-NEXT:    pand %xmm5, %xmm4
1271 ; SSE41-NEXT:    por %xmm3, %xmm4
1272 ; SSE41-NEXT:    pxor %xmm0, %xmm1
1273 ; SSE41-NEXT:    movdqa %xmm1, %xmm5
1274 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
1275 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
1276 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]
1277 ; SSE41-NEXT:    pand %xmm5, %xmm3
1278 ; SSE41-NEXT:    por %xmm1, %xmm3
1279 ; SSE41-NEXT:    pxor %xmm4, %xmm3
1280 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
1281 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1282 ; SSE41-NEXT:    blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1283 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
1284 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
1285 ; SSE41-NEXT:    movapd %xmm2, %xmm0
1286 ; SSE41-NEXT:    retq
1288 ; AVX1-LABEL: v2i64:
1289 ; AVX1:       # %bb.0:
1290 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1291 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm1, %xmm2
1292 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm1
1293 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
1294 ; AVX1-NEXT:    vpxor %xmm0, %xmm2, %xmm0
1295 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1296 ; AVX1-NEXT:    # xmm2 = mem[0,0]
1297 ; AVX1-NEXT:    vblendvpd %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1298 ; AVX1-NEXT:    vblendvpd %xmm0, %xmm2, %xmm1, %xmm0
1299 ; AVX1-NEXT:    retq
1301 ; AVX2-LABEL: v2i64:
1302 ; AVX2:       # %bb.0:
1303 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1304 ; AVX2-NEXT:    vpcmpgtq %xmm2, %xmm1, %xmm2
1305 ; AVX2-NEXT:    vpsubq %xmm1, %xmm0, %xmm1
1306 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
1307 ; AVX2-NEXT:    vpxor %xmm0, %xmm2, %xmm0
1308 ; AVX2-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1309 ; AVX2-NEXT:    # xmm2 = mem[0,0]
1310 ; AVX2-NEXT:    vblendvpd %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1311 ; AVX2-NEXT:    vblendvpd %xmm0, %xmm2, %xmm1, %xmm0
1312 ; AVX2-NEXT:    retq
1314 ; AVX512F-LABEL: v2i64:
1315 ; AVX512F:       # %bb.0:
1316 ; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1317 ; AVX512F-NEXT:    vpcmpgtq %xmm2, %xmm1, %xmm2
1318 ; AVX512F-NEXT:    vpsubq %xmm1, %xmm0, %xmm1
1319 ; AVX512F-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
1320 ; AVX512F-NEXT:    vpxor %xmm0, %xmm2, %xmm0
1321 ; AVX512F-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1322 ; AVX512F-NEXT:    # xmm2 = mem[0,0]
1323 ; AVX512F-NEXT:    vblendvpd %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1324 ; AVX512F-NEXT:    vblendvpd %xmm0, %xmm2, %xmm1, %xmm0
1325 ; AVX512F-NEXT:    retq
1327 ; AVX512BW-LABEL: v2i64:
1328 ; AVX512BW:       # %bb.0:
1329 ; AVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1330 ; AVX512BW-NEXT:    vpcmpgtq %xmm2, %xmm1, %k0
1331 ; AVX512BW-NEXT:    vpsubq %xmm1, %xmm0, %xmm1
1332 ; AVX512BW-NEXT:    vpcmpgtq %xmm1, %xmm0, %k1
1333 ; AVX512BW-NEXT:    kxorw %k1, %k0, %k1
1334 ; AVX512BW-NEXT:    vpcmpgtq %xmm1, %xmm2, %k2
1335 ; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
1336 ; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} xmm0 {%k2} = [9223372036854775807,9223372036854775807]
1337 ; AVX512BW-NEXT:    vmovdqa64 %xmm0, %xmm1 {%k1}
1338 ; AVX512BW-NEXT:    vmovdqa %xmm1, %xmm0
1339 ; AVX512BW-NEXT:    retq
1340   %z = call <2 x i64> @llvm.ssub.sat.v2i64(<2 x i64> %x, <2 x i64> %y)
1341   ret <2 x i64> %z
1344 define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
1345 ; SSE2-LABEL: v4i64:
1346 ; SSE2:       # %bb.0:
1347 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
1348 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648]
1349 ; SSE2-NEXT:    pxor %xmm5, %xmm0
1350 ; SSE2-NEXT:    psubq %xmm2, %xmm4
1351 ; SSE2-NEXT:    movdqa %xmm4, %xmm6
1352 ; SSE2-NEXT:    pxor %xmm5, %xmm6
1353 ; SSE2-NEXT:    movdqa %xmm0, %xmm7
1354 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
1355 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
1356 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm6
1357 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
1358 ; SSE2-NEXT:    pand %xmm8, %xmm0
1359 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
1360 ; SSE2-NEXT:    por %xmm0, %xmm6
1361 ; SSE2-NEXT:    pxor %xmm5, %xmm2
1362 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1363 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm0
1364 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[0,0,2,2]
1365 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm2
1366 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1367 ; SSE2-NEXT:    pand %xmm7, %xmm2
1368 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
1369 ; SSE2-NEXT:    por %xmm2, %xmm7
1370 ; SSE2-NEXT:    pxor %xmm6, %xmm7
1371 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1372 ; SSE2-NEXT:    psrad $31, %xmm0
1373 ; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [9223372036854775808,9223372036854775808]
1374 ; SSE2-NEXT:    pxor %xmm6, %xmm0
1375 ; SSE2-NEXT:    pand %xmm7, %xmm0
1376 ; SSE2-NEXT:    pandn %xmm4, %xmm7
1377 ; SSE2-NEXT:    por %xmm7, %xmm0
1378 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1379 ; SSE2-NEXT:    pxor %xmm5, %xmm2
1380 ; SSE2-NEXT:    psubq %xmm3, %xmm1
1381 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1382 ; SSE2-NEXT:    pxor %xmm5, %xmm4
1383 ; SSE2-NEXT:    movdqa %xmm2, %xmm7
1384 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm7
1385 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
1386 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
1387 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
1388 ; SSE2-NEXT:    pand %xmm8, %xmm2
1389 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3]
1390 ; SSE2-NEXT:    por %xmm2, %xmm4
1391 ; SSE2-NEXT:    pxor %xmm5, %xmm3
1392 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
1393 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm2
1394 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[0,0,2,2]
1395 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
1396 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1397 ; SSE2-NEXT:    pand %xmm7, %xmm3
1398 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]
1399 ; SSE2-NEXT:    por %xmm3, %xmm5
1400 ; SSE2-NEXT:    pxor %xmm4, %xmm5
1401 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1402 ; SSE2-NEXT:    psrad $31, %xmm2
1403 ; SSE2-NEXT:    pxor %xmm6, %xmm2
1404 ; SSE2-NEXT:    pand %xmm5, %xmm2
1405 ; SSE2-NEXT:    pandn %xmm1, %xmm5
1406 ; SSE2-NEXT:    por %xmm5, %xmm2
1407 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1408 ; SSE2-NEXT:    retq
1410 ; SSSE3-LABEL: v4i64:
1411 ; SSSE3:       # %bb.0:
1412 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
1413 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648]
1414 ; SSSE3-NEXT:    pxor %xmm5, %xmm0
1415 ; SSSE3-NEXT:    psubq %xmm2, %xmm4
1416 ; SSSE3-NEXT:    movdqa %xmm4, %xmm6
1417 ; SSSE3-NEXT:    pxor %xmm5, %xmm6
1418 ; SSSE3-NEXT:    movdqa %xmm0, %xmm7
1419 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm7
1420 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
1421 ; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm6
1422 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
1423 ; SSSE3-NEXT:    pand %xmm8, %xmm0
1424 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
1425 ; SSSE3-NEXT:    por %xmm0, %xmm6
1426 ; SSSE3-NEXT:    pxor %xmm5, %xmm2
1427 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
1428 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm0
1429 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[0,0,2,2]
1430 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm2
1431 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1432 ; SSSE3-NEXT:    pand %xmm7, %xmm2
1433 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
1434 ; SSSE3-NEXT:    por %xmm2, %xmm7
1435 ; SSSE3-NEXT:    pxor %xmm6, %xmm7
1436 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1437 ; SSSE3-NEXT:    psrad $31, %xmm0
1438 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [9223372036854775808,9223372036854775808]
1439 ; SSSE3-NEXT:    pxor %xmm6, %xmm0
1440 ; SSSE3-NEXT:    pand %xmm7, %xmm0
1441 ; SSSE3-NEXT:    pandn %xmm4, %xmm7
1442 ; SSSE3-NEXT:    por %xmm7, %xmm0
1443 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1444 ; SSSE3-NEXT:    pxor %xmm5, %xmm2
1445 ; SSSE3-NEXT:    psubq %xmm3, %xmm1
1446 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
1447 ; SSSE3-NEXT:    pxor %xmm5, %xmm4
1448 ; SSSE3-NEXT:    movdqa %xmm2, %xmm7
1449 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm7
1450 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
1451 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm4
1452 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
1453 ; SSSE3-NEXT:    pand %xmm8, %xmm2
1454 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3]
1455 ; SSSE3-NEXT:    por %xmm2, %xmm4
1456 ; SSSE3-NEXT:    pxor %xmm5, %xmm3
1457 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
1458 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm2
1459 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[0,0,2,2]
1460 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm3
1461 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1462 ; SSSE3-NEXT:    pand %xmm7, %xmm3
1463 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]
1464 ; SSSE3-NEXT:    por %xmm3, %xmm5
1465 ; SSSE3-NEXT:    pxor %xmm4, %xmm5
1466 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1467 ; SSSE3-NEXT:    psrad $31, %xmm2
1468 ; SSSE3-NEXT:    pxor %xmm6, %xmm2
1469 ; SSSE3-NEXT:    pand %xmm5, %xmm2
1470 ; SSSE3-NEXT:    pandn %xmm1, %xmm5
1471 ; SSSE3-NEXT:    por %xmm5, %xmm2
1472 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1473 ; SSSE3-NEXT:    retq
1475 ; SSE41-LABEL: v4i64:
1476 ; SSE41:       # %bb.0:
1477 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
1478 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm6 = [2147483648,2147483648]
1479 ; SSE41-NEXT:    pxor %xmm6, %xmm0
1480 ; SSE41-NEXT:    psubq %xmm2, %xmm4
1481 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
1482 ; SSE41-NEXT:    pxor %xmm6, %xmm5
1483 ; SSE41-NEXT:    movdqa %xmm0, %xmm7
1484 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm7
1485 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm0
1486 ; SSE41-NEXT:    pshufd {{.*#+}} xmm8 = xmm0[0,0,2,2]
1487 ; SSE41-NEXT:    pand %xmm7, %xmm8
1488 ; SSE41-NEXT:    por %xmm0, %xmm8
1489 ; SSE41-NEXT:    pxor %xmm6, %xmm2
1490 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1491 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm0
1492 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm2
1493 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
1494 ; SSE41-NEXT:    pand %xmm0, %xmm5
1495 ; SSE41-NEXT:    por %xmm2, %xmm5
1496 ; SSE41-NEXT:    pxor %xmm8, %xmm5
1497 ; SSE41-NEXT:    movapd {{.*#+}} xmm8 = [9223372036854775807,9223372036854775807]
1498 ; SSE41-NEXT:    movapd {{.*#+}} xmm7 = [9223372036854775808,9223372036854775808]
1499 ; SSE41-NEXT:    movapd %xmm7, %xmm2
1500 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1501 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm2
1502 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
1503 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
1504 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1505 ; SSE41-NEXT:    pxor %xmm6, %xmm0
1506 ; SSE41-NEXT:    psubq %xmm3, %xmm1
1507 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
1508 ; SSE41-NEXT:    pxor %xmm6, %xmm2
1509 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
1510 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm5
1511 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm0
1512 ; SSE41-NEXT:    pshufd {{.*#+}} xmm9 = xmm0[0,0,2,2]
1513 ; SSE41-NEXT:    pand %xmm5, %xmm9
1514 ; SSE41-NEXT:    por %xmm0, %xmm9
1515 ; SSE41-NEXT:    pxor %xmm6, %xmm3
1516 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
1517 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm0
1518 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm3
1519 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
1520 ; SSE41-NEXT:    pand %xmm0, %xmm2
1521 ; SSE41-NEXT:    por %xmm3, %xmm2
1522 ; SSE41-NEXT:    pxor %xmm9, %xmm2
1523 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1524 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm7
1525 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1526 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
1527 ; SSE41-NEXT:    movapd %xmm4, %xmm0
1528 ; SSE41-NEXT:    retq
1530 ; AVX1-LABEL: v4i64:
1531 ; AVX1:       # %bb.0:
1532 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1533 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1534 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm4
1535 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm1, %xmm5
1536 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm5, %ymm4
1537 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1538 ; AVX1-NEXT:    vpsubq %xmm2, %xmm5, %xmm2
1539 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm5, %xmm5
1540 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm1
1541 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
1542 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm0, %ymm0
1543 ; AVX1-NEXT:    vxorpd %ymm0, %ymm4, %ymm0
1544 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm4
1545 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
1546 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm1
1547 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1548 ; AVX1-NEXT:    vxorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1549 ; AVX1-NEXT:    vblendvpd %ymm0, %ymm1, %ymm4, %ymm0
1550 ; AVX1-NEXT:    retq
1552 ; AVX2-LABEL: v4i64:
1553 ; AVX2:       # %bb.0:
1554 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1555 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm3
1556 ; AVX2-NEXT:    vpsubq %ymm1, %ymm0, %ymm1
1557 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm0
1558 ; AVX2-NEXT:    vpxor %ymm0, %ymm3, %ymm0
1559 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm2
1560 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1561 ; AVX2-NEXT:    vpxor %ymm3, %ymm2, %ymm2
1562 ; AVX2-NEXT:    vblendvpd %ymm0, %ymm2, %ymm1, %ymm0
1563 ; AVX2-NEXT:    retq
1565 ; AVX512F-LABEL: v4i64:
1566 ; AVX512F:       # %bb.0:
1567 ; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1568 ; AVX512F-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm2
1569 ; AVX512F-NEXT:    vpsubq %ymm1, %ymm0, %ymm1
1570 ; AVX512F-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm0
1571 ; AVX512F-NEXT:    vpxor %ymm0, %ymm2, %ymm0
1572 ; AVX512F-NEXT:    vpsraq $63, %zmm1, %zmm2
1573 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1574 ; AVX512F-NEXT:    vpxor %ymm3, %ymm2, %ymm2
1575 ; AVX512F-NEXT:    vblendvpd %ymm0, %ymm2, %ymm1, %ymm0
1576 ; AVX512F-NEXT:    retq
1578 ; AVX512BW-LABEL: v4i64:
1579 ; AVX512BW:       # %bb.0:
1580 ; AVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1581 ; AVX512BW-NEXT:    vpcmpgtq %ymm2, %ymm1, %k0
1582 ; AVX512BW-NEXT:    vpsubq %ymm1, %ymm0, %ymm1
1583 ; AVX512BW-NEXT:    vpcmpgtq %ymm1, %ymm0, %k1
1584 ; AVX512BW-NEXT:    kxorw %k1, %k0, %k1
1585 ; AVX512BW-NEXT:    vpsraq $63, %ymm1, %ymm0
1586 ; AVX512BW-NEXT:    vpxorq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm1 {%k1}
1587 ; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm0
1588 ; AVX512BW-NEXT:    retq
1589   %z = call <4 x i64> @llvm.ssub.sat.v4i64(<4 x i64> %x, <4 x i64> %y)
1590   ret <4 x i64> %z
1593 define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind {
1594 ; SSE2-LABEL: v8i64:
1595 ; SSE2:       # %bb.0:
1596 ; SSE2-NEXT:    movdqa %xmm1, %xmm8
1597 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1598 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648]
1599 ; SSE2-NEXT:    pxor %xmm9, %xmm0
1600 ; SSE2-NEXT:    psubq %xmm4, %xmm1
1601 ; SSE2-NEXT:    movdqa %xmm1, %xmm10
1602 ; SSE2-NEXT:    pxor %xmm9, %xmm10
1603 ; SSE2-NEXT:    movdqa %xmm0, %xmm11
1604 ; SSE2-NEXT:    pcmpgtd %xmm10, %xmm11
1605 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1606 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm10
1607 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]
1608 ; SSE2-NEXT:    pand %xmm12, %xmm0
1609 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm11[1,1,3,3]
1610 ; SSE2-NEXT:    por %xmm0, %xmm10
1611 ; SSE2-NEXT:    pxor %xmm9, %xmm4
1612 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
1613 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm0
1614 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm0[0,0,2,2]
1615 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm4
1616 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1617 ; SSE2-NEXT:    pand %xmm11, %xmm4
1618 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm0[1,1,3,3]
1619 ; SSE2-NEXT:    por %xmm4, %xmm11
1620 ; SSE2-NEXT:    pxor %xmm10, %xmm11
1621 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1622 ; SSE2-NEXT:    psrad $31, %xmm0
1623 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [9223372036854775808,9223372036854775808]
1624 ; SSE2-NEXT:    pxor %xmm10, %xmm0
1625 ; SSE2-NEXT:    pand %xmm11, %xmm0
1626 ; SSE2-NEXT:    pandn %xmm1, %xmm11
1627 ; SSE2-NEXT:    por %xmm11, %xmm0
1628 ; SSE2-NEXT:    movdqa %xmm8, %xmm1
1629 ; SSE2-NEXT:    pxor %xmm9, %xmm1
1630 ; SSE2-NEXT:    psubq %xmm5, %xmm8
1631 ; SSE2-NEXT:    movdqa %xmm8, %xmm4
1632 ; SSE2-NEXT:    pxor %xmm9, %xmm4
1633 ; SSE2-NEXT:    movdqa %xmm1, %xmm11
1634 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm11
1635 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1636 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm4
1637 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
1638 ; SSE2-NEXT:    pand %xmm12, %xmm1
1639 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm11[1,1,3,3]
1640 ; SSE2-NEXT:    por %xmm1, %xmm4
1641 ; SSE2-NEXT:    pxor %xmm9, %xmm5
1642 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
1643 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm1
1644 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm1[0,0,2,2]
1645 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm5
1646 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1647 ; SSE2-NEXT:    pand %xmm11, %xmm5
1648 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm1[1,1,3,3]
1649 ; SSE2-NEXT:    por %xmm5, %xmm11
1650 ; SSE2-NEXT:    pxor %xmm4, %xmm11
1651 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3]
1652 ; SSE2-NEXT:    psrad $31, %xmm1
1653 ; SSE2-NEXT:    pxor %xmm10, %xmm1
1654 ; SSE2-NEXT:    pand %xmm11, %xmm1
1655 ; SSE2-NEXT:    pandn %xmm8, %xmm11
1656 ; SSE2-NEXT:    por %xmm11, %xmm1
1657 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1658 ; SSE2-NEXT:    pxor %xmm9, %xmm4
1659 ; SSE2-NEXT:    psubq %xmm6, %xmm2
1660 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
1661 ; SSE2-NEXT:    pxor %xmm9, %xmm5
1662 ; SSE2-NEXT:    movdqa %xmm4, %xmm8
1663 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm8
1664 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm8[0,0,2,2]
1665 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm5
1666 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1667 ; SSE2-NEXT:    pand %xmm11, %xmm4
1668 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]
1669 ; SSE2-NEXT:    por %xmm4, %xmm5
1670 ; SSE2-NEXT:    pxor %xmm9, %xmm6
1671 ; SSE2-NEXT:    movdqa %xmm6, %xmm4
1672 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm4
1673 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2]
1674 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm6
1675 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1676 ; SSE2-NEXT:    pand %xmm8, %xmm6
1677 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm4[1,1,3,3]
1678 ; SSE2-NEXT:    por %xmm6, %xmm8
1679 ; SSE2-NEXT:    pxor %xmm5, %xmm8
1680 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
1681 ; SSE2-NEXT:    psrad $31, %xmm4
1682 ; SSE2-NEXT:    pxor %xmm10, %xmm4
1683 ; SSE2-NEXT:    pand %xmm8, %xmm4
1684 ; SSE2-NEXT:    pandn %xmm2, %xmm8
1685 ; SSE2-NEXT:    por %xmm8, %xmm4
1686 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
1687 ; SSE2-NEXT:    pxor %xmm9, %xmm2
1688 ; SSE2-NEXT:    psubq %xmm7, %xmm3
1689 ; SSE2-NEXT:    movdqa %xmm3, %xmm5
1690 ; SSE2-NEXT:    pxor %xmm9, %xmm5
1691 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
1692 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
1693 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
1694 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm5
1695 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
1696 ; SSE2-NEXT:    pand %xmm8, %xmm2
1697 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
1698 ; SSE2-NEXT:    por %xmm2, %xmm5
1699 ; SSE2-NEXT:    pxor %xmm9, %xmm7
1700 ; SSE2-NEXT:    movdqa %xmm7, %xmm2
1701 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm2
1702 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
1703 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm7
1704 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1705 ; SSE2-NEXT:    pand %xmm6, %xmm7
1706 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1707 ; SSE2-NEXT:    por %xmm7, %xmm2
1708 ; SSE2-NEXT:    pxor %xmm5, %xmm2
1709 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]
1710 ; SSE2-NEXT:    psrad $31, %xmm5
1711 ; SSE2-NEXT:    pxor %xmm10, %xmm5
1712 ; SSE2-NEXT:    pand %xmm2, %xmm5
1713 ; SSE2-NEXT:    pandn %xmm3, %xmm2
1714 ; SSE2-NEXT:    por %xmm2, %xmm5
1715 ; SSE2-NEXT:    movdqa %xmm4, %xmm2
1716 ; SSE2-NEXT:    movdqa %xmm5, %xmm3
1717 ; SSE2-NEXT:    retq
1719 ; SSSE3-LABEL: v8i64:
1720 ; SSSE3:       # %bb.0:
1721 ; SSSE3-NEXT:    movdqa %xmm1, %xmm8
1722 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
1723 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648]
1724 ; SSSE3-NEXT:    pxor %xmm9, %xmm0
1725 ; SSSE3-NEXT:    psubq %xmm4, %xmm1
1726 ; SSSE3-NEXT:    movdqa %xmm1, %xmm10
1727 ; SSSE3-NEXT:    pxor %xmm9, %xmm10
1728 ; SSSE3-NEXT:    movdqa %xmm0, %xmm11
1729 ; SSSE3-NEXT:    pcmpgtd %xmm10, %xmm11
1730 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1731 ; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm10
1732 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]
1733 ; SSSE3-NEXT:    pand %xmm12, %xmm0
1734 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm11[1,1,3,3]
1735 ; SSSE3-NEXT:    por %xmm0, %xmm10
1736 ; SSSE3-NEXT:    pxor %xmm9, %xmm4
1737 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
1738 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm0
1739 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm0[0,0,2,2]
1740 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm4
1741 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1742 ; SSSE3-NEXT:    pand %xmm11, %xmm4
1743 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm0[1,1,3,3]
1744 ; SSSE3-NEXT:    por %xmm4, %xmm11
1745 ; SSSE3-NEXT:    pxor %xmm10, %xmm11
1746 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1747 ; SSSE3-NEXT:    psrad $31, %xmm0
1748 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [9223372036854775808,9223372036854775808]
1749 ; SSSE3-NEXT:    pxor %xmm10, %xmm0
1750 ; SSSE3-NEXT:    pand %xmm11, %xmm0
1751 ; SSSE3-NEXT:    pandn %xmm1, %xmm11
1752 ; SSSE3-NEXT:    por %xmm11, %xmm0
1753 ; SSSE3-NEXT:    movdqa %xmm8, %xmm1
1754 ; SSSE3-NEXT:    pxor %xmm9, %xmm1
1755 ; SSSE3-NEXT:    psubq %xmm5, %xmm8
1756 ; SSSE3-NEXT:    movdqa %xmm8, %xmm4
1757 ; SSSE3-NEXT:    pxor %xmm9, %xmm4
1758 ; SSSE3-NEXT:    movdqa %xmm1, %xmm11
1759 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm11
1760 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1761 ; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm4
1762 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
1763 ; SSSE3-NEXT:    pand %xmm12, %xmm1
1764 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm11[1,1,3,3]
1765 ; SSSE3-NEXT:    por %xmm1, %xmm4
1766 ; SSSE3-NEXT:    pxor %xmm9, %xmm5
1767 ; SSSE3-NEXT:    movdqa %xmm5, %xmm1
1768 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm1
1769 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm1[0,0,2,2]
1770 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm5
1771 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1772 ; SSSE3-NEXT:    pand %xmm11, %xmm5
1773 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm1[1,1,3,3]
1774 ; SSSE3-NEXT:    por %xmm5, %xmm11
1775 ; SSSE3-NEXT:    pxor %xmm4, %xmm11
1776 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3]
1777 ; SSSE3-NEXT:    psrad $31, %xmm1
1778 ; SSSE3-NEXT:    pxor %xmm10, %xmm1
1779 ; SSSE3-NEXT:    pand %xmm11, %xmm1
1780 ; SSSE3-NEXT:    pandn %xmm8, %xmm11
1781 ; SSSE3-NEXT:    por %xmm11, %xmm1
1782 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
1783 ; SSSE3-NEXT:    pxor %xmm9, %xmm4
1784 ; SSSE3-NEXT:    psubq %xmm6, %xmm2
1785 ; SSSE3-NEXT:    movdqa %xmm2, %xmm5
1786 ; SSSE3-NEXT:    pxor %xmm9, %xmm5
1787 ; SSSE3-NEXT:    movdqa %xmm4, %xmm8
1788 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm8
1789 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm8[0,0,2,2]
1790 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm5
1791 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1792 ; SSSE3-NEXT:    pand %xmm11, %xmm4
1793 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]
1794 ; SSSE3-NEXT:    por %xmm4, %xmm5
1795 ; SSSE3-NEXT:    pxor %xmm9, %xmm6
1796 ; SSSE3-NEXT:    movdqa %xmm6, %xmm4
1797 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm4
1798 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2]
1799 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm6
1800 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1801 ; SSSE3-NEXT:    pand %xmm8, %xmm6
1802 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm4[1,1,3,3]
1803 ; SSSE3-NEXT:    por %xmm6, %xmm8
1804 ; SSSE3-NEXT:    pxor %xmm5, %xmm8
1805 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
1806 ; SSSE3-NEXT:    psrad $31, %xmm4
1807 ; SSSE3-NEXT:    pxor %xmm10, %xmm4
1808 ; SSSE3-NEXT:    pand %xmm8, %xmm4
1809 ; SSSE3-NEXT:    pandn %xmm2, %xmm8
1810 ; SSSE3-NEXT:    por %xmm8, %xmm4
1811 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
1812 ; SSSE3-NEXT:    pxor %xmm9, %xmm2
1813 ; SSSE3-NEXT:    psubq %xmm7, %xmm3
1814 ; SSSE3-NEXT:    movdqa %xmm3, %xmm5
1815 ; SSSE3-NEXT:    pxor %xmm9, %xmm5
1816 ; SSSE3-NEXT:    movdqa %xmm2, %xmm6
1817 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm6
1818 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
1819 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm5
1820 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
1821 ; SSSE3-NEXT:    pand %xmm8, %xmm2
1822 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
1823 ; SSSE3-NEXT:    por %xmm2, %xmm5
1824 ; SSSE3-NEXT:    pxor %xmm9, %xmm7
1825 ; SSSE3-NEXT:    movdqa %xmm7, %xmm2
1826 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm2
1827 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
1828 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm7
1829 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1830 ; SSSE3-NEXT:    pand %xmm6, %xmm7
1831 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1832 ; SSSE3-NEXT:    por %xmm7, %xmm2
1833 ; SSSE3-NEXT:    pxor %xmm5, %xmm2
1834 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]
1835 ; SSSE3-NEXT:    psrad $31, %xmm5
1836 ; SSSE3-NEXT:    pxor %xmm10, %xmm5
1837 ; SSSE3-NEXT:    pand %xmm2, %xmm5
1838 ; SSSE3-NEXT:    pandn %xmm3, %xmm2
1839 ; SSSE3-NEXT:    por %xmm2, %xmm5
1840 ; SSSE3-NEXT:    movdqa %xmm4, %xmm2
1841 ; SSSE3-NEXT:    movdqa %xmm5, %xmm3
1842 ; SSSE3-NEXT:    retq
1844 ; SSE41-LABEL: v8i64:
1845 ; SSE41:       # %bb.0:
1846 ; SSE41-NEXT:    movdqa %xmm0, %xmm8
1847 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm10 = [2147483648,2147483648]
1848 ; SSE41-NEXT:    pxor %xmm10, %xmm0
1849 ; SSE41-NEXT:    psubq %xmm4, %xmm8
1850 ; SSE41-NEXT:    movdqa %xmm8, %xmm9
1851 ; SSE41-NEXT:    pxor %xmm10, %xmm9
1852 ; SSE41-NEXT:    movdqa %xmm0, %xmm11
1853 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm11
1854 ; SSE41-NEXT:    pcmpgtd %xmm9, %xmm0
1855 ; SSE41-NEXT:    pshufd {{.*#+}} xmm12 = xmm0[0,0,2,2]
1856 ; SSE41-NEXT:    pand %xmm11, %xmm12
1857 ; SSE41-NEXT:    por %xmm0, %xmm12
1858 ; SSE41-NEXT:    pxor %xmm10, %xmm4
1859 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1860 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
1861 ; SSE41-NEXT:    pcmpgtd %xmm10, %xmm4
1862 ; SSE41-NEXT:    pshufd {{.*#+}} xmm9 = xmm4[0,0,2,2]
1863 ; SSE41-NEXT:    pand %xmm0, %xmm9
1864 ; SSE41-NEXT:    por %xmm4, %xmm9
1865 ; SSE41-NEXT:    pxor %xmm12, %xmm9
1866 ; SSE41-NEXT:    movapd {{.*#+}} xmm12 = [9223372036854775807,9223372036854775807]
1867 ; SSE41-NEXT:    movapd {{.*#+}} xmm11 = [9223372036854775808,9223372036854775808]
1868 ; SSE41-NEXT:    movapd %xmm11, %xmm4
1869 ; SSE41-NEXT:    movdqa %xmm8, %xmm0
1870 ; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm4
1871 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
1872 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm8
1873 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1874 ; SSE41-NEXT:    pxor %xmm10, %xmm0
1875 ; SSE41-NEXT:    psubq %xmm5, %xmm1
1876 ; SSE41-NEXT:    movdqa %xmm1, %xmm4
1877 ; SSE41-NEXT:    pxor %xmm10, %xmm4
1878 ; SSE41-NEXT:    movdqa %xmm0, %xmm9
1879 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm9
1880 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm0
1881 ; SSE41-NEXT:    pshufd {{.*#+}} xmm13 = xmm0[0,0,2,2]
1882 ; SSE41-NEXT:    pand %xmm9, %xmm13
1883 ; SSE41-NEXT:    por %xmm0, %xmm13
1884 ; SSE41-NEXT:    pxor %xmm10, %xmm5
1885 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
1886 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
1887 ; SSE41-NEXT:    pcmpgtd %xmm10, %xmm5
1888 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[0,0,2,2]
1889 ; SSE41-NEXT:    pand %xmm0, %xmm4
1890 ; SSE41-NEXT:    por %xmm5, %xmm4
1891 ; SSE41-NEXT:    pxor %xmm13, %xmm4
1892 ; SSE41-NEXT:    movapd %xmm11, %xmm5
1893 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1894 ; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm5
1895 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1896 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
1897 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1898 ; SSE41-NEXT:    pxor %xmm10, %xmm0
1899 ; SSE41-NEXT:    psubq %xmm6, %xmm2
1900 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
1901 ; SSE41-NEXT:    pxor %xmm10, %xmm4
1902 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
1903 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm5
1904 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm0
1905 ; SSE41-NEXT:    pshufd {{.*#+}} xmm9 = xmm0[0,0,2,2]
1906 ; SSE41-NEXT:    pand %xmm5, %xmm9
1907 ; SSE41-NEXT:    por %xmm0, %xmm9
1908 ; SSE41-NEXT:    pxor %xmm10, %xmm6
1909 ; SSE41-NEXT:    movdqa %xmm6, %xmm0
1910 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
1911 ; SSE41-NEXT:    pcmpgtd %xmm10, %xmm6
1912 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
1913 ; SSE41-NEXT:    pand %xmm0, %xmm4
1914 ; SSE41-NEXT:    por %xmm6, %xmm4
1915 ; SSE41-NEXT:    pxor %xmm9, %xmm4
1916 ; SSE41-NEXT:    movapd %xmm11, %xmm5
1917 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1918 ; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm5
1919 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1920 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm2
1921 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
1922 ; SSE41-NEXT:    pxor %xmm10, %xmm0
1923 ; SSE41-NEXT:    psubq %xmm7, %xmm3
1924 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
1925 ; SSE41-NEXT:    pxor %xmm10, %xmm4
1926 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
1927 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm5
1928 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm0
1929 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[0,0,2,2]
1930 ; SSE41-NEXT:    pand %xmm5, %xmm6
1931 ; SSE41-NEXT:    por %xmm0, %xmm6
1932 ; SSE41-NEXT:    pxor %xmm10, %xmm7
1933 ; SSE41-NEXT:    movdqa %xmm7, %xmm0
1934 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
1935 ; SSE41-NEXT:    pcmpgtd %xmm10, %xmm7
1936 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
1937 ; SSE41-NEXT:    pand %xmm0, %xmm4
1938 ; SSE41-NEXT:    por %xmm7, %xmm4
1939 ; SSE41-NEXT:    pxor %xmm6, %xmm4
1940 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
1941 ; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm11
1942 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1943 ; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm3
1944 ; SSE41-NEXT:    movapd %xmm8, %xmm0
1945 ; SSE41-NEXT:    retq
1947 ; AVX1-LABEL: v8i64:
1948 ; AVX1:       # %bb.0:
1949 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
1950 ; AVX1-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1951 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm6
1952 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm2, %xmm7
1953 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm7, %ymm6
1954 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
1955 ; AVX1-NEXT:    vpsubq %xmm5, %xmm7, %xmm5
1956 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm7, %xmm7
1957 ; AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm2
1958 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm0
1959 ; AVX1-NEXT:    vinsertf128 $1, %xmm7, %ymm0, %ymm0
1960 ; AVX1-NEXT:    vxorpd %ymm0, %ymm6, %ymm0
1961 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm2, %ymm6
1962 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm4, %xmm5
1963 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
1964 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm2, %ymm2
1965 ; AVX1-NEXT:    vbroadcastsd {{.*#+}} ymm5 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1966 ; AVX1-NEXT:    vxorpd %ymm5, %ymm2, %ymm2
1967 ; AVX1-NEXT:    vblendvpd %ymm0, %ymm2, %ymm6, %ymm0
1968 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
1969 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm2, %xmm6
1970 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm3, %xmm7
1971 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm7, %ymm6
1972 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
1973 ; AVX1-NEXT:    vpsubq %xmm2, %xmm7, %xmm2
1974 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm7, %xmm7
1975 ; AVX1-NEXT:    vpsubq %xmm3, %xmm1, %xmm3
1976 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm1, %xmm1
1977 ; AVX1-NEXT:    vinsertf128 $1, %xmm7, %ymm1, %ymm1
1978 ; AVX1-NEXT:    vxorpd %ymm1, %ymm6, %ymm1
1979 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm6
1980 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
1981 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
1982 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
1983 ; AVX1-NEXT:    vxorpd %ymm5, %ymm2, %ymm2
1984 ; AVX1-NEXT:    vblendvpd %ymm1, %ymm2, %ymm6, %ymm1
1985 ; AVX1-NEXT:    retq
1987 ; AVX2-LABEL: v8i64:
1988 ; AVX2:       # %bb.0:
1989 ; AVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1990 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm2, %ymm5
1991 ; AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm2
1992 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm0
1993 ; AVX2-NEXT:    vpxor %ymm0, %ymm5, %ymm0
1994 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm4, %ymm5
1995 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm6 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1996 ; AVX2-NEXT:    vpxor %ymm6, %ymm5, %ymm5
1997 ; AVX2-NEXT:    vblendvpd %ymm0, %ymm5, %ymm2, %ymm0
1998 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm3, %ymm2
1999 ; AVX2-NEXT:    vpsubq %ymm3, %ymm1, %ymm3
2000 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm1, %ymm1
2001 ; AVX2-NEXT:    vpxor %ymm1, %ymm2, %ymm1
2002 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm4, %ymm2
2003 ; AVX2-NEXT:    vpxor %ymm6, %ymm2, %ymm2
2004 ; AVX2-NEXT:    vblendvpd %ymm1, %ymm2, %ymm3, %ymm1
2005 ; AVX2-NEXT:    retq
2007 ; AVX512-LABEL: v8i64:
2008 ; AVX512:       # %bb.0:
2009 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2010 ; AVX512-NEXT:    vpcmpgtq %zmm2, %zmm1, %k0
2011 ; AVX512-NEXT:    vpsubq %zmm1, %zmm0, %zmm1
2012 ; AVX512-NEXT:    vpcmpgtq %zmm1, %zmm0, %k1
2013 ; AVX512-NEXT:    kxorw %k1, %k0, %k1
2014 ; AVX512-NEXT:    vpsraq $63, %zmm1, %zmm0
2015 ; AVX512-NEXT:    vpxorq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm1 {%k1}
2016 ; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm0
2017 ; AVX512-NEXT:    retq
2018   %z = call <8 x i64> @llvm.ssub.sat.v8i64(<8 x i64> %x, <8 x i64> %y)
2019   ret <8 x i64> %z
2022 define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind {
2023 ; SSE-LABEL: v2i128:
2024 ; SSE:       # %bb.0:
2025 ; SSE-NEXT:    movq %rdi, %rax
2026 ; SSE-NEXT:    subq {{[0-9]+}}(%rsp), %rcx
2027 ; SSE-NEXT:    sbbq {{[0-9]+}}(%rsp), %r8
2028 ; SSE-NEXT:    seto %dil
2029 ; SSE-NEXT:    movq %r8, %r9
2030 ; SSE-NEXT:    sarq $63, %r9
2031 ; SSE-NEXT:    testb %dil, %dil
2032 ; SSE-NEXT:    cmovneq %r9, %rcx
2033 ; SSE-NEXT:    movabsq $-9223372036854775808, %r10 # imm = 0x8000000000000000
2034 ; SSE-NEXT:    xorq %r10, %r9
2035 ; SSE-NEXT:    testb %dil, %dil
2036 ; SSE-NEXT:    cmoveq %r8, %r9
2037 ; SSE-NEXT:    subq {{[0-9]+}}(%rsp), %rsi
2038 ; SSE-NEXT:    sbbq {{[0-9]+}}(%rsp), %rdx
2039 ; SSE-NEXT:    seto %dil
2040 ; SSE-NEXT:    movq %rdx, %r8
2041 ; SSE-NEXT:    sarq $63, %r8
2042 ; SSE-NEXT:    testb %dil, %dil
2043 ; SSE-NEXT:    cmovneq %r8, %rsi
2044 ; SSE-NEXT:    xorq %r10, %r8
2045 ; SSE-NEXT:    testb %dil, %dil
2046 ; SSE-NEXT:    cmoveq %rdx, %r8
2047 ; SSE-NEXT:    movq %rcx, 16(%rax)
2048 ; SSE-NEXT:    movq %rsi, (%rax)
2049 ; SSE-NEXT:    movq %r9, 24(%rax)
2050 ; SSE-NEXT:    movq %r8, 8(%rax)
2051 ; SSE-NEXT:    retq
2053 ; AVX-LABEL: v2i128:
2054 ; AVX:       # %bb.0:
2055 ; AVX-NEXT:    movq %rdi, %rax
2056 ; AVX-NEXT:    subq {{[0-9]+}}(%rsp), %rcx
2057 ; AVX-NEXT:    sbbq {{[0-9]+}}(%rsp), %r8
2058 ; AVX-NEXT:    seto %dil
2059 ; AVX-NEXT:    movq %r8, %r9
2060 ; AVX-NEXT:    sarq $63, %r9
2061 ; AVX-NEXT:    testb %dil, %dil
2062 ; AVX-NEXT:    cmovneq %r9, %rcx
2063 ; AVX-NEXT:    movabsq $-9223372036854775808, %r10 # imm = 0x8000000000000000
2064 ; AVX-NEXT:    xorq %r10, %r9
2065 ; AVX-NEXT:    testb %dil, %dil
2066 ; AVX-NEXT:    cmoveq %r8, %r9
2067 ; AVX-NEXT:    subq {{[0-9]+}}(%rsp), %rsi
2068 ; AVX-NEXT:    sbbq {{[0-9]+}}(%rsp), %rdx
2069 ; AVX-NEXT:    seto %dil
2070 ; AVX-NEXT:    movq %rdx, %r8
2071 ; AVX-NEXT:    sarq $63, %r8
2072 ; AVX-NEXT:    testb %dil, %dil
2073 ; AVX-NEXT:    cmovneq %r8, %rsi
2074 ; AVX-NEXT:    xorq %r10, %r8
2075 ; AVX-NEXT:    testb %dil, %dil
2076 ; AVX-NEXT:    cmoveq %rdx, %r8
2077 ; AVX-NEXT:    movq %rcx, 16(%rax)
2078 ; AVX-NEXT:    movq %rsi, (%rax)
2079 ; AVX-NEXT:    movq %r9, 24(%rax)
2080 ; AVX-NEXT:    movq %r8, 8(%rax)
2081 ; AVX-NEXT:    retq
2082   %z = call <2 x i128> @llvm.ssub.sat.v2i128(<2 x i128> %x, <2 x i128> %y)
2083   ret <2 x i128> %z