From 299019ea158d794e599e5bdf739d98285e64d9f6 Mon Sep 17 00:00:00 2001 From: Randy Heit Date: Tue, 29 Mar 2016 22:24:59 -0500 Subject: [PATCH] Add GetValueFloat() for numeric PTypes --- src/dobjtype.cpp | 56 ++++++++++++++++++++++++++++++++++++++++++++++-- src/dobjtype.h | 5 +++++ 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/src/dobjtype.cpp b/src/dobjtype.cpp index 0a964917c..552b8ee68 100644 --- a/src/dobjtype.cpp +++ b/src/dobjtype.cpp @@ -412,6 +412,12 @@ int PType::GetValueInt(void *addr) const return 0; } +double PType::GetValueFloat(void *addr) const +{ + assert(0 && "Cannot get value for this type"); + return 0; +} + //========================================================================== // // PType :: GetStoreOp @@ -724,6 +730,17 @@ int PInt::GetValueInt(void *addr) const } } +//========================================================================== +// +// PInt :: GetValueFloat +// +//========================================================================== + +double PInt::GetValueFloat(void *addr) const +{ + return GetValueInt(addr); +} + //========================================================================== // // PInt :: GetStoreOp @@ -962,16 +979,27 @@ void PFloat::SetValue(void *addr, double val) //========================================================================== int PFloat::GetValueInt(void *addr) const +{ + return xs_ToInt(GetValueFloat(addr)); +} + +//========================================================================== +// +// PFloat :: GetValueFloat +// +//========================================================================== + +double PFloat::GetValueFloat(void *addr) const { assert(((intptr_t)addr & (Align - 1)) == 0 && "unaligned address"); if (Size == 4) { - return xs_ToInt(*(float *)addr); + return *(float *)addr; } else { assert(Size == 8); - return xs_ToInt(*(double *)addr); + return *(double *)addr; } } @@ -1145,6 +1173,18 @@ int PFixed::GetValueInt(void *addr) const return *(fixed_t *)addr >> FRACBITS; } +//========================================================================== +// +// PFixed :: GetValueFloat +// +//========================================================================== + +double PFixed::GetValueFloat(void *addr) const +{ + assert(((intptr_t)addr & (Align - 1)) == 0 && "unaligned address"); + return FIXED2DBL(*(fixed_t *)addr); +} + //========================================================================== // // PFixed :: GetStoreOp @@ -1212,6 +1252,18 @@ int PAngle::GetValueInt(void *addr) const return *(angle_t *)addr / ANGLE_1; } +//========================================================================== +// +// PAngle :: GetValueFloat +// +//========================================================================== + +double PAngle::GetValueFloat(void *addr) const +{ + assert(((intptr_t)addr & (Align - 1)) == 0 && "unaligned address"); + return (double)(*(angle_t *)addr) / ANGLE_1; +} + //========================================================================== // // PAngle :: GetStoreOp diff --git a/src/dobjtype.h b/src/dobjtype.h index a5e2ab2a2..e9ff98245 100644 --- a/src/dobjtype.h +++ b/src/dobjtype.h @@ -192,6 +192,7 @@ public: // Gets the value of a variable of this type at (addr) virtual int GetValueInt(void *addr) const; + virtual double GetValueFloat(void *addr) const; // Gets the opcode to store from a register to memory virtual int GetStoreOp() const; @@ -323,6 +324,7 @@ public: virtual void SetValue(void *addr, int val); virtual void SetValue(void *addr, double val); virtual int GetValueInt(void *addr) const; + virtual double GetValueFloat(void *addr) const; virtual int GetStoreOp() const; virtual int GetLoadOp() const; virtual int GetRegType() const; @@ -348,6 +350,7 @@ public: virtual void SetValue(void *addr, int val); virtual void SetValue(void *addr, double val); virtual int GetValueInt(void *addr) const; + virtual double GetValueFloat(void *addr) const; virtual int GetStoreOp() const; virtual int GetLoadOp() const; virtual int GetRegType() const; @@ -415,6 +418,7 @@ public: virtual void SetValue(void *addr, int val); virtual void SetValue(void *addr, double val); virtual int GetValueInt(void *addr) const; + virtual double GetValueFloat(void *addr) const; virtual int GetStoreOp() const; virtual int GetLoadOp() const; }; @@ -428,6 +432,7 @@ public: virtual void SetValue(void *addr, int val); virtual void SetValue(void *addr, double val); virtual int GetValueInt(void *addr) const; + virtual double GetValueFloat(void *addr) const; virtual int GetStoreOp() const; virtual int GetLoadOp() const; };