diff options
author | Gabe Black <gabeblack@google.com> | 2018-11-19 16:06:03 -0800 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2018-11-27 00:46:47 +0000 |
commit | ecf68dfff4a23c785b523d096554d09dfa295cbd (patch) | |
tree | 76e74f13a2d8b12554ca84fa94dfa6d3975c7f49 | |
parent | 24bfdc36f19fddbfcb33cc2f33fb216e8da0382d (diff) | |
download | gem5-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.hh | 54 |
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 */ |