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.ssub.sat.v1i8(<1 x i8>, <1 x i8>) 13declare <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8>, <2 x i8>) 14declare <4 x i8> @llvm.ssub.sat.v4i8(<4 x i8>, <4 x i8>) 15declare <8 x i8> @llvm.ssub.sat.v8i8(<8 x i8>, <8 x i8>) 16declare <12 x i8> @llvm.ssub.sat.v12i8(<12 x i8>, <12 x i8>) 17declare <16 x i8> @llvm.ssub.sat.v16i8(<16 x i8>, <16 x i8>) 18declare <32 x i8> @llvm.ssub.sat.v32i8(<32 x i8>, <32 x i8>) 19declare <64 x i8> @llvm.ssub.sat.v64i8(<64 x i8>, <64 x i8>) 20 21declare <1 x i16> @llvm.ssub.sat.v1i16(<1 x i16>, <1 x i16>) 22declare <2 x i16> @llvm.ssub.sat.v2i16(<2 x i16>, <2 x i16>) 23declare <4 x i16> @llvm.ssub.sat.v4i16(<4 x i16>, <4 x i16>) 24declare <8 x i16> @llvm.ssub.sat.v8i16(<8 x i16>, <8 x i16>) 25declare <12 x i16> @llvm.ssub.sat.v12i16(<12 x i16>, <12 x i16>) 26declare <16 x i16> @llvm.ssub.sat.v16i16(<16 x i16>, <16 x i16>) 27declare <32 x i16> @llvm.ssub.sat.v32i16(<32 x i16>, <32 x i16>) 28 29declare <16 x i1> @llvm.ssub.sat.v16i1(<16 x i1>, <16 x i1>) 30declare <16 x i4> @llvm.ssub.sat.v16i4(<16 x i4>, <16 x i4>) 31 32declare <2 x i32> @llvm.ssub.sat.v2i32(<2 x i32>, <2 x i32>) 33declare <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32>, <4 x i32>) 34declare <8 x i32> @llvm.ssub.sat.v8i32(<8 x i32>, <8 x i32>) 35declare <16 x i32> @llvm.ssub.sat.v16i32(<16 x i32>, <16 x i32>) 36declare <2 x i64> @llvm.ssub.sat.v2i64(<2 x i64>, <2 x i64>) 37declare <4 x i64> @llvm.ssub.sat.v4i64(<4 x i64>, <4 x i64>) 38declare <8 x i64> @llvm.ssub.sat.v8i64(<8 x i64>, <8 x i64>) 39 40declare <4 x i24> @llvm.ssub.sat.v4i24(<4 x i24>, <4 x i24>) 41declare <2 x i128> @llvm.ssub.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: psubsb %xmm1, %xmm0 49; SSE-NEXT: retq 50; 51; AVX-LABEL: v16i8: 52; AVX: # %bb.0: 53; AVX-NEXT: vpsubsb %xmm1, %xmm0, %xmm0 54; AVX-NEXT: retq 55 %z = call <16 x i8> @llvm.ssub.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: psubsb %xmm2, %xmm0 63; SSE-NEXT: psubsb %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: vpsubsb %xmm2, %xmm3, %xmm2 71; AVX1-NEXT: vpsubsb %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: vpsubsb %ymm1, %ymm0, %ymm0 78; AVX2-NEXT: retq 79; 80; AVX512-LABEL: v32i8: 81; AVX512: # %bb.0: 82; AVX512-NEXT: vpsubsb %ymm1, %ymm0, %ymm0 83; AVX512-NEXT: retq 84 %z = call <32 x i8> @llvm.ssub.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: psubsb %xmm4, %xmm0 92; SSE-NEXT: psubsb %xmm5, %xmm1 93; SSE-NEXT: psubsb %xmm6, %xmm2 94; SSE-NEXT: psubsb %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: vpsubsb %xmm4, %xmm5, %xmm4 102; AVX1-NEXT: vpsubsb %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: vpsubsb %xmm2, %xmm4, %xmm2 107; AVX1-NEXT: vpsubsb %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: vpsubsb %ymm2, %ymm0, %ymm0 114; AVX2-NEXT: vpsubsb %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: vpsubsb %ymm2, %ymm3, %ymm2 122; AVX512F-NEXT: vpsubsb %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: vpsubsb %zmm1, %zmm0, %zmm0 129; AVX512BW-NEXT: retq 130 %z = call <64 x i8> @llvm.ssub.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: psubsw %xmm1, %xmm0 138; SSE-NEXT: retq 139; 140; AVX-LABEL: v8i16: 141; AVX: # %bb.0: 142; AVX-NEXT: vpsubsw %xmm1, %xmm0, %xmm0 143; AVX-NEXT: retq 144 %z = call <8 x i16> @llvm.ssub.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: psubsw %xmm2, %xmm0 152; SSE-NEXT: psubsw %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: vpsubsw %xmm2, %xmm3, %xmm2 160; AVX1-NEXT: vpsubsw %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: vpsubsw %ymm1, %ymm0, %ymm0 167; AVX2-NEXT: retq 168; 169; AVX512-LABEL: v16i16: 170; AVX512: # %bb.0: 171; AVX512-NEXT: vpsubsw %ymm1, %ymm0, %ymm0 172; AVX512-NEXT: retq 173 %z = call <16 x i16> @llvm.ssub.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: psubsw %xmm4, %xmm0 181; SSE-NEXT: psubsw %xmm5, %xmm1 182; SSE-NEXT: psubsw %xmm6, %xmm2 183; SSE-NEXT: psubsw %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: vpsubsw %xmm4, %xmm5, %xmm4 191; AVX1-NEXT: vpsubsw %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: vpsubsw %xmm2, %xmm4, %xmm2 196; AVX1-NEXT: vpsubsw %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: vpsubsw %ymm2, %ymm0, %ymm0 203; AVX2-NEXT: vpsubsw %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: vpsubsw %ymm2, %ymm3, %ymm2 211; AVX512F-NEXT: vpsubsw %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: vpsubsw %zmm1, %zmm0, %zmm0 218; AVX512BW-NEXT: retq 219 %z = call <32 x i16> @llvm.ssub.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: psubsb %xmm1, %xmm0 231; SSE-NEXT: movq %xmm0, (%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: vpsubsb %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.ssub.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: psubsb %xmm1, %xmm0 254; SSE-NEXT: movd %xmm0, (%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: vpsubsb %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.ssub.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: psubsb %xmm1, %xmm0 279; SSE2-NEXT: movd %xmm0, %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: psubsb %xmm1, %xmm0 290; SSSE3-NEXT: movd %xmm0, %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: psubsb %xmm1, %xmm0 301; SSE41-NEXT: pextrw $0, %xmm0, (%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: vpsubsb %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.ssub.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: psubsw %xmm1, %xmm0 326; SSE-NEXT: movq %xmm0, (%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: vpsubsw %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.ssub.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: psubsw %xmm1, %xmm0 349; SSE-NEXT: movd %xmm0, (%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: vpsubsw %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.ssub.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: psubsb %xmm1, %xmm0 370; SSE-NEXT: retq 371; 372; AVX-LABEL: v12i8: 373; AVX: # %bb.0: 374; AVX-NEXT: vpsubsb %xmm1, %xmm0, %xmm0 375; AVX-NEXT: retq 376 %z = call <12 x i8> @llvm.ssub.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: psubsw 16(%rsi), %xmm1 386; SSE-NEXT: psubsw (%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: vpsubsw 16(%rsi), %xmm1, %xmm1 396; AVX1-NEXT: vpsubsw (%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: vpsubsw (%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: vpsubsw (%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.ssub.sat.v12i16(<12 x i16> %x, <12 x i16> %y) 423 store <12 x i16> %z, ptr %pz 424 ret void 425} 426 427; Scalarization 428 429define void @v1i8(ptr %px, ptr %py, ptr %pz) nounwind { 430; SSE-LABEL: v1i8: 431; SSE: # %bb.0: 432; SSE-NEXT: movzbl (%rdi), %eax 433; SSE-NEXT: movzbl (%rsi), %ecx 434; SSE-NEXT: xorl %esi, %esi 435; SSE-NEXT: cmpb %cl, %al 436; SSE-NEXT: setns %sil 437; SSE-NEXT: addl $127, %esi 438; SSE-NEXT: subb %cl, %al 439; SSE-NEXT: movzbl %al, %eax 440; SSE-NEXT: cmovol %esi, %eax 441; SSE-NEXT: movb %al, (%rdx) 442; SSE-NEXT: retq 443; 444; AVX-LABEL: v1i8: 445; AVX: # %bb.0: 446; AVX-NEXT: movzbl (%rdi), %eax 447; AVX-NEXT: movzbl (%rsi), %ecx 448; AVX-NEXT: xorl %esi, %esi 449; AVX-NEXT: cmpb %cl, %al 450; AVX-NEXT: setns %sil 451; AVX-NEXT: addl $127, %esi 452; AVX-NEXT: subb %cl, %al 453; AVX-NEXT: movzbl %al, %eax 454; AVX-NEXT: cmovol %esi, %eax 455; AVX-NEXT: movb %al, (%rdx) 456; AVX-NEXT: retq 457 %x = load <1 x i8>, ptr %px 458 %y = load <1 x i8>, ptr %py 459 %z = call <1 x i8> @llvm.ssub.sat.v1i8(<1 x i8> %x, <1 x i8> %y) 460 store <1 x i8> %z, ptr %pz 461 ret void 462} 463 464define void @v1i16(ptr %px, ptr %py, ptr %pz) nounwind { 465; SSE-LABEL: v1i16: 466; SSE: # %bb.0: 467; SSE-NEXT: movzwl (%rdi), %eax 468; SSE-NEXT: movzwl (%rsi), %ecx 469; SSE-NEXT: xorl %esi, %esi 470; SSE-NEXT: cmpw %cx, %ax 471; SSE-NEXT: setns %sil 472; SSE-NEXT: addl $32767, %esi # imm = 0x7FFF 473; SSE-NEXT: subw %cx, %ax 474; SSE-NEXT: cmovol %esi, %eax 475; SSE-NEXT: movw %ax, (%rdx) 476; SSE-NEXT: retq 477; 478; AVX-LABEL: v1i16: 479; AVX: # %bb.0: 480; AVX-NEXT: movzwl (%rdi), %eax 481; AVX-NEXT: movzwl (%rsi), %ecx 482; AVX-NEXT: xorl %esi, %esi 483; AVX-NEXT: cmpw %cx, %ax 484; AVX-NEXT: setns %sil 485; AVX-NEXT: addl $32767, %esi # imm = 0x7FFF 486; AVX-NEXT: subw %cx, %ax 487; AVX-NEXT: cmovol %esi, %eax 488; AVX-NEXT: movw %ax, (%rdx) 489; AVX-NEXT: retq 490 %x = load <1 x i16>, ptr %px 491 %y = load <1 x i16>, ptr %py 492 %z = call <1 x i16> @llvm.ssub.sat.v1i16(<1 x i16> %x, <1 x i16> %y) 493 store <1 x i16> %z, ptr %pz 494 ret void 495} 496 497; Promotion 498 499define <16 x i4> @v16i4(<16 x i4> %x, <16 x i4> %y) nounwind { 500; SSE-LABEL: v16i4: 501; SSE: # %bb.0: 502; SSE-NEXT: psllw $4, %xmm1 503; SSE-NEXT: movdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 504; SSE-NEXT: pand %xmm2, %xmm1 505; SSE-NEXT: psllw $4, %xmm0 506; SSE-NEXT: pand %xmm2, %xmm0 507; SSE-NEXT: psubsb %xmm1, %xmm0 508; SSE-NEXT: psrlw $4, %xmm0 509; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 510; SSE-NEXT: movdqa {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8] 511; SSE-NEXT: pxor %xmm1, %xmm0 512; SSE-NEXT: psubb %xmm1, %xmm0 513; SSE-NEXT: retq 514; 515; AVX1-LABEL: v16i4: 516; AVX1: # %bb.0: 517; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1 518; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 519; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1 520; AVX1-NEXT: vpsllw $4, %xmm0, %xmm0 521; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0 522; AVX1-NEXT: vpsubsb %xmm1, %xmm0, %xmm0 523; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0 524; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 525; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8] 526; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0 527; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm0 528; AVX1-NEXT: retq 529; 530; AVX2-LABEL: v16i4: 531; AVX2: # %bb.0: 532; AVX2-NEXT: vpsllw $4, %xmm1, %xmm1 533; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 534; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1 535; AVX2-NEXT: vpsllw $4, %xmm0, %xmm0 536; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0 537; AVX2-NEXT: vpsubsb %xmm1, %xmm0, %xmm0 538; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm0 539; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 540; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8] 541; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0 542; AVX2-NEXT: vpsubb %xmm1, %xmm0, %xmm0 543; AVX2-NEXT: retq 544; 545; AVX512F-LABEL: v16i4: 546; AVX512F: # %bb.0: 547; AVX512F-NEXT: vpsllw $4, %xmm1, %xmm1 548; AVX512F-NEXT: vpbroadcastb {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 549; AVX512F-NEXT: vpand %xmm2, %xmm1, %xmm1 550; AVX512F-NEXT: vpsllw $4, %xmm0, %xmm0 551; AVX512F-NEXT: vpand %xmm2, %xmm0, %xmm0 552; AVX512F-NEXT: vpsubsb %xmm1, %xmm0, %xmm0 553; AVX512F-NEXT: vpsrlw $4, %xmm0, %xmm0 554; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 555; AVX512F-NEXT: vpbroadcastb {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8] 556; AVX512F-NEXT: vpxor %xmm1, %xmm0, %xmm0 557; AVX512F-NEXT: vpsubb %xmm1, %xmm0, %xmm0 558; AVX512F-NEXT: retq 559; 560; AVX512BW-LABEL: v16i4: 561; AVX512BW: # %bb.0: 562; AVX512BW-NEXT: vpsllw $4, %xmm1, %xmm1 563; AVX512BW-NEXT: vpbroadcastb {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240] 564; AVX512BW-NEXT: vpand %xmm2, %xmm1, %xmm1 565; AVX512BW-NEXT: vpsllw $4, %xmm0, %xmm0 566; AVX512BW-NEXT: vpand %xmm2, %xmm0, %xmm0 567; AVX512BW-NEXT: vpsubsb %xmm1, %xmm0, %xmm0 568; AVX512BW-NEXT: vpsrlw $4, %xmm0, %xmm0 569; AVX512BW-NEXT: vpbroadcastb {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8] 570; AVX512BW-NEXT: vpternlogd {{.*#+}} xmm0 = xmm1 ^ (xmm0 & mem) 571; AVX512BW-NEXT: vpsubb %xmm1, %xmm0, %xmm0 572; AVX512BW-NEXT: retq 573 %z = call <16 x i4> @llvm.ssub.sat.v16i4(<16 x i4> %x, <16 x i4> %y) 574 ret <16 x i4> %z 575} 576 577define <16 x i1> @v16i1(<16 x i1> %x, <16 x i1> %y) nounwind { 578; SSE-LABEL: v16i1: 579; SSE: # %bb.0: 580; SSE-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 581; SSE-NEXT: andps %xmm1, %xmm0 582; SSE-NEXT: retq 583; 584; AVX1-LABEL: v16i1: 585; AVX1: # %bb.0: 586; AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 587; AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0 588; AVX1-NEXT: retq 589; 590; AVX2-LABEL: v16i1: 591; AVX2: # %bb.0: 592; AVX2-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 593; AVX2-NEXT: vandps %xmm1, %xmm0, %xmm0 594; AVX2-NEXT: retq 595; 596; AVX512F-LABEL: v16i1: 597; AVX512F: # %bb.0: 598; AVX512F-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 599; AVX512F-NEXT: vandps %xmm1, %xmm0, %xmm0 600; AVX512F-NEXT: retq 601; 602; AVX512BW-LABEL: v16i1: 603; AVX512BW: # %bb.0: 604; AVX512BW-NEXT: vpternlogd {{.*#+}} xmm0 = xmm0 & (xmm1 ^ mem) 605; AVX512BW-NEXT: retq 606 %z = call <16 x i1> @llvm.ssub.sat.v16i1(<16 x i1> %x, <16 x i1> %y) 607 ret <16 x i1> %z 608} 609 610; Expanded 611 612define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind { 613; SSE2-LABEL: v2i32: 614; SSE2: # %bb.0: 615; SSE2-NEXT: pxor %xmm2, %xmm2 616; SSE2-NEXT: movdqa %xmm0, %xmm3 617; SSE2-NEXT: psubd %xmm1, %xmm3 618; SSE2-NEXT: pcmpgtd %xmm2, %xmm1 619; SSE2-NEXT: pcmpgtd %xmm3, %xmm0 620; SSE2-NEXT: pxor %xmm1, %xmm0 621; SSE2-NEXT: movdqa %xmm0, %xmm1 622; SSE2-NEXT: pandn %xmm3, %xmm1 623; SSE2-NEXT: psrad $31, %xmm3 624; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 625; SSE2-NEXT: pand %xmm3, %xmm0 626; SSE2-NEXT: por %xmm1, %xmm0 627; SSE2-NEXT: retq 628; 629; SSSE3-LABEL: v2i32: 630; SSSE3: # %bb.0: 631; SSSE3-NEXT: pxor %xmm2, %xmm2 632; SSSE3-NEXT: movdqa %xmm0, %xmm3 633; SSSE3-NEXT: psubd %xmm1, %xmm3 634; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1 635; SSSE3-NEXT: pcmpgtd %xmm3, %xmm0 636; SSSE3-NEXT: pxor %xmm1, %xmm0 637; SSSE3-NEXT: movdqa %xmm0, %xmm1 638; SSSE3-NEXT: pandn %xmm3, %xmm1 639; SSSE3-NEXT: psrad $31, %xmm3 640; SSSE3-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 641; SSSE3-NEXT: pand %xmm3, %xmm0 642; SSSE3-NEXT: por %xmm1, %xmm0 643; SSSE3-NEXT: retq 644; 645; SSE41-LABEL: v2i32: 646; SSE41: # %bb.0: 647; SSE41-NEXT: pxor %xmm3, %xmm3 648; SSE41-NEXT: movdqa %xmm0, %xmm2 649; SSE41-NEXT: psubd %xmm1, %xmm2 650; SSE41-NEXT: pcmpgtd %xmm3, %xmm1 651; SSE41-NEXT: pcmpgtd %xmm2, %xmm0 652; SSE41-NEXT: pxor %xmm1, %xmm0 653; SSE41-NEXT: movdqa %xmm2, %xmm1 654; SSE41-NEXT: psrad $31, %xmm1 655; SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 656; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm2 657; SSE41-NEXT: movaps %xmm2, %xmm0 658; SSE41-NEXT: retq 659; 660; AVX1-LABEL: v2i32: 661; AVX1: # %bb.0: 662; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 663; AVX1-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2 664; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1 665; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0 666; AVX1-NEXT: vpxor %xmm0, %xmm2, %xmm0 667; AVX1-NEXT: vpsrad $31, %xmm1, %xmm2 668; AVX1-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 669; AVX1-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0 670; AVX1-NEXT: retq 671; 672; AVX2-LABEL: v2i32: 673; AVX2: # %bb.0: 674; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 675; AVX2-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2 676; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm1 677; AVX2-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0 678; AVX2-NEXT: vpxor %xmm0, %xmm2, %xmm0 679; AVX2-NEXT: vpsrad $31, %xmm1, %xmm2 680; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648] 681; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 682; AVX2-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0 683; AVX2-NEXT: retq 684; 685; AVX512F-LABEL: v2i32: 686; AVX512F: # %bb.0: 687; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 688; AVX512F-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2 689; AVX512F-NEXT: vpsubd %xmm1, %xmm0, %xmm1 690; AVX512F-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0 691; AVX512F-NEXT: vpxor %xmm0, %xmm2, %xmm0 692; AVX512F-NEXT: vpsrad $31, %xmm1, %xmm2 693; AVX512F-NEXT: vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648] 694; AVX512F-NEXT: vpxor %xmm3, %xmm2, %xmm2 695; AVX512F-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0 696; AVX512F-NEXT: retq 697; 698; AVX512BW-LABEL: v2i32: 699; AVX512BW: # %bb.0: 700; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2 701; AVX512BW-NEXT: vpcmpgtd %xmm2, %xmm1, %k0 702; AVX512BW-NEXT: vpsubd %xmm1, %xmm0, %xmm1 703; AVX512BW-NEXT: vpcmpgtd %xmm1, %xmm0, %k1 704; AVX512BW-NEXT: kxorw %k1, %k0, %k1 705; AVX512BW-NEXT: vpsrad $31, %xmm1, %xmm0 706; AVX512BW-NEXT: vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm1 {%k1} 707; AVX512BW-NEXT: vmovdqa %xmm1, %xmm0 708; AVX512BW-NEXT: retq 709 %z = call <2 x i32> @llvm.ssub.sat.v2i32(<2 x i32> %x, <2 x i32> %y) 710 ret <2 x i32> %z 711} 712 713define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind { 714; SSE2-LABEL: v4i32: 715; SSE2: # %bb.0: 716; SSE2-NEXT: pxor %xmm2, %xmm2 717; SSE2-NEXT: movdqa %xmm0, %xmm3 718; SSE2-NEXT: psubd %xmm1, %xmm3 719; SSE2-NEXT: pcmpgtd %xmm2, %xmm1 720; SSE2-NEXT: pcmpgtd %xmm3, %xmm0 721; SSE2-NEXT: pxor %xmm1, %xmm0 722; SSE2-NEXT: movdqa %xmm0, %xmm1 723; SSE2-NEXT: pandn %xmm3, %xmm1 724; SSE2-NEXT: psrad $31, %xmm3 725; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 726; SSE2-NEXT: pand %xmm3, %xmm0 727; SSE2-NEXT: por %xmm1, %xmm0 728; SSE2-NEXT: retq 729; 730; SSSE3-LABEL: v4i32: 731; SSSE3: # %bb.0: 732; SSSE3-NEXT: pxor %xmm2, %xmm2 733; SSSE3-NEXT: movdqa %xmm0, %xmm3 734; SSSE3-NEXT: psubd %xmm1, %xmm3 735; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1 736; SSSE3-NEXT: pcmpgtd %xmm3, %xmm0 737; SSSE3-NEXT: pxor %xmm1, %xmm0 738; SSSE3-NEXT: movdqa %xmm0, %xmm1 739; SSSE3-NEXT: pandn %xmm3, %xmm1 740; SSSE3-NEXT: psrad $31, %xmm3 741; SSSE3-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 742; SSSE3-NEXT: pand %xmm3, %xmm0 743; SSSE3-NEXT: por %xmm1, %xmm0 744; SSSE3-NEXT: retq 745; 746; SSE41-LABEL: v4i32: 747; SSE41: # %bb.0: 748; SSE41-NEXT: pxor %xmm3, %xmm3 749; SSE41-NEXT: movdqa %xmm0, %xmm2 750; SSE41-NEXT: psubd %xmm1, %xmm2 751; SSE41-NEXT: pcmpgtd %xmm3, %xmm1 752; SSE41-NEXT: pcmpgtd %xmm2, %xmm0 753; SSE41-NEXT: pxor %xmm1, %xmm0 754; SSE41-NEXT: movdqa %xmm2, %xmm1 755; SSE41-NEXT: psrad $31, %xmm1 756; SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 757; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm2 758; SSE41-NEXT: movaps %xmm2, %xmm0 759; SSE41-NEXT: retq 760; 761; AVX1-LABEL: v4i32: 762; AVX1: # %bb.0: 763; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 764; AVX1-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2 765; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1 766; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0 767; AVX1-NEXT: vpxor %xmm0, %xmm2, %xmm0 768; AVX1-NEXT: vpsrad $31, %xmm1, %xmm2 769; AVX1-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 770; AVX1-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0 771; AVX1-NEXT: retq 772; 773; AVX2-LABEL: v4i32: 774; AVX2: # %bb.0: 775; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 776; AVX2-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2 777; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm1 778; AVX2-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0 779; AVX2-NEXT: vpxor %xmm0, %xmm2, %xmm0 780; AVX2-NEXT: vpsrad $31, %xmm1, %xmm2 781; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648] 782; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 783; AVX2-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0 784; AVX2-NEXT: retq 785; 786; AVX512F-LABEL: v4i32: 787; AVX512F: # %bb.0: 788; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 789; AVX512F-NEXT: vpcmpgtd %xmm2, %xmm1, %xmm2 790; AVX512F-NEXT: vpsubd %xmm1, %xmm0, %xmm1 791; AVX512F-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0 792; AVX512F-NEXT: vpxor %xmm0, %xmm2, %xmm0 793; AVX512F-NEXT: vpsrad $31, %xmm1, %xmm2 794; AVX512F-NEXT: vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648] 795; AVX512F-NEXT: vpxor %xmm3, %xmm2, %xmm2 796; AVX512F-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0 797; AVX512F-NEXT: retq 798; 799; AVX512BW-LABEL: v4i32: 800; AVX512BW: # %bb.0: 801; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2 802; AVX512BW-NEXT: vpcmpgtd %xmm2, %xmm1, %k0 803; AVX512BW-NEXT: vpsubd %xmm1, %xmm0, %xmm1 804; AVX512BW-NEXT: vpcmpgtd %xmm1, %xmm0, %k1 805; AVX512BW-NEXT: kxorw %k1, %k0, %k1 806; AVX512BW-NEXT: vpsrad $31, %xmm1, %xmm0 807; AVX512BW-NEXT: vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm1 {%k1} 808; AVX512BW-NEXT: vmovdqa %xmm1, %xmm0 809; AVX512BW-NEXT: retq 810 %z = call <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32> %x, <4 x i32> %y) 811 ret <4 x i32> %z 812} 813 814define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind { 815; SSE2-LABEL: v8i32: 816; SSE2: # %bb.0: 817; SSE2-NEXT: pxor %xmm4, %xmm4 818; SSE2-NEXT: movdqa %xmm0, %xmm5 819; SSE2-NEXT: psubd %xmm2, %xmm5 820; SSE2-NEXT: pcmpgtd %xmm4, %xmm2 821; SSE2-NEXT: pcmpgtd %xmm5, %xmm0 822; SSE2-NEXT: pxor %xmm2, %xmm0 823; SSE2-NEXT: movdqa %xmm0, %xmm2 824; SSE2-NEXT: pandn %xmm5, %xmm2 825; SSE2-NEXT: psrad $31, %xmm5 826; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648] 827; SSE2-NEXT: pxor %xmm6, %xmm5 828; SSE2-NEXT: pand %xmm5, %xmm0 829; SSE2-NEXT: por %xmm2, %xmm0 830; SSE2-NEXT: movdqa %xmm1, %xmm2 831; SSE2-NEXT: psubd %xmm3, %xmm2 832; SSE2-NEXT: pcmpgtd %xmm4, %xmm3 833; SSE2-NEXT: pcmpgtd %xmm2, %xmm1 834; SSE2-NEXT: pxor %xmm3, %xmm1 835; SSE2-NEXT: movdqa %xmm1, %xmm3 836; SSE2-NEXT: pandn %xmm2, %xmm3 837; SSE2-NEXT: psrad $31, %xmm2 838; SSE2-NEXT: pxor %xmm6, %xmm2 839; SSE2-NEXT: pand %xmm2, %xmm1 840; SSE2-NEXT: por %xmm3, %xmm1 841; SSE2-NEXT: retq 842; 843; SSSE3-LABEL: v8i32: 844; SSSE3: # %bb.0: 845; SSSE3-NEXT: pxor %xmm4, %xmm4 846; SSSE3-NEXT: movdqa %xmm0, %xmm5 847; SSSE3-NEXT: psubd %xmm2, %xmm5 848; SSSE3-NEXT: pcmpgtd %xmm4, %xmm2 849; SSSE3-NEXT: pcmpgtd %xmm5, %xmm0 850; SSSE3-NEXT: pxor %xmm2, %xmm0 851; SSSE3-NEXT: movdqa %xmm0, %xmm2 852; SSSE3-NEXT: pandn %xmm5, %xmm2 853; SSSE3-NEXT: psrad $31, %xmm5 854; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648] 855; SSSE3-NEXT: pxor %xmm6, %xmm5 856; SSSE3-NEXT: pand %xmm5, %xmm0 857; SSSE3-NEXT: por %xmm2, %xmm0 858; SSSE3-NEXT: movdqa %xmm1, %xmm2 859; SSSE3-NEXT: psubd %xmm3, %xmm2 860; SSSE3-NEXT: pcmpgtd %xmm4, %xmm3 861; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1 862; SSSE3-NEXT: pxor %xmm3, %xmm1 863; SSSE3-NEXT: movdqa %xmm1, %xmm3 864; SSSE3-NEXT: pandn %xmm2, %xmm3 865; SSSE3-NEXT: psrad $31, %xmm2 866; SSSE3-NEXT: pxor %xmm6, %xmm2 867; SSSE3-NEXT: pand %xmm2, %xmm1 868; SSSE3-NEXT: por %xmm3, %xmm1 869; SSSE3-NEXT: retq 870; 871; SSE41-LABEL: v8i32: 872; SSE41: # %bb.0: 873; SSE41-NEXT: movdqa %xmm1, %xmm5 874; SSE41-NEXT: pxor %xmm6, %xmm6 875; SSE41-NEXT: movdqa %xmm0, %xmm4 876; SSE41-NEXT: psubd %xmm2, %xmm4 877; SSE41-NEXT: pcmpgtd %xmm6, %xmm2 878; SSE41-NEXT: pcmpgtd %xmm4, %xmm0 879; SSE41-NEXT: pxor %xmm2, %xmm0 880; SSE41-NEXT: movdqa %xmm4, %xmm1 881; SSE41-NEXT: psrad $31, %xmm1 882; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] 883; SSE41-NEXT: pxor %xmm2, %xmm1 884; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm4 885; SSE41-NEXT: movdqa %xmm5, %xmm1 886; SSE41-NEXT: psubd %xmm3, %xmm1 887; SSE41-NEXT: pcmpgtd %xmm6, %xmm3 888; SSE41-NEXT: pcmpgtd %xmm1, %xmm5 889; SSE41-NEXT: pxor %xmm3, %xmm5 890; SSE41-NEXT: movdqa %xmm1, %xmm3 891; SSE41-NEXT: psrad $31, %xmm3 892; SSE41-NEXT: pxor %xmm2, %xmm3 893; SSE41-NEXT: movdqa %xmm5, %xmm0 894; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm1 895; SSE41-NEXT: movaps %xmm4, %xmm0 896; SSE41-NEXT: retq 897; 898; AVX1-LABEL: v8i32: 899; AVX1: # %bb.0: 900; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 901; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 902; AVX1-NEXT: vpcmpgtd %xmm3, %xmm2, %xmm4 903; AVX1-NEXT: vpcmpgtd %xmm3, %xmm1, %xmm3 904; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3 905; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 906; AVX1-NEXT: vpsubd %xmm2, %xmm4, %xmm2 907; AVX1-NEXT: vpcmpgtd %xmm2, %xmm4, %xmm4 908; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm1 909; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0 910; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 911; AVX1-NEXT: vxorps %ymm0, %ymm3, %ymm0 912; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm3 913; AVX1-NEXT: vpsrad $31, %xmm1, %xmm1 914; AVX1-NEXT: vpsrad $31, %xmm2, %xmm2 915; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 916; AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 917; AVX1-NEXT: vblendvps %ymm0, %ymm1, %ymm3, %ymm0 918; AVX1-NEXT: retq 919; 920; AVX2-LABEL: v8i32: 921; AVX2: # %bb.0: 922; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 923; AVX2-NEXT: vpcmpgtd %ymm2, %ymm1, %ymm2 924; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm1 925; AVX2-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm0 926; AVX2-NEXT: vpxor %ymm0, %ymm2, %ymm0 927; AVX2-NEXT: vpsrad $31, %ymm1, %ymm2 928; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm3 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648] 929; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 930; AVX2-NEXT: vblendvps %ymm0, %ymm2, %ymm1, %ymm0 931; AVX2-NEXT: retq 932; 933; AVX512F-LABEL: v8i32: 934; AVX512F: # %bb.0: 935; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 936; AVX512F-NEXT: vpcmpgtd %ymm2, %ymm1, %ymm2 937; AVX512F-NEXT: vpsubd %ymm1, %ymm0, %ymm1 938; AVX512F-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm0 939; AVX512F-NEXT: vpxor %ymm0, %ymm2, %ymm0 940; AVX512F-NEXT: vpsrad $31, %ymm1, %ymm2 941; AVX512F-NEXT: vpbroadcastd {{.*#+}} ymm3 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648] 942; AVX512F-NEXT: vpxor %ymm3, %ymm2, %ymm2 943; AVX512F-NEXT: vblendvps %ymm0, %ymm2, %ymm1, %ymm0 944; AVX512F-NEXT: retq 945; 946; AVX512BW-LABEL: v8i32: 947; AVX512BW: # %bb.0: 948; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2 949; AVX512BW-NEXT: vpcmpgtd %ymm2, %ymm1, %k0 950; AVX512BW-NEXT: vpsubd %ymm1, %ymm0, %ymm1 951; AVX512BW-NEXT: vpcmpgtd %ymm1, %ymm0, %k1 952; AVX512BW-NEXT: kxorw %k1, %k0, %k1 953; AVX512BW-NEXT: vpsrad $31, %ymm1, %ymm0 954; AVX512BW-NEXT: vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm1 {%k1} 955; AVX512BW-NEXT: vmovdqa %ymm1, %ymm0 956; AVX512BW-NEXT: retq 957 %z = call <8 x i32> @llvm.ssub.sat.v8i32(<8 x i32> %x, <8 x i32> %y) 958 ret <8 x i32> %z 959} 960 961define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind { 962; SSE2-LABEL: v16i32: 963; SSE2: # %bb.0: 964; SSE2-NEXT: pxor %xmm8, %xmm8 965; SSE2-NEXT: movdqa %xmm0, %xmm9 966; SSE2-NEXT: psubd %xmm4, %xmm9 967; SSE2-NEXT: pcmpgtd %xmm8, %xmm4 968; SSE2-NEXT: pcmpgtd %xmm9, %xmm0 969; SSE2-NEXT: pxor %xmm4, %xmm0 970; SSE2-NEXT: movdqa %xmm0, %xmm10 971; SSE2-NEXT: pandn %xmm9, %xmm10 972; SSE2-NEXT: psrad $31, %xmm9 973; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] 974; SSE2-NEXT: pxor %xmm4, %xmm9 975; SSE2-NEXT: pand %xmm9, %xmm0 976; SSE2-NEXT: por %xmm10, %xmm0 977; SSE2-NEXT: movdqa %xmm1, %xmm9 978; SSE2-NEXT: psubd %xmm5, %xmm9 979; SSE2-NEXT: pcmpgtd %xmm8, %xmm5 980; SSE2-NEXT: pcmpgtd %xmm9, %xmm1 981; SSE2-NEXT: pxor %xmm5, %xmm1 982; SSE2-NEXT: movdqa %xmm1, %xmm5 983; SSE2-NEXT: pandn %xmm9, %xmm5 984; SSE2-NEXT: psrad $31, %xmm9 985; SSE2-NEXT: pxor %xmm4, %xmm9 986; SSE2-NEXT: pand %xmm9, %xmm1 987; SSE2-NEXT: por %xmm5, %xmm1 988; SSE2-NEXT: movdqa %xmm2, %xmm5 989; SSE2-NEXT: psubd %xmm6, %xmm5 990; SSE2-NEXT: pcmpgtd %xmm8, %xmm6 991; SSE2-NEXT: pcmpgtd %xmm5, %xmm2 992; SSE2-NEXT: pxor %xmm6, %xmm2 993; SSE2-NEXT: movdqa %xmm2, %xmm6 994; SSE2-NEXT: pandn %xmm5, %xmm6 995; SSE2-NEXT: psrad $31, %xmm5 996; SSE2-NEXT: pxor %xmm4, %xmm5 997; SSE2-NEXT: pand %xmm5, %xmm2 998; SSE2-NEXT: por %xmm6, %xmm2 999; SSE2-NEXT: movdqa %xmm3, %xmm5 1000; SSE2-NEXT: psubd %xmm7, %xmm5 1001; SSE2-NEXT: pcmpgtd %xmm8, %xmm7 1002; SSE2-NEXT: pcmpgtd %xmm5, %xmm3 1003; SSE2-NEXT: pxor %xmm7, %xmm3 1004; SSE2-NEXT: movdqa %xmm3, %xmm6 1005; SSE2-NEXT: pandn %xmm5, %xmm6 1006; SSE2-NEXT: psrad $31, %xmm5 1007; SSE2-NEXT: pxor %xmm4, %xmm5 1008; SSE2-NEXT: pand %xmm5, %xmm3 1009; SSE2-NEXT: por %xmm6, %xmm3 1010; SSE2-NEXT: retq 1011; 1012; SSSE3-LABEL: v16i32: 1013; SSSE3: # %bb.0: 1014; SSSE3-NEXT: pxor %xmm8, %xmm8 1015; SSSE3-NEXT: movdqa %xmm0, %xmm9 1016; SSSE3-NEXT: psubd %xmm4, %xmm9 1017; SSSE3-NEXT: pcmpgtd %xmm8, %xmm4 1018; SSSE3-NEXT: pcmpgtd %xmm9, %xmm0 1019; SSSE3-NEXT: pxor %xmm4, %xmm0 1020; SSSE3-NEXT: movdqa %xmm0, %xmm10 1021; SSSE3-NEXT: pandn %xmm9, %xmm10 1022; SSSE3-NEXT: psrad $31, %xmm9 1023; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] 1024; SSSE3-NEXT: pxor %xmm4, %xmm9 1025; SSSE3-NEXT: pand %xmm9, %xmm0 1026; SSSE3-NEXT: por %xmm10, %xmm0 1027; SSSE3-NEXT: movdqa %xmm1, %xmm9 1028; SSSE3-NEXT: psubd %xmm5, %xmm9 1029; SSSE3-NEXT: pcmpgtd %xmm8, %xmm5 1030; SSSE3-NEXT: pcmpgtd %xmm9, %xmm1 1031; SSSE3-NEXT: pxor %xmm5, %xmm1 1032; SSSE3-NEXT: movdqa %xmm1, %xmm5 1033; SSSE3-NEXT: pandn %xmm9, %xmm5 1034; SSSE3-NEXT: psrad $31, %xmm9 1035; SSSE3-NEXT: pxor %xmm4, %xmm9 1036; SSSE3-NEXT: pand %xmm9, %xmm1 1037; SSSE3-NEXT: por %xmm5, %xmm1 1038; SSSE3-NEXT: movdqa %xmm2, %xmm5 1039; SSSE3-NEXT: psubd %xmm6, %xmm5 1040; SSSE3-NEXT: pcmpgtd %xmm8, %xmm6 1041; SSSE3-NEXT: pcmpgtd %xmm5, %xmm2 1042; SSSE3-NEXT: pxor %xmm6, %xmm2 1043; SSSE3-NEXT: movdqa %xmm2, %xmm6 1044; SSSE3-NEXT: pandn %xmm5, %xmm6 1045; SSSE3-NEXT: psrad $31, %xmm5 1046; SSSE3-NEXT: pxor %xmm4, %xmm5 1047; SSSE3-NEXT: pand %xmm5, %xmm2 1048; SSSE3-NEXT: por %xmm6, %xmm2 1049; SSSE3-NEXT: movdqa %xmm3, %xmm5 1050; SSSE3-NEXT: psubd %xmm7, %xmm5 1051; SSSE3-NEXT: pcmpgtd %xmm8, %xmm7 1052; SSSE3-NEXT: pcmpgtd %xmm5, %xmm3 1053; SSSE3-NEXT: pxor %xmm7, %xmm3 1054; SSSE3-NEXT: movdqa %xmm3, %xmm6 1055; SSSE3-NEXT: pandn %xmm5, %xmm6 1056; SSSE3-NEXT: psrad $31, %xmm5 1057; SSSE3-NEXT: pxor %xmm4, %xmm5 1058; SSSE3-NEXT: pand %xmm5, %xmm3 1059; SSSE3-NEXT: por %xmm6, %xmm3 1060; SSSE3-NEXT: retq 1061; 1062; SSE41-LABEL: v16i32: 1063; SSE41: # %bb.0: 1064; SSE41-NEXT: movdqa %xmm3, %xmm11 1065; SSE41-NEXT: movdqa %xmm2, %xmm10 1066; SSE41-NEXT: movdqa %xmm1, %xmm9 1067; SSE41-NEXT: pxor %xmm12, %xmm12 1068; SSE41-NEXT: movdqa %xmm0, %xmm8 1069; SSE41-NEXT: psubd %xmm4, %xmm8 1070; SSE41-NEXT: pcmpgtd %xmm12, %xmm4 1071; SSE41-NEXT: pcmpgtd %xmm8, %xmm0 1072; SSE41-NEXT: pxor %xmm4, %xmm0 1073; SSE41-NEXT: movdqa %xmm8, %xmm1 1074; SSE41-NEXT: psrad $31, %xmm1 1075; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] 1076; SSE41-NEXT: pxor %xmm4, %xmm1 1077; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm8 1078; SSE41-NEXT: movdqa %xmm9, %xmm1 1079; SSE41-NEXT: psubd %xmm5, %xmm1 1080; SSE41-NEXT: pcmpgtd %xmm12, %xmm5 1081; SSE41-NEXT: pcmpgtd %xmm1, %xmm9 1082; SSE41-NEXT: pxor %xmm5, %xmm9 1083; SSE41-NEXT: movdqa %xmm1, %xmm2 1084; SSE41-NEXT: psrad $31, %xmm2 1085; SSE41-NEXT: pxor %xmm4, %xmm2 1086; SSE41-NEXT: movdqa %xmm9, %xmm0 1087; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm1 1088; SSE41-NEXT: movdqa %xmm10, %xmm2 1089; SSE41-NEXT: psubd %xmm6, %xmm2 1090; SSE41-NEXT: pcmpgtd %xmm12, %xmm6 1091; SSE41-NEXT: pcmpgtd %xmm2, %xmm10 1092; SSE41-NEXT: pxor %xmm6, %xmm10 1093; SSE41-NEXT: movdqa %xmm2, %xmm3 1094; SSE41-NEXT: psrad $31, %xmm3 1095; SSE41-NEXT: pxor %xmm4, %xmm3 1096; SSE41-NEXT: movdqa %xmm10, %xmm0 1097; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm2 1098; SSE41-NEXT: movdqa %xmm11, %xmm3 1099; SSE41-NEXT: psubd %xmm7, %xmm3 1100; SSE41-NEXT: pcmpgtd %xmm12, %xmm7 1101; SSE41-NEXT: pcmpgtd %xmm3, %xmm11 1102; SSE41-NEXT: pxor %xmm7, %xmm11 1103; SSE41-NEXT: movdqa %xmm3, %xmm5 1104; SSE41-NEXT: psrad $31, %xmm5 1105; SSE41-NEXT: pxor %xmm4, %xmm5 1106; SSE41-NEXT: movdqa %xmm11, %xmm0 1107; SSE41-NEXT: blendvps %xmm0, %xmm5, %xmm3 1108; SSE41-NEXT: movaps %xmm8, %xmm0 1109; SSE41-NEXT: retq 1110; 1111; AVX1-LABEL: v16i32: 1112; AVX1: # %bb.0: 1113; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 1114; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5 1115; AVX1-NEXT: vpcmpgtd %xmm5, %xmm4, %xmm6 1116; AVX1-NEXT: vpcmpgtd %xmm5, %xmm2, %xmm7 1117; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm7, %ymm6 1118; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7 1119; AVX1-NEXT: vpsubd %xmm4, %xmm7, %xmm4 1120; AVX1-NEXT: vpcmpgtd %xmm4, %xmm7, %xmm7 1121; AVX1-NEXT: vpsubd %xmm2, %xmm0, %xmm2 1122; AVX1-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm0 1123; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm0, %ymm0 1124; AVX1-NEXT: vxorps %ymm0, %ymm6, %ymm0 1125; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm2, %ymm6 1126; AVX1-NEXT: vpsrad $31, %xmm2, %xmm2 1127; AVX1-NEXT: vpsrad $31, %xmm4, %xmm4 1128; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm2, %ymm2 1129; AVX1-NEXT: vbroadcastss {{.*#+}} ymm4 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648] 1130; AVX1-NEXT: vxorps %ymm4, %ymm2, %ymm2 1131; AVX1-NEXT: vblendvps %ymm0, %ymm2, %ymm6, %ymm0 1132; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2 1133; AVX1-NEXT: vpcmpgtd %xmm5, %xmm2, %xmm6 1134; AVX1-NEXT: vpcmpgtd %xmm5, %xmm3, %xmm5 1135; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm5, %ymm5 1136; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6 1137; AVX1-NEXT: vpsubd %xmm2, %xmm6, %xmm2 1138; AVX1-NEXT: vpcmpgtd %xmm2, %xmm6, %xmm6 1139; AVX1-NEXT: vpsubd %xmm3, %xmm1, %xmm3 1140; AVX1-NEXT: vpcmpgtd %xmm3, %xmm1, %xmm1 1141; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm1, %ymm1 1142; AVX1-NEXT: vxorps %ymm1, %ymm5, %ymm1 1143; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm5 1144; AVX1-NEXT: vpsrad $31, %xmm3, %xmm3 1145; AVX1-NEXT: vpsrad $31, %xmm2, %xmm2 1146; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2 1147; AVX1-NEXT: vxorps %ymm4, %ymm2, %ymm2 1148; AVX1-NEXT: vblendvps %ymm1, %ymm2, %ymm5, %ymm1 1149; AVX1-NEXT: retq 1150; 1151; AVX2-LABEL: v16i32: 1152; AVX2: # %bb.0: 1153; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4 1154; AVX2-NEXT: vpcmpgtd %ymm4, %ymm2, %ymm5 1155; AVX2-NEXT: vpsubd %ymm2, %ymm0, %ymm2 1156; AVX2-NEXT: vpcmpgtd %ymm2, %ymm0, %ymm0 1157; AVX2-NEXT: vpxor %ymm0, %ymm5, %ymm0 1158; AVX2-NEXT: vpsrad $31, %ymm2, %ymm5 1159; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm6 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648] 1160; AVX2-NEXT: vpxor %ymm6, %ymm5, %ymm5 1161; AVX2-NEXT: vblendvps %ymm0, %ymm5, %ymm2, %ymm0 1162; AVX2-NEXT: vpcmpgtd %ymm4, %ymm3, %ymm2 1163; AVX2-NEXT: vpsubd %ymm3, %ymm1, %ymm3 1164; AVX2-NEXT: vpcmpgtd %ymm3, %ymm1, %ymm1 1165; AVX2-NEXT: vpxor %ymm1, %ymm2, %ymm1 1166; AVX2-NEXT: vpsrad $31, %ymm3, %ymm2 1167; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm2 1168; AVX2-NEXT: vblendvps %ymm1, %ymm2, %ymm3, %ymm1 1169; AVX2-NEXT: retq 1170; 1171; AVX512-LABEL: v16i32: 1172; AVX512: # %bb.0: 1173; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2 1174; AVX512-NEXT: vpcmpgtd %zmm2, %zmm1, %k0 1175; AVX512-NEXT: vpsubd %zmm1, %zmm0, %zmm1 1176; AVX512-NEXT: vpcmpgtd %zmm1, %zmm0, %k1 1177; AVX512-NEXT: kxorw %k1, %k0, %k1 1178; AVX512-NEXT: vpsrad $31, %zmm1, %zmm0 1179; AVX512-NEXT: vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm1 {%k1} 1180; AVX512-NEXT: vmovdqa64 %zmm1, %zmm0 1181; AVX512-NEXT: retq 1182 %z = call <16 x i32> @llvm.ssub.sat.v16i32(<16 x i32> %x, <16 x i32> %y) 1183 ret <16 x i32> %z 1184} 1185 1186define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind { 1187; SSE2-LABEL: v2i64: 1188; SSE2: # %bb.0: 1189; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] 1190; SSE2-NEXT: movdqa %xmm0, %xmm3 1191; SSE2-NEXT: pxor %xmm2, %xmm3 1192; SSE2-NEXT: psubq %xmm1, %xmm0 1193; SSE2-NEXT: movdqa %xmm0, %xmm4 1194; SSE2-NEXT: pxor %xmm2, %xmm4 1195; SSE2-NEXT: movdqa %xmm3, %xmm5 1196; SSE2-NEXT: pcmpgtd %xmm4, %xmm5 1197; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 1198; SSE2-NEXT: pcmpeqd %xmm3, %xmm4 1199; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 1200; SSE2-NEXT: pand %xmm6, %xmm3 1201; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 1202; SSE2-NEXT: por %xmm3, %xmm4 1203; SSE2-NEXT: pxor %xmm2, %xmm1 1204; SSE2-NEXT: movdqa %xmm1, %xmm3 1205; SSE2-NEXT: pcmpgtd %xmm2, %xmm3 1206; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2] 1207; SSE2-NEXT: pcmpeqd %xmm2, %xmm1 1208; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1209; SSE2-NEXT: pand %xmm5, %xmm1 1210; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3] 1211; SSE2-NEXT: por %xmm1, %xmm2 1212; SSE2-NEXT: pxor %xmm4, %xmm2 1213; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3] 1214; SSE2-NEXT: psrad $31, %xmm1 1215; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 1216; SSE2-NEXT: pand %xmm2, %xmm1 1217; SSE2-NEXT: pandn %xmm0, %xmm2 1218; SSE2-NEXT: por %xmm2, %xmm1 1219; SSE2-NEXT: movdqa %xmm1, %xmm0 1220; SSE2-NEXT: retq 1221; 1222; SSSE3-LABEL: v2i64: 1223; SSSE3: # %bb.0: 1224; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] 1225; SSSE3-NEXT: movdqa %xmm0, %xmm3 1226; SSSE3-NEXT: pxor %xmm2, %xmm3 1227; SSSE3-NEXT: psubq %xmm1, %xmm0 1228; SSSE3-NEXT: movdqa %xmm0, %xmm4 1229; SSSE3-NEXT: pxor %xmm2, %xmm4 1230; SSSE3-NEXT: movdqa %xmm3, %xmm5 1231; SSSE3-NEXT: pcmpgtd %xmm4, %xmm5 1232; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 1233; SSSE3-NEXT: pcmpeqd %xmm3, %xmm4 1234; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 1235; SSSE3-NEXT: pand %xmm6, %xmm3 1236; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 1237; SSSE3-NEXT: por %xmm3, %xmm4 1238; SSSE3-NEXT: pxor %xmm2, %xmm1 1239; SSSE3-NEXT: movdqa %xmm1, %xmm3 1240; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3 1241; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2] 1242; SSSE3-NEXT: pcmpeqd %xmm2, %xmm1 1243; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1244; SSSE3-NEXT: pand %xmm5, %xmm1 1245; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3] 1246; SSSE3-NEXT: por %xmm1, %xmm2 1247; SSSE3-NEXT: pxor %xmm4, %xmm2 1248; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3] 1249; SSSE3-NEXT: psrad $31, %xmm1 1250; SSSE3-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 1251; SSSE3-NEXT: pand %xmm2, %xmm1 1252; SSSE3-NEXT: pandn %xmm0, %xmm2 1253; SSSE3-NEXT: por %xmm2, %xmm1 1254; SSSE3-NEXT: movdqa %xmm1, %xmm0 1255; SSSE3-NEXT: retq 1256; 1257; SSE41-LABEL: v2i64: 1258; SSE41: # %bb.0: 1259; SSE41-NEXT: movdqa %xmm0, %xmm2 1260; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = [2147483648,2147483648] 1261; SSE41-NEXT: movdqa %xmm2, %xmm3 1262; SSE41-NEXT: pxor %xmm0, %xmm3 1263; SSE41-NEXT: psubq %xmm1, %xmm2 1264; SSE41-NEXT: movdqa %xmm2, %xmm4 1265; SSE41-NEXT: pxor %xmm0, %xmm4 1266; SSE41-NEXT: movdqa %xmm3, %xmm5 1267; SSE41-NEXT: pcmpeqd %xmm4, %xmm5 1268; SSE41-NEXT: pcmpgtd %xmm4, %xmm3 1269; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 1270; SSE41-NEXT: pand %xmm5, %xmm4 1271; SSE41-NEXT: por %xmm3, %xmm4 1272; SSE41-NEXT: pxor %xmm0, %xmm1 1273; SSE41-NEXT: movdqa %xmm1, %xmm5 1274; SSE41-NEXT: pcmpeqd %xmm0, %xmm5 1275; SSE41-NEXT: pcmpgtd %xmm0, %xmm1 1276; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2] 1277; SSE41-NEXT: pand %xmm5, %xmm3 1278; SSE41-NEXT: por %xmm1, %xmm3 1279; SSE41-NEXT: pxor %xmm4, %xmm3 1280; SSE41-NEXT: movapd {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808] 1281; SSE41-NEXT: movdqa %xmm2, %xmm0 1282; SSE41-NEXT: blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 1283; SSE41-NEXT: movdqa %xmm3, %xmm0 1284; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2 1285; SSE41-NEXT: movapd %xmm2, %xmm0 1286; SSE41-NEXT: retq 1287; 1288; AVX1-LABEL: v2i64: 1289; AVX1: # %bb.0: 1290; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1291; AVX1-NEXT: vpcmpgtq %xmm2, %xmm1, %xmm2 1292; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm1 1293; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 1294; AVX1-NEXT: vpxor %xmm0, %xmm2, %xmm0 1295; AVX1-NEXT: vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 1296; AVX1-NEXT: # xmm2 = mem[0,0] 1297; AVX1-NEXT: vblendvpd %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 1298; AVX1-NEXT: vblendvpd %xmm0, %xmm2, %xmm1, %xmm0 1299; AVX1-NEXT: retq 1300; 1301; AVX2-LABEL: v2i64: 1302; AVX2: # %bb.0: 1303; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 1304; AVX2-NEXT: vpcmpgtq %xmm2, %xmm1, %xmm2 1305; AVX2-NEXT: vpsubq %xmm1, %xmm0, %xmm1 1306; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 1307; AVX2-NEXT: vpxor %xmm0, %xmm2, %xmm0 1308; AVX2-NEXT: vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 1309; AVX2-NEXT: # xmm2 = mem[0,0] 1310; AVX2-NEXT: vblendvpd %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 1311; AVX2-NEXT: vblendvpd %xmm0, %xmm2, %xmm1, %xmm0 1312; AVX2-NEXT: retq 1313; 1314; AVX512F-LABEL: v2i64: 1315; AVX512F: # %bb.0: 1316; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 1317; AVX512F-NEXT: vpcmpgtq %xmm2, %xmm1, %xmm2 1318; AVX512F-NEXT: vpsubq %xmm1, %xmm0, %xmm1 1319; AVX512F-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 1320; AVX512F-NEXT: vpxor %xmm0, %xmm2, %xmm0 1321; AVX512F-NEXT: vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 1322; AVX512F-NEXT: # xmm2 = mem[0,0] 1323; AVX512F-NEXT: vblendvpd %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 1324; AVX512F-NEXT: vblendvpd %xmm0, %xmm2, %xmm1, %xmm0 1325; AVX512F-NEXT: retq 1326; 1327; AVX512BW-LABEL: v2i64: 1328; AVX512BW: # %bb.0: 1329; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2 1330; AVX512BW-NEXT: vpcmpgtq %xmm2, %xmm1, %k0 1331; AVX512BW-NEXT: vpsubq %xmm1, %xmm0, %xmm1 1332; AVX512BW-NEXT: vpcmpgtq %xmm1, %xmm0, %k1 1333; AVX512BW-NEXT: kxorw %k1, %k0, %k1 1334; AVX512BW-NEXT: vpcmpgtq %xmm1, %xmm2, %k2 1335; AVX512BW-NEXT: vpbroadcastq {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808] 1336; AVX512BW-NEXT: vpbroadcastq {{.*#+}} xmm0 {%k2} = [9223372036854775807,9223372036854775807] 1337; AVX512BW-NEXT: vmovdqa64 %xmm0, %xmm1 {%k1} 1338; AVX512BW-NEXT: vmovdqa %xmm1, %xmm0 1339; AVX512BW-NEXT: retq 1340 %z = call <2 x i64> @llvm.ssub.sat.v2i64(<2 x i64> %x, <2 x i64> %y) 1341 ret <2 x i64> %z 1342} 1343 1344define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind { 1345; SSE2-LABEL: v4i64: 1346; SSE2: # %bb.0: 1347; SSE2-NEXT: movdqa %xmm0, %xmm4 1348; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483648,2147483648] 1349; SSE2-NEXT: pxor %xmm5, %xmm0 1350; SSE2-NEXT: psubq %xmm2, %xmm4 1351; SSE2-NEXT: movdqa %xmm4, %xmm6 1352; SSE2-NEXT: pxor %xmm5, %xmm6 1353; SSE2-NEXT: movdqa %xmm0, %xmm7 1354; SSE2-NEXT: pcmpgtd %xmm6, %xmm7 1355; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2] 1356; SSE2-NEXT: pcmpeqd %xmm0, %xmm6 1357; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] 1358; SSE2-NEXT: pand %xmm8, %xmm0 1359; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3] 1360; SSE2-NEXT: por %xmm0, %xmm6 1361; SSE2-NEXT: pxor %xmm5, %xmm2 1362; SSE2-NEXT: movdqa %xmm2, %xmm0 1363; SSE2-NEXT: pcmpgtd %xmm5, %xmm0 1364; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[0,0,2,2] 1365; SSE2-NEXT: pcmpeqd %xmm5, %xmm2 1366; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1367; SSE2-NEXT: pand %xmm7, %xmm2 1368; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 1369; SSE2-NEXT: por %xmm2, %xmm7 1370; SSE2-NEXT: pxor %xmm6, %xmm7 1371; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 1372; SSE2-NEXT: psrad $31, %xmm0 1373; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [9223372036854775808,9223372036854775808] 1374; SSE2-NEXT: pxor %xmm6, %xmm0 1375; SSE2-NEXT: pand %xmm7, %xmm0 1376; SSE2-NEXT: pandn %xmm4, %xmm7 1377; SSE2-NEXT: por %xmm7, %xmm0 1378; SSE2-NEXT: movdqa %xmm1, %xmm2 1379; SSE2-NEXT: pxor %xmm5, %xmm2 1380; SSE2-NEXT: psubq %xmm3, %xmm1 1381; SSE2-NEXT: movdqa %xmm1, %xmm4 1382; SSE2-NEXT: pxor %xmm5, %xmm4 1383; SSE2-NEXT: movdqa %xmm2, %xmm7 1384; SSE2-NEXT: pcmpgtd %xmm4, %xmm7 1385; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2] 1386; SSE2-NEXT: pcmpeqd %xmm2, %xmm4 1387; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 1388; SSE2-NEXT: pand %xmm8, %xmm2 1389; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3] 1390; SSE2-NEXT: por %xmm2, %xmm4 1391; SSE2-NEXT: pxor %xmm5, %xmm3 1392; SSE2-NEXT: movdqa %xmm3, %xmm2 1393; SSE2-NEXT: pcmpgtd %xmm5, %xmm2 1394; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm2[0,0,2,2] 1395; SSE2-NEXT: pcmpeqd %xmm5, %xmm3 1396; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 1397; SSE2-NEXT: pand %xmm7, %xmm3 1398; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3] 1399; SSE2-NEXT: por %xmm3, %xmm5 1400; SSE2-NEXT: pxor %xmm4, %xmm5 1401; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] 1402; SSE2-NEXT: psrad $31, %xmm2 1403; SSE2-NEXT: pxor %xmm6, %xmm2 1404; SSE2-NEXT: pand %xmm5, %xmm2 1405; SSE2-NEXT: pandn %xmm1, %xmm5 1406; SSE2-NEXT: por %xmm5, %xmm2 1407; SSE2-NEXT: movdqa %xmm2, %xmm1 1408; SSE2-NEXT: retq 1409; 1410; SSSE3-LABEL: v4i64: 1411; SSSE3: # %bb.0: 1412; SSSE3-NEXT: movdqa %xmm0, %xmm4 1413; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483648,2147483648] 1414; SSSE3-NEXT: pxor %xmm5, %xmm0 1415; SSSE3-NEXT: psubq %xmm2, %xmm4 1416; SSSE3-NEXT: movdqa %xmm4, %xmm6 1417; SSSE3-NEXT: pxor %xmm5, %xmm6 1418; SSSE3-NEXT: movdqa %xmm0, %xmm7 1419; SSSE3-NEXT: pcmpgtd %xmm6, %xmm7 1420; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2] 1421; SSSE3-NEXT: pcmpeqd %xmm0, %xmm6 1422; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] 1423; SSSE3-NEXT: pand %xmm8, %xmm0 1424; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3] 1425; SSSE3-NEXT: por %xmm0, %xmm6 1426; SSSE3-NEXT: pxor %xmm5, %xmm2 1427; SSSE3-NEXT: movdqa %xmm2, %xmm0 1428; SSSE3-NEXT: pcmpgtd %xmm5, %xmm0 1429; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm0[0,0,2,2] 1430; SSSE3-NEXT: pcmpeqd %xmm5, %xmm2 1431; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1432; SSSE3-NEXT: pand %xmm7, %xmm2 1433; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 1434; SSSE3-NEXT: por %xmm2, %xmm7 1435; SSSE3-NEXT: pxor %xmm6, %xmm7 1436; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 1437; SSSE3-NEXT: psrad $31, %xmm0 1438; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [9223372036854775808,9223372036854775808] 1439; SSSE3-NEXT: pxor %xmm6, %xmm0 1440; SSSE3-NEXT: pand %xmm7, %xmm0 1441; SSSE3-NEXT: pandn %xmm4, %xmm7 1442; SSSE3-NEXT: por %xmm7, %xmm0 1443; SSSE3-NEXT: movdqa %xmm1, %xmm2 1444; SSSE3-NEXT: pxor %xmm5, %xmm2 1445; SSSE3-NEXT: psubq %xmm3, %xmm1 1446; SSSE3-NEXT: movdqa %xmm1, %xmm4 1447; SSSE3-NEXT: pxor %xmm5, %xmm4 1448; SSSE3-NEXT: movdqa %xmm2, %xmm7 1449; SSSE3-NEXT: pcmpgtd %xmm4, %xmm7 1450; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2] 1451; SSSE3-NEXT: pcmpeqd %xmm2, %xmm4 1452; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 1453; SSSE3-NEXT: pand %xmm8, %xmm2 1454; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3] 1455; SSSE3-NEXT: por %xmm2, %xmm4 1456; SSSE3-NEXT: pxor %xmm5, %xmm3 1457; SSSE3-NEXT: movdqa %xmm3, %xmm2 1458; SSSE3-NEXT: pcmpgtd %xmm5, %xmm2 1459; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm2[0,0,2,2] 1460; SSSE3-NEXT: pcmpeqd %xmm5, %xmm3 1461; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 1462; SSSE3-NEXT: pand %xmm7, %xmm3 1463; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3] 1464; SSSE3-NEXT: por %xmm3, %xmm5 1465; SSSE3-NEXT: pxor %xmm4, %xmm5 1466; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] 1467; SSSE3-NEXT: psrad $31, %xmm2 1468; SSSE3-NEXT: pxor %xmm6, %xmm2 1469; SSSE3-NEXT: pand %xmm5, %xmm2 1470; SSSE3-NEXT: pandn %xmm1, %xmm5 1471; SSSE3-NEXT: por %xmm5, %xmm2 1472; SSSE3-NEXT: movdqa %xmm2, %xmm1 1473; SSSE3-NEXT: retq 1474; 1475; SSE41-LABEL: v4i64: 1476; SSE41: # %bb.0: 1477; SSE41-NEXT: movdqa %xmm0, %xmm4 1478; SSE41-NEXT: pmovzxdq {{.*#+}} xmm6 = [2147483648,2147483648] 1479; SSE41-NEXT: pxor %xmm6, %xmm0 1480; SSE41-NEXT: psubq %xmm2, %xmm4 1481; SSE41-NEXT: movdqa %xmm4, %xmm5 1482; SSE41-NEXT: pxor %xmm6, %xmm5 1483; SSE41-NEXT: movdqa %xmm0, %xmm7 1484; SSE41-NEXT: pcmpeqd %xmm5, %xmm7 1485; SSE41-NEXT: pcmpgtd %xmm5, %xmm0 1486; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm0[0,0,2,2] 1487; SSE41-NEXT: pand %xmm7, %xmm8 1488; SSE41-NEXT: por %xmm0, %xmm8 1489; SSE41-NEXT: pxor %xmm6, %xmm2 1490; SSE41-NEXT: movdqa %xmm2, %xmm0 1491; SSE41-NEXT: pcmpeqd %xmm6, %xmm0 1492; SSE41-NEXT: pcmpgtd %xmm6, %xmm2 1493; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2] 1494; SSE41-NEXT: pand %xmm0, %xmm5 1495; SSE41-NEXT: por %xmm2, %xmm5 1496; SSE41-NEXT: pxor %xmm8, %xmm5 1497; SSE41-NEXT: movapd {{.*#+}} xmm8 = [9223372036854775807,9223372036854775807] 1498; SSE41-NEXT: movapd {{.*#+}} xmm7 = [9223372036854775808,9223372036854775808] 1499; SSE41-NEXT: movapd %xmm7, %xmm2 1500; SSE41-NEXT: movdqa %xmm4, %xmm0 1501; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm2 1502; SSE41-NEXT: movdqa %xmm5, %xmm0 1503; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4 1504; SSE41-NEXT: movdqa %xmm1, %xmm0 1505; SSE41-NEXT: pxor %xmm6, %xmm0 1506; SSE41-NEXT: psubq %xmm3, %xmm1 1507; SSE41-NEXT: movdqa %xmm1, %xmm2 1508; SSE41-NEXT: pxor %xmm6, %xmm2 1509; SSE41-NEXT: movdqa %xmm0, %xmm5 1510; SSE41-NEXT: pcmpeqd %xmm2, %xmm5 1511; SSE41-NEXT: pcmpgtd %xmm2, %xmm0 1512; SSE41-NEXT: pshufd {{.*#+}} xmm9 = xmm0[0,0,2,2] 1513; SSE41-NEXT: pand %xmm5, %xmm9 1514; SSE41-NEXT: por %xmm0, %xmm9 1515; SSE41-NEXT: pxor %xmm6, %xmm3 1516; SSE41-NEXT: movdqa %xmm3, %xmm0 1517; SSE41-NEXT: pcmpeqd %xmm6, %xmm0 1518; SSE41-NEXT: pcmpgtd %xmm6, %xmm3 1519; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2] 1520; SSE41-NEXT: pand %xmm0, %xmm2 1521; SSE41-NEXT: por %xmm3, %xmm2 1522; SSE41-NEXT: pxor %xmm9, %xmm2 1523; SSE41-NEXT: movdqa %xmm1, %xmm0 1524; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm7 1525; SSE41-NEXT: movdqa %xmm2, %xmm0 1526; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm1 1527; SSE41-NEXT: movapd %xmm4, %xmm0 1528; SSE41-NEXT: retq 1529; 1530; AVX1-LABEL: v4i64: 1531; AVX1: # %bb.0: 1532; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1533; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 1534; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm4 1535; AVX1-NEXT: vpcmpgtq %xmm3, %xmm1, %xmm5 1536; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm5, %ymm4 1537; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 1538; AVX1-NEXT: vpsubq %xmm2, %xmm5, %xmm2 1539; AVX1-NEXT: vpcmpgtq %xmm2, %xmm5, %xmm5 1540; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm1 1541; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 1542; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm0, %ymm0 1543; AVX1-NEXT: vxorpd %ymm0, %ymm4, %ymm0 1544; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm4 1545; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2 1546; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1 1547; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1548; AVX1-NEXT: vxorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 1549; AVX1-NEXT: vblendvpd %ymm0, %ymm1, %ymm4, %ymm0 1550; AVX1-NEXT: retq 1551; 1552; AVX2-LABEL: v4i64: 1553; AVX2: # %bb.0: 1554; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 1555; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3 1556; AVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm1 1557; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm0 1558; AVX2-NEXT: vpxor %ymm0, %ymm3, %ymm0 1559; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm2 1560; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 1561; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 1562; AVX2-NEXT: vblendvpd %ymm0, %ymm2, %ymm1, %ymm0 1563; AVX2-NEXT: retq 1564; 1565; AVX512F-LABEL: v4i64: 1566; AVX512F: # %bb.0: 1567; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 1568; AVX512F-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm2 1569; AVX512F-NEXT: vpsubq %ymm1, %ymm0, %ymm1 1570; AVX512F-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm0 1571; AVX512F-NEXT: vpxor %ymm0, %ymm2, %ymm0 1572; AVX512F-NEXT: vpsraq $63, %zmm1, %zmm2 1573; AVX512F-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 1574; AVX512F-NEXT: vpxor %ymm3, %ymm2, %ymm2 1575; AVX512F-NEXT: vblendvpd %ymm0, %ymm2, %ymm1, %ymm0 1576; AVX512F-NEXT: retq 1577; 1578; AVX512BW-LABEL: v4i64: 1579; AVX512BW: # %bb.0: 1580; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2 1581; AVX512BW-NEXT: vpcmpgtq %ymm2, %ymm1, %k0 1582; AVX512BW-NEXT: vpsubq %ymm1, %ymm0, %ymm1 1583; AVX512BW-NEXT: vpcmpgtq %ymm1, %ymm0, %k1 1584; AVX512BW-NEXT: kxorw %k1, %k0, %k1 1585; AVX512BW-NEXT: vpsraq $63, %ymm1, %ymm0 1586; AVX512BW-NEXT: vpxorq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm1 {%k1} 1587; AVX512BW-NEXT: vmovdqa %ymm1, %ymm0 1588; AVX512BW-NEXT: retq 1589 %z = call <4 x i64> @llvm.ssub.sat.v4i64(<4 x i64> %x, <4 x i64> %y) 1590 ret <4 x i64> %z 1591} 1592 1593define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind { 1594; SSE2-LABEL: v8i64: 1595; SSE2: # %bb.0: 1596; SSE2-NEXT: movdqa %xmm1, %xmm8 1597; SSE2-NEXT: movdqa %xmm0, %xmm1 1598; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [2147483648,2147483648] 1599; SSE2-NEXT: pxor %xmm9, %xmm0 1600; SSE2-NEXT: psubq %xmm4, %xmm1 1601; SSE2-NEXT: movdqa %xmm1, %xmm10 1602; SSE2-NEXT: pxor %xmm9, %xmm10 1603; SSE2-NEXT: movdqa %xmm0, %xmm11 1604; SSE2-NEXT: pcmpgtd %xmm10, %xmm11 1605; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2] 1606; SSE2-NEXT: pcmpeqd %xmm0, %xmm10 1607; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3] 1608; SSE2-NEXT: pand %xmm12, %xmm0 1609; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm11[1,1,3,3] 1610; SSE2-NEXT: por %xmm0, %xmm10 1611; SSE2-NEXT: pxor %xmm9, %xmm4 1612; SSE2-NEXT: movdqa %xmm4, %xmm0 1613; SSE2-NEXT: pcmpgtd %xmm9, %xmm0 1614; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm0[0,0,2,2] 1615; SSE2-NEXT: pcmpeqd %xmm9, %xmm4 1616; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1617; SSE2-NEXT: pand %xmm11, %xmm4 1618; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm0[1,1,3,3] 1619; SSE2-NEXT: por %xmm4, %xmm11 1620; SSE2-NEXT: pxor %xmm10, %xmm11 1621; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 1622; SSE2-NEXT: psrad $31, %xmm0 1623; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [9223372036854775808,9223372036854775808] 1624; SSE2-NEXT: pxor %xmm10, %xmm0 1625; SSE2-NEXT: pand %xmm11, %xmm0 1626; SSE2-NEXT: pandn %xmm1, %xmm11 1627; SSE2-NEXT: por %xmm11, %xmm0 1628; SSE2-NEXT: movdqa %xmm8, %xmm1 1629; SSE2-NEXT: pxor %xmm9, %xmm1 1630; SSE2-NEXT: psubq %xmm5, %xmm8 1631; SSE2-NEXT: movdqa %xmm8, %xmm4 1632; SSE2-NEXT: pxor %xmm9, %xmm4 1633; SSE2-NEXT: movdqa %xmm1, %xmm11 1634; SSE2-NEXT: pcmpgtd %xmm4, %xmm11 1635; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2] 1636; SSE2-NEXT: pcmpeqd %xmm1, %xmm4 1637; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3] 1638; SSE2-NEXT: pand %xmm12, %xmm1 1639; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm11[1,1,3,3] 1640; SSE2-NEXT: por %xmm1, %xmm4 1641; SSE2-NEXT: pxor %xmm9, %xmm5 1642; SSE2-NEXT: movdqa %xmm5, %xmm1 1643; SSE2-NEXT: pcmpgtd %xmm9, %xmm1 1644; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm1[0,0,2,2] 1645; SSE2-NEXT: pcmpeqd %xmm9, %xmm5 1646; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 1647; SSE2-NEXT: pand %xmm11, %xmm5 1648; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm1[1,1,3,3] 1649; SSE2-NEXT: por %xmm5, %xmm11 1650; SSE2-NEXT: pxor %xmm4, %xmm11 1651; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3] 1652; SSE2-NEXT: psrad $31, %xmm1 1653; SSE2-NEXT: pxor %xmm10, %xmm1 1654; SSE2-NEXT: pand %xmm11, %xmm1 1655; SSE2-NEXT: pandn %xmm8, %xmm11 1656; SSE2-NEXT: por %xmm11, %xmm1 1657; SSE2-NEXT: movdqa %xmm2, %xmm4 1658; SSE2-NEXT: pxor %xmm9, %xmm4 1659; SSE2-NEXT: psubq %xmm6, %xmm2 1660; SSE2-NEXT: movdqa %xmm2, %xmm5 1661; SSE2-NEXT: pxor %xmm9, %xmm5 1662; SSE2-NEXT: movdqa %xmm4, %xmm8 1663; SSE2-NEXT: pcmpgtd %xmm5, %xmm8 1664; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm8[0,0,2,2] 1665; SSE2-NEXT: pcmpeqd %xmm4, %xmm5 1666; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 1667; SSE2-NEXT: pand %xmm11, %xmm4 1668; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3] 1669; SSE2-NEXT: por %xmm4, %xmm5 1670; SSE2-NEXT: pxor %xmm9, %xmm6 1671; SSE2-NEXT: movdqa %xmm6, %xmm4 1672; SSE2-NEXT: pcmpgtd %xmm9, %xmm4 1673; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2] 1674; SSE2-NEXT: pcmpeqd %xmm9, %xmm6 1675; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 1676; SSE2-NEXT: pand %xmm8, %xmm6 1677; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm4[1,1,3,3] 1678; SSE2-NEXT: por %xmm6, %xmm8 1679; SSE2-NEXT: pxor %xmm5, %xmm8 1680; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 1681; SSE2-NEXT: psrad $31, %xmm4 1682; SSE2-NEXT: pxor %xmm10, %xmm4 1683; SSE2-NEXT: pand %xmm8, %xmm4 1684; SSE2-NEXT: pandn %xmm2, %xmm8 1685; SSE2-NEXT: por %xmm8, %xmm4 1686; SSE2-NEXT: movdqa %xmm3, %xmm2 1687; SSE2-NEXT: pxor %xmm9, %xmm2 1688; SSE2-NEXT: psubq %xmm7, %xmm3 1689; SSE2-NEXT: movdqa %xmm3, %xmm5 1690; SSE2-NEXT: pxor %xmm9, %xmm5 1691; SSE2-NEXT: movdqa %xmm2, %xmm6 1692; SSE2-NEXT: pcmpgtd %xmm5, %xmm6 1693; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2] 1694; SSE2-NEXT: pcmpeqd %xmm2, %xmm5 1695; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3] 1696; SSE2-NEXT: pand %xmm8, %xmm2 1697; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3] 1698; SSE2-NEXT: por %xmm2, %xmm5 1699; SSE2-NEXT: pxor %xmm9, %xmm7 1700; SSE2-NEXT: movdqa %xmm7, %xmm2 1701; SSE2-NEXT: pcmpgtd %xmm9, %xmm2 1702; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2] 1703; SSE2-NEXT: pcmpeqd %xmm9, %xmm7 1704; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3] 1705; SSE2-NEXT: pand %xmm6, %xmm7 1706; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1707; SSE2-NEXT: por %xmm7, %xmm2 1708; SSE2-NEXT: pxor %xmm5, %xmm2 1709; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3] 1710; SSE2-NEXT: psrad $31, %xmm5 1711; SSE2-NEXT: pxor %xmm10, %xmm5 1712; SSE2-NEXT: pand %xmm2, %xmm5 1713; SSE2-NEXT: pandn %xmm3, %xmm2 1714; SSE2-NEXT: por %xmm2, %xmm5 1715; SSE2-NEXT: movdqa %xmm4, %xmm2 1716; SSE2-NEXT: movdqa %xmm5, %xmm3 1717; SSE2-NEXT: retq 1718; 1719; SSSE3-LABEL: v8i64: 1720; SSSE3: # %bb.0: 1721; SSSE3-NEXT: movdqa %xmm1, %xmm8 1722; SSSE3-NEXT: movdqa %xmm0, %xmm1 1723; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [2147483648,2147483648] 1724; SSSE3-NEXT: pxor %xmm9, %xmm0 1725; SSSE3-NEXT: psubq %xmm4, %xmm1 1726; SSSE3-NEXT: movdqa %xmm1, %xmm10 1727; SSSE3-NEXT: pxor %xmm9, %xmm10 1728; SSSE3-NEXT: movdqa %xmm0, %xmm11 1729; SSSE3-NEXT: pcmpgtd %xmm10, %xmm11 1730; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2] 1731; SSSE3-NEXT: pcmpeqd %xmm0, %xmm10 1732; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3] 1733; SSSE3-NEXT: pand %xmm12, %xmm0 1734; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm11[1,1,3,3] 1735; SSSE3-NEXT: por %xmm0, %xmm10 1736; SSSE3-NEXT: pxor %xmm9, %xmm4 1737; SSSE3-NEXT: movdqa %xmm4, %xmm0 1738; SSSE3-NEXT: pcmpgtd %xmm9, %xmm0 1739; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm0[0,0,2,2] 1740; SSSE3-NEXT: pcmpeqd %xmm9, %xmm4 1741; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1742; SSSE3-NEXT: pand %xmm11, %xmm4 1743; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm0[1,1,3,3] 1744; SSSE3-NEXT: por %xmm4, %xmm11 1745; SSSE3-NEXT: pxor %xmm10, %xmm11 1746; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 1747; SSSE3-NEXT: psrad $31, %xmm0 1748; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [9223372036854775808,9223372036854775808] 1749; SSSE3-NEXT: pxor %xmm10, %xmm0 1750; SSSE3-NEXT: pand %xmm11, %xmm0 1751; SSSE3-NEXT: pandn %xmm1, %xmm11 1752; SSSE3-NEXT: por %xmm11, %xmm0 1753; SSSE3-NEXT: movdqa %xmm8, %xmm1 1754; SSSE3-NEXT: pxor %xmm9, %xmm1 1755; SSSE3-NEXT: psubq %xmm5, %xmm8 1756; SSSE3-NEXT: movdqa %xmm8, %xmm4 1757; SSSE3-NEXT: pxor %xmm9, %xmm4 1758; SSSE3-NEXT: movdqa %xmm1, %xmm11 1759; SSSE3-NEXT: pcmpgtd %xmm4, %xmm11 1760; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2] 1761; SSSE3-NEXT: pcmpeqd %xmm1, %xmm4 1762; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3] 1763; SSSE3-NEXT: pand %xmm12, %xmm1 1764; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm11[1,1,3,3] 1765; SSSE3-NEXT: por %xmm1, %xmm4 1766; SSSE3-NEXT: pxor %xmm9, %xmm5 1767; SSSE3-NEXT: movdqa %xmm5, %xmm1 1768; SSSE3-NEXT: pcmpgtd %xmm9, %xmm1 1769; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm1[0,0,2,2] 1770; SSSE3-NEXT: pcmpeqd %xmm9, %xmm5 1771; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 1772; SSSE3-NEXT: pand %xmm11, %xmm5 1773; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm1[1,1,3,3] 1774; SSSE3-NEXT: por %xmm5, %xmm11 1775; SSSE3-NEXT: pxor %xmm4, %xmm11 1776; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3] 1777; SSSE3-NEXT: psrad $31, %xmm1 1778; SSSE3-NEXT: pxor %xmm10, %xmm1 1779; SSSE3-NEXT: pand %xmm11, %xmm1 1780; SSSE3-NEXT: pandn %xmm8, %xmm11 1781; SSSE3-NEXT: por %xmm11, %xmm1 1782; SSSE3-NEXT: movdqa %xmm2, %xmm4 1783; SSSE3-NEXT: pxor %xmm9, %xmm4 1784; SSSE3-NEXT: psubq %xmm6, %xmm2 1785; SSSE3-NEXT: movdqa %xmm2, %xmm5 1786; SSSE3-NEXT: pxor %xmm9, %xmm5 1787; SSSE3-NEXT: movdqa %xmm4, %xmm8 1788; SSSE3-NEXT: pcmpgtd %xmm5, %xmm8 1789; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm8[0,0,2,2] 1790; SSSE3-NEXT: pcmpeqd %xmm4, %xmm5 1791; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 1792; SSSE3-NEXT: pand %xmm11, %xmm4 1793; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3] 1794; SSSE3-NEXT: por %xmm4, %xmm5 1795; SSSE3-NEXT: pxor %xmm9, %xmm6 1796; SSSE3-NEXT: movdqa %xmm6, %xmm4 1797; SSSE3-NEXT: pcmpgtd %xmm9, %xmm4 1798; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2] 1799; SSSE3-NEXT: pcmpeqd %xmm9, %xmm6 1800; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 1801; SSSE3-NEXT: pand %xmm8, %xmm6 1802; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm4[1,1,3,3] 1803; SSSE3-NEXT: por %xmm6, %xmm8 1804; SSSE3-NEXT: pxor %xmm5, %xmm8 1805; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 1806; SSSE3-NEXT: psrad $31, %xmm4 1807; SSSE3-NEXT: pxor %xmm10, %xmm4 1808; SSSE3-NEXT: pand %xmm8, %xmm4 1809; SSSE3-NEXT: pandn %xmm2, %xmm8 1810; SSSE3-NEXT: por %xmm8, %xmm4 1811; SSSE3-NEXT: movdqa %xmm3, %xmm2 1812; SSSE3-NEXT: pxor %xmm9, %xmm2 1813; SSSE3-NEXT: psubq %xmm7, %xmm3 1814; SSSE3-NEXT: movdqa %xmm3, %xmm5 1815; SSSE3-NEXT: pxor %xmm9, %xmm5 1816; SSSE3-NEXT: movdqa %xmm2, %xmm6 1817; SSSE3-NEXT: pcmpgtd %xmm5, %xmm6 1818; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2] 1819; SSSE3-NEXT: pcmpeqd %xmm2, %xmm5 1820; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3] 1821; SSSE3-NEXT: pand %xmm8, %xmm2 1822; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3] 1823; SSSE3-NEXT: por %xmm2, %xmm5 1824; SSSE3-NEXT: pxor %xmm9, %xmm7 1825; SSSE3-NEXT: movdqa %xmm7, %xmm2 1826; SSSE3-NEXT: pcmpgtd %xmm9, %xmm2 1827; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2] 1828; SSSE3-NEXT: pcmpeqd %xmm9, %xmm7 1829; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3] 1830; SSSE3-NEXT: pand %xmm6, %xmm7 1831; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1832; SSSE3-NEXT: por %xmm7, %xmm2 1833; SSSE3-NEXT: pxor %xmm5, %xmm2 1834; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3] 1835; SSSE3-NEXT: psrad $31, %xmm5 1836; SSSE3-NEXT: pxor %xmm10, %xmm5 1837; SSSE3-NEXT: pand %xmm2, %xmm5 1838; SSSE3-NEXT: pandn %xmm3, %xmm2 1839; SSSE3-NEXT: por %xmm2, %xmm5 1840; SSSE3-NEXT: movdqa %xmm4, %xmm2 1841; SSSE3-NEXT: movdqa %xmm5, %xmm3 1842; SSSE3-NEXT: retq 1843; 1844; SSE41-LABEL: v8i64: 1845; SSE41: # %bb.0: 1846; SSE41-NEXT: movdqa %xmm0, %xmm8 1847; SSE41-NEXT: pmovzxdq {{.*#+}} xmm10 = [2147483648,2147483648] 1848; SSE41-NEXT: pxor %xmm10, %xmm0 1849; SSE41-NEXT: psubq %xmm4, %xmm8 1850; SSE41-NEXT: movdqa %xmm8, %xmm9 1851; SSE41-NEXT: pxor %xmm10, %xmm9 1852; SSE41-NEXT: movdqa %xmm0, %xmm11 1853; SSE41-NEXT: pcmpeqd %xmm9, %xmm11 1854; SSE41-NEXT: pcmpgtd %xmm9, %xmm0 1855; SSE41-NEXT: pshufd {{.*#+}} xmm12 = xmm0[0,0,2,2] 1856; SSE41-NEXT: pand %xmm11, %xmm12 1857; SSE41-NEXT: por %xmm0, %xmm12 1858; SSE41-NEXT: pxor %xmm10, %xmm4 1859; SSE41-NEXT: movdqa %xmm4, %xmm0 1860; SSE41-NEXT: pcmpeqd %xmm10, %xmm0 1861; SSE41-NEXT: pcmpgtd %xmm10, %xmm4 1862; SSE41-NEXT: pshufd {{.*#+}} xmm9 = xmm4[0,0,2,2] 1863; SSE41-NEXT: pand %xmm0, %xmm9 1864; SSE41-NEXT: por %xmm4, %xmm9 1865; SSE41-NEXT: pxor %xmm12, %xmm9 1866; SSE41-NEXT: movapd {{.*#+}} xmm12 = [9223372036854775807,9223372036854775807] 1867; SSE41-NEXT: movapd {{.*#+}} xmm11 = [9223372036854775808,9223372036854775808] 1868; SSE41-NEXT: movapd %xmm11, %xmm4 1869; SSE41-NEXT: movdqa %xmm8, %xmm0 1870; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm4 1871; SSE41-NEXT: movdqa %xmm9, %xmm0 1872; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm8 1873; SSE41-NEXT: movdqa %xmm1, %xmm0 1874; SSE41-NEXT: pxor %xmm10, %xmm0 1875; SSE41-NEXT: psubq %xmm5, %xmm1 1876; SSE41-NEXT: movdqa %xmm1, %xmm4 1877; SSE41-NEXT: pxor %xmm10, %xmm4 1878; SSE41-NEXT: movdqa %xmm0, %xmm9 1879; SSE41-NEXT: pcmpeqd %xmm4, %xmm9 1880; SSE41-NEXT: pcmpgtd %xmm4, %xmm0 1881; SSE41-NEXT: pshufd {{.*#+}} xmm13 = xmm0[0,0,2,2] 1882; SSE41-NEXT: pand %xmm9, %xmm13 1883; SSE41-NEXT: por %xmm0, %xmm13 1884; SSE41-NEXT: pxor %xmm10, %xmm5 1885; SSE41-NEXT: movdqa %xmm5, %xmm0 1886; SSE41-NEXT: pcmpeqd %xmm10, %xmm0 1887; SSE41-NEXT: pcmpgtd %xmm10, %xmm5 1888; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm5[0,0,2,2] 1889; SSE41-NEXT: pand %xmm0, %xmm4 1890; SSE41-NEXT: por %xmm5, %xmm4 1891; SSE41-NEXT: pxor %xmm13, %xmm4 1892; SSE41-NEXT: movapd %xmm11, %xmm5 1893; SSE41-NEXT: movdqa %xmm1, %xmm0 1894; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm5 1895; SSE41-NEXT: movdqa %xmm4, %xmm0 1896; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1 1897; SSE41-NEXT: movdqa %xmm2, %xmm0 1898; SSE41-NEXT: pxor %xmm10, %xmm0 1899; SSE41-NEXT: psubq %xmm6, %xmm2 1900; SSE41-NEXT: movdqa %xmm2, %xmm4 1901; SSE41-NEXT: pxor %xmm10, %xmm4 1902; SSE41-NEXT: movdqa %xmm0, %xmm5 1903; SSE41-NEXT: pcmpeqd %xmm4, %xmm5 1904; SSE41-NEXT: pcmpgtd %xmm4, %xmm0 1905; SSE41-NEXT: pshufd {{.*#+}} xmm9 = xmm0[0,0,2,2] 1906; SSE41-NEXT: pand %xmm5, %xmm9 1907; SSE41-NEXT: por %xmm0, %xmm9 1908; SSE41-NEXT: pxor %xmm10, %xmm6 1909; SSE41-NEXT: movdqa %xmm6, %xmm0 1910; SSE41-NEXT: pcmpeqd %xmm10, %xmm0 1911; SSE41-NEXT: pcmpgtd %xmm10, %xmm6 1912; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2] 1913; SSE41-NEXT: pand %xmm0, %xmm4 1914; SSE41-NEXT: por %xmm6, %xmm4 1915; SSE41-NEXT: pxor %xmm9, %xmm4 1916; SSE41-NEXT: movapd %xmm11, %xmm5 1917; SSE41-NEXT: movdqa %xmm2, %xmm0 1918; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm5 1919; SSE41-NEXT: movdqa %xmm4, %xmm0 1920; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm2 1921; SSE41-NEXT: movdqa %xmm3, %xmm0 1922; SSE41-NEXT: pxor %xmm10, %xmm0 1923; SSE41-NEXT: psubq %xmm7, %xmm3 1924; SSE41-NEXT: movdqa %xmm3, %xmm4 1925; SSE41-NEXT: pxor %xmm10, %xmm4 1926; SSE41-NEXT: movdqa %xmm0, %xmm5 1927; SSE41-NEXT: pcmpeqd %xmm4, %xmm5 1928; SSE41-NEXT: pcmpgtd %xmm4, %xmm0 1929; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[0,0,2,2] 1930; SSE41-NEXT: pand %xmm5, %xmm6 1931; SSE41-NEXT: por %xmm0, %xmm6 1932; SSE41-NEXT: pxor %xmm10, %xmm7 1933; SSE41-NEXT: movdqa %xmm7, %xmm0 1934; SSE41-NEXT: pcmpeqd %xmm10, %xmm0 1935; SSE41-NEXT: pcmpgtd %xmm10, %xmm7 1936; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2] 1937; SSE41-NEXT: pand %xmm0, %xmm4 1938; SSE41-NEXT: por %xmm7, %xmm4 1939; SSE41-NEXT: pxor %xmm6, %xmm4 1940; SSE41-NEXT: movdqa %xmm3, %xmm0 1941; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm11 1942; SSE41-NEXT: movdqa %xmm4, %xmm0 1943; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm3 1944; SSE41-NEXT: movapd %xmm8, %xmm0 1945; SSE41-NEXT: retq 1946; 1947; AVX1-LABEL: v8i64: 1948; AVX1: # %bb.0: 1949; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 1950; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4 1951; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm6 1952; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm7 1953; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm7, %ymm6 1954; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7 1955; AVX1-NEXT: vpsubq %xmm5, %xmm7, %xmm5 1956; AVX1-NEXT: vpcmpgtq %xmm5, %xmm7, %xmm7 1957; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm2 1958; AVX1-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm0 1959; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm0, %ymm0 1960; AVX1-NEXT: vxorpd %ymm0, %ymm6, %ymm0 1961; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm2, %ymm6 1962; AVX1-NEXT: vpcmpgtq %xmm5, %xmm4, %xmm5 1963; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm2 1964; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm2, %ymm2 1965; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm5 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 1966; AVX1-NEXT: vxorpd %ymm5, %ymm2, %ymm2 1967; AVX1-NEXT: vblendvpd %ymm0, %ymm2, %ymm6, %ymm0 1968; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2 1969; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm6 1970; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm7 1971; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm7, %ymm6 1972; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7 1973; AVX1-NEXT: vpsubq %xmm2, %xmm7, %xmm2 1974; AVX1-NEXT: vpcmpgtq %xmm2, %xmm7, %xmm7 1975; AVX1-NEXT: vpsubq %xmm3, %xmm1, %xmm3 1976; AVX1-NEXT: vpcmpgtq %xmm3, %xmm1, %xmm1 1977; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm1, %ymm1 1978; AVX1-NEXT: vxorpd %ymm1, %ymm6, %ymm1 1979; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm6 1980; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm2 1981; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3 1982; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2 1983; AVX1-NEXT: vxorpd %ymm5, %ymm2, %ymm2 1984; AVX1-NEXT: vblendvpd %ymm1, %ymm2, %ymm6, %ymm1 1985; AVX1-NEXT: retq 1986; 1987; AVX2-LABEL: v8i64: 1988; AVX2: # %bb.0: 1989; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4 1990; AVX2-NEXT: vpcmpgtq %ymm4, %ymm2, %ymm5 1991; AVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm2 1992; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm0 1993; AVX2-NEXT: vpxor %ymm0, %ymm5, %ymm0 1994; AVX2-NEXT: vpcmpgtq %ymm2, %ymm4, %ymm5 1995; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm6 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 1996; AVX2-NEXT: vpxor %ymm6, %ymm5, %ymm5 1997; AVX2-NEXT: vblendvpd %ymm0, %ymm5, %ymm2, %ymm0 1998; AVX2-NEXT: vpcmpgtq %ymm4, %ymm3, %ymm2 1999; AVX2-NEXT: vpsubq %ymm3, %ymm1, %ymm3 2000; AVX2-NEXT: vpcmpgtq %ymm3, %ymm1, %ymm1 2001; AVX2-NEXT: vpxor %ymm1, %ymm2, %ymm1 2002; AVX2-NEXT: vpcmpgtq %ymm3, %ymm4, %ymm2 2003; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm2 2004; AVX2-NEXT: vblendvpd %ymm1, %ymm2, %ymm3, %ymm1 2005; AVX2-NEXT: retq 2006; 2007; AVX512-LABEL: v8i64: 2008; AVX512: # %bb.0: 2009; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2 2010; AVX512-NEXT: vpcmpgtq %zmm2, %zmm1, %k0 2011; AVX512-NEXT: vpsubq %zmm1, %zmm0, %zmm1 2012; AVX512-NEXT: vpcmpgtq %zmm1, %zmm0, %k1 2013; AVX512-NEXT: kxorw %k1, %k0, %k1 2014; AVX512-NEXT: vpsraq $63, %zmm1, %zmm0 2015; AVX512-NEXT: vpxorq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm1 {%k1} 2016; AVX512-NEXT: vmovdqa64 %zmm1, %zmm0 2017; AVX512-NEXT: retq 2018 %z = call <8 x i64> @llvm.ssub.sat.v8i64(<8 x i64> %x, <8 x i64> %y) 2019 ret <8 x i64> %z 2020} 2021 2022define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind { 2023; SSE-LABEL: v2i128: 2024; SSE: # %bb.0: 2025; SSE-NEXT: movq %rdi, %rax 2026; SSE-NEXT: subq {{[0-9]+}}(%rsp), %rcx 2027; SSE-NEXT: sbbq {{[0-9]+}}(%rsp), %r8 2028; SSE-NEXT: seto %dil 2029; SSE-NEXT: movq %r8, %r10 2030; SSE-NEXT: sarq $63, %r10 2031; SSE-NEXT: testb %dil, %dil 2032; SSE-NEXT: cmovneq %r10, %rcx 2033; SSE-NEXT: movabsq $-9223372036854775808, %r11 # imm = 0x8000000000000000 2034; SSE-NEXT: xorq %r11, %r10 2035; SSE-NEXT: testb %dil, %dil 2036; SSE-NEXT: cmoveq %r8, %r10 2037; SSE-NEXT: subq %r9, %rsi 2038; SSE-NEXT: sbbq {{[0-9]+}}(%rsp), %rdx 2039; SSE-NEXT: seto %dil 2040; SSE-NEXT: movq %rdx, %r8 2041; SSE-NEXT: sarq $63, %r8 2042; SSE-NEXT: testb %dil, %dil 2043; SSE-NEXT: cmovneq %r8, %rsi 2044; SSE-NEXT: xorq %r11, %r8 2045; SSE-NEXT: testb %dil, %dil 2046; SSE-NEXT: cmoveq %rdx, %r8 2047; SSE-NEXT: movq %rcx, 16(%rax) 2048; SSE-NEXT: movq %rsi, (%rax) 2049; SSE-NEXT: movq %r10, 24(%rax) 2050; SSE-NEXT: movq %r8, 8(%rax) 2051; SSE-NEXT: retq 2052; 2053; AVX-LABEL: v2i128: 2054; AVX: # %bb.0: 2055; AVX-NEXT: movq %rdi, %rax 2056; AVX-NEXT: subq {{[0-9]+}}(%rsp), %rcx 2057; AVX-NEXT: sbbq {{[0-9]+}}(%rsp), %r8 2058; AVX-NEXT: seto %dil 2059; AVX-NEXT: movq %r8, %r10 2060; AVX-NEXT: sarq $63, %r10 2061; AVX-NEXT: testb %dil, %dil 2062; AVX-NEXT: cmovneq %r10, %rcx 2063; AVX-NEXT: movabsq $-9223372036854775808, %r11 # imm = 0x8000000000000000 2064; AVX-NEXT: xorq %r11, %r10 2065; AVX-NEXT: testb %dil, %dil 2066; AVX-NEXT: cmoveq %r8, %r10 2067; AVX-NEXT: subq %r9, %rsi 2068; AVX-NEXT: sbbq {{[0-9]+}}(%rsp), %rdx 2069; AVX-NEXT: seto %dil 2070; AVX-NEXT: movq %rdx, %r8 2071; AVX-NEXT: sarq $63, %r8 2072; AVX-NEXT: testb %dil, %dil 2073; AVX-NEXT: cmovneq %r8, %rsi 2074; AVX-NEXT: xorq %r11, %r8 2075; AVX-NEXT: testb %dil, %dil 2076; AVX-NEXT: cmoveq %rdx, %r8 2077; AVX-NEXT: movq %rcx, 16(%rax) 2078; AVX-NEXT: movq %rsi, (%rax) 2079; AVX-NEXT: movq %r10, 24(%rax) 2080; AVX-NEXT: movq %r8, 8(%rax) 2081; AVX-NEXT: retq 2082 %z = call <2 x i128> @llvm.ssub.sat.v2i128(<2 x i128> %x, <2 x i128> %y) 2083 ret <2 x i128> %z 2084} 2085