diff options
author | Daniel Sanders <daniel.sanders@imgtec.com> | 2013-09-11 10:51:30 +0000 |
---|---|---|
committer | Daniel Sanders <daniel.sanders@imgtec.com> | 2013-09-11 10:51:30 +0000 |
commit | f5bd937bc4ddae9096adf825c96fc1583087bb8b (patch) | |
tree | 54ffcd0453acdf7b2d0ac4f7d1114b44aab2f112 /llvm/lib/Target/Mips/MipsSEISelLowering.cpp | |
parent | 3353a10339c09c42e13d1042dd3cf3f5d2b4fc5b (diff) | |
download | bcm5719-llvm-f5bd937bc4ddae9096adf825c96fc1583087bb8b.tar.gz bcm5719-llvm-f5bd937bc4ddae9096adf825c96fc1583087bb8b.zip |
[mips][msa] Added support for matching fadd, fdiv, flog2, fmul, frint, fsqrt, and fsub from normal IR (i.e. not intrinsics)
llvm-svn: 190512
Diffstat (limited to 'llvm/lib/Target/Mips/MipsSEISelLowering.cpp')
-rw-r--r-- | llvm/lib/Target/Mips/MipsSEISelLowering.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/llvm/lib/Target/Mips/MipsSEISelLowering.cpp b/llvm/lib/Target/Mips/MipsSEISelLowering.cpp index 2de21eaffbe..c307aa76d81 100644 --- a/llvm/lib/Target/Mips/MipsSEISelLowering.cpp +++ b/llvm/lib/Target/Mips/MipsSEISelLowering.cpp @@ -175,6 +175,16 @@ addMSAFloatType(MVT::SimpleValueType Ty, const TargetRegisterClass *RC) { setOperationAction(ISD::LOAD, Ty, Legal); setOperationAction(ISD::STORE, Ty, Legal); setOperationAction(ISD::BITCAST, Ty, Legal); + + if (Ty != MVT::v8f16) { + setOperationAction(ISD::FADD, Ty, Legal); + setOperationAction(ISD::FDIV, Ty, Legal); + setOperationAction(ISD::FLOG2, Ty, Legal); + setOperationAction(ISD::FMUL, Ty, Legal); + setOperationAction(ISD::FRINT, Ty, Legal); + setOperationAction(ISD::FSQRT, Ty, Legal); + setOperationAction(ISD::FSUB, Ty, Legal); + } } bool @@ -823,6 +833,16 @@ static SDValue lowerMSABranchIntr(SDValue Op, SelectionDAG &DAG, unsigned Opc) { return Result; } +static SDValue lowerMSAUnaryIntr(SDValue Op, SelectionDAG &DAG, unsigned Opc) { + SDLoc DL(Op); + SDValue Value = Op->getOperand(1); + EVT ResTy = Op->getValueType(0); + + SDValue Result = DAG.getNode(Opc, DL, ResTy, Value); + + return Result; +} + SDValue MipsSETargetLowering::lowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const { switch (cast<ConstantSDNode>(Op->getOperand(0))->getZExtValue()) { @@ -889,6 +909,27 @@ SDValue MipsSETargetLowering::lowerINTRINSIC_WO_CHAIN(SDValue Op, case Intrinsic::mips_div_u_w: case Intrinsic::mips_div_u_d: return lowerMSABinaryIntr(Op, DAG, ISD::UDIV); + case Intrinsic::mips_fadd_w: + case Intrinsic::mips_fadd_d: + return lowerMSABinaryIntr(Op, DAG, ISD::FADD); + case Intrinsic::mips_fdiv_w: + case Intrinsic::mips_fdiv_d: + return lowerMSABinaryIntr(Op, DAG, ISD::FDIV); + case Intrinsic::mips_flog2_w: + case Intrinsic::mips_flog2_d: + return lowerMSAUnaryIntr(Op, DAG, ISD::FLOG2); + case Intrinsic::mips_fmul_w: + case Intrinsic::mips_fmul_d: + return lowerMSABinaryIntr(Op, DAG, ISD::FMUL); + case Intrinsic::mips_frint_w: + case Intrinsic::mips_frint_d: + return lowerMSAUnaryIntr(Op, DAG, ISD::FRINT); + case Intrinsic::mips_fsqrt_w: + case Intrinsic::mips_fsqrt_d: + return lowerMSAUnaryIntr(Op, DAG, ISD::FSQRT); + case Intrinsic::mips_fsub_w: + case Intrinsic::mips_fsub_d: + return lowerMSABinaryIntr(Op, DAG, ISD::FSUB); } } |