diff options
author | Erik Verbruggen <erik.verbruggen@me.com> | 2013-08-21 14:13:46 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-08-29 10:17:03 +0200 |
commit | cba526a9581a7e0fac1b6ef183631574cc759ed5 (patch) | |
tree | e960d60b1d7cb26b85c093aa0ecf2bdfbe3041eb /src | |
parent | 1bcab3a7479220930291238eac2c67b412d2bf73 (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.cpp | 45 | ||||
-rw-r--r-- | src/qml/compiler/qv4isel_masm_p.h | 11 | ||||
-rw-r--r-- | src/qml/compiler/qv4regalloc.cpp | 3 |
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; |