From d416f086cc97976abd4f40adadb3956763ffe4b0 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 15 Oct 2004 04:44:53 +0000 Subject: [PATCH] Give the X86 asm printer the ability to print out addressing modes that have constant displacements from global variables. Patch by Jeff Cohen! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17009 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86AsmPrinter.cpp | 78 +++++++++++++++++++++++++++------------- 1 file changed, 53 insertions(+), 25 deletions(-) diff --git a/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp index 57eb66aefe0..1644e3fa1b5 100644 --- a/lib/Target/X86/X86AsmPrinter.cpp +++ b/lib/Target/X86/X86AsmPrinter.cpp @@ -61,7 +61,8 @@ static bool isMem(const MachineInstr *MI, unsigned Op) { if (MI->getOperand(Op).isConstantPoolIndex()) return true; return Op+4 <= MI->getNumOperands() && MI->getOperand(Op ).isRegister() && isScale(MI->getOperand(Op+1)) && - MI->getOperand(Op+2).isRegister() && MI->getOperand(Op+3).isImmediate(); + MI->getOperand(Op+2).isRegister() && (MI->getOperand(Op+3).isImmediate() || + MI->getOperand(Op+3).isGlobalAddress()); } // SwitchSection - Switch to the specified section of the executable if we are @@ -289,11 +290,17 @@ void X86IntelAsmPrinter::printOp(const MachineOperand &MO, std::cerr << "Shouldn't use addPCDisp() when building X86 MachineInstrs"; abort (); return; - case MachineOperand::MO_GlobalAddress: + case MachineOperand::MO_GlobalAddress: { if (!elideOffsetKeyword) O << "OFFSET "; O << Mang->getValueName(MO.getGlobal()); + int Offset = MO.getOffset(); + if (Offset > 0) + O << " + " << Offset; + else if (Offset < 0) + O << " - " << -Offset; return; + } case MachineOperand::MO_ExternalSymbol: O << MO.getSymbolName(); return; @@ -323,12 +330,12 @@ void X86IntelAsmPrinter::printMemReference(const MachineInstr *MI, unsigned Op){ const MachineOperand &BaseReg = MI->getOperand(Op); int ScaleVal = MI->getOperand(Op+1).getImmedValue(); const MachineOperand &IndexReg = MI->getOperand(Op+2); - int DispVal = MI->getOperand(Op+3).getImmedValue(); + const MachineOperand &DispSpec = MI->getOperand(Op+3); O << "["; bool NeedPlus = false; if (BaseReg.getReg()) { - printOp(BaseReg); + printOp(BaseReg, true); NeedPlus = true; } @@ -340,15 +347,22 @@ void X86IntelAsmPrinter::printMemReference(const MachineInstr *MI, unsigned Op){ NeedPlus = true; } - if (DispVal) { + if (DispSpec.isGlobalAddress()) { if (NeedPlus) - if (DispVal > 0) - O << " + "; - else { - O << " - "; - DispVal = -DispVal; - } - O << DispVal; + O << " + "; + printOp(DispSpec, true); + } else { + int DispVal = DispSpec.getImmedValue(); + if (DispVal) { + if (NeedPlus) + if (DispVal > 0) + O << " + "; + else { + O << " - "; + DispVal = -DispVal; + } + O << DispVal; + } } O << "]"; } @@ -484,10 +498,16 @@ void X86ATTAsmPrinter::printOp(const MachineOperand &MO, bool isCallOp) { std::cerr << "Shouldn't use addPCDisp() when building X86 MachineInstrs"; abort (); return; - case MachineOperand::MO_GlobalAddress: + case MachineOperand::MO_GlobalAddress: { if (!isCallOp) O << '$'; O << Mang->getValueName(MO.getGlobal()); + int Offset = MO.getOffset(); + if (Offset > 0) + O << "+" << Offset; + else if (Offset < 0) + O << Offset; return; + } case MachineOperand::MO_ExternalSymbol: if (!isCallOp) O << '$'; O << MO.getSymbolName(); @@ -517,22 +537,30 @@ void X86ATTAsmPrinter::printMemReference(const MachineInstr *MI, unsigned Op){ const MachineOperand &BaseReg = MI->getOperand(Op); int ScaleVal = MI->getOperand(Op+1).getImmedValue(); const MachineOperand &IndexReg = MI->getOperand(Op+2); - int DispVal = MI->getOperand(Op+3).getImmedValue(); + const MachineOperand &DispSpec = MI->getOperand(Op+3); + + if (DispSpec.isGlobalAddress()) { + printOp(DispSpec, true); + } else { + int DispVal = DispSpec.getImmedValue(); + if (DispVal) + O << DispVal; + } - if (DispVal) O << DispVal; + if (IndexReg.getReg() || BaseReg.getReg()) { + O << "("; + if (BaseReg.getReg()) + printOp(BaseReg); - O << "("; - if (BaseReg.getReg()) - printOp(BaseReg); + if (IndexReg.getReg()) { + O << ","; + printOp(IndexReg); + if (ScaleVal != 1) + O << "," << ScaleVal; + } - if (IndexReg.getReg()) { - O << ","; - printOp(IndexReg); - if (ScaleVal != 1) - O << "," << ScaleVal; + O << ")"; } - - O << ")"; } -- 2.11.0