aboutsummaryrefslogtreecommitdiff
path: root/source/blargg_endian.h
diff options
context:
space:
mode:
authortwinaphex2014-12-15 00:59:52 +0100
committertwinaphex2014-12-15 00:59:52 +0100
commit6b8c7d2376bb04578dec209eeafc037c33a32d45 (patch)
tree01e95a3b8e66ea12004d20a667f3f3eff45b5107 /source/blargg_endian.h
parentb27c451831082179cc9bc3c1b3424ebb0f66dd74 (diff)
downloadsnes9x2005-6b8c7d2376bb04578dec209eeafc037c33a32d45.tar.gz
snes9x2005-6b8c7d2376bb04578dec209eeafc037c33a32d45.tar.bz2
snes9x2005-6b8c7d2376bb04578dec209eeafc037c33a32d45.zip
Use MSB_FIRST instead of LSB_FIRST
Diffstat (limited to 'source/blargg_endian.h')
-rw-r--r--source/blargg_endian.h96
1 files changed, 31 insertions, 65 deletions
diff --git a/source/blargg_endian.h b/source/blargg_endian.h
index 8322fb1..177a081 100644
--- a/source/blargg_endian.h
+++ b/source/blargg_endian.h
@@ -65,75 +65,41 @@
#define BLARGG_CPU_RISC 1
#endif
-/* BLARGG_BIG_ENDIAN, BLARGG_LITTLE_ENDIAN: Determined automatically, otherwise only */
-/* one may be #defined to 1. Only needed if something actually depends on byte order. */
-#if !defined (BLARGG_BIG_ENDIAN) && !defined (BLARGG_LITTLE_ENDIAN)
-#ifdef __GLIBC__
- /* GCC handles this for us */
- #include <endian.h>
- #if __BYTE_ORDER == __LITTLE_ENDIAN
- #define BLARGG_LITTLE_ENDIAN 1
- #elif __BYTE_ORDER == __BIG_ENDIAN
- #define BLARGG_BIG_ENDIAN 1
- #endif
-#else
-
-#if defined (LSB_FIRST) || defined (__LITTLE_ENDIAN__) || BLARGG_CPU_X86 || \
- defined(ANDROID_X86) || defined(ANDROID_MIPS) || \
- defined(__BLACKBERRY_QNX__) || (defined (LITTLE_ENDIAN) && LITTLE_ENDIAN+0 != 1234)
- #define BLARGG_LITTLE_ENDIAN 1
-#endif
+#if BLARGG_NONPORTABLE
+ /* Optimized implementation if byte order is known */
-#if defined (MSB_FIRST) || defined (__BIG_ENDIAN__) || defined (WORDS_BIGENDIAN) || \
- defined (__sparc__) || BLARGG_CPU_POWERPC || \
- (defined (BIG_ENDIAN) && BIG_ENDIAN+0 != 4321)
- #define BLARGG_BIG_ENDIAN 1
-#elif !defined(__mips__) || !defined(ANDROID_MIPS)
- /* No endian specified; assume little-endian, since it's most common */
- #define BLARGG_LITTLE_ENDIAN 1
-#endif
+#ifdef MSB_FIRST
+#if BLARGG_CPU_POWERPC
+ /* PowerPC has special byte-reversed instructions */
+#if defined (__SNC__)
+#define GET_LE16( addr ) (__builtin_lhbrx(addr, 0))
+#define GET_LE32( addr ) (__builtin_lwbrx(addr, 0))
+#define SET_LE16( addr, in ) (__builtin_sthbrx(in, addr, 0))
+#define SET_LE32( addr, in ) (__builtin_stwbrx(in, addr, 0))
+#elif defined (_XBOX360)
+#include <PPCIntrinsics.h>
+#define GET_LE16( addr ) (__loadshortbytereverse(0, addr))
+#define GET_LE32( addr ) (__loadwordbytereverse(0, addr))
+#define SET_LE16( addr, in ) (__storeshortbytereverse(in, 0, addr))
+#define SET_LE32( addr, in ) (__storewordbytereverse(in, 0, addr))
+#elif defined (__MWERKS__)
+#define GET_LE16( addr ) (__lhbrx( addr, 0 ))
+#define GET_LE32( addr ) (__lwbrx( addr, 0 ))
+#define SET_LE16( addr, in ) (__sthbrx( in, addr, 0 ))
+#define SET_LE32( addr, in ) (__stwbrx( in, addr, 0 ))
+#elif defined (__GNUC__)
+#define GET_LE16( addr ) ({unsigned ppc_lhbrx_; asm( "lhbrx %0,0,%1" : "=r" (ppc_lhbrx_) : "r" (addr), "0" (ppc_lhbrx_) ); ppc_lhbrx_;})
+#define GET_LE32( addr ) ({unsigned ppc_lwbrx_; asm( "lwbrx %0,0,%1" : "=r" (ppc_lwbrx_) : "r" (addr), "0" (ppc_lwbrx_) ); ppc_lwbrx_;})
+#define SET_LE16( addr, in ) ({asm( "sthbrx %0,0,%1" : : "r" (in), "r" (addr) );})
+#define SET_LE32( addr, in ) ({asm( "stwbrx %0,0,%1" : : "r" (in), "r" (addr) );})
#endif
#endif
-
-#if BLARGG_LITTLE_ENDIAN && BLARGG_BIG_ENDIAN
- #undef BLARGG_LITTLE_ENDIAN
- #undef BLARGG_BIG_ENDIAN
+#else
+#define GET_LE16( addr ) (*(uint16_t*) (addr))
+#define GET_LE32( addr ) (*(uint32_t*) (addr))
+#define SET_LE16( addr, data ) (void) (*(uint16_t*) (addr) = (data))
+#define SET_LE32( addr, data ) (void) (*(uint32_t*) (addr) = (data))
#endif
-
-#if BLARGG_NONPORTABLE
- /* Optimized implementation if byte order is known */
- #if BLARGG_LITTLE_ENDIAN
- #define GET_LE16( addr ) (*(uint16_t*) (addr))
- #define GET_LE32( addr ) (*(uint32_t*) (addr))
- #define SET_LE16( addr, data ) (void) (*(uint16_t*) (addr) = (data))
- #define SET_LE32( addr, data ) (void) (*(uint32_t*) (addr) = (data))
- #elif BLARGG_BIG_ENDIAN
- #if BLARGG_CPU_POWERPC
- /* PowerPC has special byte-reversed instructions */
- #if defined (__SNC__)
- #define GET_LE16( addr ) (__builtin_lhbrx(addr, 0))
- #define GET_LE32( addr ) (__builtin_lwbrx(addr, 0))
- #define SET_LE16( addr, in ) (__builtin_sthbrx(in, addr, 0))
- #define SET_LE32( addr, in ) (__builtin_stwbrx(in, addr, 0))
- #elif defined (_XBOX360)
- #include <PPCIntrinsics.h>
- #define GET_LE16( addr ) (__loadshortbytereverse(0, addr))
- #define GET_LE32( addr ) (__loadwordbytereverse(0, addr))
- #define SET_LE16( addr, in ) (__storeshortbytereverse(in, 0, addr))
- #define SET_LE32( addr, in ) (__storewordbytereverse(in, 0, addr))
- #elif defined (__MWERKS__)
- #define GET_LE16( addr ) (__lhbrx( addr, 0 ))
- #define GET_LE32( addr ) (__lwbrx( addr, 0 ))
- #define SET_LE16( addr, in ) (__sthbrx( in, addr, 0 ))
- #define SET_LE32( addr, in ) (__stwbrx( in, addr, 0 ))
- #elif defined (__GNUC__)
- #define GET_LE16( addr ) ({unsigned ppc_lhbrx_; asm( "lhbrx %0,0,%1" : "=r" (ppc_lhbrx_) : "r" (addr), "0" (ppc_lhbrx_) ); ppc_lhbrx_;})
- #define GET_LE32( addr ) ({unsigned ppc_lwbrx_; asm( "lwbrx %0,0,%1" : "=r" (ppc_lwbrx_) : "r" (addr), "0" (ppc_lwbrx_) ); ppc_lwbrx_;})
- #define SET_LE16( addr, in ) ({asm( "sthbrx %0,0,%1" : : "r" (in), "r" (addr) );})
- #define SET_LE32( addr, in ) ({asm( "stwbrx %0,0,%1" : : "r" (in), "r" (addr) );})
- #endif
- #endif
- #endif
#else
static INLINE unsigned get_le16( void const* p )
{