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-prefix=SSE --check-prefix=SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE42 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F 7 8; 9; General cases - packing of vector comparison to legal vector result types 10; 11 12define <16 x i8> @vselect_packss_v16i16(<16 x i16> %a0, <16 x i16> %a1, <16 x i8> %a2, <16 x i8> %a3) { 13; SSE2-LABEL: vselect_packss_v16i16: 14; SSE2: # BB#0: 15; SSE2-NEXT: pcmpeqw %xmm3, %xmm1 16; SSE2-NEXT: pcmpeqw %xmm2, %xmm0 17; SSE2-NEXT: packsswb %xmm1, %xmm0 18; SSE2-NEXT: pand %xmm0, %xmm4 19; SSE2-NEXT: pandn %xmm5, %xmm0 20; SSE2-NEXT: por %xmm4, %xmm0 21; SSE2-NEXT: retq 22; 23; SSE42-LABEL: vselect_packss_v16i16: 24; SSE42: # BB#0: 25; SSE42-NEXT: pcmpeqw %xmm3, %xmm1 26; SSE42-NEXT: pcmpeqw %xmm2, %xmm0 27; SSE42-NEXT: packsswb %xmm1, %xmm0 28; SSE42-NEXT: pblendvb %xmm0, %xmm4, %xmm5 29; SSE42-NEXT: movdqa %xmm5, %xmm0 30; SSE42-NEXT: retq 31; 32; AVX1-LABEL: vselect_packss_v16i16: 33; AVX1: # BB#0: 34; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 35; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 36; AVX1-NEXT: vpcmpeqw %xmm4, %xmm5, %xmm4 37; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 38; AVX1-NEXT: vpacksswb %xmm4, %xmm0, %xmm0 39; AVX1-NEXT: vpblendvb %xmm0, %xmm2, %xmm3, %xmm0 40; AVX1-NEXT: vzeroupper 41; AVX1-NEXT: retq 42; 43; AVX2-LABEL: vselect_packss_v16i16: 44; AVX2: # BB#0: 45; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0 46; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 47; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 48; AVX2-NEXT: vpblendvb %xmm0, %xmm2, %xmm3, %xmm0 49; AVX2-NEXT: vzeroupper 50; AVX2-NEXT: retq 51; 52; AVX512-LABEL: vselect_packss_v16i16: 53; AVX512: # BB#0: 54; AVX512-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0 55; AVX512-NEXT: vpmovsxwd %ymm0, %zmm0 56; AVX512-NEXT: vpmovdb %zmm0, %xmm0 57; AVX512-NEXT: vpblendvb %xmm0, %xmm2, %xmm3, %xmm0 58; AVX512-NEXT: vzeroupper 59; AVX512-NEXT: retq 60 %1 = icmp eq <16 x i16> %a0, %a1 61 %2 = sext <16 x i1> %1 to <16 x i8> 62 %3 = and <16 x i8> %2, %a2 63 %4 = xor <16 x i8> %2, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1> 64 %5 = and <16 x i8> %4, %a3 65 %6 = or <16 x i8> %3, %5 66 ret <16 x i8> %6 67} 68 69define <16 x i8> @vselect_packss_v16i32(<16 x i32> %a0, <16 x i32> %a1, <16 x i8> %a2, <16 x i8> %a3) { 70; SSE2-LABEL: vselect_packss_v16i32: 71; SSE2: # BB#0: 72; SSE2-NEXT: pcmpeqd %xmm7, %xmm3 73; SSE2-NEXT: pcmpeqd %xmm6, %xmm2 74; SSE2-NEXT: packssdw %xmm3, %xmm2 75; SSE2-NEXT: pcmpeqd %xmm5, %xmm1 76; SSE2-NEXT: pcmpeqd %xmm4, %xmm0 77; SSE2-NEXT: packssdw %xmm1, %xmm0 78; SSE2-NEXT: packsswb %xmm2, %xmm0 79; SSE2-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm1 80; SSE2-NEXT: pand %xmm0, %xmm1 81; SSE2-NEXT: pandn {{[0-9]+}}(%rsp), %xmm0 82; SSE2-NEXT: por %xmm1, %xmm0 83; SSE2-NEXT: retq 84; 85; SSE42-LABEL: vselect_packss_v16i32: 86; SSE42: # BB#0: 87; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm8 88; SSE42-NEXT: pcmpeqd %xmm7, %xmm3 89; SSE42-NEXT: pcmpeqd %xmm6, %xmm2 90; SSE42-NEXT: packssdw %xmm3, %xmm2 91; SSE42-NEXT: pcmpeqd %xmm5, %xmm1 92; SSE42-NEXT: pcmpeqd %xmm4, %xmm0 93; SSE42-NEXT: packssdw %xmm1, %xmm0 94; SSE42-NEXT: packsswb %xmm2, %xmm0 95; SSE42-NEXT: pblendvb %xmm0, {{[0-9]+}}(%rsp), %xmm8 96; SSE42-NEXT: movdqa %xmm8, %xmm0 97; SSE42-NEXT: retq 98; 99; AVX1-LABEL: vselect_packss_v16i32: 100; AVX1: # BB#0: 101; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm6 102; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7 103; AVX1-NEXT: vpcmpeqd %xmm6, %xmm7, %xmm6 104; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 105; AVX1-NEXT: vpackssdw %xmm6, %xmm1, %xmm1 106; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 107; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 108; AVX1-NEXT: vpcmpeqd %xmm3, %xmm6, %xmm3 109; AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm0 110; AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0 111; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 112; AVX1-NEXT: vpblendvb %xmm0, %xmm4, %xmm5, %xmm0 113; AVX1-NEXT: vzeroupper 114; AVX1-NEXT: retq 115; 116; AVX2-LABEL: vselect_packss_v16i32: 117; AVX2: # BB#0: 118; AVX2-NEXT: vpcmpeqd %ymm3, %ymm1, %ymm1 119; AVX2-NEXT: vpcmpeqd %ymm2, %ymm0, %ymm0 120; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm0 121; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 122; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 123; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 124; AVX2-NEXT: vpand %xmm4, %xmm0, %xmm1 125; AVX2-NEXT: vpandn %xmm5, %xmm0, %xmm0 126; AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0 127; AVX2-NEXT: vzeroupper 128; AVX2-NEXT: retq 129; 130; AVX512-LABEL: vselect_packss_v16i32: 131; AVX512: # BB#0: 132; AVX512-NEXT: vpcmpeqd %zmm1, %zmm0, %k1 133; AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} 134; AVX512-NEXT: vpmovdb %zmm0, %xmm0 135; AVX512-NEXT: vpblendvb %xmm0, %xmm2, %xmm3, %xmm0 136; AVX512-NEXT: vzeroupper 137; AVX512-NEXT: retq 138 %1 = icmp eq <16 x i32> %a0, %a1 139 %2 = sext <16 x i1> %1 to <16 x i8> 140 %3 = and <16 x i8> %2, %a2 141 %4 = xor <16 x i8> %2, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1> 142 %5 = and <16 x i8> %4, %a3 143 %6 = or <16 x i8> %3, %5 144 ret <16 x i8> %6 145} 146 147define <16 x i8> @vselect_packss_v16i64(<16 x i64> %a0, <16 x i64> %a1, <16 x i8> %a2, <16 x i8> %a3) { 148; SSE2-LABEL: vselect_packss_v16i64: 149; SSE2: # BB#0: 150; SSE2-NEXT: pcmpeqd {{[0-9]+}}(%rsp), %xmm7 151; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[1,0,3,2] 152; SSE2-NEXT: pand %xmm7, %xmm8 153; SSE2-NEXT: pcmpeqd {{[0-9]+}}(%rsp), %xmm6 154; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[1,0,3,2] 155; SSE2-NEXT: pand %xmm6, %xmm7 156; SSE2-NEXT: packssdw %xmm8, %xmm7 157; SSE2-NEXT: pcmpeqd {{[0-9]+}}(%rsp), %xmm5 158; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[1,0,3,2] 159; SSE2-NEXT: pand %xmm5, %xmm6 160; SSE2-NEXT: pcmpeqd {{[0-9]+}}(%rsp), %xmm4 161; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,0,3,2] 162; SSE2-NEXT: pand %xmm4, %xmm5 163; SSE2-NEXT: packssdw %xmm6, %xmm5 164; SSE2-NEXT: packssdw %xmm7, %xmm5 165; SSE2-NEXT: pcmpeqd {{[0-9]+}}(%rsp), %xmm3 166; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,0,3,2] 167; SSE2-NEXT: pand %xmm3, %xmm4 168; SSE2-NEXT: pcmpeqd {{[0-9]+}}(%rsp), %xmm2 169; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2] 170; SSE2-NEXT: pand %xmm2, %xmm3 171; SSE2-NEXT: packssdw %xmm4, %xmm3 172; SSE2-NEXT: pcmpeqd {{[0-9]+}}(%rsp), %xmm1 173; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,0,3,2] 174; SSE2-NEXT: pand %xmm1, %xmm2 175; SSE2-NEXT: pcmpeqd {{[0-9]+}}(%rsp), %xmm0 176; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2] 177; SSE2-NEXT: pand %xmm0, %xmm1 178; SSE2-NEXT: packssdw %xmm2, %xmm1 179; SSE2-NEXT: packssdw %xmm3, %xmm1 180; SSE2-NEXT: packsswb %xmm5, %xmm1 181; SSE2-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm0 182; SSE2-NEXT: pand %xmm1, %xmm0 183; SSE2-NEXT: pandn {{[0-9]+}}(%rsp), %xmm1 184; SSE2-NEXT: por %xmm0, %xmm1 185; SSE2-NEXT: movdqa %xmm1, %xmm0 186; SSE2-NEXT: retq 187; 188; SSE42-LABEL: vselect_packss_v16i64: 189; SSE42: # BB#0: 190; SSE42-NEXT: pcmpeqq {{[0-9]+}}(%rsp), %xmm7 191; SSE42-NEXT: pcmpeqq {{[0-9]+}}(%rsp), %xmm6 192; SSE42-NEXT: packssdw %xmm7, %xmm6 193; SSE42-NEXT: pcmpeqq {{[0-9]+}}(%rsp), %xmm5 194; SSE42-NEXT: pcmpeqq {{[0-9]+}}(%rsp), %xmm4 195; SSE42-NEXT: packssdw %xmm5, %xmm4 196; SSE42-NEXT: packssdw %xmm6, %xmm4 197; SSE42-NEXT: pcmpeqq {{[0-9]+}}(%rsp), %xmm3 198; SSE42-NEXT: pcmpeqq {{[0-9]+}}(%rsp), %xmm2 199; SSE42-NEXT: packssdw %xmm3, %xmm2 200; SSE42-NEXT: pcmpeqq {{[0-9]+}}(%rsp), %xmm1 201; SSE42-NEXT: pcmpeqq {{[0-9]+}}(%rsp), %xmm0 202; SSE42-NEXT: packssdw %xmm1, %xmm0 203; SSE42-NEXT: packssdw %xmm2, %xmm0 204; SSE42-NEXT: packsswb %xmm4, %xmm0 205; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm1 206; SSE42-NEXT: pand %xmm0, %xmm1 207; SSE42-NEXT: pandn {{[0-9]+}}(%rsp), %xmm0 208; SSE42-NEXT: por %xmm1, %xmm0 209; SSE42-NEXT: retq 210; 211; AVX1-LABEL: vselect_packss_v16i64: 212; AVX1: # BB#0: 213; AVX1-NEXT: vextractf128 $1, %ymm7, %xmm8 214; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm9 215; AVX1-NEXT: vpcmpeqq %xmm8, %xmm9, %xmm8 216; AVX1-NEXT: vpcmpeqq %xmm7, %xmm3, %xmm3 217; AVX1-NEXT: vpackssdw %xmm8, %xmm3, %xmm8 218; AVX1-NEXT: vextractf128 $1, %ymm6, %xmm7 219; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 220; AVX1-NEXT: vpcmpeqq %xmm7, %xmm3, %xmm3 221; AVX1-NEXT: vpcmpeqq %xmm6, %xmm2, %xmm2 222; AVX1-NEXT: vpackssdw %xmm3, %xmm2, %xmm2 223; AVX1-NEXT: vpackssdw %xmm8, %xmm2, %xmm2 224; AVX1-NEXT: vextractf128 $1, %ymm5, %xmm3 225; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6 226; AVX1-NEXT: vpcmpeqq %xmm3, %xmm6, %xmm3 227; AVX1-NEXT: vpcmpeqq %xmm5, %xmm1, %xmm1 228; AVX1-NEXT: vpackssdw %xmm3, %xmm1, %xmm1 229; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm3 230; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 231; AVX1-NEXT: vpcmpeqq %xmm3, %xmm5, %xmm3 232; AVX1-NEXT: vpcmpeqq %xmm4, %xmm0, %xmm0 233; AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0 234; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 235; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm0 236; AVX1-NEXT: vpand {{[0-9]+}}(%rsp), %xmm0, %xmm1 237; AVX1-NEXT: vpandn {{[0-9]+}}(%rsp), %xmm0, %xmm0 238; AVX1-NEXT: vpor %xmm0, %xmm1, %xmm0 239; AVX1-NEXT: vzeroupper 240; AVX1-NEXT: retq 241; 242; AVX2-LABEL: vselect_packss_v16i64: 243; AVX2: # BB#0: 244; AVX2-NEXT: vpcmpeqq %ymm7, %ymm3, %ymm3 245; AVX2-NEXT: vpcmpeqq %ymm6, %ymm2, %ymm2 246; AVX2-NEXT: vpackssdw %ymm3, %ymm2, %ymm2 247; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,1,3] 248; AVX2-NEXT: vpcmpeqq %ymm5, %ymm1, %ymm1 249; AVX2-NEXT: vpcmpeqq %ymm4, %ymm0, %ymm0 250; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0 251; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 252; AVX2-NEXT: vpacksswb %ymm2, %ymm0, %ymm0 253; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 254; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 255; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 256; AVX2-NEXT: vpand {{[0-9]+}}(%rsp), %xmm0, %xmm1 257; AVX2-NEXT: vpandn {{[0-9]+}}(%rsp), %xmm0, %xmm0 258; AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0 259; AVX2-NEXT: vzeroupper 260; AVX2-NEXT: retq 261; 262; AVX512-LABEL: vselect_packss_v16i64: 263; AVX512: # BB#0: 264; AVX512-NEXT: vextracti32x4 $3, %zmm2, %xmm6 265; AVX512-NEXT: vpextrq $1, %xmm6, %rcx 266; AVX512-NEXT: vextracti32x4 $3, %zmm0, %xmm7 267; AVX512-NEXT: vpextrq $1, %xmm7, %rdx 268; AVX512-NEXT: xorl %eax, %eax 269; AVX512-NEXT: cmpq %rcx, %rdx 270; AVX512-NEXT: movq $-1, %rcx 271; AVX512-NEXT: movl $0, %edx 272; AVX512-NEXT: cmoveq %rcx, %rdx 273; AVX512-NEXT: vmovq %rdx, %xmm8 274; AVX512-NEXT: vmovq %xmm6, %rdx 275; AVX512-NEXT: vmovq %xmm7, %rsi 276; AVX512-NEXT: cmpq %rdx, %rsi 277; AVX512-NEXT: movl $0, %edx 278; AVX512-NEXT: cmoveq %rcx, %rdx 279; AVX512-NEXT: vmovq %rdx, %xmm6 280; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm8 = xmm6[0],xmm8[0] 281; AVX512-NEXT: vextracti32x4 $2, %zmm2, %xmm7 282; AVX512-NEXT: vpextrq $1, %xmm7, %rdx 283; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm6 284; AVX512-NEXT: vpextrq $1, %xmm6, %rsi 285; AVX512-NEXT: cmpq %rdx, %rsi 286; AVX512-NEXT: movl $0, %edx 287; AVX512-NEXT: cmoveq %rcx, %rdx 288; AVX512-NEXT: vmovq %rdx, %xmm9 289; AVX512-NEXT: vmovq %xmm7, %rdx 290; AVX512-NEXT: vmovq %xmm6, %rsi 291; AVX512-NEXT: cmpq %rdx, %rsi 292; AVX512-NEXT: movl $0, %edx 293; AVX512-NEXT: cmoveq %rcx, %rdx 294; AVX512-NEXT: vmovq %rdx, %xmm6 295; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm6 = xmm6[0],xmm9[0] 296; AVX512-NEXT: vinserti128 $1, %xmm8, %ymm6, %ymm8 297; AVX512-NEXT: vextracti128 $1, %ymm2, %xmm7 298; AVX512-NEXT: vpextrq $1, %xmm7, %rdx 299; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm6 300; AVX512-NEXT: vpextrq $1, %xmm6, %rsi 301; AVX512-NEXT: cmpq %rdx, %rsi 302; AVX512-NEXT: movl $0, %edx 303; AVX512-NEXT: cmoveq %rcx, %rdx 304; AVX512-NEXT: vmovq %rdx, %xmm9 305; AVX512-NEXT: vmovq %xmm7, %rdx 306; AVX512-NEXT: vmovq %xmm6, %rsi 307; AVX512-NEXT: cmpq %rdx, %rsi 308; AVX512-NEXT: movl $0, %edx 309; AVX512-NEXT: cmoveq %rcx, %rdx 310; AVX512-NEXT: vmovq %rdx, %xmm6 311; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm6 = xmm6[0],xmm9[0] 312; AVX512-NEXT: vpextrq $1, %xmm2, %rdx 313; AVX512-NEXT: vpextrq $1, %xmm0, %rsi 314; AVX512-NEXT: cmpq %rdx, %rsi 315; AVX512-NEXT: movl $0, %edx 316; AVX512-NEXT: cmoveq %rcx, %rdx 317; AVX512-NEXT: vmovq %rdx, %xmm7 318; AVX512-NEXT: vmovq %xmm2, %rdx 319; AVX512-NEXT: vmovq %xmm0, %rsi 320; AVX512-NEXT: cmpq %rdx, %rsi 321; AVX512-NEXT: movl $0, %edx 322; AVX512-NEXT: cmoveq %rcx, %rdx 323; AVX512-NEXT: vmovq %rdx, %xmm0 324; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm7[0] 325; AVX512-NEXT: vinserti128 $1, %xmm6, %ymm0, %ymm0 326; AVX512-NEXT: vinserti64x4 $1, %ymm8, %zmm0, %zmm0 327; AVX512-NEXT: vpmovqd %zmm0, %ymm8 328; AVX512-NEXT: vextracti32x4 $3, %zmm3, %xmm2 329; AVX512-NEXT: vpextrq $1, %xmm2, %rdx 330; AVX512-NEXT: vextracti32x4 $3, %zmm1, %xmm6 331; AVX512-NEXT: vpextrq $1, %xmm6, %rsi 332; AVX512-NEXT: cmpq %rdx, %rsi 333; AVX512-NEXT: movl $0, %edx 334; AVX512-NEXT: cmoveq %rcx, %rdx 335; AVX512-NEXT: vmovq %rdx, %xmm7 336; AVX512-NEXT: vmovq %xmm2, %rdx 337; AVX512-NEXT: vmovq %xmm6, %rsi 338; AVX512-NEXT: cmpq %rdx, %rsi 339; AVX512-NEXT: movl $0, %edx 340; AVX512-NEXT: cmoveq %rcx, %rdx 341; AVX512-NEXT: vmovq %rdx, %xmm2 342; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm7[0] 343; AVX512-NEXT: vextracti32x4 $2, %zmm3, %xmm6 344; AVX512-NEXT: vpextrq $1, %xmm6, %rdx 345; AVX512-NEXT: vextracti32x4 $2, %zmm1, %xmm7 346; AVX512-NEXT: vpextrq $1, %xmm7, %rsi 347; AVX512-NEXT: cmpq %rdx, %rsi 348; AVX512-NEXT: movl $0, %edx 349; AVX512-NEXT: cmoveq %rcx, %rdx 350; AVX512-NEXT: vmovq %rdx, %xmm0 351; AVX512-NEXT: vmovq %xmm6, %rdx 352; AVX512-NEXT: vmovq %xmm7, %rsi 353; AVX512-NEXT: cmpq %rdx, %rsi 354; AVX512-NEXT: movl $0, %edx 355; AVX512-NEXT: cmoveq %rcx, %rdx 356; AVX512-NEXT: vmovq %rdx, %xmm6 357; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm6[0],xmm0[0] 358; AVX512-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm2 359; AVX512-NEXT: vextracti128 $1, %ymm3, %xmm0 360; AVX512-NEXT: vpextrq $1, %xmm0, %rdx 361; AVX512-NEXT: vextracti128 $1, %ymm1, %xmm6 362; AVX512-NEXT: vpextrq $1, %xmm6, %rsi 363; AVX512-NEXT: cmpq %rdx, %rsi 364; AVX512-NEXT: movl $0, %edx 365; AVX512-NEXT: cmoveq %rcx, %rdx 366; AVX512-NEXT: vmovq %rdx, %xmm7 367; AVX512-NEXT: vmovq %xmm0, %rdx 368; AVX512-NEXT: vmovq %xmm6, %rsi 369; AVX512-NEXT: cmpq %rdx, %rsi 370; AVX512-NEXT: movl $0, %edx 371; AVX512-NEXT: cmoveq %rcx, %rdx 372; AVX512-NEXT: vmovq %rdx, %xmm0 373; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm7[0] 374; AVX512-NEXT: vpextrq $1, %xmm3, %rdx 375; AVX512-NEXT: vpextrq $1, %xmm1, %rsi 376; AVX512-NEXT: cmpq %rdx, %rsi 377; AVX512-NEXT: movl $0, %edx 378; AVX512-NEXT: cmoveq %rcx, %rdx 379; AVX512-NEXT: vmovq %rdx, %xmm6 380; AVX512-NEXT: vmovq %xmm3, %rdx 381; AVX512-NEXT: vmovq %xmm1, %rsi 382; AVX512-NEXT: cmpq %rdx, %rsi 383; AVX512-NEXT: cmoveq %rcx, %rax 384; AVX512-NEXT: vmovq %rax, %xmm1 385; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm6[0] 386; AVX512-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 387; AVX512-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm0 388; AVX512-NEXT: vpmovqd %zmm0, %ymm0 389; AVX512-NEXT: vinserti64x4 $1, %ymm0, %zmm8, %zmm0 390; AVX512-NEXT: vpmovdb %zmm0, %xmm0 391; AVX512-NEXT: vpblendvb %xmm0, %xmm4, %xmm5, %xmm0 392; AVX512-NEXT: vzeroupper 393; AVX512-NEXT: retq 394 %1 = icmp eq <16 x i64> %a0, %a1 395 %2 = sext <16 x i1> %1 to <16 x i8> 396 %3 = and <16 x i8> %2, %a2 397 %4 = xor <16 x i8> %2, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1> 398 %5 = and <16 x i8> %4, %a3 399 %6 = or <16 x i8> %3, %5 400 ret <16 x i8> %6 401} 402 403; 404; PACKSS case 405; 406 407define <16 x i8> @vselect_packss(<16 x i16> %a0, <16 x i16> %a1, <16 x i8> %a2, <16 x i8> %a3) { 408; SSE2-LABEL: vselect_packss: 409; SSE2: # BB#0: 410; SSE2-NEXT: pcmpeqw %xmm3, %xmm1 411; SSE2-NEXT: pcmpeqw %xmm2, %xmm0 412; SSE2-NEXT: packsswb %xmm1, %xmm0 413; SSE2-NEXT: pand %xmm0, %xmm4 414; SSE2-NEXT: pandn %xmm5, %xmm0 415; SSE2-NEXT: por %xmm4, %xmm0 416; SSE2-NEXT: retq 417; 418; SSE42-LABEL: vselect_packss: 419; SSE42: # BB#0: 420; SSE42-NEXT: pcmpeqw %xmm3, %xmm1 421; SSE42-NEXT: pcmpeqw %xmm2, %xmm0 422; SSE42-NEXT: packsswb %xmm1, %xmm0 423; SSE42-NEXT: pblendvb %xmm0, %xmm4, %xmm5 424; SSE42-NEXT: movdqa %xmm5, %xmm0 425; SSE42-NEXT: retq 426; 427; AVX1-LABEL: vselect_packss: 428; AVX1: # BB#0: 429; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 430; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 431; AVX1-NEXT: vpcmpeqw %xmm4, %xmm5, %xmm4 432; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 433; AVX1-NEXT: vpacksswb %xmm4, %xmm0, %xmm0 434; AVX1-NEXT: vpblendvb %xmm0, %xmm2, %xmm3, %xmm0 435; AVX1-NEXT: vzeroupper 436; AVX1-NEXT: retq 437; 438; AVX2-LABEL: vselect_packss: 439; AVX2: # BB#0: 440; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0 441; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 442; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 443; AVX2-NEXT: vpblendvb %xmm0, %xmm2, %xmm3, %xmm0 444; AVX2-NEXT: vzeroupper 445; AVX2-NEXT: retq 446; 447; AVX512-LABEL: vselect_packss: 448; AVX512: # BB#0: 449; AVX512-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0 450; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 451; AVX512-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 452; AVX512-NEXT: vpblendvb %xmm0, %xmm2, %xmm3, %xmm0 453; AVX512-NEXT: vzeroupper 454; AVX512-NEXT: retq 455 %1 = icmp eq <16 x i16> %a0, %a1 456 %2 = sext <16 x i1> %1 to <16 x i16> 457 %3 = shufflevector <16 x i16> %2, <16 x i16> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 458 %4 = shufflevector <16 x i16> %2, <16 x i16> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 459 %5 = tail call <16 x i8> @llvm.x86.sse2.packsswb.128(<8 x i16> %3, <8 x i16> %4) 460 %6 = and <16 x i8> %5, %a2 461 %7 = xor <16 x i8> %5, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1> 462 %8 = and <16 x i8> %7, %a3 463 %9 = or <16 x i8> %6, %8 464 ret <16 x i8> %9 465} 466declare <16 x i8> @llvm.x86.sse2.packsswb.128(<8 x i16>, <8 x i16>) 467