mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-01 09:18:30 +00:00
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
This commit is contained in:
parent
fb3d844e50
commit
d416f086cc
@ -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,6 +347,12 @@ void X86IntelAsmPrinter::printMemReference(const MachineInstr *MI, unsigned Op){
|
||||
NeedPlus = true;
|
||||
}
|
||||
|
||||
if (DispSpec.isGlobalAddress()) {
|
||||
if (NeedPlus)
|
||||
O << " + ";
|
||||
printOp(DispSpec, true);
|
||||
} else {
|
||||
int DispVal = DispSpec.getImmedValue();
|
||||
if (DispVal) {
|
||||
if (NeedPlus)
|
||||
if (DispVal > 0)
|
||||
@ -350,6 +363,7 @@ void X86IntelAsmPrinter::printMemReference(const MachineInstr *MI, unsigned Op){
|
||||
}
|
||||
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,10 +537,17 @@ 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 (DispVal) O << DispVal;
|
||||
if (DispSpec.isGlobalAddress()) {
|
||||
printOp(DispSpec, true);
|
||||
} else {
|
||||
int DispVal = DispSpec.getImmedValue();
|
||||
if (DispVal)
|
||||
O << DispVal;
|
||||
}
|
||||
|
||||
if (IndexReg.getReg() || BaseReg.getReg()) {
|
||||
O << "(";
|
||||
if (BaseReg.getReg())
|
||||
printOp(BaseReg);
|
||||
@ -534,6 +561,7 @@ void X86ATTAsmPrinter::printMemReference(const MachineInstr *MI, unsigned Op){
|
||||
|
||||
O << ")";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// printMachineInstruction -- Print out a single X86 LLVM instruction
|
||||
|
Loading…
Reference in New Issue
Block a user