[svn r237] some inline asm output now seems to work, see tangotests/asm2.d

This commit is contained in:
Tomas Lindquist Olsen
2008-06-06 20:51:43 +02:00
parent 346d04aa8a
commit b917fe2f00
3 changed files with 31 additions and 4 deletions

View File

@@ -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; i<cn; ++i)
{
LLValue* val = output_values[i]->getLVal();
LLValue* val = output_values[i]->getRVal();
callargs.push_back(val);
}

View File

@@ -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);
}
}

17
tangotests/asm2.d Normal file
View File

@@ -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;
}