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