diff options
author | Lars Knoll <lars.knoll@digia.com> | 2012-11-14 09:07:01 +0100 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@digia.com> | 2012-11-14 12:20:19 +0100 |
commit | b233a73fea9bc34c97ef0fcd6d8088288394f643 (patch) | |
tree | dde6bf49798aabda5c55f4023ecfca4df0df2e3b | |
parent | a09d75dd1fd4d598e641ff29ee73c312a0aaba73 (diff) |
Optimise move instructions involving constants
Change-Id: Ic12a54ab1c5789cc5684d38961c58f6b34f9597a
Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
-rw-r--r-- | qv4codegen.cpp | 2 | ||||
-rw-r--r-- | qv4isel_masm.cpp | 28 | ||||
-rw-r--r-- | qv4isel_masm_p.h | 2 |
3 files changed, 16 insertions, 16 deletions
diff --git a/qv4codegen.cpp b/qv4codegen.cpp index eed854ce5f..7cbaa8a260 100644 --- a/qv4codegen.cpp +++ b/qv4codegen.cpp @@ -520,7 +520,7 @@ void Codegen::move(IR::Expr *target, IR::Expr *source, IR::AluOp op) { assert(target->isLValue()); - if (! source->asTemp() && (op != IR::OpInvalid || ! target->asTemp())) { + if (!source->asTemp() && !source->asConst() && (op != IR::OpInvalid || ! target->asTemp())) { unsigned t = _block->newTemp(); _block->MOVE(_block->TEMP(t), source); source = _block->TEMP(t); diff --git a/qv4isel_masm.cpp b/qv4isel_masm.cpp index 250d3241a3..6afcaafae8 100644 --- a/qv4isel_masm.cpp +++ b/qv4isel_masm.cpp @@ -341,8 +341,8 @@ void InstructionSelection::visitMove(IR::Move *s) if (IR::Name *n = s->target->asName()) { String *propertyName = identifier(*n->id); - if (IR::Temp *t = s->source->asTemp()) { - generateFunctionCall(Void, __qmljs_set_activation_property, ContextRegister, propertyName, t); + if (s->source->asTemp() || s->source->asConst()) { + generateFunctionCall(Void, __qmljs_set_activation_property, ContextRegister, propertyName, s->source); return; } else { Q_UNREACHABLE(); @@ -502,16 +502,16 @@ void InstructionSelection::visitMove(IR::Move *s) } } else if (IR::Member *m = s->target->asMember()) { if (IR::Temp *base = m->base->asTemp()) { - if (IR::Temp *t = s->source->asTemp()) { - generateFunctionCall(Void, __qmljs_set_property, ContextRegister, base, identifier(*m->name), t); + if (s->source->asTemp() || s->source->asConst()) { + generateFunctionCall(Void, __qmljs_set_property, ContextRegister, base, identifier(*m->name), s->source); return; } else { Q_UNREACHABLE(); } } } else if (IR::Subscript *ss = s->target->asSubscript()) { - if (IR::Temp *t2 = s->source->asTemp()) { - generateFunctionCall(Void, __qmljs_set_element, ContextRegister, ss->base->asTemp(), ss->index->asTemp(), t2); + if (s->source->asTemp() || s->source->asConst()) { + generateFunctionCall(Void, __qmljs_set_element, ContextRegister, ss->base->asTemp(), ss->index->asTemp(), s->source); return; } else { Q_UNIMPLEMENTED(); @@ -520,7 +520,7 @@ void InstructionSelection::visitMove(IR::Move *s) } else { // inplace assignment, e.g. x += 1, ++x, ... if (IR::Temp *t = s->target->asTemp()) { - if (IR::Temp *t2 = s->source->asTemp()) { + if (s->source->asTemp() || s->source->asConst()) { Value (*op)(const Value left, const Value right, Context *ctx) = 0; const char *opName = 0; switch (s->op) { @@ -540,11 +540,11 @@ void InstructionSelection::visitMove(IR::Move *s) break; } if (op) - generateFunctionCallImp(t, opName, op, t, t2, ContextRegister); + generateFunctionCallImp(t, opName, op, t, s->source, ContextRegister); return; } } else if (IR::Name *n = s->target->asName()) { - if (IR::Temp *t = s->source->asTemp()) { + if (s->source->asTemp() || s->source->asConst()) { void (*op)(const Value value, String *name, Context *ctx) = 0; const char *opName = 0; switch (s->op) { @@ -564,12 +564,12 @@ void InstructionSelection::visitMove(IR::Move *s) break; } if (op) { - generateFunctionCallImp(Void, opName, op, t, identifier(*n->id), ContextRegister); + generateFunctionCallImp(Void, opName, op, s->source, identifier(*n->id), ContextRegister); } return; } } else if (IR::Subscript *ss = s->target->asSubscript()) { - if (IR::Temp *t = s->source->asTemp()) { + if (s->source->asTemp() || s->source->asConst()) { void (*op)(Value base, Value index, Value value, Context *ctx) = 0; const char *opName = 0; switch (s->op) { @@ -592,12 +592,12 @@ void InstructionSelection::visitMove(IR::Move *s) if (op) { IR::Temp* base = ss->base->asTemp(); IR::Temp* index = ss->index->asTemp(); - generateFunctionCallImp(Void, opName, op, base, index, t, ContextRegister); + generateFunctionCallImp(Void, opName, op, base, index, s->source, ContextRegister); } return; } } else if (IR::Member *m = s->target->asMember()) { - if (IR::Temp *t = s->source->asTemp()) { + if (s->source->asTemp() || s->source->asConst()) { void (*op)(Value value, Value base, String *name, Context *ctx) = 0; const char *opName = 0; switch (s->op) { @@ -620,7 +620,7 @@ void InstructionSelection::visitMove(IR::Move *s) if (op) { IR::Temp* base = m->base->asTemp(); String* member = identifier(*m->name); - generateFunctionCallImp(Void, opName, op, t, base, member, ContextRegister); + generateFunctionCallImp(Void, opName, op, s->source, base, member, ContextRegister); } return; } diff --git a/qv4isel_masm_p.h b/qv4isel_masm_p.h index e38ce608f5..bf37b0720b 100644 --- a/qv4isel_masm_p.h +++ b/qv4isel_masm_p.h @@ -240,7 +240,7 @@ protected: virtual void visitExp(IR::Exp *); virtual void visitEnter(IR::Enter *); virtual void visitLeave(IR::Leave *); - virtual void visitMove(IR::Move *); + virtual void visitMove(IR::Move *s); virtual void visitJump(IR::Jump *); virtual void visitCJump(IR::CJump *); virtual void visitRet(IR::Ret *); |