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)