ARM assembler tweaks. (b=588021, r=cdleary)

This commit is contained in:
Jacob Bramley 2010-11-23 14:00:05 -08:00
Родитель 2465349e68
Коммит 22c639fb8d
3 изменённых файлов: 29 добавлений и 9 удалений

Просмотреть файл

@ -201,6 +201,11 @@ int ARMAssembler::genInt(int reg, ARMWord imm, bool positive)
return 1;
}
#ifdef __GNUC__
// If the result of this function isn't used, the caller should probably be
// using movImm.
__attribute__((warn_unused_result))
#endif
ARMWord ARMAssembler::getImm(ARMWord imm, int tmpReg, bool invert)
{
ARMWord tmp;

Просмотреть файл

@ -929,7 +929,9 @@ namespace JSC {
JmpDst label()
{
return JmpDst(m_buffer.size());
JmpDst label(m_buffer.size());
js::JaegerSpew(js::JSpew_Insns, IPFX "#label ((%d))\n", MAYBE_PAD, label.m_offset);
return label;
}
JmpDst align(int alignment)
@ -1050,10 +1052,11 @@ namespace JSC {
// Like repatchLoadPtrToLEA, this is specialized for our purpose.
ARMWord* insn = reinterpret_cast<ARMWord*>(from);
if ((*insn & 0x0ff00f00) == 0x05900000)
return;
ASSERT((*insn & 0xf00ff0ff) == 0x02800000);
return; // Valid ldr instruction
ASSERT((*insn & 0x0ff00000) == 0x02800000); // Valid add instruction
ASSERT((*insn & 0x00000f00) == 0x00000000); // Simple-to-handle immediates (no rotate)
*insn = (*insn & 0x0ff00f00) | 0x05900000;
*insn = (*insn & 0xf00ff0ff) | 0x05900000;
ExecutableAllocator::cacheFlush(insn, sizeof(ARMWord));
}
@ -1087,7 +1090,7 @@ namespace JSC {
ISPFX "##relinkJump ((%p)) jumps to ((%p))\n",
from, to);
patchPointerInternal(reinterpret_cast<intptr_t>(from) - sizeof(ARMWord), to);
patchPointerInternal(reinterpret_cast<intptr_t>(from), to);
}
static bool canRelinkJump(void* from, void* to)
@ -1110,14 +1113,14 @@ namespace JSC {
ISPFX "##relinkCall ((%p)) jumps to ((%p))\n",
from, to);
patchPointerInternal(reinterpret_cast<intptr_t>(from) - sizeof(ARMWord), to);
patchPointerInternal(reinterpret_cast<intptr_t>(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<ARMWord*>(code) + jump.m_offset / sizeof(ARMWord));
}
static void* getRelocatedAddress(void* code, JmpDst label)
@ -1129,7 +1132,7 @@ namespace JSC {
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)

Просмотреть файл

@ -277,6 +277,7 @@ public:
DataLabel32 load32WithAddressOffsetPatch(Address address, RegisterID dest)
{
ASSERT(address.base != ARMRegisters::S0);
DataLabel32 dataLabel(this);
m_assembler.ldr_un_imm(ARMRegisters::S0, 0);
m_assembler.dtr_ur(true, dest, address.base, ARMRegisters::S0);
@ -285,6 +286,8 @@ public:
DataLabel32 load64WithAddressOffsetPatch(Address address, RegisterID hi, RegisterID lo)
{
ASSERT(address.base != ARMRegisters::S0);
ASSERT(lo != ARMRegisters::S0);
DataLabel32 dataLabel(this);
m_assembler.ldr_un_imm(ARMRegisters::S0, 0);
m_assembler.add_r(ARMRegisters::S0, ARMRegisters::S0, address.base);
@ -316,6 +319,7 @@ public:
DataLabel32 store32WithAddressOffsetPatch(RegisterID src, Address address)
{
ASSERT(address.base != ARMRegisters::S0);
DataLabel32 dataLabel(this);
m_assembler.ldr_un_imm(ARMRegisters::S0, 0);
m_assembler.dtr_ur(false, src, address.base, ARMRegisters::S0);
@ -324,6 +328,9 @@ public:
DataLabel32 store64WithAddressOffsetPatch(RegisterID hi, RegisterID lo, Address address)
{
ASSERT(hi != ARMRegisters::S0);
ASSERT(lo != ARMRegisters::S0);
ASSERT(address.base != ARMRegisters::S0);
DataLabel32 dataLabel(this);
m_assembler.ldr_un_imm(ARMRegisters::S0, 0);
m_assembler.add_r(ARMRegisters::S0, ARMRegisters::S0, address.base);
@ -334,9 +341,14 @@ public:
DataLabel32 store64WithAddressOffsetPatch(Imm32 hi, RegisterID lo, Address address)
{
ASSERT(lo != ARMRegisters::S0);
ASSERT(lo != ARMRegisters::S1);
ASSERT(lo != address.base);
ASSERT(address.base != ARMRegisters::S0);
ASSERT(address.base != ARMRegisters::S1);
DataLabel32 dataLabel(this);
m_assembler.ldr_un_imm(ARMRegisters::S0, 0);
m_assembler.getImm(hi.m_value, ARMRegisters::S1);
m_assembler.moveImm(hi.m_value, ARMRegisters::S1);
m_assembler.add_r(ARMRegisters::S0, ARMRegisters::S0, address.base);
m_assembler.dtr_u(false, lo, ARMRegisters::S0, 0);
m_assembler.dtr_u(false, ARMRegisters::S1, ARMRegisters::S0, 4);