Add some convenience utility accessor methods to MacroAssembler::CPUState.
[WebKit-https.git] / Source / JavaScriptCore / assembler / MacroAssembler.h
index f8b2958..65977f0 100644 (file)
@@ -1863,11 +1863,20 @@ struct MacroAssembler::CPUState {
     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 @@ inline double& MacroAssembler::CPUState::fpr(FPRegisterID id)
     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 @@ inline void*& MacroAssembler::CPUState::sp()
 #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 @@ struct ProbeContext {
     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