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=SSE,SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE,SSSE3 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F 8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F 9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW 10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW 11 12declare <1 x i8> @llvm.sadd.sat.v1i8(<1 x i8>, <1 x i8>) 13declare <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8>, <2 x i8>) 14declare <4 x i8> @llvm.sadd.sat.v4i8(<4 x i8>, <4 x i8>) 15declare <8 x i8> @llvm.sadd.sat.v8i8(<8 x i8>, <8 x i8>) 16declare <12 x i8> @llvm.sadd.sat.v12i8(<12 x i8>, <12 x i8>) 17declare <16 x i8> @llvm.sadd.sat.v16i8(<16 x i8>, <16 x i8>) 18declare <32 x i8> @llvm.sadd.sat.v32i8(<32 x i8>, <32 x i8>) 19declare <64 x i8> @llvm.sadd.sat.v64i8(<64 x i8>, <64 x i8>) 20 21declare <1 x i16> @llvm.sadd.sat.v1i16(<1 x i16>, <1 x i16>) 22declare <2 x i16> @llvm.sadd.sat.v2i16(<2 x i16>, <2 x i16>) 23declare <4 x i16> @llvm.sadd.sat.v4i16(<4 x i16>, <4 x i16>) 24declare <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16>, <8 x i16>) 25declare <12 x i16> @llvm.sadd.sat.v12i16(<12 x i16>, <12 x i16>) 26declare <16 x i16> @llvm.sadd.sat.v16i16(<16 x i16>, <16 x i16>) 27declare <32 x i16> @llvm.sadd.sat.v32i16(<32 x i16>, <32 x i16>) 28 29declare <16 x i1> @llvm.sadd.sat.v16i1(<16 x i1>, <16 x i1>) 30declare <16 x i4> @llvm.sadd.sat.v16i4(<16 x i4>, <16 x i4>) 31 32declare <2 x i32> @llvm.sadd.sat.v2i32(<2 x i32>, <2 x i32>) 33declare <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32>, <4 x i32>) 34declare <8 x i32> @llvm.sadd.sat.v8i32(<8 x i32>, <8 x i32>) 35declare <16 x i32> @llvm.sadd.sat.v16i32(<16 x i32>, <16 x i32>) 36declare <2 x i64> @llvm.sadd.sat.v2i64(<2 x i64>, <2 x i64>) 37declare <4 x i64> @llvm.sadd.sat.v4i64(<4 x i64>, <4 x i64>) 38declare <8 x i64> @llvm.sadd.sat.v8i64(<8 x i64>, <8 x i64>) 39 40declare <4 x i24> @llvm.sadd.sat.v4i24(<4 x i24>, <4 x i24>) 41declare <2 x i128> @llvm.sadd.sat.v2i128(<2 x i128>, <2 x i128>) 42 43; Legal types, depending on architecture. 44 45define <16 x i8> @v16i8(<16 x i8> %x, <16 x i8> %y) nounwind { 46; SSE-LABEL: v16i8: 47; SSE: # %bb.0: 48; SSE-NEXT: paddsb %xmm1, %xmm0 49; SSE-NEXT: retq 50; 51; AVX-LABEL: v16i8: 52; AVX: # %bb.0: 53; AVX-NEXT: vpaddsb %xmm1, %xmm0, %xmm0 54; AVX-NEXT: retq 55 %z = call <16 x i8> @llvm.sadd.sat.v16i8(<16 x i8> %x, <16 x i8> %y) 56 ret <16 x i8> %z 57} 58 59define <32 x i8> @v32i8(<32 x i8> %x, <32 x i8> %y) nounwind { 60; SSE-LABEL: v32i8: 61; SSE: # %bb.0: 62; SSE-NEXT: paddsb %xmm2, %xmm0 63; SSE-NEXT: paddsb %xmm3, %xmm1 64; SSE-NEXT: retq 65; 66; AVX1-LABEL: v32i8: 67; AVX1: # %bb.0: 68; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 69; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 70; AVX1-NEXT: vpaddsb %xmm2, %xmm3, %xmm2 71; AVX1-NEXT: vpaddsb %xmm1, %xmm0, %xmm0 72; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 73; AVX1-NEXT: retq 74; 75; AVX2-LABEL: v32i8: 76; AVX2: # %bb.0: 77; AVX2-NEXT: vpaddsb %ymm1, %ymm0, %ymm0 78; AVX2-NEXT: retq 79; 80; AVX512-LABEL: v32i8: 81; AVX512: # %bb.0: 82; AVX512-NEXT: vpaddsb %ymm1, %ymm0, %ymm0 83; AVX512-NEXT: retq 84 %z = call <32 x i8> @llvm.sadd.sat.v32i8(<32 x i8> %x, <32 x i8> %y) 85 ret <32 x i8> %z 86} 87 88define <64 x i8> @v64i8(<64 x i8> %x, <64 x i8> %y) nounwind { 89; SSE-LABEL: v64i8: 90; SSE: # %bb.0: 91; SSE-NEXT: paddsb %xmm4, %xmm0 92; SSE-NEXT: paddsb %xmm5, %xmm1 93; SSE-NEXT: paddsb %xmm6, %xmm2 94; SSE-NEXT: paddsb %xmm7, %xmm3 95; SSE-NEXT: retq 96; 97; AVX1-LABEL: v64i8: 98; AVX1: # %bb.0: 99; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 100; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 101; AVX1-NEXT: vpaddsb %xmm4, %xmm5, %xmm4 102; AVX1-NEXT: vpaddsb %xmm2, %xmm0, %xmm0 103; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 104; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2 105; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 106; AVX1-NEXT: vpaddsb %xmm2, %xmm4, %xmm2 107; AVX1-NEXT: vpaddsb %xmm3, %xmm1, %xmm1 108; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 109; AVX1-NEXT: retq 110; 111; AVX2-LABEL: v64i8: 112; AVX2: # %bb.0: 113; AVX2-NEXT: vpaddsb %ymm2, %ymm0, %ymm0 114; AVX2-NEXT: vpaddsb %ymm3, %ymm1, %ymm1 115; AVX2-NEXT: retq 116; 117; AVX512F-LABEL: v64i8: 118; AVX512F: # %bb.0: 119; AVX512F-NEXT: vextracti64x4 $1, %zmm1, %ymm2 120; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm3 121; AVX512F-NEXT: vpaddsb %ymm2, %ymm3, %ymm2 122; AVX512F-NEXT: vpaddsb %ymm1, %ymm0, %ymm0 123; AVX512F-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm0 124; AVX512F-NEXT: retq 125; 126; AVX512BW-LABEL: v64i8: 127; AVX512BW: # %bb.0: 128; AVX512BW-NEXT: vpaddsb %zmm1, %zmm0, %zmm0 129; AVX512BW-NEXT: retq 130 %z = call <64 x i8> @llvm.sadd.sat.v64i8(<64 x i8> %x, <64 x i8> %y) 131 ret <64 x i8> %z 132} 133 134define <8 x i16> @v8i16(<8 x i16> %x, <8 x i16> %y) nounwind { 135; SSE-LABEL: v8i16: 136; SSE: # %bb.0: 137; SSE-NEXT: paddsw %xmm1, %xmm0 138; SSE-NEXT: retq 139; 140; AVX-LABEL: v8i16: 141; AVX: # %bb.0: 142; AVX-NEXT: vpaddsw %xmm1, %xmm0, %xmm0 143; AVX-NEXT: retq 144 %z = call <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16> %x, <8 x i16> %y) 145 ret <8 x i16> %z 146} 147 148define <16 x i16> @v16i16(<16 x i16> %x, <16 x i16> %y) nounwind { 149; SSE-LABEL: v16i16: 150; SSE: # %bb.0: 151; SSE-NEXT: paddsw %xmm2, %xmm0 152; SSE-NEXT: paddsw %xmm3, %xmm1 153; SSE-NEXT: retq 154; 155; AVX1-LABEL: v16i16: 156; AVX1: # %bb.0: 157; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 158; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 159; AVX1-NEXT: vpaddsw %xmm2, %xmm3, %xmm2 160; AVX1-NEXT: vpaddsw %xmm1, %xmm0, %xmm0 161; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 162; AVX1-NEXT: retq 163; 164; AVX2-LABEL: v16i16: 165; AVX2: # %bb.0: 166; AVX2-NEXT: vpaddsw %ymm1, %ymm0, %ymm0 167; AVX2-NEXT: retq 168; 169; AVX512-LABEL: v16i16: 170; AVX512: # %bb.0: 171; AVX512-NEXT: vpaddsw %ymm1, %ymm0, %ymm0 172; AVX512-NEXT: retq 173 %z = call <16 x i16> @llvm.sadd.sat.v16i16(<16 x i16> %x, <16 x i16> %y) 174 ret <16 x i16> %z 175} 176 177define <32 x i16> @v32i16(<32 x i16> %x, <32 x i16> %y) nounwind { 178; SSE-LABEL: v32i16: 179; SSE: # %bb.0: 180; SSE-NEXT: paddsw %xmm4, %xmm0 181; SSE-NEXT: paddsw %xmm5, %xmm1 182; SSE-NEXT: paddsw %xmm6, %xmm2 183; SSE-NEXT: paddsw %xmm7, %xmm3 184; SSE-NEXT: retq 185; 186; AVX1-LABEL: v32i16: 187; AVX1: # %bb.0: 188; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 189; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 190; AVX1-NEXT: vpaddsw %xmm4, %xmm5, %xmm4 191; AVX1-NEXT: vpaddsw %xmm2, %xmm0, %xmm0 192; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 193; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2 194; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 195; AVX1-NEXT: vpaddsw %xmm2, %xmm4, %xmm2 196; AVX1-NEXT: vpaddsw %xmm3, %xmm1, %xmm1 197; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 198; AVX1-NEXT: retq 199; 200; AVX2-LABEL: v32i16: 201; AVX2: # %bb.0: 202; AVX2-NEXT: vpaddsw %ymm2, %ymm0, %ymm0 203; AVX2-NEXT: vpaddsw %ymm3, %ymm1, %ymm1 204; AVX2-NEXT: retq 205; 206; AVX512F-LABEL: v32i16: 207; AVX512F: # %bb.0: 208; AVX512F-NEXT: vextracti64x4 $1, %zmm1, %ymm2 209; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm3 210; AVX512F-NEXT: vpaddsw %ymm2, %ymm3, %ymm2 211; AVX512F-NEXT: vpaddsw %ymm1, %ymm0, %ymm0 212; AVX512F-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm0 213; AVX512F-NEXT: retq 214; 215; AVX512BW-LABEL: v32i16: 216; AVX512BW: # %bb.0: 217; AVX512BW-NEXT: vpaddsw %zmm1, %zmm0, %zmm0 218; AVX512BW-NEXT: retq 219 %z = call <32 x i16> @llvm.sadd.sat.v32i16(<32 x i16> %x, <32 x i16> %y) 220 ret <32 x i16> %z 221} 222 223; Too narrow vectors, legalized by widening. 224 225define void @v8i8(ptr %px, ptr %py, ptr %pz) nounwind { 226; SSE-LABEL: v8i8: 227; SSE: # %bb.0: 228; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 229; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 230; SSE-NEXT: paddsb %xmm0, %xmm1 231; SSE-NEXT: movq %xmm1, (%rdx) 232; SSE-NEXT: retq 233; 234; AVX-LABEL: v8i8: 235; AVX: # %bb.0: 236; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 237; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 238; AVX-NEXT: vpaddsb %xmm1, %xmm0, %xmm0 239; AVX-NEXT: vmovq %xmm0, (%rdx) 240; AVX-NEXT: retq 241 %x = load <8 x i8>, ptr %px 242 %y = load <8 x i8>, ptr %py 243 %z = call <8 x i8> @llvm.sadd.sat.v8i8(<8 x i8> %x, <8 x i8> %y) 244 store <8 x i8> %z, ptr %pz 245 ret void 246} 247 248define void @v4i8(ptr %px, ptr %py, ptr %pz) nounwind { 249; SSE-LABEL: v4i8: 250; SSE: # %bb.0: 251; SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 252; SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 253; SSE-NEXT: paddsb %xmm0, %xmm1 254; SSE-NEXT: movd %xmm1, (%rdx) 255; SSE-NEXT: retq 256; 257; AVX-LABEL: v4i8: 258; AVX: # %bb.0: 259; AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 260; AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 261; AVX-NEXT: vpaddsb %xmm1, %xmm0, %xmm0 262; AVX-NEXT: vmovd %xmm0, (%rdx) 263; AVX-NEXT: retq 264 %x = load <4 x i8>, ptr %px 265 %y = load <4 x i8>, ptr %py 266 %z = call <4 x i8> @llvm.sadd.sat.v4i8(<4 x i8> %x, <4 x i8> %y) 267 store <4 x i8> %z, ptr %pz 268 ret void 269} 270 271define void @v2i8(ptr %px, ptr %py, ptr %pz) nounwind { 272; SSE2-LABEL: v2i8: 273; SSE2: # %bb.0: 274; SSE2-NEXT: movzwl (%rdi), %eax 275; SSE2-NEXT: movd %eax, %xmm0 276; SSE2-NEXT: movzwl (%rsi), %eax 277; SSE2-NEXT: movd %eax, %xmm1 278; SSE2-NEXT: paddsb %xmm0, %xmm1 279; SSE2-NEXT: movd %xmm1, %eax 280; SSE2-NEXT: movw %ax, (%rdx) 281; SSE2-NEXT: retq 282; 283; SSSE3-LABEL: v2i8: 284; SSSE3: # %bb.0: 285; SSSE3-NEXT: movzwl (%rdi), %eax 286; SSSE3-NEXT: movd %eax, %xmm0 287; SSSE3-NEXT: movzwl (%rsi), %eax 288; SSSE3-NEXT: movd %eax, %xmm1 289; SSSE3-NEXT: paddsb %xmm0, %xmm1 290; SSSE3-NEXT: movd %xmm1, %eax 291; SSSE3-NEXT: movw %ax, (%rdx) 292; SSSE3-NEXT: retq 293; 294; SSE41-LABEL: v2i8: 295; SSE41: # %bb.0: 296; SSE41-NEXT: movzwl (%rdi), %eax 297; SSE41-NEXT: movd %eax, %xmm0 298; SSE41-NEXT: movzwl (%rsi), %eax 299; SSE41-NEXT: movd %eax, %xmm1 300; SSE41-NEXT: paddsb %xmm0, %xmm1 301; SSE41-NEXT: pextrw $0, %xmm1, (%rdx) 302; SSE41-NEXT: retq 303; 304; AVX-LABEL: v2i8: 305; AVX: # %bb.0: 306; AVX-NEXT: movzwl (%rdi), %eax 307; AVX-NEXT: vmovd %eax, %xmm0 308; AVX-NEXT: movzwl (%rsi), %eax 309; AVX-NEXT: vmovd %eax, %xmm1 310; AVX-NEXT: vpaddsb %xmm1, %xmm0, %xmm0 311; AVX-NEXT: vpextrw $0, %xmm0, (%rdx) 312; AVX-NEXT: retq 313 %x = load <2 x i8>, ptr %px 314 %y = load <2 x i8>, ptr %py 315 %z = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> %x, <2 x i8> %y) 316 store <2 x i8> %z, ptr %pz 317 ret void 318} 319 320define void @v4i16(ptr %px, ptr %py, ptr %pz) nounwind { 321; SSE-LABEL: v4i16: 322; SSE: # %bb.0: 323; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 324; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 325; SSE-NEXT: paddsw %xmm0, %xmm1 326; SSE-NEXT: movq %xmm1, (%rdx) 327; SSE-NEXT: retq 328; 329; AVX-LABEL: v4i16: 330; AVX: # %bb.0: 331; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 332; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 333; AVX-NEXT: vpaddsw %xmm1, %xmm0, %xmm0 334; AVX-NEXT: vmovq %xmm0, (%rdx) 335; AVX-NEXT: retq 336 %x = load <4 x i16>, ptr %px 337 %y = load <4 x i16>, ptr %py 338 %z = call <4 x i16> @llvm.sadd.sat.v4i16(<4 x i16> %x, <4 x i16> %y) 339 store <4 x i16> %z, ptr %pz 340 ret void 341} 342 343define void @v2i16(ptr %px, ptr %py, ptr %pz) nounwind { 344; SSE-LABEL: v2i16: 345; SSE: # %bb.0: 346; SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 347; SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 348; SSE-NEXT: paddsw %xmm0, %xmm1 349; SSE-NEXT: movd %xmm1, (%rdx) 350; SSE-NEXT: retq 351; 352; AVX-LABEL: v2i16: 353; AVX: # %bb.0: 354; AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 355; AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 356; AVX-NEXT: vpaddsw %xmm1, %xmm0, %xmm0 357; AVX-NEXT: vmovd %xmm0, (%rdx) 358; AVX-NEXT: retq 359 %x = load <2 x i16>, ptr %px 360 %y = load <2 x i16>, ptr %py 361 %z = call <2 x i16> @llvm.sadd.sat.v2i16(<2 x i16> %x, <2 x i16> %y) 362 store <2 x i16> %z, ptr %pz 363 ret void 364} 365 366define <12 x i8> @v12i8(<12 x i8> %x, <12 x i8> %y) nounwind { 367; SSE-LABEL: v12i8: 368; SSE: # %bb.0: 369; SSE-NEXT: paddsb %xmm1, %xmm0 370; SSE-NEXT: retq 371; 372; AVX-LABEL: v12i8: 373; AVX: # %bb.0: 374; AVX-NEXT: vpaddsb %xmm1, %xmm0, %xmm0 375; AVX-NEXT: retq 376 %z = call <12 x i8> @llvm.sadd.sat.v12i8(<12 x i8> %x, <12 x i8> %y) 377 ret <12 x i8> %z 378} 379 380define void @v12i16(ptr %px, ptr %py, ptr %pz) nounwind { 381; SSE-LABEL: v12i16: 382; SSE: # %bb.0: 383; SSE-NEXT: movdqa (%rdi), %xmm0 384; SSE-NEXT: movdqa 16(%rdi), %xmm1 385; SSE-NEXT: paddsw 16(%rsi), %xmm1 386; SSE-NEXT: paddsw (%rsi), %xmm0 387; SSE-NEXT: movdqa %xmm0, (%rdx) 388; SSE-NEXT: movq %xmm1, 16(%rdx) 389; SSE-NEXT: retq 390; 391; AVX1-LABEL: v12i16: 392; AVX1: # %bb.0: 393; AVX1-NEXT: vmovdqa (%rdi), %xmm0 394; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1 395; AVX1-NEXT: vpaddsw 16(%rsi), %xmm1, %xmm1 396; AVX1-NEXT: vpaddsw (%rsi), %xmm0, %xmm0 397; AVX1-NEXT: vmovdqa %xmm0, (%rdx) 398; AVX1-NEXT: vmovq %xmm1, 16(%rdx) 399; AVX1-NEXT: retq 400; 401; AVX2-LABEL: v12i16: 402; AVX2: # %bb.0: 403; AVX2-NEXT: vmovdqa (%rdi), %ymm0 404; AVX2-NEXT: vpaddsw (%rsi), %ymm0, %ymm0 405; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 406; AVX2-NEXT: vmovq %xmm1, 16(%rdx) 407; AVX2-NEXT: vmovdqa %xmm0, (%rdx) 408; AVX2-NEXT: vzeroupper 409; AVX2-NEXT: retq 410; 411; AVX512-LABEL: v12i16: 412; AVX512: # %bb.0: 413; AVX512-NEXT: vmovdqa (%rdi), %ymm0 414; AVX512-NEXT: vpaddsw (%rsi), %ymm0, %ymm0 415; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 416; AVX512-NEXT: vmovq %xmm1, 16(%rdx) 417; AVX512-NEXT: vmovdqa %xmm0, (%rdx) 418; AVX512-NEXT: vzeroupper 419; AVX512-NEXT: retq 420 %x = load <12 x i16>, ptr %px 421 %y = load <12 x i16>, ptr %py 422 %z = call <12 x i16> @llvm.sadd.sat.v12i16(<12 x i16> %x, <12 x i16> %y) 423 store <12 x i16> %z, ptr %pz 424 ret void 425} 426 427; Scalarization 428 429define void @v1i8(ptr %px, ptr %py, ptr %pz) nounwind { 430; SSE-LABEL: v1i8: 431; SSE: # %bb.0: 432; SSE-NEXT: movzbl (%rdi), %eax 433; SSE-NEXT: movzbl (%rsi), %ecx 434; SSE-NEXT: leal (%rax,%rcx), %esi 435; SSE-NEXT: sarb $7, %sil 436; SSE-NEXT: addb $-128, %sil 437; SSE-NEXT: addb %cl, %al 438; SSE-NEXT: movzbl %al, %eax 439; SSE-NEXT: movzbl %sil, %ecx 440; SSE-NEXT: cmovnol %eax, %ecx 441; SSE-NEXT: movb %cl, (%rdx) 442; SSE-NEXT: retq 443; 444; AVX-LABEL: v1i8: 445; AVX: # %bb.0: 446; AVX-NEXT: movzbl (%rdi), %eax 447; AVX-NEXT: movzbl (%rsi), %ecx 448; AVX-NEXT: leal (%rax,%rcx), %esi 449; AVX-NEXT: sarb $7, %sil 450; AVX-NEXT: addb $-128, %sil 451; AVX-NEXT: addb %cl, %al 452; AVX-NEXT: movzbl %al, %eax 453; AVX-NEXT: movzbl %sil, %ecx 454; AVX-NEXT: cmovnol %eax, %ecx 455; AVX-NEXT: movb %cl, (%rdx) 456; AVX-NEXT: retq 457 %x = load <1 x i8>, ptr %px 458 %y = load <1 x i8>, ptr %py 459 %z = call <1 x i8> @llvm.sadd.sat.v1i8(<1 x i8> %x, <1 x i8> %y) 460 store <1 x i8> %z, ptr %pz 461 ret void 462} 463 464define void @v1i16(ptr %px, ptr %py, ptr %pz) nounwind { 465; SSE-LABEL: v1i16: 466; SSE: # %bb.0: 467; SSE-NEXT: movzwl (%rdi), %eax 468; SSE-NEXT: movzwl (%rsi), %ecx 469; SSE-NEXT: leal (%rax,%rcx), %esi 470; SSE-NEXT: movswl %si, %esi 471; SSE-NEXT: sarl $15, %esi 472; SSE-NEXT: xorl $-32768, %esi # imm = 0x8000 473; SSE-NEXT: addw %cx, %ax 474; SSE-NEXT: cmovol %esi, %eax 475; SSE-NEXT: movw %ax, (%rdx) 476; SSE-NEXT: retq 477; 478; AVX-LABEL: v1i16: 479; AVX: # %bb.0: 480; AVX-NEXT: movzwl (%rdi), %eax 481; AVX-NEXT: movzwl (%rsi), %ecx 482; AVX-NEXT: leal (%rax,%rcx), %esi 483; AVX-NEXT: movswl %si, %esi 484; AVX-NEXT: sarl $15, %esi 485; AVX-NEXT: xorl $-32768, %esi # imm = 0x8000 486; AVX-NEXT: addw %cx, %ax 487; AVX-NEXT: cmovol %esi, %eax 488; AVX-NEXT: movw %ax, (%rdx) 489; AVX-NEXT: retq 490 %x = load <1 x i16>, ptr %px 491 %y = load <1 x i16>, ptr %py 492 %z = call <1 x i16> @llvm.sadd.sat.v1i16(<1 x i16> %x, <1 x i16> %y) 493 store <1 x i16> %z, ptr %pz 494 ret void 495} 496 497; Promotion 498 499define <16 x i4> @v16i4(<16 x i4> %x, <16 x i4> %y) nounwind { 500; SSE-LABEL: v16i4: 501; SSE: # %bb.0: 502; SSE-NEXT: psllw $4, %xmm1 503; SSE-NEXT: movdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 504; SSE-NEXT: pand %xmm2, %xmm1 505; SSE-NEXT: psllw $4, %xmm0 506; SSE-NEXT: pand %xmm2, %xmm0 507; SSE-NEXT: paddsb %xmm1, %xmm0 508; SSE-NEXT: psrlw $4, %xmm0 509; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 510; SSE-NEXT: movdqa {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8] 511; SSE-NEXT: pxor %xmm1, %xmm0 512; SSE-NEXT: psubb %xmm1, %xmm0 513; SSE-NEXT: retq 514; 515; AVX1-LABEL: v16i4: 516; AVX1: # %bb.0: 517; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1 518; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 519; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1 520; AVX1-NEXT: vpsllw $4, %xmm0, %xmm0 521; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 522; AVX1-NEXT: vpaddsb %xmm1, %xmm0, %xmm0 523; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0 524; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 525; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8] 526; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0 527; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm0 528; AVX1-NEXT: retq 529; 530; AVX2-LABEL: v16i4: 531; AVX2: # %bb.0: 532; AVX2-NEXT: vpsllw $4, %xmm1, %xmm1 533; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 534; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1 535; AVX2-NEXT: vpsllw $4, %xmm0, %xmm0 536; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0 537; AVX2-NEXT: vpaddsb %xmm1, %xmm0, %xmm0 538; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm0 539; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 540; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8] 541; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0 542; AVX2-NEXT: vpsubb %xmm1, %xmm0, %xmm0 543; AVX2-NEXT: retq 544; 545; AVX512F-LABEL: v16i4: 546; AVX512F: # %bb.0: 547; AVX512F-NEXT: vpsllw $4, %xmm1, %xmm1 548; AVX512F-NEXT: vpbroadcastb {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 549; AVX512F-NEXT: vpand %xmm2, %xmm1, %xmm1 550; AVX512F-NEXT: vpsllw $4, %xmm0, %xmm0 551; AVX512F-NEXT: vpand %xmm2, %xmm0, %xmm0 552; AVX512F-NEXT: vpaddsb %xmm1, %xmm0, %xmm0 553; AVX512F-NEXT: vpsrlw $4, %xmm0, %xmm0 554; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 555; AVX512F-NEXT: vpbroadcastb {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8] 556; AVX512F-NEXT: vpxor %xmm1, %xmm0, %xmm0 557; AVX512F-NEXT: vpsubb %xmm1, %xmm0, %xmm0 558; AVX512F-NEXT: retq 559; 560; AVX512BW-LABEL: v16i4: 561; AVX512BW: # %bb.0: 562; AVX512BW-NEXT: vpsllw $4, %xmm1, %xmm1 563; AVX512BW-NEXT: vpbroadcastb {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 564; AVX512BW-NEXT: vpand %xmm2, %xmm1, %xmm1 565; AVX512BW-NEXT: vpsllw $4, %xmm0, %xmm0 566; AVX512BW-NEXT: vpand %xmm2, %xmm0, %xmm0 567; AVX512BW-NEXT: vpaddsb %xmm1, %xmm0, %xmm0 568; AVX512BW-NEXT: vpsrlw $4, %xmm0, %xmm0 569; AVX512BW-NEXT: vpbroadcastb {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8] 570; AVX512BW-NEXT: vpternlogd {{.*#+}} xmm0 = xmm1 ^ (xmm0 & mem) 571; AVX512BW-NEXT: vpsubb %xmm1, %xmm0, %xmm0 572; AVX512BW-NEXT: retq 573 %z = call <16 x i4> @llvm.sadd.sat.v16i4(<16 x i4> %x, <16 x i4> %y) 574 ret <16 x i4> %z 575} 576 577define <16 x i1> @v16i1(<16 x i1> %x, <16 x i1> %y) nounwind { 578; SSE-LABEL: v16i1: 579; SSE: # %bb.0: 580; SSE-NEXT: orps %xmm1, %xmm0 581; SSE-NEXT: retq 582; 583; AVX-LABEL: v16i1: 584; AVX: # %bb.0: 585; AVX-NEXT: vorps %xmm1, %xmm0, %xmm0 586; AVX-NEXT: retq 587 %z = call <16 x i1> @llvm.sadd.sat.v16i1(<16 x i1> %x, <16 x i1> %y) 588 ret <16 x i1> %z 589} 590 591; Expanded 592 593define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind { 594; SSE2-LABEL: v2i32: 595; SSE2: # %bb.0: 596; SSE2-NEXT: pxor %xmm2, %xmm2 597; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 598; SSE2-NEXT: paddd %xmm0, %xmm1 599; SSE2-NEXT: pcmpgtd %xmm1, %xmm0 600; SSE2-NEXT: pxor %xmm2, %xmm0 601; SSE2-NEXT: movdqa %xmm0, %xmm2 602; SSE2-NEXT: pandn %xmm1, %xmm2 603; SSE2-NEXT: psrad $31, %xmm1 604; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 605; SSE2-NEXT: pand %xmm1, %xmm0 606; SSE2-NEXT: por %xmm2, %xmm0 607; SSE2-NEXT: retq 608; 609; SSSE3-LABEL: v2i32: 610; SSSE3: # %bb.0: 611; SSSE3-NEXT: pxor %xmm2, %xmm2 612; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2 613; SSSE3-NEXT: paddd %xmm0, %xmm1 614; SSSE3-NEXT: pcmpgtd %xmm1, %xmm0 615; SSSE3-NEXT: pxor %xmm2, %xmm0 616; SSSE3-NEXT: movdqa %xmm0, %xmm2 617; SSSE3-NEXT: pandn %xmm1, %xmm2 618; SSSE3-NEXT: psrad $31, %xmm1 619; SSSE3-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 620; SSSE3-NEXT: pand %xmm1, %xmm0 621; SSSE3-NEXT: por %xmm2, %xmm0 622; SSSE3-NEXT: retq 623; 624; SSE41-LABEL: v2i32: 625; SSE41: # %bb.0: 626; SSE41-NEXT: movdqa %xmm0, %xmm2 627; SSE41-NEXT: paddd %xmm1, %xmm2 628; SSE41-NEXT: pcmpgtd %xmm2, %xmm0 629; SSE41-NEXT: pxor %xmm1, %xmm0 630; SSE41-NEXT: movdqa %xmm2, %xmm1 631; SSE41-NEXT: psrad $31, %xmm1 632; SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 633; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm2 634; SSE41-NEXT: movaps %xmm2, %xmm0 635; SSE41-NEXT: retq 636; 637; AVX1-LABEL: v2i32: 638; AVX1: # %bb.0: 639; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm2 640; AVX1-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm0 641; AVX1-NEXT: vpxor %xmm0, %xmm1, %xmm0 642; AVX1-NEXT: vpsrad $31, %xmm2, %xmm1 643; AVX1-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 644; AVX1-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0 645; AVX1-NEXT: retq 646; 647; AVX2-LABEL: v2i32: 648; AVX2: # %bb.0: 649; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm2 650; AVX2-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm0 651; AVX2-NEXT: vpxor %xmm0, %xmm1, %xmm0 652; AVX2-NEXT: vpsrad $31, %xmm2, %xmm1 653; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648] 654; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm1 655; AVX2-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0 656; AVX2-NEXT: retq 657; 658; AVX512F-LABEL: v2i32: 659; AVX512F: # %bb.0: 660; AVX512F-NEXT: vpaddd %xmm1, %xmm0, %xmm2 661; AVX512F-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm0 662; AVX512F-NEXT: vpxor %xmm0, %xmm1, %xmm0 663; AVX512F-NEXT: vpsrad $31, %xmm2, %xmm1 664; AVX512F-NEXT: vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648] 665; AVX512F-NEXT: vpxor %xmm3, %xmm1, %xmm1 666; AVX512F-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0 667; AVX512F-NEXT: retq 668; 669; AVX512BW-LABEL: v2i32: 670; AVX512BW: # %bb.0: 671; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2 672; AVX512BW-NEXT: vpcmpgtd %xmm1, %xmm2, %k0 673; AVX512BW-NEXT: vpaddd %xmm1, %xmm0, %xmm1 674; AVX512BW-NEXT: vpcmpgtd %xmm1, %xmm0, %k1 675; AVX512BW-NEXT: kxorw %k1, %k0, %k1 676; AVX512BW-NEXT: vpsrad $31, %xmm1, %xmm0 677; AVX512BW-NEXT: vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm1 {%k1} 678; AVX512BW-NEXT: vmovdqa %xmm1, %xmm0 679; AVX512BW-NEXT: retq 680 %z = call <2 x i32> @llvm.sadd.sat.v2i32(<2 x i32> %x, <2 x i32> %y) 681 ret <2 x i32> %z 682} 683 684define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind { 685; SSE2-LABEL: v4i32: 686; SSE2: # %bb.0: 687; SSE2-NEXT: pxor %xmm2, %xmm2 688; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 689; SSE2-NEXT: paddd %xmm0, %xmm1 690; SSE2-NEXT: pcmpgtd %xmm1, %xmm0 691; SSE2-NEXT: pxor %xmm2, %xmm0 692; SSE2-NEXT: movdqa %xmm0, %xmm2 693; SSE2-NEXT: pandn %xmm1, %xmm2 694; SSE2-NEXT: psrad $31, %xmm1 695; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 696; SSE2-NEXT: pand %xmm1, %xmm0 697; SSE2-NEXT: por %xmm2, %xmm0 698; SSE2-NEXT: retq 699; 700; SSSE3-LABEL: v4i32: 701; SSSE3: # %bb.0: 702; SSSE3-NEXT: pxor %xmm2, %xmm2 703; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2 704; SSSE3-NEXT: paddd %xmm0, %xmm1 705; SSSE3-NEXT: pcmpgtd %xmm1, %xmm0 706; SSSE3-NEXT: pxor %xmm2, %xmm0 707; SSSE3-NEXT: movdqa %xmm0, %xmm2 708; SSSE3-NEXT: pandn %xmm1, %xmm2 709; SSSE3-NEXT: psrad $31, %xmm1 710; SSSE3-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 711; SSSE3-NEXT: pand %xmm1, %xmm0 712; SSSE3-NEXT: por %xmm2, %xmm0 713; SSSE3-NEXT: retq 714; 715; SSE41-LABEL: v4i32: 716; SSE41: # %bb.0: 717; SSE41-NEXT: movdqa %xmm0, %xmm2 718; SSE41-NEXT: paddd %xmm1, %xmm2 719; SSE41-NEXT: pcmpgtd %xmm2, %xmm0 720; SSE41-NEXT: pxor %xmm1, %xmm0 721; SSE41-NEXT: movdqa %xmm2, %xmm1 722; SSE41-NEXT: psrad $31, %xmm1 723; SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 724; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm2 725; SSE41-NEXT: movaps %xmm2, %xmm0 726; SSE41-NEXT: retq 727; 728; AVX1-LABEL: v4i32: 729; AVX1: # %bb.0: 730; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm2 731; AVX1-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm0 732; AVX1-NEXT: vpxor %xmm0, %xmm1, %xmm0 733; AVX1-NEXT: vpsrad $31, %xmm2, %xmm1 734; AVX1-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 735; AVX1-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0 736; AVX1-NEXT: retq 737; 738; AVX2-LABEL: v4i32: 739; AVX2: # %bb.0: 740; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm2 741; AVX2-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm0 742; AVX2-NEXT: vpxor %xmm0, %xmm1, %xmm0 743; AVX2-NEXT: vpsrad $31, %xmm2, %xmm1 744; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648] 745; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm1 746; AVX2-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0 747; AVX2-NEXT: retq 748; 749; AVX512F-LABEL: v4i32: 750; AVX512F: # %bb.0: 751; AVX512F-NEXT: vpaddd %xmm1, %xmm0, %xmm2 752; AVX512F-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm0 753; AVX512F-NEXT: vpxor %xmm0, %xmm1, %xmm0 754; AVX512F-NEXT: vpsrad $31, %xmm2, %xmm1 755; AVX512F-NEXT: vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648] 756; AVX512F-NEXT: vpxor %xmm3, %xmm1, %xmm1 757; AVX512F-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0 758; AVX512F-NEXT: retq 759; 760; AVX512BW-LABEL: v4i32: 761; AVX512BW: # %bb.0: 762; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2 763; AVX512BW-NEXT: vpcmpgtd %xmm1, %xmm2, %k0 764; AVX512BW-NEXT: vpaddd %xmm1, %xmm0, %xmm1 765; AVX512BW-NEXT: vpcmpgtd %xmm1, %xmm0, %k1 766; AVX512BW-NEXT: kxorw %k1, %k0, %k1 767; AVX512BW-NEXT: vpsrad $31, %xmm1, %xmm0 768; AVX512BW-NEXT: vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm1 {%k1} 769; AVX512BW-NEXT: vmovdqa %xmm1, %xmm0 770; AVX512BW-NEXT: retq 771 %z = call <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32> %x, <4 x i32> %y) 772 ret <4 x i32> %z 773} 774 775define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind { 776; SSE2-LABEL: v8i32: 777; SSE2: # %bb.0: 778; SSE2-NEXT: pxor %xmm4, %xmm4 779; SSE2-NEXT: pxor %xmm5, %xmm5 780; SSE2-NEXT: pcmpgtd %xmm2, %xmm5 781; SSE2-NEXT: paddd %xmm0, %xmm2 782; SSE2-NEXT: pcmpgtd %xmm2, %xmm0 783; SSE2-NEXT: pxor %xmm5, %xmm0 784; SSE2-NEXT: movdqa %xmm0, %xmm5 785; SSE2-NEXT: pandn %xmm2, %xmm5 786; SSE2-NEXT: psrad $31, %xmm2 787; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648] 788; SSE2-NEXT: pxor %xmm6, %xmm2 789; SSE2-NEXT: pand %xmm2, %xmm0 790; SSE2-NEXT: por %xmm5, %xmm0 791; SSE2-NEXT: pcmpgtd %xmm3, %xmm4 792; SSE2-NEXT: paddd %xmm1, %xmm3 793; SSE2-NEXT: pcmpgtd %xmm3, %xmm1 794; SSE2-NEXT: pxor %xmm4, %xmm1 795; SSE2-NEXT: movdqa %xmm1, %xmm2 796; SSE2-NEXT: pandn %xmm3, %xmm2 797; SSE2-NEXT: psrad $31, %xmm3 798; SSE2-NEXT: pxor %xmm3, %xmm6 799; SSE2-NEXT: pand %xmm6, %xmm1 800; SSE2-NEXT: por %xmm2, %xmm1 801; SSE2-NEXT: retq 802; 803; SSSE3-LABEL: v8i32: 804; SSSE3: # %bb.0: 805; SSSE3-NEXT: pxor %xmm4, %xmm4 806; SSSE3-NEXT: pxor %xmm5, %xmm5 807; SSSE3-NEXT: pcmpgtd %xmm2, %xmm5 808; SSSE3-NEXT: paddd %xmm0, %xmm2 809; SSSE3-NEXT: pcmpgtd %xmm2, %xmm0 810; SSSE3-NEXT: pxor %xmm5, %xmm0 811; SSSE3-NEXT: movdqa %xmm0, %xmm5 812; SSSE3-NEXT: pandn %xmm2, %xmm5 813; SSSE3-NEXT: psrad $31, %xmm2 814; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648] 815; SSSE3-NEXT: pxor %xmm6, %xmm2 816; SSSE3-NEXT: pand %xmm2, %xmm0 817; SSSE3-NEXT: por %xmm5, %xmm0 818; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4 819; SSSE3-NEXT: paddd %xmm1, %xmm3 820; SSSE3-NEXT: pcmpgtd %xmm3, %xmm1 821; SSSE3-NEXT: pxor %xmm4, %xmm1 822; SSSE3-NEXT: movdqa %xmm1, %xmm2 823; SSSE3-NEXT: pandn %xmm3, %xmm2 824; SSSE3-NEXT: psrad $31, %xmm3 825; SSSE3-NEXT: pxor %xmm3, %xmm6 826; SSSE3-NEXT: pand %xmm6, %xmm1 827; SSSE3-NEXT: por %xmm2, %xmm1 828; SSSE3-NEXT: retq 829; 830; SSE41-LABEL: v8i32: 831; SSE41: # %bb.0: 832; SSE41-NEXT: movdqa %xmm1, %xmm5 833; SSE41-NEXT: movdqa %xmm0, %xmm4 834; SSE41-NEXT: paddd %xmm2, %xmm4 835; SSE41-NEXT: pcmpgtd %xmm4, %xmm0 836; SSE41-NEXT: pxor %xmm2, %xmm0 837; SSE41-NEXT: movdqa %xmm4, %xmm1 838; SSE41-NEXT: psrad $31, %xmm1 839; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] 840; SSE41-NEXT: pxor %xmm2, %xmm1 841; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm4 842; SSE41-NEXT: movdqa %xmm5, %xmm1 843; SSE41-NEXT: paddd %xmm3, %xmm1 844; SSE41-NEXT: pcmpgtd %xmm1, %xmm5 845; SSE41-NEXT: pxor %xmm3, %xmm5 846; SSE41-NEXT: movdqa %xmm1, %xmm3 847; SSE41-NEXT: psrad $31, %xmm3 848; SSE41-NEXT: pxor %xmm2, %xmm3 849; SSE41-NEXT: movdqa %xmm5, %xmm0 850; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm1 851; SSE41-NEXT: movaps %xmm4, %xmm0 852; SSE41-NEXT: retq 853; 854; AVX1-LABEL: v8i32: 855; AVX1: # %bb.0: 856; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 857; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 858; AVX1-NEXT: vpaddd %xmm2, %xmm3, %xmm2 859; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm4 860; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm4, %ymm5 861; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm3 862; AVX1-NEXT: vpcmpgtd %xmm4, %xmm0, %xmm0 863; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 864; AVX1-NEXT: vxorps %ymm0, %ymm1, %ymm0 865; AVX1-NEXT: vpsrad $31, %xmm4, %xmm1 866; AVX1-NEXT: vpsrad $31, %xmm2, %xmm2 867; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 868; AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 869; AVX1-NEXT: vblendvps %ymm0, %ymm1, %ymm5, %ymm0 870; AVX1-NEXT: retq 871; 872; AVX2-LABEL: v8i32: 873; AVX2: # %bb.0: 874; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm2 875; AVX2-NEXT: vpcmpgtd %ymm2, %ymm0, %ymm0 876; AVX2-NEXT: vpxor %ymm0, %ymm1, %ymm0 877; AVX2-NEXT: vpsrad $31, %ymm2, %ymm1 878; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm3 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648] 879; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 880; AVX2-NEXT: vblendvps %ymm0, %ymm1, %ymm2, %ymm0 881; AVX2-NEXT: retq 882; 883; AVX512F-LABEL: v8i32: 884; AVX512F: # %bb.0: 885; AVX512F-NEXT: vpaddd %ymm1, %ymm0, %ymm2 886; AVX512F-NEXT: vpcmpgtd %ymm2, %ymm0, %ymm0 887; AVX512F-NEXT: vpxor %ymm0, %ymm1, %ymm0 888; AVX512F-NEXT: vpsrad $31, %ymm2, %ymm1 889; AVX512F-NEXT: vpbroadcastd {{.*#+}} ymm3 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648] 890; AVX512F-NEXT: vpxor %ymm3, %ymm1, %ymm1 891; AVX512F-NEXT: vblendvps %ymm0, %ymm1, %ymm2, %ymm0 892; AVX512F-NEXT: retq 893; 894; AVX512BW-LABEL: v8i32: 895; AVX512BW: # %bb.0: 896; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2 897; AVX512BW-NEXT: vpcmpgtd %ymm1, %ymm2, %k0 898; AVX512BW-NEXT: vpaddd %ymm1, %ymm0, %ymm1 899; AVX512BW-NEXT: vpcmpgtd %ymm1, %ymm0, %k1 900; AVX512BW-NEXT: kxorw %k1, %k0, %k1 901; AVX512BW-NEXT: vpsrad $31, %ymm1, %ymm0 902; AVX512BW-NEXT: vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm1 {%k1} 903; AVX512BW-NEXT: vmovdqa %ymm1, %ymm0 904; AVX512BW-NEXT: retq 905 %z = call <8 x i32> @llvm.sadd.sat.v8i32(<8 x i32> %x, <8 x i32> %y) 906 ret <8 x i32> %z 907} 908 909define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind { 910; SSE2-LABEL: v16i32: 911; SSE2: # %bb.0: 912; SSE2-NEXT: pxor %xmm8, %xmm8 913; SSE2-NEXT: pxor %xmm9, %xmm9 914; SSE2-NEXT: pcmpgtd %xmm4, %xmm9 915; SSE2-NEXT: paddd %xmm0, %xmm4 916; SSE2-NEXT: pcmpgtd %xmm4, %xmm0 917; SSE2-NEXT: pxor %xmm9, %xmm0 918; SSE2-NEXT: movdqa %xmm0, %xmm10 919; SSE2-NEXT: pandn %xmm4, %xmm10 920; SSE2-NEXT: psrad $31, %xmm4 921; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [2147483648,2147483648,2147483648,2147483648] 922; SSE2-NEXT: pxor %xmm9, %xmm4 923; SSE2-NEXT: pand %xmm4, %xmm0 924; SSE2-NEXT: por %xmm10, %xmm0 925; SSE2-NEXT: pxor %xmm4, %xmm4 926; SSE2-NEXT: pcmpgtd %xmm5, %xmm4 927; SSE2-NEXT: paddd %xmm1, %xmm5 928; SSE2-NEXT: pcmpgtd %xmm5, %xmm1 929; SSE2-NEXT: pxor %xmm4, %xmm1 930; SSE2-NEXT: movdqa %xmm1, %xmm4 931; SSE2-NEXT: pandn %xmm5, %xmm4 932; SSE2-NEXT: psrad $31, %xmm5 933; SSE2-NEXT: pxor %xmm9, %xmm5 934; SSE2-NEXT: pand %xmm5, %xmm1 935; SSE2-NEXT: por %xmm4, %xmm1 936; SSE2-NEXT: pxor %xmm4, %xmm4 937; SSE2-NEXT: pcmpgtd %xmm6, %xmm4 938; SSE2-NEXT: paddd %xmm2, %xmm6 939; SSE2-NEXT: pcmpgtd %xmm6, %xmm2 940; SSE2-NEXT: pxor %xmm4, %xmm2 941; SSE2-NEXT: movdqa %xmm2, %xmm4 942; SSE2-NEXT: pandn %xmm6, %xmm4 943; SSE2-NEXT: psrad $31, %xmm6 944; SSE2-NEXT: pxor %xmm9, %xmm6 945; SSE2-NEXT: pand %xmm6, %xmm2 946; SSE2-NEXT: por %xmm4, %xmm2 947; SSE2-NEXT: pcmpgtd %xmm7, %xmm8 948; SSE2-NEXT: paddd %xmm3, %xmm7 949; SSE2-NEXT: pcmpgtd %xmm7, %xmm3 950; SSE2-NEXT: pxor %xmm8, %xmm3 951; SSE2-NEXT: movdqa %xmm3, %xmm4 952; SSE2-NEXT: pandn %xmm7, %xmm4 953; SSE2-NEXT: psrad $31, %xmm7 954; SSE2-NEXT: pxor %xmm7, %xmm9 955; SSE2-NEXT: pand %xmm9, %xmm3 956; SSE2-NEXT: por %xmm4, %xmm3 957; SSE2-NEXT: retq 958; 959; SSSE3-LABEL: v16i32: 960; SSSE3: # %bb.0: 961; SSSE3-NEXT: pxor %xmm8, %xmm8 962; SSSE3-NEXT: pxor %xmm9, %xmm9 963; SSSE3-NEXT: pcmpgtd %xmm4, %xmm9 964; SSSE3-NEXT: paddd %xmm0, %xmm4 965; SSSE3-NEXT: pcmpgtd %xmm4, %xmm0 966; SSSE3-NEXT: pxor %xmm9, %xmm0 967; SSSE3-NEXT: movdqa %xmm0, %xmm10 968; SSSE3-NEXT: pandn %xmm4, %xmm10 969; SSSE3-NEXT: psrad $31, %xmm4 970; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [2147483648,2147483648,2147483648,2147483648] 971; SSSE3-NEXT: pxor %xmm9, %xmm4 972; SSSE3-NEXT: pand %xmm4, %xmm0 973; SSSE3-NEXT: por %xmm10, %xmm0 974; SSSE3-NEXT: pxor %xmm4, %xmm4 975; SSSE3-NEXT: pcmpgtd %xmm5, %xmm4 976; SSSE3-NEXT: paddd %xmm1, %xmm5 977; SSSE3-NEXT: pcmpgtd %xmm5, %xmm1 978; SSSE3-NEXT: pxor %xmm4, %xmm1 979; SSSE3-NEXT: movdqa %xmm1, %xmm4 980; SSSE3-NEXT: pandn %xmm5, %xmm4 981; SSSE3-NEXT: psrad $31, %xmm5 982; SSSE3-NEXT: pxor %xmm9, %xmm5 983; SSSE3-NEXT: pand %xmm5, %xmm1 984; SSSE3-NEXT: por %xmm4, %xmm1 985; SSSE3-NEXT: pxor %xmm4, %xmm4 986; SSSE3-NEXT: pcmpgtd %xmm6, %xmm4 987; SSSE3-NEXT: paddd %xmm2, %xmm6 988; SSSE3-NEXT: pcmpgtd %xmm6, %xmm2 989; SSSE3-NEXT: pxor %xmm4, %xmm2 990; SSSE3-NEXT: movdqa %xmm2, %xmm4 991; SSSE3-NEXT: pandn %xmm6, %xmm4 992; SSSE3-NEXT: psrad $31, %xmm6 993; SSSE3-NEXT: pxor %xmm9, %xmm6 994; SSSE3-NEXT: pand %xmm6, %xmm2 995; SSSE3-NEXT: por %xmm4, %xmm2 996; SSSE3-NEXT: pcmpgtd %xmm7, %xmm8 997; SSSE3-NEXT: paddd %xmm3, %xmm7 998; SSSE3-NEXT: pcmpgtd %xmm7, %xmm3 999; SSSE3-NEXT: pxor %xmm8, %xmm3 1000; SSSE3-NEXT: movdqa %xmm3, %xmm4 1001; SSSE3-NEXT: pandn %xmm7, %xmm4 1002; SSSE3-NEXT: psrad $31, %xmm7 1003; SSSE3-NEXT: pxor %xmm7, %xmm9 1004; SSSE3-NEXT: pand %xmm9, %xmm3 1005; SSSE3-NEXT: por %xmm4, %xmm3 1006; SSSE3-NEXT: retq 1007; 1008; SSE41-LABEL: v16i32: 1009; SSE41: # %bb.0: 1010; SSE41-NEXT: movdqa %xmm3, %xmm11 1011; SSE41-NEXT: movdqa %xmm2, %xmm8 1012; SSE41-NEXT: movdqa %xmm1, %xmm9 1013; SSE41-NEXT: movdqa %xmm0, %xmm10 1014; SSE41-NEXT: paddd %xmm4, %xmm10 1015; SSE41-NEXT: pcmpgtd %xmm10, %xmm0 1016; SSE41-NEXT: pxor %xmm4, %xmm0 1017; SSE41-NEXT: movdqa %xmm10, %xmm1 1018; SSE41-NEXT: psrad $31, %xmm1 1019; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] 1020; SSE41-NEXT: pxor %xmm4, %xmm1 1021; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm10 1022; SSE41-NEXT: movdqa %xmm9, %xmm1 1023; SSE41-NEXT: paddd %xmm5, %xmm1 1024; SSE41-NEXT: pcmpgtd %xmm1, %xmm9 1025; SSE41-NEXT: pxor %xmm5, %xmm9 1026; SSE41-NEXT: movdqa %xmm1, %xmm2 1027; SSE41-NEXT: psrad $31, %xmm2 1028; SSE41-NEXT: pxor %xmm4, %xmm2 1029; SSE41-NEXT: movdqa %xmm9, %xmm0 1030; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm1 1031; SSE41-NEXT: movdqa %xmm8, %xmm2 1032; SSE41-NEXT: paddd %xmm6, %xmm2 1033; SSE41-NEXT: pcmpgtd %xmm2, %xmm8 1034; SSE41-NEXT: pxor %xmm6, %xmm8 1035; SSE41-NEXT: movdqa %xmm2, %xmm3 1036; SSE41-NEXT: psrad $31, %xmm3 1037; SSE41-NEXT: pxor %xmm4, %xmm3 1038; SSE41-NEXT: movdqa %xmm8, %xmm0 1039; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm2 1040; SSE41-NEXT: movdqa %xmm11, %xmm3 1041; SSE41-NEXT: paddd %xmm7, %xmm3 1042; SSE41-NEXT: pcmpgtd %xmm3, %xmm11 1043; SSE41-NEXT: pxor %xmm7, %xmm11 1044; SSE41-NEXT: movdqa %xmm3, %xmm5 1045; SSE41-NEXT: psrad $31, %xmm5 1046; SSE41-NEXT: pxor %xmm4, %xmm5 1047; SSE41-NEXT: movdqa %xmm11, %xmm0 1048; SSE41-NEXT: blendvps %xmm0, %xmm5, %xmm3 1049; SSE41-NEXT: movaps %xmm10, %xmm0 1050; SSE41-NEXT: retq 1051; 1052; AVX1-LABEL: v16i32: 1053; AVX1: # %bb.0: 1054; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 1055; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 1056; AVX1-NEXT: vpaddd %xmm4, %xmm5, %xmm4 1057; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm6 1058; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm6, %ymm7 1059; AVX1-NEXT: vpcmpgtd %xmm4, %xmm5, %xmm5 1060; AVX1-NEXT: vpcmpgtd %xmm6, %xmm0, %xmm0 1061; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm0, %ymm0 1062; AVX1-NEXT: vxorps %ymm0, %ymm2, %ymm0 1063; AVX1-NEXT: vpsrad $31, %xmm6, %xmm2 1064; AVX1-NEXT: vpsrad $31, %xmm4, %xmm4 1065; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm2, %ymm2 1066; AVX1-NEXT: vbroadcastss {{.*#+}} ymm4 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648] 1067; AVX1-NEXT: vxorps %ymm4, %ymm2, %ymm2 1068; AVX1-NEXT: vblendvps %ymm0, %ymm2, %ymm7, %ymm0 1069; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2 1070; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 1071; AVX1-NEXT: vpaddd %xmm2, %xmm5, %xmm2 1072; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm6 1073; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm6, %ymm7 1074; AVX1-NEXT: vpcmpgtd %xmm2, %xmm5, %xmm5 1075; AVX1-NEXT: vpcmpgtd %xmm6, %xmm1, %xmm1 1076; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm1, %ymm1 1077; AVX1-NEXT: vxorps %ymm1, %ymm3, %ymm1 1078; AVX1-NEXT: vpsrad $31, %xmm6, %xmm3 1079; AVX1-NEXT: vpsrad $31, %xmm2, %xmm2 1080; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2 1081; AVX1-NEXT: vxorps %ymm4, %ymm2, %ymm2 1082; AVX1-NEXT: vblendvps %ymm1, %ymm2, %ymm7, %ymm1 1083; AVX1-NEXT: retq 1084; 1085; AVX2-LABEL: v16i32: 1086; AVX2: # %bb.0: 1087; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm4 1088; AVX2-NEXT: vpcmpgtd %ymm4, %ymm0, %ymm0 1089; AVX2-NEXT: vpxor %ymm0, %ymm2, %ymm0 1090; AVX2-NEXT: vpsrad $31, %ymm4, %ymm2 1091; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm5 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648] 1092; AVX2-NEXT: vpxor %ymm5, %ymm2, %ymm2 1093; AVX2-NEXT: vblendvps %ymm0, %ymm2, %ymm4, %ymm0 1094; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm2 1095; AVX2-NEXT: vpcmpgtd %ymm2, %ymm1, %ymm1 1096; AVX2-NEXT: vpxor %ymm1, %ymm3, %ymm1 1097; AVX2-NEXT: vpsrad $31, %ymm2, %ymm3 1098; AVX2-NEXT: vpxor %ymm5, %ymm3, %ymm3 1099; AVX2-NEXT: vblendvps %ymm1, %ymm3, %ymm2, %ymm1 1100; AVX2-NEXT: retq 1101; 1102; AVX512-LABEL: v16i32: 1103; AVX512: # %bb.0: 1104; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2 1105; AVX512-NEXT: vpcmpgtd %zmm1, %zmm2, %k0 1106; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm1 1107; AVX512-NEXT: vpcmpgtd %zmm1, %zmm0, %k1 1108; AVX512-NEXT: kxorw %k1, %k0, %k1 1109; AVX512-NEXT: vpsrad $31, %zmm1, %zmm0 1110; AVX512-NEXT: vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm1 {%k1} 1111; AVX512-NEXT: vmovdqa64 %zmm1, %zmm0 1112; AVX512-NEXT: retq 1113 %z = call <16 x i32> @llvm.sadd.sat.v16i32(<16 x i32> %x, <16 x i32> %y) 1114 ret <16 x i32> %z 1115} 1116 1117define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind { 1118; SSE2-LABEL: v2i64: 1119; SSE2: # %bb.0: 1120; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] 1121; SSE2-NEXT: movdqa %xmm0, %xmm3 1122; SSE2-NEXT: pxor %xmm2, %xmm3 1123; SSE2-NEXT: paddq %xmm1, %xmm0 1124; SSE2-NEXT: pxor %xmm0, %xmm2 1125; SSE2-NEXT: movdqa %xmm3, %xmm4 1126; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 1127; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1128; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 1129; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1130; SSE2-NEXT: pand %xmm5, %xmm2 1131; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 1132; SSE2-NEXT: por %xmm2, %xmm3 1133; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1134; SSE2-NEXT: pxor %xmm2, %xmm2 1135; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 1136; SSE2-NEXT: pxor %xmm3, %xmm2 1137; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3] 1138; SSE2-NEXT: psrad $31, %xmm1 1139; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 1140; SSE2-NEXT: pand %xmm2, %xmm1 1141; SSE2-NEXT: pandn %xmm0, %xmm2 1142; SSE2-NEXT: por %xmm2, %xmm1 1143; SSE2-NEXT: movdqa %xmm1, %xmm0 1144; SSE2-NEXT: retq 1145; 1146; SSSE3-LABEL: v2i64: 1147; SSSE3: # %bb.0: 1148; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] 1149; SSSE3-NEXT: movdqa %xmm0, %xmm3 1150; SSSE3-NEXT: pxor %xmm2, %xmm3 1151; SSSE3-NEXT: paddq %xmm1, %xmm0 1152; SSSE3-NEXT: pxor %xmm0, %xmm2 1153; SSSE3-NEXT: movdqa %xmm3, %xmm4 1154; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4 1155; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1156; SSSE3-NEXT: pcmpeqd %xmm3, %xmm2 1157; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1158; SSSE3-NEXT: pand %xmm5, %xmm2 1159; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 1160; SSSE3-NEXT: por %xmm2, %xmm3 1161; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1162; SSSE3-NEXT: pxor %xmm2, %xmm2 1163; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2 1164; SSSE3-NEXT: pxor %xmm3, %xmm2 1165; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3] 1166; SSSE3-NEXT: psrad $31, %xmm1 1167; SSSE3-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 1168; SSSE3-NEXT: pand %xmm2, %xmm1 1169; SSSE3-NEXT: pandn %xmm0, %xmm2 1170; SSSE3-NEXT: por %xmm2, %xmm1 1171; SSSE3-NEXT: movdqa %xmm1, %xmm0 1172; SSSE3-NEXT: retq 1173; 1174; SSE41-LABEL: v2i64: 1175; SSE41: # %bb.0: 1176; SSE41-NEXT: movdqa %xmm0, %xmm2 1177; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = [2147483648,2147483648] 1178; SSE41-NEXT: movdqa %xmm2, %xmm4 1179; SSE41-NEXT: pxor %xmm0, %xmm4 1180; SSE41-NEXT: paddq %xmm1, %xmm2 1181; SSE41-NEXT: pxor %xmm2, %xmm0 1182; SSE41-NEXT: movdqa %xmm4, %xmm5 1183; SSE41-NEXT: pcmpeqd %xmm0, %xmm5 1184; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 1185; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm4[0,0,2,2] 1186; SSE41-NEXT: pand %xmm5, %xmm3 1187; SSE41-NEXT: por %xmm4, %xmm3 1188; SSE41-NEXT: pxor %xmm1, %xmm3 1189; SSE41-NEXT: movapd {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808] 1190; SSE41-NEXT: movdqa %xmm2, %xmm0 1191; SSE41-NEXT: blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 1192; SSE41-NEXT: movdqa %xmm3, %xmm0 1193; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2 1194; SSE41-NEXT: movapd %xmm2, %xmm0 1195; SSE41-NEXT: retq 1196; 1197; AVX1-LABEL: v2i64: 1198; AVX1: # %bb.0: 1199; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm2 1200; AVX1-NEXT: vmovddup {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808] 1201; AVX1-NEXT: # xmm3 = mem[0,0] 1202; AVX1-NEXT: vblendvpd %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 1203; AVX1-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm0 1204; AVX1-NEXT: vpxor %xmm0, %xmm1, %xmm0 1205; AVX1-NEXT: vblendvpd %xmm0, %xmm3, %xmm2, %xmm0 1206; AVX1-NEXT: retq 1207; 1208; AVX2-LABEL: v2i64: 1209; AVX2: # %bb.0: 1210; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm2 1211; AVX2-NEXT: vmovddup {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808] 1212; AVX2-NEXT: # xmm3 = mem[0,0] 1213; AVX2-NEXT: vblendvpd %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 1214; AVX2-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm0 1215; AVX2-NEXT: vpxor %xmm0, %xmm1, %xmm0 1216; AVX2-NEXT: vblendvpd %xmm0, %xmm3, %xmm2, %xmm0 1217; AVX2-NEXT: retq 1218; 1219; AVX512F-LABEL: v2i64: 1220; AVX512F: # %bb.0: 1221; AVX512F-NEXT: vpaddq %xmm1, %xmm0, %xmm2 1222; AVX512F-NEXT: vmovddup {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808] 1223; AVX512F-NEXT: # xmm3 = mem[0,0] 1224; AVX512F-NEXT: vblendvpd %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 1225; AVX512F-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm0 1226; AVX512F-NEXT: vpxor %xmm0, %xmm1, %xmm0 1227; AVX512F-NEXT: vblendvpd %xmm0, %xmm3, %xmm2, %xmm0 1228; AVX512F-NEXT: retq 1229; 1230; AVX512BW-LABEL: v2i64: 1231; AVX512BW: # %bb.0: 1232; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2 1233; AVX512BW-NEXT: vpcmpgtq %xmm1, %xmm2, %k0 1234; AVX512BW-NEXT: vpaddq %xmm1, %xmm0, %xmm1 1235; AVX512BW-NEXT: vpcmpgtq %xmm1, %xmm0, %k1 1236; AVX512BW-NEXT: kxorw %k1, %k0, %k1 1237; AVX512BW-NEXT: vpcmpgtq %xmm1, %xmm2, %k2 1238; AVX512BW-NEXT: vpbroadcastq {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808] 1239; AVX512BW-NEXT: vpbroadcastq {{.*#+}} xmm0 {%k2} = [9223372036854775807,9223372036854775807] 1240; AVX512BW-NEXT: vmovdqa64 %xmm0, %xmm1 {%k1} 1241; AVX512BW-NEXT: vmovdqa %xmm1, %xmm0 1242; AVX512BW-NEXT: retq 1243 %z = call <2 x i64> @llvm.sadd.sat.v2i64(<2 x i64> %x, <2 x i64> %y) 1244 ret <2 x i64> %z 1245} 1246 1247define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind { 1248; SSE2-LABEL: v4i64: 1249; SSE2: # %bb.0: 1250; SSE2-NEXT: movdqa %xmm0, %xmm4 1251; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648] 1252; SSE2-NEXT: pxor %xmm6, %xmm0 1253; SSE2-NEXT: paddq %xmm2, %xmm4 1254; SSE2-NEXT: movdqa %xmm4, %xmm5 1255; SSE2-NEXT: pxor %xmm6, %xmm5 1256; SSE2-NEXT: movdqa %xmm0, %xmm7 1257; SSE2-NEXT: pcmpgtd %xmm5, %xmm7 1258; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2] 1259; SSE2-NEXT: pcmpeqd %xmm0, %xmm5 1260; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3] 1261; SSE2-NEXT: pand %xmm8, %xmm0 1262; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3] 1263; SSE2-NEXT: por %xmm0, %xmm7 1264; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 1265; SSE2-NEXT: pxor %xmm5, %xmm5 1266; SSE2-NEXT: pxor %xmm2, %xmm2 1267; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 1268; SSE2-NEXT: pxor %xmm7, %xmm2 1269; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 1270; SSE2-NEXT: psrad $31, %xmm0 1271; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [9223372036854775808,9223372036854775808] 1272; SSE2-NEXT: pxor %xmm7, %xmm0 1273; SSE2-NEXT: pand %xmm2, %xmm0 1274; SSE2-NEXT: pandn %xmm4, %xmm2 1275; SSE2-NEXT: por %xmm2, %xmm0 1276; SSE2-NEXT: movdqa %xmm1, %xmm2 1277; SSE2-NEXT: pxor %xmm6, %xmm2 1278; SSE2-NEXT: paddq %xmm3, %xmm1 1279; SSE2-NEXT: pxor %xmm1, %xmm6 1280; SSE2-NEXT: movdqa %xmm2, %xmm4 1281; SSE2-NEXT: pcmpgtd %xmm6, %xmm4 1282; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2] 1283; SSE2-NEXT: pcmpeqd %xmm2, %xmm6 1284; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3] 1285; SSE2-NEXT: pand %xmm8, %xmm2 1286; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1287; SSE2-NEXT: por %xmm2, %xmm4 1288; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3] 1289; SSE2-NEXT: pcmpgtd %xmm2, %xmm5 1290; SSE2-NEXT: pxor %xmm4, %xmm5 1291; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] 1292; SSE2-NEXT: psrad $31, %xmm2 1293; SSE2-NEXT: pxor %xmm7, %xmm2 1294; SSE2-NEXT: pand %xmm5, %xmm2 1295; SSE2-NEXT: pandn %xmm1, %xmm5 1296; SSE2-NEXT: por %xmm5, %xmm2 1297; SSE2-NEXT: movdqa %xmm2, %xmm1 1298; SSE2-NEXT: retq 1299; 1300; SSSE3-LABEL: v4i64: 1301; SSSE3: # %bb.0: 1302; SSSE3-NEXT: movdqa %xmm0, %xmm4 1303; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648] 1304; SSSE3-NEXT: pxor %xmm6, %xmm0 1305; SSSE3-NEXT: paddq %xmm2, %xmm4 1306; SSSE3-NEXT: movdqa %xmm4, %xmm5 1307; SSSE3-NEXT: pxor %xmm6, %xmm5 1308; SSSE3-NEXT: movdqa %xmm0, %xmm7 1309; SSSE3-NEXT: pcmpgtd %xmm5, %xmm7 1310; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2] 1311; SSSE3-NEXT: pcmpeqd %xmm0, %xmm5 1312; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3] 1313; SSSE3-NEXT: pand %xmm8, %xmm0 1314; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3] 1315; SSSE3-NEXT: por %xmm0, %xmm7 1316; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 1317; SSSE3-NEXT: pxor %xmm5, %xmm5 1318; SSSE3-NEXT: pxor %xmm2, %xmm2 1319; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2 1320; SSSE3-NEXT: pxor %xmm7, %xmm2 1321; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 1322; SSSE3-NEXT: psrad $31, %xmm0 1323; SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [9223372036854775808,9223372036854775808] 1324; SSSE3-NEXT: pxor %xmm7, %xmm0 1325; SSSE3-NEXT: pand %xmm2, %xmm0 1326; SSSE3-NEXT: pandn %xmm4, %xmm2 1327; SSSE3-NEXT: por %xmm2, %xmm0 1328; SSSE3-NEXT: movdqa %xmm1, %xmm2 1329; SSSE3-NEXT: pxor %xmm6, %xmm2 1330; SSSE3-NEXT: paddq %xmm3, %xmm1 1331; SSSE3-NEXT: pxor %xmm1, %xmm6 1332; SSSE3-NEXT: movdqa %xmm2, %xmm4 1333; SSSE3-NEXT: pcmpgtd %xmm6, %xmm4 1334; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2] 1335; SSSE3-NEXT: pcmpeqd %xmm2, %xmm6 1336; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3] 1337; SSSE3-NEXT: pand %xmm8, %xmm2 1338; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1339; SSSE3-NEXT: por %xmm2, %xmm4 1340; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3] 1341; SSSE3-NEXT: pcmpgtd %xmm2, %xmm5 1342; SSSE3-NEXT: pxor %xmm4, %xmm5 1343; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] 1344; SSSE3-NEXT: psrad $31, %xmm2 1345; SSSE3-NEXT: pxor %xmm7, %xmm2 1346; SSSE3-NEXT: pand %xmm5, %xmm2 1347; SSSE3-NEXT: pandn %xmm1, %xmm5 1348; SSSE3-NEXT: por %xmm5, %xmm2 1349; SSSE3-NEXT: movdqa %xmm2, %xmm1 1350; SSSE3-NEXT: retq 1351; 1352; SSE41-LABEL: v4i64: 1353; SSE41: # %bb.0: 1354; SSE41-NEXT: movdqa %xmm0, %xmm4 1355; SSE41-NEXT: pmovzxdq {{.*#+}} xmm6 = [2147483648,2147483648] 1356; SSE41-NEXT: pxor %xmm6, %xmm0 1357; SSE41-NEXT: paddq %xmm2, %xmm4 1358; SSE41-NEXT: movdqa %xmm4, %xmm5 1359; SSE41-NEXT: pxor %xmm6, %xmm5 1360; SSE41-NEXT: movdqa %xmm0, %xmm7 1361; SSE41-NEXT: pcmpeqd %xmm5, %xmm7 1362; SSE41-NEXT: pcmpgtd %xmm5, %xmm0 1363; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2] 1364; SSE41-NEXT: pand %xmm7, %xmm5 1365; SSE41-NEXT: por %xmm0, %xmm5 1366; SSE41-NEXT: pxor %xmm2, %xmm5 1367; SSE41-NEXT: movapd {{.*#+}} xmm7 = [9223372036854775807,9223372036854775807] 1368; SSE41-NEXT: movapd {{.*#+}} xmm8 = [9223372036854775808,9223372036854775808] 1369; SSE41-NEXT: movapd %xmm8, %xmm2 1370; SSE41-NEXT: movdqa %xmm4, %xmm0 1371; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm2 1372; SSE41-NEXT: movdqa %xmm5, %xmm0 1373; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4 1374; SSE41-NEXT: movdqa %xmm1, %xmm0 1375; SSE41-NEXT: pxor %xmm6, %xmm0 1376; SSE41-NEXT: paddq %xmm3, %xmm1 1377; SSE41-NEXT: pxor %xmm1, %xmm6 1378; SSE41-NEXT: movdqa %xmm0, %xmm5 1379; SSE41-NEXT: pcmpeqd %xmm6, %xmm5 1380; SSE41-NEXT: pcmpgtd %xmm6, %xmm0 1381; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2] 1382; SSE41-NEXT: pand %xmm5, %xmm2 1383; SSE41-NEXT: por %xmm0, %xmm2 1384; SSE41-NEXT: pxor %xmm3, %xmm2 1385; SSE41-NEXT: movdqa %xmm1, %xmm0 1386; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm8 1387; SSE41-NEXT: movdqa %xmm2, %xmm0 1388; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm1 1389; SSE41-NEXT: movapd %xmm4, %xmm0 1390; SSE41-NEXT: retq 1391; 1392; AVX1-LABEL: v4i64: 1393; AVX1: # %bb.0: 1394; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1395; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1396; AVX1-NEXT: vpaddq %xmm2, %xmm3, %xmm2 1397; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm4 1398; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm4, %ymm5 1399; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm3 1400; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm0 1401; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 1402; AVX1-NEXT: vxorpd %ymm0, %ymm1, %ymm0 1403; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 1404; AVX1-NEXT: vpcmpgtq %xmm2, %xmm1, %xmm2 1405; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm1 1406; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1407; AVX1-NEXT: vxorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 1408; AVX1-NEXT: vblendvpd %ymm0, %ymm1, %ymm5, %ymm0 1409; AVX1-NEXT: retq 1410; 1411; AVX2-LABEL: v4i64: 1412; AVX2: # %bb.0: 1413; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm2 1414; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm0 1415; AVX2-NEXT: vpxor %ymm0, %ymm1, %ymm0 1416; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 1417; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm1 1418; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 1419; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 1420; AVX2-NEXT: vblendvpd %ymm0, %ymm1, %ymm2, %ymm0 1421; AVX2-NEXT: retq 1422; 1423; AVX512F-LABEL: v4i64: 1424; AVX512F: # %bb.0: 1425; AVX512F-NEXT: vpaddq %ymm1, %ymm0, %ymm2 1426; AVX512F-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm0 1427; AVX512F-NEXT: vpxor %ymm0, %ymm1, %ymm0 1428; AVX512F-NEXT: vpsraq $63, %zmm2, %zmm1 1429; AVX512F-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 1430; AVX512F-NEXT: vpxor %ymm3, %ymm1, %ymm1 1431; AVX512F-NEXT: vblendvpd %ymm0, %ymm1, %ymm2, %ymm0 1432; AVX512F-NEXT: retq 1433; 1434; AVX512BW-LABEL: v4i64: 1435; AVX512BW: # %bb.0: 1436; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2 1437; AVX512BW-NEXT: vpcmpgtq %ymm1, %ymm2, %k0 1438; AVX512BW-NEXT: vpaddq %ymm1, %ymm0, %ymm1 1439; AVX512BW-NEXT: vpcmpgtq %ymm1, %ymm0, %k1 1440; AVX512BW-NEXT: kxorw %k1, %k0, %k1 1441; AVX512BW-NEXT: vpsraq $63, %ymm1, %ymm0 1442; AVX512BW-NEXT: vpxorq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm1 {%k1} 1443; AVX512BW-NEXT: vmovdqa %ymm1, %ymm0 1444; AVX512BW-NEXT: retq 1445 %z = call <4 x i64> @llvm.sadd.sat.v4i64(<4 x i64> %x, <4 x i64> %y) 1446 ret <4 x i64> %z 1447} 1448 1449define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind { 1450; SSE2-LABEL: v8i64: 1451; SSE2: # %bb.0: 1452; SSE2-NEXT: movdqa %xmm1, %xmm8 1453; SSE2-NEXT: movdqa %xmm0, %xmm1 1454; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147483648,2147483648] 1455; SSE2-NEXT: pxor %xmm10, %xmm0 1456; SSE2-NEXT: paddq %xmm4, %xmm1 1457; SSE2-NEXT: movdqa %xmm1, %xmm9 1458; SSE2-NEXT: pxor %xmm10, %xmm9 1459; SSE2-NEXT: movdqa %xmm0, %xmm11 1460; SSE2-NEXT: pcmpgtd %xmm9, %xmm11 1461; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2] 1462; SSE2-NEXT: pcmpeqd %xmm0, %xmm9 1463; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm9[1,1,3,3] 1464; SSE2-NEXT: pand %xmm12, %xmm0 1465; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3] 1466; SSE2-NEXT: por %xmm0, %xmm11 1467; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 1468; SSE2-NEXT: pxor %xmm9, %xmm9 1469; SSE2-NEXT: pxor %xmm4, %xmm4 1470; SSE2-NEXT: pcmpgtd %xmm0, %xmm4 1471; SSE2-NEXT: pxor %xmm11, %xmm4 1472; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 1473; SSE2-NEXT: psrad $31, %xmm0 1474; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [9223372036854775808,9223372036854775808] 1475; SSE2-NEXT: pxor %xmm11, %xmm0 1476; SSE2-NEXT: pand %xmm4, %xmm0 1477; SSE2-NEXT: pandn %xmm1, %xmm4 1478; SSE2-NEXT: por %xmm4, %xmm0 1479; SSE2-NEXT: movdqa %xmm8, %xmm1 1480; SSE2-NEXT: pxor %xmm10, %xmm1 1481; SSE2-NEXT: paddq %xmm5, %xmm8 1482; SSE2-NEXT: movdqa %xmm8, %xmm4 1483; SSE2-NEXT: pxor %xmm10, %xmm4 1484; SSE2-NEXT: movdqa %xmm1, %xmm12 1485; SSE2-NEXT: pcmpgtd %xmm4, %xmm12 1486; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2] 1487; SSE2-NEXT: pcmpeqd %xmm1, %xmm4 1488; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3] 1489; SSE2-NEXT: pand %xmm13, %xmm1 1490; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm12[1,1,3,3] 1491; SSE2-NEXT: por %xmm1, %xmm4 1492; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3] 1493; SSE2-NEXT: pxor %xmm5, %xmm5 1494; SSE2-NEXT: pcmpgtd %xmm1, %xmm5 1495; SSE2-NEXT: pxor %xmm4, %xmm5 1496; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3] 1497; SSE2-NEXT: psrad $31, %xmm1 1498; SSE2-NEXT: pxor %xmm11, %xmm1 1499; SSE2-NEXT: pand %xmm5, %xmm1 1500; SSE2-NEXT: pandn %xmm8, %xmm5 1501; SSE2-NEXT: por %xmm5, %xmm1 1502; SSE2-NEXT: movdqa %xmm2, %xmm4 1503; SSE2-NEXT: pxor %xmm10, %xmm4 1504; SSE2-NEXT: paddq %xmm6, %xmm2 1505; SSE2-NEXT: movdqa %xmm2, %xmm5 1506; SSE2-NEXT: pxor %xmm10, %xmm5 1507; SSE2-NEXT: movdqa %xmm4, %xmm8 1508; SSE2-NEXT: pcmpgtd %xmm5, %xmm8 1509; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm8[0,0,2,2] 1510; SSE2-NEXT: pcmpeqd %xmm4, %xmm5 1511; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 1512; SSE2-NEXT: pand %xmm12, %xmm4 1513; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3] 1514; SSE2-NEXT: por %xmm4, %xmm5 1515; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3] 1516; SSE2-NEXT: pxor %xmm6, %xmm6 1517; SSE2-NEXT: pcmpgtd %xmm4, %xmm6 1518; SSE2-NEXT: pxor %xmm5, %xmm6 1519; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 1520; SSE2-NEXT: psrad $31, %xmm4 1521; SSE2-NEXT: pxor %xmm11, %xmm4 1522; SSE2-NEXT: pand %xmm6, %xmm4 1523; SSE2-NEXT: pandn %xmm2, %xmm6 1524; SSE2-NEXT: por %xmm6, %xmm4 1525; SSE2-NEXT: movdqa %xmm3, %xmm2 1526; SSE2-NEXT: pxor %xmm10, %xmm2 1527; SSE2-NEXT: paddq %xmm7, %xmm3 1528; SSE2-NEXT: pxor %xmm3, %xmm10 1529; SSE2-NEXT: movdqa %xmm2, %xmm5 1530; SSE2-NEXT: pcmpgtd %xmm10, %xmm5 1531; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 1532; SSE2-NEXT: pcmpeqd %xmm2, %xmm10 1533; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3] 1534; SSE2-NEXT: pand %xmm6, %xmm2 1535; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 1536; SSE2-NEXT: por %xmm2, %xmm5 1537; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3] 1538; SSE2-NEXT: pcmpgtd %xmm2, %xmm9 1539; SSE2-NEXT: pxor %xmm5, %xmm9 1540; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3] 1541; SSE2-NEXT: psrad $31, %xmm5 1542; SSE2-NEXT: pxor %xmm11, %xmm5 1543; SSE2-NEXT: pand %xmm9, %xmm5 1544; SSE2-NEXT: pandn %xmm3, %xmm9 1545; SSE2-NEXT: por %xmm9, %xmm5 1546; SSE2-NEXT: movdqa %xmm4, %xmm2 1547; SSE2-NEXT: movdqa %xmm5, %xmm3 1548; SSE2-NEXT: retq 1549; 1550; SSSE3-LABEL: v8i64: 1551; SSSE3: # %bb.0: 1552; SSSE3-NEXT: movdqa %xmm1, %xmm8 1553; SSSE3-NEXT: movdqa %xmm0, %xmm1 1554; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [2147483648,2147483648] 1555; SSSE3-NEXT: pxor %xmm10, %xmm0 1556; SSSE3-NEXT: paddq %xmm4, %xmm1 1557; SSSE3-NEXT: movdqa %xmm1, %xmm9 1558; SSSE3-NEXT: pxor %xmm10, %xmm9 1559; SSSE3-NEXT: movdqa %xmm0, %xmm11 1560; SSSE3-NEXT: pcmpgtd %xmm9, %xmm11 1561; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2] 1562; SSSE3-NEXT: pcmpeqd %xmm0, %xmm9 1563; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm9[1,1,3,3] 1564; SSSE3-NEXT: pand %xmm12, %xmm0 1565; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3] 1566; SSSE3-NEXT: por %xmm0, %xmm11 1567; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 1568; SSSE3-NEXT: pxor %xmm9, %xmm9 1569; SSSE3-NEXT: pxor %xmm4, %xmm4 1570; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4 1571; SSSE3-NEXT: pxor %xmm11, %xmm4 1572; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 1573; SSSE3-NEXT: psrad $31, %xmm0 1574; SSSE3-NEXT: movdqa {{.*#+}} xmm11 = [9223372036854775808,9223372036854775808] 1575; SSSE3-NEXT: pxor %xmm11, %xmm0 1576; SSSE3-NEXT: pand %xmm4, %xmm0 1577; SSSE3-NEXT: pandn %xmm1, %xmm4 1578; SSSE3-NEXT: por %xmm4, %xmm0 1579; SSSE3-NEXT: movdqa %xmm8, %xmm1 1580; SSSE3-NEXT: pxor %xmm10, %xmm1 1581; SSSE3-NEXT: paddq %xmm5, %xmm8 1582; SSSE3-NEXT: movdqa %xmm8, %xmm4 1583; SSSE3-NEXT: pxor %xmm10, %xmm4 1584; SSSE3-NEXT: movdqa %xmm1, %xmm12 1585; SSSE3-NEXT: pcmpgtd %xmm4, %xmm12 1586; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2] 1587; SSSE3-NEXT: pcmpeqd %xmm1, %xmm4 1588; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3] 1589; SSSE3-NEXT: pand %xmm13, %xmm1 1590; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm12[1,1,3,3] 1591; SSSE3-NEXT: por %xmm1, %xmm4 1592; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3] 1593; SSSE3-NEXT: pxor %xmm5, %xmm5 1594; SSSE3-NEXT: pcmpgtd %xmm1, %xmm5 1595; SSSE3-NEXT: pxor %xmm4, %xmm5 1596; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3] 1597; SSSE3-NEXT: psrad $31, %xmm1 1598; SSSE3-NEXT: pxor %xmm11, %xmm1 1599; SSSE3-NEXT: pand %xmm5, %xmm1 1600; SSSE3-NEXT: pandn %xmm8, %xmm5 1601; SSSE3-NEXT: por %xmm5, %xmm1 1602; SSSE3-NEXT: movdqa %xmm2, %xmm4 1603; SSSE3-NEXT: pxor %xmm10, %xmm4 1604; SSSE3-NEXT: paddq %xmm6, %xmm2 1605; SSSE3-NEXT: movdqa %xmm2, %xmm5 1606; SSSE3-NEXT: pxor %xmm10, %xmm5 1607; SSSE3-NEXT: movdqa %xmm4, %xmm8 1608; SSSE3-NEXT: pcmpgtd %xmm5, %xmm8 1609; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm8[0,0,2,2] 1610; SSSE3-NEXT: pcmpeqd %xmm4, %xmm5 1611; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 1612; SSSE3-NEXT: pand %xmm12, %xmm4 1613; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3] 1614; SSSE3-NEXT: por %xmm4, %xmm5 1615; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3] 1616; SSSE3-NEXT: pxor %xmm6, %xmm6 1617; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6 1618; SSSE3-NEXT: pxor %xmm5, %xmm6 1619; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 1620; SSSE3-NEXT: psrad $31, %xmm4 1621; SSSE3-NEXT: pxor %xmm11, %xmm4 1622; SSSE3-NEXT: pand %xmm6, %xmm4 1623; SSSE3-NEXT: pandn %xmm2, %xmm6 1624; SSSE3-NEXT: por %xmm6, %xmm4 1625; SSSE3-NEXT: movdqa %xmm3, %xmm2 1626; SSSE3-NEXT: pxor %xmm10, %xmm2 1627; SSSE3-NEXT: paddq %xmm7, %xmm3 1628; SSSE3-NEXT: pxor %xmm3, %xmm10 1629; SSSE3-NEXT: movdqa %xmm2, %xmm5 1630; SSSE3-NEXT: pcmpgtd %xmm10, %xmm5 1631; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 1632; SSSE3-NEXT: pcmpeqd %xmm2, %xmm10 1633; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3] 1634; SSSE3-NEXT: pand %xmm6, %xmm2 1635; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 1636; SSSE3-NEXT: por %xmm2, %xmm5 1637; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3] 1638; SSSE3-NEXT: pcmpgtd %xmm2, %xmm9 1639; SSSE3-NEXT: pxor %xmm5, %xmm9 1640; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3] 1641; SSSE3-NEXT: psrad $31, %xmm5 1642; SSSE3-NEXT: pxor %xmm11, %xmm5 1643; SSSE3-NEXT: pand %xmm9, %xmm5 1644; SSSE3-NEXT: pandn %xmm3, %xmm9 1645; SSSE3-NEXT: por %xmm9, %xmm5 1646; SSSE3-NEXT: movdqa %xmm4, %xmm2 1647; SSSE3-NEXT: movdqa %xmm5, %xmm3 1648; SSSE3-NEXT: retq 1649; 1650; SSE41-LABEL: v8i64: 1651; SSE41: # %bb.0: 1652; SSE41-NEXT: movdqa %xmm0, %xmm8 1653; SSE41-NEXT: pmovzxdq {{.*#+}} xmm10 = [2147483648,2147483648] 1654; SSE41-NEXT: pxor %xmm10, %xmm0 1655; SSE41-NEXT: paddq %xmm4, %xmm8 1656; SSE41-NEXT: movdqa %xmm8, %xmm9 1657; SSE41-NEXT: pxor %xmm10, %xmm9 1658; SSE41-NEXT: movdqa %xmm0, %xmm11 1659; SSE41-NEXT: pcmpeqd %xmm9, %xmm11 1660; SSE41-NEXT: pcmpgtd %xmm9, %xmm0 1661; SSE41-NEXT: pshufd {{.*#+}} xmm9 = xmm0[0,0,2,2] 1662; SSE41-NEXT: pand %xmm11, %xmm9 1663; SSE41-NEXT: por %xmm0, %xmm9 1664; SSE41-NEXT: pxor %xmm4, %xmm9 1665; SSE41-NEXT: movapd {{.*#+}} xmm12 = [9223372036854775807,9223372036854775807] 1666; SSE41-NEXT: movapd {{.*#+}} xmm11 = [9223372036854775808,9223372036854775808] 1667; SSE41-NEXT: movapd %xmm11, %xmm4 1668; SSE41-NEXT: movdqa %xmm8, %xmm0 1669; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm4 1670; SSE41-NEXT: movdqa %xmm9, %xmm0 1671; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm8 1672; SSE41-NEXT: movdqa %xmm1, %xmm0 1673; SSE41-NEXT: pxor %xmm10, %xmm0 1674; SSE41-NEXT: paddq %xmm5, %xmm1 1675; SSE41-NEXT: movdqa %xmm1, %xmm4 1676; SSE41-NEXT: pxor %xmm10, %xmm4 1677; SSE41-NEXT: movdqa %xmm0, %xmm9 1678; SSE41-NEXT: pcmpeqd %xmm4, %xmm9 1679; SSE41-NEXT: pcmpgtd %xmm4, %xmm0 1680; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2] 1681; SSE41-NEXT: pand %xmm9, %xmm4 1682; SSE41-NEXT: por %xmm0, %xmm4 1683; SSE41-NEXT: pxor %xmm5, %xmm4 1684; SSE41-NEXT: movapd %xmm11, %xmm5 1685; SSE41-NEXT: movdqa %xmm1, %xmm0 1686; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm5 1687; SSE41-NEXT: movdqa %xmm4, %xmm0 1688; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1 1689; SSE41-NEXT: movdqa %xmm2, %xmm0 1690; SSE41-NEXT: pxor %xmm10, %xmm0 1691; SSE41-NEXT: paddq %xmm6, %xmm2 1692; SSE41-NEXT: movdqa %xmm2, %xmm4 1693; SSE41-NEXT: pxor %xmm10, %xmm4 1694; SSE41-NEXT: movdqa %xmm0, %xmm5 1695; SSE41-NEXT: pcmpeqd %xmm4, %xmm5 1696; SSE41-NEXT: pcmpgtd %xmm4, %xmm0 1697; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2] 1698; SSE41-NEXT: pand %xmm5, %xmm4 1699; SSE41-NEXT: por %xmm0, %xmm4 1700; SSE41-NEXT: pxor %xmm6, %xmm4 1701; SSE41-NEXT: movapd %xmm11, %xmm5 1702; SSE41-NEXT: movdqa %xmm2, %xmm0 1703; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm5 1704; SSE41-NEXT: movdqa %xmm4, %xmm0 1705; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm2 1706; SSE41-NEXT: movdqa %xmm3, %xmm0 1707; SSE41-NEXT: pxor %xmm10, %xmm0 1708; SSE41-NEXT: paddq %xmm7, %xmm3 1709; SSE41-NEXT: pxor %xmm3, %xmm10 1710; SSE41-NEXT: movdqa %xmm0, %xmm5 1711; SSE41-NEXT: pcmpeqd %xmm10, %xmm5 1712; SSE41-NEXT: pcmpgtd %xmm10, %xmm0 1713; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2] 1714; SSE41-NEXT: pand %xmm5, %xmm4 1715; SSE41-NEXT: por %xmm0, %xmm4 1716; SSE41-NEXT: pxor %xmm7, %xmm4 1717; SSE41-NEXT: movdqa %xmm3, %xmm0 1718; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm11 1719; SSE41-NEXT: movdqa %xmm4, %xmm0 1720; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm3 1721; SSE41-NEXT: movapd %xmm8, %xmm0 1722; SSE41-NEXT: retq 1723; 1724; AVX1-LABEL: v8i64: 1725; AVX1: # %bb.0: 1726; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 1727; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 1728; AVX1-NEXT: vpaddq %xmm4, %xmm5, %xmm4 1729; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm6 1730; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm6, %ymm7 1731; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm5 1732; AVX1-NEXT: vpcmpgtq %xmm6, %xmm0, %xmm0 1733; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm0, %ymm0 1734; AVX1-NEXT: vxorpd %ymm0, %ymm2, %ymm0 1735; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1736; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm4 1737; AVX1-NEXT: vpcmpgtq %xmm6, %xmm2, %xmm5 1738; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm5, %ymm4 1739; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm5 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 1740; AVX1-NEXT: vxorpd %ymm5, %ymm4, %ymm4 1741; AVX1-NEXT: vblendvpd %ymm0, %ymm4, %ymm7, %ymm0 1742; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 1743; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6 1744; AVX1-NEXT: vpaddq %xmm4, %xmm6, %xmm4 1745; AVX1-NEXT: vpaddq %xmm3, %xmm1, %xmm7 1746; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm7, %ymm8 1747; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm6 1748; AVX1-NEXT: vpcmpgtq %xmm7, %xmm1, %xmm1 1749; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm1, %ymm1 1750; AVX1-NEXT: vxorpd %ymm1, %ymm3, %ymm1 1751; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm3 1752; AVX1-NEXT: vpcmpgtq %xmm7, %xmm2, %xmm2 1753; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 1754; AVX1-NEXT: vxorpd %ymm5, %ymm2, %ymm2 1755; AVX1-NEXT: vblendvpd %ymm1, %ymm2, %ymm8, %ymm1 1756; AVX1-NEXT: retq 1757; 1758; AVX2-LABEL: v8i64: 1759; AVX2: # %bb.0: 1760; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm4 1761; AVX2-NEXT: vpcmpgtq %ymm4, %ymm0, %ymm0 1762; AVX2-NEXT: vpxor %ymm0, %ymm2, %ymm0 1763; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 1764; AVX2-NEXT: vpcmpgtq %ymm4, %ymm2, %ymm5 1765; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm6 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 1766; AVX2-NEXT: vpxor %ymm6, %ymm5, %ymm5 1767; AVX2-NEXT: vblendvpd %ymm0, %ymm5, %ymm4, %ymm0 1768; AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm4 1769; AVX2-NEXT: vpcmpgtq %ymm4, %ymm1, %ymm1 1770; AVX2-NEXT: vpxor %ymm1, %ymm3, %ymm1 1771; AVX2-NEXT: vpcmpgtq %ymm4, %ymm2, %ymm2 1772; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm2 1773; AVX2-NEXT: vblendvpd %ymm1, %ymm2, %ymm4, %ymm1 1774; AVX2-NEXT: retq 1775; 1776; AVX512-LABEL: v8i64: 1777; AVX512: # %bb.0: 1778; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2 1779; AVX512-NEXT: vpcmpgtq %zmm1, %zmm2, %k0 1780; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm1 1781; AVX512-NEXT: vpcmpgtq %zmm1, %zmm0, %k1 1782; AVX512-NEXT: kxorw %k1, %k0, %k1 1783; AVX512-NEXT: vpsraq $63, %zmm1, %zmm0 1784; AVX512-NEXT: vpxorq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm1 {%k1} 1785; AVX512-NEXT: vmovdqa64 %zmm1, %zmm0 1786; AVX512-NEXT: retq 1787 %z = call <8 x i64> @llvm.sadd.sat.v8i64(<8 x i64> %x, <8 x i64> %y) 1788 ret <8 x i64> %z 1789} 1790 1791define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind { 1792; SSE-LABEL: v2i128: 1793; SSE: # %bb.0: 1794; SSE-NEXT: movq %rdi, %rax 1795; SSE-NEXT: addq {{[0-9]+}}(%rsp), %rcx 1796; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %r8 1797; SSE-NEXT: seto %dil 1798; SSE-NEXT: movq %r8, %r10 1799; SSE-NEXT: sarq $63, %r10 1800; SSE-NEXT: testb %dil, %dil 1801; SSE-NEXT: cmovneq %r10, %rcx 1802; SSE-NEXT: movabsq $-9223372036854775808, %r11 # imm = 0x8000000000000000 1803; SSE-NEXT: xorq %r11, %r10 1804; SSE-NEXT: testb %dil, %dil 1805; SSE-NEXT: cmoveq %r8, %r10 1806; SSE-NEXT: addq %r9, %rsi 1807; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %rdx 1808; SSE-NEXT: seto %dil 1809; SSE-NEXT: movq %rdx, %r8 1810; SSE-NEXT: sarq $63, %r8 1811; SSE-NEXT: testb %dil, %dil 1812; SSE-NEXT: cmovneq %r8, %rsi 1813; SSE-NEXT: xorq %r11, %r8 1814; SSE-NEXT: testb %dil, %dil 1815; SSE-NEXT: cmoveq %rdx, %r8 1816; SSE-NEXT: movq %rcx, 16(%rax) 1817; SSE-NEXT: movq %rsi, (%rax) 1818; SSE-NEXT: movq %r10, 24(%rax) 1819; SSE-NEXT: movq %r8, 8(%rax) 1820; SSE-NEXT: retq 1821; 1822; AVX-LABEL: v2i128: 1823; AVX: # %bb.0: 1824; AVX-NEXT: movq %rdi, %rax 1825; AVX-NEXT: addq {{[0-9]+}}(%rsp), %rcx 1826; AVX-NEXT: adcq {{[0-9]+}}(%rsp), %r8 1827; AVX-NEXT: seto %dil 1828; AVX-NEXT: movq %r8, %r10 1829; AVX-NEXT: sarq $63, %r10 1830; AVX-NEXT: testb %dil, %dil 1831; AVX-NEXT: cmovneq %r10, %rcx 1832; AVX-NEXT: movabsq $-9223372036854775808, %r11 # imm = 0x8000000000000000 1833; AVX-NEXT: xorq %r11, %r10 1834; AVX-NEXT: testb %dil, %dil 1835; AVX-NEXT: cmoveq %r8, %r10 1836; AVX-NEXT: addq %r9, %rsi 1837; AVX-NEXT: adcq {{[0-9]+}}(%rsp), %rdx 1838; AVX-NEXT: seto %dil 1839; AVX-NEXT: movq %rdx, %r8 1840; AVX-NEXT: sarq $63, %r8 1841; AVX-NEXT: testb %dil, %dil 1842; AVX-NEXT: cmovneq %r8, %rsi 1843; AVX-NEXT: xorq %r11, %r8 1844; AVX-NEXT: testb %dil, %dil 1845; AVX-NEXT: cmoveq %rdx, %r8 1846; AVX-NEXT: movq %rcx, 16(%rax) 1847; AVX-NEXT: movq %rsi, (%rax) 1848; AVX-NEXT: movq %r10, 24(%rax) 1849; AVX-NEXT: movq %r8, 8(%rax) 1850; AVX-NEXT: retq 1851 %z = call <2 x i128> @llvm.sadd.sat.v2i128(<2 x i128> %x, <2 x i128> %y) 1852 ret <2 x i128> %z 1853} 1854