From d0ff02cf6ff3019dc97d49636a055e13d20a0774 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Wed, 29 Nov 2006 23:19:46 +0000 Subject: [PATCH] Fix for PR1018 - Better support for X86-64 Linux in small code model. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32026 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86ATTAsmPrinter.cpp | 2 +- lib/Target/X86/X86ISelDAGToDAG.cpp | 43 +++++++++++++++++++++++++++++ lib/Target/X86/X86ISelLowering.cpp | 24 ++++++++-------- 3 files changed, 55 insertions(+), 14 deletions(-) diff --git a/lib/Target/X86/X86ATTAsmPrinter.cpp b/lib/Target/X86/X86ATTAsmPrinter.cpp index 069eed91d50..7784f621ae8 100755 --- a/lib/Target/X86/X86ATTAsmPrinter.cpp +++ b/lib/Target/X86/X86ATTAsmPrinter.cpp @@ -262,7 +262,7 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo, else if (Offset < 0) O << Offset; - if (!isCallOp && + if (isMemOp && Subtarget->is64Bit()) { if (isExt && TM.getRelocationModel() != Reloc::Static) O << "@GOTPCREL"; diff --git a/lib/Target/X86/X86ISelDAGToDAG.cpp b/lib/Target/X86/X86ISelDAGToDAG.cpp index d85b93decb0..e711d22ed52 100644 --- a/lib/Target/X86/X86ISelDAGToDAG.cpp +++ b/lib/Target/X86/X86ISelDAGToDAG.cpp @@ -590,6 +590,49 @@ bool X86DAGToDAGISel::MatchAddress(SDOperand N, X86ISelAddressMode &AM, break; } + case ISD::TargetConstantPool: + if (AM.BaseType == X86ISelAddressMode::RegBase && + AM.Base.Reg.Val == 0 && + AM.CP == 0) { + ConstantPoolSDNode *CP = cast(N); + AM.CP = CP->getConstVal(); + AM.Align = CP->getAlignment(); + AM.Disp += CP->getOffset(); + return false; + } + break; + + case ISD::TargetGlobalAddress: + if (AM.BaseType == X86ISelAddressMode::RegBase && + AM.Base.Reg.Val == 0 && + AM.GV == 0) { + GlobalAddressSDNode *G = cast(N); + AM.GV = G->getGlobal(); + AM.Disp += G->getOffset(); + return false; + } + break; + + case ISD::TargetExternalSymbol: + if (isRoot && + AM.BaseType == X86ISelAddressMode::RegBase && + AM.Base.Reg.Val == 0) { + ExternalSymbolSDNode *S = cast(N.getOperand(0)); + AM.ES = S->getSymbol(); + return false; + } + break; + + case ISD::TargetJumpTable: + if (isRoot && + AM.BaseType == X86ISelAddressMode::RegBase && + AM.Base.Reg.Val == 0) { + JumpTableSDNode *J = cast(N.getOperand(0)); + AM.JT = J->getIndex(); + return false; + } + break; + case X86ISD::Wrapper: // If value is available in a register both base and index components have // been picked, we can't fit the result available in the register in the diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 23ed5df0a01..67effad7976 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -3829,11 +3829,11 @@ X86TargetLowering::LowerSCALAR_TO_VECTOR(SDOperand Op, SelectionDAG &DAG) { SDOperand X86TargetLowering::LowerConstantPool(SDOperand Op, SelectionDAG &DAG) { ConstantPoolSDNode *CP = cast(Op); - SDOperand Result = DAG.getNode(X86ISD::Wrapper, getPointerTy(), - DAG.getTargetConstantPool(CP->getConstVal(), - getPointerTy(), - CP->getAlignment())); + SDOperand Result = DAG.getTargetConstantPool(CP->getConstVal(), + getPointerTy(), + CP->getAlignment()); if (Subtarget->isTargetDarwin()) { + Result = DAG.getNode(X86ISD::Wrapper, getPointerTy(), Result); // With PIC, the address is actually $g + Offset. if (!Subtarget->is64Bit() && getTargetMachine().getRelocationModel() == Reloc::PIC_) @@ -3847,10 +3847,9 @@ X86TargetLowering::LowerConstantPool(SDOperand Op, SelectionDAG &DAG) { SDOperand X86TargetLowering::LowerGlobalAddress(SDOperand Op, SelectionDAG &DAG) { GlobalValue *GV = cast(Op)->getGlobal(); - SDOperand Result = DAG.getNode(X86ISD::Wrapper, getPointerTy(), - DAG.getTargetGlobalAddress(GV, - getPointerTy())); + SDOperand Result = DAG.getTargetGlobalAddress(GV, getPointerTy()); if (Subtarget->isTargetDarwin()) { + Result = DAG.getNode(X86ISD::Wrapper, getPointerTy(), Result); // With PIC, the address is actually $g + Offset. if (!Subtarget->is64Bit() && getTargetMachine().getRelocationModel() == Reloc::PIC_) @@ -3866,6 +3865,7 @@ X86TargetLowering::LowerGlobalAddress(SDOperand Op, SelectionDAG &DAG) { Subtarget->GVRequiresExtraLoad(GV, false)) Result = DAG.getLoad(getPointerTy(), DAG.getEntryNode(), Result, NULL, 0); } else if (Subtarget->GVRequiresExtraLoad(GV, false)) { + Result = DAG.getNode(X86ISD::Wrapper, getPointerTy(), Result); Result = DAG.getLoad(getPointerTy(), DAG.getEntryNode(), Result, NULL, 0); } @@ -3875,10 +3875,9 @@ X86TargetLowering::LowerGlobalAddress(SDOperand Op, SelectionDAG &DAG) { SDOperand X86TargetLowering::LowerExternalSymbol(SDOperand Op, SelectionDAG &DAG) { const char *Sym = cast(Op)->getSymbol(); - SDOperand Result = DAG.getNode(X86ISD::Wrapper, getPointerTy(), - DAG.getTargetExternalSymbol(Sym, - getPointerTy())); + SDOperand Result = DAG.getTargetExternalSymbol(Sym, getPointerTy()); if (Subtarget->isTargetDarwin()) { + Result = DAG.getNode(X86ISD::Wrapper, getPointerTy(), Result); // With PIC, the address is actually $g + Offset. if (!Subtarget->is64Bit() && getTargetMachine().getRelocationModel() == Reloc::PIC_) @@ -4244,10 +4243,9 @@ SDOperand X86TargetLowering::LowerBRCOND(SDOperand Op, SelectionDAG &DAG) { SDOperand X86TargetLowering::LowerJumpTable(SDOperand Op, SelectionDAG &DAG) { JumpTableSDNode *JT = cast(Op); - SDOperand Result = DAG.getNode(X86ISD::Wrapper, getPointerTy(), - DAG.getTargetJumpTable(JT->getIndex(), - getPointerTy())); + SDOperand Result = DAG.getTargetJumpTable(JT->getIndex(), getPointerTy()); if (Subtarget->isTargetDarwin()) { + Result = DAG.getNode(X86ISD::Wrapper, getPointerTy(), Result); // With PIC, the address is actually $g + Offset. if (!Subtarget->is64Bit() && getTargetMachine().getRelocationModel() == Reloc::PIC_) -- 2.34.1