Ignore:
Timestamp:
Dec 21, 2021, 12:33:18 AM (3 years ago)
Author:
[email protected]
Message:

[JSC][ARMv7] Minor code size improvements
https://bugs.webkit.org/show_bug.cgi?id=234387

Patch by Geza Lore <Geza Lore> on 2021-12-21
Reviewed by Yusuke Suzuki.

A few mew code size improvements to ARMv7/Thumb-2

  • Use ldrd/strd in mode places (via AssemblyHelpers:loadValue

and AssemblyHelpers::storeValue)

  • Use BIC immediate instruction instead of AND where appropriate
  • Use a 2-byte ADDS instead of a 4-byte CMN when possible. This

applies very often as it handles testing JSValue tags.

  • Use addressTempRegister in branch32

Overall saving of about 3.5% code size on JetStream2, according to
--dumpLinkBufferStats.

  • assembler/ARMv7Assembler.h:

(JSC::ARMv7Assembler::bic):

  • assembler/MacroAssemblerARMv7.h:

(JSC::MacroAssemblerARMv7::and32):
(JSC::MacroAssemblerARMv7::storePair32):
(JSC::MacroAssemblerARMv7::compare32AndSetFlags):
(JSC::MacroAssemblerARMv7::branch32):

  • assembler/MacroAssemblerMIPS.h:

(JSC::MacroAssemblerMIPS::storePair32):

  • bytecode/AccessCase.cpp:

(JSC::AccessCase::generateImpl):

  • dfg/DFGOSRExit.cpp:

(JSC::DFG::OSRExit::compileExit):

  • dfg/DFGSpeculativeJIT32_64.cpp:

(JSC::DFG::SpeculativeJIT::fillJSValue):
(JSC::DFG::SpeculativeJIT::emitCall):
(JSC::DFG::SpeculativeJIT::compileGetByVal):
(JSC::DFG::SpeculativeJIT::compile):

  • jit/AssemblyHelpers.h:

(JSC::AssemblyHelpers::storeValue):

  • jit/JITOpcodes.cpp:

(JSC::JIT::emit_op_mov):

File:
1 edited

Legend:

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

    r286424 r287301  
    280280    {
    281281        ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm.m_value);
    282         if (armImm.isValid())
     282        if (armImm.isValid()) {
    283283            m_assembler.ARM_and(dest, src, armImm);
    284         else {
    285             move(imm, dataTempRegister);
    286             m_assembler.ARM_and(dest, src, dataTempRegister);
    287         }
     284            return;
     285        }
     286
     287        armImm = ARMThumbImmediate::makeEncodedImm(~imm.m_value);
     288        if (armImm.isValid()) {
     289            m_assembler.bic(dest, src, armImm);
     290            return;
     291        }
     292
     293        move(imm, dataTempRegister);
     294        m_assembler.ARM_and(dest, src, dataTempRegister);
    288295    }
    289296
     
    10251032        }
    10261033        storePair32(src1, src2, Address(dataTempRegister, address.offset));
     1034    }
     1035
     1036    void storePair32(RegisterID src1, RegisterID src2, const void* address)
     1037    {
     1038        move(TrustedImmPtr(address), addressTempRegister);
     1039        storePair32(src1, src2, addressTempRegister);
    10271040    }
    10281041
     
    15881601        int32_t imm = right.m_value;
    15891602        ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm);
    1590         if (armImm.isValid())
     1603        if (armImm.isValid()) {
    15911604            m_assembler.cmp(left, armImm);
    1592         else if ((armImm = ARMThumbImmediate::makeEncodedImm(-imm)).isValid())
     1605            return;
     1606        }
     1607
     1608        armImm = ARMThumbImmediate::makeEncodedImm(-imm);
     1609        if (armImm.isValid()) {
     1610            if (!(left & 8) && armImm.isUInt3() && (left != addressTempRegister)) {
     1611                // This is common enough to warrant a special case to save 2 bytes
     1612                m_assembler.add_S(addressTempRegister, left, armImm);
     1613                return;
     1614            }
    15931615            m_assembler.cmn(left, armImm);
    1594         else {
    1595             RegisterID scratch = bestTempRegister(left);
    1596             move(TrustedImm32(imm), scratch);
    1597             m_assembler.cmp(left, scratch);
    1598         }
     1616            return;
     1617        }
     1618
     1619        RegisterID scratch = bestTempRegister(left);
     1620        move(TrustedImm32(imm), scratch);
     1621        m_assembler.cmp(left, scratch);
    15991622    }
    16001623
     
    16801703    {
    16811704        if (left == ARMRegisters::sp) {
    1682             move(left, dataTempRegister);
    1683             m_assembler.cmp(dataTempRegister, right);
     1705            move(left, addressTempRegister);
     1706            m_assembler.cmp(addressTempRegister, right);
    16841707        } else if (right == ARMRegisters::sp) {
    1685             move(right, dataTempRegister);
    1686             m_assembler.cmp(left, dataTempRegister);
     1708            move(right, addressTempRegister);
     1709            m_assembler.cmp(left, addressTempRegister);
    16871710        } else
    16881711            m_assembler.cmp(left, right);
Note: See TracChangeset for help on using the changeset viewer.