aboutsummaryrefslogtreecommitdiffstats
path: root/qv4isel_masm.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2012-10-25 16:31:12 +0200
committerErik Verbruggen <erik.verbruggen@digia.com>2012-11-12 09:40:06 +0100
commitfa3b6bd3fc7f2cc7060286b7c8ad14450533a5a6 (patch)
tree39b714b2956d0b94bb35a77913f5b3208a1d5459 /qv4isel_masm.cpp
parentbc42b47a117df146bf57a0bd6ec43acd515de4d6 (diff)
Allow Const's as operands to Binop
This allows us to use expressions such as %x = %y + const in the IR. This still requires an implementation for moth. Change-Id: I134e96ddad08bcbe4f3ea5fa27c5338a96acac80 Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
Diffstat (limited to 'qv4isel_masm.cpp')
-rw-r--r--qv4isel_masm.cpp14
1 files changed, 6 insertions, 8 deletions
diff --git a/qv4isel_masm.cpp b/qv4isel_masm.cpp
index 2deab59719..250d3241a3 100644
--- a/qv4isel_masm.cpp
+++ b/qv4isel_masm.cpp
@@ -440,9 +440,8 @@ void InstructionSelection::visitMove(IR::Move *s)
return;
}
} else if (IR::Binop *b = s->source->asBinop()) {
- IR::Temp *l = b->left->asTemp();
- IR::Temp *r = b->right->asTemp();
- if (l && r) {
+ if ((b->left->asTemp() || b->left->asConst()) &&
+ (b->right->asTemp() || b->right->asConst())) {
Value (*op)(const Value, const Value, Context *) = 0;
const char* opName = 0;
@@ -485,7 +484,7 @@ void InstructionSelection::visitMove(IR::Move *s)
}
if (op) {
- generateFunctionCallImp(t, opName, op, l, r, ContextRegister);
+ generateFunctionCallImp(t, opName, op, b->left, b->right, ContextRegister);
}
return;
}
@@ -670,9 +669,8 @@ void InstructionSelection::visitCJump(IR::CJump *s)
jumpToBlock(s->iffalse);
return;
} else if (IR::Binop *b = s->cond->asBinop()) {
- IR::Temp *l = b->left->asTemp();
- IR::Temp *r = b->right->asTemp();
- if (l && r) {
+ if ((b->left->asTemp() || b->left->asConst()) &&
+ (b->right->asTemp() || b->right->asConst())) {
Bool (*op)(const Value, const Value, Context *ctx) = 0;
const char *opName = 0;
switch (b->op) {
@@ -689,7 +687,7 @@ void InstructionSelection::visitCJump(IR::CJump *s)
case IR::OpIn: setOp(op, opName, __qmljs_cmp_in); break;
} // switch
- generateFunctionCallImp(ReturnValueRegister, opName, op, l, r, ContextRegister);
+ generateFunctionCallImp(ReturnValueRegister, opName, op, b->left, b->right, ContextRegister);
Jump target = branch32(NotEqual, ReturnValueRegister, TrustedImm32(0));
_patches[s->iftrue].append(target);