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):

Location:
trunk/Source/JavaScriptCore/assembler
Files:
3 edited

Legend:

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

    r287516 r290907  
    584584        OP_VMOV_CtoD    = 0xEC00,
    585585        OP_VMOV_DtoC    = 0xEC10,
     586        OP_VSTMIA       = 0xEC80,
     587        OP_VLDMIA       = 0xEC90,
    586588        OP_FSTS         = 0xED00,
    587589        OP_VSTR         = 0xED00,
     
    689691        OP_VCVTSD_T1b    = 0x0A40,
    690692        OP_VCVTDS_T1b    = 0x0A40,
     693        OP_VSTMIAb       = 0x0B00,
     694        OP_VLDMIAb       = 0x0B00,
    691695        OP_NOP_T2b       = 0x8000,
    692696        OP_DMB_SY_T1b    = 0x8F5F,
     
    19261930    }
    19271931#endif
     1932
     1933    void vldmia(RegisterID rn, FPDoubleRegisterID rs, uint32_t count)
     1934    {
     1935        ASSERT(count < 16);
     1936        m_formatter.vfpMemOp(OP_VLDMIA, OP_VLDMIAb, true, rn, rs, count << 3);
     1937    }
     1938
     1939    void vstmia(RegisterID rn, FPDoubleRegisterID rs, uint32_t count)
     1940    {
     1941        ASSERT(count < 16);
     1942        m_formatter.vfpMemOp(OP_VSTMIA, OP_VSTMIAb, true, rn, rs, count << 3);
     1943    }
    19281944
    19291945    void vand(FPDoubleRegisterID rd, FPDoubleRegisterID rn, FPDoubleRegisterID rm)
  • trunk/Source/JavaScriptCore/assembler/CPU.h

    r289740 r290907  
    3737{
    3838#if HAVE(ARM_IDIV_INSTRUCTIONS)
     39    return true;
     40#else
     41    return false;
     42#endif
     43}
     44
     45constexpr bool isARM()
     46{
     47#if CPU(ARM)
    3948    return true;
    4049#else
  • 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.