aboutsummaryrefslogtreecommitdiffstats
path: root/qv4isel_llvm.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@digia.com>2012-10-22 10:33:04 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2012-10-22 11:07:27 +0200
commitaf06d1a1a5db83a290a4518272f9aa05423ccdc7 (patch)
tree42787b51e2e2c6e33fe34bcfd76401d55058a8f9 /qv4isel_llvm.cpp
parent6d05c917cea8e564014c52199a81ea84aedc1130 (diff)
More LLVM code generation. This should complete the expressions.
Change-Id: Ic920ceb85cab38093b565acd1c14aeddf20d0bb3 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'qv4isel_llvm.cpp')
-rw-r--r--qv4isel_llvm.cpp139
1 files changed, 69 insertions, 70 deletions
diff --git a/qv4isel_llvm.cpp b/qv4isel_llvm.cpp
index 950f855bd4..eae3bc46a3 100644
--- a/qv4isel_llvm.cpp
+++ b/qv4isel_llvm.cpp
@@ -432,22 +432,21 @@ void LLVMInstructionSelection::visitMove(IR::Move *s)
return;
}
} else {
- // inplace assignment, e.g. x += 1, ++x, ...
if (IR::Temp *t = s->target->asTemp()) {
if (IR::Temp *t2 = s->source->asTemp()) {
const char *opName = 0;
switch (s->op) {
-// case IR::OpBitAnd: setOp(op, opName, __qmljs_bit_and); break;
-// case IR::OpBitOr: setOp(op, opName, __qmljs_bit_or); break;
-// case IR::OpBitXor: setOp(op, opName, __qmljs_bit_xor); break;
+ case IR::OpBitAnd: opName = "__qmljs_llvm_bit_and"; break;
+ case IR::OpBitOr: opName = "__qmljs_llvm_bit_or"; break;
+ case IR::OpBitXor: opName = "__qmljs_llvm_bit_xor"; break;
case IR::OpAdd: opName = "__qmljs_llvm_add"; break;
-// case IR::OpSub: setOp(op, opName, __qmljs_sub); break;
-// case IR::OpMul: setOp(op, opName, __qmljs_mul); break;
-// case IR::OpDiv: setOp(op, opName, __qmljs_div); break;
-// case IR::OpMod: setOp(op, opName, __qmljs_mod); break;
-// case IR::OpLShift: setOp(op, opName, __qmljs_shl); break;
-// case IR::OpRShift: setOp(op, opName, __qmljs_shr); break;
-// case IR::OpURShift: setOp(op, opName, __qmljs_ushr); break;
+ case IR::OpSub: opName = "__qmljs_llvm_sub"; break;
+ case IR::OpMul: opName = "__qmljs_llvm_mul"; break;
+ case IR::OpDiv: opName = "__qmljs_llvm_div"; break;
+ case IR::OpMod: opName = "__qmljs_llvm_mod"; break;
+ case IR::OpLShift: opName = "__qmljs_llvm_shl"; break;
+ case IR::OpRShift: opName = "__qmljs_llvm_shr"; break;
+ case IR::OpURShift: opName = "__qmljs_llvm_ushr"; break;
default:
Q_UNREACHABLE();
break;
@@ -463,7 +462,7 @@ void LLVMInstructionSelection::visitMove(IR::Move *s)
}
}
} else if (IR::Name *n = s->target->asName()) {
- qDebug()<<__FILE__<<__LINE__;
+ // inplace assignment, e.g. x += 1, ++x, ...
if (IR::Temp *t = s->source->asTemp()) {
const char *opName = 0;
switch (s->op) {
@@ -492,65 +491,65 @@ void LLVMInstructionSelection::visitMove(IR::Move *s)
}
}
} else if (IR::Subscript *ss = s->target->asSubscript()) {
- qDebug()<<__FILE__<<__LINE__;
-// if (IR::Temp *t = s->source->asTemp()) {
-// void (*op)(Value base, Value index, Value value, Context *ctx) = 0;
-// const char *opName = 0;
-// switch (s->op) {
-// case IR::OpBitAnd: setOp(op, opName, __qmljs_inplace_bit_and_element); break;
-// case IR::OpBitOr: setOp(op, opName, __qmljs_inplace_bit_or_element); break;
-// case IR::OpBitXor: setOp(op, opName, __qmljs_inplace_bit_xor_element); break;
-// case IR::OpAdd: setOp(op, opName, __qmljs_inplace_add_element); break;
-// case IR::OpSub: setOp(op, opName, __qmljs_inplace_sub_element); break;
-// case IR::OpMul: setOp(op, opName, __qmljs_inplace_mul_element); break;
-// case IR::OpDiv: setOp(op, opName, __qmljs_inplace_div_element); break;
-// case IR::OpMod: setOp(op, opName, __qmljs_inplace_mod_element); break;
-// case IR::OpLShift: setOp(op, opName, __qmljs_inplace_shl_element); break;
-// case IR::OpRShift: setOp(op, opName, __qmljs_inplace_shr_element); break;
-// case IR::OpURShift: setOp(op, opName, __qmljs_inplace_ushr_element); break;
-// default:
-// Q_UNREACHABLE();
-// break;
-// }
-
-// if (op) {
-// IR::Temp* base = ss->base->asTemp();
-// IR::Temp* index = ss->index->asTemp();
-// generateFunctionCallImp(Void, opName, op, base, index, t, ContextRegister);
-// checkExceptions();
-// }
-// return;
-// }
+ if (IR::Temp *t = s->source->asTemp()) {
+ const char *opName = 0;
+ switch (s->op) {
+ case IR::OpBitAnd: opName = "__qmljs_llvm_inplace_bit_and_element"; break;
+ case IR::OpBitOr: opName = "__qmljs_llvm_inplace_bit_or_element"; break;
+ case IR::OpBitXor: opName = "__qmljs_llvm_inplace_bit_xor_element"; break;
+ case IR::OpAdd: opName = "__qmljs_llvm_inplace_add_element"; break;
+ case IR::OpSub: opName = "__qmljs_llvm_inplace_sub_element"; break;
+ case IR::OpMul: opName = "__qmljs_llvm_inplace_mul_element"; break;
+ case IR::OpDiv: opName = "__qmljs_llvm_inplace_div_element"; break;
+ case IR::OpMod: opName = "__qmljs_llvm_inplace_mod_element"; break;
+ case IR::OpLShift: opName = "__qmljs_llvm_inplace_shl_element"; break;
+ case IR::OpRShift: opName = "__qmljs_llvm_inplace_shr_element"; break;
+ case IR::OpURShift: opName = "__qmljs_llvm_inplace_ushr_element"; break;
+ default:
+ Q_UNREACHABLE();
+ break;
+ }
+
+ if (opName) {
+ llvm::Value *base = getLLVMTemp(ss->base->asTemp());
+ llvm::Value *index = getLLVMTemp(ss->index->asTemp());
+ llvm::Value *value = getLLVMTemp(t);
+ CreateCall4(_llvmModule->getFunction(opName),
+ _llvmFunction->arg_begin(), base, index, value);
+ // TODO: checkExceptions();
+ }
+ return;
+ }
} else if (IR::Member *m = s->target->asMember()) {
- qDebug()<<__FILE__<<__LINE__;
-// if (IR::Temp *t = s->source->asTemp()) {
-// void (*op)(Value value, Value base, String *name, Context *ctx) = 0;
-// const char *opName = 0;
-// switch (s->op) {
-// case IR::OpBitAnd: setOp(op, opName, __qmljs_inplace_bit_and_member); break;
-// case IR::OpBitOr: setOp(op, opName, __qmljs_inplace_bit_or_member); break;
-// case IR::OpBitXor: setOp(op, opName, __qmljs_inplace_bit_xor_member); break;
-// case IR::OpAdd: setOp(op, opName, __qmljs_inplace_add_member); break;
-// case IR::OpSub: setOp(op, opName, __qmljs_inplace_sub_member); break;
-// case IR::OpMul: setOp(op, opName, __qmljs_inplace_mul_member); break;
-// case IR::OpDiv: setOp(op, opName, __qmljs_inplace_div_member); break;
-// case IR::OpMod: setOp(op, opName, __qmljs_inplace_mod_member); break;
-// case IR::OpLShift: setOp(op, opName, __qmljs_inplace_shl_member); break;
-// case IR::OpRShift: setOp(op, opName, __qmljs_inplace_shr_member); break;
-// case IR::OpURShift: setOp(op, opName, __qmljs_inplace_ushr_member); break;
-// default:
-// Q_UNREACHABLE();
-// break;
-// }
-
-// if (op) {
-// IR::Temp* base = m->base->asTemp();
-// String* member = identifier(*m->name);
-// generateFunctionCallImp(Void, opName, op, t, base, member, ContextRegister);
-// checkExceptions();
-// }
-// return;
-// }
+ if (IR::Temp *t = s->source->asTemp()) {
+ const char *opName = 0;
+ switch (s->op) {
+ case IR::OpBitAnd: opName = "__qmljs_llvm_inplace_bit_and_member"; break;
+ case IR::OpBitOr: opName = "__qmljs_llvm_inplace_bit_or_member"; break;
+ case IR::OpBitXor: opName = "__qmljs_llvm_inplace_bit_xor_member"; break;
+ case IR::OpAdd: opName = "__qmljs_llvm_inplace_add_member"; break;
+ case IR::OpSub: opName = "__qmljs_llvm_inplace_sub_member"; break;
+ case IR::OpMul: opName = "__qmljs_llvm_inplace_mul_member"; break;
+ case IR::OpDiv: opName = "__qmljs_llvm_inplace_div_member"; break;
+ case IR::OpMod: opName = "__qmljs_llvm_inplace_mod_member"; break;
+ case IR::OpLShift: opName = "__qmljs_llvm_inplace_shl_member"; break;
+ case IR::OpRShift: opName = "__qmljs_llvm_inplace_shr_member"; break;
+ case IR::OpURShift: opName = "__qmljs_llvm_inplace_ushr_member"; break;
+ default:
+ Q_UNREACHABLE();
+ break;
+ }
+
+ if (opName) {
+ llvm::Value *base = getLLVMTemp(m->base->asTemp());
+ llvm::Value *member = getIdentifier(*m->name);
+ llvm::Value *value = getLLVMTemp(t);
+ CreateCall4(_llvmModule->getFunction(opName),
+ _llvmFunction->arg_begin(), value, base, member);
+ // TODO: checkExceptions();
+ }
+ return;
+ }
}
}