diff options
| author | Robert Khasanov <rob.khasanov@gmail.com> | 2014-09-30 11:19:50 +0000 |
|---|---|---|
| committer | Robert Khasanov <rob.khasanov@gmail.com> | 2014-09-30 11:19:50 +0000 |
| commit | a27c8e0fd9227809779354cd494a16123ada8de7 (patch) | |
| tree | e650b541c745be7893b6cf29db4cc78a36512c9f /llvm/lib/Target/X86/X86ISelLowering.cpp | |
| parent | ac95cd5c22a968c026495520e28021a90c226652 (diff) | |
| download | bcm5719-llvm-a27c8e0fd9227809779354cd494a16123ada8de7.tar.gz bcm5719-llvm-a27c8e0fd9227809779354cd494a16123ada8de7.zip | |
[AVX512] Enabled intrinsics for VPCMPEQD and VPCMPEQQ.
Added CMP_MASK intrinsic type
llvm-svn: 218667
Diffstat (limited to 'llvm/lib/Target/X86/X86ISelLowering.cpp')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index ed542560742..98616119fa0 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -15859,7 +15859,8 @@ static SDValue getTargetVShiftNode(unsigned Opc, SDLoc dl, MVT VT, return DAG.getNode(Opc, dl, VT, SrcOp, ShAmt); } -/// \brief Return (vselect \p Mask, \p Op, \p PreservedSrc) along with the +/// \brief Return (and \p Op, \p Mask) for compare instructions or +/// (vselect \p Mask, \p Op, \p PreservedSrc) for others along with the /// necessary casting for \p Mask when lowering masking intrinsics. static SDValue getVectorMaskingNode(SDValue Op, SDValue Mask, SDValue PreservedSrc, SelectionDAG &DAG) { @@ -15869,6 +15870,20 @@ static SDValue getVectorMaskingNode(SDValue Op, SDValue Mask, SDLoc dl(Op); assert(MaskVT.isSimple() && "invalid mask type"); + + if (isAllOnes(Mask)) + return Op; + + switch (Op.getOpcode()) { + default: break; + case X86ISD::PCMPEQM: + case X86ISD::PCMPGTM: + case X86ISD::CMPM: + case X86ISD::CMPMU: + return DAG.getNode(ISD::AND, dl, VT, Op, + DAG.getNode(ISD::BITCAST, dl, MaskVT, Mask)); + } + return DAG.getNode(ISD::VSELECT, dl, VT, DAG.getNode(ISD::BITCAST, dl, MaskVT, Mask), Op, PreservedSrc); @@ -15937,6 +15952,16 @@ static SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) { case INTR_TYPE_3OP: return DAG.getNode(IntrData->Opc0, dl, Op.getValueType(), Op.getOperand(1), Op.getOperand(2), Op.getOperand(3)); + case CMP_MASK: { + EVT VT = Op.getOperand(1).getValueType(); + EVT MaskVT = EVT::getVectorVT(*DAG.getContext(), MVT::i1, + VT.getVectorNumElements()); + SDValue Cmp = DAG.getNode(IntrData->Opc0, dl, MaskVT, + Op.getOperand(1), Op.getOperand(2)); + SDValue Res = getVectorMaskingNode(Cmp, Op.getOperand(3), + DAG.getTargetConstant(0, MaskVT), DAG); + return DAG.getNode(ISD::BITCAST, dl, Op.getValueType(), Res); + } case COMI: { // Comparison intrinsics ISD::CondCode CC = (ISD::CondCode)IntrData->Opc1; SDValue LHS = Op.getOperand(1); |

