From ecf68dfff4a23c785b523d096554d09dfa295cbd Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Mon, 19 Nov 2018 16:06:03 -0800 Subject: 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 Maintainer: Gabe Black --- src/base/types.hh | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) 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 */ -- cgit v1.2.3