1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 11:13:28 +01:00

[ms-inline asm] Add support in the X86AsmPrinter for printing memory references

in the Intel syntax.

The MC layer supports emitting in the Intel syntax, but this would require the
inline assembly MachineInstr to be lowered to an MCInst before emission.  This
is potential future work, but for now emitting directly from the MachineInstr
suffices.

llvm-svn: 165173
This commit is contained in:
Chad Rosier 2012-10-03 22:06:44 +00:00
parent 4b2b328da8
commit 711da11038
3 changed files with 70 additions and 0 deletions

View File

@ -365,6 +365,53 @@ void X86AsmPrinter::printMemReference(const MachineInstr *MI, unsigned Op,
printLeaMemReference(MI, Op, O, Modifier); printLeaMemReference(MI, Op, O, Modifier);
} }
void X86AsmPrinter::printIntelMemReference(const MachineInstr *MI, unsigned Op,
raw_ostream &O, const char *Modifier,
unsigned AsmVariant){
const MachineOperand &BaseReg = MI->getOperand(Op);
unsigned ScaleVal = MI->getOperand(Op+1).getImm();
const MachineOperand &IndexReg = MI->getOperand(Op+2);
const MachineOperand &DispSpec = MI->getOperand(Op+3);
const MachineOperand &SegReg = MI->getOperand(Op+4);
// If this has a segment register, print it.
if (SegReg.getReg()) {
printOperand(MI, Op+4, O, Modifier, AsmVariant);
O << ':';
}
O << '[';
bool NeedPlus = false;
if (BaseReg.getReg()) {
printOperand(MI, Op, O, Modifier, AsmVariant);
NeedPlus = true;
}
if (IndexReg.getReg()) {
if (NeedPlus) O << " + ";
if (ScaleVal != 1)
O << ScaleVal << '*';
printOperand(MI, Op+2, O, Modifier, AsmVariant);
NeedPlus = true;
}
assert (DispSpec.isImm() && "Displacement is not an immediate!");
int64_t DispVal = DispSpec.getImm();
if (DispVal || (!IndexReg.getReg() && !BaseReg.getReg())) {
if (NeedPlus) {
if (DispVal > 0)
O << " + ";
else {
O << " - ";
DispVal = -DispVal;
}
}
O << DispVal;
}
O << ']';
}
void X86AsmPrinter::printPICLabel(const MachineInstr *MI, unsigned Op, void X86AsmPrinter::printPICLabel(const MachineInstr *MI, unsigned Op,
raw_ostream &O) { raw_ostream &O) {
O << *MF->getPICBaseSymbol() << '\n'; O << *MF->getPICBaseSymbol() << '\n';
@ -481,6 +528,11 @@ bool X86AsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,
unsigned OpNo, unsigned AsmVariant, unsigned OpNo, unsigned AsmVariant,
const char *ExtraCode, const char *ExtraCode,
raw_ostream &O) { raw_ostream &O) {
if (AsmVariant) {
printIntelMemReference(MI, OpNo, O);
return false;
}
if (ExtraCode && ExtraCode[0]) { if (ExtraCode && ExtraCode[0]) {
if (ExtraCode[1] != 0) return true; // Unknown modifier. if (ExtraCode[1] != 0) return true; // Unknown modifier.

View File

@ -70,6 +70,10 @@ class LLVM_LIBRARY_VISIBILITY X86AsmPrinter : public AsmPrinter {
void printPICLabel(const MachineInstr *MI, unsigned Op, raw_ostream &O); void printPICLabel(const MachineInstr *MI, unsigned Op, raw_ostream &O);
void printIntelMemReference(const MachineInstr *MI, unsigned Op,
raw_ostream &O, const char *Modifier=NULL,
unsigned AsmVariant = 1);
bool runOnMachineFunction(MachineFunction &F); bool runOnMachineFunction(MachineFunction &F);
void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS); void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);

View File

@ -24,3 +24,17 @@ entry:
; CHECK: .att_syntax ; CHECK: .att_syntax
; CHECK: {{## InlineAsm End|#NO_APP}} ; CHECK: {{## InlineAsm End|#NO_APP}}
} }
define void @t3(i32 %V) nounwind {
entry:
%V.addr = alloca i32, align 4
store i32 %V, i32* %V.addr, align 4
call void asm sideeffect inteldialect "mov eax, DWORD PTR [$0]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %V.addr) nounwind
ret void
; CHECK: t3
; CHECK: {{## InlineAsm Start|#APP}}
; CHECK: .intel_syntax
; CHECK: mov eax, DWORD PTR {{[[esp]}}
; CHECK: .att_syntax
; CHECK: {{## InlineAsm End|#NO_APP}}
}