Mercurial > projects > ldc
comparison gen/asmstmt.cpp @ 1053:11e28922ac76
Always pass an address expression (not a var expression) to asm operands of
type Arg_Memory.
This fixes the following code:
{{{
void f(real x) { asm { fld x[RBP]; } }
void g(int x) { asm { mov EAX, x[RBP]; } }
}}}
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Sun, 08 Mar 2009 00:57:58 +0100 |
parents | 1d8a8ecf14e1 |
children | 8bf8b058944a |
comparison
equal
deleted
inserted
replaced
1052:12ea38902e83 | 1053:11e28922ac76 |
---|---|
413 for(it i = clobbers.begin(), e = clobbers.end(); i != e; ++i) { | 413 for(it i = clobbers.begin(), e = clobbers.end(); i != e; ++i) { |
414 clobstr = "~{" + *i + "},"; | 414 clobstr = "~{" + *i + "},"; |
415 asmblock->clobs.insert(clobstr); | 415 asmblock->clobs.insert(clobstr); |
416 } | 416 } |
417 | 417 |
418 if (Logger::enabled()) { | |
419 typedef std::deque<LLValue*>::iterator It; | |
420 { | |
421 Logger::println("Output values:"); | |
422 LOG_SCOPE | |
423 size_t i = 0; | |
424 for (It I = output_values.begin(), E = output_values.end(); I != E; ++I) { | |
425 Logger::cout() << "Out " << i++ << " = " << **I << '\n'; | |
426 } | |
427 } | |
428 { | |
429 Logger::println("Input values:"); | |
430 LOG_SCOPE | |
431 size_t i = 0; | |
432 for (It I = input_values.begin(), E = input_values.end(); I != E; ++I) { | |
433 Logger::cout() << "In " << i++ << " = " << **I << '\n'; | |
434 } | |
435 } | |
436 } | |
437 | |
418 // excessive commas are removed later... | 438 // excessive commas are removed later... |
419 | 439 |
420 // push asm statement | 440 // push asm statement |
421 IRAsmStmt* asmStmt = new IRAsmStmt; | 441 IRAsmStmt* asmStmt = new IRAsmStmt; |
422 asmStmt->code = insnt; | 442 asmStmt->code = insnt; |