Changeset 192409 in webkit


Ignore:
Timestamp:
Nov 12, 2015 10:13:11 PM (8 years ago)
Author:
commit-queue@webkit.org
Message:

[JSC] Do not generate an Add when adding a zero immediate to something
https://bugs.webkit.org/show_bug.cgi?id=151171

Patch by Benjamin Poulain <bpoulain@apple.com> on 2015-11-12
Reviewed by Geoffrey Garen.

Avoid generating an add if one of arguments is a zero immediate.

On x86, the add32/64() were also used internally for branchAdd32/64.
I split the code that sets flag to add32AndSetFlags() to make sure
we always force the flags before testing.

I could have used CMp to set the flags but I would gain nothing from
that, cmp is just a SUB.

  • assembler/MacroAssemblerARM64.h:

(JSC::MacroAssemblerARM64::add32):
(JSC::MacroAssemblerARM64::add64):

  • assembler/MacroAssemblerARMv7.h:

(JSC::MacroAssemblerARMv7::add32):

  • assembler/MacroAssemblerX86.h:

(JSC::MacroAssemblerX86::add32):

  • assembler/MacroAssemblerX86Common.h:

(JSC::MacroAssemblerX86Common::add32):
(JSC::MacroAssemblerX86Common::branchAdd32):
(JSC::MacroAssemblerX86Common::add32AndSetFlags):

  • assembler/MacroAssemblerX86_64.h:

(JSC::MacroAssemblerX86_64::add32):
(JSC::MacroAssemblerX86_64::add64):
(JSC::MacroAssemblerX86_64::branchAdd64):
(JSC::MacroAssemblerX86_64::add64AndSetFlags):

Location:
trunk/Source/JavaScriptCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r192401 r192409  
     12015-11-12  Benjamin Poulain  <bpoulain@apple.com>
     2
     3        [JSC] Do not generate an Add when adding a zero immediate to something
     4        https://bugs.webkit.org/show_bug.cgi?id=151171
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        Avoid generating an add if one of arguments is a zero immediate.
     9
     10        On x86, the add32/64() were also used internally for branchAdd32/64.
     11        I split the code that sets flag to add32AndSetFlags() to make sure
     12        we always force the flags before testing.
     13
     14        I could have used CMp to set the flags but I would gain nothing from
     15        that, cmp is just a SUB.
     16
     17        * assembler/MacroAssemblerARM64.h:
     18        (JSC::MacroAssemblerARM64::add32):
     19        (JSC::MacroAssemblerARM64::add64):
     20        * assembler/MacroAssemblerARMv7.h:
     21        (JSC::MacroAssemblerARMv7::add32):
     22        * assembler/MacroAssemblerX86.h:
     23        (JSC::MacroAssemblerX86::add32):
     24        * assembler/MacroAssemblerX86Common.h:
     25        (JSC::MacroAssemblerX86Common::add32):
     26        (JSC::MacroAssemblerX86Common::branchAdd32):
     27        (JSC::MacroAssemblerX86Common::add32AndSetFlags):
     28        * assembler/MacroAssemblerX86_64.h:
     29        (JSC::MacroAssemblerX86_64::add32):
     30        (JSC::MacroAssemblerX86_64::add64):
     31        (JSC::MacroAssemblerX86_64::branchAdd64):
     32        (JSC::MacroAssemblerX86_64::add64AndSetFlags):
     33
    1342015-11-12  Geoffrey Garen  <ggaren@apple.com>
    235
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h

    r191750 r192409  
    142142    void add32(TrustedImm32 imm, RegisterID dest)
    143143    {
     144        if (!imm.m_value)
     145            return;
     146
    144147        add32(imm, dest, dest);
    145148    }
     
    147150    void add32(TrustedImm32 imm, RegisterID src, RegisterID dest)
    148151    {
     152        if (!imm.m_value) {
     153            move(src, dest);
     154            return;
     155        }
     156
    149157        if (isUInt12(imm.m_value))
    150158            m_assembler.add<32>(dest, src, UInt12(imm.m_value));
     
    159167    void add32(TrustedImm32 imm, Address address)
    160168    {
     169        if (!imm.m_value)
     170            return;
     171
    161172        load32(address, getCachedDataTempRegisterIDAndInvalidate());
    162173
     
    175186    void add32(TrustedImm32 imm, AbsoluteAddress address)
    176187    {
     188        if (!imm.m_value)
     189            return;
     190
    177191        load32(address.m_ptr, getCachedDataTempRegisterIDAndInvalidate());
    178192
     
    210224    void add64(TrustedImm32 imm, RegisterID dest)
    211225    {
     226        if (!imm.m_value)
     227            return;
     228
    212229        if (isUInt12(imm.m_value)) {
    213230            m_assembler.add<64>(dest, dest, UInt12(imm.m_value));
     
    226243    {
    227244        intptr_t immediate = imm.m_value;
     245        if (!immediate)
     246            return;
    228247
    229248        if (isUInt12(immediate)) {
     
    242261    void add64(TrustedImm32 imm, RegisterID src, RegisterID dest)
    243262    {
     263        if (!imm.m_value) {
     264            move(src, dest);
     265            return;
     266        }
     267
    244268        if (isUInt12(imm.m_value)) {
    245269            m_assembler.add<64>(dest, src, UInt12(imm.m_value));
     
    257281    void add64(TrustedImm32 imm, Address address)
    258282    {
     283        if (!imm.m_value)
     284            return;
     285
    259286        load64(address, getCachedDataTempRegisterIDAndInvalidate());
    260287
     
    273300    void add64(TrustedImm32 imm, AbsoluteAddress address)
    274301    {
     302        if (!imm.m_value)
     303            return;
     304
    275305        load64(address.m_ptr, getCachedDataTempRegisterIDAndInvalidate());
    276306
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h

    r191700 r192409  
    169169    void add32(TrustedImm32 imm, RegisterID src, RegisterID dest)
    170170    {
     171        if (!imm.m_value) {
     172            move(src, dest);
     173            return;
     174        }
     175
    171176        ARMThumbImmediate armImm = ARMThumbImmediate::makeUInt12OrEncodedImm(imm.m_value);
    172177
     
    188193    void add32(TrustedImm32 imm, Address address)
    189194    {
     195        if (!imm.m_value)
     196            return;
     197
    190198        load32(address, dataTempRegister);
    191199
     
    211219    void add32(TrustedImm32 imm, AbsoluteAddress address)
    212220    {
     221        if (!imm.m_value)
     222            return;
     223
    213224        load32(address.m_ptr, dataTempRegister);
    214225
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86.h

    r190718 r192409  
    5959    void add32(TrustedImm32 imm, RegisterID src, RegisterID dest)
    6060    {
     61        if (!imm.m_value) {
     62            move(src, dest);
     63            return;
     64        }
     65
    6166        m_assembler.leal_mr(imm.m_value, src, dest);
    6267    }
     
    6469    void add32(TrustedImm32 imm, AbsoluteAddress address)
    6570    {
     71        if (!imm.m_value)
     72            return;
     73
    6674        m_assembler.addl_im(imm.m_value, address.m_ptr);
    6775    }
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h

    r192295 r192409  
    115115    void add32(TrustedImm32 imm, Address address)
    116116    {
    117         m_assembler.addl_im(imm.m_value, address.offset, address.base);
     117        if (!imm.m_value)
     118            return;
     119        add32AndSetFlags(imm, address);
    118120    }
    119121
    120122    void add32(TrustedImm32 imm, RegisterID dest)
    121123    {
    122         if (imm.m_value == 1)
    123             m_assembler.inc_r(dest);
    124         else
    125             m_assembler.addl_ir(imm.m_value, dest);
     124        if (!imm.m_value)
     125            return;
     126        add32AndSetFlags(imm, dest);
    126127    }
    127128   
     
    138139    void add32(TrustedImm32 imm, RegisterID src, RegisterID dest)
    139140    {
     141        if (!imm.m_value) {
     142            move(src, dest);
     143            return;
     144        }
     145
    140146        m_assembler.leal_mr(imm.m_value, src, dest);
    141147    }
     
    14011407    Jump branchAdd32(ResultCondition cond, TrustedImm32 imm, RegisterID dest)
    14021408    {
    1403         add32(imm, dest);
     1409        add32AndSetFlags(imm, dest);
    14041410        return Jump(m_assembler.jCC(x86Condition(cond)));
    14051411    }
     
    14071413    Jump branchAdd32(ResultCondition cond, TrustedImm32 src, Address dest)
    14081414    {
    1409         add32(src, dest);
     1415        add32AndSetFlags(src, dest);
    14101416        return Jump(m_assembler.jCC(x86Condition(cond)));
    14111417    }
     
    16831689        else
    16841690            m_assembler.testl_i32m(mask.m_value, address.offset, address.base);
     1691    }
     1692
     1693    void add32AndSetFlags(TrustedImm32 imm, RegisterID dest)
     1694    {
     1695        if (imm.m_value == 1)
     1696            m_assembler.inc_r(dest);
     1697        else
     1698            m_assembler.addl_ir(imm.m_value, dest);
     1699    }
     1700
     1701    void add32AndSetFlags(TrustedImm32 imm, Address address)
     1702    {
     1703        m_assembler.addl_im(imm.m_value, address.offset, address.base);
    16851704    }
    16861705
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h

    r192400 r192409  
    5858    void add32(TrustedImm32 imm, AbsoluteAddress address)
    5959    {
     60        if (!imm.m_value)
     61            return;
     62
    6063        move(TrustedImmPtr(address.m_ptr), scratchRegister);
    6164        add32(imm, Address(scratchRegister));
     
    269272    void add64(TrustedImm32 imm, RegisterID srcDest)
    270273    {
    271         if (imm.m_value == 1)
    272             m_assembler.incq_r(srcDest);
    273         else
    274             m_assembler.addq_ir(imm.m_value, srcDest);
    275     }
    276 
    277     void add64(TrustedImm64 imm, RegisterID dest)
    278     {
    279         if (imm.m_value == 1)
    280             m_assembler.incq_r(dest);
    281         else {
    282             move(imm, scratchRegister);
    283             add64(scratchRegister, dest);
    284         }
     274        if (!imm.m_value)
     275            return;
     276        add64AndSetFlags(imm, srcDest);
     277    }
     278
     279    void add64(TrustedImm64 imm, RegisterID srcDest)
     280    {
     281        if (!imm.m_value)
     282            return;
     283        add64AndSetFlags(imm, srcDest);
    285284    }
    286285
    287286    void add64(TrustedImm32 imm, RegisterID src, RegisterID dest)
    288287    {
     288        if (!imm.m_value) {
     289            move(src, dest);
     290            return;
     291        }
     292
    289293        m_assembler.leaq_mr(imm.m_value, src, dest);
    290294    }
     
    292296    void add64(TrustedImm32 imm, Address address)
    293297    {
     298        if (!imm.m_value)
     299            return;
     300
    294301        if (imm.m_value == 1)
    295302            m_assembler.incq_m(address.offset, address.base);
     
    300307    void add64(TrustedImm32 imm, AbsoluteAddress address)
    301308    {
     309        if (!imm.m_value)
     310            return;
     311
    302312        move(TrustedImmPtr(address.m_ptr), scratchRegister);
    303313        add64(imm, Address(scratchRegister));
     
    768778    Jump branchAdd64(ResultCondition cond, TrustedImm32 imm, RegisterID dest)
    769779    {
    770         add64(imm, dest);
     780        add64AndSetFlags(imm, dest);
    771781        return Jump(m_assembler.jCC(x86Condition(cond)));
    772782    }
     
    986996
    987997private:
     998    void add64AndSetFlags(TrustedImm32 imm, RegisterID srcDest)
     999    {
     1000        if (imm.m_value == 1)
     1001            m_assembler.incq_r(srcDest);
     1002        else
     1003            m_assembler.addq_ir(imm.m_value, srcDest);
     1004    }
     1005
     1006    void add64AndSetFlags(TrustedImm64 imm, RegisterID dest)
     1007    {
     1008        if (imm.m_value == 1)
     1009            m_assembler.incq_r(dest);
     1010        else {
     1011            move(imm, scratchRegister);
     1012            add64(scratchRegister, dest);
     1013        }
     1014    }
     1015
    9881016    friend class LinkBuffer;
    9891017
Note: See TracChangeset for help on using the changeset viewer.