1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=CHECK,SSE,SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=CHECK,SSE,SSSE3 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=CHECK,SSE,SSE41 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=CHECK,AVX,AVX1 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=CHECK,AVX,AVX2 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=CHECK,AVX512 8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=CHECK,AVX512 9 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, %eax 30; CHECK-NEXT: addl %esi, %edi 31; CHECK-NEXT: sbbl %eax, %eax 32; CHECK-NEXT: movl %edi, (%rdx) 33; CHECK-NEXT: retq 34 %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, 0 36 %obit = extractvalue {<1 x i32>, <1 x i1>} %t, 1 37 %res = sext <1 x i1> %obit to <1 x i32> 38 store <1 x i32> %val, ptr %p2 39 ret <1 x i32> %res 40} 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, %xmm1 47; SSE2-NEXT: pxor %xmm2, %xmm0 48; SSE2-NEXT: pxor %xmm1, %xmm2 49; SSE2-NEXT: pcmpgtd %xmm2, %xmm0 50; SSE2-NEXT: movq %xmm1, (%rdi) 51; SSE2-NEXT: retq 52; 53; SSSE3-LABEL: uaddo_v2i32: 54; SSSE3: # %bb.0: 55; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] 56; SSSE3-NEXT: paddd %xmm0, %xmm1 57; SSSE3-NEXT: pxor %xmm2, %xmm0 58; SSSE3-NEXT: pxor %xmm1, %xmm2 59; SSSE3-NEXT: pcmpgtd %xmm2, %xmm0 60; SSSE3-NEXT: movq %xmm1, (%rdi) 61; SSSE3-NEXT: retq 62; 63; SSE41-LABEL: uaddo_v2i32: 64; SSE41: # %bb.0: 65; SSE41-NEXT: paddd %xmm0, %xmm1 66; SSE41-NEXT: pmaxud %xmm1, %xmm0 67; SSE41-NEXT: pcmpeqd %xmm1, %xmm0 68; SSE41-NEXT: pcmpeqd %xmm2, %xmm2 69; SSE41-NEXT: pxor %xmm2, %xmm0 70; SSE41-NEXT: movq %xmm1, (%rdi) 71; SSE41-NEXT: retq 72; 73; AVX-LABEL: uaddo_v2i32: 74; AVX: # %bb.0: 75; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm1 76; AVX-NEXT: vpmaxud %xmm0, %xmm1, %xmm0 77; AVX-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0 78; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 79; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0 80; AVX-NEXT: vmovq %xmm1, (%rdi) 81; AVX-NEXT: retq 82; 83; AVX512-LABEL: uaddo_v2i32: 84; AVX512: # %bb.0: 85; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm1 86; AVX512-NEXT: vpcmpltud %xmm0, %xmm1, %k1 87; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0 88; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z} 89; AVX512-NEXT: vmovq %xmm1, (%rdi) 90; AVX512-NEXT: retq 91 %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, 0 93 %obit = extractvalue {<2 x i32>, <2 x i1>} %t, 1 94 %res = sext <2 x i1> %obit to <2 x i32> 95 store <2 x i32> %val, ptr %p2 96 ret <2 x i32> %res 97} 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, %xmm1 104; SSE2-NEXT: pxor %xmm2, %xmm0 105; SSE2-NEXT: pxor %xmm1, %xmm2 106; SSE2-NEXT: pcmpgtd %xmm2, %xmm0 107; 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: retq 111; 112; SSSE3-LABEL: uaddo_v3i32: 113; SSSE3: # %bb.0: 114; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] 115; SSSE3-NEXT: paddd %xmm0, %xmm1 116; SSSE3-NEXT: pxor %xmm2, %xmm0 117; SSSE3-NEXT: pxor %xmm1, %xmm2 118; SSSE3-NEXT: pcmpgtd %xmm2, %xmm0 119; 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: retq 123; 124; SSE41-LABEL: uaddo_v3i32: 125; SSE41: # %bb.0: 126; SSE41-NEXT: paddd %xmm0, %xmm1 127; SSE41-NEXT: pmaxud %xmm1, %xmm0 128; SSE41-NEXT: pcmpeqd %xmm1, %xmm0 129; SSE41-NEXT: pcmpeqd %xmm2, %xmm2 130; SSE41-NEXT: pxor %xmm2, %xmm0 131; SSE41-NEXT: pextrd $2, %xmm1, 8(%rdi) 132; SSE41-NEXT: movq %xmm1, (%rdi) 133; SSE41-NEXT: retq 134; 135; AVX-LABEL: uaddo_v3i32: 136; AVX: # %bb.0: 137; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm1 138; AVX-NEXT: vpmaxud %xmm0, %xmm1, %xmm0 139; AVX-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0 140; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 141; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0 142; AVX-NEXT: vpextrd $2, %xmm1, 8(%rdi) 143; AVX-NEXT: vmovq %xmm1, (%rdi) 144; AVX-NEXT: retq 145; 146; AVX512-LABEL: uaddo_v3i32: 147; AVX512: # %bb.0: 148; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm1 149; AVX512-NEXT: vpcmpltud %xmm0, %xmm1, %k1 150; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0 151; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z} 152; AVX512-NEXT: vpextrd $2, %xmm1, 8(%rdi) 153; AVX512-NEXT: vmovq %xmm1, (%rdi) 154; AVX512-NEXT: retq 155 %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, 0 157 %obit = extractvalue {<3 x i32>, <3 x i1>} %t, 1 158 %res = sext <3 x i1> %obit to <3 x i32> 159 store <3 x i32> %val, ptr %p2 160 ret <3 x i32> %res 161} 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, %xmm1 168; SSE2-NEXT: pxor %xmm2, %xmm0 169; SSE2-NEXT: pxor %xmm1, %xmm2 170; SSE2-NEXT: pcmpgtd %xmm2, %xmm0 171; SSE2-NEXT: movdqa %xmm1, (%rdi) 172; SSE2-NEXT: retq 173; 174; SSSE3-LABEL: uaddo_v4i32: 175; SSSE3: # %bb.0: 176; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] 177; SSSE3-NEXT: paddd %xmm0, %xmm1 178; SSSE3-NEXT: pxor %xmm2, %xmm0 179; SSSE3-NEXT: pxor %xmm1, %xmm2 180; SSSE3-NEXT: pcmpgtd %xmm2, %xmm0 181; SSSE3-NEXT: movdqa %xmm1, (%rdi) 182; SSSE3-NEXT: retq 183; 184; SSE41-LABEL: uaddo_v4i32: 185; SSE41: # %bb.0: 186; SSE41-NEXT: paddd %xmm0, %xmm1 187; SSE41-NEXT: pmaxud %xmm1, %xmm0 188; SSE41-NEXT: pcmpeqd %xmm1, %xmm0 189; SSE41-NEXT: pcmpeqd %xmm2, %xmm2 190; SSE41-NEXT: pxor %xmm2, %xmm0 191; SSE41-NEXT: movdqa %xmm1, (%rdi) 192; SSE41-NEXT: retq 193; 194; AVX-LABEL: uaddo_v4i32: 195; AVX: # %bb.0: 196; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm1 197; AVX-NEXT: vpmaxud %xmm0, %xmm1, %xmm0 198; AVX-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0 199; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 200; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm0 201; AVX-NEXT: vmovdqa %xmm1, (%rdi) 202; AVX-NEXT: retq 203; 204; AVX512-LABEL: uaddo_v4i32: 205; AVX512: # %bb.0: 206; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm1 207; AVX512-NEXT: vpcmpltud %xmm0, %xmm1, %k1 208; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0 209; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z} 210; AVX512-NEXT: vmovdqa %xmm1, (%rdi) 211; AVX512-NEXT: retq 212 %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, 0 214 %obit = extractvalue {<4 x i32>, <4 x i1>} %t, 1 215 %res = sext <4 x i1> %obit to <4 x i32> 216 store <4 x i32> %val, ptr %p2 217 ret <4 x i32> %res 218} 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, %rax 224; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 225; SSE2-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero 226; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1] 227; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 228; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 229; 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, %xmm0 232; SSE2-NEXT: movd %ecx, %xmm2 233; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1] 234; SSE2-NEXT: movd %edx, %xmm3 235; SSE2-NEXT: movd %esi, %xmm0 236; 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,zero 239; SSE2-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero 240; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1] 241; SSE2-NEXT: movd %r9d, %xmm2 242; SSE2-NEXT: movd {{.*#+}} xmm4 = mem[0],zero,zero,zero 243; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1] 244; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %rcx 245; SSE2-NEXT: paddd %xmm0, %xmm1 246; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] 247; SSE2-NEXT: movdqa %xmm1, (%rcx) 248; SSE2-NEXT: pxor %xmm4, %xmm1 249; SSE2-NEXT: pxor %xmm4, %xmm0 250; SSE2-NEXT: pcmpgtd %xmm1, %xmm0 251; SSE2-NEXT: paddd %xmm2, %xmm3 252; SSE2-NEXT: movq %xmm3, 16(%rcx) 253; SSE2-NEXT: pxor %xmm4, %xmm3 254; SSE2-NEXT: pxor %xmm4, %xmm2 255; SSE2-NEXT: pcmpgtd %xmm3, %xmm2 256; SSE2-NEXT: movq %xmm2, 16(%rdi) 257; SSE2-NEXT: movdqa %xmm0, (%rdi) 258; SSE2-NEXT: retq 259; 260; SSSE3-LABEL: uaddo_v6i32: 261; SSSE3: # %bb.0: 262; SSSE3-NEXT: movq %rdi, %rax 263; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 264; SSSE3-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero 265; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1] 266; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 267; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 268; 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, %xmm0 271; SSSE3-NEXT: movd %ecx, %xmm2 272; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1] 273; SSSE3-NEXT: movd %edx, %xmm3 274; SSSE3-NEXT: movd %esi, %xmm0 275; 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,zero 278; SSSE3-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero 279; SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1] 280; SSSE3-NEXT: movd %r9d, %xmm2 281; SSSE3-NEXT: movd {{.*#+}} xmm4 = mem[0],zero,zero,zero 282; SSSE3-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1] 283; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %rcx 284; SSSE3-NEXT: paddd %xmm0, %xmm1 285; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] 286; SSSE3-NEXT: movdqa %xmm1, (%rcx) 287; SSSE3-NEXT: pxor %xmm4, %xmm1 288; SSSE3-NEXT: pxor %xmm4, %xmm0 289; SSSE3-NEXT: pcmpgtd %xmm1, %xmm0 290; SSSE3-NEXT: paddd %xmm2, %xmm3 291; SSSE3-NEXT: movq %xmm3, 16(%rcx) 292; SSSE3-NEXT: pxor %xmm4, %xmm3 293; SSSE3-NEXT: pxor %xmm4, %xmm2 294; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2 295; SSSE3-NEXT: movq %xmm2, 16(%rdi) 296; SSSE3-NEXT: movdqa %xmm0, (%rdi) 297; SSSE3-NEXT: retq 298; 299; SSE41-LABEL: uaddo_v6i32: 300; SSE41: # %bb.0: 301; SSE41-NEXT: movq %rdi, %rax 302; SSE41-NEXT: movd %esi, %xmm0 303; SSE41-NEXT: pinsrd $1, %edx, %xmm0 304; SSE41-NEXT: pinsrd $2, %ecx, %xmm0 305; SSE41-NEXT: pinsrd $3, %r8d, %xmm0 306; SSE41-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 307; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm1 308; SSE41-NEXT: movd %r9d, %xmm2 309; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm2 310; SSE41-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero 311; SSE41-NEXT: pinsrd $1, {{[0-9]+}}(%rsp), %xmm3 312; SSE41-NEXT: pinsrd $2, {{[0-9]+}}(%rsp), %xmm3 313; SSE41-NEXT: pinsrd $3, {{[0-9]+}}(%rsp), %xmm3 314; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %rcx 315; SSE41-NEXT: paddd %xmm0, %xmm3 316; SSE41-NEXT: pmaxud %xmm3, %xmm0 317; SSE41-NEXT: pcmpeqd %xmm3, %xmm0 318; SSE41-NEXT: pcmpeqd %xmm4, %xmm4 319; SSE41-NEXT: pxor %xmm4, %xmm0 320; SSE41-NEXT: paddd %xmm2, %xmm1 321; SSE41-NEXT: pmaxud %xmm1, %xmm2 322; SSE41-NEXT: pcmpeqd %xmm1, %xmm2 323; SSE41-NEXT: pxor %xmm4, %xmm2 324; 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: retq 329; 330; AVX1-LABEL: uaddo_v6i32: 331; AVX1: # %bb.0: 332; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 333; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 334; AVX1-NEXT: vpaddd %xmm2, %xmm3, %xmm2 335; AVX1-NEXT: vpmaxud %xmm3, %xmm2, %xmm3 336; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm3 337; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 338; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 339; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1 340; AVX1-NEXT: vpmaxud %xmm0, %xmm1, %xmm0 341; AVX1-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0 342; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0 343; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 344; AVX1-NEXT: vmovq %xmm2, 16(%rdi) 345; AVX1-NEXT: vmovdqa %xmm1, (%rdi) 346; AVX1-NEXT: retq 347; 348; AVX2-LABEL: uaddo_v6i32: 349; AVX2: # %bb.0: 350; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm1 351; AVX2-NEXT: vpmaxud %ymm0, %ymm1, %ymm0 352; AVX2-NEXT: vpcmpeqd %ymm0, %ymm1, %ymm0 353; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 354; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 355; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 356; AVX2-NEXT: vmovq %xmm2, 16(%rdi) 357; AVX2-NEXT: vmovdqa %xmm1, (%rdi) 358; AVX2-NEXT: retq 359; 360; AVX512-LABEL: uaddo_v6i32: 361; AVX512: # %bb.0: 362; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm1 363; AVX512-NEXT: vpcmpltud %ymm0, %ymm1, %k1 364; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0 365; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z} 366; AVX512-NEXT: vextracti128 $1, %ymm1, %xmm2 367; AVX512-NEXT: vmovq %xmm2, 16(%rdi) 368; AVX512-NEXT: vmovdqa %xmm1, (%rdi) 369; AVX512-NEXT: retq 370 %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, 0 372 %obit = extractvalue {<6 x i32>, <6 x i1>} %t, 1 373 %res = sext <6 x i1> %obit to <6 x i32> 374 store <6 x i32> %val, ptr %p2 375 ret <6 x i32> %res 376} 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, %xmm2 383; SSE2-NEXT: pxor %xmm4, %xmm0 384; SSE2-NEXT: movdqa %xmm2, (%rdi) 385; SSE2-NEXT: pxor %xmm4, %xmm2 386; SSE2-NEXT: pcmpgtd %xmm2, %xmm0 387; SSE2-NEXT: paddd %xmm1, %xmm3 388; SSE2-NEXT: pxor %xmm4, %xmm1 389; SSE2-NEXT: pxor %xmm3, %xmm4 390; SSE2-NEXT: pcmpgtd %xmm4, %xmm1 391; SSE2-NEXT: movdqa %xmm3, 16(%rdi) 392; SSE2-NEXT: retq 393; 394; SSSE3-LABEL: uaddo_v8i32: 395; SSSE3: # %bb.0: 396; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] 397; SSSE3-NEXT: paddd %xmm0, %xmm2 398; SSSE3-NEXT: pxor %xmm4, %xmm0 399; SSSE3-NEXT: movdqa %xmm2, (%rdi) 400; SSSE3-NEXT: pxor %xmm4, %xmm2 401; SSSE3-NEXT: pcmpgtd %xmm2, %xmm0 402; SSSE3-NEXT: paddd %xmm1, %xmm3 403; SSSE3-NEXT: pxor %xmm4, %xmm1 404; SSSE3-NEXT: pxor %xmm3, %xmm4 405; SSSE3-NEXT: pcmpgtd %xmm4, %xmm1 406; SSSE3-NEXT: movdqa %xmm3, 16(%rdi) 407; SSSE3-NEXT: retq 408; 409; SSE41-LABEL: uaddo_v8i32: 410; SSE41: # %bb.0: 411; SSE41-NEXT: paddd %xmm0, %xmm2 412; SSE41-NEXT: pmaxud %xmm2, %xmm0 413; SSE41-NEXT: pcmpeqd %xmm2, %xmm0 414; SSE41-NEXT: pcmpeqd %xmm4, %xmm4 415; SSE41-NEXT: pxor %xmm4, %xmm0 416; SSE41-NEXT: paddd %xmm1, %xmm3 417; SSE41-NEXT: pmaxud %xmm3, %xmm1 418; SSE41-NEXT: pcmpeqd %xmm3, %xmm1 419; SSE41-NEXT: pxor %xmm4, %xmm1 420; SSE41-NEXT: movdqa %xmm3, 16(%rdi) 421; SSE41-NEXT: movdqa %xmm2, (%rdi) 422; SSE41-NEXT: retq 423; 424; AVX1-LABEL: uaddo_v8i32: 425; AVX1: # %bb.0: 426; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 427; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 428; AVX1-NEXT: vpaddd %xmm2, %xmm3, %xmm2 429; AVX1-NEXT: vpmaxud %xmm3, %xmm2, %xmm3 430; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm3 431; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 432; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 433; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1 434; AVX1-NEXT: vpmaxud %xmm0, %xmm1, %xmm0 435; AVX1-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0 436; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm0 437; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 438; AVX1-NEXT: vmovdqa %xmm2, 16(%rdi) 439; AVX1-NEXT: vmovdqa %xmm1, (%rdi) 440; AVX1-NEXT: retq 441; 442; AVX2-LABEL: uaddo_v8i32: 443; AVX2: # %bb.0: 444; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm1 445; AVX2-NEXT: vpmaxud %ymm0, %ymm1, %ymm0 446; AVX2-NEXT: vpcmpeqd %ymm0, %ymm1, %ymm0 447; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 448; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0 449; AVX2-NEXT: vmovdqa %ymm1, (%rdi) 450; AVX2-NEXT: retq 451; 452; AVX512-LABEL: uaddo_v8i32: 453; AVX512: # %bb.0: 454; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm1 455; AVX512-NEXT: vpcmpltud %ymm0, %ymm1, %k1 456; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0 457; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z} 458; AVX512-NEXT: vmovdqa %ymm1, (%rdi) 459; AVX512-NEXT: retq 460 %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, 0 462 %obit = extractvalue {<8 x i32>, <8 x i1>} %t, 1 463 %res = sext <8 x i1> %obit to <8 x i32> 464 store <8 x i32> %val, ptr %p2 465 ret <8 x i32> %res 466} 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, %xmm4 473; SSE2-NEXT: pxor %xmm8, %xmm0 474; SSE2-NEXT: movdqa %xmm4, (%rdi) 475; SSE2-NEXT: pxor %xmm8, %xmm4 476; SSE2-NEXT: pcmpgtd %xmm4, %xmm0 477; SSE2-NEXT: paddd %xmm1, %xmm5 478; SSE2-NEXT: pxor %xmm8, %xmm1 479; SSE2-NEXT: movdqa %xmm5, 16(%rdi) 480; SSE2-NEXT: pxor %xmm8, %xmm5 481; SSE2-NEXT: pcmpgtd %xmm5, %xmm1 482; SSE2-NEXT: paddd %xmm2, %xmm6 483; SSE2-NEXT: pxor %xmm8, %xmm2 484; SSE2-NEXT: movdqa %xmm6, 32(%rdi) 485; SSE2-NEXT: pxor %xmm8, %xmm6 486; SSE2-NEXT: pcmpgtd %xmm6, %xmm2 487; SSE2-NEXT: paddd %xmm3, %xmm7 488; SSE2-NEXT: pxor %xmm8, %xmm3 489; SSE2-NEXT: pxor %xmm7, %xmm8 490; SSE2-NEXT: pcmpgtd %xmm8, %xmm3 491; SSE2-NEXT: movdqa %xmm7, 48(%rdi) 492; SSE2-NEXT: retq 493; 494; SSSE3-LABEL: uaddo_v16i32: 495; SSSE3: # %bb.0: 496; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648] 497; SSSE3-NEXT: paddd %xmm0, %xmm4 498; SSSE3-NEXT: pxor %xmm8, %xmm0 499; SSSE3-NEXT: movdqa %xmm4, (%rdi) 500; SSSE3-NEXT: pxor %xmm8, %xmm4 501; SSSE3-NEXT: pcmpgtd %xmm4, %xmm0 502; SSSE3-NEXT: paddd %xmm1, %xmm5 503; SSSE3-NEXT: pxor %xmm8, %xmm1 504; SSSE3-NEXT: movdqa %xmm5, 16(%rdi) 505; SSSE3-NEXT: pxor %xmm8, %xmm5 506; SSSE3-NEXT: pcmpgtd %xmm5, %xmm1 507; SSSE3-NEXT: paddd %xmm2, %xmm6 508; SSSE3-NEXT: pxor %xmm8, %xmm2 509; SSSE3-NEXT: movdqa %xmm6, 32(%rdi) 510; SSSE3-NEXT: pxor %xmm8, %xmm6 511; SSSE3-NEXT: pcmpgtd %xmm6, %xmm2 512; SSSE3-NEXT: paddd %xmm3, %xmm7 513; SSSE3-NEXT: pxor %xmm8, %xmm3 514; SSSE3-NEXT: pxor %xmm7, %xmm8 515; SSSE3-NEXT: pcmpgtd %xmm8, %xmm3 516; SSSE3-NEXT: movdqa %xmm7, 48(%rdi) 517; SSSE3-NEXT: retq 518; 519; SSE41-LABEL: uaddo_v16i32: 520; SSE41: # %bb.0: 521; SSE41-NEXT: paddd %xmm0, %xmm4 522; SSE41-NEXT: pmaxud %xmm4, %xmm0 523; SSE41-NEXT: pcmpeqd %xmm4, %xmm0 524; SSE41-NEXT: pcmpeqd %xmm8, %xmm8 525; SSE41-NEXT: pxor %xmm8, %xmm0 526; SSE41-NEXT: paddd %xmm1, %xmm5 527; SSE41-NEXT: pmaxud %xmm5, %xmm1 528; SSE41-NEXT: pcmpeqd %xmm5, %xmm1 529; SSE41-NEXT: pxor %xmm8, %xmm1 530; SSE41-NEXT: paddd %xmm2, %xmm6 531; SSE41-NEXT: pmaxud %xmm6, %xmm2 532; SSE41-NEXT: pcmpeqd %xmm6, %xmm2 533; SSE41-NEXT: pxor %xmm8, %xmm2 534; SSE41-NEXT: paddd %xmm3, %xmm7 535; SSE41-NEXT: pmaxud %xmm7, %xmm3 536; SSE41-NEXT: pcmpeqd %xmm7, %xmm3 537; SSE41-NEXT: pxor %xmm8, %xmm3 538; 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: retq 543; 544; AVX1-LABEL: uaddo_v16i32: 545; AVX1: # %bb.0: 546; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 547; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 548; AVX1-NEXT: vpaddd %xmm4, %xmm5, %xmm4 549; AVX1-NEXT: vpmaxud %xmm5, %xmm4, %xmm5 550; AVX1-NEXT: vpcmpeqd %xmm5, %xmm4, %xmm5 551; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm3 552; AVX1-NEXT: vpmaxud %xmm1, %xmm3, %xmm1 553; AVX1-NEXT: vpcmpeqd %xmm1, %xmm3, %xmm1 554; AVX1-NEXT: vpackssdw %xmm5, %xmm1, %xmm1 555; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 556; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 557; AVX1-NEXT: vpaddd %xmm5, %xmm6, %xmm5 558; AVX1-NEXT: vpmaxud %xmm6, %xmm5, %xmm6 559; AVX1-NEXT: vpcmpeqd %xmm6, %xmm5, %xmm6 560; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm2 561; AVX1-NEXT: vpmaxud %xmm0, %xmm2, %xmm0 562; AVX1-NEXT: vpcmpeqd %xmm0, %xmm2, %xmm0 563; AVX1-NEXT: vpackssdw %xmm6, %xmm0, %xmm0 564; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 565; AVX1-NEXT: vpcmpeqd %xmm6, %xmm6, %xmm6 566; AVX1-NEXT: vpxor %xmm6, %xmm0, %xmm0 567; AVX1-NEXT: vpmovsxbd %xmm0, %xmm7 568; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1] 569; AVX1-NEXT: vpmovsxbd %xmm0, %xmm0 570; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm7, %ymm0 571; AVX1-NEXT: vpacksswb %xmm1, %xmm1, %xmm1 572; AVX1-NEXT: vpxor %xmm6, %xmm1, %xmm1 573; AVX1-NEXT: vpmovsxbd %xmm1, %xmm6 574; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,1,1] 575; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1 576; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm6, %ymm1 577; 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: retq 582; 583; AVX2-LABEL: uaddo_v16i32: 584; AVX2: # %bb.0: 585; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm3 586; AVX2-NEXT: vpmaxud %ymm1, %ymm3, %ymm1 587; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 588; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 589; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1 590; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5 591; AVX2-NEXT: vpackssdw %xmm5, %xmm1, %xmm1 592; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm2 593; AVX2-NEXT: vpmaxud %ymm0, %ymm2, %ymm0 594; AVX2-NEXT: vpcmpeqd %ymm0, %ymm2, %ymm0 595; AVX2-NEXT: vpacksswb %xmm1, %xmm1, %xmm1 596; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1 597; 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, %ymm0 599; AVX2-NEXT: vmovdqa %ymm3, 32(%rdi) 600; AVX2-NEXT: vmovdqa %ymm2, (%rdi) 601; AVX2-NEXT: retq 602; 603; AVX512-LABEL: uaddo_v16i32: 604; AVX512: # %bb.0: 605; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm1 606; AVX512-NEXT: vpcmpltud %zmm0, %zmm1, %k1 607; AVX512-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1 608; AVX512-NEXT: vmovdqa64 %zmm1, (%rdi) 609; AVX512-NEXT: retq 610 %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, 0 612 %obit = extractvalue {<16 x i32>, <16 x i1>} %t, 1 613 %res = sext <16 x i1> %obit to <16 x i32> 614 store <16 x i32> %val, ptr %p2 615 ret <16 x i32> %res 616} 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, %xmm1 622; SSE2-NEXT: pmaxub %xmm1, %xmm0 623; SSE2-NEXT: pcmpeqb %xmm1, %xmm0 624; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 625; SSE2-NEXT: pxor %xmm0, %xmm3 626; SSE2-NEXT: movdqa %xmm3, %xmm0 627; 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, %xmm4 630; 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, %xmm4 633; SSE2-NEXT: psrad $31, %xmm4 634; 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, %xmm2 636; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3] 637; SSE2-NEXT: pslld $31, %xmm2 638; SSE2-NEXT: psrad $31, %xmm2 639; SSE2-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7] 640; SSE2-NEXT: pslld $31, %xmm3 641; SSE2-NEXT: psrad $31, %xmm3 642; SSE2-NEXT: movdqa %xmm1, (%rdi) 643; SSE2-NEXT: movdqa %xmm4, %xmm1 644; SSE2-NEXT: retq 645; 646; SSSE3-LABEL: uaddo_v16i8: 647; SSSE3: # %bb.0: 648; SSSE3-NEXT: paddb %xmm0, %xmm1 649; SSSE3-NEXT: pmaxub %xmm1, %xmm0 650; SSSE3-NEXT: pcmpeqb %xmm1, %xmm0 651; SSSE3-NEXT: pcmpeqd %xmm3, %xmm3 652; SSSE3-NEXT: pxor %xmm0, %xmm3 653; SSSE3-NEXT: movdqa %xmm3, %xmm0 654; 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, %xmm4 657; 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, %xmm4 660; SSSE3-NEXT: psrad $31, %xmm4 661; 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, %xmm2 663; SSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3] 664; SSSE3-NEXT: pslld $31, %xmm2 665; SSSE3-NEXT: psrad $31, %xmm2 666; SSSE3-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7] 667; SSSE3-NEXT: pslld $31, %xmm3 668; SSSE3-NEXT: psrad $31, %xmm3 669; SSSE3-NEXT: movdqa %xmm1, (%rdi) 670; SSSE3-NEXT: movdqa %xmm4, %xmm1 671; SSSE3-NEXT: retq 672; 673; SSE41-LABEL: uaddo_v16i8: 674; SSE41: # %bb.0: 675; SSE41-NEXT: paddb %xmm0, %xmm1 676; SSE41-NEXT: pmaxub %xmm1, %xmm0 677; SSE41-NEXT: pcmpeqb %xmm1, %xmm0 678; SSE41-NEXT: pcmpeqd %xmm3, %xmm3 679; SSE41-NEXT: pxor %xmm0, %xmm3 680; SSE41-NEXT: pmovsxbd %xmm3, %xmm0 681; 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,zero 683; SSE41-NEXT: pslld $31, %xmm4 684; SSE41-NEXT: psrad $31, %xmm4 685; 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,zero 687; SSE41-NEXT: pslld $31, %xmm2 688; SSE41-NEXT: psrad $31, %xmm2 689; 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,zero 691; SSE41-NEXT: pslld $31, %xmm3 692; SSE41-NEXT: psrad $31, %xmm3 693; SSE41-NEXT: movdqa %xmm1, (%rdi) 694; SSE41-NEXT: movdqa %xmm4, %xmm1 695; SSE41-NEXT: retq 696; 697; AVX1-LABEL: uaddo_v16i8: 698; AVX1: # %bb.0: 699; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm2 700; AVX1-NEXT: vpmaxub %xmm0, %xmm2, %xmm0 701; AVX1-NEXT: vpcmpeqb %xmm0, %xmm2, %xmm0 702; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 703; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm1 704; AVX1-NEXT: vpmovsxbd %xmm1, %xmm0 705; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[1,1,1,1] 706; AVX1-NEXT: vpmovsxbd %xmm3, %xmm3 707; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 708; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[2,3,2,3] 709; AVX1-NEXT: vpmovsxbd %xmm3, %xmm3 710; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[3,3,3,3] 711; AVX1-NEXT: vpmovsxbd %xmm1, %xmm1 712; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1 713; AVX1-NEXT: vmovdqa %xmm2, (%rdi) 714; AVX1-NEXT: retq 715; 716; AVX2-LABEL: uaddo_v16i8: 717; AVX2: # %bb.0: 718; AVX2-NEXT: vpaddb %xmm1, %xmm0, %xmm2 719; AVX2-NEXT: vpmaxub %xmm0, %xmm2, %xmm0 720; AVX2-NEXT: vpcmpeqb %xmm0, %xmm2, %xmm0 721; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 722; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm1 723; AVX2-NEXT: vpmovsxbd %xmm1, %ymm0 724; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3] 725; AVX2-NEXT: vpmovsxbd %xmm1, %ymm1 726; AVX2-NEXT: vmovdqa %xmm2, (%rdi) 727; AVX2-NEXT: retq 728; 729; AVX512-LABEL: uaddo_v16i8: 730; AVX512: # %bb.0: 731; AVX512-NEXT: vpaddb %xmm1, %xmm0, %xmm1 732; AVX512-NEXT: vpcmpltub %xmm0, %xmm1, %k1 733; AVX512-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1 734; AVX512-NEXT: vmovdqa %xmm1, (%rdi) 735; AVX512-NEXT: retq 736 %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, 0 738 %obit = extractvalue {<16 x i8>, <16 x i1>} %t, 1 739 %res = sext <16 x i1> %obit to <16 x i32> 740 store <16 x i8> %val, ptr %p2 741 ret <16 x i32> %res 742} 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, %xmm2 748; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [32768,32768,32768,32768,32768,32768,32768,32768] 749; SSE2-NEXT: paddw %xmm0, %xmm1 750; SSE2-NEXT: pxor %xmm3, %xmm2 751; SSE2-NEXT: pxor %xmm1, %xmm3 752; SSE2-NEXT: pcmpgtw %xmm3, %xmm2 753; SSE2-NEXT: movdqa %xmm2, %xmm0 754; 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, %xmm2 757; SSE2-NEXT: psrad $31, %xmm2 758; SSE2-NEXT: movdqa %xmm1, (%rdi) 759; SSE2-NEXT: movdqa %xmm2, %xmm1 760; SSE2-NEXT: retq 761; 762; SSSE3-LABEL: uaddo_v8i16: 763; SSSE3: # %bb.0: 764; SSSE3-NEXT: movdqa %xmm0, %xmm2 765; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [32768,32768,32768,32768,32768,32768,32768,32768] 766; SSSE3-NEXT: paddw %xmm0, %xmm1 767; SSSE3-NEXT: pxor %xmm3, %xmm2 768; SSSE3-NEXT: pxor %xmm1, %xmm3 769; SSSE3-NEXT: pcmpgtw %xmm3, %xmm2 770; SSSE3-NEXT: movdqa %xmm2, %xmm0 771; 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, %xmm2 774; SSSE3-NEXT: psrad $31, %xmm2 775; SSSE3-NEXT: movdqa %xmm1, (%rdi) 776; SSSE3-NEXT: movdqa %xmm2, %xmm1 777; SSSE3-NEXT: retq 778; 779; SSE41-LABEL: uaddo_v8i16: 780; SSE41: # %bb.0: 781; SSE41-NEXT: paddw %xmm0, %xmm1 782; SSE41-NEXT: pmaxuw %xmm1, %xmm0 783; SSE41-NEXT: pcmpeqw %xmm1, %xmm0 784; SSE41-NEXT: pcmpeqd %xmm2, %xmm2 785; SSE41-NEXT: pxor %xmm0, %xmm2 786; SSE41-NEXT: pmovsxwd %xmm2, %xmm0 787; SSE41-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7] 788; SSE41-NEXT: pslld $31, %xmm2 789; SSE41-NEXT: psrad $31, %xmm2 790; SSE41-NEXT: movdqa %xmm1, (%rdi) 791; SSE41-NEXT: movdqa %xmm2, %xmm1 792; SSE41-NEXT: retq 793; 794; AVX1-LABEL: uaddo_v8i16: 795; AVX1: # %bb.0: 796; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm1 797; AVX1-NEXT: vpmaxuw %xmm0, %xmm1, %xmm0 798; AVX1-NEXT: vpcmpeqw %xmm0, %xmm1, %xmm0 799; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 800; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 801; AVX1-NEXT: vpmovsxwd %xmm0, %xmm2 802; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7] 803; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0 804; AVX1-NEXT: vmovdqa %xmm1, (%rdi) 805; AVX1-NEXT: retq 806; 807; AVX2-LABEL: uaddo_v8i16: 808; AVX2: # %bb.0: 809; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm1 810; AVX2-NEXT: vpmaxuw %xmm0, %xmm1, %xmm0 811; AVX2-NEXT: vpcmpeqw %xmm0, %xmm1, %xmm0 812; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 813; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0 814; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0 815; AVX2-NEXT: vmovdqa %xmm1, (%rdi) 816; AVX2-NEXT: retq 817; 818; AVX512-LABEL: uaddo_v8i16: 819; AVX512: # %bb.0: 820; AVX512-NEXT: vpaddw %xmm1, %xmm0, %xmm1 821; AVX512-NEXT: vpcmpltuw %xmm0, %xmm1, %k1 822; AVX512-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0 823; AVX512-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z} 824; AVX512-NEXT: vmovdqa %xmm1, (%rdi) 825; AVX512-NEXT: retq 826 %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, 0 828 %obit = extractvalue {<8 x i16>, <8 x i1>} %t, 1 829 %res = sext <8 x i1> %obit to <8 x i32> 830 store <8 x i16> %val, ptr %p2 831 ret <8 x i32> %res 832} 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, %xmm1 839; SSE-NEXT: pxor %xmm2, %xmm0 840; SSE-NEXT: pxor %xmm1, %xmm2 841; SSE-NEXT: movdqa %xmm0, %xmm3 842; SSE-NEXT: pcmpeqd %xmm2, %xmm3 843; SSE-NEXT: pcmpgtd %xmm2, %xmm0 844; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3] 845; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,3,3,3] 846; SSE-NEXT: pand %xmm2, %xmm3 847; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,3,3] 848; SSE-NEXT: por %xmm3, %xmm0 849; SSE-NEXT: movdqa %xmm1, (%rdi) 850; SSE-NEXT: retq 851; 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, %xmm3 857; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm1 858; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm0 859; AVX1-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm0 860; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 861; AVX1-NEXT: vmovdqa %xmm1, (%rdi) 862; AVX1-NEXT: retq 863; 864; AVX2-LABEL: uaddo_v2i64: 865; AVX2: # %bb.0: 866; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 867; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm3 868; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm1 869; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm0 870; AVX2-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm0 871; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 872; AVX2-NEXT: vmovdqa %xmm1, (%rdi) 873; AVX2-NEXT: retq 874; 875; AVX512-LABEL: uaddo_v2i64: 876; AVX512: # %bb.0: 877; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm1 878; AVX512-NEXT: vpcmpltuq %xmm0, %xmm1, %k1 879; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0 880; AVX512-NEXT: vmovdqa32 %xmm0, %xmm0 {%k1} {z} 881; AVX512-NEXT: vmovdqa %xmm1, (%rdi) 882; AVX512-NEXT: retq 883 %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, 0 885 %obit = extractvalue {<2 x i64>, <2 x i1>} %t, 1 886 %res = sext <2 x i1> %obit to <2 x i32> 887 store <2 x i64> %val, ptr %p2 888 ret <2 x i32> %res 889} 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, %xmm2 895; 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, %xmm1 897; SSE2-NEXT: pand %xmm3, %xmm2 898; SSE2-NEXT: paddd %xmm1, %xmm2 899; SSE2-NEXT: pand %xmm2, %xmm3 900; SSE2-NEXT: pcmpeqd %xmm2, %xmm3 901; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 902; SSE2-NEXT: pxor %xmm3, %xmm0 903; SSE2-NEXT: movd %xmm2, %eax 904; SSE2-NEXT: movw %ax, (%rdi) 905; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,3,3,3] 906; SSE2-NEXT: movd %xmm1, %ecx 907; SSE2-NEXT: movw %cx, 9(%rdi) 908; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3] 909; SSE2-NEXT: movd %xmm1, %edx 910; SSE2-NEXT: movw %dx, 6(%rdi) 911; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,1,1] 912; SSE2-NEXT: movd %xmm1, %esi 913; SSE2-NEXT: movw %si, 3(%rdi) 914; SSE2-NEXT: shrl $16, %eax 915; SSE2-NEXT: movb %al, 2(%rdi) 916; SSE2-NEXT: shrl $16, %ecx 917; SSE2-NEXT: movb %cl, 11(%rdi) 918; SSE2-NEXT: shrl $16, %edx 919; SSE2-NEXT: movb %dl, 8(%rdi) 920; SSE2-NEXT: shrl $16, %esi 921; SSE2-NEXT: movb %sil, 5(%rdi) 922; SSE2-NEXT: retq 923; 924; SSSE3-LABEL: uaddo_v4i24: 925; SSSE3: # %bb.0: 926; SSSE3-NEXT: movdqa %xmm0, %xmm2 927; 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, %xmm1 929; SSSE3-NEXT: pand %xmm3, %xmm2 930; SSSE3-NEXT: paddd %xmm1, %xmm2 931; SSSE3-NEXT: pand %xmm2, %xmm3 932; SSSE3-NEXT: pcmpeqd %xmm2, %xmm3 933; SSSE3-NEXT: pcmpeqd %xmm0, %xmm0 934; SSSE3-NEXT: pxor %xmm3, %xmm0 935; SSSE3-NEXT: movd %xmm2, %eax 936; SSSE3-NEXT: movw %ax, (%rdi) 937; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,3,3,3] 938; SSSE3-NEXT: movd %xmm1, %ecx 939; SSSE3-NEXT: movw %cx, 9(%rdi) 940; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3] 941; SSSE3-NEXT: movd %xmm1, %edx 942; SSSE3-NEXT: movw %dx, 6(%rdi) 943; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,1,1] 944; SSSE3-NEXT: movd %xmm1, %esi 945; SSSE3-NEXT: movw %si, 3(%rdi) 946; SSSE3-NEXT: shrl $16, %eax 947; SSSE3-NEXT: movb %al, 2(%rdi) 948; SSSE3-NEXT: shrl $16, %ecx 949; SSSE3-NEXT: movb %cl, 11(%rdi) 950; SSSE3-NEXT: shrl $16, %edx 951; SSSE3-NEXT: movb %dl, 8(%rdi) 952; SSSE3-NEXT: shrl $16, %esi 953; SSSE3-NEXT: movb %sil, 5(%rdi) 954; SSSE3-NEXT: retq 955; 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, %xmm1 960; SSE41-NEXT: pand %xmm2, %xmm0 961; SSE41-NEXT: paddd %xmm1, %xmm0 962; SSE41-NEXT: pand %xmm0, %xmm2 963; SSE41-NEXT: pcmpeqd %xmm0, %xmm2 964; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 965; SSE41-NEXT: pxor %xmm2, %xmm1 966; SSE41-NEXT: pextrd $3, %xmm0, %eax 967; SSE41-NEXT: movw %ax, 9(%rdi) 968; SSE41-NEXT: pextrd $2, %xmm0, %ecx 969; SSE41-NEXT: movw %cx, 6(%rdi) 970; SSE41-NEXT: pextrd $1, %xmm0, %edx 971; SSE41-NEXT: movw %dx, 3(%rdi) 972; SSE41-NEXT: movd %xmm0, %esi 973; SSE41-NEXT: movw %si, (%rdi) 974; SSE41-NEXT: shrl $16, %eax 975; SSE41-NEXT: movb %al, 11(%rdi) 976; SSE41-NEXT: shrl $16, %ecx 977; SSE41-NEXT: movb %cl, 8(%rdi) 978; SSE41-NEXT: shrl $16, %edx 979; SSE41-NEXT: movb %dl, 5(%rdi) 980; SSE41-NEXT: shrl $16, %esi 981; SSE41-NEXT: movb %sil, 2(%rdi) 982; SSE41-NEXT: movdqa %xmm1, %xmm0 983; SSE41-NEXT: retq 984; 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, %xmm1 989; AVX1-NEXT: vandps %xmm2, %xmm0, %xmm0 990; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm1 991; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm0 992; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 993; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 994; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0 995; AVX1-NEXT: vpextrd $3, %xmm1, %eax 996; AVX1-NEXT: movw %ax, 9(%rdi) 997; AVX1-NEXT: vpextrd $2, %xmm1, %ecx 998; AVX1-NEXT: movw %cx, 6(%rdi) 999; AVX1-NEXT: vpextrd $1, %xmm1, %edx 1000; AVX1-NEXT: movw %dx, 3(%rdi) 1001; AVX1-NEXT: vmovd %xmm1, %esi 1002; AVX1-NEXT: movw %si, (%rdi) 1003; AVX1-NEXT: shrl $16, %eax 1004; AVX1-NEXT: movb %al, 11(%rdi) 1005; AVX1-NEXT: shrl $16, %ecx 1006; AVX1-NEXT: movb %cl, 8(%rdi) 1007; AVX1-NEXT: shrl $16, %edx 1008; AVX1-NEXT: movb %dl, 5(%rdi) 1009; AVX1-NEXT: shrl $16, %esi 1010; AVX1-NEXT: movb %sil, 2(%rdi) 1011; AVX1-NEXT: retq 1012; 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, %xmm1 1017; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0 1018; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm1 1019; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm0 1020; AVX2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 1021; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 1022; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0 1023; AVX2-NEXT: vpextrd $3, %xmm1, %eax 1024; AVX2-NEXT: movw %ax, 9(%rdi) 1025; AVX2-NEXT: vpextrd $2, %xmm1, %ecx 1026; AVX2-NEXT: movw %cx, 6(%rdi) 1027; AVX2-NEXT: vpextrd $1, %xmm1, %edx 1028; AVX2-NEXT: movw %dx, 3(%rdi) 1029; AVX2-NEXT: vmovd %xmm1, %esi 1030; AVX2-NEXT: movw %si, (%rdi) 1031; AVX2-NEXT: shrl $16, %eax 1032; AVX2-NEXT: movb %al, 11(%rdi) 1033; AVX2-NEXT: shrl $16, %ecx 1034; AVX2-NEXT: movb %cl, 8(%rdi) 1035; AVX2-NEXT: shrl $16, %edx 1036; AVX2-NEXT: movb %dl, 5(%rdi) 1037; AVX2-NEXT: shrl $16, %esi 1038; AVX2-NEXT: movb %sil, 2(%rdi) 1039; AVX2-NEXT: retq 1040; 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, %xmm1 1045; AVX512-NEXT: vpand %xmm2, %xmm0, %xmm0 1046; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm1 1047; AVX512-NEXT: vpand %xmm2, %xmm1, %xmm0 1048; AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 1049; AVX512-NEXT: vpternlogq {{.*#+}} xmm0 = ~xmm0 1050; AVX512-NEXT: vpextrd $3, %xmm1, %eax 1051; AVX512-NEXT: movw %ax, 9(%rdi) 1052; AVX512-NEXT: vpextrd $2, %xmm1, %ecx 1053; AVX512-NEXT: movw %cx, 6(%rdi) 1054; AVX512-NEXT: vpextrd $1, %xmm1, %edx 1055; AVX512-NEXT: movw %dx, 3(%rdi) 1056; AVX512-NEXT: vmovd %xmm1, %esi 1057; AVX512-NEXT: movw %si, (%rdi) 1058; AVX512-NEXT: shrl $16, %eax 1059; AVX512-NEXT: movb %al, 11(%rdi) 1060; AVX512-NEXT: shrl $16, %ecx 1061; AVX512-NEXT: movb %cl, 8(%rdi) 1062; AVX512-NEXT: shrl $16, %edx 1063; AVX512-NEXT: movb %dl, 5(%rdi) 1064; AVX512-NEXT: shrl $16, %esi 1065; AVX512-NEXT: movb %sil, 2(%rdi) 1066; AVX512-NEXT: retq 1067 %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, 0 1069 %obit = extractvalue {<4 x i24>, <4 x i1>} %t, 1 1070 %res = sext <4 x i1> %obit to <4 x i32> 1071 store <4 x i24> %val, ptr %p2 1072 ret <4 x i32> %res 1073} 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, %xmm2 1079; SSE-NEXT: pxor %xmm1, %xmm2 1080; SSE-NEXT: pslld $31, %xmm2 1081; SSE-NEXT: movmskps %xmm2, %eax 1082; SSE-NEXT: pand %xmm1, %xmm0 1083; SSE-NEXT: pslld $31, %xmm0 1084; SSE-NEXT: psrad $31, %xmm0 1085; SSE-NEXT: movb %al, (%rdi) 1086; SSE-NEXT: retq 1087; 1088; AVX-LABEL: uaddo_v4i1: 1089; AVX: # %bb.0: 1090; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm2 1091; AVX-NEXT: vpslld $31, %xmm2, %xmm2 1092; AVX-NEXT: vmovmskps %xmm2, %eax 1093; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0 1094; AVX-NEXT: vpslld $31, %xmm0, %xmm0 1095; AVX-NEXT: vpsrad $31, %xmm0, %xmm0 1096; AVX-NEXT: movb %al, (%rdi) 1097; AVX-NEXT: retq 1098; 1099; AVX512-LABEL: uaddo_v4i1: 1100; AVX512: # %bb.0: 1101; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm2 1102; AVX512-NEXT: vpslld $31, %xmm2, %xmm2 1103; AVX512-NEXT: vptestmd %xmm2, %xmm2, %k0 1104; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm0 1105; AVX512-NEXT: vpslld $31, %xmm0, %xmm0 1106; AVX512-NEXT: vpsrad $31, %xmm0, %xmm0 1107; AVX512-NEXT: kmovd %k0, %eax 1108; AVX512-NEXT: movb %al, (%rdi) 1109; AVX512-NEXT: retq 1110 %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, 0 1112 %obit = extractvalue {<4 x i1>, <4 x i1>} %t, 1 1113 %res = sext <4 x i1> %obit to <4 x i32> 1114 store <4 x i1> %val, ptr %p2 1115 ret <4 x i32> %res 1116} 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), %rax 1122; SSE2-NEXT: xorl %r10d, %r10d 1123; SSE2-NEXT: addq {{[0-9]+}}(%rsp), %rdx 1124; SSE2-NEXT: adcq {{[0-9]+}}(%rsp), %rcx 1125; SSE2-NEXT: movl $0, %r11d 1126; SSE2-NEXT: sbbl %r11d, %r11d 1127; SSE2-NEXT: addq %r8, %rdi 1128; SSE2-NEXT: adcq %r9, %rsi 1129; SSE2-NEXT: movd %r11d, %xmm1 1130; SSE2-NEXT: sbbl %r10d, %r10d 1131; SSE2-NEXT: movd %r10d, %xmm0 1132; 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: retq 1138; 1139; SSSE3-LABEL: uaddo_v2i128: 1140; SSSE3: # %bb.0: 1141; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %rax 1142; SSSE3-NEXT: xorl %r10d, %r10d 1143; SSSE3-NEXT: addq {{[0-9]+}}(%rsp), %rdx 1144; SSSE3-NEXT: adcq {{[0-9]+}}(%rsp), %rcx 1145; SSSE3-NEXT: movl $0, %r11d 1146; SSSE3-NEXT: sbbl %r11d, %r11d 1147; SSSE3-NEXT: addq %r8, %rdi 1148; SSSE3-NEXT: adcq %r9, %rsi 1149; SSSE3-NEXT: movd %r11d, %xmm1 1150; SSSE3-NEXT: sbbl %r10d, %r10d 1151; SSSE3-NEXT: movd %r10d, %xmm0 1152; 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: retq 1158; 1159; SSE41-LABEL: uaddo_v2i128: 1160; SSE41: # %bb.0: 1161; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %rax 1162; SSE41-NEXT: xorl %r10d, %r10d 1163; SSE41-NEXT: addq {{[0-9]+}}(%rsp), %rdx 1164; SSE41-NEXT: adcq {{[0-9]+}}(%rsp), %rcx 1165; SSE41-NEXT: movl $0, %r11d 1166; SSE41-NEXT: sbbl %r11d, %r11d 1167; SSE41-NEXT: addq %r8, %rdi 1168; SSE41-NEXT: adcq %r9, %rsi 1169; SSE41-NEXT: sbbl %r10d, %r10d 1170; SSE41-NEXT: movd %r10d, %xmm0 1171; SSE41-NEXT: pinsrd $1, %r11d, %xmm0 1172; 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: retq 1177; 1178; AVX-LABEL: uaddo_v2i128: 1179; AVX: # %bb.0: 1180; AVX-NEXT: movq {{[0-9]+}}(%rsp), %rax 1181; AVX-NEXT: xorl %r10d, %r10d 1182; AVX-NEXT: addq {{[0-9]+}}(%rsp), %rdx 1183; AVX-NEXT: adcq {{[0-9]+}}(%rsp), %rcx 1184; AVX-NEXT: movl $0, %r11d 1185; AVX-NEXT: sbbl %r11d, %r11d 1186; AVX-NEXT: addq %r8, %rdi 1187; AVX-NEXT: adcq %r9, %rsi 1188; AVX-NEXT: sbbl %r10d, %r10d 1189; AVX-NEXT: vmovd %r10d, %xmm0 1190; AVX-NEXT: vpinsrd $1, %r11d, %xmm0, %xmm0 1191; 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: retq 1196; 1197; AVX512-LABEL: uaddo_v2i128: 1198; AVX512: # %bb.0: 1199; AVX512-NEXT: movq {{[0-9]+}}(%rsp), %rax 1200; AVX512-NEXT: addq {{[0-9]+}}(%rsp), %rdx 1201; AVX512-NEXT: adcq {{[0-9]+}}(%rsp), %rcx 1202; AVX512-NEXT: setb %r10b 1203; AVX512-NEXT: kmovd %r10d, %k0 1204; AVX512-NEXT: addq %r8, %rdi 1205; AVX512-NEXT: adcq %r9, %rsi 1206; AVX512-NEXT: setb %r8b 1207; AVX512-NEXT: andl $1, %r8d 1208; AVX512-NEXT: kmovw %r8d, %k1 1209; AVX512-NEXT: kshiftlw $1, %k0, %k0 1210; AVX512-NEXT: korw %k0, %k1, %k1 1211; AVX512-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0 1212; 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: retq 1218 %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, 0 1220 %obit = extractvalue {<2 x i128>, <2 x i1>} %t, 1 1221 %res = sext <2 x i1> %obit to <2 x i32> 1222 store <2 x i128> %val, ptr %p2 1223 ret <2 x i32> %res 1224} 1225