diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/JavaScriptCore/dfg/DFGCallArrayAllocatorSlowPathGenerator.h | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGCallArrayAllocatorSlowPathGenerator.h')
-rw-r--r-- | Source/JavaScriptCore/dfg/DFGCallArrayAllocatorSlowPathGenerator.h | 96 |
1 files changed, 68 insertions, 28 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGCallArrayAllocatorSlowPathGenerator.h b/Source/JavaScriptCore/dfg/DFGCallArrayAllocatorSlowPathGenerator.h index ac7dc45fe..59c4092c2 100644 --- a/Source/JavaScriptCore/dfg/DFGCallArrayAllocatorSlowPathGenerator.h +++ b/Source/JavaScriptCore/dfg/DFGCallArrayAllocatorSlowPathGenerator.h @@ -23,10 +23,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef DFGCallArrayAllocatorSlowPathGenerator_h -#define DFGCallArrayAllocatorSlowPathGenerator_h - -#include <wtf/Platform.h> +#pragma once #if ENABLE(DFG_JIT) @@ -40,8 +37,8 @@ namespace JSC { namespace DFG { class CallArrayAllocatorSlowPathGenerator : public JumpingSlowPathGenerator<MacroAssembler::JumpList> { public: CallArrayAllocatorSlowPathGenerator( - MacroAssembler::JumpList from, SpeculativeJIT* jit, P_JITOperation_EStZ function, - GPRReg resultGPR, GPRReg storageGPR, Structure* structure, size_t size) + MacroAssembler::JumpList from, SpeculativeJIT* jit, P_JITOperation_EStZB function, + GPRReg resultGPR, GPRReg storageGPR, RegisteredStructure structure, size_t size) : JumpingSlowPathGenerator<MacroAssembler::JumpList>(from, jit) , m_function(function) , m_resultGPR(resultGPR) @@ -54,24 +51,25 @@ public: } protected: - virtual void generateInternal(SpeculativeJIT* jit) override + void generateInternal(SpeculativeJIT* jit) override { linkFrom(jit); for (unsigned i = 0; i < m_plans.size(); ++i) jit->silentSpill(m_plans[i]); - jit->callOperation(m_function, m_resultGPR, m_structure, m_size); + jit->callOperation(m_function, m_resultGPR, m_structure, m_size, m_storageGPR); GPRReg canTrample = SpeculativeJIT::pickCanTrample(m_resultGPR); for (unsigned i = m_plans.size(); i--;) jit->silentFill(m_plans[i], canTrample); + jit->m_jit.exceptionCheck(); jit->m_jit.loadPtr(MacroAssembler::Address(m_resultGPR, JSObject::butterflyOffset()), m_storageGPR); jumpTo(jit); } private: - P_JITOperation_EStZ m_function; + P_JITOperation_EStZB m_function; GPRReg m_resultGPR; GPRReg m_storageGPR; - Structure* m_structure; + RegisteredStructure m_structure; size_t m_size; Vector<SilentRegisterSavePlan, 2> m_plans; }; @@ -79,50 +77,92 @@ private: class CallArrayAllocatorWithVariableSizeSlowPathGenerator : public JumpingSlowPathGenerator<MacroAssembler::JumpList> { public: CallArrayAllocatorWithVariableSizeSlowPathGenerator( - MacroAssembler::JumpList from, SpeculativeJIT* jit, P_JITOperation_EStZ function, - GPRReg resultGPR, Structure* contiguousStructure, Structure* arrayStorageStructure, GPRReg sizeGPR) + MacroAssembler::JumpList from, SpeculativeJIT* jit, P_JITOperation_EStZB function, + GPRReg resultGPR, RegisteredStructure contiguousStructure, RegisteredStructure arrayStorageStructure, GPRReg sizeGPR, GPRReg storageGPR) : JumpingSlowPathGenerator<MacroAssembler::JumpList>(from, jit) , m_function(function) , m_resultGPR(resultGPR) , m_contiguousStructure(contiguousStructure) - , m_arrayStorageStructure(arrayStorageStructure) + , m_arrayStorageOrContiguousStructure(arrayStorageStructure) , m_sizeGPR(sizeGPR) + , m_storageGPR(storageGPR) { jit->silentSpillAllRegistersImpl(false, m_plans, resultGPR); } protected: - virtual void generateInternal(SpeculativeJIT* jit) override + void generateInternal(SpeculativeJIT* jit) override { linkFrom(jit); for (unsigned i = 0; i < m_plans.size(); ++i) jit->silentSpill(m_plans[i]); - GPRReg scratchGPR = AssemblyHelpers::selectScratchGPR(m_sizeGPR); - MacroAssembler::Jump bigLength = jit->m_jit.branch32(MacroAssembler::AboveOrEqual, m_sizeGPR, MacroAssembler::TrustedImm32(MIN_SPARSE_ARRAY_INDEX)); - jit->m_jit.move(MacroAssembler::TrustedImmPtr(m_contiguousStructure), scratchGPR); - MacroAssembler::Jump done = jit->m_jit.jump(); - bigLength.link(&jit->m_jit); - jit->m_jit.move(MacroAssembler::TrustedImmPtr(m_arrayStorageStructure), scratchGPR); - done.link(&jit->m_jit); - jit->callOperation(m_function, m_resultGPR, scratchGPR, m_sizeGPR); + GPRReg scratchGPR = AssemblyHelpers::selectScratchGPR(m_sizeGPR, m_storageGPR); + if (m_contiguousStructure.get() != m_arrayStorageOrContiguousStructure.get()) { + MacroAssembler::Jump bigLength = jit->m_jit.branch32(MacroAssembler::AboveOrEqual, m_sizeGPR, MacroAssembler::TrustedImm32(MIN_ARRAY_STORAGE_CONSTRUCTION_LENGTH)); + jit->m_jit.move(SpeculativeJIT::TrustedImmPtr(m_contiguousStructure), scratchGPR); + MacroAssembler::Jump done = jit->m_jit.jump(); + bigLength.link(&jit->m_jit); + jit->m_jit.move(SpeculativeJIT::TrustedImmPtr(m_arrayStorageOrContiguousStructure), scratchGPR); + done.link(&jit->m_jit); + } else + jit->m_jit.move(SpeculativeJIT::TrustedImmPtr(m_contiguousStructure), scratchGPR); + jit->callOperation(m_function, m_resultGPR, scratchGPR, m_sizeGPR, m_storageGPR); GPRReg canTrample = SpeculativeJIT::pickCanTrample(m_resultGPR); for (unsigned i = m_plans.size(); i--;) jit->silentFill(m_plans[i], canTrample); + jit->m_jit.exceptionCheck(); jumpTo(jit); } private: - P_JITOperation_EStZ m_function; + P_JITOperation_EStZB m_function; GPRReg m_resultGPR; - Structure* m_contiguousStructure; - Structure* m_arrayStorageStructure; + RegisteredStructure m_contiguousStructure; + RegisteredStructure m_arrayStorageOrContiguousStructure; GPRReg m_sizeGPR; + GPRReg m_storageGPR; Vector<SilentRegisterSavePlan, 2> m_plans; }; -} } // namespace JSC::DFG +class CallArrayAllocatorWithVariableStructureVariableSizeSlowPathGenerator : public JumpingSlowPathGenerator<MacroAssembler::JumpList> { +public: + CallArrayAllocatorWithVariableStructureVariableSizeSlowPathGenerator( + MacroAssembler::JumpList from, SpeculativeJIT* jit, P_JITOperation_EStZB function, + GPRReg resultGPR, GPRReg structureGPR, GPRReg sizeGPR, GPRReg storageGPR, GPRReg scratchGPR) + : JumpingSlowPathGenerator<MacroAssembler::JumpList>(from, jit) + , m_function(function) + , m_resultGPR(resultGPR) + , m_structureGPR(structureGPR) + , m_sizeGPR(sizeGPR) + , m_storageGPR(storageGPR) + , m_scratchGPR(scratchGPR) + { + jit->silentSpillAllRegistersImpl(false, m_plans, resultGPR, m_scratchGPR); + } -#endif // ENABLE(DFG_JIT) +protected: + void generateInternal(SpeculativeJIT* jit) override + { + linkFrom(jit); + for (unsigned i = 0; i < m_plans.size(); ++i) + jit->silentSpill(m_plans[i]); + jit->callOperation(m_function, m_resultGPR, m_structureGPR, m_sizeGPR, m_storageGPR); + for (unsigned i = m_plans.size(); i--;) + jit->silentFill(m_plans[i], m_scratchGPR); + jit->m_jit.exceptionCheck(); + jumpTo(jit); + } + +private: + P_JITOperation_EStZB m_function; + GPRReg m_resultGPR; + GPRReg m_structureGPR; + GPRReg m_sizeGPR; + GPRReg m_storageGPR; + GPRReg m_scratchGPR; + Vector<SilentRegisterSavePlan, 2> m_plans; +}; -#endif // DFGCallArrayAllocatorSlowPathGenerator_h +} } // namespace JSC::DFG +#endif // ENABLE(DFG_JIT) |