2010-05-08  Gabor Loki  <loki@webkit.org>

        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):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@59038 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/JavaScriptCore/assembler/MacroAssemblerARM.h b/JavaScriptCore/assembler/MacroAssemblerARM.h
index 40d2e4a..7f11ca9 100644
--- a/JavaScriptCore/assembler/MacroAssemblerARM.h
+++ b/JavaScriptCore/assembler/MacroAssemblerARM.h
@@ -267,19 +267,16 @@
 
     void load16(BaseIndex address, RegisterID dest)
     {
-        m_assembler.add_r(ARMRegisters::S0, address.base, m_assembler.lsl(address.index, address.scale));
-        if (address.offset>=0)
-            m_assembler.ldrh_u(dest, ARMRegisters::S0, ARMAssembler::getOp2Byte(address.offset));
-        else
-            m_assembler.ldrh_d(dest, ARMRegisters::S0, ARMAssembler::getOp2Byte(-address.offset));
+        m_assembler.add_r(ARMRegisters::S1, address.base, m_assembler.lsl(address.index, address.scale));
+        load16(Address(ARMRegisters::S1, address.offset), dest);
     }
     
     void load16(ImplicitAddress address, RegisterID dest)
     {
         if (address.offset >= 0)
-            m_assembler.ldrh_u(dest, address.base, ARMAssembler::getOp2Byte(address.offset));
+            m_assembler.ldrh_u(dest, address.base, m_assembler.getOffsetForHalfwordDataTransfer(address.offset, ARMRegisters::S0));
         else
-            m_assembler.ldrh_d(dest, address.base, ARMAssembler::getOp2Byte(-address.offset));   
+            m_assembler.ldrh_d(dest, address.base, m_assembler.getOffsetForHalfwordDataTransfer(-address.offset, ARMRegisters::S0));
     }
 
     DataLabel32 store32WithAddressOffsetPatch(RegisterID src, Address address)