From: <sv...@op...> - 2024-08-16 06:04:56
|
Author: manx Date: Fri Aug 16 08:04:48 2024 New Revision: 21465 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=21465 Log: [Ref] mpt/base/floatingpoint.hpp: Remove traits than combine size, IEEE, and endianness. [Ref] mpt/base/floatingpoint.hpp: Add traits for float16 and float128. Modified: trunk/OpenMPT/src/mpt/base/floatingpoint.hpp trunk/OpenMPT/src/mpt/endian/floatingpoint.hpp trunk/OpenMPT/src/openmpt/base/Endian.hpp Modified: trunk/OpenMPT/src/mpt/base/floatingpoint.hpp ============================================================================== --- trunk/OpenMPT/src/mpt/base/floatingpoint.hpp Thu Aug 15 21:47:09 2024 (r21464) +++ trunk/OpenMPT/src/mpt/base/floatingpoint.hpp Fri Aug 16 08:04:48 2024 (r21465) @@ -64,14 +64,12 @@ static constexpr bool is_float = !std::numeric_limits<T>::is_integer; static constexpr bool is_hard = is_float && !MPT_COMPILER_QUIRK_FLOAT_EMULATED; static constexpr bool is_soft = is_float && MPT_COMPILER_QUIRK_FLOAT_EMULATED; + static constexpr bool is_float16 = is_float && (sizeof(T) == 2); static constexpr bool is_float32 = is_float && (sizeof(T) == 4); static constexpr bool is_float64 = is_float && (sizeof(T) == 8); + static constexpr bool is_float128 = is_float && (sizeof(T) == 16); static constexpr bool is_native_endian = is_float && !MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN; static constexpr bool is_ieee754_binary = is_float && std::numeric_limits<T>::is_iec559 && !MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754; - static constexpr bool is_ieee754_binary32 = is_float && is_ieee754_binary && is_float32; - static constexpr bool is_ieee754_binary64 = is_float && is_ieee754_binary && is_float64; - static constexpr bool is_ieee754_binary32ne = is_float && is_ieee754_binary && is_float32 && is_native_endian; - static constexpr bool is_ieee754_binary64ne = is_float && is_ieee754_binary && is_float64 && is_native_endian; static constexpr bool is_preferred = is_float && ((is_float32 && MPT_COMPILER_QUIRK_FLOAT_PREFER32) || (is_float64 && MPT_COMPILER_QUIRK_FLOAT_PREFER64)); }; Modified: trunk/OpenMPT/src/mpt/endian/floatingpoint.hpp ============================================================================== --- trunk/OpenMPT/src/mpt/endian/floatingpoint.hpp Thu Aug 15 21:47:09 2024 (r21464) +++ trunk/OpenMPT/src/mpt/endian/floatingpoint.hpp Fri Aug 16 08:04:48 2024 (r21465) @@ -28,7 +28,7 @@ // 1.0f --> 0x3f800000u MPT_FORCEINLINE uint32 EncodeIEEE754binary32(float32 f) { - if constexpr (mpt::float_traits<float32>::is_ieee754_binary32ne) { + if constexpr (mpt::float_traits<float32>::is_float32 && mpt::float_traits<float32>::is_ieee754_binary && mpt::float_traits<float32>::is_native_endian) { return mpt::bit_cast<uint32>(f); } else { int e = 0; @@ -56,7 +56,7 @@ } MPT_FORCEINLINE uint64 EncodeIEEE754binary64(float64 f) { - if constexpr (mpt::float_traits<float64>::is_ieee754_binary64ne) { + if constexpr (mpt::float_traits<float64>::is_float64 && mpt::float_traits<float64>::is_ieee754_binary && mpt::float_traits<float64>::is_native_endian) { return mpt::bit_cast<uint64>(f); } else { int e = 0; @@ -85,7 +85,7 @@ // 0x3f800000u --> 1.0f MPT_FORCEINLINE float32 DecodeIEEE754binary32(uint32 i) { - if constexpr (mpt::float_traits<float32>::is_ieee754_binary32ne) { + if constexpr (mpt::float_traits<float32>::is_float32 && mpt::float_traits<float32>::is_ieee754_binary && mpt::float_traits<float32>::is_native_endian) { return mpt::bit_cast<float32>(i); } else { uint32 mant = (i & 0x007fffffu) >> 0; @@ -107,7 +107,7 @@ } MPT_FORCEINLINE float64 DecodeIEEE754binary64(uint64 i) { - if constexpr (mpt::float_traits<float64>::is_ieee754_binary64ne) { + if constexpr (mpt::float_traits<float64>::is_float64 && mpt::float_traits<float64>::is_ieee754_binary && mpt::float_traits<float64>::is_native_endian) { return mpt::bit_cast<float64>(i); } else { uint64 mant = (i & 0x000fffffffffffffull) >> 0; @@ -412,10 +412,10 @@ using IEEE754binary64BE = IEEE754binary64Native<>; }; -using IEEE754binary32LE = IEEE754binary_types<mpt::float_traits<float32>::is_ieee754_binary32ne, mpt::endian::native>::IEEE754binary32LE; -using IEEE754binary32BE = IEEE754binary_types<mpt::float_traits<float32>::is_ieee754_binary32ne, mpt::endian::native>::IEEE754binary32BE; -using IEEE754binary64LE = IEEE754binary_types<mpt::float_traits<float64>::is_ieee754_binary64ne, mpt::endian::native>::IEEE754binary64LE; -using IEEE754binary64BE = IEEE754binary_types<mpt::float_traits<float64>::is_ieee754_binary64ne, mpt::endian::native>::IEEE754binary64BE; +using IEEE754binary32LE = IEEE754binary_types<mpt::float_traits<float32>::is_float32 && mpt::float_traits<float32>::is_ieee754_binary && mpt::float_traits<float32>::is_native_endian, mpt::endian::native>::IEEE754binary32LE; +using IEEE754binary32BE = IEEE754binary_types<mpt::float_traits<float32>::is_float32 && mpt::float_traits<float32>::is_ieee754_binary && mpt::float_traits<float32>::is_native_endian, mpt::endian::native>::IEEE754binary32BE; +using IEEE754binary64LE = IEEE754binary_types<mpt::float_traits<float32>::is_float64 && mpt::float_traits<float32>::is_ieee754_binary && mpt::float_traits<float32>::is_native_endian, mpt::endian::native>::IEEE754binary64LE; +using IEEE754binary64BE = IEEE754binary_types<mpt::float_traits<float32>::is_float64 && mpt::float_traits<float32>::is_ieee754_binary && mpt::float_traits<float32>::is_native_endian, mpt::endian::native>::IEEE754binary64BE; static_assert(sizeof(IEEE754binary32LE) == 4); static_assert(sizeof(IEEE754binary32BE) == 4); Modified: trunk/OpenMPT/src/openmpt/base/Endian.hpp ============================================================================== --- trunk/OpenMPT/src/openmpt/base/Endian.hpp Thu Aug 15 21:47:09 2024 (r21464) +++ trunk/OpenMPT/src/openmpt/base/Endian.hpp Fri Aug 16 08:04:48 2024 (r21465) @@ -39,10 +39,10 @@ -using IEEE754binary32LE = mpt::IEEE754binary_types<mpt::float_traits<float32>::is_ieee754_binary32ne, mpt::endian::native>::IEEE754binary32LE; -using IEEE754binary32BE = mpt::IEEE754binary_types<mpt::float_traits<float32>::is_ieee754_binary32ne, mpt::endian::native>::IEEE754binary32BE; -using IEEE754binary64LE = mpt::IEEE754binary_types<mpt::float_traits<float64>::is_ieee754_binary64ne, mpt::endian::native>::IEEE754binary64LE; -using IEEE754binary64BE = mpt::IEEE754binary_types<mpt::float_traits<float64>::is_ieee754_binary64ne, mpt::endian::native>::IEEE754binary64BE; +using IEEE754binary32LE = mpt::IEEE754binary_types<mpt::float_traits<float32>::is_float32 && mpt::float_traits<float32>::is_ieee754_binary && mpt::float_traits<float32>::is_native_endian, mpt::endian::native>::IEEE754binary32LE; +using IEEE754binary32BE = mpt::IEEE754binary_types<mpt::float_traits<float32>::is_float32 && mpt::float_traits<float32>::is_ieee754_binary && mpt::float_traits<float32>::is_native_endian, mpt::endian::native>::IEEE754binary32BE; +using IEEE754binary64LE = mpt::IEEE754binary_types<mpt::float_traits<float64>::is_float64 && mpt::float_traits<float64>::is_ieee754_binary && mpt::float_traits<float64>::is_native_endian, mpt::endian::native>::IEEE754binary64LE; +using IEEE754binary64BE = mpt::IEEE754binary_types<mpt::float_traits<float64>::is_float64 && mpt::float_traits<float64>::is_ieee754_binary && mpt::float_traits<float64>::is_native_endian, mpt::endian::native>::IEEE754binary64BE; // unaligned |