aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/compiler/qv4isel_p.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@me.com>2013-09-26 14:49:44 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-30 11:28:55 +0200
commit7c3f891c454971ed0150e66c2261e6e5c36664a3 (patch)
tree067a59085a30ddf7ade38dd1cad078033a886486 /src/qml/compiler/qv4isel_p.cpp
parent9194779ef37187b1b38d73099747459f9f5e745c (diff)
V4: remove inplace operations
Inplace operations are expanded when building the IR, so the neither the IR, nor the instruction selection backends or runtime need to handle them. Change-Id: Id01f9544e137dd52364cf2ed2c10931c31ddfff3 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/qml/compiler/qv4isel_p.cpp')
-rw-r--r--src/qml/compiler/qv4isel_p.cpp172
1 files changed, 73 insertions, 99 deletions
diff --git a/src/qml/compiler/qv4isel_p.cpp b/src/qml/compiler/qv4isel_p.cpp
index 2f66628fea..500c2bd26f 100644
--- a/src/qml/compiler/qv4isel_p.cpp
+++ b/src/qml/compiler/qv4isel_p.cpp
@@ -96,120 +96,94 @@ QV4::CompiledData::CompilationUnit *EvalInstructionSelection::compile(bool gener
void IRDecoder::visitMove(V4IR::Move *s)
{
- if (s->op == V4IR::OpInvalid) {
- if (V4IR::Name *n = s->target->asName()) {
- if (s->source->asTemp() || s->source->asConst()) {
- setActivationProperty(s->source, *n->id);
- return;
- }
- } else if (V4IR::Temp *t = s->target->asTemp()) {
- if (V4IR::Name *n = s->source->asName()) {
- if (*n->id == QStringLiteral("this")) // TODO: `this' should be a builtin.
- loadThisObject(t);
- else
- getActivationProperty(n, t);
- return;
- } else if (V4IR::Const *c = s->source->asConst()) {
- loadConst(c, t);
- return;
- } else if (V4IR::Temp *t2 = s->source->asTemp()) {
- if (s->swap)
- swapValues(t2, t);
- else
- copyValue(t2, t);
- return;
- } else if (V4IR::String *str = s->source->asString()) {
- loadString(*str->value, t);
- return;
- } else if (V4IR::RegExp *re = s->source->asRegExp()) {
- loadRegexp(re, t);
- return;
- } else if (V4IR::Closure *clos = s->source->asClosure()) {
- initClosure(clos, t);
- return;
- } else if (V4IR::New *ctor = s->source->asNew()) {
- if (Name *func = ctor->base->asName()) {
- constructActivationProperty(func, ctor->args, t);
- return;
- } else if (V4IR::Member *member = ctor->base->asMember()) {
- constructProperty(member->base->asTemp(), *member->name, ctor->args, t);
- return;
- } else if (V4IR::Temp *value = ctor->base->asTemp()) {
- constructValue(value, ctor->args, t);
- return;
- }
- } else if (V4IR::Member *m = s->source->asMember()) {
- if (m->base->asTemp() || m->base->asConst()) {
- getProperty(m->base, *m->name, t);
- return;
- }
- } else if (V4IR::Subscript *ss = s->source->asSubscript()) {
- getElement(ss->base->asTemp(), ss->index, t);
+ if (V4IR::Name *n = s->target->asName()) {
+ if (s->source->asTemp() || s->source->asConst()) {
+ setActivationProperty(s->source, *n->id);
+ return;
+ }
+ } else if (V4IR::Temp *t = s->target->asTemp()) {
+ if (V4IR::Name *n = s->source->asName()) {
+ if (*n->id == QStringLiteral("this")) // TODO: `this' should be a builtin.
+ loadThisObject(t);
+ else
+ getActivationProperty(n, t);
+ return;
+ } else if (V4IR::Const *c = s->source->asConst()) {
+ loadConst(c, t);
+ return;
+ } else if (V4IR::Temp *t2 = s->source->asTemp()) {
+ if (s->swap)
+ swapValues(t2, t);
+ else
+ copyValue(t2, t);
+ return;
+ } else if (V4IR::String *str = s->source->asString()) {
+ loadString(*str->value, t);
+ return;
+ } else if (V4IR::RegExp *re = s->source->asRegExp()) {
+ loadRegexp(re, t);
+ return;
+ } else if (V4IR::Closure *clos = s->source->asClosure()) {
+ initClosure(clos, t);
+ return;
+ } else if (V4IR::New *ctor = s->source->asNew()) {
+ if (Name *func = ctor->base->asName()) {
+ constructActivationProperty(func, ctor->args, t);
return;
- } else if (V4IR::Unop *u = s->source->asUnop()) {
- if (V4IR::Temp *e = u->expr->asTemp()) {
- unop(u->op, e, t);
- return;
- }
- } else if (V4IR::Binop *b = s->source->asBinop()) {
- binop(b->op, b->left, b->right, t);
+ } else if (V4IR::Member *member = ctor->base->asMember()) {
+ constructProperty(member->base->asTemp(), *member->name, ctor->args, t);
return;
- } else if (V4IR::Call *c = s->source->asCall()) {
- if (c->base->asName()) {
- callBuiltin(c, t);
- return;
- } else if (Member *member = c->base->asMember()) {
- callProperty(member->base, *member->name, c->args, t);
- return;
- } else if (Subscript *ss = c->base->asSubscript()) {
- callSubscript(ss->base, ss->index, c->args, t);
- return;
- } else if (V4IR::Temp *value = c->base->asTemp()) {
- callValue(value, c->args, t);
- return;
- }
- } else if (V4IR::Convert *c = s->source->asConvert()) {
- Q_ASSERT(c->expr->asTemp());
- convertType(c->expr->asTemp(), t);
+ } else if (V4IR::Temp *value = ctor->base->asTemp()) {
+ constructValue(value, ctor->args, t);
return;
}
- } else if (V4IR::Member *m = s->target->asMember()) {
+ } else if (V4IR::Member *m = s->source->asMember()) {
if (m->base->asTemp() || m->base->asConst()) {
- if (s->source->asTemp() || s->source->asConst()) {
- setProperty(s->source, m->base, *m->name);
- return;
- }
- }
- } else if (V4IR::Subscript *ss = s->target->asSubscript()) {
- if (s->source->asTemp() || s->source->asConst()) {
- setElement(s->source, ss->base, ss->index);
+ getProperty(m->base, *m->name, t);
return;
}
- }
- } else {
- // inplace assignment, e.g. x += 1, ++x, ...
- if (V4IR::Temp *t = s->target->asTemp()) {
- if (s->source->asTemp()) {
- binop(s->op, t, s->source->asTemp(), t);
+ } else if (V4IR::Subscript *ss = s->source->asSubscript()) {
+ getElement(ss->base->asTemp(), ss->index, t);
+ return;
+ } else if (V4IR::Unop *u = s->source->asUnop()) {
+ if (V4IR::Temp *e = u->expr->asTemp()) {
+ unop(u->op, e, t);
return;
}
- } else if (V4IR::Name *n = s->target->asName()) {
- if (s->source->asTemp()) {
- inplaceNameOp(s->op, s->source->asTemp(), *n->id);
+ } else if (V4IR::Binop *b = s->source->asBinop()) {
+ binop(b->op, b->left, b->right, t);
+ return;
+ } else if (V4IR::Call *c = s->source->asCall()) {
+ if (c->base->asName()) {
+ callBuiltin(c, t);
return;
- }
- } else if (V4IR::Subscript *ss = s->target->asSubscript()) {
- if (s->source->asTemp()) {
- inplaceElementOp(s->op, s->source->asTemp(), ss->base->asTemp(),
- ss->index->asTemp());
+ } else if (Member *member = c->base->asMember()) {
+ callProperty(member->base, *member->name, c->args, t);
+ return;
+ } else if (Subscript *ss = c->base->asSubscript()) {
+ callSubscript(ss->base, ss->index, c->args, t);
+ return;
+ } else if (V4IR::Temp *value = c->base->asTemp()) {
+ callValue(value, c->args, t);
return;
}
- } else if (V4IR::Member *m = s->target->asMember()) {
- if (s->source->asTemp()) {
- inplaceMemberOp(s->op, s->source->asTemp(), m->base->asTemp(), *m->name);
+ } else if (V4IR::Convert *c = s->source->asConvert()) {
+ Q_ASSERT(c->expr->asTemp());
+ convertType(c->expr->asTemp(), t);
+ return;
+ }
+ } else if (V4IR::Member *m = s->target->asMember()) {
+ if (m->base->asTemp() || m->base->asConst()) {
+ if (s->source->asTemp() || s->source->asConst()) {
+ setProperty(s->source, m->base, *m->name);
return;
}
}
+ } else if (V4IR::Subscript *ss = s->target->asSubscript()) {
+ if (s->source->asTemp() || s->source->asConst()) {
+ setElement(s->source, ss->base, ss->index);
+ return;
+ }
}
// For anything else...: