aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2012-11-14 09:07:01 +0100
committerErik Verbruggen <erik.verbruggen@digia.com>2012-11-14 12:20:19 +0100
commitb233a73fea9bc34c97ef0fcd6d8088288394f643 (patch)
treedde6bf49798aabda5c55f4023ecfca4df0df2e3b
parenta09d75dd1fd4d598e641ff29ee73c312a0aaba73 (diff)
Optimise move instructions involving constants
Change-Id: Ic12a54ab1c5789cc5684d38961c58f6b34f9597a Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
-rw-r--r--qv4codegen.cpp2
-rw-r--r--qv4isel_masm.cpp28
-rw-r--r--qv4isel_masm_p.h2
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 *);