diff options
| author | Lars Knoll <lars.knoll@qt.io> | 2017-08-06 09:59:25 +0200 |
|---|---|---|
| committer | Lars Knoll <lars.knoll@qt.io> | 2017-08-08 18:58:58 +0000 |
| commit | d24da7f9497834f982e5cd6e29ff53b73fbac1a3 (patch) | |
| tree | 26bedbd08aad19f36b756418e8b98fe319062074 /src/qml/compiler/qv4codegen.cpp | |
| parent | 4d8aaeddfb81f8f97eaccd4e8d18c17f82c0f596 (diff) | |
Add instructions for <, <=, >, >=
Change-Id: Ibdd784507083da4c2cdc49208e842cc2e9c40da5
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/compiler/qv4codegen.cpp')
| -rw-r--r-- | src/qml/compiler/qv4codegen.cpp | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/src/qml/compiler/qv4codegen.cpp b/src/qml/compiler/qv4codegen.cpp index 38a8678f0f..1ad7e59203 100644 --- a/src/qml/compiler/qv4codegen.cpp +++ b/src/qml/compiler/qv4codegen.cpp @@ -952,6 +952,10 @@ Codegen::Reference Codegen::binopHelper(QSOperator::Op oper, Reference &left, Re } case QSOperator::Equal: case QSOperator::NotEqual: + case QSOperator::Gt: + case QSOperator::Ge: + case QSOperator::Lt: + case QSOperator::Le: if (_expr.accept(cx)) return jumpBinop(oper, left, right); // else: fallthrough @@ -976,6 +980,10 @@ static QSOperator::Op invert(QSOperator::Op oper) switch (oper) { case QSOperator::Equal: return QSOperator::NotEqual; case QSOperator::NotEqual: return QSOperator::Equal; + case QSOperator::Gt: return QSOperator::Le; + case QSOperator::Ge: return QSOperator::Lt; + case QSOperator::Lt: return QSOperator::Ge; + case QSOperator::Le: return QSOperator::Gt; default: Q_UNIMPLEMENTED(); return QSOperator::Invalid; } } @@ -987,7 +995,6 @@ Codegen::Reference Codegen::jumpBinop(QSOperator::Op oper, Reference &left, Refe const BytecodeGenerator::Label *jumpTarget = _expr.iftrue(); if (_expr.trueBlockFollowsCondition()) { oper = invert(oper); - std::swap(left, right); jumpTarget = _expr.iffalse(); } @@ -1006,6 +1013,34 @@ Codegen::Reference Codegen::jumpBinop(QSOperator::Op oper, Reference &left, Refe bytecodeGenerator->addJumpInstruction(cjump).link(*jumpTarget); break; } + case QSOperator::Gt: { + Instruction::CmpJmpGt cjump; + cjump.lhs = left.stackSlot(); + cjump.rhs = right.stackSlot(); + bytecodeGenerator->addJumpInstruction(cjump).link(*jumpTarget); + break; + } + case QSOperator::Ge: { + Instruction::CmpJmpGe cjump; + cjump.lhs = left.stackSlot(); + cjump.rhs = right.stackSlot(); + bytecodeGenerator->addJumpInstruction(cjump).link(*jumpTarget); + break; + } + case QSOperator::Lt: { + Instruction::CmpJmpLt cjump; + cjump.lhs = left.stackSlot(); + cjump.rhs = right.stackSlot(); + bytecodeGenerator->addJumpInstruction(cjump).link(*jumpTarget); + break; + } + case QSOperator::Le: { + Instruction::CmpJmpLe cjump; + cjump.lhs = left.stackSlot(); + cjump.rhs = right.stackSlot(); + bytecodeGenerator->addJumpInstruction(cjump).link(*jumpTarget); + break; + } default: Q_UNIMPLEMENTED(); Q_UNREACHABLE(); } return Reference(); |
