1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-20 19:42:54 +02:00

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.

llvm-svn: 56494
This commit is contained in:
Dan Gohman 2008-09-23 18:22:58 +00:00
parent 2c9f6ab06d
commit 6bed18a334
3 changed files with 43 additions and 29 deletions

View File

@ -232,8 +232,10 @@ namespace {
return CurDAG->getTargetConstant(Imm, MVT::i32); return CurDAG->getTargetConstant(Imm, MVT::i32);
} }
/// getGlobalBaseReg - insert code into the entry mbb to materialize the PIC /// getGlobalBaseReg - Return an SDNode that returns the value of
/// base register. Return the virtual register that holds this value. /// the global base register. Output instructions required to
/// initialize the global base register, if necessary.
///
SDNode *getGlobalBaseReg(); SDNode *getGlobalBaseReg();
/// getTruncateTo8Bit - return an SDNode that implements a subreg based /// getTruncateTo8Bit - return an SDNode that implements a subreg based
@ -1170,36 +1172,14 @@ bool X86DAGToDAGISel::TryFoldLoad(SDValue P, SDValue N,
return false; return false;
} }
/// getGlobalBaseReg - Output the instructions required to put the /// getGlobalBaseReg - Return an SDNode that returns the value of
/// base address to use for accessing globals into a register. /// the global base register. Output instructions required to
/// initialize the global base register, if necessary.
/// ///
SDNode *X86DAGToDAGISel::getGlobalBaseReg() { SDNode *X86DAGToDAGISel::getGlobalBaseReg() {
assert(!Subtarget->is64Bit() && "X86-64 PIC uses RIP relative addressing"); assert(!Subtarget->is64Bit() && "X86-64 PIC uses RIP relative addressing");
if (!GlobalBaseReg) { if (!GlobalBaseReg)
// Insert the set of GlobalBaseReg into the first MBB of the function GlobalBaseReg = TM.getInstrInfo()->initializeGlobalBaseReg(BB->getParent());
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;
}
}
return CurDAG->getRegister(GlobalBaseReg, TLI.getPointerTy()).getNode(); return CurDAG->getRegister(GlobalBaseReg, TLI.getPointerTy()).getNode();
} }

View File

@ -2935,3 +2935,32 @@ unsigned X86InstrInfo::GetInstSizeInBytes(const MachineInstr *MI) const {
} }
return Size; 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<X86Subtarget>().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;
}

View File

@ -414,6 +414,11 @@ public:
/// ///
virtual unsigned GetInstSizeInBytes(const MachineInstr *MI) const; 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: private:
MachineInstr* foldMemoryOperand(MachineFunction &MF, MachineInstr* foldMemoryOperand(MachineFunction &MF,
MachineInstr* MI, MachineInstr* MI,