From 60cff6f3d4980afaaf3223cef09557f291140cbe Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sat, 21 Nov 2020 05:03:35 +0300 Subject: [PATCH] Attempt to fix #9271 --- Utilities/BEType.h | 3 +++ rpcs3/util/atomic.cpp | 2 -- rpcs3/util/endian.hpp | 29 +++++++++++++++++------------ 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/Utilities/BEType.h b/Utilities/BEType.h index a8072cd472..7fb9d35bb6 100644 --- a/Utilities/BEType.h +++ b/Utilities/BEType.h @@ -508,4 +508,7 @@ struct fmt_unveil, void> } }; +static_assert(be_t(1) + be_t(2) + be_t(3) == 6); +static_assert(le_t(1) + le_t(2) + le_t(3) == 6); + #endif // BETYPE_H_GUARD diff --git a/rpcs3/util/atomic.cpp b/rpcs3/util/atomic.cpp index 77cb38b52b..d123ff6820 100644 --- a/rpcs3/util/atomic.cpp +++ b/rpcs3/util/atomic.cpp @@ -12,8 +12,6 @@ #include #include #include -#include -#include #include #include #include diff --git a/rpcs3/util/endian.hpp b/rpcs3/util/endian.hpp index 4763ff7c9a..a3d39b271c 100644 --- a/rpcs3/util/endian.hpp +++ b/rpcs3/util/endian.hpp @@ -1,4 +1,5 @@ -#pragma once +#ifndef ENDIAN_HPP_GUARD +#define ENDIAN_HPP_GUARD #include #include "Utilities/types.h" @@ -13,17 +14,19 @@ namespace stx { static_assert(std::endian::native == std::endian::little || std::endian::native == std::endian::big); +#ifdef _MSC_VER template - FORCE_INLINE constexpr T bswap_impl(T i, std::index_sequence) + static constexpr T bswap_impl(T i, std::index_sequence) { return static_cast(((((i >> (N * 8)) & T{UINT8_MAX}) << ((sizeof(T) - 1 - N) * 8)) | ...)); }; template::type> - FORCE_INLINE constexpr U bswap(T i) + static constexpr U bswap(T i) { return bswap_impl(i, std::make_index_sequence{}); } +#endif template struct se_storage @@ -51,14 +54,14 @@ namespace stx static constexpr std::uint16_t swap(std::uint16_t src) noexcept { +#if defined(__GNUG__) + return __builtin_bswap16(src); +#else if (std::is_constant_evaluated()) { return stx::bswap(src); } -#if defined(__GNUG__) - return __builtin_bswap16(src); -#else return _byteswap_ushort(src); #endif } @@ -71,14 +74,14 @@ namespace stx static constexpr std::uint32_t swap(std::uint32_t src) noexcept { +#if defined(__GNUG__) + return __builtin_bswap32(src); +#else if (std::is_constant_evaluated()) { return stx::bswap(src); } -#if defined(__GNUG__) - return __builtin_bswap32(src); -#else return _byteswap_ulong(src); #endif } @@ -91,14 +94,14 @@ namespace stx static constexpr std::uint64_t swap(std::uint64_t src) noexcept { +#if defined(__GNUG__) + return __builtin_bswap64(src); +#else if (std::is_constant_evaluated()) { return stx::bswap(src); } -#if defined(__GNUG__) - return __builtin_bswap64(src); -#else return _byteswap_uint64(src); #endif } @@ -489,3 +492,5 @@ public: } }; } + +#endif // ENDIAN_HPP_GUARD