diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/common/swap.h | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/common/swap.h b/src/common/swap.h index 086449028..71932c2bb 100644 --- a/src/common/swap.h +++ b/src/common/swap.h | |||
| @@ -83,15 +83,19 @@ namespace Common { | |||
| 83 | return __builtin_bswap64(data); | 83 | return __builtin_bswap64(data); |
| 84 | } | 84 | } |
| 85 | #else | 85 | #else |
| 86 | // Slow generic implementation. | 86 | // Generic implementation. |
| 87 | [[nodiscard]] inline u16 swap16(u16 data) noexcept { | 87 | [[nodiscard]] inline u16 swap16(u16 data) noexcept { |
| 88 | return (data >> 8) | (data << 8); | 88 | return (data >> 8) | (data << 8); |
| 89 | } | 89 | } |
| 90 | [[nodiscard]] inline u32 swap32(u32 data) noexcept { | 90 | [[nodiscard]] inline u32 swap32(u32 data) noexcept { |
| 91 | return (swap16(data) << 16) | swap16(data >> 16); | 91 | return ((data & 0xFF000000U) >> 24) | ((data & 0x00FF0000U) >> 8) | |
| 92 | ((data & 0x0000FF00U) << 8) | ((data & 0x000000FFU) << 24); | ||
| 92 | } | 93 | } |
| 93 | [[nodiscard]] inline u64 swap64(u64 data) noexcept { | 94 | [[nodiscard]] inline u64 swap64(u64 data) noexcept { |
| 94 | return ((u64)swap32(data) << 32) | swap32(data >> 32); | 95 | return ((data & 0xFF00000000000000ULL) >> 56) | ((data & 0x00FF000000000000ULL) >> 40) | |
| 96 | ((data & 0x0000FF0000000000ULL) >> 24) | ((data & 0x000000FF00000000ULL) >> 8) | | ||
| 97 | ((data & 0x00000000FF000000ULL) << 8) | ((data & 0x0000000000FF0000ULL) << 24) | | ||
| 98 | ((data & 0x000000000000FF00ULL) << 40) | ((data & 0x00000000000000FFULL) << 56); | ||
| 95 | } | 99 | } |
| 96 | #endif | 100 | #endif |
| 97 | 101 | ||