mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-01-15 04:13:14 +01:00
[svn r237] some inline asm output now seems to work, see tangotests/asm2.d
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
17
tangotests/asm2.d
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user