summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/dfg/DFGCallArrayAllocatorSlowPathGenerator.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/JavaScriptCore/dfg/DFGCallArrayAllocatorSlowPathGenerator.h
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGCallArrayAllocatorSlowPathGenerator.h')
-rw-r--r--Source/JavaScriptCore/dfg/DFGCallArrayAllocatorSlowPathGenerator.h96
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)