Changeset 158820 in webkit
- Timestamp:
- Nov 6, 2013 9:05:03 PM (10 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r158803 r158820 1 2013-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 1 44 2013-11-06 Daniel Bates <dabates@apple.com> 2 45 -
trunk/Source/JavaScriptCore/bytecode/StructureStubInfo.h
r157932 r158820 226 226 struct { 227 227 int8_t registersFlushed; 228 int8_t callFrameRegister; 228 229 int8_t baseGPR; 229 230 #if USE(JSVALUE32_64) -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp
r158384 r158820 199 199 { 200 200 JITGetByIdGenerator gen( 201 m_jit.codeBlock(), codeOrigin, usedRegisters(), 201 m_jit.codeBlock(), codeOrigin, usedRegisters(), GPRInfo::callFrameRegister, 202 202 JSValueRegs(baseTagGPROrNone, basePayloadGPR), 203 203 JSValueRegs(resultTagGPR, resultPayloadGPR), spillMode != NeedToSpill); … … 233 233 234 234 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); 238 238 239 239 gen.generateFastPath(m_jit); -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp
r158384 r158820 211 211 { 212 212 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); 215 215 gen.generateFastPath(m_jit); 216 216 … … 233 233 234 234 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); 237 238 gen.generateFastPath(m_jit); 238 239 -
trunk/Source/JavaScriptCore/ftl/FTLCompile.cpp
r158681 r158820 199 199 200 200 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); 203 203 204 204 MacroAssembler::Label begin = slowPathJIT.label(); … … 235 235 236 236 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()); 240 240 241 241 MacroAssembler::Label begin = slowPathJIT.label(); -
trunk/Source/JavaScriptCore/ftl/FTLInlineCacheSize.cpp
r157872 r158820 45 45 46 46 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); 49 49 generator.generateFastPath(jit); 50 50 … … 60 60 61 61 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); 64 65 generator.generateFastPath(jit); 65 66 -
trunk/Source/JavaScriptCore/jit/CCallHelpers.h
r158692 r158820 94 94 addCallArgument(arg1); 95 95 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); 96 134 } 97 135 … … 907 945 } 908 946 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 909 966 ALWAYS_INLINE void setupArguments(GPRReg arg1, TrustedImmPtr arg2, GPRReg arg3, TrustedImmPtr arg4) 910 967 { -
trunk/Source/JavaScriptCore/jit/JITInlineCacheGenerator.cpp
r157872 r158820 50 50 JITByIdGenerator::JITByIdGenerator( 51 51 CodeBlock* codeBlock, CodeOrigin codeOrigin, const RegisterSet& usedRegisters, 52 JSValueRegs base, JSValueRegs value, bool registersFlushed)52 GPRReg callFrameRegister, JSValueRegs base, JSValueRegs value, bool registersFlushed) 53 53 : JITInlineCacheGenerator(codeBlock, codeOrigin) 54 54 , m_base(base) … … 63 63 m_stubInfo->patch.usedRegisters.set(value); 64 64 65 m_stubInfo->patch.callFrameRegister = static_cast<int8_t>(callFrameRegister); 65 66 m_stubInfo->patch.baseGPR = static_cast<int8_t>(base.payloadGPR()); 66 67 m_stubInfo->patch.valueGPR = static_cast<int8_t>(value.payloadGPR()); … … 130 131 JITPutByIdGenerator::JITPutByIdGenerator( 131 132 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) 135 138 , m_scratch(scratch) 136 139 , m_ecmaMode(ecmaMode) -
trunk/Source/JavaScriptCore/jit/JITInlineCacheGenerator.h
r157872 r158820 57 57 58 58 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); 61 61 62 62 public: … … 97 97 JITGetByIdGenerator( 98 98 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) 101 104 { 102 105 } … … 110 113 111 114 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); 114 118 115 119 void generateFastPath(MacroAssembler&); -
trunk/Source/JavaScriptCore/jit/JITPropertyAccess.cpp
r157707 r158820 525 525 JITGetByIdGenerator gen( 526 526 m_codeBlock, CodeOrigin(m_bytecodeOffset), RegisterSet::specialRegisters(), 527 JSValueRegs(regT0), JSValueRegs(regT0), true);527 callFrameRegister, JSValueRegs(regT0), JSValueRegs(regT0), true); 528 528 gen.generateFastPath(*this); 529 529 addSlowCase(gen.slowPathJump()); … … 571 571 JITPutByIdGenerator gen( 572 572 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); 575 575 576 576 gen.generateFastPath(*this); -
trunk/Source/JavaScriptCore/jit/JITPropertyAccess32_64.cpp
r157707 r158820 485 485 JITGetByIdGenerator gen( 486 486 m_codeBlock, CodeOrigin(m_bytecodeOffset), RegisterSet::specialRegisters(), 487 JSValueRegs::payloadOnly(regT0), JSValueRegs(regT1, regT0), true);487 callFrameRegister, JSValueRegs::payloadOnly(regT0), JSValueRegs(regT1, regT0), true); 488 488 gen.generateFastPath(*this); 489 489 addSlowCase(gen.slowPathJump()); … … 531 531 JITPutByIdGenerator gen( 532 532 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); 535 535 536 536 gen.generateFastPath(*this); -
trunk/Source/JavaScriptCore/jit/Repatch.cpp
r158516 r158820 461 461 stubInfo.u.getByIdSelfList.listSize++; 462 462 463 GPRReg callFrameRegister = static_cast<GPRReg>(stubInfo.patch.callFrameRegister); 463 464 GPRReg baseGPR = static_cast<GPRReg>(stubInfo.patch.baseGPR); 464 465 #if USE(JSVALUE32_64) … … 501 502 #endif 502 503 } 503 stubJit.setupArguments WithExecState(baseGPR, scratchGPR);504 stubJit.setupArguments(callFrameRegister, baseGPR, scratchGPR); 504 505 operationFunction = operationCallGetter; 505 506 } else { 506 stubJit.setupArguments WithExecState(507 baseGPR,507 stubJit.setupArguments( 508 callFrameRegister, baseGPR, 508 509 MacroAssembler::TrustedImmPtr(FunctionPtr(slot.customGetter()).executableAddress()), 509 510 MacroAssembler::TrustedImmPtr(ident.impl())); … … 758 759 VM* vm = &exec->vm(); 759 760 761 GPRReg callFrameRegister = static_cast<GPRReg>(stubInfo.patch.callFrameRegister); 760 762 GPRReg baseGPR = static_cast<GPRReg>(stubInfo.patch.baseGPR); 761 763 #if USE(JSVALUE32_64) … … 772 774 773 775 CCallHelpers stubJit(vm); 774 776 775 777 GPRReg scratchGPR1 = allocator.allocateScratchGPR(); 776 778 ASSERT(scratchGPR1 != baseGPR); … … 914 916 allocator.preserveUsedRegistersToScratchBuffer(stubJit, scratchBuffer, scratchGPR1); 915 917 #if USE(JSVALUE64) 916 stubJit.setupArguments WithExecState(baseGPR, MacroAssembler::TrustedImmPtr(structure), MacroAssembler::TrustedImm32(slot.cachedOffset()), valueGPR);917 #else 918 stubJit.setupArguments WithExecState(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); 919 921 #endif 920 922 operationCall = stubJit.call();
Note: See TracChangeset
for help on using the changeset viewer.