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.uadd.sat.v1i8(<1 x i8>, <1 x i8>) 13declare <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8>, <2 x i8>) 14declare <4 x i8> @llvm.uadd.sat.v4i8(<4 x i8>, <4 x i8>) 15declare <8 x i8> @llvm.uadd.sat.v8i8(<8 x i8>, <8 x i8>) 16declare <12 x i8> @llvm.uadd.sat.v12i8(<12 x i8>, <12 x i8>) 17declare <16 x i8> @llvm.uadd.sat.v16i8(<16 x i8>, <16 x i8>) 18declare <32 x i8> @llvm.uadd.sat.v32i8(<32 x i8>, <32 x i8>) 19declare <64 x i8> @llvm.uadd.sat.v64i8(<64 x i8>, <64 x i8>) 20 21declare <1 x i16> @llvm.uadd.sat.v1i16(<1 x i16>, <1 x i16>) 22declare <2 x i16> @llvm.uadd.sat.v2i16(<2 x i16>, <2 x i16>) 23declare <4 x i16> @llvm.uadd.sat.v4i16(<4 x i16>, <4 x i16>) 24declare <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16>, <8 x i16>) 25declare <12 x i16> @llvm.uadd.sat.v12i16(<12 x i16>, <12 x i16>) 26declare <16 x i16> @llvm.uadd.sat.v16i16(<16 x i16>, <16 x i16>) 27declare <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16>, <32 x i16>) 28 29declare <16 x i1> @llvm.uadd.sat.v16i1(<16 x i1>, <16 x i1>) 30declare <16 x i4> @llvm.uadd.sat.v16i4(<16 x i4>, <16 x i4>) 31 32declare <2 x i32> @llvm.uadd.sat.v2i32(<2 x i32>, <2 x i32>) 33declare <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32>, <4 x i32>) 34declare <8 x i32> @llvm.uadd.sat.v8i32(<8 x i32>, <8 x i32>) 35declare <16 x i32> @llvm.uadd.sat.v16i32(<16 x i32>, <16 x i32>) 36declare <2 x i64> @llvm.uadd.sat.v2i64(<2 x i64>, <2 x i64>) 37declare <4 x i64> @llvm.uadd.sat.v4i64(<4 x i64>, <4 x i64>) 38declare <8 x i64> @llvm.uadd.sat.v8i64(<8 x i64>, <8 x i64>) 39 40declare <4 x i24> @llvm.uadd.sat.v4i24(<4 x i24>, <4 x i24>) 41declare <2 x i128> @llvm.uadd.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: paddusb %xmm1, %xmm0 49; SSE-NEXT: retq 50; 51; AVX-LABEL: v16i8: 52; AVX: # %bb.0: 53; AVX-NEXT: vpaddusb %xmm1, %xmm0, %xmm0 54; AVX-NEXT: retq 55 %z = call <16 x i8> @llvm.uadd.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: paddusb %xmm2, %xmm0 63; SSE-NEXT: paddusb %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: vpaddusb %xmm2, %xmm3, %xmm2 71; AVX1-NEXT: vpaddusb %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: vpaddusb %ymm1, %ymm0, %ymm0 78; AVX2-NEXT: retq 79; 80; AVX512-LABEL: v32i8: 81; AVX512: # %bb.0: 82; AVX512-NEXT: vpaddusb %ymm1, %ymm0, %ymm0 83; AVX512-NEXT: retq 84 %z = call <32 x i8> @llvm.uadd.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: paddusb %xmm4, %xmm0 92; SSE-NEXT: paddusb %xmm5, %xmm1 93; SSE-NEXT: paddusb %xmm6, %xmm2 94; SSE-NEXT: paddusb %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: vpaddusb %xmm4, %xmm5, %xmm4 102; AVX1-NEXT: vpaddusb %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: vpaddusb %xmm2, %xmm4, %xmm2 107; AVX1-NEXT: vpaddusb %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: vpaddusb %ymm2, %ymm0, %ymm0 114; AVX2-NEXT: vpaddusb %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: vpaddusb %ymm2, %ymm3, %ymm2 122; AVX512F-NEXT: vpaddusb %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: vpaddusb %zmm1, %zmm0, %zmm0 129; AVX512BW-NEXT: retq 130 %z = call <64 x i8> @llvm.uadd.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: paddusw %xmm1, %xmm0 138; SSE-NEXT: retq 139; 140; AVX-LABEL: v8i16: 141; AVX: # %bb.0: 142; AVX-NEXT: vpaddusw %xmm1, %xmm0, %xmm0 143; AVX-NEXT: retq 144 %z = call <8 x i16> @llvm.uadd.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: paddusw %xmm2, %xmm0 152; SSE-NEXT: paddusw %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: vpaddusw %xmm2, %xmm3, %xmm2 160; AVX1-NEXT: vpaddusw %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: vpaddusw %ymm1, %ymm0, %ymm0 167; AVX2-NEXT: retq 168; 169; AVX512-LABEL: v16i16: 170; AVX512: # %bb.0: 171; AVX512-NEXT: vpaddusw %ymm1, %ymm0, %ymm0 172; AVX512-NEXT: retq 173 %z = call <16 x i16> @llvm.uadd.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: paddusw %xmm4, %xmm0 181; SSE-NEXT: paddusw %xmm5, %xmm1 182; SSE-NEXT: paddusw %xmm6, %xmm2 183; SSE-NEXT: paddusw %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: vpaddusw %xmm4, %xmm5, %xmm4 191; AVX1-NEXT: vpaddusw %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: vpaddusw %xmm2, %xmm4, %xmm2 196; AVX1-NEXT: vpaddusw %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: vpaddusw %ymm2, %ymm0, %ymm0 203; AVX2-NEXT: vpaddusw %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: vpaddusw %ymm2, %ymm3, %ymm2 211; AVX512F-NEXT: vpaddusw %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: vpaddusw %zmm1, %zmm0, %zmm0 218; AVX512BW-NEXT: retq 219 %z = call <32 x i16> @llvm.uadd.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: paddusb %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: vpaddusb %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.uadd.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: paddusb %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: vpaddusb %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.uadd.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: paddusb %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: paddusb %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: paddusb %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: vpaddusb %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.uadd.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: paddusw %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: vpaddusw %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.uadd.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: paddusw %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: vpaddusw %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.uadd.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: paddusb %xmm1, %xmm0 370; SSE-NEXT: retq 371; 372; AVX-LABEL: v12i8: 373; AVX: # %bb.0: 374; AVX-NEXT: vpaddusb %xmm1, %xmm0, %xmm0 375; AVX-NEXT: retq 376 %z = call <12 x i8> @llvm.uadd.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: paddusw 16(%rsi), %xmm1 386; SSE-NEXT: paddusw (%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: vpaddusw 16(%rsi), %xmm1, %xmm1 396; AVX1-NEXT: vpaddusw (%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: vpaddusw (%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: vpaddusw (%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.uadd.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: addb (%rsi), %al 434; SSE-NEXT: movzbl %al, %eax 435; SSE-NEXT: movl $255, %ecx 436; SSE-NEXT: cmovael %eax, %ecx 437; SSE-NEXT: movb %cl, (%rdx) 438; SSE-NEXT: retq 439; 440; AVX-LABEL: v1i8: 441; AVX: # %bb.0: 442; AVX-NEXT: movzbl (%rdi), %eax 443; AVX-NEXT: addb (%rsi), %al 444; AVX-NEXT: movzbl %al, %eax 445; AVX-NEXT: movl $255, %ecx 446; AVX-NEXT: cmovael %eax, %ecx 447; AVX-NEXT: movb %cl, (%rdx) 448; AVX-NEXT: retq 449 %x = load <1 x i8>, ptr %px 450 %y = load <1 x i8>, ptr %py 451 %z = call <1 x i8> @llvm.uadd.sat.v1i8(<1 x i8> %x, <1 x i8> %y) 452 store <1 x i8> %z, ptr %pz 453 ret void 454} 455 456define void @v1i16(ptr %px, ptr %py, ptr %pz) nounwind { 457; SSE-LABEL: v1i16: 458; SSE: # %bb.0: 459; SSE-NEXT: movzwl (%rdi), %eax 460; SSE-NEXT: addw (%rsi), %ax 461; SSE-NEXT: movl $65535, %ecx # imm = 0xFFFF 462; SSE-NEXT: cmovael %eax, %ecx 463; SSE-NEXT: movw %cx, (%rdx) 464; SSE-NEXT: retq 465; 466; AVX-LABEL: v1i16: 467; AVX: # %bb.0: 468; AVX-NEXT: movzwl (%rdi), %eax 469; AVX-NEXT: addw (%rsi), %ax 470; AVX-NEXT: movl $65535, %ecx # imm = 0xFFFF 471; AVX-NEXT: cmovael %eax, %ecx 472; AVX-NEXT: movw %cx, (%rdx) 473; AVX-NEXT: retq 474 %x = load <1 x i16>, ptr %px 475 %y = load <1 x i16>, ptr %py 476 %z = call <1 x i16> @llvm.uadd.sat.v1i16(<1 x i16> %x, <1 x i16> %y) 477 store <1 x i16> %z, ptr %pz 478 ret void 479} 480 481; Promotion 482 483define <16 x i4> @v16i4(<16 x i4> %x, <16 x i4> %y) nounwind { 484; SSE-LABEL: v16i4: 485; SSE: # %bb.0: 486; SSE-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 487; SSE-NEXT: pand %xmm2, %xmm1 488; SSE-NEXT: pand %xmm2, %xmm0 489; SSE-NEXT: paddb %xmm1, %xmm0 490; SSE-NEXT: pminub %xmm2, %xmm0 491; SSE-NEXT: retq 492; 493; AVX1-LABEL: v16i4: 494; AVX1: # %bb.0: 495; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 496; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1 497; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 498; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm0 499; AVX1-NEXT: vpminub %xmm2, %xmm0, %xmm0 500; AVX1-NEXT: retq 501; 502; AVX2-LABEL: v16i4: 503; AVX2: # %bb.0: 504; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 505; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1 506; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0 507; AVX2-NEXT: vpaddb %xmm1, %xmm0, %xmm0 508; AVX2-NEXT: vpminub %xmm2, %xmm0, %xmm0 509; AVX2-NEXT: retq 510; 511; AVX512-LABEL: v16i4: 512; AVX512: # %bb.0: 513; AVX512-NEXT: vpbroadcastb {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 514; AVX512-NEXT: vpand %xmm2, %xmm1, %xmm1 515; AVX512-NEXT: vpand %xmm2, %xmm0, %xmm0 516; AVX512-NEXT: vpaddb %xmm1, %xmm0, %xmm0 517; AVX512-NEXT: vpminub %xmm2, %xmm0, %xmm0 518; AVX512-NEXT: retq 519 %z = call <16 x i4> @llvm.uadd.sat.v16i4(<16 x i4> %x, <16 x i4> %y) 520 ret <16 x i4> %z 521} 522 523define <16 x i1> @v16i1(<16 x i1> %x, <16 x i1> %y) nounwind { 524; SSE-LABEL: v16i1: 525; SSE: # %bb.0: 526; SSE-NEXT: orps %xmm1, %xmm0 527; SSE-NEXT: retq 528; 529; AVX-LABEL: v16i1: 530; AVX: # %bb.0: 531; AVX-NEXT: vorps %xmm1, %xmm0, %xmm0 532; AVX-NEXT: retq 533 %z = call <16 x i1> @llvm.uadd.sat.v16i1(<16 x i1> %x, <16 x i1> %y) 534 ret <16 x i1> %z 535} 536 537; Expanded 538 539define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind { 540; SSE2-LABEL: v2i32: 541; SSE2: # %bb.0: 542; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] 543; SSE2-NEXT: movdqa %xmm0, %xmm3 544; SSE2-NEXT: pxor %xmm2, %xmm3 545; SSE2-NEXT: paddd %xmm1, %xmm0 546; SSE2-NEXT: pxor %xmm0, %xmm2 547; SSE2-NEXT: pcmpgtd %xmm2, %xmm3 548; SSE2-NEXT: por %xmm3, %xmm0 549; SSE2-NEXT: retq 550; 551; SSSE3-LABEL: v2i32: 552; SSSE3: # %bb.0: 553; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] 554; SSSE3-NEXT: movdqa %xmm0, %xmm3 555; SSSE3-NEXT: pxor %xmm2, %xmm3 556; SSSE3-NEXT: paddd %xmm1, %xmm0 557; SSSE3-NEXT: pxor %xmm0, %xmm2 558; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3 559; SSSE3-NEXT: por %xmm3, %xmm0 560; SSSE3-NEXT: retq 561; 562; SSE41-LABEL: v2i32: 563; SSE41: # %bb.0: 564; SSE41-NEXT: pcmpeqd %xmm2, %xmm2 565; SSE41-NEXT: pxor %xmm1, %xmm2 566; SSE41-NEXT: pminud %xmm2, %xmm0 567; SSE41-NEXT: paddd %xmm1, %xmm0 568; SSE41-NEXT: retq 569; 570; AVX1-LABEL: v2i32: 571; AVX1: # %bb.0: 572; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 573; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm2 574; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0 575; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0 576; AVX1-NEXT: retq 577; 578; AVX2-LABEL: v2i32: 579; AVX2: # %bb.0: 580; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 581; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm2 582; AVX2-NEXT: vpminud %xmm2, %xmm0, %xmm0 583; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0 584; AVX2-NEXT: retq 585; 586; AVX512F-LABEL: v2i32: 587; AVX512F: # %bb.0: 588; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 589; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm2 590; AVX512F-NEXT: vpternlogq {{.*#+}} zmm2 = ~zmm2 591; AVX512F-NEXT: vpminud %xmm2, %xmm0, %xmm0 592; AVX512F-NEXT: vpaddd %xmm1, %xmm0, %xmm0 593; AVX512F-NEXT: vzeroupper 594; AVX512F-NEXT: retq 595; 596; AVX512BW-LABEL: v2i32: 597; AVX512BW: # %bb.0: 598; AVX512BW-NEXT: vmovdqa %xmm1, %xmm2 599; AVX512BW-NEXT: vpternlogq {{.*#+}} xmm2 = ~xmm2 600; AVX512BW-NEXT: vpminud %xmm2, %xmm0, %xmm0 601; AVX512BW-NEXT: vpaddd %xmm1, %xmm0, %xmm0 602; AVX512BW-NEXT: retq 603 %z = call <2 x i32> @llvm.uadd.sat.v2i32(<2 x i32> %x, <2 x i32> %y) 604 ret <2 x i32> %z 605} 606 607define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind { 608; SSE2-LABEL: v4i32: 609; SSE2: # %bb.0: 610; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] 611; SSE2-NEXT: movdqa %xmm0, %xmm3 612; SSE2-NEXT: pxor %xmm2, %xmm3 613; SSE2-NEXT: paddd %xmm1, %xmm0 614; SSE2-NEXT: pxor %xmm0, %xmm2 615; SSE2-NEXT: pcmpgtd %xmm2, %xmm3 616; SSE2-NEXT: por %xmm3, %xmm0 617; SSE2-NEXT: retq 618; 619; SSSE3-LABEL: v4i32: 620; SSSE3: # %bb.0: 621; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] 622; SSSE3-NEXT: movdqa %xmm0, %xmm3 623; SSSE3-NEXT: pxor %xmm2, %xmm3 624; SSSE3-NEXT: paddd %xmm1, %xmm0 625; SSSE3-NEXT: pxor %xmm0, %xmm2 626; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3 627; SSSE3-NEXT: por %xmm3, %xmm0 628; SSSE3-NEXT: retq 629; 630; SSE41-LABEL: v4i32: 631; SSE41: # %bb.0: 632; SSE41-NEXT: pcmpeqd %xmm2, %xmm2 633; SSE41-NEXT: pxor %xmm1, %xmm2 634; SSE41-NEXT: pminud %xmm2, %xmm0 635; SSE41-NEXT: paddd %xmm1, %xmm0 636; SSE41-NEXT: retq 637; 638; AVX1-LABEL: v4i32: 639; AVX1: # %bb.0: 640; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 641; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm2 642; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0 643; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0 644; AVX1-NEXT: retq 645; 646; AVX2-LABEL: v4i32: 647; AVX2: # %bb.0: 648; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 649; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm2 650; AVX2-NEXT: vpminud %xmm2, %xmm0, %xmm0 651; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0 652; AVX2-NEXT: retq 653; 654; AVX512F-LABEL: v4i32: 655; AVX512F: # %bb.0: 656; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 657; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm2 658; AVX512F-NEXT: vpternlogq {{.*#+}} zmm2 = ~zmm2 659; AVX512F-NEXT: vpminud %xmm2, %xmm0, %xmm0 660; AVX512F-NEXT: vpaddd %xmm1, %xmm0, %xmm0 661; AVX512F-NEXT: vzeroupper 662; AVX512F-NEXT: retq 663; 664; AVX512BW-LABEL: v4i32: 665; AVX512BW: # %bb.0: 666; AVX512BW-NEXT: vmovdqa %xmm1, %xmm2 667; AVX512BW-NEXT: vpternlogq {{.*#+}} xmm2 = ~xmm2 668; AVX512BW-NEXT: vpminud %xmm2, %xmm0, %xmm0 669; AVX512BW-NEXT: vpaddd %xmm1, %xmm0, %xmm0 670; AVX512BW-NEXT: retq 671 %z = call <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32> %x, <4 x i32> %y) 672 ret <4 x i32> %z 673} 674 675define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind { 676; SSE2-LABEL: v8i32: 677; SSE2: # %bb.0: 678; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] 679; SSE2-NEXT: movdqa %xmm0, %xmm5 680; SSE2-NEXT: pxor %xmm4, %xmm5 681; SSE2-NEXT: paddd %xmm2, %xmm0 682; SSE2-NEXT: movdqa %xmm0, %xmm2 683; SSE2-NEXT: pxor %xmm4, %xmm2 684; SSE2-NEXT: pcmpgtd %xmm2, %xmm5 685; SSE2-NEXT: por %xmm5, %xmm0 686; SSE2-NEXT: movdqa %xmm1, %xmm2 687; SSE2-NEXT: pxor %xmm4, %xmm2 688; SSE2-NEXT: paddd %xmm3, %xmm1 689; SSE2-NEXT: pxor %xmm1, %xmm4 690; SSE2-NEXT: pcmpgtd %xmm4, %xmm2 691; SSE2-NEXT: por %xmm2, %xmm1 692; SSE2-NEXT: retq 693; 694; SSSE3-LABEL: v8i32: 695; SSSE3: # %bb.0: 696; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] 697; SSSE3-NEXT: movdqa %xmm0, %xmm5 698; SSSE3-NEXT: pxor %xmm4, %xmm5 699; SSSE3-NEXT: paddd %xmm2, %xmm0 700; SSSE3-NEXT: movdqa %xmm0, %xmm2 701; SSSE3-NEXT: pxor %xmm4, %xmm2 702; SSSE3-NEXT: pcmpgtd %xmm2, %xmm5 703; SSSE3-NEXT: por %xmm5, %xmm0 704; SSSE3-NEXT: movdqa %xmm1, %xmm2 705; SSSE3-NEXT: pxor %xmm4, %xmm2 706; SSSE3-NEXT: paddd %xmm3, %xmm1 707; SSSE3-NEXT: pxor %xmm1, %xmm4 708; SSSE3-NEXT: pcmpgtd %xmm4, %xmm2 709; SSSE3-NEXT: por %xmm2, %xmm1 710; SSSE3-NEXT: retq 711; 712; SSE41-LABEL: v8i32: 713; SSE41: # %bb.0: 714; SSE41-NEXT: pcmpeqd %xmm4, %xmm4 715; SSE41-NEXT: movdqa %xmm2, %xmm5 716; SSE41-NEXT: pxor %xmm4, %xmm5 717; SSE41-NEXT: pminud %xmm5, %xmm0 718; SSE41-NEXT: paddd %xmm2, %xmm0 719; SSE41-NEXT: pxor %xmm3, %xmm4 720; SSE41-NEXT: pminud %xmm4, %xmm1 721; SSE41-NEXT: paddd %xmm3, %xmm1 722; SSE41-NEXT: retq 723; 724; AVX1-LABEL: v8i32: 725; AVX1: # %bb.0: 726; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 727; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 728; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm4 729; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 730; AVX1-NEXT: vpminud %xmm4, %xmm5, %xmm4 731; AVX1-NEXT: vpaddd %xmm2, %xmm4, %xmm2 732; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm3 733; AVX1-NEXT: vpminud %xmm3, %xmm0, %xmm0 734; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0 735; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 736; AVX1-NEXT: retq 737; 738; AVX2-LABEL: v8i32: 739; AVX2: # %bb.0: 740; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 741; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm2 742; AVX2-NEXT: vpminud %ymm2, %ymm0, %ymm0 743; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0 744; AVX2-NEXT: retq 745; 746; AVX512F-LABEL: v8i32: 747; AVX512F: # %bb.0: 748; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 749; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm2 750; AVX512F-NEXT: vpternlogq {{.*#+}} zmm2 = ~zmm2 751; AVX512F-NEXT: vpminud %ymm2, %ymm0, %ymm0 752; AVX512F-NEXT: vpaddd %ymm1, %ymm0, %ymm0 753; AVX512F-NEXT: retq 754; 755; AVX512BW-LABEL: v8i32: 756; AVX512BW: # %bb.0: 757; AVX512BW-NEXT: vmovdqa %ymm1, %ymm2 758; AVX512BW-NEXT: vpternlogq {{.*#+}} ymm2 = ~ymm2 759; AVX512BW-NEXT: vpminud %ymm2, %ymm0, %ymm0 760; AVX512BW-NEXT: vpaddd %ymm1, %ymm0, %ymm0 761; AVX512BW-NEXT: retq 762 %z = call <8 x i32> @llvm.uadd.sat.v8i32(<8 x i32> %x, <8 x i32> %y) 763 ret <8 x i32> %z 764} 765 766define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind { 767; SSE2-LABEL: v16i32: 768; SSE2: # %bb.0: 769; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648] 770; SSE2-NEXT: movdqa %xmm0, %xmm9 771; SSE2-NEXT: pxor %xmm8, %xmm9 772; SSE2-NEXT: paddd %xmm4, %xmm0 773; SSE2-NEXT: movdqa %xmm0, %xmm4 774; SSE2-NEXT: pxor %xmm8, %xmm4 775; SSE2-NEXT: pcmpgtd %xmm4, %xmm9 776; SSE2-NEXT: por %xmm9, %xmm0 777; SSE2-NEXT: movdqa %xmm1, %xmm4 778; SSE2-NEXT: pxor %xmm8, %xmm4 779; SSE2-NEXT: paddd %xmm5, %xmm1 780; SSE2-NEXT: movdqa %xmm1, %xmm5 781; SSE2-NEXT: pxor %xmm8, %xmm5 782; SSE2-NEXT: pcmpgtd %xmm5, %xmm4 783; SSE2-NEXT: por %xmm4, %xmm1 784; SSE2-NEXT: movdqa %xmm2, %xmm4 785; SSE2-NEXT: pxor %xmm8, %xmm4 786; SSE2-NEXT: paddd %xmm6, %xmm2 787; SSE2-NEXT: movdqa %xmm2, %xmm5 788; SSE2-NEXT: pxor %xmm8, %xmm5 789; SSE2-NEXT: pcmpgtd %xmm5, %xmm4 790; SSE2-NEXT: por %xmm4, %xmm2 791; SSE2-NEXT: movdqa %xmm3, %xmm4 792; SSE2-NEXT: pxor %xmm8, %xmm4 793; SSE2-NEXT: paddd %xmm7, %xmm3 794; SSE2-NEXT: pxor %xmm3, %xmm8 795; SSE2-NEXT: pcmpgtd %xmm8, %xmm4 796; SSE2-NEXT: por %xmm4, %xmm3 797; SSE2-NEXT: retq 798; 799; SSSE3-LABEL: v16i32: 800; SSSE3: # %bb.0: 801; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648] 802; SSSE3-NEXT: movdqa %xmm0, %xmm9 803; SSSE3-NEXT: pxor %xmm8, %xmm9 804; SSSE3-NEXT: paddd %xmm4, %xmm0 805; SSSE3-NEXT: movdqa %xmm0, %xmm4 806; SSSE3-NEXT: pxor %xmm8, %xmm4 807; SSSE3-NEXT: pcmpgtd %xmm4, %xmm9 808; SSSE3-NEXT: por %xmm9, %xmm0 809; SSSE3-NEXT: movdqa %xmm1, %xmm4 810; SSSE3-NEXT: pxor %xmm8, %xmm4 811; SSSE3-NEXT: paddd %xmm5, %xmm1 812; SSSE3-NEXT: movdqa %xmm1, %xmm5 813; SSSE3-NEXT: pxor %xmm8, %xmm5 814; SSSE3-NEXT: pcmpgtd %xmm5, %xmm4 815; SSSE3-NEXT: por %xmm4, %xmm1 816; SSSE3-NEXT: movdqa %xmm2, %xmm4 817; SSSE3-NEXT: pxor %xmm8, %xmm4 818; SSSE3-NEXT: paddd %xmm6, %xmm2 819; SSSE3-NEXT: movdqa %xmm2, %xmm5 820; SSSE3-NEXT: pxor %xmm8, %xmm5 821; SSSE3-NEXT: pcmpgtd %xmm5, %xmm4 822; SSSE3-NEXT: por %xmm4, %xmm2 823; SSSE3-NEXT: movdqa %xmm3, %xmm4 824; SSSE3-NEXT: pxor %xmm8, %xmm4 825; SSSE3-NEXT: paddd %xmm7, %xmm3 826; SSSE3-NEXT: pxor %xmm3, %xmm8 827; SSSE3-NEXT: pcmpgtd %xmm8, %xmm4 828; SSSE3-NEXT: por %xmm4, %xmm3 829; SSSE3-NEXT: retq 830; 831; SSE41-LABEL: v16i32: 832; SSE41: # %bb.0: 833; SSE41-NEXT: pcmpeqd %xmm8, %xmm8 834; SSE41-NEXT: movdqa %xmm4, %xmm9 835; SSE41-NEXT: pxor %xmm8, %xmm9 836; SSE41-NEXT: pminud %xmm9, %xmm0 837; SSE41-NEXT: paddd %xmm4, %xmm0 838; SSE41-NEXT: movdqa %xmm5, %xmm4 839; SSE41-NEXT: pxor %xmm8, %xmm4 840; SSE41-NEXT: pminud %xmm4, %xmm1 841; SSE41-NEXT: paddd %xmm5, %xmm1 842; SSE41-NEXT: movdqa %xmm6, %xmm4 843; SSE41-NEXT: pxor %xmm8, %xmm4 844; SSE41-NEXT: pminud %xmm4, %xmm2 845; SSE41-NEXT: paddd %xmm6, %xmm2 846; SSE41-NEXT: pxor %xmm7, %xmm8 847; SSE41-NEXT: pminud %xmm8, %xmm3 848; SSE41-NEXT: paddd %xmm7, %xmm3 849; SSE41-NEXT: retq 850; 851; AVX1-LABEL: v16i32: 852; AVX1: # %bb.0: 853; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 854; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5 855; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm6 856; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7 857; AVX1-NEXT: vpminud %xmm6, %xmm7, %xmm6 858; AVX1-NEXT: vpaddd %xmm4, %xmm6, %xmm4 859; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm6 860; AVX1-NEXT: vpminud %xmm6, %xmm0, %xmm0 861; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm0 862; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 863; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2 864; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm4 865; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6 866; AVX1-NEXT: vpminud %xmm4, %xmm6, %xmm4 867; AVX1-NEXT: vpaddd %xmm2, %xmm4, %xmm2 868; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm4 869; AVX1-NEXT: vpminud %xmm4, %xmm1, %xmm1 870; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1 871; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 872; AVX1-NEXT: retq 873; 874; AVX2-LABEL: v16i32: 875; AVX2: # %bb.0: 876; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 877; AVX2-NEXT: vpxor %ymm4, %ymm2, %ymm5 878; AVX2-NEXT: vpminud %ymm5, %ymm0, %ymm0 879; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm0 880; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm2 881; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm1 882; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm1 883; AVX2-NEXT: retq 884; 885; AVX512-LABEL: v16i32: 886; AVX512: # %bb.0: 887; AVX512-NEXT: vmovdqa64 %zmm1, %zmm2 888; AVX512-NEXT: vpternlogq {{.*#+}} zmm2 = ~zmm2 889; AVX512-NEXT: vpminud %zmm2, %zmm0, %zmm0 890; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0 891; AVX512-NEXT: retq 892 %z = call <16 x i32> @llvm.uadd.sat.v16i32(<16 x i32> %x, <16 x i32> %y) 893 ret <16 x i32> %z 894} 895 896define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind { 897; SSE-LABEL: v2i64: 898; SSE: # %bb.0: 899; SSE-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456] 900; SSE-NEXT: movdqa %xmm0, %xmm3 901; SSE-NEXT: pxor %xmm2, %xmm3 902; SSE-NEXT: paddq %xmm1, %xmm0 903; SSE-NEXT: pxor %xmm0, %xmm2 904; SSE-NEXT: movdqa %xmm3, %xmm1 905; SSE-NEXT: pcmpgtd %xmm2, %xmm1 906; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2] 907; SSE-NEXT: pcmpeqd %xmm3, %xmm2 908; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 909; SSE-NEXT: pand %xmm4, %xmm2 910; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 911; SSE-NEXT: por %xmm1, %xmm0 912; SSE-NEXT: por %xmm2, %xmm0 913; SSE-NEXT: retq 914; 915; AVX1-LABEL: v2i64: 916; AVX1: # %bb.0: 917; AVX1-NEXT: vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 918; AVX1-NEXT: # xmm2 = mem[0,0] 919; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm3 920; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0 921; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm1 922; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1 923; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0 924; AVX1-NEXT: retq 925; 926; AVX2-LABEL: v2i64: 927; AVX2: # %bb.0: 928; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 929; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm3 930; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0 931; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm1 932; AVX2-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1 933; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0 934; AVX2-NEXT: retq 935; 936; AVX512F-LABEL: v2i64: 937; AVX512F: # %bb.0: 938; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 939; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 940; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm2 941; AVX512F-NEXT: vpternlogq {{.*#+}} zmm2 = ~zmm2 942; AVX512F-NEXT: vpminuq %zmm2, %zmm0, %zmm0 943; AVX512F-NEXT: vpaddq %xmm1, %xmm0, %xmm0 944; AVX512F-NEXT: vzeroupper 945; AVX512F-NEXT: retq 946; 947; AVX512BW-LABEL: v2i64: 948; AVX512BW: # %bb.0: 949; AVX512BW-NEXT: vmovdqa %xmm1, %xmm2 950; AVX512BW-NEXT: vpternlogq {{.*#+}} xmm2 = ~xmm2 951; AVX512BW-NEXT: vpminuq %xmm2, %xmm0, %xmm0 952; AVX512BW-NEXT: vpaddq %xmm1, %xmm0, %xmm0 953; AVX512BW-NEXT: retq 954 %z = call <2 x i64> @llvm.uadd.sat.v2i64(<2 x i64> %x, <2 x i64> %y) 955 ret <2 x i64> %z 956} 957 958define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind { 959; SSE-LABEL: v4i64: 960; SSE: # %bb.0: 961; SSE-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456] 962; SSE-NEXT: movdqa %xmm0, %xmm5 963; SSE-NEXT: pxor %xmm4, %xmm5 964; SSE-NEXT: paddq %xmm2, %xmm0 965; SSE-NEXT: movdqa %xmm0, %xmm2 966; SSE-NEXT: pxor %xmm4, %xmm2 967; SSE-NEXT: movdqa %xmm5, %xmm6 968; SSE-NEXT: pcmpgtd %xmm2, %xmm6 969; SSE-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 970; SSE-NEXT: pcmpeqd %xmm5, %xmm2 971; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 972; SSE-NEXT: pand %xmm7, %xmm2 973; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3] 974; SSE-NEXT: por %xmm5, %xmm0 975; SSE-NEXT: por %xmm2, %xmm0 976; SSE-NEXT: movdqa %xmm1, %xmm2 977; SSE-NEXT: pxor %xmm4, %xmm2 978; SSE-NEXT: paddq %xmm3, %xmm1 979; SSE-NEXT: pxor %xmm1, %xmm4 980; SSE-NEXT: movdqa %xmm2, %xmm3 981; SSE-NEXT: pcmpgtd %xmm4, %xmm3 982; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2] 983; SSE-NEXT: pcmpeqd %xmm2, %xmm4 984; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 985; SSE-NEXT: pand %xmm5, %xmm2 986; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 987; SSE-NEXT: por %xmm3, %xmm1 988; SSE-NEXT: por %xmm2, %xmm1 989; SSE-NEXT: retq 990; 991; AVX1-LABEL: v4i64: 992; AVX1: # %bb.0: 993; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 994; AVX1-NEXT: vmovddup {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808] 995; AVX1-NEXT: # xmm3 = mem[0,0] 996; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm4 997; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 998; AVX1-NEXT: vpaddq %xmm5, %xmm2, %xmm2 999; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm5 1000; AVX1-NEXT: vpcmpgtq %xmm5, %xmm4, %xmm4 1001; AVX1-NEXT: vpor %xmm4, %xmm2, %xmm2 1002; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm4 1003; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0 1004; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm1 1005; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm1 1006; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0 1007; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1008; AVX1-NEXT: retq 1009; 1010; AVX2-LABEL: v4i64: 1011; AVX2: # %bb.0: 1012; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 1013; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm3 1014; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0 1015; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm1 1016; AVX2-NEXT: vpcmpgtq %ymm1, %ymm3, %ymm1 1017; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 1018; AVX2-NEXT: retq 1019; 1020; AVX512F-LABEL: v4i64: 1021; AVX512F: # %bb.0: 1022; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 1023; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1024; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm2 1025; AVX512F-NEXT: vpternlogq {{.*#+}} zmm2 = ~zmm2 1026; AVX512F-NEXT: vpminuq %zmm2, %zmm0, %zmm0 1027; AVX512F-NEXT: vpaddq %ymm1, %ymm0, %ymm0 1028; AVX512F-NEXT: retq 1029; 1030; AVX512BW-LABEL: v4i64: 1031; AVX512BW: # %bb.0: 1032; AVX512BW-NEXT: vmovdqa %ymm1, %ymm2 1033; AVX512BW-NEXT: vpternlogq {{.*#+}} ymm2 = ~ymm2 1034; AVX512BW-NEXT: vpminuq %ymm2, %ymm0, %ymm0 1035; AVX512BW-NEXT: vpaddq %ymm1, %ymm0, %ymm0 1036; AVX512BW-NEXT: retq 1037 %z = call <4 x i64> @llvm.uadd.sat.v4i64(<4 x i64> %x, <4 x i64> %y) 1038 ret <4 x i64> %z 1039} 1040 1041define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind { 1042; SSE-LABEL: v8i64: 1043; SSE: # %bb.0: 1044; SSE-NEXT: movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456] 1045; SSE-NEXT: movdqa %xmm0, %xmm9 1046; SSE-NEXT: pxor %xmm8, %xmm9 1047; SSE-NEXT: paddq %xmm4, %xmm0 1048; SSE-NEXT: movdqa %xmm0, %xmm4 1049; SSE-NEXT: pxor %xmm8, %xmm4 1050; SSE-NEXT: movdqa %xmm9, %xmm10 1051; SSE-NEXT: pcmpgtd %xmm4, %xmm10 1052; SSE-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2] 1053; SSE-NEXT: pcmpeqd %xmm9, %xmm4 1054; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1055; SSE-NEXT: pand %xmm11, %xmm4 1056; SSE-NEXT: pshufd {{.*#+}} xmm9 = xmm10[1,1,3,3] 1057; SSE-NEXT: por %xmm9, %xmm0 1058; SSE-NEXT: por %xmm4, %xmm0 1059; SSE-NEXT: movdqa %xmm1, %xmm4 1060; SSE-NEXT: pxor %xmm8, %xmm4 1061; SSE-NEXT: paddq %xmm5, %xmm1 1062; SSE-NEXT: movdqa %xmm1, %xmm5 1063; SSE-NEXT: pxor %xmm8, %xmm5 1064; SSE-NEXT: movdqa %xmm4, %xmm9 1065; SSE-NEXT: pcmpgtd %xmm5, %xmm9 1066; SSE-NEXT: pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2] 1067; SSE-NEXT: pcmpeqd %xmm4, %xmm5 1068; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 1069; SSE-NEXT: pand %xmm10, %xmm4 1070; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm9[1,1,3,3] 1071; SSE-NEXT: por %xmm5, %xmm1 1072; SSE-NEXT: por %xmm4, %xmm1 1073; SSE-NEXT: movdqa %xmm2, %xmm4 1074; SSE-NEXT: pxor %xmm8, %xmm4 1075; SSE-NEXT: paddq %xmm6, %xmm2 1076; SSE-NEXT: movdqa %xmm2, %xmm5 1077; SSE-NEXT: pxor %xmm8, %xmm5 1078; SSE-NEXT: movdqa %xmm4, %xmm6 1079; SSE-NEXT: pcmpgtd %xmm5, %xmm6 1080; SSE-NEXT: pshufd {{.*#+}} xmm9 = xmm6[0,0,2,2] 1081; SSE-NEXT: pcmpeqd %xmm4, %xmm5 1082; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 1083; SSE-NEXT: pand %xmm9, %xmm4 1084; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3] 1085; SSE-NEXT: por %xmm5, %xmm2 1086; SSE-NEXT: por %xmm4, %xmm2 1087; SSE-NEXT: movdqa %xmm3, %xmm4 1088; SSE-NEXT: pxor %xmm8, %xmm4 1089; SSE-NEXT: paddq %xmm7, %xmm3 1090; SSE-NEXT: pxor %xmm3, %xmm8 1091; SSE-NEXT: movdqa %xmm4, %xmm5 1092; SSE-NEXT: pcmpgtd %xmm8, %xmm5 1093; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 1094; SSE-NEXT: pcmpeqd %xmm4, %xmm8 1095; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm8[1,1,3,3] 1096; SSE-NEXT: pand %xmm6, %xmm4 1097; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 1098; SSE-NEXT: por %xmm5, %xmm3 1099; SSE-NEXT: por %xmm4, %xmm3 1100; SSE-NEXT: retq 1101; 1102; AVX1-LABEL: v8i64: 1103; AVX1: # %bb.0: 1104; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 1105; AVX1-NEXT: vmovddup {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808] 1106; AVX1-NEXT: # xmm5 = mem[0,0] 1107; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm6 1108; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm7 1109; AVX1-NEXT: vpaddq %xmm7, %xmm4, %xmm4 1110; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm7 1111; AVX1-NEXT: vpcmpgtq %xmm7, %xmm6, %xmm6 1112; AVX1-NEXT: vpor %xmm6, %xmm4, %xmm4 1113; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm6 1114; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm0 1115; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm2 1116; AVX1-NEXT: vpcmpgtq %xmm2, %xmm6, %xmm2 1117; AVX1-NEXT: vpor %xmm2, %xmm0, %xmm0 1118; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 1119; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1120; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm4 1121; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm6 1122; AVX1-NEXT: vpaddq %xmm6, %xmm2, %xmm2 1123; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm6 1124; AVX1-NEXT: vpcmpgtq %xmm6, %xmm4, %xmm4 1125; AVX1-NEXT: vpor %xmm4, %xmm2, %xmm2 1126; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm4 1127; AVX1-NEXT: vpaddq %xmm3, %xmm1, %xmm1 1128; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm3 1129; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3 1130; AVX1-NEXT: vpor %xmm3, %xmm1, %xmm1 1131; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1132; AVX1-NEXT: retq 1133; 1134; AVX2-LABEL: v8i64: 1135; AVX2: # %bb.0: 1136; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 1137; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm5 1138; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0 1139; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm2 1140; AVX2-NEXT: vpcmpgtq %ymm2, %ymm5, %ymm2 1141; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0 1142; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm2 1143; AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm1 1144; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm3 1145; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2 1146; AVX2-NEXT: vpor %ymm2, %ymm1, %ymm1 1147; AVX2-NEXT: retq 1148; 1149; AVX512-LABEL: v8i64: 1150; AVX512: # %bb.0: 1151; AVX512-NEXT: vmovdqa64 %zmm1, %zmm2 1152; AVX512-NEXT: vpternlogq {{.*#+}} zmm2 = ~zmm2 1153; AVX512-NEXT: vpminuq %zmm2, %zmm0, %zmm0 1154; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm0 1155; AVX512-NEXT: retq 1156 %z = call <8 x i64> @llvm.uadd.sat.v8i64(<8 x i64> %x, <8 x i64> %y) 1157 ret <8 x i64> %z 1158} 1159 1160define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind { 1161; SSE-LABEL: v2i128: 1162; SSE: # %bb.0: 1163; SSE-NEXT: movq %rdi, %rax 1164; SSE-NEXT: addq %r9, %rsi 1165; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %rdx 1166; SSE-NEXT: movq $-1, %rdi 1167; SSE-NEXT: cmovbq %rdi, %rsi 1168; SSE-NEXT: cmovbq %rdi, %rdx 1169; SSE-NEXT: addq {{[0-9]+}}(%rsp), %rcx 1170; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %r8 1171; SSE-NEXT: cmovbq %rdi, %r8 1172; SSE-NEXT: cmovbq %rdi, %rcx 1173; SSE-NEXT: movq %r8, 24(%rax) 1174; SSE-NEXT: movq %rcx, 16(%rax) 1175; SSE-NEXT: movq %rdx, 8(%rax) 1176; SSE-NEXT: movq %rsi, (%rax) 1177; SSE-NEXT: retq 1178; 1179; AVX-LABEL: v2i128: 1180; AVX: # %bb.0: 1181; AVX-NEXT: movq %rdi, %rax 1182; AVX-NEXT: addq %r9, %rsi 1183; AVX-NEXT: adcq {{[0-9]+}}(%rsp), %rdx 1184; AVX-NEXT: movq $-1, %rdi 1185; AVX-NEXT: cmovbq %rdi, %rsi 1186; AVX-NEXT: cmovbq %rdi, %rdx 1187; AVX-NEXT: addq {{[0-9]+}}(%rsp), %rcx 1188; AVX-NEXT: adcq {{[0-9]+}}(%rsp), %r8 1189; AVX-NEXT: cmovbq %rdi, %r8 1190; AVX-NEXT: cmovbq %rdi, %rcx 1191; AVX-NEXT: movq %r8, 24(%rax) 1192; AVX-NEXT: movq %rcx, 16(%rax) 1193; AVX-NEXT: movq %rdx, 8(%rax) 1194; AVX-NEXT: movq %rsi, (%rax) 1195; AVX-NEXT: retq 1196 %z = call <2 x i128> @llvm.uadd.sat.v2i128(<2 x i128> %x, <2 x i128> %y) 1197 ret <2 x i128> %z 1198} 1199