summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2018-11-19 16:06:03 -0800
committerGabe Black <gabeblack@google.com>2018-11-27 00:46:47 +0000
commitecf68dfff4a23c785b523d096554d09dfa295cbd (patch)
tree76e74f13a2d8b12554ca84fa94dfa6d3975c7f49
parent24bfdc36f19fddbfcb33cc2f33fb216e8da0382d (diff)
downloadgem5-ecf68dfff4a23c785b523d096554d09dfa295cbd.tar.xz
base: Add some functions to convert floats to bits and vice versa.
These make it easier to extract the binary representation of floats and doubles, and given a binary representation convert it back again. The versions with a size prefix are safer to use since they make it clear what size inputs/outputs are expected. The versions without are to make writing generic code easier in case the same code snippet, templated function, etc., needs to be applied in both circumstances. Change-Id: Ib1f35a7e88e00806a7c639c211c5699b4af5a472 Reviewed-on: https://gem5-review.googlesource.com/c/14455 Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com> Maintainer: Gabe Black <gabeblack@google.com>
-rw-r--r--src/base/types.hh54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/base/types.hh b/src/base/types.hh
index a53f4db9d..c02a606cf 100644
--- a/src/base/types.hh
+++ b/src/base/types.hh
@@ -168,6 +168,60 @@ const Addr MaxAddr = (Addr)-1;
typedef uint64_t RegVal;
typedef double FloatRegVal;
+static inline uint32_t
+floatToBits32(float val)
+{
+ union
+ {
+ float f;
+ uint32_t i;
+ } u;
+ u.f = val;
+ return u.i;
+}
+
+static inline uint64_t
+floatToBits64(double val)
+{
+ union
+ {
+ double f;
+ uint64_t i;
+ } u;
+ u.f = val;
+ return u.i;
+}
+
+static inline uint64_t floatToBits(double val) { return floatToBits64(val); }
+static inline uint32_t floatToBits(float val) { return floatToBits32(val); }
+
+static inline float
+bitsToFloat32(uint32_t val)
+{
+ union
+ {
+ float f;
+ uint32_t i;
+ } u;
+ u.i = val;
+ return u.f;
+}
+
+static inline double
+bitsToFloat64(uint64_t val)
+{
+ union
+ {
+ double f;
+ uint64_t i;
+ } u;
+ u.i = val;
+ return u.f;
+}
+
+static inline double bitsToFloat(uint64_t val) { return bitsToFloat64(val); }
+static inline float bitsToFloat(uint32_t val) { return bitsToFloat32(val); }
+
/**
* Thread index/ID type
*/