mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-15 07:34:33 +00:00
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
This commit is contained in:
parent
95e6effad2
commit
d0ff02cf6f
@ -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";
|
||||
|
@ -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<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
|
||||
|
@ -3829,11 +3829,11 @@ X86TargetLowering::LowerSCALAR_TO_VECTOR(SDOperand Op, SelectionDAG &DAG) {
|
||||
SDOperand
|
||||
X86TargetLowering::LowerConstantPool(SDOperand Op, SelectionDAG &DAG) {
|
||||
ConstantPoolSDNode *CP = cast<ConstantPoolSDNode>(Op);
|
||||
SDOperand Result = DAG.getNode(X86ISD::Wrapper, getPointerTy(),
|
||||
DAG.getTargetConstantPool(CP->getConstVal(),
|
||||
SDOperand Result = DAG.getTargetConstantPool(CP->getConstVal(),
|
||||
getPointerTy(),
|
||||
CP->getAlignment()));
|
||||
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<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 @@ 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<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::LowerBRCOND(SDOperand Op, SelectionDAG &DAG) {
|
||||
|
||||
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_)
|
||||
|
Loading…
x
Reference in New Issue
Block a user