From 8676bcdc0120dae0360b153d8c939fdfd31a3cbf Mon Sep 17 00:00:00 2001 From: James Benton Date: Sun, 6 Jan 2019 11:18:51 +0000 Subject: [PATCH] tools/common: Add byte_swap fallbacks for unknown platforms. --- tools/common/utils.h | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/tools/common/utils.h b/tools/common/utils.h index b85e45ca..b9749976 100644 --- a/tools/common/utils.h +++ b/tools/common/utils.h @@ -55,12 +55,11 @@ struct byte_swap_t { #ifdef PLATFORM_WINDOWS return bit_cast(_byteswap_ushort(bit_cast(src))); -#elif defined(PLATFORM_APPLE) - // Apple has no 16-bit byteswap intrinsic - const uint16_t data = bit_cast(src); - return bit_cast((uint16_t)((data >> 8) | (data << 8))); #elif defined(PLATFORM_LINUX) return bit_cast(bswap_16(bit_cast(src))); +#else + const uint16_t data = bit_cast(src); + return bit_cast(static_cast((data >> 8) | (data << 8))); #endif } }; @@ -76,6 +75,14 @@ struct byte_swap_t return bit_cast(__builtin_bswap32(bit_cast(src))); #elif defined(PLATFORM_LINUX) return bit_cast(bswap_32(bit_cast(src))); +#else + const uint32_t data = bit_cast(src); + return bit_cast( + ((data & 0xFF000000u) >> 24) | + ((data & 0x00FF0000u) >> 8) | + ((data & 0x0000FF00u) << 8) | + ((data & 0x000000FFu) << 24) + ); #endif } }; @@ -91,6 +98,12 @@ struct byte_swap_t return bit_cast(__builtin_bswap64(bit_cast(src))); #elif defined(PLATFORM_LINUX) return bit_cast(bswap_64(bit_cast(src))); +#else + uint64_t data = bit_cast(src); + data = ((data & 0x00000000FFFFFFFFull) << 32) | ((data & 0xFFFFFFFF00000000ull) >> 32); + data = ((data & 0x0000FFFF0000FFFFull) << 16) | ((data & 0xFFFF0000FFFF0000ull) >> 16); + data = ((data & 0x00FF00FF00FF00FFull) << 8) | ((data & 0xFF00FF00FF00FF00ull) >> 8); + return bit_cast(data); #endif } };