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