Ignore:
Timestamp:
Mar 7, 2022, 1:55:08 PM (3 years ago)
Author:
Angelos Oikonomopoulos
Message:

AssemblyHelpersSpoolers: use load/store pair on ARMv7
https://bugs.webkit.org/show_bug.cgi?id=235112

Reviewed by Žan Doberšek.

Save ~1% code size for baseline JIT on JS2 by emitting load/store pair
instructions on 32-bit ARM.

  • assembler/ARMv7Assembler.h:

(JSC::ARMv6Assembler::vldmia):
(JSC::ARMv7Assembler::vstmia):

  • assembler/CPU.h:

(JSC::isARM):

  • assembler/MacroAssemblerARMv7.h:

(JSC::MacroAssemblerARMv7::loadPair64):
(JSC::MacroAssemblerARMv7::storePair64):

  • jit/AssemblyHelpers.cpp:

(JSC::AssemblyHelpers::copyLLIntBaselineCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer):

  • jit/AssemblyHelpersSpoolers.h:

(JSC::AssemblyHelpers::LoadRegSpooler::executePair):
(JSC::AssemblyHelpers::StoreRegSpooler::executePair):
(JSC::AssemblyHelpers::CopySpooler::CopySpooler):
(JSC::AssemblyHelpers::CopySpooler::loadPair):
(JSC::AssemblyHelpers::CopySpooler::storePair):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h

    r290828 r290907  
    935935    }
    936936
     937    void loadPair64(RegisterID src, TrustedImm32 offset, FPRegisterID dest1, FPRegisterID dest2)
     938    {
     939        ASSERT(dest1 != dest2);
     940        if ((dest2 == (dest1 + 1)) && !offset.m_value) {
     941            // Only emit a VLDMIA if the registers happen to be consecutive and
     942            // in the proper order and the offset happens to be zero. Otherwise,
     943            // the extra instructions to adjust things mean there are no space
     944            // savings and the VLDM itself might be a performance loss.
     945            m_assembler.vldmia(src, dest1, 2);
     946        } else {
     947            loadDouble(Address(src, offset.m_value), dest1);
     948            loadDouble(Address(src, offset.m_value + 8), dest2);
     949        }
     950    }
     951
     952    void storePair64(FPRegisterID src1, FPRegisterID src2, RegisterID dest, TrustedImm32 offset)
     953    {
     954        if ((src2 == (src1 + 1)) && !offset.m_value) {
     955            // Only emit a VSTMIA under a narrow set of conditions. See
     956            // loadPair64 for the rationale.
     957            m_assembler.vstmia(dest, src1, 2);
     958        } else {
     959            storeDouble(src1, Address(dest, offset.m_value));
     960            storeDouble(src2, Address(dest, offset.m_value + 8));
     961        }
     962    }
     963
    937964    void store32(RegisterID src, Address address)
    938965    {
Note: See TracChangeset for help on using the changeset viewer.