start adding logic in isel to determine asm printer semantics, step N of M.
authorChris Lattner <sabre@nondot.org>
Fri, 26 Jun 2009 00:43:52 +0000 (00:43 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 26 Jun 2009 00:43:52 +0000 (00:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74246 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelLowering.cpp
lib/Target/X86/X86InstrInfo.h

index 8d0ea662dc0eaacd2b8d1f9843b7190e2a1ae18b..8d070664b1cabe6ced55fddd5606e8a7413eff8c 100644 (file)
@@ -4507,14 +4507,25 @@ X86TargetLowering::LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) {
 
 SDValue X86TargetLowering::LowerJumpTable(SDValue Op, SelectionDAG &DAG) {
   JumpTableSDNode *JT = cast<JumpTableSDNode>(Op);
-  // FIXME there isn't really any debug into here
-  DebugLoc dl = JT->getDebugLoc();
-  SDValue Result = DAG.getTargetJumpTable(JT->getIndex(), getPointerTy());
-  Result = DAG.getNode(X86ISD::Wrapper, dl, getPointerTy(), Result);
+
+  // In PIC mode (unless we're in RIPRel PIC mode) we add an offset to the
+  // global base reg.
+  unsigned char JTFlag = 0;
+  if (getTargetMachine().getRelocationModel() == Reloc::PIC_) {
+    if (Subtarget->isPICStyleStub())
+      JTFlag = X86II::MO_PIC_BASE_OFFSET;
+    else if (Subtarget->isPICStyleGOT())
+      JTFlag = X86II::MO_GOTOFF;
+  }
+  
+  SDValue Result = DAG.getTargetJumpTable(JT->getIndex(), getPointerTy(),
+                                          JTFlag);
+  DebugLoc DL = JT->getDebugLoc();
+  Result = DAG.getNode(X86ISD::Wrapper, DL, getPointerTy(), Result);
+
   // With PIC, the address is actually $g + Offset.
-  if (getTargetMachine().getRelocationModel() == Reloc::PIC_ &&
-      !Subtarget->isPICStyleRIPRel()) {
-    Result = DAG.getNode(ISD::ADD, dl, getPointerTy(),
+  if (JTFlag) {
+    Result = DAG.getNode(ISD::ADD, DL, getPointerTy(),
                          DAG.getNode(X86ISD::GlobalBaseReg,
                                      DebugLoc::getUnknownLoc(),
                                      getPointerTy()),
index f8b5e5e53abf7a9e5bff8dfd47afa597a48593e4..b4ba5f0dc00fcfd62d5e76993d170628f1cd5370 100644 (file)
@@ -77,9 +77,19 @@ namespace X86II {
     
     /// MO_GOT_ABSOLUTE_ADDRESS - On a symbol operand, this represents a
     /// relocation of:
-    ///    $SYMBOL_LABEL + [. - PICBASELABEL]
+    ///    SYMBOL_LABEL + [. - PICBASELABEL]
     MO_GOT_ABSOLUTE_ADDRESS = 1,
     
+    /// MO_PIC_BASE_OFFSET - On a symbol operand this indicates that the
+    /// immediate should get the value of the symbol minus the PIC base label:
+    ///    SYMBOL_LABEL - PICBASELABEL
+    MO_PIC_BASE_OFFSET = 2,
+
+    /// MO_GOTOFF - On a symbol operand this indicates that the immediate should
+    /// the offset to the location of the symbol name from the base of the GOT.
+    ///    SYMBOL_LABEL @GOTOFF
+    MO_GOTOFF = 3,
+    
     
     //===------------------------------------------------------------------===//
     // Instruction encodings.  These are the standard/most common forms for X86