diff options
author | Erik Verbruggen <erik.verbruggen@me.com> | 2013-09-26 14:49:44 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-30 11:28:55 +0200 |
commit | 7c3f891c454971ed0150e66c2261e6e5c36664a3 (patch) | |
tree | 067a59085a30ddf7ade38dd1cad078033a886486 /src/qml/compiler/qv4isel_p.cpp | |
parent | 9194779ef37187b1b38d73099747459f9f5e745c (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.cpp | 172 |
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...: |