Changeset 158820 in webkit


Ignore:
Timestamp:
Nov 6, 2013 9:05:03 PM (10 years ago)
Author:
fpizlo@apple.com
Message:

IC code should handle the call frame register not being the callFrameRegister
https://bugs.webkit.org/show_bug.cgi?id=123865

Reviewed by Geoffrey Garen.

For now, in the FTL, the call frame may be something other than our frame pointer,
since it's an argument passed in according to whatever convention LLVM picks.

This is temporary in two ways - pretty soon the callFrameRegister will be the actual
frame pointer and not some other register, and LLVM will not pass the frame pointer
as an argument to IC's.

  • bytecode/StructureStubInfo.h:
  • dfg/DFGSpeculativeJIT32_64.cpp:

(JSC::DFG::SpeculativeJIT::cachedGetById):
(JSC::DFG::SpeculativeJIT::cachedPutById):

  • dfg/DFGSpeculativeJIT64.cpp:

(JSC::DFG::SpeculativeJIT::cachedGetById):
(JSC::DFG::SpeculativeJIT::cachedPutById):

  • ftl/FTLCompile.cpp:

(JSC::FTL::fixFunctionBasedOnStackMaps):

  • ftl/FTLInlineCacheSize.cpp:

(JSC::FTL::sizeOfGetById):
(JSC::FTL::sizeOfPutById):

  • jit/CCallHelpers.h:

(JSC::CCallHelpers::setupArguments):

  • jit/JITInlineCacheGenerator.cpp:

(JSC::JITByIdGenerator::JITByIdGenerator):
(JSC::JITPutByIdGenerator::JITPutByIdGenerator):

  • jit/JITInlineCacheGenerator.h:

(JSC::JITGetByIdGenerator::JITGetByIdGenerator):

  • jit/JITPropertyAccess.cpp:

(JSC::JIT::emit_op_get_by_id):
(JSC::JIT::emit_op_put_by_id):

  • jit/JITPropertyAccess32_64.cpp:

(JSC::JIT::emit_op_get_by_id):
(JSC::JIT::emit_op_put_by_id):

  • jit/Repatch.cpp:

(JSC::tryBuildGetByIDList):
(JSC::emitPutTransitionStub):

Location:
trunk/Source/JavaScriptCore
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r158803 r158820  
     12013-11-06  Filip Pizlo  <fpizlo@apple.com>
     2
     3        IC code should handle the call frame register not being the callFrameRegister
     4        https://bugs.webkit.org/show_bug.cgi?id=123865
     5
     6        Reviewed by Geoffrey Garen.
     7       
     8        For now, in the FTL, the call frame may be something other than our frame pointer,
     9        since it's an argument passed in according to whatever convention LLVM picks.
     10       
     11        This is temporary in two ways - pretty soon the callFrameRegister will be the actual
     12        frame pointer and not some other register, and LLVM will not pass the frame pointer
     13        as an argument to IC's.
     14
     15        * bytecode/StructureStubInfo.h:
     16        * dfg/DFGSpeculativeJIT32_64.cpp:
     17        (JSC::DFG::SpeculativeJIT::cachedGetById):
     18        (JSC::DFG::SpeculativeJIT::cachedPutById):
     19        * dfg/DFGSpeculativeJIT64.cpp:
     20        (JSC::DFG::SpeculativeJIT::cachedGetById):
     21        (JSC::DFG::SpeculativeJIT::cachedPutById):
     22        * ftl/FTLCompile.cpp:
     23        (JSC::FTL::fixFunctionBasedOnStackMaps):
     24        * ftl/FTLInlineCacheSize.cpp:
     25        (JSC::FTL::sizeOfGetById):
     26        (JSC::FTL::sizeOfPutById):
     27        * jit/CCallHelpers.h:
     28        (JSC::CCallHelpers::setupArguments):
     29        * jit/JITInlineCacheGenerator.cpp:
     30        (JSC::JITByIdGenerator::JITByIdGenerator):
     31        (JSC::JITPutByIdGenerator::JITPutByIdGenerator):
     32        * jit/JITInlineCacheGenerator.h:
     33        (JSC::JITGetByIdGenerator::JITGetByIdGenerator):
     34        * jit/JITPropertyAccess.cpp:
     35        (JSC::JIT::emit_op_get_by_id):
     36        (JSC::JIT::emit_op_put_by_id):
     37        * jit/JITPropertyAccess32_64.cpp:
     38        (JSC::JIT::emit_op_get_by_id):
     39        (JSC::JIT::emit_op_put_by_id):
     40        * jit/Repatch.cpp:
     41        (JSC::tryBuildGetByIDList):
     42        (JSC::emitPutTransitionStub):
     43
    1442013-11-06  Daniel Bates  <dabates@apple.com>
    245
  • trunk/Source/JavaScriptCore/bytecode/StructureStubInfo.h

    r157932 r158820  
    226226    struct {
    227227        int8_t registersFlushed;
     228        int8_t callFrameRegister;
    228229        int8_t baseGPR;
    229230#if USE(JSVALUE32_64)
  • trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp

    r158384 r158820  
    199199{
    200200    JITGetByIdGenerator gen(
    201         m_jit.codeBlock(), codeOrigin, usedRegisters(),
     201        m_jit.codeBlock(), codeOrigin, usedRegisters(), GPRInfo::callFrameRegister,
    202202        JSValueRegs(baseTagGPROrNone, basePayloadGPR),
    203203        JSValueRegs(resultTagGPR, resultPayloadGPR), spillMode != NeedToSpill);
     
    233233   
    234234    JITPutByIdGenerator gen(
    235         m_jit.codeBlock(), codeOrigin, usedRegisters(), JSValueRegs::payloadOnly(basePayloadGPR),
    236         JSValueRegs(valueTagGPR, valuePayloadGPR), scratchGPR, false,
    237         m_jit.ecmaModeFor(codeOrigin), putKind);
     235        m_jit.codeBlock(), codeOrigin, usedRegisters(), GPRInfo::callFrameRegister,
     236        JSValueRegs::payloadOnly(basePayloadGPR), JSValueRegs(valueTagGPR, valuePayloadGPR),
     237        scratchGPR, false, m_jit.ecmaModeFor(codeOrigin), putKind);
    238238   
    239239    gen.generateFastPath(m_jit);
  • trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp

    r158384 r158820  
    211211{
    212212    JITGetByIdGenerator gen(
    213         m_jit.codeBlock(), codeOrigin, usedRegisters(), JSValueRegs(baseGPR),
    214         JSValueRegs(resultGPR), spillMode != NeedToSpill);
     213        m_jit.codeBlock(), codeOrigin, usedRegisters(), GPRInfo::callFrameRegister,
     214        JSValueRegs(baseGPR), JSValueRegs(resultGPR), spillMode != NeedToSpill);
    215215    gen.generateFastPath(m_jit);
    216216   
     
    233233
    234234    JITPutByIdGenerator gen(
    235         m_jit.codeBlock(), codeOrigin, usedRegisters(), JSValueRegs(baseGPR),
    236         JSValueRegs(valueGPR), scratchGPR, false, m_jit.ecmaModeFor(codeOrigin), putKind);
     235        m_jit.codeBlock(), codeOrigin, usedRegisters(), GPRInfo::callFrameRegister,
     236        JSValueRegs(baseGPR), JSValueRegs(valueGPR), scratchGPR, false,
     237        m_jit.ecmaModeFor(codeOrigin), putKind);
    237238    gen.generateFastPath(m_jit);
    238239   
  • trunk/Source/JavaScriptCore/ftl/FTLCompile.cpp

    r158681 r158820  
    199199           
    200200            JITGetByIdGenerator gen(
    201                 codeBlock, getById.codeOrigin(), usedRegisters, JSValueRegs(base),
    202                 JSValueRegs(result), false);
     201                codeBlock, getById.codeOrigin(), usedRegisters, callFrameRegister,
     202                JSValueRegs(base), JSValueRegs(result), false);
    203203           
    204204            MacroAssembler::Label begin = slowPathJIT.label();
     
    235235           
    236236            JITPutByIdGenerator gen(
    237                 codeBlock, putById.codeOrigin(), usedRegisters, JSValueRegs(base),
    238                 JSValueRegs(value), GPRInfo::argumentGPR3, false, putById.ecmaMode(),
    239                 putById.putKind());
     237                codeBlock, putById.codeOrigin(), usedRegisters, callFrameRegister,
     238                JSValueRegs(base), JSValueRegs(value), GPRInfo::argumentGPR3, false,
     239                putById.ecmaMode(), putById.putKind());
    240240           
    241241            MacroAssembler::Label begin = slowPathJIT.label();
  • trunk/Source/JavaScriptCore/ftl/FTLInlineCacheSize.cpp

    r157872 r158820  
    4545   
    4646    JITGetByIdGenerator generator(
    47         0, CodeOrigin(), RegisterSet(), JSValueRegs(GPRInfo::regT6), JSValueRegs(GPRInfo::regT7),
    48         false);
     47        0, CodeOrigin(), RegisterSet(), GPRInfo::callFrameRegister,
     48        JSValueRegs(GPRInfo::regT6), JSValueRegs(GPRInfo::regT7), false);
    4949    generator.generateFastPath(jit);
    5050   
     
    6060   
    6161    JITPutByIdGenerator generator(
    62         0, CodeOrigin(), RegisterSet(), JSValueRegs(GPRInfo::regT6), JSValueRegs(GPRInfo::regT7),
    63         GPRInfo::regT8, false, NotStrictMode, NotDirect);
     62        0, CodeOrigin(), RegisterSet(), GPRInfo::callFrameRegister,
     63        JSValueRegs(GPRInfo::regT6), JSValueRegs(GPRInfo::regT7), GPRInfo::regT8, false,
     64        NotStrictMode, NotDirect);
    6465    generator.generateFastPath(jit);
    6566   
  • trunk/Source/JavaScriptCore/jit/CCallHelpers.h

    r158692 r158820  
    9494        addCallArgument(arg1);
    9595        addCallArgument(arg2);
     96    }
     97   
     98    ALWAYS_INLINE void setupArguments(GPRReg arg1, GPRReg arg2, GPRReg arg3)
     99    {
     100        resetCallArguments();
     101        addCallArgument(arg1);
     102        addCallArgument(arg2);
     103        addCallArgument(arg3);
     104    }
     105   
     106    ALWAYS_INLINE void setupArguments(GPRReg arg1, GPRReg arg2, TrustedImmPtr arg3, TrustedImmPtr arg4)
     107    {
     108        resetCallArguments();
     109        addCallArgument(arg1);
     110        addCallArgument(arg2);
     111        addCallArgument(arg3);
     112        addCallArgument(arg4);
     113    }
     114   
     115    ALWAYS_INLINE void setupArguments(GPRReg arg1, GPRReg arg2, TrustedImmPtr arg3, TrustedImm32 arg4, GPRReg arg5)
     116    {
     117        resetCallArguments();
     118        addCallArgument(arg1);
     119        addCallArgument(arg2);
     120        addCallArgument(arg3);
     121        addCallArgument(arg4);
     122        addCallArgument(arg5);
     123    }
     124   
     125    ALWAYS_INLINE void setupArguments(GPRReg arg1, GPRReg arg2, TrustedImmPtr arg3, TrustedImm32 arg4, GPRReg arg5, GPRReg arg6)
     126    {
     127        resetCallArguments();
     128        addCallArgument(arg1);
     129        addCallArgument(arg2);
     130        addCallArgument(arg3);
     131        addCallArgument(arg4);
     132        addCallArgument(arg5);
     133        addCallArgument(arg6);
    96134    }
    97135   
     
    907945    }
    908946   
     947    ALWAYS_INLINE void setupArguments(GPRReg arg1, GPRReg arg2, GPRReg arg3)
     948    {
     949        setupThreeStubArgsGPR<GPRInfo::argumentGPR0, GPRInfo::argumentGPR1, GPRInfo::argumentGPR2>(arg1, arg2, arg3);
     950    }
     951   
     952    ALWAYS_INLINE void setupArguments(GPRReg arg1, GPRReg arg2, TrustedImmPtr arg3, TrustedImmPtr arg4)
     953    {
     954        setupTwoStubArgsGPR<GPRInfo::argumentGPR0, GPRInfo::argumentGPR1>(arg1, arg2);
     955        move(arg3, GPRInfo::argumentGPR2);
     956        move(arg4, GPRInfo::argumentGPR3);
     957    }
     958   
     959    ALWAYS_INLINE void setupArguments(GPRReg arg1, GPRReg arg2, TrustedImmPtr arg3, TrustedImm32 arg4, GPRReg arg5)
     960    {
     961        setupThreeStubArgsGPR<GPRInfo::argumentGPR0, GPRInfo::argumentGPR1, GPRInfo::argumentGPR4>(arg1, arg2, arg5);
     962        move(arg3, GPRInfo::argumentGPR2);
     963        move(arg4, GPRInfo::argumentGPR3);
     964    }
     965   
    909966    ALWAYS_INLINE void setupArguments(GPRReg arg1, TrustedImmPtr arg2, GPRReg arg3, TrustedImmPtr arg4)
    910967    {
  • trunk/Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp

    r157872 r158820  
    5050JITByIdGenerator::JITByIdGenerator(
    5151    CodeBlock* codeBlock, CodeOrigin codeOrigin, const RegisterSet& usedRegisters,
    52     JSValueRegs base, JSValueRegs value, bool registersFlushed)
     52    GPRReg callFrameRegister, JSValueRegs base, JSValueRegs value, bool registersFlushed)
    5353    : JITInlineCacheGenerator(codeBlock, codeOrigin)
    5454    , m_base(base)
     
    6363    m_stubInfo->patch.usedRegisters.set(value);
    6464   
     65    m_stubInfo->patch.callFrameRegister = static_cast<int8_t>(callFrameRegister);
    6566    m_stubInfo->patch.baseGPR = static_cast<int8_t>(base.payloadGPR());
    6667    m_stubInfo->patch.valueGPR = static_cast<int8_t>(value.payloadGPR());
     
    130131JITPutByIdGenerator::JITPutByIdGenerator(
    131132    CodeBlock* codeBlock, CodeOrigin codeOrigin, const RegisterSet& usedRegisters,
    132     JSValueRegs base, JSValueRegs value, GPRReg scratch, bool registersFlushed,
    133     ECMAMode ecmaMode, PutKind putKind)
    134     : JITByIdGenerator(codeBlock, codeOrigin, usedRegisters, base, value, registersFlushed)
     133    GPRReg callFrameRegister, JSValueRegs base, JSValueRegs value, GPRReg scratch,
     134    bool registersFlushed, ECMAMode ecmaMode, PutKind putKind)
     135    : JITByIdGenerator(
     136        codeBlock, codeOrigin, usedRegisters, callFrameRegister, base, value,
     137        registersFlushed)
    135138    , m_scratch(scratch)
    136139    , m_ecmaMode(ecmaMode)
  • trunk/Source/JavaScriptCore/jit/JITInlineCacheGenerator.h

    r157872 r158820  
    5757
    5858    JITByIdGenerator(
    59         CodeBlock*, CodeOrigin, const RegisterSet&, JSValueRegs base, JSValueRegs value,
    60         bool registersFlushed);
     59        CodeBlock*, CodeOrigin, const RegisterSet&, GPRReg callFrameRegister,
     60        JSValueRegs base, JSValueRegs value, bool registersFlushed);
    6161   
    6262public:
     
    9797    JITGetByIdGenerator(
    9898        CodeBlock* codeBlock, CodeOrigin codeOrigin, const RegisterSet& usedRegisters,
    99         JSValueRegs base, JSValueRegs value, bool registersFlushed)
    100         : JITByIdGenerator(codeBlock, codeOrigin, usedRegisters, base, value, registersFlushed)
     99        GPRReg callFrameRegister, JSValueRegs base, JSValueRegs value,
     100        bool registersFlushed)
     101        : JITByIdGenerator(
     102            codeBlock, codeOrigin, usedRegisters, callFrameRegister, base, value,
     103            registersFlushed)
    101104    {
    102105    }
     
    110113
    111114    JITPutByIdGenerator(
    112         CodeBlock*, CodeOrigin, const RegisterSet& usedRegisters, JSValueRegs base,
    113         JSValueRegs value, GPRReg scratch, bool registersFlushed, ECMAMode, PutKind);
     115        CodeBlock*, CodeOrigin, const RegisterSet& usedRegisters, GPRReg callFrameRegister,
     116        JSValueRegs base, JSValueRegs value, GPRReg scratch, bool registersFlushed,
     117        ECMAMode, PutKind);
    114118   
    115119    void generateFastPath(MacroAssembler&);
  • trunk/Source/JavaScriptCore/jit/JITPropertyAccess.cpp

    r157707 r158820  
    525525    JITGetByIdGenerator gen(
    526526        m_codeBlock, CodeOrigin(m_bytecodeOffset), RegisterSet::specialRegisters(),
    527         JSValueRegs(regT0), JSValueRegs(regT0), true);
     527        callFrameRegister, JSValueRegs(regT0), JSValueRegs(regT0), true);
    528528    gen.generateFastPath(*this);
    529529    addSlowCase(gen.slowPathJump());
     
    571571    JITPutByIdGenerator gen(
    572572        m_codeBlock, CodeOrigin(m_bytecodeOffset), RegisterSet::specialRegisters(),
    573         JSValueRegs(regT0), JSValueRegs(regT1), regT2, true, m_codeBlock->ecmaMode(),
    574         direct ? Direct : NotDirect);
     573        callFrameRegister, JSValueRegs(regT0), JSValueRegs(regT1), regT2, true,
     574        m_codeBlock->ecmaMode(), direct ? Direct : NotDirect);
    575575   
    576576    gen.generateFastPath(*this);
  • trunk/Source/JavaScriptCore/jit/JITPropertyAccess32_64.cpp

    r157707 r158820  
    485485    JITGetByIdGenerator gen(
    486486        m_codeBlock, CodeOrigin(m_bytecodeOffset), RegisterSet::specialRegisters(),
    487         JSValueRegs::payloadOnly(regT0), JSValueRegs(regT1, regT0), true);
     487        callFrameRegister, JSValueRegs::payloadOnly(regT0), JSValueRegs(regT1, regT0), true);
    488488    gen.generateFastPath(*this);
    489489    addSlowCase(gen.slowPathJump());
     
    531531    JITPutByIdGenerator gen(
    532532        m_codeBlock, CodeOrigin(m_bytecodeOffset), RegisterSet::specialRegisters(),
    533         JSValueRegs::payloadOnly(regT0), JSValueRegs(regT3, regT2), regT1, true,
    534         m_codeBlock->ecmaMode(), direct ? Direct : NotDirect);
     533        callFrameRegister, JSValueRegs::payloadOnly(regT0), JSValueRegs(regT3, regT2),
     534        regT1, true, m_codeBlock->ecmaMode(), direct ? Direct : NotDirect);
    535535   
    536536    gen.generateFastPath(*this);
  • trunk/Source/JavaScriptCore/jit/Repatch.cpp

    r158516 r158820  
    461461        stubInfo.u.getByIdSelfList.listSize++;
    462462       
     463        GPRReg callFrameRegister = static_cast<GPRReg>(stubInfo.patch.callFrameRegister);
    463464        GPRReg baseGPR = static_cast<GPRReg>(stubInfo.patch.baseGPR);
    464465#if USE(JSVALUE32_64)
     
    501502#endif
    502503                }
    503                 stubJit.setupArgumentsWithExecState(baseGPR, scratchGPR);
     504                stubJit.setupArguments(callFrameRegister, baseGPR, scratchGPR);
    504505                operationFunction = operationCallGetter;
    505506            } else {
    506                 stubJit.setupArgumentsWithExecState(
    507                     baseGPR,
     507                stubJit.setupArguments(
     508                    callFrameRegister, baseGPR,
    508509                    MacroAssembler::TrustedImmPtr(FunctionPtr(slot.customGetter()).executableAddress()),
    509510                    MacroAssembler::TrustedImmPtr(ident.impl()));
     
    758759    VM* vm = &exec->vm();
    759760
     761    GPRReg callFrameRegister = static_cast<GPRReg>(stubInfo.patch.callFrameRegister);
    760762    GPRReg baseGPR = static_cast<GPRReg>(stubInfo.patch.baseGPR);
    761763#if USE(JSVALUE32_64)
     
    772774   
    773775    CCallHelpers stubJit(vm);
    774            
     776   
    775777    GPRReg scratchGPR1 = allocator.allocateScratchGPR();
    776778    ASSERT(scratchGPR1 != baseGPR);
     
    914916        allocator.preserveUsedRegistersToScratchBuffer(stubJit, scratchBuffer, scratchGPR1);
    915917#if USE(JSVALUE64)
    916         stubJit.setupArgumentsWithExecState(baseGPR, MacroAssembler::TrustedImmPtr(structure), MacroAssembler::TrustedImm32(slot.cachedOffset()), valueGPR);
    917 #else
    918         stubJit.setupArgumentsWithExecState(baseGPR, MacroAssembler::TrustedImmPtr(structure), MacroAssembler::TrustedImm32(slot.cachedOffset()), valueGPR, valueTagGPR);
     918        stubJit.setupArguments(callFrameRegister, baseGPR, MacroAssembler::TrustedImmPtr(structure), MacroAssembler::TrustedImm32(slot.cachedOffset()), valueGPR);
     919#else
     920        stubJit.setupArguments(callFrameRegister, baseGPR, MacroAssembler::TrustedImmPtr(structure), MacroAssembler::TrustedImm32(slot.cachedOffset()), valueGPR, valueTagGPR);
    919921#endif
    920922        operationCall = stubJit.call();
Note: See TracChangeset for help on using the changeset viewer.