Ignore:
Timestamp:
Aug 16, 2013, 4:34:21 PM (12 years ago)
Author:
[email protected]
Message:

[JSC] x86: improve code generation for xxxTest32
https://bugs.webkit.org/show_bug.cgi?id=119876

Reviewed by Geoffrey Garen.

Try to use testb whenever possible when testing for an immediate value.

When the input is an address and an offset, we can tweak the mask
and offset to be able to generate testb for any byte of the mask.

When the input is a register, we can use testb if we are only interested
in testing the low bits.

  • assembler/MacroAssemblerX86Common.h:

(JSC::MacroAssemblerX86Common::branchTest32):
(JSC::MacroAssemblerX86Common::test32):
(JSC::MacroAssemblerX86Common::generateTest32):

File:
1 edited

Legend:

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

    r154158 r154207  
    11391139    Jump branchTest32(ResultCondition cond, RegisterID reg, TrustedImm32 mask = TrustedImm32(-1))
    11401140    {
    1141         // if we are only interested in the low seven bits, this can be tested with a testb
    11421141        if (mask.m_value == -1)
    11431142            m_assembler.testl_rr(reg, reg);
     1143        else if (!(mask.m_value & ~0xff))
     1144            m_assembler.testb_i8r(mask.m_value, reg);
    11441145        else
    11451146            m_assembler.testl_i32r(mask.m_value, reg);
     
    11491150    Jump branchTest32(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1))
    11501151    {
    1151         if (mask.m_value == -1)
    1152             m_assembler.cmpl_im(0, address.offset, address.base);
    1153         else
    1154             m_assembler.testl_i32m(mask.m_value, address.offset, address.base);
     1152        generateTest32(address, mask);
    11551153        return Jump(m_assembler.jCC(x86Condition(cond)));
    11561154    }
     
    14201418    void test32(ResultCondition cond, Address address, TrustedImm32 mask, RegisterID dest)
    14211419    {
    1422         if (mask.m_value == -1)
    1423             m_assembler.cmpl_im(0, address.offset, address.base);
    1424         else
    1425             m_assembler.testl_i32m(mask.m_value, address.offset, address.base);
     1420        generateTest32(address, mask);
    14261421        set32(x86Condition(cond), dest);
    14271422    }
     
    15041499    // x86_64, and clients & subclasses of MacroAssembler should be using 'supportsFloatingPoint()'.
    15051500    friend class MacroAssemblerX86;
     1501
     1502    ALWAYS_INLINE void generateTest32(Address address, TrustedImm32 mask = TrustedImm32(-1))
     1503    {
     1504        if (mask.m_value == -1)
     1505            m_assembler.cmpl_im(0, address.offset, address.base);
     1506        else if (!(mask.m_value & ~0xff))
     1507            m_assembler.testb_im(mask.m_value, address.offset, address.base);
     1508        else if (!(mask.m_value & ~0xff00))
     1509            m_assembler.testb_im(mask.m_value >> 8, address.offset + 1, address.base);
     1510        else if (!(mask.m_value & ~0xff0000))
     1511            m_assembler.testb_im(mask.m_value >> 16, address.offset + 2, address.base);
     1512        else if (!(mask.m_value & ~0xff000000))
     1513            m_assembler.testb_im(mask.m_value >> 24, address.offset + 3, address.base);
     1514        else
     1515            m_assembler.testl_i32m(mask.m_value, address.offset, address.base);
     1516    }
    15061517
    15071518#if CPU(X86)
Note: See TracChangeset for help on using the changeset viewer.