Changeset 52977 in webkit for trunk/JavaScriptCore/assembler


Ignore:
Timestamp:
Jan 8, 2010, 12:01:40 AM (15 years ago)
Author:
[email protected]
Message:

Remove an unnecessary cacheFlush from ARM_TRADITIONAL JIT
https://bugs.webkit.org/show_bug.cgi?id=33203

Reviewed by Gavin Barraclough.

  • assembler/ARMAssembler.cpp: Remove obsolete linkBranch function.

(JSC::ARMAssembler::executableCopy): Inline a clean linkBranch code.

  • assembler/ARMAssembler.h:

(JSC::ARMAssembler::getLdrImmAddress): Use inline function.
(JSC::ARMAssembler::getLdrImmAddressOnPool): Ditto.
(JSC::ARMAssembler::patchPointerInternal): Remove an unnecessary cacheFlush.
(JSC::ARMAssembler::linkJump): Use patchPointerInternal instead of linkBranch.
(JSC::ARMAssembler::linkCall): Ditto.
(JSC::ARMAssembler::relinkCall): Ditto.

Location:
trunk/JavaScriptCore/assembler
Files:
2 edited

Legend:

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

    r52797 r52977  
    3535// Patching helpers
    3636
    37 ARMWord* ARMAssembler::getLdrImmAddress(ARMWord* insn, uint32_t* constPool)
    38 {
    39     // Must be an ldr ..., [pc +/- imm]
    40     ASSERT((*insn & 0x0f7f0000) == 0x051f0000);
    41 
    42     if (constPool && (*insn & 0x1))
    43         return reinterpret_cast<ARMWord*>(constPool + ((*insn & SDT_OFFSET_MASK) >> 1));
    44 
    45     ARMWord addr = reinterpret_cast<ARMWord>(insn) + 2 * sizeof(ARMWord);
    46     if (*insn & DT_UP)
    47         return reinterpret_cast<ARMWord*>(addr + (*insn & SDT_OFFSET_MASK));
    48     else
    49         return reinterpret_cast<ARMWord*>(addr - (*insn & SDT_OFFSET_MASK));
    50 }
    51 
    52 void ARMAssembler::linkBranch(void* code, JmpSrc from, void* to, int useConstantPool)
    53 {
    54     ARMWord* insn = reinterpret_cast<ARMWord*>(code) + (from.m_offset / sizeof(ARMWord));
    55 
    56     if (!useConstantPool) {
    57         int diff = reinterpret_cast<ARMWord*>(to) - reinterpret_cast<ARMWord*>(insn + 2);
    58 
    59         if ((diff <= BOFFSET_MAX && diff >= BOFFSET_MIN)) {
    60             *insn = B | getConditionalField(*insn) | (diff & BRANCH_MASK);
    61             ExecutableAllocator::cacheFlush(insn, sizeof(ARMWord));
    62             return;
    63         }
    64     }
    65     ARMWord* addr = getLdrImmAddress(insn);
    66     *addr = reinterpret_cast<ARMWord>(to);
    67     ExecutableAllocator::cacheFlush(addr, sizeof(ARMWord));
    68 }
    69 
    7037void ARMAssembler::patchConstantPoolLoad(void* loadAddr, void* constPoolAddr)
    7138{
     
    389356        int pos = (*iter) & (~0x1);
    390357        ARMWord* ldrAddr = reinterpret_cast<ARMWord*>(data + pos);
    391         ARMWord offset = *getLdrImmAddress(ldrAddr);
    392         if (offset != 0xffffffff) {
    393             JmpSrc jmpSrc(pos);
    394             linkBranch(data, jmpSrc, data + offset, ((*iter) & 1));
     358        ARMWord* addr = getLdrImmAddress(ldrAddr);
     359        if (*addr != 0xffffffff) {
     360            if (!(*iter & 1)) {
     361                int diff = reinterpret_cast<ARMWord*>(data + *addr) - (ldrAddr + DefaultPrefetching);
     362
     363                if ((diff <= BOFFSET_MAX && diff >= BOFFSET_MIN)) {
     364                    *ldrAddr = B | getConditionalField(*ldrAddr) | (diff & BRANCH_MASK);
     365                    continue;
     366                }
     367            }
     368            *addr = reinterpret_cast<ARMWord>(data + *addr);
    395369        }
    396370    }
  • trunk/JavaScriptCore/assembler/ARMAssembler.h

    r52797 r52977  
    184184
    185185        static const ARMWord INVALID_IMM = 0xf0000000;
     186        static const int DefaultPrefetching = 2;
    186187
    187188        class JmpSrc {
     
    633634        // Patching helpers
    634635
    635         static ARMWord* getLdrImmAddress(ARMWord* insn, uint32_t* constPool = 0);
    636         static void linkBranch(void* code, JmpSrc from, void* to, int useConstantPool = 0);
     636        static ARMWord* getLdrImmAddress(ARMWord* insn)
     637        {
     638            // Must be an ldr ..., [pc +/- imm]
     639            ASSERT((*insn & 0x0f7f0000) == 0x051f0000);
     640
     641            ARMWord addr = reinterpret_cast<ARMWord>(insn) + DefaultPrefetching * sizeof(ARMWord);
     642            if (*insn & DT_UP)
     643                return reinterpret_cast<ARMWord*>(addr + (*insn & SDT_OFFSET_MASK));
     644            return reinterpret_cast<ARMWord*>(addr - (*insn & SDT_OFFSET_MASK));
     645        }
     646
     647        static ARMWord* getLdrImmAddressOnPool(ARMWord* insn, uint32_t* constPool)
     648        {
     649            // Must be an ldr ..., [pc +/- imm]
     650            ASSERT((*insn & 0x0f7f0000) == 0x051f0000);
     651
     652            if (*insn & 0x1)
     653                return reinterpret_cast<ARMWord*>(constPool + ((*insn & SDT_OFFSET_MASK) >> 1));
     654            return getLdrImmAddress(insn);
     655        }
    637656
    638657        static void patchPointerInternal(intptr_t from, void* to)
     
    641660            ARMWord* addr = getLdrImmAddress(insn);
    642661            *addr = reinterpret_cast<ARMWord>(to);
    643             ExecutableAllocator::cacheFlush(addr, sizeof(ARMWord));
    644662        }
    645663
     
    686704        {
    687705            ARMWord* insn = reinterpret_cast<ARMWord*>(m_buffer.data()) + (from.m_offset / sizeof(ARMWord));
    688             *getLdrImmAddress(insn, m_buffer.poolAddress()) = static_cast<ARMWord>(to.m_offset);
     706            ARMWord* addr = getLdrImmAddressOnPool(insn, m_buffer.poolAddress());
     707            *addr = static_cast<ARMWord>(to.m_offset);
    689708        }
    690709
    691710        static void linkJump(void* code, JmpSrc from, void* to)
    692711        {
    693             linkBranch(code, from, to);
     712            patchPointerInternal(reinterpret_cast<intptr_t>(code) + from.m_offset, to);
    694713        }
    695714
     
    701720        static void linkCall(void* code, JmpSrc from, void* to)
    702721        {
    703             linkBranch(code, from, to, true);
     722            patchPointerInternal(reinterpret_cast<intptr_t>(code) + from.m_offset, to);
    704723        }
    705724
    706725        static void relinkCall(void* from, void* to)
    707726        {
    708             relinkJump(from, to);
     727            patchPointerInternal(reinterpret_cast<intptr_t>(from) - sizeof(ARMWord), to);
    709728        }
    710729
Note: See TracChangeset for help on using the changeset viewer.