brintos

brintos / llvm-project-archived public Read only

0
0
Text · 48.2 KiB · ceb1ad1 Raw
1272 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.usub.with.overflow.v1i32(<1 x i32>, <1 x i32>)11declare {<2 x i32>, <2 x i1>} @llvm.usub.with.overflow.v2i32(<2 x i32>, <2 x i32>)12declare {<3 x i32>, <3 x i1>} @llvm.usub.with.overflow.v3i32(<3 x i32>, <3 x i32>)13declare {<4 x i32>, <4 x i1>} @llvm.usub.with.overflow.v4i32(<4 x i32>, <4 x i32>)14declare {<6 x i32>, <6 x i1>} @llvm.usub.with.overflow.v6i32(<6 x i32>, <6 x i32>)15declare {<8 x i32>, <8 x i1>} @llvm.usub.with.overflow.v8i32(<8 x i32>, <8 x i32>)16declare {<16 x i32>, <16 x i1>} @llvm.usub.with.overflow.v16i32(<16 x i32>, <16 x i32>)17 18declare {<16 x i8>, <16 x i1>} @llvm.usub.with.overflow.v16i8(<16 x i8>, <16 x i8>)19declare {<8 x i16>, <8 x i1>} @llvm.usub.with.overflow.v8i16(<8 x i16>, <8 x i16>)20declare {<2 x i64>, <2 x i1>} @llvm.usub.with.overflow.v2i64(<2 x i64>, <2 x i64>)21 22declare {<4 x i24>, <4 x i1>} @llvm.usub.with.overflow.v4i24(<4 x i24>, <4 x i24>)23declare {<4 x i1>, <4 x i1>} @llvm.usub.with.overflow.v4i1(<4 x i1>, <4 x i1>)24declare {<2 x i128>, <2 x i1>} @llvm.usub.with.overflow.v2i128(<2 x i128>, <2 x i128>)25 26define <1 x i32> @usubo_v1i32(<1 x i32> %a0, <1 x i32> %a1, ptr %p2) nounwind {27; CHECK-LABEL: usubo_v1i32:28; CHECK:       # %bb.0:29; CHECK-NEXT:    xorl %eax, %eax30; CHECK-NEXT:    subl %esi, %edi31; CHECK-NEXT:    sbbl %eax, %eax32; CHECK-NEXT:    movl %edi, (%rdx)33; CHECK-NEXT:    retq34  %t = call {<1 x i32>, <1 x i1>} @llvm.usub.with.overflow.v1i32(<1 x i32> %a0, <1 x i32> %a1)35  %val = extractvalue {<1 x i32>, <1 x i1>} %t, 036  %obit = extractvalue {<1 x i32>, <1 x i1>} %t, 137  %res = sext <1 x i1> %obit to <1 x i32>38  store <1 x i32> %val, ptr %p239  ret <1 x i32> %res40}41 42define <2 x i32> @usubo_v2i32(<2 x i32> %a0, <2 x i32> %a1, ptr %p2) nounwind {43; SSE2-LABEL: usubo_v2i32:44; SSE2:       # %bb.0:45; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]46; SSE2-NEXT:    movdqa %xmm0, %xmm347; SSE2-NEXT:    pxor %xmm2, %xmm348; SSE2-NEXT:    psubd %xmm1, %xmm049; SSE2-NEXT:    pxor %xmm0, %xmm250; SSE2-NEXT:    pcmpgtd %xmm3, %xmm251; SSE2-NEXT:    movq %xmm0, (%rdi)52; SSE2-NEXT:    movdqa %xmm2, %xmm053; SSE2-NEXT:    retq54;55; SSSE3-LABEL: usubo_v2i32:56; SSSE3:       # %bb.0:57; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]58; SSSE3-NEXT:    movdqa %xmm0, %xmm359; SSSE3-NEXT:    pxor %xmm2, %xmm360; SSSE3-NEXT:    psubd %xmm1, %xmm061; SSSE3-NEXT:    pxor %xmm0, %xmm262; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm263; SSSE3-NEXT:    movq %xmm0, (%rdi)64; SSSE3-NEXT:    movdqa %xmm2, %xmm065; SSSE3-NEXT:    retq66;67; SSE41-LABEL: usubo_v2i32:68; SSE41:       # %bb.0:69; SSE41-NEXT:    movdqa %xmm0, %xmm270; SSE41-NEXT:    psubd %xmm1, %xmm271; SSE41-NEXT:    pminud %xmm2, %xmm072; SSE41-NEXT:    pcmpeqd %xmm2, %xmm073; SSE41-NEXT:    pcmpeqd %xmm1, %xmm174; SSE41-NEXT:    pxor %xmm1, %xmm075; SSE41-NEXT:    movq %xmm2, (%rdi)76; SSE41-NEXT:    retq77;78; AVX-LABEL: usubo_v2i32:79; AVX:       # %bb.0:80; AVX-NEXT:    vpsubd %xmm1, %xmm0, %xmm181; AVX-NEXT:    vpminud %xmm0, %xmm1, %xmm082; AVX-NEXT:    vpcmpeqd %xmm0, %xmm1, %xmm083; AVX-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm284; AVX-NEXT:    vpxor %xmm2, %xmm0, %xmm085; AVX-NEXT:    vmovq %xmm1, (%rdi)86; AVX-NEXT:    retq87;88; AVX512-LABEL: usubo_v2i32:89; AVX512:       # %bb.0:90; AVX512-NEXT:    vpsubd %xmm1, %xmm0, %xmm191; AVX512-NEXT:    vpcmpnleud %xmm0, %xmm1, %k192; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm093; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}94; AVX512-NEXT:    vmovq %xmm1, (%rdi)95; AVX512-NEXT:    retq96  %t = call {<2 x i32>, <2 x i1>} @llvm.usub.with.overflow.v2i32(<2 x i32> %a0, <2 x i32> %a1)97  %val = extractvalue {<2 x i32>, <2 x i1>} %t, 098  %obit = extractvalue {<2 x i32>, <2 x i1>} %t, 199  %res = sext <2 x i1> %obit to <2 x i32>100  store <2 x i32> %val, ptr %p2101  ret <2 x i32> %res102}103 104define <3 x i32> @usubo_v3i32(<3 x i32> %a0, <3 x i32> %a1, ptr %p2) nounwind {105; SSE2-LABEL: usubo_v3i32:106; SSE2:       # %bb.0:107; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]108; SSE2-NEXT:    movdqa %xmm0, %xmm3109; SSE2-NEXT:    pxor %xmm2, %xmm3110; SSE2-NEXT:    psubd %xmm1, %xmm0111; SSE2-NEXT:    pxor %xmm0, %xmm2112; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2113; SSE2-NEXT:    movq %xmm0, (%rdi)114; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]115; SSE2-NEXT:    movd %xmm0, 8(%rdi)116; SSE2-NEXT:    movdqa %xmm2, %xmm0117; SSE2-NEXT:    retq118;119; SSSE3-LABEL: usubo_v3i32:120; SSSE3:       # %bb.0:121; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]122; SSSE3-NEXT:    movdqa %xmm0, %xmm3123; SSSE3-NEXT:    pxor %xmm2, %xmm3124; SSSE3-NEXT:    psubd %xmm1, %xmm0125; SSSE3-NEXT:    pxor %xmm0, %xmm2126; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2127; SSSE3-NEXT:    movq %xmm0, (%rdi)128; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]129; SSSE3-NEXT:    movd %xmm0, 8(%rdi)130; SSSE3-NEXT:    movdqa %xmm2, %xmm0131; SSSE3-NEXT:    retq132;133; SSE41-LABEL: usubo_v3i32:134; SSE41:       # %bb.0:135; SSE41-NEXT:    movdqa %xmm0, %xmm2136; SSE41-NEXT:    psubd %xmm1, %xmm2137; SSE41-NEXT:    pminud %xmm2, %xmm0138; SSE41-NEXT:    pcmpeqd %xmm2, %xmm0139; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1140; SSE41-NEXT:    pxor %xmm1, %xmm0141; SSE41-NEXT:    pextrd $2, %xmm2, 8(%rdi)142; SSE41-NEXT:    movq %xmm2, (%rdi)143; SSE41-NEXT:    retq144;145; AVX-LABEL: usubo_v3i32:146; AVX:       # %bb.0:147; AVX-NEXT:    vpsubd %xmm1, %xmm0, %xmm1148; AVX-NEXT:    vpminud %xmm0, %xmm1, %xmm0149; AVX-NEXT:    vpcmpeqd %xmm0, %xmm1, %xmm0150; AVX-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2151; AVX-NEXT:    vpxor %xmm2, %xmm0, %xmm0152; AVX-NEXT:    vpextrd $2, %xmm1, 8(%rdi)153; AVX-NEXT:    vmovq %xmm1, (%rdi)154; AVX-NEXT:    retq155;156; AVX512-LABEL: usubo_v3i32:157; AVX512:       # %bb.0:158; AVX512-NEXT:    vpsubd %xmm1, %xmm0, %xmm1159; AVX512-NEXT:    vpcmpnleud %xmm0, %xmm1, %k1160; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0161; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}162; AVX512-NEXT:    vpextrd $2, %xmm1, 8(%rdi)163; AVX512-NEXT:    vmovq %xmm1, (%rdi)164; AVX512-NEXT:    retq165  %t = call {<3 x i32>, <3 x i1>} @llvm.usub.with.overflow.v3i32(<3 x i32> %a0, <3 x i32> %a1)166  %val = extractvalue {<3 x i32>, <3 x i1>} %t, 0167  %obit = extractvalue {<3 x i32>, <3 x i1>} %t, 1168  %res = sext <3 x i1> %obit to <3 x i32>169  store <3 x i32> %val, ptr %p2170  ret <3 x i32> %res171}172 173define <4 x i32> @usubo_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %p2) nounwind {174; SSE2-LABEL: usubo_v4i32:175; SSE2:       # %bb.0:176; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]177; SSE2-NEXT:    movdqa %xmm0, %xmm3178; SSE2-NEXT:    pxor %xmm2, %xmm3179; SSE2-NEXT:    psubd %xmm1, %xmm0180; SSE2-NEXT:    pxor %xmm0, %xmm2181; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2182; SSE2-NEXT:    movdqa %xmm0, (%rdi)183; SSE2-NEXT:    movdqa %xmm2, %xmm0184; SSE2-NEXT:    retq185;186; SSSE3-LABEL: usubo_v4i32:187; SSSE3:       # %bb.0:188; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]189; SSSE3-NEXT:    movdqa %xmm0, %xmm3190; SSSE3-NEXT:    pxor %xmm2, %xmm3191; SSSE3-NEXT:    psubd %xmm1, %xmm0192; SSSE3-NEXT:    pxor %xmm0, %xmm2193; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2194; SSSE3-NEXT:    movdqa %xmm0, (%rdi)195; SSSE3-NEXT:    movdqa %xmm2, %xmm0196; SSSE3-NEXT:    retq197;198; SSE41-LABEL: usubo_v4i32:199; SSE41:       # %bb.0:200; SSE41-NEXT:    movdqa %xmm0, %xmm2201; SSE41-NEXT:    psubd %xmm1, %xmm2202; SSE41-NEXT:    pminud %xmm2, %xmm0203; SSE41-NEXT:    pcmpeqd %xmm2, %xmm0204; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1205; SSE41-NEXT:    pxor %xmm1, %xmm0206; SSE41-NEXT:    movdqa %xmm2, (%rdi)207; SSE41-NEXT:    retq208;209; AVX-LABEL: usubo_v4i32:210; AVX:       # %bb.0:211; AVX-NEXT:    vpsubd %xmm1, %xmm0, %xmm1212; AVX-NEXT:    vpminud %xmm0, %xmm1, %xmm0213; AVX-NEXT:    vpcmpeqd %xmm0, %xmm1, %xmm0214; AVX-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2215; AVX-NEXT:    vpxor %xmm2, %xmm0, %xmm0216; AVX-NEXT:    vmovdqa %xmm1, (%rdi)217; AVX-NEXT:    retq218;219; AVX512-LABEL: usubo_v4i32:220; AVX512:       # %bb.0:221; AVX512-NEXT:    vpsubd %xmm1, %xmm0, %xmm1222; AVX512-NEXT:    vpcmpnleud %xmm0, %xmm1, %k1223; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0224; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}225; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)226; AVX512-NEXT:    retq227  %t = call {<4 x i32>, <4 x i1>} @llvm.usub.with.overflow.v4i32(<4 x i32> %a0, <4 x i32> %a1)228  %val = extractvalue {<4 x i32>, <4 x i1>} %t, 0229  %obit = extractvalue {<4 x i32>, <4 x i1>} %t, 1230  %res = sext <4 x i1> %obit to <4 x i32>231  store <4 x i32> %val, ptr %p2232  ret <4 x i32> %res233}234 235define <6 x i32> @usubo_v6i32(<6 x i32> %a0, <6 x i32> %a1, ptr %p2) nounwind {236; SSE2-LABEL: usubo_v6i32:237; SSE2:       # %bb.0:238; SSE2-NEXT:    movq %rdi, %rax239; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero240; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero241; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]242; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero243; SSE2-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero244; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1]245; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm1[0]246; SSE2-NEXT:    movd %r8d, %xmm0247; SSE2-NEXT:    movd %ecx, %xmm1248; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]249; SSE2-NEXT:    movd %edx, %xmm2250; SSE2-NEXT:    movd %esi, %xmm0251; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]252; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]253; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero254; SSE2-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero255; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]256; SSE2-NEXT:    movd %r9d, %xmm1257; SSE2-NEXT:    movd {{.*#+}} xmm4 = mem[0],zero,zero,zero258; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]259; SSE2-NEXT:    movq {{[0-9]+}}(%rsp), %rcx260; SSE2-NEXT:    movdqa %xmm0, %xmm4261; SSE2-NEXT:    psubd %xmm3, %xmm4262; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]263; SSE2-NEXT:    movdqa %xmm4, (%rcx)264; SSE2-NEXT:    pxor %xmm3, %xmm4265; SSE2-NEXT:    pxor %xmm3, %xmm0266; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4267; SSE2-NEXT:    movdqa %xmm1, %xmm0268; SSE2-NEXT:    psubd %xmm2, %xmm0269; SSE2-NEXT:    movq %xmm0, 16(%rcx)270; SSE2-NEXT:    pxor %xmm3, %xmm0271; SSE2-NEXT:    pxor %xmm3, %xmm1272; SSE2-NEXT:    pcmpgtd %xmm1, %xmm0273; SSE2-NEXT:    movq %xmm0, 16(%rdi)274; SSE2-NEXT:    movdqa %xmm4, (%rdi)275; SSE2-NEXT:    retq276;277; SSSE3-LABEL: usubo_v6i32:278; SSSE3:       # %bb.0:279; SSSE3-NEXT:    movq %rdi, %rax280; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero281; SSSE3-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero282; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]283; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero284; SSSE3-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero285; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1]286; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm1[0]287; SSSE3-NEXT:    movd %r8d, %xmm0288; SSSE3-NEXT:    movd %ecx, %xmm1289; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]290; SSSE3-NEXT:    movd %edx, %xmm2291; SSSE3-NEXT:    movd %esi, %xmm0292; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]293; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]294; SSSE3-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero295; SSSE3-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero296; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]297; SSSE3-NEXT:    movd %r9d, %xmm1298; SSSE3-NEXT:    movd {{.*#+}} xmm4 = mem[0],zero,zero,zero299; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]300; SSSE3-NEXT:    movq {{[0-9]+}}(%rsp), %rcx301; SSSE3-NEXT:    movdqa %xmm0, %xmm4302; SSSE3-NEXT:    psubd %xmm3, %xmm4303; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]304; SSSE3-NEXT:    movdqa %xmm4, (%rcx)305; SSSE3-NEXT:    pxor %xmm3, %xmm4306; SSSE3-NEXT:    pxor %xmm3, %xmm0307; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm4308; SSSE3-NEXT:    movdqa %xmm1, %xmm0309; SSSE3-NEXT:    psubd %xmm2, %xmm0310; SSSE3-NEXT:    movq %xmm0, 16(%rcx)311; SSSE3-NEXT:    pxor %xmm3, %xmm0312; SSSE3-NEXT:    pxor %xmm3, %xmm1313; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0314; SSSE3-NEXT:    movq %xmm0, 16(%rdi)315; SSSE3-NEXT:    movdqa %xmm4, (%rdi)316; SSSE3-NEXT:    retq317;318; SSE41-LABEL: usubo_v6i32:319; SSE41:       # %bb.0:320; SSE41-NEXT:    movq %rdi, %rax321; SSE41-NEXT:    movd %esi, %xmm0322; SSE41-NEXT:    pinsrd $1, %edx, %xmm0323; SSE41-NEXT:    pinsrd $2, %ecx, %xmm0324; SSE41-NEXT:    pinsrd $3, %r8d, %xmm0325; SSE41-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero326; SSE41-NEXT:    pinsrd $1, {{[0-9]+}}(%rsp), %xmm1327; SSE41-NEXT:    movd %r9d, %xmm2328; SSE41-NEXT:    pinsrd $1, {{[0-9]+}}(%rsp), %xmm2329; SSE41-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero330; SSE41-NEXT:    pinsrd $1, {{[0-9]+}}(%rsp), %xmm3331; SSE41-NEXT:    pinsrd $2, {{[0-9]+}}(%rsp), %xmm3332; SSE41-NEXT:    pinsrd $3, {{[0-9]+}}(%rsp), %xmm3333; SSE41-NEXT:    movq {{[0-9]+}}(%rsp), %rcx334; SSE41-NEXT:    movdqa %xmm0, %xmm4335; SSE41-NEXT:    psubd %xmm3, %xmm4336; SSE41-NEXT:    pminud %xmm4, %xmm0337; SSE41-NEXT:    pcmpeqd %xmm4, %xmm0338; SSE41-NEXT:    pcmpeqd %xmm3, %xmm3339; SSE41-NEXT:    pxor %xmm3, %xmm0340; SSE41-NEXT:    movdqa %xmm2, %xmm5341; SSE41-NEXT:    psubd %xmm1, %xmm5342; SSE41-NEXT:    pminud %xmm5, %xmm2343; SSE41-NEXT:    pcmpeqd %xmm5, %xmm2344; SSE41-NEXT:    pxor %xmm3, %xmm2345; SSE41-NEXT:    movq %xmm5, 16(%rcx)346; SSE41-NEXT:    movdqa %xmm4, (%rcx)347; SSE41-NEXT:    movq %xmm2, 16(%rdi)348; SSE41-NEXT:    movdqa %xmm0, (%rdi)349; SSE41-NEXT:    retq350;351; AVX1-LABEL: usubo_v6i32:352; AVX1:       # %bb.0:353; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2354; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3355; AVX1-NEXT:    vpsubd %xmm2, %xmm3, %xmm2356; AVX1-NEXT:    vpminud %xmm3, %xmm2, %xmm3357; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm3358; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4359; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3360; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm1361; AVX1-NEXT:    vpminud %xmm0, %xmm1, %xmm0362; AVX1-NEXT:    vpcmpeqd %xmm0, %xmm1, %xmm0363; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0364; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0365; AVX1-NEXT:    vmovq %xmm2, 16(%rdi)366; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)367; AVX1-NEXT:    retq368;369; AVX2-LABEL: usubo_v6i32:370; AVX2:       # %bb.0:371; AVX2-NEXT:    vpsubd %ymm1, %ymm0, %ymm1372; AVX2-NEXT:    vpminud %ymm0, %ymm1, %ymm0373; AVX2-NEXT:    vpcmpeqd %ymm0, %ymm1, %ymm0374; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2375; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0376; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2377; AVX2-NEXT:    vmovq %xmm2, 16(%rdi)378; AVX2-NEXT:    vmovdqa %xmm1, (%rdi)379; AVX2-NEXT:    retq380;381; AVX512-LABEL: usubo_v6i32:382; AVX512:       # %bb.0:383; AVX512-NEXT:    vpsubd %ymm1, %ymm0, %ymm1384; AVX512-NEXT:    vpcmpnleud %ymm0, %ymm1, %k1385; AVX512-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0386; AVX512-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}387; AVX512-NEXT:    vextracti128 $1, %ymm1, %xmm2388; AVX512-NEXT:    vmovq %xmm2, 16(%rdi)389; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)390; AVX512-NEXT:    retq391  %t = call {<6 x i32>, <6 x i1>} @llvm.usub.with.overflow.v6i32(<6 x i32> %a0, <6 x i32> %a1)392  %val = extractvalue {<6 x i32>, <6 x i1>} %t, 0393  %obit = extractvalue {<6 x i32>, <6 x i1>} %t, 1394  %res = sext <6 x i1> %obit to <6 x i32>395  store <6 x i32> %val, ptr %p2396  ret <6 x i32> %res397}398 399define <8 x i32> @usubo_v8i32(<8 x i32> %a0, <8 x i32> %a1, ptr %p2) nounwind {400; SSE2-LABEL: usubo_v8i32:401; SSE2:       # %bb.0:402; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]403; SSE2-NEXT:    movdqa %xmm0, %xmm5404; SSE2-NEXT:    pxor %xmm4, %xmm5405; SSE2-NEXT:    psubd %xmm2, %xmm0406; SSE2-NEXT:    movdqa %xmm0, (%rdi)407; SSE2-NEXT:    pxor %xmm4, %xmm0408; SSE2-NEXT:    pcmpgtd %xmm5, %xmm0409; SSE2-NEXT:    movdqa %xmm1, %xmm2410; SSE2-NEXT:    pxor %xmm4, %xmm2411; SSE2-NEXT:    psubd %xmm3, %xmm1412; SSE2-NEXT:    pxor %xmm1, %xmm4413; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4414; SSE2-NEXT:    movdqa %xmm1, 16(%rdi)415; SSE2-NEXT:    movdqa %xmm4, %xmm1416; SSE2-NEXT:    retq417;418; SSSE3-LABEL: usubo_v8i32:419; SSSE3:       # %bb.0:420; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]421; SSSE3-NEXT:    movdqa %xmm0, %xmm5422; SSSE3-NEXT:    pxor %xmm4, %xmm5423; SSSE3-NEXT:    psubd %xmm2, %xmm0424; SSSE3-NEXT:    movdqa %xmm0, (%rdi)425; SSSE3-NEXT:    pxor %xmm4, %xmm0426; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm0427; SSSE3-NEXT:    movdqa %xmm1, %xmm2428; SSSE3-NEXT:    pxor %xmm4, %xmm2429; SSSE3-NEXT:    psubd %xmm3, %xmm1430; SSSE3-NEXT:    pxor %xmm1, %xmm4431; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4432; SSSE3-NEXT:    movdqa %xmm1, 16(%rdi)433; SSSE3-NEXT:    movdqa %xmm4, %xmm1434; SSSE3-NEXT:    retq435;436; SSE41-LABEL: usubo_v8i32:437; SSE41:       # %bb.0:438; SSE41-NEXT:    movdqa %xmm0, %xmm4439; SSE41-NEXT:    psubd %xmm2, %xmm4440; SSE41-NEXT:    pminud %xmm4, %xmm0441; SSE41-NEXT:    pcmpeqd %xmm4, %xmm0442; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2443; SSE41-NEXT:    pxor %xmm2, %xmm0444; SSE41-NEXT:    movdqa %xmm1, %xmm5445; SSE41-NEXT:    psubd %xmm3, %xmm5446; SSE41-NEXT:    pminud %xmm5, %xmm1447; SSE41-NEXT:    pcmpeqd %xmm5, %xmm1448; SSE41-NEXT:    pxor %xmm2, %xmm1449; SSE41-NEXT:    movdqa %xmm5, 16(%rdi)450; SSE41-NEXT:    movdqa %xmm4, (%rdi)451; SSE41-NEXT:    retq452;453; AVX1-LABEL: usubo_v8i32:454; AVX1:       # %bb.0:455; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2456; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3457; AVX1-NEXT:    vpsubd %xmm2, %xmm3, %xmm2458; AVX1-NEXT:    vpminud %xmm3, %xmm2, %xmm3459; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm3460; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4461; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3462; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm1463; AVX1-NEXT:    vpminud %xmm0, %xmm1, %xmm0464; AVX1-NEXT:    vpcmpeqd %xmm0, %xmm1, %xmm0465; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0466; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0467; AVX1-NEXT:    vmovdqa %xmm2, 16(%rdi)468; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)469; AVX1-NEXT:    retq470;471; AVX2-LABEL: usubo_v8i32:472; AVX2:       # %bb.0:473; AVX2-NEXT:    vpsubd %ymm1, %ymm0, %ymm1474; AVX2-NEXT:    vpminud %ymm0, %ymm1, %ymm0475; AVX2-NEXT:    vpcmpeqd %ymm0, %ymm1, %ymm0476; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2477; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0478; AVX2-NEXT:    vmovdqa %ymm1, (%rdi)479; AVX2-NEXT:    retq480;481; AVX512-LABEL: usubo_v8i32:482; AVX512:       # %bb.0:483; AVX512-NEXT:    vpsubd %ymm1, %ymm0, %ymm1484; AVX512-NEXT:    vpcmpnleud %ymm0, %ymm1, %k1485; AVX512-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0486; AVX512-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}487; AVX512-NEXT:    vmovdqa %ymm1, (%rdi)488; AVX512-NEXT:    retq489  %t = call {<8 x i32>, <8 x i1>} @llvm.usub.with.overflow.v8i32(<8 x i32> %a0, <8 x i32> %a1)490  %val = extractvalue {<8 x i32>, <8 x i1>} %t, 0491  %obit = extractvalue {<8 x i32>, <8 x i1>} %t, 1492  %res = sext <8 x i1> %obit to <8 x i32>493  store <8 x i32> %val, ptr %p2494  ret <8 x i32> %res495}496 497define <16 x i32> @usubo_v16i32(<16 x i32> %a0, <16 x i32> %a1, ptr %p2) nounwind {498; SSE2-LABEL: usubo_v16i32:499; SSE2:       # %bb.0:500; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]501; SSE2-NEXT:    movdqa %xmm0, %xmm9502; SSE2-NEXT:    pxor %xmm8, %xmm9503; SSE2-NEXT:    psubd %xmm4, %xmm0504; SSE2-NEXT:    movdqa %xmm0, (%rdi)505; SSE2-NEXT:    pxor %xmm8, %xmm0506; SSE2-NEXT:    pcmpgtd %xmm9, %xmm0507; SSE2-NEXT:    movdqa %xmm1, %xmm4508; SSE2-NEXT:    pxor %xmm8, %xmm4509; SSE2-NEXT:    psubd %xmm5, %xmm1510; SSE2-NEXT:    movdqa %xmm1, 16(%rdi)511; SSE2-NEXT:    pxor %xmm8, %xmm1512; SSE2-NEXT:    pcmpgtd %xmm4, %xmm1513; SSE2-NEXT:    movdqa %xmm2, %xmm4514; SSE2-NEXT:    pxor %xmm8, %xmm4515; SSE2-NEXT:    psubd %xmm6, %xmm2516; SSE2-NEXT:    movdqa %xmm2, 32(%rdi)517; SSE2-NEXT:    pxor %xmm8, %xmm2518; SSE2-NEXT:    pcmpgtd %xmm4, %xmm2519; SSE2-NEXT:    movdqa %xmm3, %xmm4520; SSE2-NEXT:    pxor %xmm8, %xmm4521; SSE2-NEXT:    psubd %xmm7, %xmm3522; SSE2-NEXT:    pxor %xmm3, %xmm8523; SSE2-NEXT:    pcmpgtd %xmm4, %xmm8524; SSE2-NEXT:    movdqa %xmm3, 48(%rdi)525; SSE2-NEXT:    movdqa %xmm8, %xmm3526; SSE2-NEXT:    retq527;528; SSSE3-LABEL: usubo_v16i32:529; SSSE3:       # %bb.0:530; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]531; SSSE3-NEXT:    movdqa %xmm0, %xmm9532; SSSE3-NEXT:    pxor %xmm8, %xmm9533; SSSE3-NEXT:    psubd %xmm4, %xmm0534; SSSE3-NEXT:    movdqa %xmm0, (%rdi)535; SSSE3-NEXT:    pxor %xmm8, %xmm0536; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm0537; SSSE3-NEXT:    movdqa %xmm1, %xmm4538; SSSE3-NEXT:    pxor %xmm8, %xmm4539; SSSE3-NEXT:    psubd %xmm5, %xmm1540; SSSE3-NEXT:    movdqa %xmm1, 16(%rdi)541; SSSE3-NEXT:    pxor %xmm8, %xmm1542; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm1543; SSSE3-NEXT:    movdqa %xmm2, %xmm4544; SSSE3-NEXT:    pxor %xmm8, %xmm4545; SSSE3-NEXT:    psubd %xmm6, %xmm2546; SSSE3-NEXT:    movdqa %xmm2, 32(%rdi)547; SSSE3-NEXT:    pxor %xmm8, %xmm2548; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm2549; SSSE3-NEXT:    movdqa %xmm3, %xmm4550; SSSE3-NEXT:    pxor %xmm8, %xmm4551; SSSE3-NEXT:    psubd %xmm7, %xmm3552; SSSE3-NEXT:    pxor %xmm3, %xmm8553; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm8554; SSSE3-NEXT:    movdqa %xmm3, 48(%rdi)555; SSSE3-NEXT:    movdqa %xmm8, %xmm3556; SSSE3-NEXT:    retq557;558; SSE41-LABEL: usubo_v16i32:559; SSE41:       # %bb.0:560; SSE41-NEXT:    movdqa %xmm0, %xmm8561; SSE41-NEXT:    psubd %xmm4, %xmm8562; SSE41-NEXT:    pminud %xmm8, %xmm0563; SSE41-NEXT:    pcmpeqd %xmm8, %xmm0564; SSE41-NEXT:    pcmpeqd %xmm4, %xmm4565; SSE41-NEXT:    pxor %xmm4, %xmm0566; SSE41-NEXT:    movdqa %xmm1, %xmm9567; SSE41-NEXT:    psubd %xmm5, %xmm9568; SSE41-NEXT:    pminud %xmm9, %xmm1569; SSE41-NEXT:    pcmpeqd %xmm9, %xmm1570; SSE41-NEXT:    pxor %xmm4, %xmm1571; SSE41-NEXT:    movdqa %xmm2, %xmm5572; SSE41-NEXT:    psubd %xmm6, %xmm5573; SSE41-NEXT:    pminud %xmm5, %xmm2574; SSE41-NEXT:    pcmpeqd %xmm5, %xmm2575; SSE41-NEXT:    pxor %xmm4, %xmm2576; SSE41-NEXT:    movdqa %xmm3, %xmm6577; SSE41-NEXT:    psubd %xmm7, %xmm6578; SSE41-NEXT:    pminud %xmm6, %xmm3579; SSE41-NEXT:    pcmpeqd %xmm6, %xmm3580; SSE41-NEXT:    pxor %xmm4, %xmm3581; SSE41-NEXT:    movdqa %xmm6, 48(%rdi)582; SSE41-NEXT:    movdqa %xmm5, 32(%rdi)583; SSE41-NEXT:    movdqa %xmm9, 16(%rdi)584; SSE41-NEXT:    movdqa %xmm8, (%rdi)585; SSE41-NEXT:    retq586;587; AVX1-LABEL: usubo_v16i32:588; AVX1:       # %bb.0:589; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4590; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5591; AVX1-NEXT:    vpsubd %xmm4, %xmm5, %xmm4592; AVX1-NEXT:    vpminud %xmm5, %xmm4, %xmm5593; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm4, %xmm5594; AVX1-NEXT:    vpsubd %xmm3, %xmm1, %xmm3595; AVX1-NEXT:    vpminud %xmm1, %xmm3, %xmm1596; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm3, %xmm1597; AVX1-NEXT:    vpackssdw %xmm5, %xmm1, %xmm1598; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5599; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6600; AVX1-NEXT:    vpsubd %xmm5, %xmm6, %xmm5601; AVX1-NEXT:    vpminud %xmm6, %xmm5, %xmm6602; AVX1-NEXT:    vpcmpeqd %xmm6, %xmm5, %xmm6603; AVX1-NEXT:    vpsubd %xmm2, %xmm0, %xmm2604; AVX1-NEXT:    vpminud %xmm0, %xmm2, %xmm0605; AVX1-NEXT:    vpcmpeqd %xmm0, %xmm2, %xmm0606; AVX1-NEXT:    vpackssdw %xmm6, %xmm0, %xmm0607; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0608; AVX1-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6609; AVX1-NEXT:    vpxor %xmm6, %xmm0, %xmm0610; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm7611; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]612; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0613; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm7, %ymm0614; AVX1-NEXT:    vpacksswb %xmm1, %xmm1, %xmm1615; AVX1-NEXT:    vpxor %xmm6, %xmm1, %xmm1616; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm6617; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]618; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1619; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm6, %ymm1620; AVX1-NEXT:    vmovdqa %xmm4, 48(%rdi)621; AVX1-NEXT:    vmovdqa %xmm3, 32(%rdi)622; AVX1-NEXT:    vmovdqa %xmm5, 16(%rdi)623; AVX1-NEXT:    vmovdqa %xmm2, (%rdi)624; AVX1-NEXT:    retq625;626; AVX2-LABEL: usubo_v16i32:627; AVX2:       # %bb.0:628; AVX2-NEXT:    vpsubd %ymm3, %ymm1, %ymm3629; AVX2-NEXT:    vpminud %ymm1, %ymm3, %ymm1630; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm3, %ymm1631; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4632; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm1633; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm5634; AVX2-NEXT:    vpackssdw %xmm5, %xmm1, %xmm1635; AVX2-NEXT:    vpsubd %ymm2, %ymm0, %ymm2636; AVX2-NEXT:    vpminud %ymm0, %ymm2, %ymm0637; AVX2-NEXT:    vpcmpeqd %ymm0, %ymm2, %ymm0638; AVX2-NEXT:    vpacksswb %xmm1, %xmm1, %xmm1639; AVX2-NEXT:    vpmovsxbd %xmm1, %ymm1640; 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]641; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm0642; AVX2-NEXT:    vmovdqa %ymm3, 32(%rdi)643; AVX2-NEXT:    vmovdqa %ymm2, (%rdi)644; AVX2-NEXT:    retq645;646; AVX512-LABEL: usubo_v16i32:647; AVX512:       # %bb.0:648; AVX512-NEXT:    vpsubd %zmm1, %zmm0, %zmm1649; AVX512-NEXT:    vpcmpnleud %zmm0, %zmm1, %k1650; AVX512-NEXT:    vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1651; AVX512-NEXT:    vmovdqa64 %zmm1, (%rdi)652; AVX512-NEXT:    retq653  %t = call {<16 x i32>, <16 x i1>} @llvm.usub.with.overflow.v16i32(<16 x i32> %a0, <16 x i32> %a1)654  %val = extractvalue {<16 x i32>, <16 x i1>} %t, 0655  %obit = extractvalue {<16 x i32>, <16 x i1>} %t, 1656  %res = sext <16 x i1> %obit to <16 x i32>657  store <16 x i32> %val, ptr %p2658  ret <16 x i32> %res659}660 661define <16 x i32> @usubo_v16i8(<16 x i8> %a0, <16 x i8> %a1, ptr %p2) nounwind {662; SSE2-LABEL: usubo_v16i8:663; SSE2:       # %bb.0:664; SSE2-NEXT:    movdqa %xmm0, %xmm4665; SSE2-NEXT:    psubb %xmm1, %xmm4666; SSE2-NEXT:    pminub %xmm4, %xmm0667; SSE2-NEXT:    pcmpeqb %xmm4, %xmm0668; SSE2-NEXT:    pcmpeqd %xmm3, %xmm3669; SSE2-NEXT:    pxor %xmm0, %xmm3670; SSE2-NEXT:    movdqa %xmm3, %xmm0671; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]672; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]673; SSE2-NEXT:    movdqa %xmm3, %xmm1674; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]675; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]676; SSE2-NEXT:    pslld $31, %xmm1677; SSE2-NEXT:    psrad $31, %xmm1678; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]679; SSE2-NEXT:    movdqa %xmm3, %xmm2680; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]681; SSE2-NEXT:    pslld $31, %xmm2682; SSE2-NEXT:    psrad $31, %xmm2683; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]684; SSE2-NEXT:    pslld $31, %xmm3685; SSE2-NEXT:    psrad $31, %xmm3686; SSE2-NEXT:    movdqa %xmm4, (%rdi)687; SSE2-NEXT:    retq688;689; SSSE3-LABEL: usubo_v16i8:690; SSSE3:       # %bb.0:691; SSSE3-NEXT:    movdqa %xmm0, %xmm4692; SSSE3-NEXT:    psubb %xmm1, %xmm4693; SSSE3-NEXT:    pminub %xmm4, %xmm0694; SSSE3-NEXT:    pcmpeqb %xmm4, %xmm0695; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm3696; SSSE3-NEXT:    pxor %xmm0, %xmm3697; SSSE3-NEXT:    movdqa %xmm3, %xmm0698; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]699; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]700; SSSE3-NEXT:    movdqa %xmm3, %xmm1701; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]702; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]703; SSSE3-NEXT:    pslld $31, %xmm1704; SSSE3-NEXT:    psrad $31, %xmm1705; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]706; SSSE3-NEXT:    movdqa %xmm3, %xmm2707; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]708; SSSE3-NEXT:    pslld $31, %xmm2709; SSSE3-NEXT:    psrad $31, %xmm2710; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]711; SSSE3-NEXT:    pslld $31, %xmm3712; SSSE3-NEXT:    psrad $31, %xmm3713; SSSE3-NEXT:    movdqa %xmm4, (%rdi)714; SSSE3-NEXT:    retq715;716; SSE41-LABEL: usubo_v16i8:717; SSE41:       # %bb.0:718; SSE41-NEXT:    movdqa %xmm0, %xmm4719; SSE41-NEXT:    psubb %xmm1, %xmm4720; SSE41-NEXT:    pminub %xmm4, %xmm0721; SSE41-NEXT:    pcmpeqb %xmm4, %xmm0722; SSE41-NEXT:    pcmpeqd %xmm3, %xmm3723; SSE41-NEXT:    pxor %xmm0, %xmm3724; SSE41-NEXT:    pmovsxbd %xmm3, %xmm0725; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,1,1]726; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero727; SSE41-NEXT:    pslld $31, %xmm1728; SSE41-NEXT:    psrad $31, %xmm1729; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,2,3]730; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero731; SSE41-NEXT:    pslld $31, %xmm2732; SSE41-NEXT:    psrad $31, %xmm2733; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[3,3,3,3]734; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero735; SSE41-NEXT:    pslld $31, %xmm3736; SSE41-NEXT:    psrad $31, %xmm3737; SSE41-NEXT:    movdqa %xmm4, (%rdi)738; SSE41-NEXT:    retq739;740; AVX1-LABEL: usubo_v16i8:741; AVX1:       # %bb.0:742; AVX1-NEXT:    vpsubb %xmm1, %xmm0, %xmm2743; AVX1-NEXT:    vpminub %xmm0, %xmm2, %xmm0744; AVX1-NEXT:    vpcmpeqb %xmm0, %xmm2, %xmm0745; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1746; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm1747; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm0748; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[1,1,1,1]749; AVX1-NEXT:    vpmovsxbd %xmm3, %xmm3750; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0751; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]752; AVX1-NEXT:    vpmovsxbd %xmm3, %xmm3753; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[3,3,3,3]754; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1755; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm3, %ymm1756; AVX1-NEXT:    vmovdqa %xmm2, (%rdi)757; AVX1-NEXT:    retq758;759; AVX2-LABEL: usubo_v16i8:760; AVX2:       # %bb.0:761; AVX2-NEXT:    vpsubb %xmm1, %xmm0, %xmm2762; AVX2-NEXT:    vpminub %xmm0, %xmm2, %xmm0763; AVX2-NEXT:    vpcmpeqb %xmm0, %xmm2, %xmm0764; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1765; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm1766; AVX2-NEXT:    vpmovsxbd %xmm1, %ymm0767; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]768; AVX2-NEXT:    vpmovsxbd %xmm1, %ymm1769; AVX2-NEXT:    vmovdqa %xmm2, (%rdi)770; AVX2-NEXT:    retq771;772; AVX512-LABEL: usubo_v16i8:773; AVX512:       # %bb.0:774; AVX512-NEXT:    vpsubb %xmm1, %xmm0, %xmm1775; AVX512-NEXT:    vpcmpnleub %xmm0, %xmm1, %k1776; AVX512-NEXT:    vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1777; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)778; AVX512-NEXT:    retq779  %t = call {<16 x i8>, <16 x i1>} @llvm.usub.with.overflow.v16i8(<16 x i8> %a0, <16 x i8> %a1)780  %val = extractvalue {<16 x i8>, <16 x i1>} %t, 0781  %obit = extractvalue {<16 x i8>, <16 x i1>} %t, 1782  %res = sext <16 x i1> %obit to <16 x i32>783  store <16 x i8> %val, ptr %p2784  ret <16 x i32> %res785}786 787define <8 x i32> @usubo_v8i16(<8 x i16> %a0, <8 x i16> %a1, ptr %p2) nounwind {788; SSE2-LABEL: usubo_v8i16:789; SSE2:       # %bb.0:790; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]791; SSE2-NEXT:    movdqa %xmm0, %xmm3792; SSE2-NEXT:    pxor %xmm2, %xmm3793; SSE2-NEXT:    psubw %xmm1, %xmm0794; SSE2-NEXT:    pxor %xmm0, %xmm2795; SSE2-NEXT:    pcmpgtw %xmm3, %xmm2796; SSE2-NEXT:    movdqa %xmm2, %xmm1797; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]798; SSE2-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]799; SSE2-NEXT:    pslld $31, %xmm2800; SSE2-NEXT:    psrad $31, %xmm2801; SSE2-NEXT:    movdqa %xmm0, (%rdi)802; SSE2-NEXT:    movdqa %xmm1, %xmm0803; SSE2-NEXT:    movdqa %xmm2, %xmm1804; SSE2-NEXT:    retq805;806; SSSE3-LABEL: usubo_v8i16:807; SSSE3:       # %bb.0:808; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]809; SSSE3-NEXT:    movdqa %xmm0, %xmm3810; SSSE3-NEXT:    pxor %xmm2, %xmm3811; SSSE3-NEXT:    psubw %xmm1, %xmm0812; SSSE3-NEXT:    pxor %xmm0, %xmm2813; SSSE3-NEXT:    pcmpgtw %xmm3, %xmm2814; SSSE3-NEXT:    movdqa %xmm2, %xmm1815; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]816; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]817; SSSE3-NEXT:    pslld $31, %xmm2818; SSSE3-NEXT:    psrad $31, %xmm2819; SSSE3-NEXT:    movdqa %xmm0, (%rdi)820; SSSE3-NEXT:    movdqa %xmm1, %xmm0821; SSSE3-NEXT:    movdqa %xmm2, %xmm1822; SSSE3-NEXT:    retq823;824; SSE41-LABEL: usubo_v8i16:825; SSE41:       # %bb.0:826; SSE41-NEXT:    movdqa %xmm0, %xmm2827; SSE41-NEXT:    psubw %xmm1, %xmm2828; SSE41-NEXT:    pminuw %xmm2, %xmm0829; SSE41-NEXT:    pcmpeqw %xmm2, %xmm0830; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1831; SSE41-NEXT:    pxor %xmm0, %xmm1832; SSE41-NEXT:    pmovsxwd %xmm1, %xmm0833; SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]834; SSE41-NEXT:    pslld $31, %xmm1835; SSE41-NEXT:    psrad $31, %xmm1836; SSE41-NEXT:    movdqa %xmm2, (%rdi)837; SSE41-NEXT:    retq838;839; AVX1-LABEL: usubo_v8i16:840; AVX1:       # %bb.0:841; AVX1-NEXT:    vpsubw %xmm1, %xmm0, %xmm1842; AVX1-NEXT:    vpminuw %xmm0, %xmm1, %xmm0843; AVX1-NEXT:    vpcmpeqw %xmm0, %xmm1, %xmm0844; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2845; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0846; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm2847; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]848; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0849; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)850; AVX1-NEXT:    retq851;852; AVX2-LABEL: usubo_v8i16:853; AVX2:       # %bb.0:854; AVX2-NEXT:    vpsubw %xmm1, %xmm0, %xmm1855; AVX2-NEXT:    vpminuw %xmm0, %xmm1, %xmm0856; AVX2-NEXT:    vpcmpeqw %xmm0, %xmm1, %xmm0857; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2858; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0859; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0860; AVX2-NEXT:    vmovdqa %xmm1, (%rdi)861; AVX2-NEXT:    retq862;863; AVX512-LABEL: usubo_v8i16:864; AVX512:       # %bb.0:865; AVX512-NEXT:    vpsubw %xmm1, %xmm0, %xmm1866; AVX512-NEXT:    vpcmpnleuw %xmm0, %xmm1, %k1867; AVX512-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0868; AVX512-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}869; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)870; AVX512-NEXT:    retq871  %t = call {<8 x i16>, <8 x i1>} @llvm.usub.with.overflow.v8i16(<8 x i16> %a0, <8 x i16> %a1)872  %val = extractvalue {<8 x i16>, <8 x i1>} %t, 0873  %obit = extractvalue {<8 x i16>, <8 x i1>} %t, 1874  %res = sext <8 x i1> %obit to <8 x i32>875  store <8 x i16> %val, ptr %p2876  ret <8 x i32> %res877}878 879define <2 x i32> @usubo_v2i64(<2 x i64> %a0, <2 x i64> %a1, ptr %p2) nounwind {880; SSE-LABEL: usubo_v2i64:881; SSE:       # %bb.0:882; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]883; SSE-NEXT:    movdqa %xmm0, %xmm3884; SSE-NEXT:    pxor %xmm2, %xmm3885; SSE-NEXT:    psubq %xmm1, %xmm0886; SSE-NEXT:    pxor %xmm0, %xmm2887; SSE-NEXT:    movdqa %xmm2, %xmm1888; SSE-NEXT:    pcmpeqd %xmm3, %xmm1889; SSE-NEXT:    pcmpgtd %xmm3, %xmm2890; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,2,2,3]891; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,3,3,3]892; SSE-NEXT:    pand %xmm3, %xmm4893; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,3,3,3]894; SSE-NEXT:    por %xmm4, %xmm1895; SSE-NEXT:    movdqa %xmm0, (%rdi)896; SSE-NEXT:    movdqa %xmm1, %xmm0897; SSE-NEXT:    retq898;899; AVX1-LABEL: usubo_v2i64:900; AVX1:       # %bb.0:901; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]902; AVX1-NEXT:    # xmm2 = mem[0,0]903; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm3904; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm1905; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm0906; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm0, %xmm0907; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]908; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)909; AVX1-NEXT:    retq910;911; AVX2-LABEL: usubo_v2i64:912; AVX2:       # %bb.0:913; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]914; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3915; AVX2-NEXT:    vpsubq %xmm1, %xmm0, %xmm1916; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm0917; AVX2-NEXT:    vpcmpgtq %xmm3, %xmm0, %xmm0918; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]919; AVX2-NEXT:    vmovdqa %xmm1, (%rdi)920; AVX2-NEXT:    retq921;922; AVX512-LABEL: usubo_v2i64:923; AVX512:       # %bb.0:924; AVX512-NEXT:    vpsubq %xmm1, %xmm0, %xmm1925; AVX512-NEXT:    vpcmpnleuq %xmm0, %xmm1, %k1926; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0927; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}928; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)929; AVX512-NEXT:    retq930  %t = call {<2 x i64>, <2 x i1>} @llvm.usub.with.overflow.v2i64(<2 x i64> %a0, <2 x i64> %a1)931  %val = extractvalue {<2 x i64>, <2 x i1>} %t, 0932  %obit = extractvalue {<2 x i64>, <2 x i1>} %t, 1933  %res = sext <2 x i1> %obit to <2 x i32>934  store <2 x i64> %val, ptr %p2935  ret <2 x i32> %res936}937 938define <4 x i32> @usubo_v4i24(<4 x i24> %a0, <4 x i24> %a1, ptr %p2) nounwind {939; SSE2-LABEL: usubo_v4i24:940; SSE2:       # %bb.0:941; SSE2-NEXT:    movdqa %xmm0, %xmm2942; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]943; SSE2-NEXT:    pand %xmm3, %xmm1944; SSE2-NEXT:    pand %xmm3, %xmm2945; SSE2-NEXT:    psubd %xmm1, %xmm2946; SSE2-NEXT:    pand %xmm2, %xmm3947; SSE2-NEXT:    pcmpeqd %xmm2, %xmm3948; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0949; SSE2-NEXT:    pxor %xmm3, %xmm0950; SSE2-NEXT:    movd %xmm2, %eax951; SSE2-NEXT:    movw %ax, (%rdi)952; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[3,3,3,3]953; SSE2-NEXT:    movd %xmm1, %ecx954; SSE2-NEXT:    movw %cx, 9(%rdi)955; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]956; SSE2-NEXT:    movd %xmm1, %edx957; SSE2-NEXT:    movw %dx, 6(%rdi)958; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,1,1]959; SSE2-NEXT:    movd %xmm1, %esi960; SSE2-NEXT:    movw %si, 3(%rdi)961; SSE2-NEXT:    shrl $16, %eax962; SSE2-NEXT:    movb %al, 2(%rdi)963; SSE2-NEXT:    shrl $16, %ecx964; SSE2-NEXT:    movb %cl, 11(%rdi)965; SSE2-NEXT:    shrl $16, %edx966; SSE2-NEXT:    movb %dl, 8(%rdi)967; SSE2-NEXT:    shrl $16, %esi968; SSE2-NEXT:    movb %sil, 5(%rdi)969; SSE2-NEXT:    retq970;971; SSSE3-LABEL: usubo_v4i24:972; SSSE3:       # %bb.0:973; SSSE3-NEXT:    movdqa %xmm0, %xmm2974; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]975; SSSE3-NEXT:    pand %xmm3, %xmm1976; SSSE3-NEXT:    pand %xmm3, %xmm2977; SSSE3-NEXT:    psubd %xmm1, %xmm2978; SSSE3-NEXT:    pand %xmm2, %xmm3979; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm3980; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm0981; SSSE3-NEXT:    pxor %xmm3, %xmm0982; SSSE3-NEXT:    movd %xmm2, %eax983; SSSE3-NEXT:    movw %ax, (%rdi)984; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[3,3,3,3]985; SSSE3-NEXT:    movd %xmm1, %ecx986; SSSE3-NEXT:    movw %cx, 9(%rdi)987; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]988; SSSE3-NEXT:    movd %xmm1, %edx989; SSSE3-NEXT:    movw %dx, 6(%rdi)990; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,1,1]991; SSSE3-NEXT:    movd %xmm1, %esi992; SSSE3-NEXT:    movw %si, 3(%rdi)993; SSSE3-NEXT:    shrl $16, %eax994; SSSE3-NEXT:    movb %al, 2(%rdi)995; SSSE3-NEXT:    shrl $16, %ecx996; SSSE3-NEXT:    movb %cl, 11(%rdi)997; SSSE3-NEXT:    shrl $16, %edx998; SSSE3-NEXT:    movb %dl, 8(%rdi)999; SSSE3-NEXT:    shrl $16, %esi1000; SSSE3-NEXT:    movb %sil, 5(%rdi)1001; SSSE3-NEXT:    retq1002;1003; SSE41-LABEL: usubo_v4i24:1004; SSE41:       # %bb.0:1005; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]1006; SSE41-NEXT:    pand %xmm2, %xmm11007; SSE41-NEXT:    pand %xmm2, %xmm01008; SSE41-NEXT:    psubd %xmm1, %xmm01009; SSE41-NEXT:    pand %xmm0, %xmm21010; SSE41-NEXT:    pcmpeqd %xmm0, %xmm21011; SSE41-NEXT:    pcmpeqd %xmm1, %xmm11012; SSE41-NEXT:    pxor %xmm2, %xmm11013; SSE41-NEXT:    pextrd $3, %xmm0, %eax1014; SSE41-NEXT:    movw %ax, 9(%rdi)1015; SSE41-NEXT:    pextrd $2, %xmm0, %ecx1016; SSE41-NEXT:    movw %cx, 6(%rdi)1017; SSE41-NEXT:    pextrd $1, %xmm0, %edx1018; SSE41-NEXT:    movw %dx, 3(%rdi)1019; SSE41-NEXT:    movd %xmm0, %esi1020; SSE41-NEXT:    movw %si, (%rdi)1021; SSE41-NEXT:    shrl $16, %eax1022; SSE41-NEXT:    movb %al, 11(%rdi)1023; SSE41-NEXT:    shrl $16, %ecx1024; SSE41-NEXT:    movb %cl, 8(%rdi)1025; SSE41-NEXT:    shrl $16, %edx1026; SSE41-NEXT:    movb %dl, 5(%rdi)1027; SSE41-NEXT:    shrl $16, %esi1028; SSE41-NEXT:    movb %sil, 2(%rdi)1029; SSE41-NEXT:    movdqa %xmm1, %xmm01030; SSE41-NEXT:    retq1031;1032; AVX1-LABEL: usubo_v4i24:1033; AVX1:       # %bb.0:1034; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]1035; AVX1-NEXT:    vandps %xmm2, %xmm1, %xmm11036; AVX1-NEXT:    vandps %xmm2, %xmm0, %xmm01037; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm11038; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm01039; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm01040; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm21041; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm01042; AVX1-NEXT:    vpextrd $3, %xmm1, %eax1043; AVX1-NEXT:    movw %ax, 9(%rdi)1044; AVX1-NEXT:    vpextrd $2, %xmm1, %ecx1045; AVX1-NEXT:    movw %cx, 6(%rdi)1046; AVX1-NEXT:    vpextrd $1, %xmm1, %edx1047; AVX1-NEXT:    movw %dx, 3(%rdi)1048; AVX1-NEXT:    vmovd %xmm1, %esi1049; AVX1-NEXT:    movw %si, (%rdi)1050; AVX1-NEXT:    shrl $16, %eax1051; AVX1-NEXT:    movb %al, 11(%rdi)1052; AVX1-NEXT:    shrl $16, %ecx1053; AVX1-NEXT:    movb %cl, 8(%rdi)1054; AVX1-NEXT:    shrl $16, %edx1055; AVX1-NEXT:    movb %dl, 5(%rdi)1056; AVX1-NEXT:    shrl $16, %esi1057; AVX1-NEXT:    movb %sil, 2(%rdi)1058; AVX1-NEXT:    retq1059;1060; AVX2-LABEL: usubo_v4i24:1061; AVX2:       # %bb.0:1062; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]1063; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm11064; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm01065; AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm11066; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm01067; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm01068; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm21069; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm01070; AVX2-NEXT:    vpextrd $3, %xmm1, %eax1071; AVX2-NEXT:    movw %ax, 9(%rdi)1072; AVX2-NEXT:    vpextrd $2, %xmm1, %ecx1073; AVX2-NEXT:    movw %cx, 6(%rdi)1074; AVX2-NEXT:    vpextrd $1, %xmm1, %edx1075; AVX2-NEXT:    movw %dx, 3(%rdi)1076; AVX2-NEXT:    vmovd %xmm1, %esi1077; AVX2-NEXT:    movw %si, (%rdi)1078; AVX2-NEXT:    shrl $16, %eax1079; AVX2-NEXT:    movb %al, 11(%rdi)1080; AVX2-NEXT:    shrl $16, %ecx1081; AVX2-NEXT:    movb %cl, 8(%rdi)1082; AVX2-NEXT:    shrl $16, %edx1083; AVX2-NEXT:    movb %dl, 5(%rdi)1084; AVX2-NEXT:    shrl $16, %esi1085; AVX2-NEXT:    movb %sil, 2(%rdi)1086; AVX2-NEXT:    retq1087;1088; AVX512-LABEL: usubo_v4i24:1089; AVX512:       # %bb.0:1090; AVX512-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]1091; AVX512-NEXT:    vpand %xmm2, %xmm1, %xmm11092; AVX512-NEXT:    vpand %xmm2, %xmm0, %xmm01093; AVX512-NEXT:    vpsubd %xmm1, %xmm0, %xmm11094; AVX512-NEXT:    vpand %xmm2, %xmm1, %xmm01095; AVX512-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm01096; AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm01097; AVX512-NEXT:    vpextrd $3, %xmm1, %eax1098; AVX512-NEXT:    movw %ax, 9(%rdi)1099; AVX512-NEXT:    vpextrd $2, %xmm1, %ecx1100; AVX512-NEXT:    movw %cx, 6(%rdi)1101; AVX512-NEXT:    vpextrd $1, %xmm1, %edx1102; AVX512-NEXT:    movw %dx, 3(%rdi)1103; AVX512-NEXT:    vmovd %xmm1, %esi1104; AVX512-NEXT:    movw %si, (%rdi)1105; AVX512-NEXT:    shrl $16, %eax1106; AVX512-NEXT:    movb %al, 11(%rdi)1107; AVX512-NEXT:    shrl $16, %ecx1108; AVX512-NEXT:    movb %cl, 8(%rdi)1109; AVX512-NEXT:    shrl $16, %edx1110; AVX512-NEXT:    movb %dl, 5(%rdi)1111; AVX512-NEXT:    shrl $16, %esi1112; AVX512-NEXT:    movb %sil, 2(%rdi)1113; AVX512-NEXT:    retq1114  %t = call {<4 x i24>, <4 x i1>} @llvm.usub.with.overflow.v4i24(<4 x i24> %a0, <4 x i24> %a1)1115  %val = extractvalue {<4 x i24>, <4 x i1>} %t, 01116  %obit = extractvalue {<4 x i24>, <4 x i1>} %t, 11117  %res = sext <4 x i1> %obit to <4 x i32>1118  store <4 x i24> %val, ptr %p21119  ret <4 x i32> %res1120}1121 1122define <4 x i32> @usubo_v4i1(<4 x i1> %a0, <4 x i1> %a1, ptr %p2) nounwind {1123; SSE-LABEL: usubo_v4i1:1124; SSE:       # %bb.0:1125; SSE-NEXT:    movdqa %xmm0, %xmm21126; SSE-NEXT:    pxor %xmm1, %xmm21127; SSE-NEXT:    pslld $31, %xmm21128; SSE-NEXT:    movmskps %xmm2, %eax1129; SSE-NEXT:    pandn %xmm1, %xmm01130; SSE-NEXT:    pslld $31, %xmm01131; SSE-NEXT:    psrad $31, %xmm01132; SSE-NEXT:    movb %al, (%rdi)1133; SSE-NEXT:    retq1134;1135; AVX-LABEL: usubo_v4i1:1136; AVX:       # %bb.0:1137; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm21138; AVX-NEXT:    vpslld $31, %xmm2, %xmm21139; AVX-NEXT:    vmovmskps %xmm2, %eax1140; AVX-NEXT:    vpandn %xmm1, %xmm0, %xmm01141; AVX-NEXT:    vpslld $31, %xmm0, %xmm01142; AVX-NEXT:    vpsrad $31, %xmm0, %xmm01143; AVX-NEXT:    movb %al, (%rdi)1144; AVX-NEXT:    retq1145;1146; AVX512-LABEL: usubo_v4i1:1147; AVX512:       # %bb.0:1148; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm21149; AVX512-NEXT:    vpslld $31, %xmm2, %xmm21150; AVX512-NEXT:    vptestmd %xmm2, %xmm2, %k01151; AVX512-NEXT:    vpandn %xmm1, %xmm0, %xmm01152; AVX512-NEXT:    vpslld $31, %xmm0, %xmm01153; AVX512-NEXT:    vpsrad $31, %xmm0, %xmm01154; AVX512-NEXT:    kmovd %k0, %eax1155; AVX512-NEXT:    movb %al, (%rdi)1156; AVX512-NEXT:    retq1157  %t = call {<4 x i1>, <4 x i1>} @llvm.usub.with.overflow.v4i1(<4 x i1> %a0, <4 x i1> %a1)1158  %val = extractvalue {<4 x i1>, <4 x i1>} %t, 01159  %obit = extractvalue {<4 x i1>, <4 x i1>} %t, 11160  %res = sext <4 x i1> %obit to <4 x i32>1161  store <4 x i1> %val, ptr %p21162  ret <4 x i32> %res1163}1164 1165define <2 x i32> @usubo_v2i128(<2 x i128> %a0, <2 x i128> %a1, ptr %p2) nounwind {1166; SSE2-LABEL: usubo_v2i128:1167; SSE2:       # %bb.0:1168; SSE2-NEXT:    movq {{[0-9]+}}(%rsp), %rax1169; SSE2-NEXT:    xorl %r10d, %r10d1170; SSE2-NEXT:    subq {{[0-9]+}}(%rsp), %rdx1171; SSE2-NEXT:    sbbq {{[0-9]+}}(%rsp), %rcx1172; SSE2-NEXT:    movl $0, %r11d1173; SSE2-NEXT:    sbbl %r11d, %r11d1174; SSE2-NEXT:    subq %r8, %rdi1175; SSE2-NEXT:    sbbq %r9, %rsi1176; SSE2-NEXT:    movd %r11d, %xmm11177; SSE2-NEXT:    sbbl %r10d, %r10d1178; SSE2-NEXT:    movd %r10d, %xmm01179; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1180; SSE2-NEXT:    movq %rdx, 16(%rax)1181; SSE2-NEXT:    movq %rdi, (%rax)1182; SSE2-NEXT:    movq %rcx, 24(%rax)1183; SSE2-NEXT:    movq %rsi, 8(%rax)1184; SSE2-NEXT:    retq1185;1186; SSSE3-LABEL: usubo_v2i128:1187; SSSE3:       # %bb.0:1188; SSSE3-NEXT:    movq {{[0-9]+}}(%rsp), %rax1189; SSSE3-NEXT:    xorl %r10d, %r10d1190; SSSE3-NEXT:    subq {{[0-9]+}}(%rsp), %rdx1191; SSSE3-NEXT:    sbbq {{[0-9]+}}(%rsp), %rcx1192; SSSE3-NEXT:    movl $0, %r11d1193; SSSE3-NEXT:    sbbl %r11d, %r11d1194; SSSE3-NEXT:    subq %r8, %rdi1195; SSSE3-NEXT:    sbbq %r9, %rsi1196; SSSE3-NEXT:    movd %r11d, %xmm11197; SSSE3-NEXT:    sbbl %r10d, %r10d1198; SSSE3-NEXT:    movd %r10d, %xmm01199; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1200; SSSE3-NEXT:    movq %rdx, 16(%rax)1201; SSSE3-NEXT:    movq %rdi, (%rax)1202; SSSE3-NEXT:    movq %rcx, 24(%rax)1203; SSSE3-NEXT:    movq %rsi, 8(%rax)1204; SSSE3-NEXT:    retq1205;1206; SSE41-LABEL: usubo_v2i128:1207; SSE41:       # %bb.0:1208; SSE41-NEXT:    movq {{[0-9]+}}(%rsp), %rax1209; SSE41-NEXT:    xorl %r10d, %r10d1210; SSE41-NEXT:    subq {{[0-9]+}}(%rsp), %rdx1211; SSE41-NEXT:    sbbq {{[0-9]+}}(%rsp), %rcx1212; SSE41-NEXT:    movl $0, %r11d1213; SSE41-NEXT:    sbbl %r11d, %r11d1214; SSE41-NEXT:    subq %r8, %rdi1215; SSE41-NEXT:    sbbq %r9, %rsi1216; SSE41-NEXT:    sbbl %r10d, %r10d1217; SSE41-NEXT:    movd %r10d, %xmm01218; SSE41-NEXT:    pinsrd $1, %r11d, %xmm01219; SSE41-NEXT:    movq %rdx, 16(%rax)1220; SSE41-NEXT:    movq %rdi, (%rax)1221; SSE41-NEXT:    movq %rcx, 24(%rax)1222; SSE41-NEXT:    movq %rsi, 8(%rax)1223; SSE41-NEXT:    retq1224;1225; AVX-LABEL: usubo_v2i128:1226; AVX:       # %bb.0:1227; AVX-NEXT:    movq {{[0-9]+}}(%rsp), %rax1228; AVX-NEXT:    xorl %r10d, %r10d1229; AVX-NEXT:    subq {{[0-9]+}}(%rsp), %rdx1230; AVX-NEXT:    sbbq {{[0-9]+}}(%rsp), %rcx1231; AVX-NEXT:    movl $0, %r11d1232; AVX-NEXT:    sbbl %r11d, %r11d1233; AVX-NEXT:    subq %r8, %rdi1234; AVX-NEXT:    sbbq %r9, %rsi1235; AVX-NEXT:    sbbl %r10d, %r10d1236; AVX-NEXT:    vmovd %r10d, %xmm01237; AVX-NEXT:    vpinsrd $1, %r11d, %xmm0, %xmm01238; AVX-NEXT:    movq %rdx, 16(%rax)1239; AVX-NEXT:    movq %rdi, (%rax)1240; AVX-NEXT:    movq %rcx, 24(%rax)1241; AVX-NEXT:    movq %rsi, 8(%rax)1242; AVX-NEXT:    retq1243;1244; AVX512-LABEL: usubo_v2i128:1245; AVX512:       # %bb.0:1246; AVX512-NEXT:    movq {{[0-9]+}}(%rsp), %rax1247; AVX512-NEXT:    subq {{[0-9]+}}(%rsp), %rdx1248; AVX512-NEXT:    sbbq {{[0-9]+}}(%rsp), %rcx1249; AVX512-NEXT:    setb %r10b1250; AVX512-NEXT:    kmovd %r10d, %k01251; AVX512-NEXT:    subq %r8, %rdi1252; AVX512-NEXT:    sbbq %r9, %rsi1253; AVX512-NEXT:    setb %r8b1254; AVX512-NEXT:    andl $1, %r8d1255; AVX512-NEXT:    kmovw %r8d, %k11256; AVX512-NEXT:    kshiftlw $1, %k0, %k01257; AVX512-NEXT:    korw %k0, %k1, %k11258; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm01259; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}1260; AVX512-NEXT:    movq %rdx, 16(%rax)1261; AVX512-NEXT:    movq %rdi, (%rax)1262; AVX512-NEXT:    movq %rcx, 24(%rax)1263; AVX512-NEXT:    movq %rsi, 8(%rax)1264; AVX512-NEXT:    retq1265  %t = call {<2 x i128>, <2 x i1>} @llvm.usub.with.overflow.v2i128(<2 x i128> %a0, <2 x i128> %a1)1266  %val = extractvalue {<2 x i128>, <2 x i1>} %t, 01267  %obit = extractvalue {<2 x i128>, <2 x i1>} %t, 11268  %res = sext <2 x i1> %obit to <2 x i32>1269  store <2 x i128> %val, ptr %p21270  ret <2 x i32> %res1271}1272