Changeset 129426 in webkit for trunk/Source/JavaScriptCore/dfg


Ignore:
Timestamp:
Sep 24, 2012, 4:12:00 PM (13 years ago)
Author:
[email protected]
Message:

Inlined activation tear-off in the DFG
https://bugs.webkit.org/show_bug.cgi?id=97487

Reviewed by Filip Pizlo.

  • dfg/DFGOperations.cpp:
  • dfg/DFGOperations.h: Activation tear-off is always inlined now, so I

removed its out-of-line implementation.

  • dfg/DFGSpeculativeJIT32_64.cpp:

(JSC::DFG::SpeculativeJIT::compile):

  • dfg/DFGSpeculativeJIT64.cpp:

(JSC::DFG::SpeculativeJIT::compile): Inlined the variable copy and update
of JSVariableObject::m_registers. This usually turns into < 10 instructions,
which is close to pure win as compared to the operation function call.

  • runtime/JSActivation.h:

(JSActivation):
(JSC::JSActivation::registersOffset):
(JSC::JSActivation::tearOff):
(JSC::JSActivation::isTornOff):
(JSC):
(JSC::JSActivation::storageOffset):
(JSC::JSActivation::storage): Tiny bit of refactoring so the JIT can
share the pointer math helper functions we use internally.

Location:
trunk/Source/JavaScriptCore/dfg
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp

    r128957 r129426  
    11661166    ASSERT(!exec->globalData().exception);
    11671167    return result;
    1168 }
    1169 
    1170 void DFG_OPERATION operationTearOffActivation(ExecState* exec, JSCell* activationCell)
    1171 {
    1172     JSGlobalData& globalData = exec->globalData();
    1173     NativeCallFrameTracer tracer(&globalData, exec);
    1174     jsCast<JSActivation*>(activationCell)->tearOff(exec->globalData());
    11751168}
    11761169
  • trunk/Source/JavaScriptCore/dfg/DFGOperations.h

    r128957 r129426  
    178178JSCell* DFG_OPERATION operationCreateArguments(ExecState*) WTF_INTERNAL;
    179179JSCell* DFG_OPERATION operationCreateInlinedArguments(ExecState*, InlineCallFrame*) WTF_INTERNAL;
    180 void DFG_OPERATION operationTearOffActivation(ExecState*, JSCell*) WTF_INTERNAL;
    181180void DFG_OPERATION operationTearOffArguments(ExecState*, JSCell*, JSCell*) WTF_INTERNAL;
    182181void DFG_OPERATION operationTearOffInlinedArguments(ExecState*, JSCell*, JSCell*, InlineCallFrame*) WTF_INTERNAL;
  • trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp

    r129324 r129426  
    3131
    3232#include "DFGSlowPathGenerator.h"
    33 #include "JSVariableObject.h"
     33#include "JSActivation.h"
    3434
    3535namespace JSC { namespace DFG {
     
    40714071    case TearOffActivation: {
    40724072        JSValueOperand activationValue(this, node.child1());
     4073        GPRTemporary scratch(this);
    40734074       
    40744075        GPRReg activationValueTagGPR = activationValue.tagGPR();
    40754076        GPRReg activationValuePayloadGPR = activationValue.payloadGPR();
    4076 
    4077         JITCompiler::Jump created = m_jit.branch32(JITCompiler::NotEqual, activationValueTagGPR, TrustedImm32(JSValue::EmptyValueTag));
    4078 
    4079         addSlowPathGenerator(
    4080             slowPathCall(
    4081                 created, this, operationTearOffActivation, NoResult, activationValuePayloadGPR));
    4082        
     4077        GPRReg scratchGPR = scratch.gpr();
     4078
     4079        JITCompiler::Jump notCreated = m_jit.branch32(JITCompiler::Equal, activationValueTagGPR, TrustedImm32(JSValue::EmptyValueTag));
     4080
     4081        SharedSymbolTable* symbolTable = m_jit.symbolTableFor(node.codeOrigin);
     4082        int registersOffset = JSActivation::registersOffset(symbolTable);
     4083
     4084        int captureEnd = symbolTable->captureEnd();
     4085        for (int i = symbolTable->captureStart(); i < captureEnd; ++i) {
     4086            m_jit.loadPtr(
     4087                JITCompiler::Address(
     4088                    GPRInfo::callFrameRegister, i * sizeof(Register) + OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.tag)),
     4089                scratchGPR);
     4090            m_jit.storePtr(
     4091                scratchGPR, JITCompiler::Address(
     4092                    activationValuePayloadGPR, registersOffset + i * sizeof(Register) + OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.tag)));
     4093            m_jit.loadPtr(
     4094                JITCompiler::Address(
     4095                    GPRInfo::callFrameRegister, i * sizeof(Register) + OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.payload)),
     4096                scratchGPR);
     4097            m_jit.storePtr(
     4098                scratchGPR, JITCompiler::Address(
     4099                    activationValuePayloadGPR, registersOffset + i * sizeof(Register) + OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.payload)));
     4100        }
     4101        m_jit.addPtr(TrustedImm32(registersOffset), activationValuePayloadGPR, scratchGPR);
     4102        m_jit.storePtr(scratchGPR, JITCompiler::Address(activationValuePayloadGPR, JSActivation::offsetOfRegisters()));
     4103       
     4104        notCreated.link(&m_jit);
    40834105        noResult(m_compileIndex);
    40844106        break;
  • trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp

    r129316 r129426  
    40424042
    40434043        JSValueOperand activationValue(this, node.child1());
     4044        GPRTemporary scratch(this);
    40444045        GPRReg activationValueGPR = activationValue.gpr();
    4045 
    4046         JITCompiler::Jump created = m_jit.branchTestPtr(JITCompiler::NonZero, activationValueGPR);
    4047        
    4048         addSlowPathGenerator(
    4049             slowPathCall(
    4050                 created, this, operationTearOffActivation, NoResult, activationValueGPR));
    4051        
     4046        GPRReg scratchGPR = scratch.gpr();
     4047
     4048        JITCompiler::Jump notCreated = m_jit.branchTestPtr(JITCompiler::Zero, activationValueGPR);
     4049
     4050        SharedSymbolTable* symbolTable = m_jit.symbolTableFor(node.codeOrigin);
     4051        int registersOffset = JSActivation::registersOffset(symbolTable);
     4052
     4053        int captureEnd = symbolTable->captureEnd();
     4054        for (int i = symbolTable->captureStart(); i < captureEnd; ++i) {
     4055            m_jit.loadPtr(
     4056                JITCompiler::Address(
     4057                    GPRInfo::callFrameRegister, i * sizeof(Register)), scratchGPR);
     4058            m_jit.storePtr(
     4059                scratchGPR, JITCompiler::Address(
     4060                    activationValueGPR, registersOffset + i * sizeof(Register)));
     4061        }
     4062        m_jit.addPtr(TrustedImm32(registersOffset), activationValueGPR, scratchGPR);
     4063        m_jit.storePtr(scratchGPR, JITCompiler::Address(activationValueGPR, JSActivation::offsetOfRegisters()));
     4064
     4065        notCreated.link(&m_jit);
    40524066        noResult(m_compileIndex);
    40534067        break;
Note: See TracChangeset for help on using the changeset viewer.