diff options
Diffstat (limited to 'llvm/lib/Target/Mips/MipsISelLowering.h')
-rw-r--r-- | llvm/lib/Target/Mips/MipsISelLowering.h | 53 |
1 files changed, 6 insertions, 47 deletions
diff --git a/llvm/lib/Target/Mips/MipsISelLowering.h b/llvm/lib/Target/Mips/MipsISelLowering.h index abc34be6377..cddf0903ca6 100644 --- a/llvm/lib/Target/Mips/MipsISelLowering.h +++ b/llvm/lib/Target/Mips/MipsISelLowering.h @@ -37,23 +37,14 @@ namespace llvm { // Tail call TailCall, - // Get the Highest (63-48) 16 bits from a 64-bit immediate - Highest, - - // Get the Higher (47-32) 16 bits from a 64-bit immediate - Higher, - - // Get the High 16 bits from a 32/64-bit immediate + // Get the Higher 16 bits from a 32-bit immediate // No relation with Mips Hi register Hi, - // Get the Lower 16 bits from a 32/64-bit immediate + // Get the Lower 16 bits from a 32-bit immediate // No relation with Mips Lo register Lo, - // Get the High 16 bits from a 32 bit immediate for accessing the GOT. - GotHi, - // Handle gp_rel (small data/bss sections) relocation. GPRel, @@ -306,7 +297,7 @@ namespace llvm { } bool isJumpTableRelative() const override { - return getTargetMachine().isPositionIndependent(); + return getTargetMachine().isPositionIndependent() || ABI.IsN64(); } protected: @@ -353,8 +344,8 @@ namespace llvm { SelectionDAG &DAG, unsigned HiFlag, unsigned LoFlag, SDValue Chain, const MachinePointerInfo &PtrInfo) const { - SDValue Hi = DAG.getNode(MipsISD::GotHi, DL, Ty, - getTargetNode(N, Ty, DAG, HiFlag)); + SDValue Hi = + DAG.getNode(MipsISD::Hi, DL, Ty, getTargetNode(N, Ty, DAG, HiFlag)); Hi = DAG.getNode(ISD::ADD, DL, Ty, Hi, getGlobalReg(DAG, Ty)); SDValue Wrapper = DAG.getNode(MipsISD::Wrapper, DL, Ty, Hi, getTargetNode(N, Ty, DAG, LoFlag)); @@ -365,8 +356,6 @@ namespace llvm { // computing a symbol's address in non-PIC mode: // // (add %hi(sym), %lo(sym)) - // - // This method covers O32, N32 and N64 in sym32 mode. template <class NodeTy> SDValue getAddrNonPIC(NodeTy *N, const SDLoc &DL, EVT Ty, SelectionDAG &DAG) const { @@ -375,37 +364,7 @@ namespace llvm { return DAG.getNode(ISD::ADD, DL, Ty, DAG.getNode(MipsISD::Hi, DL, Ty, Hi), DAG.getNode(MipsISD::Lo, DL, Ty, Lo)); - } - - // This method creates the following nodes, which are necessary for - // computing a symbol's address in non-PIC mode for N64. - // - // (add (shl (add (shl (add %highest(sym), %higher(sim)), 16), %high(sym)), - // 16), %lo(%sym)) - // - // FIXME: This method is not efficent for (micro)MIPS64R6. - template <class NodeTy> - SDValue getAddrNonPICSym64(NodeTy *N, const SDLoc &DL, EVT Ty, - SelectionDAG &DAG) const { - SDValue Hi = getTargetNode(N, Ty, DAG, MipsII::MO_ABS_HI); - SDValue Lo = getTargetNode(N, Ty, DAG, MipsII::MO_ABS_LO); - - SDValue Highest = - DAG.getNode(MipsISD::Highest, DL, Ty, - getTargetNode(N, Ty, DAG, MipsII::MO_HIGHEST)); - SDValue Higher = getTargetNode(N, Ty, DAG, MipsII::MO_HIGHER); - SDValue HigherPart = - DAG.getNode(ISD::ADD, DL, Ty, Highest, - DAG.getNode(MipsISD::Higher, DL, Ty, Higher)); - SDValue Cst = DAG.getConstant(16, DL, MVT::i32); - SDValue Shift = DAG.getNode(ISD::SHL, DL, Ty, HigherPart, Cst); - SDValue Add = DAG.getNode(ISD::ADD, DL, Ty, Shift, - DAG.getNode(MipsISD::Hi, DL, Ty, Hi)); - SDValue Shift2 = DAG.getNode(ISD::SHL, DL, Ty, Add, Cst); - - return DAG.getNode(ISD::ADD, DL, Ty, Shift2, - DAG.getNode(MipsISD::Lo, DL, Ty, Lo)); - } + } // This method creates the following nodes, which are necessary for // computing a symbol's address using gp-relative addressing: |