diff gen/asmstmt.cpp @ 959:7e669954db7d

Implement implicit return after inline asm on x86_64
author Frits van Bommel <fvbommel wxs.nl>
date Sun, 15 Feb 2009 18:04:22 +0100
parents e048e36bc155
children fe2d9bb7078d
line wrap: on
line diff
--- a/gen/asmstmt.cpp	Sun Feb 15 14:54:36 2009 +0100
+++ b/gen/asmstmt.cpp	Sun Feb 15 18:04:22 2009 +0100
@@ -670,15 +670,19 @@
     std::vector<LLValue*> args;
     args.insert(args.end(), outargs.begin(), outargs.end());
     args.insert(args.end(), inargs.begin(), inargs.end());
-    llvm::CallInst* call = p->ir->CreateCall(ia, args.begin(), args.end(), "");
+    llvm::CallInst* call = p->ir->CreateCall(ia, args.begin(), args.end(),
+        retty == LLType::VoidTy ? "" : "asm");
 
     // capture abi return value
     if (useabiret)
     {
-        if (p->asmBlock->retemu)
-        p->asmBlock->asmBlock->abiret = DtoLoad(p->asmBlock->asmBlock->abiret);
+        IRAsmBlock* block = p->asmBlock;
+        if (block->retfixup)
+            block->asmBlock->abiret = (*block->retfixup)(p->ir, call);
+        else if (p->asmBlock->retemu)
+            block->asmBlock->abiret = DtoLoad(block->asmBlock->abiret);
         else
-        p->asmBlock->asmBlock->abiret = call;
+            block->asmBlock->abiret = call;
     }
 
     p->asmBlock = NULL;