comparison 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
comparison
equal deleted inserted replaced
958:89729c76b8ff 959:7e669954db7d
668 llvm::InlineAsm* ia = llvm::InlineAsm::get(fty, code, out_c, true); 668 llvm::InlineAsm* ia = llvm::InlineAsm::get(fty, code, out_c, true);
669 669
670 std::vector<LLValue*> args; 670 std::vector<LLValue*> args;
671 args.insert(args.end(), outargs.begin(), outargs.end()); 671 args.insert(args.end(), outargs.begin(), outargs.end());
672 args.insert(args.end(), inargs.begin(), inargs.end()); 672 args.insert(args.end(), inargs.begin(), inargs.end());
673 llvm::CallInst* call = p->ir->CreateCall(ia, args.begin(), args.end(), ""); 673 llvm::CallInst* call = p->ir->CreateCall(ia, args.begin(), args.end(),
674 retty == LLType::VoidTy ? "" : "asm");
674 675
675 // capture abi return value 676 // capture abi return value
676 if (useabiret) 677 if (useabiret)
677 { 678 {
678 if (p->asmBlock->retemu) 679 IRAsmBlock* block = p->asmBlock;
679 p->asmBlock->asmBlock->abiret = DtoLoad(p->asmBlock->asmBlock->abiret); 680 if (block->retfixup)
681 block->asmBlock->abiret = (*block->retfixup)(p->ir, call);
682 else if (p->asmBlock->retemu)
683 block->asmBlock->abiret = DtoLoad(block->asmBlock->abiret);
680 else 684 else
681 p->asmBlock->asmBlock->abiret = call; 685 block->asmBlock->abiret = call;
682 } 686 }
683 687
684 p->asmBlock = NULL; 688 p->asmBlock = NULL;
685 Logger::println("END ASM"); 689 Logger::println("END ASM");
686 690