Mercurial > projects > ldc
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 |