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