Changeset 194126 in webkit
- Timestamp:
- Dec 15, 2015, 5:05:00 PM (9 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r194113 r194126 1 2015-12-15 Mark Lam <mark.lam@apple.com> 2 3 Introducing ScratchRegisterAllocator::PreservedState. 4 https://bugs.webkit.org/show_bug.cgi?id=152315 5 6 Reviewed by Geoffrey Garen. 7 8 restoreReusedRegistersByPopping() should always be called with 2 values that 9 matches the expectation of preserveReusedRegistersByPushing(). Those 2 values 10 are the number of bytes preserved and the ExtraStackSpace requirement. By 11 encapsulating them in a ScratchRegisterAllocator::PreservedState, we can make 12 it less error prone when calling restoreReusedRegistersByPopping(). Now, we only 13 need to pass it the appropriate PreservedState that its matching 14 preserveReusedRegistersByPushing() returned. 15 16 * bytecode/PolymorphicAccess.cpp: 17 (JSC::AccessGenerationState::restoreScratch): 18 (JSC::AccessCase::generate): 19 (JSC::PolymorphicAccess::regenerate): 20 * bytecode/PolymorphicAccess.h: 21 (JSC::AccessGenerationState::AccessGenerationState): 22 * ftl/FTLCompileBinaryOp.cpp: 23 (JSC::FTL::generateBinaryBitOpFastPath): 24 (JSC::FTL::generateRightShiftFastPath): 25 (JSC::FTL::generateBinaryArithOpFastPath): 26 * ftl/FTLLazySlowPath.cpp: 27 (JSC::FTL::LazySlowPath::generate): 28 * ftl/FTLLowerDFGToLLVM.cpp: 29 (JSC::FTL::DFG::LowerDFGToLLVM::emitStoreBarrier): 30 * jit/ScratchRegisterAllocator.cpp: 31 (JSC::ScratchRegisterAllocator::allocateScratchGPR): 32 (JSC::ScratchRegisterAllocator::allocateScratchFPR): 33 (JSC::ScratchRegisterAllocator::preserveReusedRegistersByPushing): 34 (JSC::ScratchRegisterAllocator::restoreReusedRegistersByPopping): 35 * jit/ScratchRegisterAllocator.h: 36 (JSC::ScratchRegisterAllocator::usedRegisters): 37 (JSC::ScratchRegisterAllocator::PreservedState::PreservedState): 38 1 39 2015-12-15 Mark Lam <mark.lam@apple.com> 2 40 -
trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r194067 r194126 159 159 0F24E55017EE274900ABB217 /* Repatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F24E54917EE274900ABB217 /* Repatch.cpp */; }; 160 160 0F24E55117EE274900ABB217 /* Repatch.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F24E54A17EE274900ABB217 /* Repatch.h */; }; 161 0F24E55217EE274900ABB217 /* ScratchRegisterAllocator.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F24E54B17EE274900ABB217 /* ScratchRegisterAllocator.h */; };161 0F24E55217EE274900ABB217 /* ScratchRegisterAllocator.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F24E54B17EE274900ABB217 /* ScratchRegisterAllocator.h */; settings = {ATTRIBUTES = (Private, ); }; }; 162 162 0F24E55517F0B71C00ABB217 /* InlineCallFrameSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F24E55317F0B71C00ABB217 /* InlineCallFrameSet.cpp */; }; 163 163 0F24E55617F0B71C00ABB217 /* InlineCallFrameSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F24E55417F0B71C00ABB217 /* InlineCallFrameSet.h */; settings = {ATTRIBUTES = (Private, ); }; }; -
trunk/Source/JavaScriptCore/bytecode/PolymorphicAccess.cpp
r192600 r194126 55 55 void AccessGenerationState::restoreScratch() 56 56 { 57 allocator->restoreReusedRegistersByPopping(*jit, numberOfBytesUsedToPreserveReusedRegisters, ScratchRegisterAllocator::ExtraStackSpace::NoExtraSpace);57 allocator->restoreReusedRegistersByPopping(*jit, preservedReusedRegisterState); 58 58 } 59 59 … … 728 728 done.link(&jit); 729 729 730 jit.addPtr(CCallHelpers::TrustedImm32((jit.codeBlock()->stackPointerOffset() * sizeof(Register)) - state. numberOfBytesUsedToPreserveReusedRegisters- state.numberOfStackBytesUsedForRegisterPreservation()),730 jit.addPtr(CCallHelpers::TrustedImm32((jit.codeBlock()->stackPointerOffset() * sizeof(Register)) - state.preservedReusedRegisterState.numberOfBytesPreserved - state.numberOfStackBytesUsedForRegisterPreservation()), 731 731 GPRInfo::callFrameRegister, CCallHelpers::stackPointerRegister); 732 732 state.restoreLiveRegistersFromStackForCall(isGetter()); … … 887 887 scratchGPR3 = InvalidGPRReg; 888 888 889 size_t numberOfBytesUsedToPreserveReusedRegisters = allocator.preserveReusedRegistersByPushing(jit, ScratchRegisterAllocator::ExtraStackSpace::SpaceForCCall); 889 ScratchRegisterAllocator::PreservedState preservedState = 890 allocator.preserveReusedRegistersByPushing(jit, ScratchRegisterAllocator::ExtraStackSpace::SpaceForCCall); 890 891 891 892 ASSERT(structure()->transitionWatchpointSetHasBeenInvalidated()); 892 893 893 894 bool scratchGPRHasStorage = false; 894 bool needsToMakeRoomOnStackForCCall = ! numberOfBytesUsedToPreserveReusedRegisters&& codeBlock->jitType() == JITCode::FTLJIT;895 bool needsToMakeRoomOnStackForCCall = !preservedState.numberOfBytesPreserved && codeBlock->jitType() == JITCode::FTLJIT; 895 896 896 897 if (newStructure()->outOfLineCapacity() != structure()->outOfLineCapacity()) { … … 1017 1018 } 1018 1019 1019 allocator.restoreReusedRegistersByPopping(jit, numberOfBytesUsedToPreserveReusedRegisters, ScratchRegisterAllocator::ExtraStackSpace::SpaceForCCall);1020 allocator.restoreReusedRegistersByPopping(jit, preservedState); 1020 1021 state.succeed(); 1021 1022 1022 1023 if (newStructure()->outOfLineCapacity() != structure()->outOfLineCapacity()) { 1023 1024 slowPath.link(&jit); 1024 allocator.restoreReusedRegistersByPopping(jit, numberOfBytesUsedToPreserveReusedRegisters, ScratchRegisterAllocator::ExtraStackSpace::SpaceForCCall);1025 allocator.restoreReusedRegistersByPopping(jit, preservedState); 1025 1026 allocator.preserveUsedRegistersToScratchBufferForCall(jit, scratchBuffer, scratchGPR); 1026 1027 if (needsToMakeRoomOnStackForCCall) … … 1246 1247 state.jit = &jit; 1247 1248 1248 state.numberOfBytesUsedToPreserveReusedRegisters = allocator.preserveReusedRegistersByPushing(jit, ScratchRegisterAllocator::ExtraStackSpace::NoExtraSpace); 1249 state.preservedReusedRegisterState = 1250 allocator.preserveReusedRegistersByPushing(jit, ScratchRegisterAllocator::ExtraStackSpace::NoExtraSpace); 1249 1251 1250 1252 bool allGuardedByStructureCheck = true; … … 1316 1318 1317 1319 int stackPointerOffset = codeBlock->stackPointerOffset() * sizeof(EncodedJSValue); 1318 stackPointerOffset -= state. numberOfBytesUsedToPreserveReusedRegisters;1320 stackPointerOffset -= state.preservedReusedRegisterState.numberOfBytesPreserved; 1319 1321 stackPointerOffset -= state.numberOfStackBytesUsedForRegisterPreservation(); 1320 1322 -
trunk/Source/JavaScriptCore/bytecode/PolymorphicAccess.h
r191215 r194126 34 34 #include "ObjectPropertyConditionSet.h" 35 35 #include "Opcode.h" 36 #include "ScratchRegisterAllocator.h" 36 37 #include "Structure.h" 37 38 #include <wtf/Vector.h> … … 350 351 CCallHelpers* jit { nullptr }; 351 352 ScratchRegisterAllocator* allocator; 352 unsigned numberOfBytesUsedToPreserveReusedRegisters { 0 };353 ScratchRegisterAllocator::PreservedState preservedReusedRegisterState; 353 354 PolymorphicAccess* access { nullptr }; 354 355 StructureStubInfo* stubInfo { nullptr }; -
trunk/Source/JavaScriptCore/ftl/FTLCompileBinaryOp.cpp
r194113 r194126 179 179 JSValueRegs(left), JSValueRegs(right), scratchGPR); 180 180 181 unsigned numberOfBytesUsedToPreserveReusedRegisters=181 ScratchRegisterAllocator::PreservedState preservedState = 182 182 allocator.preserveReusedRegistersByPushing(jit, ScratchRegisterAllocator::ExtraStackSpace::NoExtraSpace); 183 183 … … 189 189 190 190 context.restoreRegisters(jit); 191 allocator.restoreReusedRegistersByPopping(jit, numberOfBytesUsedToPreserveReusedRegisters, 192 ScratchRegisterAllocator::ExtraStackSpace::NoExtraSpace); 191 allocator.restoreReusedRegistersByPopping(jit, preservedState); 193 192 done = jit.jump(); 194 193 195 194 gen.slowPathJumpList().link(&jit); 196 195 context.restoreRegisters(jit); 197 allocator.restoreReusedRegistersByPopping(jit, numberOfBytesUsedToPreserveReusedRegisters, 198 ScratchRegisterAllocator::ExtraStackSpace::NoExtraSpace); 196 allocator.restoreReusedRegistersByPopping(jit, preservedState); 199 197 slowPathStart = jit.jump(); 200 198 } … … 215 213 JSValueRegs(left), JSValueRegs(right), leftFPR, scratchGPR, InvalidFPRReg, shiftType); 216 214 217 unsigned numberOfBytesUsedToPreserveReusedRegisters=215 ScratchRegisterAllocator::PreservedState preservedState = 218 216 allocator.preserveReusedRegistersByPushing(jit, ScratchRegisterAllocator::ExtraStackSpace::NoExtraSpace); 219 217 … … 224 222 gen.endJumpList().link(&jit); 225 223 context.restoreRegisters(jit); 226 allocator.restoreReusedRegistersByPopping(jit, numberOfBytesUsedToPreserveReusedRegisters, 227 ScratchRegisterAllocator::ExtraStackSpace::NoExtraSpace); 224 allocator.restoreReusedRegistersByPopping(jit, preservedState); 228 225 done = jit.jump(); 229 226 230 227 gen.slowPathJumpList().link(&jit); 231 228 context.restoreRegisters(jit); 232 allocator.restoreReusedRegistersByPopping(jit, numberOfBytesUsedToPreserveReusedRegisters, 233 ScratchRegisterAllocator::ExtraStackSpace::NoExtraSpace); 229 allocator.restoreReusedRegistersByPopping(jit, preservedState); 234 230 slowPathStart = jit.jump(); 235 231 } … … 254 250 JSValueRegs(left), JSValueRegs(right), leftFPR, rightFPR, scratchGPR, scratchFPR); 255 251 256 unsigned numberOfBytesUsedToPreserveReusedRegisters=252 ScratchRegisterAllocator::PreservedState preservedState = 257 253 allocator.preserveReusedRegistersByPushing(jit, ScratchRegisterAllocator::ExtraStackSpace::NoExtraSpace); 258 254 … … 263 259 gen.endJumpList().link(&jit); 264 260 context.restoreRegisters(jit); 265 allocator.restoreReusedRegistersByPopping(jit, numberOfBytesUsedToPreserveReusedRegisters, 266 ScratchRegisterAllocator::ExtraStackSpace::NoExtraSpace); 261 allocator.restoreReusedRegistersByPopping(jit, preservedState); 267 262 done = jit.jump(); 268 263 269 264 gen.slowPathJumpList().link(&jit); 270 265 context.restoreRegisters(jit); 271 allocator.restoreReusedRegistersByPopping(jit, numberOfBytesUsedToPreserveReusedRegisters, 272 ScratchRegisterAllocator::ExtraStackSpace::NoExtraSpace); 266 allocator.restoreReusedRegistersByPopping(jit, preservedState); 273 267 slowPathStart = jit.jump(); 274 268 } -
trunk/Source/JavaScriptCore/ftl/FTLLazySlowPath.cpp
r192856 r194126 80 80 81 81 #if !FTL_USES_B3 82 unsigned bytesSaved = m_scratchRegisterAllocator.preserveReusedRegistersByPushing(jit, ScratchRegisterAllocator::ExtraStackSpace::NoExtraSpace); 82 ScratchRegisterAllocator::PreservedState preservedState = 83 m_scratchRegisterAllocator.preserveReusedRegistersByPushing(jit, ScratchRegisterAllocator::ExtraStackSpace::NoExtraSpace); 83 84 // This is needed because LLVM may create a stackmap location that is the register SP. 84 85 // But on arm64, SP is also the same register number as ZR, so LLVM is telling us that it has … … 95 96 CCallHelpers::Label doneLabel; 96 97 CCallHelpers::Jump jumpToEndOfPatchpoint; 97 if ( bytesSaved) {98 if (preservedState.numberOfBytesPreserved) { 98 99 doneLabel = jit.label(); 99 m_scratchRegisterAllocator.restoreReusedRegistersByPopping(jit, bytesSaved, ScratchRegisterAllocator::ExtraStackSpace::NoExtraSpace);100 m_scratchRegisterAllocator.restoreReusedRegistersByPopping(jit, preservedState); 100 101 jumpToEndOfPatchpoint = jit.jump(); 101 102 } … … 106 107 linkBuffer.link(params.doneJumps, m_done); 107 108 #else // FTL_USES_B3 108 if ( bytesSaved) {109 if (preservedState.numberOfBytesPreserved) { 109 110 linkBuffer.link(params.doneJumps, linkBuffer.locationOf(doneLabel)); 110 111 linkBuffer.link(jumpToEndOfPatchpoint, m_patchpoint.labelAtOffset(MacroAssembler::maxJumpReplacementSize())); -
trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp
r194113 r194126 9343 9343 GPRReg scratch2 = scratchRegisterAllocator.allocateScratchGPR(); 9344 9344 9345 unsigned bytesPushed=9345 ScratchRegisterAllocator::PreservedState preservedState = 9346 9346 scratchRegisterAllocator.preserveReusedRegistersByPushing(jit, ScratchRegisterAllocator::ExtraStackSpace::SpaceForCCall); 9347 9347 … … 9366 9366 static_cast<int32_t>(-sizeof(void*)))); 9367 9367 9368 scratchRegisterAllocator.restoreReusedRegistersByPopping(jit, bytesPushed, ScratchRegisterAllocator::ExtraStackSpace::SpaceForCCall);9368 scratchRegisterAllocator.restoreReusedRegistersByPopping(jit, preservedState); 9369 9369 9370 9370 params.doneJumps.append(jit.jump()); … … 9375 9375 params.exceptionJumps, operationFlushWriteBarrierBuffer, InvalidGPRReg, 9376 9376 baseGPR); 9377 scratchRegisterAllocator.restoreReusedRegistersByPopping(jit, bytesPushed, ScratchRegisterAllocator::ExtraStackSpace::SpaceForCCall);9377 scratchRegisterAllocator.restoreReusedRegistersByPopping(jit, preservedState); 9378 9378 params.doneJumps.append(jit.jump()); 9379 9379 }); -
trunk/Source/JavaScriptCore/jit/ScratchRegisterAllocator.cpp
r191404 r194126 103 103 FPRReg ScratchRegisterAllocator::allocateScratchFPR() { return allocateScratch<FPRInfo>(); } 104 104 105 unsignedScratchRegisterAllocator::preserveReusedRegistersByPushing(MacroAssembler& jit, ExtraStackSpace extraStackSpace)105 ScratchRegisterAllocator::PreservedState ScratchRegisterAllocator::preserveReusedRegistersByPushing(MacroAssembler& jit, ExtraStackSpace extraStackSpace) 106 106 { 107 107 if (!didReuseRegisters()) 108 return 0;108 return PreservedState(0, extraStackSpace); 109 109 110 110 RegisterSet registersToSpill; … … 123 123 unsigned stackAdjustmentSize = ScratchRegisterAllocator::preserveRegistersToStackForCall(jit, registersToSpill, extraStackBytesAtTopOfStack); 124 124 125 return stackAdjustmentSize;126 } 127 128 void ScratchRegisterAllocator::restoreReusedRegistersByPopping(MacroAssembler& jit, unsigned numberOfBytesUsedToPreserveReusedRegisters, ExtraStackSpace extraStackSpace)125 return PreservedState(stackAdjustmentSize, extraStackSpace); 126 } 127 128 void ScratchRegisterAllocator::restoreReusedRegistersByPopping(MacroAssembler& jit, const ScratchRegisterAllocator::PreservedState preservedState) 129 129 { 130 130 if (!didReuseRegisters()) … … 143 143 } 144 144 145 unsigned extraStackBytesAtTopOfStack = extraStackSpace == ExtraStackSpace::SpaceForCCall ? maxFrameExtentForSlowPathCall : 0; 145 unsigned extraStackBytesAtTopOfStack = 146 preservedState.extraStackSpaceRequirement == ExtraStackSpace::SpaceForCCall ? maxFrameExtentForSlowPathCall : 0; 146 147 RegisterSet dontRestore; // Empty set. We want to restore everything. 147 ScratchRegisterAllocator::restoreRegistersFromStackForCall(jit, registersToFill, dontRestore, numberOfBytesUsedToPreserveReusedRegisters, extraStackBytesAtTopOfStack); 148 ScratchRegisterAllocator::restoreRegistersFromStackForCall(jit, registersToFill, dontRestore, 149 preservedState.numberOfBytesPreserved, extraStackBytesAtTopOfStack); 148 150 } 149 151 -
trunk/Source/JavaScriptCore/jit/ScratchRegisterAllocator.h
r191404 r194126 68 68 69 69 enum class ExtraStackSpace { SpaceForCCall, NoExtraSpace }; 70 unsigned preserveReusedRegistersByPushing(MacroAssembler& jit, ExtraStackSpace); 71 void restoreReusedRegistersByPopping(MacroAssembler& jit, unsigned numberOfBytesUsedToPreserveReusedRegisters, ExtraStackSpace); 70 71 struct PreservedState { 72 PreservedState() 73 : PreservedState(0) 74 { } 75 76 PreservedState(unsigned numberOfBytes, ExtraStackSpace extraStackSpace = ExtraStackSpace::NoExtraSpace) 77 : numberOfBytesPreserved(numberOfBytes) 78 , extraStackSpaceRequirement(extraStackSpace) 79 { } 80 81 unsigned numberOfBytesPreserved; 82 ExtraStackSpace extraStackSpaceRequirement; 83 }; 84 85 PreservedState preserveReusedRegistersByPushing(MacroAssembler& jit, ExtraStackSpace); 86 void restoreReusedRegistersByPopping(MacroAssembler& jit, PreservedState); 72 87 73 88 RegisterSet usedRegistersForCall() const;
Note:
See TracChangeset
for help on using the changeset viewer.