Changeset 228727 in webkit


Ignore:
Timestamp:
Feb 19, 2018 8:33:33 PM (6 years ago)
Author:
Yusuke Suzuki
Message:

[FTL] Support ArrayPop for ArrayStorage
https://bugs.webkit.org/show_bug.cgi?id=182783

Reviewed by Saam Barati.

JSTests:

  • stress/array-pop-array-storage.js: Added.

(shouldBe):
(test):

Source/JavaScriptCore:

This patch adds ArrayPop(ArrayStorage) support to FTL. We port the implementation in DFG to FTL.

  • ftl/FTLAbstractHeapRepository.h:
  • ftl/FTLCapabilities.cpp:

(JSC::FTL::canCompile):

  • ftl/FTLLowerDFGToB3.cpp:

(JSC::FTL::DFG::LowerDFGToB3::compileArrayPop):

Location:
trunk
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/JSTests/ChangeLog

    r228726 r228727  
     12018-02-14  Yusuke Suzuki  <utatane.tea@gmail.com>
     2
     3        [FTL] Support ArrayPop for ArrayStorage
     4        https://bugs.webkit.org/show_bug.cgi?id=182783
     5
     6        Reviewed by Saam Barati.
     7
     8        * stress/array-pop-array-storage.js: Added.
     9        (shouldBe):
     10        (test):
     11
    1122018-02-14  Yusuke Suzuki  <utatane.tea@gmail.com>
    213
  • trunk/Source/JavaScriptCore/ChangeLog

    r228726 r228727  
     12018-02-14  Yusuke Suzuki  <utatane.tea@gmail.com>
     2
     3        [FTL] Support ArrayPop for ArrayStorage
     4        https://bugs.webkit.org/show_bug.cgi?id=182783
     5
     6        Reviewed by Saam Barati.
     7
     8        This patch adds ArrayPop(ArrayStorage) support to FTL. We port the implementation in DFG to FTL.
     9
     10        * ftl/FTLAbstractHeapRepository.h:
     11        * ftl/FTLCapabilities.cpp:
     12        (JSC::FTL::canCompile):
     13        * ftl/FTLLowerDFGToB3.cpp:
     14        (JSC::FTL::DFG::LowerDFGToB3::compileArrayPop):
     15
    1162018-02-14  Yusuke Suzuki  <utatane.tea@gmail.com>
    217
  • trunk/Source/JavaScriptCore/ftl/FTLAbstractHeapRepository.h

    r227874 r228727  
    4646#define FOR_EACH_ABSTRACT_FIELD(macro) \
    4747    macro(ArrayBuffer_data, ArrayBuffer::offsetOfData()) \
     48    macro(ArrayStorage_numValuesInVector, ArrayStorage::numValuesInVectorOffset()) \
    4849    macro(Butterfly_arrayBuffer, Butterfly::offsetOfArrayBuffer()) \
    4950    macro(Butterfly_publicLength, Butterfly::offsetOfPublicLength()) \
  • trunk/Source/JavaScriptCore/ftl/FTLCapabilities.cpp

    r228726 r228727  
    319319    case ArraySlice:
    320320    case ArrayIndexOf:
     321    case ArrayPop:
    321322    case ParseInt:
    322323    case AtomicsAdd:
     
    438439        break;
    439440    case ArrayPush:
    440     case ArrayPop:
    441441        switch (node->arrayMode().type()) {
    442442        case Array::Int32:
  • trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp

    r228726 r228727  
    47444744            m_out.jump(continuation);
    47454745           
     4746            m_out.appendTo(continuation, lastNext);
     4747            setJSValue(m_out.phi(Int64, results));
     4748            return;
     4749        }
     4750
     4751        case Array::ArrayStorage: {
     4752            LBasicBlock vectorLengthCheckCase = m_out.newBlock();
     4753            LBasicBlock popCheckCase = m_out.newBlock();
     4754            LBasicBlock fastCase = m_out.newBlock();
     4755            LBasicBlock slowCase = m_out.newBlock();
     4756            LBasicBlock continuation = m_out.newBlock();
     4757
     4758            LValue prevLength = m_out.load32(storage, m_heaps.Butterfly_publicLength);
     4759
     4760            Vector<ValueFromBlock, 3> results;
     4761            results.append(m_out.anchor(m_out.constInt64(JSValue::encode(jsUndefined()))));
     4762            m_out.branch(
     4763                m_out.isZero32(prevLength), rarely(continuation), usually(vectorLengthCheckCase));
     4764
     4765            LBasicBlock lastNext = m_out.appendTo(vectorLengthCheckCase, popCheckCase);
     4766            LValue newLength = m_out.sub(prevLength, m_out.int32One);
     4767            m_out.branch(
     4768                m_out.aboveOrEqual(newLength, m_out.load32(storage, m_heaps.Butterfly_vectorLength)), rarely(slowCase), usually(popCheckCase));
     4769
     4770            m_out.appendTo(popCheckCase, fastCase);
     4771            TypedPointer pointer = m_out.baseIndex(m_heaps.ArrayStorage_vector, storage, m_out.zeroExtPtr(newLength));
     4772            LValue result = m_out.load64(pointer);
     4773            m_out.branch(m_out.notZero64(result), usually(fastCase), rarely(slowCase));
     4774
     4775            m_out.appendTo(fastCase, slowCase);
     4776            m_out.store32(newLength, storage, m_heaps.Butterfly_publicLength);
     4777            m_out.store64(m_out.int64Zero, pointer);
     4778            m_out.store32(
     4779                m_out.sub(m_out.load32(storage, m_heaps.ArrayStorage_numValuesInVector), m_out.int32One),
     4780                storage, m_heaps.ArrayStorage_numValuesInVector);
     4781            results.append(m_out.anchor(result));
     4782            m_out.jump(continuation);
     4783
     4784            m_out.appendTo(slowCase, continuation);
     4785            results.append(m_out.anchor(vmCall(
     4786                Int64, m_out.operation(operationArrayPop), m_callFrame, base)));
     4787            m_out.jump(continuation);
     4788
    47464789            m_out.appendTo(continuation, lastNext);
    47474790            setJSValue(m_out.phi(Int64, results));
Note: See TracChangeset for help on using the changeset viewer.