Title: [220720] trunk/Source/_javascript_Core
Revision
220720
Author
mark....@apple.com
Date
2017-08-14 15:55:31 -0700 (Mon, 14 Aug 2017)

Log 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):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (220719 => 220720)


--- trunk/Source/_javascript_Core/ChangeLog	2017-08-14 22:38:41 UTC (rev 220719)
+++ trunk/Source/_javascript_Core/ChangeLog	2017-08-14 22:55:31 UTC (rev 220720)
@@ -1,3 +1,36 @@
+2017-08-14  Mark Lam  <mark....@apple.com>
+
+        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):
+
 2017-08-12  Filip Pizlo  <fpi...@apple.com>
 
         Put the ScopedArgumentsTable's ScopeOffset array in some gigacage

Modified: trunk/Source/_javascript_Core/assembler/MacroAssembler.h (220719 => 220720)


--- trunk/Source/_javascript_Core/assembler/MacroAssembler.h	2017-08-14 22:38:41 UTC (rev 220719)
+++ trunk/Source/_javascript_Core/assembler/MacroAssembler.h	2017-08-14 22:55:31 UTC (rev 220720)
@@ -1863,11 +1863,20 @@
     inline uintptr_t& gpr(RegisterID);
     inline uintptr_t& spr(SPRegisterID);
     inline double& fpr(FPRegisterID);
-    
-    inline void*& pc();
-    inline void*& fp();
-    inline void*& sp();
-    
+
+    template<typename T, typename std::enable_if<std::is_integral<T>::value>::type* = nullptr>
+    T gpr(RegisterID) const;
+    template<typename T, typename std::enable_if<std::is_pointer<T>::value>::type* = nullptr>
+    T gpr(RegisterID) const;
+    template<typename T> T fpr(FPRegisterID) const;
+
+    void*& pc();
+    void*& fp();
+    void*& sp();
+    template<typename T> T pc() const;
+    template<typename T> T fp() const;
+    template<typename T> T sp() const;
+
     uintptr_t gprs[MacroAssembler::numberOfRegisters()];
     uintptr_t sprs[MacroAssembler::numberOfSPRegisters()];
     double fprs[MacroAssembler::numberOfFPRegisters()];
@@ -1891,6 +1900,27 @@
     return fprs[id];
 }
 
+template<typename T, typename std::enable_if<std::is_integral<T>::value>::type*>
+T MacroAssembler::CPUState::gpr(RegisterID id) const
+{
+    CPUState* cpu = const_cast<CPUState*>(this);
+    return static_cast<T>(cpu->gpr(id));
+}
+
+template<typename T, typename std::enable_if<std::is_pointer<T>::value>::type*>
+T MacroAssembler::CPUState::gpr(RegisterID id) const
+{
+    CPUState* cpu = const_cast<CPUState*>(this);
+    return reinterpret_cast<T>(cpu->gpr(id));
+}
+
+template<typename T>
+T MacroAssembler::CPUState::fpr(FPRegisterID id) const
+{
+    CPUState* cpu = const_cast<CPUState*>(this);
+    return bitwise_cast<T>(cpu->fpr(id));
+}
+
 inline void*& MacroAssembler::CPUState::pc()
 {
 #if CPU(X86) || CPU(X86_64)
@@ -1936,6 +1966,27 @@
 #endif
 }
 
+template<typename T>
+T MacroAssembler::CPUState::pc() const
+{
+    CPUState* cpu = const_cast<CPUState*>(this);
+    return reinterpret_cast<T>(cpu->pc());
+}
+
+template<typename T>
+T MacroAssembler::CPUState::fp() const
+{
+    CPUState* cpu = const_cast<CPUState*>(this);
+    return reinterpret_cast<T>(cpu->fp());
+}
+
+template<typename T>
+T MacroAssembler::CPUState::sp() const
+{
+    CPUState* cpu = const_cast<CPUState*>(this);
+    return reinterpret_cast<T>(cpu->sp());
+}
+
 struct ProbeContext {
     using CPUState = MacroAssembler::CPUState;
     using RegisterID = MacroAssembler::RegisterID;
@@ -1957,6 +2008,10 @@
     void*& pc() { return cpu.pc(); }
     void*& fp() { return cpu.fp(); }
     void*& sp() { return cpu.sp(); }
+
+    template<typename T> T pc() { return cpu.pc<T>(); }
+    template<typename T> T fp() { return cpu.fp<T>(); }
+    template<typename T> T sp() { return cpu.sp<T>(); }
 };
     
 } // namespace JSC
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to