2085 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE,SSSE34; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE415; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX16; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX27; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F9; 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,AVX512BW10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW11 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, %xmm049; SSE-NEXT: retq50;51; AVX-LABEL: v16i8:52; AVX: # %bb.0:53; AVX-NEXT: vpsubsb %xmm1, %xmm0, %xmm054; AVX-NEXT: retq55 %z = call <16 x i8> @llvm.ssub.sat.v16i8(<16 x i8> %x, <16 x i8> %y)56 ret <16 x i8> %z57}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, %xmm063; SSE-NEXT: psubsb %xmm3, %xmm164; SSE-NEXT: retq65;66; AVX1-LABEL: v32i8:67; AVX1: # %bb.0:68; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm269; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm370; AVX1-NEXT: vpsubsb %xmm2, %xmm3, %xmm271; AVX1-NEXT: vpsubsb %xmm1, %xmm0, %xmm072; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm073; AVX1-NEXT: retq74;75; AVX2-LABEL: v32i8:76; AVX2: # %bb.0:77; AVX2-NEXT: vpsubsb %ymm1, %ymm0, %ymm078; AVX2-NEXT: retq79;80; AVX512-LABEL: v32i8:81; AVX512: # %bb.0:82; AVX512-NEXT: vpsubsb %ymm1, %ymm0, %ymm083; AVX512-NEXT: retq84 %z = call <32 x i8> @llvm.ssub.sat.v32i8(<32 x i8> %x, <32 x i8> %y)85 ret <32 x i8> %z86}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, %xmm092; SSE-NEXT: psubsb %xmm5, %xmm193; SSE-NEXT: psubsb %xmm6, %xmm294; SSE-NEXT: psubsb %xmm7, %xmm395; SSE-NEXT: retq96;97; AVX1-LABEL: v64i8:98; AVX1: # %bb.0:99; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4100; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5101; AVX1-NEXT: vpsubsb %xmm4, %xmm5, %xmm4102; AVX1-NEXT: vpsubsb %xmm2, %xmm0, %xmm0103; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0104; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2105; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4106; AVX1-NEXT: vpsubsb %xmm2, %xmm4, %xmm2107; AVX1-NEXT: vpsubsb %xmm3, %xmm1, %xmm1108; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1109; AVX1-NEXT: retq110;111; AVX2-LABEL: v64i8:112; AVX2: # %bb.0:113; AVX2-NEXT: vpsubsb %ymm2, %ymm0, %ymm0114; AVX2-NEXT: vpsubsb %ymm3, %ymm1, %ymm1115; AVX2-NEXT: retq116;117; AVX512F-LABEL: v64i8:118; AVX512F: # %bb.0:119; AVX512F-NEXT: vextracti64x4 $1, %zmm1, %ymm2120; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm3121; AVX512F-NEXT: vpsubsb %ymm2, %ymm3, %ymm2122; AVX512F-NEXT: vpsubsb %ymm1, %ymm0, %ymm0123; AVX512F-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm0124; AVX512F-NEXT: retq125;126; AVX512BW-LABEL: v64i8:127; AVX512BW: # %bb.0:128; AVX512BW-NEXT: vpsubsb %zmm1, %zmm0, %zmm0129; AVX512BW-NEXT: retq130 %z = call <64 x i8> @llvm.ssub.sat.v64i8(<64 x i8> %x, <64 x i8> %y)131 ret <64 x i8> %z132}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, %xmm0138; SSE-NEXT: retq139;140; AVX-LABEL: v8i16:141; AVX: # %bb.0:142; AVX-NEXT: vpsubsw %xmm1, %xmm0, %xmm0143; AVX-NEXT: retq144 %z = call <8 x i16> @llvm.ssub.sat.v8i16(<8 x i16> %x, <8 x i16> %y)145 ret <8 x i16> %z146}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, %xmm0152; SSE-NEXT: psubsw %xmm3, %xmm1153; SSE-NEXT: retq154;155; AVX1-LABEL: v16i16:156; AVX1: # %bb.0:157; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2158; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3159; AVX1-NEXT: vpsubsw %xmm2, %xmm3, %xmm2160; AVX1-NEXT: vpsubsw %xmm1, %xmm0, %xmm0161; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0162; AVX1-NEXT: retq163;164; AVX2-LABEL: v16i16:165; AVX2: # %bb.0:166; AVX2-NEXT: vpsubsw %ymm1, %ymm0, %ymm0167; AVX2-NEXT: retq168;169; AVX512-LABEL: v16i16:170; AVX512: # %bb.0:171; AVX512-NEXT: vpsubsw %ymm1, %ymm0, %ymm0172; AVX512-NEXT: retq173 %z = call <16 x i16> @llvm.ssub.sat.v16i16(<16 x i16> %x, <16 x i16> %y)174 ret <16 x i16> %z175}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, %xmm0181; SSE-NEXT: psubsw %xmm5, %xmm1182; SSE-NEXT: psubsw %xmm6, %xmm2183; SSE-NEXT: psubsw %xmm7, %xmm3184; SSE-NEXT: retq185;186; AVX1-LABEL: v32i16:187; AVX1: # %bb.0:188; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4189; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5190; AVX1-NEXT: vpsubsw %xmm4, %xmm5, %xmm4191; AVX1-NEXT: vpsubsw %xmm2, %xmm0, %xmm0192; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0193; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2194; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4195; AVX1-NEXT: vpsubsw %xmm2, %xmm4, %xmm2196; AVX1-NEXT: vpsubsw %xmm3, %xmm1, %xmm1197; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1198; AVX1-NEXT: retq199;200; AVX2-LABEL: v32i16:201; AVX2: # %bb.0:202; AVX2-NEXT: vpsubsw %ymm2, %ymm0, %ymm0203; AVX2-NEXT: vpsubsw %ymm3, %ymm1, %ymm1204; AVX2-NEXT: retq205;206; AVX512F-LABEL: v32i16:207; AVX512F: # %bb.0:208; AVX512F-NEXT: vextracti64x4 $1, %zmm1, %ymm2209; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm3210; AVX512F-NEXT: vpsubsw %ymm2, %ymm3, %ymm2211; AVX512F-NEXT: vpsubsw %ymm1, %ymm0, %ymm0212; AVX512F-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm0213; AVX512F-NEXT: retq214;215; AVX512BW-LABEL: v32i16:216; AVX512BW: # %bb.0:217; AVX512BW-NEXT: vpsubsw %zmm1, %zmm0, %zmm0218; AVX512BW-NEXT: retq219 %z = call <32 x i16> @llvm.ssub.sat.v32i16(<32 x i16> %x, <32 x i16> %y)220 ret <32 x i16> %z221}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],zero229; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero230; SSE-NEXT: psubsb %xmm1, %xmm0231; SSE-NEXT: movq %xmm0, (%rdx)232; SSE-NEXT: retq233;234; AVX-LABEL: v8i8:235; AVX: # %bb.0:236; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero237; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero238; AVX-NEXT: vpsubsb %xmm1, %xmm0, %xmm0239; AVX-NEXT: vmovq %xmm0, (%rdx)240; AVX-NEXT: retq241 %x = load <8 x i8>, ptr %px242 %y = load <8 x i8>, ptr %py243 %z = call <8 x i8> @llvm.ssub.sat.v8i8(<8 x i8> %x, <8 x i8> %y)244 store <8 x i8> %z, ptr %pz245 ret void246}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,zero252; SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero253; SSE-NEXT: psubsb %xmm1, %xmm0254; SSE-NEXT: movd %xmm0, (%rdx)255; SSE-NEXT: retq256;257; AVX-LABEL: v4i8:258; AVX: # %bb.0:259; AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero260; AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero261; AVX-NEXT: vpsubsb %xmm1, %xmm0, %xmm0262; AVX-NEXT: vmovd %xmm0, (%rdx)263; AVX-NEXT: retq264 %x = load <4 x i8>, ptr %px265 %y = load <4 x i8>, ptr %py266 %z = call <4 x i8> @llvm.ssub.sat.v4i8(<4 x i8> %x, <4 x i8> %y)267 store <4 x i8> %z, ptr %pz268 ret void269}270 271define void @v2i8(ptr %px, ptr %py, ptr %pz) nounwind {272; SSE2-LABEL: v2i8:273; SSE2: # %bb.0:274; SSE2-NEXT: movzwl (%rdi), %eax275; SSE2-NEXT: movd %eax, %xmm0276; SSE2-NEXT: movzwl (%rsi), %eax277; SSE2-NEXT: movd %eax, %xmm1278; SSE2-NEXT: psubsb %xmm1, %xmm0279; SSE2-NEXT: movd %xmm0, %eax280; SSE2-NEXT: movw %ax, (%rdx)281; SSE2-NEXT: retq282;283; SSSE3-LABEL: v2i8:284; SSSE3: # %bb.0:285; SSSE3-NEXT: movzwl (%rdi), %eax286; SSSE3-NEXT: movd %eax, %xmm0287; SSSE3-NEXT: movzwl (%rsi), %eax288; SSSE3-NEXT: movd %eax, %xmm1289; SSSE3-NEXT: psubsb %xmm1, %xmm0290; SSSE3-NEXT: movd %xmm0, %eax291; SSSE3-NEXT: movw %ax, (%rdx)292; SSSE3-NEXT: retq293;294; SSE41-LABEL: v2i8:295; SSE41: # %bb.0:296; SSE41-NEXT: movzwl (%rdi), %eax297; SSE41-NEXT: movd %eax, %xmm0298; SSE41-NEXT: movzwl (%rsi), %eax299; SSE41-NEXT: movd %eax, %xmm1300; SSE41-NEXT: psubsb %xmm1, %xmm0301; SSE41-NEXT: pextrw $0, %xmm0, (%rdx)302; SSE41-NEXT: retq303;304; AVX-LABEL: v2i8:305; AVX: # %bb.0:306; AVX-NEXT: movzwl (%rdi), %eax307; AVX-NEXT: vmovd %eax, %xmm0308; AVX-NEXT: movzwl (%rsi), %eax309; AVX-NEXT: vmovd %eax, %xmm1310; AVX-NEXT: vpsubsb %xmm1, %xmm0, %xmm0311; AVX-NEXT: vpextrw $0, %xmm0, (%rdx)312; AVX-NEXT: retq313 %x = load <2 x i8>, ptr %px314 %y = load <2 x i8>, ptr %py315 %z = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %x, <2 x i8> %y)316 store <2 x i8> %z, ptr %pz317 ret void318}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],zero324; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero325; SSE-NEXT: psubsw %xmm1, %xmm0326; SSE-NEXT: movq %xmm0, (%rdx)327; SSE-NEXT: retq328;329; AVX-LABEL: v4i16:330; AVX: # %bb.0:331; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero332; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero333; AVX-NEXT: vpsubsw %xmm1, %xmm0, %xmm0334; AVX-NEXT: vmovq %xmm0, (%rdx)335; AVX-NEXT: retq336 %x = load <4 x i16>, ptr %px337 %y = load <4 x i16>, ptr %py338 %z = call <4 x i16> @llvm.ssub.sat.v4i16(<4 x i16> %x, <4 x i16> %y)339 store <4 x i16> %z, ptr %pz340 ret void341}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,zero347; SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero348; SSE-NEXT: psubsw %xmm1, %xmm0349; SSE-NEXT: movd %xmm0, (%rdx)350; SSE-NEXT: retq351;352; AVX-LABEL: v2i16:353; AVX: # %bb.0:354; AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero355; AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero356; AVX-NEXT: vpsubsw %xmm1, %xmm0, %xmm0357; AVX-NEXT: vmovd %xmm0, (%rdx)358; AVX-NEXT: retq359 %x = load <2 x i16>, ptr %px360 %y = load <2 x i16>, ptr %py361 %z = call <2 x i16> @llvm.ssub.sat.v2i16(<2 x i16> %x, <2 x i16> %y)362 store <2 x i16> %z, ptr %pz363 ret void364}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, %xmm0370; SSE-NEXT: retq371;372; AVX-LABEL: v12i8:373; AVX: # %bb.0:374; AVX-NEXT: vpsubsb %xmm1, %xmm0, %xmm0375; AVX-NEXT: retq376 %z = call <12 x i8> @llvm.ssub.sat.v12i8(<12 x i8> %x, <12 x i8> %y)377 ret <12 x i8> %z378}379 380define void @v12i16(ptr %px, ptr %py, ptr %pz) nounwind {381; SSE-LABEL: v12i16:382; SSE: # %bb.0:383; SSE-NEXT: movdqa (%rdi), %xmm0384; SSE-NEXT: movdqa 16(%rdi), %xmm1385; SSE-NEXT: psubsw 16(%rsi), %xmm1386; SSE-NEXT: psubsw (%rsi), %xmm0387; SSE-NEXT: movdqa %xmm0, (%rdx)388; SSE-NEXT: movq %xmm1, 16(%rdx)389; SSE-NEXT: retq390;391; AVX1-LABEL: v12i16:392; AVX1: # %bb.0:393; AVX1-NEXT: vmovdqa (%rdi), %xmm0394; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1395; AVX1-NEXT: vpsubsw 16(%rsi), %xmm1, %xmm1396; AVX1-NEXT: vpsubsw (%rsi), %xmm0, %xmm0397; AVX1-NEXT: vmovdqa %xmm0, (%rdx)398; AVX1-NEXT: vmovq %xmm1, 16(%rdx)399; AVX1-NEXT: retq400;401; AVX2-LABEL: v12i16:402; AVX2: # %bb.0:403; AVX2-NEXT: vmovdqa (%rdi), %ymm0404; AVX2-NEXT: vpsubsw (%rsi), %ymm0, %ymm0405; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1406; AVX2-NEXT: vmovq %xmm1, 16(%rdx)407; AVX2-NEXT: vmovdqa %xmm0, (%rdx)408; AVX2-NEXT: vzeroupper409; AVX2-NEXT: retq410;411; AVX512-LABEL: v12i16:412; AVX512: # %bb.0:413; AVX512-NEXT: vmovdqa (%rdi), %ymm0414; AVX512-NEXT: vpsubsw (%rsi), %ymm0, %ymm0415; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1416; AVX512-NEXT: vmovq %xmm1, 16(%rdx)417; AVX512-NEXT: vmovdqa %xmm0, (%rdx)418; AVX512-NEXT: vzeroupper419; AVX512-NEXT: retq420 %x = load <12 x i16>, ptr %px421 %y = load <12 x i16>, ptr %py422 %z = call <12 x i16> @llvm.ssub.sat.v12i16(<12 x i16> %x, <12 x i16> %y)423 store <12 x i16> %z, ptr %pz424 ret void425}426 427; Scalarization428 429define void @v1i8(ptr %px, ptr %py, ptr %pz) nounwind {430; SSE-LABEL: v1i8:431; SSE: # %bb.0:432; SSE-NEXT: movzbl (%rdi), %eax433; SSE-NEXT: movzbl (%rsi), %ecx434; SSE-NEXT: xorl %esi, %esi435; SSE-NEXT: cmpb %cl, %al436; SSE-NEXT: setns %sil437; SSE-NEXT: addl $127, %esi438; SSE-NEXT: subb %cl, %al439; SSE-NEXT: movzbl %al, %eax440; SSE-NEXT: cmovol %esi, %eax441; SSE-NEXT: movb %al, (%rdx)442; SSE-NEXT: retq443;444; AVX-LABEL: v1i8:445; AVX: # %bb.0:446; AVX-NEXT: movzbl (%rdi), %eax447; AVX-NEXT: movzbl (%rsi), %ecx448; AVX-NEXT: xorl %esi, %esi449; AVX-NEXT: cmpb %cl, %al450; AVX-NEXT: setns %sil451; AVX-NEXT: addl $127, %esi452; AVX-NEXT: subb %cl, %al453; AVX-NEXT: movzbl %al, %eax454; AVX-NEXT: cmovol %esi, %eax455; AVX-NEXT: movb %al, (%rdx)456; AVX-NEXT: retq457 %x = load <1 x i8>, ptr %px458 %y = load <1 x i8>, ptr %py459 %z = call <1 x i8> @llvm.ssub.sat.v1i8(<1 x i8> %x, <1 x i8> %y)460 store <1 x i8> %z, ptr %pz461 ret void462}463 464define void @v1i16(ptr %px, ptr %py, ptr %pz) nounwind {465; SSE-LABEL: v1i16:466; SSE: # %bb.0:467; SSE-NEXT: movzwl (%rdi), %eax468; SSE-NEXT: movzwl (%rsi), %ecx469; SSE-NEXT: xorl %esi, %esi470; SSE-NEXT: cmpw %cx, %ax471; SSE-NEXT: setns %sil472; SSE-NEXT: addl $32767, %esi # imm = 0x7FFF473; SSE-NEXT: subw %cx, %ax474; SSE-NEXT: cmovol %esi, %eax475; SSE-NEXT: movw %ax, (%rdx)476; SSE-NEXT: retq477;478; AVX-LABEL: v1i16:479; AVX: # %bb.0:480; AVX-NEXT: movzwl (%rdi), %eax481; AVX-NEXT: movzwl (%rsi), %ecx482; AVX-NEXT: xorl %esi, %esi483; AVX-NEXT: cmpw %cx, %ax484; AVX-NEXT: setns %sil485; AVX-NEXT: addl $32767, %esi # imm = 0x7FFF486; AVX-NEXT: subw %cx, %ax487; AVX-NEXT: cmovol %esi, %eax488; AVX-NEXT: movw %ax, (%rdx)489; AVX-NEXT: retq490 %x = load <1 x i16>, ptr %px491 %y = load <1 x i16>, ptr %py492 %z = call <1 x i16> @llvm.ssub.sat.v1i16(<1 x i16> %x, <1 x i16> %y)493 store <1 x i16> %z, ptr %pz494 ret void495}496 497; Promotion498 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, %xmm1503; 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, %xmm1505; SSE-NEXT: psllw $4, %xmm0506; SSE-NEXT: pand %xmm2, %xmm0507; SSE-NEXT: psubsb %xmm1, %xmm0508; SSE-NEXT: psrlw $4, %xmm0509; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0510; 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, %xmm0512; SSE-NEXT: psubb %xmm1, %xmm0513; SSE-NEXT: retq514;515; AVX1-LABEL: v16i4:516; AVX1: # %bb.0:517; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1518; 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, %xmm1520; AVX1-NEXT: vpsllw $4, %xmm0, %xmm0521; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0522; AVX1-NEXT: vpsubsb %xmm1, %xmm0, %xmm0523; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0524; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0525; 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, %xmm0527; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm0528; AVX1-NEXT: retq529;530; AVX2-LABEL: v16i4:531; AVX2: # %bb.0:532; AVX2-NEXT: vpsllw $4, %xmm1, %xmm1533; 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, %xmm1535; AVX2-NEXT: vpsllw $4, %xmm0, %xmm0536; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0537; AVX2-NEXT: vpsubsb %xmm1, %xmm0, %xmm0538; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm0539; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0540; 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, %xmm0542; AVX2-NEXT: vpsubb %xmm1, %xmm0, %xmm0543; AVX2-NEXT: retq544;545; AVX512F-LABEL: v16i4:546; AVX512F: # %bb.0:547; AVX512F-NEXT: vpsllw $4, %xmm1, %xmm1548; 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, %xmm1550; AVX512F-NEXT: vpsllw $4, %xmm0, %xmm0551; AVX512F-NEXT: vpand %xmm2, %xmm0, %xmm0552; AVX512F-NEXT: vpsubsb %xmm1, %xmm0, %xmm0553; AVX512F-NEXT: vpsrlw $4, %xmm0, %xmm0554; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0555; 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, %xmm0557; AVX512F-NEXT: vpsubb %xmm1, %xmm0, %xmm0558; AVX512F-NEXT: retq559;560; AVX512BW-LABEL: v16i4:561; AVX512BW: # %bb.0:562; AVX512BW-NEXT: vpsllw $4, %xmm1, %xmm1563; 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, %xmm1565; AVX512BW-NEXT: vpsllw $4, %xmm0, %xmm0566; AVX512BW-NEXT: vpand %xmm2, %xmm0, %xmm0567; AVX512BW-NEXT: vpsubsb %xmm1, %xmm0, %xmm0568; AVX512BW-NEXT: vpsrlw $4, %xmm0, %xmm0569; 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 & m32bcst)571; AVX512BW-NEXT: vpsubb %xmm1, %xmm0, %xmm0572; AVX512BW-NEXT: retq573 %z = call <16 x i4> @llvm.ssub.sat.v16i4(<16 x i4> %x, <16 x i4> %y)574 ret <16 x i4> %z575}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), %xmm1581; SSE-NEXT: andps %xmm1, %xmm0582; SSE-NEXT: retq583;584; AVX1-LABEL: v16i1:585; AVX1: # %bb.0:586; AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1587; AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0588; AVX1-NEXT: retq589;590; AVX2-LABEL: v16i1:591; AVX2: # %bb.0:592; AVX2-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1593; AVX2-NEXT: vandps %xmm1, %xmm0, %xmm0594; AVX2-NEXT: retq595;596; AVX512F-LABEL: v16i1:597; AVX512F: # %bb.0:598; AVX512F-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1599; AVX512F-NEXT: vandps %xmm1, %xmm0, %xmm0600; AVX512F-NEXT: retq601;602; AVX512BW-LABEL: v16i1:603; AVX512BW: # %bb.0:604; AVX512BW-NEXT: vpternlogd {{.*#+}} xmm0 = xmm0 & (xmm1 ^ m32bcst)605; AVX512BW-NEXT: retq606 %z = call <16 x i1> @llvm.ssub.sat.v16i1(<16 x i1> %x, <16 x i1> %y)607 ret <16 x i1> %z608}609 610; Expanded611 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, %xmm2616; SSE2-NEXT: movdqa %xmm0, %xmm3617; SSE2-NEXT: psubd %xmm1, %xmm3618; SSE2-NEXT: pcmpgtd %xmm2, %xmm1619; SSE2-NEXT: pcmpgtd %xmm3, %xmm0620; SSE2-NEXT: pxor %xmm1, %xmm0621; SSE2-NEXT: movdqa %xmm0, %xmm1622; SSE2-NEXT: pandn %xmm3, %xmm1623; SSE2-NEXT: psrad $31, %xmm3624; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3625; SSE2-NEXT: pand %xmm3, %xmm0626; SSE2-NEXT: por %xmm1, %xmm0627; SSE2-NEXT: retq628;629; SSSE3-LABEL: v2i32:630; SSSE3: # %bb.0:631; SSSE3-NEXT: pxor %xmm2, %xmm2632; SSSE3-NEXT: movdqa %xmm0, %xmm3633; SSSE3-NEXT: psubd %xmm1, %xmm3634; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1635; SSSE3-NEXT: pcmpgtd %xmm3, %xmm0636; SSSE3-NEXT: pxor %xmm1, %xmm0637; SSSE3-NEXT: movdqa %xmm0, %xmm1638; SSSE3-NEXT: pandn %xmm3, %xmm1639; SSSE3-NEXT: psrad $31, %xmm3640; SSSE3-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3641; SSSE3-NEXT: pand %xmm3, %xmm0642; SSSE3-NEXT: por %xmm1, %xmm0643; SSSE3-NEXT: retq644;645; SSE41-LABEL: v2i32:646; SSE41: # %bb.0:647; SSE41-NEXT: pxor %xmm3, %xmm3648; SSE41-NEXT: movdqa %xmm0, %xmm2649; SSE41-NEXT: psubd %xmm1, %xmm2650; SSE41-NEXT: pcmpgtd %xmm3, %xmm1651; SSE41-NEXT: pcmpgtd %xmm2, %xmm0652; SSE41-NEXT: pxor %xmm1, %xmm0653; SSE41-NEXT: movdqa %xmm2, %xmm1654; SSE41-NEXT: psrad $31, %xmm1655; SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1656; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm2657; SSE41-NEXT: movaps %xmm2, %xmm0658; SSE41-NEXT: retq659;660; AVX1-LABEL: v2i32:661; AVX1: # %bb.0:662; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2663; AVX1-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2664; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1665; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0666; AVX1-NEXT: vpxor %xmm0, %xmm2, %xmm0667; AVX1-NEXT: vpsrad $31, %xmm1, %xmm2668; AVX1-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2669; AVX1-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0670; AVX1-NEXT: retq671;672; AVX2-LABEL: v2i32:673; AVX2: # %bb.0:674; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2675; AVX2-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2676; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm1677; AVX2-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0678; AVX2-NEXT: vpxor %xmm0, %xmm2, %xmm0679; AVX2-NEXT: vpsrad $31, %xmm1, %xmm2680; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]681; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2682; AVX2-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0683; AVX2-NEXT: retq684;685; AVX512F-LABEL: v2i32:686; AVX512F: # %bb.0:687; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2688; AVX512F-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2689; AVX512F-NEXT: vpsubd %xmm1, %xmm0, %xmm1690; AVX512F-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0691; AVX512F-NEXT: vpxor %xmm0, %xmm2, %xmm0692; AVX512F-NEXT: vpsrad $31, %xmm1, %xmm2693; AVX512F-NEXT: vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]694; AVX512F-NEXT: vpxor %xmm3, %xmm2, %xmm2695; AVX512F-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0696; AVX512F-NEXT: retq697;698; AVX512BW-LABEL: v2i32:699; AVX512BW: # %bb.0:700; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2701; AVX512BW-NEXT: vpcmpgtd %xmm2, %xmm1, %k0702; AVX512BW-NEXT: vpsubd %xmm1, %xmm0, %xmm1703; AVX512BW-NEXT: vpcmpgtd %xmm1, %xmm0, %k1704; AVX512BW-NEXT: kxorw %k1, %k0, %k1705; AVX512BW-NEXT: vpsrad $31, %xmm1, %xmm0706; AVX512BW-NEXT: vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm1 {%k1}707; AVX512BW-NEXT: vmovdqa %xmm1, %xmm0708; AVX512BW-NEXT: retq709 %z = call <2 x i32> @llvm.ssub.sat.v2i32(<2 x i32> %x, <2 x i32> %y)710 ret <2 x i32> %z711}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, %xmm2717; SSE2-NEXT: movdqa %xmm0, %xmm3718; SSE2-NEXT: psubd %xmm1, %xmm3719; SSE2-NEXT: pcmpgtd %xmm2, %xmm1720; SSE2-NEXT: pcmpgtd %xmm3, %xmm0721; SSE2-NEXT: pxor %xmm1, %xmm0722; SSE2-NEXT: movdqa %xmm0, %xmm1723; SSE2-NEXT: pandn %xmm3, %xmm1724; SSE2-NEXT: psrad $31, %xmm3725; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3726; SSE2-NEXT: pand %xmm3, %xmm0727; SSE2-NEXT: por %xmm1, %xmm0728; SSE2-NEXT: retq729;730; SSSE3-LABEL: v4i32:731; SSSE3: # %bb.0:732; SSSE3-NEXT: pxor %xmm2, %xmm2733; SSSE3-NEXT: movdqa %xmm0, %xmm3734; SSSE3-NEXT: psubd %xmm1, %xmm3735; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1736; SSSE3-NEXT: pcmpgtd %xmm3, %xmm0737; SSSE3-NEXT: pxor %xmm1, %xmm0738; SSSE3-NEXT: movdqa %xmm0, %xmm1739; SSSE3-NEXT: pandn %xmm3, %xmm1740; SSSE3-NEXT: psrad $31, %xmm3741; SSSE3-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3742; SSSE3-NEXT: pand %xmm3, %xmm0743; SSSE3-NEXT: por %xmm1, %xmm0744; SSSE3-NEXT: retq745;746; SSE41-LABEL: v4i32:747; SSE41: # %bb.0:748; SSE41-NEXT: pxor %xmm3, %xmm3749; SSE41-NEXT: movdqa %xmm0, %xmm2750; SSE41-NEXT: psubd %xmm1, %xmm2751; SSE41-NEXT: pcmpgtd %xmm3, %xmm1752; SSE41-NEXT: pcmpgtd %xmm2, %xmm0753; SSE41-NEXT: pxor %xmm1, %xmm0754; SSE41-NEXT: movdqa %xmm2, %xmm1755; SSE41-NEXT: psrad $31, %xmm1756; SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1757; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm2758; SSE41-NEXT: movaps %xmm2, %xmm0759; SSE41-NEXT: retq760;761; AVX1-LABEL: v4i32:762; AVX1: # %bb.0:763; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2764; AVX1-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2765; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1766; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0767; AVX1-NEXT: vpxor %xmm0, %xmm2, %xmm0768; AVX1-NEXT: vpsrad $31, %xmm1, %xmm2769; AVX1-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2770; AVX1-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0771; AVX1-NEXT: retq772;773; AVX2-LABEL: v4i32:774; AVX2: # %bb.0:775; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2776; AVX2-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2777; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm1778; AVX2-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0779; AVX2-NEXT: vpxor %xmm0, %xmm2, %xmm0780; AVX2-NEXT: vpsrad $31, %xmm1, %xmm2781; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]782; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2783; AVX2-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0784; AVX2-NEXT: retq785;786; AVX512F-LABEL: v4i32:787; AVX512F: # %bb.0:788; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2789; AVX512F-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2790; AVX512F-NEXT: vpsubd %xmm1, %xmm0, %xmm1791; AVX512F-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0792; AVX512F-NEXT: vpxor %xmm0, %xmm2, %xmm0793; AVX512F-NEXT: vpsrad $31, %xmm1, %xmm2794; AVX512F-NEXT: vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]795; AVX512F-NEXT: vpxor %xmm3, %xmm2, %xmm2796; AVX512F-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0797; AVX512F-NEXT: retq798;799; AVX512BW-LABEL: v4i32:800; AVX512BW: # %bb.0:801; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2802; AVX512BW-NEXT: vpcmpgtd %xmm2, %xmm1, %k0803; AVX512BW-NEXT: vpsubd %xmm1, %xmm0, %xmm1804; AVX512BW-NEXT: vpcmpgtd %xmm1, %xmm0, %k1805; AVX512BW-NEXT: kxorw %k1, %k0, %k1806; AVX512BW-NEXT: vpsrad $31, %xmm1, %xmm0807; AVX512BW-NEXT: vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm1 {%k1}808; AVX512BW-NEXT: vmovdqa %xmm1, %xmm0809; AVX512BW-NEXT: retq810 %z = call <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32> %x, <4 x i32> %y)811 ret <4 x i32> %z812}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, %xmm4818; SSE2-NEXT: movdqa %xmm0, %xmm5819; SSE2-NEXT: psubd %xmm2, %xmm5820; SSE2-NEXT: pcmpgtd %xmm4, %xmm2821; SSE2-NEXT: pcmpgtd %xmm5, %xmm0822; SSE2-NEXT: pxor %xmm2, %xmm0823; SSE2-NEXT: movdqa %xmm0, %xmm2824; SSE2-NEXT: pandn %xmm5, %xmm2825; SSE2-NEXT: psrad $31, %xmm5826; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]827; SSE2-NEXT: pxor %xmm6, %xmm5828; SSE2-NEXT: pand %xmm5, %xmm0829; SSE2-NEXT: por %xmm2, %xmm0830; SSE2-NEXT: movdqa %xmm1, %xmm2831; SSE2-NEXT: psubd %xmm3, %xmm2832; SSE2-NEXT: pcmpgtd %xmm4, %xmm3833; SSE2-NEXT: pcmpgtd %xmm2, %xmm1834; SSE2-NEXT: pxor %xmm3, %xmm1835; SSE2-NEXT: movdqa %xmm1, %xmm3836; SSE2-NEXT: pandn %xmm2, %xmm3837; SSE2-NEXT: psrad $31, %xmm2838; SSE2-NEXT: pxor %xmm6, %xmm2839; SSE2-NEXT: pand %xmm2, %xmm1840; SSE2-NEXT: por %xmm3, %xmm1841; SSE2-NEXT: retq842;843; SSSE3-LABEL: v8i32:844; SSSE3: # %bb.0:845; SSSE3-NEXT: pxor %xmm4, %xmm4846; SSSE3-NEXT: movdqa %xmm0, %xmm5847; SSSE3-NEXT: psubd %xmm2, %xmm5848; SSSE3-NEXT: pcmpgtd %xmm4, %xmm2849; SSSE3-NEXT: pcmpgtd %xmm5, %xmm0850; SSSE3-NEXT: pxor %xmm2, %xmm0851; SSSE3-NEXT: movdqa %xmm0, %xmm2852; SSSE3-NEXT: pandn %xmm5, %xmm2853; SSSE3-NEXT: psrad $31, %xmm5854; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]855; SSSE3-NEXT: pxor %xmm6, %xmm5856; SSSE3-NEXT: pand %xmm5, %xmm0857; SSSE3-NEXT: por %xmm2, %xmm0858; SSSE3-NEXT: movdqa %xmm1, %xmm2859; SSSE3-NEXT: psubd %xmm3, %xmm2860; SSSE3-NEXT: pcmpgtd %xmm4, %xmm3861; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1862; SSSE3-NEXT: pxor %xmm3, %xmm1863; SSSE3-NEXT: movdqa %xmm1, %xmm3864; SSSE3-NEXT: pandn %xmm2, %xmm3865; SSSE3-NEXT: psrad $31, %xmm2866; SSSE3-NEXT: pxor %xmm6, %xmm2867; SSSE3-NEXT: pand %xmm2, %xmm1868; SSSE3-NEXT: por %xmm3, %xmm1869; SSSE3-NEXT: retq870;871; SSE41-LABEL: v8i32:872; SSE41: # %bb.0:873; SSE41-NEXT: movdqa %xmm1, %xmm5874; SSE41-NEXT: pxor %xmm6, %xmm6875; SSE41-NEXT: movdqa %xmm0, %xmm4876; SSE41-NEXT: psubd %xmm2, %xmm4877; SSE41-NEXT: pcmpgtd %xmm6, %xmm2878; SSE41-NEXT: pcmpgtd %xmm4, %xmm0879; SSE41-NEXT: pxor %xmm2, %xmm0880; SSE41-NEXT: movdqa %xmm4, %xmm1881; SSE41-NEXT: psrad $31, %xmm1882; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]883; SSE41-NEXT: pxor %xmm2, %xmm1884; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm4885; SSE41-NEXT: movdqa %xmm5, %xmm1886; SSE41-NEXT: psubd %xmm3, %xmm1887; SSE41-NEXT: pcmpgtd %xmm6, %xmm3888; SSE41-NEXT: pcmpgtd %xmm1, %xmm5889; SSE41-NEXT: pxor %xmm3, %xmm5890; SSE41-NEXT: movdqa %xmm1, %xmm3891; SSE41-NEXT: psrad $31, %xmm3892; SSE41-NEXT: pxor %xmm2, %xmm3893; SSE41-NEXT: movdqa %xmm5, %xmm0894; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm1895; SSE41-NEXT: movaps %xmm4, %xmm0896; SSE41-NEXT: retq897;898; AVX1-LABEL: v8i32:899; AVX1: # %bb.0:900; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2901; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3902; AVX1-NEXT: vpcmpgtd %xmm3, %xmm2, %xmm4903; AVX1-NEXT: vpcmpgtd %xmm3, %xmm1, %xmm3904; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3905; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4906; AVX1-NEXT: vpsubd %xmm2, %xmm4, %xmm2907; AVX1-NEXT: vpcmpgtd %xmm2, %xmm4, %xmm4908; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1909; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0910; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0911; AVX1-NEXT: vxorps %ymm0, %ymm3, %ymm0912; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm3913; AVX1-NEXT: vpsrad $31, %xmm1, %xmm1914; AVX1-NEXT: vpsrad $31, %xmm2, %xmm2915; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1916; AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1917; AVX1-NEXT: vblendvps %ymm0, %ymm1, %ymm3, %ymm0918; AVX1-NEXT: retq919;920; AVX2-LABEL: v8i32:921; AVX2: # %bb.0:922; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2923; AVX2-NEXT: vpcmpgtd %ymm2, %ymm1, %ymm2924; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm1925; AVX2-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm0926; AVX2-NEXT: vpxor %ymm0, %ymm2, %ymm0927; AVX2-NEXT: vpsrad $31, %ymm1, %ymm2928; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm3 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]929; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2930; AVX2-NEXT: vblendvps %ymm0, %ymm2, %ymm1, %ymm0931; AVX2-NEXT: retq932;933; AVX512F-LABEL: v8i32:934; AVX512F: # %bb.0:935; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2936; AVX512F-NEXT: vpcmpgtd %ymm2, %ymm1, %ymm2937; AVX512F-NEXT: vpsubd %ymm1, %ymm0, %ymm1938; AVX512F-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm0939; AVX512F-NEXT: vpxor %ymm0, %ymm2, %ymm0940; AVX512F-NEXT: vpsrad $31, %ymm1, %ymm2941; AVX512F-NEXT: vpbroadcastd {{.*#+}} ymm3 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]942; AVX512F-NEXT: vpxor %ymm3, %ymm2, %ymm2943; AVX512F-NEXT: vblendvps %ymm0, %ymm2, %ymm1, %ymm0944; AVX512F-NEXT: retq945;946; AVX512BW-LABEL: v8i32:947; AVX512BW: # %bb.0:948; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2949; AVX512BW-NEXT: vpcmpgtd %ymm2, %ymm1, %k0950; AVX512BW-NEXT: vpsubd %ymm1, %ymm0, %ymm1951; AVX512BW-NEXT: vpcmpgtd %ymm1, %ymm0, %k1952; AVX512BW-NEXT: kxorw %k1, %k0, %k1953; AVX512BW-NEXT: vpsrad $31, %ymm1, %ymm0954; AVX512BW-NEXT: vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm1 {%k1}955; AVX512BW-NEXT: vmovdqa %ymm1, %ymm0956; AVX512BW-NEXT: retq957 %z = call <8 x i32> @llvm.ssub.sat.v8i32(<8 x i32> %x, <8 x i32> %y)958 ret <8 x i32> %z959}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, %xmm8965; SSE2-NEXT: movdqa %xmm0, %xmm9966; SSE2-NEXT: psubd %xmm4, %xmm9967; SSE2-NEXT: pcmpgtd %xmm8, %xmm4968; SSE2-NEXT: pcmpgtd %xmm9, %xmm0969; SSE2-NEXT: pxor %xmm4, %xmm0970; SSE2-NEXT: movdqa %xmm0, %xmm10971; SSE2-NEXT: pandn %xmm9, %xmm10972; SSE2-NEXT: psrad $31, %xmm9973; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]974; SSE2-NEXT: pxor %xmm4, %xmm9975; SSE2-NEXT: pand %xmm9, %xmm0976; SSE2-NEXT: por %xmm10, %xmm0977; SSE2-NEXT: movdqa %xmm1, %xmm9978; SSE2-NEXT: psubd %xmm5, %xmm9979; SSE2-NEXT: pcmpgtd %xmm8, %xmm5980; SSE2-NEXT: pcmpgtd %xmm9, %xmm1981; SSE2-NEXT: pxor %xmm5, %xmm1982; SSE2-NEXT: movdqa %xmm1, %xmm5983; SSE2-NEXT: pandn %xmm9, %xmm5984; SSE2-NEXT: psrad $31, %xmm9985; SSE2-NEXT: pxor %xmm4, %xmm9986; SSE2-NEXT: pand %xmm9, %xmm1987; SSE2-NEXT: por %xmm5, %xmm1988; SSE2-NEXT: movdqa %xmm2, %xmm5989; SSE2-NEXT: psubd %xmm6, %xmm5990; SSE2-NEXT: pcmpgtd %xmm8, %xmm6991; SSE2-NEXT: pcmpgtd %xmm5, %xmm2992; SSE2-NEXT: pxor %xmm6, %xmm2993; SSE2-NEXT: movdqa %xmm2, %xmm6994; SSE2-NEXT: pandn %xmm5, %xmm6995; SSE2-NEXT: psrad $31, %xmm5996; SSE2-NEXT: pxor %xmm4, %xmm5997; SSE2-NEXT: pand %xmm5, %xmm2998; SSE2-NEXT: por %xmm6, %xmm2999; SSE2-NEXT: movdqa %xmm3, %xmm51000; SSE2-NEXT: psubd %xmm7, %xmm51001; SSE2-NEXT: pcmpgtd %xmm8, %xmm71002; SSE2-NEXT: pcmpgtd %xmm5, %xmm31003; SSE2-NEXT: pxor %xmm7, %xmm31004; SSE2-NEXT: movdqa %xmm3, %xmm61005; SSE2-NEXT: pandn %xmm5, %xmm61006; SSE2-NEXT: psrad $31, %xmm51007; SSE2-NEXT: pxor %xmm4, %xmm51008; SSE2-NEXT: pand %xmm5, %xmm31009; SSE2-NEXT: por %xmm6, %xmm31010; SSE2-NEXT: retq1011;1012; SSSE3-LABEL: v16i32:1013; SSSE3: # %bb.0:1014; SSSE3-NEXT: pxor %xmm8, %xmm81015; SSSE3-NEXT: movdqa %xmm0, %xmm91016; SSSE3-NEXT: psubd %xmm4, %xmm91017; SSSE3-NEXT: pcmpgtd %xmm8, %xmm41018; SSSE3-NEXT: pcmpgtd %xmm9, %xmm01019; SSSE3-NEXT: pxor %xmm4, %xmm01020; SSSE3-NEXT: movdqa %xmm0, %xmm101021; SSSE3-NEXT: pandn %xmm9, %xmm101022; SSSE3-NEXT: psrad $31, %xmm91023; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]1024; SSSE3-NEXT: pxor %xmm4, %xmm91025; SSSE3-NEXT: pand %xmm9, %xmm01026; SSSE3-NEXT: por %xmm10, %xmm01027; SSSE3-NEXT: movdqa %xmm1, %xmm91028; SSSE3-NEXT: psubd %xmm5, %xmm91029; SSSE3-NEXT: pcmpgtd %xmm8, %xmm51030; SSSE3-NEXT: pcmpgtd %xmm9, %xmm11031; SSSE3-NEXT: pxor %xmm5, %xmm11032; SSSE3-NEXT: movdqa %xmm1, %xmm51033; SSSE3-NEXT: pandn %xmm9, %xmm51034; SSSE3-NEXT: psrad $31, %xmm91035; SSSE3-NEXT: pxor %xmm4, %xmm91036; SSSE3-NEXT: pand %xmm9, %xmm11037; SSSE3-NEXT: por %xmm5, %xmm11038; SSSE3-NEXT: movdqa %xmm2, %xmm51039; SSSE3-NEXT: psubd %xmm6, %xmm51040; SSSE3-NEXT: pcmpgtd %xmm8, %xmm61041; SSSE3-NEXT: pcmpgtd %xmm5, %xmm21042; SSSE3-NEXT: pxor %xmm6, %xmm21043; SSSE3-NEXT: movdqa %xmm2, %xmm61044; SSSE3-NEXT: pandn %xmm5, %xmm61045; SSSE3-NEXT: psrad $31, %xmm51046; SSSE3-NEXT: pxor %xmm4, %xmm51047; SSSE3-NEXT: pand %xmm5, %xmm21048; SSSE3-NEXT: por %xmm6, %xmm21049; SSSE3-NEXT: movdqa %xmm3, %xmm51050; SSSE3-NEXT: psubd %xmm7, %xmm51051; SSSE3-NEXT: pcmpgtd %xmm8, %xmm71052; SSSE3-NEXT: pcmpgtd %xmm5, %xmm31053; SSSE3-NEXT: pxor %xmm7, %xmm31054; SSSE3-NEXT: movdqa %xmm3, %xmm61055; SSSE3-NEXT: pandn %xmm5, %xmm61056; SSSE3-NEXT: psrad $31, %xmm51057; SSSE3-NEXT: pxor %xmm4, %xmm51058; SSSE3-NEXT: pand %xmm5, %xmm31059; SSSE3-NEXT: por %xmm6, %xmm31060; SSSE3-NEXT: retq1061;1062; SSE41-LABEL: v16i32:1063; SSE41: # %bb.0:1064; SSE41-NEXT: movdqa %xmm3, %xmm111065; SSE41-NEXT: movdqa %xmm2, %xmm101066; SSE41-NEXT: movdqa %xmm1, %xmm91067; SSE41-NEXT: pxor %xmm12, %xmm121068; SSE41-NEXT: movdqa %xmm0, %xmm81069; SSE41-NEXT: psubd %xmm4, %xmm81070; SSE41-NEXT: pcmpgtd %xmm12, %xmm41071; SSE41-NEXT: pcmpgtd %xmm8, %xmm01072; SSE41-NEXT: pxor %xmm4, %xmm01073; SSE41-NEXT: movdqa %xmm8, %xmm11074; SSE41-NEXT: psrad $31, %xmm11075; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]1076; SSE41-NEXT: pxor %xmm4, %xmm11077; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm81078; SSE41-NEXT: movdqa %xmm9, %xmm11079; SSE41-NEXT: psubd %xmm5, %xmm11080; SSE41-NEXT: pcmpgtd %xmm12, %xmm51081; SSE41-NEXT: pcmpgtd %xmm1, %xmm91082; SSE41-NEXT: pxor %xmm5, %xmm91083; SSE41-NEXT: movdqa %xmm1, %xmm21084; SSE41-NEXT: psrad $31, %xmm21085; SSE41-NEXT: pxor %xmm4, %xmm21086; SSE41-NEXT: movdqa %xmm9, %xmm01087; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm11088; SSE41-NEXT: movdqa %xmm10, %xmm21089; SSE41-NEXT: psubd %xmm6, %xmm21090; SSE41-NEXT: pcmpgtd %xmm12, %xmm61091; SSE41-NEXT: pcmpgtd %xmm2, %xmm101092; SSE41-NEXT: pxor %xmm6, %xmm101093; SSE41-NEXT: movdqa %xmm2, %xmm31094; SSE41-NEXT: psrad $31, %xmm31095; SSE41-NEXT: pxor %xmm4, %xmm31096; SSE41-NEXT: movdqa %xmm10, %xmm01097; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm21098; SSE41-NEXT: movdqa %xmm11, %xmm31099; SSE41-NEXT: psubd %xmm7, %xmm31100; SSE41-NEXT: pcmpgtd %xmm12, %xmm71101; SSE41-NEXT: pcmpgtd %xmm3, %xmm111102; SSE41-NEXT: pxor %xmm7, %xmm111103; SSE41-NEXT: movdqa %xmm3, %xmm51104; SSE41-NEXT: psrad $31, %xmm51105; SSE41-NEXT: pxor %xmm4, %xmm51106; SSE41-NEXT: movdqa %xmm11, %xmm01107; SSE41-NEXT: blendvps %xmm0, %xmm5, %xmm31108; SSE41-NEXT: movaps %xmm8, %xmm01109; SSE41-NEXT: retq1110;1111; AVX1-LABEL: v16i32:1112; AVX1: # %bb.0:1113; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm41114; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm51115; AVX1-NEXT: vpcmpgtd %xmm5, %xmm4, %xmm61116; AVX1-NEXT: vpcmpgtd %xmm5, %xmm2, %xmm71117; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm7, %ymm61118; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm71119; AVX1-NEXT: vpsubd %xmm4, %xmm7, %xmm41120; AVX1-NEXT: vpcmpgtd %xmm4, %xmm7, %xmm71121; AVX1-NEXT: vpsubd %xmm2, %xmm0, %xmm21122; AVX1-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm01123; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm0, %ymm01124; AVX1-NEXT: vxorps %ymm0, %ymm6, %ymm01125; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm2, %ymm61126; AVX1-NEXT: vpsrad $31, %xmm2, %xmm21127; AVX1-NEXT: vpsrad $31, %xmm4, %xmm41128; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm2, %ymm21129; AVX1-NEXT: vbroadcastss {{.*#+}} ymm4 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]1130; AVX1-NEXT: vxorps %ymm4, %ymm2, %ymm21131; AVX1-NEXT: vblendvps %ymm0, %ymm2, %ymm6, %ymm01132; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm21133; AVX1-NEXT: vpcmpgtd %xmm5, %xmm2, %xmm61134; AVX1-NEXT: vpcmpgtd %xmm5, %xmm3, %xmm51135; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm5, %ymm51136; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm61137; AVX1-NEXT: vpsubd %xmm2, %xmm6, %xmm21138; AVX1-NEXT: vpcmpgtd %xmm2, %xmm6, %xmm61139; AVX1-NEXT: vpsubd %xmm3, %xmm1, %xmm31140; AVX1-NEXT: vpcmpgtd %xmm3, %xmm1, %xmm11141; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm1, %ymm11142; AVX1-NEXT: vxorps %ymm1, %ymm5, %ymm11143; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm51144; AVX1-NEXT: vpsrad $31, %xmm3, %xmm31145; AVX1-NEXT: vpsrad $31, %xmm2, %xmm21146; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm21147; AVX1-NEXT: vxorps %ymm4, %ymm2, %ymm21148; AVX1-NEXT: vblendvps %ymm1, %ymm2, %ymm5, %ymm11149; AVX1-NEXT: retq1150;1151; AVX2-LABEL: v16i32:1152; AVX2: # %bb.0:1153; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm41154; AVX2-NEXT: vpcmpgtd %ymm4, %ymm2, %ymm51155; AVX2-NEXT: vpsubd %ymm2, %ymm0, %ymm21156; AVX2-NEXT: vpcmpgtd %ymm2, %ymm0, %ymm01157; AVX2-NEXT: vpxor %ymm0, %ymm5, %ymm01158; AVX2-NEXT: vpsrad $31, %ymm2, %ymm51159; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm6 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]1160; AVX2-NEXT: vpxor %ymm6, %ymm5, %ymm51161; AVX2-NEXT: vblendvps %ymm0, %ymm5, %ymm2, %ymm01162; AVX2-NEXT: vpcmpgtd %ymm4, %ymm3, %ymm21163; AVX2-NEXT: vpsubd %ymm3, %ymm1, %ymm31164; AVX2-NEXT: vpcmpgtd %ymm3, %ymm1, %ymm11165; AVX2-NEXT: vpxor %ymm1, %ymm2, %ymm11166; AVX2-NEXT: vpsrad $31, %ymm3, %ymm21167; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm21168; AVX2-NEXT: vblendvps %ymm1, %ymm2, %ymm3, %ymm11169; AVX2-NEXT: retq1170;1171; AVX512-LABEL: v16i32:1172; AVX512: # %bb.0:1173; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm21174; AVX512-NEXT: vpcmpgtd %zmm2, %zmm1, %k01175; AVX512-NEXT: vpsubd %zmm1, %zmm0, %zmm11176; AVX512-NEXT: vpcmpgtd %zmm1, %zmm0, %k11177; AVX512-NEXT: kxorw %k1, %k0, %k11178; AVX512-NEXT: vpsrad $31, %zmm1, %zmm01179; AVX512-NEXT: vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm1 {%k1}1180; AVX512-NEXT: vmovdqa64 %zmm1, %zmm01181; AVX512-NEXT: retq1182 %z = call <16 x i32> @llvm.ssub.sat.v16i32(<16 x i32> %x, <16 x i32> %y)1183 ret <16 x i32> %z1184}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, %xmm31191; SSE2-NEXT: pxor %xmm2, %xmm31192; SSE2-NEXT: psubq %xmm1, %xmm01193; SSE2-NEXT: movdqa %xmm0, %xmm41194; SSE2-NEXT: pxor %xmm2, %xmm41195; SSE2-NEXT: movdqa %xmm3, %xmm51196; SSE2-NEXT: pcmpgtd %xmm4, %xmm51197; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]1198; SSE2-NEXT: pcmpeqd %xmm3, %xmm41199; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]1200; SSE2-NEXT: pand %xmm6, %xmm31201; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]1202; SSE2-NEXT: por %xmm3, %xmm41203; SSE2-NEXT: pxor %xmm2, %xmm11204; SSE2-NEXT: movdqa %xmm1, %xmm31205; SSE2-NEXT: pcmpgtd %xmm2, %xmm31206; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]1207; SSE2-NEXT: pcmpeqd %xmm2, %xmm11208; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]1209; SSE2-NEXT: pand %xmm5, %xmm11210; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]1211; SSE2-NEXT: por %xmm1, %xmm21212; SSE2-NEXT: pxor %xmm4, %xmm21213; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1214; SSE2-NEXT: psrad $31, %xmm11215; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11216; SSE2-NEXT: pand %xmm2, %xmm11217; SSE2-NEXT: pandn %xmm0, %xmm21218; SSE2-NEXT: por %xmm2, %xmm11219; SSE2-NEXT: movdqa %xmm1, %xmm01220; SSE2-NEXT: retq1221;1222; SSSE3-LABEL: v2i64:1223; SSSE3: # %bb.0:1224; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]1225; SSSE3-NEXT: movdqa %xmm0, %xmm31226; SSSE3-NEXT: pxor %xmm2, %xmm31227; SSSE3-NEXT: psubq %xmm1, %xmm01228; SSSE3-NEXT: movdqa %xmm0, %xmm41229; SSSE3-NEXT: pxor %xmm2, %xmm41230; SSSE3-NEXT: movdqa %xmm3, %xmm51231; SSSE3-NEXT: pcmpgtd %xmm4, %xmm51232; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]1233; SSSE3-NEXT: pcmpeqd %xmm3, %xmm41234; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]1235; SSSE3-NEXT: pand %xmm6, %xmm31236; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]1237; SSSE3-NEXT: por %xmm3, %xmm41238; SSSE3-NEXT: pxor %xmm2, %xmm11239; SSSE3-NEXT: movdqa %xmm1, %xmm31240; SSSE3-NEXT: pcmpgtd %xmm2, %xmm31241; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]1242; SSSE3-NEXT: pcmpeqd %xmm2, %xmm11243; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]1244; SSSE3-NEXT: pand %xmm5, %xmm11245; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]1246; SSSE3-NEXT: por %xmm1, %xmm21247; SSSE3-NEXT: pxor %xmm4, %xmm21248; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1249; SSSE3-NEXT: psrad $31, %xmm11250; SSSE3-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11251; SSSE3-NEXT: pand %xmm2, %xmm11252; SSSE3-NEXT: pandn %xmm0, %xmm21253; SSSE3-NEXT: por %xmm2, %xmm11254; SSSE3-NEXT: movdqa %xmm1, %xmm01255; SSSE3-NEXT: retq1256;1257; SSE41-LABEL: v2i64:1258; SSE41: # %bb.0:1259; SSE41-NEXT: movdqa %xmm0, %xmm21260; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = [2147483648,2147483648]1261; SSE41-NEXT: movdqa %xmm2, %xmm31262; SSE41-NEXT: pxor %xmm0, %xmm31263; SSE41-NEXT: psubq %xmm1, %xmm21264; SSE41-NEXT: movdqa %xmm2, %xmm41265; SSE41-NEXT: pxor %xmm0, %xmm41266; SSE41-NEXT: movdqa %xmm3, %xmm51267; SSE41-NEXT: pcmpeqd %xmm4, %xmm51268; SSE41-NEXT: pcmpgtd %xmm4, %xmm31269; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]1270; SSE41-NEXT: pand %xmm5, %xmm41271; SSE41-NEXT: por %xmm3, %xmm41272; SSE41-NEXT: pxor %xmm0, %xmm11273; SSE41-NEXT: movdqa %xmm1, %xmm51274; SSE41-NEXT: pcmpeqd %xmm0, %xmm51275; SSE41-NEXT: pcmpgtd %xmm0, %xmm11276; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]1277; SSE41-NEXT: pand %xmm5, %xmm31278; SSE41-NEXT: por %xmm1, %xmm31279; SSE41-NEXT: pxor %xmm4, %xmm31280; SSE41-NEXT: movapd {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]1281; SSE41-NEXT: movdqa %xmm2, %xmm01282; SSE41-NEXT: blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11283; SSE41-NEXT: movdqa %xmm3, %xmm01284; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm21285; SSE41-NEXT: movapd %xmm2, %xmm01286; SSE41-NEXT: retq1287;1288; AVX1-LABEL: v2i64:1289; AVX1: # %bb.0:1290; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21291; AVX1-NEXT: vpcmpgtq %xmm2, %xmm1, %xmm21292; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm11293; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm01294; AVX1-NEXT: vpxor %xmm0, %xmm2, %xmm01295; 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, %xmm21298; AVX1-NEXT: vblendvpd %xmm0, %xmm2, %xmm1, %xmm01299; AVX1-NEXT: retq1300;1301; AVX2-LABEL: v2i64:1302; AVX2: # %bb.0:1303; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm21304; AVX2-NEXT: vpcmpgtq %xmm2, %xmm1, %xmm21305; AVX2-NEXT: vpsubq %xmm1, %xmm0, %xmm11306; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm01307; AVX2-NEXT: vpxor %xmm0, %xmm2, %xmm01308; 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, %xmm21311; AVX2-NEXT: vblendvpd %xmm0, %xmm2, %xmm1, %xmm01312; AVX2-NEXT: retq1313;1314; AVX512F-LABEL: v2i64:1315; AVX512F: # %bb.0:1316; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm21317; AVX512F-NEXT: vpcmpgtq %xmm2, %xmm1, %xmm21318; AVX512F-NEXT: vpsubq %xmm1, %xmm0, %xmm11319; AVX512F-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm01320; AVX512F-NEXT: vpxor %xmm0, %xmm2, %xmm01321; 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, %xmm21324; AVX512F-NEXT: vblendvpd %xmm0, %xmm2, %xmm1, %xmm01325; AVX512F-NEXT: retq1326;1327; AVX512BW-LABEL: v2i64:1328; AVX512BW: # %bb.0:1329; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm21330; AVX512BW-NEXT: vpcmpgtq %xmm2, %xmm1, %k01331; AVX512BW-NEXT: vpsubq %xmm1, %xmm0, %xmm11332; AVX512BW-NEXT: vpcmpgtq %xmm1, %xmm0, %k11333; AVX512BW-NEXT: kxorw %k1, %k0, %k11334; AVX512BW-NEXT: vpcmpgtq %xmm1, %xmm2, %k21335; 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, %xmm01339; AVX512BW-NEXT: retq1340 %z = call <2 x i64> @llvm.ssub.sat.v2i64(<2 x i64> %x, <2 x i64> %y)1341 ret <2 x i64> %z1342}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, %xmm41348; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483648,2147483648]1349; SSE2-NEXT: pxor %xmm5, %xmm01350; SSE2-NEXT: psubq %xmm2, %xmm41351; SSE2-NEXT: movdqa %xmm4, %xmm61352; SSE2-NEXT: pxor %xmm5, %xmm61353; SSE2-NEXT: movdqa %xmm0, %xmm71354; SSE2-NEXT: pcmpgtd %xmm6, %xmm71355; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]1356; SSE2-NEXT: pcmpeqd %xmm0, %xmm61357; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]1358; SSE2-NEXT: pand %xmm8, %xmm01359; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]1360; SSE2-NEXT: por %xmm0, %xmm61361; SSE2-NEXT: pxor %xmm5, %xmm21362; SSE2-NEXT: movdqa %xmm2, %xmm01363; SSE2-NEXT: pcmpgtd %xmm5, %xmm01364; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[0,0,2,2]1365; SSE2-NEXT: pcmpeqd %xmm5, %xmm21366; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]1367; SSE2-NEXT: pand %xmm7, %xmm21368; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]1369; SSE2-NEXT: por %xmm2, %xmm71370; SSE2-NEXT: pxor %xmm6, %xmm71371; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]1372; SSE2-NEXT: psrad $31, %xmm01373; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [9223372036854775808,9223372036854775808]1374; SSE2-NEXT: pxor %xmm6, %xmm01375; SSE2-NEXT: pand %xmm7, %xmm01376; SSE2-NEXT: pandn %xmm4, %xmm71377; SSE2-NEXT: por %xmm7, %xmm01378; SSE2-NEXT: movdqa %xmm1, %xmm21379; SSE2-NEXT: pxor %xmm5, %xmm21380; SSE2-NEXT: psubq %xmm3, %xmm11381; SSE2-NEXT: movdqa %xmm1, %xmm41382; SSE2-NEXT: pxor %xmm5, %xmm41383; SSE2-NEXT: movdqa %xmm2, %xmm71384; SSE2-NEXT: pcmpgtd %xmm4, %xmm71385; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]1386; SSE2-NEXT: pcmpeqd %xmm2, %xmm41387; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]1388; SSE2-NEXT: pand %xmm8, %xmm21389; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3]1390; SSE2-NEXT: por %xmm2, %xmm41391; SSE2-NEXT: pxor %xmm5, %xmm31392; SSE2-NEXT: movdqa %xmm3, %xmm21393; SSE2-NEXT: pcmpgtd %xmm5, %xmm21394; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm2[0,0,2,2]1395; SSE2-NEXT: pcmpeqd %xmm5, %xmm31396; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]1397; SSE2-NEXT: pand %xmm7, %xmm31398; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]1399; SSE2-NEXT: por %xmm3, %xmm51400; SSE2-NEXT: pxor %xmm4, %xmm51401; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]1402; SSE2-NEXT: psrad $31, %xmm21403; SSE2-NEXT: pxor %xmm6, %xmm21404; SSE2-NEXT: pand %xmm5, %xmm21405; SSE2-NEXT: pandn %xmm1, %xmm51406; SSE2-NEXT: por %xmm5, %xmm21407; SSE2-NEXT: movdqa %xmm2, %xmm11408; SSE2-NEXT: retq1409;1410; SSSE3-LABEL: v4i64:1411; SSSE3: # %bb.0:1412; SSSE3-NEXT: movdqa %xmm0, %xmm41413; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483648,2147483648]1414; SSSE3-NEXT: pxor %xmm5, %xmm01415; SSSE3-NEXT: psubq %xmm2, %xmm41416; SSSE3-NEXT: movdqa %xmm4, %xmm61417; SSSE3-NEXT: pxor %xmm5, %xmm61418; SSSE3-NEXT: movdqa %xmm0, %xmm71419; SSSE3-NEXT: pcmpgtd %xmm6, %xmm71420; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]1421; SSSE3-NEXT: pcmpeqd %xmm0, %xmm61422; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]1423; SSSE3-NEXT: pand %xmm8, %xmm01424; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]1425; SSSE3-NEXT: por %xmm0, %xmm61426; SSSE3-NEXT: pxor %xmm5, %xmm21427; SSSE3-NEXT: movdqa %xmm2, %xmm01428; SSSE3-NEXT: pcmpgtd %xmm5, %xmm01429; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm0[0,0,2,2]1430; SSSE3-NEXT: pcmpeqd %xmm5, %xmm21431; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]1432; SSSE3-NEXT: pand %xmm7, %xmm21433; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]1434; SSSE3-NEXT: por %xmm2, %xmm71435; SSSE3-NEXT: pxor %xmm6, %xmm71436; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]1437; SSSE3-NEXT: psrad $31, %xmm01438; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [9223372036854775808,9223372036854775808]1439; SSSE3-NEXT: pxor %xmm6, %xmm01440; SSSE3-NEXT: pand %xmm7, %xmm01441; SSSE3-NEXT: pandn %xmm4, %xmm71442; SSSE3-NEXT: por %xmm7, %xmm01443; SSSE3-NEXT: movdqa %xmm1, %xmm21444; SSSE3-NEXT: pxor %xmm5, %xmm21445; SSSE3-NEXT: psubq %xmm3, %xmm11446; SSSE3-NEXT: movdqa %xmm1, %xmm41447; SSSE3-NEXT: pxor %xmm5, %xmm41448; SSSE3-NEXT: movdqa %xmm2, %xmm71449; SSSE3-NEXT: pcmpgtd %xmm4, %xmm71450; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]1451; SSSE3-NEXT: pcmpeqd %xmm2, %xmm41452; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]1453; SSSE3-NEXT: pand %xmm8, %xmm21454; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3]1455; SSSE3-NEXT: por %xmm2, %xmm41456; SSSE3-NEXT: pxor %xmm5, %xmm31457; SSSE3-NEXT: movdqa %xmm3, %xmm21458; SSSE3-NEXT: pcmpgtd %xmm5, %xmm21459; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm2[0,0,2,2]1460; SSSE3-NEXT: pcmpeqd %xmm5, %xmm31461; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]1462; SSSE3-NEXT: pand %xmm7, %xmm31463; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]1464; SSSE3-NEXT: por %xmm3, %xmm51465; SSSE3-NEXT: pxor %xmm4, %xmm51466; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]1467; SSSE3-NEXT: psrad $31, %xmm21468; SSSE3-NEXT: pxor %xmm6, %xmm21469; SSSE3-NEXT: pand %xmm5, %xmm21470; SSSE3-NEXT: pandn %xmm1, %xmm51471; SSSE3-NEXT: por %xmm5, %xmm21472; SSSE3-NEXT: movdqa %xmm2, %xmm11473; SSSE3-NEXT: retq1474;1475; SSE41-LABEL: v4i64:1476; SSE41: # %bb.0:1477; SSE41-NEXT: movdqa %xmm0, %xmm41478; SSE41-NEXT: pmovzxdq {{.*#+}} xmm6 = [2147483648,2147483648]1479; SSE41-NEXT: pxor %xmm6, %xmm01480; SSE41-NEXT: psubq %xmm2, %xmm41481; SSE41-NEXT: movdqa %xmm4, %xmm51482; SSE41-NEXT: pxor %xmm6, %xmm51483; SSE41-NEXT: movdqa %xmm0, %xmm71484; SSE41-NEXT: pcmpeqd %xmm5, %xmm71485; SSE41-NEXT: pcmpgtd %xmm5, %xmm01486; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm0[0,0,2,2]1487; SSE41-NEXT: pand %xmm7, %xmm81488; SSE41-NEXT: por %xmm0, %xmm81489; SSE41-NEXT: pxor %xmm6, %xmm21490; SSE41-NEXT: movdqa %xmm2, %xmm01491; SSE41-NEXT: pcmpeqd %xmm6, %xmm01492; SSE41-NEXT: pcmpgtd %xmm6, %xmm21493; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]1494; SSE41-NEXT: pand %xmm0, %xmm51495; SSE41-NEXT: por %xmm2, %xmm51496; SSE41-NEXT: pxor %xmm8, %xmm51497; SSE41-NEXT: movapd {{.*#+}} xmm8 = [9223372036854775807,9223372036854775807]1498; SSE41-NEXT: movapd {{.*#+}} xmm7 = [9223372036854775808,9223372036854775808]1499; SSE41-NEXT: movapd %xmm7, %xmm21500; SSE41-NEXT: movdqa %xmm4, %xmm01501; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm21502; SSE41-NEXT: movdqa %xmm5, %xmm01503; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm41504; SSE41-NEXT: movdqa %xmm1, %xmm01505; SSE41-NEXT: pxor %xmm6, %xmm01506; SSE41-NEXT: psubq %xmm3, %xmm11507; SSE41-NEXT: movdqa %xmm1, %xmm21508; SSE41-NEXT: pxor %xmm6, %xmm21509; SSE41-NEXT: movdqa %xmm0, %xmm51510; SSE41-NEXT: pcmpeqd %xmm2, %xmm51511; SSE41-NEXT: pcmpgtd %xmm2, %xmm01512; SSE41-NEXT: pshufd {{.*#+}} xmm9 = xmm0[0,0,2,2]1513; SSE41-NEXT: pand %xmm5, %xmm91514; SSE41-NEXT: por %xmm0, %xmm91515; SSE41-NEXT: pxor %xmm6, %xmm31516; SSE41-NEXT: movdqa %xmm3, %xmm01517; SSE41-NEXT: pcmpeqd %xmm6, %xmm01518; SSE41-NEXT: pcmpgtd %xmm6, %xmm31519; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]1520; SSE41-NEXT: pand %xmm0, %xmm21521; SSE41-NEXT: por %xmm3, %xmm21522; SSE41-NEXT: pxor %xmm9, %xmm21523; SSE41-NEXT: movdqa %xmm1, %xmm01524; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm71525; SSE41-NEXT: movdqa %xmm2, %xmm01526; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm11527; SSE41-NEXT: movapd %xmm4, %xmm01528; SSE41-NEXT: retq1529;1530; AVX1-LABEL: v4i64:1531; AVX1: # %bb.0:1532; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21533; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm31534; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm41535; AVX1-NEXT: vpcmpgtq %xmm3, %xmm1, %xmm51536; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm5, %ymm41537; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm51538; AVX1-NEXT: vpsubq %xmm2, %xmm5, %xmm21539; AVX1-NEXT: vpcmpgtq %xmm2, %xmm5, %xmm51540; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm11541; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm01542; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm0, %ymm01543; AVX1-NEXT: vxorpd %ymm0, %ymm4, %ymm01544; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm41545; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm21546; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm11547; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm11548; AVX1-NEXT: vxorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11549; AVX1-NEXT: vblendvpd %ymm0, %ymm1, %ymm4, %ymm01550; AVX1-NEXT: retq1551;1552; AVX2-LABEL: v4i64:1553; AVX2: # %bb.0:1554; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm21555; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm31556; AVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm11557; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm01558; AVX2-NEXT: vpxor %ymm0, %ymm3, %ymm01559; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm21560; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]1561; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm21562; AVX2-NEXT: vblendvpd %ymm0, %ymm2, %ymm1, %ymm01563; AVX2-NEXT: retq1564;1565; AVX512F-LABEL: v4i64:1566; AVX512F: # %bb.0:1567; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm21568; AVX512F-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm21569; AVX512F-NEXT: vpsubq %ymm1, %ymm0, %ymm11570; AVX512F-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm01571; AVX512F-NEXT: vpxor %ymm0, %ymm2, %ymm01572; AVX512F-NEXT: vpsraq $63, %zmm1, %zmm21573; AVX512F-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]1574; AVX512F-NEXT: vpxor %ymm3, %ymm2, %ymm21575; AVX512F-NEXT: vblendvpd %ymm0, %ymm2, %ymm1, %ymm01576; AVX512F-NEXT: retq1577;1578; AVX512BW-LABEL: v4i64:1579; AVX512BW: # %bb.0:1580; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm21581; AVX512BW-NEXT: vpcmpgtq %ymm2, %ymm1, %k01582; AVX512BW-NEXT: vpsubq %ymm1, %ymm0, %ymm11583; AVX512BW-NEXT: vpcmpgtq %ymm1, %ymm0, %k11584; AVX512BW-NEXT: kxorw %k1, %k0, %k11585; AVX512BW-NEXT: vpsraq $63, %ymm1, %ymm01586; AVX512BW-NEXT: vpxorq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm1 {%k1}1587; AVX512BW-NEXT: vmovdqa %ymm1, %ymm01588; AVX512BW-NEXT: retq1589 %z = call <4 x i64> @llvm.ssub.sat.v4i64(<4 x i64> %x, <4 x i64> %y)1590 ret <4 x i64> %z1591}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, %xmm81597; SSE2-NEXT: movdqa %xmm0, %xmm11598; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [2147483648,2147483648]1599; SSE2-NEXT: pxor %xmm9, %xmm01600; SSE2-NEXT: psubq %xmm4, %xmm11601; SSE2-NEXT: movdqa %xmm1, %xmm101602; SSE2-NEXT: pxor %xmm9, %xmm101603; SSE2-NEXT: movdqa %xmm0, %xmm111604; SSE2-NEXT: pcmpgtd %xmm10, %xmm111605; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]1606; SSE2-NEXT: pcmpeqd %xmm0, %xmm101607; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]1608; SSE2-NEXT: pand %xmm12, %xmm01609; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm11[1,1,3,3]1610; SSE2-NEXT: por %xmm0, %xmm101611; SSE2-NEXT: pxor %xmm9, %xmm41612; SSE2-NEXT: movdqa %xmm4, %xmm01613; SSE2-NEXT: pcmpgtd %xmm9, %xmm01614; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm0[0,0,2,2]1615; SSE2-NEXT: pcmpeqd %xmm9, %xmm41616; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]1617; SSE2-NEXT: pand %xmm11, %xmm41618; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm0[1,1,3,3]1619; SSE2-NEXT: por %xmm4, %xmm111620; SSE2-NEXT: pxor %xmm10, %xmm111621; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]1622; SSE2-NEXT: psrad $31, %xmm01623; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [9223372036854775808,9223372036854775808]1624; SSE2-NEXT: pxor %xmm10, %xmm01625; SSE2-NEXT: pand %xmm11, %xmm01626; SSE2-NEXT: pandn %xmm1, %xmm111627; SSE2-NEXT: por %xmm11, %xmm01628; SSE2-NEXT: movdqa %xmm8, %xmm11629; SSE2-NEXT: pxor %xmm9, %xmm11630; SSE2-NEXT: psubq %xmm5, %xmm81631; SSE2-NEXT: movdqa %xmm8, %xmm41632; SSE2-NEXT: pxor %xmm9, %xmm41633; SSE2-NEXT: movdqa %xmm1, %xmm111634; SSE2-NEXT: pcmpgtd %xmm4, %xmm111635; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]1636; SSE2-NEXT: pcmpeqd %xmm1, %xmm41637; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]1638; SSE2-NEXT: pand %xmm12, %xmm11639; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm11[1,1,3,3]1640; SSE2-NEXT: por %xmm1, %xmm41641; SSE2-NEXT: pxor %xmm9, %xmm51642; SSE2-NEXT: movdqa %xmm5, %xmm11643; SSE2-NEXT: pcmpgtd %xmm9, %xmm11644; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm1[0,0,2,2]1645; SSE2-NEXT: pcmpeqd %xmm9, %xmm51646; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]1647; SSE2-NEXT: pand %xmm11, %xmm51648; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm1[1,1,3,3]1649; SSE2-NEXT: por %xmm5, %xmm111650; SSE2-NEXT: pxor %xmm4, %xmm111651; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3]1652; SSE2-NEXT: psrad $31, %xmm11653; SSE2-NEXT: pxor %xmm10, %xmm11654; SSE2-NEXT: pand %xmm11, %xmm11655; SSE2-NEXT: pandn %xmm8, %xmm111656; SSE2-NEXT: por %xmm11, %xmm11657; SSE2-NEXT: movdqa %xmm2, %xmm41658; SSE2-NEXT: pxor %xmm9, %xmm41659; SSE2-NEXT: psubq %xmm6, %xmm21660; SSE2-NEXT: movdqa %xmm2, %xmm51661; SSE2-NEXT: pxor %xmm9, %xmm51662; SSE2-NEXT: movdqa %xmm4, %xmm81663; SSE2-NEXT: pcmpgtd %xmm5, %xmm81664; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm8[0,0,2,2]1665; SSE2-NEXT: pcmpeqd %xmm4, %xmm51666; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]1667; SSE2-NEXT: pand %xmm11, %xmm41668; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]1669; SSE2-NEXT: por %xmm4, %xmm51670; SSE2-NEXT: pxor %xmm9, %xmm61671; SSE2-NEXT: movdqa %xmm6, %xmm41672; SSE2-NEXT: pcmpgtd %xmm9, %xmm41673; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2]1674; SSE2-NEXT: pcmpeqd %xmm9, %xmm61675; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]1676; SSE2-NEXT: pand %xmm8, %xmm61677; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm4[1,1,3,3]1678; SSE2-NEXT: por %xmm6, %xmm81679; SSE2-NEXT: pxor %xmm5, %xmm81680; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]1681; SSE2-NEXT: psrad $31, %xmm41682; SSE2-NEXT: pxor %xmm10, %xmm41683; SSE2-NEXT: pand %xmm8, %xmm41684; SSE2-NEXT: pandn %xmm2, %xmm81685; SSE2-NEXT: por %xmm8, %xmm41686; SSE2-NEXT: movdqa %xmm3, %xmm21687; SSE2-NEXT: pxor %xmm9, %xmm21688; SSE2-NEXT: psubq %xmm7, %xmm31689; SSE2-NEXT: movdqa %xmm3, %xmm51690; SSE2-NEXT: pxor %xmm9, %xmm51691; SSE2-NEXT: movdqa %xmm2, %xmm61692; SSE2-NEXT: pcmpgtd %xmm5, %xmm61693; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]1694; SSE2-NEXT: pcmpeqd %xmm2, %xmm51695; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]1696; SSE2-NEXT: pand %xmm8, %xmm21697; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]1698; SSE2-NEXT: por %xmm2, %xmm51699; SSE2-NEXT: pxor %xmm9, %xmm71700; SSE2-NEXT: movdqa %xmm7, %xmm21701; SSE2-NEXT: pcmpgtd %xmm9, %xmm21702; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]1703; SSE2-NEXT: pcmpeqd %xmm9, %xmm71704; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]1705; SSE2-NEXT: pand %xmm6, %xmm71706; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]1707; SSE2-NEXT: por %xmm7, %xmm21708; SSE2-NEXT: pxor %xmm5, %xmm21709; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]1710; SSE2-NEXT: psrad $31, %xmm51711; SSE2-NEXT: pxor %xmm10, %xmm51712; SSE2-NEXT: pand %xmm2, %xmm51713; SSE2-NEXT: pandn %xmm3, %xmm21714; SSE2-NEXT: por %xmm2, %xmm51715; SSE2-NEXT: movdqa %xmm4, %xmm21716; SSE2-NEXT: movdqa %xmm5, %xmm31717; SSE2-NEXT: retq1718;1719; SSSE3-LABEL: v8i64:1720; SSSE3: # %bb.0:1721; SSSE3-NEXT: movdqa %xmm1, %xmm81722; SSSE3-NEXT: movdqa %xmm0, %xmm11723; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [2147483648,2147483648]1724; SSSE3-NEXT: pxor %xmm9, %xmm01725; SSSE3-NEXT: psubq %xmm4, %xmm11726; SSSE3-NEXT: movdqa %xmm1, %xmm101727; SSSE3-NEXT: pxor %xmm9, %xmm101728; SSSE3-NEXT: movdqa %xmm0, %xmm111729; SSSE3-NEXT: pcmpgtd %xmm10, %xmm111730; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]1731; SSSE3-NEXT: pcmpeqd %xmm0, %xmm101732; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]1733; SSSE3-NEXT: pand %xmm12, %xmm01734; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm11[1,1,3,3]1735; SSSE3-NEXT: por %xmm0, %xmm101736; SSSE3-NEXT: pxor %xmm9, %xmm41737; SSSE3-NEXT: movdqa %xmm4, %xmm01738; SSSE3-NEXT: pcmpgtd %xmm9, %xmm01739; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm0[0,0,2,2]1740; SSSE3-NEXT: pcmpeqd %xmm9, %xmm41741; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]1742; SSSE3-NEXT: pand %xmm11, %xmm41743; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm0[1,1,3,3]1744; SSSE3-NEXT: por %xmm4, %xmm111745; SSSE3-NEXT: pxor %xmm10, %xmm111746; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]1747; SSSE3-NEXT: psrad $31, %xmm01748; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [9223372036854775808,9223372036854775808]1749; SSSE3-NEXT: pxor %xmm10, %xmm01750; SSSE3-NEXT: pand %xmm11, %xmm01751; SSSE3-NEXT: pandn %xmm1, %xmm111752; SSSE3-NEXT: por %xmm11, %xmm01753; SSSE3-NEXT: movdqa %xmm8, %xmm11754; SSSE3-NEXT: pxor %xmm9, %xmm11755; SSSE3-NEXT: psubq %xmm5, %xmm81756; SSSE3-NEXT: movdqa %xmm8, %xmm41757; SSSE3-NEXT: pxor %xmm9, %xmm41758; SSSE3-NEXT: movdqa %xmm1, %xmm111759; SSSE3-NEXT: pcmpgtd %xmm4, %xmm111760; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]1761; SSSE3-NEXT: pcmpeqd %xmm1, %xmm41762; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]1763; SSSE3-NEXT: pand %xmm12, %xmm11764; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm11[1,1,3,3]1765; SSSE3-NEXT: por %xmm1, %xmm41766; SSSE3-NEXT: pxor %xmm9, %xmm51767; SSSE3-NEXT: movdqa %xmm5, %xmm11768; SSSE3-NEXT: pcmpgtd %xmm9, %xmm11769; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm1[0,0,2,2]1770; SSSE3-NEXT: pcmpeqd %xmm9, %xmm51771; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]1772; SSSE3-NEXT: pand %xmm11, %xmm51773; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm1[1,1,3,3]1774; SSSE3-NEXT: por %xmm5, %xmm111775; SSSE3-NEXT: pxor %xmm4, %xmm111776; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3]1777; SSSE3-NEXT: psrad $31, %xmm11778; SSSE3-NEXT: pxor %xmm10, %xmm11779; SSSE3-NEXT: pand %xmm11, %xmm11780; SSSE3-NEXT: pandn %xmm8, %xmm111781; SSSE3-NEXT: por %xmm11, %xmm11782; SSSE3-NEXT: movdqa %xmm2, %xmm41783; SSSE3-NEXT: pxor %xmm9, %xmm41784; SSSE3-NEXT: psubq %xmm6, %xmm21785; SSSE3-NEXT: movdqa %xmm2, %xmm51786; SSSE3-NEXT: pxor %xmm9, %xmm51787; SSSE3-NEXT: movdqa %xmm4, %xmm81788; SSSE3-NEXT: pcmpgtd %xmm5, %xmm81789; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm8[0,0,2,2]1790; SSSE3-NEXT: pcmpeqd %xmm4, %xmm51791; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]1792; SSSE3-NEXT: pand %xmm11, %xmm41793; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]1794; SSSE3-NEXT: por %xmm4, %xmm51795; SSSE3-NEXT: pxor %xmm9, %xmm61796; SSSE3-NEXT: movdqa %xmm6, %xmm41797; SSSE3-NEXT: pcmpgtd %xmm9, %xmm41798; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2]1799; SSSE3-NEXT: pcmpeqd %xmm9, %xmm61800; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]1801; SSSE3-NEXT: pand %xmm8, %xmm61802; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm4[1,1,3,3]1803; SSSE3-NEXT: por %xmm6, %xmm81804; SSSE3-NEXT: pxor %xmm5, %xmm81805; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]1806; SSSE3-NEXT: psrad $31, %xmm41807; SSSE3-NEXT: pxor %xmm10, %xmm41808; SSSE3-NEXT: pand %xmm8, %xmm41809; SSSE3-NEXT: pandn %xmm2, %xmm81810; SSSE3-NEXT: por %xmm8, %xmm41811; SSSE3-NEXT: movdqa %xmm3, %xmm21812; SSSE3-NEXT: pxor %xmm9, %xmm21813; SSSE3-NEXT: psubq %xmm7, %xmm31814; SSSE3-NEXT: movdqa %xmm3, %xmm51815; SSSE3-NEXT: pxor %xmm9, %xmm51816; SSSE3-NEXT: movdqa %xmm2, %xmm61817; SSSE3-NEXT: pcmpgtd %xmm5, %xmm61818; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]1819; SSSE3-NEXT: pcmpeqd %xmm2, %xmm51820; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]1821; SSSE3-NEXT: pand %xmm8, %xmm21822; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]1823; SSSE3-NEXT: por %xmm2, %xmm51824; SSSE3-NEXT: pxor %xmm9, %xmm71825; SSSE3-NEXT: movdqa %xmm7, %xmm21826; SSSE3-NEXT: pcmpgtd %xmm9, %xmm21827; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]1828; SSSE3-NEXT: pcmpeqd %xmm9, %xmm71829; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]1830; SSSE3-NEXT: pand %xmm6, %xmm71831; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]1832; SSSE3-NEXT: por %xmm7, %xmm21833; SSSE3-NEXT: pxor %xmm5, %xmm21834; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]1835; SSSE3-NEXT: psrad $31, %xmm51836; SSSE3-NEXT: pxor %xmm10, %xmm51837; SSSE3-NEXT: pand %xmm2, %xmm51838; SSSE3-NEXT: pandn %xmm3, %xmm21839; SSSE3-NEXT: por %xmm2, %xmm51840; SSSE3-NEXT: movdqa %xmm4, %xmm21841; SSSE3-NEXT: movdqa %xmm5, %xmm31842; SSSE3-NEXT: retq1843;1844; SSE41-LABEL: v8i64:1845; SSE41: # %bb.0:1846; SSE41-NEXT: movdqa %xmm0, %xmm81847; SSE41-NEXT: pmovzxdq {{.*#+}} xmm10 = [2147483648,2147483648]1848; SSE41-NEXT: pxor %xmm10, %xmm01849; SSE41-NEXT: psubq %xmm4, %xmm81850; SSE41-NEXT: movdqa %xmm8, %xmm91851; SSE41-NEXT: pxor %xmm10, %xmm91852; SSE41-NEXT: movdqa %xmm0, %xmm111853; SSE41-NEXT: pcmpeqd %xmm9, %xmm111854; SSE41-NEXT: pcmpgtd %xmm9, %xmm01855; SSE41-NEXT: pshufd {{.*#+}} xmm12 = xmm0[0,0,2,2]1856; SSE41-NEXT: pand %xmm11, %xmm121857; SSE41-NEXT: por %xmm0, %xmm121858; SSE41-NEXT: pxor %xmm10, %xmm41859; SSE41-NEXT: movdqa %xmm4, %xmm01860; SSE41-NEXT: pcmpeqd %xmm10, %xmm01861; SSE41-NEXT: pcmpgtd %xmm10, %xmm41862; SSE41-NEXT: pshufd {{.*#+}} xmm9 = xmm4[0,0,2,2]1863; SSE41-NEXT: pand %xmm0, %xmm91864; SSE41-NEXT: por %xmm4, %xmm91865; SSE41-NEXT: pxor %xmm12, %xmm91866; SSE41-NEXT: movapd {{.*#+}} xmm12 = [9223372036854775807,9223372036854775807]1867; SSE41-NEXT: movapd {{.*#+}} xmm11 = [9223372036854775808,9223372036854775808]1868; SSE41-NEXT: movapd %xmm11, %xmm41869; SSE41-NEXT: movdqa %xmm8, %xmm01870; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm41871; SSE41-NEXT: movdqa %xmm9, %xmm01872; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm81873; SSE41-NEXT: movdqa %xmm1, %xmm01874; SSE41-NEXT: pxor %xmm10, %xmm01875; SSE41-NEXT: psubq %xmm5, %xmm11876; SSE41-NEXT: movdqa %xmm1, %xmm41877; SSE41-NEXT: pxor %xmm10, %xmm41878; SSE41-NEXT: movdqa %xmm0, %xmm91879; SSE41-NEXT: pcmpeqd %xmm4, %xmm91880; SSE41-NEXT: pcmpgtd %xmm4, %xmm01881; SSE41-NEXT: pshufd {{.*#+}} xmm13 = xmm0[0,0,2,2]1882; SSE41-NEXT: pand %xmm9, %xmm131883; SSE41-NEXT: por %xmm0, %xmm131884; SSE41-NEXT: pxor %xmm10, %xmm51885; SSE41-NEXT: movdqa %xmm5, %xmm01886; SSE41-NEXT: pcmpeqd %xmm10, %xmm01887; SSE41-NEXT: pcmpgtd %xmm10, %xmm51888; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm5[0,0,2,2]1889; SSE41-NEXT: pand %xmm0, %xmm41890; SSE41-NEXT: por %xmm5, %xmm41891; SSE41-NEXT: pxor %xmm13, %xmm41892; SSE41-NEXT: movapd %xmm11, %xmm51893; SSE41-NEXT: movdqa %xmm1, %xmm01894; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm51895; SSE41-NEXT: movdqa %xmm4, %xmm01896; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm11897; SSE41-NEXT: movdqa %xmm2, %xmm01898; SSE41-NEXT: pxor %xmm10, %xmm01899; SSE41-NEXT: psubq %xmm6, %xmm21900; SSE41-NEXT: movdqa %xmm2, %xmm41901; SSE41-NEXT: pxor %xmm10, %xmm41902; SSE41-NEXT: movdqa %xmm0, %xmm51903; SSE41-NEXT: pcmpeqd %xmm4, %xmm51904; SSE41-NEXT: pcmpgtd %xmm4, %xmm01905; SSE41-NEXT: pshufd {{.*#+}} xmm9 = xmm0[0,0,2,2]1906; SSE41-NEXT: pand %xmm5, %xmm91907; SSE41-NEXT: por %xmm0, %xmm91908; SSE41-NEXT: pxor %xmm10, %xmm61909; SSE41-NEXT: movdqa %xmm6, %xmm01910; SSE41-NEXT: pcmpeqd %xmm10, %xmm01911; SSE41-NEXT: pcmpgtd %xmm10, %xmm61912; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]1913; SSE41-NEXT: pand %xmm0, %xmm41914; SSE41-NEXT: por %xmm6, %xmm41915; SSE41-NEXT: pxor %xmm9, %xmm41916; SSE41-NEXT: movapd %xmm11, %xmm51917; SSE41-NEXT: movdqa %xmm2, %xmm01918; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm51919; SSE41-NEXT: movdqa %xmm4, %xmm01920; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm21921; SSE41-NEXT: movdqa %xmm3, %xmm01922; SSE41-NEXT: pxor %xmm10, %xmm01923; SSE41-NEXT: psubq %xmm7, %xmm31924; SSE41-NEXT: movdqa %xmm3, %xmm41925; SSE41-NEXT: pxor %xmm10, %xmm41926; SSE41-NEXT: movdqa %xmm0, %xmm51927; SSE41-NEXT: pcmpeqd %xmm4, %xmm51928; SSE41-NEXT: pcmpgtd %xmm4, %xmm01929; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[0,0,2,2]1930; SSE41-NEXT: pand %xmm5, %xmm61931; SSE41-NEXT: por %xmm0, %xmm61932; SSE41-NEXT: pxor %xmm10, %xmm71933; SSE41-NEXT: movdqa %xmm7, %xmm01934; SSE41-NEXT: pcmpeqd %xmm10, %xmm01935; SSE41-NEXT: pcmpgtd %xmm10, %xmm71936; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]1937; SSE41-NEXT: pand %xmm0, %xmm41938; SSE41-NEXT: por %xmm7, %xmm41939; SSE41-NEXT: pxor %xmm6, %xmm41940; SSE41-NEXT: movdqa %xmm3, %xmm01941; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm111942; SSE41-NEXT: movdqa %xmm4, %xmm01943; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm31944; SSE41-NEXT: movapd %xmm8, %xmm01945; SSE41-NEXT: retq1946;1947; AVX1-LABEL: v8i64:1948; AVX1: # %bb.0:1949; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm51950; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm41951; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm61952; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm71953; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm7, %ymm61954; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm71955; AVX1-NEXT: vpsubq %xmm5, %xmm7, %xmm51956; AVX1-NEXT: vpcmpgtq %xmm5, %xmm7, %xmm71957; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm21958; AVX1-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm01959; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm0, %ymm01960; AVX1-NEXT: vxorpd %ymm0, %ymm6, %ymm01961; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm2, %ymm61962; AVX1-NEXT: vpcmpgtq %xmm5, %xmm4, %xmm51963; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm21964; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm2, %ymm21965; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm5 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]1966; AVX1-NEXT: vxorpd %ymm5, %ymm2, %ymm21967; AVX1-NEXT: vblendvpd %ymm0, %ymm2, %ymm6, %ymm01968; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm21969; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm61970; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm71971; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm7, %ymm61972; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm71973; AVX1-NEXT: vpsubq %xmm2, %xmm7, %xmm21974; AVX1-NEXT: vpcmpgtq %xmm2, %xmm7, %xmm71975; AVX1-NEXT: vpsubq %xmm3, %xmm1, %xmm31976; AVX1-NEXT: vpcmpgtq %xmm3, %xmm1, %xmm11977; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm1, %ymm11978; AVX1-NEXT: vxorpd %ymm1, %ymm6, %ymm11979; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm61980; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm21981; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm31982; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm21983; AVX1-NEXT: vxorpd %ymm5, %ymm2, %ymm21984; AVX1-NEXT: vblendvpd %ymm1, %ymm2, %ymm6, %ymm11985; AVX1-NEXT: retq1986;1987; AVX2-LABEL: v8i64:1988; AVX2: # %bb.0:1989; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm41990; AVX2-NEXT: vpcmpgtq %ymm4, %ymm2, %ymm51991; AVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm21992; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm01993; AVX2-NEXT: vpxor %ymm0, %ymm5, %ymm01994; AVX2-NEXT: vpcmpgtq %ymm2, %ymm4, %ymm51995; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm6 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]1996; AVX2-NEXT: vpxor %ymm6, %ymm5, %ymm51997; AVX2-NEXT: vblendvpd %ymm0, %ymm5, %ymm2, %ymm01998; AVX2-NEXT: vpcmpgtq %ymm4, %ymm3, %ymm21999; AVX2-NEXT: vpsubq %ymm3, %ymm1, %ymm32000; AVX2-NEXT: vpcmpgtq %ymm3, %ymm1, %ymm12001; AVX2-NEXT: vpxor %ymm1, %ymm2, %ymm12002; AVX2-NEXT: vpcmpgtq %ymm3, %ymm4, %ymm22003; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm22004; AVX2-NEXT: vblendvpd %ymm1, %ymm2, %ymm3, %ymm12005; AVX2-NEXT: retq2006;2007; AVX512-LABEL: v8i64:2008; AVX512: # %bb.0:2009; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm22010; AVX512-NEXT: vpcmpgtq %zmm2, %zmm1, %k02011; AVX512-NEXT: vpsubq %zmm1, %zmm0, %zmm12012; AVX512-NEXT: vpcmpgtq %zmm1, %zmm0, %k12013; AVX512-NEXT: kxorw %k1, %k0, %k12014; AVX512-NEXT: vpsraq $63, %zmm1, %zmm02015; AVX512-NEXT: vpxorq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm1 {%k1}2016; AVX512-NEXT: vmovdqa64 %zmm1, %zmm02017; AVX512-NEXT: retq2018 %z = call <8 x i64> @llvm.ssub.sat.v8i64(<8 x i64> %x, <8 x i64> %y)2019 ret <8 x i64> %z2020}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, %rax2026; SSE-NEXT: subq {{[0-9]+}}(%rsp), %rcx2027; SSE-NEXT: sbbq {{[0-9]+}}(%rsp), %r82028; SSE-NEXT: seto %dil2029; SSE-NEXT: movq %r8, %r102030; SSE-NEXT: sarq $63, %r102031; SSE-NEXT: testb %dil, %dil2032; SSE-NEXT: cmovneq %r10, %rcx2033; SSE-NEXT: movabsq $-9223372036854775808, %r11 # imm = 0x80000000000000002034; SSE-NEXT: xorq %r11, %r102035; SSE-NEXT: testb %dil, %dil2036; SSE-NEXT: cmoveq %r8, %r102037; SSE-NEXT: subq %r9, %rsi2038; SSE-NEXT: sbbq {{[0-9]+}}(%rsp), %rdx2039; SSE-NEXT: seto %dil2040; SSE-NEXT: movq %rdx, %r82041; SSE-NEXT: sarq $63, %r82042; SSE-NEXT: testb %dil, %dil2043; SSE-NEXT: cmovneq %r8, %rsi2044; SSE-NEXT: xorq %r11, %r82045; SSE-NEXT: testb %dil, %dil2046; SSE-NEXT: cmoveq %rdx, %r82047; 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: retq2052;2053; AVX-LABEL: v2i128:2054; AVX: # %bb.0:2055; AVX-NEXT: movq %rdi, %rax2056; AVX-NEXT: subq {{[0-9]+}}(%rsp), %rcx2057; AVX-NEXT: sbbq {{[0-9]+}}(%rsp), %r82058; AVX-NEXT: seto %dil2059; AVX-NEXT: movq %r8, %r102060; AVX-NEXT: sarq $63, %r102061; AVX-NEXT: testb %dil, %dil2062; AVX-NEXT: cmovneq %r10, %rcx2063; AVX-NEXT: movabsq $-9223372036854775808, %r11 # imm = 0x80000000000000002064; AVX-NEXT: xorq %r11, %r102065; AVX-NEXT: testb %dil, %dil2066; AVX-NEXT: cmoveq %r8, %r102067; AVX-NEXT: subq %r9, %rsi2068; AVX-NEXT: sbbq {{[0-9]+}}(%rsp), %rdx2069; AVX-NEXT: seto %dil2070; AVX-NEXT: movq %rdx, %r82071; AVX-NEXT: sarq $63, %r82072; AVX-NEXT: testb %dil, %dil2073; AVX-NEXT: cmovneq %r8, %rsi2074; AVX-NEXT: xorq %r11, %r82075; AVX-NEXT: testb %dil, %dil2076; AVX-NEXT: cmoveq %rdx, %r82077; 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: retq2082 %z = call <2 x i128> @llvm.ssub.sat.v2i128(<2 x i128> %x, <2 x i128> %y)2083 ret <2 x i128> %z2084}2085