Changeset 189967 in webkit
- Timestamp:
- Sep 18, 2015, 9:21:08 AM (10 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 3 deleted
- 19 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/CMakeLists.txt
r189961 r189967 388 388 jit/RegisterAtOffset.cpp 389 389 jit/RegisterAtOffsetList.cpp 390 jit/RegisterPreservationWrapperGenerator.cpp391 390 jit/RegisterSet.cpp 392 391 jit/Repatch.cpp -
trunk/Source/JavaScriptCore/ChangeLog
r189964 r189967 1 2015-09-18 Michael Saboff <msaboff@apple.com> 2 3 Remove register preservation and restoration stub code 4 https://bugs.webkit.org/show_bug.cgi?id=149335 5 6 Reviewed by Mark Lam. 7 8 Delete the register preservation and restoration thunks and related plumbing. 9 10 Much of this change is removing the unneeded RegisterPreservationMode parameter 11 from various functions. 12 13 * CMakeLists.txt: 14 * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: 15 * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: 16 * JavaScriptCore.xcodeproj/project.pbxproj: 17 * bytecode/CallLinkInfo.h: 18 (JSC::CallLinkInfo::isVarargsCallType): 19 (JSC::CallLinkInfo::CallLinkInfo): 20 (JSC::CallLinkInfo::isVarargs): 21 (JSC::CallLinkInfo::isLinked): 22 (JSC::CallLinkInfo::setUpCallFromFTL): 23 (JSC::CallLinkInfo::registerPreservationMode): Deleted. 24 * ftl/FTLJITCode.cpp: 25 (JSC::FTL::JITCode::initializeAddressForCall): 26 (JSC::FTL::JITCode::addressForCall): 27 * ftl/FTLJITCode.h: 28 * ftl/FTLOSREntry.cpp: 29 (JSC::FTL::prepareOSREntry): 30 * ftl/FTLOSRExitCompiler.cpp: 31 (JSC::FTL::compileStub): 32 * jit/JITCode.cpp: 33 (JSC::JITCode::execute): 34 (JSC::DirectJITCode::initializeCodeRef): 35 (JSC::DirectJITCode::addressForCall): 36 (JSC::NativeJITCode::initializeCodeRef): 37 (JSC::NativeJITCode::addressForCall): 38 (JSC::DirectJITCode::ensureWrappers): Deleted. 39 * jit/JITCode.h: 40 (JSC::JITCode::jitTypeFor): 41 (JSC::JITCode::executableAddress): 42 * jit/JITOperations.cpp: 43 * jit/RegisterPreservationWrapperGenerator.cpp: Removed. 44 * jit/RegisterPreservationWrapperGenerator.h: Removed. 45 * jit/Repatch.cpp: 46 (JSC::linkPolymorphicCall): 47 * jit/ThunkGenerators.cpp: 48 (JSC::virtualThunkFor): 49 * jit/ThunkGenerators.h: 50 * llint/LLIntSlowPaths.cpp: 51 (JSC::LLInt::entryOSR): 52 (JSC::LLInt::setUpCall): 53 * runtime/Executable.cpp: 54 (JSC::ExecutableBase::clearCode): 55 (JSC::ScriptExecutable::installCode): 56 (JSC::WebAssemblyExecutable::prepareForExecution): 57 * runtime/Executable.h: 58 (JSC::ExecutableBase::generatedJITCodeFor): 59 (JSC::ExecutableBase::entrypointFor): 60 (JSC::ExecutableBase::offsetOfJITCodeWithArityCheckFor): 61 * runtime/RegisterPreservationMode.h: Removed. 62 1 63 2015-09-17 Joseph Pecoraro <pecoraro@apple.com> 2 64 -
trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj
r189961 r189967 650 650 <ClCompile Include="..\jit\RegisterAtOffset.cpp" /> 651 651 <ClCompile Include="..\jit\RegisterAtOffsetList.cpp" /> 652 <ClCompile Include="..\jit\RegisterPreservationWrapperGenerator.cpp" />653 652 <ClCompile Include="..\jit\RegisterSet.cpp" /> 654 653 <ClCompile Include="..\jit\Repatch.cpp" /> … … 1452 1451 <ClInclude Include="..\jit\RegisterAtOffsetList.h" /> 1453 1452 <ClInclude Include="..\jit\RegisterMap.h" /> 1454 <ClInclude Include="..\jit\RegisterPreservationWrapperGenerator.h" />1455 1453 <ClInclude Include="..\jit\RegisterSet.h" /> 1456 1454 <ClInclude Include="..\jit\Repatch.h" /> -
trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters
r189961 r189967 1498 1498 <Filter>Derived Sources</Filter> 1499 1499 </ClCompile> 1500 <ClCompile Include="..\jit\RegisterPreservationWrapperGenerator.cpp">1501 <Filter>jit</Filter>1502 </ClCompile>1503 1500 <ClCompile Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\JSCBuiltins.cpp"> 1504 1501 <Filter>Derived Sources</Filter> … … 4041 4038 </ClInclude> 4042 4039 <ClInclude Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\JSDataViewPrototype.lut.h" /> 4043 <ClInclude Include="..\jit\RegisterPreservationWrapperGenerator.h">4044 <Filter>jit</Filter>4045 </ClInclude>4046 4040 <ClInclude Include="..\ftl\FTLAbbreviatedTypes.h"> 4047 4041 <Filter>ftl</Filter> -
trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r189961 r189967 379 379 0F6B1CB6185FC9E900845D97 /* FTLJSCall.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F6B1CB4185FC9E900845D97 /* FTLJSCall.h */; settings = {ATTRIBUTES = (Private, ); }; }; 380 380 0F6B1CB91861244C00845D97 /* ArityCheckMode.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F6B1CB71861244C00845D97 /* ArityCheckMode.h */; settings = {ATTRIBUTES = (Private, ); }; }; 381 0F6B1CBA1861244C00845D97 /* RegisterPreservationMode.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F6B1CB81861244C00845D97 /* RegisterPreservationMode.h */; settings = {ATTRIBUTES = (Private, ); }; };382 0F6B1CBD1861246A00845D97 /* RegisterPreservationWrapperGenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F6B1CBB1861246A00845D97 /* RegisterPreservationWrapperGenerator.cpp */; };383 0F6B1CBE1861246A00845D97 /* RegisterPreservationWrapperGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F6B1CBC1861246A00845D97 /* RegisterPreservationWrapperGenerator.h */; settings = {ATTRIBUTES = (Private, ); }; };384 381 0F6B1CC51862C47800845D97 /* FTLUnwindInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F6B1CC11862C47800845D97 /* FTLUnwindInfo.cpp */; }; 385 382 0F6B1CC61862C47800845D97 /* FTLUnwindInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F6B1CC21862C47800845D97 /* FTLUnwindInfo.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 2210 2207 0F6B1CB4185FC9E900845D97 /* FTLJSCall.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FTLJSCall.h; path = ftl/FTLJSCall.h; sourceTree = "<group>"; }; 2211 2208 0F6B1CB71861244C00845D97 /* ArityCheckMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArityCheckMode.h; sourceTree = "<group>"; }; 2212 0F6B1CB81861244C00845D97 /* RegisterPreservationMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterPreservationMode.h; sourceTree = "<group>"; };2213 0F6B1CBB1861246A00845D97 /* RegisterPreservationWrapperGenerator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegisterPreservationWrapperGenerator.cpp; sourceTree = "<group>"; };2214 0F6B1CBC1861246A00845D97 /* RegisterPreservationWrapperGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterPreservationWrapperGenerator.h; sourceTree = "<group>"; };2215 2209 0F6B1CC11862C47800845D97 /* FTLUnwindInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FTLUnwindInfo.cpp; path = ftl/FTLUnwindInfo.cpp; sourceTree = "<group>"; }; 2216 2210 0F6B1CC21862C47800845D97 /* FTLUnwindInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FTLUnwindInfo.h; path = ftl/FTLUnwindInfo.h; sourceTree = "<group>"; }; … … 4158 4152 6540C79D1B82D99D000F6B79 /* RegisterAtOffsetList.h */, 4159 4153 623A37EB1B87A7BD00754209 /* RegisterMap.h */, 4160 0F6B1CBB1861246A00845D97 /* RegisterPreservationWrapperGenerator.cpp */,4161 0F6B1CBC1861246A00845D97 /* RegisterPreservationWrapperGenerator.h */,4162 4154 0FC3141418146D7000033232 /* RegisterSet.cpp */, 4163 4155 0FC314101814559100033232 /* RegisterSet.h */, … … 4950 4942 BCD202BF0E1706A7002C7E82 /* RegExpPrototype.cpp */, 4951 4943 BCD202C00E1706A7002C7E82 /* RegExpPrototype.h */, 4952 0F6B1CB81861244C00845D97 /* RegisterPreservationMode.h */,4953 4944 0FB7F39115ED8E3800F167B2 /* Reject.h */, 4954 4945 70B0A9D01A9B66200001306A /* RuntimeFlags.h */, … … 6746 6737 BC18C45D0E16F5CD00B34460 /* Register.h in Headers */, 6747 6738 969A072B0ED1CE6900F1F681 /* RegisterID.h in Headers */, 6748 0F6B1CBA1861244C00845D97 /* RegisterPreservationMode.h in Headers */,6749 0F6B1CBE1861246A00845D97 /* RegisterPreservationWrapperGenerator.h in Headers */,6750 6739 0FC314121814559100033232 /* RegisterSet.h in Headers */, 6751 6740 0F50AF3C193E8B3900674EE8 /* DFGStructureClobberState.h in Headers */, … … 7927 7916 14280843107EC0930013E7B2 /* RegExpObject.cpp in Sources */, 7928 7917 14280844107EC0930013E7B2 /* RegExpPrototype.cpp in Sources */, 7929 0F6B1CBD1861246A00845D97 /* RegisterPreservationWrapperGenerator.cpp in Sources */,7930 7918 0FC3141518146D7000033232 /* RegisterSet.cpp in Sources */, 7931 7919 A57D23ED1891B5540031C7FA /* RegularExpression.cpp in Sources */, -
trunk/Source/JavaScriptCore/bytecode/CallLinkInfo.h
r189884 r189967 74 74 75 75 CallLinkInfo() 76 : m_registerPreservationMode(static_cast<unsigned>(RegisterPreservationNotRequired)) 77 , m_hasSeenShouldRepatch(false) 76 : m_hasSeenShouldRepatch(false) 78 77 , m_hasSeenClosure(false) 79 78 , m_clearedByGC(false) … … 136 135 } 137 136 138 RegisterPreservationMode registerPreservationMode() const139 {140 return static_cast<RegisterPreservationMode>(m_registerPreservationMode);141 }142 143 137 bool isLinked() { return m_stub || m_callee; } 144 138 void unlink(VM&); … … 170 164 CodeLocationNearCall hotPathOther, unsigned calleeGPR) 171 165 { 172 m_registerPreservationMode = static_cast<unsigned>(RegisterPreservationNotRequired);173 166 m_callType = callType; 174 167 m_codeOrigin = codeOrigin; … … 347 340 RefPtr<PolymorphicCallStubRoutine> m_stub; 348 341 RefPtr<JITStubRoutine> m_slowStub; 349 unsigned m_registerPreservationMode : 1; // Real type is RegisterPreservationMode350 342 bool m_hasSeenShouldRepatch : 1; 351 343 bool m_hasSeenClosure : 1; -
trunk/Source/JavaScriptCore/ftl/FTLJITCode.cpp
r187488 r189967 76 76 } 77 77 78 JITCode::CodePtr JITCode::addressForCall( VM&, ExecutableBase*, ArityCheckMode arityCheck, RegisterPreservationMode)78 JITCode::CodePtr JITCode::addressForCall(ArityCheckMode arityCheck) 79 79 { 80 80 switch (arityCheck) { -
trunk/Source/JavaScriptCore/ftl/FTLJITCode.h
r189575 r189967 59 59 ~JITCode(); 60 60 61 CodePtr addressForCall( VM&, ExecutableBase*, ArityCheckMode, RegisterPreservationMode) override;61 CodePtr addressForCall(ArityCheckMode) override; 62 62 void* executableAddressAtOffset(size_t offset) override; 63 63 void* dataAddressAtOffset(size_t offset) override; -
trunk/Source/JavaScriptCore/ftl/FTLOSREntry.cpp
r188311 r189967 101 101 exec->setCodeBlock(entryCodeBlock); 102 102 103 void* result = entryCode->addressForCall( 104 vm, executable, ArityCheckNotRequired, 105 RegisterPreservationNotRequired).executableAddress(); 103 void* result = entryCode->addressForCall(ArityCheckNotRequired).executableAddress(); 106 104 if (Options::verboseOSR()) 107 105 dataLog(" Entry will succeed, going to address", RawPointer(result), "\n"); -
trunk/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp
r189961 r189967 41 41 #include "OperandsInlines.h" 42 42 #include "JSCInlines.h" 43 #include "RegisterPreservationWrapperGenerator.h"44 43 45 44 namespace JSC { namespace FTL { … … 380 379 // restoration thunk would restore them from. 381 380 382 ptrdiff_t offset = registerPreservationOffset();383 RegisterSet toSave = registersToPreserve();384 385 381 // Before we start messing with the frame, we need to set aside any registers that the 386 382 // FTL code was preserving. … … 398 394 // contain some extra stuff. 399 395 // 400 // First we compute the padded stack space:396 // We compute the padded stack space: 401 397 // 402 398 // paddedStackSpace = roundUp(codeBlock->numParameters - regT2 + 1) 403 399 // 404 // The stack will have regT2 + CallFrameHeaderSize stuff, but above it there will be 405 // paddedStackSpace gunk used by the arity check fail restoration thunk. When that happens 406 // we want to make the stack look like this, from higher addresses down: 400 // The stack will have regT2 + CallFrameHeaderSize stuff. 401 // We want to make the stack look like this, from higher addresses down: 407 402 // 408 // - register preservation return PC409 // - preserved registers410 // - arity check fail return PC411 403 // - argument padding 412 404 // - actual arguments 413 405 // - call frame header 414 //415 // So that the actual call frame header appears to return to the arity check fail return416 // PC, and that then returns to the register preservation thunk. The arity check thunk that417 // we return to will have the padding size encoded into it. It will then know to return418 // into the register preservation thunk, which uses the argument count to figure out where419 // registers are preserved.420 406 421 407 // This code assumes that we're dealing with FunctionCode. … … 437 423 // First set up SP so that our data doesn't get clobbered by signals. 438 424 unsigned conservativeStackDelta = 439 registerPreservationOffset() +440 425 (exit.m_values.numberOfLocals() + baselineCodeBlock->calleeSaveSpaceAsVirtualRegisters()) * sizeof(Register) + 441 426 maxFrameExtentForSlowPathCall; … … 446 431 MacroAssembler::framePointerRegister, MacroAssembler::stackPointerRegister); 447 432 jit.checkStackPointerAlignment(); 448 449 jit.subPtr( 450 MacroAssembler::TrustedImm32(registerPreservationOffset()), 451 MacroAssembler::framePointerRegister); 452 453 // Copy the old frame data into its new location. 454 jit.add32(MacroAssembler::TrustedImm32(JSStack::CallFrameHeaderSize), GPRInfo::regT2); 455 jit.move(MacroAssembler::framePointerRegister, GPRInfo::regT1); 456 MacroAssembler::Label loop = jit.label(); 457 jit.sub32(MacroAssembler::TrustedImm32(1), GPRInfo::regT2); 458 jit.load64(MacroAssembler::Address(GPRInfo::regT1, offset), GPRInfo::regT0); 459 jit.store64(GPRInfo::regT0, GPRInfo::regT1); 460 jit.addPtr(MacroAssembler::TrustedImm32(sizeof(Register)), GPRInfo::regT1); 461 jit.branchTest32(MacroAssembler::NonZero, GPRInfo::regT2).linkTo(loop, &jit); 462 433 434 RegisterSet allFTLCalleeSaves = RegisterSet::ftlCalleeSaveRegisters(); 463 435 RegisterAtOffsetList* baselineCalleeSaves = baselineCodeBlock->calleeSaveRegisters(); 464 436 465 437 for (Reg reg = Reg::first(); reg <= Reg::last(); reg = reg.next()) { 466 if (! toSave.get(reg) || !reg.isGPR())438 if (!allFTLCalleeSaves.get(reg) || !reg.isGPR()) 467 439 continue; 468 440 unsigned unwindIndex = codeBlock->calleeSaveRegisters()->indexOf(reg); -
trunk/Source/JavaScriptCore/jit/JITCode.cpp
r187488 r189967 30 30 #include "JSCInlines.h" 31 31 #include "ProtoCallFrame.h" 32 #include "RegisterPreservationWrapperGenerator.h"33 32 #include <wtf/PrintStream.h> 34 33 … … 78 77 entryAddress = executableAddress(); 79 78 } else 80 entryAddress = addressForCall( *vm, function->executable(), MustCheckArity, RegisterPreservationNotRequired).executableAddress();79 entryAddress = addressForCall(MustCheckArity).executableAddress(); 81 80 JSValue result = JSValue::decode(vmEntryToJavaScript(entryAddress, vm, protoCallFrame)); 82 81 return vm->exception() ? jsNull() : result; … … 180 179 } 181 180 182 DirectJITCode::RegisterPreservationWrappers* DirectJITCode::ensureWrappers() 183 { 184 if (!m_wrappers) 185 m_wrappers = std::make_unique<RegisterPreservationWrappers>(); 186 return m_wrappers.get(); 187 } 188 189 JITCode::CodePtr DirectJITCode::addressForCall( 190 VM& vm, ExecutableBase* executable, ArityCheckMode arity, 191 RegisterPreservationMode registers) 181 JITCode::CodePtr DirectJITCode::addressForCall(ArityCheckMode arity) 192 182 { 193 183 switch (arity) { 194 184 case ArityCheckNotRequired: 195 switch (registers) { 196 case RegisterPreservationNotRequired: 197 RELEASE_ASSERT(m_ref); 198 return m_ref.code(); 199 case MustPreserveRegisters: { 200 #if ENABLE(JIT) 201 RegisterPreservationWrappers* wrappers = ensureWrappers(); 202 if (!wrappers->withoutArityCheck) 203 wrappers->withoutArityCheck = generateRegisterPreservationWrapper(vm, executable, m_ref.code()); 204 return wrappers->withoutArityCheck.code(); 205 #else 206 UNUSED_PARAM(vm); 207 UNUSED_PARAM(executable); 208 RELEASE_ASSERT_NOT_REACHED(); 209 #endif 210 } } 185 RELEASE_ASSERT(m_ref); 186 return m_ref.code(); 211 187 case MustCheckArity: 212 switch (registers) { 213 case RegisterPreservationNotRequired: 214 RELEASE_ASSERT(m_withArityCheck); 215 return m_withArityCheck; 216 case MustPreserveRegisters: { 217 #if ENABLE(JIT) 218 RegisterPreservationWrappers* wrappers = ensureWrappers(); 219 if (!wrappers->withArityCheck) 220 wrappers->withArityCheck = generateRegisterPreservationWrapper(vm, executable, m_withArityCheck); 221 return wrappers->withArityCheck.code(); 222 #else 223 RELEASE_ASSERT_NOT_REACHED(); 224 #endif 225 } } 188 RELEASE_ASSERT(m_withArityCheck); 189 return m_withArityCheck; 226 190 } 227 191 RELEASE_ASSERT_NOT_REACHED(); … … 249 213 } 250 214 251 JITCode::CodePtr NativeJITCode::addressForCall( 252 VM&, ExecutableBase*, ArityCheckMode, RegisterPreservationMode) 215 JITCode::CodePtr NativeJITCode::addressForCall(ArityCheckMode) 253 216 { 254 217 RELEASE_ASSERT(!!m_ref); -
trunk/Source/JavaScriptCore/jit/JITCode.h
r189889 r189967 33 33 #include "JSCJSValue.h" 34 34 #include "MacroAssemblerCodeRef.h" 35 #include "RegisterPreservationMode.h"36 35 37 36 namespace JSC { … … 196 195 } 197 196 198 virtual CodePtr addressForCall( VM&, ExecutableBase*, ArityCheckMode, RegisterPreservationMode) = 0;197 virtual CodePtr addressForCall(ArityCheckMode) = 0; 199 198 virtual void* executableAddressAtOffset(size_t offset) = 0; 200 199 void* executableAddress() { return executableAddressAtOffset(0); } … … 247 246 void initializeCodeRef(CodeRef, CodePtr withArityCheck); 248 247 249 virtual CodePtr addressForCall( VM&, ExecutableBase*, ArityCheckMode, RegisterPreservationMode) override;248 virtual CodePtr addressForCall(ArityCheckMode) override; 250 249 251 250 private: 252 struct RegisterPreservationWrappers {253 CodeRef withoutArityCheck;254 CodeRef withArityCheck;255 };256 257 RegisterPreservationWrappers* ensureWrappers();258 259 251 CodePtr m_withArityCheck; 260 261 std::unique_ptr<RegisterPreservationWrappers> m_wrappers;262 252 }; 263 253 … … 270 260 void initializeCodeRef(CodeRef); 271 261 272 virtual CodePtr addressForCall( VM&, ExecutableBase*, ArityCheckMode, RegisterPreservationMode) override;262 virtual CodePtr addressForCall(ArityCheckMode) override; 273 263 }; 274 264 -
trunk/Source/JavaScriptCore/jit/JITOperations.cpp
r189920 r189967 768 768 CodeBlock* codeBlock = 0; 769 769 if (executable->isHostFunction()) { 770 codePtr = executable->entrypointFor( *vm, kind, MustCheckArity, callLinkInfo->registerPreservationMode());770 codePtr = executable->entrypointFor(kind, MustCheckArity); 771 771 #if ENABLE(WEBASSEMBLY) 772 772 } else if (executable->isWebAssemblyExecutable()) { … … 780 780 else 781 781 arity = ArityCheckNotRequired; 782 codePtr = webAssemblyExecutable->entrypointFor( *vm, kind, arity, callLinkInfo->registerPreservationMode());782 codePtr = webAssemblyExecutable->entrypointFor(kind, arity); 783 783 #endif 784 784 } else { … … 805 805 else 806 806 arity = ArityCheckNotRequired; 807 codePtr = functionExecutable->entrypointFor( *vm, kind, arity, callLinkInfo->registerPreservationMode());807 codePtr = functionExecutable->entrypointFor(kind, arity); 808 808 } 809 809 if (!callLinkInfo->seenOnce()) … … 868 868 } 869 869 return encodeResult(executable->entrypointFor( 870 *vm, kind, MustCheckArity, callLinkInfo->registerPreservationMode()).executableAddress(),870 kind, MustCheckArity).executableAddress(), 871 871 reinterpret_cast<void*>(callLinkInfo->callMode() == CallMode::Tail ? ReuseTheFrame : KeepTheFrame)); 872 872 } -
trunk/Source/JavaScriptCore/jit/Repatch.cpp
r189884 r189967 796 796 ASSERT(variant.executable()->hasJITCodeForCall()); 797 797 MacroAssemblerCodePtr codePtr = 798 variant.executable()->generatedJITCodeForCall()->addressForCall( 799 *vm, variant.executable(), ArityCheckNotRequired, callLinkInfo.registerPreservationMode()); 798 variant.executable()->generatedJITCodeForCall()->addressForCall(ArityCheckNotRequired); 800 799 801 800 if (fastCounts) { -
trunk/Source/JavaScriptCore/jit/ThunkGenerators.cpp
r189884 r189967 203 203 CCallHelpers::Address( 204 204 GPRInfo::regT4, ExecutableBase::offsetOfJITCodeWithArityCheckFor( 205 callLinkInfo.specializationKind() , callLinkInfo.registerPreservationMode())),205 callLinkInfo.specializationKind())), 206 206 GPRInfo::regT4); 207 207 slowCase.append(jit.branchTestPtr(CCallHelpers::Zero, GPRInfo::regT4)); -
trunk/Source/JavaScriptCore/jit/ThunkGenerators.h
r189884 r189967 28 28 29 29 #include "CodeSpecializationKind.h" 30 #include "RegisterPreservationMode.h"31 30 #include "ThunkGenerator.h" 32 31 … … 39 38 MacroAssemblerCodeRef throwExceptionFromCallSlowPathGenerator(VM*); 40 39 41 MacroAssemblerCodeRef linkCallThunk(VM*, CallLinkInfo&, CodeSpecializationKind , RegisterPreservationMode);40 MacroAssemblerCodeRef linkCallThunk(VM*, CallLinkInfo&, CodeSpecializationKind); 42 41 MacroAssemblerCodeRef linkCallThunkGenerator(VM*); 43 42 MacroAssemblerCodeRef linkPolymorphicCallThunkGenerator(VM*); -
trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp
r189920 r189967 358 358 LLINT_RETURN_TWO(codeBlock->jitCode()->executableAddress(), 0); 359 359 ASSERT(kind == ArityCheck); 360 LLINT_RETURN_TWO(codeBlock->jitCode()->addressForCall( 361 *codeBlock->vm(), codeBlock->ownerExecutable(), MustCheckArity, 362 RegisterPreservationNotRequired).executableAddress(), 0); 360 LLINT_RETURN_TWO(codeBlock->jitCode()->addressForCall(MustCheckArity).executableAddress(), 0); 363 361 } 364 362 #else // ENABLE(JIT) … … 1143 1141 1144 1142 if (executable->isHostFunction()) { 1145 codePtr = executable->entrypointFor( vm, kind, MustCheckArity, RegisterPreservationNotRequired);1143 codePtr = executable->entrypointFor(kind, MustCheckArity); 1146 1144 } else if (!isWebAssemblyExecutable) { 1147 1145 FunctionExecutable* functionExecutable = static_cast<FunctionExecutable*>(executable); … … 1160 1158 else 1161 1159 arity = ArityCheckNotRequired; 1162 codePtr = functionExecutable->entrypointFor( vm, kind, arity, RegisterPreservationNotRequired);1160 codePtr = functionExecutable->entrypointFor(kind, arity); 1163 1161 } else { 1164 1162 #if ENABLE(WEBASSEMBLY) … … 1172 1170 else 1173 1171 arity = ArityCheckNotRequired; 1174 codePtr = webAssemblyExecutable->entrypointFor( vm, kind, arity, RegisterPreservationNotRequired);1172 codePtr = webAssemblyExecutable->entrypointFor(kind, arity); 1175 1173 #endif 1176 1174 } -
trunk/Source/JavaScriptCore/runtime/Executable.cpp
r189889 r189967 58 58 m_jitCodeForCallWithArityCheck = MacroAssemblerCodePtr(); 59 59 m_jitCodeForConstructWithArityCheck = MacroAssemblerCodePtr(); 60 m_jitCodeForCallWithArityCheckAndPreserveRegs = MacroAssemblerCodePtr();61 m_jitCodeForConstructWithArityCheckAndPreserveRegs = MacroAssemblerCodePtr();62 60 #endif 63 61 m_numParametersForCall = NUM_PARAMETERS_NOT_COMPILED; … … 184 182 m_jitCodeForCall = genericCodeBlock ? genericCodeBlock->jitCode() : nullptr; 185 183 m_jitCodeForCallWithArityCheck = MacroAssemblerCodePtr(); 186 m_jitCodeForCallWithArityCheckAndPreserveRegs = MacroAssemblerCodePtr();187 184 m_numParametersForCall = genericCodeBlock ? genericCodeBlock->numParameters() : NUM_PARAMETERS_NOT_COMPILED; 188 185 break; … … 190 187 m_jitCodeForConstruct = genericCodeBlock ? genericCodeBlock->jitCode() : nullptr; 191 188 m_jitCodeForConstructWithArityCheck = MacroAssemblerCodePtr(); 192 m_jitCodeForConstructWithArityCheckAndPreserveRegs = MacroAssemblerCodePtr();193 189 m_numParametersForConstruct = genericCodeBlock ? genericCodeBlock->numParameters() : NUM_PARAMETERS_NOT_COMPILED; 194 190 break; … … 746 742 m_jitCodeForCall = codeBlock->jitCode(); 747 743 m_jitCodeForCallWithArityCheck = MacroAssemblerCodePtr(); 748 m_jitCodeForCallWithArityCheckAndPreserveRegs = MacroAssemblerCodePtr();749 744 m_numParametersForCall = codeBlock->numParameters(); 750 745 -
trunk/Source/JavaScriptCore/runtime/Executable.h
r189889 r189967 38 38 #include "JITCode.h" 39 39 #include "JSGlobalObject.h" 40 #include "RegisterPreservationMode.h"41 40 #include "SamplingTool.h" 42 41 #include "SourceCode.h" … … 164 163 } 165 164 166 MacroAssemblerCodePtr entrypointFor( 167 VM& vm, CodeSpecializationKind kind, ArityCheckMode arity, RegisterPreservationMode registers) 165 MacroAssemblerCodePtr entrypointFor(CodeSpecializationKind kind, ArityCheckMode arity) 168 166 { 169 167 // Check if we have a cached result. We only have it for arity check because we use the … … 173 171 switch (kind) { 174 172 case CodeForCall: 175 switch (registers) { 176 case RegisterPreservationNotRequired: 177 if (MacroAssemblerCodePtr result = m_jitCodeForCallWithArityCheck) 178 return result; 179 break; 180 case MustPreserveRegisters: 181 if (MacroAssemblerCodePtr result = m_jitCodeForCallWithArityCheckAndPreserveRegs) 182 return result; 183 break; 184 } 173 if (MacroAssemblerCodePtr result = m_jitCodeForCallWithArityCheck) 174 return result; 185 175 break; 186 176 case CodeForConstruct: 187 switch (registers) { 188 case RegisterPreservationNotRequired: 189 if (MacroAssemblerCodePtr result = m_jitCodeForConstructWithArityCheck) 190 return result; 191 break; 192 case MustPreserveRegisters: 193 if (MacroAssemblerCodePtr result = m_jitCodeForConstructWithArityCheckAndPreserveRegs) 194 return result; 195 break; 196 } 177 if (MacroAssemblerCodePtr result = m_jitCodeForConstructWithArityCheck) 178 return result; 197 179 break; 198 180 } 199 181 } 200 182 MacroAssemblerCodePtr result = 201 generatedJITCodeFor(kind)->addressForCall( vm, this, arity, registers);183 generatedJITCodeFor(kind)->addressForCall(arity); 202 184 if (arity == MustCheckArity) { 203 185 // Cache the result; this is necessary for the JIT's virtual call optimizations. 204 186 switch (kind) { 205 187 case CodeForCall: 206 switch (registers) { 207 case RegisterPreservationNotRequired: 208 m_jitCodeForCallWithArityCheck = result; 209 break; 210 case MustPreserveRegisters: 211 m_jitCodeForCallWithArityCheckAndPreserveRegs = result; 212 break; 213 } 188 m_jitCodeForCallWithArityCheck = result; 214 189 break; 215 190 case CodeForConstruct: 216 switch (registers) { 217 case RegisterPreservationNotRequired: 218 m_jitCodeForConstructWithArityCheck = result; 219 break; 220 case MustPreserveRegisters: 221 m_jitCodeForConstructWithArityCheckAndPreserveRegs = result; 222 break; 223 } 191 m_jitCodeForConstructWithArityCheck = result; 224 192 break; 225 193 } … … 229 197 230 198 static ptrdiff_t offsetOfJITCodeWithArityCheckFor( 231 CodeSpecializationKind kind , RegisterPreservationMode registers)199 CodeSpecializationKind kind) 232 200 { 233 201 switch (kind) { 234 202 case CodeForCall: 235 switch (registers) { 236 case RegisterPreservationNotRequired: 237 return OBJECT_OFFSETOF(ExecutableBase, m_jitCodeForCallWithArityCheck); 238 case MustPreserveRegisters: 239 return OBJECT_OFFSETOF(ExecutableBase, m_jitCodeForCallWithArityCheckAndPreserveRegs); 240 } 203 return OBJECT_OFFSETOF(ExecutableBase, m_jitCodeForCallWithArityCheck); 241 204 case CodeForConstruct: 242 switch (registers) { 243 case RegisterPreservationNotRequired: 244 return OBJECT_OFFSETOF(ExecutableBase, m_jitCodeForConstructWithArityCheck); 245 case MustPreserveRegisters: 246 return OBJECT_OFFSETOF(ExecutableBase, m_jitCodeForConstructWithArityCheckAndPreserveRegs); 247 } 205 return OBJECT_OFFSETOF(ExecutableBase, m_jitCodeForConstructWithArityCheck); 248 206 } 249 207 RELEASE_ASSERT_NOT_REACHED(); … … 294 252 MacroAssemblerCodePtr m_jitCodeForCallWithArityCheck; 295 253 MacroAssemblerCodePtr m_jitCodeForConstructWithArityCheck; 296 MacroAssemblerCodePtr m_jitCodeForCallWithArityCheckAndPreserveRegs;297 MacroAssemblerCodePtr m_jitCodeForConstructWithArityCheckAndPreserveRegs;298 254 }; 299 255
Note:
See TracChangeset
for help on using the changeset viewer.