Ignore:
Timestamp:
Jul 21, 2017, 1:44:33 PM (8 years ago)
Author:
[email protected]
Message:

Refactor MASM probe CPUState to use arrays for register storage.
https://bugs.webkit.org/show_bug.cgi?id=174694

Reviewed by Keith Miller.

Using arrays for register storage in CPUState allows us to do away with the
huge switch statements to decode each register id. We can now simply index into
the arrays.

With this patch, we now:

  1. Remove the need for macros for defining the list of CPU registers. We can go back to simple enums. This makes the code easier to read.
  1. Make the assembler the authority on register names. Most of this code is moved into the assembler from GPRInfo and FPRInfo. GPRInfo and FPRInfo now forwards to the assembler.
  1. Make the assembler the authority on the number of registers of each type.
  1. Fix a "bug" in ARMv7's lastRegister(). It was previously omitting lr and pc. This is inconsistent with how every other CPU architecture implements lastRegister(). This patch fixes it to return the true last GPR i.e. pc, but updates RegisterSet::reservedHardwareRegisters() to exclude those registers.
  • assembler/ARM64Assembler.h:

(JSC::ARM64Assembler::numberOfRegisters):
(JSC::ARM64Assembler::firstSPRegister):
(JSC::ARM64Assembler::lastSPRegister):
(JSC::ARM64Assembler::numberOfSPRegisters):
(JSC::ARM64Assembler::numberOfFPRegisters):
(JSC::ARM64Assembler::gprName):
(JSC::ARM64Assembler::sprName):
(JSC::ARM64Assembler::fprName):

  • assembler/ARMAssembler.h:

(JSC::ARMAssembler::numberOfRegisters):
(JSC::ARMAssembler::firstSPRegister):
(JSC::ARMAssembler::lastSPRegister):
(JSC::ARMAssembler::numberOfSPRegisters):
(JSC::ARMAssembler::numberOfFPRegisters):
(JSC::ARMAssembler::gprName):
(JSC::ARMAssembler::sprName):
(JSC::ARMAssembler::fprName):

  • assembler/ARMv7Assembler.h:

(JSC::ARMv7Assembler::lastRegister):
(JSC::ARMv7Assembler::numberOfRegisters):
(JSC::ARMv7Assembler::firstSPRegister):
(JSC::ARMv7Assembler::lastSPRegister):
(JSC::ARMv7Assembler::numberOfSPRegisters):
(JSC::ARMv7Assembler::numberOfFPRegisters):
(JSC::ARMv7Assembler::gprName):
(JSC::ARMv7Assembler::sprName):
(JSC::ARMv7Assembler::fprName):

  • assembler/AbstractMacroAssembler.h:

(JSC::AbstractMacroAssembler::numberOfRegisters):
(JSC::AbstractMacroAssembler::gprName):
(JSC::AbstractMacroAssembler::firstSPRegister):
(JSC::AbstractMacroAssembler::lastSPRegister):
(JSC::AbstractMacroAssembler::numberOfSPRegisters):
(JSC::AbstractMacroAssembler::sprName):
(JSC::AbstractMacroAssembler::numberOfFPRegisters):
(JSC::AbstractMacroAssembler::fprName):

  • assembler/MIPSAssembler.h:

(JSC::MIPSAssembler::numberOfRegisters):
(JSC::MIPSAssembler::firstSPRegister):
(JSC::MIPSAssembler::lastSPRegister):
(JSC::MIPSAssembler::numberOfSPRegisters):
(JSC::MIPSAssembler::numberOfFPRegisters):
(JSC::MIPSAssembler::gprName):
(JSC::MIPSAssembler::sprName):
(JSC::MIPSAssembler::fprName):

  • assembler/MacroAssembler.h:

(JSC::MacroAssembler::CPUState::gprName):
(JSC::MacroAssembler::CPUState::sprName):
(JSC::MacroAssembler::CPUState::fprName):
(JSC::MacroAssembler::CPUState::gpr):
(JSC::MacroAssembler::CPUState::spr):
(JSC::MacroAssembler::CPUState::fpr):
(JSC::MacroAssembler::CPUState::pc):
(JSC::MacroAssembler::CPUState::fp):
(JSC::MacroAssembler::CPUState::sp):
(JSC::ProbeContext::gpr):
(JSC::ProbeContext::spr):
(JSC::ProbeContext::fpr):
(JSC::ProbeContext::gprName):
(JSC::ProbeContext::sprName):
(JSC::ProbeContext::fprName):
(JSC::MacroAssembler::numberOfRegisters): Deleted.
(JSC::MacroAssembler::numberOfFPRegisters): Deleted.

  • assembler/MacroAssemblerARM.cpp:
  • assembler/MacroAssemblerARM64.cpp:

(JSC::arm64ProbeTrampoline):

  • assembler/MacroAssemblerARMv7.cpp:
  • assembler/MacroAssemblerPrinter.cpp:

(JSC::Printer::nextID):
(JSC::Printer::printAllRegisters):
(JSC::Printer::printPCRegister):
(JSC::Printer::printRegisterID):
(JSC::Printer::printAddress):

  • assembler/MacroAssemblerX86Common.cpp:
  • assembler/X86Assembler.h:

(JSC::X86Assembler::numberOfRegisters):
(JSC::X86Assembler::firstSPRegister):
(JSC::X86Assembler::lastSPRegister):
(JSC::X86Assembler::numberOfSPRegisters):
(JSC::X86Assembler::numberOfFPRegisters):
(JSC::X86Assembler::gprName):
(JSC::X86Assembler::sprName):
(JSC::X86Assembler::fprName):

  • jit/FPRInfo.h:

(JSC::FPRInfo::debugName):

  • jit/GPRInfo.h:

(JSC::GPRInfo::debugName):

  • jit/RegisterSet.cpp:

(JSC::RegisterSet::reservedHardwareRegisters):

File:
1 edited

Legend:

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

    r218782 r219740  
    109109} RegisterID;
    110110
     111// Currently, we don't have support for any special purpose registers.
     112typedef enum {
     113    firstInvalidSPR,
     114    lastInvalidSPR = -1,
     115} SPRegisterID;
     116
    111117typedef enum {
    112118    f0,
     
    149155public:
    150156    typedef MIPSRegisters::RegisterID RegisterID;
     157    typedef MIPSRegisters::SPRegisterID SPRegisterID;
    151158    typedef MIPSRegisters::FPRegisterID FPRegisterID;
    152159    typedef SegmentedVector<AssemblerLabel, 64> Jumps;
     
    154161    static constexpr RegisterID firstRegister() { return MIPSRegisters::r0; }
    155162    static constexpr RegisterID lastRegister() { return MIPSRegisters::r31; }
     163    static constexpr unsigned numberOfRegisters() { return lastRegister() - firstRegister() + 1; }
     164
     165    static constexpr SPRegisterID firstSPRegister() { return MIPSRegisters::firstInvalidSPR; }
     166    static constexpr SPRegisterID lastSPRegister() { return MIPSRegisters::lastInvalidSPR; }
     167    static constexpr unsigned numberOfSPRegisters() { return 0; }
    156168
    157169    static constexpr FPRegisterID firstFPRegister() { return MIPSRegisters::f0; }
    158170    static constexpr FPRegisterID lastFPRegister() { return MIPSRegisters::f31; }
     171    static constexpr unsigned numberOfFPRegisters() { return lastFPRegister() - firstFPRegister() + 1; }
     172   
     173    static const char* gprName(RegisterID id)
     174    {
     175        ASSERT(id >= firstRegister() && id <= lastRegister());
     176        static const char* const nameForRegister[numberOfRegisters()] = {
     177            "zero", "at", "v0", "v1",
     178            "a0", "a1", "a2", "a3",
     179            "t0", "t1", "t2", "t3",
     180            "t4", "t5", "t6", "t7"
     181        };
     182        return nameForRegister[id];
     183    }
     184
     185    static const char* sprName(SPRegisterID id)
     186    {
     187        // Currently, we don't have support for any special purpose registers.
     188        RELEASE_ASSERT_NOT_REACHED();
     189    }
     190
     191    static const char* fprName(FPRegisterID id)
     192    {
     193        ASSERT(id >= firstFPRegister() && id <= lastFPRegister());
     194        static const char* const nameForRegister[numberOfFPRegisters()] = {
     195            "f0", "f1", "f2", "f3",
     196            "f4", "f5", "f6", "f7",
     197            "f8", "f9", "f10", "f11",
     198            "f12", "f13", "f14", "f15"
     199            "f16", "f17", "f18", "f19"
     200            "f20", "f21", "f22", "f23"
     201            "f24", "f25", "f26", "f27"
     202            "f28", "f29", "f30", "f31"
     203        };
     204        return nameForRegister[id];
     205    }
    159206
    160207    MIPSAssembler()
Note: See TracChangeset for help on using the changeset viewer.