Changeset 220720 in webkit


Ignore:
Timestamp:
Aug 14, 2017 3:55:31 PM (7 years ago)
Author:
mark.lam@apple.com
Message:

Add some convenience utility accessor methods to MacroAssembler::CPUState.
https://bugs.webkit.org/show_bug.cgi?id=175549
<rdar://problem/33884868>

Reviewed by Saam Barati.

Previously, in order to read ProbeContext CPUState registers, we used to need to
do it this way:

ExecState* exec = reinterpret_cast<ExecState*>(cpu.fp());
uint32_t i32 = static_cast<uint32_t>(cpu.gpr(GPRInfo::regT0));
void* p = reinterpret_cast<void*>(cpu.gpr(GPRInfo::regT1));
uint64_t u64 = bitwise_cast<uint64_t>(cpu.fpr(FPRInfo::fpRegT0));

With this patch, we can now read them this way instead:

ExecState* exec = cpu.fp<ExecState*>();
uint32_t i32 = cpu.gpr<uint32_t>(GPRInfo::regT0);
void* p = cpu.gpr<void*>(GPRInfo::regT1);
uint64_t u64 = cpu.fpr<uint64_t>(FPRInfo::fpRegT0);

  • assembler/MacroAssembler.h:

(JSC:: const):
(JSC::MacroAssembler::CPUState::fpr const):
(JSC::MacroAssembler::CPUState::pc const):
(JSC::MacroAssembler::CPUState::fp const):
(JSC::MacroAssembler::CPUState::sp const):
(JSC::ProbeContext::pc):
(JSC::ProbeContext::fp):
(JSC::ProbeContext::sp):

Location:
trunk/Source/JavaScriptCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r220712 r220720  
     12017-08-14  Mark Lam  <mark.lam@apple.com>
     2
     3        Add some convenience utility accessor methods to MacroAssembler::CPUState.
     4        https://bugs.webkit.org/show_bug.cgi?id=175549
     5        <rdar://problem/33884868>
     6
     7        Reviewed by Saam Barati.
     8
     9        Previously, in order to read ProbeContext CPUState registers, we used to need to
     10        do it this way:
     11
     12            ExecState* exec = reinterpret_cast<ExecState*>(cpu.fp());
     13            uint32_t i32 = static_cast<uint32_t>(cpu.gpr(GPRInfo::regT0));
     14            void* p = reinterpret_cast<void*>(cpu.gpr(GPRInfo::regT1));
     15            uint64_t u64 = bitwise_cast<uint64_t>(cpu.fpr(FPRInfo::fpRegT0));
     16
     17        With this patch, we can now read them this way instead:
     18       
     19            ExecState* exec = cpu.fp<ExecState*>();
     20            uint32_t i32 = cpu.gpr<uint32_t>(GPRInfo::regT0);
     21            void* p = cpu.gpr<void*>(GPRInfo::regT1);
     22            uint64_t u64 = cpu.fpr<uint64_t>(FPRInfo::fpRegT0);
     23
     24        * assembler/MacroAssembler.h:
     25        (JSC:: const):
     26        (JSC::MacroAssembler::CPUState::fpr const):
     27        (JSC::MacroAssembler::CPUState::pc const):
     28        (JSC::MacroAssembler::CPUState::fp const):
     29        (JSC::MacroAssembler::CPUState::sp const):
     30        (JSC::ProbeContext::pc):
     31        (JSC::ProbeContext::fp):
     32        (JSC::ProbeContext::sp):
     33
    1342017-08-12  Filip Pizlo  <fpizlo@apple.com>
    235
  • trunk/Source/JavaScriptCore/assembler/MacroAssembler.h

    r220579 r220720  
    18641864    inline uintptr_t& spr(SPRegisterID);
    18651865    inline double& fpr(FPRegisterID);
    1866    
    1867     inline void*& pc();
    1868     inline void*& fp();
    1869     inline void*& sp();
    1870    
     1866
     1867    template<typename T, typename std::enable_if<std::is_integral<T>::value>::type* = nullptr>
     1868    T gpr(RegisterID) const;
     1869    template<typename T, typename std::enable_if<std::is_pointer<T>::value>::type* = nullptr>
     1870    T gpr(RegisterID) const;
     1871    template<typename T> T fpr(FPRegisterID) const;
     1872
     1873    void*& pc();
     1874    void*& fp();
     1875    void*& sp();
     1876    template<typename T> T pc() const;
     1877    template<typename T> T fp() const;
     1878    template<typename T> T sp() const;
     1879
    18711880    uintptr_t gprs[MacroAssembler::numberOfRegisters()];
    18721881    uintptr_t sprs[MacroAssembler::numberOfSPRegisters()];
     
    18901899    ASSERT(id >= MacroAssembler::firstFPRegister() && id <= MacroAssembler::lastFPRegister());
    18911900    return fprs[id];
     1901}
     1902
     1903template<typename T, typename std::enable_if<std::is_integral<T>::value>::type*>
     1904T MacroAssembler::CPUState::gpr(RegisterID id) const
     1905{
     1906    CPUState* cpu = const_cast<CPUState*>(this);
     1907    return static_cast<T>(cpu->gpr(id));
     1908}
     1909
     1910template<typename T, typename std::enable_if<std::is_pointer<T>::value>::type*>
     1911T MacroAssembler::CPUState::gpr(RegisterID id) const
     1912{
     1913    CPUState* cpu = const_cast<CPUState*>(this);
     1914    return reinterpret_cast<T>(cpu->gpr(id));
     1915}
     1916
     1917template<typename T>
     1918T MacroAssembler::CPUState::fpr(FPRegisterID id) const
     1919{
     1920    CPUState* cpu = const_cast<CPUState*>(this);
     1921    return bitwise_cast<T>(cpu->fpr(id));
    18921922}
    18931923
     
    19371967}
    19381968
     1969template<typename T>
     1970T MacroAssembler::CPUState::pc() const
     1971{
     1972    CPUState* cpu = const_cast<CPUState*>(this);
     1973    return reinterpret_cast<T>(cpu->pc());
     1974}
     1975
     1976template<typename T>
     1977T MacroAssembler::CPUState::fp() const
     1978{
     1979    CPUState* cpu = const_cast<CPUState*>(this);
     1980    return reinterpret_cast<T>(cpu->fp());
     1981}
     1982
     1983template<typename T>
     1984T MacroAssembler::CPUState::sp() const
     1985{
     1986    CPUState* cpu = const_cast<CPUState*>(this);
     1987    return reinterpret_cast<T>(cpu->sp());
     1988}
     1989
    19391990struct ProbeContext {
    19401991    using CPUState = MacroAssembler::CPUState;
     
    19582009    void*& fp() { return cpu.fp(); }
    19592010    void*& sp() { return cpu.sp(); }
     2011
     2012    template<typename T> T pc() { return cpu.pc<T>(); }
     2013    template<typename T> T fp() { return cpu.fp<T>(); }
     2014    template<typename T> T sp() { return cpu.sp<T>(); }
    19602015};
    19612016   
Note: See TracChangeset for help on using the changeset viewer.