diff options
Diffstat (limited to 'Source/JavaScriptCore/dfg')
-rw-r--r-- | Source/JavaScriptCore/dfg/DFGOperations.cpp | 7 | ||||
-rw-r--r-- | Source/JavaScriptCore/dfg/DFGOperations.h | 1 | ||||
-rw-r--r-- | Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp | 5 | ||||
-rw-r--r-- | Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp | 34 | ||||
-rw-r--r-- | Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp | 26 |
5 files changed, 51 insertions, 22 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGOperations.cpp b/Source/JavaScriptCore/dfg/DFGOperations.cpp index 3452b2f0d..eaa0f47f7 100644 --- a/Source/JavaScriptCore/dfg/DFGOperations.cpp +++ b/Source/JavaScriptCore/dfg/DFGOperations.cpp @@ -1167,13 +1167,6 @@ JSCell* DFG_OPERATION operationCreateInlinedArguments( return result; } -void DFG_OPERATION operationTearOffActivation(ExecState* exec, JSCell* activationCell) -{ - JSGlobalData& globalData = exec->globalData(); - NativeCallFrameTracer tracer(&globalData, exec); - jsCast<JSActivation*>(activationCell)->tearOff(exec->globalData()); -} - void DFG_OPERATION operationTearOffArguments(ExecState* exec, JSCell* argumentsCell, JSCell* activationCell) { ASSERT(exec->codeBlock()->usesArguments()); diff --git a/Source/JavaScriptCore/dfg/DFGOperations.h b/Source/JavaScriptCore/dfg/DFGOperations.h index f86f5cf1f..3b947ecbf 100644 --- a/Source/JavaScriptCore/dfg/DFGOperations.h +++ b/Source/JavaScriptCore/dfg/DFGOperations.h @@ -177,7 +177,6 @@ char* DFG_OPERATION operationLinkConstruct(ExecState*) WTF_INTERNAL; JSCell* DFG_OPERATION operationCreateActivation(ExecState*) WTF_INTERNAL; JSCell* DFG_OPERATION operationCreateArguments(ExecState*) WTF_INTERNAL; JSCell* DFG_OPERATION operationCreateInlinedArguments(ExecState*, InlineCallFrame*) WTF_INTERNAL; -void DFG_OPERATION operationTearOffActivation(ExecState*, JSCell*) WTF_INTERNAL; void DFG_OPERATION operationTearOffArguments(ExecState*, JSCell*, JSCell*) WTF_INTERNAL; void DFG_OPERATION operationTearOffInlinedArguments(ExecState*, JSCell*, JSCell*, InlineCallFrame*) WTF_INTERNAL; EncodedJSValue DFG_OPERATION operationGetArgumentsLength(ExecState*, int32_t) WTF_INTERNAL; diff --git a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp index e42752d8a..05b1e741e 100644 --- a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp +++ b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp @@ -1907,9 +1907,10 @@ void SpeculativeJIT::compileValueToInt32(Node& node) SpeculateBooleanOperand op1(this, node.child1()); GPRTemporary result(this, op1); - m_jit.and32(JITCompiler::TrustedImm32(1), op1.gpr()); + m_jit.move(op1.gpr(), result.gpr()); + m_jit.and32(JITCompiler::TrustedImm32(1), result.gpr()); - integerResult(op1.gpr(), m_compileIndex); + integerResult(result.gpr(), m_compileIndex); return; } diff --git a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp index 8039ad2ab..70709b52f 100644 --- a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp +++ b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp @@ -30,7 +30,7 @@ #if ENABLE(DFG_JIT) #include "DFGSlowPathGenerator.h" -#include "JSVariableObject.h" +#include "JSActivation.h" namespace JSC { namespace DFG { @@ -4070,16 +4070,38 @@ void SpeculativeJIT::compile(Node& node) case TearOffActivation: { JSValueOperand activationValue(this, node.child1()); + GPRTemporary scratch(this); GPRReg activationValueTagGPR = activationValue.tagGPR(); GPRReg activationValuePayloadGPR = activationValue.payloadGPR(); + GPRReg scratchGPR = scratch.gpr(); - JITCompiler::Jump created = m_jit.branch32(JITCompiler::NotEqual, activationValueTagGPR, TrustedImm32(JSValue::EmptyValueTag)); - - addSlowPathGenerator( - slowPathCall( - created, this, operationTearOffActivation, NoResult, activationValuePayloadGPR)); + JITCompiler::Jump notCreated = m_jit.branch32(JITCompiler::Equal, activationValueTagGPR, TrustedImm32(JSValue::EmptyValueTag)); + + SharedSymbolTable* symbolTable = m_jit.symbolTableFor(node.codeOrigin); + int registersOffset = JSActivation::registersOffset(symbolTable); + + int captureEnd = symbolTable->captureEnd(); + for (int i = symbolTable->captureStart(); i < captureEnd; ++i) { + m_jit.loadPtr( + JITCompiler::Address( + GPRInfo::callFrameRegister, i * sizeof(Register) + OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.tag)), + scratchGPR); + m_jit.storePtr( + scratchGPR, JITCompiler::Address( + activationValuePayloadGPR, registersOffset + i * sizeof(Register) + OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.tag))); + m_jit.loadPtr( + JITCompiler::Address( + GPRInfo::callFrameRegister, i * sizeof(Register) + OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.payload)), + scratchGPR); + m_jit.storePtr( + scratchGPR, JITCompiler::Address( + activationValuePayloadGPR, registersOffset + i * sizeof(Register) + OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.payload))); + } + m_jit.addPtr(TrustedImm32(registersOffset), activationValuePayloadGPR, scratchGPR); + m_jit.storePtr(scratchGPR, JITCompiler::Address(activationValuePayloadGPR, JSActivation::offsetOfRegisters())); + notCreated.link(&m_jit); noResult(m_compileIndex); break; } diff --git a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp index 8488d261d..d7cec27c1 100644 --- a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp +++ b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp @@ -4041,14 +4041,28 @@ void SpeculativeJIT::compile(Node& node) ASSERT(!node.codeOrigin.inlineCallFrame); JSValueOperand activationValue(this, node.child1()); + GPRTemporary scratch(this); GPRReg activationValueGPR = activationValue.gpr(); + GPRReg scratchGPR = scratch.gpr(); - JITCompiler::Jump created = m_jit.branchTestPtr(JITCompiler::NonZero, activationValueGPR); - - addSlowPathGenerator( - slowPathCall( - created, this, operationTearOffActivation, NoResult, activationValueGPR)); - + JITCompiler::Jump notCreated = m_jit.branchTestPtr(JITCompiler::Zero, activationValueGPR); + + SharedSymbolTable* symbolTable = m_jit.symbolTableFor(node.codeOrigin); + int registersOffset = JSActivation::registersOffset(symbolTable); + + int captureEnd = symbolTable->captureEnd(); + for (int i = symbolTable->captureStart(); i < captureEnd; ++i) { + m_jit.loadPtr( + JITCompiler::Address( + GPRInfo::callFrameRegister, i * sizeof(Register)), scratchGPR); + m_jit.storePtr( + scratchGPR, JITCompiler::Address( + activationValueGPR, registersOffset + i * sizeof(Register))); + } + m_jit.addPtr(TrustedImm32(registersOffset), activationValueGPR, scratchGPR); + m_jit.storePtr(scratchGPR, JITCompiler::Address(activationValueGPR, JSActivation::offsetOfRegisters())); + + notCreated.link(&m_jit); noResult(m_compileIndex); break; } |