summaryrefslogtreecommitdiff
path: root/lib/Target/X86/X86ATTAsmPrinter.cpp
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2006-12-05 19:50:18 +0000
committerEvan Cheng <evan.cheng@apple.com>2006-12-05 19:50:18 +0000
commit28b51439f3b99bac332f32778ef26d000dc85301 (patch)
treec82d851ab39889984f951fdeb012fbaa079bb033 /lib/Target/X86/X86ATTAsmPrinter.cpp
parentf2d9ceb5b9dfbd5e50607bab4a87c1244bda0a71 (diff)
downloadllvm-28b51439f3b99bac332f32778ef26d000dc85301.tar.gz
llvm-28b51439f3b99bac332f32778ef26d000dc85301.tar.bz2
llvm-28b51439f3b99bac332f32778ef26d000dc85301.tar.xz
- Switch X86-64 JIT to large code size model.
- Re-enable some codegen niceties for X86-64 static relocation model codegen. - Clean ups, etc. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32238 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/X86ATTAsmPrinter.cpp')
-rwxr-xr-xlib/Target/X86/X86ATTAsmPrinter.cpp17
1 files changed, 11 insertions, 6 deletions
diff --git a/lib/Target/X86/X86ATTAsmPrinter.cpp b/lib/Target/X86/X86ATTAsmPrinter.cpp
index 79963eee1d..62f24db4e8 100755
--- a/lib/Target/X86/X86ATTAsmPrinter.cpp
+++ b/lib/Target/X86/X86ATTAsmPrinter.cpp
@@ -156,7 +156,7 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
}
void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo,
- const char *Modifier) {
+ const char *Modifier, bool NotRIPRel) {
const MachineOperand &MO = MI->getOperand(OpNo);
const MRegisterInfo &RI = *TM.getRegisterInfo();
switch (MO.getType()) {
@@ -192,7 +192,7 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo,
if (X86PICStyle == PICStyle::Stub &&
TM.getRelocationModel() == Reloc::PIC_)
O << "-\"L" << getFunctionNumber() << "$pb\"";
- if (isMemOp && Subtarget->is64Bit())
+ if (isMemOp && Subtarget->is64Bit() && !NotRIPRel)
O << "(%rip)";
return;
}
@@ -210,7 +210,7 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo,
else if (Offset < 0)
O << Offset;
- if (isMemOp && Subtarget->is64Bit())
+ if (isMemOp && Subtarget->is64Bit() && !NotRIPRel)
O << "(%rip)";
return;
}
@@ -267,8 +267,12 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo,
if (isMemOp && Subtarget->is64Bit()) {
if (isExt && TM.getRelocationModel() != Reloc::Static)
- O << "@GOTPCREL";
- O << "(%rip)";
+ O << "@GOTPCREL(%rip)";
+ else if (!NotRIPRel)
+ // Use rip when possible to reduce code size, except when index or
+ // base register are also part of the address. e.g.
+ // foo(%rip)(%rcx,%rax,4) is not legal
+ O << "(%rip)";
}
return;
@@ -329,10 +333,11 @@ void X86ATTAsmPrinter::printMemReference(const MachineInstr *MI, unsigned Op,
return;
}
+ bool NotRIPRel = IndexReg.getReg() || BaseReg.getReg();
if (DispSpec.isGlobalAddress() ||
DispSpec.isConstantPoolIndex() ||
DispSpec.isJumpTableIndex()) {
- printOperand(MI, Op+3, "mem");
+ printOperand(MI, Op+3, "mem", NotRIPRel);
} else {
int DispVal = DispSpec.getImmedValue();
if (DispVal || (!IndexReg.getReg() && !BaseReg.getReg()))