Ignore:
Timestamp:
Aug 15, 2013, 7:35:31 PM (12 years ago)
Author:
[email protected]
Message:

[JSC] x86: Use inc and dec when possible
https://bugs.webkit.org/show_bug.cgi?id=119831

Reviewed by Geoffrey Garen.

When incrementing or decrementing by an immediate of 1, use the insctructions
inc and dec instead of add and sub.
The instructions have good timing and their encoding is smaller.

  • assembler/MacroAssemblerX86Common.h:

(JSC::MacroAssemblerX86_64::add32):
(JSC::MacroAssemblerX86_64::sub32):

  • assembler/MacroAssemblerX86_64.h:

(JSC::MacroAssemblerX86_64::add64):
(JSC::MacroAssemblerX86_64::sub64):

  • assembler/X86Assembler.h:

(JSC::X86Assembler::dec_r):
(JSC::X86Assembler::decq_r):
(JSC::X86Assembler::inc_r):
(JSC::X86Assembler::incq_r):

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

Legend:

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

    r153162 r154158  
    128128    void add32(TrustedImm32 imm, RegisterID dest)
    129129    {
    130         m_assembler.addl_ir(imm.m_value, dest);
     130        if (imm.m_value == 1)
     131            m_assembler.inc_r(dest);
     132        else
     133            m_assembler.addl_ir(imm.m_value, dest);
    131134    }
    132135   
     
    375378    void sub32(TrustedImm32 imm, RegisterID dest)
    376379    {
    377         m_assembler.subl_ir(imm.m_value, dest);
     380        if (imm.m_value == 1)
     381            m_assembler.dec_r(dest);
     382        else
     383            m_assembler.subl_ir(imm.m_value, dest);
    378384    }
    379385   
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h

    r153197 r154158  
    184184    void add64(TrustedImm32 imm, RegisterID srcDest)
    185185    {
    186         m_assembler.addq_ir(imm.m_value, srcDest);
     186        if (imm.m_value == 1)
     187            m_assembler.incq_r(srcDest);
     188        else
     189            m_assembler.addq_ir(imm.m_value, srcDest);
    187190    }
    188191
    189192    void add64(TrustedImm64 imm, RegisterID dest)
    190193    {
    191         move(imm, scratchRegister);
    192         add64(scratchRegister, dest);
     194        if (imm.m_value == 1)
     195            m_assembler.incq_r(dest);
     196        else {
     197            move(imm, scratchRegister);
     198            add64(scratchRegister, dest);
     199        }
    193200    }
    194201
     
    270277    void sub64(TrustedImm32 imm, RegisterID dest)
    271278    {
    272         m_assembler.subq_ir(imm.m_value, dest);
     279        if (imm.m_value == 1)
     280            m_assembler.decq_r(dest);
     281        else
     282            m_assembler.subq_ir(imm.m_value, dest);
    273283    }
    274284   
    275285    void sub64(TrustedImm64 imm, RegisterID dest)
    276286    {
    277         move(imm, scratchRegister);
    278         sub64(scratchRegister, dest);
     287        if (imm.m_value == 1)
     288            m_assembler.decq_r(dest);
     289        else {
     290            move(imm, scratchRegister);
     291            sub64(scratchRegister, dest);
     292        }
    279293    }
    280294
  • trunk/Source/JavaScriptCore/assembler/X86Assembler.h

    r153197 r154158  
    501501#endif
    502502
     503    void dec_r(RegisterID dst)
     504    {
     505        m_formatter.oneByteOp(OP_GROUP5_Ev, GROUP1_OP_OR, dst);
     506    }
     507
     508    void decq_r(RegisterID dst)
     509    {
     510        m_formatter.oneByteOp64(OP_GROUP5_Ev, GROUP1_OP_OR, dst);
     511    }
     512
     513    void inc_r(RegisterID dst)
     514    {
     515        m_formatter.oneByteOp(OP_GROUP5_Ev, GROUP1_OP_ADD, dst);
     516    }
     517
     518    void incq_r(RegisterID dst)
     519    {
     520        m_formatter.oneByteOp64(OP_GROUP5_Ev, GROUP1_OP_ADD, dst);
     521    }
     522
    503523    void negl_r(RegisterID dst)
    504524    {
Note: See TracChangeset for help on using the changeset viewer.