1197 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=CHECK,SSE,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=CHECK,SSE,SSSE34; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=CHECK,SSE,SSE415; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=CHECK,AVX,AVX16; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=CHECK,AVX,AVX27; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=CHECK,AVX5128; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=CHECK,AVX5129 10declare {<1 x i32>, <1 x i1>} @llvm.ssub.with.overflow.v1i32(<1 x i32>, <1 x i32>)11declare {<2 x i32>, <2 x i1>} @llvm.ssub.with.overflow.v2i32(<2 x i32>, <2 x i32>)12declare {<3 x i32>, <3 x i1>} @llvm.ssub.with.overflow.v3i32(<3 x i32>, <3 x i32>)13declare {<4 x i32>, <4 x i1>} @llvm.ssub.with.overflow.v4i32(<4 x i32>, <4 x i32>)14declare {<6 x i32>, <6 x i1>} @llvm.ssub.with.overflow.v6i32(<6 x i32>, <6 x i32>)15declare {<8 x i32>, <8 x i1>} @llvm.ssub.with.overflow.v8i32(<8 x i32>, <8 x i32>)16declare {<16 x i32>, <16 x i1>} @llvm.ssub.with.overflow.v16i32(<16 x i32>, <16 x i32>)17 18declare {<16 x i8>, <16 x i1>} @llvm.ssub.with.overflow.v16i8(<16 x i8>, <16 x i8>)19declare {<8 x i16>, <8 x i1>} @llvm.ssub.with.overflow.v8i16(<8 x i16>, <8 x i16>)20declare {<2 x i64>, <2 x i1>} @llvm.ssub.with.overflow.v2i64(<2 x i64>, <2 x i64>)21 22declare {<4 x i24>, <4 x i1>} @llvm.ssub.with.overflow.v4i24(<4 x i24>, <4 x i24>)23declare {<4 x i1>, <4 x i1>} @llvm.ssub.with.overflow.v4i1(<4 x i1>, <4 x i1>)24declare {<2 x i128>, <2 x i1>} @llvm.ssub.with.overflow.v2i128(<2 x i128>, <2 x i128>)25 26define <1 x i32> @ssubo_v1i32(<1 x i32> %a0, <1 x i32> %a1, ptr %p2) nounwind {27; CHECK-LABEL: ssubo_v1i32:28; CHECK: # %bb.0:29; CHECK-NEXT: xorl %eax, %eax30; CHECK-NEXT: subl %esi, %edi31; CHECK-NEXT: seto %al32; CHECK-NEXT: negl %eax33; CHECK-NEXT: movl %edi, (%rdx)34; CHECK-NEXT: retq35 %t = call {<1 x i32>, <1 x i1>} @llvm.ssub.with.overflow.v1i32(<1 x i32> %a0, <1 x i32> %a1)36 %val = extractvalue {<1 x i32>, <1 x i1>} %t, 037 %obit = extractvalue {<1 x i32>, <1 x i1>} %t, 138 %res = sext <1 x i1> %obit to <1 x i32>39 store <1 x i32> %val, ptr %p240 ret <1 x i32> %res41}42 43define <2 x i32> @ssubo_v2i32(<2 x i32> %a0, <2 x i32> %a1, ptr %p2) nounwind {44; SSE-LABEL: ssubo_v2i32:45; SSE: # %bb.0:46; SSE-NEXT: pxor %xmm2, %xmm247; SSE-NEXT: movdqa %xmm0, %xmm348; SSE-NEXT: psubd %xmm1, %xmm349; SSE-NEXT: pcmpgtd %xmm2, %xmm150; SSE-NEXT: pcmpgtd %xmm3, %xmm051; SSE-NEXT: pxor %xmm1, %xmm052; SSE-NEXT: movq %xmm3, (%rdi)53; SSE-NEXT: retq54;55; AVX-LABEL: ssubo_v2i32:56; AVX: # %bb.0:57; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm258; AVX-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm259; AVX-NEXT: vpsubd %xmm1, %xmm0, %xmm160; AVX-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm061; AVX-NEXT: vpxor %xmm0, %xmm2, %xmm062; AVX-NEXT: vmovq %xmm1, (%rdi)63; AVX-NEXT: retq64;65; AVX512-LABEL: ssubo_v2i32:66; AVX512: # %bb.0:67; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm268; AVX512-NEXT: vpcmpgtd %xmm2, %xmm1, %k069; AVX512-NEXT: vpsubd %xmm1, %xmm0, %xmm170; AVX512-NEXT: vpcmpgtd %xmm1, %xmm0, %k171; AVX512-NEXT: kxorw %k1, %k0, %k172; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm073; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}74; AVX512-NEXT: vmovq %xmm1, (%rdi)75; AVX512-NEXT: retq76 %t = call {<2 x i32>, <2 x i1>} @llvm.ssub.with.overflow.v2i32(<2 x i32> %a0, <2 x i32> %a1)77 %val = extractvalue {<2 x i32>, <2 x i1>} %t, 078 %obit = extractvalue {<2 x i32>, <2 x i1>} %t, 179 %res = sext <2 x i1> %obit to <2 x i32>80 store <2 x i32> %val, ptr %p281 ret <2 x i32> %res82}83 84define <3 x i32> @ssubo_v3i32(<3 x i32> %a0, <3 x i32> %a1, ptr %p2) nounwind {85; SSE2-LABEL: ssubo_v3i32:86; SSE2: # %bb.0:87; SSE2-NEXT: pxor %xmm2, %xmm288; SSE2-NEXT: movdqa %xmm0, %xmm389; SSE2-NEXT: psubd %xmm1, %xmm390; SSE2-NEXT: pcmpgtd %xmm2, %xmm191; SSE2-NEXT: pcmpgtd %xmm3, %xmm092; SSE2-NEXT: pxor %xmm1, %xmm093; SSE2-NEXT: movq %xmm3, (%rdi)94; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]95; SSE2-NEXT: movd %xmm1, 8(%rdi)96; SSE2-NEXT: retq97;98; SSSE3-LABEL: ssubo_v3i32:99; SSSE3: # %bb.0:100; SSSE3-NEXT: pxor %xmm2, %xmm2101; SSSE3-NEXT: movdqa %xmm0, %xmm3102; SSSE3-NEXT: psubd %xmm1, %xmm3103; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1104; SSSE3-NEXT: pcmpgtd %xmm3, %xmm0105; SSSE3-NEXT: pxor %xmm1, %xmm0106; SSSE3-NEXT: movq %xmm3, (%rdi)107; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]108; SSSE3-NEXT: movd %xmm1, 8(%rdi)109; SSSE3-NEXT: retq110;111; SSE41-LABEL: ssubo_v3i32:112; SSE41: # %bb.0:113; SSE41-NEXT: pxor %xmm2, %xmm2114; SSE41-NEXT: movdqa %xmm0, %xmm3115; SSE41-NEXT: psubd %xmm1, %xmm3116; SSE41-NEXT: pcmpgtd %xmm2, %xmm1117; SSE41-NEXT: pcmpgtd %xmm3, %xmm0118; SSE41-NEXT: pxor %xmm1, %xmm0119; SSE41-NEXT: pextrd $2, %xmm3, 8(%rdi)120; SSE41-NEXT: movq %xmm3, (%rdi)121; SSE41-NEXT: retq122;123; AVX-LABEL: ssubo_v3i32:124; AVX: # %bb.0:125; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2126; AVX-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2127; AVX-NEXT: vpsubd %xmm1, %xmm0, %xmm1128; AVX-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0129; AVX-NEXT: vpxor %xmm0, %xmm2, %xmm0130; AVX-NEXT: vpextrd $2, %xmm1, 8(%rdi)131; AVX-NEXT: vmovq %xmm1, (%rdi)132; AVX-NEXT: retq133;134; AVX512-LABEL: ssubo_v3i32:135; AVX512: # %bb.0:136; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2137; AVX512-NEXT: vpcmpgtd %xmm2, %xmm1, %k0138; AVX512-NEXT: vpsubd %xmm1, %xmm0, %xmm1139; AVX512-NEXT: vpcmpgtd %xmm1, %xmm0, %k1140; AVX512-NEXT: kxorw %k1, %k0, %k1141; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0142; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}143; AVX512-NEXT: vpextrd $2, %xmm1, 8(%rdi)144; AVX512-NEXT: vmovq %xmm1, (%rdi)145; AVX512-NEXT: retq146 %t = call {<3 x i32>, <3 x i1>} @llvm.ssub.with.overflow.v3i32(<3 x i32> %a0, <3 x i32> %a1)147 %val = extractvalue {<3 x i32>, <3 x i1>} %t, 0148 %obit = extractvalue {<3 x i32>, <3 x i1>} %t, 1149 %res = sext <3 x i1> %obit to <3 x i32>150 store <3 x i32> %val, ptr %p2151 ret <3 x i32> %res152}153 154define <4 x i32> @ssubo_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %p2) nounwind {155; SSE-LABEL: ssubo_v4i32:156; SSE: # %bb.0:157; SSE-NEXT: pxor %xmm2, %xmm2158; SSE-NEXT: movdqa %xmm0, %xmm3159; SSE-NEXT: psubd %xmm1, %xmm3160; SSE-NEXT: pcmpgtd %xmm2, %xmm1161; SSE-NEXT: pcmpgtd %xmm3, %xmm0162; SSE-NEXT: pxor %xmm1, %xmm0163; SSE-NEXT: movdqa %xmm3, (%rdi)164; SSE-NEXT: retq165;166; AVX-LABEL: ssubo_v4i32:167; AVX: # %bb.0:168; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2169; AVX-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2170; AVX-NEXT: vpsubd %xmm1, %xmm0, %xmm1171; AVX-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0172; AVX-NEXT: vpxor %xmm0, %xmm2, %xmm0173; AVX-NEXT: vmovdqa %xmm1, (%rdi)174; AVX-NEXT: retq175;176; AVX512-LABEL: ssubo_v4i32:177; AVX512: # %bb.0:178; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2179; AVX512-NEXT: vpcmpgtd %xmm2, %xmm1, %k0180; AVX512-NEXT: vpsubd %xmm1, %xmm0, %xmm1181; AVX512-NEXT: vpcmpgtd %xmm1, %xmm0, %k1182; AVX512-NEXT: kxorw %k1, %k0, %k1183; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0184; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}185; AVX512-NEXT: vmovdqa %xmm1, (%rdi)186; AVX512-NEXT: retq187 %t = call {<4 x i32>, <4 x i1>} @llvm.ssub.with.overflow.v4i32(<4 x i32> %a0, <4 x i32> %a1)188 %val = extractvalue {<4 x i32>, <4 x i1>} %t, 0189 %obit = extractvalue {<4 x i32>, <4 x i1>} %t, 1190 %res = sext <4 x i1> %obit to <4 x i32>191 store <4 x i32> %val, ptr %p2192 ret <4 x i32> %res193}194 195define <6 x i32> @ssubo_v6i32(<6 x i32> %a0, <6 x i32> %a1, ptr %p2) nounwind {196; SSE2-LABEL: ssubo_v6i32:197; SSE2: # %bb.0:198; SSE2-NEXT: movq %rdi, %rax199; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero200; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero201; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]202; SSE2-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero203; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero204; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]205; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]206; SSE2-NEXT: movd %r8d, %xmm1207; SSE2-NEXT: movd %ecx, %xmm2208; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]209; SSE2-NEXT: movd %edx, %xmm1210; SSE2-NEXT: movd %esi, %xmm3211; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]212; SSE2-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm2[0]213; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero214; SSE2-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero215; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]216; SSE2-NEXT: movd %r9d, %xmm1217; SSE2-NEXT: movd {{.*#+}} xmm4 = mem[0],zero,zero,zero218; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]219; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %rcx220; SSE2-NEXT: movdqa %xmm3, %xmm4221; SSE2-NEXT: psubd %xmm0, %xmm4222; SSE2-NEXT: pcmpgtd %xmm4, %xmm3223; SSE2-NEXT: pxor %xmm5, %xmm5224; SSE2-NEXT: pcmpgtd %xmm5, %xmm0225; SSE2-NEXT: pxor %xmm3, %xmm0226; SSE2-NEXT: movdqa %xmm1, %xmm3227; SSE2-NEXT: psubd %xmm2, %xmm3228; SSE2-NEXT: pcmpgtd %xmm3, %xmm1229; SSE2-NEXT: pcmpgtd %xmm5, %xmm2230; SSE2-NEXT: pxor %xmm1, %xmm2231; SSE2-NEXT: movq %xmm3, 16(%rcx)232; SSE2-NEXT: movdqa %xmm4, (%rcx)233; SSE2-NEXT: movq %xmm2, 16(%rdi)234; SSE2-NEXT: movdqa %xmm0, (%rdi)235; SSE2-NEXT: retq236;237; SSSE3-LABEL: ssubo_v6i32:238; SSSE3: # %bb.0:239; SSSE3-NEXT: movq %rdi, %rax240; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero241; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero242; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]243; SSSE3-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero244; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero245; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]246; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]247; SSSE3-NEXT: movd %r8d, %xmm1248; SSSE3-NEXT: movd %ecx, %xmm2249; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]250; SSSE3-NEXT: movd %edx, %xmm1251; SSSE3-NEXT: movd %esi, %xmm3252; SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]253; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm2[0]254; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero255; SSSE3-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero256; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]257; SSSE3-NEXT: movd %r9d, %xmm1258; SSSE3-NEXT: movd {{.*#+}} xmm4 = mem[0],zero,zero,zero259; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]260; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %rcx261; SSSE3-NEXT: movdqa %xmm3, %xmm4262; SSSE3-NEXT: psubd %xmm0, %xmm4263; SSSE3-NEXT: pcmpgtd %xmm4, %xmm3264; SSSE3-NEXT: pxor %xmm5, %xmm5265; SSSE3-NEXT: pcmpgtd %xmm5, %xmm0266; SSSE3-NEXT: pxor %xmm3, %xmm0267; SSSE3-NEXT: movdqa %xmm1, %xmm3268; SSSE3-NEXT: psubd %xmm2, %xmm3269; SSSE3-NEXT: pcmpgtd %xmm3, %xmm1270; SSSE3-NEXT: pcmpgtd %xmm5, %xmm2271; SSSE3-NEXT: pxor %xmm1, %xmm2272; SSSE3-NEXT: movq %xmm3, 16(%rcx)273; SSSE3-NEXT: movdqa %xmm4, (%rcx)274; SSSE3-NEXT: movq %xmm2, 16(%rdi)275; SSSE3-NEXT: movdqa %xmm0, (%rdi)276; SSSE3-NEXT: retq277;278; SSE41-LABEL: ssubo_v6i32:279; SSE41: # %bb.0:280; SSE41-NEXT: movq %rdi, %rax281; SSE41-NEXT: movd %esi, %xmm1282; SSE41-NEXT: pinsrd $1, %edx, %xmm1283; SSE41-NEXT: pinsrd $2, %ecx, %xmm1284; SSE41-NEXT: pinsrd $3, %r8d, %xmm1285; SSE41-NEXT: movd %r9d, %xmm0286; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm0287; SSE41-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero288; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm2289; SSE41-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero290; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm3291; SSE41-NEXT: pinsrd $2, {{[0-9]+}}(%rsp), %xmm3292; SSE41-NEXT: pinsrd $3, {{[0-9]+}}(%rsp), %xmm3293; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %rcx294; SSE41-NEXT: movdqa %xmm1, %xmm4295; SSE41-NEXT: psubd %xmm3, %xmm4296; SSE41-NEXT: pcmpgtd %xmm4, %xmm1297; SSE41-NEXT: pxor %xmm5, %xmm5298; SSE41-NEXT: pcmpgtd %xmm5, %xmm3299; SSE41-NEXT: pxor %xmm1, %xmm3300; SSE41-NEXT: movdqa %xmm0, %xmm1301; SSE41-NEXT: psubd %xmm2, %xmm1302; SSE41-NEXT: pcmpgtd %xmm5, %xmm2303; SSE41-NEXT: pcmpgtd %xmm1, %xmm0304; SSE41-NEXT: pxor %xmm2, %xmm0305; SSE41-NEXT: movq %xmm1, 16(%rcx)306; SSE41-NEXT: movdqa %xmm4, (%rcx)307; SSE41-NEXT: movq %xmm0, 16(%rdi)308; SSE41-NEXT: movdqa %xmm3, (%rdi)309; SSE41-NEXT: retq310;311; AVX1-LABEL: ssubo_v6i32:312; AVX1: # %bb.0:313; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2314; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3315; AVX1-NEXT: vpcmpgtd %xmm3, %xmm2, %xmm4316; AVX1-NEXT: vpcmpgtd %xmm3, %xmm1, %xmm3317; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3318; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4319; AVX1-NEXT: vpsubd %xmm2, %xmm4, %xmm2320; AVX1-NEXT: vpcmpgtd %xmm2, %xmm4, %xmm4321; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1322; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0323; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0324; AVX1-NEXT: vxorps %ymm0, %ymm3, %ymm0325; AVX1-NEXT: vmovq %xmm2, 16(%rdi)326; AVX1-NEXT: vmovdqa %xmm1, (%rdi)327; AVX1-NEXT: retq328;329; AVX2-LABEL: ssubo_v6i32:330; AVX2: # %bb.0:331; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2332; AVX2-NEXT: vpcmpgtd %ymm2, %ymm1, %ymm2333; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm1334; AVX2-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm0335; AVX2-NEXT: vpxor %ymm0, %ymm2, %ymm0336; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2337; AVX2-NEXT: vmovq %xmm2, 16(%rdi)338; AVX2-NEXT: vmovdqa %xmm1, (%rdi)339; AVX2-NEXT: retq340;341; AVX512-LABEL: ssubo_v6i32:342; AVX512: # %bb.0:343; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2344; AVX512-NEXT: vpcmpgtd %ymm2, %ymm1, %k0345; AVX512-NEXT: vpsubd %ymm1, %ymm0, %ymm1346; AVX512-NEXT: vpcmpgtd %ymm1, %ymm0, %k1347; AVX512-NEXT: kxorw %k1, %k0, %k1348; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0349; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}350; AVX512-NEXT: vextracti128 $1, %ymm1, %xmm2351; AVX512-NEXT: vmovq %xmm2, 16(%rdi)352; AVX512-NEXT: vmovdqa %xmm1, (%rdi)353; AVX512-NEXT: retq354 %t = call {<6 x i32>, <6 x i1>} @llvm.ssub.with.overflow.v6i32(<6 x i32> %a0, <6 x i32> %a1)355 %val = extractvalue {<6 x i32>, <6 x i1>} %t, 0356 %obit = extractvalue {<6 x i32>, <6 x i1>} %t, 1357 %res = sext <6 x i1> %obit to <6 x i32>358 store <6 x i32> %val, ptr %p2359 ret <6 x i32> %res360}361 362define <8 x i32> @ssubo_v8i32(<8 x i32> %a0, <8 x i32> %a1, ptr %p2) nounwind {363; SSE-LABEL: ssubo_v8i32:364; SSE: # %bb.0:365; SSE-NEXT: pxor %xmm4, %xmm4366; SSE-NEXT: movdqa %xmm0, %xmm5367; SSE-NEXT: psubd %xmm2, %xmm5368; SSE-NEXT: pcmpgtd %xmm4, %xmm2369; SSE-NEXT: pcmpgtd %xmm5, %xmm0370; SSE-NEXT: pxor %xmm2, %xmm0371; SSE-NEXT: movdqa %xmm1, %xmm2372; SSE-NEXT: psubd %xmm3, %xmm2373; SSE-NEXT: pcmpgtd %xmm4, %xmm3374; SSE-NEXT: pcmpgtd %xmm2, %xmm1375; SSE-NEXT: pxor %xmm3, %xmm1376; SSE-NEXT: movdqa %xmm2, 16(%rdi)377; SSE-NEXT: movdqa %xmm5, (%rdi)378; SSE-NEXT: retq379;380; AVX1-LABEL: ssubo_v8i32:381; AVX1: # %bb.0:382; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2383; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3384; AVX1-NEXT: vpcmpgtd %xmm3, %xmm2, %xmm4385; AVX1-NEXT: vpcmpgtd %xmm3, %xmm1, %xmm3386; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3387; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4388; AVX1-NEXT: vpsubd %xmm2, %xmm4, %xmm2389; AVX1-NEXT: vpcmpgtd %xmm2, %xmm4, %xmm4390; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1391; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0392; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0393; AVX1-NEXT: vxorps %ymm0, %ymm3, %ymm0394; AVX1-NEXT: vmovdqa %xmm2, 16(%rdi)395; AVX1-NEXT: vmovdqa %xmm1, (%rdi)396; AVX1-NEXT: retq397;398; AVX2-LABEL: ssubo_v8i32:399; AVX2: # %bb.0:400; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2401; AVX2-NEXT: vpcmpgtd %ymm2, %ymm1, %ymm2402; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm1403; AVX2-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm0404; AVX2-NEXT: vpxor %ymm0, %ymm2, %ymm0405; AVX2-NEXT: vmovdqa %ymm1, (%rdi)406; AVX2-NEXT: retq407;408; AVX512-LABEL: ssubo_v8i32:409; AVX512: # %bb.0:410; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2411; AVX512-NEXT: vpcmpgtd %ymm2, %ymm1, %k0412; AVX512-NEXT: vpsubd %ymm1, %ymm0, %ymm1413; AVX512-NEXT: vpcmpgtd %ymm1, %ymm0, %k1414; AVX512-NEXT: kxorw %k1, %k0, %k1415; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0416; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}417; AVX512-NEXT: vmovdqa %ymm1, (%rdi)418; AVX512-NEXT: retq419 %t = call {<8 x i32>, <8 x i1>} @llvm.ssub.with.overflow.v8i32(<8 x i32> %a0, <8 x i32> %a1)420 %val = extractvalue {<8 x i32>, <8 x i1>} %t, 0421 %obit = extractvalue {<8 x i32>, <8 x i1>} %t, 1422 %res = sext <8 x i1> %obit to <8 x i32>423 store <8 x i32> %val, ptr %p2424 ret <8 x i32> %res425}426 427define <16 x i32> @ssubo_v16i32(<16 x i32> %a0, <16 x i32> %a1, ptr %p2) nounwind {428; SSE-LABEL: ssubo_v16i32:429; SSE: # %bb.0:430; SSE-NEXT: pxor %xmm9, %xmm9431; SSE-NEXT: movdqa %xmm0, %xmm8432; SSE-NEXT: psubd %xmm4, %xmm8433; SSE-NEXT: pcmpgtd %xmm9, %xmm4434; SSE-NEXT: pcmpgtd %xmm8, %xmm0435; SSE-NEXT: pxor %xmm4, %xmm0436; SSE-NEXT: movdqa %xmm1, %xmm4437; SSE-NEXT: psubd %xmm5, %xmm4438; SSE-NEXT: pcmpgtd %xmm9, %xmm5439; SSE-NEXT: pcmpgtd %xmm4, %xmm1440; SSE-NEXT: pxor %xmm5, %xmm1441; SSE-NEXT: movdqa %xmm2, %xmm5442; SSE-NEXT: psubd %xmm6, %xmm5443; SSE-NEXT: pcmpgtd %xmm9, %xmm6444; SSE-NEXT: pcmpgtd %xmm5, %xmm2445; SSE-NEXT: pxor %xmm6, %xmm2446; SSE-NEXT: movdqa %xmm3, %xmm6447; SSE-NEXT: psubd %xmm7, %xmm6448; SSE-NEXT: pcmpgtd %xmm9, %xmm7449; SSE-NEXT: pcmpgtd %xmm6, %xmm3450; SSE-NEXT: pxor %xmm7, %xmm3451; SSE-NEXT: movdqa %xmm6, 48(%rdi)452; SSE-NEXT: movdqa %xmm5, 32(%rdi)453; SSE-NEXT: movdqa %xmm4, 16(%rdi)454; SSE-NEXT: movdqa %xmm8, (%rdi)455; SSE-NEXT: retq456;457; AVX1-LABEL: ssubo_v16i32:458; AVX1: # %bb.0:459; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4460; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5461; AVX1-NEXT: vpcmpgtd %xmm5, %xmm4, %xmm6462; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7463; AVX1-NEXT: vpsubd %xmm4, %xmm7, %xmm4464; AVX1-NEXT: vpcmpgtd %xmm4, %xmm7, %xmm7465; AVX1-NEXT: vpxor %xmm7, %xmm6, %xmm6466; AVX1-NEXT: vpcmpgtd %xmm5, %xmm3, %xmm7467; AVX1-NEXT: vpsubd %xmm3, %xmm1, %xmm3468; AVX1-NEXT: vpcmpgtd %xmm3, %xmm1, %xmm1469; AVX1-NEXT: vpxor %xmm1, %xmm7, %xmm1470; AVX1-NEXT: vpackssdw %xmm6, %xmm1, %xmm1471; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm6472; AVX1-NEXT: vpcmpgtd %xmm5, %xmm6, %xmm7473; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm8474; AVX1-NEXT: vpsubd %xmm6, %xmm8, %xmm6475; AVX1-NEXT: vpcmpgtd %xmm6, %xmm8, %xmm8476; AVX1-NEXT: vpxor %xmm7, %xmm8, %xmm7477; AVX1-NEXT: vpcmpgtd %xmm5, %xmm2, %xmm5478; AVX1-NEXT: vpsubd %xmm2, %xmm0, %xmm2479; AVX1-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm0480; AVX1-NEXT: vpxor %xmm0, %xmm5, %xmm0481; AVX1-NEXT: vpackssdw %xmm7, %xmm0, %xmm0482; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0483; AVX1-NEXT: vpmovsxbd %xmm0, %xmm5484; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]485; AVX1-NEXT: vpmovsxbd %xmm0, %xmm0486; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm5, %ymm0487; AVX1-NEXT: vpacksswb %xmm1, %xmm1, %xmm1488; AVX1-NEXT: vpmovsxbd %xmm1, %xmm5489; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]490; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1491; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm5, %ymm1492; AVX1-NEXT: vmovdqa %xmm4, 48(%rdi)493; AVX1-NEXT: vmovdqa %xmm3, 32(%rdi)494; AVX1-NEXT: vmovdqa %xmm6, 16(%rdi)495; AVX1-NEXT: vmovdqa %xmm2, (%rdi)496; AVX1-NEXT: retq497;498; AVX2-LABEL: ssubo_v16i32:499; AVX2: # %bb.0:500; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4501; AVX2-NEXT: vpcmpgtd %ymm4, %ymm3, %ymm5502; AVX2-NEXT: vpsubd %ymm3, %ymm1, %ymm3503; AVX2-NEXT: vpcmpgtd %ymm3, %ymm1, %ymm1504; AVX2-NEXT: vpxor %ymm1, %ymm5, %ymm1505; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5506; AVX2-NEXT: vpackssdw %xmm5, %xmm1, %xmm1507; AVX2-NEXT: vpcmpgtd %ymm4, %ymm2, %ymm4508; AVX2-NEXT: vpsubd %ymm2, %ymm0, %ymm2509; AVX2-NEXT: vpcmpgtd %ymm2, %ymm0, %ymm0510; AVX2-NEXT: vpxor %ymm0, %ymm4, %ymm0511; AVX2-NEXT: vpacksswb %xmm1, %xmm1, %xmm1512; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1513; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,0,0,0,4,4,4,4,8,8,8,8,12,12,12,12,16,16,16,16,20,20,20,20,24,24,24,24,28,28,28,28]514; AVX2-NEXT: vmovdqa %ymm3, 32(%rdi)515; AVX2-NEXT: vmovdqa %ymm2, (%rdi)516; AVX2-NEXT: retq517;518; AVX512-LABEL: ssubo_v16i32:519; AVX512: # %bb.0:520; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2521; AVX512-NEXT: vpcmpgtd %zmm2, %zmm1, %k0522; AVX512-NEXT: vpsubd %zmm1, %zmm0, %zmm1523; AVX512-NEXT: vpcmpgtd %zmm1, %zmm0, %k1524; AVX512-NEXT: kxorw %k1, %k0, %k1525; AVX512-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1526; AVX512-NEXT: vmovdqa64 %zmm1, (%rdi)527; AVX512-NEXT: retq528 %t = call {<16 x i32>, <16 x i1>} @llvm.ssub.with.overflow.v16i32(<16 x i32> %a0, <16 x i32> %a1)529 %val = extractvalue {<16 x i32>, <16 x i1>} %t, 0530 %obit = extractvalue {<16 x i32>, <16 x i1>} %t, 1531 %res = sext <16 x i1> %obit to <16 x i32>532 store <16 x i32> %val, ptr %p2533 ret <16 x i32> %res534}535 536define <16 x i32> @ssubo_v16i8(<16 x i8> %a0, <16 x i8> %a1, ptr %p2) nounwind {537; SSE2-LABEL: ssubo_v16i8:538; SSE2: # %bb.0:539; SSE2-NEXT: movdqa %xmm0, %xmm2540; SSE2-NEXT: psubsb %xmm1, %xmm2541; SSE2-NEXT: psubb %xmm1, %xmm0542; SSE2-NEXT: pcmpeqb %xmm0, %xmm2543; SSE2-NEXT: pcmpeqd %xmm3, %xmm3544; SSE2-NEXT: pxor %xmm2, %xmm3545; SSE2-NEXT: movdqa %xmm3, %xmm4546; SSE2-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]547; SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3]548; SSE2-NEXT: movdqa %xmm3, %xmm1549; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]550; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]551; SSE2-NEXT: pslld $31, %xmm1552; SSE2-NEXT: psrad $31, %xmm1553; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]554; SSE2-NEXT: movdqa %xmm3, %xmm2555; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]556; SSE2-NEXT: pslld $31, %xmm2557; SSE2-NEXT: psrad $31, %xmm2558; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]559; SSE2-NEXT: pslld $31, %xmm3560; SSE2-NEXT: psrad $31, %xmm3561; SSE2-NEXT: movdqa %xmm0, (%rdi)562; SSE2-NEXT: movdqa %xmm4, %xmm0563; SSE2-NEXT: retq564;565; SSSE3-LABEL: ssubo_v16i8:566; SSSE3: # %bb.0:567; SSSE3-NEXT: movdqa %xmm0, %xmm2568; SSSE3-NEXT: psubsb %xmm1, %xmm2569; SSSE3-NEXT: psubb %xmm1, %xmm0570; SSSE3-NEXT: pcmpeqb %xmm0, %xmm2571; SSSE3-NEXT: pcmpeqd %xmm3, %xmm3572; SSSE3-NEXT: pxor %xmm2, %xmm3573; SSSE3-NEXT: movdqa %xmm3, %xmm4574; SSSE3-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]575; SSSE3-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3]576; SSSE3-NEXT: movdqa %xmm3, %xmm1577; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]578; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]579; SSSE3-NEXT: pslld $31, %xmm1580; SSSE3-NEXT: psrad $31, %xmm1581; SSSE3-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]582; SSSE3-NEXT: movdqa %xmm3, %xmm2583; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]584; SSSE3-NEXT: pslld $31, %xmm2585; SSSE3-NEXT: psrad $31, %xmm2586; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]587; SSSE3-NEXT: pslld $31, %xmm3588; SSSE3-NEXT: psrad $31, %xmm3589; SSSE3-NEXT: movdqa %xmm0, (%rdi)590; SSSE3-NEXT: movdqa %xmm4, %xmm0591; SSSE3-NEXT: retq592;593; SSE41-LABEL: ssubo_v16i8:594; SSE41: # %bb.0:595; SSE41-NEXT: movdqa %xmm0, %xmm2596; SSE41-NEXT: psubsb %xmm1, %xmm2597; SSE41-NEXT: psubb %xmm1, %xmm0598; SSE41-NEXT: pcmpeqb %xmm0, %xmm2599; SSE41-NEXT: pcmpeqd %xmm3, %xmm3600; SSE41-NEXT: pxor %xmm2, %xmm3601; SSE41-NEXT: pmovsxbd %xmm3, %xmm4602; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,1,1]603; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero604; SSE41-NEXT: pslld $31, %xmm1605; SSE41-NEXT: psrad $31, %xmm1606; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,3,2,3]607; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero608; SSE41-NEXT: pslld $31, %xmm2609; SSE41-NEXT: psrad $31, %xmm2610; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[3,3,3,3]611; SSE41-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero612; SSE41-NEXT: pslld $31, %xmm3613; SSE41-NEXT: psrad $31, %xmm3614; SSE41-NEXT: movdqa %xmm0, (%rdi)615; SSE41-NEXT: movdqa %xmm4, %xmm0616; SSE41-NEXT: retq617;618; AVX1-LABEL: ssubo_v16i8:619; AVX1: # %bb.0:620; AVX1-NEXT: vpsubsb %xmm1, %xmm0, %xmm2621; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm3622; AVX1-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm0623; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1624; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm1625; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0626; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]627; AVX1-NEXT: vpmovsxbd %xmm2, %xmm2628; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0629; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]630; AVX1-NEXT: vpmovsxbd %xmm2, %xmm2631; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,3,3]632; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1633; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1634; AVX1-NEXT: vmovdqa %xmm3, (%rdi)635; AVX1-NEXT: retq636;637; AVX2-LABEL: ssubo_v16i8:638; AVX2: # %bb.0:639; AVX2-NEXT: vpsubsb %xmm1, %xmm0, %xmm2640; AVX2-NEXT: vpsubb %xmm1, %xmm0, %xmm3641; AVX2-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm0642; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1643; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm1644; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0645; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]646; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1647; AVX2-NEXT: vmovdqa %xmm3, (%rdi)648; AVX2-NEXT: retq649;650; AVX512-LABEL: ssubo_v16i8:651; AVX512: # %bb.0:652; AVX512-NEXT: vpsubsb %xmm1, %xmm0, %xmm2653; AVX512-NEXT: vpsubb %xmm1, %xmm0, %xmm1654; AVX512-NEXT: vpcmpneqb %xmm2, %xmm1, %k1655; AVX512-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1656; AVX512-NEXT: vmovdqa %xmm1, (%rdi)657; AVX512-NEXT: retq658 %t = call {<16 x i8>, <16 x i1>} @llvm.ssub.with.overflow.v16i8(<16 x i8> %a0, <16 x i8> %a1)659 %val = extractvalue {<16 x i8>, <16 x i1>} %t, 0660 %obit = extractvalue {<16 x i8>, <16 x i1>} %t, 1661 %res = sext <16 x i1> %obit to <16 x i32>662 store <16 x i8> %val, ptr %p2663 ret <16 x i32> %res664}665 666define <8 x i32> @ssubo_v8i16(<8 x i16> %a0, <8 x i16> %a1, ptr %p2) nounwind {667; SSE2-LABEL: ssubo_v8i16:668; SSE2: # %bb.0:669; SSE2-NEXT: movdqa %xmm0, %xmm2670; SSE2-NEXT: psubsw %xmm1, %xmm2671; SSE2-NEXT: psubw %xmm1, %xmm0672; SSE2-NEXT: pcmpeqw %xmm0, %xmm2673; SSE2-NEXT: pcmpeqd %xmm1, %xmm1674; SSE2-NEXT: pxor %xmm2, %xmm1675; SSE2-NEXT: movdqa %xmm1, %xmm2676; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]677; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]678; SSE2-NEXT: pslld $31, %xmm1679; SSE2-NEXT: psrad $31, %xmm1680; SSE2-NEXT: movdqa %xmm0, (%rdi)681; SSE2-NEXT: movdqa %xmm2, %xmm0682; SSE2-NEXT: retq683;684; SSSE3-LABEL: ssubo_v8i16:685; SSSE3: # %bb.0:686; SSSE3-NEXT: movdqa %xmm0, %xmm2687; SSSE3-NEXT: psubsw %xmm1, %xmm2688; SSSE3-NEXT: psubw %xmm1, %xmm0689; SSSE3-NEXT: pcmpeqw %xmm0, %xmm2690; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1691; SSSE3-NEXT: pxor %xmm2, %xmm1692; SSSE3-NEXT: movdqa %xmm1, %xmm2693; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]694; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]695; SSSE3-NEXT: pslld $31, %xmm1696; SSSE3-NEXT: psrad $31, %xmm1697; SSSE3-NEXT: movdqa %xmm0, (%rdi)698; SSSE3-NEXT: movdqa %xmm2, %xmm0699; SSSE3-NEXT: retq700;701; SSE41-LABEL: ssubo_v8i16:702; SSE41: # %bb.0:703; SSE41-NEXT: movdqa %xmm0, %xmm2704; SSE41-NEXT: psubsw %xmm1, %xmm2705; SSE41-NEXT: psubw %xmm1, %xmm0706; SSE41-NEXT: pcmpeqw %xmm0, %xmm2707; SSE41-NEXT: pcmpeqd %xmm1, %xmm1708; SSE41-NEXT: pxor %xmm2, %xmm1709; SSE41-NEXT: pmovsxwd %xmm1, %xmm2710; SSE41-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]711; SSE41-NEXT: pslld $31, %xmm1712; SSE41-NEXT: psrad $31, %xmm1713; SSE41-NEXT: movdqa %xmm0, (%rdi)714; SSE41-NEXT: movdqa %xmm2, %xmm0715; SSE41-NEXT: retq716;717; AVX1-LABEL: ssubo_v8i16:718; AVX1: # %bb.0:719; AVX1-NEXT: vpsubsw %xmm1, %xmm0, %xmm2720; AVX1-NEXT: vpsubw %xmm1, %xmm0, %xmm1721; AVX1-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm0722; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2723; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0724; AVX1-NEXT: vpmovsxwd %xmm0, %xmm2725; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]726; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0727; AVX1-NEXT: vmovdqa %xmm1, (%rdi)728; AVX1-NEXT: retq729;730; AVX2-LABEL: ssubo_v8i16:731; AVX2: # %bb.0:732; AVX2-NEXT: vpsubsw %xmm1, %xmm0, %xmm2733; AVX2-NEXT: vpsubw %xmm1, %xmm0, %xmm1734; AVX2-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm0735; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2736; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0737; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0738; AVX2-NEXT: vmovdqa %xmm1, (%rdi)739; AVX2-NEXT: retq740;741; AVX512-LABEL: ssubo_v8i16:742; AVX512: # %bb.0:743; AVX512-NEXT: vpsubsw %xmm1, %xmm0, %xmm2744; AVX512-NEXT: vpsubw %xmm1, %xmm0, %xmm1745; AVX512-NEXT: vpcmpneqw %xmm2, %xmm1, %k1746; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0747; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}748; AVX512-NEXT: vmovdqa %xmm1, (%rdi)749; AVX512-NEXT: retq750 %t = call {<8 x i16>, <8 x i1>} @llvm.ssub.with.overflow.v8i16(<8 x i16> %a0, <8 x i16> %a1)751 %val = extractvalue {<8 x i16>, <8 x i1>} %t, 0752 %obit = extractvalue {<8 x i16>, <8 x i1>} %t, 1753 %res = sext <8 x i1> %obit to <8 x i32>754 store <8 x i16> %val, ptr %p2755 ret <8 x i32> %res756}757 758define <2 x i32> @ssubo_v2i64(<2 x i64> %a0, <2 x i64> %a1, ptr %p2) nounwind {759; SSE2-LABEL: ssubo_v2i64:760; SSE2: # %bb.0:761; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]762; SSE2-NEXT: movdqa %xmm0, %xmm3763; SSE2-NEXT: pxor %xmm2, %xmm3764; SSE2-NEXT: psubq %xmm1, %xmm0765; SSE2-NEXT: movdqa %xmm0, (%rdi)766; SSE2-NEXT: pxor %xmm2, %xmm0767; SSE2-NEXT: movdqa %xmm3, %xmm4768; SSE2-NEXT: pcmpgtd %xmm0, %xmm4769; SSE2-NEXT: pcmpeqd %xmm3, %xmm0770; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]771; SSE2-NEXT: pand %xmm4, %xmm0772; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]773; SSE2-NEXT: por %xmm0, %xmm3774; SSE2-NEXT: pxor %xmm2, %xmm1775; SSE2-NEXT: movdqa %xmm1, %xmm0776; SSE2-NEXT: pcmpgtd %xmm2, %xmm0777; SSE2-NEXT: pcmpeqd %xmm2, %xmm1778; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]779; SSE2-NEXT: pand %xmm0, %xmm1780; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]781; SSE2-NEXT: por %xmm1, %xmm0782; SSE2-NEXT: pxor %xmm3, %xmm0783; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]784; SSE2-NEXT: retq785;786; SSSE3-LABEL: ssubo_v2i64:787; SSSE3: # %bb.0:788; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]789; SSSE3-NEXT: movdqa %xmm0, %xmm3790; SSSE3-NEXT: pxor %xmm2, %xmm3791; SSSE3-NEXT: psubq %xmm1, %xmm0792; SSSE3-NEXT: movdqa %xmm0, (%rdi)793; SSSE3-NEXT: pxor %xmm2, %xmm0794; SSSE3-NEXT: movdqa %xmm3, %xmm4795; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4796; SSSE3-NEXT: pcmpeqd %xmm3, %xmm0797; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]798; SSSE3-NEXT: pand %xmm4, %xmm0799; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]800; SSSE3-NEXT: por %xmm0, %xmm3801; SSSE3-NEXT: pxor %xmm2, %xmm1802; SSSE3-NEXT: movdqa %xmm1, %xmm0803; SSSE3-NEXT: pcmpgtd %xmm2, %xmm0804; SSSE3-NEXT: pcmpeqd %xmm2, %xmm1805; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]806; SSSE3-NEXT: pand %xmm0, %xmm1807; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]808; SSSE3-NEXT: por %xmm1, %xmm0809; SSSE3-NEXT: pxor %xmm3, %xmm0810; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]811; SSSE3-NEXT: retq812;813; SSE41-LABEL: ssubo_v2i64:814; SSE41: # %bb.0:815; SSE41-NEXT: pmovzxdq {{.*#+}} xmm2 = [2147483648,2147483648]816; SSE41-NEXT: movdqa %xmm0, %xmm3817; SSE41-NEXT: pxor %xmm2, %xmm3818; SSE41-NEXT: psubq %xmm1, %xmm0819; SSE41-NEXT: movdqa %xmm0, (%rdi)820; SSE41-NEXT: pxor %xmm2, %xmm0821; SSE41-NEXT: movdqa %xmm3, %xmm4822; SSE41-NEXT: pcmpgtd %xmm0, %xmm4823; SSE41-NEXT: pcmpeqd %xmm3, %xmm0824; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]825; SSE41-NEXT: pand %xmm4, %xmm0826; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]827; SSE41-NEXT: por %xmm0, %xmm3828; SSE41-NEXT: pxor %xmm2, %xmm1829; SSE41-NEXT: movdqa %xmm1, %xmm0830; SSE41-NEXT: pcmpgtd %xmm2, %xmm0831; SSE41-NEXT: pcmpeqd %xmm2, %xmm1832; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]833; SSE41-NEXT: pand %xmm0, %xmm1834; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]835; SSE41-NEXT: por %xmm1, %xmm0836; SSE41-NEXT: pxor %xmm3, %xmm0837; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]838; SSE41-NEXT: retq839;840; AVX-LABEL: ssubo_v2i64:841; AVX: # %bb.0:842; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2843; AVX-NEXT: vpcmpgtq %xmm2, %xmm1, %xmm2844; AVX-NEXT: vpsubq %xmm1, %xmm0, %xmm1845; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0846; AVX-NEXT: vpxor %xmm0, %xmm2, %xmm0847; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]848; AVX-NEXT: vmovdqa %xmm1, (%rdi)849; AVX-NEXT: retq850;851; AVX512-LABEL: ssubo_v2i64:852; AVX512: # %bb.0:853; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2854; AVX512-NEXT: vpcmpgtq %xmm2, %xmm1, %k0855; AVX512-NEXT: vpsubq %xmm1, %xmm0, %xmm1856; AVX512-NEXT: vpcmpgtq %xmm1, %xmm0, %k1857; AVX512-NEXT: kxorw %k1, %k0, %k1858; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0859; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}860; AVX512-NEXT: vmovdqa %xmm1, (%rdi)861; AVX512-NEXT: retq862 %t = call {<2 x i64>, <2 x i1>} @llvm.ssub.with.overflow.v2i64(<2 x i64> %a0, <2 x i64> %a1)863 %val = extractvalue {<2 x i64>, <2 x i1>} %t, 0864 %obit = extractvalue {<2 x i64>, <2 x i1>} %t, 1865 %res = sext <2 x i1> %obit to <2 x i32>866 store <2 x i64> %val, ptr %p2867 ret <2 x i32> %res868}869 870define <4 x i32> @ssubo_v4i24(<4 x i24> %a0, <4 x i24> %a1, ptr %p2) nounwind {871; SSE2-LABEL: ssubo_v4i24:872; SSE2: # %bb.0:873; SSE2-NEXT: movdqa %xmm0, %xmm2874; SSE2-NEXT: pslld $8, %xmm1875; SSE2-NEXT: psrad $8, %xmm1876; SSE2-NEXT: pslld $8, %xmm2877; SSE2-NEXT: psrad $8, %xmm2878; SSE2-NEXT: psubd %xmm1, %xmm2879; SSE2-NEXT: movdqa %xmm2, %xmm1880; SSE2-NEXT: pslld $8, %xmm1881; SSE2-NEXT: psrad $8, %xmm1882; SSE2-NEXT: pcmpeqd %xmm2, %xmm1883; SSE2-NEXT: pcmpeqd %xmm0, %xmm0884; SSE2-NEXT: pxor %xmm1, %xmm0885; SSE2-NEXT: movd %xmm2, %eax886; SSE2-NEXT: movw %ax, (%rdi)887; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,3,3,3]888; SSE2-NEXT: movd %xmm1, %ecx889; SSE2-NEXT: movw %cx, 9(%rdi)890; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]891; SSE2-NEXT: movd %xmm1, %edx892; SSE2-NEXT: movw %dx, 6(%rdi)893; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,1,1]894; SSE2-NEXT: movd %xmm1, %esi895; SSE2-NEXT: movw %si, 3(%rdi)896; SSE2-NEXT: shrl $16, %eax897; SSE2-NEXT: movb %al, 2(%rdi)898; SSE2-NEXT: shrl $16, %ecx899; SSE2-NEXT: movb %cl, 11(%rdi)900; SSE2-NEXT: shrl $16, %edx901; SSE2-NEXT: movb %dl, 8(%rdi)902; SSE2-NEXT: shrl $16, %esi903; SSE2-NEXT: movb %sil, 5(%rdi)904; SSE2-NEXT: retq905;906; SSSE3-LABEL: ssubo_v4i24:907; SSSE3: # %bb.0:908; SSSE3-NEXT: movdqa %xmm0, %xmm2909; SSSE3-NEXT: pslld $8, %xmm1910; SSSE3-NEXT: psrad $8, %xmm1911; SSSE3-NEXT: pslld $8, %xmm2912; SSSE3-NEXT: psrad $8, %xmm2913; SSSE3-NEXT: psubd %xmm1, %xmm2914; SSSE3-NEXT: movdqa %xmm2, %xmm1915; SSSE3-NEXT: pslld $8, %xmm1916; SSSE3-NEXT: psrad $8, %xmm1917; SSSE3-NEXT: pcmpeqd %xmm2, %xmm1918; SSSE3-NEXT: pcmpeqd %xmm0, %xmm0919; SSSE3-NEXT: pxor %xmm1, %xmm0920; SSSE3-NEXT: movd %xmm2, %eax921; SSSE3-NEXT: movw %ax, (%rdi)922; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,3,3,3]923; SSSE3-NEXT: movd %xmm1, %ecx924; SSSE3-NEXT: movw %cx, 9(%rdi)925; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]926; SSSE3-NEXT: movd %xmm1, %edx927; SSSE3-NEXT: movw %dx, 6(%rdi)928; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,1,1]929; SSSE3-NEXT: movd %xmm1, %esi930; SSSE3-NEXT: movw %si, 3(%rdi)931; SSSE3-NEXT: shrl $16, %eax932; SSSE3-NEXT: movb %al, 2(%rdi)933; SSSE3-NEXT: shrl $16, %ecx934; SSSE3-NEXT: movb %cl, 11(%rdi)935; SSSE3-NEXT: shrl $16, %edx936; SSSE3-NEXT: movb %dl, 8(%rdi)937; SSSE3-NEXT: shrl $16, %esi938; SSSE3-NEXT: movb %sil, 5(%rdi)939; SSSE3-NEXT: retq940;941; SSE41-LABEL: ssubo_v4i24:942; SSE41: # %bb.0:943; SSE41-NEXT: pslld $8, %xmm1944; SSE41-NEXT: psrad $8, %xmm1945; SSE41-NEXT: pslld $8, %xmm0946; SSE41-NEXT: psrad $8, %xmm0947; SSE41-NEXT: psubd %xmm1, %xmm0948; SSE41-NEXT: movdqa %xmm0, %xmm2949; SSE41-NEXT: pslld $8, %xmm2950; SSE41-NEXT: psrad $8, %xmm2951; SSE41-NEXT: pcmpeqd %xmm0, %xmm2952; SSE41-NEXT: pcmpeqd %xmm1, %xmm1953; SSE41-NEXT: pxor %xmm2, %xmm1954; SSE41-NEXT: pextrd $3, %xmm0, %eax955; SSE41-NEXT: movw %ax, 9(%rdi)956; SSE41-NEXT: pextrd $2, %xmm0, %ecx957; SSE41-NEXT: movw %cx, 6(%rdi)958; SSE41-NEXT: pextrd $1, %xmm0, %edx959; SSE41-NEXT: movw %dx, 3(%rdi)960; SSE41-NEXT: movd %xmm0, %esi961; SSE41-NEXT: movw %si, (%rdi)962; SSE41-NEXT: shrl $16, %eax963; SSE41-NEXT: movb %al, 11(%rdi)964; SSE41-NEXT: shrl $16, %ecx965; SSE41-NEXT: movb %cl, 8(%rdi)966; SSE41-NEXT: shrl $16, %edx967; SSE41-NEXT: movb %dl, 5(%rdi)968; SSE41-NEXT: shrl $16, %esi969; SSE41-NEXT: movb %sil, 2(%rdi)970; SSE41-NEXT: movdqa %xmm1, %xmm0971; SSE41-NEXT: retq972;973; AVX-LABEL: ssubo_v4i24:974; AVX: # %bb.0:975; AVX-NEXT: vpslld $8, %xmm1, %xmm1976; AVX-NEXT: vpsrad $8, %xmm1, %xmm1977; AVX-NEXT: vpslld $8, %xmm0, %xmm0978; AVX-NEXT: vpsrad $8, %xmm0, %xmm0979; AVX-NEXT: vpsubd %xmm1, %xmm0, %xmm1980; AVX-NEXT: vpslld $8, %xmm1, %xmm0981; AVX-NEXT: vpsrad $8, %xmm0, %xmm0982; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0983; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2984; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0985; AVX-NEXT: vpextrd $3, %xmm1, %eax986; AVX-NEXT: movw %ax, 9(%rdi)987; AVX-NEXT: vpextrd $2, %xmm1, %ecx988; AVX-NEXT: movw %cx, 6(%rdi)989; AVX-NEXT: vpextrd $1, %xmm1, %edx990; AVX-NEXT: movw %dx, 3(%rdi)991; AVX-NEXT: vmovd %xmm1, %esi992; AVX-NEXT: movw %si, (%rdi)993; AVX-NEXT: shrl $16, %eax994; AVX-NEXT: movb %al, 11(%rdi)995; AVX-NEXT: shrl $16, %ecx996; AVX-NEXT: movb %cl, 8(%rdi)997; AVX-NEXT: shrl $16, %edx998; AVX-NEXT: movb %dl, 5(%rdi)999; AVX-NEXT: shrl $16, %esi1000; AVX-NEXT: movb %sil, 2(%rdi)1001; AVX-NEXT: retq1002;1003; AVX512-LABEL: ssubo_v4i24:1004; AVX512: # %bb.0:1005; AVX512-NEXT: vpslld $8, %xmm1, %xmm11006; AVX512-NEXT: vpsrad $8, %xmm1, %xmm11007; AVX512-NEXT: vpslld $8, %xmm0, %xmm01008; AVX512-NEXT: vpsrad $8, %xmm0, %xmm01009; AVX512-NEXT: vpsubd %xmm1, %xmm0, %xmm11010; AVX512-NEXT: vpslld $8, %xmm1, %xmm01011; AVX512-NEXT: vpsrad $8, %xmm0, %xmm01012; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01013; AVX512-NEXT: vpternlogq {{.*#+}} xmm0 = ~xmm01014; AVX512-NEXT: vpextrd $3, %xmm1, %eax1015; AVX512-NEXT: movw %ax, 9(%rdi)1016; AVX512-NEXT: vpextrd $2, %xmm1, %ecx1017; AVX512-NEXT: movw %cx, 6(%rdi)1018; AVX512-NEXT: vpextrd $1, %xmm1, %edx1019; AVX512-NEXT: movw %dx, 3(%rdi)1020; AVX512-NEXT: vmovd %xmm1, %esi1021; AVX512-NEXT: movw %si, (%rdi)1022; AVX512-NEXT: shrl $16, %eax1023; AVX512-NEXT: movb %al, 11(%rdi)1024; AVX512-NEXT: shrl $16, %ecx1025; AVX512-NEXT: movb %cl, 8(%rdi)1026; AVX512-NEXT: shrl $16, %edx1027; AVX512-NEXT: movb %dl, 5(%rdi)1028; AVX512-NEXT: shrl $16, %esi1029; AVX512-NEXT: movb %sil, 2(%rdi)1030; AVX512-NEXT: retq1031 %t = call {<4 x i24>, <4 x i1>} @llvm.ssub.with.overflow.v4i24(<4 x i24> %a0, <4 x i24> %a1)1032 %val = extractvalue {<4 x i24>, <4 x i1>} %t, 01033 %obit = extractvalue {<4 x i24>, <4 x i1>} %t, 11034 %res = sext <4 x i1> %obit to <4 x i32>1035 store <4 x i24> %val, ptr %p21036 ret <4 x i32> %res1037}1038 1039define <4 x i32> @ssubo_v4i1(<4 x i1> %a0, <4 x i1> %a1, ptr %p2) nounwind {1040; SSE-LABEL: ssubo_v4i1:1041; SSE: # %bb.0:1042; SSE-NEXT: movdqa %xmm0, %xmm21043; SSE-NEXT: pxor %xmm1, %xmm21044; SSE-NEXT: pslld $31, %xmm21045; SSE-NEXT: movmskps %xmm2, %eax1046; SSE-NEXT: pandn %xmm1, %xmm01047; SSE-NEXT: pslld $31, %xmm01048; SSE-NEXT: psrad $31, %xmm01049; SSE-NEXT: movb %al, (%rdi)1050; SSE-NEXT: retq1051;1052; AVX-LABEL: ssubo_v4i1:1053; AVX: # %bb.0:1054; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm21055; AVX-NEXT: vpslld $31, %xmm2, %xmm21056; AVX-NEXT: vmovmskps %xmm2, %eax1057; AVX-NEXT: vpandn %xmm1, %xmm0, %xmm01058; AVX-NEXT: vpslld $31, %xmm0, %xmm01059; AVX-NEXT: vpsrad $31, %xmm0, %xmm01060; AVX-NEXT: movb %al, (%rdi)1061; AVX-NEXT: retq1062;1063; AVX512-LABEL: ssubo_v4i1:1064; AVX512: # %bb.0:1065; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm21066; AVX512-NEXT: vpslld $31, %xmm2, %xmm21067; AVX512-NEXT: vptestmd %xmm2, %xmm2, %k01068; AVX512-NEXT: vpandn %xmm1, %xmm0, %xmm01069; AVX512-NEXT: vpslld $31, %xmm0, %xmm01070; AVX512-NEXT: vpsrad $31, %xmm0, %xmm01071; AVX512-NEXT: kmovd %k0, %eax1072; AVX512-NEXT: movb %al, (%rdi)1073; AVX512-NEXT: retq1074 %t = call {<4 x i1>, <4 x i1>} @llvm.ssub.with.overflow.v4i1(<4 x i1> %a0, <4 x i1> %a1)1075 %val = extractvalue {<4 x i1>, <4 x i1>} %t, 01076 %obit = extractvalue {<4 x i1>, <4 x i1>} %t, 11077 %res = sext <4 x i1> %obit to <4 x i32>1078 store <4 x i1> %val, ptr %p21079 ret <4 x i32> %res1080}1081 1082define <2 x i32> @ssubo_v2i128(<2 x i128> %a0, <2 x i128> %a1, ptr %p2) nounwind {1083; SSE2-LABEL: ssubo_v2i128:1084; SSE2: # %bb.0:1085; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %rax1086; SSE2-NEXT: subq %r8, %rdi1087; SSE2-NEXT: sbbq %r9, %rsi1088; SSE2-NEXT: seto %r8b1089; SSE2-NEXT: subq {{[0-9]+}}(%rsp), %rdx1090; SSE2-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx1091; SSE2-NEXT: seto %r9b1092; SSE2-NEXT: movzbl %r9b, %r9d1093; SSE2-NEXT: negl %r9d1094; SSE2-NEXT: movd %r9d, %xmm11095; SSE2-NEXT: movzbl %r8b, %r8d1096; SSE2-NEXT: negl %r8d1097; SSE2-NEXT: movd %r8d, %xmm01098; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1099; SSE2-NEXT: movq %rdx, 16(%rax)1100; SSE2-NEXT: movq %rdi, (%rax)1101; SSE2-NEXT: movq %rcx, 24(%rax)1102; SSE2-NEXT: movq %rsi, 8(%rax)1103; SSE2-NEXT: retq1104;1105; SSSE3-LABEL: ssubo_v2i128:1106; SSSE3: # %bb.0:1107; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %rax1108; SSSE3-NEXT: subq %r8, %rdi1109; SSSE3-NEXT: sbbq %r9, %rsi1110; SSSE3-NEXT: seto %r8b1111; SSSE3-NEXT: subq {{[0-9]+}}(%rsp), %rdx1112; SSSE3-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx1113; SSSE3-NEXT: seto %r9b1114; SSSE3-NEXT: movzbl %r9b, %r9d1115; SSSE3-NEXT: negl %r9d1116; SSSE3-NEXT: movd %r9d, %xmm11117; SSSE3-NEXT: movzbl %r8b, %r8d1118; SSSE3-NEXT: negl %r8d1119; SSSE3-NEXT: movd %r8d, %xmm01120; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1121; SSSE3-NEXT: movq %rdx, 16(%rax)1122; SSSE3-NEXT: movq %rdi, (%rax)1123; SSSE3-NEXT: movq %rcx, 24(%rax)1124; SSSE3-NEXT: movq %rsi, 8(%rax)1125; SSSE3-NEXT: retq1126;1127; SSE41-LABEL: ssubo_v2i128:1128; SSE41: # %bb.0:1129; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %rax1130; SSE41-NEXT: subq %r8, %rdi1131; SSE41-NEXT: sbbq %r9, %rsi1132; SSE41-NEXT: seto %r8b1133; SSE41-NEXT: subq {{[0-9]+}}(%rsp), %rdx1134; SSE41-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx1135; SSE41-NEXT: seto %r9b1136; SSE41-NEXT: movzbl %r9b, %r9d1137; SSE41-NEXT: negl %r9d1138; SSE41-NEXT: movzbl %r8b, %r8d1139; SSE41-NEXT: negl %r8d1140; SSE41-NEXT: movd %r8d, %xmm01141; SSE41-NEXT: pinsrd $1, %r9d, %xmm01142; SSE41-NEXT: movq %rdx, 16(%rax)1143; SSE41-NEXT: movq %rdi, (%rax)1144; SSE41-NEXT: movq %rcx, 24(%rax)1145; SSE41-NEXT: movq %rsi, 8(%rax)1146; SSE41-NEXT: retq1147;1148; AVX-LABEL: ssubo_v2i128:1149; AVX: # %bb.0:1150; AVX-NEXT: movq {{[0-9]+}}(%rsp), %rax1151; AVX-NEXT: subq %r8, %rdi1152; AVX-NEXT: sbbq %r9, %rsi1153; AVX-NEXT: seto %r8b1154; AVX-NEXT: subq {{[0-9]+}}(%rsp), %rdx1155; AVX-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx1156; AVX-NEXT: seto %r9b1157; AVX-NEXT: movzbl %r9b, %r9d1158; AVX-NEXT: negl %r9d1159; AVX-NEXT: movzbl %r8b, %r8d1160; AVX-NEXT: negl %r8d1161; AVX-NEXT: vmovd %r8d, %xmm01162; AVX-NEXT: vpinsrd $1, %r9d, %xmm0, %xmm01163; AVX-NEXT: movq %rdx, 16(%rax)1164; AVX-NEXT: movq %rdi, (%rax)1165; AVX-NEXT: movq %rcx, 24(%rax)1166; AVX-NEXT: movq %rsi, 8(%rax)1167; AVX-NEXT: retq1168;1169; AVX512-LABEL: ssubo_v2i128:1170; AVX512: # %bb.0:1171; AVX512-NEXT: movq {{[0-9]+}}(%rsp), %rax1172; AVX512-NEXT: subq {{[0-9]+}}(%rsp), %rdx1173; AVX512-NEXT: sbbq {{[0-9]+}}(%rsp), %rcx1174; AVX512-NEXT: seto %r10b1175; AVX512-NEXT: kmovd %r10d, %k01176; AVX512-NEXT: subq %r8, %rdi1177; AVX512-NEXT: sbbq %r9, %rsi1178; AVX512-NEXT: seto %r8b1179; AVX512-NEXT: andl $1, %r8d1180; AVX512-NEXT: kmovw %r8d, %k11181; AVX512-NEXT: kshiftlw $1, %k0, %k01182; AVX512-NEXT: korw %k0, %k1, %k11183; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm01184; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}1185; AVX512-NEXT: movq %rdx, 16(%rax)1186; AVX512-NEXT: movq %rdi, (%rax)1187; AVX512-NEXT: movq %rcx, 24(%rax)1188; AVX512-NEXT: movq %rsi, 8(%rax)1189; AVX512-NEXT: retq1190 %t = call {<2 x i128>, <2 x i1>} @llvm.ssub.with.overflow.v2i128(<2 x i128> %a0, <2 x i128> %a1)1191 %val = extractvalue {<2 x i128>, <2 x i1>} %t, 01192 %obit = extractvalue {<2 x i128>, <2 x i1>} %t, 11193 %res = sext <2 x i1> %obit to <2 x i32>1194 store <2 x i128> %val, ptr %p21195 ret <2 x i32> %res1196}1197