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