Move the code for initializing the global base reg out of
authorDan Gohman <gohman@apple.com>
Tue, 23 Sep 2008 18:22:58 +0000 (18:22 +0000)
committerDan Gohman <gohman@apple.com>
Tue, 23 Sep 2008 18:22:58 +0000 (18:22 +0000)
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
lib/Target/X86/X86InstrInfo.cpp
lib/Target/X86/X86InstrInfo.h

index 0d5bfa5ec7e6909fa2bdf6179422ebbd3f51facb..8c5cb22deaae9be3f78520ee895f7b3c4d239b91 100644 (file)
@@ -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();
 }
 
index 4c597eda91e37c269a99432d23df04c1306ad7d2..0864fa0b94c3b047d530bb9b049daaade8cf2f09 100644 (file)
@@ -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<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;
+}
index 2b089f31189c9efa2a73ad597884efa803224187..62bec6f614bf6b086606b5a3fd69efb98ac85692 100644 (file)
@@ -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,