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=+avx512bw,+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX,AVX512 8 9declare <1 x i8> @llvm.uadd.sat.v1i8(<1 x i8>, <1 x i8>) 10declare <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8>, <2 x i8>) 11declare <4 x i8> @llvm.uadd.sat.v4i8(<4 x i8>, <4 x i8>) 12declare <8 x i8> @llvm.uadd.sat.v8i8(<8 x i8>, <8 x i8>) 13declare <12 x i8> @llvm.uadd.sat.v12i8(<12 x i8>, <12 x i8>) 14declare <16 x i8> @llvm.uadd.sat.v16i8(<16 x i8>, <16 x i8>) 15declare <32 x i8> @llvm.uadd.sat.v32i8(<32 x i8>, <32 x i8>) 16declare <64 x i8> @llvm.uadd.sat.v64i8(<64 x i8>, <64 x i8>) 17 18declare <1 x i16> @llvm.uadd.sat.v1i16(<1 x i16>, <1 x i16>) 19declare <2 x i16> @llvm.uadd.sat.v2i16(<2 x i16>, <2 x i16>) 20declare <4 x i16> @llvm.uadd.sat.v4i16(<4 x i16>, <4 x i16>) 21declare <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16>, <8 x i16>) 22declare <12 x i16> @llvm.uadd.sat.v12i16(<12 x i16>, <12 x i16>) 23declare <16 x i16> @llvm.uadd.sat.v16i16(<16 x i16>, <16 x i16>) 24declare <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16>, <32 x i16>) 25 26declare <16 x i1> @llvm.uadd.sat.v16i1(<16 x i1>, <16 x i1>) 27declare <16 x i4> @llvm.uadd.sat.v16i4(<16 x i4>, <16 x i4>) 28 29declare <2 x i32> @llvm.uadd.sat.v2i32(<2 x i32>, <2 x i32>) 30declare <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32>, <4 x i32>) 31declare <8 x i32> @llvm.uadd.sat.v8i32(<8 x i32>, <8 x i32>) 32declare <16 x i32> @llvm.uadd.sat.v16i32(<16 x i32>, <16 x i32>) 33declare <2 x i64> @llvm.uadd.sat.v2i64(<2 x i64>, <2 x i64>) 34declare <4 x i64> @llvm.uadd.sat.v4i64(<4 x i64>, <4 x i64>) 35declare <8 x i64> @llvm.uadd.sat.v8i64(<8 x i64>, <8 x i64>) 36 37declare <4 x i24> @llvm.uadd.sat.v4i24(<4 x i24>, <4 x i24>) 38declare <2 x i128> @llvm.uadd.sat.v2i128(<2 x i128>, <2 x i128>) 39 40; Legal types, depending on architecture. 41 42define <16 x i8> @v16i8(<16 x i8> %x, <16 x i8> %y) nounwind { 43; SSE-LABEL: v16i8: 44; SSE: # %bb.0: 45; SSE-NEXT: paddusb %xmm1, %xmm0 46; SSE-NEXT: retq 47; 48; AVX-LABEL: v16i8: 49; AVX: # %bb.0: 50; AVX-NEXT: vpaddusb %xmm1, %xmm0, %xmm0 51; AVX-NEXT: retq 52 %z = call <16 x i8> @llvm.uadd.sat.v16i8(<16 x i8> %x, <16 x i8> %y) 53 ret <16 x i8> %z 54} 55 56define <32 x i8> @v32i8(<32 x i8> %x, <32 x i8> %y) nounwind { 57; SSE-LABEL: v32i8: 58; SSE: # %bb.0: 59; SSE-NEXT: paddusb %xmm2, %xmm0 60; SSE-NEXT: paddusb %xmm3, %xmm1 61; SSE-NEXT: retq 62; 63; AVX1-LABEL: v32i8: 64; AVX1: # %bb.0: 65; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 66; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 67; AVX1-NEXT: vpaddusb %xmm2, %xmm3, %xmm2 68; AVX1-NEXT: vpaddusb %xmm1, %xmm0, %xmm0 69; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 70; AVX1-NEXT: retq 71; 72; AVX2-LABEL: v32i8: 73; AVX2: # %bb.0: 74; AVX2-NEXT: vpaddusb %ymm1, %ymm0, %ymm0 75; AVX2-NEXT: retq 76; 77; AVX512-LABEL: v32i8: 78; AVX512: # %bb.0: 79; AVX512-NEXT: vpaddusb %ymm1, %ymm0, %ymm0 80; AVX512-NEXT: retq 81 %z = call <32 x i8> @llvm.uadd.sat.v32i8(<32 x i8> %x, <32 x i8> %y) 82 ret <32 x i8> %z 83} 84 85define <64 x i8> @v64i8(<64 x i8> %x, <64 x i8> %y) nounwind { 86; SSE-LABEL: v64i8: 87; SSE: # %bb.0: 88; SSE-NEXT: paddusb %xmm4, %xmm0 89; SSE-NEXT: paddusb %xmm5, %xmm1 90; SSE-NEXT: paddusb %xmm6, %xmm2 91; SSE-NEXT: paddusb %xmm7, %xmm3 92; SSE-NEXT: retq 93; 94; AVX1-LABEL: v64i8: 95; AVX1: # %bb.0: 96; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 97; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 98; AVX1-NEXT: vpaddusb %xmm4, %xmm5, %xmm4 99; AVX1-NEXT: vpaddusb %xmm2, %xmm0, %xmm0 100; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 101; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2 102; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 103; AVX1-NEXT: vpaddusb %xmm2, %xmm4, %xmm2 104; AVX1-NEXT: vpaddusb %xmm3, %xmm1, %xmm1 105; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 106; AVX1-NEXT: retq 107; 108; AVX2-LABEL: v64i8: 109; AVX2: # %bb.0: 110; AVX2-NEXT: vpaddusb %ymm2, %ymm0, %ymm0 111; AVX2-NEXT: vpaddusb %ymm3, %ymm1, %ymm1 112; AVX2-NEXT: retq 113; 114; AVX512-LABEL: v64i8: 115; AVX512: # %bb.0: 116; AVX512-NEXT: vpaddusb %zmm1, %zmm0, %zmm0 117; AVX512-NEXT: retq 118 %z = call <64 x i8> @llvm.uadd.sat.v64i8(<64 x i8> %x, <64 x i8> %y) 119 ret <64 x i8> %z 120} 121 122define <8 x i16> @v8i16(<8 x i16> %x, <8 x i16> %y) nounwind { 123; SSE-LABEL: v8i16: 124; SSE: # %bb.0: 125; SSE-NEXT: paddusw %xmm1, %xmm0 126; SSE-NEXT: retq 127; 128; AVX-LABEL: v8i16: 129; AVX: # %bb.0: 130; AVX-NEXT: vpaddusw %xmm1, %xmm0, %xmm0 131; AVX-NEXT: retq 132 %z = call <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16> %x, <8 x i16> %y) 133 ret <8 x i16> %z 134} 135 136define <16 x i16> @v16i16(<16 x i16> %x, <16 x i16> %y) nounwind { 137; SSE-LABEL: v16i16: 138; SSE: # %bb.0: 139; SSE-NEXT: paddusw %xmm2, %xmm0 140; SSE-NEXT: paddusw %xmm3, %xmm1 141; SSE-NEXT: retq 142; 143; AVX1-LABEL: v16i16: 144; AVX1: # %bb.0: 145; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 146; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 147; AVX1-NEXT: vpaddusw %xmm2, %xmm3, %xmm2 148; AVX1-NEXT: vpaddusw %xmm1, %xmm0, %xmm0 149; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 150; AVX1-NEXT: retq 151; 152; AVX2-LABEL: v16i16: 153; AVX2: # %bb.0: 154; AVX2-NEXT: vpaddusw %ymm1, %ymm0, %ymm0 155; AVX2-NEXT: retq 156; 157; AVX512-LABEL: v16i16: 158; AVX512: # %bb.0: 159; AVX512-NEXT: vpaddusw %ymm1, %ymm0, %ymm0 160; AVX512-NEXT: retq 161 %z = call <16 x i16> @llvm.uadd.sat.v16i16(<16 x i16> %x, <16 x i16> %y) 162 ret <16 x i16> %z 163} 164 165define <32 x i16> @v32i16(<32 x i16> %x, <32 x i16> %y) nounwind { 166; SSE-LABEL: v32i16: 167; SSE: # %bb.0: 168; SSE-NEXT: paddusw %xmm4, %xmm0 169; SSE-NEXT: paddusw %xmm5, %xmm1 170; SSE-NEXT: paddusw %xmm6, %xmm2 171; SSE-NEXT: paddusw %xmm7, %xmm3 172; SSE-NEXT: retq 173; 174; AVX1-LABEL: v32i16: 175; AVX1: # %bb.0: 176; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 177; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 178; AVX1-NEXT: vpaddusw %xmm4, %xmm5, %xmm4 179; AVX1-NEXT: vpaddusw %xmm2, %xmm0, %xmm0 180; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 181; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2 182; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 183; AVX1-NEXT: vpaddusw %xmm2, %xmm4, %xmm2 184; AVX1-NEXT: vpaddusw %xmm3, %xmm1, %xmm1 185; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 186; AVX1-NEXT: retq 187; 188; AVX2-LABEL: v32i16: 189; AVX2: # %bb.0: 190; AVX2-NEXT: vpaddusw %ymm2, %ymm0, %ymm0 191; AVX2-NEXT: vpaddusw %ymm3, %ymm1, %ymm1 192; AVX2-NEXT: retq 193; 194; AVX512-LABEL: v32i16: 195; AVX512: # %bb.0: 196; AVX512-NEXT: vpaddusw %zmm1, %zmm0, %zmm0 197; AVX512-NEXT: retq 198 %z = call <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16> %x, <32 x i16> %y) 199 ret <32 x i16> %z 200} 201 202; Too narrow vectors, legalized by widening. 203 204define void @v8i8(<8 x i8>* %px, <8 x i8>* %py, <8 x i8>* %pz) nounwind { 205; SSE-LABEL: v8i8: 206; SSE: # %bb.0: 207; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 208; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 209; SSE-NEXT: paddusb %xmm0, %xmm1 210; SSE-NEXT: movq %xmm1, (%rdx) 211; SSE-NEXT: retq 212; 213; AVX1-LABEL: v8i8: 214; AVX1: # %bb.0: 215; AVX1-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 216; AVX1-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 217; AVX1-NEXT: vpaddusb %xmm1, %xmm0, %xmm0 218; AVX1-NEXT: vmovq %xmm0, (%rdx) 219; AVX1-NEXT: retq 220; 221; AVX2-LABEL: v8i8: 222; AVX2: # %bb.0: 223; AVX2-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 224; AVX2-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 225; AVX2-NEXT: vpaddusb %xmm1, %xmm0, %xmm0 226; AVX2-NEXT: vmovq %xmm0, (%rdx) 227; AVX2-NEXT: retq 228; 229; AVX512-LABEL: v8i8: 230; AVX512: # %bb.0: 231; AVX512-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 232; AVX512-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 233; AVX512-NEXT: vpaddusb %xmm1, %xmm0, %xmm0 234; AVX512-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 235; AVX512-NEXT: vpmovwb %xmm0, (%rdx) 236; AVX512-NEXT: retq 237 %x = load <8 x i8>, <8 x i8>* %px 238 %y = load <8 x i8>, <8 x i8>* %py 239 %z = call <8 x i8> @llvm.uadd.sat.v8i8(<8 x i8> %x, <8 x i8> %y) 240 store <8 x i8> %z, <8 x i8>* %pz 241 ret void 242} 243 244define void @v4i8(<4 x i8>* %px, <4 x i8>* %py, <4 x i8>* %pz) nounwind { 245; SSE-LABEL: v4i8: 246; SSE: # %bb.0: 247; SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 248; SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 249; SSE-NEXT: paddusb %xmm0, %xmm1 250; SSE-NEXT: movd %xmm1, (%rdx) 251; SSE-NEXT: retq 252; 253; AVX1-LABEL: v4i8: 254; AVX1: # %bb.0: 255; AVX1-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 256; AVX1-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 257; AVX1-NEXT: vpaddusb %xmm1, %xmm0, %xmm0 258; AVX1-NEXT: vmovd %xmm0, (%rdx) 259; AVX1-NEXT: retq 260; 261; AVX2-LABEL: v4i8: 262; AVX2: # %bb.0: 263; AVX2-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 264; AVX2-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 265; AVX2-NEXT: vpaddusb %xmm1, %xmm0, %xmm0 266; AVX2-NEXT: vmovd %xmm0, (%rdx) 267; AVX2-NEXT: retq 268; 269; AVX512-LABEL: v4i8: 270; AVX512: # %bb.0: 271; AVX512-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 272; AVX512-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 273; AVX512-NEXT: vpaddusb %xmm1, %xmm0, %xmm0 274; AVX512-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero 275; AVX512-NEXT: vpmovdb %xmm0, (%rdx) 276; AVX512-NEXT: retq 277 %x = load <4 x i8>, <4 x i8>* %px 278 %y = load <4 x i8>, <4 x i8>* %py 279 %z = call <4 x i8> @llvm.uadd.sat.v4i8(<4 x i8> %x, <4 x i8> %y) 280 store <4 x i8> %z, <4 x i8>* %pz 281 ret void 282} 283 284define void @v2i8(<2 x i8>* %px, <2 x i8>* %py, <2 x i8>* %pz) nounwind { 285; SSE2-LABEL: v2i8: 286; SSE2: # %bb.0: 287; SSE2-NEXT: movzwl (%rdi), %eax 288; SSE2-NEXT: movd %eax, %xmm0 289; SSE2-NEXT: movzwl (%rsi), %eax 290; SSE2-NEXT: movd %eax, %xmm1 291; SSE2-NEXT: paddusb %xmm0, %xmm1 292; SSE2-NEXT: movd %xmm1, %eax 293; SSE2-NEXT: movw %ax, (%rdx) 294; SSE2-NEXT: retq 295; 296; SSSE3-LABEL: v2i8: 297; SSSE3: # %bb.0: 298; SSSE3-NEXT: movzwl (%rdi), %eax 299; SSSE3-NEXT: movd %eax, %xmm0 300; SSSE3-NEXT: movzwl (%rsi), %eax 301; SSSE3-NEXT: movd %eax, %xmm1 302; SSSE3-NEXT: paddusb %xmm0, %xmm1 303; SSSE3-NEXT: movd %xmm1, %eax 304; SSSE3-NEXT: movw %ax, (%rdx) 305; SSSE3-NEXT: retq 306; 307; SSE41-LABEL: v2i8: 308; SSE41: # %bb.0: 309; SSE41-NEXT: movzwl (%rdi), %eax 310; SSE41-NEXT: movd %eax, %xmm0 311; SSE41-NEXT: movzwl (%rsi), %eax 312; SSE41-NEXT: movd %eax, %xmm1 313; SSE41-NEXT: paddusb %xmm0, %xmm1 314; SSE41-NEXT: pextrw $0, %xmm1, (%rdx) 315; SSE41-NEXT: retq 316; 317; AVX1-LABEL: v2i8: 318; AVX1: # %bb.0: 319; AVX1-NEXT: movzwl (%rdi), %eax 320; AVX1-NEXT: vmovd %eax, %xmm0 321; AVX1-NEXT: movzwl (%rsi), %eax 322; AVX1-NEXT: vmovd %eax, %xmm1 323; AVX1-NEXT: vpaddusb %xmm1, %xmm0, %xmm0 324; AVX1-NEXT: vpextrw $0, %xmm0, (%rdx) 325; AVX1-NEXT: retq 326; 327; AVX2-LABEL: v2i8: 328; AVX2: # %bb.0: 329; AVX2-NEXT: movzwl (%rdi), %eax 330; AVX2-NEXT: vmovd %eax, %xmm0 331; AVX2-NEXT: movzwl (%rsi), %eax 332; AVX2-NEXT: vmovd %eax, %xmm1 333; AVX2-NEXT: vpaddusb %xmm1, %xmm0, %xmm0 334; AVX2-NEXT: vpextrw $0, %xmm0, (%rdx) 335; AVX2-NEXT: retq 336; 337; AVX512-LABEL: v2i8: 338; AVX512: # %bb.0: 339; AVX512-NEXT: movzwl (%rdi), %eax 340; AVX512-NEXT: vmovd %eax, %xmm0 341; AVX512-NEXT: movzwl (%rsi), %eax 342; AVX512-NEXT: vmovd %eax, %xmm1 343; AVX512-NEXT: vpaddusb %xmm1, %xmm0, %xmm0 344; AVX512-NEXT: vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 345; AVX512-NEXT: vpmovqb %xmm0, (%rdx) 346; AVX512-NEXT: retq 347 %x = load <2 x i8>, <2 x i8>* %px 348 %y = load <2 x i8>, <2 x i8>* %py 349 %z = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> %x, <2 x i8> %y) 350 store <2 x i8> %z, <2 x i8>* %pz 351 ret void 352} 353 354define void @v4i16(<4 x i16>* %px, <4 x i16>* %py, <4 x i16>* %pz) nounwind { 355; SSE-LABEL: v4i16: 356; SSE: # %bb.0: 357; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 358; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 359; SSE-NEXT: paddusw %xmm0, %xmm1 360; SSE-NEXT: movq %xmm1, (%rdx) 361; SSE-NEXT: retq 362; 363; AVX1-LABEL: v4i16: 364; AVX1: # %bb.0: 365; AVX1-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 366; AVX1-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 367; AVX1-NEXT: vpaddusw %xmm1, %xmm0, %xmm0 368; AVX1-NEXT: vmovq %xmm0, (%rdx) 369; AVX1-NEXT: retq 370; 371; AVX2-LABEL: v4i16: 372; AVX2: # %bb.0: 373; AVX2-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 374; AVX2-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 375; AVX2-NEXT: vpaddusw %xmm1, %xmm0, %xmm0 376; AVX2-NEXT: vmovq %xmm0, (%rdx) 377; AVX2-NEXT: retq 378; 379; AVX512-LABEL: v4i16: 380; AVX512: # %bb.0: 381; AVX512-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 382; AVX512-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 383; AVX512-NEXT: vpaddusw %xmm1, %xmm0, %xmm0 384; AVX512-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 385; AVX512-NEXT: vpmovdw %xmm0, (%rdx) 386; AVX512-NEXT: retq 387 %x = load <4 x i16>, <4 x i16>* %px 388 %y = load <4 x i16>, <4 x i16>* %py 389 %z = call <4 x i16> @llvm.uadd.sat.v4i16(<4 x i16> %x, <4 x i16> %y) 390 store <4 x i16> %z, <4 x i16>* %pz 391 ret void 392} 393 394define void @v2i16(<2 x i16>* %px, <2 x i16>* %py, <2 x i16>* %pz) nounwind { 395; SSE-LABEL: v2i16: 396; SSE: # %bb.0: 397; SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 398; SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 399; SSE-NEXT: paddusw %xmm0, %xmm1 400; SSE-NEXT: movd %xmm1, (%rdx) 401; SSE-NEXT: retq 402; 403; AVX1-LABEL: v2i16: 404; AVX1: # %bb.0: 405; AVX1-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 406; AVX1-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 407; AVX1-NEXT: vpaddusw %xmm1, %xmm0, %xmm0 408; AVX1-NEXT: vmovd %xmm0, (%rdx) 409; AVX1-NEXT: retq 410; 411; AVX2-LABEL: v2i16: 412; AVX2: # %bb.0: 413; AVX2-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 414; AVX2-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 415; AVX2-NEXT: vpaddusw %xmm1, %xmm0, %xmm0 416; AVX2-NEXT: vmovd %xmm0, (%rdx) 417; AVX2-NEXT: retq 418; 419; AVX512-LABEL: v2i16: 420; AVX512: # %bb.0: 421; AVX512-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 422; AVX512-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 423; AVX512-NEXT: vpaddusw %xmm1, %xmm0, %xmm0 424; AVX512-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 425; AVX512-NEXT: vpmovqw %xmm0, (%rdx) 426; AVX512-NEXT: retq 427 %x = load <2 x i16>, <2 x i16>* %px 428 %y = load <2 x i16>, <2 x i16>* %py 429 %z = call <2 x i16> @llvm.uadd.sat.v2i16(<2 x i16> %x, <2 x i16> %y) 430 store <2 x i16> %z, <2 x i16>* %pz 431 ret void 432} 433 434define <12 x i8> @v12i8(<12 x i8> %x, <12 x i8> %y) nounwind { 435; SSE-LABEL: v12i8: 436; SSE: # %bb.0: 437; SSE-NEXT: paddusb %xmm1, %xmm0 438; SSE-NEXT: retq 439; 440; AVX-LABEL: v12i8: 441; AVX: # %bb.0: 442; AVX-NEXT: vpaddusb %xmm1, %xmm0, %xmm0 443; AVX-NEXT: retq 444 %z = call <12 x i8> @llvm.uadd.sat.v12i8(<12 x i8> %x, <12 x i8> %y) 445 ret <12 x i8> %z 446} 447 448define void @v12i16(<12 x i16>* %px, <12 x i16>* %py, <12 x i16>* %pz) nounwind { 449; SSE-LABEL: v12i16: 450; SSE: # %bb.0: 451; SSE-NEXT: movdqa (%rdi), %xmm0 452; SSE-NEXT: movdqa 16(%rdi), %xmm1 453; SSE-NEXT: paddusw (%rsi), %xmm0 454; SSE-NEXT: paddusw 16(%rsi), %xmm1 455; SSE-NEXT: movq %xmm1, 16(%rdx) 456; SSE-NEXT: movdqa %xmm0, (%rdx) 457; SSE-NEXT: retq 458; 459; AVX1-LABEL: v12i16: 460; AVX1: # %bb.0: 461; AVX1-NEXT: vmovdqa (%rdi), %xmm0 462; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1 463; AVX1-NEXT: vpaddusw 16(%rsi), %xmm1, %xmm1 464; AVX1-NEXT: vpaddusw (%rsi), %xmm0, %xmm0 465; AVX1-NEXT: vmovdqa %xmm0, (%rdx) 466; AVX1-NEXT: vmovq %xmm1, 16(%rdx) 467; AVX1-NEXT: retq 468; 469; AVX2-LABEL: v12i16: 470; AVX2: # %bb.0: 471; AVX2-NEXT: vmovdqa (%rdi), %ymm0 472; AVX2-NEXT: vpaddusw (%rsi), %ymm0, %ymm0 473; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 474; AVX2-NEXT: vmovq %xmm1, 16(%rdx) 475; AVX2-NEXT: vmovdqa %xmm0, (%rdx) 476; AVX2-NEXT: vzeroupper 477; AVX2-NEXT: retq 478; 479; AVX512-LABEL: v12i16: 480; AVX512: # %bb.0: 481; AVX512-NEXT: vmovdqa (%rdi), %ymm0 482; AVX512-NEXT: vpaddusw (%rsi), %ymm0, %ymm0 483; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 484; AVX512-NEXT: vmovq %xmm1, 16(%rdx) 485; AVX512-NEXT: vmovdqa %xmm0, (%rdx) 486; AVX512-NEXT: vzeroupper 487; AVX512-NEXT: retq 488 %x = load <12 x i16>, <12 x i16>* %px 489 %y = load <12 x i16>, <12 x i16>* %py 490 %z = call <12 x i16> @llvm.uadd.sat.v12i16(<12 x i16> %x, <12 x i16> %y) 491 store <12 x i16> %z, <12 x i16>* %pz 492 ret void 493} 494 495; Scalarization 496 497define void @v1i8(<1 x i8>* %px, <1 x i8>* %py, <1 x i8>* %pz) nounwind { 498; SSE-LABEL: v1i8: 499; SSE: # %bb.0: 500; SSE-NEXT: movb (%rdi), %al 501; SSE-NEXT: addb (%rsi), %al 502; SSE-NEXT: movzbl %al, %eax 503; SSE-NEXT: movl $255, %ecx 504; SSE-NEXT: cmovael %eax, %ecx 505; SSE-NEXT: movb %cl, (%rdx) 506; SSE-NEXT: retq 507; 508; AVX-LABEL: v1i8: 509; AVX: # %bb.0: 510; AVX-NEXT: movb (%rdi), %al 511; AVX-NEXT: addb (%rsi), %al 512; AVX-NEXT: movzbl %al, %eax 513; AVX-NEXT: movl $255, %ecx 514; AVX-NEXT: cmovael %eax, %ecx 515; AVX-NEXT: movb %cl, (%rdx) 516; AVX-NEXT: retq 517 %x = load <1 x i8>, <1 x i8>* %px 518 %y = load <1 x i8>, <1 x i8>* %py 519 %z = call <1 x i8> @llvm.uadd.sat.v1i8(<1 x i8> %x, <1 x i8> %y) 520 store <1 x i8> %z, <1 x i8>* %pz 521 ret void 522} 523 524define void @v1i16(<1 x i16>* %px, <1 x i16>* %py, <1 x i16>* %pz) nounwind { 525; SSE-LABEL: v1i16: 526; SSE: # %bb.0: 527; SSE-NEXT: movzwl (%rdi), %eax 528; SSE-NEXT: addw (%rsi), %ax 529; SSE-NEXT: movl $65535, %ecx # imm = 0xFFFF 530; SSE-NEXT: cmovael %eax, %ecx 531; SSE-NEXT: movw %cx, (%rdx) 532; SSE-NEXT: retq 533; 534; AVX-LABEL: v1i16: 535; AVX: # %bb.0: 536; AVX-NEXT: movzwl (%rdi), %eax 537; AVX-NEXT: addw (%rsi), %ax 538; AVX-NEXT: movl $65535, %ecx # imm = 0xFFFF 539; AVX-NEXT: cmovael %eax, %ecx 540; AVX-NEXT: movw %cx, (%rdx) 541; AVX-NEXT: retq 542 %x = load <1 x i16>, <1 x i16>* %px 543 %y = load <1 x i16>, <1 x i16>* %py 544 %z = call <1 x i16> @llvm.uadd.sat.v1i16(<1 x i16> %x, <1 x i16> %y) 545 store <1 x i16> %z, <1 x i16>* %pz 546 ret void 547} 548 549; Promotion 550 551define <16 x i4> @v16i4(<16 x i4> %x, <16 x i4> %y) nounwind { 552; SSE-LABEL: v16i4: 553; SSE: # %bb.0: 554; SSE-NEXT: psllw $4, %xmm1 555; SSE-NEXT: movdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 556; SSE-NEXT: pand %xmm2, %xmm1 557; SSE-NEXT: psllw $4, %xmm0 558; SSE-NEXT: pand %xmm2, %xmm0 559; SSE-NEXT: paddusb %xmm1, %xmm0 560; SSE-NEXT: psrlw $4, %xmm0 561; SSE-NEXT: pand {{.*}}(%rip), %xmm0 562; SSE-NEXT: retq 563; 564; AVX-LABEL: v16i4: 565; AVX: # %bb.0: 566; AVX-NEXT: vpsllw $4, %xmm1, %xmm1 567; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 568; AVX-NEXT: vpand %xmm2, %xmm1, %xmm1 569; AVX-NEXT: vpsllw $4, %xmm0, %xmm0 570; AVX-NEXT: vpand %xmm2, %xmm0, %xmm0 571; AVX-NEXT: vpaddusb %xmm1, %xmm0, %xmm0 572; AVX-NEXT: vpsrlw $4, %xmm0, %xmm0 573; AVX-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 574; AVX-NEXT: retq 575 %z = call <16 x i4> @llvm.uadd.sat.v16i4(<16 x i4> %x, <16 x i4> %y) 576 ret <16 x i4> %z 577} 578 579define <16 x i1> @v16i1(<16 x i1> %x, <16 x i1> %y) nounwind { 580; SSE-LABEL: v16i1: 581; SSE: # %bb.0: 582; SSE-NEXT: psllw $7, %xmm1 583; SSE-NEXT: movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 584; SSE-NEXT: pand %xmm2, %xmm1 585; SSE-NEXT: psllw $7, %xmm0 586; SSE-NEXT: pand %xmm2, %xmm0 587; SSE-NEXT: paddusb %xmm1, %xmm0 588; SSE-NEXT: psrlw $7, %xmm0 589; SSE-NEXT: pand {{.*}}(%rip), %xmm0 590; SSE-NEXT: retq 591; 592; AVX1-LABEL: v16i1: 593; AVX1: # %bb.0: 594; AVX1-NEXT: vpsllw $7, %xmm1, %xmm1 595; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 596; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1 597; AVX1-NEXT: vpsllw $7, %xmm0, %xmm0 598; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 599; AVX1-NEXT: vpaddusb %xmm1, %xmm0, %xmm0 600; AVX1-NEXT: vpsrlw $7, %xmm0, %xmm0 601; AVX1-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 602; AVX1-NEXT: retq 603; 604; AVX2-LABEL: v16i1: 605; AVX2: # %bb.0: 606; AVX2-NEXT: vpsllw $7, %xmm1, %xmm1 607; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128] 608; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1 609; AVX2-NEXT: vpsllw $7, %xmm0, %xmm0 610; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0 611; AVX2-NEXT: vpaddusb %xmm1, %xmm0, %xmm0 612; AVX2-NEXT: vpsrlw $7, %xmm0, %xmm0 613; AVX2-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 614; AVX2-NEXT: retq 615; 616; AVX512-LABEL: v16i1: 617; AVX512: # %bb.0: 618; AVX512-NEXT: vpsllw $7, %xmm1, %xmm1 619; AVX512-NEXT: vpmovb2m %xmm1, %k0 620; AVX512-NEXT: vpsllw $7, %xmm0, %xmm0 621; AVX512-NEXT: vpmovb2m %xmm0, %k1 622; AVX512-NEXT: korw %k0, %k1, %k0 623; AVX512-NEXT: vpmovm2b %k0, %xmm0 624; AVX512-NEXT: retq 625 %z = call <16 x i1> @llvm.uadd.sat.v16i1(<16 x i1> %x, <16 x i1> %y) 626 ret <16 x i1> %z 627} 628 629; Expanded 630 631define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind { 632; SSE2-LABEL: v2i32: 633; SSE2: # %bb.0: 634; SSE2-NEXT: psllq $32, %xmm0 635; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456] 636; SSE2-NEXT: psllq $32, %xmm1 637; SSE2-NEXT: paddq %xmm0, %xmm1 638; SSE2-NEXT: pxor %xmm2, %xmm0 639; SSE2-NEXT: pxor %xmm1, %xmm2 640; SSE2-NEXT: movdqa %xmm0, %xmm3 641; SSE2-NEXT: pcmpeqd %xmm2, %xmm3 642; SSE2-NEXT: pcmpgtd %xmm2, %xmm0 643; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2] 644; SSE2-NEXT: pand %xmm2, %xmm3 645; SSE2-NEXT: por %xmm1, %xmm0 646; SSE2-NEXT: por %xmm3, %xmm0 647; SSE2-NEXT: psrlq $32, %xmm0 648; SSE2-NEXT: retq 649; 650; SSSE3-LABEL: v2i32: 651; SSSE3: # %bb.0: 652; SSSE3-NEXT: psllq $32, %xmm0 653; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456] 654; SSSE3-NEXT: psllq $32, %xmm1 655; SSSE3-NEXT: paddq %xmm0, %xmm1 656; SSSE3-NEXT: pxor %xmm2, %xmm0 657; SSSE3-NEXT: pxor %xmm1, %xmm2 658; SSSE3-NEXT: movdqa %xmm0, %xmm3 659; SSSE3-NEXT: pcmpeqd %xmm2, %xmm3 660; SSSE3-NEXT: pcmpgtd %xmm2, %xmm0 661; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2] 662; SSSE3-NEXT: pand %xmm2, %xmm3 663; SSSE3-NEXT: por %xmm1, %xmm0 664; SSSE3-NEXT: por %xmm3, %xmm0 665; SSSE3-NEXT: psrlq $32, %xmm0 666; SSSE3-NEXT: retq 667; 668; SSE41-LABEL: v2i32: 669; SSE41: # %bb.0: 670; SSE41-NEXT: psllq $32, %xmm0 671; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456] 672; SSE41-NEXT: psllq $32, %xmm1 673; SSE41-NEXT: paddq %xmm0, %xmm1 674; SSE41-NEXT: movdqa %xmm0, %xmm3 675; SSE41-NEXT: pxor %xmm2, %xmm3 676; SSE41-NEXT: pxor %xmm1, %xmm2 677; SSE41-NEXT: movdqa %xmm3, %xmm0 678; SSE41-NEXT: pcmpgtd %xmm2, %xmm0 679; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2] 680; SSE41-NEXT: pcmpeqd %xmm3, %xmm2 681; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 682; SSE41-NEXT: pand %xmm4, %xmm2 683; SSE41-NEXT: por %xmm2, %xmm0 684; SSE41-NEXT: pcmpeqd %xmm2, %xmm2 685; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1 686; SSE41-NEXT: psrlq $32, %xmm1 687; SSE41-NEXT: movdqa %xmm1, %xmm0 688; SSE41-NEXT: retq 689; 690; AVX1-LABEL: v2i32: 691; AVX1: # %bb.0: 692; AVX1-NEXT: vpsllq $32, %xmm0, %xmm0 693; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 694; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm3 695; AVX1-NEXT: vpsllq $32, %xmm1, %xmm1 696; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0 697; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm1 698; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1 699; AVX1-NEXT: vpor %xmm0, %xmm1, %xmm0 700; AVX1-NEXT: vpsrlq $32, %xmm0, %xmm0 701; AVX1-NEXT: retq 702; 703; AVX2-LABEL: v2i32: 704; AVX2: # %bb.0: 705; AVX2-NEXT: vpsllq $32, %xmm0, %xmm0 706; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 707; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm3 708; AVX2-NEXT: vpsllq $32, %xmm1, %xmm1 709; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0 710; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm1 711; AVX2-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1 712; AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0 713; AVX2-NEXT: vpsrlq $32, %xmm0, %xmm0 714; AVX2-NEXT: retq 715; 716; AVX512-LABEL: v2i32: 717; AVX512: # %bb.0: 718; AVX512-NEXT: vpsllq $32, %xmm0, %xmm0 719; AVX512-NEXT: vpsllq $32, %xmm1, %xmm1 720; AVX512-NEXT: vmovdqa %xmm1, %xmm2 721; AVX512-NEXT: vpternlogq $15, %xmm1, %xmm1, %xmm2 722; AVX512-NEXT: vpminuq %xmm2, %xmm0, %xmm0 723; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm0 724; AVX512-NEXT: vpsrlq $32, %xmm0, %xmm0 725; AVX512-NEXT: retq 726 %z = call <2 x i32> @llvm.uadd.sat.v2i32(<2 x i32> %x, <2 x i32> %y) 727 ret <2 x i32> %z 728} 729 730define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind { 731; SSE2-LABEL: v4i32: 732; SSE2: # %bb.0: 733; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] 734; SSE2-NEXT: paddd %xmm0, %xmm1 735; SSE2-NEXT: pxor %xmm2, %xmm0 736; SSE2-NEXT: pxor %xmm1, %xmm2 737; SSE2-NEXT: pcmpgtd %xmm2, %xmm0 738; SSE2-NEXT: por %xmm1, %xmm0 739; SSE2-NEXT: retq 740; 741; SSSE3-LABEL: v4i32: 742; SSSE3: # %bb.0: 743; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] 744; SSSE3-NEXT: paddd %xmm0, %xmm1 745; SSSE3-NEXT: pxor %xmm2, %xmm0 746; SSSE3-NEXT: pxor %xmm1, %xmm2 747; SSSE3-NEXT: pcmpgtd %xmm2, %xmm0 748; SSSE3-NEXT: por %xmm1, %xmm0 749; SSSE3-NEXT: retq 750; 751; SSE41-LABEL: v4i32: 752; SSE41: # %bb.0: 753; SSE41-NEXT: pcmpeqd %xmm2, %xmm2 754; SSE41-NEXT: pxor %xmm1, %xmm2 755; SSE41-NEXT: pminud %xmm2, %xmm0 756; SSE41-NEXT: paddd %xmm1, %xmm0 757; SSE41-NEXT: retq 758; 759; AVX1-LABEL: v4i32: 760; AVX1: # %bb.0: 761; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 762; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm2 763; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0 764; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0 765; AVX1-NEXT: retq 766; 767; AVX2-LABEL: v4i32: 768; AVX2: # %bb.0: 769; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 770; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm2 771; AVX2-NEXT: vpminud %xmm2, %xmm0, %xmm0 772; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0 773; AVX2-NEXT: retq 774; 775; AVX512-LABEL: v4i32: 776; AVX512: # %bb.0: 777; AVX512-NEXT: vmovdqa %xmm1, %xmm2 778; AVX512-NEXT: vpternlogq $15, %xmm1, %xmm1, %xmm2 779; AVX512-NEXT: vpminud %xmm2, %xmm0, %xmm0 780; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm0 781; AVX512-NEXT: retq 782 %z = call <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32> %x, <4 x i32> %y) 783 ret <4 x i32> %z 784} 785 786define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind { 787; SSE2-LABEL: v8i32: 788; SSE2: # %bb.0: 789; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] 790; SSE2-NEXT: paddd %xmm0, %xmm2 791; SSE2-NEXT: pxor %xmm4, %xmm0 792; SSE2-NEXT: movdqa %xmm2, %xmm5 793; SSE2-NEXT: pxor %xmm4, %xmm5 794; SSE2-NEXT: pcmpgtd %xmm5, %xmm0 795; SSE2-NEXT: por %xmm2, %xmm0 796; SSE2-NEXT: paddd %xmm1, %xmm3 797; SSE2-NEXT: pxor %xmm4, %xmm1 798; SSE2-NEXT: pxor %xmm3, %xmm4 799; SSE2-NEXT: pcmpgtd %xmm4, %xmm1 800; SSE2-NEXT: por %xmm3, %xmm1 801; SSE2-NEXT: retq 802; 803; SSSE3-LABEL: v8i32: 804; SSSE3: # %bb.0: 805; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] 806; SSSE3-NEXT: paddd %xmm0, %xmm2 807; SSSE3-NEXT: pxor %xmm4, %xmm0 808; SSSE3-NEXT: movdqa %xmm2, %xmm5 809; SSSE3-NEXT: pxor %xmm4, %xmm5 810; SSSE3-NEXT: pcmpgtd %xmm5, %xmm0 811; SSSE3-NEXT: por %xmm2, %xmm0 812; SSSE3-NEXT: paddd %xmm1, %xmm3 813; SSSE3-NEXT: pxor %xmm4, %xmm1 814; SSSE3-NEXT: pxor %xmm3, %xmm4 815; SSSE3-NEXT: pcmpgtd %xmm4, %xmm1 816; SSSE3-NEXT: por %xmm3, %xmm1 817; SSSE3-NEXT: retq 818; 819; SSE41-LABEL: v8i32: 820; SSE41: # %bb.0: 821; SSE41-NEXT: pcmpeqd %xmm4, %xmm4 822; SSE41-NEXT: movdqa %xmm2, %xmm5 823; SSE41-NEXT: pxor %xmm4, %xmm5 824; SSE41-NEXT: pminud %xmm5, %xmm0 825; SSE41-NEXT: paddd %xmm2, %xmm0 826; SSE41-NEXT: pxor %xmm3, %xmm4 827; SSE41-NEXT: pminud %xmm4, %xmm1 828; SSE41-NEXT: paddd %xmm3, %xmm1 829; SSE41-NEXT: retq 830; 831; AVX1-LABEL: v8i32: 832; AVX1: # %bb.0: 833; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 834; AVX1-NEXT: vcmptrueps %ymm2, %ymm2, %ymm2 835; AVX1-NEXT: vxorps %ymm2, %ymm1, %ymm2 836; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 837; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 838; AVX1-NEXT: vpminud %xmm3, %xmm4, %xmm3 839; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 840; AVX1-NEXT: vpaddd %xmm4, %xmm3, %xmm3 841; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0 842; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0 843; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 844; AVX1-NEXT: retq 845; 846; AVX2-LABEL: v8i32: 847; AVX2: # %bb.0: 848; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 849; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm2 850; AVX2-NEXT: vpminud %ymm2, %ymm0, %ymm0 851; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0 852; AVX2-NEXT: retq 853; 854; AVX512-LABEL: v8i32: 855; AVX512: # %bb.0: 856; AVX512-NEXT: vmovdqa %ymm1, %ymm2 857; AVX512-NEXT: vpternlogq $15, %ymm1, %ymm1, %ymm2 858; AVX512-NEXT: vpminud %ymm2, %ymm0, %ymm0 859; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm0 860; AVX512-NEXT: retq 861 %z = call <8 x i32> @llvm.uadd.sat.v8i32(<8 x i32> %x, <8 x i32> %y) 862 ret <8 x i32> %z 863} 864 865define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind { 866; SSE2-LABEL: v16i32: 867; SSE2: # %bb.0: 868; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648] 869; SSE2-NEXT: paddd %xmm0, %xmm4 870; SSE2-NEXT: pxor %xmm8, %xmm0 871; SSE2-NEXT: movdqa %xmm4, %xmm9 872; SSE2-NEXT: pxor %xmm8, %xmm9 873; SSE2-NEXT: pcmpgtd %xmm9, %xmm0 874; SSE2-NEXT: por %xmm4, %xmm0 875; SSE2-NEXT: paddd %xmm1, %xmm5 876; SSE2-NEXT: pxor %xmm8, %xmm1 877; SSE2-NEXT: movdqa %xmm5, %xmm4 878; SSE2-NEXT: pxor %xmm8, %xmm4 879; SSE2-NEXT: pcmpgtd %xmm4, %xmm1 880; SSE2-NEXT: por %xmm5, %xmm1 881; SSE2-NEXT: paddd %xmm2, %xmm6 882; SSE2-NEXT: pxor %xmm8, %xmm2 883; SSE2-NEXT: movdqa %xmm6, %xmm4 884; SSE2-NEXT: pxor %xmm8, %xmm4 885; SSE2-NEXT: pcmpgtd %xmm4, %xmm2 886; SSE2-NEXT: por %xmm6, %xmm2 887; SSE2-NEXT: paddd %xmm3, %xmm7 888; SSE2-NEXT: pxor %xmm8, %xmm3 889; SSE2-NEXT: pxor %xmm7, %xmm8 890; SSE2-NEXT: pcmpgtd %xmm8, %xmm3 891; SSE2-NEXT: por %xmm7, %xmm3 892; SSE2-NEXT: retq 893; 894; SSSE3-LABEL: v16i32: 895; SSSE3: # %bb.0: 896; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648] 897; SSSE3-NEXT: paddd %xmm0, %xmm4 898; SSSE3-NEXT: pxor %xmm8, %xmm0 899; SSSE3-NEXT: movdqa %xmm4, %xmm9 900; SSSE3-NEXT: pxor %xmm8, %xmm9 901; SSSE3-NEXT: pcmpgtd %xmm9, %xmm0 902; SSSE3-NEXT: por %xmm4, %xmm0 903; SSSE3-NEXT: paddd %xmm1, %xmm5 904; SSSE3-NEXT: pxor %xmm8, %xmm1 905; SSSE3-NEXT: movdqa %xmm5, %xmm4 906; SSSE3-NEXT: pxor %xmm8, %xmm4 907; SSSE3-NEXT: pcmpgtd %xmm4, %xmm1 908; SSSE3-NEXT: por %xmm5, %xmm1 909; SSSE3-NEXT: paddd %xmm2, %xmm6 910; SSSE3-NEXT: pxor %xmm8, %xmm2 911; SSSE3-NEXT: movdqa %xmm6, %xmm4 912; SSSE3-NEXT: pxor %xmm8, %xmm4 913; SSSE3-NEXT: pcmpgtd %xmm4, %xmm2 914; SSSE3-NEXT: por %xmm6, %xmm2 915; SSSE3-NEXT: paddd %xmm3, %xmm7 916; SSSE3-NEXT: pxor %xmm8, %xmm3 917; SSSE3-NEXT: pxor %xmm7, %xmm8 918; SSSE3-NEXT: pcmpgtd %xmm8, %xmm3 919; SSSE3-NEXT: por %xmm7, %xmm3 920; SSSE3-NEXT: retq 921; 922; SSE41-LABEL: v16i32: 923; SSE41: # %bb.0: 924; SSE41-NEXT: pcmpeqd %xmm8, %xmm8 925; SSE41-NEXT: movdqa %xmm4, %xmm9 926; SSE41-NEXT: pxor %xmm8, %xmm9 927; SSE41-NEXT: pminud %xmm9, %xmm0 928; SSE41-NEXT: paddd %xmm4, %xmm0 929; SSE41-NEXT: movdqa %xmm5, %xmm4 930; SSE41-NEXT: pxor %xmm8, %xmm4 931; SSE41-NEXT: pminud %xmm4, %xmm1 932; SSE41-NEXT: paddd %xmm5, %xmm1 933; SSE41-NEXT: movdqa %xmm6, %xmm4 934; SSE41-NEXT: pxor %xmm8, %xmm4 935; SSE41-NEXT: pminud %xmm4, %xmm2 936; SSE41-NEXT: paddd %xmm6, %xmm2 937; SSE41-NEXT: pxor %xmm7, %xmm8 938; SSE41-NEXT: pminud %xmm8, %xmm3 939; SSE41-NEXT: paddd %xmm7, %xmm3 940; SSE41-NEXT: retq 941; 942; AVX1-LABEL: v16i32: 943; AVX1: # %bb.0: 944; AVX1-NEXT: vxorps %xmm4, %xmm4, %xmm4 945; AVX1-NEXT: vcmptrueps %ymm4, %ymm4, %ymm4 946; AVX1-NEXT: vxorps %ymm4, %ymm2, %ymm5 947; AVX1-NEXT: vextractf128 $1, %ymm5, %xmm6 948; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7 949; AVX1-NEXT: vpminud %xmm6, %xmm7, %xmm6 950; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm7 951; AVX1-NEXT: vpaddd %xmm7, %xmm6, %xmm6 952; AVX1-NEXT: vpminud %xmm5, %xmm0, %xmm0 953; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm0 954; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm0, %ymm0 955; AVX1-NEXT: vxorps %ymm4, %ymm3, %ymm2 956; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 957; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 958; AVX1-NEXT: vpminud %xmm4, %xmm5, %xmm4 959; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm5 960; AVX1-NEXT: vpaddd %xmm5, %xmm4, %xmm4 961; AVX1-NEXT: vpminud %xmm2, %xmm1, %xmm1 962; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1 963; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm1, %ymm1 964; AVX1-NEXT: retq 965; 966; AVX2-LABEL: v16i32: 967; AVX2: # %bb.0: 968; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 969; AVX2-NEXT: vpxor %ymm4, %ymm2, %ymm5 970; AVX2-NEXT: vpminud %ymm5, %ymm0, %ymm0 971; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm0 972; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm2 973; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm1 974; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm1 975; AVX2-NEXT: retq 976; 977; AVX512-LABEL: v16i32: 978; AVX512: # %bb.0: 979; AVX512-NEXT: vmovdqa64 %zmm1, %zmm2 980; AVX512-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm2 981; AVX512-NEXT: vpminud %zmm2, %zmm0, %zmm0 982; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0 983; AVX512-NEXT: retq 984 %z = call <16 x i32> @llvm.uadd.sat.v16i32(<16 x i32> %x, <16 x i32> %y) 985 ret <16 x i32> %z 986} 987 988define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind { 989; SSE2-LABEL: v2i64: 990; SSE2: # %bb.0: 991; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456] 992; SSE2-NEXT: paddq %xmm0, %xmm1 993; SSE2-NEXT: pxor %xmm2, %xmm0 994; SSE2-NEXT: pxor %xmm1, %xmm2 995; SSE2-NEXT: movdqa %xmm0, %xmm3 996; SSE2-NEXT: pcmpgtd %xmm2, %xmm3 997; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 998; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 999; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1000; SSE2-NEXT: pand %xmm4, %xmm2 1001; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] 1002; SSE2-NEXT: por %xmm1, %xmm0 1003; SSE2-NEXT: por %xmm2, %xmm0 1004; SSE2-NEXT: retq 1005; 1006; SSSE3-LABEL: v2i64: 1007; SSSE3: # %bb.0: 1008; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456] 1009; SSSE3-NEXT: paddq %xmm0, %xmm1 1010; SSSE3-NEXT: pxor %xmm2, %xmm0 1011; SSSE3-NEXT: pxor %xmm1, %xmm2 1012; SSSE3-NEXT: movdqa %xmm0, %xmm3 1013; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3 1014; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 1015; SSSE3-NEXT: pcmpeqd %xmm0, %xmm2 1016; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1017; SSSE3-NEXT: pand %xmm4, %xmm2 1018; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] 1019; SSSE3-NEXT: por %xmm1, %xmm0 1020; SSSE3-NEXT: por %xmm2, %xmm0 1021; SSSE3-NEXT: retq 1022; 1023; SSE41-LABEL: v2i64: 1024; SSE41: # %bb.0: 1025; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456] 1026; SSE41-NEXT: paddq %xmm0, %xmm1 1027; SSE41-NEXT: movdqa %xmm0, %xmm3 1028; SSE41-NEXT: pxor %xmm2, %xmm3 1029; SSE41-NEXT: pxor %xmm1, %xmm2 1030; SSE41-NEXT: movdqa %xmm3, %xmm0 1031; SSE41-NEXT: pcmpgtd %xmm2, %xmm0 1032; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2] 1033; SSE41-NEXT: pcmpeqd %xmm3, %xmm2 1034; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1035; SSE41-NEXT: pand %xmm4, %xmm2 1036; SSE41-NEXT: por %xmm2, %xmm0 1037; SSE41-NEXT: pcmpeqd %xmm2, %xmm2 1038; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1 1039; SSE41-NEXT: movapd %xmm1, %xmm0 1040; SSE41-NEXT: retq 1041; 1042; AVX1-LABEL: v2i64: 1043; AVX1: # %bb.0: 1044; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 1045; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm3 1046; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0 1047; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm1 1048; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1 1049; AVX1-NEXT: vpor %xmm0, %xmm1, %xmm0 1050; AVX1-NEXT: retq 1051; 1052; AVX2-LABEL: v2i64: 1053; AVX2: # %bb.0: 1054; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 1055; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm3 1056; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0 1057; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm1 1058; AVX2-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1 1059; AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0 1060; AVX2-NEXT: retq 1061; 1062; AVX512-LABEL: v2i64: 1063; AVX512: # %bb.0: 1064; AVX512-NEXT: vmovdqa %xmm1, %xmm2 1065; AVX512-NEXT: vpternlogq $15, %xmm1, %xmm1, %xmm2 1066; AVX512-NEXT: vpminuq %xmm2, %xmm0, %xmm0 1067; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm0 1068; AVX512-NEXT: retq 1069 %z = call <2 x i64> @llvm.uadd.sat.v2i64(<2 x i64> %x, <2 x i64> %y) 1070 ret <2 x i64> %z 1071} 1072 1073define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind { 1074; SSE2-LABEL: v4i64: 1075; SSE2: # %bb.0: 1076; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456] 1077; SSE2-NEXT: paddq %xmm0, %xmm2 1078; SSE2-NEXT: pxor %xmm4, %xmm0 1079; SSE2-NEXT: movdqa %xmm2, %xmm5 1080; SSE2-NEXT: pxor %xmm4, %xmm5 1081; SSE2-NEXT: movdqa %xmm0, %xmm6 1082; SSE2-NEXT: pcmpgtd %xmm5, %xmm6 1083; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 1084; SSE2-NEXT: pcmpeqd %xmm0, %xmm5 1085; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 1086; SSE2-NEXT: pand %xmm7, %xmm5 1087; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] 1088; SSE2-NEXT: por %xmm2, %xmm0 1089; SSE2-NEXT: por %xmm5, %xmm0 1090; SSE2-NEXT: paddq %xmm1, %xmm3 1091; SSE2-NEXT: pxor %xmm4, %xmm1 1092; SSE2-NEXT: pxor %xmm3, %xmm4 1093; SSE2-NEXT: movdqa %xmm1, %xmm2 1094; SSE2-NEXT: pcmpgtd %xmm4, %xmm2 1095; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2] 1096; SSE2-NEXT: pcmpeqd %xmm1, %xmm4 1097; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1098; SSE2-NEXT: pand %xmm5, %xmm4 1099; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 1100; SSE2-NEXT: por %xmm3, %xmm1 1101; SSE2-NEXT: por %xmm4, %xmm1 1102; SSE2-NEXT: retq 1103; 1104; SSSE3-LABEL: v4i64: 1105; SSSE3: # %bb.0: 1106; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456] 1107; SSSE3-NEXT: paddq %xmm0, %xmm2 1108; SSSE3-NEXT: pxor %xmm4, %xmm0 1109; SSSE3-NEXT: movdqa %xmm2, %xmm5 1110; SSSE3-NEXT: pxor %xmm4, %xmm5 1111; SSSE3-NEXT: movdqa %xmm0, %xmm6 1112; SSSE3-NEXT: pcmpgtd %xmm5, %xmm6 1113; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 1114; SSSE3-NEXT: pcmpeqd %xmm0, %xmm5 1115; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 1116; SSSE3-NEXT: pand %xmm7, %xmm5 1117; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] 1118; SSSE3-NEXT: por %xmm2, %xmm0 1119; SSSE3-NEXT: por %xmm5, %xmm0 1120; SSSE3-NEXT: paddq %xmm1, %xmm3 1121; SSSE3-NEXT: pxor %xmm4, %xmm1 1122; SSSE3-NEXT: pxor %xmm3, %xmm4 1123; SSSE3-NEXT: movdqa %xmm1, %xmm2 1124; SSSE3-NEXT: pcmpgtd %xmm4, %xmm2 1125; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2] 1126; SSSE3-NEXT: pcmpeqd %xmm1, %xmm4 1127; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1128; SSSE3-NEXT: pand %xmm5, %xmm4 1129; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 1130; SSSE3-NEXT: por %xmm3, %xmm1 1131; SSSE3-NEXT: por %xmm4, %xmm1 1132; SSSE3-NEXT: retq 1133; 1134; SSE41-LABEL: v4i64: 1135; SSE41: # %bb.0: 1136; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456] 1137; SSE41-NEXT: paddq %xmm0, %xmm2 1138; SSE41-NEXT: movdqa %xmm0, %xmm5 1139; SSE41-NEXT: pxor %xmm4, %xmm5 1140; SSE41-NEXT: movdqa %xmm2, %xmm6 1141; SSE41-NEXT: pxor %xmm4, %xmm6 1142; SSE41-NEXT: movdqa %xmm5, %xmm0 1143; SSE41-NEXT: pcmpgtd %xmm6, %xmm0 1144; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm0[0,0,2,2] 1145; SSE41-NEXT: pcmpeqd %xmm5, %xmm6 1146; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3] 1147; SSE41-NEXT: pand %xmm7, %xmm5 1148; SSE41-NEXT: por %xmm5, %xmm0 1149; SSE41-NEXT: pcmpeqd %xmm5, %xmm5 1150; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm2 1151; SSE41-NEXT: paddq %xmm1, %xmm3 1152; SSE41-NEXT: pxor %xmm4, %xmm1 1153; SSE41-NEXT: pxor %xmm3, %xmm4 1154; SSE41-NEXT: movdqa %xmm1, %xmm6 1155; SSE41-NEXT: pcmpgtd %xmm4, %xmm6 1156; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 1157; SSE41-NEXT: pcmpeqd %xmm1, %xmm4 1158; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 1159; SSE41-NEXT: pand %xmm7, %xmm0 1160; SSE41-NEXT: por %xmm6, %xmm0 1161; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm3 1162; SSE41-NEXT: movapd %xmm2, %xmm0 1163; SSE41-NEXT: movapd %xmm3, %xmm1 1164; SSE41-NEXT: retq 1165; 1166; AVX1-LABEL: v4i64: 1167; AVX1: # %bb.0: 1168; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1169; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808] 1170; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 1171; AVX1-NEXT: vxorps %xmm4, %xmm4, %xmm4 1172; AVX1-NEXT: vcmptrueps %ymm4, %ymm4, %ymm4 1173; AVX1-NEXT: vxorps %ymm4, %ymm1, %ymm4 1174; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5 1175; AVX1-NEXT: vpxor %xmm3, %xmm5, %xmm5 1176; AVX1-NEXT: vpcmpgtq %xmm2, %xmm5, %xmm2 1177; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm5 1178; AVX1-NEXT: vxorps %xmm3, %xmm4, %xmm3 1179; AVX1-NEXT: vpcmpgtq %xmm5, %xmm3, %xmm3 1180; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2 1181; AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm4, %ymm0 1182; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1183; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1184; AVX1-NEXT: vpaddq %xmm3, %xmm2, %xmm2 1185; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0 1186; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1187; AVX1-NEXT: retq 1188; 1189; AVX2-LABEL: v4i64: 1190; AVX2: # %bb.0: 1191; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 1192; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm2 1193; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807] 1194; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm3 1195; AVX2-NEXT: vpcmpgtq %ymm2, %ymm3, %ymm2 1196; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 1197; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm3 1198; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm3, %ymm0 1199; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0 1200; AVX2-NEXT: retq 1201; 1202; AVX512-LABEL: v4i64: 1203; AVX512: # %bb.0: 1204; AVX512-NEXT: vmovdqa %ymm1, %ymm2 1205; AVX512-NEXT: vpternlogq $15, %ymm1, %ymm1, %ymm2 1206; AVX512-NEXT: vpminuq %ymm2, %ymm0, %ymm0 1207; AVX512-NEXT: vpaddq %ymm1, %ymm0, %ymm0 1208; AVX512-NEXT: retq 1209 %z = call <4 x i64> @llvm.uadd.sat.v4i64(<4 x i64> %x, <4 x i64> %y) 1210 ret <4 x i64> %z 1211} 1212 1213define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind { 1214; SSE2-LABEL: v8i64: 1215; SSE2: # %bb.0: 1216; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456] 1217; SSE2-NEXT: paddq %xmm0, %xmm4 1218; SSE2-NEXT: pxor %xmm8, %xmm0 1219; SSE2-NEXT: movdqa %xmm4, %xmm9 1220; SSE2-NEXT: pxor %xmm8, %xmm9 1221; SSE2-NEXT: movdqa %xmm0, %xmm10 1222; SSE2-NEXT: pcmpgtd %xmm9, %xmm10 1223; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2] 1224; SSE2-NEXT: pcmpeqd %xmm0, %xmm9 1225; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3] 1226; SSE2-NEXT: pand %xmm11, %xmm9 1227; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3] 1228; SSE2-NEXT: por %xmm4, %xmm0 1229; SSE2-NEXT: por %xmm9, %xmm0 1230; SSE2-NEXT: paddq %xmm1, %xmm5 1231; SSE2-NEXT: pxor %xmm8, %xmm1 1232; SSE2-NEXT: movdqa %xmm5, %xmm4 1233; SSE2-NEXT: pxor %xmm8, %xmm4 1234; SSE2-NEXT: movdqa %xmm1, %xmm9 1235; SSE2-NEXT: pcmpgtd %xmm4, %xmm9 1236; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2] 1237; SSE2-NEXT: pcmpeqd %xmm1, %xmm4 1238; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1239; SSE2-NEXT: pand %xmm10, %xmm4 1240; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm9[1,1,3,3] 1241; SSE2-NEXT: por %xmm5, %xmm1 1242; SSE2-NEXT: por %xmm4, %xmm1 1243; SSE2-NEXT: paddq %xmm2, %xmm6 1244; SSE2-NEXT: pxor %xmm8, %xmm2 1245; SSE2-NEXT: movdqa %xmm6, %xmm4 1246; SSE2-NEXT: pxor %xmm8, %xmm4 1247; SSE2-NEXT: movdqa %xmm2, %xmm5 1248; SSE2-NEXT: pcmpgtd %xmm4, %xmm5 1249; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2] 1250; SSE2-NEXT: pcmpeqd %xmm2, %xmm4 1251; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1252; SSE2-NEXT: pand %xmm9, %xmm4 1253; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3] 1254; SSE2-NEXT: por %xmm6, %xmm2 1255; SSE2-NEXT: por %xmm4, %xmm2 1256; SSE2-NEXT: paddq %xmm3, %xmm7 1257; SSE2-NEXT: pxor %xmm8, %xmm3 1258; SSE2-NEXT: pxor %xmm7, %xmm8 1259; SSE2-NEXT: movdqa %xmm3, %xmm4 1260; SSE2-NEXT: pcmpgtd %xmm8, %xmm4 1261; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1262; SSE2-NEXT: pcmpeqd %xmm3, %xmm8 1263; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm8[1,1,3,3] 1264; SSE2-NEXT: pand %xmm5, %xmm6 1265; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 1266; SSE2-NEXT: por %xmm7, %xmm3 1267; SSE2-NEXT: por %xmm6, %xmm3 1268; SSE2-NEXT: retq 1269; 1270; SSSE3-LABEL: v8i64: 1271; SSSE3: # %bb.0: 1272; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456] 1273; SSSE3-NEXT: paddq %xmm0, %xmm4 1274; SSSE3-NEXT: pxor %xmm8, %xmm0 1275; SSSE3-NEXT: movdqa %xmm4, %xmm9 1276; SSSE3-NEXT: pxor %xmm8, %xmm9 1277; SSSE3-NEXT: movdqa %xmm0, %xmm10 1278; SSSE3-NEXT: pcmpgtd %xmm9, %xmm10 1279; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2] 1280; SSSE3-NEXT: pcmpeqd %xmm0, %xmm9 1281; SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3] 1282; SSSE3-NEXT: pand %xmm11, %xmm9 1283; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3] 1284; SSSE3-NEXT: por %xmm4, %xmm0 1285; SSSE3-NEXT: por %xmm9, %xmm0 1286; SSSE3-NEXT: paddq %xmm1, %xmm5 1287; SSSE3-NEXT: pxor %xmm8, %xmm1 1288; SSSE3-NEXT: movdqa %xmm5, %xmm4 1289; SSSE3-NEXT: pxor %xmm8, %xmm4 1290; SSSE3-NEXT: movdqa %xmm1, %xmm9 1291; SSSE3-NEXT: pcmpgtd %xmm4, %xmm9 1292; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2] 1293; SSSE3-NEXT: pcmpeqd %xmm1, %xmm4 1294; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1295; SSSE3-NEXT: pand %xmm10, %xmm4 1296; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm9[1,1,3,3] 1297; SSSE3-NEXT: por %xmm5, %xmm1 1298; SSSE3-NEXT: por %xmm4, %xmm1 1299; SSSE3-NEXT: paddq %xmm2, %xmm6 1300; SSSE3-NEXT: pxor %xmm8, %xmm2 1301; SSSE3-NEXT: movdqa %xmm6, %xmm4 1302; SSSE3-NEXT: pxor %xmm8, %xmm4 1303; SSSE3-NEXT: movdqa %xmm2, %xmm5 1304; SSSE3-NEXT: pcmpgtd %xmm4, %xmm5 1305; SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2] 1306; SSSE3-NEXT: pcmpeqd %xmm2, %xmm4 1307; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1308; SSSE3-NEXT: pand %xmm9, %xmm4 1309; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3] 1310; SSSE3-NEXT: por %xmm6, %xmm2 1311; SSSE3-NEXT: por %xmm4, %xmm2 1312; SSSE3-NEXT: paddq %xmm3, %xmm7 1313; SSSE3-NEXT: pxor %xmm8, %xmm3 1314; SSSE3-NEXT: pxor %xmm7, %xmm8 1315; SSSE3-NEXT: movdqa %xmm3, %xmm4 1316; SSSE3-NEXT: pcmpgtd %xmm8, %xmm4 1317; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1318; SSSE3-NEXT: pcmpeqd %xmm3, %xmm8 1319; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm8[1,1,3,3] 1320; SSSE3-NEXT: pand %xmm5, %xmm6 1321; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 1322; SSSE3-NEXT: por %xmm7, %xmm3 1323; SSSE3-NEXT: por %xmm6, %xmm3 1324; SSSE3-NEXT: retq 1325; 1326; SSE41-LABEL: v8i64: 1327; SSE41: # %bb.0: 1328; SSE41-NEXT: movdqa %xmm7, %xmm8 1329; SSE41-NEXT: movdqa %xmm6, %xmm10 1330; SSE41-NEXT: movdqa %xmm5, %xmm11 1331; SSE41-NEXT: movdqa %xmm4, %xmm12 1332; SSE41-NEXT: movdqa {{.*#+}} xmm7 = [9223372039002259456,9223372039002259456] 1333; SSE41-NEXT: paddq %xmm0, %xmm12 1334; SSE41-NEXT: movdqa %xmm0, %xmm6 1335; SSE41-NEXT: pxor %xmm7, %xmm6 1336; SSE41-NEXT: movdqa %xmm12, %xmm4 1337; SSE41-NEXT: pxor %xmm7, %xmm4 1338; SSE41-NEXT: movdqa %xmm6, %xmm0 1339; SSE41-NEXT: pcmpgtd %xmm4, %xmm0 1340; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2] 1341; SSE41-NEXT: pcmpeqd %xmm6, %xmm4 1342; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1343; SSE41-NEXT: pand %xmm5, %xmm4 1344; SSE41-NEXT: por %xmm4, %xmm0 1345; SSE41-NEXT: pcmpeqd %xmm9, %xmm9 1346; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm12 1347; SSE41-NEXT: paddq %xmm1, %xmm11 1348; SSE41-NEXT: pxor %xmm7, %xmm1 1349; SSE41-NEXT: movdqa %xmm11, %xmm0 1350; SSE41-NEXT: pxor %xmm7, %xmm0 1351; SSE41-NEXT: movdqa %xmm1, %xmm4 1352; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 1353; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1354; SSE41-NEXT: pcmpeqd %xmm1, %xmm0 1355; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1356; SSE41-NEXT: pand %xmm5, %xmm0 1357; SSE41-NEXT: por %xmm4, %xmm0 1358; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm11 1359; SSE41-NEXT: paddq %xmm2, %xmm10 1360; SSE41-NEXT: pxor %xmm7, %xmm2 1361; SSE41-NEXT: movdqa %xmm10, %xmm0 1362; SSE41-NEXT: pxor %xmm7, %xmm0 1363; SSE41-NEXT: movdqa %xmm2, %xmm1 1364; SSE41-NEXT: pcmpgtd %xmm0, %xmm1 1365; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2] 1366; SSE41-NEXT: pcmpeqd %xmm2, %xmm0 1367; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1368; SSE41-NEXT: pand %xmm4, %xmm0 1369; SSE41-NEXT: por %xmm1, %xmm0 1370; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm10 1371; SSE41-NEXT: paddq %xmm3, %xmm8 1372; SSE41-NEXT: pxor %xmm7, %xmm3 1373; SSE41-NEXT: pxor %xmm8, %xmm7 1374; SSE41-NEXT: movdqa %xmm3, %xmm1 1375; SSE41-NEXT: pcmpgtd %xmm7, %xmm1 1376; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2] 1377; SSE41-NEXT: pcmpeqd %xmm3, %xmm7 1378; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3] 1379; SSE41-NEXT: pand %xmm2, %xmm0 1380; SSE41-NEXT: por %xmm1, %xmm0 1381; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm8 1382; SSE41-NEXT: movapd %xmm12, %xmm0 1383; SSE41-NEXT: movapd %xmm11, %xmm1 1384; SSE41-NEXT: movapd %xmm10, %xmm2 1385; SSE41-NEXT: movapd %xmm8, %xmm3 1386; SSE41-NEXT: retq 1387; 1388; AVX1-LABEL: v8i64: 1389; AVX1: # %bb.0: 1390; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 1391; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808] 1392; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5 1393; AVX1-NEXT: vxorps %xmm6, %xmm6, %xmm6 1394; AVX1-NEXT: vcmptrueps %ymm6, %ymm6, %ymm8 1395; AVX1-NEXT: vxorps %ymm8, %ymm2, %ymm7 1396; AVX1-NEXT: vextractf128 $1, %ymm7, %xmm6 1397; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6 1398; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm9 1399; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm6 1400; AVX1-NEXT: vxorps %xmm4, %xmm7, %xmm5 1401; AVX1-NEXT: vpcmpgtq %xmm6, %xmm5, %xmm5 1402; AVX1-NEXT: vinsertf128 $1, %xmm9, %ymm5, %ymm5 1403; AVX1-NEXT: vblendvpd %ymm5, %ymm0, %ymm7, %ymm0 1404; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 1405; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm6 1406; AVX1-NEXT: vpaddq %xmm6, %xmm5, %xmm5 1407; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm0 1408; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm0, %ymm0 1409; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1410; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2 1411; AVX1-NEXT: vxorps %ymm8, %ymm3, %ymm5 1412; AVX1-NEXT: vextractf128 $1, %ymm5, %xmm6 1413; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6 1414; AVX1-NEXT: vpcmpgtq %xmm2, %xmm6, %xmm2 1415; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm6 1416; AVX1-NEXT: vxorps %xmm4, %xmm5, %xmm4 1417; AVX1-NEXT: vpcmpgtq %xmm6, %xmm4, %xmm4 1418; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm4, %ymm2 1419; AVX1-NEXT: vblendvpd %ymm2, %ymm1, %ymm5, %ymm1 1420; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1421; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 1422; AVX1-NEXT: vpaddq %xmm4, %xmm2, %xmm2 1423; AVX1-NEXT: vpaddq %xmm3, %xmm1, %xmm1 1424; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1425; AVX1-NEXT: retq 1426; 1427; AVX2-LABEL: v8i64: 1428; AVX2: # %bb.0: 1429; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 1430; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm5 1431; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm6 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807] 1432; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm7 1433; AVX2-NEXT: vpcmpgtq %ymm5, %ymm7, %ymm5 1434; AVX2-NEXT: vpcmpeqd %ymm7, %ymm7, %ymm7 1435; AVX2-NEXT: vpxor %ymm7, %ymm2, %ymm8 1436; AVX2-NEXT: vblendvpd %ymm5, %ymm0, %ymm8, %ymm0 1437; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0 1438; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm2 1439; AVX2-NEXT: vpxor %ymm6, %ymm3, %ymm4 1440; AVX2-NEXT: vpcmpgtq %ymm2, %ymm4, %ymm2 1441; AVX2-NEXT: vpxor %ymm7, %ymm3, %ymm4 1442; AVX2-NEXT: vblendvpd %ymm2, %ymm1, %ymm4, %ymm1 1443; AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm1 1444; AVX2-NEXT: retq 1445; 1446; AVX512-LABEL: v8i64: 1447; AVX512: # %bb.0: 1448; AVX512-NEXT: vmovdqa64 %zmm1, %zmm2 1449; AVX512-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm2 1450; AVX512-NEXT: vpminuq %zmm2, %zmm0, %zmm0 1451; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm0 1452; AVX512-NEXT: retq 1453 %z = call <8 x i64> @llvm.uadd.sat.v8i64(<8 x i64> %x, <8 x i64> %y) 1454 ret <8 x i64> %z 1455} 1456 1457define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind { 1458; SSE-LABEL: v2i128: 1459; SSE: # %bb.0: 1460; SSE-NEXT: movq %rdi, %rax 1461; SSE-NEXT: addq %r9, %rsi 1462; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %rdx 1463; SSE-NEXT: movq $-1, %rdi 1464; SSE-NEXT: cmovbq %rdi, %rsi 1465; SSE-NEXT: cmovbq %rdi, %rdx 1466; SSE-NEXT: addq {{[0-9]+}}(%rsp), %rcx 1467; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %r8 1468; SSE-NEXT: cmovbq %rdi, %r8 1469; SSE-NEXT: cmovbq %rdi, %rcx 1470; SSE-NEXT: movq %r8, 24(%rax) 1471; SSE-NEXT: movq %rcx, 16(%rax) 1472; SSE-NEXT: movq %rdx, 8(%rax) 1473; SSE-NEXT: movq %rsi, (%rax) 1474; SSE-NEXT: retq 1475; 1476; AVX-LABEL: v2i128: 1477; AVX: # %bb.0: 1478; AVX-NEXT: movq %rdi, %rax 1479; AVX-NEXT: addq %r9, %rsi 1480; AVX-NEXT: adcq {{[0-9]+}}(%rsp), %rdx 1481; AVX-NEXT: movq $-1, %rdi 1482; AVX-NEXT: cmovbq %rdi, %rsi 1483; AVX-NEXT: cmovbq %rdi, %rdx 1484; AVX-NEXT: addq {{[0-9]+}}(%rsp), %rcx 1485; AVX-NEXT: adcq {{[0-9]+}}(%rsp), %r8 1486; AVX-NEXT: cmovbq %rdi, %r8 1487; AVX-NEXT: cmovbq %rdi, %rcx 1488; AVX-NEXT: movq %r8, 24(%rax) 1489; AVX-NEXT: movq %rcx, 16(%rax) 1490; AVX-NEXT: movq %rdx, 8(%rax) 1491; AVX-NEXT: movq %rsi, (%rax) 1492; AVX-NEXT: retq 1493 %z = call <2 x i128> @llvm.uadd.sat.v2i128(<2 x i128> %x, <2 x i128> %y) 1494 ret <2 x i128> %z 1495} 1496