Ignore:
Timestamp:
Nov 10, 2011, 1:41:04 PM (14 years ago)
Author:
[email protected]
Message:

Add ARMv7 register info for the DFG JIT
https://bugs.webkit.org/show_bug.cgi?id=72050

Reviewed by Geoff Garen.

  • dfg/DFGFPRInfo.h:

(JSC::DFG::FPRInfo::toRegister):
(JSC::DFG::FPRInfo::toIndex):
(JSC::DFG::FPRInfo::debugName):

  • dfg/DFGGPRInfo.h:

(JSC::DFG::GPRInfo::toRegister):
(JSC::DFG::GPRInfo::toIndex):
(JSC::DFG::GPRInfo::debugName):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/dfg/DFGGPRInfo.h

    r98912 r99895  
    252252
    253253#if CPU(X86)
     254#define NUMBER_OF_ARGUMENT_REGISTERS 0
    254255
    255256class GPRInfo {
     
    258259    static const unsigned numberOfRegisters = 5;
    259260
    260     // These registers match the baseline JIT.
    261     static const GPRReg cachedResultRegister = X86Registers::eax;
    262     static const GPRReg cachedResultRegister2 = X86Registers::edx;
    263     static const GPRReg callFrameRegister = X86Registers::edi;
    264261    // Temporary registers.
    265262    static const GPRReg regT0 = X86Registers::eax;
     
    268265    static const GPRReg regT3 = X86Registers::ebx;
    269266    static const GPRReg regT4 = X86Registers::esi;
     267    // These registers match the baseline JIT.
     268    static const GPRReg cachedResultRegister = regT0;
     269    static const GPRReg cachedResultRegister2 = regT1;
     270    static const GPRReg callFrameRegister = X86Registers::edi;
    270271    // These constants provide the names for the general purpose argument & return value registers.
    271272    static const GPRReg argumentGPR0 = X86Registers::ecx; // regT2
     
    311312
    312313#if CPU(X86_64)
     314#define NUMBER_OF_ARGUMENT_REGISTERS 6
    313315
    314316class GPRInfo {
     
    338340    static const GPRReg argumentGPR2 = X86Registers::edx; // regT1
    339341    static const GPRReg argumentGPR3 = X86Registers::ecx; // regT2
     342    static const GPRReg argumentGPR4 = X86Registers::r8;  // regT6
     343    static const GPRReg argumentGPR5 = X86Registers::r9;  // regT7
    340344    static const GPRReg returnValueGPR = X86Registers::eax; // regT0
    341345    static const GPRReg returnValueGPR2 = X86Registers::edx; // regT1
     
    379383#endif
    380384
     385#if CPU(ARM_THUMB2)
     386#define NUMBER_OF_ARGUMENT_REGISTERS 4
     387
     388class GPRInfo {
     389public:
     390    typedef GPRReg RegisterType;
     391    static const unsigned numberOfRegisters = 9;
     392
     393    // Temporary registers.
     394    static const GPRReg regT0 = ARMRegisters::r0;
     395    static const GPRReg regT1 = ARMRegisters::r1;
     396    static const GPRReg regT2 = ARMRegisters::r2;
     397    static const GPRReg regT3 = ARMRegisters::r4;
     398    static const GPRReg regT4 = ARMRegisters::r7;
     399    static const GPRReg regT5 = ARMRegisters::r8;
     400    static const GPRReg regT6 = ARMRegisters::r9;
     401    static const GPRReg regT7 = ARMRegisters::r10;
     402    static const GPRReg regT8 = ARMRegisters::r11;
     403    // These registers match the baseline JIT.
     404    static const GPRReg cachedResultRegister = regT0;
     405    static const GPRReg cachedResultRegister2 = regT1;
     406    static const GPRReg callFrameRegister = ARMRegisters::r5;
     407    // These constants provide the names for the general purpose argument & return value registers.
     408    static const GPRReg argumentGPR0 = ARMRegisters::r0; // regT0
     409    static const GPRReg argumentGPR1 = ARMRegisters::r1; // regT1
     410    static const GPRReg argumentGPR2 = ARMRegisters::r2; // regT2
     411    // FIXME: r3 is currently used be the MacroAssembler as a temporary - it seems
     412    // This could threoretically be a problem if theis is used in code generation
     413    // between the arguments being set up, and the call being made. That said,
     414    // any change introducing a problem here is likely to be immediately apparent!
     415    static const GPRReg argumentGPR3 = ARMRegisters::r3; // FIXME!
     416    static const GPRReg returnValueGPR = ARMRegisters::r0; // regT0
     417    static const GPRReg returnValueGPR2 = ARMRegisters::r1; // regT1
     418
     419    static GPRReg toRegister(unsigned index)
     420    {
     421        ASSERT(index < numberOfRegisters);
     422        static const GPRReg registerForIndex[numberOfRegisters] = { regT0, regT1, regT2, regT3, regT4, regT5, regT6, regT7, regT8 };
     423        return registerForIndex[index];
     424    }
     425
     426    static unsigned toIndex(GPRReg reg)
     427    {
     428        ASSERT(reg != InvalidGPRReg);
     429        ASSERT(reg < 16);
     430        static const unsigned indexForRegister[16] = { 0, 1, 2, InvalidIndex, 3, InvalidIndex, InvalidIndex, 4, 5, 6, 7, 8, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex };
     431        unsigned result = indexForRegister[reg];
     432        ASSERT(result != InvalidIndex);
     433        return result;
     434    }
     435
     436#ifndef NDEBUG
     437    static const char* debugName(GPRReg reg)
     438    {
     439        ASSERT(reg != InvalidGPRReg);
     440        ASSERT(reg < 16);
     441        static const char* nameForRegister[16] = {
     442            "r0", "r1", "r2", "r3",
     443            "r4", "r5", "r6", "r7",
     444            "r8", "r9", "r10", "r11",
     445            "r12", "r13", "r14", "r15"
     446        };
     447        return nameForRegister[reg];
     448    }
     449#endif
     450private:
     451
     452    static const unsigned InvalidIndex = 0xffffffff;
     453};
     454
     455#endif
     456
    381457typedef RegisterBank<GPRInfo>::iterator gpr_iterator;
    382458
Note: See TracChangeset for help on using the changeset viewer.