Changeset 171177 in webkit


Ignore:
Timestamp:
Jul 17, 2014 12:58:05 AM (10 years ago)
Author:
Yusuke Suzuki
Message:

CSS JIT: Clean up return path
https://bugs.webkit.org/show_bug.cgi?id=135011

Reviewed by Benjamin Poulain.

Clean up the existing CSS JIT return path before adding new early return path
for pseudo elements.

  • cssjit/SelectorCompiler.cpp:

(WebCore::SelectorCompiler::SelectorCodeGenerator::generateSelectorChecker):

  • cssjit/StackAllocator.h:

(WebCore::StackAllocator::StackReference::StackReference):
(WebCore::StackAllocator::StackReference::isValid):
(WebCore::StackAllocator::popAndDiscard): Deleted.

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r171165 r171177  
     12014-07-17  Yusuke Suzuki  <utatane.tea@gmail.com>
     2
     3        CSS JIT: Clean up return path
     4        https://bugs.webkit.org/show_bug.cgi?id=135011
     5
     6        Reviewed by Benjamin Poulain.
     7
     8        Clean up the existing CSS JIT return path before adding new early return path
     9        for pseudo elements.
     10
     11        * cssjit/SelectorCompiler.cpp:
     12        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateSelectorChecker):
     13        * cssjit/StackAllocator.h:
     14        (WebCore::StackAllocator::StackReference::StackReference):
     15        (WebCore::StackAllocator::StackReference::isValid):
     16        (WebCore::StackAllocator::popAndDiscard): Deleted.
     17
    1182014-07-16  Zalan Bujtas  <zalan@apple.com>
    219
  • trunk/Source/WebCore/cssjit/SelectorCompiler.cpp

    r170876 r171177  
    11911191    m_registerAllocator.allocateRegister(elementAddressRegister);
    11921192
     1193    StackAllocator::StackReference temporaryStackBase;
     1194
    11931195    if (m_functionType == FunctionType::SelectorCheckerWithCheckingContext)
    11941196        m_checkingContextStackReference = m_stackAllocator.push(checkingContextRegister);
     
    11961198    if (m_needsAdjacentBacktrackingStart)
    11971199        m_adjacentBacktrackingStart = m_stackAllocator.allocateUninitialized();
     1200
     1201    // Remember the stack base of the temporary variables.
     1202    if (m_checkingContextStackReference.isValid())
     1203        temporaryStackBase = m_checkingContextStackReference;
     1204    else if (m_needsAdjacentBacktrackingStart)
     1205        temporaryStackBase = m_adjacentBacktrackingStart;
    11981206
    11991207    Assembler::JumpList failureCases;
     
    12241232
    12251233    if (m_functionType == FunctionType::SimpleSelectorChecker) {
    1226         if (!m_needsAdjacentBacktrackingStart && !reservedCalleeSavedRegisters && !needsEpilogue) {
     1234        if (!temporaryStackBase.isValid() && !reservedCalleeSavedRegisters && !needsEpilogue) {
     1235            ASSERT(!m_needsAdjacentBacktrackingStart);
    12271236            // Success.
    12281237            m_assembler.move(Assembler::TrustedImm32(1), returnRegister);
     
    12351244                m_assembler.ret();
    12361245            }
    1237         } else {
    1238             // Success.
    1239             m_assembler.move(Assembler::TrustedImm32(1), returnRegister);
    1240 
    1241             // Failure.
    1242             if (!failureCases.empty()) {
    1243                 Assembler::Jump skipFailureCase = m_assembler.jump();
    1244                 failureCases.link(&m_assembler);
    1245                 m_assembler.move(Assembler::TrustedImm32(0), returnRegister);
    1246                 skipFailureCase.link(&m_assembler);
    1247             }
    1248 
    1249             if (m_needsAdjacentBacktrackingStart)
    1250                 m_stackAllocator.popAndDiscardUpTo(m_adjacentBacktrackingStart);
    1251             if (reservedCalleeSavedRegisters)
    1252                 m_stackAllocator.pop(calleeSavedRegisterStackReferences, m_registerAllocator.restoreCalleeSavedRegisters());
    1253             if (needsEpilogue)
    1254                 generateEpilogue();
    1255             m_assembler.ret();
    1256         }
    1257     } else {
    1258         ASSERT(m_functionType == FunctionType::SelectorCheckerWithCheckingContext);
    1259 
    1260         // Success.
    1261         m_assembler.move(Assembler::TrustedImm32(1), returnRegister);
    1262 
    1263         // Failure.
    1264         if (!failureCases.empty()) {
    1265             Assembler::Jump skipFailureCase = m_assembler.jump();
    1266             failureCases.link(&m_assembler);
    1267             m_assembler.move(Assembler::TrustedImm32(0), returnRegister);
    1268             skipFailureCase.link(&m_assembler);
    1269         }
    1270 
    1271         m_stackAllocator.popAndDiscardUpTo(m_checkingContextStackReference);
    1272         if (reservedCalleeSavedRegisters)
    1273             m_stackAllocator.pop(calleeSavedRegisterStackReferences, m_registerAllocator.restoreCalleeSavedRegisters());
    1274         if (needsEpilogue)
    1275             generateEpilogue();
    1276         m_assembler.ret();
    1277     }
     1246            return;
     1247        }
     1248    }
     1249
     1250    // Success.
     1251    m_assembler.move(Assembler::TrustedImm32(1), returnRegister);
     1252
     1253    // Failure.
     1254    if (!failureCases.empty()) {
     1255        Assembler::Jump skipFailureCase = m_assembler.jump();
     1256        failureCases.link(&m_assembler);
     1257        m_assembler.move(Assembler::TrustedImm32(0), returnRegister);
     1258        skipFailureCase.link(&m_assembler);
     1259    }
     1260
     1261    if (temporaryStackBase.isValid())
     1262        m_stackAllocator.popAndDiscardUpTo(temporaryStackBase);
     1263    if (reservedCalleeSavedRegisters)
     1264        m_stackAllocator.pop(calleeSavedRegisterStackReferences, m_registerAllocator.restoreCalleeSavedRegisters());
     1265    if (needsEpilogue)
     1266        generateEpilogue();
     1267    m_assembler.ret();
    12781268}
    12791269
  • trunk/Source/WebCore/cssjit/StackAllocator.h

    r170714 r171177  
    3131#include "RegisterAllocator.h"
    3232#include <JavaScriptCore/MacroAssembler.h>
     33#include <limits>
    3334
    3435namespace WebCore {
     
    3940    public:
    4041        StackReference()
    41             : m_offsetFromTop(-1)
     42            : m_offsetFromTop(std::numeric_limits<unsigned>::max())
    4243        { }
    4344        explicit StackReference(unsigned offset)
     
    4546        { }
    4647        operator unsigned() const { return m_offsetFromTop; }
     48        bool isValid() const { return m_offsetFromTop != std::numeric_limits<unsigned>::max(); }
    4749    private:
    4850        unsigned m_offsetFromTop;
     
    135137    }
    136138
    137     void popAndDiscard(StackReference stackReference)
    138     {
    139         RELEASE_ASSERT(stackReference == m_offsetFromTop);
    140         m_assembler.addPtr(JSC::MacroAssembler::TrustedImm32(stackUnitInBytes()), JSC::MacroAssembler::stackPointerRegister);
    141         m_offsetFromTop -= stackUnitInBytes();
    142     }
    143 
    144139    void popAndDiscardUpTo(StackReference stackReference)
    145140    {
Note: See TracChangeset for help on using the changeset viewer.