aboutsummaryrefslogtreecommitdiffstats
path: root/qv4isel_llvm.cpp
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2012-06-06 13:30:03 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2012-06-06 13:30:03 +0200
commitf0ee49c6a46b7474fc24fdb82ae02ad7482d892b (patch)
tree7f3cebefb1030e302cb3905b53dc5c165134a8ec /qv4isel_llvm.cpp
parentb3fbdb62f70000a0722cc60720a12baf26690d19 (diff)
Lower subscripts
Diffstat (limited to 'qv4isel_llvm.cpp')
-rw-r--r--qv4isel_llvm.cpp40
1 files changed, 38 insertions, 2 deletions
diff --git a/qv4isel_llvm.cpp b/qv4isel_llvm.cpp
index f92e8f05de..3822fb600b 100644
--- a/qv4isel_llvm.cpp
+++ b/qv4isel_llvm.cpp
@@ -144,6 +144,16 @@ llvm::Value *LLVMInstructionSelection::getLLVMValue(IR::Expr *expr)
return llvmValue;
}
+llvm::Value *LLVMInstructionSelection::getLLVMTempReference(IR::Expr *expr)
+{
+ if (IR::Temp *t = expr->asTemp())
+ return getLLVMTemp(t);
+
+ llvm::Value *addr = newLLVMTemp(_valueTy);
+ CreateStore(getLLVMValue(expr), addr);
+ return addr;
+}
+
llvm::Value *LLVMInstructionSelection::getLLVMCondition(IR::Expr *expr)
{
llvm::Value *value = 0;
@@ -211,8 +221,22 @@ void LLVMInstructionSelection::visitLeave(IR::Leave *)
Q_UNREACHABLE();
}
+void LLVMInstructionSelection::genMoveSubscript(IR::Move *s)
+{
+ IR::Subscript *subscript = s->target->asSubscript();
+ llvm::Value *base = getLLVMTempReference(subscript->base);
+ llvm::Value *index = getLLVMTempReference(subscript->index);
+ llvm::Value *source = getLLVMTempReference(s->source);
+ CreateCall4(_llvmModule->getFunction("__qmljs_llvm_set_element"),
+ _llvmFunction->arg_begin(), base, index, source);
+}
+
void LLVMInstructionSelection::visitMove(IR::Move *s)
{
+ if (s->target->asSubscript()) {
+ genMoveSubscript(s);
+ return;
+ }
if (IR::Temp *t = s->target->asTemp()) {
llvm::Value *target = getLLVMTemp(t);
llvm::Value *source = getLLVMValue(s->source);
@@ -515,9 +539,21 @@ void LLVMInstructionSelection::visitNew(IR::New *e)
}
}
-void LLVMInstructionSelection::visitSubscript(IR::Subscript *)
+void LLVMInstructionSelection::visitSubscript(IR::Subscript *e)
{
- Q_UNIMPLEMENTED();
+ 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);
+ }
+ CreateCall4(_llvmModule->getFunction("__qmljs_llvm_get_element"),
+ _llvmFunction->arg_begin(), result, base, index);
+ _llvmValue = CreateLoad(result);
}
void LLVMInstructionSelection::visitMember(IR::Member *e)