Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / X86 / ssub_sat_vec.ll
blob5ba7b173c51cd42dbf335520fe408910df51483c
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.ssub.sat.v1i8(<1 x i8>, <1 x i8>)
10 declare <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8>, <2 x i8>)
11 declare <4 x i8> @llvm.ssub.sat.v4i8(<4 x i8>, <4 x i8>)
12 declare <8 x i8> @llvm.ssub.sat.v8i8(<8 x i8>, <8 x i8>)
13 declare <12 x i8> @llvm.ssub.sat.v12i8(<12 x i8>, <12 x i8>)
14 declare <16 x i8> @llvm.ssub.sat.v16i8(<16 x i8>, <16 x i8>)
15 declare <32 x i8> @llvm.ssub.sat.v32i8(<32 x i8>, <32 x i8>)
16 declare <64 x i8> @llvm.ssub.sat.v64i8(<64 x i8>, <64 x i8>)
18 declare <1 x i16> @llvm.ssub.sat.v1i16(<1 x i16>, <1 x i16>)
19 declare <2 x i16> @llvm.ssub.sat.v2i16(<2 x i16>, <2 x i16>)
20 declare <4 x i16> @llvm.ssub.sat.v4i16(<4 x i16>, <4 x i16>)
21 declare <8 x i16> @llvm.ssub.sat.v8i16(<8 x i16>, <8 x i16>)
22 declare <12 x i16> @llvm.ssub.sat.v12i16(<12 x i16>, <12 x i16>)
23 declare <16 x i16> @llvm.ssub.sat.v16i16(<16 x i16>, <16 x i16>)
24 declare <32 x i16> @llvm.ssub.sat.v32i16(<32 x i16>, <32 x i16>)
26 declare <16 x i1> @llvm.ssub.sat.v16i1(<16 x i1>, <16 x i1>)
27 declare <16 x i4> @llvm.ssub.sat.v16i4(<16 x i4>, <16 x i4>)
29 declare <2 x i32> @llvm.ssub.sat.v2i32(<2 x i32>, <2 x i32>)
30 declare <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32>, <4 x i32>)
31 declare <8 x i32> @llvm.ssub.sat.v8i32(<8 x i32>, <8 x i32>)
32 declare <16 x i32> @llvm.ssub.sat.v16i32(<16 x i32>, <16 x i32>)
33 declare <2 x i64> @llvm.ssub.sat.v2i64(<2 x i64>, <2 x i64>)
34 declare <4 x i64> @llvm.ssub.sat.v4i64(<4 x i64>, <4 x i64>)
35 declare <8 x i64> @llvm.ssub.sat.v8i64(<8 x i64>, <8 x i64>)
37 declare <4 x i24> @llvm.ssub.sat.v4i24(<4 x i24>, <4 x i24>)
38 declare <2 x i128> @llvm.ssub.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:    psubsb %xmm1, %xmm0
46 ; SSE-NEXT:    retq
48 ; AVX-LABEL: v16i8:
49 ; AVX:       # %bb.0:
50 ; AVX-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
51 ; AVX-NEXT:    retq
52   %z = call <16 x i8> @llvm.ssub.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:    psubsb %xmm2, %xmm0
60 ; SSE-NEXT:    psubsb %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:    vpsubsb %xmm2, %xmm3, %xmm2
68 ; AVX1-NEXT:    vpsubsb %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:    vpsubsb %ymm1, %ymm0, %ymm0
75 ; AVX2-NEXT:    retq
77 ; AVX512-LABEL: v32i8:
78 ; AVX512:       # %bb.0:
79 ; AVX512-NEXT:    vpsubsb %ymm1, %ymm0, %ymm0
80 ; AVX512-NEXT:    retq
81   %z = call <32 x i8> @llvm.ssub.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:    psubsb %xmm4, %xmm0
89 ; SSE-NEXT:    psubsb %xmm5, %xmm1
90 ; SSE-NEXT:    psubsb %xmm6, %xmm2
91 ; SSE-NEXT:    psubsb %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:    vpsubsb %xmm4, %xmm5, %xmm4
99 ; AVX1-NEXT:    vpsubsb %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:    vpsubsb %xmm2, %xmm4, %xmm2
104 ; AVX1-NEXT:    vpsubsb %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:    vpsubsb %ymm2, %ymm0, %ymm0
111 ; AVX2-NEXT:    vpsubsb %ymm3, %ymm1, %ymm1
112 ; AVX2-NEXT:    retq
114 ; AVX512-LABEL: v64i8:
115 ; AVX512:       # %bb.0:
116 ; AVX512-NEXT:    vpsubsb %zmm1, %zmm0, %zmm0
117 ; AVX512-NEXT:    retq
118   %z = call <64 x i8> @llvm.ssub.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:    psubsw %xmm1, %xmm0
126 ; SSE-NEXT:    retq
128 ; AVX-LABEL: v8i16:
129 ; AVX:       # %bb.0:
130 ; AVX-NEXT:    vpsubsw %xmm1, %xmm0, %xmm0
131 ; AVX-NEXT:    retq
132   %z = call <8 x i16> @llvm.ssub.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:    psubsw %xmm2, %xmm0
140 ; SSE-NEXT:    psubsw %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:    vpsubsw %xmm2, %xmm3, %xmm2
148 ; AVX1-NEXT:    vpsubsw %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:    vpsubsw %ymm1, %ymm0, %ymm0
155 ; AVX2-NEXT:    retq
157 ; AVX512-LABEL: v16i16:
158 ; AVX512:       # %bb.0:
159 ; AVX512-NEXT:    vpsubsw %ymm1, %ymm0, %ymm0
160 ; AVX512-NEXT:    retq
161   %z = call <16 x i16> @llvm.ssub.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:    psubsw %xmm4, %xmm0
169 ; SSE-NEXT:    psubsw %xmm5, %xmm1
170 ; SSE-NEXT:    psubsw %xmm6, %xmm2
171 ; SSE-NEXT:    psubsw %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:    vpsubsw %xmm4, %xmm5, %xmm4
179 ; AVX1-NEXT:    vpsubsw %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:    vpsubsw %xmm2, %xmm4, %xmm2
184 ; AVX1-NEXT:    vpsubsw %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:    vpsubsw %ymm2, %ymm0, %ymm0
191 ; AVX2-NEXT:    vpsubsw %ymm3, %ymm1, %ymm1
192 ; AVX2-NEXT:    retq
194 ; AVX512-LABEL: v32i16:
195 ; AVX512:       # %bb.0:
196 ; AVX512-NEXT:    vpsubsw %zmm1, %zmm0, %zmm0
197 ; AVX512-NEXT:    retq
198   %z = call <32 x i16> @llvm.ssub.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:    psubsb %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:    vpsubsb %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:    vpsubsb %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:    vpsubsb %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.ssub.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:    psubsb %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:    vpsubsb %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:    vpsubsb %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:    vpsubsb %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.ssub.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:    psubsb %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:    psubsb %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:    psubsb %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:    vpsubsb %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:    vpsubsb %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:    vpsubsb %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.ssub.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:    psubsw %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:    vpsubsw %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:    vpsubsw %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:    vpsubsw %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.ssub.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:    psubsw %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:    vpsubsw %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:    vpsubsw %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:    vpsubsw %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.ssub.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:    psubsb %xmm1, %xmm0
438 ; SSE-NEXT:    retq
440 ; AVX-LABEL: v12i8:
441 ; AVX:       # %bb.0:
442 ; AVX-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
443 ; AVX-NEXT:    retq
444   %z = call <12 x i8> @llvm.ssub.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:    psubsw (%rsi), %xmm0
454 ; SSE-NEXT:    psubsw 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:    vpsubsw (%rsi), %xmm0, %xmm0
464 ; AVX1-NEXT:    vpsubsw 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:    vpsubsw (%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:    vpsubsw (%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.ssub.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), %cl
501 ; SSE-NEXT:    movb (%rsi), %dil
502 ; SSE-NEXT:    movl %ecx, %eax
503 ; SSE-NEXT:    subb %dil, %al
504 ; SSE-NEXT:    setns %sil
505 ; SSE-NEXT:    subb %dil, %cl
506 ; SSE-NEXT:    jno .LBB13_2
507 ; SSE-NEXT:  # %bb.1:
508 ; SSE-NEXT:    addb $127, %sil
509 ; SSE-NEXT:    movl %esi, %ecx
510 ; SSE-NEXT:  .LBB13_2:
511 ; SSE-NEXT:    movb %cl, (%rdx)
512 ; SSE-NEXT:    retq
514 ; AVX-LABEL: v1i8:
515 ; AVX:       # %bb.0:
516 ; AVX-NEXT:    movb (%rdi), %cl
517 ; AVX-NEXT:    movb (%rsi), %dil
518 ; AVX-NEXT:    movl %ecx, %eax
519 ; AVX-NEXT:    subb %dil, %al
520 ; AVX-NEXT:    setns %sil
521 ; AVX-NEXT:    subb %dil, %cl
522 ; AVX-NEXT:    jno .LBB13_2
523 ; AVX-NEXT:  # %bb.1:
524 ; AVX-NEXT:    addb $127, %sil
525 ; AVX-NEXT:    movl %esi, %ecx
526 ; AVX-NEXT:  .LBB13_2:
527 ; AVX-NEXT:    movb %cl, (%rdx)
528 ; AVX-NEXT:    retq
529   %x = load <1 x i8>, <1 x i8>* %px
530   %y = load <1 x i8>, <1 x i8>* %py
531   %z = call <1 x i8> @llvm.ssub.sat.v1i8(<1 x i8> %x, <1 x i8> %y)
532   store <1 x i8> %z, <1 x i8>* %pz
533   ret void
536 define void @v1i16(<1 x i16>* %px, <1 x i16>* %py, <1 x i16>* %pz) nounwind {
537 ; SSE-LABEL: v1i16:
538 ; SSE:       # %bb.0:
539 ; SSE-NEXT:    movzwl (%rdi), %eax
540 ; SSE-NEXT:    movzwl (%rsi), %ecx
541 ; SSE-NEXT:    xorl %esi, %esi
542 ; SSE-NEXT:    movl %eax, %edi
543 ; SSE-NEXT:    subw %cx, %di
544 ; SSE-NEXT:    setns %sil
545 ; SSE-NEXT:    addl $32767, %esi # imm = 0x7FFF
546 ; SSE-NEXT:    subw %cx, %ax
547 ; SSE-NEXT:    cmovol %esi, %eax
548 ; SSE-NEXT:    movw %ax, (%rdx)
549 ; SSE-NEXT:    retq
551 ; AVX-LABEL: v1i16:
552 ; AVX:       # %bb.0:
553 ; AVX-NEXT:    movzwl (%rdi), %eax
554 ; AVX-NEXT:    movzwl (%rsi), %ecx
555 ; AVX-NEXT:    xorl %esi, %esi
556 ; AVX-NEXT:    movl %eax, %edi
557 ; AVX-NEXT:    subw %cx, %di
558 ; AVX-NEXT:    setns %sil
559 ; AVX-NEXT:    addl $32767, %esi # imm = 0x7FFF
560 ; AVX-NEXT:    subw %cx, %ax
561 ; AVX-NEXT:    cmovol %esi, %eax
562 ; AVX-NEXT:    movw %ax, (%rdx)
563 ; AVX-NEXT:    retq
564   %x = load <1 x i16>, <1 x i16>* %px
565   %y = load <1 x i16>, <1 x i16>* %py
566   %z = call <1 x i16> @llvm.ssub.sat.v1i16(<1 x i16> %x, <1 x i16> %y)
567   store <1 x i16> %z, <1 x i16>* %pz
568   ret void
571 ; Promotion
573 define <16 x i4> @v16i4(<16 x i4> %x, <16 x i4> %y) nounwind {
574 ; SSE-LABEL: v16i4:
575 ; SSE:       # %bb.0:
576 ; SSE-NEXT:    psllw $4, %xmm1
577 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
578 ; SSE-NEXT:    pand %xmm2, %xmm1
579 ; SSE-NEXT:    psllw $4, %xmm0
580 ; SSE-NEXT:    pand %xmm2, %xmm0
581 ; SSE-NEXT:    psubsb %xmm1, %xmm0
582 ; SSE-NEXT:    psrlw $4, %xmm0
583 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
584 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
585 ; SSE-NEXT:    pxor %xmm1, %xmm0
586 ; SSE-NEXT:    psubb %xmm1, %xmm0
587 ; SSE-NEXT:    retq
589 ; AVX-LABEL: v16i4:
590 ; AVX:       # %bb.0:
591 ; AVX-NEXT:    vpsllw $4, %xmm1, %xmm1
592 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
593 ; AVX-NEXT:    vpand %xmm2, %xmm1, %xmm1
594 ; AVX-NEXT:    vpsllw $4, %xmm0, %xmm0
595 ; AVX-NEXT:    vpand %xmm2, %xmm0, %xmm0
596 ; AVX-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
597 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
598 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
599 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
600 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
601 ; AVX-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
602 ; AVX-NEXT:    retq
603   %z = call <16 x i4> @llvm.ssub.sat.v16i4(<16 x i4> %x, <16 x i4> %y)
604   ret <16 x i4> %z
607 define <16 x i1> @v16i1(<16 x i1> %x, <16 x i1> %y) nounwind {
608 ; SSE-LABEL: v16i1:
609 ; SSE:       # %bb.0:
610 ; SSE-NEXT:    psllw $7, %xmm1
611 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
612 ; SSE-NEXT:    pand %xmm2, %xmm1
613 ; SSE-NEXT:    psllw $7, %xmm0
614 ; SSE-NEXT:    pand %xmm2, %xmm0
615 ; SSE-NEXT:    psubsb %xmm1, %xmm0
616 ; SSE-NEXT:    pxor %xmm1, %xmm1
617 ; SSE-NEXT:    pcmpgtb %xmm0, %xmm1
618 ; SSE-NEXT:    movdqa %xmm1, %xmm0
619 ; SSE-NEXT:    retq
621 ; AVX1-LABEL: v16i1:
622 ; AVX1:       # %bb.0:
623 ; AVX1-NEXT:    vpsllw $7, %xmm1, %xmm1
624 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
625 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
626 ; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
627 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
628 ; AVX1-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
629 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
630 ; AVX1-NEXT:    vpcmpgtb %xmm0, %xmm1, %xmm0
631 ; AVX1-NEXT:    retq
633 ; AVX2-LABEL: v16i1:
634 ; AVX2:       # %bb.0:
635 ; AVX2-NEXT:    vpsllw $7, %xmm1, %xmm1
636 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
637 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
638 ; AVX2-NEXT:    vpsllw $7, %xmm0, %xmm0
639 ; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
640 ; AVX2-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
641 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
642 ; AVX2-NEXT:    vpcmpgtb %xmm0, %xmm1, %xmm0
643 ; AVX2-NEXT:    retq
645 ; AVX512-LABEL: v16i1:
646 ; AVX512:       # %bb.0:
647 ; AVX512-NEXT:    vpsllw $7, %xmm0, %xmm0
648 ; AVX512-NEXT:    vpmovb2m %xmm0, %k0
649 ; AVX512-NEXT:    vpsllw $7, %xmm1, %xmm0
650 ; AVX512-NEXT:    vpmovb2m %xmm0, %k1
651 ; AVX512-NEXT:    kandnw %k0, %k1, %k0
652 ; AVX512-NEXT:    vpmovm2b %k0, %xmm0
653 ; AVX512-NEXT:    retq
654   %z = call <16 x i1> @llvm.ssub.sat.v16i1(<16 x i1> %x, <16 x i1> %y)
655   ret <16 x i1> %z
658 ; Expanded
660 define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {
661 ; SSE2-LABEL: v2i32:
662 ; SSE2:       # %bb.0:
663 ; SSE2-NEXT:    psllq $32, %xmm1
664 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
665 ; SSE2-NEXT:    psllq $32, %xmm0
666 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
667 ; SSE2-NEXT:    psubq %xmm1, %xmm0
668 ; SSE2-NEXT:    pxor %xmm2, %xmm1
669 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
670 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
671 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
672 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm1
673 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
674 ; SSE2-NEXT:    pand %xmm5, %xmm1
675 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
676 ; SSE2-NEXT:    por %xmm1, %xmm4
677 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm5
678 ; SSE2-NEXT:    pxor %xmm5, %xmm4
679 ; SSE2-NEXT:    pxor %xmm2, %xmm3
680 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
681 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm1
682 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
683 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
684 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
685 ; SSE2-NEXT:    pand %xmm6, %xmm3
686 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
687 ; SSE2-NEXT:    por %xmm3, %xmm6
688 ; SSE2-NEXT:    pxor %xmm5, %xmm6
689 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm4
690 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,0,3,2]
691 ; SSE2-NEXT:    pand %xmm4, %xmm1
692 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
693 ; SSE2-NEXT:    pxor %xmm2, %xmm3
694 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
695 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
696 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
697 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
698 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
699 ; SSE2-NEXT:    pand %xmm7, %xmm3
700 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
701 ; SSE2-NEXT:    por %xmm3, %xmm4
702 ; SSE2-NEXT:    pxor %xmm5, %xmm4
703 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm4
704 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,0,3,2]
705 ; SSE2-NEXT:    pand %xmm4, %xmm3
706 ; SSE2-NEXT:    pxor %xmm5, %xmm3
707 ; SSE2-NEXT:    pandn %xmm3, %xmm1
708 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
709 ; SSE2-NEXT:    pandn %xmm0, %xmm3
710 ; SSE2-NEXT:    por %xmm2, %xmm0
711 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
712 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
713 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
714 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm0
715 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
716 ; SSE2-NEXT:    pand %xmm5, %xmm0
717 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
718 ; SSE2-NEXT:    por %xmm0, %xmm2
719 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
720 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm0
721 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
722 ; SSE2-NEXT:    por %xmm0, %xmm2
723 ; SSE2-NEXT:    pand %xmm1, %xmm2
724 ; SSE2-NEXT:    por %xmm3, %xmm2
725 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,3,2,3]
726 ; SSE2-NEXT:    psrad $31, %xmm2
727 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3]
728 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
729 ; SSE2-NEXT:    retq
731 ; SSSE3-LABEL: v2i32:
732 ; SSSE3:       # %bb.0:
733 ; SSSE3-NEXT:    psllq $32, %xmm1
734 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
735 ; SSSE3-NEXT:    psllq $32, %xmm0
736 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
737 ; SSSE3-NEXT:    psubq %xmm1, %xmm0
738 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
739 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
740 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
741 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
742 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm1
743 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
744 ; SSSE3-NEXT:    pand %xmm5, %xmm1
745 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
746 ; SSSE3-NEXT:    por %xmm1, %xmm4
747 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm5
748 ; SSSE3-NEXT:    pxor %xmm5, %xmm4
749 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
750 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
751 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm1
752 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
753 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm3
754 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
755 ; SSSE3-NEXT:    pand %xmm6, %xmm3
756 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
757 ; SSSE3-NEXT:    por %xmm3, %xmm6
758 ; SSSE3-NEXT:    pxor %xmm5, %xmm6
759 ; SSSE3-NEXT:    pcmpeqd %xmm6, %xmm4
760 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,0,3,2]
761 ; SSSE3-NEXT:    pand %xmm4, %xmm1
762 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
763 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
764 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
765 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
766 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
767 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm3
768 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
769 ; SSSE3-NEXT:    pand %xmm7, %xmm3
770 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
771 ; SSSE3-NEXT:    por %xmm3, %xmm4
772 ; SSSE3-NEXT:    pxor %xmm5, %xmm4
773 ; SSSE3-NEXT:    pcmpeqd %xmm6, %xmm4
774 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,0,3,2]
775 ; SSSE3-NEXT:    pand %xmm4, %xmm3
776 ; SSSE3-NEXT:    pxor %xmm5, %xmm3
777 ; SSSE3-NEXT:    pandn %xmm3, %xmm1
778 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
779 ; SSSE3-NEXT:    pandn %xmm0, %xmm3
780 ; SSSE3-NEXT:    por %xmm2, %xmm0
781 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
782 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm4
783 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
784 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm0
785 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
786 ; SSSE3-NEXT:    pand %xmm5, %xmm0
787 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
788 ; SSSE3-NEXT:    por %xmm0, %xmm2
789 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
790 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm0
791 ; SSSE3-NEXT:    pand {{.*}}(%rip), %xmm2
792 ; SSSE3-NEXT:    por %xmm0, %xmm2
793 ; SSSE3-NEXT:    pand %xmm1, %xmm2
794 ; SSSE3-NEXT:    por %xmm3, %xmm2
795 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,3,2,3]
796 ; SSSE3-NEXT:    psrad $31, %xmm2
797 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3]
798 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
799 ; SSSE3-NEXT:    retq
801 ; SSE41-LABEL: v2i32:
802 ; SSE41:       # %bb.0:
803 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
804 ; SSE41-NEXT:    psllq $32, %xmm1
805 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
806 ; SSE41-NEXT:    psllq $32, %xmm2
807 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
808 ; SSE41-NEXT:    psubq %xmm1, %xmm2
809 ; SSE41-NEXT:    pxor %xmm0, %xmm1
810 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
811 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm4
812 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
813 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
814 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
815 ; SSE41-NEXT:    pand %xmm5, %xmm6
816 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
817 ; SSE41-NEXT:    por %xmm6, %xmm1
818 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm4
819 ; SSE41-NEXT:    pxor %xmm4, %xmm1
820 ; SSE41-NEXT:    pxor %xmm0, %xmm3
821 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
822 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm5
823 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
824 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
825 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
826 ; SSE41-NEXT:    pand %xmm6, %xmm3
827 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
828 ; SSE41-NEXT:    por %xmm3, %xmm5
829 ; SSE41-NEXT:    pxor %xmm4, %xmm5
830 ; SSE41-NEXT:    pcmpeqq %xmm5, %xmm1
831 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
832 ; SSE41-NEXT:    pxor %xmm0, %xmm3
833 ; SSE41-NEXT:    movdqa %xmm0, %xmm6
834 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm6
835 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
836 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
837 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
838 ; SSE41-NEXT:    pand %xmm7, %xmm3
839 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
840 ; SSE41-NEXT:    por %xmm3, %xmm6
841 ; SSE41-NEXT:    pxor %xmm4, %xmm6
842 ; SSE41-NEXT:    pcmpeqq %xmm5, %xmm6
843 ; SSE41-NEXT:    pxor %xmm4, %xmm6
844 ; SSE41-NEXT:    pandn %xmm6, %xmm1
845 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
846 ; SSE41-NEXT:    por %xmm0, %xmm3
847 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
848 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm4
849 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
850 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
851 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
852 ; SSE41-NEXT:    pand %xmm5, %xmm0
853 ; SSE41-NEXT:    por %xmm4, %xmm0
854 ; SSE41-NEXT:    movapd {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
855 ; SSE41-NEXT:    blendvpd %xmm0, {{.*}}(%rip), %xmm3
856 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
857 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
858 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
859 ; SSE41-NEXT:    psrad $31, %xmm2
860 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
861 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
862 ; SSE41-NEXT:    retq
864 ; AVX1-LABEL: v2i32:
865 ; AVX1:       # %bb.0:
866 ; AVX1-NEXT:    vpsllq $32, %xmm1, %xmm1
867 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
868 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm3
869 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
870 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
871 ; AVX1-NEXT:    vpsllq $32, %xmm0, %xmm0
872 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm5
873 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm5
874 ; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm5, %xmm3
875 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
876 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm1
877 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm1
878 ; AVX1-NEXT:    vpcmpeqq %xmm1, %xmm5, %xmm1
879 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm1
880 ; AVX1-NEXT:    vpandn %xmm1, %xmm3, %xmm1
881 ; AVX1-NEXT:    vmovapd {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
882 ; AVX1-NEXT:    vblendvpd %xmm0, {{.*}}(%rip), %xmm2, %xmm2
883 ; AVX1-NEXT:    vblendvpd %xmm1, %xmm2, %xmm0, %xmm0
884 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm1
885 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
886 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
887 ; AVX1-NEXT:    retq
889 ; AVX2-LABEL: v2i32:
890 ; AVX2:       # %bb.0:
891 ; AVX2-NEXT:    vpsllq $32, %xmm1, %xmm1
892 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
893 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm3
894 ; AVX2-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
895 ; AVX2-NEXT:    vpxor %xmm4, %xmm3, %xmm3
896 ; AVX2-NEXT:    vpsllq $32, %xmm0, %xmm0
897 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm5
898 ; AVX2-NEXT:    vpxor %xmm4, %xmm5, %xmm5
899 ; AVX2-NEXT:    vpcmpeqq %xmm3, %xmm5, %xmm3
900 ; AVX2-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
901 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm1
902 ; AVX2-NEXT:    vpxor %xmm4, %xmm1, %xmm1
903 ; AVX2-NEXT:    vpcmpeqq %xmm1, %xmm5, %xmm1
904 ; AVX2-NEXT:    vpxor %xmm4, %xmm1, %xmm1
905 ; AVX2-NEXT:    vpandn %xmm1, %xmm3, %xmm1
906 ; AVX2-NEXT:    vmovapd {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
907 ; AVX2-NEXT:    vblendvpd %xmm0, {{.*}}(%rip), %xmm2, %xmm2
908 ; AVX2-NEXT:    vblendvpd %xmm1, %xmm2, %xmm0, %xmm0
909 ; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm1
910 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
911 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
912 ; AVX2-NEXT:    retq
914 ; AVX512-LABEL: v2i32:
915 ; AVX512:       # %bb.0:
916 ; AVX512-NEXT:    vpsllq $32, %xmm1, %xmm1
917 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
918 ; AVX512-NEXT:    vpcmpnltq %xmm2, %xmm1, %k0
919 ; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
920 ; AVX512-NEXT:    vpcmpnltq %xmm2, %xmm0, %k1
921 ; AVX512-NEXT:    kxorw %k0, %k1, %k0
922 ; AVX512-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
923 ; AVX512-NEXT:    vpcmpnltq %xmm2, %xmm0, %k2
924 ; AVX512-NEXT:    kxorw %k2, %k1, %k1
925 ; AVX512-NEXT:    kandw %k1, %k0, %k1
926 ; AVX512-NEXT:    vpcmpgtq %xmm0, %xmm2, %k2
927 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
928 ; AVX512-NEXT:    vmovdqa64 {{.*}}(%rip), %xmm1 {%k2}
929 ; AVX512-NEXT:    vmovdqa64 %xmm1, %xmm0 {%k1}
930 ; AVX512-NEXT:    vpsraq $32, %xmm0, %xmm0
931 ; AVX512-NEXT:    retq
932   %z = call <2 x i32> @llvm.ssub.sat.v2i32(<2 x i32> %x, <2 x i32> %y)
933   ret <2 x i32> %z
936 define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {
937 ; SSE2-LABEL: v4i32:
938 ; SSE2:       # %bb.0:
939 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
940 ; SSE2-NEXT:    pxor %xmm3, %xmm3
941 ; SSE2-NEXT:    pxor %xmm0, %xmm0
942 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm0
943 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
944 ; SSE2-NEXT:    pxor %xmm4, %xmm0
945 ; SSE2-NEXT:    pxor %xmm5, %xmm5
946 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
947 ; SSE2-NEXT:    pxor %xmm4, %xmm5
948 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm0
949 ; SSE2-NEXT:    psubd %xmm1, %xmm2
950 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
951 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
952 ; SSE2-NEXT:    pxor %xmm4, %xmm1
953 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm1
954 ; SSE2-NEXT:    pxor %xmm4, %xmm1
955 ; SSE2-NEXT:    pandn %xmm1, %xmm0
956 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
957 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm1
958 ; SSE2-NEXT:    psrld $1, %xmm3
959 ; SSE2-NEXT:    por %xmm1, %xmm3
960 ; SSE2-NEXT:    pand %xmm0, %xmm3
961 ; SSE2-NEXT:    pandn %xmm2, %xmm0
962 ; SSE2-NEXT:    por %xmm3, %xmm0
963 ; SSE2-NEXT:    retq
965 ; SSSE3-LABEL: v4i32:
966 ; SSSE3:       # %bb.0:
967 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
968 ; SSSE3-NEXT:    pxor %xmm3, %xmm3
969 ; SSSE3-NEXT:    pxor %xmm0, %xmm0
970 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0
971 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm4
972 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
973 ; SSSE3-NEXT:    pxor %xmm5, %xmm5
974 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm5
975 ; SSSE3-NEXT:    pxor %xmm4, %xmm5
976 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm0
977 ; SSSE3-NEXT:    psubd %xmm1, %xmm2
978 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
979 ; SSSE3-NEXT:    movdqa %xmm3, %xmm1
980 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
981 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm1
982 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
983 ; SSSE3-NEXT:    pandn %xmm1, %xmm0
984 ; SSSE3-NEXT:    movdqa %xmm3, %xmm1
985 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm1
986 ; SSSE3-NEXT:    psrld $1, %xmm3
987 ; SSSE3-NEXT:    por %xmm1, %xmm3
988 ; SSSE3-NEXT:    pand %xmm0, %xmm3
989 ; SSSE3-NEXT:    pandn %xmm2, %xmm0
990 ; SSSE3-NEXT:    por %xmm3, %xmm0
991 ; SSSE3-NEXT:    retq
993 ; SSE41-LABEL: v4i32:
994 ; SSE41:       # %bb.0:
995 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
996 ; SSE41-NEXT:    pxor %xmm0, %xmm0
997 ; SSE41-NEXT:    pxor %xmm3, %xmm3
998 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm3
999 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm4
1000 ; SSE41-NEXT:    pxor %xmm4, %xmm3
1001 ; SSE41-NEXT:    pxor %xmm5, %xmm5
1002 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm5
1003 ; SSE41-NEXT:    pxor %xmm4, %xmm5
1004 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm3
1005 ; SSE41-NEXT:    psubd %xmm1, %xmm2
1006 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm0
1007 ; SSE41-NEXT:    pxor %xmm4, %xmm0
1008 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm0
1009 ; SSE41-NEXT:    pxor %xmm4, %xmm0
1010 ; SSE41-NEXT:    pandn %xmm0, %xmm3
1011 ; SSE41-NEXT:    movaps {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
1012 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1013 ; SSE41-NEXT:    blendvps %xmm0, {{.*}}(%rip), %xmm1
1014 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
1015 ; SSE41-NEXT:    blendvps %xmm0, %xmm1, %xmm2
1016 ; SSE41-NEXT:    movaps %xmm2, %xmm0
1017 ; SSE41-NEXT:    retq
1019 ; AVX1-LABEL: v4i32:
1020 ; AVX1:       # %bb.0:
1021 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1022 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm2, %xmm3
1023 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
1024 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
1025 ; AVX1-NEXT:    vpcmpgtd %xmm0, %xmm2, %xmm5
1026 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm5
1027 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm5, %xmm3
1028 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
1029 ; AVX1-NEXT:    vpcmpgtd %xmm0, %xmm2, %xmm1
1030 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm1
1031 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm5, %xmm1
1032 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm1
1033 ; AVX1-NEXT:    vpandn %xmm1, %xmm3, %xmm1
1034 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
1035 ; AVX1-NEXT:    vblendvps %xmm0, {{.*}}(%rip), %xmm2, %xmm2
1036 ; AVX1-NEXT:    vblendvps %xmm1, %xmm2, %xmm0, %xmm0
1037 ; AVX1-NEXT:    retq
1039 ; AVX2-LABEL: v4i32:
1040 ; AVX2:       # %bb.0:
1041 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1042 ; AVX2-NEXT:    vpcmpgtd %xmm1, %xmm2, %xmm3
1043 ; AVX2-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
1044 ; AVX2-NEXT:    vpxor %xmm4, %xmm3, %xmm3
1045 ; AVX2-NEXT:    vpcmpgtd %xmm0, %xmm2, %xmm5
1046 ; AVX2-NEXT:    vpxor %xmm4, %xmm5, %xmm5
1047 ; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm5, %xmm3
1048 ; AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
1049 ; AVX2-NEXT:    vpcmpgtd %xmm0, %xmm2, %xmm1
1050 ; AVX2-NEXT:    vpxor %xmm4, %xmm1, %xmm1
1051 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm5, %xmm1
1052 ; AVX2-NEXT:    vpxor %xmm4, %xmm1, %xmm1
1053 ; AVX2-NEXT:    vpandn %xmm1, %xmm3, %xmm1
1054 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm2 = [2147483647,2147483647,2147483647,2147483647]
1055 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
1056 ; AVX2-NEXT:    vblendvps %xmm0, %xmm2, %xmm3, %xmm2
1057 ; AVX2-NEXT:    vblendvps %xmm1, %xmm2, %xmm0, %xmm0
1058 ; AVX2-NEXT:    retq
1060 ; AVX512-LABEL: v4i32:
1061 ; AVX512:       # %bb.0:
1062 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1063 ; AVX512-NEXT:    vpcmpnltd %xmm2, %xmm1, %k0
1064 ; AVX512-NEXT:    vpcmpnltd %xmm2, %xmm0, %k1
1065 ; AVX512-NEXT:    kxorw %k0, %k1, %k0
1066 ; AVX512-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
1067 ; AVX512-NEXT:    vpcmpnltd %xmm2, %xmm0, %k2
1068 ; AVX512-NEXT:    kxorw %k2, %k1, %k1
1069 ; AVX512-NEXT:    kandw %k1, %k0, %k1
1070 ; AVX512-NEXT:    vpcmpgtd %xmm0, %xmm2, %k2
1071 ; AVX512-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
1072 ; AVX512-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm1 {%k2}
1073 ; AVX512-NEXT:    vmovdqa32 %xmm1, %xmm0 {%k1}
1074 ; AVX512-NEXT:    retq
1075   %z = call <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32> %x, <4 x i32> %y)
1076   ret <4 x i32> %z
1079 define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
1080 ; SSE2-LABEL: v8i32:
1081 ; SSE2:       # %bb.0:
1082 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
1083 ; SSE2-NEXT:    pxor %xmm5, %xmm5
1084 ; SSE2-NEXT:    pxor %xmm0, %xmm0
1085 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
1086 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm8
1087 ; SSE2-NEXT:    pxor %xmm8, %xmm0
1088 ; SSE2-NEXT:    pxor %xmm7, %xmm7
1089 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm7
1090 ; SSE2-NEXT:    pxor %xmm8, %xmm7
1091 ; SSE2-NEXT:    pcmpeqd %xmm7, %xmm0
1092 ; SSE2-NEXT:    psubd %xmm2, %xmm4
1093 ; SSE2-NEXT:    pxor %xmm6, %xmm6
1094 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
1095 ; SSE2-NEXT:    movdqa %xmm6, %xmm2
1096 ; SSE2-NEXT:    pxor %xmm8, %xmm2
1097 ; SSE2-NEXT:    pcmpeqd %xmm7, %xmm2
1098 ; SSE2-NEXT:    pxor %xmm8, %xmm2
1099 ; SSE2-NEXT:    pandn %xmm2, %xmm0
1100 ; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648]
1101 ; SSE2-NEXT:    movdqa %xmm6, %xmm2
1102 ; SSE2-NEXT:    pandn %xmm7, %xmm2
1103 ; SSE2-NEXT:    psrld $1, %xmm6
1104 ; SSE2-NEXT:    por %xmm2, %xmm6
1105 ; SSE2-NEXT:    pand %xmm0, %xmm6
1106 ; SSE2-NEXT:    pandn %xmm4, %xmm0
1107 ; SSE2-NEXT:    por %xmm6, %xmm0
1108 ; SSE2-NEXT:    pxor %xmm2, %xmm2
1109 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
1110 ; SSE2-NEXT:    pxor %xmm8, %xmm2
1111 ; SSE2-NEXT:    pxor %xmm4, %xmm4
1112 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
1113 ; SSE2-NEXT:    pxor %xmm8, %xmm4
1114 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm2
1115 ; SSE2-NEXT:    psubd %xmm3, %xmm1
1116 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm5
1117 ; SSE2-NEXT:    movdqa %xmm5, %xmm3
1118 ; SSE2-NEXT:    pxor %xmm8, %xmm3
1119 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm3
1120 ; SSE2-NEXT:    pxor %xmm8, %xmm3
1121 ; SSE2-NEXT:    pandn %xmm3, %xmm2
1122 ; SSE2-NEXT:    movdqa %xmm5, %xmm3
1123 ; SSE2-NEXT:    pandn %xmm7, %xmm3
1124 ; SSE2-NEXT:    psrld $1, %xmm5
1125 ; SSE2-NEXT:    por %xmm3, %xmm5
1126 ; SSE2-NEXT:    pand %xmm2, %xmm5
1127 ; SSE2-NEXT:    pandn %xmm1, %xmm2
1128 ; SSE2-NEXT:    por %xmm5, %xmm2
1129 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1130 ; SSE2-NEXT:    retq
1132 ; SSSE3-LABEL: v8i32:
1133 ; SSSE3:       # %bb.0:
1134 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
1135 ; SSSE3-NEXT:    pxor %xmm5, %xmm5
1136 ; SSSE3-NEXT:    pxor %xmm0, %xmm0
1137 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm0
1138 ; SSSE3-NEXT:    pcmpeqd %xmm8, %xmm8
1139 ; SSSE3-NEXT:    pxor %xmm8, %xmm0
1140 ; SSSE3-NEXT:    pxor %xmm7, %xmm7
1141 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm7
1142 ; SSSE3-NEXT:    pxor %xmm8, %xmm7
1143 ; SSSE3-NEXT:    pcmpeqd %xmm7, %xmm0
1144 ; SSSE3-NEXT:    psubd %xmm2, %xmm4
1145 ; SSSE3-NEXT:    pxor %xmm6, %xmm6
1146 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
1147 ; SSSE3-NEXT:    movdqa %xmm6, %xmm2
1148 ; SSSE3-NEXT:    pxor %xmm8, %xmm2
1149 ; SSSE3-NEXT:    pcmpeqd %xmm7, %xmm2
1150 ; SSSE3-NEXT:    pxor %xmm8, %xmm2
1151 ; SSSE3-NEXT:    pandn %xmm2, %xmm0
1152 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648]
1153 ; SSSE3-NEXT:    movdqa %xmm6, %xmm2
1154 ; SSSE3-NEXT:    pandn %xmm7, %xmm2
1155 ; SSSE3-NEXT:    psrld $1, %xmm6
1156 ; SSSE3-NEXT:    por %xmm2, %xmm6
1157 ; SSSE3-NEXT:    pand %xmm0, %xmm6
1158 ; SSSE3-NEXT:    pandn %xmm4, %xmm0
1159 ; SSSE3-NEXT:    por %xmm6, %xmm0
1160 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
1161 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2
1162 ; SSSE3-NEXT:    pxor %xmm8, %xmm2
1163 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
1164 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
1165 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
1166 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm2
1167 ; SSSE3-NEXT:    psubd %xmm3, %xmm1
1168 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm5
1169 ; SSSE3-NEXT:    movdqa %xmm5, %xmm3
1170 ; SSSE3-NEXT:    pxor %xmm8, %xmm3
1171 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm3
1172 ; SSSE3-NEXT:    pxor %xmm8, %xmm3
1173 ; SSSE3-NEXT:    pandn %xmm3, %xmm2
1174 ; SSSE3-NEXT:    movdqa %xmm5, %xmm3
1175 ; SSSE3-NEXT:    pandn %xmm7, %xmm3
1176 ; SSSE3-NEXT:    psrld $1, %xmm5
1177 ; SSSE3-NEXT:    por %xmm3, %xmm5
1178 ; SSSE3-NEXT:    pand %xmm2, %xmm5
1179 ; SSSE3-NEXT:    pandn %xmm1, %xmm2
1180 ; SSSE3-NEXT:    por %xmm5, %xmm2
1181 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1182 ; SSSE3-NEXT:    retq
1184 ; SSE41-LABEL: v8i32:
1185 ; SSE41:       # %bb.0:
1186 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
1187 ; SSE41-NEXT:    pxor %xmm6, %xmm6
1188 ; SSE41-NEXT:    pxor %xmm5, %xmm5
1189 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm5
1190 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm8
1191 ; SSE41-NEXT:    pxor %xmm8, %xmm5
1192 ; SSE41-NEXT:    pxor %xmm0, %xmm0
1193 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm0
1194 ; SSE41-NEXT:    pxor %xmm8, %xmm0
1195 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
1196 ; SSE41-NEXT:    psubd %xmm2, %xmm4
1197 ; SSE41-NEXT:    pxor %xmm2, %xmm2
1198 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm2
1199 ; SSE41-NEXT:    pxor %xmm8, %xmm2
1200 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
1201 ; SSE41-NEXT:    pxor %xmm8, %xmm2
1202 ; SSE41-NEXT:    pandn %xmm2, %xmm5
1203 ; SSE41-NEXT:    movaps {{.*#+}} xmm9 = [2147483647,2147483647,2147483647,2147483647]
1204 ; SSE41-NEXT:    movaps {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648]
1205 ; SSE41-NEXT:    movaps %xmm7, %xmm2
1206 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1207 ; SSE41-NEXT:    blendvps %xmm0, %xmm9, %xmm2
1208 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
1209 ; SSE41-NEXT:    blendvps %xmm0, %xmm2, %xmm4
1210 ; SSE41-NEXT:    xorps %xmm2, %xmm2
1211 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm2
1212 ; SSE41-NEXT:    pxor %xmm8, %xmm2
1213 ; SSE41-NEXT:    pxor %xmm0, %xmm0
1214 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm0
1215 ; SSE41-NEXT:    pxor %xmm8, %xmm0
1216 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
1217 ; SSE41-NEXT:    psubd %xmm3, %xmm1
1218 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm6
1219 ; SSE41-NEXT:    pxor %xmm8, %xmm6
1220 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
1221 ; SSE41-NEXT:    pxor %xmm8, %xmm6
1222 ; SSE41-NEXT:    pandn %xmm6, %xmm2
1223 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1224 ; SSE41-NEXT:    blendvps %xmm0, %xmm9, %xmm7
1225 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1226 ; SSE41-NEXT:    blendvps %xmm0, %xmm7, %xmm1
1227 ; SSE41-NEXT:    movaps %xmm4, %xmm0
1228 ; SSE41-NEXT:    retq
1230 ; AVX1-LABEL: v8i32:
1231 ; AVX1:       # %bb.0:
1232 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm9
1233 ; AVX1-NEXT:    vpxor %xmm10, %xmm10, %xmm10
1234 ; AVX1-NEXT:    vpcmpgtd %xmm9, %xmm10, %xmm4
1235 ; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
1236 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
1237 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
1238 ; AVX1-NEXT:    vpcmpgtd %xmm6, %xmm10, %xmm7
1239 ; AVX1-NEXT:    vpxor %xmm5, %xmm7, %xmm7
1240 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm7, %xmm4
1241 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm8
1242 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm10, %xmm4
1243 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
1244 ; AVX1-NEXT:    vpcmpgtd %xmm0, %xmm10, %xmm2
1245 ; AVX1-NEXT:    vpxor %xmm5, %xmm2, %xmm2
1246 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm2, %xmm4
1247 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
1248 ; AVX1-NEXT:    vinsertf128 $1, %xmm8, %ymm4, %ymm8
1249 ; AVX1-NEXT:    vpsubd %xmm9, %xmm6, %xmm6
1250 ; AVX1-NEXT:    vpcmpgtd %xmm6, %xmm10, %xmm4
1251 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm3
1252 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm7, %xmm3
1253 ; AVX1-NEXT:    vpxor %xmm5, %xmm3, %xmm3
1254 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
1255 ; AVX1-NEXT:    vpcmpgtd %xmm0, %xmm10, %xmm1
1256 ; AVX1-NEXT:    vpxor %xmm5, %xmm1, %xmm1
1257 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm2, %xmm1
1258 ; AVX1-NEXT:    vpxor %xmm5, %xmm1, %xmm1
1259 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1260 ; AVX1-NEXT:    vandps %ymm1, %ymm8, %ymm1
1261 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm2
1262 ; AVX1-NEXT:    vmovaps {{.*#+}} ymm3 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1263 ; AVX1-NEXT:    vblendvps %ymm2, {{.*}}(%rip), %ymm3, %ymm2
1264 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm0, %ymm0
1265 ; AVX1-NEXT:    vblendvps %ymm1, %ymm2, %ymm0, %ymm0
1266 ; AVX1-NEXT:    retq
1268 ; AVX2-LABEL: v8i32:
1269 ; AVX2:       # %bb.0:
1270 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1271 ; AVX2-NEXT:    vpcmpgtd %ymm1, %ymm2, %ymm3
1272 ; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4
1273 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm3
1274 ; AVX2-NEXT:    vpcmpgtd %ymm0, %ymm2, %ymm5
1275 ; AVX2-NEXT:    vpxor %ymm4, %ymm5, %ymm5
1276 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm5, %ymm3
1277 ; AVX2-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
1278 ; AVX2-NEXT:    vpcmpgtd %ymm0, %ymm2, %ymm1
1279 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm1
1280 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm5, %ymm1
1281 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm1
1282 ; AVX2-NEXT:    vpandn %ymm1, %ymm3, %ymm1
1283 ; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm2 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
1284 ; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm3 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1285 ; AVX2-NEXT:    vblendvps %ymm0, %ymm2, %ymm3, %ymm2
1286 ; AVX2-NEXT:    vblendvps %ymm1, %ymm2, %ymm0, %ymm0
1287 ; AVX2-NEXT:    retq
1289 ; AVX512-LABEL: v8i32:
1290 ; AVX512:       # %bb.0:
1291 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1292 ; AVX512-NEXT:    vpcmpnltd %ymm2, %ymm1, %k0
1293 ; AVX512-NEXT:    vpcmpnltd %ymm2, %ymm0, %k1
1294 ; AVX512-NEXT:    kxorw %k0, %k1, %k0
1295 ; AVX512-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
1296 ; AVX512-NEXT:    vpcmpnltd %ymm2, %ymm0, %k2
1297 ; AVX512-NEXT:    kxorw %k2, %k1, %k1
1298 ; AVX512-NEXT:    kandw %k1, %k0, %k1
1299 ; AVX512-NEXT:    vpcmpgtd %ymm0, %ymm2, %k2
1300 ; AVX512-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1301 ; AVX512-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm1 {%k2}
1302 ; AVX512-NEXT:    vmovdqa32 %ymm1, %ymm0 {%k1}
1303 ; AVX512-NEXT:    retq
1304   %z = call <8 x i32> @llvm.ssub.sat.v8i32(<8 x i32> %x, <8 x i32> %y)
1305   ret <8 x i32> %z
1308 define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind {
1309 ; SSE2-LABEL: v16i32:
1310 ; SSE2:       # %bb.0:
1311 ; SSE2-NEXT:    movdqa %xmm1, %xmm8
1312 ; SSE2-NEXT:    movdqa %xmm0, %xmm12
1313 ; SSE2-NEXT:    pxor %xmm9, %xmm9
1314 ; SSE2-NEXT:    pxor %xmm0, %xmm0
1315 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm0
1316 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm10
1317 ; SSE2-NEXT:    pxor %xmm10, %xmm0
1318 ; SSE2-NEXT:    pxor %xmm11, %xmm11
1319 ; SSE2-NEXT:    pcmpgtd %xmm12, %xmm11
1320 ; SSE2-NEXT:    pxor %xmm10, %xmm11
1321 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm0
1322 ; SSE2-NEXT:    psubd %xmm4, %xmm12
1323 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1324 ; SSE2-NEXT:    pcmpgtd %xmm12, %xmm1
1325 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1326 ; SSE2-NEXT:    pxor %xmm10, %xmm4
1327 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm4
1328 ; SSE2-NEXT:    pxor %xmm10, %xmm4
1329 ; SSE2-NEXT:    pandn %xmm4, %xmm0
1330 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [2147483648,2147483648,2147483648,2147483648]
1331 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1332 ; SSE2-NEXT:    pandn %xmm11, %xmm4
1333 ; SSE2-NEXT:    psrld $1, %xmm1
1334 ; SSE2-NEXT:    por %xmm4, %xmm1
1335 ; SSE2-NEXT:    pand %xmm0, %xmm1
1336 ; SSE2-NEXT:    pandn %xmm12, %xmm0
1337 ; SSE2-NEXT:    por %xmm1, %xmm0
1338 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1339 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm1
1340 ; SSE2-NEXT:    pxor %xmm10, %xmm1
1341 ; SSE2-NEXT:    pxor %xmm12, %xmm12
1342 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm12
1343 ; SSE2-NEXT:    pxor %xmm10, %xmm12
1344 ; SSE2-NEXT:    pcmpeqd %xmm12, %xmm1
1345 ; SSE2-NEXT:    psubd %xmm5, %xmm8
1346 ; SSE2-NEXT:    pxor %xmm4, %xmm4
1347 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm4
1348 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
1349 ; SSE2-NEXT:    pxor %xmm10, %xmm5
1350 ; SSE2-NEXT:    pcmpeqd %xmm12, %xmm5
1351 ; SSE2-NEXT:    pxor %xmm10, %xmm5
1352 ; SSE2-NEXT:    pandn %xmm5, %xmm1
1353 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
1354 ; SSE2-NEXT:    pandn %xmm11, %xmm5
1355 ; SSE2-NEXT:    psrld $1, %xmm4
1356 ; SSE2-NEXT:    por %xmm5, %xmm4
1357 ; SSE2-NEXT:    pand %xmm1, %xmm4
1358 ; SSE2-NEXT:    pandn %xmm8, %xmm1
1359 ; SSE2-NEXT:    por %xmm4, %xmm1
1360 ; SSE2-NEXT:    pxor %xmm8, %xmm8
1361 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm8
1362 ; SSE2-NEXT:    pxor %xmm10, %xmm8
1363 ; SSE2-NEXT:    pxor %xmm5, %xmm5
1364 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
1365 ; SSE2-NEXT:    pxor %xmm10, %xmm5
1366 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm8
1367 ; SSE2-NEXT:    psubd %xmm6, %xmm2
1368 ; SSE2-NEXT:    pxor %xmm4, %xmm4
1369 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
1370 ; SSE2-NEXT:    movdqa %xmm4, %xmm6
1371 ; SSE2-NEXT:    pxor %xmm10, %xmm6
1372 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
1373 ; SSE2-NEXT:    pxor %xmm10, %xmm6
1374 ; SSE2-NEXT:    pandn %xmm6, %xmm8
1375 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
1376 ; SSE2-NEXT:    pandn %xmm11, %xmm5
1377 ; SSE2-NEXT:    psrld $1, %xmm4
1378 ; SSE2-NEXT:    por %xmm5, %xmm4
1379 ; SSE2-NEXT:    pand %xmm8, %xmm4
1380 ; SSE2-NEXT:    pandn %xmm2, %xmm8
1381 ; SSE2-NEXT:    por %xmm4, %xmm8
1382 ; SSE2-NEXT:    pxor %xmm5, %xmm5
1383 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm5
1384 ; SSE2-NEXT:    pxor %xmm10, %xmm5
1385 ; SSE2-NEXT:    pxor %xmm2, %xmm2
1386 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
1387 ; SSE2-NEXT:    pxor %xmm10, %xmm2
1388 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm5
1389 ; SSE2-NEXT:    psubd %xmm7, %xmm3
1390 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm9
1391 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
1392 ; SSE2-NEXT:    pxor %xmm10, %xmm4
1393 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
1394 ; SSE2-NEXT:    pxor %xmm10, %xmm4
1395 ; SSE2-NEXT:    pandn %xmm4, %xmm5
1396 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
1397 ; SSE2-NEXT:    pandn %xmm11, %xmm2
1398 ; SSE2-NEXT:    psrld $1, %xmm9
1399 ; SSE2-NEXT:    por %xmm2, %xmm9
1400 ; SSE2-NEXT:    pand %xmm5, %xmm9
1401 ; SSE2-NEXT:    pandn %xmm3, %xmm5
1402 ; SSE2-NEXT:    por %xmm9, %xmm5
1403 ; SSE2-NEXT:    movdqa %xmm8, %xmm2
1404 ; SSE2-NEXT:    movdqa %xmm5, %xmm3
1405 ; SSE2-NEXT:    retq
1407 ; SSSE3-LABEL: v16i32:
1408 ; SSSE3:       # %bb.0:
1409 ; SSSE3-NEXT:    movdqa %xmm1, %xmm8
1410 ; SSSE3-NEXT:    movdqa %xmm0, %xmm12
1411 ; SSSE3-NEXT:    pxor %xmm9, %xmm9
1412 ; SSSE3-NEXT:    pxor %xmm0, %xmm0
1413 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm0
1414 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm10
1415 ; SSSE3-NEXT:    pxor %xmm10, %xmm0
1416 ; SSSE3-NEXT:    pxor %xmm11, %xmm11
1417 ; SSSE3-NEXT:    pcmpgtd %xmm12, %xmm11
1418 ; SSSE3-NEXT:    pxor %xmm10, %xmm11
1419 ; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm0
1420 ; SSSE3-NEXT:    psubd %xmm4, %xmm12
1421 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1422 ; SSSE3-NEXT:    pcmpgtd %xmm12, %xmm1
1423 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
1424 ; SSSE3-NEXT:    pxor %xmm10, %xmm4
1425 ; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm4
1426 ; SSSE3-NEXT:    pxor %xmm10, %xmm4
1427 ; SSSE3-NEXT:    pandn %xmm4, %xmm0
1428 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm11 = [2147483648,2147483648,2147483648,2147483648]
1429 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
1430 ; SSSE3-NEXT:    pandn %xmm11, %xmm4
1431 ; SSSE3-NEXT:    psrld $1, %xmm1
1432 ; SSSE3-NEXT:    por %xmm4, %xmm1
1433 ; SSSE3-NEXT:    pand %xmm0, %xmm1
1434 ; SSSE3-NEXT:    pandn %xmm12, %xmm0
1435 ; SSSE3-NEXT:    por %xmm1, %xmm0
1436 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1437 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm1
1438 ; SSSE3-NEXT:    pxor %xmm10, %xmm1
1439 ; SSSE3-NEXT:    pxor %xmm12, %xmm12
1440 ; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm12
1441 ; SSSE3-NEXT:    pxor %xmm10, %xmm12
1442 ; SSSE3-NEXT:    pcmpeqd %xmm12, %xmm1
1443 ; SSSE3-NEXT:    psubd %xmm5, %xmm8
1444 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
1445 ; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm4
1446 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
1447 ; SSSE3-NEXT:    pxor %xmm10, %xmm5
1448 ; SSSE3-NEXT:    pcmpeqd %xmm12, %xmm5
1449 ; SSSE3-NEXT:    pxor %xmm10, %xmm5
1450 ; SSSE3-NEXT:    pandn %xmm5, %xmm1
1451 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
1452 ; SSSE3-NEXT:    pandn %xmm11, %xmm5
1453 ; SSSE3-NEXT:    psrld $1, %xmm4
1454 ; SSSE3-NEXT:    por %xmm5, %xmm4
1455 ; SSSE3-NEXT:    pand %xmm1, %xmm4
1456 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
1457 ; SSSE3-NEXT:    por %xmm4, %xmm1
1458 ; SSSE3-NEXT:    pxor %xmm8, %xmm8
1459 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm8
1460 ; SSSE3-NEXT:    pxor %xmm10, %xmm8
1461 ; SSSE3-NEXT:    pxor %xmm5, %xmm5
1462 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm5
1463 ; SSSE3-NEXT:    pxor %xmm10, %xmm5
1464 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm8
1465 ; SSSE3-NEXT:    psubd %xmm6, %xmm2
1466 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
1467 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
1468 ; SSSE3-NEXT:    movdqa %xmm4, %xmm6
1469 ; SSSE3-NEXT:    pxor %xmm10, %xmm6
1470 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm6
1471 ; SSSE3-NEXT:    pxor %xmm10, %xmm6
1472 ; SSSE3-NEXT:    pandn %xmm6, %xmm8
1473 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
1474 ; SSSE3-NEXT:    pandn %xmm11, %xmm5
1475 ; SSSE3-NEXT:    psrld $1, %xmm4
1476 ; SSSE3-NEXT:    por %xmm5, %xmm4
1477 ; SSSE3-NEXT:    pand %xmm8, %xmm4
1478 ; SSSE3-NEXT:    pandn %xmm2, %xmm8
1479 ; SSSE3-NEXT:    por %xmm4, %xmm8
1480 ; SSSE3-NEXT:    pxor %xmm5, %xmm5
1481 ; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm5
1482 ; SSSE3-NEXT:    pxor %xmm10, %xmm5
1483 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
1484 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2
1485 ; SSSE3-NEXT:    pxor %xmm10, %xmm2
1486 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm5
1487 ; SSSE3-NEXT:    psubd %xmm7, %xmm3
1488 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm9
1489 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
1490 ; SSSE3-NEXT:    pxor %xmm10, %xmm4
1491 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm4
1492 ; SSSE3-NEXT:    pxor %xmm10, %xmm4
1493 ; SSSE3-NEXT:    pandn %xmm4, %xmm5
1494 ; SSSE3-NEXT:    movdqa %xmm9, %xmm2
1495 ; SSSE3-NEXT:    pandn %xmm11, %xmm2
1496 ; SSSE3-NEXT:    psrld $1, %xmm9
1497 ; SSSE3-NEXT:    por %xmm2, %xmm9
1498 ; SSSE3-NEXT:    pand %xmm5, %xmm9
1499 ; SSSE3-NEXT:    pandn %xmm3, %xmm5
1500 ; SSSE3-NEXT:    por %xmm9, %xmm5
1501 ; SSSE3-NEXT:    movdqa %xmm8, %xmm2
1502 ; SSSE3-NEXT:    movdqa %xmm5, %xmm3
1503 ; SSSE3-NEXT:    retq
1505 ; SSE41-LABEL: v16i32:
1506 ; SSE41:       # %bb.0:
1507 ; SSE41-NEXT:    movdqa %xmm0, %xmm8
1508 ; SSE41-NEXT:    pxor %xmm10, %xmm10
1509 ; SSE41-NEXT:    pxor %xmm9, %xmm9
1510 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm9
1511 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm11
1512 ; SSE41-NEXT:    pxor %xmm11, %xmm9
1513 ; SSE41-NEXT:    pxor %xmm0, %xmm0
1514 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm0
1515 ; SSE41-NEXT:    pxor %xmm11, %xmm0
1516 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm9
1517 ; SSE41-NEXT:    psubd %xmm4, %xmm8
1518 ; SSE41-NEXT:    pxor %xmm4, %xmm4
1519 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm4
1520 ; SSE41-NEXT:    pxor %xmm11, %xmm4
1521 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
1522 ; SSE41-NEXT:    pxor %xmm11, %xmm4
1523 ; SSE41-NEXT:    pandn %xmm4, %xmm9
1524 ; SSE41-NEXT:    movaps {{.*#+}} xmm13 = [2147483647,2147483647,2147483647,2147483647]
1525 ; SSE41-NEXT:    movaps {{.*#+}} xmm12 = [2147483648,2147483648,2147483648,2147483648]
1526 ; SSE41-NEXT:    movaps %xmm12, %xmm4
1527 ; SSE41-NEXT:    movdqa %xmm8, %xmm0
1528 ; SSE41-NEXT:    blendvps %xmm0, %xmm13, %xmm4
1529 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
1530 ; SSE41-NEXT:    blendvps %xmm0, %xmm4, %xmm8
1531 ; SSE41-NEXT:    xorps %xmm4, %xmm4
1532 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm4
1533 ; SSE41-NEXT:    pxor %xmm11, %xmm4
1534 ; SSE41-NEXT:    pxor %xmm0, %xmm0
1535 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm0
1536 ; SSE41-NEXT:    pxor %xmm11, %xmm0
1537 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
1538 ; SSE41-NEXT:    psubd %xmm5, %xmm1
1539 ; SSE41-NEXT:    pxor %xmm5, %xmm5
1540 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm5
1541 ; SSE41-NEXT:    pxor %xmm11, %xmm5
1542 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
1543 ; SSE41-NEXT:    pxor %xmm11, %xmm5
1544 ; SSE41-NEXT:    pandn %xmm5, %xmm4
1545 ; SSE41-NEXT:    movaps %xmm12, %xmm5
1546 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1547 ; SSE41-NEXT:    blendvps %xmm0, %xmm13, %xmm5
1548 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1549 ; SSE41-NEXT:    blendvps %xmm0, %xmm5, %xmm1
1550 ; SSE41-NEXT:    pxor %xmm4, %xmm4
1551 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm4
1552 ; SSE41-NEXT:    pxor %xmm11, %xmm4
1553 ; SSE41-NEXT:    pxor %xmm0, %xmm0
1554 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm0
1555 ; SSE41-NEXT:    pxor %xmm11, %xmm0
1556 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
1557 ; SSE41-NEXT:    psubd %xmm6, %xmm2
1558 ; SSE41-NEXT:    xorps %xmm5, %xmm5
1559 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm5
1560 ; SSE41-NEXT:    pxor %xmm11, %xmm5
1561 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
1562 ; SSE41-NEXT:    pxor %xmm11, %xmm5
1563 ; SSE41-NEXT:    pandn %xmm5, %xmm4
1564 ; SSE41-NEXT:    movaps %xmm12, %xmm5
1565 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1566 ; SSE41-NEXT:    blendvps %xmm0, %xmm13, %xmm5
1567 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1568 ; SSE41-NEXT:    blendvps %xmm0, %xmm5, %xmm2
1569 ; SSE41-NEXT:    pxor %xmm4, %xmm4
1570 ; SSE41-NEXT:    pcmpgtd %xmm7, %xmm4
1571 ; SSE41-NEXT:    pxor %xmm11, %xmm4
1572 ; SSE41-NEXT:    pxor %xmm0, %xmm0
1573 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm0
1574 ; SSE41-NEXT:    pxor %xmm11, %xmm0
1575 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
1576 ; SSE41-NEXT:    psubd %xmm7, %xmm3
1577 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm10
1578 ; SSE41-NEXT:    pxor %xmm11, %xmm10
1579 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm10
1580 ; SSE41-NEXT:    pxor %xmm11, %xmm10
1581 ; SSE41-NEXT:    pandn %xmm10, %xmm4
1582 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
1583 ; SSE41-NEXT:    blendvps %xmm0, %xmm13, %xmm12
1584 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1585 ; SSE41-NEXT:    blendvps %xmm0, %xmm12, %xmm3
1586 ; SSE41-NEXT:    movaps %xmm8, %xmm0
1587 ; SSE41-NEXT:    retq
1589 ; AVX1-LABEL: v16i32:
1590 ; AVX1:       # %bb.0:
1591 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm8
1592 ; AVX1-NEXT:    vpxor %xmm12, %xmm12, %xmm12
1593 ; AVX1-NEXT:    vpcmpgtd %xmm8, %xmm12, %xmm7
1594 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
1595 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm9
1596 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
1597 ; AVX1-NEXT:    vpcmpgtd %xmm6, %xmm12, %xmm7
1598 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm10
1599 ; AVX1-NEXT:    vpcmpeqd %xmm9, %xmm10, %xmm7
1600 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm9
1601 ; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm12, %xmm7
1602 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm11
1603 ; AVX1-NEXT:    vpcmpgtd %xmm0, %xmm12, %xmm7
1604 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm7
1605 ; AVX1-NEXT:    vpcmpeqd %xmm11, %xmm7, %xmm5
1606 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm5
1607 ; AVX1-NEXT:    vinsertf128 $1, %xmm9, %ymm5, %ymm9
1608 ; AVX1-NEXT:    vpsubd %xmm8, %xmm6, %xmm8
1609 ; AVX1-NEXT:    vpcmpgtd %xmm8, %xmm12, %xmm5
1610 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm6
1611 ; AVX1-NEXT:    vpcmpeqd %xmm6, %xmm10, %xmm6
1612 ; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm6
1613 ; AVX1-NEXT:    vpsubd %xmm2, %xmm0, %xmm0
1614 ; AVX1-NEXT:    vpcmpgtd %xmm0, %xmm12, %xmm2
1615 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
1616 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm7, %xmm2
1617 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
1618 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm2, %ymm2
1619 ; AVX1-NEXT:    vandps %ymm2, %ymm9, %ymm6
1620 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm0, %ymm7
1621 ; AVX1-NEXT:    vmovaps {{.*#+}} ymm9 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
1622 ; AVX1-NEXT:    vmovaps {{.*#+}} ymm10 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1623 ; AVX1-NEXT:    vblendvps %ymm7, %ymm9, %ymm10, %ymm7
1624 ; AVX1-NEXT:    vinsertf128 $1, %xmm8, %ymm0, %ymm0
1625 ; AVX1-NEXT:    vblendvps %ymm6, %ymm7, %ymm0, %ymm0
1626 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm13
1627 ; AVX1-NEXT:    vpcmpgtd %xmm13, %xmm12, %xmm7
1628 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm7
1629 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1630 ; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm12, %xmm5
1631 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm5
1632 ; AVX1-NEXT:    vpcmpeqd %xmm7, %xmm5, %xmm7
1633 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm8
1634 ; AVX1-NEXT:    vpcmpgtd %xmm3, %xmm12, %xmm7
1635 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm11
1636 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm12, %xmm7
1637 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm7
1638 ; AVX1-NEXT:    vpcmpeqd %xmm11, %xmm7, %xmm6
1639 ; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm6
1640 ; AVX1-NEXT:    vinsertf128 $1, %xmm8, %ymm6, %ymm8
1641 ; AVX1-NEXT:    vpsubd %xmm13, %xmm2, %xmm11
1642 ; AVX1-NEXT:    vpcmpgtd %xmm11, %xmm12, %xmm6
1643 ; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm2
1644 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm5, %xmm2
1645 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
1646 ; AVX1-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
1647 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm12, %xmm3
1648 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
1649 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm7, %xmm3
1650 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
1651 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
1652 ; AVX1-NEXT:    vandps %ymm2, %ymm8, %ymm2
1653 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm3
1654 ; AVX1-NEXT:    vblendvps %ymm3, %ymm9, %ymm10, %ymm3
1655 ; AVX1-NEXT:    vinsertf128 $1, %xmm11, %ymm1, %ymm1
1656 ; AVX1-NEXT:    vblendvps %ymm2, %ymm3, %ymm1, %ymm1
1657 ; AVX1-NEXT:    retq
1659 ; AVX2-LABEL: v16i32:
1660 ; AVX2:       # %bb.0:
1661 ; AVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1662 ; AVX2-NEXT:    vpcmpgtd %ymm2, %ymm4, %ymm5
1663 ; AVX2-NEXT:    vpcmpeqd %ymm6, %ymm6, %ymm6
1664 ; AVX2-NEXT:    vpxor %ymm6, %ymm5, %ymm5
1665 ; AVX2-NEXT:    vpcmpgtd %ymm0, %ymm4, %ymm7
1666 ; AVX2-NEXT:    vpxor %ymm6, %ymm7, %ymm7
1667 ; AVX2-NEXT:    vpcmpeqd %ymm5, %ymm7, %ymm5
1668 ; AVX2-NEXT:    vpsubd %ymm2, %ymm0, %ymm0
1669 ; AVX2-NEXT:    vpcmpgtd %ymm0, %ymm4, %ymm2
1670 ; AVX2-NEXT:    vpxor %ymm6, %ymm2, %ymm2
1671 ; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm7, %ymm2
1672 ; AVX2-NEXT:    vpxor %ymm6, %ymm2, %ymm2
1673 ; AVX2-NEXT:    vpandn %ymm2, %ymm5, %ymm2
1674 ; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm5 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
1675 ; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm7 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1676 ; AVX2-NEXT:    vblendvps %ymm0, %ymm5, %ymm7, %ymm8
1677 ; AVX2-NEXT:    vblendvps %ymm2, %ymm8, %ymm0, %ymm0
1678 ; AVX2-NEXT:    vpcmpgtd %ymm3, %ymm4, %ymm2
1679 ; AVX2-NEXT:    vpxor %ymm6, %ymm2, %ymm2
1680 ; AVX2-NEXT:    vpcmpgtd %ymm1, %ymm4, %ymm8
1681 ; AVX2-NEXT:    vpxor %ymm6, %ymm8, %ymm8
1682 ; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm8, %ymm2
1683 ; AVX2-NEXT:    vpsubd %ymm3, %ymm1, %ymm1
1684 ; AVX2-NEXT:    vpcmpgtd %ymm1, %ymm4, %ymm3
1685 ; AVX2-NEXT:    vpxor %ymm6, %ymm3, %ymm3
1686 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm8, %ymm3
1687 ; AVX2-NEXT:    vpxor %ymm6, %ymm3, %ymm3
1688 ; AVX2-NEXT:    vpandn %ymm3, %ymm2, %ymm2
1689 ; AVX2-NEXT:    vblendvps %ymm1, %ymm5, %ymm7, %ymm3
1690 ; AVX2-NEXT:    vblendvps %ymm2, %ymm3, %ymm1, %ymm1
1691 ; AVX2-NEXT:    retq
1693 ; AVX512-LABEL: v16i32:
1694 ; AVX512:       # %bb.0:
1695 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1696 ; AVX512-NEXT:    vpcmpnltd %zmm2, %zmm1, %k0
1697 ; AVX512-NEXT:    vpcmpnltd %zmm2, %zmm0, %k1
1698 ; AVX512-NEXT:    kxorw %k0, %k1, %k0
1699 ; AVX512-NEXT:    vpsubd %zmm1, %zmm0, %zmm0
1700 ; AVX512-NEXT:    vpcmpnltd %zmm2, %zmm0, %k2
1701 ; AVX512-NEXT:    kxorw %k2, %k1, %k1
1702 ; AVX512-NEXT:    kandw %k1, %k0, %k1
1703 ; AVX512-NEXT:    vpcmpgtd %zmm0, %zmm2, %k2
1704 ; AVX512-NEXT:    vpbroadcastd {{.*#+}} zmm1 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1705 ; AVX512-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm1 {%k2}
1706 ; AVX512-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1}
1707 ; AVX512-NEXT:    retq
1708   %z = call <16 x i32> @llvm.ssub.sat.v16i32(<16 x i32> %x, <16 x i32> %y)
1709   ret <16 x i32> %z
1712 define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {
1713 ; SSE2-LABEL: v2i64:
1714 ; SSE2:       # %bb.0:
1715 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1716 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1717 ; SSE2-NEXT:    psubq %xmm1, %xmm0
1718 ; SSE2-NEXT:    pxor %xmm2, %xmm1
1719 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1720 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
1721 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1722 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm1
1723 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1724 ; SSE2-NEXT:    pand %xmm5, %xmm1
1725 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1726 ; SSE2-NEXT:    por %xmm1, %xmm4
1727 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm5
1728 ; SSE2-NEXT:    pxor %xmm5, %xmm4
1729 ; SSE2-NEXT:    pxor %xmm2, %xmm3
1730 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1731 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm1
1732 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
1733 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
1734 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1735 ; SSE2-NEXT:    pand %xmm6, %xmm3
1736 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
1737 ; SSE2-NEXT:    por %xmm3, %xmm6
1738 ; SSE2-NEXT:    pxor %xmm5, %xmm6
1739 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm4
1740 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,0,3,2]
1741 ; SSE2-NEXT:    pand %xmm4, %xmm1
1742 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1743 ; SSE2-NEXT:    pxor %xmm2, %xmm3
1744 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1745 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
1746 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
1747 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
1748 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1749 ; SSE2-NEXT:    pand %xmm7, %xmm2
1750 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1751 ; SSE2-NEXT:    por %xmm2, %xmm3
1752 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
1753 ; SSE2-NEXT:    pxor %xmm5, %xmm2
1754 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm2
1755 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,0,3,2]
1756 ; SSE2-NEXT:    pand %xmm2, %xmm4
1757 ; SSE2-NEXT:    pxor %xmm5, %xmm4
1758 ; SSE2-NEXT:    pandn %xmm4, %xmm1
1759 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
1760 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
1761 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1762 ; SSE2-NEXT:    por %xmm2, %xmm3
1763 ; SSE2-NEXT:    pand %xmm1, %xmm3
1764 ; SSE2-NEXT:    pandn %xmm0, %xmm1
1765 ; SSE2-NEXT:    por %xmm3, %xmm1
1766 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1767 ; SSE2-NEXT:    retq
1769 ; SSSE3-LABEL: v2i64:
1770 ; SSSE3:       # %bb.0:
1771 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1772 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
1773 ; SSSE3-NEXT:    psubq %xmm1, %xmm0
1774 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
1775 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
1776 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
1777 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1778 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm1
1779 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1780 ; SSSE3-NEXT:    pand %xmm5, %xmm1
1781 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1782 ; SSSE3-NEXT:    por %xmm1, %xmm4
1783 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm5
1784 ; SSSE3-NEXT:    pxor %xmm5, %xmm4
1785 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
1786 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1787 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm1
1788 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
1789 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm3
1790 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1791 ; SSSE3-NEXT:    pand %xmm6, %xmm3
1792 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
1793 ; SSSE3-NEXT:    por %xmm3, %xmm6
1794 ; SSSE3-NEXT:    pxor %xmm5, %xmm6
1795 ; SSSE3-NEXT:    pcmpeqd %xmm6, %xmm4
1796 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,0,3,2]
1797 ; SSSE3-NEXT:    pand %xmm4, %xmm1
1798 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
1799 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
1800 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
1801 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
1802 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
1803 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm3
1804 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1805 ; SSSE3-NEXT:    pand %xmm7, %xmm2
1806 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1807 ; SSSE3-NEXT:    por %xmm2, %xmm3
1808 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
1809 ; SSSE3-NEXT:    pxor %xmm5, %xmm2
1810 ; SSSE3-NEXT:    pcmpeqd %xmm6, %xmm2
1811 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,0,3,2]
1812 ; SSSE3-NEXT:    pand %xmm2, %xmm4
1813 ; SSSE3-NEXT:    pxor %xmm5, %xmm4
1814 ; SSSE3-NEXT:    pandn %xmm4, %xmm1
1815 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
1816 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
1817 ; SSSE3-NEXT:    pand {{.*}}(%rip), %xmm3
1818 ; SSSE3-NEXT:    por %xmm2, %xmm3
1819 ; SSSE3-NEXT:    pand %xmm1, %xmm3
1820 ; SSSE3-NEXT:    pandn %xmm0, %xmm1
1821 ; SSSE3-NEXT:    por %xmm3, %xmm1
1822 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1823 ; SSSE3-NEXT:    retq
1825 ; SSE41-LABEL: v2i64:
1826 ; SSE41:       # %bb.0:
1827 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1828 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
1829 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
1830 ; SSE41-NEXT:    psubq %xmm1, %xmm2
1831 ; SSE41-NEXT:    pxor %xmm0, %xmm1
1832 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
1833 ; SSE41-NEXT:    pcmpgtd %xmm1, %xmm4
1834 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1835 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
1836 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
1837 ; SSE41-NEXT:    pand %xmm5, %xmm6
1838 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
1839 ; SSE41-NEXT:    por %xmm6, %xmm1
1840 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm4
1841 ; SSE41-NEXT:    pxor %xmm4, %xmm1
1842 ; SSE41-NEXT:    pxor %xmm0, %xmm3
1843 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
1844 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm5
1845 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1846 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
1847 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1848 ; SSE41-NEXT:    pand %xmm6, %xmm3
1849 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1850 ; SSE41-NEXT:    por %xmm3, %xmm5
1851 ; SSE41-NEXT:    pxor %xmm4, %xmm5
1852 ; SSE41-NEXT:    pcmpeqq %xmm5, %xmm1
1853 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
1854 ; SSE41-NEXT:    pxor %xmm0, %xmm3
1855 ; SSE41-NEXT:    movdqa %xmm0, %xmm6
1856 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm6
1857 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1858 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
1859 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1860 ; SSE41-NEXT:    pand %xmm7, %xmm3
1861 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
1862 ; SSE41-NEXT:    por %xmm3, %xmm0
1863 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
1864 ; SSE41-NEXT:    pxor %xmm4, %xmm3
1865 ; SSE41-NEXT:    pcmpeqq %xmm5, %xmm3
1866 ; SSE41-NEXT:    pxor %xmm4, %xmm3
1867 ; SSE41-NEXT:    pandn %xmm3, %xmm1
1868 ; SSE41-NEXT:    movapd {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1869 ; SSE41-NEXT:    blendvpd %xmm0, {{.*}}(%rip), %xmm3
1870 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1871 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
1872 ; SSE41-NEXT:    movapd %xmm2, %xmm0
1873 ; SSE41-NEXT:    retq
1875 ; AVX1-LABEL: v2i64:
1876 ; AVX1:       # %bb.0:
1877 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1878 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm3
1879 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
1880 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
1881 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm5
1882 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm5
1883 ; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm5, %xmm3
1884 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
1885 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm1
1886 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm1
1887 ; AVX1-NEXT:    vpcmpeqq %xmm1, %xmm5, %xmm1
1888 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm1
1889 ; AVX1-NEXT:    vpandn %xmm1, %xmm3, %xmm1
1890 ; AVX1-NEXT:    vmovapd {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1891 ; AVX1-NEXT:    vblendvpd %xmm0, {{.*}}(%rip), %xmm2, %xmm2
1892 ; AVX1-NEXT:    vblendvpd %xmm1, %xmm2, %xmm0, %xmm0
1893 ; AVX1-NEXT:    retq
1895 ; AVX2-LABEL: v2i64:
1896 ; AVX2:       # %bb.0:
1897 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1898 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm3
1899 ; AVX2-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
1900 ; AVX2-NEXT:    vpxor %xmm4, %xmm3, %xmm3
1901 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm5
1902 ; AVX2-NEXT:    vpxor %xmm4, %xmm5, %xmm5
1903 ; AVX2-NEXT:    vpcmpeqq %xmm3, %xmm5, %xmm3
1904 ; AVX2-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
1905 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm1
1906 ; AVX2-NEXT:    vpxor %xmm4, %xmm1, %xmm1
1907 ; AVX2-NEXT:    vpcmpeqq %xmm1, %xmm5, %xmm1
1908 ; AVX2-NEXT:    vpxor %xmm4, %xmm1, %xmm1
1909 ; AVX2-NEXT:    vpandn %xmm1, %xmm3, %xmm1
1910 ; AVX2-NEXT:    vmovapd {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1911 ; AVX2-NEXT:    vblendvpd %xmm0, {{.*}}(%rip), %xmm2, %xmm2
1912 ; AVX2-NEXT:    vblendvpd %xmm1, %xmm2, %xmm0, %xmm0
1913 ; AVX2-NEXT:    retq
1915 ; AVX512-LABEL: v2i64:
1916 ; AVX512:       # %bb.0:
1917 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1918 ; AVX512-NEXT:    vpcmpnltq %xmm2, %xmm1, %k0
1919 ; AVX512-NEXT:    vpcmpnltq %xmm2, %xmm0, %k1
1920 ; AVX512-NEXT:    kxorw %k0, %k1, %k0
1921 ; AVX512-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
1922 ; AVX512-NEXT:    vpcmpnltq %xmm2, %xmm0, %k2
1923 ; AVX512-NEXT:    kxorw %k2, %k1, %k1
1924 ; AVX512-NEXT:    kandw %k1, %k0, %k1
1925 ; AVX512-NEXT:    vpcmpgtq %xmm0, %xmm2, %k2
1926 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
1927 ; AVX512-NEXT:    vmovdqa64 {{.*}}(%rip), %xmm1 {%k2}
1928 ; AVX512-NEXT:    vmovdqa64 %xmm1, %xmm0 {%k1}
1929 ; AVX512-NEXT:    retq
1930   %z = call <2 x i64> @llvm.ssub.sat.v2i64(<2 x i64> %x, <2 x i64> %y)
1931   ret <2 x i64> %z
1934 define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
1935 ; SSE2-LABEL: v4i64:
1936 ; SSE2:       # %bb.0:
1937 ; SSE2-NEXT:    movdqa %xmm0, %xmm10
1938 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648]
1939 ; SSE2-NEXT:    psubq %xmm2, %xmm10
1940 ; SSE2-NEXT:    pxor %xmm5, %xmm2
1941 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
1942 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
1943 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1944 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm2
1945 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1946 ; SSE2-NEXT:    pand %xmm7, %xmm2
1947 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
1948 ; SSE2-NEXT:    por %xmm2, %xmm7
1949 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm9
1950 ; SSE2-NEXT:    pxor %xmm9, %xmm7
1951 ; SSE2-NEXT:    pxor %xmm5, %xmm0
1952 ; SSE2-NEXT:    movdqa %xmm5, %xmm2
1953 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
1954 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
1955 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm0
1956 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1957 ; SSE2-NEXT:    pand %xmm6, %xmm0
1958 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1959 ; SSE2-NEXT:    por %xmm0, %xmm2
1960 ; SSE2-NEXT:    pxor %xmm9, %xmm2
1961 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm7
1962 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,0,3,2]
1963 ; SSE2-NEXT:    pand %xmm7, %xmm0
1964 ; SSE2-NEXT:    movdqa %xmm10, %xmm6
1965 ; SSE2-NEXT:    pxor %xmm5, %xmm6
1966 ; SSE2-NEXT:    movdqa %xmm5, %xmm7
1967 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
1968 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
1969 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
1970 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1971 ; SSE2-NEXT:    pand %xmm4, %xmm6
1972 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3]
1973 ; SSE2-NEXT:    por %xmm6, %xmm4
1974 ; SSE2-NEXT:    movdqa %xmm4, %xmm6
1975 ; SSE2-NEXT:    pxor %xmm9, %xmm6
1976 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm6
1977 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,0,3,2]
1978 ; SSE2-NEXT:    pand %xmm6, %xmm2
1979 ; SSE2-NEXT:    pxor %xmm9, %xmm2
1980 ; SSE2-NEXT:    pandn %xmm2, %xmm0
1981 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [9223372036854775808,9223372036854775808]
1982 ; SSE2-NEXT:    movdqa %xmm4, %xmm2
1983 ; SSE2-NEXT:    pandn %xmm8, %xmm2
1984 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [9223372036854775807,9223372036854775807]
1985 ; SSE2-NEXT:    pand %xmm11, %xmm4
1986 ; SSE2-NEXT:    por %xmm2, %xmm4
1987 ; SSE2-NEXT:    pand %xmm0, %xmm4
1988 ; SSE2-NEXT:    pandn %xmm10, %xmm0
1989 ; SSE2-NEXT:    por %xmm4, %xmm0
1990 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1991 ; SSE2-NEXT:    psubq %xmm3, %xmm1
1992 ; SSE2-NEXT:    pxor %xmm5, %xmm3
1993 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
1994 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
1995 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1996 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
1997 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1998 ; SSE2-NEXT:    pand %xmm6, %xmm3
1999 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2000 ; SSE2-NEXT:    por %xmm3, %xmm4
2001 ; SSE2-NEXT:    pxor %xmm9, %xmm4
2002 ; SSE2-NEXT:    pxor %xmm5, %xmm2
2003 ; SSE2-NEXT:    movdqa %xmm5, %xmm3
2004 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
2005 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
2006 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm2
2007 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2008 ; SSE2-NEXT:    pand %xmm6, %xmm2
2009 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2010 ; SSE2-NEXT:    por %xmm2, %xmm3
2011 ; SSE2-NEXT:    pxor %xmm9, %xmm3
2012 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
2013 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,0,3,2]
2014 ; SSE2-NEXT:    pand %xmm4, %xmm2
2015 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
2016 ; SSE2-NEXT:    pxor %xmm5, %xmm4
2017 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
2018 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
2019 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2020 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm4
2021 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2022 ; SSE2-NEXT:    pand %xmm7, %xmm4
2023 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
2024 ; SSE2-NEXT:    por %xmm4, %xmm5
2025 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
2026 ; SSE2-NEXT:    pxor %xmm9, %xmm4
2027 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
2028 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,0,3,2]
2029 ; SSE2-NEXT:    pand %xmm4, %xmm3
2030 ; SSE2-NEXT:    pxor %xmm9, %xmm3
2031 ; SSE2-NEXT:    pandn %xmm3, %xmm2
2032 ; SSE2-NEXT:    movdqa %xmm5, %xmm3
2033 ; SSE2-NEXT:    pandn %xmm8, %xmm3
2034 ; SSE2-NEXT:    pand %xmm11, %xmm5
2035 ; SSE2-NEXT:    por %xmm3, %xmm5
2036 ; SSE2-NEXT:    pand %xmm2, %xmm5
2037 ; SSE2-NEXT:    pandn %xmm1, %xmm2
2038 ; SSE2-NEXT:    por %xmm5, %xmm2
2039 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
2040 ; SSE2-NEXT:    retq
2042 ; SSSE3-LABEL: v4i64:
2043 ; SSSE3:       # %bb.0:
2044 ; SSSE3-NEXT:    movdqa %xmm0, %xmm10
2045 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648]
2046 ; SSSE3-NEXT:    psubq %xmm2, %xmm10
2047 ; SSSE3-NEXT:    pxor %xmm5, %xmm2
2048 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
2049 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm6
2050 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2051 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm2
2052 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2053 ; SSSE3-NEXT:    pand %xmm7, %xmm2
2054 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
2055 ; SSSE3-NEXT:    por %xmm2, %xmm7
2056 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm9
2057 ; SSSE3-NEXT:    pxor %xmm9, %xmm7
2058 ; SSSE3-NEXT:    pxor %xmm5, %xmm0
2059 ; SSSE3-NEXT:    movdqa %xmm5, %xmm2
2060 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
2061 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
2062 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm0
2063 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2064 ; SSSE3-NEXT:    pand %xmm6, %xmm0
2065 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2066 ; SSSE3-NEXT:    por %xmm0, %xmm2
2067 ; SSSE3-NEXT:    pxor %xmm9, %xmm2
2068 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm7
2069 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,0,3,2]
2070 ; SSSE3-NEXT:    pand %xmm7, %xmm0
2071 ; SSSE3-NEXT:    movdqa %xmm10, %xmm6
2072 ; SSSE3-NEXT:    pxor %xmm5, %xmm6
2073 ; SSSE3-NEXT:    movdqa %xmm5, %xmm7
2074 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm7
2075 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
2076 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm6
2077 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2078 ; SSSE3-NEXT:    pand %xmm4, %xmm6
2079 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3]
2080 ; SSSE3-NEXT:    por %xmm6, %xmm4
2081 ; SSSE3-NEXT:    movdqa %xmm4, %xmm6
2082 ; SSSE3-NEXT:    pxor %xmm9, %xmm6
2083 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm6
2084 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,0,3,2]
2085 ; SSSE3-NEXT:    pand %xmm6, %xmm2
2086 ; SSSE3-NEXT:    pxor %xmm9, %xmm2
2087 ; SSSE3-NEXT:    pandn %xmm2, %xmm0
2088 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [9223372036854775808,9223372036854775808]
2089 ; SSSE3-NEXT:    movdqa %xmm4, %xmm2
2090 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
2091 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm11 = [9223372036854775807,9223372036854775807]
2092 ; SSSE3-NEXT:    pand %xmm11, %xmm4
2093 ; SSSE3-NEXT:    por %xmm2, %xmm4
2094 ; SSSE3-NEXT:    pand %xmm0, %xmm4
2095 ; SSSE3-NEXT:    pandn %xmm10, %xmm0
2096 ; SSSE3-NEXT:    por %xmm4, %xmm0
2097 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
2098 ; SSSE3-NEXT:    psubq %xmm3, %xmm1
2099 ; SSSE3-NEXT:    pxor %xmm5, %xmm3
2100 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
2101 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
2102 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2103 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm3
2104 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2105 ; SSSE3-NEXT:    pand %xmm6, %xmm3
2106 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2107 ; SSSE3-NEXT:    por %xmm3, %xmm4
2108 ; SSSE3-NEXT:    pxor %xmm9, %xmm4
2109 ; SSSE3-NEXT:    pxor %xmm5, %xmm2
2110 ; SSSE3-NEXT:    movdqa %xmm5, %xmm3
2111 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
2112 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
2113 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm2
2114 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2115 ; SSSE3-NEXT:    pand %xmm6, %xmm2
2116 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2117 ; SSSE3-NEXT:    por %xmm2, %xmm3
2118 ; SSSE3-NEXT:    pxor %xmm9, %xmm3
2119 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm4
2120 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,0,3,2]
2121 ; SSSE3-NEXT:    pand %xmm4, %xmm2
2122 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
2123 ; SSSE3-NEXT:    pxor %xmm5, %xmm4
2124 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
2125 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
2126 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2127 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm4
2128 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2129 ; SSSE3-NEXT:    pand %xmm7, %xmm4
2130 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
2131 ; SSSE3-NEXT:    por %xmm4, %xmm5
2132 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
2133 ; SSSE3-NEXT:    pxor %xmm9, %xmm4
2134 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm4
2135 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,0,3,2]
2136 ; SSSE3-NEXT:    pand %xmm4, %xmm3
2137 ; SSSE3-NEXT:    pxor %xmm9, %xmm3
2138 ; SSSE3-NEXT:    pandn %xmm3, %xmm2
2139 ; SSSE3-NEXT:    movdqa %xmm5, %xmm3
2140 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
2141 ; SSSE3-NEXT:    pand %xmm11, %xmm5
2142 ; SSSE3-NEXT:    por %xmm3, %xmm5
2143 ; SSSE3-NEXT:    pand %xmm2, %xmm5
2144 ; SSSE3-NEXT:    pandn %xmm1, %xmm2
2145 ; SSSE3-NEXT:    por %xmm5, %xmm2
2146 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
2147 ; SSSE3-NEXT:    retq
2149 ; SSE41-LABEL: v4i64:
2150 ; SSE41:       # %bb.0:
2151 ; SSE41-NEXT:    movdqa %xmm0, %xmm9
2152 ; SSE41-NEXT:    movdqa {{.*#+}} xmm11 = [2147483648,2147483648]
2153 ; SSE41-NEXT:    psubq %xmm2, %xmm9
2154 ; SSE41-NEXT:    pxor %xmm11, %xmm2
2155 ; SSE41-NEXT:    movdqa %xmm11, %xmm6
2156 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm6
2157 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2158 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm2
2159 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
2160 ; SSE41-NEXT:    pand %xmm7, %xmm4
2161 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
2162 ; SSE41-NEXT:    por %xmm4, %xmm2
2163 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm10
2164 ; SSE41-NEXT:    pxor %xmm10, %xmm2
2165 ; SSE41-NEXT:    pxor %xmm11, %xmm0
2166 ; SSE41-NEXT:    movdqa %xmm11, %xmm4
2167 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
2168 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
2169 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
2170 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2171 ; SSE41-NEXT:    pand %xmm7, %xmm0
2172 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2173 ; SSE41-NEXT:    por %xmm0, %xmm4
2174 ; SSE41-NEXT:    pxor %xmm10, %xmm4
2175 ; SSE41-NEXT:    pcmpeqq %xmm4, %xmm2
2176 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
2177 ; SSE41-NEXT:    pxor %xmm11, %xmm0
2178 ; SSE41-NEXT:    movdqa %xmm11, %xmm7
2179 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
2180 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[0,0,2,2]
2181 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
2182 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
2183 ; SSE41-NEXT:    pand %xmm6, %xmm5
2184 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
2185 ; SSE41-NEXT:    por %xmm5, %xmm0
2186 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
2187 ; SSE41-NEXT:    pxor %xmm10, %xmm5
2188 ; SSE41-NEXT:    pcmpeqq %xmm4, %xmm5
2189 ; SSE41-NEXT:    pxor %xmm10, %xmm5
2190 ; SSE41-NEXT:    pandn %xmm5, %xmm2
2191 ; SSE41-NEXT:    movapd {{.*#+}} xmm8 = [9223372036854775807,9223372036854775807]
2192 ; SSE41-NEXT:    movapd {{.*#+}} xmm7 = [9223372036854775808,9223372036854775808]
2193 ; SSE41-NEXT:    movapd %xmm7, %xmm4
2194 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm4
2195 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
2196 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm9
2197 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
2198 ; SSE41-NEXT:    psubq %xmm3, %xmm1
2199 ; SSE41-NEXT:    pxor %xmm11, %xmm3
2200 ; SSE41-NEXT:    movdqa %xmm11, %xmm2
2201 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm2
2202 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2203 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm3
2204 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2205 ; SSE41-NEXT:    pand %xmm4, %xmm3
2206 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2207 ; SSE41-NEXT:    por %xmm3, %xmm2
2208 ; SSE41-NEXT:    pxor %xmm10, %xmm2
2209 ; SSE41-NEXT:    pxor %xmm11, %xmm0
2210 ; SSE41-NEXT:    movdqa %xmm11, %xmm3
2211 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
2212 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2213 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
2214 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2215 ; SSE41-NEXT:    pand %xmm4, %xmm0
2216 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2217 ; SSE41-NEXT:    por %xmm0, %xmm3
2218 ; SSE41-NEXT:    pxor %xmm10, %xmm3
2219 ; SSE41-NEXT:    pcmpeqq %xmm3, %xmm2
2220 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
2221 ; SSE41-NEXT:    pxor %xmm11, %xmm0
2222 ; SSE41-NEXT:    movdqa %xmm11, %xmm4
2223 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
2224 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2225 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
2226 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
2227 ; SSE41-NEXT:    pand %xmm5, %xmm6
2228 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
2229 ; SSE41-NEXT:    por %xmm6, %xmm0
2230 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
2231 ; SSE41-NEXT:    pxor %xmm10, %xmm4
2232 ; SSE41-NEXT:    pcmpeqq %xmm3, %xmm4
2233 ; SSE41-NEXT:    pxor %xmm10, %xmm4
2234 ; SSE41-NEXT:    pandn %xmm4, %xmm2
2235 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm7
2236 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
2237 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
2238 ; SSE41-NEXT:    movapd %xmm9, %xmm0
2239 ; SSE41-NEXT:    retq
2241 ; AVX1-LABEL: v4i64:
2242 ; AVX1:       # %bb.0:
2243 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm9
2244 ; AVX1-NEXT:    vpxor %xmm10, %xmm10, %xmm10
2245 ; AVX1-NEXT:    vpcmpgtq %xmm9, %xmm10, %xmm4
2246 ; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
2247 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
2248 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
2249 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm10, %xmm7
2250 ; AVX1-NEXT:    vpxor %xmm5, %xmm7, %xmm7
2251 ; AVX1-NEXT:    vpcmpeqq %xmm4, %xmm7, %xmm4
2252 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm8
2253 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm10, %xmm4
2254 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
2255 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm10, %xmm2
2256 ; AVX1-NEXT:    vpxor %xmm5, %xmm2, %xmm2
2257 ; AVX1-NEXT:    vpcmpeqq %xmm4, %xmm2, %xmm4
2258 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm4
2259 ; AVX1-NEXT:    vinsertf128 $1, %xmm8, %ymm4, %ymm8
2260 ; AVX1-NEXT:    vpsubq %xmm9, %xmm6, %xmm6
2261 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm10, %xmm4
2262 ; AVX1-NEXT:    vpxor %xmm5, %xmm4, %xmm3
2263 ; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm7, %xmm3
2264 ; AVX1-NEXT:    vpxor %xmm5, %xmm3, %xmm3
2265 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
2266 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm10, %xmm1
2267 ; AVX1-NEXT:    vpxor %xmm5, %xmm1, %xmm1
2268 ; AVX1-NEXT:    vpcmpeqq %xmm1, %xmm2, %xmm1
2269 ; AVX1-NEXT:    vpxor %xmm5, %xmm1, %xmm1
2270 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
2271 ; AVX1-NEXT:    vandpd %ymm1, %ymm8, %ymm1
2272 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm2
2273 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2274 ; AVX1-NEXT:    vblendvpd %ymm2, {{.*}}(%rip), %ymm3, %ymm2
2275 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm0, %ymm0
2276 ; AVX1-NEXT:    vblendvpd %ymm1, %ymm2, %ymm0, %ymm0
2277 ; AVX1-NEXT:    retq
2279 ; AVX2-LABEL: v4i64:
2280 ; AVX2:       # %bb.0:
2281 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2282 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
2283 ; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4
2284 ; AVX2-NEXT:    vpxor %ymm4, %ymm3, %ymm3
2285 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm5
2286 ; AVX2-NEXT:    vpxor %ymm4, %ymm5, %ymm5
2287 ; AVX2-NEXT:    vpcmpeqq %ymm3, %ymm5, %ymm3
2288 ; AVX2-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
2289 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm1
2290 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm1
2291 ; AVX2-NEXT:    vpcmpeqq %ymm1, %ymm5, %ymm1
2292 ; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm1
2293 ; AVX2-NEXT:    vpandn %ymm1, %ymm3, %ymm1
2294 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
2295 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2296 ; AVX2-NEXT:    vblendvpd %ymm0, %ymm2, %ymm3, %ymm2
2297 ; AVX2-NEXT:    vblendvpd %ymm1, %ymm2, %ymm0, %ymm0
2298 ; AVX2-NEXT:    retq
2300 ; AVX512-LABEL: v4i64:
2301 ; AVX512:       # %bb.0:
2302 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2303 ; AVX512-NEXT:    vpcmpnltq %ymm2, %ymm1, %k0
2304 ; AVX512-NEXT:    vpcmpnltq %ymm2, %ymm0, %k1
2305 ; AVX512-NEXT:    kxorw %k0, %k1, %k0
2306 ; AVX512-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
2307 ; AVX512-NEXT:    vpcmpnltq %ymm2, %ymm0, %k2
2308 ; AVX512-NEXT:    kxorw %k2, %k1, %k1
2309 ; AVX512-NEXT:    kandw %k1, %k0, %k1
2310 ; AVX512-NEXT:    vpcmpgtq %ymm0, %ymm2, %k2
2311 ; AVX512-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2312 ; AVX512-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm1 {%k2}
2313 ; AVX512-NEXT:    vmovdqa64 %ymm1, %ymm0 {%k1}
2314 ; AVX512-NEXT:    retq
2315   %z = call <4 x i64> @llvm.ssub.sat.v4i64(<4 x i64> %x, <4 x i64> %y)
2316   ret <4 x i64> %z
2319 define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind {
2320 ; SSE2-LABEL: v8i64:
2321 ; SSE2:       # %bb.0:
2322 ; SSE2-NEXT:    movdqa %xmm1, %xmm8
2323 ; SSE2-NEXT:    movdqa %xmm0, %xmm13
2324 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648]
2325 ; SSE2-NEXT:    psubq %xmm4, %xmm13
2326 ; SSE2-NEXT:    pxor %xmm9, %xmm4
2327 ; SSE2-NEXT:    movdqa %xmm9, %xmm1
2328 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm1
2329 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm1[0,0,2,2]
2330 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm4
2331 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2332 ; SSE2-NEXT:    pand %xmm10, %xmm4
2333 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2334 ; SSE2-NEXT:    por %xmm4, %xmm1
2335 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm10
2336 ; SSE2-NEXT:    pxor %xmm10, %xmm1
2337 ; SSE2-NEXT:    pxor %xmm9, %xmm0
2338 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
2339 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
2340 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm4[0,0,2,2]
2341 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
2342 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2343 ; SSE2-NEXT:    pand %xmm11, %xmm0
2344 ; SSE2-NEXT:    pshufd {{.*#+}} xmm15 = xmm4[1,1,3,3]
2345 ; SSE2-NEXT:    por %xmm0, %xmm15
2346 ; SSE2-NEXT:    pxor %xmm10, %xmm15
2347 ; SSE2-NEXT:    pcmpeqd %xmm15, %xmm1
2348 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]
2349 ; SSE2-NEXT:    pand %xmm1, %xmm0
2350 ; SSE2-NEXT:    movdqa %xmm13, %xmm1
2351 ; SSE2-NEXT:    pxor %xmm9, %xmm1
2352 ; SSE2-NEXT:    movdqa %xmm9, %xmm11
2353 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm11
2354 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
2355 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
2356 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm1[1,1,3,3]
2357 ; SSE2-NEXT:    pand %xmm12, %xmm14
2358 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3]
2359 ; SSE2-NEXT:    por %xmm14, %xmm1
2360 ; SSE2-NEXT:    movdqa %xmm1, %xmm11
2361 ; SSE2-NEXT:    pxor %xmm10, %xmm11
2362 ; SSE2-NEXT:    pcmpeqd %xmm15, %xmm11
2363 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm11[1,0,3,2]
2364 ; SSE2-NEXT:    pand %xmm11, %xmm4
2365 ; SSE2-NEXT:    pxor %xmm10, %xmm4
2366 ; SSE2-NEXT:    pandn %xmm4, %xmm0
2367 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [9223372036854775808,9223372036854775808]
2368 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
2369 ; SSE2-NEXT:    pandn %xmm11, %xmm4
2370 ; SSE2-NEXT:    movdqa {{.*#+}} xmm12 = [9223372036854775807,9223372036854775807]
2371 ; SSE2-NEXT:    pand %xmm12, %xmm1
2372 ; SSE2-NEXT:    por %xmm4, %xmm1
2373 ; SSE2-NEXT:    pand %xmm0, %xmm1
2374 ; SSE2-NEXT:    pandn %xmm13, %xmm0
2375 ; SSE2-NEXT:    por %xmm1, %xmm0
2376 ; SSE2-NEXT:    movdqa %xmm8, %xmm1
2377 ; SSE2-NEXT:    psubq %xmm5, %xmm8
2378 ; SSE2-NEXT:    pxor %xmm9, %xmm5
2379 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
2380 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm4
2381 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm4[0,0,2,2]
2382 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm5
2383 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2384 ; SSE2-NEXT:    pand %xmm13, %xmm5
2385 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2386 ; SSE2-NEXT:    por %xmm5, %xmm4
2387 ; SSE2-NEXT:    pxor %xmm10, %xmm4
2388 ; SSE2-NEXT:    pxor %xmm9, %xmm1
2389 ; SSE2-NEXT:    movdqa %xmm9, %xmm5
2390 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm5
2391 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm5[0,0,2,2]
2392 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
2393 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2394 ; SSE2-NEXT:    pand %xmm13, %xmm1
2395 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2396 ; SSE2-NEXT:    por %xmm1, %xmm5
2397 ; SSE2-NEXT:    pxor %xmm10, %xmm5
2398 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm4
2399 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,0,3,2]
2400 ; SSE2-NEXT:    pand %xmm4, %xmm1
2401 ; SSE2-NEXT:    movdqa %xmm8, %xmm4
2402 ; SSE2-NEXT:    pxor %xmm9, %xmm4
2403 ; SSE2-NEXT:    movdqa %xmm9, %xmm13
2404 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm13
2405 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm13[0,0,2,2]
2406 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm4
2407 ; SSE2-NEXT:    pshufd {{.*#+}} xmm15 = xmm4[1,1,3,3]
2408 ; SSE2-NEXT:    pand %xmm14, %xmm15
2409 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm13[1,1,3,3]
2410 ; SSE2-NEXT:    por %xmm15, %xmm4
2411 ; SSE2-NEXT:    movdqa %xmm4, %xmm13
2412 ; SSE2-NEXT:    pxor %xmm10, %xmm13
2413 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm13
2414 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm13[1,0,3,2]
2415 ; SSE2-NEXT:    pand %xmm13, %xmm5
2416 ; SSE2-NEXT:    pxor %xmm10, %xmm5
2417 ; SSE2-NEXT:    pandn %xmm5, %xmm1
2418 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
2419 ; SSE2-NEXT:    pandn %xmm11, %xmm5
2420 ; SSE2-NEXT:    pand %xmm12, %xmm4
2421 ; SSE2-NEXT:    por %xmm5, %xmm4
2422 ; SSE2-NEXT:    pand %xmm1, %xmm4
2423 ; SSE2-NEXT:    pandn %xmm8, %xmm1
2424 ; SSE2-NEXT:    por %xmm4, %xmm1
2425 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
2426 ; SSE2-NEXT:    psubq %xmm6, %xmm2
2427 ; SSE2-NEXT:    pxor %xmm9, %xmm6
2428 ; SSE2-NEXT:    movdqa %xmm9, %xmm5
2429 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
2430 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm5[0,0,2,2]
2431 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm6
2432 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2433 ; SSE2-NEXT:    pand %xmm8, %xmm6
2434 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2435 ; SSE2-NEXT:    por %xmm6, %xmm5
2436 ; SSE2-NEXT:    pxor %xmm10, %xmm5
2437 ; SSE2-NEXT:    pxor %xmm9, %xmm4
2438 ; SSE2-NEXT:    movdqa %xmm9, %xmm6
2439 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
2440 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
2441 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm4
2442 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2443 ; SSE2-NEXT:    pand %xmm8, %xmm4
2444 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2445 ; SSE2-NEXT:    por %xmm4, %xmm6
2446 ; SSE2-NEXT:    pxor %xmm10, %xmm6
2447 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm5
2448 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm5[1,0,3,2]
2449 ; SSE2-NEXT:    pand %xmm5, %xmm8
2450 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
2451 ; SSE2-NEXT:    pxor %xmm9, %xmm5
2452 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
2453 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm4
2454 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm4[0,0,2,2]
2455 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm5
2456 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2457 ; SSE2-NEXT:    pand %xmm13, %xmm5
2458 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2459 ; SSE2-NEXT:    por %xmm5, %xmm4
2460 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
2461 ; SSE2-NEXT:    pxor %xmm10, %xmm5
2462 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm5
2463 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,0,3,2]
2464 ; SSE2-NEXT:    pand %xmm5, %xmm6
2465 ; SSE2-NEXT:    pxor %xmm10, %xmm6
2466 ; SSE2-NEXT:    pandn %xmm6, %xmm8
2467 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
2468 ; SSE2-NEXT:    pandn %xmm11, %xmm5
2469 ; SSE2-NEXT:    pand %xmm12, %xmm4
2470 ; SSE2-NEXT:    por %xmm5, %xmm4
2471 ; SSE2-NEXT:    pand %xmm8, %xmm4
2472 ; SSE2-NEXT:    pandn %xmm2, %xmm8
2473 ; SSE2-NEXT:    por %xmm4, %xmm8
2474 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
2475 ; SSE2-NEXT:    psubq %xmm7, %xmm3
2476 ; SSE2-NEXT:    pxor %xmm9, %xmm7
2477 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
2478 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm4
2479 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2480 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm7
2481 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
2482 ; SSE2-NEXT:    pand %xmm5, %xmm6
2483 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2484 ; SSE2-NEXT:    por %xmm6, %xmm4
2485 ; SSE2-NEXT:    pxor %xmm10, %xmm4
2486 ; SSE2-NEXT:    pxor %xmm9, %xmm2
2487 ; SSE2-NEXT:    movdqa %xmm9, %xmm5
2488 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
2489 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
2490 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm2
2491 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2492 ; SSE2-NEXT:    pand %xmm6, %xmm2
2493 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
2494 ; SSE2-NEXT:    por %xmm2, %xmm6
2495 ; SSE2-NEXT:    pxor %xmm10, %xmm6
2496 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm4
2497 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[1,0,3,2]
2498 ; SSE2-NEXT:    pand %xmm4, %xmm5
2499 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
2500 ; SSE2-NEXT:    pxor %xmm9, %xmm2
2501 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
2502 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
2503 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
2504 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm2
2505 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2506 ; SSE2-NEXT:    pand %xmm7, %xmm2
2507 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2508 ; SSE2-NEXT:    por %xmm2, %xmm4
2509 ; SSE2-NEXT:    movdqa %xmm4, %xmm2
2510 ; SSE2-NEXT:    pxor %xmm10, %xmm2
2511 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm2
2512 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[1,0,3,2]
2513 ; SSE2-NEXT:    pand %xmm2, %xmm6
2514 ; SSE2-NEXT:    pxor %xmm10, %xmm6
2515 ; SSE2-NEXT:    pandn %xmm6, %xmm5
2516 ; SSE2-NEXT:    movdqa %xmm4, %xmm2
2517 ; SSE2-NEXT:    pandn %xmm11, %xmm2
2518 ; SSE2-NEXT:    pand %xmm12, %xmm4
2519 ; SSE2-NEXT:    por %xmm2, %xmm4
2520 ; SSE2-NEXT:    pand %xmm5, %xmm4
2521 ; SSE2-NEXT:    pandn %xmm3, %xmm5
2522 ; SSE2-NEXT:    por %xmm4, %xmm5
2523 ; SSE2-NEXT:    movdqa %xmm8, %xmm2
2524 ; SSE2-NEXT:    movdqa %xmm5, %xmm3
2525 ; SSE2-NEXT:    retq
2527 ; SSSE3-LABEL: v8i64:
2528 ; SSSE3:       # %bb.0:
2529 ; SSSE3-NEXT:    movdqa %xmm1, %xmm8
2530 ; SSSE3-NEXT:    movdqa %xmm0, %xmm13
2531 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648]
2532 ; SSSE3-NEXT:    psubq %xmm4, %xmm13
2533 ; SSSE3-NEXT:    pxor %xmm9, %xmm4
2534 ; SSSE3-NEXT:    movdqa %xmm9, %xmm1
2535 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm1
2536 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm1[0,0,2,2]
2537 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm4
2538 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2539 ; SSSE3-NEXT:    pand %xmm10, %xmm4
2540 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2541 ; SSSE3-NEXT:    por %xmm4, %xmm1
2542 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm10
2543 ; SSSE3-NEXT:    pxor %xmm10, %xmm1
2544 ; SSSE3-NEXT:    pxor %xmm9, %xmm0
2545 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
2546 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm4
2547 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm4[0,0,2,2]
2548 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
2549 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2550 ; SSSE3-NEXT:    pand %xmm11, %xmm0
2551 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm15 = xmm4[1,1,3,3]
2552 ; SSSE3-NEXT:    por %xmm0, %xmm15
2553 ; SSSE3-NEXT:    pxor %xmm10, %xmm15
2554 ; SSSE3-NEXT:    pcmpeqd %xmm15, %xmm1
2555 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]
2556 ; SSSE3-NEXT:    pand %xmm1, %xmm0
2557 ; SSSE3-NEXT:    movdqa %xmm13, %xmm1
2558 ; SSSE3-NEXT:    pxor %xmm9, %xmm1
2559 ; SSSE3-NEXT:    movdqa %xmm9, %xmm11
2560 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm11
2561 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
2562 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
2563 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm14 = xmm1[1,1,3,3]
2564 ; SSSE3-NEXT:    pand %xmm12, %xmm14
2565 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3]
2566 ; SSSE3-NEXT:    por %xmm14, %xmm1
2567 ; SSSE3-NEXT:    movdqa %xmm1, %xmm11
2568 ; SSSE3-NEXT:    pxor %xmm10, %xmm11
2569 ; SSSE3-NEXT:    pcmpeqd %xmm15, %xmm11
2570 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm11[1,0,3,2]
2571 ; SSSE3-NEXT:    pand %xmm11, %xmm4
2572 ; SSSE3-NEXT:    pxor %xmm10, %xmm4
2573 ; SSSE3-NEXT:    pandn %xmm4, %xmm0
2574 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm11 = [9223372036854775808,9223372036854775808]
2575 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
2576 ; SSSE3-NEXT:    pandn %xmm11, %xmm4
2577 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm12 = [9223372036854775807,9223372036854775807]
2578 ; SSSE3-NEXT:    pand %xmm12, %xmm1
2579 ; SSSE3-NEXT:    por %xmm4, %xmm1
2580 ; SSSE3-NEXT:    pand %xmm0, %xmm1
2581 ; SSSE3-NEXT:    pandn %xmm13, %xmm0
2582 ; SSSE3-NEXT:    por %xmm1, %xmm0
2583 ; SSSE3-NEXT:    movdqa %xmm8, %xmm1
2584 ; SSSE3-NEXT:    psubq %xmm5, %xmm8
2585 ; SSSE3-NEXT:    pxor %xmm9, %xmm5
2586 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
2587 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm4
2588 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm4[0,0,2,2]
2589 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm5
2590 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2591 ; SSSE3-NEXT:    pand %xmm13, %xmm5
2592 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2593 ; SSSE3-NEXT:    por %xmm5, %xmm4
2594 ; SSSE3-NEXT:    pxor %xmm10, %xmm4
2595 ; SSSE3-NEXT:    pxor %xmm9, %xmm1
2596 ; SSSE3-NEXT:    movdqa %xmm9, %xmm5
2597 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm5
2598 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm5[0,0,2,2]
2599 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
2600 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2601 ; SSSE3-NEXT:    pand %xmm13, %xmm1
2602 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2603 ; SSSE3-NEXT:    por %xmm1, %xmm5
2604 ; SSSE3-NEXT:    pxor %xmm10, %xmm5
2605 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm4
2606 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,0,3,2]
2607 ; SSSE3-NEXT:    pand %xmm4, %xmm1
2608 ; SSSE3-NEXT:    movdqa %xmm8, %xmm4
2609 ; SSSE3-NEXT:    pxor %xmm9, %xmm4
2610 ; SSSE3-NEXT:    movdqa %xmm9, %xmm13
2611 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm13
2612 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm14 = xmm13[0,0,2,2]
2613 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm4
2614 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm15 = xmm4[1,1,3,3]
2615 ; SSSE3-NEXT:    pand %xmm14, %xmm15
2616 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm13[1,1,3,3]
2617 ; SSSE3-NEXT:    por %xmm15, %xmm4
2618 ; SSSE3-NEXT:    movdqa %xmm4, %xmm13
2619 ; SSSE3-NEXT:    pxor %xmm10, %xmm13
2620 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm13
2621 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm13[1,0,3,2]
2622 ; SSSE3-NEXT:    pand %xmm13, %xmm5
2623 ; SSSE3-NEXT:    pxor %xmm10, %xmm5
2624 ; SSSE3-NEXT:    pandn %xmm5, %xmm1
2625 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
2626 ; SSSE3-NEXT:    pandn %xmm11, %xmm5
2627 ; SSSE3-NEXT:    pand %xmm12, %xmm4
2628 ; SSSE3-NEXT:    por %xmm5, %xmm4
2629 ; SSSE3-NEXT:    pand %xmm1, %xmm4
2630 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
2631 ; SSSE3-NEXT:    por %xmm4, %xmm1
2632 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
2633 ; SSSE3-NEXT:    psubq %xmm6, %xmm2
2634 ; SSSE3-NEXT:    pxor %xmm9, %xmm6
2635 ; SSSE3-NEXT:    movdqa %xmm9, %xmm5
2636 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm5
2637 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm5[0,0,2,2]
2638 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm6
2639 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2640 ; SSSE3-NEXT:    pand %xmm8, %xmm6
2641 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2642 ; SSSE3-NEXT:    por %xmm6, %xmm5
2643 ; SSSE3-NEXT:    pxor %xmm10, %xmm5
2644 ; SSSE3-NEXT:    pxor %xmm9, %xmm4
2645 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
2646 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
2647 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
2648 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm4
2649 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2650 ; SSSE3-NEXT:    pand %xmm8, %xmm4
2651 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2652 ; SSSE3-NEXT:    por %xmm4, %xmm6
2653 ; SSSE3-NEXT:    pxor %xmm10, %xmm6
2654 ; SSSE3-NEXT:    pcmpeqd %xmm6, %xmm5
2655 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm5[1,0,3,2]
2656 ; SSSE3-NEXT:    pand %xmm5, %xmm8
2657 ; SSSE3-NEXT:    movdqa %xmm2, %xmm5
2658 ; SSSE3-NEXT:    pxor %xmm9, %xmm5
2659 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
2660 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm4
2661 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm4[0,0,2,2]
2662 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm5
2663 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2664 ; SSSE3-NEXT:    pand %xmm13, %xmm5
2665 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2666 ; SSSE3-NEXT:    por %xmm5, %xmm4
2667 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
2668 ; SSSE3-NEXT:    pxor %xmm10, %xmm5
2669 ; SSSE3-NEXT:    pcmpeqd %xmm6, %xmm5
2670 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,0,3,2]
2671 ; SSSE3-NEXT:    pand %xmm5, %xmm6
2672 ; SSSE3-NEXT:    pxor %xmm10, %xmm6
2673 ; SSSE3-NEXT:    pandn %xmm6, %xmm8
2674 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
2675 ; SSSE3-NEXT:    pandn %xmm11, %xmm5
2676 ; SSSE3-NEXT:    pand %xmm12, %xmm4
2677 ; SSSE3-NEXT:    por %xmm5, %xmm4
2678 ; SSSE3-NEXT:    pand %xmm8, %xmm4
2679 ; SSSE3-NEXT:    pandn %xmm2, %xmm8
2680 ; SSSE3-NEXT:    por %xmm4, %xmm8
2681 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
2682 ; SSSE3-NEXT:    psubq %xmm7, %xmm3
2683 ; SSSE3-NEXT:    pxor %xmm9, %xmm7
2684 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
2685 ; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm4
2686 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2687 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm7
2688 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
2689 ; SSSE3-NEXT:    pand %xmm5, %xmm6
2690 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2691 ; SSSE3-NEXT:    por %xmm6, %xmm4
2692 ; SSSE3-NEXT:    pxor %xmm10, %xmm4
2693 ; SSSE3-NEXT:    pxor %xmm9, %xmm2
2694 ; SSSE3-NEXT:    movdqa %xmm9, %xmm5
2695 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm5
2696 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
2697 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm2
2698 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2699 ; SSSE3-NEXT:    pand %xmm6, %xmm2
2700 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
2701 ; SSSE3-NEXT:    por %xmm2, %xmm6
2702 ; SSSE3-NEXT:    pxor %xmm10, %xmm6
2703 ; SSSE3-NEXT:    pcmpeqd %xmm6, %xmm4
2704 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[1,0,3,2]
2705 ; SSSE3-NEXT:    pand %xmm4, %xmm5
2706 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
2707 ; SSSE3-NEXT:    pxor %xmm9, %xmm2
2708 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
2709 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
2710 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
2711 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm2
2712 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2713 ; SSSE3-NEXT:    pand %xmm7, %xmm2
2714 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2715 ; SSSE3-NEXT:    por %xmm2, %xmm4
2716 ; SSSE3-NEXT:    movdqa %xmm4, %xmm2
2717 ; SSSE3-NEXT:    pxor %xmm10, %xmm2
2718 ; SSSE3-NEXT:    pcmpeqd %xmm6, %xmm2
2719 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[1,0,3,2]
2720 ; SSSE3-NEXT:    pand %xmm2, %xmm6
2721 ; SSSE3-NEXT:    pxor %xmm10, %xmm6
2722 ; SSSE3-NEXT:    pandn %xmm6, %xmm5
2723 ; SSSE3-NEXT:    movdqa %xmm4, %xmm2
2724 ; SSSE3-NEXT:    pandn %xmm11, %xmm2
2725 ; SSSE3-NEXT:    pand %xmm12, %xmm4
2726 ; SSSE3-NEXT:    por %xmm2, %xmm4
2727 ; SSSE3-NEXT:    pand %xmm5, %xmm4
2728 ; SSSE3-NEXT:    pandn %xmm3, %xmm5
2729 ; SSSE3-NEXT:    por %xmm4, %xmm5
2730 ; SSSE3-NEXT:    movdqa %xmm8, %xmm2
2731 ; SSSE3-NEXT:    movdqa %xmm5, %xmm3
2732 ; SSSE3-NEXT:    retq
2734 ; SSE41-LABEL: v8i64:
2735 ; SSE41:       # %bb.0:
2736 ; SSE41-NEXT:    movdqa %xmm0, %xmm8
2737 ; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648]
2738 ; SSE41-NEXT:    movdqa %xmm0, %xmm11
2739 ; SSE41-NEXT:    psubq %xmm4, %xmm8
2740 ; SSE41-NEXT:    pxor %xmm9, %xmm4
2741 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
2742 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm0
2743 ; SSE41-NEXT:    pshufd {{.*#+}} xmm10 = xmm0[0,0,2,2]
2744 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm4
2745 ; SSE41-NEXT:    pshufd {{.*#+}} xmm12 = xmm4[1,1,3,3]
2746 ; SSE41-NEXT:    pand %xmm10, %xmm12
2747 ; SSE41-NEXT:    pshufd {{.*#+}} xmm15 = xmm0[1,1,3,3]
2748 ; SSE41-NEXT:    por %xmm12, %xmm15
2749 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm10
2750 ; SSE41-NEXT:    pxor %xmm10, %xmm15
2751 ; SSE41-NEXT:    pxor %xmm9, %xmm11
2752 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
2753 ; SSE41-NEXT:    pcmpgtd %xmm11, %xmm0
2754 ; SSE41-NEXT:    pshufd {{.*#+}} xmm12 = xmm0[0,0,2,2]
2755 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm11
2756 ; SSE41-NEXT:    pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3]
2757 ; SSE41-NEXT:    pand %xmm12, %xmm11
2758 ; SSE41-NEXT:    pshufd {{.*#+}} xmm12 = xmm0[1,1,3,3]
2759 ; SSE41-NEXT:    por %xmm11, %xmm12
2760 ; SSE41-NEXT:    pxor %xmm10, %xmm12
2761 ; SSE41-NEXT:    pcmpeqq %xmm12, %xmm15
2762 ; SSE41-NEXT:    movdqa %xmm8, %xmm0
2763 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2764 ; SSE41-NEXT:    movdqa %xmm9, %xmm11
2765 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm11
2766 ; SSE41-NEXT:    pshufd {{.*#+}} xmm13 = xmm11[0,0,2,2]
2767 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
2768 ; SSE41-NEXT:    pshufd {{.*#+}} xmm14 = xmm0[1,1,3,3]
2769 ; SSE41-NEXT:    pand %xmm13, %xmm14
2770 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm11[1,1,3,3]
2771 ; SSE41-NEXT:    por %xmm14, %xmm0
2772 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
2773 ; SSE41-NEXT:    pxor %xmm10, %xmm4
2774 ; SSE41-NEXT:    pcmpeqq %xmm12, %xmm4
2775 ; SSE41-NEXT:    pxor %xmm10, %xmm4
2776 ; SSE41-NEXT:    pandn %xmm4, %xmm15
2777 ; SSE41-NEXT:    movapd {{.*#+}} xmm12 = [9223372036854775807,9223372036854775807]
2778 ; SSE41-NEXT:    movapd {{.*#+}} xmm11 = [9223372036854775808,9223372036854775808]
2779 ; SSE41-NEXT:    movapd %xmm11, %xmm4
2780 ; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm4
2781 ; SSE41-NEXT:    movdqa %xmm15, %xmm0
2782 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm8
2783 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
2784 ; SSE41-NEXT:    psubq %xmm5, %xmm1
2785 ; SSE41-NEXT:    pxor %xmm9, %xmm5
2786 ; SSE41-NEXT:    movdqa %xmm9, %xmm4
2787 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm4
2788 ; SSE41-NEXT:    pshufd {{.*#+}} xmm13 = xmm4[0,0,2,2]
2789 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm5
2790 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2791 ; SSE41-NEXT:    pand %xmm13, %xmm5
2792 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2793 ; SSE41-NEXT:    por %xmm5, %xmm4
2794 ; SSE41-NEXT:    pxor %xmm10, %xmm4
2795 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2796 ; SSE41-NEXT:    movdqa %xmm9, %xmm5
2797 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
2798 ; SSE41-NEXT:    pshufd {{.*#+}} xmm13 = xmm5[0,0,2,2]
2799 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
2800 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2801 ; SSE41-NEXT:    pand %xmm13, %xmm0
2802 ; SSE41-NEXT:    pshufd {{.*#+}} xmm14 = xmm5[1,1,3,3]
2803 ; SSE41-NEXT:    por %xmm0, %xmm14
2804 ; SSE41-NEXT:    pxor %xmm10, %xmm14
2805 ; SSE41-NEXT:    pcmpeqq %xmm14, %xmm4
2806 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
2807 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2808 ; SSE41-NEXT:    movdqa %xmm9, %xmm13
2809 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm13
2810 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm13[0,0,2,2]
2811 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
2812 ; SSE41-NEXT:    pshufd {{.*#+}} xmm15 = xmm0[1,1,3,3]
2813 ; SSE41-NEXT:    pand %xmm5, %xmm15
2814 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm13[1,1,3,3]
2815 ; SSE41-NEXT:    por %xmm15, %xmm0
2816 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
2817 ; SSE41-NEXT:    pxor %xmm10, %xmm5
2818 ; SSE41-NEXT:    pcmpeqq %xmm14, %xmm5
2819 ; SSE41-NEXT:    pxor %xmm10, %xmm5
2820 ; SSE41-NEXT:    pandn %xmm5, %xmm4
2821 ; SSE41-NEXT:    movapd %xmm11, %xmm5
2822 ; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm5
2823 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
2824 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
2825 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
2826 ; SSE41-NEXT:    psubq %xmm6, %xmm2
2827 ; SSE41-NEXT:    pxor %xmm9, %xmm6
2828 ; SSE41-NEXT:    movdqa %xmm9, %xmm4
2829 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm4
2830 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2831 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm6
2832 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2833 ; SSE41-NEXT:    pand %xmm5, %xmm6
2834 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2835 ; SSE41-NEXT:    por %xmm6, %xmm4
2836 ; SSE41-NEXT:    pxor %xmm10, %xmm4
2837 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2838 ; SSE41-NEXT:    movdqa %xmm9, %xmm5
2839 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
2840 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
2841 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
2842 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2843 ; SSE41-NEXT:    pand %xmm6, %xmm0
2844 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2845 ; SSE41-NEXT:    por %xmm0, %xmm5
2846 ; SSE41-NEXT:    pxor %xmm10, %xmm5
2847 ; SSE41-NEXT:    pcmpeqq %xmm5, %xmm4
2848 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
2849 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2850 ; SSE41-NEXT:    movdqa %xmm9, %xmm6
2851 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
2852 ; SSE41-NEXT:    pshufd {{.*#+}} xmm13 = xmm6[0,0,2,2]
2853 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
2854 ; SSE41-NEXT:    pshufd {{.*#+}} xmm14 = xmm0[1,1,3,3]
2855 ; SSE41-NEXT:    pand %xmm13, %xmm14
2856 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
2857 ; SSE41-NEXT:    por %xmm14, %xmm0
2858 ; SSE41-NEXT:    movdqa %xmm0, %xmm6
2859 ; SSE41-NEXT:    pxor %xmm10, %xmm6
2860 ; SSE41-NEXT:    pcmpeqq %xmm5, %xmm6
2861 ; SSE41-NEXT:    pxor %xmm10, %xmm6
2862 ; SSE41-NEXT:    pandn %xmm6, %xmm4
2863 ; SSE41-NEXT:    movapd %xmm11, %xmm5
2864 ; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm5
2865 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
2866 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm2
2867 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
2868 ; SSE41-NEXT:    psubq %xmm7, %xmm3
2869 ; SSE41-NEXT:    pxor %xmm9, %xmm7
2870 ; SSE41-NEXT:    movdqa %xmm9, %xmm4
2871 ; SSE41-NEXT:    pcmpgtd %xmm7, %xmm4
2872 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2873 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm7
2874 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
2875 ; SSE41-NEXT:    pand %xmm5, %xmm6
2876 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2877 ; SSE41-NEXT:    por %xmm6, %xmm4
2878 ; SSE41-NEXT:    pxor %xmm10, %xmm4
2879 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2880 ; SSE41-NEXT:    movdqa %xmm9, %xmm5
2881 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
2882 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
2883 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
2884 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2885 ; SSE41-NEXT:    pand %xmm6, %xmm0
2886 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2887 ; SSE41-NEXT:    por %xmm0, %xmm5
2888 ; SSE41-NEXT:    pxor %xmm10, %xmm5
2889 ; SSE41-NEXT:    pcmpeqq %xmm5, %xmm4
2890 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
2891 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2892 ; SSE41-NEXT:    movdqa %xmm9, %xmm6
2893 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
2894 ; SSE41-NEXT:    pshufd {{.*#+}} xmm13 = xmm6[0,0,2,2]
2895 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
2896 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
2897 ; SSE41-NEXT:    pand %xmm13, %xmm7
2898 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
2899 ; SSE41-NEXT:    por %xmm7, %xmm0
2900 ; SSE41-NEXT:    movdqa %xmm0, %xmm6
2901 ; SSE41-NEXT:    pxor %xmm10, %xmm6
2902 ; SSE41-NEXT:    pcmpeqq %xmm5, %xmm6
2903 ; SSE41-NEXT:    pxor %xmm10, %xmm6
2904 ; SSE41-NEXT:    pandn %xmm6, %xmm4
2905 ; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm11
2906 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
2907 ; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm3
2908 ; SSE41-NEXT:    movapd %xmm8, %xmm0
2909 ; SSE41-NEXT:    retq
2911 ; AVX1-LABEL: v8i64:
2912 ; AVX1:       # %bb.0:
2913 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm8
2914 ; AVX1-NEXT:    vpxor %xmm12, %xmm12, %xmm12
2915 ; AVX1-NEXT:    vpcmpgtq %xmm8, %xmm12, %xmm7
2916 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
2917 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm9
2918 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
2919 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm12, %xmm7
2920 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm10
2921 ; AVX1-NEXT:    vpcmpeqq %xmm9, %xmm10, %xmm7
2922 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm9
2923 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm12, %xmm7
2924 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm11
2925 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm12, %xmm7
2926 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm7
2927 ; AVX1-NEXT:    vpcmpeqq %xmm11, %xmm7, %xmm5
2928 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm5
2929 ; AVX1-NEXT:    vinsertf128 $1, %xmm9, %ymm5, %ymm9
2930 ; AVX1-NEXT:    vpsubq %xmm8, %xmm6, %xmm8
2931 ; AVX1-NEXT:    vpcmpgtq %xmm8, %xmm12, %xmm5
2932 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm6
2933 ; AVX1-NEXT:    vpcmpeqq %xmm6, %xmm10, %xmm6
2934 ; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm6
2935 ; AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
2936 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm12, %xmm2
2937 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
2938 ; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm7, %xmm2
2939 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
2940 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm2, %ymm2
2941 ; AVX1-NEXT:    vandpd %ymm2, %ymm9, %ymm6
2942 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm0, %ymm7
2943 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm9 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
2944 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm10 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2945 ; AVX1-NEXT:    vblendvpd %ymm7, %ymm9, %ymm10, %ymm7
2946 ; AVX1-NEXT:    vinsertf128 $1, %xmm8, %ymm0, %ymm0
2947 ; AVX1-NEXT:    vblendvpd %ymm6, %ymm7, %ymm0, %ymm0
2948 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm13
2949 ; AVX1-NEXT:    vpcmpgtq %xmm13, %xmm12, %xmm7
2950 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm7
2951 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2952 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm12, %xmm5
2953 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm5
2954 ; AVX1-NEXT:    vpcmpeqq %xmm7, %xmm5, %xmm7
2955 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm8
2956 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm12, %xmm7
2957 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm11
2958 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm12, %xmm7
2959 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm7
2960 ; AVX1-NEXT:    vpcmpeqq %xmm11, %xmm7, %xmm6
2961 ; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm6
2962 ; AVX1-NEXT:    vinsertf128 $1, %xmm8, %ymm6, %ymm8
2963 ; AVX1-NEXT:    vpsubq %xmm13, %xmm2, %xmm11
2964 ; AVX1-NEXT:    vpcmpgtq %xmm11, %xmm12, %xmm6
2965 ; AVX1-NEXT:    vpxor %xmm4, %xmm6, %xmm2
2966 ; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm5, %xmm2
2967 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2
2968 ; AVX1-NEXT:    vpsubq %xmm3, %xmm1, %xmm1
2969 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm12, %xmm3
2970 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
2971 ; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm7, %xmm3
2972 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
2973 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
2974 ; AVX1-NEXT:    vandpd %ymm2, %ymm8, %ymm2
2975 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm3
2976 ; AVX1-NEXT:    vblendvpd %ymm3, %ymm9, %ymm10, %ymm3
2977 ; AVX1-NEXT:    vinsertf128 $1, %xmm11, %ymm1, %ymm1
2978 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm3, %ymm1, %ymm1
2979 ; AVX1-NEXT:    retq
2981 ; AVX2-LABEL: v8i64:
2982 ; AVX2:       # %bb.0:
2983 ; AVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
2984 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm4, %ymm5
2985 ; AVX2-NEXT:    vpcmpeqd %ymm6, %ymm6, %ymm6
2986 ; AVX2-NEXT:    vpxor %ymm6, %ymm5, %ymm5
2987 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm4, %ymm7
2988 ; AVX2-NEXT:    vpxor %ymm6, %ymm7, %ymm7
2989 ; AVX2-NEXT:    vpcmpeqq %ymm5, %ymm7, %ymm5
2990 ; AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
2991 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm4, %ymm2
2992 ; AVX2-NEXT:    vpxor %ymm6, %ymm2, %ymm2
2993 ; AVX2-NEXT:    vpcmpeqq %ymm2, %ymm7, %ymm2
2994 ; AVX2-NEXT:    vpxor %ymm6, %ymm2, %ymm2
2995 ; AVX2-NEXT:    vpandn %ymm2, %ymm5, %ymm2
2996 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm5 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
2997 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm7 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2998 ; AVX2-NEXT:    vblendvpd %ymm0, %ymm5, %ymm7, %ymm8
2999 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm8, %ymm0, %ymm0
3000 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm4, %ymm2
3001 ; AVX2-NEXT:    vpxor %ymm6, %ymm2, %ymm2
3002 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm4, %ymm8
3003 ; AVX2-NEXT:    vpxor %ymm6, %ymm8, %ymm8
3004 ; AVX2-NEXT:    vpcmpeqq %ymm2, %ymm8, %ymm2
3005 ; AVX2-NEXT:    vpsubq %ymm3, %ymm1, %ymm1
3006 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm4, %ymm3
3007 ; AVX2-NEXT:    vpxor %ymm6, %ymm3, %ymm3
3008 ; AVX2-NEXT:    vpcmpeqq %ymm3, %ymm8, %ymm3
3009 ; AVX2-NEXT:    vpxor %ymm6, %ymm3, %ymm3
3010 ; AVX2-NEXT:    vpandn %ymm3, %ymm2, %ymm2
3011 ; AVX2-NEXT:    vblendvpd %ymm1, %ymm5, %ymm7, %ymm3
3012 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm3, %ymm1, %ymm1
3013 ; AVX2-NEXT:    retq
3015 ; AVX512-LABEL: v8i64:
3016 ; AVX512:       # %bb.0:
3017 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
3018 ; AVX512-NEXT:    vpcmpnltq %zmm2, %zmm1, %k0
3019 ; AVX512-NEXT:    vpcmpnltq %zmm2, %zmm0, %k1
3020 ; AVX512-NEXT:    kxorw %k0, %k1, %k0
3021 ; AVX512-NEXT:    vpsubq %zmm1, %zmm0, %zmm0
3022 ; AVX512-NEXT:    vpcmpnltq %zmm2, %zmm0, %k2
3023 ; AVX512-NEXT:    kxorw %k2, %k1, %k1
3024 ; AVX512-NEXT:    kandw %k1, %k0, %k1
3025 ; AVX512-NEXT:    vpcmpgtq %zmm0, %zmm2, %k2
3026 ; AVX512-NEXT:    vpbroadcastq {{.*#+}} zmm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
3027 ; AVX512-NEXT:    vpbroadcastq {{.*}}(%rip), %zmm1 {%k2}
3028 ; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1}
3029 ; AVX512-NEXT:    retq
3030   %z = call <8 x i64> @llvm.ssub.sat.v8i64(<8 x i64> %x, <8 x i64> %y)
3031   ret <8 x i64> %z
3034 define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind {
3035 ; SSE-LABEL: v2i128:
3036 ; SSE:       # %bb.0:
3037 ; SSE-NEXT:    pushq %r15
3038 ; SSE-NEXT:    pushq %r14
3039 ; SSE-NEXT:    pushq %r13
3040 ; SSE-NEXT:    pushq %r12
3041 ; SSE-NEXT:    pushq %rbx
3042 ; SSE-NEXT:    movq %rdi, %rax
3043 ; SSE-NEXT:    movq {{[0-9]+}}(%rsp), %r11
3044 ; SSE-NEXT:    movq {{[0-9]+}}(%rsp), %r14
3045 ; SSE-NEXT:    subq {{[0-9]+}}(%rsp), %rcx
3046 ; SSE-NEXT:    movq %r8, %r13
3047 ; SSE-NEXT:    sbbq %r14, %r13
3048 ; SSE-NEXT:    movq %r13, %r10
3049 ; SSE-NEXT:    sarq $63, %r10
3050 ; SSE-NEXT:    xorl %edi, %edi
3051 ; SSE-NEXT:    testq %r13, %r13
3052 ; SSE-NEXT:    setns %dil
3053 ; SSE-NEXT:    movabsq $9223372036854775807, %r12 # imm = 0x7FFFFFFFFFFFFFFF
3054 ; SSE-NEXT:    leaq (%rdi,%r12), %r15
3055 ; SSE-NEXT:    testq %r8, %r8
3056 ; SSE-NEXT:    setns %r8b
3057 ; SSE-NEXT:    cmpb %dil, %r8b
3058 ; SSE-NEXT:    setne %dil
3059 ; SSE-NEXT:    testq %r14, %r14
3060 ; SSE-NEXT:    setns %bl
3061 ; SSE-NEXT:    cmpb %bl, %r8b
3062 ; SSE-NEXT:    setne %bl
3063 ; SSE-NEXT:    testb %dil, %bl
3064 ; SSE-NEXT:    cmoveq %r13, %r15
3065 ; SSE-NEXT:    cmoveq %rcx, %r10
3066 ; SSE-NEXT:    subq %r9, %rsi
3067 ; SSE-NEXT:    movq %rdx, %rdi
3068 ; SSE-NEXT:    sbbq %r11, %rdi
3069 ; SSE-NEXT:    setns %bl
3070 ; SSE-NEXT:    movzbl %bl, %ebx
3071 ; SSE-NEXT:    addq %rbx, %r12
3072 ; SSE-NEXT:    movq %rdi, %rcx
3073 ; SSE-NEXT:    sarq $63, %rcx
3074 ; SSE-NEXT:    testq %r11, %r11
3075 ; SSE-NEXT:    setns %r8b
3076 ; SSE-NEXT:    testq %rdx, %rdx
3077 ; SSE-NEXT:    setns %dl
3078 ; SSE-NEXT:    cmpb %r8b, %dl
3079 ; SSE-NEXT:    setne %r8b
3080 ; SSE-NEXT:    cmpb %bl, %dl
3081 ; SSE-NEXT:    setne %dl
3082 ; SSE-NEXT:    testb %dl, %r8b
3083 ; SSE-NEXT:    cmoveq %rsi, %rcx
3084 ; SSE-NEXT:    cmoveq %rdi, %r12
3085 ; SSE-NEXT:    movq %r15, 24(%rax)
3086 ; SSE-NEXT:    movq %r10, 16(%rax)
3087 ; SSE-NEXT:    movq %r12, 8(%rax)
3088 ; SSE-NEXT:    movq %rcx, (%rax)
3089 ; SSE-NEXT:    popq %rbx
3090 ; SSE-NEXT:    popq %r12
3091 ; SSE-NEXT:    popq %r13
3092 ; SSE-NEXT:    popq %r14
3093 ; SSE-NEXT:    popq %r15
3094 ; SSE-NEXT:    retq
3096 ; AVX-LABEL: v2i128:
3097 ; AVX:       # %bb.0:
3098 ; AVX-NEXT:    pushq %r15
3099 ; AVX-NEXT:    pushq %r14
3100 ; AVX-NEXT:    pushq %r13
3101 ; AVX-NEXT:    pushq %r12
3102 ; AVX-NEXT:    pushq %rbx
3103 ; AVX-NEXT:    movq %rdi, %rax
3104 ; AVX-NEXT:    movq {{[0-9]+}}(%rsp), %r11
3105 ; AVX-NEXT:    movq {{[0-9]+}}(%rsp), %r14
3106 ; AVX-NEXT:    subq {{[0-9]+}}(%rsp), %rcx
3107 ; AVX-NEXT:    movq %r8, %r13
3108 ; AVX-NEXT:    sbbq %r14, %r13
3109 ; AVX-NEXT:    movq %r13, %r10
3110 ; AVX-NEXT:    sarq $63, %r10
3111 ; AVX-NEXT:    xorl %edi, %edi
3112 ; AVX-NEXT:    testq %r13, %r13
3113 ; AVX-NEXT:    setns %dil
3114 ; AVX-NEXT:    movabsq $9223372036854775807, %r12 # imm = 0x7FFFFFFFFFFFFFFF
3115 ; AVX-NEXT:    leaq (%rdi,%r12), %r15
3116 ; AVX-NEXT:    testq %r8, %r8
3117 ; AVX-NEXT:    setns %r8b
3118 ; AVX-NEXT:    cmpb %dil, %r8b
3119 ; AVX-NEXT:    setne %dil
3120 ; AVX-NEXT:    testq %r14, %r14
3121 ; AVX-NEXT:    setns %bl
3122 ; AVX-NEXT:    cmpb %bl, %r8b
3123 ; AVX-NEXT:    setne %bl
3124 ; AVX-NEXT:    testb %dil, %bl
3125 ; AVX-NEXT:    cmoveq %r13, %r15
3126 ; AVX-NEXT:    cmoveq %rcx, %r10
3127 ; AVX-NEXT:    subq %r9, %rsi
3128 ; AVX-NEXT:    movq %rdx, %rdi
3129 ; AVX-NEXT:    sbbq %r11, %rdi
3130 ; AVX-NEXT:    setns %bl
3131 ; AVX-NEXT:    movzbl %bl, %ebx
3132 ; AVX-NEXT:    addq %rbx, %r12
3133 ; AVX-NEXT:    movq %rdi, %rcx
3134 ; AVX-NEXT:    sarq $63, %rcx
3135 ; AVX-NEXT:    testq %r11, %r11
3136 ; AVX-NEXT:    setns %r8b
3137 ; AVX-NEXT:    testq %rdx, %rdx
3138 ; AVX-NEXT:    setns %dl
3139 ; AVX-NEXT:    cmpb %r8b, %dl
3140 ; AVX-NEXT:    setne %r8b
3141 ; AVX-NEXT:    cmpb %bl, %dl
3142 ; AVX-NEXT:    setne %dl
3143 ; AVX-NEXT:    testb %dl, %r8b
3144 ; AVX-NEXT:    cmoveq %rsi, %rcx
3145 ; AVX-NEXT:    cmoveq %rdi, %r12
3146 ; AVX-NEXT:    movq %r15, 24(%rax)
3147 ; AVX-NEXT:    movq %r10, 16(%rax)
3148 ; AVX-NEXT:    movq %r12, 8(%rax)
3149 ; AVX-NEXT:    movq %rcx, (%rax)
3150 ; AVX-NEXT:    popq %rbx
3151 ; AVX-NEXT:    popq %r12
3152 ; AVX-NEXT:    popq %r13
3153 ; AVX-NEXT:    popq %r14
3154 ; AVX-NEXT:    popq %r15
3155 ; AVX-NEXT:    retq
3156   %z = call <2 x i128> @llvm.ssub.sat.v2i128(<2 x i128> %x, <2 x i128> %y)
3157   ret <2 x i128> %z