summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2014-08-26 15:53:49 -0400
committerMichael Sevakis <jethead71@rockbox.org>2014-08-26 15:53:49 -0400
commit25f73d62079b63e4420fd037ad9460004179b026 (patch)
treeeb8473cdad8ae4bcf471bd57c9ed31efa7f6c7d5
parent69df56504e7dfc8ba7e283901aadde6ebdada5b1 (diff)
downloadrockbox-25f73d62079b63e4420fd037ad9460004179b026.tar.gz
rockbox-25f73d62079b63e4420fd037ad9460004179b026.zip
Patch up rbendian.h for Win32 cross-compile
MingW doesn't provide that stuff. Change-Id: Ifa8310ed00f4f79f06adb71db71e58b70e7d2b60
-rw-r--r--firmware/include/rbendian.h65
1 files changed, 37 insertions, 28 deletions
diff --git a/firmware/include/rbendian.h b/firmware/include/rbendian.h
index 21d3cae68d..861db7d082 100644
--- a/firmware/include/rbendian.h
+++ b/firmware/include/rbendian.h
@@ -22,7 +22,10 @@
22#define _RBENDIAN_H_ 22#define _RBENDIAN_H_
23 23
24#include "config.h" 24#include "config.h"
25
26#ifndef __MINGW32__
25#include <endian.h> 27#include <endian.h>
28#endif
26 29
27/* clear these out since we redefine them to be truely constant compatible */ 30/* clear these out since we redefine them to be truely constant compatible */
28#undef swap16 31#undef swap16
@@ -42,6 +45,34 @@
42#undef htobe32 45#undef htobe32
43#undef htobe64 46#undef htobe64
44 47
48/* static/generic endianness conversion */
49#define SWAP16_CONST(x) \
50 ((typeof(x))( ((uint16_t)(x) >> 8) | ((uint16_t)(x) << 8) ))
51
52#define SWAP32_CONST(x) \
53 ((typeof(x))( (((uint32_t)(x) & 0xff000000) >> 24) | \
54 (((uint32_t)(x) & 0x00ff0000) >> 8) | \
55 (((uint32_t)(x) & 0x0000ff00) << 8) | \
56 (((uint32_t)(x) & 0x000000ff) << 24) ))
57
58#define SWAP64_CONST(x) \
59 ((typeof(x))( (((uint64_t)(x) & 0xff00000000000000ull) >> 56) | \
60 (((uint64_t)(x) & 0x00ff000000000000ull) >> 40) | \
61 (((uint64_t)(x) & 0x0000ff0000000000ull) >> 24) | \
62 (((uint64_t)(x) & 0x000000ff00000000ull) >> 8) | \
63 (((uint64_t)(x) & 0x00000000ff000000ull) << 8) | \
64 (((uint64_t)(x) & 0x0000000000ff0000ull) << 24) | \
65 (((uint64_t)(x) & 0x000000000000ff00ull) << 40) | \
66 (((uint64_t)(x) & 0x00000000000000ffull) << 56) ))
67
68#define SWAP_ODD_EVEN32_CONST(x) \
69 ((typeof(x))( ((uint32_t)SWAP16_CONST((uint32_t)(x) >> 16) << 16) | \
70 SWAP16_CONST((uint32_t)(x))) )
71
72#define SWAW32_CONST(x) \
73 ((typeof(x))( ((uint32_t)(x) << 16) | ((uint32_t)(x) >> 16) ))
74
75
45#ifndef __ENDIAN_H_NATIVE_RB 76#ifndef __ENDIAN_H_NATIVE_RB
46 77
47#if defined (__bswap_16) 78#if defined (__bswap_16)
@@ -52,11 +83,16 @@
52 #define __swap16_os(x) __swap16(x) 83 #define __swap16_os(x) __swap16(x)
53 #define __swap32_os(x) __swap32(x) 84 #define __swap32_os(x) __swap32(x)
54 #define __swap64_os(x) __swap64(x) 85 #define __swap64_os(x) __swap64(x)
86#elif defined (__MINGW32__)
87 /* kinda hacky but works */
88 #define __swap16_os(x) SWAP16_CONST(x)
89 #define __swap32_os(x) SWAP32_CONST(x)
90 #define __swap64_os(x) SWAP64_CONST(x)
55#else 91#else
56 #error "Missing OS swap defines." 92 #error "Missing OS swap defines."
57#endif 93#endif
58 94
59/* wrap these because they aren't compatible with compound initializers */ 95/* wrap these because they aren't always compatible with compound initializers */
60static FORCE_INLINE uint16_t swap16_hw(uint16_t x) 96static FORCE_INLINE uint16_t swap16_hw(uint16_t x)
61 { return __swap16_os(x); } 97 { return __swap16_os(x); }
62static FORCE_INLINE uint32_t swap32_hw(uint32_t x) 98static FORCE_INLINE uint32_t swap32_hw(uint32_t x)
@@ -88,33 +124,6 @@ static inline uint32_t swaw32_hw(uint32_t value)
88} 124}
89#endif /* Generic */ 125#endif /* Generic */
90 126
91/* static endianness conversion */
92#define SWAP16_CONST(x) \
93 ((typeof(x))( ((uint16_t)(x) >> 8) | ((uint16_t)(x) << 8) ))
94
95#define SWAP32_CONST(x) \
96 ((typeof(x))( (((uint32_t)(x) & 0xff000000) >> 24) | \
97 (((uint32_t)(x) & 0x00ff0000) >> 8) | \
98 (((uint32_t)(x) & 0x0000ff00) << 8) | \
99 (((uint32_t)(x) & 0x000000ff) << 24) ))
100
101#define SWAP64_CONST(x) \
102 ((typeof(x))( (((uint64_t)(x) & 0xff00000000000000ull) >> 56) | \
103 (((uint64_t)(x) & 0x00ff000000000000ull) >> 40) | \
104 (((uint64_t)(x) & 0x0000ff0000000000ull) >> 24) | \
105 (((uint64_t)(x) & 0x000000ff00000000ull) >> 8) | \
106 (((uint64_t)(x) & 0x00000000ff000000ull) << 8) | \
107 (((uint64_t)(x) & 0x0000000000ff0000ull) << 24) | \
108 (((uint64_t)(x) & 0x000000000000ff00ull) << 40) | \
109 (((uint64_t)(x) & 0x00000000000000ffull) << 56) ))
110
111#define SWAP_ODD_EVEN32_CONST(x) \
112 ((typeof(x))( ((uint32_t)SWAP16_CONST((uint32_t)(x) >> 16) << 16) | \
113 SWAP16_CONST((uint32_t)(x))) )
114
115#define SWAW32_CONST(x) \
116 ((typeof(x))( ((uint32_t)(x) << 16) | ((uint32_t)(x) >> 16) ))
117
118/* select best method based upon whether x is a constant expression */ 127/* select best method based upon whether x is a constant expression */
119#define swap16(x) \ 128#define swap16(x) \
120 ( __builtin_constant_p(x) ? SWAP16_CONST(x) : (typeof(x))swap16_hw(x) ) 129 ( __builtin_constant_p(x) ? SWAP16_CONST(x) : (typeof(x))swap16_hw(x) )