diff options
| author | Asaf Badouh <asaf.badouh@intel.com> | 2016-02-01 15:48:21 +0000 |
|---|---|---|
| committer | Asaf Badouh <asaf.badouh@intel.com> | 2016-02-01 15:48:21 +0000 |
| commit | 5a3a0231f485a76c7b2630ba059c7fc908b9d09e (patch) | |
| tree | 4ab02f2ef2ceff194aa55eed741c77f84247e3bc /llvm/lib/Target | |
| parent | c3975b7d6af5970598db272f9b13423d2e09d5ab (diff) | |
| download | bcm5719-llvm-5a3a0231f485a76c7b2630ba059c7fc908b9d09e.tar.gz bcm5719-llvm-5a3a0231f485a76c7b2630ba059c7fc908b9d09e.zip | |
[X86][AVX512VBMI] add encoding and intrinsics for Multishift
Differential Revision: http://reviews.llvm.org/D16399
llvm-svn: 259363
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 1 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.h | 2 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrAVX512.td | 44 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrFragmentsSIMD.td | 3 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86IntrinsicsInfo.h | 6 |
5 files changed, 39 insertions, 17 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 327d5fdb2bc..8f52296d7fb 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -21151,6 +21151,7 @@ const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const { case X86ISD::FP_TO_UINT_RND: return "X86ISD::FP_TO_UINT_RND"; case X86ISD::VFPCLASS: return "X86ISD::VFPCLASS"; case X86ISD::VFPCLASSS: return "X86ISD::VFPCLASSS"; + case X86ISD::MULTISHIFT: return "X86ISD::MULTISHIFT"; } return nullptr; } diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h index be135fc0f58..f6f8bbe46ab 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.h +++ b/llvm/lib/Target/X86/X86ISelLowering.h @@ -327,6 +327,8 @@ namespace llvm { // Vector integer comparisons, the result is in a mask vector. PCMPEQM, PCMPGTM, + MULTISHIFT, + /// Vector comparison generating mask bits for fp and /// integer signed and unsigned data types. CMPM, diff --git a/llvm/lib/Target/X86/X86InstrAVX512.td b/llvm/lib/Target/X86/X86InstrAVX512.td index ef5275f6c7e..c3cc8fb5ff2 100644 --- a/llvm/lib/Target/X86/X86InstrAVX512.td +++ b/llvm/lib/Target/X86/X86InstrAVX512.td @@ -3370,7 +3370,8 @@ multiclass avx512_binop_rm_vl_all<bits<8> opc_b, bits<8> opc_w, multiclass avx512_binop_rm2<bits<8> opc, string OpcodeStr, OpndItins itins, SDNode OpNode,X86VectorVTInfo _Src, - X86VectorVTInfo _Dst, bit IsCommutable = 0> { + X86VectorVTInfo _Dst, X86VectorVTInfo _Brdct, + bit IsCommutable = 0> { defm rr : AVX512_maskable<opc, MRMSrcReg, _Dst, (outs _Dst.RC:$dst), (ins _Src.RC:$src1, _Src.RC:$src2), OpcodeStr, "$src2, $src1","$src1, $src2", @@ -3391,11 +3392,11 @@ multiclass avx512_binop_rm2<bits<8> opc, string OpcodeStr, OpndItins itins, defm rmb : AVX512_maskable<opc, MRMSrcMem, _Dst, (outs _Dst.RC:$dst), (ins _Src.RC:$src1, _Dst.ScalarMemOp:$src2), OpcodeStr, - "${src2}"##_Dst.BroadcastStr##", $src1", + "${src2}"##_Brdct.BroadcastStr##", $src1", "$src1, ${src2}"##_Dst.BroadcastStr, (_Dst.VT (OpNode (_Src.VT _Src.RC:$src1), (bitconvert - (_Dst.VT (X86VBroadcast - (_Dst.ScalarLdFrag addr:$src2)))))), + (_Brdct.VT (X86VBroadcast + (_Brdct.ScalarLdFrag addr:$src2)))))), itins.rm>, AVX512BIBase, EVEX_4V, EVEX_B; } @@ -3428,26 +3429,35 @@ defm VPMULHRSW : avx512_binop_rm_vl_w<0x0B, "vpmulhrsw", X86mulhrs, SSE_INTMUL_I defm VPAVG : avx512_binop_rm_vl_bw<0xE0, 0xE3, "vpavg", X86avg, SSE_INTALU_ITINS_P, HasBWI, 1>; -multiclass avx512_binop_all<bits<8> opc, string OpcodeStr, OpndItins itins, - SDNode OpNode, bit IsCommutable = 0> { - - defm NAME#Z : avx512_binop_rm2<opc, OpcodeStr, itins, OpNode, - v16i32_info, v8i64_info, IsCommutable>, - EVEX_V512, EVEX_CD8<64, CD8VF>, VEX_W; - let Predicates = [HasVLX] in { +multiclass avx512_binop_all<bits<8> opc, string OpcodeStr, OpndItins itins, + AVX512VLVectorVTInfo _SrcVTInfo, AVX512VLVectorVTInfo _DstVTInfo, + SDNode OpNode, Predicate prd, bit IsCommutable = 0> { + let Predicates = [prd] in + defm NAME#Z : avx512_binop_rm2<opc, OpcodeStr, itins, OpNode, + _SrcVTInfo.info512, _DstVTInfo.info512, + v8i64_info, IsCommutable>, + EVEX_V512, EVEX_CD8<64, CD8VF>, VEX_W; + let Predicates = [HasVLX, prd] in { defm NAME#Z256 : avx512_binop_rm2<opc, OpcodeStr, itins, OpNode, - v8i32x_info, v4i64x_info, IsCommutable>, - EVEX_V256, EVEX_CD8<64, CD8VF>, VEX_W; + _SrcVTInfo.info256, _DstVTInfo.info256, + v4i64x_info, IsCommutable>, + EVEX_V256, EVEX_CD8<64, CD8VF>, VEX_W; defm NAME#Z128 : avx512_binop_rm2<opc, OpcodeStr, itins, OpNode, - v4i32x_info, v2i64x_info, IsCommutable>, + _SrcVTInfo.info128, _DstVTInfo.info128, + v2i64x_info, IsCommutable>, EVEX_V128, EVEX_CD8<64, CD8VF>, VEX_W; } } defm VPMULDQ : avx512_binop_all<0x28, "vpmuldq", SSE_INTALU_ITINS_P, - X86pmuldq, 1>,T8PD; -defm VPMULUDQ : avx512_binop_all<0xF4, "vpmuludq", SSE_INTMUL_ITINS_P, - X86pmuludq, 1>; + avx512vl_i32_info, avx512vl_i64_info, + X86pmuldq, HasAVX512, 1>,T8PD; +defm VPMULUDQ : avx512_binop_all<0xF4, "vpmuludq", SSE_INTMUL_ITINS_P, + avx512vl_i32_info, avx512vl_i64_info, + X86pmuludq, HasAVX512, 1>; +defm VPMULTISHIFTQB : avx512_binop_all<0x83, "vpmultishiftqb", SSE_INTALU_ITINS_P, + avx512vl_i8_info, avx512vl_i8_info, + X86multishift, HasVBMI, 0>, T8PD; multiclass avx512_packs_rmb<bits<8> opc, string OpcodeStr, SDNode OpNode, X86VectorVTInfo _Src, X86VectorVTInfo _Dst> { diff --git a/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td b/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td index 92bc65c5155..680fa575804 100644 --- a/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td +++ b/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td @@ -95,6 +95,9 @@ def X86dbpsadbw : SDNode<"X86ISD::DBPSADBW", def X86andnp : SDNode<"X86ISD::ANDNP", SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, SDTCisSameAs<0,2>]>>; +def X86multishift : SDNode<"X86ISD::MULTISHIFT", + SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>, + SDTCisSameAs<1,2>]>>; def X86psign : SDNode<"X86ISD::PSIGN", SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, SDTCisSameAs<0,2>]>>; diff --git a/llvm/lib/Target/X86/X86IntrinsicsInfo.h b/llvm/lib/Target/X86/X86IntrinsicsInfo.h index be108daea9a..7b35da17a9e 100644 --- a/llvm/lib/Target/X86/X86IntrinsicsInfo.h +++ b/llvm/lib/Target/X86/X86IntrinsicsInfo.h @@ -1342,6 +1342,12 @@ static const IntrinsicData IntrinsicsWithoutChain[] = { X86_INTRINSIC_DATA(avx512_mask_pmull_w_128, INTR_TYPE_2OP_MASK, ISD::MUL, 0), X86_INTRINSIC_DATA(avx512_mask_pmull_w_256, INTR_TYPE_2OP_MASK, ISD::MUL, 0), X86_INTRINSIC_DATA(avx512_mask_pmull_w_512, INTR_TYPE_2OP_MASK, ISD::MUL, 0), + X86_INTRINSIC_DATA(avx512_mask_pmultishift_qb_128, INTR_TYPE_2OP_MASK, + X86ISD::MULTISHIFT, 0), + X86_INTRINSIC_DATA(avx512_mask_pmultishift_qb_256, INTR_TYPE_2OP_MASK, + X86ISD::MULTISHIFT, 0), + X86_INTRINSIC_DATA(avx512_mask_pmultishift_qb_512, INTR_TYPE_2OP_MASK, + X86ISD::MULTISHIFT, 0), X86_INTRINSIC_DATA(avx512_mask_pmulu_dq_128, INTR_TYPE_2OP_MASK, X86ISD::PMULUDQ, 0), X86_INTRINSIC_DATA(avx512_mask_pmulu_dq_256, INTR_TYPE_2OP_MASK, |

