From 39bdb9d6f30151ee24614df1dbcd2d44ec342e59 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Tue, 10 Jan 2017 14:14:14 +0100 Subject: Changed JSC::MacroAssembler to be a template Change-Id: If6edb7ed0fac51e93b218eb45c01274a87b9e904 Reviewed-by: Lars Knoll --- src/3rdparty/masm/assembler/MacroAssembler.h | 31 ++++++++++++++++++++++- src/3rdparty/masm/assembler/MacroAssemblerARMv7.h | 5 +++- src/3rdparty/masm/yarr/YarrJIT.cpp | 6 ++--- src/qml/jit/qv4assembler.cpp | 18 ++++++------- src/qml/jit/qv4assembler_p.h | 28 ++++++++++---------- src/qml/jit/qv4isel_masm.cpp | 8 +++--- 6 files changed, 64 insertions(+), 32 deletions(-) diff --git a/src/3rdparty/masm/assembler/MacroAssembler.h b/src/3rdparty/masm/assembler/MacroAssembler.h index 1fbca4c55b..1d0fa0003e 100644 --- a/src/3rdparty/masm/assembler/MacroAssembler.h +++ b/src/3rdparty/masm/assembler/MacroAssembler.h @@ -68,6 +68,7 @@ typedef MacroAssemblerSH4 MacroAssemblerBase; namespace JSC { +template class MacroAssembler : public MacroAssemblerBase { public: using DoubleCondition = typename MacroAssemblerBase::DoubleCondition; @@ -96,6 +97,18 @@ public: using MacroAssemblerBase::jump; using MacroAssemblerBase::branch32; using MacroAssemblerBase::move; + using MacroAssemblerBase::store32; + using MacroAssemblerBase::add32; + using MacroAssemblerBase::xor32; + using MacroAssemblerBase::sub32; + using MacroAssemblerBase::load32; +#if CPU(X86_64) || CPU(ARM64) + using MacroAssemblerBase::add64; + using MacroAssemblerBase::sub64; + using MacroAssemblerBase::xor64; + using MacroAssemblerBase::load64; + using MacroAssemblerBase::store64; +#endif #if ENABLE(JIT_CONSTANT_BLINDING) using MacroAssemblerBase::add32; @@ -344,7 +357,7 @@ public: static const unsigned BlindingModulus = 64; bool shouldConsiderBlinding() { - return !(random() & (BlindingModulus - 1)); + return !(this->random() & (BlindingModulus - 1)); } // Ptr methods @@ -1468,6 +1481,22 @@ public: #endif }; +#if CPU(ARM_THUMB2) +typedef MacroAssembler DefaultMacroAssembler; +#elif CPU(ARM64) +typedef MacroAssembler DefaultMacroAssembler; +#elif CPU(ARM_TRADITIONAL) +typedef MacroAssembler DefaultMacroAssembler; +#elif CPU(MIPS) +typedef MacroAssembler DefaultMacroAssembler; +#elif CPU(X86) +typedef MacroAssembler DefaultMacroAssembler; +#elif CPU(X86_64) +typedef MacroAssembler DefaultMacroAssembler; +#elif CPU(SH4) +typedef JSC::MacroAssemblerSH4 DefaultMacroAssembler; +#endif + } // namespace JSC #else // ENABLE(ASSEMBLER) diff --git a/src/3rdparty/masm/assembler/MacroAssemblerARMv7.h b/src/3rdparty/masm/assembler/MacroAssemblerARMv7.h index 73833c0ceb..9f5a089a75 100644 --- a/src/3rdparty/masm/assembler/MacroAssemblerARMv7.h +++ b/src/3rdparty/masm/assembler/MacroAssemblerARMv7.h @@ -526,7 +526,9 @@ public: // operand objects to loads and store will be implicitly constructed if a // register is passed. -private: + // internal function, but public because of "using load32;" in template sub-classes to pull + // in the other public overloads. + void load32(ArmAddress address, RegisterID dest) { if (address.type == ArmAddress::HasIndex) @@ -541,6 +543,7 @@ private: } } +private: void load16(ArmAddress address, RegisterID dest) { if (address.type == ArmAddress::HasIndex) diff --git a/src/3rdparty/masm/yarr/YarrJIT.cpp b/src/3rdparty/masm/yarr/YarrJIT.cpp index c6f2cdb91f..e4f2d97759 100644 --- a/src/3rdparty/masm/yarr/YarrJIT.cpp +++ b/src/3rdparty/masm/yarr/YarrJIT.cpp @@ -39,7 +39,7 @@ using namespace WTF; namespace JSC { namespace Yarr { template -class YarrGenerator : private MacroAssembler { +class YarrGenerator : private DefaultMacroAssembler { friend void jitCompile(JSGlobalData*, YarrCodeBlock& jitObject, const String& pattern, unsigned& numSubpatterns, const char*& error, bool ignoreCase, bool multiline); #if CPU(ARM) @@ -599,7 +599,7 @@ class YarrGenerator : private MacroAssembler { } // Called at the end of code generation to link all return addresses. - void linkDataLabels(LinkBuffer& linkBuffer) + void linkDataLabels(LinkBuffer& linkBuffer) { ASSERT(isEmpty()); for (unsigned i = 0; i < m_backtrackRecords.size(); ++i) @@ -2676,7 +2676,7 @@ public: backtrack(); // Link & finalize the code. - LinkBuffer linkBuffer(*globalData, this, REGEXP_CODE_ID); + LinkBuffer linkBuffer(*globalData, this, REGEXP_CODE_ID); m_backtrackingState.linkDataLabels(linkBuffer); if (compileMode == MatchOnly) { diff --git a/src/qml/jit/qv4assembler.cpp b/src/qml/jit/qv4assembler.cpp index 6203349e96..0aacacfb42 100644 --- a/src/qml/jit/qv4assembler.cpp +++ b/src/qml/jit/qv4assembler.cpp @@ -346,7 +346,7 @@ void Assembler::enterStandardStackFrame(const RegisterInformation ®ularRegist for (int i = 0, ei = fpRegistersToSave.size(); i < ei; ++i) { Q_ASSERT(fpRegistersToSave.at(i).isFloatingPoint()); slotAddr.offset -= sizeof(double); - JSC::MacroAssembler::storeDouble(fpRegistersToSave.at(i).reg(), slotAddr); + JSC::MacroAssembler::storeDouble(fpRegistersToSave.at(i).reg(), slotAddr); } for (int i = 0, ei = regularRegistersToSave.size(); i < ei; ++i) { Q_ASSERT(regularRegistersToSave.at(i).isRegularRegister()); @@ -368,7 +368,7 @@ void Assembler::leaveStandardStackFrame(const RegisterInformation ®ularRegist } for (int i = fpRegistersToSave.size() - 1; i >= 0; --i) { Q_ASSERT(fpRegistersToSave.at(i).isFloatingPoint()); - JSC::MacroAssembler::loadDouble(slotAddr, fpRegistersToSave.at(i).reg()); + JSC::MacroAssembler::loadDouble(slotAddr, fpRegistersToSave.at(i).reg()); slotAddr.offset += sizeof(double); } @@ -465,9 +465,9 @@ Assembler::Jump Assembler::branchDouble(bool invertCondition, IR::AluOp op, Q_UNREACHABLE(); } if (invertCondition) - cond = JSC::MacroAssembler::invert(cond); + cond = JSC::MacroAssembler::invert(cond); - return JSC::MacroAssembler::branchDouble(cond, toDoubleRegister(left, FPGpr0), toDoubleRegister(right, FPGpr1)); + return JSC::MacroAssembler::branchDouble(cond, toDoubleRegister(left, FPGpr0), toDoubleRegister(right, FPGpr1)); } Assembler::Jump Assembler::branchInt32(bool invertCondition, IR::AluOp op, IR::Expr *left, IR::Expr *right) @@ -486,11 +486,11 @@ Assembler::Jump Assembler::branchInt32(bool invertCondition, IR::AluOp op, IR::E Q_UNREACHABLE(); } if (invertCondition) - cond = JSC::MacroAssembler::invert(cond); + cond = JSC::MacroAssembler::invert(cond); - return JSC::MacroAssembler::branch32(cond, - toInt32Register(left, Assembler::ScratchRegister), - toInt32Register(right, Assembler::ReturnValueRegister)); + return JSC::MacroAssembler::branch32(cond, + toInt32Register(left, Assembler::ScratchRegister), + toInt32Register(right, Assembler::ReturnValueRegister)); } void Assembler::setStackLayout(int maxArgCountForBuiltins, int regularRegistersToSave, int fpRegistersToSave) @@ -577,7 +577,7 @@ JSC::MacroAssemblerCodeRef Assembler::link(int *codeSize) } JSC::JSGlobalData dummy(_executableAllocator); - JSC::LinkBuffer linkBuffer(dummy, this, 0); + JSC::LinkBuffer> linkBuffer(dummy, this, 0); for (const DataLabelPatch &p : qAsConst(_dataLabelPatches)) linkBuffer.patch(p.dataLabel, linkBuffer.locationOf(p.target)); diff --git a/src/qml/jit/qv4assembler_p.h b/src/qml/jit/qv4assembler_p.h index 290668e8af..e40609eea6 100644 --- a/src/qml/jit/qv4assembler_p.h +++ b/src/qml/jit/qv4assembler_p.h @@ -90,29 +90,29 @@ struct CompilationUnit : public QV4::CompiledData::CompilationUnit }; #if CPU(ARM_THUMB2) -typedef JSC::MacroAssemblerARMv7 PlatformAssembler; +typedef JSC::MacroAssemblerARMv7 PlatformMacroAssembler; #elif CPU(ARM64) -typedef JSC::MacroAssemblerARM64 PlatformAssembler; +typedef JSC::MacroAssemblerARM64 PlatformMacroAssembler; #elif CPU(ARM_TRADITIONAL) -typedef JSC::MacroAssemblerARM PlatformAssembler; +typedef JSC::MacroAssemblerARM PlatformMacroAssembler; #elif CPU(MIPS) -typedef JSC::MacroAssemblerMIPS PlatformAssembler; +typedef JSC::MacroAssemblerMIPS PlatformMacroAssembler; #elif CPU(X86) -typedef JSC::MacroAssemblerX86 PlatformAssembler; +typedef JSC::MacroAssemblerX86 PlatformMacroAssembler; #elif CPU(X86_64) -typedef JSC::MacroAssemblerX86_64 PlatformAssembler; +typedef JSC::MacroAssemblerX86_64 PlatformMacroAssembler; #elif CPU(SH4) -typedef JSC::MacroAssemblerSH4 PlatformAssembler; +typedef JSC::MacroAssemblerSH4 PlatformMacroAssembler; #endif -class Assembler : public JSC::MacroAssembler, public TargetPlatform +class Assembler : public JSC::MacroAssembler, public TargetPlatform { Q_DISABLE_COPY(Assembler) public: Assembler(QV4::Compiler::JSUnitGenerator *jsGenerator, IR::Function* function, QV4::ExecutableAllocator *executableAllocator); - typedef JSC::MacroAssembler MacroAssembler; + using MacroAssembler = JSC::MacroAssembler; using RegisterID = MacroAssembler::RegisterID; using FPRegisterID = MacroAssembler::FPRegisterID; @@ -697,8 +697,8 @@ public: store64(ReturnValueRegister, addr); } #else - using JSC::MacroAssembler::loadDouble; - using JSC::MacroAssembler::storeDouble; + using JSC::MacroAssembler::loadDouble; + using JSC::MacroAssembler::storeDouble; #endif template @@ -711,8 +711,8 @@ public: { Q_ASSERT(!source->asTemp() || source->asTemp()->kind != IR::Temp::PhysicalRegister); Q_ASSERT(target.base != scratchRegister); - JSC::MacroAssembler::loadDouble(loadAddress(scratchRegister, source), FPGpr0); - JSC::MacroAssembler::storeDouble(FPGpr0, target); + JSC::MacroAssembler::loadDouble(loadAddress(scratchRegister, source), FPGpr0); + JSC::MacroAssembler::storeDouble(FPGpr0, target); } void storeValue(QV4::Primitive value, RegisterID destination) @@ -1007,7 +1007,7 @@ public: move(TrustedImm64(i), ReturnValueRegister); move64ToDouble(ReturnValueRegister, target); #else - JSC::MacroAssembler::loadDouble(loadConstant(c, ScratchRegister), target); + JSC::MacroAssembler::loadDouble(loadConstant(c, ScratchRegister), target); #endif return target; } diff --git a/src/qml/jit/qv4isel_masm.cpp b/src/qml/jit/qv4isel_masm.cpp index ae63da28a2..7a570d0b6b 100644 --- a/src/qml/jit/qv4isel_masm.cpp +++ b/src/qml/jit/qv4isel_masm.cpp @@ -735,10 +735,10 @@ void InstructionSelection::swapValues(IR::Expr *source, IR::Expr *target) Pointer sAddr = _as->loadAddress(JITTargetPlatform::ScratchRegister, source); Pointer tAddr = _as->loadAddress(JITTargetPlatform::ReturnValueRegister, target); // use the implementation in JSC::MacroAssembler, as it doesn't do bit swizzling - _as->JSC::MacroAssembler::loadDouble(sAddr, JITTargetPlatform::FPGpr0); - _as->JSC::MacroAssembler::loadDouble(tAddr, Assembler::FPGpr1); - _as->JSC::MacroAssembler::storeDouble(Assembler::FPGpr1, sAddr); - _as->JSC::MacroAssembler::storeDouble(JITTargetPlatform::FPGpr0, tAddr); + _as->JSC::MacroAssembler::loadDouble(sAddr, JITTargetPlatform::FPGpr0); + _as->JSC::MacroAssembler::loadDouble(tAddr, JITTargetPlatform::FPGpr1); + _as->JSC::MacroAssembler::storeDouble(JITTargetPlatform::FPGpr1, sAddr); + _as->JSC::MacroAssembler::storeDouble(JITTargetPlatform::FPGpr0, tAddr); return; } } -- cgit v1.2.3