1180 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.sadd.with.overflow.v1i32(<1 x i32>, <1 x i32>)11declare {<2 x i32>, <2 x i1>} @llvm.sadd.with.overflow.v2i32(<2 x i32>, <2 x i32>)12declare {<3 x i32>, <3 x i1>} @llvm.sadd.with.overflow.v3i32(<3 x i32>, <3 x i32>)13declare {<4 x i32>, <4 x i1>} @llvm.sadd.with.overflow.v4i32(<4 x i32>, <4 x i32>)14declare {<6 x i32>, <6 x i1>} @llvm.sadd.with.overflow.v6i32(<6 x i32>, <6 x i32>)15declare {<8 x i32>, <8 x i1>} @llvm.sadd.with.overflow.v8i32(<8 x i32>, <8 x i32>)16declare {<16 x i32>, <16 x i1>} @llvm.sadd.with.overflow.v16i32(<16 x i32>, <16 x i32>)17 18declare {<16 x i8>, <16 x i1>} @llvm.sadd.with.overflow.v16i8(<16 x i8>, <16 x i8>)19declare {<8 x i16>, <8 x i1>} @llvm.sadd.with.overflow.v8i16(<8 x i16>, <8 x i16>)20declare {<2 x i64>, <2 x i1>} @llvm.sadd.with.overflow.v2i64(<2 x i64>, <2 x i64>)21 22declare {<4 x i24>, <4 x i1>} @llvm.sadd.with.overflow.v4i24(<4 x i24>, <4 x i24>)23declare {<4 x i1>, <4 x i1>} @llvm.sadd.with.overflow.v4i1(<4 x i1>, <4 x i1>)24declare {<2 x i128>, <2 x i1>} @llvm.sadd.with.overflow.v2i128(<2 x i128>, <2 x i128>)25 26define <1 x i32> @saddo_v1i32(<1 x i32> %a0, <1 x i32> %a1, ptr %p2) nounwind {27; CHECK-LABEL: saddo_v1i32:28; CHECK: # %bb.0:29; CHECK-NEXT: xorl %eax, %eax30; CHECK-NEXT: addl %esi, %edi31; CHECK-NEXT: seto %al32; CHECK-NEXT: negl %eax33; CHECK-NEXT: movl %edi, (%rdx)34; CHECK-NEXT: retq35 %t = call {<1 x i32>, <1 x i1>} @llvm.sadd.with.overflow.v1i32(<1 x i32> %a0, <1 x i32> %a1)36 %val = extractvalue {<1 x i32>, <1 x i1>} %t, 037 %obit = extractvalue {<1 x i32>, <1 x i1>} %t, 138 %res = sext <1 x i1> %obit to <1 x i32>39 store <1 x i32> %val, ptr %p240 ret <1 x i32> %res41}42 43define <2 x i32> @saddo_v2i32(<2 x i32> %a0, <2 x i32> %a1, ptr %p2) nounwind {44; SSE-LABEL: saddo_v2i32:45; SSE: # %bb.0:46; SSE-NEXT: pxor %xmm2, %xmm247; SSE-NEXT: pcmpgtd %xmm1, %xmm248; SSE-NEXT: paddd %xmm0, %xmm149; SSE-NEXT: pcmpgtd %xmm1, %xmm050; SSE-NEXT: pxor %xmm2, %xmm051; SSE-NEXT: movq %xmm1, (%rdi)52; SSE-NEXT: retq53;54; AVX-LABEL: saddo_v2i32:55; AVX: # %bb.0:56; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm257; AVX-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm258; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm159; AVX-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm060; AVX-NEXT: vpxor %xmm0, %xmm2, %xmm061; AVX-NEXT: vmovq %xmm1, (%rdi)62; AVX-NEXT: retq63;64; AVX512-LABEL: saddo_v2i32:65; AVX512: # %bb.0:66; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm267; AVX512-NEXT: vpcmpgtd %xmm1, %xmm2, %k068; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm169; AVX512-NEXT: vpcmpgtd %xmm1, %xmm0, %k170; AVX512-NEXT: kxorw %k1, %k0, %k171; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm072; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}73; AVX512-NEXT: vmovq %xmm1, (%rdi)74; AVX512-NEXT: retq75 %t = call {<2 x i32>, <2 x i1>} @llvm.sadd.with.overflow.v2i32(<2 x i32> %a0, <2 x i32> %a1)76 %val = extractvalue {<2 x i32>, <2 x i1>} %t, 077 %obit = extractvalue {<2 x i32>, <2 x i1>} %t, 178 %res = sext <2 x i1> %obit to <2 x i32>79 store <2 x i32> %val, ptr %p280 ret <2 x i32> %res81}82 83define <3 x i32> @saddo_v3i32(<3 x i32> %a0, <3 x i32> %a1, ptr %p2) nounwind {84; SSE2-LABEL: saddo_v3i32:85; SSE2: # %bb.0:86; SSE2-NEXT: pxor %xmm2, %xmm287; SSE2-NEXT: pcmpgtd %xmm1, %xmm288; SSE2-NEXT: paddd %xmm0, %xmm189; SSE2-NEXT: pcmpgtd %xmm1, %xmm090; SSE2-NEXT: pxor %xmm2, %xmm091; SSE2-NEXT: movq %xmm1, (%rdi)92; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]93; SSE2-NEXT: movd %xmm1, 8(%rdi)94; SSE2-NEXT: retq95;96; SSSE3-LABEL: saddo_v3i32:97; SSSE3: # %bb.0:98; SSSE3-NEXT: pxor %xmm2, %xmm299; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2100; SSSE3-NEXT: paddd %xmm0, %xmm1101; SSSE3-NEXT: pcmpgtd %xmm1, %xmm0102; SSSE3-NEXT: pxor %xmm2, %xmm0103; SSSE3-NEXT: movq %xmm1, (%rdi)104; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]105; SSSE3-NEXT: movd %xmm1, 8(%rdi)106; SSSE3-NEXT: retq107;108; SSE41-LABEL: saddo_v3i32:109; SSE41: # %bb.0:110; SSE41-NEXT: pxor %xmm2, %xmm2111; SSE41-NEXT: pcmpgtd %xmm1, %xmm2112; SSE41-NEXT: paddd %xmm0, %xmm1113; SSE41-NEXT: pcmpgtd %xmm1, %xmm0114; SSE41-NEXT: pxor %xmm2, %xmm0115; SSE41-NEXT: pextrd $2, %xmm1, 8(%rdi)116; SSE41-NEXT: movq %xmm1, (%rdi)117; SSE41-NEXT: retq118;119; AVX-LABEL: saddo_v3i32:120; AVX: # %bb.0:121; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2122; AVX-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm2123; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm1124; AVX-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0125; AVX-NEXT: vpxor %xmm0, %xmm2, %xmm0126; AVX-NEXT: vpextrd $2, %xmm1, 8(%rdi)127; AVX-NEXT: vmovq %xmm1, (%rdi)128; AVX-NEXT: retq129;130; AVX512-LABEL: saddo_v3i32:131; AVX512: # %bb.0:132; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2133; AVX512-NEXT: vpcmpgtd %xmm1, %xmm2, %k0134; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm1135; AVX512-NEXT: vpcmpgtd %xmm1, %xmm0, %k1136; AVX512-NEXT: kxorw %k1, %k0, %k1137; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0138; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}139; AVX512-NEXT: vpextrd $2, %xmm1, 8(%rdi)140; AVX512-NEXT: vmovq %xmm1, (%rdi)141; AVX512-NEXT: retq142 %t = call {<3 x i32>, <3 x i1>} @llvm.sadd.with.overflow.v3i32(<3 x i32> %a0, <3 x i32> %a1)143 %val = extractvalue {<3 x i32>, <3 x i1>} %t, 0144 %obit = extractvalue {<3 x i32>, <3 x i1>} %t, 1145 %res = sext <3 x i1> %obit to <3 x i32>146 store <3 x i32> %val, ptr %p2147 ret <3 x i32> %res148}149 150define <4 x i32> @saddo_v4i32(<4 x i32> %a0, <4 x i32> %a1, ptr %p2) nounwind {151; SSE-LABEL: saddo_v4i32:152; SSE: # %bb.0:153; SSE-NEXT: pxor %xmm2, %xmm2154; SSE-NEXT: pcmpgtd %xmm1, %xmm2155; SSE-NEXT: paddd %xmm0, %xmm1156; SSE-NEXT: pcmpgtd %xmm1, %xmm0157; SSE-NEXT: pxor %xmm2, %xmm0158; SSE-NEXT: movdqa %xmm1, (%rdi)159; SSE-NEXT: retq160;161; AVX-LABEL: saddo_v4i32:162; AVX: # %bb.0:163; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2164; AVX-NEXT: vpcmpgtd %xmm1, %xmm2, %xmm2165; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm1166; AVX-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0167; AVX-NEXT: vpxor %xmm0, %xmm2, %xmm0168; AVX-NEXT: vmovdqa %xmm1, (%rdi)169; AVX-NEXT: retq170;171; AVX512-LABEL: saddo_v4i32:172; AVX512: # %bb.0:173; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2174; AVX512-NEXT: vpcmpgtd %xmm1, %xmm2, %k0175; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm1176; AVX512-NEXT: vpcmpgtd %xmm1, %xmm0, %k1177; AVX512-NEXT: kxorw %k1, %k0, %k1178; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0179; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}180; AVX512-NEXT: vmovdqa %xmm1, (%rdi)181; AVX512-NEXT: retq182 %t = call {<4 x i32>, <4 x i1>} @llvm.sadd.with.overflow.v4i32(<4 x i32> %a0, <4 x i32> %a1)183 %val = extractvalue {<4 x i32>, <4 x i1>} %t, 0184 %obit = extractvalue {<4 x i32>, <4 x i1>} %t, 1185 %res = sext <4 x i1> %obit to <4 x i32>186 store <4 x i32> %val, ptr %p2187 ret <4 x i32> %res188}189 190define <6 x i32> @saddo_v6i32(<6 x i32> %a0, <6 x i32> %a1, ptr %p2) nounwind {191; SSE2-LABEL: saddo_v6i32:192; SSE2: # %bb.0:193; SSE2-NEXT: movq %rdi, %rax194; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero195; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero196; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]197; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero198; SSE2-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero199; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]200; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]201; SSE2-NEXT: movd %r8d, %xmm0202; SSE2-NEXT: movd %ecx, %xmm1203; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]204; SSE2-NEXT: movd %edx, %xmm0205; SSE2-NEXT: movd %esi, %xmm3206; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1]207; SSE2-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm1[0]208; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero209; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero210; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]211; SSE2-NEXT: movd %r9d, %xmm0212; SSE2-NEXT: movd {{.*#+}} xmm4 = mem[0],zero,zero,zero213; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]214; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %rcx215; SSE2-NEXT: movdqa %xmm3, %xmm4216; SSE2-NEXT: paddd %xmm2, %xmm4217; SSE2-NEXT: pcmpgtd %xmm4, %xmm3218; SSE2-NEXT: pxor %xmm5, %xmm5219; SSE2-NEXT: pxor %xmm6, %xmm6220; SSE2-NEXT: pcmpgtd %xmm2, %xmm6221; SSE2-NEXT: pxor %xmm3, %xmm6222; SSE2-NEXT: movdqa %xmm0, %xmm2223; SSE2-NEXT: paddd %xmm1, %xmm2224; SSE2-NEXT: pcmpgtd %xmm2, %xmm0225; SSE2-NEXT: pcmpgtd %xmm1, %xmm5226; SSE2-NEXT: pxor %xmm0, %xmm5227; SSE2-NEXT: movq %xmm2, 16(%rcx)228; SSE2-NEXT: movdqa %xmm4, (%rcx)229; SSE2-NEXT: movq %xmm5, 16(%rdi)230; SSE2-NEXT: movdqa %xmm6, (%rdi)231; SSE2-NEXT: retq232;233; SSSE3-LABEL: saddo_v6i32:234; SSSE3: # %bb.0:235; SSSE3-NEXT: movq %rdi, %rax236; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero237; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero238; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]239; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero240; SSSE3-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero241; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]242; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]243; SSSE3-NEXT: movd %r8d, %xmm0244; SSSE3-NEXT: movd %ecx, %xmm1245; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]246; SSSE3-NEXT: movd %edx, %xmm0247; SSSE3-NEXT: movd %esi, %xmm3248; SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1]249; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm1[0]250; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero251; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero252; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]253; SSSE3-NEXT: movd %r9d, %xmm0254; SSSE3-NEXT: movd {{.*#+}} xmm4 = mem[0],zero,zero,zero255; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]256; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %rcx257; SSSE3-NEXT: movdqa %xmm3, %xmm4258; SSSE3-NEXT: paddd %xmm2, %xmm4259; SSSE3-NEXT: pcmpgtd %xmm4, %xmm3260; SSSE3-NEXT: pxor %xmm5, %xmm5261; SSSE3-NEXT: pxor %xmm6, %xmm6262; SSSE3-NEXT: pcmpgtd %xmm2, %xmm6263; SSSE3-NEXT: pxor %xmm3, %xmm6264; SSSE3-NEXT: movdqa %xmm0, %xmm2265; SSSE3-NEXT: paddd %xmm1, %xmm2266; SSSE3-NEXT: pcmpgtd %xmm2, %xmm0267; SSSE3-NEXT: pcmpgtd %xmm1, %xmm5268; SSSE3-NEXT: pxor %xmm0, %xmm5269; SSSE3-NEXT: movq %xmm2, 16(%rcx)270; SSSE3-NEXT: movdqa %xmm4, (%rcx)271; SSSE3-NEXT: movq %xmm5, 16(%rdi)272; SSSE3-NEXT: movdqa %xmm6, (%rdi)273; SSSE3-NEXT: retq274;275; SSE41-LABEL: saddo_v6i32:276; SSE41: # %bb.0:277; SSE41-NEXT: movq %rdi, %rax278; SSE41-NEXT: movd %esi, %xmm1279; SSE41-NEXT: pinsrd $1, %edx, %xmm1280; SSE41-NEXT: pinsrd $2, %ecx, %xmm1281; SSE41-NEXT: pinsrd $3, %r8d, %xmm1282; SSE41-NEXT: movd %r9d, %xmm0283; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm0284; SSE41-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero285; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm2286; SSE41-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero287; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm3288; SSE41-NEXT: pinsrd $2, {{[0-9]+}}(%rsp), %xmm3289; SSE41-NEXT: pinsrd $3, {{[0-9]+}}(%rsp), %xmm3290; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %rcx291; SSE41-NEXT: movdqa %xmm1, %xmm4292; SSE41-NEXT: paddd %xmm3, %xmm4293; SSE41-NEXT: pcmpgtd %xmm4, %xmm1294; SSE41-NEXT: pxor %xmm5, %xmm5295; SSE41-NEXT: pxor %xmm6, %xmm6296; SSE41-NEXT: pcmpgtd %xmm3, %xmm6297; SSE41-NEXT: pxor %xmm1, %xmm6298; SSE41-NEXT: pcmpgtd %xmm2, %xmm5299; SSE41-NEXT: paddd %xmm0, %xmm2300; SSE41-NEXT: pcmpgtd %xmm2, %xmm0301; SSE41-NEXT: pxor %xmm5, %xmm0302; SSE41-NEXT: movq %xmm2, 16(%rcx)303; SSE41-NEXT: movdqa %xmm4, (%rcx)304; SSE41-NEXT: movq %xmm0, 16(%rdi)305; SSE41-NEXT: movdqa %xmm6, (%rdi)306; SSE41-NEXT: retq307;308; AVX1-LABEL: saddo_v6i32:309; AVX1: # %bb.0:310; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2311; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3312; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm4313; AVX1-NEXT: vpcmpgtd %xmm1, %xmm3, %xmm3314; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3315; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4316; AVX1-NEXT: vpaddd %xmm2, %xmm4, %xmm2317; AVX1-NEXT: vpcmpgtd %xmm2, %xmm4, %xmm4318; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1319; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0320; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0321; AVX1-NEXT: vxorps %ymm0, %ymm3, %ymm0322; AVX1-NEXT: vmovq %xmm2, 16(%rdi)323; AVX1-NEXT: vmovdqa %xmm1, (%rdi)324; AVX1-NEXT: retq325;326; AVX2-LABEL: saddo_v6i32:327; AVX2: # %bb.0:328; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2329; AVX2-NEXT: vpcmpgtd %ymm1, %ymm2, %ymm2330; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm1331; AVX2-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm0332; AVX2-NEXT: vpxor %ymm0, %ymm2, %ymm0333; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2334; AVX2-NEXT: vmovq %xmm2, 16(%rdi)335; AVX2-NEXT: vmovdqa %xmm1, (%rdi)336; AVX2-NEXT: retq337;338; AVX512-LABEL: saddo_v6i32:339; AVX512: # %bb.0:340; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2341; AVX512-NEXT: vpcmpgtd %ymm1, %ymm2, %k0342; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm1343; AVX512-NEXT: vpcmpgtd %ymm1, %ymm0, %k1344; AVX512-NEXT: kxorw %k1, %k0, %k1345; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0346; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}347; AVX512-NEXT: vextracti128 $1, %ymm1, %xmm2348; AVX512-NEXT: vmovq %xmm2, 16(%rdi)349; AVX512-NEXT: vmovdqa %xmm1, (%rdi)350; AVX512-NEXT: retq351 %t = call {<6 x i32>, <6 x i1>} @llvm.sadd.with.overflow.v6i32(<6 x i32> %a0, <6 x i32> %a1)352 %val = extractvalue {<6 x i32>, <6 x i1>} %t, 0353 %obit = extractvalue {<6 x i32>, <6 x i1>} %t, 1354 %res = sext <6 x i1> %obit to <6 x i32>355 store <6 x i32> %val, ptr %p2356 ret <6 x i32> %res357}358 359define <8 x i32> @saddo_v8i32(<8 x i32> %a0, <8 x i32> %a1, ptr %p2) nounwind {360; SSE-LABEL: saddo_v8i32:361; SSE: # %bb.0:362; SSE-NEXT: pxor %xmm4, %xmm4363; SSE-NEXT: pxor %xmm5, %xmm5364; SSE-NEXT: pcmpgtd %xmm2, %xmm5365; SSE-NEXT: paddd %xmm0, %xmm2366; SSE-NEXT: pcmpgtd %xmm2, %xmm0367; SSE-NEXT: pxor %xmm5, %xmm0368; SSE-NEXT: pcmpgtd %xmm3, %xmm4369; SSE-NEXT: paddd %xmm1, %xmm3370; SSE-NEXT: pcmpgtd %xmm3, %xmm1371; SSE-NEXT: pxor %xmm4, %xmm1372; SSE-NEXT: movdqa %xmm3, 16(%rdi)373; SSE-NEXT: movdqa %xmm2, (%rdi)374; SSE-NEXT: retq375;376; AVX1-LABEL: saddo_v8i32:377; AVX1: # %bb.0:378; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2379; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3380; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm4381; AVX1-NEXT: vpcmpgtd %xmm1, %xmm3, %xmm3382; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3383; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4384; AVX1-NEXT: vpaddd %xmm2, %xmm4, %xmm2385; AVX1-NEXT: vpcmpgtd %xmm2, %xmm4, %xmm4386; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1387; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0388; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0389; AVX1-NEXT: vxorps %ymm0, %ymm3, %ymm0390; AVX1-NEXT: vmovdqa %xmm2, 16(%rdi)391; AVX1-NEXT: vmovdqa %xmm1, (%rdi)392; AVX1-NEXT: retq393;394; AVX2-LABEL: saddo_v8i32:395; AVX2: # %bb.0:396; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2397; AVX2-NEXT: vpcmpgtd %ymm1, %ymm2, %ymm2398; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm1399; AVX2-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm0400; AVX2-NEXT: vpxor %ymm0, %ymm2, %ymm0401; AVX2-NEXT: vmovdqa %ymm1, (%rdi)402; AVX2-NEXT: retq403;404; AVX512-LABEL: saddo_v8i32:405; AVX512: # %bb.0:406; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2407; AVX512-NEXT: vpcmpgtd %ymm1, %ymm2, %k0408; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm1409; AVX512-NEXT: vpcmpgtd %ymm1, %ymm0, %k1410; AVX512-NEXT: kxorw %k1, %k0, %k1411; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0412; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}413; AVX512-NEXT: vmovdqa %ymm1, (%rdi)414; AVX512-NEXT: retq415 %t = call {<8 x i32>, <8 x i1>} @llvm.sadd.with.overflow.v8i32(<8 x i32> %a0, <8 x i32> %a1)416 %val = extractvalue {<8 x i32>, <8 x i1>} %t, 0417 %obit = extractvalue {<8 x i32>, <8 x i1>} %t, 1418 %res = sext <8 x i1> %obit to <8 x i32>419 store <8 x i32> %val, ptr %p2420 ret <8 x i32> %res421}422 423define <16 x i32> @saddo_v16i32(<16 x i32> %a0, <16 x i32> %a1, ptr %p2) nounwind {424; SSE-LABEL: saddo_v16i32:425; SSE: # %bb.0:426; SSE-NEXT: pxor %xmm8, %xmm8427; SSE-NEXT: pxor %xmm9, %xmm9428; SSE-NEXT: pcmpgtd %xmm4, %xmm9429; SSE-NEXT: paddd %xmm0, %xmm4430; SSE-NEXT: pcmpgtd %xmm4, %xmm0431; SSE-NEXT: pxor %xmm9, %xmm0432; SSE-NEXT: pxor %xmm9, %xmm9433; SSE-NEXT: pcmpgtd %xmm5, %xmm9434; SSE-NEXT: paddd %xmm1, %xmm5435; SSE-NEXT: pcmpgtd %xmm5, %xmm1436; SSE-NEXT: pxor %xmm9, %xmm1437; SSE-NEXT: pxor %xmm9, %xmm9438; SSE-NEXT: pcmpgtd %xmm6, %xmm9439; SSE-NEXT: paddd %xmm2, %xmm6440; SSE-NEXT: pcmpgtd %xmm6, %xmm2441; SSE-NEXT: pxor %xmm9, %xmm2442; SSE-NEXT: pcmpgtd %xmm7, %xmm8443; SSE-NEXT: paddd %xmm3, %xmm7444; SSE-NEXT: pcmpgtd %xmm7, %xmm3445; SSE-NEXT: pxor %xmm8, %xmm3446; SSE-NEXT: movdqa %xmm7, 48(%rdi)447; SSE-NEXT: movdqa %xmm6, 32(%rdi)448; SSE-NEXT: movdqa %xmm5, 16(%rdi)449; SSE-NEXT: movdqa %xmm4, (%rdi)450; SSE-NEXT: retq451;452; AVX1-LABEL: saddo_v16i32:453; AVX1: # %bb.0:454; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4455; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5456; AVX1-NEXT: vpcmpgtd %xmm4, %xmm5, %xmm6457; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7458; AVX1-NEXT: vpaddd %xmm4, %xmm7, %xmm4459; AVX1-NEXT: vpcmpgtd %xmm4, %xmm7, %xmm7460; AVX1-NEXT: vpxor %xmm7, %xmm6, %xmm6461; AVX1-NEXT: vpcmpgtd %xmm3, %xmm5, %xmm7462; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm3463; AVX1-NEXT: vpcmpgtd %xmm3, %xmm1, %xmm1464; AVX1-NEXT: vpxor %xmm1, %xmm7, %xmm1465; AVX1-NEXT: vpackssdw %xmm6, %xmm1, %xmm1466; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm6467; AVX1-NEXT: vpcmpgtd %xmm6, %xmm5, %xmm7468; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm8469; AVX1-NEXT: vpaddd %xmm6, %xmm8, %xmm6470; AVX1-NEXT: vpcmpgtd %xmm6, %xmm8, %xmm8471; AVX1-NEXT: vpxor %xmm7, %xmm8, %xmm7472; AVX1-NEXT: vpcmpgtd %xmm2, %xmm5, %xmm5473; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm2474; AVX1-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm0475; AVX1-NEXT: vpxor %xmm0, %xmm5, %xmm0476; AVX1-NEXT: vpackssdw %xmm7, %xmm0, %xmm0477; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0478; AVX1-NEXT: vpmovsxbd %xmm0, %xmm5479; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]480; AVX1-NEXT: vpmovsxbd %xmm0, %xmm0481; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm5, %ymm0482; AVX1-NEXT: vpacksswb %xmm1, %xmm1, %xmm1483; AVX1-NEXT: vpmovsxbd %xmm1, %xmm5484; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]485; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1486; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm5, %ymm1487; AVX1-NEXT: vmovdqa %xmm4, 48(%rdi)488; AVX1-NEXT: vmovdqa %xmm3, 32(%rdi)489; AVX1-NEXT: vmovdqa %xmm6, 16(%rdi)490; AVX1-NEXT: vmovdqa %xmm2, (%rdi)491; AVX1-NEXT: retq492;493; AVX2-LABEL: saddo_v16i32:494; AVX2: # %bb.0:495; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4496; AVX2-NEXT: vpcmpgtd %ymm3, %ymm4, %ymm5497; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm3498; AVX2-NEXT: vpcmpgtd %ymm3, %ymm1, %ymm1499; AVX2-NEXT: vpxor %ymm1, %ymm5, %ymm1500; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5501; AVX2-NEXT: vpackssdw %xmm5, %xmm1, %xmm1502; AVX2-NEXT: vpcmpgtd %ymm2, %ymm4, %ymm4503; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm2504; AVX2-NEXT: vpcmpgtd %ymm2, %ymm0, %ymm0505; AVX2-NEXT: vpxor %ymm0, %ymm4, %ymm0506; AVX2-NEXT: vpacksswb %xmm1, %xmm1, %xmm1507; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1508; 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]509; AVX2-NEXT: vmovdqa %ymm3, 32(%rdi)510; AVX2-NEXT: vmovdqa %ymm2, (%rdi)511; AVX2-NEXT: retq512;513; AVX512-LABEL: saddo_v16i32:514; AVX512: # %bb.0:515; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2516; AVX512-NEXT: vpcmpgtd %zmm1, %zmm2, %k0517; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm1518; AVX512-NEXT: vpcmpgtd %zmm1, %zmm0, %k1519; AVX512-NEXT: kxorw %k1, %k0, %k1520; AVX512-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1521; AVX512-NEXT: vmovdqa64 %zmm1, (%rdi)522; AVX512-NEXT: retq523 %t = call {<16 x i32>, <16 x i1>} @llvm.sadd.with.overflow.v16i32(<16 x i32> %a0, <16 x i32> %a1)524 %val = extractvalue {<16 x i32>, <16 x i1>} %t, 0525 %obit = extractvalue {<16 x i32>, <16 x i1>} %t, 1526 %res = sext <16 x i1> %obit to <16 x i32>527 store <16 x i32> %val, ptr %p2528 ret <16 x i32> %res529}530 531define <16 x i32> @saddo_v16i8(<16 x i8> %a0, <16 x i8> %a1, ptr %p2) nounwind {532; SSE2-LABEL: saddo_v16i8:533; SSE2: # %bb.0:534; SSE2-NEXT: movdqa %xmm0, %xmm2535; SSE2-NEXT: paddsb %xmm1, %xmm2536; SSE2-NEXT: paddb %xmm1, %xmm0537; SSE2-NEXT: pcmpeqb %xmm0, %xmm2538; SSE2-NEXT: pcmpeqd %xmm3, %xmm3539; SSE2-NEXT: pxor %xmm2, %xmm3540; SSE2-NEXT: movdqa %xmm3, %xmm4541; SSE2-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]542; SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3]543; SSE2-NEXT: movdqa %xmm3, %xmm1544; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]545; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]546; SSE2-NEXT: pslld $31, %xmm1547; SSE2-NEXT: psrad $31, %xmm1548; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]549; SSE2-NEXT: movdqa %xmm3, %xmm2550; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]551; SSE2-NEXT: pslld $31, %xmm2552; SSE2-NEXT: psrad $31, %xmm2553; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]554; SSE2-NEXT: pslld $31, %xmm3555; SSE2-NEXT: psrad $31, %xmm3556; SSE2-NEXT: movdqa %xmm0, (%rdi)557; SSE2-NEXT: movdqa %xmm4, %xmm0558; SSE2-NEXT: retq559;560; SSSE3-LABEL: saddo_v16i8:561; SSSE3: # %bb.0:562; SSSE3-NEXT: movdqa %xmm0, %xmm2563; SSSE3-NEXT: paddsb %xmm1, %xmm2564; SSSE3-NEXT: paddb %xmm1, %xmm0565; SSSE3-NEXT: pcmpeqb %xmm0, %xmm2566; SSSE3-NEXT: pcmpeqd %xmm3, %xmm3567; SSSE3-NEXT: pxor %xmm2, %xmm3568; SSSE3-NEXT: movdqa %xmm3, %xmm4569; SSSE3-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]570; SSSE3-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3]571; SSSE3-NEXT: movdqa %xmm3, %xmm1572; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]573; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]574; SSSE3-NEXT: pslld $31, %xmm1575; SSSE3-NEXT: psrad $31, %xmm1576; SSSE3-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]577; SSSE3-NEXT: movdqa %xmm3, %xmm2578; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]579; SSSE3-NEXT: pslld $31, %xmm2580; SSSE3-NEXT: psrad $31, %xmm2581; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]582; SSSE3-NEXT: pslld $31, %xmm3583; SSSE3-NEXT: psrad $31, %xmm3584; SSSE3-NEXT: movdqa %xmm0, (%rdi)585; SSSE3-NEXT: movdqa %xmm4, %xmm0586; SSSE3-NEXT: retq587;588; SSE41-LABEL: saddo_v16i8:589; SSE41: # %bb.0:590; SSE41-NEXT: movdqa %xmm0, %xmm2591; SSE41-NEXT: paddsb %xmm1, %xmm2592; SSE41-NEXT: paddb %xmm1, %xmm0593; SSE41-NEXT: pcmpeqb %xmm0, %xmm2594; SSE41-NEXT: pcmpeqd %xmm3, %xmm3595; SSE41-NEXT: pxor %xmm2, %xmm3596; SSE41-NEXT: pmovsxbd %xmm3, %xmm4597; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,1,1]598; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero599; SSE41-NEXT: pslld $31, %xmm1600; SSE41-NEXT: psrad $31, %xmm1601; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[2,3,2,3]602; SSE41-NEXT: pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero603; SSE41-NEXT: pslld $31, %xmm2604; SSE41-NEXT: psrad $31, %xmm2605; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[3,3,3,3]606; SSE41-NEXT: pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero607; SSE41-NEXT: pslld $31, %xmm3608; SSE41-NEXT: psrad $31, %xmm3609; SSE41-NEXT: movdqa %xmm0, (%rdi)610; SSE41-NEXT: movdqa %xmm4, %xmm0611; SSE41-NEXT: retq612;613; AVX1-LABEL: saddo_v16i8:614; AVX1: # %bb.0:615; AVX1-NEXT: vpaddsb %xmm1, %xmm0, %xmm2616; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm3617; AVX1-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm0618; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1619; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm1620; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0621; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]622; AVX1-NEXT: vpmovsxbd %xmm2, %xmm2623; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0624; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]625; AVX1-NEXT: vpmovsxbd %xmm2, %xmm2626; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,3,3]627; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1628; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1629; AVX1-NEXT: vmovdqa %xmm3, (%rdi)630; AVX1-NEXT: retq631;632; AVX2-LABEL: saddo_v16i8:633; AVX2: # %bb.0:634; AVX2-NEXT: vpaddsb %xmm1, %xmm0, %xmm2635; AVX2-NEXT: vpaddb %xmm1, %xmm0, %xmm3636; AVX2-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm0637; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1638; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm1639; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0640; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]641; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1642; AVX2-NEXT: vmovdqa %xmm3, (%rdi)643; AVX2-NEXT: retq644;645; AVX512-LABEL: saddo_v16i8:646; AVX512: # %bb.0:647; AVX512-NEXT: vpaddsb %xmm1, %xmm0, %xmm2648; AVX512-NEXT: vpaddb %xmm1, %xmm0, %xmm1649; AVX512-NEXT: vpcmpneqb %xmm2, %xmm1, %k1650; AVX512-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1651; AVX512-NEXT: vmovdqa %xmm1, (%rdi)652; AVX512-NEXT: retq653 %t = call {<16 x i8>, <16 x i1>} @llvm.sadd.with.overflow.v16i8(<16 x i8> %a0, <16 x i8> %a1)654 %val = extractvalue {<16 x i8>, <16 x i1>} %t, 0655 %obit = extractvalue {<16 x i8>, <16 x i1>} %t, 1656 %res = sext <16 x i1> %obit to <16 x i32>657 store <16 x i8> %val, ptr %p2658 ret <16 x i32> %res659}660 661define <8 x i32> @saddo_v8i16(<8 x i16> %a0, <8 x i16> %a1, ptr %p2) nounwind {662; SSE2-LABEL: saddo_v8i16:663; SSE2: # %bb.0:664; SSE2-NEXT: movdqa %xmm0, %xmm2665; SSE2-NEXT: paddsw %xmm1, %xmm2666; SSE2-NEXT: paddw %xmm1, %xmm0667; SSE2-NEXT: pcmpeqw %xmm0, %xmm2668; SSE2-NEXT: pcmpeqd %xmm1, %xmm1669; SSE2-NEXT: pxor %xmm2, %xmm1670; SSE2-NEXT: movdqa %xmm1, %xmm2671; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]672; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]673; SSE2-NEXT: pslld $31, %xmm1674; SSE2-NEXT: psrad $31, %xmm1675; SSE2-NEXT: movdqa %xmm0, (%rdi)676; SSE2-NEXT: movdqa %xmm2, %xmm0677; SSE2-NEXT: retq678;679; SSSE3-LABEL: saddo_v8i16:680; SSSE3: # %bb.0:681; SSSE3-NEXT: movdqa %xmm0, %xmm2682; SSSE3-NEXT: paddsw %xmm1, %xmm2683; SSSE3-NEXT: paddw %xmm1, %xmm0684; SSSE3-NEXT: pcmpeqw %xmm0, %xmm2685; SSSE3-NEXT: pcmpeqd %xmm1, %xmm1686; SSSE3-NEXT: pxor %xmm2, %xmm1687; SSSE3-NEXT: movdqa %xmm1, %xmm2688; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]689; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]690; SSSE3-NEXT: pslld $31, %xmm1691; SSSE3-NEXT: psrad $31, %xmm1692; SSSE3-NEXT: movdqa %xmm0, (%rdi)693; SSSE3-NEXT: movdqa %xmm2, %xmm0694; SSSE3-NEXT: retq695;696; SSE41-LABEL: saddo_v8i16:697; SSE41: # %bb.0:698; SSE41-NEXT: movdqa %xmm0, %xmm2699; SSE41-NEXT: paddsw %xmm1, %xmm2700; SSE41-NEXT: paddw %xmm1, %xmm0701; SSE41-NEXT: pcmpeqw %xmm0, %xmm2702; SSE41-NEXT: pcmpeqd %xmm1, %xmm1703; SSE41-NEXT: pxor %xmm2, %xmm1704; SSE41-NEXT: pmovsxwd %xmm1, %xmm2705; SSE41-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]706; SSE41-NEXT: pslld $31, %xmm1707; SSE41-NEXT: psrad $31, %xmm1708; SSE41-NEXT: movdqa %xmm0, (%rdi)709; SSE41-NEXT: movdqa %xmm2, %xmm0710; SSE41-NEXT: retq711;712; AVX1-LABEL: saddo_v8i16:713; AVX1: # %bb.0:714; AVX1-NEXT: vpaddsw %xmm1, %xmm0, %xmm2715; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm1716; AVX1-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm0717; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2718; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0719; AVX1-NEXT: vpmovsxwd %xmm0, %xmm2720; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]721; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0722; AVX1-NEXT: vmovdqa %xmm1, (%rdi)723; AVX1-NEXT: retq724;725; AVX2-LABEL: saddo_v8i16:726; AVX2: # %bb.0:727; AVX2-NEXT: vpaddsw %xmm1, %xmm0, %xmm2728; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm1729; AVX2-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm0730; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2731; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0732; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0733; AVX2-NEXT: vmovdqa %xmm1, (%rdi)734; AVX2-NEXT: retq735;736; AVX512-LABEL: saddo_v8i16:737; AVX512: # %bb.0:738; AVX512-NEXT: vpaddsw %xmm1, %xmm0, %xmm2739; AVX512-NEXT: vpaddw %xmm1, %xmm0, %xmm1740; AVX512-NEXT: vpcmpneqw %xmm2, %xmm1, %k1741; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0742; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}743; AVX512-NEXT: vmovdqa %xmm1, (%rdi)744; AVX512-NEXT: retq745 %t = call {<8 x i16>, <8 x i1>} @llvm.sadd.with.overflow.v8i16(<8 x i16> %a0, <8 x i16> %a1)746 %val = extractvalue {<8 x i16>, <8 x i1>} %t, 0747 %obit = extractvalue {<8 x i16>, <8 x i1>} %t, 1748 %res = sext <8 x i1> %obit to <8 x i32>749 store <8 x i16> %val, ptr %p2750 ret <8 x i32> %res751}752 753define <2 x i32> @saddo_v2i64(<2 x i64> %a0, <2 x i64> %a1, ptr %p2) nounwind {754; SSE2-LABEL: saddo_v2i64:755; SSE2: # %bb.0:756; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]757; SSE2-NEXT: movdqa %xmm0, %xmm3758; SSE2-NEXT: pxor %xmm2, %xmm3759; SSE2-NEXT: paddq %xmm1, %xmm0760; SSE2-NEXT: pxor %xmm0, %xmm2761; SSE2-NEXT: movdqa %xmm3, %xmm4762; SSE2-NEXT: pcmpgtd %xmm2, %xmm4763; SSE2-NEXT: pcmpeqd %xmm3, %xmm2764; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]765; SSE2-NEXT: pand %xmm4, %xmm2766; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]767; SSE2-NEXT: por %xmm2, %xmm3768; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]769; SSE2-NEXT: pxor %xmm2, %xmm2770; SSE2-NEXT: pcmpgtd %xmm1, %xmm2771; SSE2-NEXT: pxor %xmm3, %xmm2772; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]773; SSE2-NEXT: movdqa %xmm0, (%rdi)774; SSE2-NEXT: movdqa %xmm1, %xmm0775; SSE2-NEXT: retq776;777; SSSE3-LABEL: saddo_v2i64:778; SSSE3: # %bb.0:779; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]780; SSSE3-NEXT: movdqa %xmm0, %xmm3781; SSSE3-NEXT: pxor %xmm2, %xmm3782; SSSE3-NEXT: paddq %xmm1, %xmm0783; SSSE3-NEXT: pxor %xmm0, %xmm2784; SSSE3-NEXT: movdqa %xmm3, %xmm4785; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4786; SSSE3-NEXT: pcmpeqd %xmm3, %xmm2787; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]788; SSSE3-NEXT: pand %xmm4, %xmm2789; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]790; SSSE3-NEXT: por %xmm2, %xmm3791; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]792; SSSE3-NEXT: pxor %xmm2, %xmm2793; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2794; SSSE3-NEXT: pxor %xmm3, %xmm2795; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]796; SSSE3-NEXT: movdqa %xmm0, (%rdi)797; SSSE3-NEXT: movdqa %xmm1, %xmm0798; SSSE3-NEXT: retq799;800; SSE41-LABEL: saddo_v2i64:801; SSE41: # %bb.0:802; SSE41-NEXT: pmovzxdq {{.*#+}} xmm2 = [2147483648,2147483648]803; SSE41-NEXT: movdqa %xmm0, %xmm3804; SSE41-NEXT: pxor %xmm2, %xmm3805; SSE41-NEXT: paddq %xmm1, %xmm0806; SSE41-NEXT: pxor %xmm0, %xmm2807; SSE41-NEXT: movdqa %xmm3, %xmm4808; SSE41-NEXT: pcmpgtd %xmm2, %xmm4809; SSE41-NEXT: pcmpeqd %xmm3, %xmm2810; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]811; SSE41-NEXT: pand %xmm4, %xmm2812; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]813; SSE41-NEXT: por %xmm2, %xmm3814; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]815; SSE41-NEXT: pxor %xmm2, %xmm2816; SSE41-NEXT: pcmpgtd %xmm1, %xmm2817; SSE41-NEXT: pxor %xmm3, %xmm2818; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]819; SSE41-NEXT: movdqa %xmm0, (%rdi)820; SSE41-NEXT: movdqa %xmm1, %xmm0821; SSE41-NEXT: retq822;823; AVX-LABEL: saddo_v2i64:824; AVX: # %bb.0:825; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2826; AVX-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm2827; AVX-NEXT: vpaddq %xmm1, %xmm0, %xmm1828; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0829; AVX-NEXT: vpxor %xmm0, %xmm2, %xmm0830; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]831; AVX-NEXT: vmovdqa %xmm1, (%rdi)832; AVX-NEXT: retq833;834; AVX512-LABEL: saddo_v2i64:835; AVX512: # %bb.0:836; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2837; AVX512-NEXT: vpcmpgtq %xmm1, %xmm2, %k0838; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm1839; AVX512-NEXT: vpcmpgtq %xmm1, %xmm0, %k1840; AVX512-NEXT: kxorw %k1, %k0, %k1841; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0842; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}843; AVX512-NEXT: vmovdqa %xmm1, (%rdi)844; AVX512-NEXT: retq845 %t = call {<2 x i64>, <2 x i1>} @llvm.sadd.with.overflow.v2i64(<2 x i64> %a0, <2 x i64> %a1)846 %val = extractvalue {<2 x i64>, <2 x i1>} %t, 0847 %obit = extractvalue {<2 x i64>, <2 x i1>} %t, 1848 %res = sext <2 x i1> %obit to <2 x i32>849 store <2 x i64> %val, ptr %p2850 ret <2 x i32> %res851}852 853define <4 x i32> @saddo_v4i24(<4 x i24> %a0, <4 x i24> %a1, ptr %p2) nounwind {854; SSE2-LABEL: saddo_v4i24:855; SSE2: # %bb.0:856; SSE2-NEXT: movdqa %xmm0, %xmm2857; SSE2-NEXT: pslld $8, %xmm1858; SSE2-NEXT: psrad $8, %xmm1859; SSE2-NEXT: pslld $8, %xmm2860; SSE2-NEXT: psrad $8, %xmm2861; SSE2-NEXT: paddd %xmm1, %xmm2862; SSE2-NEXT: movdqa %xmm2, %xmm1863; SSE2-NEXT: pslld $8, %xmm1864; SSE2-NEXT: psrad $8, %xmm1865; SSE2-NEXT: pcmpeqd %xmm2, %xmm1866; SSE2-NEXT: pcmpeqd %xmm0, %xmm0867; SSE2-NEXT: pxor %xmm1, %xmm0868; SSE2-NEXT: movd %xmm2, %eax869; SSE2-NEXT: movw %ax, (%rdi)870; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,3,3,3]871; SSE2-NEXT: movd %xmm1, %ecx872; SSE2-NEXT: movw %cx, 9(%rdi)873; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]874; SSE2-NEXT: movd %xmm1, %edx875; SSE2-NEXT: movw %dx, 6(%rdi)876; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,1,1]877; SSE2-NEXT: movd %xmm1, %esi878; SSE2-NEXT: movw %si, 3(%rdi)879; SSE2-NEXT: shrl $16, %eax880; SSE2-NEXT: movb %al, 2(%rdi)881; SSE2-NEXT: shrl $16, %ecx882; SSE2-NEXT: movb %cl, 11(%rdi)883; SSE2-NEXT: shrl $16, %edx884; SSE2-NEXT: movb %dl, 8(%rdi)885; SSE2-NEXT: shrl $16, %esi886; SSE2-NEXT: movb %sil, 5(%rdi)887; SSE2-NEXT: retq888;889; SSSE3-LABEL: saddo_v4i24:890; SSSE3: # %bb.0:891; SSSE3-NEXT: movdqa %xmm0, %xmm2892; SSSE3-NEXT: pslld $8, %xmm1893; SSSE3-NEXT: psrad $8, %xmm1894; SSSE3-NEXT: pslld $8, %xmm2895; SSSE3-NEXT: psrad $8, %xmm2896; SSSE3-NEXT: paddd %xmm1, %xmm2897; SSSE3-NEXT: movdqa %xmm2, %xmm1898; SSSE3-NEXT: pslld $8, %xmm1899; SSSE3-NEXT: psrad $8, %xmm1900; SSSE3-NEXT: pcmpeqd %xmm2, %xmm1901; SSSE3-NEXT: pcmpeqd %xmm0, %xmm0902; SSSE3-NEXT: pxor %xmm1, %xmm0903; SSSE3-NEXT: movd %xmm2, %eax904; SSSE3-NEXT: movw %ax, (%rdi)905; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,3,3,3]906; SSSE3-NEXT: movd %xmm1, %ecx907; SSSE3-NEXT: movw %cx, 9(%rdi)908; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]909; SSSE3-NEXT: movd %xmm1, %edx910; SSSE3-NEXT: movw %dx, 6(%rdi)911; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,1,1]912; SSSE3-NEXT: movd %xmm1, %esi913; SSSE3-NEXT: movw %si, 3(%rdi)914; SSSE3-NEXT: shrl $16, %eax915; SSSE3-NEXT: movb %al, 2(%rdi)916; SSSE3-NEXT: shrl $16, %ecx917; SSSE3-NEXT: movb %cl, 11(%rdi)918; SSSE3-NEXT: shrl $16, %edx919; SSSE3-NEXT: movb %dl, 8(%rdi)920; SSSE3-NEXT: shrl $16, %esi921; SSSE3-NEXT: movb %sil, 5(%rdi)922; SSSE3-NEXT: retq923;924; SSE41-LABEL: saddo_v4i24:925; SSE41: # %bb.0:926; SSE41-NEXT: pslld $8, %xmm1927; SSE41-NEXT: psrad $8, %xmm1928; SSE41-NEXT: pslld $8, %xmm0929; SSE41-NEXT: psrad $8, %xmm0930; SSE41-NEXT: paddd %xmm1, %xmm0931; SSE41-NEXT: movdqa %xmm0, %xmm2932; SSE41-NEXT: pslld $8, %xmm2933; SSE41-NEXT: psrad $8, %xmm2934; SSE41-NEXT: pcmpeqd %xmm0, %xmm2935; SSE41-NEXT: pcmpeqd %xmm1, %xmm1936; SSE41-NEXT: pxor %xmm2, %xmm1937; SSE41-NEXT: pextrd $3, %xmm0, %eax938; SSE41-NEXT: movw %ax, 9(%rdi)939; SSE41-NEXT: pextrd $2, %xmm0, %ecx940; SSE41-NEXT: movw %cx, 6(%rdi)941; SSE41-NEXT: pextrd $1, %xmm0, %edx942; SSE41-NEXT: movw %dx, 3(%rdi)943; SSE41-NEXT: movd %xmm0, %esi944; SSE41-NEXT: movw %si, (%rdi)945; SSE41-NEXT: shrl $16, %eax946; SSE41-NEXT: movb %al, 11(%rdi)947; SSE41-NEXT: shrl $16, %ecx948; SSE41-NEXT: movb %cl, 8(%rdi)949; SSE41-NEXT: shrl $16, %edx950; SSE41-NEXT: movb %dl, 5(%rdi)951; SSE41-NEXT: shrl $16, %esi952; SSE41-NEXT: movb %sil, 2(%rdi)953; SSE41-NEXT: movdqa %xmm1, %xmm0954; SSE41-NEXT: retq955;956; AVX-LABEL: saddo_v4i24:957; AVX: # %bb.0:958; AVX-NEXT: vpslld $8, %xmm1, %xmm1959; AVX-NEXT: vpsrad $8, %xmm1, %xmm1960; AVX-NEXT: vpslld $8, %xmm0, %xmm0961; AVX-NEXT: vpsrad $8, %xmm0, %xmm0962; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm1963; AVX-NEXT: vpslld $8, %xmm1, %xmm0964; AVX-NEXT: vpsrad $8, %xmm0, %xmm0965; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0966; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2967; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0968; AVX-NEXT: vpextrd $3, %xmm1, %eax969; AVX-NEXT: movw %ax, 9(%rdi)970; AVX-NEXT: vpextrd $2, %xmm1, %ecx971; AVX-NEXT: movw %cx, 6(%rdi)972; AVX-NEXT: vpextrd $1, %xmm1, %edx973; AVX-NEXT: movw %dx, 3(%rdi)974; AVX-NEXT: vmovd %xmm1, %esi975; AVX-NEXT: movw %si, (%rdi)976; AVX-NEXT: shrl $16, %eax977; AVX-NEXT: movb %al, 11(%rdi)978; AVX-NEXT: shrl $16, %ecx979; AVX-NEXT: movb %cl, 8(%rdi)980; AVX-NEXT: shrl $16, %edx981; AVX-NEXT: movb %dl, 5(%rdi)982; AVX-NEXT: shrl $16, %esi983; AVX-NEXT: movb %sil, 2(%rdi)984; AVX-NEXT: retq985;986; AVX512-LABEL: saddo_v4i24:987; AVX512: # %bb.0:988; AVX512-NEXT: vpslld $8, %xmm1, %xmm1989; AVX512-NEXT: vpsrad $8, %xmm1, %xmm1990; AVX512-NEXT: vpslld $8, %xmm0, %xmm0991; AVX512-NEXT: vpsrad $8, %xmm0, %xmm0992; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm1993; AVX512-NEXT: vpslld $8, %xmm1, %xmm0994; AVX512-NEXT: vpsrad $8, %xmm0, %xmm0995; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0996; AVX512-NEXT: vpternlogq {{.*#+}} xmm0 = ~xmm0997; AVX512-NEXT: vpextrd $3, %xmm1, %eax998; AVX512-NEXT: movw %ax, 9(%rdi)999; AVX512-NEXT: vpextrd $2, %xmm1, %ecx1000; AVX512-NEXT: movw %cx, 6(%rdi)1001; AVX512-NEXT: vpextrd $1, %xmm1, %edx1002; AVX512-NEXT: movw %dx, 3(%rdi)1003; AVX512-NEXT: vmovd %xmm1, %esi1004; AVX512-NEXT: movw %si, (%rdi)1005; AVX512-NEXT: shrl $16, %eax1006; AVX512-NEXT: movb %al, 11(%rdi)1007; AVX512-NEXT: shrl $16, %ecx1008; AVX512-NEXT: movb %cl, 8(%rdi)1009; AVX512-NEXT: shrl $16, %edx1010; AVX512-NEXT: movb %dl, 5(%rdi)1011; AVX512-NEXT: shrl $16, %esi1012; AVX512-NEXT: movb %sil, 2(%rdi)1013; AVX512-NEXT: retq1014 %t = call {<4 x i24>, <4 x i1>} @llvm.sadd.with.overflow.v4i24(<4 x i24> %a0, <4 x i24> %a1)1015 %val = extractvalue {<4 x i24>, <4 x i1>} %t, 01016 %obit = extractvalue {<4 x i24>, <4 x i1>} %t, 11017 %res = sext <4 x i1> %obit to <4 x i32>1018 store <4 x i24> %val, ptr %p21019 ret <4 x i32> %res1020}1021 1022define <4 x i32> @saddo_v4i1(<4 x i1> %a0, <4 x i1> %a1, ptr %p2) nounwind {1023; SSE-LABEL: saddo_v4i1:1024; SSE: # %bb.0:1025; SSE-NEXT: movdqa %xmm0, %xmm21026; SSE-NEXT: pxor %xmm1, %xmm21027; SSE-NEXT: pslld $31, %xmm21028; SSE-NEXT: movmskps %xmm2, %eax1029; SSE-NEXT: pand %xmm1, %xmm01030; SSE-NEXT: pslld $31, %xmm01031; SSE-NEXT: psrad $31, %xmm01032; SSE-NEXT: movb %al, (%rdi)1033; SSE-NEXT: retq1034;1035; AVX-LABEL: saddo_v4i1:1036; AVX: # %bb.0:1037; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm21038; AVX-NEXT: vpslld $31, %xmm2, %xmm21039; AVX-NEXT: vmovmskps %xmm2, %eax1040; AVX-NEXT: vpand %xmm1, %xmm0, %xmm01041; AVX-NEXT: vpslld $31, %xmm0, %xmm01042; AVX-NEXT: vpsrad $31, %xmm0, %xmm01043; AVX-NEXT: movb %al, (%rdi)1044; AVX-NEXT: retq1045;1046; AVX512-LABEL: saddo_v4i1:1047; AVX512: # %bb.0:1048; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm21049; AVX512-NEXT: vpslld $31, %xmm2, %xmm21050; AVX512-NEXT: vptestmd %xmm2, %xmm2, %k01051; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm01052; AVX512-NEXT: vpslld $31, %xmm0, %xmm01053; AVX512-NEXT: vpsrad $31, %xmm0, %xmm01054; AVX512-NEXT: kmovd %k0, %eax1055; AVX512-NEXT: movb %al, (%rdi)1056; AVX512-NEXT: retq1057 %t = call {<4 x i1>, <4 x i1>} @llvm.sadd.with.overflow.v4i1(<4 x i1> %a0, <4 x i1> %a1)1058 %val = extractvalue {<4 x i1>, <4 x i1>} %t, 01059 %obit = extractvalue {<4 x i1>, <4 x i1>} %t, 11060 %res = sext <4 x i1> %obit to <4 x i32>1061 store <4 x i1> %val, ptr %p21062 ret <4 x i32> %res1063}1064 1065define <2 x i32> @saddo_v2i128(<2 x i128> %a0, <2 x i128> %a1, ptr %p2) nounwind {1066; SSE2-LABEL: saddo_v2i128:1067; SSE2: # %bb.0:1068; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %rax1069; SSE2-NEXT: addq %r8, %rdi1070; SSE2-NEXT: adcq %r9, %rsi1071; SSE2-NEXT: seto %r8b1072; SSE2-NEXT: addq {{[0-9]+}}(%rsp), %rdx1073; SSE2-NEXT: adcq {{[0-9]+}}(%rsp), %rcx1074; SSE2-NEXT: seto %r9b1075; SSE2-NEXT: movzbl %r9b, %r9d1076; SSE2-NEXT: negl %r9d1077; SSE2-NEXT: movd %r9d, %xmm11078; SSE2-NEXT: movzbl %r8b, %r8d1079; SSE2-NEXT: negl %r8d1080; SSE2-NEXT: movd %r8d, %xmm01081; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1082; SSE2-NEXT: movq %rdx, 16(%rax)1083; SSE2-NEXT: movq %rdi, (%rax)1084; SSE2-NEXT: movq %rcx, 24(%rax)1085; SSE2-NEXT: movq %rsi, 8(%rax)1086; SSE2-NEXT: retq1087;1088; SSSE3-LABEL: saddo_v2i128:1089; SSSE3: # %bb.0:1090; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %rax1091; SSSE3-NEXT: addq %r8, %rdi1092; SSSE3-NEXT: adcq %r9, %rsi1093; SSSE3-NEXT: seto %r8b1094; SSSE3-NEXT: addq {{[0-9]+}}(%rsp), %rdx1095; SSSE3-NEXT: adcq {{[0-9]+}}(%rsp), %rcx1096; SSSE3-NEXT: seto %r9b1097; SSSE3-NEXT: movzbl %r9b, %r9d1098; SSSE3-NEXT: negl %r9d1099; SSSE3-NEXT: movd %r9d, %xmm11100; SSSE3-NEXT: movzbl %r8b, %r8d1101; SSSE3-NEXT: negl %r8d1102; SSSE3-NEXT: movd %r8d, %xmm01103; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1104; SSSE3-NEXT: movq %rdx, 16(%rax)1105; SSSE3-NEXT: movq %rdi, (%rax)1106; SSSE3-NEXT: movq %rcx, 24(%rax)1107; SSSE3-NEXT: movq %rsi, 8(%rax)1108; SSSE3-NEXT: retq1109;1110; SSE41-LABEL: saddo_v2i128:1111; SSE41: # %bb.0:1112; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %rax1113; SSE41-NEXT: addq %r8, %rdi1114; SSE41-NEXT: adcq %r9, %rsi1115; SSE41-NEXT: seto %r8b1116; SSE41-NEXT: addq {{[0-9]+}}(%rsp), %rdx1117; SSE41-NEXT: adcq {{[0-9]+}}(%rsp), %rcx1118; SSE41-NEXT: seto %r9b1119; SSE41-NEXT: movzbl %r9b, %r9d1120; SSE41-NEXT: negl %r9d1121; SSE41-NEXT: movzbl %r8b, %r8d1122; SSE41-NEXT: negl %r8d1123; SSE41-NEXT: movd %r8d, %xmm01124; SSE41-NEXT: pinsrd $1, %r9d, %xmm01125; SSE41-NEXT: movq %rdx, 16(%rax)1126; SSE41-NEXT: movq %rdi, (%rax)1127; SSE41-NEXT: movq %rcx, 24(%rax)1128; SSE41-NEXT: movq %rsi, 8(%rax)1129; SSE41-NEXT: retq1130;1131; AVX-LABEL: saddo_v2i128:1132; AVX: # %bb.0:1133; AVX-NEXT: movq {{[0-9]+}}(%rsp), %rax1134; AVX-NEXT: addq %r8, %rdi1135; AVX-NEXT: adcq %r9, %rsi1136; AVX-NEXT: seto %r8b1137; AVX-NEXT: addq {{[0-9]+}}(%rsp), %rdx1138; AVX-NEXT: adcq {{[0-9]+}}(%rsp), %rcx1139; AVX-NEXT: seto %r9b1140; AVX-NEXT: movzbl %r9b, %r9d1141; AVX-NEXT: negl %r9d1142; AVX-NEXT: movzbl %r8b, %r8d1143; AVX-NEXT: negl %r8d1144; AVX-NEXT: vmovd %r8d, %xmm01145; AVX-NEXT: vpinsrd $1, %r9d, %xmm0, %xmm01146; AVX-NEXT: movq %rdx, 16(%rax)1147; AVX-NEXT: movq %rdi, (%rax)1148; AVX-NEXT: movq %rcx, 24(%rax)1149; AVX-NEXT: movq %rsi, 8(%rax)1150; AVX-NEXT: retq1151;1152; AVX512-LABEL: saddo_v2i128:1153; AVX512: # %bb.0:1154; AVX512-NEXT: movq {{[0-9]+}}(%rsp), %rax1155; AVX512-NEXT: addq {{[0-9]+}}(%rsp), %rdx1156; AVX512-NEXT: adcq {{[0-9]+}}(%rsp), %rcx1157; AVX512-NEXT: seto %r10b1158; AVX512-NEXT: kmovd %r10d, %k01159; AVX512-NEXT: addq %r8, %rdi1160; AVX512-NEXT: adcq %r9, %rsi1161; AVX512-NEXT: seto %r8b1162; AVX512-NEXT: andl $1, %r8d1163; AVX512-NEXT: kmovw %r8d, %k11164; AVX512-NEXT: kshiftlw $1, %k0, %k01165; AVX512-NEXT: korw %k0, %k1, %k11166; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm01167; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z}1168; AVX512-NEXT: movq %rdx, 16(%rax)1169; AVX512-NEXT: movq %rdi, (%rax)1170; AVX512-NEXT: movq %rcx, 24(%rax)1171; AVX512-NEXT: movq %rsi, 8(%rax)1172; AVX512-NEXT: retq1173 %t = call {<2 x i128>, <2 x i1>} @llvm.sadd.with.overflow.v2i128(<2 x i128> %a0, <2 x i128> %a1)1174 %val = extractvalue {<2 x i128>, <2 x i1>} %t, 01175 %obit = extractvalue {<2 x i128>, <2 x i1>} %t, 11176 %res = sext <2 x i1> %obit to <2 x i32>1177 store <2 x i128> %val, ptr %p21178 ret <2 x i32> %res1179}1180