aboutsummaryrefslogtreecommitdiffstats
path: root/qv4isel_llvm.cpp
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2012-06-06 13:43:50 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2012-06-06 13:43:50 +0200
commitc3f50fdb95d3b53665271758947fee69ba9e61e1 (patch)
tree83f52db768f60fbad7be0568715454d961efdda4 /qv4isel_llvm.cpp
parentf0ee49c6a46b7474fc24fdb82ae02ad7482d892b (diff)
Generate LLVM code for MoveMember
Diffstat (limited to 'qv4isel_llvm.cpp')
-rw-r--r--qv4isel_llvm.cpp37
1 files changed, 16 insertions, 21 deletions
diff --git a/qv4isel_llvm.cpp b/qv4isel_llvm.cpp
index 3822fb600b..fbe1568b1a 100644
--- a/qv4isel_llvm.cpp
+++ b/qv4isel_llvm.cpp
@@ -231,20 +231,25 @@ void LLVMInstructionSelection::genMoveSubscript(IR::Move *s)
_llvmFunction->arg_begin(), base, index, source);
}
+void LLVMInstructionSelection::genMoveMember(IR::Move *s)
+{
+ IR::Member *m = s->target->asMember();
+ llvm::Value *base = getLLVMTempReference(m->base);
+ llvm::Value *name = getIdentifier(*m->name);
+ llvm::Value *source = getLLVMTempReference(s->source);
+ CreateCall4(_llvmModule->getFunction("__qmljs_llvm_set_property"),
+ _llvmFunction->arg_begin(), base, name, source);
+}
+
void LLVMInstructionSelection::visitMove(IR::Move *s)
{
if (s->target->asSubscript()) {
genMoveSubscript(s);
- return;
- }
- if (IR::Temp *t = s->target->asTemp()) {
+ } else if (s->target->asMember()) {
+ genMoveMember(s);
+ } else if (IR::Temp *t = s->target->asTemp()) {
llvm::Value *target = getLLVMTemp(t);
llvm::Value *source = getLLVMValue(s->source);
- assert(source);
- if (source->getType()->getPointerTo() != target->getType()) {
- source->dump();
- assert(!"not cool");
- }
CreateStore(source, target);
return;
}
@@ -541,16 +546,9 @@ void LLVMInstructionSelection::visitNew(IR::New *e)
void LLVMInstructionSelection::visitSubscript(IR::Subscript *e)
{
- IR::Temp *t = e->base->asTemp();
llvm::Value *result = newLLVMTemp(_valueTy);
- llvm::Value *base = getLLVMTemp(t);
- llvm::Value *index = 0;
- if (IR::Temp *i = e->index->asTemp())
- index = getLLVMTemp(i);
- else {
- index = newLLVMTemp(_valueTy);
- CreateStore(getLLVMValue(e->index), index);
- }
+ llvm::Value *base = getLLVMTempReference(e->base);
+ llvm::Value *index = getLLVMTempReference(e->index);
CreateCall4(_llvmModule->getFunction("__qmljs_llvm_get_element"),
_llvmFunction->arg_begin(), result, base, index);
_llvmValue = CreateLoad(result);
@@ -558,11 +556,8 @@ void LLVMInstructionSelection::visitSubscript(IR::Subscript *e)
void LLVMInstructionSelection::visitMember(IR::Member *e)
{
- IR::Temp *t = e->base->asTemp();
- assert(t);
-
llvm::Value *result = newLLVMTemp(_valueTy);
- llvm::Value *base = getLLVMTemp(t);
+ llvm::Value *base = getLLVMTempReference(e->base);
llvm::Value *name = getIdentifier(*e->name);
CreateCall4(_llvmModule->getFunction("__qmljs_llvm_get_property"),