mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
[ms-inline-asm] Add support for memory references that have non-immediate
displacements. rdar://12974533 llvm-svn: 175083
This commit is contained in:
parent
0c12b80a10
commit
ed40f84fdc
@ -252,14 +252,15 @@ void X86AsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo,
|
||||
}
|
||||
|
||||
case MachineOperand::MO_Immediate:
|
||||
O << '$' << MO.getImm();
|
||||
if (AsmVariant == 0) O << '$';
|
||||
O << MO.getImm();
|
||||
return;
|
||||
|
||||
case MachineOperand::MO_JumpTableIndex:
|
||||
case MachineOperand::MO_ConstantPoolIndex:
|
||||
case MachineOperand::MO_GlobalAddress:
|
||||
case MachineOperand::MO_ExternalSymbol: {
|
||||
O << '$';
|
||||
if (AsmVariant == 0) O << '$';
|
||||
printSymbolOperand(MO, O);
|
||||
break;
|
||||
}
|
||||
@ -355,19 +356,23 @@ void X86AsmPrinter::printIntelMemReference(const MachineInstr *MI, unsigned Op,
|
||||
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;
|
||||
if (!DispSpec.isImm()) {
|
||||
if (NeedPlus) O << " + ";
|
||||
printOperand(MI, Op+3, O, Modifier, AsmVariant);
|
||||
} else {
|
||||
int64_t DispVal = DispSpec.getImm();
|
||||
if (DispVal || (!IndexReg.getReg() && !BaseReg.getReg())) {
|
||||
if (NeedPlus) {
|
||||
if (DispVal > 0)
|
||||
O << " + ";
|
||||
else {
|
||||
O << " - ";
|
||||
DispVal = -DispVal;
|
||||
}
|
||||
}
|
||||
O << DispVal;
|
||||
}
|
||||
O << DispVal;
|
||||
}
|
||||
}
|
||||
O << ']';
|
||||
}
|
||||
|
||||
|
@ -79,3 +79,26 @@ entry:
|
||||
; CHECK: .att_syntax
|
||||
; CHECK: {{## InlineAsm End|#NO_APP}}
|
||||
}
|
||||
|
||||
@results = global [2 x i32] [i32 3, i32 2], align 4
|
||||
|
||||
define i32* @t30() nounwind ssp {
|
||||
entry:
|
||||
%res = alloca i32*, align 4
|
||||
call void asm sideeffect inteldialect "lea edi, dword ptr $0", "*m,~{edi},~{dirflag},~{fpsr},~{flags}"([2 x i32]* @results) nounwind
|
||||
call void asm sideeffect inteldialect "mov dword ptr $0, edi", "=*m,~{dirflag},~{fpsr},~{flags}"(i32** %res) nounwind
|
||||
%0 = load i32** %res, align 4
|
||||
ret i32* %0
|
||||
; CHECK: t30:
|
||||
; CHECK: {{## InlineAsm Start|#APP}}
|
||||
; CHECK: .intel_syntax
|
||||
; CHECK: lea edi, dword ptr [_results]
|
||||
; CHECK: .att_syntax
|
||||
; CHECK: {{## InlineAsm End|#NO_APP}}
|
||||
; CHECK: {{## InlineAsm Start|#APP}}
|
||||
; CHECK: .intel_syntax
|
||||
; CHECK: mov dword ptr [esp], edi
|
||||
; CHECK: .att_syntax
|
||||
; CHECK: {{## InlineAsm End|#NO_APP}}
|
||||
; CHECK: movl (%esp), %eax
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user