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