summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Lioncash2019-04-11 20:26:37 -0400
committerGravatar Lioncash2019-04-11 20:36:19 -0400
commit9cb4b7be40dd93d4982d78a5f420326fd9c628a8 (patch)
tree31a11148138dece030895b70a0e5304d27401129 /src
parentcommon/swap: Remove 32-bit ARM path (diff)
downloadyuzu-9cb4b7be40dd93d4982d78a5f420326fd9c628a8.tar.gz
yuzu-9cb4b7be40dd93d4982d78a5f420326fd9c628a8.tar.xz
yuzu-9cb4b7be40dd93d4982d78a5f420326fd9c628a8.zip
common/swap: Simplify swap function ifdefs
Including every OS' own built-in byte swapping functions is kind of undesirable, since it adds yet another build path to ensure compilation succeeds on. Given we only support clang, GCC, and MSVC for the time being, we can utilize their built-in functions directly instead of going through the OS's API functions. This shrinks the overall code down to just if (msvc) use msvc's functions else if (clang or gcc) use clang/gcc's builtins else use the slow path
Diffstat (limited to 'src')
-rw-r--r--src/common/swap.h63
1 files changed, 15 insertions, 48 deletions
diff --git a/src/common/swap.h b/src/common/swap.h
index cb723cb8a..fad0f35a7 100644
--- a/src/common/swap.h
+++ b/src/common/swap.h
@@ -21,11 +21,6 @@
21 21
22#if defined(_MSC_VER) 22#if defined(_MSC_VER)
23#include <cstdlib> 23#include <cstdlib>
24#elif defined(__linux__)
25#include <byteswap.h>
26#elif defined(__Bitrig__) || defined(__DragonFly__) || defined(__FreeBSD__) || \
27 defined(__NetBSD__) || defined(__OpenBSD__)
28#include <sys/endian.h>
29#endif 24#endif
30#include <cstring> 25#include <cstring>
31#include "common/common_types.h" 26#include "common/common_types.h"
@@ -62,58 +57,30 @@
62namespace Common { 57namespace Common {
63 58
64#ifdef _MSC_VER 59#ifdef _MSC_VER
65inline u16 swap16(u16 _data) { 60inline u16 swap16(u16 data) {
66 return _byteswap_ushort(_data); 61 return _byteswap_ushort(data);
67}
68inline u32 swap32(u32 _data) {
69 return _byteswap_ulong(_data);
70}
71inline u64 swap64(u64 _data) {
72 return _byteswap_uint64(_data);
73}
74#elif __linux__
75inline u16 swap16(u16 _data) {
76 return bswap_16(_data);
77}
78inline u32 swap32(u32 _data) {
79 return bswap_32(_data);
80}
81inline u64 swap64(u64 _data) {
82 return bswap_64(_data);
83}
84#elif __APPLE__
85inline __attribute__((always_inline)) u16 swap16(u16 _data) {
86 return (_data >> 8) | (_data << 8);
87} 62}
88inline __attribute__((always_inline)) u32 swap32(u32 _data) { 63inline u32 swap32(u32 data) {
89 return __builtin_bswap32(_data); 64 return _byteswap_ulong(data);
90} 65}
91inline __attribute__((always_inline)) u64 swap64(u64 _data) { 66inline u64 swap64(u64 data) {
92 return __builtin_bswap64(_data); 67 return _byteswap_uint64(data);
93} 68}
94#elif defined(__Bitrig__) || defined(__OpenBSD__) 69#elif defined(__clang__) || defined(__GNUC__)
70#if defined(__Bitrig__) || defined(__OpenBSD__)
95// redefine swap16, swap32, swap64 as inline functions 71// redefine swap16, swap32, swap64 as inline functions
96#undef swap16 72#undef swap16
97#undef swap32 73#undef swap32
98#undef swap64 74#undef swap64
99inline u16 swap16(u16 _data) { 75#endif
100 return __swap16(_data); 76inline u16 swap16(u16 data) {
101} 77 return __builtin_bswap16(data);
102inline u32 swap32(u32 _data) {
103 return __swap32(_data);
104}
105inline u64 swap64(u64 _data) {
106 return __swap64(_data);
107}
108#elif defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__)
109inline u16 swap16(u16 _data) {
110 return bswap16(_data);
111} 78}
112inline u32 swap32(u32 _data) { 79inline u32 swap32(u32 data) {
113 return bswap32(_data); 80 return __builtin_bswap32(data);
114} 81}
115inline u64 swap64(u64 _data) { 82inline u64 swap64(u64 data) {
116 return bswap64(_data); 83 return __builtin_bswap64(data);
117} 84}
118#else 85#else
119// Slow generic implementation. 86// Slow generic implementation.