Changeset 194707 in webkit


Ignore:
Timestamp:
Jan 7, 2016, 11:42:49 AM (9 years ago)
Author:
mark.lam@apple.com
Message:

ARMv7 or32(TrustedImm32, AbsoluteAddress) may have a bug with its use of dataTempRegister.
https://bugs.webkit.org/show_bug.cgi?id=152833

Reviewed by Benjamin Poulain.

  • assembler/MacroAssemblerARM.h:

(JSC::MacroAssemblerARM::or32):

  • Added some assertions to make sure it is safe to use ARMRegisters::S0 as a temp.
  • assembler/MacroAssemblerARM64.h:

(JSC::MacroAssemblerARM64::or32):

  • Implement an optimization that avoids reloading the memoryTempRegister when the immediate is encodable as an instruction immediate.
  • assembler/MacroAssemblerARMv7.h:

(JSC::MacroAssemblerARMv7::or32):

  • Added an assertion to make sure it is safe to use the dataTempRegister as a temp.
  • Implement an optimization that avoids reloading the memoryTempRegister when the immediate is encodable as an instruction immediate. In the event that we cannot encode the immediate, we'll use the addressTempRegister as a temp, and reload it later.
Location:
trunk/Source/JavaScriptCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r194705 r194707  
     12016-01-07  Mark Lam  <mark.lam@apple.com>
     2
     3        ARMv7 or32(TrustedImm32, AbsoluteAddress) may have a bug with its use of dataTempRegister.
     4        https://bugs.webkit.org/show_bug.cgi?id=152833
     5
     6        Reviewed by Benjamin Poulain.
     7
     8        * assembler/MacroAssemblerARM.h:
     9        (JSC::MacroAssemblerARM::or32):
     10        - Added some assertions to make sure it is safe to use ARMRegisters::S0 as a temp.
     11        * assembler/MacroAssemblerARM64.h:
     12        (JSC::MacroAssemblerARM64::or32):
     13        - Implement an optimization that avoids reloading the memoryTempRegister when
     14          the immediate is encodable as an instruction immediate.
     15        * assembler/MacroAssemblerARMv7.h:
     16        (JSC::MacroAssemblerARMv7::or32):
     17        - Added an assertion to make sure it is safe to use the dataTempRegister as a temp.
     18        - Implement an optimization that avoids reloading the memoryTempRegister when
     19          the immediate is encodable as an instruction immediate.  In the event that we
     20          cannot encode the immediate, we'll use the addressTempRegister as a temp, and
     21          reload it later.
     22
    1232016-01-07  Konstantin Tokarev  <annulen@yandex.ru>
    224
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM.h

    r194698 r194707  
    240240    void or32(TrustedImm32 imm, RegisterID dest)
    241241    {
     242        ASSERT(dest != ARMRegisters::S0);
    242243        m_assembler.orrs(dest, dest, m_assembler.getImm(imm.m_value, ARMRegisters::S0));
    243244    }
     
    245246    void or32(TrustedImm32 imm, RegisterID src, RegisterID dest)
    246247    {
     248        ASSERT(src != ARMRegisters::S0);
    247249        m_assembler.orrs(dest, src, m_assembler.getImm(imm.m_value, ARMRegisters::S0));
    248250    }
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h

    r194663 r194707  
    538538    void or32(TrustedImm32 imm, AbsoluteAddress address)
    539539    {
    540         load32(address.m_ptr, getCachedMemoryTempRegisterIDAndInvalidate());
    541         or32(imm, memoryTempRegister, memoryTempRegister);
    542         store32(memoryTempRegister, address.m_ptr);
     540        LogicalImmediate logicalImm = LogicalImmediate::create32(imm.m_value);
     541        if (logicalImm.isValid()) {
     542            load32(address.m_ptr, getCachedDataTempRegisterIDAndInvalidate());
     543            m_assembler.orr<32>(dataTempRegister, dataTempRegister, logicalImm);
     544            store32(dataTempRegister, address.m_ptr);
     545        } else {
     546            load32(address.m_ptr, getCachedMemoryTempRegisterIDAndInvalidate());
     547            or32(imm, memoryTempRegister, memoryTempRegister);
     548            store32(memoryTempRegister, address.m_ptr);
     549        }
    543550    }
    544551
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h

    r194613 r194707  
    355355    void or32(TrustedImm32 imm, AbsoluteAddress address)
    356356    {
    357         move(TrustedImmPtr(address.m_ptr), addressTempRegister);
    358         load32(addressTempRegister, dataTempRegister);
    359         or32(imm, dataTempRegister, dataTempRegister);
    360         store32(dataTempRegister, addressTempRegister);
     357        ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm.m_value);
     358        if (armImm.isValid()) {
     359            move(TrustedImmPtr(address.m_ptr), addressTempRegister);
     360            load32(addressTempRegister, dataTempRegister);
     361            m_assembler.orr(dataTempRegister, dataTempRegister, armImm);
     362            store32(dataTempRegister, addressTempRegister);
     363        } else {
     364            move(TrustedImmPtr(address.m_ptr), addressTempRegister);
     365            load32(addressTempRegister, dataTempRegister);
     366            move(imm, addressTempRegister);
     367            m_assembler.orr(dataTempRegister, dataTempRegister, addressTempRegister);
     368            move(TrustedImmPtr(address.m_ptr), addressTempRegister);
     369            store32(dataTempRegister, addressTempRegister);
     370        }
    361371    }
    362372
     
    384394            m_assembler.orr(dest, src, armImm);
    385395        else {
     396            ASSERT(src != dataTempRegister);
    386397            move(imm, dataTempRegister);
    387398            m_assembler.orr(dest, src, dataTempRegister);
Note: See TracChangeset for help on using the changeset viewer.