2010-11-24 Gabor Loki <loki@webkit.org>
Reviewed by Csaba Osztrogonác.
Merge the usage of jumps and calls at ARM-JIT
https://bugs.webkit.org/show_bug.cgi?id=50008
Those JmpSrc objects which represent jumps (not calls) should point to
after the jump instruction.
* assembler/ARMAssembler.h:
(JSC::ARMAssembler::blx):
(JSC::ARMAssembler::loadBranchTarget):
(JSC::ARMAssembler::getAbsoluteJumpAddress):
(JSC::ARMAssembler::linkJump):
(JSC::ARMAssembler::relinkJump):
(JSC::ARMAssembler::linkCall):
(JSC::ARMAssembler::relinkCall):
(JSC::ARMAssembler::getRelocatedAddress):
(JSC::ARMAssembler::getDifferenceBetweenLabels):
(JSC::ARMAssembler::getCallReturnOffset):
* assembler/MacroAssemblerARM.h:
(JSC::MacroAssemblerARM::call):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@72663 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/JavaScriptCore/assembler/ARMAssembler.h b/JavaScriptCore/assembler/ARMAssembler.h
index 900f655..1d24dd3 100644
--- a/JavaScriptCore/assembler/ARMAssembler.h
+++ b/JavaScriptCore/assembler/ARMAssembler.h
@@ -624,16 +624,14 @@
JmpSrc blx(int rm, Condition cc = AL)
{
#if WTF_ARM_ARCH_AT_LEAST(5)
- int s = m_buffer.uncheckedSize();
emitInst(static_cast<ARMWord>(cc) | BLX, 0, 0, RM(rm));
#else
ASSERT(rm != 14);
ensureSpace(2 * sizeof(ARMWord), 0);
mov_r(ARMRegisters::lr, ARMRegisters::pc, cc);
- int s = m_buffer.uncheckedSize();
bx(rm, cc);
#endif
- return JmpSrc(s);
+ return JmpSrc(m_buffer.uncheckedSize());
}
static ARMWord lsl(int reg, ARMWord value)
@@ -711,10 +709,9 @@
JmpSrc loadBranchTarget(int rd, Condition cc = AL, int useConstantPool = 0)
{
ensureSpace(sizeof(ARMWord), sizeof(ARMWord));
- int s = m_buffer.uncheckedSize();
+ m_jumps.append(m_buffer.uncheckedSize() | (useConstantPool & 0x1));
ldr_un_imm(rd, InvalidBranchTarget, cc);
- m_jumps.append(s | (useConstantPool & 0x1));
- return JmpSrc(s);
+ return JmpSrc(m_buffer.uncheckedSize());
}
JmpSrc jmp(Condition cc = AL, int useConstantPool = 0)
@@ -800,51 +797,55 @@
}
// Linkers
+ static intptr_t getAbsoluteJumpAddress(void* base, int offset = 0)
+ {
+ return reinterpret_cast<intptr_t>(base) + offset - sizeof(ARMWord);
+ }
void linkJump(JmpSrc from, JmpDst to)
{
- ARMWord* insn = reinterpret_cast<ARMWord*>(m_buffer.data()) + (from.m_offset / sizeof(ARMWord));
+ ARMWord* insn = reinterpret_cast<ARMWord*>(getAbsoluteJumpAddress(m_buffer.data(), from.m_offset));
ARMWord* addr = getLdrImmAddressOnPool(insn, m_buffer.poolAddress());
*addr = static_cast<ARMWord>(to.m_offset);
}
static void linkJump(void* code, JmpSrc from, void* to)
{
- patchPointerInternal(reinterpret_cast<intptr_t>(code) + from.m_offset, to);
+ patchPointerInternal(getAbsoluteJumpAddress(code, from.m_offset), to);
}
static void relinkJump(void* from, void* to)
{
- patchPointerInternal(reinterpret_cast<intptr_t>(from) - sizeof(ARMWord), to);
+ patchPointerInternal(getAbsoluteJumpAddress(from), to);
}
static void linkCall(void* code, JmpSrc from, void* to)
{
- patchPointerInternal(reinterpret_cast<intptr_t>(code) + from.m_offset, to);
+ patchPointerInternal(getAbsoluteJumpAddress(code, from.m_offset), to);
}
static void relinkCall(void* from, void* to)
{
- patchPointerInternal(reinterpret_cast<intptr_t>(from) - sizeof(ARMWord), to);
+ patchPointerInternal(getAbsoluteJumpAddress(from), to);
}
// Address operations
static void* getRelocatedAddress(void* code, JmpSrc jump)
{
- return reinterpret_cast<void*>(reinterpret_cast<ARMWord*>(code) + jump.m_offset / sizeof(ARMWord) + 1);
+ return reinterpret_cast<void*>(reinterpret_cast<char*>(code) + jump.m_offset);
}
static void* getRelocatedAddress(void* code, JmpDst label)
{
- return reinterpret_cast<void*>(reinterpret_cast<ARMWord*>(code) + label.m_offset / sizeof(ARMWord));
+ return reinterpret_cast<void*>(reinterpret_cast<char*>(code) + label.m_offset);
}
// Address differences
static int getDifferenceBetweenLabels(JmpDst from, JmpSrc to)
{
- return (to.m_offset + sizeof(ARMWord)) - from.m_offset;
+ return to.m_offset - from.m_offset;
}
static int getDifferenceBetweenLabels(JmpDst from, JmpDst to)
@@ -854,7 +855,7 @@
static unsigned getCallReturnOffset(JmpSrc call)
{
- return call.m_offset + sizeof(ARMWord);
+ return call.m_offset;
}
// Handle immediates
diff --git a/JavaScriptCore/assembler/MacroAssemblerARM.h b/JavaScriptCore/assembler/MacroAssemblerARM.h
index ab6104d..c51686a 100644
--- a/JavaScriptCore/assembler/MacroAssemblerARM.h
+++ b/JavaScriptCore/assembler/MacroAssemblerARM.h
@@ -615,9 +615,7 @@
Call call(RegisterID target)
{
- m_assembler.blx(target);
- JmpSrc jmpSrc;
- return Call(jmpSrc, Call::None);
+ return Call(m_assembler.blx(target), Call::None);
}
void call(Address address)