Index: lib/Target/X86/X86ISelLowering.h =================================================================== --- lib/Target/X86/X86ISelLowering.h +++ lib/Target/X86/X86ISelLowering.h @@ -498,6 +498,9 @@ COMPRESS, EXPAND, + // Bits shuffle + VPSHUFBITQMB, + // Convert Unsigned/Integer to Floating-Point Value with rounding mode. SINT_TO_FP_RND, UINT_TO_FP_RND, SCALAR_SINT_TO_FP_RND, SCALAR_UINT_TO_FP_RND, Index: lib/Target/X86/X86ISelLowering.cpp =================================================================== --- lib/Target/X86/X86ISelLowering.cpp +++ lib/Target/X86/X86ISelLowering.cpp @@ -24912,6 +24912,7 @@ case X86ISD::CVTS2UI_RND: return "X86ISD::CVTS2UI_RND"; case X86ISD::LWPINS: return "X86ISD::LWPINS"; case X86ISD::MGATHER: return "X86ISD::MGATHER"; + case X86ISD::VPSHUFBITQMB: return "X86ISD::VPSHUFBITQMB"; } return nullptr; } Index: lib/Target/X86/X86InstrAVX512.td =================================================================== --- lib/Target/X86/X86InstrAVX512.td +++ lib/Target/X86/X86InstrAVX512.td @@ -9809,7 +9809,6 @@ // Bit Algorithms //===----------------------------------------------------------------------===// - defm VPOPCNTB : avx512_unary_rm_vl<0x54, "vpopcntb", ctpop, avx512vl_i8_info, HasBITALG>, avx512_unary_lowering; @@ -9817,3 +9816,30 @@ avx512vl_i16_info, HasBITALG>, avx512_unary_lowering, VEX_W; +multiclass VPSHUFBITQMB_rm { + defm rr : AVX512_maskable_cmp<0x8F, MRMSrcReg, VTI, (outs VTI.KRC:$dst), + (ins VTI.RC:$src1, VTI.RC:$src2), + "vpshufbitqmb", + "$src2, $src1", "$src1, $src2", + (X86Vpshufbitqmb (VTI.VT VTI.RC:$src1), + (VTI.VT VTI.RC:$src2))>, EVEX_4V, T8PD; + defm rm : AVX512_maskable_cmp<0x8F, MRMSrcMem, VTI, (outs VTI.KRC:$dst), + (ins VTI.RC:$src1, VTI.MemOp:$src2), + "vpshufbitqmb", + "$src2, $src1", "$src1, $src2", + (X86Vpshufbitqmb (VTI.VT VTI.RC:$src1), + (VTI.VT (bitconvert (VTI.LdFrag addr:$src2))))>, + EVEX_4V, EVEX_CD8<8, CD8VF>, T8PD; +} + +multiclass VPSHUFBITQMB_common { + let Predicates = [HasBITALG] in + defm Z : VPSHUFBITQMB_rm, EVEX_V512; + let Predicates = [HasBITALG, HasVLX] in { + defm Z256 : VPSHUFBITQMB_rm, EVEX_V256; + defm Z128 : VPSHUFBITQMB_rm, EVEX_V128; + } +} + +defm VPSHUFBITQMB : VPSHUFBITQMB_common; + Index: lib/Target/X86/X86InstrFragmentsSIMD.td =================================================================== --- lib/Target/X86/X86InstrFragmentsSIMD.td +++ lib/Target/X86/X86InstrFragmentsSIMD.td @@ -524,6 +524,12 @@ def X86expand : SDNode<"X86ISD::EXPAND", SDTypeProfile<1, 1, [SDTCisSameAs<0, 1>, SDTCisVec<1>]>, []>; +// vpshufbitqmb +def X86Vpshufbitqmb : SDNode<"X86ISD::VPSHUFBITQMB", + SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>, + SDTCisSameAs<1,2>, + SDTCVecEltisVT<0,i1>]>>; + def SDTintToFPRound: SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisFP<0>, SDTCisSameAs<0,1>, SDTCisInt<2>, SDTCisVT<3, i32>]>; Index: test/MC/X86/avx512bitalg-encoding.s =================================================================== --- test/MC/X86/avx512bitalg-encoding.s +++ test/MC/X86/avx512bitalg-encoding.s @@ -112,3 +112,59 @@ // CHECK: encoding: [0x62,0xa2,0xfd,0x4a,0x54,0xac,0xf1,0x02,0x00,0x00,0xe0] vpopcntw -536870910(%rcx,%r14,8), %zmm21 {%k2} +// CHECK: vpshufbitqmb %zmm2, %zmm23, %k1 +// CHECK: encoding: [0x62,0xf2,0x45,0x40,0x8f,0xca] + vpshufbitqmb %zmm2, %zmm23, %k1 + +// CHECK: vpshufbitqmb %zmm2, %zmm23, %k1 {%k2} +// CHECK: encoding: [0x62,0xf2,0x45,0x42,0x8f,0xca] + vpshufbitqmb %zmm2, %zmm23, %k1 {%k2} + +// CHECK: vpshufbitqmb (%rcx), %zmm23, %k1 +// CHECK: encoding: [0x62,0xf2,0x45,0x40,0x8f,0x09] + vpshufbitqmb (%rcx), %zmm23, %k1 + +// CHECK: vpshufbitqmb -256(%rsp), %zmm23, %k1 +// CHECK: encoding: [0x62,0xf2,0x45,0x40,0x8f,0x4c,0x24,0xfc] + vpshufbitqmb -256(%rsp), %zmm23, %k1 + +// CHECK: vpshufbitqmb 256(%rsp), %zmm23, %k1 +// CHECK: encoding: [0x62,0xf2,0x45,0x40,0x8f,0x4c,0x24,0x04] + vpshufbitqmb 256(%rsp), %zmm23, %k1 + +// CHECK: vpshufbitqmb 268435456(%rcx,%r14,8), %zmm23, %k1 +// CHECK: encoding: [0x62,0xb2,0x45,0x40,0x8f,0x8c,0xf1,0x00,0x00,0x00,0x10] + vpshufbitqmb 268435456(%rcx,%r14,8), %zmm23, %k1 + +// CHECK: vpshufbitqmb -536870912(%rcx,%r14,8), %zmm23, %k1 +// CHECK: encoding: [0x62,0xb2,0x45,0x40,0x8f,0x8c,0xf1,0x00,0x00,0x00,0xe0] + vpshufbitqmb -536870912(%rcx,%r14,8), %zmm23, %k1 + +// CHECK: vpshufbitqmb -536870910(%rcx,%r14,8), %zmm23, %k1 +// CHECK: encoding: [0x62,0xb2,0x45,0x40,0x8f,0x8c,0xf1,0x02,0x00,0x00,0xe0] + vpshufbitqmb -536870910(%rcx,%r14,8), %zmm23, %k1 + +// CHECK: vpshufbitqmb (%rcx), %zmm23, %k1 {%k2} +// CHECK: encoding: [0x62,0xf2,0x45,0x42,0x8f,0x09] + vpshufbitqmb (%rcx), %zmm23, %k1 {%k2} + +// CHECK: vpshufbitqmb -256(%rsp), %zmm23, %k1 {%k2} +// CHECK: encoding: [0x62,0xf2,0x45,0x42,0x8f,0x4c,0x24,0xfc] + vpshufbitqmb -256(%rsp), %zmm23, %k1 {%k2} + +// CHECK: vpshufbitqmb 256(%rsp), %zmm23, %k1 {%k2} +// CHECK: encoding: [0x62,0xf2,0x45,0x42,0x8f,0x4c,0x24,0x04] + vpshufbitqmb 256(%rsp), %zmm23, %k1 {%k2} + +// CHECK: vpshufbitqmb 268435456(%rcx,%r14,8), %zmm23, %k1 {%k2} +// CHECK: encoding: [0x62,0xb2,0x45,0x42,0x8f,0x8c,0xf1,0x00,0x00,0x00,0x10] + vpshufbitqmb 268435456(%rcx,%r14,8), %zmm23, %k1 {%k2} + +// CHECK: vpshufbitqmb -536870912(%rcx,%r14,8), %zmm23, %k1 {%k2} +// CHECK: encoding: [0x62,0xb2,0x45,0x42,0x8f,0x8c,0xf1,0x00,0x00,0x00,0xe0] + vpshufbitqmb -536870912(%rcx,%r14,8), %zmm23, %k1 {%k2} + +// CHECK: vpshufbitqmb -536870910(%rcx,%r14,8), %zmm23, %k1 {%k2} +// CHECK: encoding: [0x62,0xb2,0x45,0x42,0x8f,0x8c,0xf1,0x02,0x00,0x00,0xe0] + vpshufbitqmb -536870910(%rcx,%r14,8), %zmm23, %k1 {%k2} + Index: test/MC/X86/avx512vl_bitalg-encoding.s =================================================================== --- test/MC/X86/avx512vl_bitalg-encoding.s +++ test/MC/X86/avx512vl_bitalg-encoding.s @@ -224,3 +224,115 @@ // CHECK: encoding: [0x62,0xa2,0xfd,0x2a,0x54,0xac,0xf1,0x02,0x00,0x00,0xe0] vpopcntw -536870910(%rcx,%r14,8), %ymm21 {%k2} +// CHECK: vpshufbitqmb %xmm2, %xmm23, %k1 +// CHECK: encoding: [0x62,0xf2,0x45,0x00,0x8f,0xca] + vpshufbitqmb %xmm2, %xmm23, %k1 + +// CHECK: vpshufbitqmb %xmm2, %xmm23, %k1 {%k2} +// CHECK: encoding: [0x62,0xf2,0x45,0x02,0x8f,0xca] + vpshufbitqmb %xmm2, %xmm23, %k1 {%k2} + +// CHECK: vpshufbitqmb (%rcx), %xmm23, %k1 +// CHECK: encoding: [0x62,0xf2,0x45,0x00,0x8f,0x09] + vpshufbitqmb (%rcx), %xmm23, %k1 + +// CHECK: vpshufbitqmb -64(%rsp), %xmm23, %k1 +// CHECK: encoding: [0x62,0xf2,0x45,0x00,0x8f,0x4c,0x24,0xfc] + vpshufbitqmb -64(%rsp), %xmm23, %k1 + +// CHECK: vpshufbitqmb 64(%rsp), %xmm23, %k1 +// CHECK: encoding: [0x62,0xf2,0x45,0x00,0x8f,0x4c,0x24,0x04] + vpshufbitqmb 64(%rsp), %xmm23, %k1 + +// CHECK: vpshufbitqmb 268435456(%rcx,%r14,8), %xmm23, %k1 +// CHECK: encoding: [0x62,0xb2,0x45,0x00,0x8f,0x8c,0xf1,0x00,0x00,0x00,0x10] + vpshufbitqmb 268435456(%rcx,%r14,8), %xmm23, %k1 + +// CHECK: vpshufbitqmb -536870912(%rcx,%r14,8), %xmm23, %k1 +// CHECK: encoding: [0x62,0xb2,0x45,0x00,0x8f,0x8c,0xf1,0x00,0x00,0x00,0xe0] + vpshufbitqmb -536870912(%rcx,%r14,8), %xmm23, %k1 + +// CHECK: vpshufbitqmb -536870910(%rcx,%r14,8), %xmm23, %k1 +// CHECK: encoding: [0x62,0xb2,0x45,0x00,0x8f,0x8c,0xf1,0x02,0x00,0x00,0xe0] + vpshufbitqmb -536870910(%rcx,%r14,8), %xmm23, %k1 + +// CHECK: vpshufbitqmb (%rcx), %xmm23, %k1 {%k2} +// CHECK: encoding: [0x62,0xf2,0x45,0x02,0x8f,0x09] + vpshufbitqmb (%rcx), %xmm23, %k1 {%k2} + +// CHECK: vpshufbitqmb -64(%rsp), %xmm23, %k1 {%k2} +// CHECK: encoding: [0x62,0xf2,0x45,0x02,0x8f,0x4c,0x24,0xfc] + vpshufbitqmb -64(%rsp), %xmm23, %k1 {%k2} + +// CHECK: vpshufbitqmb 64(%rsp), %xmm23, %k1 {%k2} +// CHECK: encoding: [0x62,0xf2,0x45,0x02,0x8f,0x4c,0x24,0x04] + vpshufbitqmb 64(%rsp), %xmm23, %k1 {%k2} + +// CHECK: vpshufbitqmb 268435456(%rcx,%r14,8), %xmm23, %k1 {%k2} +// CHECK: encoding: [0x62,0xb2,0x45,0x02,0x8f,0x8c,0xf1,0x00,0x00,0x00,0x10] + vpshufbitqmb 268435456(%rcx,%r14,8), %xmm23, %k1 {%k2} + +// CHECK: vpshufbitqmb -536870912(%rcx,%r14,8), %xmm23, %k1 {%k2} +// CHECK: encoding: [0x62,0xb2,0x45,0x02,0x8f,0x8c,0xf1,0x00,0x00,0x00,0xe0] + vpshufbitqmb -536870912(%rcx,%r14,8), %xmm23, %k1 {%k2} + +// CHECK: vpshufbitqmb -536870910(%rcx,%r14,8), %xmm23, %k1 {%k2} +// CHECK: encoding: [0x62,0xb2,0x45,0x02,0x8f,0x8c,0xf1,0x02,0x00,0x00,0xe0] + vpshufbitqmb -536870910(%rcx,%r14,8), %xmm23, %k1 {%k2} + +// CHECK: vpshufbitqmb %ymm2, %ymm23, %k1 +// CHECK: encoding: [0x62,0xf2,0x45,0x20,0x8f,0xca] + vpshufbitqmb %ymm2, %ymm23, %k1 + +// CHECK: vpshufbitqmb %ymm2, %ymm23, %k1 {%k2} +// CHECK: encoding: [0x62,0xf2,0x45,0x22,0x8f,0xca] + vpshufbitqmb %ymm2, %ymm23, %k1 {%k2} + +// CHECK: vpshufbitqmb (%rcx), %ymm23, %k1 +// CHECK: encoding: [0x62,0xf2,0x45,0x20,0x8f,0x09] + vpshufbitqmb (%rcx), %ymm23, %k1 + +// CHECK: vpshufbitqmb -128(%rsp), %ymm23, %k1 +// CHECK: encoding: [0x62,0xf2,0x45,0x20,0x8f,0x4c,0x24,0xfc] + vpshufbitqmb -128(%rsp), %ymm23, %k1 + +// CHECK: vpshufbitqmb 128(%rsp), %ymm23, %k1 +// CHECK: encoding: [0x62,0xf2,0x45,0x20,0x8f,0x4c,0x24,0x04] + vpshufbitqmb 128(%rsp), %ymm23, %k1 + +// CHECK: vpshufbitqmb 268435456(%rcx,%r14,8), %ymm23, %k1 +// CHECK: encoding: [0x62,0xb2,0x45,0x20,0x8f,0x8c,0xf1,0x00,0x00,0x00,0x10] + vpshufbitqmb 268435456(%rcx,%r14,8), %ymm23, %k1 + +// CHECK: vpshufbitqmb -536870912(%rcx,%r14,8), %ymm23, %k1 +// CHECK: encoding: [0x62,0xb2,0x45,0x20,0x8f,0x8c,0xf1,0x00,0x00,0x00,0xe0] + vpshufbitqmb -536870912(%rcx,%r14,8), %ymm23, %k1 + +// CHECK: vpshufbitqmb -536870910(%rcx,%r14,8), %ymm23, %k1 +// CHECK: encoding: [0x62,0xb2,0x45,0x20,0x8f,0x8c,0xf1,0x02,0x00,0x00,0xe0] + vpshufbitqmb -536870910(%rcx,%r14,8), %ymm23, %k1 + +// CHECK: vpshufbitqmb (%rcx), %ymm23, %k1 {%k2} +// CHECK: encoding: [0x62,0xf2,0x45,0x22,0x8f,0x09] + vpshufbitqmb (%rcx), %ymm23, %k1 {%k2} + +// CHECK: vpshufbitqmb -128(%rsp), %ymm23, %k1 {%k2} +// CHECK: encoding: [0x62,0xf2,0x45,0x22,0x8f,0x4c,0x24,0xfc] + vpshufbitqmb -128(%rsp), %ymm23, %k1 {%k2} + +// CHECK: vpshufbitqmb 128(%rsp), %ymm23, %k1 {%k2} +// CHECK: encoding: [0x62,0xf2,0x45,0x22,0x8f,0x4c,0x24,0x04] + vpshufbitqmb 128(%rsp), %ymm23, %k1 {%k2} + +// CHECK: vpshufbitqmb 268435456(%rcx,%r14,8), %ymm23, %k1 {%k2} +// CHECK: encoding: [0x62,0xb2,0x45,0x22,0x8f,0x8c,0xf1,0x00,0x00,0x00,0x10] + vpshufbitqmb 268435456(%rcx,%r14,8), %ymm23, %k1 {%k2} + +// CHECK: vpshufbitqmb -536870912(%rcx,%r14,8), %ymm23, %k1 {%k2} +// CHECK: encoding: [0x62,0xb2,0x45,0x22,0x8f,0x8c,0xf1,0x00,0x00,0x00,0xe0] + vpshufbitqmb -536870912(%rcx,%r14,8), %ymm23, %k1 {%k2} + +// CHECK: vpshufbitqmb -536870910(%rcx,%r14,8), %ymm23, %k1 {%k2} +// CHECK: encoding: [0x62,0xb2,0x45,0x22,0x8f,0x8c,0xf1,0x02,0x00,0x00,0xe0] + vpshufbitqmb -536870910(%rcx,%r14,8), %ymm23, %k1 {%k2} +