brintos

brintos / llvm-project-archived public Read only

0
0
Text · 45.0 KiB · 746c09e Raw
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