include/SDL_endian.h
author Sam Lantinga <slouken@libsdl.org>
Sat, 26 Sep 2009 23:17:08 +0000
branchSDL-1.2
changeset 4246 8b8314cc34a6
parent 4217 4c4113c2162c
child 4283 cd511a8560b7
permissions -rw-r--r--
Fixed bug #810

Lauri Kenttä 2009-09-26 06:42:23 PDT

Support for disabling stdio redirect with environment variables.
     1 /*
     2     SDL - Simple DirectMedia Layer
     3     Copyright (C) 1997-2009 Sam Lantinga
     4 
     5     This library is free software; you can redistribute it and/or
     6     modify it under the terms of the GNU Lesser General Public
     7     License as published by the Free Software Foundation; either
     8     version 2.1 of the License, or (at your option) any later version.
     9 
    10     This library is distributed in the hope that it will be useful,
    11     but WITHOUT ANY WARRANTY; without even the implied warranty of
    12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    13     Lesser General Public License for more details.
    14 
    15     You should have received a copy of the GNU Lesser General Public
    16     License along with this library; if not, write to the Free Software
    17     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    18 
    19     Sam Lantinga
    20     slouken@libsdl.org
    21 */
    22 
    23 /**
    24  *  @file SDL_endian.h
    25  *  Functions for reading and writing endian-specific values
    26  */
    27 
    28 #ifndef _SDL_endian_h
    29 #define _SDL_endian_h
    30 
    31 #include "SDL_stdinc.h"
    32 
    33 /** @name SDL_ENDIANs
    34  *  The two types of endianness 
    35  */
    36 /*@{*/
    37 #define SDL_LIL_ENDIAN	1234
    38 #define SDL_BIG_ENDIAN	4321
    39 /*@}*/
    40 
    41 #ifndef SDL_BYTEORDER	/* Not defined in SDL_config.h? */
    42 #if defined(__hppa__) || \
    43     defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \
    44     (defined(__MIPS__) && defined(__MISPEB__)) || \
    45     defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \
    46     defined(__sparc__)
    47 #define SDL_BYTEORDER	SDL_BIG_ENDIAN
    48 #else
    49 #define SDL_BYTEORDER	SDL_LIL_ENDIAN
    50 #endif
    51 #endif /* !SDL_BYTEORDER */
    52 
    53 
    54 #include "begin_code.h"
    55 /* Set up for C function definitions, even when using C++ */
    56 #ifdef __cplusplus
    57 extern "C" {
    58 #endif
    59 
    60 /**
    61  *  @name SDL_Swap Functions
    62  *  Use inline functions for compilers that support them, and static
    63  *  functions for those that do not.  Because these functions become
    64  *  static for compilers that do not support inline functions, this
    65  *  header should only be included in files that actually use them.
    66  */
    67 /*@{*/
    68 #if defined(__GNUC__) && defined(__i386__) && \
    69    !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */)
    70 static __inline__ Uint16 SDL_Swap16(Uint16 x)
    71 {
    72 	__asm__("xchgb %b0,%h0" : "=q" (x) :  "0" (x));
    73 	return x;
    74 }
    75 #elif defined(__GNUC__) && defined(__x86_64__)
    76 static __inline__ Uint16 SDL_Swap16(Uint16 x)
    77 {
    78 	__asm__("xchgb %b0,%h0" : "=Q" (x) :  "0" (x));
    79 	return x;
    80 }
    81 #elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
    82 static __inline__ Uint16 SDL_Swap16(Uint16 x)
    83 {
    84 	Uint16 result;
    85 
    86 	__asm__("rlwimi %0,%2,8,16,23" : "=&r" (result) : "0" (x >> 8), "r" (x));
    87 	return result;
    88 }
    89 #elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__))
    90 static __inline__ Uint16 SDL_Swap16(Uint16 x)
    91 {
    92 	__asm__("rorw #8,%0" : "=d" (x) :  "0" (x) : "cc");
    93 	return x;
    94 }
    95 #else
    96 static __inline__ Uint16 SDL_Swap16(Uint16 x) {
    97 	return((x<<8)|(x>>8));
    98 }
    99 #endif
   100 
   101 #if defined(__GNUC__) && defined(__i386__) && \
   102    !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */)
   103 static __inline__ Uint32 SDL_Swap32(Uint32 x)
   104 {
   105 	__asm__("bswap %0" : "=r" (x) : "0" (x));
   106 	return x;
   107 }
   108 #elif defined(__GNUC__) && defined(__x86_64__)
   109 static __inline__ Uint32 SDL_Swap32(Uint32 x)
   110 {
   111 	__asm__("bswapl %0" : "=r" (x) : "0" (x));
   112 	return x;
   113 }
   114 #elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
   115 static __inline__ Uint32 SDL_Swap32(Uint32 x)
   116 {
   117 	Uint32 result;
   118 
   119 	__asm__("rlwimi %0,%2,24,16,23" : "=&r" (result) : "0" (x>>24), "r" (x));
   120 	__asm__("rlwimi %0,%2,8,8,15"   : "=&r" (result) : "0" (result),    "r" (x));
   121 	__asm__("rlwimi %0,%2,24,0,7"   : "=&r" (result) : "0" (result),    "r" (x));
   122 	return result;
   123 }
   124 #elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__))
   125 static __inline__ Uint32 SDL_Swap32(Uint32 x)
   126 {
   127 	__asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0" : "=d" (x) :  "0" (x) : "cc");
   128 	return x;
   129 }
   130 #else
   131 static __inline__ Uint32 SDL_Swap32(Uint32 x) {
   132 	return((x<<24)|((x<<8)&0x00FF0000)|((x>>8)&0x0000FF00)|(x>>24));
   133 }
   134 #endif
   135 
   136 #ifdef SDL_HAS_64BIT_TYPE
   137 #if defined(__GNUC__) && defined(__i386__) && \
   138    !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */)
   139 static __inline__ Uint64 SDL_Swap64(Uint64 x)
   140 {
   141 	union { 
   142 		struct { Uint32 a,b; } s;
   143 		Uint64 u;
   144 	} v;
   145 	v.u = x;
   146 	__asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1" 
   147 	        : "=r" (v.s.a), "=r" (v.s.b) 
   148 	        : "0" (v.s.a), "1" (v.s.b)); 
   149 	return v.u;
   150 }
   151 #elif defined(__GNUC__) && defined(__x86_64__)
   152 static __inline__ Uint64 SDL_Swap64(Uint64 x)
   153 {
   154 	__asm__("bswapq %0" : "=r" (x) : "0" (x));
   155 	return x;
   156 }
   157 #else
   158 static __inline__ Uint64 SDL_Swap64(Uint64 x)
   159 {
   160 	Uint32 hi, lo;
   161 
   162 	/* Separate into high and low 32-bit values and swap them */
   163 	lo = (Uint32)(x&0xFFFFFFFF);
   164 	x >>= 32;
   165 	hi = (Uint32)(x&0xFFFFFFFF);
   166 	x = SDL_Swap32(lo);
   167 	x <<= 32;
   168 	x |= SDL_Swap32(hi);
   169 	return(x);
   170 }
   171 #endif
   172 #else
   173 /* This is mainly to keep compilers from complaining in SDL code.
   174  * If there is no real 64-bit datatype, then compilers will complain about
   175  * the fake 64-bit datatype that SDL provides when it compiles user code.
   176  */
   177 #define SDL_Swap64(X)	(X)
   178 #endif /* SDL_HAS_64BIT_TYPE */
   179 /*@}*/
   180 
   181 /**
   182  *  @name SDL_SwapLE and SDL_SwapBE Functions
   183  *  Byteswap item from the specified endianness to the native endianness
   184  */
   185 /*@{*/
   186 #if SDL_BYTEORDER == SDL_LIL_ENDIAN
   187 #define SDL_SwapLE16(X)	(X)
   188 #define SDL_SwapLE32(X)	(X)
   189 #define SDL_SwapLE64(X)	(X)
   190 #define SDL_SwapBE16(X)	SDL_Swap16(X)
   191 #define SDL_SwapBE32(X)	SDL_Swap32(X)
   192 #define SDL_SwapBE64(X)	SDL_Swap64(X)
   193 #else
   194 #define SDL_SwapLE16(X)	SDL_Swap16(X)
   195 #define SDL_SwapLE32(X)	SDL_Swap32(X)
   196 #define SDL_SwapLE64(X)	SDL_Swap64(X)
   197 #define SDL_SwapBE16(X)	(X)
   198 #define SDL_SwapBE32(X)	(X)
   199 #define SDL_SwapBE64(X)	(X)
   200 #endif
   201 /*@}*/
   202 
   203 /* Ends C function definitions when using C++ */
   204 #ifdef __cplusplus
   205 }
   206 #endif
   207 #include "close_code.h"
   208 
   209 #endif /* _SDL_endian_h */