Changes in directory llvm/lib/Target/X86:
X86ATTAsmPrinter.cpp updated: 1.73 -> 1.74 X86ISelDAGToDAG.cpp updated: 1.130 -> 1.131 X86ISelLowering.cpp updated: 1.296 -> 1.297 --- Log message: Fix for PR1018: http://llvm.org/PR1018 - Better support for X86-64 Linux in small code model. --- Diffs of the changes: (+55 -14) X86ATTAsmPrinter.cpp | 2 +- X86ISelDAGToDAG.cpp | 43 +++++++++++++++++++++++++++++++++++++++++++ X86ISelLowering.cpp | 24 +++++++++++------------- 3 files changed, 55 insertions(+), 14 deletions(-) Index: llvm/lib/Target/X86/X86ATTAsmPrinter.cpp diff -u llvm/lib/Target/X86/X86ATTAsmPrinter.cpp:1.73 llvm/lib/Target/X86/X86ATTAsmPrinter.cpp:1.74 --- llvm/lib/Target/X86/X86ATTAsmPrinter.cpp:1.73 Fri Nov 17 01:52:03 2006 +++ llvm/lib/Target/X86/X86ATTAsmPrinter.cpp Wed Nov 29 17:19:45 2006 @@ -262,7 +262,7 @@ else if (Offset < 0) O << Offset; - if (!isCallOp && + if (isMemOp && Subtarget->is64Bit()) { if (isExt && TM.getRelocationModel() != Reloc::Static) O << "@GOTPCREL"; Index: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp diff -u llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.130 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.131 --- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.130 Mon Nov 27 17:37:22 2006 +++ llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Wed Nov 29 17:19:45 2006 @@ -590,6 +590,49 @@ break; } + case ISD::TargetConstantPool: + if (AM.BaseType == X86ISelAddressMode::RegBase && + AM.Base.Reg.Val == 0 && + AM.CP == 0) { + ConstantPoolSDNode *CP = cast<ConstantPoolSDNode>(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<GlobalAddressSDNode>(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<ExternalSymbolSDNode>(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<JumpTableSDNode>(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 Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.296 llvm/lib/Target/X86/X86ISelLowering.cpp:1.297 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.296 Wed Nov 29 02:28:13 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Wed Nov 29 17:19:46 2006 @@ -3829,11 +3829,11 @@ SDOperand X86TargetLowering::LowerConstantPool(SDOperand Op, SelectionDAG &DAG) { ConstantPoolSDNode *CP = cast<ConstantPoolSDNode>(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 @@ SDOperand X86TargetLowering::LowerGlobalAddress(SDOperand Op, SelectionDAG &DAG) { GlobalValue *GV = cast<GlobalAddressSDNode>(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 @@ 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 @@ SDOperand X86TargetLowering::LowerExternalSymbol(SDOperand Op, SelectionDAG &DAG) { const char *Sym = cast<ExternalSymbolSDNode>(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::LowerJumpTable(SDOperand Op, SelectionDAG &DAG) { JumpTableSDNode *JT = cast<JumpTableSDNode>(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_) _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits