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 //////////////////////////////////////////////////////////////////////////////