base: Add some functions to convert floats to bits and vice versa.
authorGabe Black <gabeblack@google.com>
Tue, 20 Nov 2018 00:06:03 +0000 (16:06 -0800)
committerGabe Black <gabeblack@google.com>
Tue, 27 Nov 2018 00:46:47 +0000 (00:46 +0000)
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>

src/base/types.hh

index a53f4db9dbc1dd832cc567d60489a1348485cec9..c02a606cfefa349b11f602b884cdb58cc94dce84 100644 (file)
@@ -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
  */