Ignore:
Timestamp:
Sep 29, 2013, 12:31:33 PM (12 years ago)
Author:
[email protected]
Message:

Refactor code for finding x86 scratch register.
https://bugs.webkit.org/show_bug.cgi?id=122072

Patch by Nadav Rotem <[email protected]> on 2013-09-29
Reviewed by Geoffrey Garen.

  • assembler/MacroAssemblerX86Common.h:

(JSC::MacroAssemblerX86Common::getUnusedRegister):
(JSC::MacroAssemblerX86Common::store8):
(JSC::MacroAssemblerX86Common::store16):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h

    r154298 r156617  
    602602        m_assembler.movb_i8m(imm.m_value, address.offset, address.base, address.index, address.scale);
    603603    }
    604    
     604
     605    static ALWAYS_INLINE RegisterID getUnusedRegister(BaseIndex address)
     606    {
     607        if (address.base != X86Registers::eax && address.index != X86Registers::eax)
     608            return X86Registers::eax;
     609
     610        if (address.base != X86Registers::ebx && address.index != X86Registers::ebx)
     611            return X86Registers::ebx;
     612
     613        ASSERT(address.base != X86Registers::ecx && address.index != X86Registers::ecx);
     614        return X86Registers::ecx;
     615    }
     616
    605617    void store8(RegisterID src, BaseIndex address)
    606618    {
     
    610622        if (src >= 4) {
    611623            // Pick a temporary register.
    612             RegisterID temp;
    613             if (address.base != X86Registers::eax && address.index != X86Registers::eax)
    614                 temp = X86Registers::eax;
    615             else if (address.base != X86Registers::ebx && address.index != X86Registers::ebx)
    616                 temp = X86Registers::ebx;
    617             else {
    618                 ASSERT(address.base != X86Registers::ecx && address.index != X86Registers::ecx);
    619                 temp = X86Registers::ecx;
    620             }
     624            RegisterID temp = getUnusedRegister(address);
    621625
    622626            // Swap to the temporary register to perform the store.
     
    637641        if (src >= 4) {
    638642            // Pick a temporary register.
    639             RegisterID temp;
    640             if (address.base != X86Registers::eax && address.index != X86Registers::eax)
    641                 temp = X86Registers::eax;
    642             else if (address.base != X86Registers::ebx && address.index != X86Registers::ebx)
    643                 temp = X86Registers::ebx;
    644             else {
    645                 ASSERT(address.base != X86Registers::ecx && address.index != X86Registers::ecx);
    646                 temp = X86Registers::ecx;
    647             }
    648            
     643            RegisterID temp = getUnusedRegister(address);
     644
    649645            // Swap to the temporary register to perform the store.
    650646            swap(src, temp);
Note: See TracChangeset for help on using the changeset viewer.