aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@me.com>2013-08-21 14:13:46 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-08-29 10:17:03 +0200
commitcba526a9581a7e0fac1b6ef183631574cc759ed5 (patch)
treee960d60b1d7cb26b85c093aa0ecf2bdfbe3041eb /src
parent1bcab3a7479220930291238eac2c67b412d2bf73 (diff)
Generate code for conversion to boolean.
Change-Id: I59e24264325b6560ee1c0dbdafacb1f08c3671d5 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/qml/compiler/qv4isel_masm.cpp45
-rw-r--r--src/qml/compiler/qv4isel_masm_p.h11
-rw-r--r--src/qml/compiler/qv4regalloc.cpp3
3 files changed, 54 insertions, 5 deletions
diff --git a/src/qml/compiler/qv4isel_masm.cpp b/src/qml/compiler/qv4isel_masm.cpp
index 31a8257c32..c520b9556f 100644
--- a/src/qml/compiler/qv4isel_masm.cpp
+++ b/src/qml/compiler/qv4isel_masm.cpp
@@ -1361,6 +1361,8 @@ void InstructionSelection::convertType(V4IR::Temp *source, V4IR::Temp *target)
{
if (target->type == V4IR::DoubleType)
convertTypeToDouble(source, target);
+ else if (target->type == V4IR::BoolType)
+ convertTypeToBool(source, target);
else
convertTypeSlowPath(source, target);
}
@@ -1433,6 +1435,49 @@ void InstructionSelection::convertTypeToDouble(V4IR::Temp *source, V4IR::Temp *t
}
}
+void InstructionSelection::convertTypeToBool(V4IR::Temp *source, V4IR::Temp *target)
+{
+ switch (source->type) {
+ case V4IR::SInt32Type:
+ case V4IR::UInt32Type:
+ convertIntToBool(source, target);
+ break;
+ case V4IR::DoubleType: {
+ // The source is in a register if the register allocator is used. If the register
+ // allocator was not used, then that means that we can use any register for to
+ // load the double into.
+ Assembler::FPRegisterID reg;
+ if (source->kind == V4IR::Temp::PhysicalRegister)
+ reg = (Assembler::FPRegisterID) source->index;
+ else
+ reg = _as->toDoubleRegister(source, (Assembler::FPRegisterID) 1);
+ Assembler::Jump nonZero = _as->branchDoubleNonZero(reg, Assembler::FPGpr0);
+
+ // it's 0, so false:
+ _as->storeBool(false, target);
+ Assembler::Jump done = _as->jump();
+
+ // it's non-zero, so true:
+ nonZero.link(_as);
+ _as->storeBool(true, target);
+
+ // done:
+ done.link(_as);
+ } break;
+ case V4IR::UndefinedType:
+ case V4IR::NullType:
+ _as->storeBool(false, target);
+ break;
+ case V4IR::StringType:
+ case V4IR::ObjectType:
+ default:
+ generateFunctionCall(Assembler::ReturnValueRegister, __qmljs_to_boolean,
+ Assembler::PointerToValue(source));
+ _as->storeBool(Assembler::ReturnValueRegister, target);
+ break;
+ }
+}
+
void InstructionSelection::constructActivationProperty(V4IR::Name *func, V4IR::ExprList *args, V4IR::Temp *result)
{
assert(func != 0);
diff --git a/src/qml/compiler/qv4isel_masm_p.h b/src/qml/compiler/qv4isel_masm_p.h
index 09bd614b30..283c6cb983 100644
--- a/src/qml/compiler/qv4isel_masm_p.h
+++ b/src/qml/compiler/qv4isel_masm_p.h
@@ -1240,6 +1240,7 @@ protected:
private:
void convertTypeSlowPath(V4IR::Temp *source, V4IR::Temp *target);
void convertTypeToDouble(V4IR::Temp *source, V4IR::Temp *target);
+ void convertTypeToBool(V4IR::Temp *source, V4IR::Temp *target);
void convertIntToDouble(V4IR::Temp *source, V4IR::Temp *target)
{
@@ -1280,15 +1281,17 @@ private:
void convertIntToBool(V4IR::Temp *source, V4IR::Temp *target)
{
+ Assembler::RegisterID reg = Assembler::ScratchRegister;
if (target->kind == V4IR::Temp::PhysicalRegister) {
- _as->storeBool(_as->toInt32Register(source, Assembler::ScratchRegister), target);
+ reg = _as->toInt32Register(source, reg);
} else if (target->kind == V4IR::Temp::StackSlot) {
- _as->move(_as->toInt32Register(source, Assembler::ScratchRegister),
- Assembler::ScratchRegister);
- _as->storeBool(Assembler::ScratchRegister, target);
+ _as->move(_as->toInt32Register(source, reg), reg);
} else {
Q_UNIMPLEMENTED();
}
+
+ _as->compare32(Assembler::NotEqual, reg, Assembler::TrustedImm32(0), reg);
+ _as->storeBool(reg, target);
}
#define isel_stringIfyx(s) #s
diff --git a/src/qml/compiler/qv4regalloc.cpp b/src/qml/compiler/qv4regalloc.cpp
index a33d6e7eee..67f2234fab 100644
--- a/src/qml/compiler/qv4regalloc.cpp
+++ b/src/qml/compiler/qv4regalloc.cpp
@@ -251,9 +251,10 @@ protected: // IRDecoder
#if 0 // TODO: change masm to generate code
case SInt32Type:
case UInt32Type:
- case BoolType:
#endif
+ case BoolType:
switch (source->type) {
+ case UInt32Type:
case BoolType:
case DoubleType:
sourceReg = Use::MustHaveRegister;