From 6b8c7d2376bb04578dec209eeafc037c33a32d45 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 15 Dec 2014 00:59:52 +0100 Subject: Use MSB_FIRST instead of LSB_FIRST --- source/blargg_endian.h | 96 ++++++++++++++++---------------------------------- 1 file changed, 31 insertions(+), 65 deletions(-) (limited to 'source/blargg_endian.h') 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 - #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 +#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 - #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 ) { -- cgit v1.2.3