Mercurial > projects > ldc
comparison ir/irfunction.cpp @ 1042:45af482e3832
Updated ABI handling to be more flexible with regard to reusing lvalues and allocating fewer temporaries.
author | Tomas Lindquist Olsen <tomas.l.olsen@gmail.com> |
---|---|
date | Wed, 04 Mar 2009 17:24:25 +0100 |
parents | 9167d492cbc2 |
children | 32ead42679d1 |
comparison
equal
deleted
inserted
replaced
1041:9dca7182aa75 | 1042:45af482e3832 |
---|---|
1 | 1 |
2 #include "gen/llvm.h" | 2 #include "gen/llvm.h" |
3 #include "gen/tollvm.h" | 3 #include "gen/tollvm.h" |
4 #include "gen/abi.h" | 4 #include "gen/abi.h" |
5 #include "gen/dvalue.h" | |
5 #include "ir/irfunction.h" | 6 #include "ir/irfunction.h" |
6 | 7 |
7 #include <sstream> | 8 #include <sstream> |
8 | 9 |
9 ////////////////////////////////////////////////////////////////////////////// | 10 ////////////////////////////////////////////////////////////////////////////// |
21 | 22 |
22 ////////////////////////////////////////////////////////////////////////////// | 23 ////////////////////////////////////////////////////////////////////////////// |
23 ////////////////////////////////////////////////////////////////////////////// | 24 ////////////////////////////////////////////////////////////////////////////// |
24 ////////////////////////////////////////////////////////////////////////////// | 25 ////////////////////////////////////////////////////////////////////////////// |
25 | 26 |
26 llvm::Value* IrFuncTy::putRet(Type* dty, llvm::Value* val) | 27 llvm::Value* IrFuncTy::putRet(Type* dty, DValue* val) |
27 { | 28 { |
28 assert(!arg_sret); | 29 assert(!arg_sret); |
29 if (ret->rewrite) | 30 if (ret->rewrite) |
30 return ret->rewrite->put(dty, val); | 31 return ret->rewrite->put(dty, val); |
31 return val; | 32 return val->getRVal(); |
32 } | 33 } |
33 | 34 |
34 llvm::Value* IrFuncTy::getRet(Type* dty, llvm::Value* val) | 35 llvm::Value* IrFuncTy::getRet(Type* dty, DValue* val) |
35 { | 36 { |
36 assert(!arg_sret); | 37 assert(!arg_sret); |
37 if (ret->rewrite) | 38 if (ret->rewrite) |
38 return ret->rewrite->get(dty, val); | 39 return ret->rewrite->get(dty, val); |
39 return val; | 40 return val->getRVal(); |
40 } | 41 } |
41 | 42 |
42 llvm::Value* IrFuncTy::putParam(Type* dty, int idx, llvm::Value* val) | 43 llvm::Value* IrFuncTy::putParam(Type* dty, int idx, DValue* val) |
43 { | 44 { |
44 assert(idx >= 0 && idx < args.size() && "invalid putParam"); | 45 assert(idx >= 0 && idx < args.size() && "invalid putParam"); |
45 if (args[idx]->rewrite) | 46 if (args[idx]->rewrite) |
46 return args[idx]->rewrite->put(dty, val); | 47 return args[idx]->rewrite->put(dty, val); |
47 return val; | 48 return val->getRVal(); |
48 } | 49 } |
49 | 50 |
50 llvm::Value* IrFuncTy::getParam(Type* dty, int idx, llvm::Value* val) | 51 llvm::Value* IrFuncTy::getParam(Type* dty, int idx, DValue* val) |
51 { | 52 { |
52 assert(idx >= 0 && idx < args.size() && "invalid getParam"); | 53 assert(idx >= 0 && idx < args.size() && "invalid getParam"); |
53 if (args[idx]->rewrite) | 54 if (args[idx]->rewrite) |
54 return args[idx]->rewrite->get(dty, val); | 55 return args[idx]->rewrite->get(dty, val); |
55 return val; | 56 return val->getRVal(); |
57 } | |
58 | |
59 void IrFuncTy::getParam(Type* dty, int idx, DValue* val, llvm::Value* lval) | |
60 { | |
61 assert(idx >= 0 && idx < args.size() && "invalid getParam"); | |
62 | |
63 if (args[idx]->rewrite) | |
64 { | |
65 args[idx]->rewrite->getL(dty, val, lval); | |
66 return; | |
67 } | |
68 | |
69 DtoStore(val->getRVal(), lval); | |
56 } | 70 } |
57 | 71 |
58 ////////////////////////////////////////////////////////////////////////////// | 72 ////////////////////////////////////////////////////////////////////////////// |
59 ////////////////////////////////////////////////////////////////////////////// | 73 ////////////////////////////////////////////////////////////////////////////// |
60 ////////////////////////////////////////////////////////////////////////////// | 74 ////////////////////////////////////////////////////////////////////////////// |