aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/compiler/qv4codegen.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2017-08-06 09:59:25 +0200
committerLars Knoll <lars.knoll@qt.io>2017-08-08 18:58:58 +0000
commitd24da7f9497834f982e5cd6e29ff53b73fbac1a3 (patch)
tree26bedbd08aad19f36b756418e8b98fe319062074 /src/qml/compiler/qv4codegen.cpp
parent4d8aaeddfb81f8f97eaccd4e8d18c17f82c0f596 (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.cpp37
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();