From 9e926ddbf985f8d41747ae8a89ee3752a11011e4 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Mon, 6 Feb 2017 10:57:36 +0100 Subject: Eliminate VALUE_FITS_IN_REGISTER #ifdef These macros do not apply anymore when cross-compiling. This patch replaces the macro use for locals JS stack initialization with register size dependent operations as well as when loading the this object into a stack slot. Change-Id: Ia986f6dbfa37c6d6ce2f1de6253e7008e4aa87dd Reviewed-by: Lars Knoll --- src/qml/jit/qv4assembler_p.h | 45 ++++++++++++++++++++++++++++++++++++++- src/qml/jit/qv4isel_masm.cpp | 34 ++--------------------------- src/qml/jit/qv4targetplatform_p.h | 6 ------ 3 files changed, 46 insertions(+), 39 deletions(-) (limited to 'src') diff --git a/src/qml/jit/qv4assembler_p.h b/src/qml/jit/qv4assembler_p.h index 6d8d773ff0..b2d7b13401 100644 --- a/src/qml/jit/qv4assembler_p.h +++ b/src/qml/jit/qv4assembler_p.h @@ -145,11 +145,13 @@ struct RegisterSizeDependentAssemblerbranch32(RelationalCondition::NotEqual, tagOrValueRegister, TrustedImm32(Value::NotDouble_Mask)); } + + static void initializeLocalVariables(JITAssembler *as, int localsCount) + { + as->move(TrustedImm32(0), TargetPlatform::ReturnValueRegister); + as->move(TrustedImm32(localsCount), TargetPlatform::ScratchRegister); + Label loop = as->label(); + as->store32(TargetPlatform::ReturnValueRegister, Address(TargetPlatform::LocalsRegister)); + as->add32(TrustedImm32(4), TargetPlatform::LocalsRegister); + as->store32(TargetPlatform::ReturnValueRegister, Address(TargetPlatform::LocalsRegister)); + as->add32(TrustedImm32(4), TargetPlatform::LocalsRegister); + Jump jump = as->branchSub32(ResultCondition::NonZero, TrustedImm32(1), TargetPlatform::ScratchRegister); + jump.linkTo(loop, as); + } }; template @@ -364,8 +379,10 @@ struct RegisterSizeDependentAssemblerloadArgumentInRegister(source, TargetPlatform::ReturnValueRegister, 0); + loadArgumentInRegister(as, source, TargetPlatform::ReturnValueRegister, 0); as->storeReturnValue(destination); } @@ -477,6 +494,12 @@ struct RegisterSizeDependentAssemblermove64ToDouble(TargetPlatform::ReturnValueRegister, target); } + static void loadArgumentInRegister(JITAssembler *as, Address addressOfValue, RegisterID dest, int argumentNumber) + { + Q_UNUSED(argumentNumber); + as->load64(addressOfValue, dest); + } + static void loadArgumentInRegister(JITAssembler *as, IR::Temp* temp, RegisterID dest, int argumentNumber) { Q_UNUSED(argumentNumber); @@ -625,6 +648,17 @@ struct RegisterSizeDependentAssemblerbranch32(RelationalCondition::NotEqual, tagOrValueRegister, TrustedImm32(0)); } + + static void initializeLocalVariables(JITAssembler *as, int localsCount) + { + as->move(TrustedImm64(0), TargetPlatform::ReturnValueRegister); + as->move(TrustedImm32(localsCount), TargetPlatform::ScratchRegister); + Label loop = as->label(); + as->store64(TargetPlatform::ReturnValueRegister, Address(TargetPlatform::LocalsRegister)); + as->add64(TrustedImm32(8), TargetPlatform::LocalsRegister); + Jump jump = as->branchSub32(ResultCondition::NonZero, TrustedImm32(1), TargetPlatform::ScratchRegister); + jump.linkTo(loop, as); + } }; template @@ -1585,6 +1619,15 @@ public: void setStackLayout(int maxArgCountForBuiltins, int regularRegistersToSave, int fpRegistersToSave); const StackLayout &stackLayout() const { return *_stackLayout.data(); } + void initializeLocalVariables() + { + const int locals = _stackLayout->calculateJSStackFrameSize(); + if (locals <= 0) + return; + loadPtr(Address(JITTargetPlatform::EngineRegister, qOffsetOf(ExecutionEngine, jsStackTop)), JITTargetPlatform::LocalsRegister); + RegisterSizeDependentOps::initializeLocalVariables(this, locals); + storePtr(JITTargetPlatform::LocalsRegister, Address(JITTargetPlatform::EngineRegister, qOffsetOf(ExecutionEngine, jsStackTop))); + } Label exceptionReturnLabel; IR::BasicBlock * catchBlock; diff --git a/src/qml/jit/qv4isel_masm.cpp b/src/qml/jit/qv4isel_masm.cpp index b1134d2bec..11e1c6c726 100644 --- a/src/qml/jit/qv4isel_masm.cpp +++ b/src/qml/jit/qv4isel_masm.cpp @@ -120,31 +120,7 @@ void InstructionSelection::run(int functionIndex) _as->loadPtr(addressForArgument(0), JITTargetPlatform::EngineRegister); #endif - const int locals = _as->stackLayout().calculateJSStackFrameSize(); - if (locals > 0) { - _as->loadPtr(Address(JITTargetPlatform::EngineRegister, qOffsetOf(ExecutionEngine, jsStackTop)), JITTargetPlatform::LocalsRegister); -#ifdef VALUE_FITS_IN_REGISTER - _as->move(TrustedImm64(0), JITTargetPlatform::ReturnValueRegister); - _as->move(TrustedImm32(locals), JITTargetPlatform::ScratchRegister); - Label loop = _as->label(); - _as->store64(JITTargetPlatform::ReturnValueRegister, Address(JITTargetPlatform::LocalsRegister)); - _as->add64(TrustedImm32(8), JITTargetPlatform::LocalsRegister); - Jump jump = _as->branchSub32(ResultCondition::NonZero, TrustedImm32(1), JITTargetPlatform::ScratchRegister); - jump.linkTo(loop, _as); -#else - _as->move(TrustedImm32(0), JITTargetPlatform::ReturnValueRegister); - _as->move(TrustedImm32(locals), JITTargetPlatform::ScratchRegister); - Label loop = _as->label(); - _as->store32(JITTargetPlatform::ReturnValueRegister, Address(JITTargetPlatform::LocalsRegister)); - _as->add32(TrustedImm32(4), JITTargetPlatform::LocalsRegister); - _as->store32(JITTargetPlatform::ReturnValueRegister, Address(JITTargetPlatform::LocalsRegister)); - _as->add32(TrustedImm32(4), JITTargetPlatform::LocalsRegister); - Jump jump = _as->branchSub32(ResultCondition::NonZero, TrustedImm32(1), JITTargetPlatform::ScratchRegister); - jump.linkTo(loop, _as); -#endif - _as->storePtr(JITTargetPlatform::LocalsRegister, Address(JITTargetPlatform::EngineRegister, qOffsetOf(ExecutionEngine, jsStackTop))); - } - + _as->initializeLocalVariables(); int lastLine = 0; for (int i = 0, ei = _function->basicBlockCount(); i != ei; ++i) { @@ -474,13 +450,7 @@ void InstructionSelection::loadThisObject(IR::Expr *temp) { _as->loadPtr(Address(JITTargetPlatform::EngineRegister, qOffsetOf(QV4::ExecutionEngine, current)), JITTargetPlatform::ScratchRegister); _as->loadPtr(Address(JITTargetPlatform::ScratchRegister, qOffsetOf(ExecutionContext::Data, callData)), JITTargetPlatform::ScratchRegister); -#if defined(VALUE_FITS_IN_REGISTER) - _as->load64(Pointer(JITTargetPlatform::ScratchRegister, qOffsetOf(CallData, thisObject)), - JITTargetPlatform::ReturnValueRegister); - _as->storeReturnValue(temp); -#else - _as->copyValue(temp, Pointer(JITTargetPlatform::ScratchRegister, qOffsetOf(CallData, thisObject))); -#endif + _as->copyValue(temp, Address(JITTargetPlatform::ScratchRegister, qOffsetOf(CallData, thisObject))); } template diff --git a/src/qml/jit/qv4targetplatform_p.h b/src/qml/jit/qv4targetplatform_p.h index 1c29aa2a70..46a618d733 100644 --- a/src/qml/jit/qv4targetplatform_p.h +++ b/src/qml/jit/qv4targetplatform_p.h @@ -130,7 +130,6 @@ public: } # define HAVE_ALU_OPS_WITH_MEM_OPERAND 1 -# undef VALUE_FITS_IN_REGISTER static const int RegisterSize = 4; # undef ARGUMENTS_IN_REGISTERS @@ -216,7 +215,6 @@ public: } #define HAVE_ALU_OPS_WITH_MEM_OPERAND 1 -#define VALUE_FITS_IN_REGISTER static const int RegisterSize = 8; #define ARGUMENTS_IN_REGISTERS @@ -285,7 +283,6 @@ public: } #define HAVE_ALU_OPS_WITH_MEM_OPERAND 1 -#define VALUE_FITS_IN_REGISTER static const int RegisterSize = 8; #define ARGUMENTS_IN_REGISTERS @@ -389,7 +386,6 @@ public: } #undef HAVE_ALU_OPS_WITH_MEM_OPERAND -#undef VALUE_FITS_IN_REGISTER static const int RegisterSize = 4; #define ARGUMENTS_IN_REGISTERS @@ -510,7 +506,6 @@ public: } #undef HAVE_ALU_OPS_WITH_MEM_OPERAND -#define VALUE_FITS_IN_REGISTER static const int RegisterSize = 8; #define ARGUMENTS_IN_REGISTERS @@ -598,7 +593,6 @@ public: } #undef HAVE_ALU_OPS_WITH_MEM_OPERAND -#undef VALUE_FITS_IN_REGISTER static const int RegisterSize = 4; #define ARGUMENTS_IN_REGISTERS -- cgit v1.2.3