1225 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.uadd.with.overflow.v1i32(<1 x i32>, <1 x i32>)11declare {<2 x i32>, <2 x i1>} @llvm.uadd.with.overflow.v2i32(<2 x i32>, <2 x i32>)12declare {<3 x i32>, <3 x i1>} @llvm.uadd.with.overflow.v3i32(<3 x i32>, <3 x i32>)13declare {<4 x i32>, <4 x i1>} @llvm.uadd.with.overflow.v4i32(<4 x i32>, <4 x i32>)14declare {<6 x i32>, <6 x i1>} @llvm.uadd.with.overflow.v6i32(<6 x i32>, <6 x i32>)15declare {<8 x i32>, <8 x i1>} @llvm.uadd.with.overflow.v8i32(<8 x i32>, <8 x i32>)16declare {<16 x i32>, <16 x i1>} @llvm.uadd.with.overflow.v16i32(<16 x i32>, <16 x i32>)17 18declare {<16 x i8>, <16 x i1>} @llvm.uadd.with.overflow.v16i8(<16 x i8>, <16 x i8>)19declare {<8 x i16>, <8 x i1>} @llvm.uadd.with.overflow.v8i16(<8 x i16>, <8 x i16>)20declare {<2 x i64>, <2 x i1>} @llvm.uadd.with.overflow.v2i64(<2 x i64>, <2 x i64>)21 22declare {<4 x i24>, <4 x i1>} @llvm.uadd.with.overflow.v4i24(<4 x i24>, <4 x i24>)23declare {<4 x i1>, <4 x i1>} @llvm.uadd.with.overflow.v4i1(<4 x i1>, <4 x i1>)24declare {<2 x i128>, <2 x i1>} @llvm.uadd.with.overflow.v2i128(<2 x i128>, <2 x i128>)25 26define <1 x i32> @uaddo_v1i32(<1 x i32> %a0, <1 x i32> %a1, ptr %p2) nounwind {27; CHECK-LABEL: uaddo_v1i32:28; CHECK: # %bb.0:29; CHECK-NEXT: xorl %eax, %eax30; CHECK-NEXT: addl %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.uadd.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> @uaddo_v2i32(<2 x i32> %a0, <2 x i32> %a1, ptr %p2) nounwind {43; SSE2-LABEL: uaddo_v2i32:44; SSE2: # %bb.0:45; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]46; SSE2-NEXT: paddd %xmm0, %xmm147; SSE2-NEXT: pxor %xmm2, %xmm048; SSE2-NEXT: pxor %xmm1, %xmm249; SSE2-NEXT: pcmpgtd %xmm2, %xmm050; SSE2-NEXT: movq %xmm1, (%rdi)51; SSE2-NEXT: retq52;53; SSSE3-LABEL: uaddo_v2i32:54; SSSE3: # %bb.0:55; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]56; SSSE3-NEXT: paddd %xmm0, %xmm157; SSSE3-NEXT: pxor %xmm2, %xmm058; SSSE3-NEXT: pxor %xmm1, %xmm259; SSSE3-NEXT: pcmpgtd %xmm2, %xmm060; SSSE3-NEXT: movq %xmm1, (%rdi)61; SSSE3-NEXT: retq62;63; SSE41-LABEL: uaddo_v2i32:64; SSE41: # %bb.0:65; SSE41-NEXT: paddd %xmm0, %xmm166; SSE41-NEXT: pmaxud %xmm1, %xmm067; SSE41-NEXT: pcmpeqd %xmm1, %xmm068; SSE41-NEXT: pcmpeqd %xmm2, %xmm269; SSE41-NEXT: pxor %xmm2, %xmm070; SSE41-NEXT: movq %xmm1, (%rdi)71; SSE41-NEXT: retq72;73; AVX-LABEL: uaddo_v2i32:74; AVX: # %bb.0:75; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm176; AVX-NEXT: vpmaxud %xmm0, %xmm1, %xmm077; AVX-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm078; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm279; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm080; AVX-NEXT: vmovq %xmm1, (%rdi)81; AVX-NEXT: retq82;83; AVX512-LABEL: uaddo_v2i32:84; AVX512: # %bb.0:85; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm186; AVX512-NEXT: vpcmpltud %xmm0, %xmm1, %k187; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm088; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}89; AVX512-NEXT: vmovq %xmm1, (%rdi)90; AVX512-NEXT: retq91 %t = call {<2 x i32>, <2 x i1>} @llvm.uadd.with.overflow.v2i32(<2 x i32> %a0, <2 x i32> %a1)92 %val = extractvalue {<2 x i32>, <2 x i1>} %t, 093 %obit = extractvalue {<2 x i32>, <2 x i1>} %t, 194 %res = sext <2 x i1> %obit to <2 x i32>95 store <2 x i32> %val, ptr %p296 ret <2 x i32> %res97}98 99define <3 x i32> @uaddo_v3i32(<3 x i32> %a0, <3 x i32> %a1, ptr %p2) nounwind {100; SSE2-LABEL: uaddo_v3i32:101; SSE2: # %bb.0:102; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]103; SSE2-NEXT: paddd %xmm0, %xmm1104; SSE2-NEXT: pxor %xmm2, %xmm0105; SSE2-NEXT: pxor %xmm1, %xmm2106; SSE2-NEXT: pcmpgtd %xmm2, %xmm0107; SSE2-NEXT: movq %xmm1, (%rdi)108; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]109; SSE2-NEXT: movd %xmm1, 8(%rdi)110; SSE2-NEXT: retq111;112; SSSE3-LABEL: uaddo_v3i32:113; SSSE3: # %bb.0:114; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]115; SSSE3-NEXT: paddd %xmm0, %xmm1116; SSSE3-NEXT: pxor %xmm2, %xmm0117; SSSE3-NEXT: pxor %xmm1, %xmm2118; SSSE3-NEXT: pcmpgtd %xmm2, %xmm0119; SSSE3-NEXT: movq %xmm1, (%rdi)120; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]121; SSSE3-NEXT: movd %xmm1, 8(%rdi)122; SSSE3-NEXT: retq123;124; SSE41-LABEL: uaddo_v3i32:125; SSE41: # %bb.0:126; SSE41-NEXT: paddd %xmm0, %xmm1127; SSE41-NEXT: pmaxud %xmm1, %xmm0128; SSE41-NEXT: pcmpeqd %xmm1, %xmm0129; SSE41-NEXT: pcmpeqd %xmm2, %xmm2130; SSE41-NEXT: pxor %xmm2, %xmm0131; SSE41-NEXT: pextrd $2, %xmm1, 8(%rdi)132; SSE41-NEXT: movq %xmm1, (%rdi)133; SSE41-NEXT: retq134;135; AVX-LABEL: uaddo_v3i32:136; AVX: # %bb.0:137; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm1138; AVX-NEXT: vpmaxud %xmm0, %xmm1, %xmm0139; AVX-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0140; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2141; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0142; AVX-NEXT: vpextrd $2, %xmm1, 8(%rdi)143; AVX-NEXT: vmovq %xmm1, (%rdi)144; AVX-NEXT: retq145;146; AVX512-LABEL: uaddo_v3i32:147; AVX512: # %bb.0:148; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm1149; AVX512-NEXT: vpcmpltud %xmm0, %xmm1, %k1150; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0151; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}152; AVX512-NEXT: vpextrd $2, %xmm1, 8(%rdi)153; AVX512-NEXT: vmovq %xmm1, (%rdi)154; AVX512-NEXT: retq155 %t = call {<3 x i32>, <3 x i1>} @llvm.uadd.with.overflow.v3i32(<3 x i32> %a0, <3 x i32> %a1)156 %val = extractvalue {<3 x i32>, <3 x i1>} %t, 0157 %obit = extractvalue {<3 x i32>, <3 x i1>} %t, 1158 %res = sext <3 x i1> %obit to <3 x i32>159 store <3 x i32> %val, ptr %p2160 ret <3 x i32> %res161}162 163define <4 x i32> @uaddo_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %p2) nounwind {164; SSE2-LABEL: uaddo_v4i32:165; SSE2: # %bb.0:166; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]167; SSE2-NEXT: paddd %xmm0, %xmm1168; SSE2-NEXT: pxor %xmm2, %xmm0169; SSE2-NEXT: pxor %xmm1, %xmm2170; SSE2-NEXT: pcmpgtd %xmm2, %xmm0171; SSE2-NEXT: movdqa %xmm1, (%rdi)172; SSE2-NEXT: retq173;174; SSSE3-LABEL: uaddo_v4i32:175; SSSE3: # %bb.0:176; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]177; SSSE3-NEXT: paddd %xmm0, %xmm1178; SSSE3-NEXT: pxor %xmm2, %xmm0179; SSSE3-NEXT: pxor %xmm1, %xmm2180; SSSE3-NEXT: pcmpgtd %xmm2, %xmm0181; SSSE3-NEXT: movdqa %xmm1, (%rdi)182; SSSE3-NEXT: retq183;184; SSE41-LABEL: uaddo_v4i32:185; SSE41: # %bb.0:186; SSE41-NEXT: paddd %xmm0, %xmm1187; SSE41-NEXT: pmaxud %xmm1, %xmm0188; SSE41-NEXT: pcmpeqd %xmm1, %xmm0189; SSE41-NEXT: pcmpeqd %xmm2, %xmm2190; SSE41-NEXT: pxor %xmm2, %xmm0191; SSE41-NEXT: movdqa %xmm1, (%rdi)192; SSE41-NEXT: retq193;194; AVX-LABEL: uaddo_v4i32:195; AVX: # %bb.0:196; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm1197; AVX-NEXT: vpmaxud %xmm0, %xmm1, %xmm0198; AVX-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0199; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2200; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0201; AVX-NEXT: vmovdqa %xmm1, (%rdi)202; AVX-NEXT: retq203;204; AVX512-LABEL: uaddo_v4i32:205; AVX512: # %bb.0:206; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm1207; AVX512-NEXT: vpcmpltud %xmm0, %xmm1, %k1208; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0209; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}210; AVX512-NEXT: vmovdqa %xmm1, (%rdi)211; AVX512-NEXT: retq212 %t = call {<4 x i32>, <4 x i1>} @llvm.uadd.with.overflow.v4i32(<4 x i32> %a0, <4 x i32> %a1)213 %val = extractvalue {<4 x i32>, <4 x i1>} %t, 0214 %obit = extractvalue {<4 x i32>, <4 x i1>} %t, 1215 %res = sext <4 x i1> %obit to <4 x i32>216 store <4 x i32> %val, ptr %p2217 ret <4 x i32> %res218}219 220define <6 x i32> @uaddo_v6i32(<6 x i32> %a0, <6 x i32> %a1, ptr %p2) nounwind {221; SSE2-LABEL: uaddo_v6i32:222; SSE2: # %bb.0:223; SSE2-NEXT: movq %rdi, %rax224; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero225; SSE2-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero226; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]227; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero228; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero229; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]230; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]231; SSE2-NEXT: movd %r8d, %xmm0232; SSE2-NEXT: movd %ecx, %xmm2233; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]234; SSE2-NEXT: movd %edx, %xmm3235; SSE2-NEXT: movd %esi, %xmm0236; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]237; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]238; SSE2-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero239; SSE2-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero240; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]241; SSE2-NEXT: movd %r9d, %xmm2242; SSE2-NEXT: movd {{.*#+}} xmm4 = mem[0],zero,zero,zero243; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]244; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %rcx245; SSE2-NEXT: paddd %xmm0, %xmm1246; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]247; SSE2-NEXT: movdqa %xmm1, (%rcx)248; SSE2-NEXT: pxor %xmm4, %xmm1249; SSE2-NEXT: pxor %xmm4, %xmm0250; SSE2-NEXT: pcmpgtd %xmm1, %xmm0251; SSE2-NEXT: paddd %xmm2, %xmm3252; SSE2-NEXT: movq %xmm3, 16(%rcx)253; SSE2-NEXT: pxor %xmm4, %xmm3254; SSE2-NEXT: pxor %xmm4, %xmm2255; SSE2-NEXT: pcmpgtd %xmm3, %xmm2256; SSE2-NEXT: movq %xmm2, 16(%rdi)257; SSE2-NEXT: movdqa %xmm0, (%rdi)258; SSE2-NEXT: retq259;260; SSSE3-LABEL: uaddo_v6i32:261; SSSE3: # %bb.0:262; SSSE3-NEXT: movq %rdi, %rax263; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero264; SSSE3-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero265; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]266; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero267; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero268; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]269; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]270; SSSE3-NEXT: movd %r8d, %xmm0271; SSSE3-NEXT: movd %ecx, %xmm2272; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]273; SSSE3-NEXT: movd %edx, %xmm3274; SSSE3-NEXT: movd %esi, %xmm0275; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]276; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]277; SSSE3-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero278; SSSE3-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero279; SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]280; SSSE3-NEXT: movd %r9d, %xmm2281; SSSE3-NEXT: movd {{.*#+}} xmm4 = mem[0],zero,zero,zero282; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]283; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %rcx284; SSSE3-NEXT: paddd %xmm0, %xmm1285; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]286; SSSE3-NEXT: movdqa %xmm1, (%rcx)287; SSSE3-NEXT: pxor %xmm4, %xmm1288; SSSE3-NEXT: pxor %xmm4, %xmm0289; SSSE3-NEXT: pcmpgtd %xmm1, %xmm0290; SSSE3-NEXT: paddd %xmm2, %xmm3291; SSSE3-NEXT: movq %xmm3, 16(%rcx)292; SSSE3-NEXT: pxor %xmm4, %xmm3293; SSSE3-NEXT: pxor %xmm4, %xmm2294; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2295; SSSE3-NEXT: movq %xmm2, 16(%rdi)296; SSSE3-NEXT: movdqa %xmm0, (%rdi)297; SSSE3-NEXT: retq298;299; SSE41-LABEL: uaddo_v6i32:300; SSE41: # %bb.0:301; SSE41-NEXT: movq %rdi, %rax302; SSE41-NEXT: movd %esi, %xmm0303; SSE41-NEXT: pinsrd $1, %edx, %xmm0304; SSE41-NEXT: pinsrd $2, %ecx, %xmm0305; SSE41-NEXT: pinsrd $3, %r8d, %xmm0306; SSE41-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero307; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm1308; SSE41-NEXT: movd %r9d, %xmm2309; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm2310; SSE41-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero311; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm3312; SSE41-NEXT: pinsrd $2, {{[0-9]+}}(%rsp), %xmm3313; SSE41-NEXT: pinsrd $3, {{[0-9]+}}(%rsp), %xmm3314; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %rcx315; SSE41-NEXT: paddd %xmm0, %xmm3316; SSE41-NEXT: pmaxud %xmm3, %xmm0317; SSE41-NEXT: pcmpeqd %xmm3, %xmm0318; SSE41-NEXT: pcmpeqd %xmm4, %xmm4319; SSE41-NEXT: pxor %xmm4, %xmm0320; SSE41-NEXT: paddd %xmm2, %xmm1321; SSE41-NEXT: pmaxud %xmm1, %xmm2322; SSE41-NEXT: pcmpeqd %xmm1, %xmm2323; SSE41-NEXT: pxor %xmm4, %xmm2324; SSE41-NEXT: movq %xmm1, 16(%rcx)325; SSE41-NEXT: movdqa %xmm3, (%rcx)326; SSE41-NEXT: movq %xmm2, 16(%rdi)327; SSE41-NEXT: movdqa %xmm0, (%rdi)328; SSE41-NEXT: retq329;330; AVX1-LABEL: uaddo_v6i32:331; AVX1: # %bb.0:332; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2333; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3334; AVX1-NEXT: vpaddd %xmm2, %xmm3, %xmm2335; AVX1-NEXT: vpmaxud %xmm3, %xmm2, %xmm3336; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm3337; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4338; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3339; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1340; AVX1-NEXT: vpmaxud %xmm0, %xmm1, %xmm0341; AVX1-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0342; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0343; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0344; AVX1-NEXT: vmovq %xmm2, 16(%rdi)345; AVX1-NEXT: vmovdqa %xmm1, (%rdi)346; AVX1-NEXT: retq347;348; AVX2-LABEL: uaddo_v6i32:349; AVX2: # %bb.0:350; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm1351; AVX2-NEXT: vpmaxud %ymm0, %ymm1, %ymm0352; AVX2-NEXT: vpcmpeqd %ymm0, %ymm1, %ymm0353; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2354; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0355; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2356; AVX2-NEXT: vmovq %xmm2, 16(%rdi)357; AVX2-NEXT: vmovdqa %xmm1, (%rdi)358; AVX2-NEXT: retq359;360; AVX512-LABEL: uaddo_v6i32:361; AVX512: # %bb.0:362; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm1363; AVX512-NEXT: vpcmpltud %ymm0, %ymm1, %k1364; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0365; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}366; AVX512-NEXT: vextracti128 $1, %ymm1, %xmm2367; AVX512-NEXT: vmovq %xmm2, 16(%rdi)368; AVX512-NEXT: vmovdqa %xmm1, (%rdi)369; AVX512-NEXT: retq370 %t = call {<6 x i32>, <6 x i1>} @llvm.uadd.with.overflow.v6i32(<6 x i32> %a0, <6 x i32> %a1)371 %val = extractvalue {<6 x i32>, <6 x i1>} %t, 0372 %obit = extractvalue {<6 x i32>, <6 x i1>} %t, 1373 %res = sext <6 x i1> %obit to <6 x i32>374 store <6 x i32> %val, ptr %p2375 ret <6 x i32> %res376}377 378define <8 x i32> @uaddo_v8i32(<8 x i32> %a0, <8 x i32> %a1, ptr %p2) nounwind {379; SSE2-LABEL: uaddo_v8i32:380; SSE2: # %bb.0:381; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]382; SSE2-NEXT: paddd %xmm0, %xmm2383; SSE2-NEXT: pxor %xmm4, %xmm0384; SSE2-NEXT: movdqa %xmm2, (%rdi)385; SSE2-NEXT: pxor %xmm4, %xmm2386; SSE2-NEXT: pcmpgtd %xmm2, %xmm0387; SSE2-NEXT: paddd %xmm1, %xmm3388; SSE2-NEXT: pxor %xmm4, %xmm1389; SSE2-NEXT: pxor %xmm3, %xmm4390; SSE2-NEXT: pcmpgtd %xmm4, %xmm1391; SSE2-NEXT: movdqa %xmm3, 16(%rdi)392; SSE2-NEXT: retq393;394; SSSE3-LABEL: uaddo_v8i32:395; SSSE3: # %bb.0:396; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]397; SSSE3-NEXT: paddd %xmm0, %xmm2398; SSSE3-NEXT: pxor %xmm4, %xmm0399; SSSE3-NEXT: movdqa %xmm2, (%rdi)400; SSSE3-NEXT: pxor %xmm4, %xmm2401; SSSE3-NEXT: pcmpgtd %xmm2, %xmm0402; SSSE3-NEXT: paddd %xmm1, %xmm3403; SSSE3-NEXT: pxor %xmm4, %xmm1404; SSSE3-NEXT: pxor %xmm3, %xmm4405; SSSE3-NEXT: pcmpgtd %xmm4, %xmm1406; SSSE3-NEXT: movdqa %xmm3, 16(%rdi)407; SSSE3-NEXT: retq408;409; SSE41-LABEL: uaddo_v8i32:410; SSE41: # %bb.0:411; SSE41-NEXT: paddd %xmm0, %xmm2412; SSE41-NEXT: pmaxud %xmm2, %xmm0413; SSE41-NEXT: pcmpeqd %xmm2, %xmm0414; SSE41-NEXT: pcmpeqd %xmm4, %xmm4415; SSE41-NEXT: pxor %xmm4, %xmm0416; SSE41-NEXT: paddd %xmm1, %xmm3417; SSE41-NEXT: pmaxud %xmm3, %xmm1418; SSE41-NEXT: pcmpeqd %xmm3, %xmm1419; SSE41-NEXT: pxor %xmm4, %xmm1420; SSE41-NEXT: movdqa %xmm3, 16(%rdi)421; SSE41-NEXT: movdqa %xmm2, (%rdi)422; SSE41-NEXT: retq423;424; AVX1-LABEL: uaddo_v8i32:425; AVX1: # %bb.0:426; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2427; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3428; AVX1-NEXT: vpaddd %xmm2, %xmm3, %xmm2429; AVX1-NEXT: vpmaxud %xmm3, %xmm2, %xmm3430; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm3431; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4432; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3433; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1434; AVX1-NEXT: vpmaxud %xmm0, %xmm1, %xmm0435; AVX1-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0436; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0437; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0438; AVX1-NEXT: vmovdqa %xmm2, 16(%rdi)439; AVX1-NEXT: vmovdqa %xmm1, (%rdi)440; AVX1-NEXT: retq441;442; AVX2-LABEL: uaddo_v8i32:443; AVX2: # %bb.0:444; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm1445; AVX2-NEXT: vpmaxud %ymm0, %ymm1, %ymm0446; AVX2-NEXT: vpcmpeqd %ymm0, %ymm1, %ymm0447; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2448; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0449; AVX2-NEXT: vmovdqa %ymm1, (%rdi)450; AVX2-NEXT: retq451;452; AVX512-LABEL: uaddo_v8i32:453; AVX512: # %bb.0:454; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm1455; AVX512-NEXT: vpcmpltud %ymm0, %ymm1, %k1456; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0457; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}458; AVX512-NEXT: vmovdqa %ymm1, (%rdi)459; AVX512-NEXT: retq460 %t = call {<8 x i32>, <8 x i1>} @llvm.uadd.with.overflow.v8i32(<8 x i32> %a0, <8 x i32> %a1)461 %val = extractvalue {<8 x i32>, <8 x i1>} %t, 0462 %obit = extractvalue {<8 x i32>, <8 x i1>} %t, 1463 %res = sext <8 x i1> %obit to <8 x i32>464 store <8 x i32> %val, ptr %p2465 ret <8 x i32> %res466}467 468define <16 x i32> @uaddo_v16i32(<16 x i32> %a0, <16 x i32> %a1, ptr %p2) nounwind {469; SSE2-LABEL: uaddo_v16i32:470; SSE2: # %bb.0:471; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]472; SSE2-NEXT: paddd %xmm0, %xmm4473; SSE2-NEXT: pxor %xmm8, %xmm0474; SSE2-NEXT: movdqa %xmm4, (%rdi)475; SSE2-NEXT: pxor %xmm8, %xmm4476; SSE2-NEXT: pcmpgtd %xmm4, %xmm0477; SSE2-NEXT: paddd %xmm1, %xmm5478; SSE2-NEXT: pxor %xmm8, %xmm1479; SSE2-NEXT: movdqa %xmm5, 16(%rdi)480; SSE2-NEXT: pxor %xmm8, %xmm5481; SSE2-NEXT: pcmpgtd %xmm5, %xmm1482; SSE2-NEXT: paddd %xmm2, %xmm6483; SSE2-NEXT: pxor %xmm8, %xmm2484; SSE2-NEXT: movdqa %xmm6, 32(%rdi)485; SSE2-NEXT: pxor %xmm8, %xmm6486; SSE2-NEXT: pcmpgtd %xmm6, %xmm2487; SSE2-NEXT: paddd %xmm3, %xmm7488; SSE2-NEXT: pxor %xmm8, %xmm3489; SSE2-NEXT: pxor %xmm7, %xmm8490; SSE2-NEXT: pcmpgtd %xmm8, %xmm3491; SSE2-NEXT: movdqa %xmm7, 48(%rdi)492; SSE2-NEXT: retq493;494; SSSE3-LABEL: uaddo_v16i32:495; SSSE3: # %bb.0:496; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]497; SSSE3-NEXT: paddd %xmm0, %xmm4498; SSSE3-NEXT: pxor %xmm8, %xmm0499; SSSE3-NEXT: movdqa %xmm4, (%rdi)500; SSSE3-NEXT: pxor %xmm8, %xmm4501; SSSE3-NEXT: pcmpgtd %xmm4, %xmm0502; SSSE3-NEXT: paddd %xmm1, %xmm5503; SSSE3-NEXT: pxor %xmm8, %xmm1504; SSSE3-NEXT: movdqa %xmm5, 16(%rdi)505; SSSE3-NEXT: pxor %xmm8, %xmm5506; SSSE3-NEXT: pcmpgtd %xmm5, %xmm1507; SSSE3-NEXT: paddd %xmm2, %xmm6508; SSSE3-NEXT: pxor %xmm8, %xmm2509; SSSE3-NEXT: movdqa %xmm6, 32(%rdi)510; SSSE3-NEXT: pxor %xmm8, %xmm6511; SSSE3-NEXT: pcmpgtd %xmm6, %xmm2512; SSSE3-NEXT: paddd %xmm3, %xmm7513; SSSE3-NEXT: pxor %xmm8, %xmm3514; SSSE3-NEXT: pxor %xmm7, %xmm8515; SSSE3-NEXT: pcmpgtd %xmm8, %xmm3516; SSSE3-NEXT: movdqa %xmm7, 48(%rdi)517; SSSE3-NEXT: retq518;519; SSE41-LABEL: uaddo_v16i32:520; SSE41: # %bb.0:521; SSE41-NEXT: paddd %xmm0, %xmm4522; SSE41-NEXT: pmaxud %xmm4, %xmm0523; SSE41-NEXT: pcmpeqd %xmm4, %xmm0524; SSE41-NEXT: pcmpeqd %xmm8, %xmm8525; SSE41-NEXT: pxor %xmm8, %xmm0526; SSE41-NEXT: paddd %xmm1, %xmm5527; SSE41-NEXT: pmaxud %xmm5, %xmm1528; SSE41-NEXT: pcmpeqd %xmm5, %xmm1529; SSE41-NEXT: pxor %xmm8, %xmm1530; SSE41-NEXT: paddd %xmm2, %xmm6531; SSE41-NEXT: pmaxud %xmm6, %xmm2532; SSE41-NEXT: pcmpeqd %xmm6, %xmm2533; SSE41-NEXT: pxor %xmm8, %xmm2534; SSE41-NEXT: paddd %xmm3, %xmm7535; SSE41-NEXT: pmaxud %xmm7, %xmm3536; SSE41-NEXT: pcmpeqd %xmm7, %xmm3537; SSE41-NEXT: pxor %xmm8, %xmm3538; SSE41-NEXT: movdqa %xmm7, 48(%rdi)539; SSE41-NEXT: movdqa %xmm6, 32(%rdi)540; SSE41-NEXT: movdqa %xmm5, 16(%rdi)541; SSE41-NEXT: movdqa %xmm4, (%rdi)542; SSE41-NEXT: retq543;544; AVX1-LABEL: uaddo_v16i32:545; AVX1: # %bb.0:546; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4547; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5548; AVX1-NEXT: vpaddd %xmm4, %xmm5, %xmm4549; AVX1-NEXT: vpmaxud %xmm5, %xmm4, %xmm5550; AVX1-NEXT: vpcmpeqd %xmm5, %xmm4, %xmm5551; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm3552; AVX1-NEXT: vpmaxud %xmm1, %xmm3, %xmm1553; AVX1-NEXT: vpcmpeqd %xmm1, %xmm3, %xmm1554; AVX1-NEXT: vpackssdw %xmm5, %xmm1, %xmm1555; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5556; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6557; AVX1-NEXT: vpaddd %xmm5, %xmm6, %xmm5558; AVX1-NEXT: vpmaxud %xmm6, %xmm5, %xmm6559; AVX1-NEXT: vpcmpeqd %xmm6, %xmm5, %xmm6560; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm2561; AVX1-NEXT: vpmaxud %xmm0, %xmm2, %xmm0562; AVX1-NEXT: vpcmpeqd %xmm0, %xmm2, %xmm0563; AVX1-NEXT: vpackssdw %xmm6, %xmm0, %xmm0564; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0565; AVX1-NEXT: vpcmpeqd %xmm6, %xmm6, %xmm6566; AVX1-NEXT: vpxor %xmm6, %xmm0, %xmm0567; AVX1-NEXT: vpmovsxbd %xmm0, %xmm7568; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]569; AVX1-NEXT: vpmovsxbd %xmm0, %xmm0570; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm7, %ymm0571; AVX1-NEXT: vpacksswb %xmm1, %xmm1, %xmm1572; AVX1-NEXT: vpxor %xmm6, %xmm1, %xmm1573; AVX1-NEXT: vpmovsxbd %xmm1, %xmm6574; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]575; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1576; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm6, %ymm1577; AVX1-NEXT: vmovdqa %xmm4, 48(%rdi)578; AVX1-NEXT: vmovdqa %xmm3, 32(%rdi)579; AVX1-NEXT: vmovdqa %xmm5, 16(%rdi)580; AVX1-NEXT: vmovdqa %xmm2, (%rdi)581; AVX1-NEXT: retq582;583; AVX2-LABEL: uaddo_v16i32:584; AVX2: # %bb.0:585; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm3586; AVX2-NEXT: vpmaxud %ymm1, %ymm3, %ymm1587; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1588; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4589; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1590; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5591; AVX2-NEXT: vpackssdw %xmm5, %xmm1, %xmm1592; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm2593; AVX2-NEXT: vpmaxud %ymm0, %ymm2, %ymm0594; AVX2-NEXT: vpcmpeqd %ymm0, %ymm2, %ymm0595; AVX2-NEXT: vpacksswb %xmm1, %xmm1, %xmm1596; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1597; 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]598; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm0599; AVX2-NEXT: vmovdqa %ymm3, 32(%rdi)600; AVX2-NEXT: vmovdqa %ymm2, (%rdi)601; AVX2-NEXT: retq602;603; AVX512-LABEL: uaddo_v16i32:604; AVX512: # %bb.0:605; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm1606; AVX512-NEXT: vpcmpltud %zmm0, %zmm1, %k1607; AVX512-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1608; AVX512-NEXT: vmovdqa64 %zmm1, (%rdi)609; AVX512-NEXT: retq610 %t = call {<16 x i32>, <16 x i1>} @llvm.uadd.with.overflow.v16i32(<16 x i32> %a0, <16 x i32> %a1)611 %val = extractvalue {<16 x i32>, <16 x i1>} %t, 0612 %obit = extractvalue {<16 x i32>, <16 x i1>} %t, 1613 %res = sext <16 x i1> %obit to <16 x i32>614 store <16 x i32> %val, ptr %p2615 ret <16 x i32> %res616}617 618define <16 x i32> @uaddo_v16i8(<16 x i8> %a0, <16 x i8> %a1, ptr %p2) nounwind {619; SSE2-LABEL: uaddo_v16i8:620; SSE2: # %bb.0:621; SSE2-NEXT: paddb %xmm0, %xmm1622; SSE2-NEXT: pmaxub %xmm1, %xmm0623; SSE2-NEXT: pcmpeqb %xmm1, %xmm0624; SSE2-NEXT: pcmpeqd %xmm3, %xmm3625; SSE2-NEXT: pxor %xmm0, %xmm3626; SSE2-NEXT: movdqa %xmm3, %xmm0627; 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]628; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]629; SSE2-NEXT: movdqa %xmm3, %xmm4630; SSE2-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]631; SSE2-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7]632; SSE2-NEXT: pslld $31, %xmm4633; SSE2-NEXT: psrad $31, %xmm4634; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]635; SSE2-NEXT: movdqa %xmm3, %xmm2636; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]637; SSE2-NEXT: pslld $31, %xmm2638; SSE2-NEXT: psrad $31, %xmm2639; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]640; SSE2-NEXT: pslld $31, %xmm3641; SSE2-NEXT: psrad $31, %xmm3642; SSE2-NEXT: movdqa %xmm1, (%rdi)643; SSE2-NEXT: movdqa %xmm4, %xmm1644; SSE2-NEXT: retq645;646; SSSE3-LABEL: uaddo_v16i8:647; SSSE3: # %bb.0:648; SSSE3-NEXT: paddb %xmm0, %xmm1649; SSSE3-NEXT: pmaxub %xmm1, %xmm0650; SSSE3-NEXT: pcmpeqb %xmm1, %xmm0651; SSSE3-NEXT: pcmpeqd %xmm3, %xmm3652; SSSE3-NEXT: pxor %xmm0, %xmm3653; SSSE3-NEXT: movdqa %xmm3, %xmm0654; 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]655; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]656; SSSE3-NEXT: movdqa %xmm3, %xmm4657; SSSE3-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]658; SSSE3-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7]659; SSSE3-NEXT: pslld $31, %xmm4660; SSSE3-NEXT: psrad $31, %xmm4661; SSSE3-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]662; SSSE3-NEXT: movdqa %xmm3, %xmm2663; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]664; SSSE3-NEXT: pslld $31, %xmm2665; SSSE3-NEXT: psrad $31, %xmm2666; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]667; SSSE3-NEXT: pslld $31, %xmm3668; SSSE3-NEXT: psrad $31, %xmm3669; SSSE3-NEXT: movdqa %xmm1, (%rdi)670; SSSE3-NEXT: movdqa %xmm4, %xmm1671; SSSE3-NEXT: retq672;673; SSE41-LABEL: uaddo_v16i8:674; SSE41: # %bb.0:675; SSE41-NEXT: paddb %xmm0, %xmm1676; SSE41-NEXT: pmaxub %xmm1, %xmm0677; SSE41-NEXT: pcmpeqb %xmm1, %xmm0678; SSE41-NEXT: pcmpeqd %xmm3, %xmm3679; SSE41-NEXT: pxor %xmm0, %xmm3680; SSE41-NEXT: pmovsxbd %xmm3, %xmm0681; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,1,1]682; SSE41-NEXT: pmovzxbd {{.*#+}} xmm4 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero683; SSE41-NEXT: pslld $31, %xmm4684; SSE41-NEXT: psrad $31, %xmm4685; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,3,2,3]686; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero687; SSE41-NEXT: pslld $31, %xmm2688; SSE41-NEXT: psrad $31, %xmm2689; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[3,3,3,3]690; SSE41-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero691; SSE41-NEXT: pslld $31, %xmm3692; SSE41-NEXT: psrad $31, %xmm3693; SSE41-NEXT: movdqa %xmm1, (%rdi)694; SSE41-NEXT: movdqa %xmm4, %xmm1695; SSE41-NEXT: retq696;697; AVX1-LABEL: uaddo_v16i8:698; AVX1: # %bb.0:699; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm2700; AVX1-NEXT: vpmaxub %xmm0, %xmm2, %xmm0701; AVX1-NEXT: vpcmpeqb %xmm0, %xmm2, %xmm0702; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1703; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm1704; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0705; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[1,1,1,1]706; AVX1-NEXT: vpmovsxbd %xmm3, %xmm3707; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0708; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]709; AVX1-NEXT: vpmovsxbd %xmm3, %xmm3710; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,3,3]711; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1712; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1713; AVX1-NEXT: vmovdqa %xmm2, (%rdi)714; AVX1-NEXT: retq715;716; AVX2-LABEL: uaddo_v16i8:717; AVX2: # %bb.0:718; AVX2-NEXT: vpaddb %xmm1, %xmm0, %xmm2719; AVX2-NEXT: vpmaxub %xmm0, %xmm2, %xmm0720; AVX2-NEXT: vpcmpeqb %xmm0, %xmm2, %xmm0721; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1722; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm1723; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0724; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]725; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1726; AVX2-NEXT: vmovdqa %xmm2, (%rdi)727; AVX2-NEXT: retq728;729; AVX512-LABEL: uaddo_v16i8:730; AVX512: # %bb.0:731; AVX512-NEXT: vpaddb %xmm1, %xmm0, %xmm1732; AVX512-NEXT: vpcmpltub %xmm0, %xmm1, %k1733; AVX512-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1734; AVX512-NEXT: vmovdqa %xmm1, (%rdi)735; AVX512-NEXT: retq736 %t = call {<16 x i8>, <16 x i1>} @llvm.uadd.with.overflow.v16i8(<16 x i8> %a0, <16 x i8> %a1)737 %val = extractvalue {<16 x i8>, <16 x i1>} %t, 0738 %obit = extractvalue {<16 x i8>, <16 x i1>} %t, 1739 %res = sext <16 x i1> %obit to <16 x i32>740 store <16 x i8> %val, ptr %p2741 ret <16 x i32> %res742}743 744define <8 x i32> @uaddo_v8i16(<8 x i16> %a0, <8 x i16> %a1, ptr %p2) nounwind {745; SSE2-LABEL: uaddo_v8i16:746; SSE2: # %bb.0:747; SSE2-NEXT: movdqa %xmm0, %xmm2748; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [32768,32768,32768,32768,32768,32768,32768,32768]749; SSE2-NEXT: paddw %xmm0, %xmm1750; SSE2-NEXT: pxor %xmm3, %xmm2751; SSE2-NEXT: pxor %xmm1, %xmm3752; SSE2-NEXT: pcmpgtw %xmm3, %xmm2753; SSE2-NEXT: movdqa %xmm2, %xmm0754; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]755; SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]756; SSE2-NEXT: pslld $31, %xmm2757; SSE2-NEXT: psrad $31, %xmm2758; SSE2-NEXT: movdqa %xmm1, (%rdi)759; SSE2-NEXT: movdqa %xmm2, %xmm1760; SSE2-NEXT: retq761;762; SSSE3-LABEL: uaddo_v8i16:763; SSSE3: # %bb.0:764; SSSE3-NEXT: movdqa %xmm0, %xmm2765; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [32768,32768,32768,32768,32768,32768,32768,32768]766; SSSE3-NEXT: paddw %xmm0, %xmm1767; SSSE3-NEXT: pxor %xmm3, %xmm2768; SSSE3-NEXT: pxor %xmm1, %xmm3769; SSSE3-NEXT: pcmpgtw %xmm3, %xmm2770; SSSE3-NEXT: movdqa %xmm2, %xmm0771; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]772; SSSE3-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]773; SSSE3-NEXT: pslld $31, %xmm2774; SSSE3-NEXT: psrad $31, %xmm2775; SSSE3-NEXT: movdqa %xmm1, (%rdi)776; SSSE3-NEXT: movdqa %xmm2, %xmm1777; SSSE3-NEXT: retq778;779; SSE41-LABEL: uaddo_v8i16:780; SSE41: # %bb.0:781; SSE41-NEXT: paddw %xmm0, %xmm1782; SSE41-NEXT: pmaxuw %xmm1, %xmm0783; SSE41-NEXT: pcmpeqw %xmm1, %xmm0784; SSE41-NEXT: pcmpeqd %xmm2, %xmm2785; SSE41-NEXT: pxor %xmm0, %xmm2786; SSE41-NEXT: pmovsxwd %xmm2, %xmm0787; SSE41-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]788; SSE41-NEXT: pslld $31, %xmm2789; SSE41-NEXT: psrad $31, %xmm2790; SSE41-NEXT: movdqa %xmm1, (%rdi)791; SSE41-NEXT: movdqa %xmm2, %xmm1792; SSE41-NEXT: retq793;794; AVX1-LABEL: uaddo_v8i16:795; AVX1: # %bb.0:796; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm1797; AVX1-NEXT: vpmaxuw %xmm0, %xmm1, %xmm0798; AVX1-NEXT: vpcmpeqw %xmm0, %xmm1, %xmm0799; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2800; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0801; AVX1-NEXT: vpmovsxwd %xmm0, %xmm2802; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]803; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0804; AVX1-NEXT: vmovdqa %xmm1, (%rdi)805; AVX1-NEXT: retq806;807; AVX2-LABEL: uaddo_v8i16:808; AVX2: # %bb.0:809; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm1810; AVX2-NEXT: vpmaxuw %xmm0, %xmm1, %xmm0811; AVX2-NEXT: vpcmpeqw %xmm0, %xmm1, %xmm0812; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2813; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0814; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0815; AVX2-NEXT: vmovdqa %xmm1, (%rdi)816; AVX2-NEXT: retq817;818; AVX512-LABEL: uaddo_v8i16:819; AVX512: # %bb.0:820; AVX512-NEXT: vpaddw %xmm1, %xmm0, %xmm1821; AVX512-NEXT: vpcmpltuw %xmm0, %xmm1, %k1822; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0823; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}824; AVX512-NEXT: vmovdqa %xmm1, (%rdi)825; AVX512-NEXT: retq826 %t = call {<8 x i16>, <8 x i1>} @llvm.uadd.with.overflow.v8i16(<8 x i16> %a0, <8 x i16> %a1)827 %val = extractvalue {<8 x i16>, <8 x i1>} %t, 0828 %obit = extractvalue {<8 x i16>, <8 x i1>} %t, 1829 %res = sext <8 x i1> %obit to <8 x i32>830 store <8 x i16> %val, ptr %p2831 ret <8 x i32> %res832}833 834define <2 x i32> @uaddo_v2i64(<2 x i64> %a0, <2 x i64> %a1, ptr %p2) nounwind {835; SSE-LABEL: uaddo_v2i64:836; SSE: # %bb.0:837; SSE-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]838; SSE-NEXT: paddq %xmm0, %xmm1839; SSE-NEXT: pxor %xmm2, %xmm0840; SSE-NEXT: pxor %xmm1, %xmm2841; SSE-NEXT: movdqa %xmm0, %xmm3842; SSE-NEXT: pcmpeqd %xmm2, %xmm3843; SSE-NEXT: pcmpgtd %xmm2, %xmm0844; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]845; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,3,3,3]846; SSE-NEXT: pand %xmm2, %xmm3847; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,3,3]848; SSE-NEXT: por %xmm3, %xmm0849; SSE-NEXT: movdqa %xmm1, (%rdi)850; SSE-NEXT: retq851;852; AVX1-LABEL: uaddo_v2i64:853; AVX1: # %bb.0:854; AVX1-NEXT: vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]855; AVX1-NEXT: # xmm2 = mem[0,0]856; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm3857; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm1858; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm0859; AVX1-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm0860; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]861; AVX1-NEXT: vmovdqa %xmm1, (%rdi)862; AVX1-NEXT: retq863;864; AVX2-LABEL: uaddo_v2i64:865; AVX2: # %bb.0:866; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]867; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm3868; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm1869; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm0870; AVX2-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm0871; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]872; AVX2-NEXT: vmovdqa %xmm1, (%rdi)873; AVX2-NEXT: retq874;875; AVX512-LABEL: uaddo_v2i64:876; AVX512: # %bb.0:877; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm1878; AVX512-NEXT: vpcmpltuq %xmm0, %xmm1, %k1879; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0880; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}881; AVX512-NEXT: vmovdqa %xmm1, (%rdi)882; AVX512-NEXT: retq883 %t = call {<2 x i64>, <2 x i1>} @llvm.uadd.with.overflow.v2i64(<2 x i64> %a0, <2 x i64> %a1)884 %val = extractvalue {<2 x i64>, <2 x i1>} %t, 0885 %obit = extractvalue {<2 x i64>, <2 x i1>} %t, 1886 %res = sext <2 x i1> %obit to <2 x i32>887 store <2 x i64> %val, ptr %p2888 ret <2 x i32> %res889}890 891define <4 x i32> @uaddo_v4i24(<4 x i24> %a0, <4 x i24> %a1, ptr %p2) nounwind {892; SSE2-LABEL: uaddo_v4i24:893; SSE2: # %bb.0:894; SSE2-NEXT: movdqa %xmm0, %xmm2895; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]896; SSE2-NEXT: pand %xmm3, %xmm1897; SSE2-NEXT: pand %xmm3, %xmm2898; SSE2-NEXT: paddd %xmm1, %xmm2899; SSE2-NEXT: pand %xmm2, %xmm3900; SSE2-NEXT: pcmpeqd %xmm2, %xmm3901; SSE2-NEXT: pcmpeqd %xmm0, %xmm0902; SSE2-NEXT: pxor %xmm3, %xmm0903; SSE2-NEXT: movd %xmm2, %eax904; SSE2-NEXT: movw %ax, (%rdi)905; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,3,3,3]906; SSE2-NEXT: movd %xmm1, %ecx907; SSE2-NEXT: movw %cx, 9(%rdi)908; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]909; SSE2-NEXT: movd %xmm1, %edx910; SSE2-NEXT: movw %dx, 6(%rdi)911; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,1,1]912; SSE2-NEXT: movd %xmm1, %esi913; SSE2-NEXT: movw %si, 3(%rdi)914; SSE2-NEXT: shrl $16, %eax915; SSE2-NEXT: movb %al, 2(%rdi)916; SSE2-NEXT: shrl $16, %ecx917; SSE2-NEXT: movb %cl, 11(%rdi)918; SSE2-NEXT: shrl $16, %edx919; SSE2-NEXT: movb %dl, 8(%rdi)920; SSE2-NEXT: shrl $16, %esi921; SSE2-NEXT: movb %sil, 5(%rdi)922; SSE2-NEXT: retq923;924; SSSE3-LABEL: uaddo_v4i24:925; SSSE3: # %bb.0:926; SSSE3-NEXT: movdqa %xmm0, %xmm2927; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]928; SSSE3-NEXT: pand %xmm3, %xmm1929; SSSE3-NEXT: pand %xmm3, %xmm2930; SSSE3-NEXT: paddd %xmm1, %xmm2931; SSSE3-NEXT: pand %xmm2, %xmm3932; SSSE3-NEXT: pcmpeqd %xmm2, %xmm3933; SSSE3-NEXT: pcmpeqd %xmm0, %xmm0934; SSSE3-NEXT: pxor %xmm3, %xmm0935; SSSE3-NEXT: movd %xmm2, %eax936; SSSE3-NEXT: movw %ax, (%rdi)937; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,3,3,3]938; SSSE3-NEXT: movd %xmm1, %ecx939; SSSE3-NEXT: movw %cx, 9(%rdi)940; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]941; SSSE3-NEXT: movd %xmm1, %edx942; SSSE3-NEXT: movw %dx, 6(%rdi)943; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,1,1]944; SSSE3-NEXT: movd %xmm1, %esi945; SSSE3-NEXT: movw %si, 3(%rdi)946; SSSE3-NEXT: shrl $16, %eax947; SSSE3-NEXT: movb %al, 2(%rdi)948; SSSE3-NEXT: shrl $16, %ecx949; SSSE3-NEXT: movb %cl, 11(%rdi)950; SSSE3-NEXT: shrl $16, %edx951; SSSE3-NEXT: movb %dl, 8(%rdi)952; SSSE3-NEXT: shrl $16, %esi953; SSSE3-NEXT: movb %sil, 5(%rdi)954; SSSE3-NEXT: retq955;956; SSE41-LABEL: uaddo_v4i24:957; SSE41: # %bb.0:958; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]959; SSE41-NEXT: pand %xmm2, %xmm1960; SSE41-NEXT: pand %xmm2, %xmm0961; SSE41-NEXT: paddd %xmm1, %xmm0962; SSE41-NEXT: pand %xmm0, %xmm2963; SSE41-NEXT: pcmpeqd %xmm0, %xmm2964; SSE41-NEXT: pcmpeqd %xmm1, %xmm1965; SSE41-NEXT: pxor %xmm2, %xmm1966; SSE41-NEXT: pextrd $3, %xmm0, %eax967; SSE41-NEXT: movw %ax, 9(%rdi)968; SSE41-NEXT: pextrd $2, %xmm0, %ecx969; SSE41-NEXT: movw %cx, 6(%rdi)970; SSE41-NEXT: pextrd $1, %xmm0, %edx971; SSE41-NEXT: movw %dx, 3(%rdi)972; SSE41-NEXT: movd %xmm0, %esi973; SSE41-NEXT: movw %si, (%rdi)974; SSE41-NEXT: shrl $16, %eax975; SSE41-NEXT: movb %al, 11(%rdi)976; SSE41-NEXT: shrl $16, %ecx977; SSE41-NEXT: movb %cl, 8(%rdi)978; SSE41-NEXT: shrl $16, %edx979; SSE41-NEXT: movb %dl, 5(%rdi)980; SSE41-NEXT: shrl $16, %esi981; SSE41-NEXT: movb %sil, 2(%rdi)982; SSE41-NEXT: movdqa %xmm1, %xmm0983; SSE41-NEXT: retq984;985; AVX1-LABEL: uaddo_v4i24:986; AVX1: # %bb.0:987; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]988; AVX1-NEXT: vandps %xmm2, %xmm1, %xmm1989; AVX1-NEXT: vandps %xmm2, %xmm0, %xmm0990; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1991; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm0992; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0993; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2994; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0995; AVX1-NEXT: vpextrd $3, %xmm1, %eax996; AVX1-NEXT: movw %ax, 9(%rdi)997; AVX1-NEXT: vpextrd $2, %xmm1, %ecx998; AVX1-NEXT: movw %cx, 6(%rdi)999; AVX1-NEXT: vpextrd $1, %xmm1, %edx1000; AVX1-NEXT: movw %dx, 3(%rdi)1001; AVX1-NEXT: vmovd %xmm1, %esi1002; AVX1-NEXT: movw %si, (%rdi)1003; AVX1-NEXT: shrl $16, %eax1004; AVX1-NEXT: movb %al, 11(%rdi)1005; AVX1-NEXT: shrl $16, %ecx1006; AVX1-NEXT: movb %cl, 8(%rdi)1007; AVX1-NEXT: shrl $16, %edx1008; AVX1-NEXT: movb %dl, 5(%rdi)1009; AVX1-NEXT: shrl $16, %esi1010; AVX1-NEXT: movb %sil, 2(%rdi)1011; AVX1-NEXT: retq1012;1013; AVX2-LABEL: uaddo_v4i24:1014; AVX2: # %bb.0:1015; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]1016; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm11017; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm01018; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm11019; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm01020; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01021; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm21022; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm01023; AVX2-NEXT: vpextrd $3, %xmm1, %eax1024; AVX2-NEXT: movw %ax, 9(%rdi)1025; AVX2-NEXT: vpextrd $2, %xmm1, %ecx1026; AVX2-NEXT: movw %cx, 6(%rdi)1027; AVX2-NEXT: vpextrd $1, %xmm1, %edx1028; AVX2-NEXT: movw %dx, 3(%rdi)1029; AVX2-NEXT: vmovd %xmm1, %esi1030; AVX2-NEXT: movw %si, (%rdi)1031; AVX2-NEXT: shrl $16, %eax1032; AVX2-NEXT: movb %al, 11(%rdi)1033; AVX2-NEXT: shrl $16, %ecx1034; AVX2-NEXT: movb %cl, 8(%rdi)1035; AVX2-NEXT: shrl $16, %edx1036; AVX2-NEXT: movb %dl, 5(%rdi)1037; AVX2-NEXT: shrl $16, %esi1038; AVX2-NEXT: movb %sil, 2(%rdi)1039; AVX2-NEXT: retq1040;1041; AVX512-LABEL: uaddo_v4i24:1042; AVX512: # %bb.0:1043; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm2 = [255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0]1044; AVX512-NEXT: vpand %xmm2, %xmm1, %xmm11045; AVX512-NEXT: vpand %xmm2, %xmm0, %xmm01046; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm11047; AVX512-NEXT: vpand %xmm2, %xmm1, %xmm01048; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01049; AVX512-NEXT: vpternlogq {{.*#+}} xmm0 = ~xmm01050; AVX512-NEXT: vpextrd $3, %xmm1, %eax1051; AVX512-NEXT: movw %ax, 9(%rdi)1052; AVX512-NEXT: vpextrd $2, %xmm1, %ecx1053; AVX512-NEXT: movw %cx, 6(%rdi)1054; AVX512-NEXT: vpextrd $1, %xmm1, %edx1055; AVX512-NEXT: movw %dx, 3(%rdi)1056; AVX512-NEXT: vmovd %xmm1, %esi1057; AVX512-NEXT: movw %si, (%rdi)1058; AVX512-NEXT: shrl $16, %eax1059; AVX512-NEXT: movb %al, 11(%rdi)1060; AVX512-NEXT: shrl $16, %ecx1061; AVX512-NEXT: movb %cl, 8(%rdi)1062; AVX512-NEXT: shrl $16, %edx1063; AVX512-NEXT: movb %dl, 5(%rdi)1064; AVX512-NEXT: shrl $16, %esi1065; AVX512-NEXT: movb %sil, 2(%rdi)1066; AVX512-NEXT: retq1067 %t = call {<4 x i24>, <4 x i1>} @llvm.uadd.with.overflow.v4i24(<4 x i24> %a0, <4 x i24> %a1)1068 %val = extractvalue {<4 x i24>, <4 x i1>} %t, 01069 %obit = extractvalue {<4 x i24>, <4 x i1>} %t, 11070 %res = sext <4 x i1> %obit to <4 x i32>1071 store <4 x i24> %val, ptr %p21072 ret <4 x i32> %res1073}1074 1075define <4 x i32> @uaddo_v4i1(<4 x i1> %a0, <4 x i1> %a1, ptr %p2) nounwind {1076; SSE-LABEL: uaddo_v4i1:1077; SSE: # %bb.0:1078; SSE-NEXT: movdqa %xmm0, %xmm21079; SSE-NEXT: pxor %xmm1, %xmm21080; SSE-NEXT: pslld $31, %xmm21081; SSE-NEXT: movmskps %xmm2, %eax1082; SSE-NEXT: pand %xmm1, %xmm01083; SSE-NEXT: pslld $31, %xmm01084; SSE-NEXT: psrad $31, %xmm01085; SSE-NEXT: movb %al, (%rdi)1086; SSE-NEXT: retq1087;1088; AVX-LABEL: uaddo_v4i1:1089; AVX: # %bb.0:1090; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm21091; AVX-NEXT: vpslld $31, %xmm2, %xmm21092; AVX-NEXT: vmovmskps %xmm2, %eax1093; AVX-NEXT: vpand %xmm1, %xmm0, %xmm01094; AVX-NEXT: vpslld $31, %xmm0, %xmm01095; AVX-NEXT: vpsrad $31, %xmm0, %xmm01096; AVX-NEXT: movb %al, (%rdi)1097; AVX-NEXT: retq1098;1099; AVX512-LABEL: uaddo_v4i1:1100; AVX512: # %bb.0:1101; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm21102; AVX512-NEXT: vpslld $31, %xmm2, %xmm21103; AVX512-NEXT: vptestmd %xmm2, %xmm2, %k01104; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm01105; AVX512-NEXT: vpslld $31, %xmm0, %xmm01106; AVX512-NEXT: vpsrad $31, %xmm0, %xmm01107; AVX512-NEXT: kmovd %k0, %eax1108; AVX512-NEXT: movb %al, (%rdi)1109; AVX512-NEXT: retq1110 %t = call {<4 x i1>, <4 x i1>} @llvm.uadd.with.overflow.v4i1(<4 x i1> %a0, <4 x i1> %a1)1111 %val = extractvalue {<4 x i1>, <4 x i1>} %t, 01112 %obit = extractvalue {<4 x i1>, <4 x i1>} %t, 11113 %res = sext <4 x i1> %obit to <4 x i32>1114 store <4 x i1> %val, ptr %p21115 ret <4 x i32> %res1116}1117 1118define <2 x i32> @uaddo_v2i128(<2 x i128> %a0, <2 x i128> %a1, ptr %p2) nounwind {1119; SSE2-LABEL: uaddo_v2i128:1120; SSE2: # %bb.0:1121; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %rax1122; SSE2-NEXT: xorl %r10d, %r10d1123; SSE2-NEXT: addq {{[0-9]+}}(%rsp), %rdx1124; SSE2-NEXT: adcq {{[0-9]+}}(%rsp), %rcx1125; SSE2-NEXT: movl $0, %r11d1126; SSE2-NEXT: sbbl %r11d, %r11d1127; SSE2-NEXT: addq %r8, %rdi1128; SSE2-NEXT: adcq %r9, %rsi1129; SSE2-NEXT: movd %r11d, %xmm11130; SSE2-NEXT: sbbl %r10d, %r10d1131; SSE2-NEXT: movd %r10d, %xmm01132; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1133; SSE2-NEXT: movq %rdx, 16(%rax)1134; SSE2-NEXT: movq %rdi, (%rax)1135; SSE2-NEXT: movq %rcx, 24(%rax)1136; SSE2-NEXT: movq %rsi, 8(%rax)1137; SSE2-NEXT: retq1138;1139; SSSE3-LABEL: uaddo_v2i128:1140; SSSE3: # %bb.0:1141; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %rax1142; SSSE3-NEXT: xorl %r10d, %r10d1143; SSSE3-NEXT: addq {{[0-9]+}}(%rsp), %rdx1144; SSSE3-NEXT: adcq {{[0-9]+}}(%rsp), %rcx1145; SSSE3-NEXT: movl $0, %r11d1146; SSSE3-NEXT: sbbl %r11d, %r11d1147; SSSE3-NEXT: addq %r8, %rdi1148; SSSE3-NEXT: adcq %r9, %rsi1149; SSSE3-NEXT: movd %r11d, %xmm11150; SSSE3-NEXT: sbbl %r10d, %r10d1151; SSSE3-NEXT: movd %r10d, %xmm01152; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1153; SSSE3-NEXT: movq %rdx, 16(%rax)1154; SSSE3-NEXT: movq %rdi, (%rax)1155; SSSE3-NEXT: movq %rcx, 24(%rax)1156; SSSE3-NEXT: movq %rsi, 8(%rax)1157; SSSE3-NEXT: retq1158;1159; SSE41-LABEL: uaddo_v2i128:1160; SSE41: # %bb.0:1161; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %rax1162; SSE41-NEXT: xorl %r10d, %r10d1163; SSE41-NEXT: addq {{[0-9]+}}(%rsp), %rdx1164; SSE41-NEXT: adcq {{[0-9]+}}(%rsp), %rcx1165; SSE41-NEXT: movl $0, %r11d1166; SSE41-NEXT: sbbl %r11d, %r11d1167; SSE41-NEXT: addq %r8, %rdi1168; SSE41-NEXT: adcq %r9, %rsi1169; SSE41-NEXT: sbbl %r10d, %r10d1170; SSE41-NEXT: movd %r10d, %xmm01171; SSE41-NEXT: pinsrd $1, %r11d, %xmm01172; SSE41-NEXT: movq %rdx, 16(%rax)1173; SSE41-NEXT: movq %rdi, (%rax)1174; SSE41-NEXT: movq %rcx, 24(%rax)1175; SSE41-NEXT: movq %rsi, 8(%rax)1176; SSE41-NEXT: retq1177;1178; AVX-LABEL: uaddo_v2i128:1179; AVX: # %bb.0:1180; AVX-NEXT: movq {{[0-9]+}}(%rsp), %rax1181; AVX-NEXT: xorl %r10d, %r10d1182; AVX-NEXT: addq {{[0-9]+}}(%rsp), %rdx1183; AVX-NEXT: adcq {{[0-9]+}}(%rsp), %rcx1184; AVX-NEXT: movl $0, %r11d1185; AVX-NEXT: sbbl %r11d, %r11d1186; AVX-NEXT: addq %r8, %rdi1187; AVX-NEXT: adcq %r9, %rsi1188; AVX-NEXT: sbbl %r10d, %r10d1189; AVX-NEXT: vmovd %r10d, %xmm01190; AVX-NEXT: vpinsrd $1, %r11d, %xmm0, %xmm01191; AVX-NEXT: movq %rdx, 16(%rax)1192; AVX-NEXT: movq %rdi, (%rax)1193; AVX-NEXT: movq %rcx, 24(%rax)1194; AVX-NEXT: movq %rsi, 8(%rax)1195; AVX-NEXT: retq1196;1197; AVX512-LABEL: uaddo_v2i128:1198; AVX512: # %bb.0:1199; AVX512-NEXT: movq {{[0-9]+}}(%rsp), %rax1200; AVX512-NEXT: addq {{[0-9]+}}(%rsp), %rdx1201; AVX512-NEXT: adcq {{[0-9]+}}(%rsp), %rcx1202; AVX512-NEXT: setb %r10b1203; AVX512-NEXT: kmovd %r10d, %k01204; AVX512-NEXT: addq %r8, %rdi1205; AVX512-NEXT: adcq %r9, %rsi1206; AVX512-NEXT: setb %r8b1207; AVX512-NEXT: andl $1, %r8d1208; AVX512-NEXT: kmovw %r8d, %k11209; AVX512-NEXT: kshiftlw $1, %k0, %k01210; AVX512-NEXT: korw %k0, %k1, %k11211; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm01212; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}1213; AVX512-NEXT: movq %rdx, 16(%rax)1214; AVX512-NEXT: movq %rdi, (%rax)1215; AVX512-NEXT: movq %rcx, 24(%rax)1216; AVX512-NEXT: movq %rsi, 8(%rax)1217; AVX512-NEXT: retq1218 %t = call {<2 x i128>, <2 x i1>} @llvm.uadd.with.overflow.v2i128(<2 x i128> %a0, <2 x i128> %a1)1219 %val = extractvalue {<2 x i128>, <2 x i1>} %t, 01220 %obit = extractvalue {<2 x i128>, <2 x i1>} %t, 11221 %res = sext <2 x i1> %obit to <2 x i32>1222 store <2 x i128> %val, ptr %p21223 ret <2 x i32> %res1224}1225