From 66381352f376df1fab2337cf42e95b7b378ee824 Mon Sep 17 00:00:00 2001 From: MerryMage Date: Sat, 14 Jul 2018 09:41:36 +0100 Subject: [PATCH] fp: Add FPInfo Provides information about floating-point format for various bit sizes --- src/CMakeLists.txt | 1 + src/common/fp/info.h | 58 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 src/common/fp/info.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5807525a..f3c59dfa 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -17,6 +17,7 @@ add_library(dynarmic common/crc32.cpp common/crc32.h common/fp_util.h + common/fp/info.h common/fp/rounding_mode.h common/intrusive_list.h common/iterator_util.h diff --git a/src/common/fp/info.h b/src/common/fp/info.h new file mode 100644 index 00000000..1c4032e0 --- /dev/null +++ b/src/common/fp/info.h @@ -0,0 +1,58 @@ +/* This file is part of the dynarmic project. + * Copyright (c) 2018 MerryMage + * This software may be used and distributed according to the terms of the GNU + * General Public License version 2 or any later version. + */ + +#pragma once + +#include "common/common_types.h" + +namespace Dynarmic::FP { + +template +struct FPInfo {}; + +template<> +struct FPInfo { + static constexpr size_t total_width = 32; + static constexpr size_t exponent_width = 8; + static constexpr size_t explicit_mantissa_width = 23; + static constexpr size_t mantissa_width = explicit_mantissa_width + 1; + + static constexpr u32 implicit_leading_bit = u32(1) << explicit_mantissa_width; + static constexpr u32 sign_mask = 0x80000000; + static constexpr u32 exponent_mask = 0x7F800000; + static constexpr u32 mantissa_mask = 0x007FFFFF; + + static constexpr int exponent_min = -126; + static constexpr int exponent_max = 127; + static constexpr int exponent_bias = 127; + + static constexpr u32 Zero(bool sign) { return sign ? sign_mask : 0; } + static constexpr u32 Infinity(bool sign) { return exponent_mask | Zero(sign); } + static constexpr u32 MaxNormal(bool sign) { return (exponent_mask - 1) | Zero(sign); } +}; + +template<> +struct FPInfo { + static constexpr size_t total_width = 64; + static constexpr size_t exponent_width = 11; + static constexpr size_t explicit_mantissa_width = 52; + static constexpr size_t mantissa_width = explicit_mantissa_width + 1; + + static constexpr u64 implicit_leading_bit = u64(1) << explicit_mantissa_width; + static constexpr u64 sign_mask = 0x8000'0000'0000'0000; + static constexpr u64 exponent_mask = 0x7FF0'0000'0000'0000; + static constexpr u64 mantissa_mask = 0x000F'FFFF'FFFF'FFFF; + + static constexpr int exponent_min = -1022; + static constexpr int exponent_max = 1023; + static constexpr int exponent_bias = 1023; + + static constexpr u64 Zero(bool sign) { return sign ? sign_mask : 0; } + static constexpr u64 Infinity(bool sign) { return exponent_mask | Zero(sign); } + static constexpr u64 MaxNormal(bool sign) { return (exponent_mask - 1) | Zero(sign); } +}; + +} // namespace Dynarmic::FP