diff options
Diffstat (limited to 'llvm/lib/Target/PowerPC')
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCISelLowering.cpp | 50 | ||||
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCISelLowering.h | 9 |
2 files changed, 59 insertions, 0 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp index 7468b8baba1..eb8e6007ab9 100644 --- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -27,6 +27,7 @@ #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineInstrBuilder.h" +#include "llvm/CodeGen/MachineJumpTableInfo.h" #include "llvm/CodeGen/MachineLoopInfo.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/SelectionDAG.h" @@ -2179,6 +2180,55 @@ SDValue PPCTargetLowering::LowerConstantPool(SDValue Op, return LowerLabelRef(CPIHi, CPILo, IsPIC, DAG); } +// For 64-bit PowerPC, prefer the more compact relative encodings. +// This trades 32 bits per jump table entry for one or two instructions +// on the jump site. +unsigned PPCTargetLowering::getJumpTableEncoding() const { + if (isJumpTableRelative()) + return MachineJumpTableInfo::EK_LabelDifference32; + + return TargetLowering::getJumpTableEncoding(); +} + +bool PPCTargetLowering::isJumpTableRelative() const { + if (Subtarget.isPPC64()) + return true; + return TargetLowering::isJumpTableRelative(); +} + +SDValue PPCTargetLowering::getPICJumpTableRelocBase(SDValue Table, + SelectionDAG &DAG) const { + if (!Subtarget.isPPC64()) + return TargetLowering::getPICJumpTableRelocBase(Table, DAG); + + switch (getTargetMachine().getCodeModel()) { + case CodeModel::Default: + case CodeModel::Small: + case CodeModel::Medium: + return TargetLowering::getPICJumpTableRelocBase(Table, DAG); + default: + return DAG.getNode(PPCISD::GlobalBaseReg, SDLoc(), + getPointerTy(DAG.getDataLayout())); + } +} + +const MCExpr * +PPCTargetLowering::getPICJumpTableRelocBaseExpr(const MachineFunction *MF, + unsigned JTI, + MCContext &Ctx) const { + if (!Subtarget.isPPC64()) + return TargetLowering::getPICJumpTableRelocBaseExpr(MF, JTI, Ctx); + + switch (getTargetMachine().getCodeModel()) { + case CodeModel::Default: + case CodeModel::Small: + case CodeModel::Medium: + return TargetLowering::getPICJumpTableRelocBaseExpr(MF, JTI, Ctx); + default: + return MCSymbolRefExpr::create(MF->getPICBaseSymbol(), Ctx); + } +} + SDValue PPCTargetLowering::LowerJumpTable(SDValue Op, SelectionDAG &DAG) const { EVT PtrVT = Op.getValueType(); JumpTableSDNode *JT = cast<JumpTableSDNode>(Op); diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.h b/llvm/lib/Target/PowerPC/PPCISelLowering.h index 689a2e6bb68..6f9cc2491c5 100644 --- a/llvm/lib/Target/PowerPC/PPCISelLowering.h +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.h @@ -770,6 +770,15 @@ namespace llvm { void insertSSPDeclarations(Module &M) const override; bool isFPImmLegal(const APFloat &Imm, EVT VT) const override; + + unsigned getJumpTableEncoding() const override; + bool isJumpTableRelative() const override; + SDValue getPICJumpTableRelocBase(SDValue Table, + SelectionDAG &DAG) const override; + const MCExpr *getPICJumpTableRelocBaseExpr(const MachineFunction *MF, + unsigned JTI, + MCContext &Ctx) const override; + private: struct ReuseLoadInfo { SDValue Ptr; |

