2009-08-05 Zoltan Herczeg <zherczeg@inf.u-szeged.hu>
Reviewed by Gavin Barraclough.
Add JIT support for generic ARM port without optimizations.
https://bugs.webkit.org/show_bug.cgi?id=24986
All JIT optimizations are disabled.
Signed off by Zoltan Herczeg <zherczeg@inf.u-szeged.hu>
Signed off by Gabor Loki <loki@inf.u-szeged.hu>
* assembler/ARMAssembler.cpp:
(JSC::ARMAssembler::baseIndexTransfer32):
* assembler/AbstractMacroAssembler.h:
(JSC::AbstractMacroAssembler::Imm32::Imm32):
* assembler/MacroAssemblerARM.h:
(JSC::MacroAssemblerARM::store32):
(JSC::MacroAssemblerARM::move):
(JSC::MacroAssemblerARM::branch32):
(JSC::MacroAssemblerARM::add32):
(JSC::MacroAssemblerARM::sub32):
(JSC::MacroAssemblerARM::load32):
* bytecode/CodeBlock.h:
(JSC::CodeBlock::getBytecodeIndex):
* jit/JIT.h:
* jit/JITInlineMethods.h:
(JSC::JIT::restoreArgumentReference):
* jit/JITOpcodes.cpp:
* jit/JITStubs.cpp:
* jit/JITStubs.h:
(JSC::JITStackFrame::returnAddressSlot):
* wtf/Platform.h:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@46831 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/JavaScriptCore/assembler/MacroAssemblerARM.h b/JavaScriptCore/assembler/MacroAssemblerARM.h
index 27879a9..084e5e5 100644
--- a/JavaScriptCore/assembler/MacroAssemblerARM.h
+++ b/JavaScriptCore/assembler/MacroAssemblerARM.h
@@ -243,20 +243,26 @@
void store32(Imm32 imm, ImplicitAddress address)
{
- move(imm, ARM::S1);
+ if (imm.m_isPointer)
+ m_assembler.ldr_un_imm(ARM::S1, imm.m_value);
+ else
+ move(imm, ARM::S1);
store32(ARM::S1, address);
}
void store32(RegisterID src, void* address)
{
- m_assembler.moveImm(reinterpret_cast<ARMWord>(address), ARM::S0);
+ m_assembler.ldr_un_imm(ARM::S0, reinterpret_cast<ARMWord>(address));
m_assembler.dtr_u(false, src, ARM::S0, 0);
}
void store32(Imm32 imm, void* address)
{
- m_assembler.moveImm(reinterpret_cast<ARMWord>(address), ARM::S0);
- m_assembler.moveImm(imm.m_value, ARM::S1);
+ m_assembler.ldr_un_imm(ARM::S0, reinterpret_cast<ARMWord>(address));
+ if (imm.m_isPointer)
+ m_assembler.ldr_un_imm(ARM::S1, imm.m_value);
+ else
+ m_assembler.moveImm(imm.m_value, ARM::S1);
m_assembler.dtr_u(false, ARM::S1, ARM::S0, 0);
}
@@ -284,7 +290,10 @@
void move(Imm32 imm, RegisterID dest)
{
- m_assembler.moveImm(imm.m_value, dest);
+ if (imm.m_isPointer)
+ m_assembler.ldr_un_imm(dest, imm.m_value);
+ else
+ m_assembler.moveImm(imm.m_value, dest);
}
void move(RegisterID src, RegisterID dest)
@@ -294,7 +303,7 @@
void move(ImmPtr imm, RegisterID dest)
{
- m_assembler.mov_r(dest, m_assembler.getImm(reinterpret_cast<ARMWord>(imm.m_value), ARM::S0));
+ move(Imm32(imm), dest);
}
void swap(RegisterID reg1, RegisterID reg2)
@@ -324,7 +333,11 @@
Jump branch32(Condition cond, RegisterID left, Imm32 right)
{
- m_assembler.cmp_r(left, m_assembler.getImm(right.m_value, ARM::S0));
+ if (right.m_isPointer) {
+ m_assembler.ldr_un_imm(ARM::S0, right.m_value);
+ m_assembler.cmp_r(left, ARM::S0);
+ } else
+ m_assembler.cmp_r(left, m_assembler.getImm(right.m_value, ARM::S0));
return Jump(m_assembler.jmp(ARMCondition(cond)));
}
@@ -538,25 +551,25 @@
void add32(Imm32 imm, AbsoluteAddress address)
{
- m_assembler.moveImm(reinterpret_cast<ARMWord>(address.m_ptr), ARM::S1);
+ m_assembler.ldr_un_imm(ARM::S1, reinterpret_cast<ARMWord>(address.m_ptr));
m_assembler.dtr_u(true, ARM::S1, ARM::S1, 0);
add32(imm, ARM::S1);
- m_assembler.moveImm(reinterpret_cast<ARMWord>(address.m_ptr), ARM::S0);
+ m_assembler.ldr_un_imm(ARM::S0, reinterpret_cast<ARMWord>(address.m_ptr));
m_assembler.dtr_u(false, ARM::S1, ARM::S0, 0);
}
void sub32(Imm32 imm, AbsoluteAddress address)
{
- m_assembler.moveImm(reinterpret_cast<ARMWord>(address.m_ptr), ARM::S1);
+ m_assembler.ldr_un_imm(ARM::S1, reinterpret_cast<ARMWord>(address.m_ptr));
m_assembler.dtr_u(true, ARM::S1, ARM::S1, 0);
sub32(imm, ARM::S1);
- m_assembler.moveImm(reinterpret_cast<ARMWord>(address.m_ptr), ARM::S0);
+ m_assembler.ldr_un_imm(ARM::S0, reinterpret_cast<ARMWord>(address.m_ptr));
m_assembler.dtr_u(false, ARM::S1, ARM::S0, 0);
}
void load32(void* address, RegisterID dest)
{
- m_assembler.moveImm(reinterpret_cast<ARMWord>(address), ARM::S0);
+ m_assembler.ldr_un_imm(ARM::S0, reinterpret_cast<ARMWord>(address));
m_assembler.dtr_u(true, dest, ARM::S0, 0);
}