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