Changeset 166834 in webkit
- Timestamp:
- Apr 5, 2014 12:31:58 PM (10 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r166833 r166834 1 2014-04-05 Yusuke Suzuki <utatane.tea@gmail.com> 2 3 Use preallocated stack reference to store adjacentBacktrackingStart 4 https://bugs.webkit.org/show_bug.cgi?id=131237 5 6 Reviewed by Benjamin Poulain. 7 8 * cssjit/SelectorCompiler.cpp: 9 (WebCore::SelectorCompiler::SelectorCodeGenerator::SelectorCodeGenerator): 10 (WebCore::SelectorCompiler::SelectorCodeGenerator::computeBacktrackingInformation): 11 (WebCore::SelectorCompiler::SelectorCodeGenerator::generateSelectorChecker): 12 (WebCore::SelectorCompiler::SelectorCodeGenerator::generateDirectAdjacentTreeWalker): 13 (WebCore::SelectorCompiler::SelectorCodeGenerator::generateAdjacentBacktrackingTail): 14 (WebCore::SelectorCompiler::SelectorCodeGenerator::generateBacktrackingTailsIfNeeded): 15 (WebCore::SelectorCompiler::SelectorCodeGenerator::generateWalkToPreviousAdjacent): Deleted. 16 (WebCore::SelectorCompiler::SelectorCodeGenerator::linkFailures): Deleted. 17 (WebCore::SelectorCompiler::SelectorCodeGenerator::generateDescendantBacktrackingTail): Deleted. 18 * cssjit/StackAllocator.h: 19 (WebCore::StackAllocator::allocateUninitialized): 20 1 21 2014-04-05 Jeongeun Kim <je_julie.kim@samsung.com> 2 22 -
trunk/Source/WebCore/cssjit/SelectorCompiler.cpp
r166695 r166834 164 164 165 165 void linkFailures(Assembler::JumpList& globalFailureCases, BacktrackingAction, Assembler::JumpList& localFailureCases); 166 void generateAdjacentBacktrackingTail( Assembler::JumpList& failureCases);166 void generateAdjacentBacktrackingTail(); 167 167 void generateDescendantBacktrackingTail(); 168 168 void generateBacktrackingTailsIfNeeded(Assembler::JumpList& failureCases, const SelectorFragment&); … … 196 196 FunctionType m_functionType; 197 197 SelectorFragmentList m_selectorFragments; 198 bool m_needsAdjacentBacktrackingStart; 198 199 199 200 StackAllocator::StackReference m_checkingContextStackReference; … … 327 328 , m_selectorContext(selectorContext) 328 329 , m_functionType(FunctionType::SimpleSelectorChecker) 330 , m_needsAdjacentBacktrackingStart(false) 329 331 #if CSS_SELECTOR_JIT_DEBUGGING 330 332 , m_originalSelector(rootSelector) … … 635 637 if (fragment.relationToLeftFragment != FragmentRelation::Descendant && fragment.relationToRightFragment == FragmentRelation::Child && isFirstAncestor(ancestorPositionSinceDescendantRelation)) 636 638 fragment.backtrackingFlags |= BacktrackingFlag::SaveDescendantBacktrackingStart; 637 if (fragment.relationToLeftFragment == FragmentRelation::DirectAdjacent && fragment.relationToRightFragment == FragmentRelation::DirectAdjacent && isFirstAdjacent(adjacentPositionSinceIndirectAdjacentTreeWalk)) 639 if (fragment.relationToLeftFragment == FragmentRelation::DirectAdjacent && fragment.relationToRightFragment == FragmentRelation::DirectAdjacent && isFirstAdjacent(adjacentPositionSinceIndirectAdjacentTreeWalk)) { 638 640 fragment.backtrackingFlags |= BacktrackingFlag::SaveAdjacentBacktrackingStart; 641 m_needsAdjacentBacktrackingStart = true; 642 } 639 643 if (fragment.relationToLeftFragment != FragmentRelation::DirectAdjacent && needsAdjacentTail) { 640 644 ASSERT(fragment.relationToRightFragment == FragmentRelation::DirectAdjacent); … … 663 667 if (m_functionType == FunctionType::SelectorCheckerWithCheckingContext) 664 668 m_checkingContextStackReference = m_stackAllocator.push(checkingContextRegister); 669 670 if (m_needsAdjacentBacktrackingStart) 671 m_adjacentBacktrackingStart = m_stackAllocator.allocateUninitialized(); 665 672 666 673 Assembler::JumpList failureCases; … … 691 698 692 699 if (m_functionType == FunctionType::SimpleSelectorChecker) { 693 // Success.694 m_assembler.move(Assembler::TrustedImm32(1), returnRegister);695 if (!reservedCalleeSavedRegisters)700 if (!m_needsAdjacentBacktrackingStart && !reservedCalleeSavedRegisters) { 701 // Success. 702 m_assembler.move(Assembler::TrustedImm32(1), returnRegister); 696 703 m_assembler.ret(); 697 704 698 // Failure. 699 if (!failureCases.empty()) { 700 Assembler::Jump skipFailureCase; 701 if (reservedCalleeSavedRegisters) 702 skipFailureCase = m_assembler.jump(); 703 704 failureCases.link(&m_assembler); 705 m_assembler.move(Assembler::TrustedImm32(0), returnRegister); 706 707 if (!reservedCalleeSavedRegisters) 705 // Failure. 706 if (!failureCases.empty()) { 707 failureCases.link(&m_assembler); 708 m_assembler.move(Assembler::TrustedImm32(0), returnRegister); 708 709 m_assembler.ret(); 709 else 710 } 711 } else { 712 // Success. 713 m_assembler.move(Assembler::TrustedImm32(1), returnRegister); 714 715 // Failure. 716 if (!failureCases.empty()) { 717 Assembler::Jump skipFailureCase = m_assembler.jump(); 718 failureCases.link(&m_assembler); 719 m_assembler.move(Assembler::TrustedImm32(0), returnRegister); 710 720 skipFailureCase.link(&m_assembler); 711 } 712 if (reservedCalleeSavedRegisters) { 721 } 722 723 if (m_needsAdjacentBacktrackingStart) 724 m_stackAllocator.popAndDiscardUpTo(m_adjacentBacktrackingStart); 713 725 m_registerAllocator.restoreCalleeSavedRegisters(m_stackAllocator); 714 726 m_assembler.ret(); … … 831 843 linkFailures(failureCases, fragment.matchingBacktrackingAction, matchingFailureCases); 832 844 833 if (fragment.backtrackingFlags & BacktrackingFlag::SaveAdjacentBacktrackingStart) 834 m_adjacentBacktrackingStart = m_stackAllocator.push(elementAddressRegister); 845 if (fragment.backtrackingFlags & BacktrackingFlag::SaveAdjacentBacktrackingStart) { 846 unsigned offsetToAdjacentBacktrackingStart = m_stackAllocator.offsetToStackReference(m_adjacentBacktrackingStart); 847 m_assembler.storePtr(elementAddressRegister, Assembler::Address(Assembler::stackPointerRegister, offsetToAdjacentBacktrackingStart)); 848 } 835 849 } 836 850 … … 926 940 } 927 941 928 void SelectorCodeGenerator::generateAdjacentBacktrackingTail(Assembler::JumpList& successCases) 929 { 930 StackAllocator successStack = m_stackAllocator; 931 StackAllocator recoveryStack = m_stackAllocator; 932 StackAllocator failureStack = m_stackAllocator; 933 934 successStack.popAndDiscard(m_adjacentBacktrackingStart); 935 successCases.append(m_assembler.jump()); 936 942 void SelectorCodeGenerator::generateAdjacentBacktrackingTail() 943 { 937 944 // Recovering tail. 938 945 m_adjacentBacktrackingFailureCases.link(&m_assembler); 939 946 m_adjacentBacktrackingFailureCases.clear(); 940 recoveryStack.pop(m_adjacentBacktrackingStart, elementAddressRegister); 947 unsigned offsetToAdjacentBacktrackingStart = m_stackAllocator.offsetToStackReference(m_adjacentBacktrackingStart); 948 m_assembler.loadPtr(Assembler::Address(Assembler::stackPointerRegister, offsetToAdjacentBacktrackingStart), elementAddressRegister); 941 949 m_assembler.jump(m_indirectAdjacentEntryPoint); 942 950 943 951 // Total failure tail. 944 952 m_clearAdjacentBacktrackingFailureCases.link(&m_assembler); 945 failureStack.popAndDiscard(m_adjacentBacktrackingStart);946 947 m_stackAllocator.merge(std::move(successStack), std::move(recoveryStack), std::move(failureStack));948 953 } 949 954 … … 960 965 { 961 966 if (fragment.backtrackingFlags & BacktrackingFlag::DirectAdjacentTail && fragment.backtrackingFlags & BacktrackingFlag::DescendantTail) { 962 Assembler::Jump List successCases;963 generateAdjacentBacktrackingTail( successCases);967 Assembler::Jump normalCase = m_assembler.jump(); 968 generateAdjacentBacktrackingTail(); 964 969 generateDescendantBacktrackingTail(); 965 successCases.link(&m_assembler);970 normalCase.link(&m_assembler); 966 971 } else if (fragment.backtrackingFlags & BacktrackingFlag::DirectAdjacentTail) { 967 Assembler::Jump List successCases;968 generateAdjacentBacktrackingTail( successCases);972 Assembler::Jump normalCase = m_assembler.jump(); 973 generateAdjacentBacktrackingTail(); 969 974 failureCases.append(m_assembler.jump()); 970 successCases.link(&m_assembler);975 normalCase.link(&m_assembler); 971 976 } else if (fragment.backtrackingFlags & BacktrackingFlag::DescendantTail) { 972 977 Assembler::Jump normalCase = m_assembler.jump(); -
trunk/Source/WebCore/cssjit/StackAllocator.h
r164911 r166834 59 59 RELEASE_ASSERT(!m_offsetFromTop); 60 60 RELEASE_ASSERT(!m_hasFunctionCallPadding); 61 } 62 63 StackReference allocateUninitialized() 64 { 65 RELEASE_ASSERT(!m_hasFunctionCallPadding); 66 m_assembler.addPtrNoFlags(JSC::MacroAssembler::TrustedImm32(-8), JSC::MacroAssembler::stackPointerRegister); 67 m_offsetFromTop += 8; 68 return StackReference(m_offsetFromTop); 61 69 } 62 70
Note: See TracChangeset
for help on using the changeset viewer.