Changeset 59038 in webkit for trunk/JavaScriptCore/assembler


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):
Location:
trunk/JavaScriptCore/assembler
Files:
2 edited

Legend:

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

    r58515 r59038  
    826826        ARMWord encodeComplexImm(ARMWord imm, int dest);
    827827
     828        ARMWord getOffsetForHalfwordDataTransfer(ARMWord imm, int tmpReg)
     829        {
     830            // Encode immediate data in the instruction if it is possible
     831            if (imm <= 0xff)
     832                return getOp2Byte(imm);
     833            // Otherwise, store the data in a temporary register
     834            return encodeComplexImm(imm, tmpReg);
     835        }
     836
    828837        // Memory load/store helpers
    829838
  • 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.