[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / ssub_sat_vec.ll
blob73fbb7c0029b6c424b966d4dfcc6ec60629aad23
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 ; AVX-LABEL: v8i8:
214 ; AVX:       # %bb.0:
215 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
216 ; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
217 ; AVX-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
218 ; AVX-NEXT:    vmovq %xmm0, (%rdx)
219 ; AVX-NEXT:    retq
220   %x = load <8 x i8>, <8 x i8>* %px
221   %y = load <8 x i8>, <8 x i8>* %py
222   %z = call <8 x i8> @llvm.ssub.sat.v8i8(<8 x i8> %x, <8 x i8> %y)
223   store <8 x i8> %z, <8 x i8>* %pz
224   ret void
227 define void @v4i8(<4 x i8>* %px, <4 x i8>* %py, <4 x i8>* %pz) nounwind {
228 ; SSE-LABEL: v4i8:
229 ; SSE:       # %bb.0:
230 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
231 ; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
232 ; SSE-NEXT:    psubsb %xmm1, %xmm0
233 ; SSE-NEXT:    movd %xmm0, (%rdx)
234 ; SSE-NEXT:    retq
236 ; AVX-LABEL: v4i8:
237 ; AVX:       # %bb.0:
238 ; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
239 ; AVX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
240 ; AVX-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
241 ; AVX-NEXT:    vmovd %xmm0, (%rdx)
242 ; AVX-NEXT:    retq
243   %x = load <4 x i8>, <4 x i8>* %px
244   %y = load <4 x i8>, <4 x i8>* %py
245   %z = call <4 x i8> @llvm.ssub.sat.v4i8(<4 x i8> %x, <4 x i8> %y)
246   store <4 x i8> %z, <4 x i8>* %pz
247   ret void
250 define void @v2i8(<2 x i8>* %px, <2 x i8>* %py, <2 x i8>* %pz) nounwind {
251 ; SSE2-LABEL: v2i8:
252 ; SSE2:       # %bb.0:
253 ; SSE2-NEXT:    movzwl (%rdi), %eax
254 ; SSE2-NEXT:    movd %eax, %xmm0
255 ; SSE2-NEXT:    movzwl (%rsi), %eax
256 ; SSE2-NEXT:    movd %eax, %xmm1
257 ; SSE2-NEXT:    psubsb %xmm1, %xmm0
258 ; SSE2-NEXT:    movd %xmm0, %eax
259 ; SSE2-NEXT:    movw %ax, (%rdx)
260 ; SSE2-NEXT:    retq
262 ; SSSE3-LABEL: v2i8:
263 ; SSSE3:       # %bb.0:
264 ; SSSE3-NEXT:    movzwl (%rdi), %eax
265 ; SSSE3-NEXT:    movd %eax, %xmm0
266 ; SSSE3-NEXT:    movzwl (%rsi), %eax
267 ; SSSE3-NEXT:    movd %eax, %xmm1
268 ; SSSE3-NEXT:    psubsb %xmm1, %xmm0
269 ; SSSE3-NEXT:    movd %xmm0, %eax
270 ; SSSE3-NEXT:    movw %ax, (%rdx)
271 ; SSSE3-NEXT:    retq
273 ; SSE41-LABEL: v2i8:
274 ; SSE41:       # %bb.0:
275 ; SSE41-NEXT:    movzwl (%rdi), %eax
276 ; SSE41-NEXT:    movd %eax, %xmm0
277 ; SSE41-NEXT:    movzwl (%rsi), %eax
278 ; SSE41-NEXT:    movd %eax, %xmm1
279 ; SSE41-NEXT:    psubsb %xmm1, %xmm0
280 ; SSE41-NEXT:    pextrw $0, %xmm0, (%rdx)
281 ; SSE41-NEXT:    retq
283 ; AVX-LABEL: v2i8:
284 ; AVX:       # %bb.0:
285 ; AVX-NEXT:    movzwl (%rdi), %eax
286 ; AVX-NEXT:    vmovd %eax, %xmm0
287 ; AVX-NEXT:    movzwl (%rsi), %eax
288 ; AVX-NEXT:    vmovd %eax, %xmm1
289 ; AVX-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
290 ; AVX-NEXT:    vpextrw $0, %xmm0, (%rdx)
291 ; AVX-NEXT:    retq
292   %x = load <2 x i8>, <2 x i8>* %px
293   %y = load <2 x i8>, <2 x i8>* %py
294   %z = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %x, <2 x i8> %y)
295   store <2 x i8> %z, <2 x i8>* %pz
296   ret void
299 define void @v4i16(<4 x i16>* %px, <4 x i16>* %py, <4 x i16>* %pz) nounwind {
300 ; SSE-LABEL: v4i16:
301 ; SSE:       # %bb.0:
302 ; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
303 ; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
304 ; SSE-NEXT:    psubsw %xmm1, %xmm0
305 ; SSE-NEXT:    movq %xmm0, (%rdx)
306 ; SSE-NEXT:    retq
308 ; AVX-LABEL: v4i16:
309 ; AVX:       # %bb.0:
310 ; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
311 ; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
312 ; AVX-NEXT:    vpsubsw %xmm1, %xmm0, %xmm0
313 ; AVX-NEXT:    vmovq %xmm0, (%rdx)
314 ; AVX-NEXT:    retq
315   %x = load <4 x i16>, <4 x i16>* %px
316   %y = load <4 x i16>, <4 x i16>* %py
317   %z = call <4 x i16> @llvm.ssub.sat.v4i16(<4 x i16> %x, <4 x i16> %y)
318   store <4 x i16> %z, <4 x i16>* %pz
319   ret void
322 define void @v2i16(<2 x i16>* %px, <2 x i16>* %py, <2 x i16>* %pz) nounwind {
323 ; SSE-LABEL: v2i16:
324 ; SSE:       # %bb.0:
325 ; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
326 ; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
327 ; SSE-NEXT:    psubsw %xmm1, %xmm0
328 ; SSE-NEXT:    movd %xmm0, (%rdx)
329 ; SSE-NEXT:    retq
331 ; AVX-LABEL: v2i16:
332 ; AVX:       # %bb.0:
333 ; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
334 ; AVX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
335 ; AVX-NEXT:    vpsubsw %xmm1, %xmm0, %xmm0
336 ; AVX-NEXT:    vmovd %xmm0, (%rdx)
337 ; AVX-NEXT:    retq
338   %x = load <2 x i16>, <2 x i16>* %px
339   %y = load <2 x i16>, <2 x i16>* %py
340   %z = call <2 x i16> @llvm.ssub.sat.v2i16(<2 x i16> %x, <2 x i16> %y)
341   store <2 x i16> %z, <2 x i16>* %pz
342   ret void
345 define <12 x i8> @v12i8(<12 x i8> %x, <12 x i8> %y) nounwind {
346 ; SSE-LABEL: v12i8:
347 ; SSE:       # %bb.0:
348 ; SSE-NEXT:    psubsb %xmm1, %xmm0
349 ; SSE-NEXT:    retq
351 ; AVX-LABEL: v12i8:
352 ; AVX:       # %bb.0:
353 ; AVX-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
354 ; AVX-NEXT:    retq
355   %z = call <12 x i8> @llvm.ssub.sat.v12i8(<12 x i8> %x, <12 x i8> %y)
356   ret <12 x i8> %z
359 define void @v12i16(<12 x i16>* %px, <12 x i16>* %py, <12 x i16>* %pz) nounwind {
360 ; SSE-LABEL: v12i16:
361 ; SSE:       # %bb.0:
362 ; SSE-NEXT:    movdqa (%rdi), %xmm0
363 ; SSE-NEXT:    movdqa 16(%rdi), %xmm1
364 ; SSE-NEXT:    psubsw (%rsi), %xmm0
365 ; SSE-NEXT:    psubsw 16(%rsi), %xmm1
366 ; SSE-NEXT:    movq %xmm1, 16(%rdx)
367 ; SSE-NEXT:    movdqa %xmm0, (%rdx)
368 ; SSE-NEXT:    retq
370 ; AVX1-LABEL: v12i16:
371 ; AVX1:       # %bb.0:
372 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
373 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
374 ; AVX1-NEXT:    vpsubsw 16(%rsi), %xmm1, %xmm1
375 ; AVX1-NEXT:    vpsubsw (%rsi), %xmm0, %xmm0
376 ; AVX1-NEXT:    vmovdqa %xmm0, (%rdx)
377 ; AVX1-NEXT:    vmovq %xmm1, 16(%rdx)
378 ; AVX1-NEXT:    retq
380 ; AVX2-LABEL: v12i16:
381 ; AVX2:       # %bb.0:
382 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
383 ; AVX2-NEXT:    vpsubsw (%rsi), %ymm0, %ymm0
384 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
385 ; AVX2-NEXT:    vmovq %xmm1, 16(%rdx)
386 ; AVX2-NEXT:    vmovdqa %xmm0, (%rdx)
387 ; AVX2-NEXT:    vzeroupper
388 ; AVX2-NEXT:    retq
390 ; AVX512-LABEL: v12i16:
391 ; AVX512:       # %bb.0:
392 ; AVX512-NEXT:    vmovdqa (%rdi), %ymm0
393 ; AVX512-NEXT:    vpsubsw (%rsi), %ymm0, %ymm0
394 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
395 ; AVX512-NEXT:    vmovq %xmm1, 16(%rdx)
396 ; AVX512-NEXT:    vmovdqa %xmm0, (%rdx)
397 ; AVX512-NEXT:    vzeroupper
398 ; AVX512-NEXT:    retq
399   %x = load <12 x i16>, <12 x i16>* %px
400   %y = load <12 x i16>, <12 x i16>* %py
401   %z = call <12 x i16> @llvm.ssub.sat.v12i16(<12 x i16> %x, <12 x i16> %y)
402   store <12 x i16> %z, <12 x i16>* %pz
403   ret void
406 ; Scalarization
408 define void @v1i8(<1 x i8>* %px, <1 x i8>* %py, <1 x i8>* %pz) nounwind {
409 ; SSE-LABEL: v1i8:
410 ; SSE:       # %bb.0:
411 ; SSE-NEXT:    movb (%rdi), %al
412 ; SSE-NEXT:    movb (%rsi), %cl
413 ; SSE-NEXT:    xorl %esi, %esi
414 ; SSE-NEXT:    cmpb %cl, %al
415 ; SSE-NEXT:    setns %sil
416 ; SSE-NEXT:    addl $127, %esi
417 ; SSE-NEXT:    subb %cl, %al
418 ; SSE-NEXT:    movzbl %al, %eax
419 ; SSE-NEXT:    cmovol %esi, %eax
420 ; SSE-NEXT:    movb %al, (%rdx)
421 ; SSE-NEXT:    retq
423 ; AVX-LABEL: v1i8:
424 ; AVX:       # %bb.0:
425 ; AVX-NEXT:    movb (%rdi), %al
426 ; AVX-NEXT:    movb (%rsi), %cl
427 ; AVX-NEXT:    xorl %esi, %esi
428 ; AVX-NEXT:    cmpb %cl, %al
429 ; AVX-NEXT:    setns %sil
430 ; AVX-NEXT:    addl $127, %esi
431 ; AVX-NEXT:    subb %cl, %al
432 ; AVX-NEXT:    movzbl %al, %eax
433 ; AVX-NEXT:    cmovol %esi, %eax
434 ; AVX-NEXT:    movb %al, (%rdx)
435 ; AVX-NEXT:    retq
436   %x = load <1 x i8>, <1 x i8>* %px
437   %y = load <1 x i8>, <1 x i8>* %py
438   %z = call <1 x i8> @llvm.ssub.sat.v1i8(<1 x i8> %x, <1 x i8> %y)
439   store <1 x i8> %z, <1 x i8>* %pz
440   ret void
443 define void @v1i16(<1 x i16>* %px, <1 x i16>* %py, <1 x i16>* %pz) nounwind {
444 ; SSE-LABEL: v1i16:
445 ; SSE:       # %bb.0:
446 ; SSE-NEXT:    movzwl (%rdi), %eax
447 ; SSE-NEXT:    movzwl (%rsi), %ecx
448 ; SSE-NEXT:    xorl %esi, %esi
449 ; SSE-NEXT:    cmpw %cx, %ax
450 ; SSE-NEXT:    setns %sil
451 ; SSE-NEXT:    addl $32767, %esi # imm = 0x7FFF
452 ; SSE-NEXT:    subw %cx, %ax
453 ; SSE-NEXT:    cmovol %esi, %eax
454 ; SSE-NEXT:    movw %ax, (%rdx)
455 ; SSE-NEXT:    retq
457 ; AVX-LABEL: v1i16:
458 ; AVX:       # %bb.0:
459 ; AVX-NEXT:    movzwl (%rdi), %eax
460 ; AVX-NEXT:    movzwl (%rsi), %ecx
461 ; AVX-NEXT:    xorl %esi, %esi
462 ; AVX-NEXT:    cmpw %cx, %ax
463 ; AVX-NEXT:    setns %sil
464 ; AVX-NEXT:    addl $32767, %esi # imm = 0x7FFF
465 ; AVX-NEXT:    subw %cx, %ax
466 ; AVX-NEXT:    cmovol %esi, %eax
467 ; AVX-NEXT:    movw %ax, (%rdx)
468 ; AVX-NEXT:    retq
469   %x = load <1 x i16>, <1 x i16>* %px
470   %y = load <1 x i16>, <1 x i16>* %py
471   %z = call <1 x i16> @llvm.ssub.sat.v1i16(<1 x i16> %x, <1 x i16> %y)
472   store <1 x i16> %z, <1 x i16>* %pz
473   ret void
476 ; Promotion
478 define <16 x i4> @v16i4(<16 x i4> %x, <16 x i4> %y) nounwind {
479 ; SSE-LABEL: v16i4:
480 ; SSE:       # %bb.0:
481 ; SSE-NEXT:    psllw $4, %xmm1
482 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
483 ; SSE-NEXT:    pand %xmm2, %xmm1
484 ; SSE-NEXT:    psllw $4, %xmm0
485 ; SSE-NEXT:    pand %xmm2, %xmm0
486 ; SSE-NEXT:    psubsb %xmm1, %xmm0
487 ; SSE-NEXT:    psrlw $4, %xmm0
488 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
489 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
490 ; SSE-NEXT:    pxor %xmm1, %xmm0
491 ; SSE-NEXT:    psubb %xmm1, %xmm0
492 ; SSE-NEXT:    retq
494 ; AVX-LABEL: v16i4:
495 ; AVX:       # %bb.0:
496 ; AVX-NEXT:    vpsllw $4, %xmm1, %xmm1
497 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
498 ; AVX-NEXT:    vpand %xmm2, %xmm1, %xmm1
499 ; AVX-NEXT:    vpsllw $4, %xmm0, %xmm0
500 ; AVX-NEXT:    vpand %xmm2, %xmm0, %xmm0
501 ; AVX-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
502 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
503 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
504 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
505 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
506 ; AVX-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
507 ; AVX-NEXT:    retq
508   %z = call <16 x i4> @llvm.ssub.sat.v16i4(<16 x i4> %x, <16 x i4> %y)
509   ret <16 x i4> %z
512 define <16 x i1> @v16i1(<16 x i1> %x, <16 x i1> %y) nounwind {
513 ; SSE-LABEL: v16i1:
514 ; SSE:       # %bb.0:
515 ; SSE-NEXT:    psllw $7, %xmm1
516 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
517 ; SSE-NEXT:    pand %xmm2, %xmm1
518 ; SSE-NEXT:    psllw $7, %xmm0
519 ; SSE-NEXT:    pand %xmm2, %xmm0
520 ; SSE-NEXT:    psubsb %xmm1, %xmm0
521 ; SSE-NEXT:    pxor %xmm1, %xmm1
522 ; SSE-NEXT:    pcmpgtb %xmm0, %xmm1
523 ; SSE-NEXT:    movdqa %xmm1, %xmm0
524 ; SSE-NEXT:    retq
526 ; AVX1-LABEL: v16i1:
527 ; AVX1:       # %bb.0:
528 ; AVX1-NEXT:    vpsllw $7, %xmm1, %xmm1
529 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
530 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
531 ; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
532 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
533 ; AVX1-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
534 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
535 ; AVX1-NEXT:    vpcmpgtb %xmm0, %xmm1, %xmm0
536 ; AVX1-NEXT:    retq
538 ; AVX2-LABEL: v16i1:
539 ; AVX2:       # %bb.0:
540 ; AVX2-NEXT:    vpsllw $7, %xmm1, %xmm1
541 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
542 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
543 ; AVX2-NEXT:    vpsllw $7, %xmm0, %xmm0
544 ; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
545 ; AVX2-NEXT:    vpsubsb %xmm1, %xmm0, %xmm0
546 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
547 ; AVX2-NEXT:    vpcmpgtb %xmm0, %xmm1, %xmm0
548 ; AVX2-NEXT:    retq
550 ; AVX512-LABEL: v16i1:
551 ; AVX512:       # %bb.0:
552 ; AVX512-NEXT:    vpsllw $7, %xmm0, %xmm0
553 ; AVX512-NEXT:    vpmovb2m %xmm0, %k0
554 ; AVX512-NEXT:    vpsllw $7, %xmm1, %xmm0
555 ; AVX512-NEXT:    vpmovb2m %xmm0, %k1
556 ; AVX512-NEXT:    kandnw %k0, %k1, %k0
557 ; AVX512-NEXT:    vpmovm2b %k0, %xmm0
558 ; AVX512-NEXT:    retq
559   %z = call <16 x i1> @llvm.ssub.sat.v16i1(<16 x i1> %x, <16 x i1> %y)
560   ret <16 x i1> %z
563 ; Expanded
565 define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {
566 ; SSE2-LABEL: v2i32:
567 ; SSE2:       # %bb.0:
568 ; SSE2-NEXT:    pxor %xmm2, %xmm2
569 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
570 ; SSE2-NEXT:    psubd %xmm1, %xmm3
571 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
572 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm0
573 ; SSE2-NEXT:    pxor %xmm1, %xmm0
574 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
575 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
576 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm1
577 ; SSE2-NEXT:    psrld $1, %xmm2
578 ; SSE2-NEXT:    por %xmm1, %xmm2
579 ; SSE2-NEXT:    pand %xmm0, %xmm2
580 ; SSE2-NEXT:    pandn %xmm3, %xmm0
581 ; SSE2-NEXT:    por %xmm2, %xmm0
582 ; SSE2-NEXT:    retq
584 ; SSSE3-LABEL: v2i32:
585 ; SSSE3:       # %bb.0:
586 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
587 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
588 ; SSSE3-NEXT:    psubd %xmm1, %xmm3
589 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm1
590 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm0
591 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
592 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2
593 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
594 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm1
595 ; SSSE3-NEXT:    psrld $1, %xmm2
596 ; SSSE3-NEXT:    por %xmm1, %xmm2
597 ; SSSE3-NEXT:    pand %xmm0, %xmm2
598 ; SSSE3-NEXT:    pandn %xmm3, %xmm0
599 ; SSSE3-NEXT:    por %xmm2, %xmm0
600 ; SSSE3-NEXT:    retq
602 ; SSE41-LABEL: v2i32:
603 ; SSE41:       # %bb.0:
604 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
605 ; SSE41-NEXT:    pxor %xmm0, %xmm0
606 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
607 ; SSE41-NEXT:    psubd %xmm1, %xmm3
608 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
609 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm2
610 ; SSE41-NEXT:    pxor %xmm1, %xmm2
611 ; SSE41-NEXT:    movaps {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
612 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
613 ; SSE41-NEXT:    blendvps %xmm0, {{.*}}(%rip), %xmm1
614 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
615 ; SSE41-NEXT:    blendvps %xmm0, %xmm1, %xmm3
616 ; SSE41-NEXT:    movaps %xmm3, %xmm0
617 ; SSE41-NEXT:    retq
619 ; AVX1-LABEL: v2i32:
620 ; AVX1:       # %bb.0:
621 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
622 ; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm1, %xmm2
623 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
624 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
625 ; AVX1-NEXT:    vpxor %xmm0, %xmm2, %xmm0
626 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
627 ; AVX1-NEXT:    vblendvps %xmm1, {{.*}}(%rip), %xmm2, %xmm2
628 ; AVX1-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
629 ; AVX1-NEXT:    retq
631 ; AVX2-LABEL: v2i32:
632 ; AVX2:       # %bb.0:
633 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
634 ; AVX2-NEXT:    vpcmpgtd %xmm2, %xmm1, %xmm2
635 ; AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
636 ; AVX2-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
637 ; AVX2-NEXT:    vpxor %xmm0, %xmm2, %xmm0
638 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm2 = [2147483647,2147483647,2147483647,2147483647]
639 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
640 ; AVX2-NEXT:    vblendvps %xmm1, %xmm2, %xmm3, %xmm2
641 ; AVX2-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
642 ; AVX2-NEXT:    retq
644 ; AVX512-LABEL: v2i32:
645 ; AVX512:       # %bb.0:
646 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
647 ; AVX512-NEXT:    vpcmpgtd %xmm2, %xmm1, %k0
648 ; AVX512-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
649 ; AVX512-NEXT:    vpcmpgtd %xmm1, %xmm0, %k1
650 ; AVX512-NEXT:    kxorw %k1, %k0, %k1
651 ; AVX512-NEXT:    vpcmpgtd %xmm1, %xmm2, %k2
652 ; AVX512-NEXT:    vpbroadcastd {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
653 ; AVX512-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k2}
654 ; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm1 {%k1}
655 ; AVX512-NEXT:    vmovdqa %xmm1, %xmm0
656 ; AVX512-NEXT:    retq
657   %z = call <2 x i32> @llvm.ssub.sat.v2i32(<2 x i32> %x, <2 x i32> %y)
658   ret <2 x i32> %z
661 define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {
662 ; SSE2-LABEL: v4i32:
663 ; SSE2:       # %bb.0:
664 ; SSE2-NEXT:    pxor %xmm2, %xmm2
665 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
666 ; SSE2-NEXT:    psubd %xmm1, %xmm3
667 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
668 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm0
669 ; SSE2-NEXT:    pxor %xmm1, %xmm0
670 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
671 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
672 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm1
673 ; SSE2-NEXT:    psrld $1, %xmm2
674 ; SSE2-NEXT:    por %xmm1, %xmm2
675 ; SSE2-NEXT:    pand %xmm0, %xmm2
676 ; SSE2-NEXT:    pandn %xmm3, %xmm0
677 ; SSE2-NEXT:    por %xmm2, %xmm0
678 ; SSE2-NEXT:    retq
680 ; SSSE3-LABEL: v4i32:
681 ; SSSE3:       # %bb.0:
682 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
683 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
684 ; SSSE3-NEXT:    psubd %xmm1, %xmm3
685 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm1
686 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm0
687 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
688 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2
689 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
690 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm1
691 ; SSSE3-NEXT:    psrld $1, %xmm2
692 ; SSSE3-NEXT:    por %xmm1, %xmm2
693 ; SSSE3-NEXT:    pand %xmm0, %xmm2
694 ; SSSE3-NEXT:    pandn %xmm3, %xmm0
695 ; SSSE3-NEXT:    por %xmm2, %xmm0
696 ; SSSE3-NEXT:    retq
698 ; SSE41-LABEL: v4i32:
699 ; SSE41:       # %bb.0:
700 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
701 ; SSE41-NEXT:    pxor %xmm0, %xmm0
702 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
703 ; SSE41-NEXT:    psubd %xmm1, %xmm3
704 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
705 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm2
706 ; SSE41-NEXT:    pxor %xmm1, %xmm2
707 ; SSE41-NEXT:    movaps {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
708 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
709 ; SSE41-NEXT:    blendvps %xmm0, {{.*}}(%rip), %xmm1
710 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
711 ; SSE41-NEXT:    blendvps %xmm0, %xmm1, %xmm3
712 ; SSE41-NEXT:    movaps %xmm3, %xmm0
713 ; SSE41-NEXT:    retq
715 ; AVX1-LABEL: v4i32:
716 ; AVX1:       # %bb.0:
717 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
718 ; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm1, %xmm2
719 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
720 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
721 ; AVX1-NEXT:    vpxor %xmm0, %xmm2, %xmm0
722 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
723 ; AVX1-NEXT:    vblendvps %xmm1, {{.*}}(%rip), %xmm2, %xmm2
724 ; AVX1-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
725 ; AVX1-NEXT:    retq
727 ; AVX2-LABEL: v4i32:
728 ; AVX2:       # %bb.0:
729 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
730 ; AVX2-NEXT:    vpcmpgtd %xmm2, %xmm1, %xmm2
731 ; AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
732 ; AVX2-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
733 ; AVX2-NEXT:    vpxor %xmm0, %xmm2, %xmm0
734 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm2 = [2147483647,2147483647,2147483647,2147483647]
735 ; AVX2-NEXT:    vbroadcastss {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
736 ; AVX2-NEXT:    vblendvps %xmm1, %xmm2, %xmm3, %xmm2
737 ; AVX2-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
738 ; AVX2-NEXT:    retq
740 ; AVX512-LABEL: v4i32:
741 ; AVX512:       # %bb.0:
742 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
743 ; AVX512-NEXT:    vpcmpgtd %xmm2, %xmm1, %k0
744 ; AVX512-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
745 ; AVX512-NEXT:    vpcmpgtd %xmm1, %xmm0, %k1
746 ; AVX512-NEXT:    kxorw %k1, %k0, %k1
747 ; AVX512-NEXT:    vpcmpgtd %xmm1, %xmm2, %k2
748 ; AVX512-NEXT:    vpbroadcastd {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
749 ; AVX512-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k2}
750 ; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm1 {%k1}
751 ; AVX512-NEXT:    vmovdqa %xmm1, %xmm0
752 ; AVX512-NEXT:    retq
753   %z = call <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32> %x, <4 x i32> %y)
754   ret <4 x i32> %z
757 define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
758 ; SSE2-LABEL: v8i32:
759 ; SSE2:       # %bb.0:
760 ; SSE2-NEXT:    pxor %xmm4, %xmm4
761 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
762 ; SSE2-NEXT:    psubd %xmm2, %xmm5
763 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
764 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm0
765 ; SSE2-NEXT:    pxor %xmm2, %xmm0
766 ; SSE2-NEXT:    pxor %xmm2, %xmm2
767 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm2
768 ; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
769 ; SSE2-NEXT:    movdqa %xmm2, %xmm7
770 ; SSE2-NEXT:    pandn %xmm6, %xmm7
771 ; SSE2-NEXT:    psrld $1, %xmm2
772 ; SSE2-NEXT:    por %xmm7, %xmm2
773 ; SSE2-NEXT:    pand %xmm0, %xmm2
774 ; SSE2-NEXT:    pandn %xmm5, %xmm0
775 ; SSE2-NEXT:    por %xmm2, %xmm0
776 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
777 ; SSE2-NEXT:    psubd %xmm3, %xmm2
778 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm3
779 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
780 ; SSE2-NEXT:    pxor %xmm3, %xmm1
781 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
782 ; SSE2-NEXT:    movdqa %xmm4, %xmm3
783 ; SSE2-NEXT:    pandn %xmm6, %xmm3
784 ; SSE2-NEXT:    psrld $1, %xmm4
785 ; SSE2-NEXT:    por %xmm3, %xmm4
786 ; SSE2-NEXT:    pand %xmm1, %xmm4
787 ; SSE2-NEXT:    pandn %xmm2, %xmm1
788 ; SSE2-NEXT:    por %xmm4, %xmm1
789 ; SSE2-NEXT:    retq
791 ; SSSE3-LABEL: v8i32:
792 ; SSSE3:       # %bb.0:
793 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
794 ; SSSE3-NEXT:    movdqa %xmm0, %xmm5
795 ; SSSE3-NEXT:    psubd %xmm2, %xmm5
796 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm2
797 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm0
798 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
799 ; SSSE3-NEXT:    pxor %xmm2, %xmm2
800 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm2
801 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
802 ; SSSE3-NEXT:    movdqa %xmm2, %xmm7
803 ; SSSE3-NEXT:    pandn %xmm6, %xmm7
804 ; SSSE3-NEXT:    psrld $1, %xmm2
805 ; SSSE3-NEXT:    por %xmm7, %xmm2
806 ; SSSE3-NEXT:    pand %xmm0, %xmm2
807 ; SSSE3-NEXT:    pandn %xmm5, %xmm0
808 ; SSSE3-NEXT:    por %xmm2, %xmm0
809 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
810 ; SSSE3-NEXT:    psubd %xmm3, %xmm2
811 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm3
812 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm1
813 ; SSSE3-NEXT:    pxor %xmm3, %xmm1
814 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
815 ; SSSE3-NEXT:    movdqa %xmm4, %xmm3
816 ; SSSE3-NEXT:    pandn %xmm6, %xmm3
817 ; SSSE3-NEXT:    psrld $1, %xmm4
818 ; SSSE3-NEXT:    por %xmm3, %xmm4
819 ; SSSE3-NEXT:    pand %xmm1, %xmm4
820 ; SSSE3-NEXT:    pandn %xmm2, %xmm1
821 ; SSSE3-NEXT:    por %xmm4, %xmm1
822 ; SSSE3-NEXT:    retq
824 ; SSE41-LABEL: v8i32:
825 ; SSE41:       # %bb.0:
826 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
827 ; SSE41-NEXT:    pxor %xmm8, %xmm8
828 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
829 ; SSE41-NEXT:    psubd %xmm2, %xmm5
830 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm2
831 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm4
832 ; SSE41-NEXT:    pxor %xmm2, %xmm4
833 ; SSE41-NEXT:    movaps {{.*#+}} xmm7 = [2147483647,2147483647,2147483647,2147483647]
834 ; SSE41-NEXT:    movaps {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
835 ; SSE41-NEXT:    movaps %xmm6, %xmm2
836 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
837 ; SSE41-NEXT:    blendvps %xmm0, %xmm7, %xmm2
838 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
839 ; SSE41-NEXT:    blendvps %xmm0, %xmm2, %xmm5
840 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
841 ; SSE41-NEXT:    psubd %xmm3, %xmm2
842 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm3
843 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm1
844 ; SSE41-NEXT:    pxor %xmm3, %xmm1
845 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
846 ; SSE41-NEXT:    blendvps %xmm0, %xmm7, %xmm6
847 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
848 ; SSE41-NEXT:    blendvps %xmm0, %xmm6, %xmm2
849 ; SSE41-NEXT:    movaps %xmm5, %xmm0
850 ; SSE41-NEXT:    movaps %xmm2, %xmm1
851 ; SSE41-NEXT:    retq
853 ; AVX1-LABEL: v8i32:
854 ; AVX1:       # %bb.0:
855 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
856 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
857 ; AVX1-NEXT:    vpcmpgtd %xmm3, %xmm2, %xmm4
858 ; AVX1-NEXT:    vpcmpgtd %xmm3, %xmm1, %xmm3
859 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm3
860 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
861 ; AVX1-NEXT:    vpsubd %xmm2, %xmm4, %xmm2
862 ; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm4, %xmm4
863 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm1
864 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
865 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
866 ; AVX1-NEXT:    vxorps %ymm0, %ymm3, %ymm0
867 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
868 ; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
869 ; AVX1-NEXT:    vblendvps %ymm1, {{.*}}(%rip), %ymm2, %ymm2
870 ; AVX1-NEXT:    vblendvps %ymm0, %ymm2, %ymm1, %ymm0
871 ; AVX1-NEXT:    retq
873 ; AVX2-LABEL: v8i32:
874 ; AVX2:       # %bb.0:
875 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
876 ; AVX2-NEXT:    vpcmpgtd %ymm2, %ymm1, %ymm2
877 ; AVX2-NEXT:    vpsubd %ymm1, %ymm0, %ymm1
878 ; AVX2-NEXT:    vpcmpgtd %ymm1, %ymm0, %ymm0
879 ; AVX2-NEXT:    vpxor %ymm0, %ymm2, %ymm0
880 ; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm2 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
881 ; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm3 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
882 ; AVX2-NEXT:    vblendvps %ymm1, %ymm2, %ymm3, %ymm2
883 ; AVX2-NEXT:    vblendvps %ymm0, %ymm2, %ymm1, %ymm0
884 ; AVX2-NEXT:    retq
886 ; AVX512-LABEL: v8i32:
887 ; AVX512:       # %bb.0:
888 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
889 ; AVX512-NEXT:    vpcmpgtd %ymm2, %ymm1, %k0
890 ; AVX512-NEXT:    vpsubd %ymm1, %ymm0, %ymm1
891 ; AVX512-NEXT:    vpcmpgtd %ymm1, %ymm0, %k1
892 ; AVX512-NEXT:    kxorw %k1, %k0, %k1
893 ; AVX512-NEXT:    vpcmpgtd %ymm1, %ymm2, %k2
894 ; AVX512-NEXT:    vpbroadcastd {{.*#+}} ymm0 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
895 ; AVX512-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm0 {%k2}
896 ; AVX512-NEXT:    vmovdqa32 %ymm0, %ymm1 {%k1}
897 ; AVX512-NEXT:    vmovdqa %ymm1, %ymm0
898 ; AVX512-NEXT:    retq
899   %z = call <8 x i32> @llvm.ssub.sat.v8i32(<8 x i32> %x, <8 x i32> %y)
900   ret <8 x i32> %z
903 define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind {
904 ; SSE2-LABEL: v16i32:
905 ; SSE2:       # %bb.0:
906 ; SSE2-NEXT:    pxor %xmm8, %xmm8
907 ; SSE2-NEXT:    movdqa %xmm0, %xmm9
908 ; SSE2-NEXT:    psubd %xmm4, %xmm9
909 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm4
910 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm0
911 ; SSE2-NEXT:    pxor %xmm4, %xmm0
912 ; SSE2-NEXT:    pxor %xmm4, %xmm4
913 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm4
914 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,2147483648,2147483648,2147483648]
915 ; SSE2-NEXT:    movdqa %xmm4, %xmm11
916 ; SSE2-NEXT:    pandn %xmm10, %xmm11
917 ; SSE2-NEXT:    psrld $1, %xmm4
918 ; SSE2-NEXT:    por %xmm11, %xmm4
919 ; SSE2-NEXT:    pand %xmm0, %xmm4
920 ; SSE2-NEXT:    pandn %xmm9, %xmm0
921 ; SSE2-NEXT:    por %xmm4, %xmm0
922 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
923 ; SSE2-NEXT:    psubd %xmm5, %xmm4
924 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm5
925 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm1
926 ; SSE2-NEXT:    pxor %xmm5, %xmm1
927 ; SSE2-NEXT:    pxor %xmm5, %xmm5
928 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm5
929 ; SSE2-NEXT:    movdqa %xmm5, %xmm9
930 ; SSE2-NEXT:    pandn %xmm10, %xmm9
931 ; SSE2-NEXT:    psrld $1, %xmm5
932 ; SSE2-NEXT:    por %xmm9, %xmm5
933 ; SSE2-NEXT:    pand %xmm1, %xmm5
934 ; SSE2-NEXT:    pandn %xmm4, %xmm1
935 ; SSE2-NEXT:    por %xmm5, %xmm1
936 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
937 ; SSE2-NEXT:    psubd %xmm6, %xmm4
938 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm6
939 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
940 ; SSE2-NEXT:    pxor %xmm6, %xmm2
941 ; SSE2-NEXT:    pxor %xmm5, %xmm5
942 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm5
943 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
944 ; SSE2-NEXT:    pandn %xmm10, %xmm6
945 ; SSE2-NEXT:    psrld $1, %xmm5
946 ; SSE2-NEXT:    por %xmm6, %xmm5
947 ; SSE2-NEXT:    pand %xmm2, %xmm5
948 ; SSE2-NEXT:    pandn %xmm4, %xmm2
949 ; SSE2-NEXT:    por %xmm5, %xmm2
950 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
951 ; SSE2-NEXT:    psubd %xmm7, %xmm4
952 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm7
953 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm3
954 ; SSE2-NEXT:    pxor %xmm7, %xmm3
955 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm8
956 ; SSE2-NEXT:    movdqa %xmm8, %xmm5
957 ; SSE2-NEXT:    pandn %xmm10, %xmm5
958 ; SSE2-NEXT:    psrld $1, %xmm8
959 ; SSE2-NEXT:    por %xmm5, %xmm8
960 ; SSE2-NEXT:    pand %xmm3, %xmm8
961 ; SSE2-NEXT:    pandn %xmm4, %xmm3
962 ; SSE2-NEXT:    por %xmm8, %xmm3
963 ; SSE2-NEXT:    retq
965 ; SSSE3-LABEL: v16i32:
966 ; SSSE3:       # %bb.0:
967 ; SSSE3-NEXT:    pxor %xmm8, %xmm8
968 ; SSSE3-NEXT:    movdqa %xmm0, %xmm9
969 ; SSSE3-NEXT:    psubd %xmm4, %xmm9
970 ; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm4
971 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm0
972 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
973 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
974 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm4
975 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,2147483648,2147483648,2147483648]
976 ; SSSE3-NEXT:    movdqa %xmm4, %xmm11
977 ; SSSE3-NEXT:    pandn %xmm10, %xmm11
978 ; SSSE3-NEXT:    psrld $1, %xmm4
979 ; SSSE3-NEXT:    por %xmm11, %xmm4
980 ; SSSE3-NEXT:    pand %xmm0, %xmm4
981 ; SSSE3-NEXT:    pandn %xmm9, %xmm0
982 ; SSSE3-NEXT:    por %xmm4, %xmm0
983 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
984 ; SSSE3-NEXT:    psubd %xmm5, %xmm4
985 ; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm5
986 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm1
987 ; SSSE3-NEXT:    pxor %xmm5, %xmm1
988 ; SSSE3-NEXT:    pxor %xmm5, %xmm5
989 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm5
990 ; SSSE3-NEXT:    movdqa %xmm5, %xmm9
991 ; SSSE3-NEXT:    pandn %xmm10, %xmm9
992 ; SSSE3-NEXT:    psrld $1, %xmm5
993 ; SSSE3-NEXT:    por %xmm9, %xmm5
994 ; SSSE3-NEXT:    pand %xmm1, %xmm5
995 ; SSSE3-NEXT:    pandn %xmm4, %xmm1
996 ; SSSE3-NEXT:    por %xmm5, %xmm1
997 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
998 ; SSSE3-NEXT:    psubd %xmm6, %xmm4
999 ; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm6
1000 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm2
1001 ; SSSE3-NEXT:    pxor %xmm6, %xmm2
1002 ; SSSE3-NEXT:    pxor %xmm5, %xmm5
1003 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm5
1004 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
1005 ; SSSE3-NEXT:    pandn %xmm10, %xmm6
1006 ; SSSE3-NEXT:    psrld $1, %xmm5
1007 ; SSSE3-NEXT:    por %xmm6, %xmm5
1008 ; SSSE3-NEXT:    pand %xmm2, %xmm5
1009 ; SSSE3-NEXT:    pandn %xmm4, %xmm2
1010 ; SSSE3-NEXT:    por %xmm5, %xmm2
1011 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
1012 ; SSSE3-NEXT:    psubd %xmm7, %xmm4
1013 ; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm7
1014 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm3
1015 ; SSSE3-NEXT:    pxor %xmm7, %xmm3
1016 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm8
1017 ; SSSE3-NEXT:    movdqa %xmm8, %xmm5
1018 ; SSSE3-NEXT:    pandn %xmm10, %xmm5
1019 ; SSSE3-NEXT:    psrld $1, %xmm8
1020 ; SSSE3-NEXT:    por %xmm5, %xmm8
1021 ; SSSE3-NEXT:    pand %xmm3, %xmm8
1022 ; SSSE3-NEXT:    pandn %xmm4, %xmm3
1023 ; SSSE3-NEXT:    por %xmm8, %xmm3
1024 ; SSSE3-NEXT:    retq
1026 ; SSE41-LABEL: v16i32:
1027 ; SSE41:       # %bb.0:
1028 ; SSE41-NEXT:    movdqa %xmm3, %xmm8
1029 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
1030 ; SSE41-NEXT:    pxor %xmm10, %xmm10
1031 ; SSE41-NEXT:    movdqa %xmm0, %xmm9
1032 ; SSE41-NEXT:    psubd %xmm4, %xmm9
1033 ; SSE41-NEXT:    pcmpgtd %xmm10, %xmm4
1034 ; SSE41-NEXT:    pcmpgtd %xmm9, %xmm3
1035 ; SSE41-NEXT:    pxor %xmm4, %xmm3
1036 ; SSE41-NEXT:    movaps {{.*#+}} xmm12 = [2147483647,2147483647,2147483647,2147483647]
1037 ; SSE41-NEXT:    movaps {{.*#+}} xmm11 = [2147483648,2147483648,2147483648,2147483648]
1038 ; SSE41-NEXT:    movaps %xmm11, %xmm4
1039 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
1040 ; SSE41-NEXT:    blendvps %xmm0, %xmm12, %xmm4
1041 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
1042 ; SSE41-NEXT:    blendvps %xmm0, %xmm4, %xmm9
1043 ; SSE41-NEXT:    movdqa %xmm1, %xmm4
1044 ; SSE41-NEXT:    psubd %xmm5, %xmm4
1045 ; SSE41-NEXT:    pcmpgtd %xmm10, %xmm5
1046 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm1
1047 ; SSE41-NEXT:    pxor %xmm5, %xmm1
1048 ; SSE41-NEXT:    movaps %xmm11, %xmm3
1049 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1050 ; SSE41-NEXT:    blendvps %xmm0, %xmm12, %xmm3
1051 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1052 ; SSE41-NEXT:    blendvps %xmm0, %xmm3, %xmm4
1053 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
1054 ; SSE41-NEXT:    psubd %xmm6, %xmm3
1055 ; SSE41-NEXT:    pcmpgtd %xmm10, %xmm6
1056 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm2
1057 ; SSE41-NEXT:    pxor %xmm6, %xmm2
1058 ; SSE41-NEXT:    movaps %xmm11, %xmm1
1059 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
1060 ; SSE41-NEXT:    blendvps %xmm0, %xmm12, %xmm1
1061 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1062 ; SSE41-NEXT:    blendvps %xmm0, %xmm1, %xmm3
1063 ; SSE41-NEXT:    movdqa %xmm8, %xmm5
1064 ; SSE41-NEXT:    psubd %xmm7, %xmm5
1065 ; SSE41-NEXT:    pcmpgtd %xmm10, %xmm7
1066 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm8
1067 ; SSE41-NEXT:    pxor %xmm7, %xmm8
1068 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
1069 ; SSE41-NEXT:    blendvps %xmm0, %xmm12, %xmm11
1070 ; SSE41-NEXT:    movdqa %xmm8, %xmm0
1071 ; SSE41-NEXT:    blendvps %xmm0, %xmm11, %xmm5
1072 ; SSE41-NEXT:    movaps %xmm9, %xmm0
1073 ; SSE41-NEXT:    movaps %xmm4, %xmm1
1074 ; SSE41-NEXT:    movaps %xmm3, %xmm2
1075 ; SSE41-NEXT:    movaps %xmm5, %xmm3
1076 ; SSE41-NEXT:    retq
1078 ; AVX1-LABEL: v16i32:
1079 ; AVX1:       # %bb.0:
1080 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1081 ; AVX1-NEXT:    vpxor %xmm5, %xmm5, %xmm5
1082 ; AVX1-NEXT:    vpcmpgtd %xmm5, %xmm4, %xmm6
1083 ; AVX1-NEXT:    vpcmpgtd %xmm5, %xmm2, %xmm7
1084 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm7, %ymm6
1085 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
1086 ; AVX1-NEXT:    vpsubd %xmm4, %xmm7, %xmm4
1087 ; AVX1-NEXT:    vpcmpgtd %xmm4, %xmm7, %xmm7
1088 ; AVX1-NEXT:    vpsubd %xmm2, %xmm0, %xmm2
1089 ; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm0, %xmm0
1090 ; AVX1-NEXT:    vinsertf128 $1, %xmm7, %ymm0, %ymm0
1091 ; AVX1-NEXT:    vxorps %ymm0, %ymm6, %ymm0
1092 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
1093 ; AVX1-NEXT:    vmovaps {{.*#+}} ymm4 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
1094 ; AVX1-NEXT:    vmovaps {{.*#+}} ymm6 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1095 ; AVX1-NEXT:    vblendvps %ymm2, %ymm4, %ymm6, %ymm7
1096 ; AVX1-NEXT:    vblendvps %ymm0, %ymm7, %ymm2, %ymm0
1097 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
1098 ; AVX1-NEXT:    vpcmpgtd %xmm5, %xmm2, %xmm7
1099 ; AVX1-NEXT:    vpcmpgtd %xmm5, %xmm3, %xmm5
1100 ; AVX1-NEXT:    vinsertf128 $1, %xmm7, %ymm5, %ymm5
1101 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
1102 ; AVX1-NEXT:    vpsubd %xmm2, %xmm7, %xmm2
1103 ; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm7, %xmm7
1104 ; AVX1-NEXT:    vpsubd %xmm3, %xmm1, %xmm3
1105 ; AVX1-NEXT:    vpcmpgtd %xmm3, %xmm1, %xmm1
1106 ; AVX1-NEXT:    vinsertf128 $1, %xmm7, %ymm1, %ymm1
1107 ; AVX1-NEXT:    vxorps %ymm1, %ymm5, %ymm1
1108 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
1109 ; AVX1-NEXT:    vblendvps %ymm2, %ymm4, %ymm6, %ymm3
1110 ; AVX1-NEXT:    vblendvps %ymm1, %ymm3, %ymm2, %ymm1
1111 ; AVX1-NEXT:    retq
1113 ; AVX2-LABEL: v16i32:
1114 ; AVX2:       # %bb.0:
1115 ; AVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1116 ; AVX2-NEXT:    vpcmpgtd %ymm4, %ymm2, %ymm5
1117 ; AVX2-NEXT:    vpsubd %ymm2, %ymm0, %ymm2
1118 ; AVX2-NEXT:    vpcmpgtd %ymm2, %ymm0, %ymm0
1119 ; AVX2-NEXT:    vpxor %ymm0, %ymm5, %ymm0
1120 ; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm5 = [2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647,2147483647]
1121 ; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm6 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1122 ; AVX2-NEXT:    vblendvps %ymm2, %ymm5, %ymm6, %ymm7
1123 ; AVX2-NEXT:    vblendvps %ymm0, %ymm7, %ymm2, %ymm0
1124 ; AVX2-NEXT:    vpcmpgtd %ymm4, %ymm3, %ymm2
1125 ; AVX2-NEXT:    vpsubd %ymm3, %ymm1, %ymm3
1126 ; AVX2-NEXT:    vpcmpgtd %ymm3, %ymm1, %ymm1
1127 ; AVX2-NEXT:    vpxor %ymm1, %ymm2, %ymm1
1128 ; AVX2-NEXT:    vblendvps %ymm3, %ymm5, %ymm6, %ymm2
1129 ; AVX2-NEXT:    vblendvps %ymm1, %ymm2, %ymm3, %ymm1
1130 ; AVX2-NEXT:    retq
1132 ; AVX512-LABEL: v16i32:
1133 ; AVX512:       # %bb.0:
1134 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1135 ; AVX512-NEXT:    vpcmpgtd %zmm2, %zmm1, %k0
1136 ; AVX512-NEXT:    vpsubd %zmm1, %zmm0, %zmm1
1137 ; AVX512-NEXT:    vpcmpgtd %zmm1, %zmm0, %k1
1138 ; AVX512-NEXT:    kxorw %k1, %k0, %k1
1139 ; AVX512-NEXT:    vpcmpgtd %zmm1, %zmm2, %k2
1140 ; AVX512-NEXT:    vpbroadcastd {{.*#+}} zmm0 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1141 ; AVX512-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k2}
1142 ; AVX512-NEXT:    vmovdqa32 %zmm0, %zmm1 {%k1}
1143 ; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm0
1144 ; AVX512-NEXT:    retq
1145   %z = call <16 x i32> @llvm.ssub.sat.v16i32(<16 x i32> %x, <16 x i32> %y)
1146   ret <16 x i32> %z
1149 define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {
1150 ; SSE2-LABEL: v2i64:
1151 ; SSE2:       # %bb.0:
1152 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1153 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
1154 ; SSE2-NEXT:    pxor %xmm2, %xmm4
1155 ; SSE2-NEXT:    psubq %xmm1, %xmm0
1156 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1157 ; SSE2-NEXT:    pxor %xmm2, %xmm3
1158 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
1159 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
1160 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1161 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
1162 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1163 ; SSE2-NEXT:    pand %xmm6, %xmm4
1164 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1165 ; SSE2-NEXT:    por %xmm4, %xmm5
1166 ; SSE2-NEXT:    pxor %xmm2, %xmm1
1167 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1168 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
1169 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1170 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm1
1171 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
1172 ; SSE2-NEXT:    pand %xmm6, %xmm7
1173 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
1174 ; SSE2-NEXT:    por %xmm7, %xmm1
1175 ; SSE2-NEXT:    pxor %xmm5, %xmm1
1176 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1177 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
1178 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1179 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
1180 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1181 ; SSE2-NEXT:    pand %xmm5, %xmm2
1182 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1183 ; SSE2-NEXT:    por %xmm2, %xmm3
1184 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
1185 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
1186 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm3
1187 ; SSE2-NEXT:    por %xmm2, %xmm3
1188 ; SSE2-NEXT:    pand %xmm1, %xmm3
1189 ; SSE2-NEXT:    pandn %xmm0, %xmm1
1190 ; SSE2-NEXT:    por %xmm3, %xmm1
1191 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1192 ; SSE2-NEXT:    retq
1194 ; SSSE3-LABEL: v2i64:
1195 ; SSSE3:       # %bb.0:
1196 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1197 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
1198 ; SSSE3-NEXT:    pxor %xmm2, %xmm4
1199 ; SSSE3-NEXT:    psubq %xmm1, %xmm0
1200 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
1201 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
1202 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
1203 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
1204 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1205 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm4
1206 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1207 ; SSSE3-NEXT:    pand %xmm6, %xmm4
1208 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1209 ; SSSE3-NEXT:    por %xmm4, %xmm5
1210 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
1211 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
1212 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
1213 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1214 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm1
1215 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
1216 ; SSSE3-NEXT:    pand %xmm6, %xmm7
1217 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
1218 ; SSSE3-NEXT:    por %xmm7, %xmm1
1219 ; SSSE3-NEXT:    pxor %xmm5, %xmm1
1220 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
1221 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
1222 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1223 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm3
1224 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1225 ; SSSE3-NEXT:    pand %xmm5, %xmm2
1226 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1227 ; SSSE3-NEXT:    por %xmm2, %xmm3
1228 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
1229 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
1230 ; SSSE3-NEXT:    pand {{.*}}(%rip), %xmm3
1231 ; SSSE3-NEXT:    por %xmm2, %xmm3
1232 ; SSSE3-NEXT:    pand %xmm1, %xmm3
1233 ; SSSE3-NEXT:    pandn %xmm0, %xmm1
1234 ; SSSE3-NEXT:    por %xmm3, %xmm1
1235 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1236 ; SSSE3-NEXT:    retq
1238 ; SSE41-LABEL: v2i64:
1239 ; SSE41:       # %bb.0:
1240 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1241 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
1242 ; SSE41-NEXT:    pxor %xmm3, %xmm0
1243 ; SSE41-NEXT:    psubq %xmm1, %xmm2
1244 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
1245 ; SSE41-NEXT:    pxor %xmm3, %xmm4
1246 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
1247 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm5
1248 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm0
1249 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[0,0,2,2]
1250 ; SSE41-NEXT:    pand %xmm5, %xmm6
1251 ; SSE41-NEXT:    por %xmm0, %xmm6
1252 ; SSE41-NEXT:    pxor %xmm3, %xmm1
1253 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1254 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm0
1255 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2]
1256 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm1
1257 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1258 ; SSE41-NEXT:    pand %xmm5, %xmm1
1259 ; SSE41-NEXT:    por %xmm0, %xmm1
1260 ; SSE41-NEXT:    pxor %xmm6, %xmm1
1261 ; SSE41-NEXT:    movdqa %xmm3, %xmm5
1262 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm5
1263 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm3
1264 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1265 ; SSE41-NEXT:    pand %xmm5, %xmm0
1266 ; SSE41-NEXT:    por %xmm3, %xmm0
1267 ; SSE41-NEXT:    movapd {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1268 ; SSE41-NEXT:    blendvpd %xmm0, {{.*}}(%rip), %xmm3
1269 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1270 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
1271 ; SSE41-NEXT:    movapd %xmm2, %xmm0
1272 ; SSE41-NEXT:    retq
1274 ; AVX1-LABEL: v2i64:
1275 ; AVX1:       # %bb.0:
1276 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1277 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm1, %xmm2
1278 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm1
1279 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
1280 ; AVX1-NEXT:    vpxor %xmm0, %xmm2, %xmm0
1281 ; AVX1-NEXT:    vmovapd {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1282 ; AVX1-NEXT:    vblendvpd %xmm1, {{.*}}(%rip), %xmm2, %xmm2
1283 ; AVX1-NEXT:    vblendvpd %xmm0, %xmm2, %xmm1, %xmm0
1284 ; AVX1-NEXT:    retq
1286 ; AVX2-LABEL: v2i64:
1287 ; AVX2:       # %bb.0:
1288 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1289 ; AVX2-NEXT:    vpcmpgtq %xmm2, %xmm1, %xmm2
1290 ; AVX2-NEXT:    vpsubq %xmm1, %xmm0, %xmm1
1291 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
1292 ; AVX2-NEXT:    vpxor %xmm0, %xmm2, %xmm0
1293 ; AVX2-NEXT:    vmovapd {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1294 ; AVX2-NEXT:    vblendvpd %xmm1, {{.*}}(%rip), %xmm2, %xmm2
1295 ; AVX2-NEXT:    vblendvpd %xmm0, %xmm2, %xmm1, %xmm0
1296 ; AVX2-NEXT:    retq
1298 ; AVX512-LABEL: v2i64:
1299 ; AVX512:       # %bb.0:
1300 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1301 ; AVX512-NEXT:    vpcmpgtq %xmm2, %xmm1, %k0
1302 ; AVX512-NEXT:    vpsubq %xmm1, %xmm0, %xmm1
1303 ; AVX512-NEXT:    vpcmpgtq %xmm1, %xmm0, %k1
1304 ; AVX512-NEXT:    kxorw %k1, %k0, %k1
1305 ; AVX512-NEXT:    vpcmpgtq %xmm1, %xmm2, %k2
1306 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
1307 ; AVX512-NEXT:    vmovdqa64 {{.*}}(%rip), %xmm0 {%k2}
1308 ; AVX512-NEXT:    vmovdqa64 %xmm0, %xmm1 {%k1}
1309 ; AVX512-NEXT:    vmovdqa %xmm1, %xmm0
1310 ; AVX512-NEXT:    retq
1311   %z = call <2 x i64> @llvm.ssub.sat.v2i64(<2 x i64> %x, <2 x i64> %y)
1312   ret <2 x i64> %z
1315 define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
1316 ; SSE2-LABEL: v4i64:
1317 ; SSE2:       # %bb.0:
1318 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
1319 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648]
1320 ; SSE2-NEXT:    pxor %xmm8, %xmm0
1321 ; SSE2-NEXT:    psubq %xmm2, %xmm4
1322 ; SSE2-NEXT:    movdqa %xmm4, %xmm6
1323 ; SSE2-NEXT:    pxor %xmm8, %xmm6
1324 ; SSE2-NEXT:    movdqa %xmm0, %xmm7
1325 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
1326 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]
1327 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm0
1328 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1329 ; SSE2-NEXT:    pand %xmm5, %xmm0
1330 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1331 ; SSE2-NEXT:    por %xmm0, %xmm5
1332 ; SSE2-NEXT:    pxor %xmm8, %xmm2
1333 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1334 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm0
1335 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[0,0,2,2]
1336 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm2
1337 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1338 ; SSE2-NEXT:    pand %xmm7, %xmm2
1339 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1340 ; SSE2-NEXT:    por %xmm2, %xmm0
1341 ; SSE2-NEXT:    pxor %xmm5, %xmm0
1342 ; SSE2-NEXT:    movdqa %xmm8, %xmm2
1343 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm2
1344 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
1345 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm6
1346 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1347 ; SSE2-NEXT:    pand %xmm5, %xmm6
1348 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1349 ; SSE2-NEXT:    por %xmm6, %xmm2
1350 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [9223372036854775808,9223372036854775808]
1351 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
1352 ; SSE2-NEXT:    pandn %xmm9, %xmm5
1353 ; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [9223372036854775807,9223372036854775807]
1354 ; SSE2-NEXT:    pand %xmm7, %xmm2
1355 ; SSE2-NEXT:    por %xmm5, %xmm2
1356 ; SSE2-NEXT:    pand %xmm0, %xmm2
1357 ; SSE2-NEXT:    pandn %xmm4, %xmm0
1358 ; SSE2-NEXT:    por %xmm2, %xmm0
1359 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1360 ; SSE2-NEXT:    pxor %xmm8, %xmm2
1361 ; SSE2-NEXT:    psubq %xmm3, %xmm1
1362 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
1363 ; SSE2-NEXT:    pxor %xmm8, %xmm4
1364 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
1365 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm5
1366 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1367 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm2
1368 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1369 ; SSE2-NEXT:    pand %xmm6, %xmm2
1370 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1371 ; SSE2-NEXT:    por %xmm2, %xmm5
1372 ; SSE2-NEXT:    pxor %xmm8, %xmm3
1373 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
1374 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm2
1375 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
1376 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm3
1377 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1378 ; SSE2-NEXT:    pand %xmm6, %xmm3
1379 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1380 ; SSE2-NEXT:    por %xmm3, %xmm2
1381 ; SSE2-NEXT:    pxor %xmm5, %xmm2
1382 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
1383 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm3
1384 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
1385 ; SSE2-NEXT:    pcmpeqd %xmm8, %xmm4
1386 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1387 ; SSE2-NEXT:    pand %xmm5, %xmm4
1388 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1389 ; SSE2-NEXT:    por %xmm4, %xmm3
1390 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
1391 ; SSE2-NEXT:    pandn %xmm9, %xmm4
1392 ; SSE2-NEXT:    pand %xmm7, %xmm3
1393 ; SSE2-NEXT:    por %xmm4, %xmm3
1394 ; SSE2-NEXT:    pand %xmm2, %xmm3
1395 ; SSE2-NEXT:    pandn %xmm1, %xmm2
1396 ; SSE2-NEXT:    por %xmm3, %xmm2
1397 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1398 ; SSE2-NEXT:    retq
1400 ; SSSE3-LABEL: v4i64:
1401 ; SSSE3:       # %bb.0:
1402 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
1403 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648]
1404 ; SSSE3-NEXT:    pxor %xmm8, %xmm0
1405 ; SSSE3-NEXT:    psubq %xmm2, %xmm4
1406 ; SSSE3-NEXT:    movdqa %xmm4, %xmm6
1407 ; SSSE3-NEXT:    pxor %xmm8, %xmm6
1408 ; SSSE3-NEXT:    movdqa %xmm0, %xmm7
1409 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm7
1410 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]
1411 ; SSSE3-NEXT:    pcmpeqd %xmm6, %xmm0
1412 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1413 ; SSSE3-NEXT:    pand %xmm5, %xmm0
1414 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1415 ; SSSE3-NEXT:    por %xmm0, %xmm5
1416 ; SSSE3-NEXT:    pxor %xmm8, %xmm2
1417 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
1418 ; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm0
1419 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[0,0,2,2]
1420 ; SSSE3-NEXT:    pcmpeqd %xmm8, %xmm2
1421 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1422 ; SSSE3-NEXT:    pand %xmm7, %xmm2
1423 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1424 ; SSSE3-NEXT:    por %xmm2, %xmm0
1425 ; SSSE3-NEXT:    pxor %xmm5, %xmm0
1426 ; SSSE3-NEXT:    movdqa %xmm8, %xmm2
1427 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm2
1428 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
1429 ; SSSE3-NEXT:    pcmpeqd %xmm8, %xmm6
1430 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1431 ; SSSE3-NEXT:    pand %xmm5, %xmm6
1432 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1433 ; SSSE3-NEXT:    por %xmm6, %xmm2
1434 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [9223372036854775808,9223372036854775808]
1435 ; SSSE3-NEXT:    movdqa %xmm2, %xmm5
1436 ; SSSE3-NEXT:    pandn %xmm9, %xmm5
1437 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [9223372036854775807,9223372036854775807]
1438 ; SSSE3-NEXT:    pand %xmm7, %xmm2
1439 ; SSSE3-NEXT:    por %xmm5, %xmm2
1440 ; SSSE3-NEXT:    pand %xmm0, %xmm2
1441 ; SSSE3-NEXT:    pandn %xmm4, %xmm0
1442 ; SSSE3-NEXT:    por %xmm2, %xmm0
1443 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1444 ; SSSE3-NEXT:    pxor %xmm8, %xmm2
1445 ; SSSE3-NEXT:    psubq %xmm3, %xmm1
1446 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
1447 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
1448 ; SSSE3-NEXT:    movdqa %xmm2, %xmm5
1449 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm5
1450 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1451 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm2
1452 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1453 ; SSSE3-NEXT:    pand %xmm6, %xmm2
1454 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1455 ; SSSE3-NEXT:    por %xmm2, %xmm5
1456 ; SSSE3-NEXT:    pxor %xmm8, %xmm3
1457 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
1458 ; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm2
1459 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
1460 ; SSSE3-NEXT:    pcmpeqd %xmm8, %xmm3
1461 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1462 ; SSSE3-NEXT:    pand %xmm6, %xmm3
1463 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1464 ; SSSE3-NEXT:    por %xmm3, %xmm2
1465 ; SSSE3-NEXT:    pxor %xmm5, %xmm2
1466 ; SSSE3-NEXT:    movdqa %xmm8, %xmm3
1467 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm3
1468 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
1469 ; SSSE3-NEXT:    pcmpeqd %xmm8, %xmm4
1470 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1471 ; SSSE3-NEXT:    pand %xmm5, %xmm4
1472 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1473 ; SSSE3-NEXT:    por %xmm4, %xmm3
1474 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
1475 ; SSSE3-NEXT:    pandn %xmm9, %xmm4
1476 ; SSSE3-NEXT:    pand %xmm7, %xmm3
1477 ; SSSE3-NEXT:    por %xmm4, %xmm3
1478 ; SSSE3-NEXT:    pand %xmm2, %xmm3
1479 ; SSSE3-NEXT:    pandn %xmm1, %xmm2
1480 ; SSSE3-NEXT:    por %xmm3, %xmm2
1481 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1482 ; SSSE3-NEXT:    retq
1484 ; SSE41-LABEL: v4i64:
1485 ; SSE41:       # %bb.0:
1486 ; SSE41-NEXT:    movdqa %xmm0, %xmm8
1487 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648]
1488 ; SSE41-NEXT:    pxor %xmm5, %xmm0
1489 ; SSE41-NEXT:    psubq %xmm2, %xmm8
1490 ; SSE41-NEXT:    movdqa %xmm8, %xmm6
1491 ; SSE41-NEXT:    pxor %xmm5, %xmm6
1492 ; SSE41-NEXT:    movdqa %xmm0, %xmm7
1493 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm7
1494 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm0
1495 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1496 ; SSE41-NEXT:    pand %xmm7, %xmm4
1497 ; SSE41-NEXT:    por %xmm0, %xmm4
1498 ; SSE41-NEXT:    pxor %xmm5, %xmm2
1499 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1500 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm0
1501 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[0,0,2,2]
1502 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm2
1503 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1504 ; SSE41-NEXT:    pand %xmm7, %xmm2
1505 ; SSE41-NEXT:    por %xmm0, %xmm2
1506 ; SSE41-NEXT:    pxor %xmm4, %xmm2
1507 ; SSE41-NEXT:    movdqa %xmm5, %xmm4
1508 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm4
1509 ; SSE41-NEXT:    movdqa %xmm5, %xmm7
1510 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm7
1511 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1512 ; SSE41-NEXT:    pand %xmm4, %xmm0
1513 ; SSE41-NEXT:    por %xmm7, %xmm0
1514 ; SSE41-NEXT:    movapd {{.*#+}} xmm9 = [9223372036854775807,9223372036854775807]
1515 ; SSE41-NEXT:    movapd {{.*#+}} xmm6 = [9223372036854775808,9223372036854775808]
1516 ; SSE41-NEXT:    movapd %xmm6, %xmm4
1517 ; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm4
1518 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1519 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm8
1520 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1521 ; SSE41-NEXT:    pxor %xmm5, %xmm0
1522 ; SSE41-NEXT:    psubq %xmm3, %xmm1
1523 ; SSE41-NEXT:    movdqa %xmm1, %xmm4
1524 ; SSE41-NEXT:    pxor %xmm5, %xmm4
1525 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1526 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm2
1527 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm0
1528 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[0,0,2,2]
1529 ; SSE41-NEXT:    pand %xmm2, %xmm7
1530 ; SSE41-NEXT:    por %xmm0, %xmm7
1531 ; SSE41-NEXT:    pxor %xmm5, %xmm3
1532 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
1533 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm0
1534 ; SSE41-NEXT:    pshufd {{.*#+}} xmm10 = xmm0[0,0,2,2]
1535 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm3
1536 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1537 ; SSE41-NEXT:    pand %xmm10, %xmm2
1538 ; SSE41-NEXT:    por %xmm0, %xmm2
1539 ; SSE41-NEXT:    pxor %xmm7, %xmm2
1540 ; SSE41-NEXT:    movdqa %xmm5, %xmm3
1541 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm3
1542 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm5
1543 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1544 ; SSE41-NEXT:    pand %xmm3, %xmm0
1545 ; SSE41-NEXT:    por %xmm5, %xmm0
1546 ; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm6
1547 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1548 ; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm1
1549 ; SSE41-NEXT:    movapd %xmm8, %xmm0
1550 ; SSE41-NEXT:    retq
1552 ; AVX1-LABEL: v4i64:
1553 ; AVX1:       # %bb.0:
1554 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1555 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1556 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm4
1557 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm1, %xmm3
1558 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm3
1559 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
1560 ; AVX1-NEXT:    vpsubq %xmm2, %xmm4, %xmm2
1561 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm4
1562 ; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm1
1563 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
1564 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
1565 ; AVX1-NEXT:    vxorpd %ymm0, %ymm3, %ymm0
1566 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1567 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1568 ; AVX1-NEXT:    vblendvpd %ymm1, {{.*}}(%rip), %ymm2, %ymm2
1569 ; AVX1-NEXT:    vblendvpd %ymm0, %ymm2, %ymm1, %ymm0
1570 ; AVX1-NEXT:    retq
1572 ; AVX2-LABEL: v4i64:
1573 ; AVX2:       # %bb.0:
1574 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1575 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm2
1576 ; AVX2-NEXT:    vpsubq %ymm1, %ymm0, %ymm1
1577 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm0
1578 ; AVX2-NEXT:    vpxor %ymm0, %ymm2, %ymm0
1579 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
1580 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1581 ; AVX2-NEXT:    vblendvpd %ymm1, %ymm2, %ymm3, %ymm2
1582 ; AVX2-NEXT:    vblendvpd %ymm0, %ymm2, %ymm1, %ymm0
1583 ; AVX2-NEXT:    retq
1585 ; AVX512-LABEL: v4i64:
1586 ; AVX512:       # %bb.0:
1587 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1588 ; AVX512-NEXT:    vpcmpgtq %ymm2, %ymm1, %k0
1589 ; AVX512-NEXT:    vpsubq %ymm1, %ymm0, %ymm1
1590 ; AVX512-NEXT:    vpcmpgtq %ymm1, %ymm0, %k1
1591 ; AVX512-NEXT:    kxorw %k1, %k0, %k1
1592 ; AVX512-NEXT:    vpcmpgtq %ymm1, %ymm2, %k2
1593 ; AVX512-NEXT:    vpbroadcastq {{.*#+}} ymm0 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1594 ; AVX512-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm0 {%k2}
1595 ; AVX512-NEXT:    vmovdqa64 %ymm0, %ymm1 {%k1}
1596 ; AVX512-NEXT:    vmovdqa %ymm1, %ymm0
1597 ; AVX512-NEXT:    retq
1598   %z = call <4 x i64> @llvm.ssub.sat.v4i64(<4 x i64> %x, <4 x i64> %y)
1599   ret <4 x i64> %z
1602 define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind {
1603 ; SSE2-LABEL: v8i64:
1604 ; SSE2:       # %bb.0:
1605 ; SSE2-NEXT:    movdqa %xmm1, %xmm8
1606 ; SSE2-NEXT:    movdqa %xmm0, %xmm12
1607 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648]
1608 ; SSE2-NEXT:    pxor %xmm9, %xmm0
1609 ; SSE2-NEXT:    psubq %xmm4, %xmm12
1610 ; SSE2-NEXT:    movdqa %xmm12, %xmm1
1611 ; SSE2-NEXT:    pxor %xmm9, %xmm1
1612 ; SSE2-NEXT:    movdqa %xmm0, %xmm10
1613 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm10
1614 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
1615 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm0
1616 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1617 ; SSE2-NEXT:    pand %xmm11, %xmm0
1618 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
1619 ; SSE2-NEXT:    por %xmm0, %xmm10
1620 ; SSE2-NEXT:    pxor %xmm9, %xmm4
1621 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
1622 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm0
1623 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm0[0,0,2,2]
1624 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm4
1625 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1626 ; SSE2-NEXT:    pand %xmm11, %xmm4
1627 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1628 ; SSE2-NEXT:    por %xmm4, %xmm0
1629 ; SSE2-NEXT:    pxor %xmm10, %xmm0
1630 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
1631 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
1632 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
1633 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
1634 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1635 ; SSE2-NEXT:    pand %xmm10, %xmm1
1636 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1637 ; SSE2-NEXT:    por %xmm1, %xmm4
1638 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [9223372036854775808,9223372036854775808]
1639 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
1640 ; SSE2-NEXT:    pandn %xmm10, %xmm1
1641 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [9223372036854775807,9223372036854775807]
1642 ; SSE2-NEXT:    pand %xmm11, %xmm4
1643 ; SSE2-NEXT:    por %xmm1, %xmm4
1644 ; SSE2-NEXT:    pand %xmm0, %xmm4
1645 ; SSE2-NEXT:    pandn %xmm12, %xmm0
1646 ; SSE2-NEXT:    por %xmm4, %xmm0
1647 ; SSE2-NEXT:    movdqa %xmm8, %xmm1
1648 ; SSE2-NEXT:    pxor %xmm9, %xmm1
1649 ; SSE2-NEXT:    psubq %xmm5, %xmm8
1650 ; SSE2-NEXT:    movdqa %xmm8, %xmm4
1651 ; SSE2-NEXT:    pxor %xmm9, %xmm4
1652 ; SSE2-NEXT:    movdqa %xmm1, %xmm12
1653 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm12
1654 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
1655 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm1
1656 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1657 ; SSE2-NEXT:    pand %xmm13, %xmm1
1658 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3]
1659 ; SSE2-NEXT:    por %xmm1, %xmm12
1660 ; SSE2-NEXT:    pxor %xmm9, %xmm5
1661 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
1662 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm1
1663 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm1[0,0,2,2]
1664 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm5
1665 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1666 ; SSE2-NEXT:    pand %xmm13, %xmm5
1667 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1668 ; SSE2-NEXT:    por %xmm5, %xmm1
1669 ; SSE2-NEXT:    pxor %xmm12, %xmm1
1670 ; SSE2-NEXT:    movdqa %xmm9, %xmm5
1671 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm5
1672 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm5[0,0,2,2]
1673 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm4
1674 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1675 ; SSE2-NEXT:    pand %xmm12, %xmm4
1676 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1677 ; SSE2-NEXT:    por %xmm4, %xmm5
1678 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
1679 ; SSE2-NEXT:    pandn %xmm10, %xmm4
1680 ; SSE2-NEXT:    pand %xmm11, %xmm5
1681 ; SSE2-NEXT:    por %xmm4, %xmm5
1682 ; SSE2-NEXT:    pand %xmm1, %xmm5
1683 ; SSE2-NEXT:    pandn %xmm8, %xmm1
1684 ; SSE2-NEXT:    por %xmm5, %xmm1
1685 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1686 ; SSE2-NEXT:    pxor %xmm9, %xmm4
1687 ; SSE2-NEXT:    psubq %xmm6, %xmm2
1688 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
1689 ; SSE2-NEXT:    pxor %xmm9, %xmm5
1690 ; SSE2-NEXT:    movdqa %xmm4, %xmm8
1691 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm8
1692 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm8[0,0,2,2]
1693 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm4
1694 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1695 ; SSE2-NEXT:    pand %xmm12, %xmm4
1696 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
1697 ; SSE2-NEXT:    por %xmm4, %xmm8
1698 ; SSE2-NEXT:    pxor %xmm9, %xmm6
1699 ; SSE2-NEXT:    movdqa %xmm6, %xmm4
1700 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm4
1701 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm4[0,0,2,2]
1702 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm6
1703 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1704 ; SSE2-NEXT:    pand %xmm12, %xmm6
1705 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1706 ; SSE2-NEXT:    por %xmm6, %xmm4
1707 ; SSE2-NEXT:    pxor %xmm8, %xmm4
1708 ; SSE2-NEXT:    movdqa %xmm9, %xmm6
1709 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
1710 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
1711 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm5
1712 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1713 ; SSE2-NEXT:    pand %xmm8, %xmm5
1714 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1715 ; SSE2-NEXT:    por %xmm5, %xmm6
1716 ; SSE2-NEXT:    movdqa %xmm6, %xmm5
1717 ; SSE2-NEXT:    pandn %xmm10, %xmm5
1718 ; SSE2-NEXT:    pand %xmm11, %xmm6
1719 ; SSE2-NEXT:    por %xmm5, %xmm6
1720 ; SSE2-NEXT:    pand %xmm4, %xmm6
1721 ; SSE2-NEXT:    pandn %xmm2, %xmm4
1722 ; SSE2-NEXT:    por %xmm6, %xmm4
1723 ; SSE2-NEXT:    movdqa %xmm3, %xmm5
1724 ; SSE2-NEXT:    pxor %xmm9, %xmm5
1725 ; SSE2-NEXT:    psubq %xmm7, %xmm3
1726 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
1727 ; SSE2-NEXT:    pxor %xmm9, %xmm2
1728 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
1729 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
1730 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
1731 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm5
1732 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1733 ; SSE2-NEXT:    pand %xmm8, %xmm5
1734 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1735 ; SSE2-NEXT:    por %xmm5, %xmm6
1736 ; SSE2-NEXT:    pxor %xmm9, %xmm7
1737 ; SSE2-NEXT:    movdqa %xmm7, %xmm5
1738 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm5
1739 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm5[0,0,2,2]
1740 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm7
1741 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1742 ; SSE2-NEXT:    pand %xmm8, %xmm7
1743 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1744 ; SSE2-NEXT:    por %xmm7, %xmm5
1745 ; SSE2-NEXT:    pxor %xmm6, %xmm5
1746 ; SSE2-NEXT:    movdqa %xmm9, %xmm6
1747 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
1748 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1749 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm2
1750 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1751 ; SSE2-NEXT:    pand %xmm7, %xmm2
1752 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1753 ; SSE2-NEXT:    por %xmm2, %xmm6
1754 ; SSE2-NEXT:    movdqa %xmm6, %xmm2
1755 ; SSE2-NEXT:    pandn %xmm10, %xmm2
1756 ; SSE2-NEXT:    pand %xmm11, %xmm6
1757 ; SSE2-NEXT:    por %xmm2, %xmm6
1758 ; SSE2-NEXT:    pand %xmm5, %xmm6
1759 ; SSE2-NEXT:    pandn %xmm3, %xmm5
1760 ; SSE2-NEXT:    por %xmm6, %xmm5
1761 ; SSE2-NEXT:    movdqa %xmm4, %xmm2
1762 ; SSE2-NEXT:    movdqa %xmm5, %xmm3
1763 ; SSE2-NEXT:    retq
1765 ; SSSE3-LABEL: v8i64:
1766 ; SSSE3:       # %bb.0:
1767 ; SSSE3-NEXT:    movdqa %xmm1, %xmm8
1768 ; SSSE3-NEXT:    movdqa %xmm0, %xmm12
1769 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648]
1770 ; SSSE3-NEXT:    pxor %xmm9, %xmm0
1771 ; SSSE3-NEXT:    psubq %xmm4, %xmm12
1772 ; SSSE3-NEXT:    movdqa %xmm12, %xmm1
1773 ; SSSE3-NEXT:    pxor %xmm9, %xmm1
1774 ; SSSE3-NEXT:    movdqa %xmm0, %xmm10
1775 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm10
1776 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
1777 ; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm0
1778 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1779 ; SSSE3-NEXT:    pand %xmm11, %xmm0
1780 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
1781 ; SSSE3-NEXT:    por %xmm0, %xmm10
1782 ; SSSE3-NEXT:    pxor %xmm9, %xmm4
1783 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
1784 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm0
1785 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm0[0,0,2,2]
1786 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm4
1787 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1788 ; SSSE3-NEXT:    pand %xmm11, %xmm4
1789 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1790 ; SSSE3-NEXT:    por %xmm4, %xmm0
1791 ; SSSE3-NEXT:    pxor %xmm10, %xmm0
1792 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
1793 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
1794 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
1795 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
1796 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1797 ; SSSE3-NEXT:    pand %xmm10, %xmm1
1798 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1799 ; SSSE3-NEXT:    por %xmm1, %xmm4
1800 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [9223372036854775808,9223372036854775808]
1801 ; SSSE3-NEXT:    movdqa %xmm4, %xmm1
1802 ; SSSE3-NEXT:    pandn %xmm10, %xmm1
1803 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm11 = [9223372036854775807,9223372036854775807]
1804 ; SSSE3-NEXT:    pand %xmm11, %xmm4
1805 ; SSSE3-NEXT:    por %xmm1, %xmm4
1806 ; SSSE3-NEXT:    pand %xmm0, %xmm4
1807 ; SSSE3-NEXT:    pandn %xmm12, %xmm0
1808 ; SSSE3-NEXT:    por %xmm4, %xmm0
1809 ; SSSE3-NEXT:    movdqa %xmm8, %xmm1
1810 ; SSSE3-NEXT:    pxor %xmm9, %xmm1
1811 ; SSSE3-NEXT:    psubq %xmm5, %xmm8
1812 ; SSSE3-NEXT:    movdqa %xmm8, %xmm4
1813 ; SSSE3-NEXT:    pxor %xmm9, %xmm4
1814 ; SSSE3-NEXT:    movdqa %xmm1, %xmm12
1815 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm12
1816 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
1817 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm1
1818 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1819 ; SSSE3-NEXT:    pand %xmm13, %xmm1
1820 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3]
1821 ; SSSE3-NEXT:    por %xmm1, %xmm12
1822 ; SSSE3-NEXT:    pxor %xmm9, %xmm5
1823 ; SSSE3-NEXT:    movdqa %xmm5, %xmm1
1824 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm1
1825 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm1[0,0,2,2]
1826 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm5
1827 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1828 ; SSSE3-NEXT:    pand %xmm13, %xmm5
1829 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1830 ; SSSE3-NEXT:    por %xmm5, %xmm1
1831 ; SSSE3-NEXT:    pxor %xmm12, %xmm1
1832 ; SSSE3-NEXT:    movdqa %xmm9, %xmm5
1833 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm5
1834 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm5[0,0,2,2]
1835 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm4
1836 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1837 ; SSSE3-NEXT:    pand %xmm12, %xmm4
1838 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1839 ; SSSE3-NEXT:    por %xmm4, %xmm5
1840 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
1841 ; SSSE3-NEXT:    pandn %xmm10, %xmm4
1842 ; SSSE3-NEXT:    pand %xmm11, %xmm5
1843 ; SSSE3-NEXT:    por %xmm4, %xmm5
1844 ; SSSE3-NEXT:    pand %xmm1, %xmm5
1845 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
1846 ; SSSE3-NEXT:    por %xmm5, %xmm1
1847 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
1848 ; SSSE3-NEXT:    pxor %xmm9, %xmm4
1849 ; SSSE3-NEXT:    psubq %xmm6, %xmm2
1850 ; SSSE3-NEXT:    movdqa %xmm2, %xmm5
1851 ; SSSE3-NEXT:    pxor %xmm9, %xmm5
1852 ; SSSE3-NEXT:    movdqa %xmm4, %xmm8
1853 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm8
1854 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm8[0,0,2,2]
1855 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm4
1856 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1857 ; SSSE3-NEXT:    pand %xmm12, %xmm4
1858 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
1859 ; SSSE3-NEXT:    por %xmm4, %xmm8
1860 ; SSSE3-NEXT:    pxor %xmm9, %xmm6
1861 ; SSSE3-NEXT:    movdqa %xmm6, %xmm4
1862 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm4
1863 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm4[0,0,2,2]
1864 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm6
1865 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1866 ; SSSE3-NEXT:    pand %xmm12, %xmm6
1867 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1868 ; SSSE3-NEXT:    por %xmm6, %xmm4
1869 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
1870 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
1871 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm6
1872 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
1873 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm5
1874 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1875 ; SSSE3-NEXT:    pand %xmm8, %xmm5
1876 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1877 ; SSSE3-NEXT:    por %xmm5, %xmm6
1878 ; SSSE3-NEXT:    movdqa %xmm6, %xmm5
1879 ; SSSE3-NEXT:    pandn %xmm10, %xmm5
1880 ; SSSE3-NEXT:    pand %xmm11, %xmm6
1881 ; SSSE3-NEXT:    por %xmm5, %xmm6
1882 ; SSSE3-NEXT:    pand %xmm4, %xmm6
1883 ; SSSE3-NEXT:    pandn %xmm2, %xmm4
1884 ; SSSE3-NEXT:    por %xmm6, %xmm4
1885 ; SSSE3-NEXT:    movdqa %xmm3, %xmm5
1886 ; SSSE3-NEXT:    pxor %xmm9, %xmm5
1887 ; SSSE3-NEXT:    psubq %xmm7, %xmm3
1888 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
1889 ; SSSE3-NEXT:    pxor %xmm9, %xmm2
1890 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
1891 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm6
1892 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
1893 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm5
1894 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1895 ; SSSE3-NEXT:    pand %xmm8, %xmm5
1896 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1897 ; SSSE3-NEXT:    por %xmm5, %xmm6
1898 ; SSSE3-NEXT:    pxor %xmm9, %xmm7
1899 ; SSSE3-NEXT:    movdqa %xmm7, %xmm5
1900 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm5
1901 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm5[0,0,2,2]
1902 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm7
1903 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1904 ; SSSE3-NEXT:    pand %xmm8, %xmm7
1905 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1906 ; SSSE3-NEXT:    por %xmm7, %xmm5
1907 ; SSSE3-NEXT:    pxor %xmm6, %xmm5
1908 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
1909 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm6
1910 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1911 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm2
1912 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1913 ; SSSE3-NEXT:    pand %xmm7, %xmm2
1914 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1915 ; SSSE3-NEXT:    por %xmm2, %xmm6
1916 ; SSSE3-NEXT:    movdqa %xmm6, %xmm2
1917 ; SSSE3-NEXT:    pandn %xmm10, %xmm2
1918 ; SSSE3-NEXT:    pand %xmm11, %xmm6
1919 ; SSSE3-NEXT:    por %xmm2, %xmm6
1920 ; SSSE3-NEXT:    pand %xmm5, %xmm6
1921 ; SSSE3-NEXT:    pandn %xmm3, %xmm5
1922 ; SSSE3-NEXT:    por %xmm6, %xmm5
1923 ; SSSE3-NEXT:    movdqa %xmm4, %xmm2
1924 ; SSSE3-NEXT:    movdqa %xmm5, %xmm3
1925 ; SSSE3-NEXT:    retq
1927 ; SSE41-LABEL: v8i64:
1928 ; SSE41:       # %bb.0:
1929 ; SSE41-NEXT:    movdqa %xmm0, %xmm8
1930 ; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648]
1931 ; SSE41-NEXT:    pxor %xmm9, %xmm0
1932 ; SSE41-NEXT:    psubq %xmm4, %xmm8
1933 ; SSE41-NEXT:    movdqa %xmm8, %xmm10
1934 ; SSE41-NEXT:    pxor %xmm9, %xmm10
1935 ; SSE41-NEXT:    movdqa %xmm0, %xmm11
1936 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm11
1937 ; SSE41-NEXT:    pcmpgtd %xmm10, %xmm0
1938 ; SSE41-NEXT:    pshufd {{.*#+}} xmm12 = xmm0[0,0,2,2]
1939 ; SSE41-NEXT:    pand %xmm11, %xmm12
1940 ; SSE41-NEXT:    por %xmm0, %xmm12
1941 ; SSE41-NEXT:    pxor %xmm9, %xmm4
1942 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1943 ; SSE41-NEXT:    pcmpgtd %xmm9, %xmm0
1944 ; SSE41-NEXT:    pshufd {{.*#+}} xmm11 = xmm0[0,0,2,2]
1945 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm4
1946 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1947 ; SSE41-NEXT:    pand %xmm11, %xmm4
1948 ; SSE41-NEXT:    por %xmm0, %xmm4
1949 ; SSE41-NEXT:    pxor %xmm12, %xmm4
1950 ; SSE41-NEXT:    movdqa %xmm9, %xmm11
1951 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm11
1952 ; SSE41-NEXT:    movdqa %xmm9, %xmm12
1953 ; SSE41-NEXT:    pcmpgtd %xmm10, %xmm12
1954 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm12[0,0,2,2]
1955 ; SSE41-NEXT:    pand %xmm11, %xmm0
1956 ; SSE41-NEXT:    por %xmm12, %xmm0
1957 ; SSE41-NEXT:    movapd {{.*#+}} xmm11 = [9223372036854775807,9223372036854775807]
1958 ; SSE41-NEXT:    movapd {{.*#+}} xmm10 = [9223372036854775808,9223372036854775808]
1959 ; SSE41-NEXT:    movapd %xmm10, %xmm12
1960 ; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm12
1961 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1962 ; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm8
1963 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1964 ; SSE41-NEXT:    pxor %xmm9, %xmm0
1965 ; SSE41-NEXT:    psubq %xmm5, %xmm1
1966 ; SSE41-NEXT:    movdqa %xmm1, %xmm12
1967 ; SSE41-NEXT:    pxor %xmm9, %xmm12
1968 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
1969 ; SSE41-NEXT:    pcmpeqd %xmm12, %xmm4
1970 ; SSE41-NEXT:    pcmpgtd %xmm12, %xmm0
1971 ; SSE41-NEXT:    pshufd {{.*#+}} xmm13 = xmm0[0,0,2,2]
1972 ; SSE41-NEXT:    pand %xmm4, %xmm13
1973 ; SSE41-NEXT:    por %xmm0, %xmm13
1974 ; SSE41-NEXT:    pxor %xmm9, %xmm5
1975 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
1976 ; SSE41-NEXT:    pcmpgtd %xmm9, %xmm0
1977 ; SSE41-NEXT:    pshufd {{.*#+}} xmm14 = xmm0[0,0,2,2]
1978 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm5
1979 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1980 ; SSE41-NEXT:    pand %xmm14, %xmm4
1981 ; SSE41-NEXT:    por %xmm0, %xmm4
1982 ; SSE41-NEXT:    pxor %xmm13, %xmm4
1983 ; SSE41-NEXT:    movdqa %xmm9, %xmm13
1984 ; SSE41-NEXT:    pcmpeqd %xmm12, %xmm13
1985 ; SSE41-NEXT:    movdqa %xmm9, %xmm5
1986 ; SSE41-NEXT:    pcmpgtd %xmm12, %xmm5
1987 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1988 ; SSE41-NEXT:    pand %xmm13, %xmm0
1989 ; SSE41-NEXT:    por %xmm5, %xmm0
1990 ; SSE41-NEXT:    movapd %xmm10, %xmm5
1991 ; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm5
1992 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1993 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
1994 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1995 ; SSE41-NEXT:    pxor %xmm9, %xmm0
1996 ; SSE41-NEXT:    psubq %xmm6, %xmm2
1997 ; SSE41-NEXT:    movdqa %xmm2, %xmm12
1998 ; SSE41-NEXT:    pxor %xmm9, %xmm12
1999 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
2000 ; SSE41-NEXT:    pcmpeqd %xmm12, %xmm4
2001 ; SSE41-NEXT:    pcmpgtd %xmm12, %xmm0
2002 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2]
2003 ; SSE41-NEXT:    pand %xmm4, %xmm5
2004 ; SSE41-NEXT:    por %xmm0, %xmm5
2005 ; SSE41-NEXT:    pxor %xmm9, %xmm6
2006 ; SSE41-NEXT:    movdqa %xmm6, %xmm0
2007 ; SSE41-NEXT:    pcmpgtd %xmm9, %xmm0
2008 ; SSE41-NEXT:    pshufd {{.*#+}} xmm13 = xmm0[0,0,2,2]
2009 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm6
2010 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
2011 ; SSE41-NEXT:    pand %xmm13, %xmm4
2012 ; SSE41-NEXT:    por %xmm0, %xmm4
2013 ; SSE41-NEXT:    pxor %xmm5, %xmm4
2014 ; SSE41-NEXT:    movdqa %xmm9, %xmm5
2015 ; SSE41-NEXT:    pcmpeqd %xmm12, %xmm5
2016 ; SSE41-NEXT:    movdqa %xmm9, %xmm6
2017 ; SSE41-NEXT:    pcmpgtd %xmm12, %xmm6
2018 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2019 ; SSE41-NEXT:    pand %xmm5, %xmm0
2020 ; SSE41-NEXT:    por %xmm6, %xmm0
2021 ; SSE41-NEXT:    movapd %xmm10, %xmm5
2022 ; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm5
2023 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
2024 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm2
2025 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
2026 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2027 ; SSE41-NEXT:    psubq %xmm7, %xmm3
2028 ; SSE41-NEXT:    movdqa %xmm3, %xmm5
2029 ; SSE41-NEXT:    pxor %xmm9, %xmm5
2030 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
2031 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm4
2032 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm0
2033 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[0,0,2,2]
2034 ; SSE41-NEXT:    pand %xmm4, %xmm6
2035 ; SSE41-NEXT:    por %xmm0, %xmm6
2036 ; SSE41-NEXT:    pxor %xmm9, %xmm7
2037 ; SSE41-NEXT:    movdqa %xmm7, %xmm0
2038 ; SSE41-NEXT:    pcmpgtd %xmm9, %xmm0
2039 ; SSE41-NEXT:    pshufd {{.*#+}} xmm12 = xmm0[0,0,2,2]
2040 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm7
2041 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3]
2042 ; SSE41-NEXT:    pand %xmm12, %xmm4
2043 ; SSE41-NEXT:    por %xmm0, %xmm4
2044 ; SSE41-NEXT:    pxor %xmm6, %xmm4
2045 ; SSE41-NEXT:    movdqa %xmm9, %xmm6
2046 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm6
2047 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm9
2048 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
2049 ; SSE41-NEXT:    pand %xmm6, %xmm0
2050 ; SSE41-NEXT:    por %xmm9, %xmm0
2051 ; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm10
2052 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
2053 ; SSE41-NEXT:    blendvpd %xmm0, %xmm10, %xmm3
2054 ; SSE41-NEXT:    movapd %xmm8, %xmm0
2055 ; SSE41-NEXT:    retq
2057 ; AVX1-LABEL: v8i64:
2058 ; AVX1:       # %bb.0:
2059 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
2060 ; AVX1-NEXT:    vpxor %xmm5, %xmm5, %xmm5
2061 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm4, %xmm6
2062 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm2, %xmm7
2063 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm7, %ymm6
2064 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
2065 ; AVX1-NEXT:    vpsubq %xmm4, %xmm7, %xmm4
2066 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm7, %xmm7
2067 ; AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm2
2068 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm0
2069 ; AVX1-NEXT:    vinsertf128 $1, %xmm7, %ymm0, %ymm0
2070 ; AVX1-NEXT:    vxorpd %ymm0, %ymm6, %ymm0
2071 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
2072 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm4 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
2073 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm6 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2074 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm4, %ymm6, %ymm7
2075 ; AVX1-NEXT:    vblendvpd %ymm0, %ymm7, %ymm2, %ymm0
2076 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
2077 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm2, %xmm7
2078 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm3, %xmm5
2079 ; AVX1-NEXT:    vinsertf128 $1, %xmm7, %ymm5, %ymm5
2080 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
2081 ; AVX1-NEXT:    vpsubq %xmm2, %xmm7, %xmm2
2082 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm7, %xmm7
2083 ; AVX1-NEXT:    vpsubq %xmm3, %xmm1, %xmm3
2084 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm1, %xmm1
2085 ; AVX1-NEXT:    vinsertf128 $1, %xmm7, %ymm1, %ymm1
2086 ; AVX1-NEXT:    vxorpd %ymm1, %ymm5, %ymm1
2087 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
2088 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm4, %ymm6, %ymm3
2089 ; AVX1-NEXT:    vblendvpd %ymm1, %ymm3, %ymm2, %ymm1
2090 ; AVX1-NEXT:    retq
2092 ; AVX2-LABEL: v8i64:
2093 ; AVX2:       # %bb.0:
2094 ; AVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
2095 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm2, %ymm5
2096 ; AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm2
2097 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm0
2098 ; AVX2-NEXT:    vpxor %ymm0, %ymm5, %ymm0
2099 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm5 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
2100 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm6 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2101 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm5, %ymm6, %ymm7
2102 ; AVX2-NEXT:    vblendvpd %ymm0, %ymm7, %ymm2, %ymm0
2103 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm3, %ymm2
2104 ; AVX2-NEXT:    vpsubq %ymm3, %ymm1, %ymm3
2105 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm1, %ymm1
2106 ; AVX2-NEXT:    vpxor %ymm1, %ymm2, %ymm1
2107 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm5, %ymm6, %ymm2
2108 ; AVX2-NEXT:    vblendvpd %ymm1, %ymm2, %ymm3, %ymm1
2109 ; AVX2-NEXT:    retq
2111 ; AVX512-LABEL: v8i64:
2112 ; AVX512:       # %bb.0:
2113 ; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2114 ; AVX512-NEXT:    vpcmpgtq %zmm2, %zmm1, %k0
2115 ; AVX512-NEXT:    vpsubq %zmm1, %zmm0, %zmm1
2116 ; AVX512-NEXT:    vpcmpgtq %zmm1, %zmm0, %k1
2117 ; AVX512-NEXT:    kxorw %k1, %k0, %k1
2118 ; AVX512-NEXT:    vpcmpgtq %zmm1, %zmm2, %k2
2119 ; AVX512-NEXT:    vpbroadcastq {{.*#+}} zmm0 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2120 ; AVX512-NEXT:    vpbroadcastq {{.*}}(%rip), %zmm0 {%k2}
2121 ; AVX512-NEXT:    vmovdqa64 %zmm0, %zmm1 {%k1}
2122 ; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm0
2123 ; AVX512-NEXT:    retq
2124   %z = call <8 x i64> @llvm.ssub.sat.v8i64(<8 x i64> %x, <8 x i64> %y)
2125   ret <8 x i64> %z
2128 define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind {
2129 ; SSE-LABEL: v2i128:
2130 ; SSE:       # %bb.0:
2131 ; SSE-NEXT:    pushq %r15
2132 ; SSE-NEXT:    pushq %r14
2133 ; SSE-NEXT:    pushq %r13
2134 ; SSE-NEXT:    pushq %r12
2135 ; SSE-NEXT:    pushq %rbx
2136 ; SSE-NEXT:    movq %rdi, %rax
2137 ; SSE-NEXT:    movq {{[0-9]+}}(%rsp), %r11
2138 ; SSE-NEXT:    movq {{[0-9]+}}(%rsp), %r14
2139 ; SSE-NEXT:    subq {{[0-9]+}}(%rsp), %rcx
2140 ; SSE-NEXT:    movq %r8, %r13
2141 ; SSE-NEXT:    sbbq %r14, %r13
2142 ; SSE-NEXT:    movq %r13, %r10
2143 ; SSE-NEXT:    sarq $63, %r10
2144 ; SSE-NEXT:    xorl %edi, %edi
2145 ; SSE-NEXT:    testq %r13, %r13
2146 ; SSE-NEXT:    setns %dil
2147 ; SSE-NEXT:    movabsq $9223372036854775807, %r12 # imm = 0x7FFFFFFFFFFFFFFF
2148 ; SSE-NEXT:    leaq (%rdi,%r12), %r15
2149 ; SSE-NEXT:    testq %r8, %r8
2150 ; SSE-NEXT:    setns %r8b
2151 ; SSE-NEXT:    cmpb %dil, %r8b
2152 ; SSE-NEXT:    setne %dil
2153 ; SSE-NEXT:    testq %r14, %r14
2154 ; SSE-NEXT:    setns %bl
2155 ; SSE-NEXT:    cmpb %bl, %r8b
2156 ; SSE-NEXT:    setne %bl
2157 ; SSE-NEXT:    testb %dil, %bl
2158 ; SSE-NEXT:    cmoveq %r13, %r15
2159 ; SSE-NEXT:    cmoveq %rcx, %r10
2160 ; SSE-NEXT:    subq %r9, %rsi
2161 ; SSE-NEXT:    movq %rdx, %rdi
2162 ; SSE-NEXT:    sbbq %r11, %rdi
2163 ; SSE-NEXT:    setns %bl
2164 ; SSE-NEXT:    movzbl %bl, %ebx
2165 ; SSE-NEXT:    addq %rbx, %r12
2166 ; SSE-NEXT:    movq %rdi, %rcx
2167 ; SSE-NEXT:    sarq $63, %rcx
2168 ; SSE-NEXT:    testq %r11, %r11
2169 ; SSE-NEXT:    setns %r8b
2170 ; SSE-NEXT:    testq %rdx, %rdx
2171 ; SSE-NEXT:    setns %dl
2172 ; SSE-NEXT:    cmpb %r8b, %dl
2173 ; SSE-NEXT:    setne %r8b
2174 ; SSE-NEXT:    cmpb %bl, %dl
2175 ; SSE-NEXT:    setne %dl
2176 ; SSE-NEXT:    testb %dl, %r8b
2177 ; SSE-NEXT:    cmoveq %rsi, %rcx
2178 ; SSE-NEXT:    cmoveq %rdi, %r12
2179 ; SSE-NEXT:    movq %r15, 24(%rax)
2180 ; SSE-NEXT:    movq %r10, 16(%rax)
2181 ; SSE-NEXT:    movq %r12, 8(%rax)
2182 ; SSE-NEXT:    movq %rcx, (%rax)
2183 ; SSE-NEXT:    popq %rbx
2184 ; SSE-NEXT:    popq %r12
2185 ; SSE-NEXT:    popq %r13
2186 ; SSE-NEXT:    popq %r14
2187 ; SSE-NEXT:    popq %r15
2188 ; SSE-NEXT:    retq
2190 ; AVX-LABEL: v2i128:
2191 ; AVX:       # %bb.0:
2192 ; AVX-NEXT:    pushq %r15
2193 ; AVX-NEXT:    pushq %r14
2194 ; AVX-NEXT:    pushq %r13
2195 ; AVX-NEXT:    pushq %r12
2196 ; AVX-NEXT:    pushq %rbx
2197 ; AVX-NEXT:    movq %rdi, %rax
2198 ; AVX-NEXT:    movq {{[0-9]+}}(%rsp), %r11
2199 ; AVX-NEXT:    movq {{[0-9]+}}(%rsp), %r14
2200 ; AVX-NEXT:    subq {{[0-9]+}}(%rsp), %rcx
2201 ; AVX-NEXT:    movq %r8, %r13
2202 ; AVX-NEXT:    sbbq %r14, %r13
2203 ; AVX-NEXT:    movq %r13, %r10
2204 ; AVX-NEXT:    sarq $63, %r10
2205 ; AVX-NEXT:    xorl %edi, %edi
2206 ; AVX-NEXT:    testq %r13, %r13
2207 ; AVX-NEXT:    setns %dil
2208 ; AVX-NEXT:    movabsq $9223372036854775807, %r12 # imm = 0x7FFFFFFFFFFFFFFF
2209 ; AVX-NEXT:    leaq (%rdi,%r12), %r15
2210 ; AVX-NEXT:    testq %r8, %r8
2211 ; AVX-NEXT:    setns %r8b
2212 ; AVX-NEXT:    cmpb %dil, %r8b
2213 ; AVX-NEXT:    setne %dil
2214 ; AVX-NEXT:    testq %r14, %r14
2215 ; AVX-NEXT:    setns %bl
2216 ; AVX-NEXT:    cmpb %bl, %r8b
2217 ; AVX-NEXT:    setne %bl
2218 ; AVX-NEXT:    testb %dil, %bl
2219 ; AVX-NEXT:    cmoveq %r13, %r15
2220 ; AVX-NEXT:    cmoveq %rcx, %r10
2221 ; AVX-NEXT:    subq %r9, %rsi
2222 ; AVX-NEXT:    movq %rdx, %rdi
2223 ; AVX-NEXT:    sbbq %r11, %rdi
2224 ; AVX-NEXT:    setns %bl
2225 ; AVX-NEXT:    movzbl %bl, %ebx
2226 ; AVX-NEXT:    addq %rbx, %r12
2227 ; AVX-NEXT:    movq %rdi, %rcx
2228 ; AVX-NEXT:    sarq $63, %rcx
2229 ; AVX-NEXT:    testq %r11, %r11
2230 ; AVX-NEXT:    setns %r8b
2231 ; AVX-NEXT:    testq %rdx, %rdx
2232 ; AVX-NEXT:    setns %dl
2233 ; AVX-NEXT:    cmpb %r8b, %dl
2234 ; AVX-NEXT:    setne %r8b
2235 ; AVX-NEXT:    cmpb %bl, %dl
2236 ; AVX-NEXT:    setne %dl
2237 ; AVX-NEXT:    testb %dl, %r8b
2238 ; AVX-NEXT:    cmoveq %rsi, %rcx
2239 ; AVX-NEXT:    cmoveq %rdi, %r12
2240 ; AVX-NEXT:    movq %r15, 24(%rax)
2241 ; AVX-NEXT:    movq %r10, 16(%rax)
2242 ; AVX-NEXT:    movq %r12, 8(%rax)
2243 ; AVX-NEXT:    movq %rcx, (%rax)
2244 ; AVX-NEXT:    popq %rbx
2245 ; AVX-NEXT:    popq %r12
2246 ; AVX-NEXT:    popq %r13
2247 ; AVX-NEXT:    popq %r14
2248 ; AVX-NEXT:    popq %r15
2249 ; AVX-NEXT:    retq
2250   %z = call <2 x i128> @llvm.ssub.sat.v2i128(<2 x i128> %x, <2 x i128> %y)
2251   ret <2 x i128> %z