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;