From 8b746969baee26237e4c52de9862d06795eabcda Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Tue, 23 Sep 2008 18:22:58 +0000 Subject: [PATCH] Move the code for initializing the global base reg out of X86ISelDAGToDAG.cpp and into X86InstrInfo.cpp. This will allow it to be reused by FastISel. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56494 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86ISelDAGToDAG.cpp | 38 +++++++----------------------- lib/Target/X86/X86InstrInfo.cpp | 29 +++++++++++++++++++++++ lib/Target/X86/X86InstrInfo.h | 5 ++++ 3 files changed, 43 insertions(+), 29 deletions(-) diff --git a/lib/Target/X86/X86ISelDAGToDAG.cpp b/lib/Target/X86/X86ISelDAGToDAG.cpp index 0d5bfa5ec7e..8c5cb22deaa 100644 --- a/lib/Target/X86/X86ISelDAGToDAG.cpp +++ b/lib/Target/X86/X86ISelDAGToDAG.cpp @@ -232,8 +232,10 @@ namespace { return CurDAG->getTargetConstant(Imm, MVT::i32); } - /// getGlobalBaseReg - insert code into the entry mbb to materialize the PIC - /// base register. Return the virtual register that holds this value. + /// getGlobalBaseReg - Return an SDNode that returns the value of + /// the global base register. Output instructions required to + /// initialize the global base register, if necessary. + /// SDNode *getGlobalBaseReg(); /// getTruncateTo8Bit - return an SDNode that implements a subreg based @@ -1170,36 +1172,14 @@ bool X86DAGToDAGISel::TryFoldLoad(SDValue P, SDValue N, return false; } -/// getGlobalBaseReg - Output the instructions required to put the -/// base address to use for accessing globals into a register. +/// getGlobalBaseReg - Return an SDNode that returns the value of +/// the global base register. Output instructions required to +/// initialize the global base register, if necessary. /// SDNode *X86DAGToDAGISel::getGlobalBaseReg() { assert(!Subtarget->is64Bit() && "X86-64 PIC uses RIP relative addressing"); - if (!GlobalBaseReg) { - // Insert the set of GlobalBaseReg into the first MBB of the function - MachineFunction *MF = BB->getParent(); - MachineBasicBlock &FirstMBB = MF->front(); - MachineBasicBlock::iterator MBBI = FirstMBB.begin(); - MachineRegisterInfo &RegInfo = MF->getRegInfo(); - unsigned PC = RegInfo.createVirtualRegister(X86::GR32RegisterClass); - - const TargetInstrInfo *TII = TM.getInstrInfo(); - // Operand of MovePCtoStack is completely ignored by asm printer. It's - // only used in JIT code emission as displacement to pc. - BuildMI(FirstMBB, MBBI, TII->get(X86::MOVPC32r), PC).addImm(0); - - // If we're using vanilla 'GOT' PIC style, we should use relative addressing - // not to pc, but to _GLOBAL_ADDRESS_TABLE_ external - if (TM.getRelocationModel() == Reloc::PIC_ && - Subtarget->isPICStyleGOT()) { - GlobalBaseReg = RegInfo.createVirtualRegister(X86::GR32RegisterClass); - BuildMI(FirstMBB, MBBI, TII->get(X86::ADD32ri), GlobalBaseReg) - .addReg(PC).addExternalSymbol("_GLOBAL_OFFSET_TABLE_"); - } else { - GlobalBaseReg = PC; - } - - } + if (!GlobalBaseReg) + GlobalBaseReg = TM.getInstrInfo()->initializeGlobalBaseReg(BB->getParent()); return CurDAG->getRegister(GlobalBaseReg, TLI.getPointerTy()).getNode(); } diff --git a/lib/Target/X86/X86InstrInfo.cpp b/lib/Target/X86/X86InstrInfo.cpp index 4c597eda91e..0864fa0b94c 100644 --- a/lib/Target/X86/X86InstrInfo.cpp +++ b/lib/Target/X86/X86InstrInfo.cpp @@ -2935,3 +2935,32 @@ unsigned X86InstrInfo::GetInstSizeInBytes(const MachineInstr *MI) const { } return Size; } + +/// initializeGlobalBaseReg - Output the instructions required to put the +/// base address to use for accessing globals into a register. +/// +unsigned X86InstrInfo::initializeGlobalBaseReg(MachineFunction *MF) const { + // Insert the set of GlobalBaseReg into the first MBB of the function + MachineBasicBlock &FirstMBB = MF->front(); + MachineBasicBlock::iterator MBBI = FirstMBB.begin(); + MachineRegisterInfo &RegInfo = MF->getRegInfo(); + unsigned PC = RegInfo.createVirtualRegister(X86::GR32RegisterClass); + + const TargetInstrInfo *TII = TM.getInstrInfo(); + // Operand of MovePCtoStack is completely ignored by asm printer. It's + // only used in JIT code emission as displacement to pc. + BuildMI(FirstMBB, MBBI, TII->get(X86::MOVPC32r), PC).addImm(0); + + // If we're using vanilla 'GOT' PIC style, we should use relative addressing + // not to pc, but to _GLOBAL_ADDRESS_TABLE_ external + if (TM.getRelocationModel() == Reloc::PIC_ && + TM.getSubtarget().isPICStyleGOT()) { + unsigned GlobalBaseReg = + RegInfo.createVirtualRegister(X86::GR32RegisterClass); + BuildMI(FirstMBB, MBBI, TII->get(X86::ADD32ri), GlobalBaseReg) + .addReg(PC).addExternalSymbol("_GLOBAL_OFFSET_TABLE_"); + return GlobalBaseReg; + } + + return PC; +} diff --git a/lib/Target/X86/X86InstrInfo.h b/lib/Target/X86/X86InstrInfo.h index 2b089f31189..62bec6f614b 100644 --- a/lib/Target/X86/X86InstrInfo.h +++ b/lib/Target/X86/X86InstrInfo.h @@ -414,6 +414,11 @@ public: /// virtual unsigned GetInstSizeInBytes(const MachineInstr *MI) const; + /// initializeGlobalBaseReg - Output the instructions required to put the + /// base address to use for accessing globals into a register. + /// + unsigned initializeGlobalBaseReg(MachineFunction *MF) const; + private: MachineInstr* foldMemoryOperand(MachineFunction &MF, MachineInstr* MI,