Changeset 293203 in webkit
- Timestamp:
- Apr 21, 2022, 5:51:12 PM (4 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 2 deleted
- 12 edited
-
CMakeLists.txt (modified) (2 diffs)
-
ChangeLog (modified) (1 diff)
-
JavaScriptCore.xcodeproj/project.pbxproj (modified) (5 diffs)
-
Sources.txt (modified) (1 diff)
-
ftl/FTLLowerDFGToB3.cpp (modified) (1 diff)
-
jit/AssemblyHelpers.cpp (modified) (1 diff)
-
jit/AssemblyHelpers.h (modified) (3 diffs)
-
jit/RegisterSet.h (modified) (1 diff)
-
jit/ScratchRegisterAllocator.cpp (modified) (6 diffs)
-
jit/ScratchRegisterAllocator.h (modified) (2 diffs)
-
jit/TempRegisterSet.cpp (deleted)
-
jit/TempRegisterSet.h (deleted)
-
jit/ThunkGenerators.cpp (modified) (7 diffs)
-
wasm/js/WasmToJS.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/CMakeLists.txt
r293176 r293203 868 868 jit/RegisterMap.h 869 869 jit/RegisterSet.h 870 jit/ScratchRegisterAllocator.h 870 871 jit/Snippet.h 871 872 jit/SnippetParams.h … … 874 875 jit/SpillRegistersMode.h 875 876 jit/TagRegistersMode.h 876 jit/TempRegisterSet.h877 877 jit/ThunkGenerator.h 878 878 -
trunk/Source/JavaScriptCore/ChangeLog
r293176 r293203 1 2022-04-21 Yusuke Suzuki <ysuzuki@apple.com> 2 3 [JSC] Remove TempRegisterSet 4 https://bugs.webkit.org/show_bug.cgi?id=239578 5 6 Reviewed by Mark Lam. 7 8 We can always use RegisterSet. TempRegisterSet can save several bytes, but we have no code using TempRegisterSet in 9 heap-allocated classes. So, this does not make sense anymore. Instead of TempRegisterSet, we will consistently use 10 RegisterSet to pass register info and ScratchRegisterAllocator to manage allocation of temp / scratch registers. 11 12 We also remove the copyCalleeSavesToEntryFrameCalleeSavesBuffer function which takes no scratch register. It was 13 using TempRegisterSet to allocate a scratch register, but the caller of this function was making assumptions on how 14 TempRegisterSet will allocate that scratch. This is very fragile and dangerous. We should explicitly pass a scratch 15 register instead in that case. 16 17 * CMakeLists.txt: 18 * JavaScriptCore.xcodeproj/project.pbxproj: 19 * Sources.txt: 20 * ftl/FTLLowerDFGToB3.cpp: 21 (JSC::FTL::DFG::LowerDFGToB3::lower): 22 * jit/AssemblyHelpers.cpp: 23 (JSC::AssemblyHelpers::copyLLIntBaselineCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer): 24 * jit/AssemblyHelpers.h: 25 (JSC::AssemblyHelpers::copyLLIntBaselineCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer): Deleted. 26 * jit/RegisterSet.h: 27 * jit/ScratchRegisterAllocator.cpp: 28 (JSC::ScratchRegisterAllocator::lock): 29 (JSC::ScratchRegisterAllocator::allocateScratch): 30 (JSC::ScratchRegisterAllocator::preserveReusedRegistersByPushing): 31 (JSC::ScratchRegisterAllocator::restoreReusedRegistersByPopping): 32 * jit/ScratchRegisterAllocator.h: 33 * jit/TempRegisterSet.cpp: Removed. 34 * jit/TempRegisterSet.h: Removed. 35 * jit/ThunkGenerators.cpp: 36 (JSC::handleExceptionGenerator): 37 (JSC::handleExceptionWithCallFrameRollbackGenerator): 38 (JSC::throwExceptionFromCallSlowPathGenerator): 39 (JSC::nativeForGenerator): 40 (JSC::boundFunctionCallGenerator): 41 (JSC::remoteFunctionCallGenerator): 42 * wasm/js/WasmToJS.cpp: 43 (JSC::Wasm::wasmToJS): 44 1 45 2022-04-21 Commit Queue <commit-queue@webkit.org> 2 46 -
trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r293176 r293203 187 187 0F24E54417EA9F5900ABB217 /* GPRInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F24E53F17EA9F5900ABB217 /* GPRInfo.h */; settings = {ATTRIBUTES = (Private, ); }; }; 188 188 0F24E54D17EE274900ABB217 /* JITOperations.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F24E54617EE274900ABB217 /* JITOperations.h */; settings = {ATTRIBUTES = (Private, ); }; }; 189 0F24E54F17EE274900ABB217 /* TempRegisterSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F24E54817EE274900ABB217 /* TempRegisterSet.h */; settings = {ATTRIBUTES = (Private, ); }; };190 189 0F24E55217EE274900ABB217 /* ScratchRegisterAllocator.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F24E54B17EE274900ABB217 /* ScratchRegisterAllocator.h */; settings = {ATTRIBUTES = (Private, ); }; }; 191 190 0F24E55617F0B71C00ABB217 /* InlineCallFrameSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F24E55417F0B71C00ABB217 /* InlineCallFrameSet.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 2603 2602 0F24E54517EE274900ABB217 /* JITOperations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JITOperations.cpp; sourceTree = "<group>"; }; 2604 2603 0F24E54617EE274900ABB217 /* JITOperations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JITOperations.h; sourceTree = "<group>"; }; 2605 0F24E54817EE274900ABB217 /* TempRegisterSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TempRegisterSet.h; sourceTree = "<group>"; };2606 2604 0F24E54B17EE274900ABB217 /* ScratchRegisterAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScratchRegisterAllocator.h; sourceTree = "<group>"; }; 2607 2605 0F24E55317F0B71C00ABB217 /* InlineCallFrameSet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InlineCallFrameSet.cpp; sourceTree = "<group>"; }; … … 3192 3190 0FC20CB818556A3500C9E954 /* DFGSSALoweringPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGSSALoweringPhase.h; path = dfg/DFGSSALoweringPhase.h; sourceTree = "<group>"; }; 3193 3191 0FC314101814559100033232 /* RegisterSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterSet.h; sourceTree = "<group>"; }; 3194 0FC314111814559100033232 /* TempRegisterSet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TempRegisterSet.cpp; sourceTree = "<group>"; };3195 3192 0FC3141418146D7000033232 /* RegisterSet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegisterSet.cpp; sourceTree = "<group>"; }; 3196 3193 0FC3CCF519ADA410006AC72A /* DFGBlockMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGBlockMap.h; path = dfg/DFGBlockMap.h; sourceTree = "<group>"; }; … … 6673 6670 DC7997811CDE9F9E004D4A09 /* TagRegistersMode.cpp */, 6674 6671 DC7997821CDE9F9E004D4A09 /* TagRegistersMode.h */, 6675 0FC314111814559100033232 /* TempRegisterSet.cpp */,6676 0F24E54817EE274900ABB217 /* TempRegisterSet.h */,6677 6672 0F572D4D16879FDB00E57FBD /* ThunkGenerator.h */, 6678 6673 A7386552118697B400540279 /* ThunkGenerators.cpp */, … … 11163 11158 E30E8A5726DE2E4800DA4915 /* TemporalTimeZoneConstructor.h in Headers */, 11164 11159 E30E8A5426DE2E4800DA4915 /* TemporalTimeZonePrototype.h in Headers */, 11165 0F24E54F17EE274900ABB217 /* TempRegisterSet.h in Headers */,11166 11160 0F44A7B420BF68D90022B171 /* TerminatedCodeOrigin.h in Headers */, 11167 11161 0FA2C17C17D7CF84009D015F /* TestRunnerUtils.h in Headers */, -
trunk/Source/JavaScriptCore/Sources.txt
r293176 r293203 675 675 jit/SlowPathCall.cpp 676 676 jit/TagRegistersMode.cpp 677 jit/TempRegisterSet.cpp678 677 jit/ThunkGenerators.cpp 679 678 -
trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp
r292929 r293203 313 313 MacroAssembler::TrustedImm32(callSiteIndex.bits()), 314 314 CCallHelpers::tagFor(VirtualRegister(CallFrameSlot::argumentCountIncludingThis))); 315 jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm->topEntryFrame );315 jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm->topEntryFrame, GPRInfo::argumentGPR0); 316 316 317 317 jit.move(CCallHelpers::TrustedImmPtr(jit.codeBlock()), GPRInfo::argumentGPR0); -
trunk/Source/JavaScriptCore/jit/AssemblyHelpers.cpp
r293176 r293203 1297 1297 } 1298 1298 1299 void AssemblyHelpers::copyLLIntBaselineCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer(EntryFrame*& topEntryFrame, const TempRegisterSet& usedRegisters)1299 void AssemblyHelpers::copyLLIntBaselineCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer(EntryFrame*& topEntryFrame, const RegisterSet& usedRegisters) 1300 1300 { 1301 1301 #if NUMBER_OF_CALLEE_SAVES_REGISTERS > 0 1302 1302 // Copy saved calleeSaves on stack or unsaved calleeSaves in register to vm calleeSave buffer 1303 GPRReg destBufferGPR = usedRegisters.getFreeGPR(0); 1304 GPRReg temp1 = usedRegisters.getFreeGPR(1); 1305 FPRReg fpTemp1 = usedRegisters.getFreeFPR(0); 1306 GPRReg temp2 = usedRegisters.getFreeGPR(2); 1307 FPRReg fpTemp2 = usedRegisters.getFreeFPR(1); 1303 ScratchRegisterAllocator allocator(usedRegisters); 1304 GPRReg destBufferGPR = allocator.allocateScratchGPR(); 1305 GPRReg temp1 = allocator.allocateScratchGPR(); 1306 FPRReg fpTemp1 = allocator.allocateScratchFPR(); 1307 GPRReg temp2 = allocator.allocateScratchGPR(); 1308 FPRReg fpTemp2 = allocator.allocateScratchFPR(); 1309 RELEASE_ASSERT(!allocator.didReuseRegisters()); 1308 1310 1309 1311 loadPtr(&topEntryFrame, destBufferGPR); -
trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h
r293176 r293203 41 41 #include "RegisterAtOffsetList.h" 42 42 #include "RegisterSet.h" 43 #include "ScratchRegisterAllocator.h" 43 44 #include "StackAlignment.h" 44 45 #include "TagRegistersMode.h" … … 394 395 } 395 396 396 void copyCalleeSavesToEntryFrameCalleeSavesBuffer(EntryFrame*& topEntryFrame)397 {398 #if NUMBER_OF_CALLEE_SAVES_REGISTERS > 0399 const TempRegisterSet& usedRegisters = { RegisterSet::stubUnavailableRegisters() };400 GPRReg temp1 = usedRegisters.getFreeGPR(0);401 copyCalleeSavesToEntryFrameCalleeSavesBuffer(topEntryFrame, temp1);402 #else403 UNUSED_PARAM(topEntryFrame);404 UNUSED_PARAM(topEntryFrame);405 #endif406 }407 408 397 void copyCalleeSavesToEntryFrameCalleeSavesBuffer(GPRReg topEntryFrame) 409 398 { … … 419 408 void restoreCalleeSavesFromVMEntryFrameCalleeSavesBufferImpl(GPRReg entryFrame, const RegisterSet& skipList); 420 409 421 void copyLLIntBaselineCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer(EntryFrame*&, const TempRegisterSet& usedRegisters = { RegisterSet::stubUnavailableRegisters() });410 void copyLLIntBaselineCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer(EntryFrame*&, const RegisterSet& usedRegisters = RegisterSet::stubUnavailableRegisters()); 422 411 423 412 void emitMaterializeTagCheckRegisters() -
trunk/Source/JavaScriptCore/jit/RegisterSet.h
r293176 r293203 31 31 #include "MacroAssembler.h" 32 32 #include "Reg.h" 33 #include "TempRegisterSet.h"34 33 #include <wtf/Bitmap.h> 35 34 -
trunk/Source/JavaScriptCore/jit/ScratchRegisterAllocator.cpp
r293176 r293203 47 47 if (reg == InvalidGPRReg) 48 48 return; 49 unsigned index = GPRInfo::toIndex(reg); 50 if (index == GPRInfo::InvalidIndex) 51 return; 52 m_lockedRegisters.setGPRByIndex(index); 49 m_lockedRegisters.set(reg); 53 50 } 54 51 … … 57 54 if (reg == InvalidFPRReg) 58 55 return; 59 unsigned index = FPRInfo::toIndex(reg); 60 if (index == FPRInfo::InvalidIndex) 61 return; 62 m_lockedRegisters.setFPRByIndex(index); 56 m_lockedRegisters.set(reg); 63 57 } 64 58 … … 74 68 // First try to allocate a register that is totally free. 75 69 for (unsigned i = 0; i < BankInfo::numberOfRegisters; ++i) { 76 typename BankInfo::RegisterTypereg = BankInfo::toRegister(i);70 auto reg = BankInfo::toRegister(i); 77 71 if (!m_lockedRegisters.get(reg) 78 72 && !m_usedRegisters.get(reg) … … 86 80 // locked or used for scratch. 87 81 for (unsigned i = 0; i < BankInfo::numberOfRegisters; ++i) { 88 typename BankInfo::RegisterTypereg = BankInfo::toRegister(i);82 auto reg = BankInfo::toRegister(i); 89 83 if (!m_lockedRegisters.get(reg) && !m_scratchRegisters.get(reg)) { 90 84 m_scratchRegisters.set(reg); … … 111 105 for (unsigned i = 0; i < FPRInfo::numberOfRegisters; ++i) { 112 106 FPRReg reg = FPRInfo::toRegister(i); 113 if (m_scratchRegisters.getFPRByIndex(i) && m_usedRegisters.get(reg)) 107 ASSERT(reg != InvalidFPRReg); 108 if (m_scratchRegisters.get(reg) && m_usedRegisters.get(reg)) 114 109 registersToSpill.set(reg); 115 110 } 116 111 for (unsigned i = 0; i < GPRInfo::numberOfRegisters; ++i) { 117 112 GPRReg reg = GPRInfo::toRegister(i); 118 if (m_scratchRegisters.getGPRByIndex(i) && m_usedRegisters.get(reg)) 113 ASSERT(reg != InvalidGPRReg); 114 if (m_scratchRegisters.get(reg) && m_usedRegisters.get(reg)) 119 115 registersToSpill.set(reg); 120 116 } … … 135 131 for (unsigned i = GPRInfo::numberOfRegisters; i--;) { 136 132 GPRReg reg = GPRInfo::toRegister(i); 137 if (m_scratchRegisters.getGPRByIndex(i) && m_usedRegisters.get(reg)) 133 ASSERT(reg != InvalidGPRReg); 134 if (m_scratchRegisters.get(reg) && m_usedRegisters.get(reg)) 138 135 registersToFill.set(reg); 139 136 } 140 137 for (unsigned i = FPRInfo::numberOfRegisters; i--;) { 141 138 FPRReg reg = FPRInfo::toRegister(i); 142 if (m_scratchRegisters.getFPRByIndex(i) && m_usedRegisters.get(reg)) 139 ASSERT(reg != InvalidFPRReg); 140 if (m_scratchRegisters.get(reg) && m_usedRegisters.get(reg)) 143 141 registersToFill.set(reg); 144 142 } -
trunk/Source/JavaScriptCore/jit/ScratchRegisterAllocator.h
r293176 r293203 29 29 30 30 #include "RegisterSet.h" 31 #include "TempRegisterSet.h"32 31 33 32 namespace JSC { … … 97 96 private: 98 97 RegisterSet m_usedRegisters; 99 TempRegisterSet m_lockedRegisters;100 TempRegisterSet m_scratchRegisters;98 RegisterSet m_lockedRegisters; 99 RegisterSet m_scratchRegisters; 101 100 unsigned m_numberOfReusedRegisters; 102 101 }; -
trunk/Source/JavaScriptCore/jit/ThunkGenerators.cpp
r293041 r293203 47 47 CCallHelpers jit; 48 48 49 jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame );49 jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame, GPRInfo::argumentGPR0); 50 50 51 51 jit.move(CCallHelpers::TrustedImmPtr(&vm), GPRInfo::argumentGPR0); … … 63 63 CCallHelpers jit; 64 64 65 jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame );65 jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame, GPRInfo::argumentGPR0); 66 66 67 67 jit.move(CCallHelpers::TrustedImmPtr(&vm), GPRInfo::argumentGPR0); … … 154 154 jit.preserveReturnAddressAfterCall(GPRInfo::nonPreservedNonReturnGPR); 155 155 156 jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame );156 jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame, GPRInfo::argumentGPR0); 157 157 158 158 jit.setupArguments<decltype(operationLookupExceptionHandler)>(CCallHelpers::TrustedImmPtr(&vm)); … … 466 466 exceptionHandler.link(&jit); 467 467 468 jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame );468 jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame, GPRInfo::argumentGPR0); 469 469 jit.storePtr(JSInterfaceJIT::callFrameRegister, &vm.topCallFrame); 470 470 #if OS(WINDOWS) … … 1340 1340 1341 1341 // Throw Stack Overflow exception 1342 jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame );1342 jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame, GPRInfo::regT3); 1343 1343 jit.loadPtr(CCallHelpers::Address(GPRInfo::regT0, JSBoundFunction::offsetOfScopeChain()), GPRInfo::regT3); 1344 1344 jit.setupArguments<decltype(operationThrowStackOverflowErrorFromThunk)>(GPRInfo::regT3); … … 1469 1469 1470 1470 // Throw Stack Overflow exception 1471 jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame );1471 jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame, GPRInfo::regT3); 1472 1472 jit.loadPtr(CCallHelpers::Address(GPRInfo::regT0, JSBoundFunction::offsetOfScopeChain()), GPRInfo::regT3); 1473 1473 jit.setupArguments<decltype(operationThrowStackOverflowErrorFromThunk)>(GPRInfo::regT3); … … 1617 1617 1618 1618 exceptionChecks.link(&jit); 1619 jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame );1619 jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame, GPRInfo::argumentGPR0); 1620 1620 jit.setupArguments<decltype(operationLookupExceptionHandler)>(CCallHelpers::TrustedImmPtr(&vm)); 1621 1621 jit.prepareCallOperation(vm); -
trunk/Source/JavaScriptCore/wasm/js/WasmToJS.cpp
r292773 r293203 406 406 if (!exceptionChecks.empty()) { 407 407 exceptionChecks.link(&jit); 408 jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame );408 jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(vm.topEntryFrame, GPRInfo::argumentGPR0); 409 409 jit.move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); 410 410 auto call = jit.call(OperationPtrTag);
Note:
See TracChangeset
for help on using the changeset viewer.