--- include/SDL_endian.h.orig
+++ include/SDL_endian.h
@@ -37,12 +37,11 @@
 #define SDL_LIL_ENDIAN	1234
 #define SDL_BIG_ENDIAN	4321
 /*@}*/
+#include <byteswap.h>
+#include <endian.h>
 
 #ifndef SDL_BYTEORDER	/* Not defined in SDL_config.h? */
-#ifdef __linux__
-#include <endian.h>
 #define SDL_BYTEORDER  __BYTE_ORDER
-#else /* __linux __ */
 #if defined(__hppa__) || \
     defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \
     (defined(__MIPS__) && defined(__MISPEB__)) || \
@@ -52,7 +51,6 @@
 #else
 #define SDL_BYTEORDER	SDL_LIL_ENDIAN
 #endif
-#endif /* __linux __ */
 #endif /* !SDL_BYTEORDER */
 
 
@@ -62,6 +60,13 @@
 extern "C" {
 #endif
 
+
+static __inline__ Uint16 SDL_Swap16(Uint16 x) { return bswap_16(x); }
+
+static __inline__ Uint32 SDL_Swap32(Uint32 x) { return bswap_32(x); }
+
+static __inline__ Uint64 SDL_Swap64(Uint64 x) { return bswap_64(x); }
+
 /**
  *  @name SDL_Swap Functions
  *  Use inline functions for compilers that support them, and static
@@ -70,139 +75,18 @@ extern "C" {
  *  header should only be included in files that actually use them.
  */
 /*@{*/
-#if defined(__GNUC__) && defined(__i386__) && \
-   !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */)
-static __inline__ Uint16 SDL_Swap16(Uint16 x)
-{
-	__asm__("xchgb %b0,%h0" : "=q" (x) :  "0" (x));
-	return x;
-}
-#elif defined(__GNUC__) && defined(__x86_64__)
-static __inline__ Uint16 SDL_Swap16(Uint16 x)
-{
-	__asm__("xchgb %b0,%h0" : "=Q" (x) :  "0" (x));
-	return x;
-}
-#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
-static __inline__ Uint16 SDL_Swap16(Uint16 x)
-{
-	int result;
-
-	__asm__("rlwimi %0,%2,8,16,23" : "=&r" (result) : "0" (x >> 8), "r" (x));
-	return (Uint16)result;
-}
-#elif defined(__GNUC__) && (defined(__m68k__) && !defined(__mcoldfire__))
-static __inline__ Uint16 SDL_Swap16(Uint16 x)
-{
-	__asm__("rorw #8,%0" : "=d" (x) :  "0" (x) : "cc");
-	return x;
-}
-#else
-static __inline__ Uint16 SDL_Swap16(Uint16 x) {
-	return SDL_static_cast(Uint16, ((x<<8)|(x>>8)));
-}
-#endif
-
-#if defined(__GNUC__) && defined(__i386__) && \
-   !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */)
-static __inline__ Uint32 SDL_Swap32(Uint32 x)
-{
-	__asm__("bswap %0" : "=r" (x) : "0" (x));
-	return x;
-}
-#elif defined(__GNUC__) && defined(__x86_64__)
-static __inline__ Uint32 SDL_Swap32(Uint32 x)
-{
-	__asm__("bswapl %0" : "=r" (x) : "0" (x));
-	return x;
-}
-#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
-static __inline__ Uint32 SDL_Swap32(Uint32 x)
-{
-	Uint32 result;
-
-	__asm__("rlwimi %0,%2,24,16,23" : "=&r" (result) : "0" (x>>24), "r" (x));
-	__asm__("rlwimi %0,%2,8,8,15"   : "=&r" (result) : "0" (result),    "r" (x));
-	__asm__("rlwimi %0,%2,24,0,7"   : "=&r" (result) : "0" (result),    "r" (x));
-	return result;
-}
-#elif defined(__GNUC__) && (defined(__m68k__) && !defined(__mcoldfire__))
-static __inline__ Uint32 SDL_Swap32(Uint32 x)
-{
-	__asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0" : "=d" (x) :  "0" (x) : "cc");
-	return x;
-}
-#else
-static __inline__ Uint32 SDL_Swap32(Uint32 x) {
-	return SDL_static_cast(Uint32, ((x<<24)|((x<<8)&0x00FF0000)|((x>>8)&0x0000FF00)|(x>>24)));
-}
-#endif
-
-#ifdef SDL_HAS_64BIT_TYPE
-#if defined(__GNUC__) && defined(__i386__) && \
-   !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */)
-static __inline__ Uint64 SDL_Swap64(Uint64 x)
-{
-	union { 
-		struct { Uint32 a,b; } s;
-		Uint64 u;
-	} v;
-	v.u = x;
-	__asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1" 
-	        : "=r" (v.s.a), "=r" (v.s.b) 
-	        : "0" (v.s.a), "1" (v.s.b)); 
-	return v.u;
-}
-#elif defined(__GNUC__) && defined(__x86_64__)
-static __inline__ Uint64 SDL_Swap64(Uint64 x)
-{
-	__asm__("bswapq %0" : "=r" (x) : "0" (x));
-	return x;
-}
-#else
-static __inline__ Uint64 SDL_Swap64(Uint64 x)
-{
-	Uint32 hi, lo;
-
-	/* Separate into high and low 32-bit values and swap them */
-	lo = SDL_static_cast(Uint32, x & 0xFFFFFFFF);
-	x >>= 32;
-	hi = SDL_static_cast(Uint32, x & 0xFFFFFFFF);
-	x = SDL_Swap32(lo);
-	x <<= 32;
-	x |= SDL_Swap32(hi);
-	return (x);
-}
-#endif
-#else
-/* This is mainly to keep compilers from complaining in SDL code.
- * If there is no real 64-bit datatype, then compilers will complain about
- * the fake 64-bit datatype that SDL provides when it compiles user code.
- */
-#define SDL_Swap64(X)	(X)
-#endif /* SDL_HAS_64BIT_TYPE */
-/*@}*/
 
 /**
  *  @name SDL_SwapLE and SDL_SwapBE Functions
  *  Byteswap item from the specified endianness to the native endianness
  */
 /*@{*/
-#if SDL_BYTEORDER == SDL_LIL_ENDIAN
-#define SDL_SwapLE16(X)	(X)
-#define SDL_SwapLE32(X)	(X)
-#define SDL_SwapLE64(X)	(X)
-#define SDL_SwapBE16(X)	SDL_Swap16(X)
-#define SDL_SwapBE32(X)	SDL_Swap32(X)
-#define SDL_SwapBE64(X)	SDL_Swap64(X)
-#else
-#define SDL_SwapLE16(X)	SDL_Swap16(X)
-#define SDL_SwapLE32(X)	SDL_Swap32(X)
-#define SDL_SwapLE64(X)	SDL_Swap64(X)
-#define SDL_SwapBE16(X)	(X)
-#define SDL_SwapBE32(X)	(X)
-#define SDL_SwapBE64(X)	(X)
-#endif
+#define SDL_SwapLE16(X)	htole16(X)
+#define SDL_SwapLE32(X)	htole32(X)
+#define SDL_SwapLE64(X)	htole64(X)
+#define SDL_SwapBE16(X)	htobe16(X)
+#define SDL_SwapBE32(X)	htobe32(X)
+#define SDL_SwapBE64(X)	htobe64(X)
 /*@}*/
 
 /* Ends C function definitions when using C++ */
