diff --git a/gen/asmstmt.cpp b/gen/asmstmt.cpp index 9fab499f..bca2f738 100644 --- a/gen/asmstmt.cpp +++ b/gen/asmstmt.cpp @@ -257,7 +257,7 @@ AsmStatement::toIR(IRState * irs) static std::string i_cns = "i"; static std::string p_cns = "p"; static std::string m_cns = "m"; - static std::string mw_cns = "=m"; + static std::string mw_cns = "=*m"; static std::string mrw_cns = "+m"; static std::string memory_name = "memory"; @@ -457,7 +457,7 @@ std::cout << *t << std::endl; size_t cn = output_values.size(); for (size_t i=0; igetLVal(); + LLValue* val = output_values[i]->getRVal(); callargs.push_back(val); } diff --git a/gen/d-asm-i386.h b/gen/d-asm-i386.h index 82f0c4f3..a14a87f9 100644 --- a/gen/d-asm-i386.h +++ b/gen/d-asm-i386.h @@ -1855,8 +1855,12 @@ struct AsmProcessor ((operand->baseReg == Reg_EBP && ! sc->func->naked ) || (operand->baseReg == Reg_ESP && sc->func->naked)) ) { - e = new AddrExp(0, e); - e->type = decl->type->pointerTo(); + if (mode == Mode_Output) + { + e = new AddrExp(0, e); + e->type = decl->type->pointerTo(); + } + #if !IN_LLVM /* DMD uses the same frame offsets for naked functions. */ if (sc->func->naked) @@ -1909,6 +1913,12 @@ struct AsmProcessor insnTemplate->writebyte('*'); use_star = false; } + if (mode == Mode_Output) + { + e = new AddrExp(0, e); + assert(decl); + e->type = decl->type->pointerTo(); + } addOperand(fmt, Arg_Memory, e, asmcode, mode); } } diff --git a/tangotests/asm2.d b/tangotests/asm2.d new file mode 100644 index 00000000..124d9109 --- /dev/null +++ b/tangotests/asm2.d @@ -0,0 +1,17 @@ +module tangotests.asm2; + +extern(C) int printf(char*, ...); + +int main() +{ + int i = 40; + asm + { + mov EAX, i; + add EAX, 2; + mov i, EAX; + } + printf("42 = %d\n", i); + assert(i == 42); + return 0; +}