Ignore:
Timestamp:
May 8, 2010, 1:03:31 PM (15 years ago)
Author:
[email protected]
Message:

2010-05-08 Gabor Loki <[email protected]>

Reviewed by Gavin Barraclough.

Fix halfword loads on ARM
https://bugs.webkit.org/show_bug.cgi?id=38741

The BaseIndex and ImplicitAddress are contain 32bit wide offset, but
the load16 functions were working with 8 bit data (encoded in the
instruction). If the offset cannot be encoded in an instruction, it
should be stored in a temporary register.

  • assembler/ARMAssembler.h: (JSC::ARMAssembler::getOffsetForHalfwordDataTransfer):
  • assembler/MacroAssemblerARM.h: (JSC::MacroAssemblerARM::load16):
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/assembler/MacroAssemblerARM.h

    r58904 r59038  
    268268    void load16(BaseIndex address, RegisterID dest)
    269269    {
    270         m_assembler.add_r(ARMRegisters::S0, address.base, m_assembler.lsl(address.index, address.scale));
    271         if (address.offset>=0)
    272             m_assembler.ldrh_u(dest, ARMRegisters::S0, ARMAssembler::getOp2Byte(address.offset));
    273         else
    274             m_assembler.ldrh_d(dest, ARMRegisters::S0, ARMAssembler::getOp2Byte(-address.offset));
     270        m_assembler.add_r(ARMRegisters::S1, address.base, m_assembler.lsl(address.index, address.scale));
     271        load16(Address(ARMRegisters::S1, address.offset), dest);
    275272    }
    276273   
     
    278275    {
    279276        if (address.offset >= 0)
    280             m_assembler.ldrh_u(dest, address.base, ARMAssembler::getOp2Byte(address.offset));
     277            m_assembler.ldrh_u(dest, address.base, m_assembler.getOffsetForHalfwordDataTransfer(address.offset, ARMRegisters::S0));
    281278        else
    282             m_assembler.ldrh_d(dest, address.base, ARMAssembler::getOp2Byte(-address.offset));   
     279            m_assembler.ldrh_d(dest, address.base, m_assembler.getOffsetForHalfwordDataTransfer(-address.offset, ARMRegisters::S0));
    283280    }
    284281
Note: See TracChangeset for help on using the changeset viewer.