Ignore:
Timestamp:
May 17, 2011, 1:02:41 PM (14 years ago)
Author:
[email protected]
Message:

2011-05-16 Oliver Hunt <[email protected]>

Reviewed by Gavin Barraclough.

Reduce code size for inline cache
https://bugs.webkit.org/show_bug.cgi?id=60942

This patch introduces the concept of a "compact" address that
allows individual architectures to control the maximum offset
used for the inline path of get_by_id. This reduces the code
size of get_by_id by 3 bytes on x86 and x86_64 and slightly
improves performance on v8 tests.

  • assembler/ARMAssembler.h: (JSC::ARMAssembler::repatchCompact):
  • assembler/ARMv7Assembler.h: (JSC::ARMv7Assembler::repatchCompact):
  • assembler/AbstractMacroAssembler.h: (JSC::AbstractMacroAssembler::DataLabelCompact::DataLabelCompact): (JSC::AbstractMacroAssembler::differenceBetween): (JSC::AbstractMacroAssembler::repatchCompact):
  • assembler/CodeLocation.h: (JSC::CodeLocationDataLabelCompact::CodeLocationDataLabelCompact): (JSC::CodeLocationCommon::dataLabelCompactAtOffset):
  • assembler/LinkBuffer.h: (JSC::LinkBuffer::locationOf):
  • assembler/MIPSAssembler.h: (JSC::MIPSAssembler::repatchCompact):
  • assembler/MacroAssembler.h: (JSC::MacroAssembler::loadPtrWithCompactAddressOffsetPatch):
  • assembler/MacroAssemblerARM.h: (JSC::MacroAssemblerARM::load32WithCompactAddressOffsetPatch):
  • assembler/MacroAssemblerARMv7.h: (JSC::MacroAssemblerARMv7::load32WithCompactAddressOffsetPatch):
  • assembler/MacroAssemblerMIPS.h: (JSC::MacroAssemblerMIPS::load32WithCompactAddressOffsetPatch):
  • assembler/MacroAssemblerSH4.h: (JSC::MacroAssemblerSH4::load32WithAddressOffsetPatch):
  • assembler/MacroAssemblerX86.h: (JSC::MacroAssemblerX86::repatchCompact):
  • assembler/MacroAssemblerX86Common.h: (JSC::MacroAssemblerX86Common::loadCompactWithAddressOffsetPatch):
  • assembler/MacroAssemblerX86_64.h: (JSC::MacroAssemblerX86_64::loadPtrWithCompactAddressOffsetPatch):
  • assembler/RepatchBuffer.h: (JSC::RepatchBuffer::repatch):
  • assembler/SH4Assembler.h: (JSC::SH4Assembler::repatchCompact):
  • assembler/X86Assembler.h: (JSC::X86Assembler::movl_mr_disp8): (JSC::X86Assembler::movq_mr_disp8): (JSC::X86Assembler::repatchCompact): (JSC::X86Assembler::setInt8): (JSC::X86Assembler::X86InstructionFormatter::oneByteOp_disp8): (JSC::X86Assembler::X86InstructionFormatter::oneByteOp64_disp8): (JSC::X86Assembler::X86InstructionFormatter::memoryModRM):
  • jit/JIT.h:
  • jit/JITPropertyAccess.cpp: (JSC::JIT::compileGetByIdHotPath): (JSC::JIT::emit_op_put_by_id): (JSC::JIT::patchGetByIdSelf):
  • jit/JITPropertyAccess32_64.cpp: (JSC::JIT::compileGetByIdHotPath): (JSC::JIT::emit_op_put_by_id): (JSC::JIT::patchGetByIdSelf):
  • jit/JITStubs.cpp: (JSC::JITThunks::tryCacheGetByID):
File:
1 edited

Legend:

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

    r85497 r86699  
    10201020        m_formatter.oneByteOp_disp32(OP_MOV_GvEv, dst, base, offset);
    10211021    }
     1022   
     1023    void movl_mr_disp8(int offset, RegisterID base, RegisterID dst)
     1024    {
     1025        m_formatter.oneByteOp_disp8(OP_MOV_GvEv, dst, base, offset);
     1026    }
    10221027
    10231028    void movl_mr(int offset, RegisterID base, RegisterID index, int scale, RegisterID dst)
     
    10891094    {
    10901095        m_formatter.oneByteOp64_disp32(OP_MOV_GvEv, dst, base, offset);
     1096    }
     1097
     1098    void movq_mr_disp8(int offset, RegisterID base, RegisterID dst)
     1099    {
     1100        m_formatter.oneByteOp64_disp8(OP_MOV_GvEv, dst, base, offset);
    10911101    }
    10921102
     
    15381548        setRel32(from, to);
    15391549    }
     1550   
     1551    static void repatchCompact(void* where, int32_t value)
     1552    {
     1553        ASSERT(value >= 0);
     1554        ASSERT(value <= std::numeric_limits<int8_t>::max());
     1555        setInt8(where, value);
     1556    }
    15401557
    15411558    static void repatchInt32(void* where, int32_t value)
     
    15871604    {
    15881605        reinterpret_cast<int32_t*>(where)[-1] = value;
     1606    }
     1607   
     1608    static void setInt8(void* where, int8_t value)
     1609    {
     1610        reinterpret_cast<int8_t*>(where)[-1] = value;
    15891611    }
    15901612
     
    16621684            memoryModRM_disp32(reg, base, offset);
    16631685        }
     1686       
     1687        void oneByteOp_disp8(OneByteOpcodeID opcode, int reg, RegisterID base, int offset)
     1688        {
     1689            m_buffer.ensureSpace(maxInstructionSize);
     1690            emitRexIfNeeded(reg, 0, base);
     1691            m_buffer.putByteUnchecked(opcode);
     1692            memoryModRM_disp8(reg, base, offset);
     1693        }
    16641694
    16651695        void oneByteOp(OneByteOpcodeID opcode, int reg, RegisterID base, RegisterID index, int scale, int offset)
     
    17671797            m_buffer.putByteUnchecked(opcode);
    17681798            memoryModRM_disp32(reg, base, offset);
     1799        }
     1800       
     1801        void oneByteOp64_disp8(OneByteOpcodeID opcode, int reg, RegisterID base, int offset)
     1802        {
     1803            m_buffer.ensureSpace(maxInstructionSize);
     1804            emitRexW(reg, 0, base);
     1805            m_buffer.putByteUnchecked(opcode);
     1806            memoryModRM_disp8(reg, base, offset);
    17691807        }
    17701808
     
    20002038            }
    20012039        }
    2002    
     2040
     2041        void memoryModRM_disp8(int reg, RegisterID base, int offset)
     2042        {
     2043            // A base of esp or r12 would be interpreted as a sib, so force a sib with no index & put the base in there.
     2044            ASSERT(CAN_SIGN_EXTEND_8_32(offset));
     2045#if CPU(X86_64)
     2046            if ((base == hasSib) || (base == hasSib2)) {
     2047#else
     2048            if (base == hasSib) {
     2049#endif
     2050                putModRmSib(ModRmMemoryDisp8, reg, base, noIndex, 0);
     2051                m_buffer.putByteUnchecked(offset);
     2052            } else {
     2053                putModRm(ModRmMemoryDisp8, reg, base);
     2054                m_buffer.putByteUnchecked(offset);
     2055            }
     2056        }
     2057
    20032058        void memoryModRM_disp32(int reg, RegisterID base, int offset)
    20042059        {
Note: See TracChangeset for help on using the changeset viewer.