diff options
Diffstat (limited to 'src/qml/jit/qv4isel_masm.cpp')
-rw-r--r-- | src/qml/jit/qv4isel_masm.cpp | 139 |
1 files changed, 1 insertions, 138 deletions
diff --git a/src/qml/jit/qv4isel_masm.cpp b/src/qml/jit/qv4isel_masm.cpp index 7a051067f3..03881e6776 100644 --- a/src/qml/jit/qv4isel_masm.cpp +++ b/src/qml/jit/qv4isel_masm.cpp @@ -1325,144 +1325,7 @@ void InstructionSelection<JITAssembler>::visitCJump(IR::CJump *s) template <typename JITAssembler> void InstructionSelection<JITAssembler>::visitRet(IR::Ret *s) { - if (!s) { - // this only happens if the method doesn't have a return statement and can - // only exit through an exception - } else if (IR::Temp *t = s->expr->asTemp()) { -#if CPU(X86) || CPU(ARM) || CPU(MIPS) - -# if CPU(X86) - RegisterID lowReg = JSC::X86Registers::eax; - RegisterID highReg = JSC::X86Registers::edx; -# elif CPU(MIPS) - RegisterID lowReg = JSC::MIPSRegisters::v0; - RegisterID highReg = JSC::MIPSRegisters::v1; -# else // CPU(ARM) - RegisterID lowReg = JSC::ARMRegisters::r0; - RegisterID highReg = JSC::ARMRegisters::r1; -# endif - - if (t->kind == IR::Temp::PhysicalRegister) { - switch (t->type) { - case IR::DoubleType: - _as->moveDoubleToInts((FPRegisterID) t->index, lowReg, highReg); - break; - case IR::UInt32Type: { - RegisterID srcReg = (RegisterID) t->index; - Jump intRange = _as->branch32(JITAssembler::GreaterThanOrEqual, srcReg, TrustedImm32(0)); - _as->convertUInt32ToDouble(srcReg, JITTargetPlatform::FPGpr0, JITTargetPlatform::ReturnValueRegister); - _as->moveDoubleToInts(JITTargetPlatform::FPGpr0, lowReg, highReg); - Jump done = _as->jump(); - intRange.link(_as); - _as->move(srcReg, lowReg); - _as->move(TrustedImm32(QV4::Value::Integer_Type_Internal), highReg); - done.link(_as); - } break; - case IR::SInt32Type: - _as->move((RegisterID) t->index, lowReg); - _as->move(TrustedImm32(QV4::Value::Integer_Type_Internal), highReg); - break; - case IR::BoolType: - _as->move((RegisterID) t->index, lowReg); - _as->move(TrustedImm32(QV4::Value::Boolean_Type_Internal), highReg); - break; - default: - Q_UNREACHABLE(); - } - } else { - Pointer addr = _as->loadAddress(JITTargetPlatform::ScratchRegister, t); - _as->load32(addr, lowReg); - addr.offset += 4; - _as->load32(addr, highReg); - } -#else - if (t->kind == IR::Temp::PhysicalRegister) { - if (t->type == IR::DoubleType) { - _as->moveDoubleTo64((FPRegisterID) t->index, - JITTargetPlatform::ReturnValueRegister); - _as->move(TrustedImm64(QV4::Value::NaNEncodeMask), - JITTargetPlatform::ScratchRegister); - _as->xor64(JITTargetPlatform::ScratchRegister, JITTargetPlatform::ReturnValueRegister); - } else if (t->type == IR::UInt32Type) { - RegisterID srcReg = (RegisterID) t->index; - Jump intRange = _as->branch32(RelationalCondition::GreaterThanOrEqual, srcReg, TrustedImm32(0)); - _as->convertUInt32ToDouble(srcReg, JITTargetPlatform::FPGpr0, JITTargetPlatform::ReturnValueRegister); - _as->moveDoubleTo64(JITTargetPlatform::FPGpr0, JITTargetPlatform::ReturnValueRegister); - _as->move(TrustedImm64(QV4::Value::NaNEncodeMask), JITTargetPlatform::ScratchRegister); - _as->xor64(JITTargetPlatform::ScratchRegister, JITTargetPlatform::ReturnValueRegister); - Jump done = _as->jump(); - intRange.link(_as); - _as->zeroExtend32ToPtr(srcReg, JITTargetPlatform::ReturnValueRegister); - quint64 tag = QV4::Value::Integer_Type_Internal; - _as->or64(TrustedImm64(tag << 32), - JITTargetPlatform::ReturnValueRegister); - done.link(_as); - } else { - _as->zeroExtend32ToPtr((RegisterID) t->index, JITTargetPlatform::ReturnValueRegister); - quint64 tag; - switch (t->type) { - case IR::SInt32Type: - tag = QV4::Value::Integer_Type_Internal; - break; - case IR::BoolType: - tag = QV4::Value::Boolean_Type_Internal; - break; - default: - tag = 31337; // bogus value - Q_UNREACHABLE(); - } - _as->or64(TrustedImm64(tag << 32), - JITTargetPlatform::ReturnValueRegister); - } - } else { - _as->copyValue(JITTargetPlatform::ReturnValueRegister, t); - } -#endif - } else if (IR::Const *c = s->expr->asConst()) { - QV4::Primitive retVal = convertToValue(c); -#if CPU(X86) - _as->move(TrustedImm32(retVal.int_32()), JSC::X86Registers::eax); - _as->move(TrustedImm32(retVal.tag()), JSC::X86Registers::edx); -#elif CPU(ARM) - _as->move(TrustedImm32(retVal.int_32()), JSC::ARMRegisters::r0); - _as->move(TrustedImm32(retVal.tag()), JSC::ARMRegisters::r1); -#elif CPU(MIPS) - _as->move(TrustedImm32(retVal.int_32()), JSC::MIPSRegisters::v0); - _as->move(TrustedImm32(retVal.tag()), JSC::MIPSRegisters::v1); -#else - _as->move(TrustedImm64(retVal.rawValue()), JITTargetPlatform::ReturnValueRegister); -#endif - } else { - Q_UNREACHABLE(); - Q_UNUSED(s); - } - - Label leaveStackFrame = _as->label(); - - const int locals = _as->stackLayout().calculateJSStackFrameSize(); - _as->subPtr(TrustedImm32(sizeof(QV4::Value)*locals), JITTargetPlatform::LocalsRegister); - _as->loadPtr(Address(JITTargetPlatform::EngineRegister, qOffsetOf(QV4::ExecutionEngine, current)), JITTargetPlatform::ScratchRegister); - _as->loadPtr(Address(JITTargetPlatform::ScratchRegister, qOffsetOf(ExecutionContext::Data, engine)), JITTargetPlatform::ScratchRegister); - _as->storePtr(JITTargetPlatform::LocalsRegister, Address(JITTargetPlatform::ScratchRegister, qOffsetOf(ExecutionEngine, jsStackTop))); - - _as->leaveStandardStackFrame(regularRegistersToSave, fpRegistersToSave); - _as->ret(); - - _as->exceptionReturnLabel = _as->label(); - QV4::Primitive retVal = Primitive::undefinedValue(); -#if CPU(X86) - _as->move(TrustedImm32(retVal.int_32()), JSC::X86Registers::eax); - _as->move(TrustedImm32(retVal.tag()), JSC::X86Registers::edx); -#elif CPU(ARM) - _as->move(TrustedImm32(retVal.int_32()), JSC::ARMRegisters::r0); - _as->move(TrustedImm32(retVal.tag()), JSC::ARMRegisters::r1); -#elif CPU(MIPS) - _as->move(TrustedImm32(retVal.int_32()), JSC::MIPSRegisters::v0); - _as->move(TrustedImm32(retVal.tag()), JSC::MIPSRegisters::v1); -#else - _as->move(TrustedImm64(retVal.rawValue()), JITTargetPlatform::ReturnValueRegister); -#endif - _as->jump(leaveStackFrame); + _as->returnFromFunction(s, regularRegistersToSave, fpRegistersToSave); } template <typename JITAssembler> |