Ignore:
Timestamp:
Nov 24, 2010, 5:04:35 AM (15 years ago)
Author:
[email protected]
Message:

2010-11-24 Gabor Loki <[email protected]>

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):
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/assembler/ARMAssembler.h

    r70752 r72663  
    625625        {
    626626#if WTF_ARM_ARCH_AT_LEAST(5)
    627             int s = m_buffer.uncheckedSize();
    628627            emitInst(static_cast<ARMWord>(cc) | BLX, 0, 0, RM(rm));
    629628#else
     
    631630            ensureSpace(2 * sizeof(ARMWord), 0);
    632631            mov_r(ARMRegisters::lr, ARMRegisters::pc, cc);
    633             int s = m_buffer.uncheckedSize();
    634632            bx(rm, cc);
    635633#endif
    636             return JmpSrc(s);
     634            return JmpSrc(m_buffer.uncheckedSize());
    637635        }
    638636
     
    712710        {
    713711            ensureSpace(sizeof(ARMWord), sizeof(ARMWord));
    714             int s = m_buffer.uncheckedSize();
     712            m_jumps.append(m_buffer.uncheckedSize() | (useConstantPool & 0x1));
    715713            ldr_un_imm(rd, InvalidBranchTarget, cc);
    716             m_jumps.append(s | (useConstantPool & 0x1));
    717             return JmpSrc(s);
     714            return JmpSrc(m_buffer.uncheckedSize());
    718715        }
    719716
     
    801798
    802799        // Linkers
     800        static intptr_t getAbsoluteJumpAddress(void* base, int offset = 0)
     801        {
     802            return reinterpret_cast<intptr_t>(base) + offset - sizeof(ARMWord);
     803        }
    803804
    804805        void linkJump(JmpSrc from, JmpDst to)
    805806        {
    806             ARMWord* insn = reinterpret_cast<ARMWord*>(m_buffer.data()) + (from.m_offset / sizeof(ARMWord));
     807            ARMWord* insn = reinterpret_cast<ARMWord*>(getAbsoluteJumpAddress(m_buffer.data(), from.m_offset));
    807808            ARMWord* addr = getLdrImmAddressOnPool(insn, m_buffer.poolAddress());
    808809            *addr = static_cast<ARMWord>(to.m_offset);
     
    811812        static void linkJump(void* code, JmpSrc from, void* to)
    812813        {
    813             patchPointerInternal(reinterpret_cast<intptr_t>(code) + from.m_offset, to);
     814            patchPointerInternal(getAbsoluteJumpAddress(code, from.m_offset), to);
    814815        }
    815816
    816817        static void relinkJump(void* from, void* to)
    817818        {
    818             patchPointerInternal(reinterpret_cast<intptr_t>(from) - sizeof(ARMWord), to);
     819            patchPointerInternal(getAbsoluteJumpAddress(from), to);
    819820        }
    820821
    821822        static void linkCall(void* code, JmpSrc from, void* to)
    822823        {
    823             patchPointerInternal(reinterpret_cast<intptr_t>(code) + from.m_offset, to);
     824            patchPointerInternal(getAbsoluteJumpAddress(code, from.m_offset), to);
    824825        }
    825826
    826827        static void relinkCall(void* from, void* to)
    827828        {
    828             patchPointerInternal(reinterpret_cast<intptr_t>(from) - sizeof(ARMWord), to);
     829            patchPointerInternal(getAbsoluteJumpAddress(from), to);
    829830        }
    830831
     
    833834        static void* getRelocatedAddress(void* code, JmpSrc jump)
    834835        {
    835             return reinterpret_cast<void*>(reinterpret_cast<ARMWord*>(code) + jump.m_offset / sizeof(ARMWord) + 1);
     836            return reinterpret_cast<void*>(reinterpret_cast<char*>(code) + jump.m_offset);
    836837        }
    837838
    838839        static void* getRelocatedAddress(void* code, JmpDst label)
    839840        {
    840             return reinterpret_cast<void*>(reinterpret_cast<ARMWord*>(code) + label.m_offset / sizeof(ARMWord));
     841            return reinterpret_cast<void*>(reinterpret_cast<char*>(code) + label.m_offset);
    841842        }
    842843
     
    845846        static int getDifferenceBetweenLabels(JmpDst from, JmpSrc to)
    846847        {
    847             return (to.m_offset + sizeof(ARMWord)) - from.m_offset;
     848            return to.m_offset - from.m_offset;
    848849        }
    849850
     
    855856        static unsigned getCallReturnOffset(JmpSrc call)
    856857        {
    857             return call.m_offset + sizeof(ARMWord);
     858            return call.m_offset;
    858859        }
    859860
Note: See TracChangeset for help on using the changeset viewer.