|
|
1.1 ! root 1: /* ! 2: SDL - Simple DirectMedia Layer ! 3: Copyright (C) 1997-2004 Sam Lantinga ! 4: ! 5: This library is free software; you can redistribute it and/or ! 6: modify it under the terms of the GNU Library General Public ! 7: License as published by the Free Software Foundation; either ! 8: version 2 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: Library General Public License for more details. ! 14: ! 15: You should have received a copy of the GNU Library General Public ! 16: License along with this library; if not, write to the Free ! 17: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! 18: ! 19: Sam Lantinga ! 20: [email protected] ! 21: */ ! 22: ! 23: #ifdef SAVE_RCSID ! 24: static char rcsid = ! 25: "@(#) $Id: SDL_endian.h,v 1.1.1.1 2005/11/18 23:23:29 rswindell Exp $"; ! 26: #endif ! 27: ! 28: /* Functions for reading and writing endian-specific values */ ! 29: ! 30: #ifndef _SDL_endian_h ! 31: #define _SDL_endian_h ! 32: ! 33: /* These functions read and write data of the specified endianness, ! 34: dynamically translating to the host machine endianness. ! 35: ! 36: e.g.: If you want to read a 16 bit value on big-endian machine from ! 37: an open file containing little endian values, you would use: ! 38: value = SDL_ReadLE16(rp); ! 39: Note that the read/write functions use SDL_RWops pointers ! 40: instead of FILE pointers. This allows you to read and write ! 41: endian values from large chunks of memory as well as files ! 42: and other data sources. ! 43: */ ! 44: ! 45: #include <stdio.h> ! 46: ! 47: #include "SDL_types.h" ! 48: #include "SDL_rwops.h" ! 49: #include "SDL_byteorder.h" ! 50: ! 51: #include "begin_code.h" ! 52: /* Set up for C function definitions, even when using C++ */ ! 53: #ifdef __cplusplus ! 54: extern "C" { ! 55: #endif ! 56: ! 57: /* Use inline functions for compilers that support them, and static ! 58: functions for those that do not. Because these functions become ! 59: static for compilers that do not support inline functions, this ! 60: header should only be included in files that actually use them. ! 61: */ ! 62: #if defined(__GNUC__) && defined(__i386__) ! 63: static __inline__ Uint16 SDL_Swap16(Uint16 x) ! 64: { ! 65: __asm__("xchgb %b0,%h0" : "=q" (x) : "0" (x)); ! 66: return x; ! 67: } ! 68: #elif defined(__GNUC__) && defined(__x86_64__) ! 69: static __inline__ Uint16 SDL_Swap16(Uint16 x) ! 70: { ! 71: __asm__("xchgb %b0,%h0" : "=Q" (x) : "0" (x)); ! 72: return x; ! 73: } ! 74: #elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) ! 75: static __inline__ Uint16 SDL_Swap16(Uint16 x) ! 76: { ! 77: Uint16 result; ! 78: ! 79: __asm__("rlwimi %0,%2,8,16,23" : "=&r" (result) : "0" (x >> 8), "r" (x)); ! 80: return result; ! 81: } ! 82: #elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) ! 83: static __inline__ Uint16 SDL_Swap16(Uint16 x) ! 84: { ! 85: __asm__("rorw #8,%0" : "=d" (x) : "0" (x) : "cc"); ! 86: return x; ! 87: } ! 88: #else ! 89: static __inline__ Uint16 SDL_Swap16(Uint16 x) { ! 90: return((x<<8)|(x>>8)); ! 91: } ! 92: #endif ! 93: ! 94: #if defined(__GNUC__) && defined(__i386__) ! 95: static __inline__ Uint32 SDL_Swap32(Uint32 x) ! 96: { ! 97: __asm__("bswap %0" : "=r" (x) : "0" (x)); ! 98: return x; ! 99: } ! 100: #elif defined(__GNUC__) && defined(__x86_64__) ! 101: static __inline__ Uint32 SDL_Swap32(Uint32 x) ! 102: { ! 103: __asm__("bswapl %0" : "=r" (x) : "0" (x)); ! 104: return x; ! 105: } ! 106: #elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) ! 107: static __inline__ Uint32 SDL_Swap32(Uint32 x) ! 108: { ! 109: Uint32 result; ! 110: ! 111: __asm__("rlwimi %0,%2,24,16,23" : "=&r" (result) : "0" (x>>24), "r" (x)); ! 112: __asm__("rlwimi %0,%2,8,8,15" : "=&r" (result) : "0" (result), "r" (x)); ! 113: __asm__("rlwimi %0,%2,24,0,7" : "=&r" (result) : "0" (result), "r" (x)); ! 114: return result; ! 115: } ! 116: #elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) ! 117: static __inline__ Uint32 SDL_Swap32(Uint32 x) ! 118: { ! 119: __asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0" : "=d" (x) : "0" (x) : "cc"); ! 120: return x; ! 121: } ! 122: #else ! 123: static __inline__ Uint32 SDL_Swap32(Uint32 x) { ! 124: return((x<<24)|((x<<8)&0x00FF0000)|((x>>8)&0x0000FF00)|(x>>24)); ! 125: } ! 126: #endif ! 127: ! 128: #ifdef SDL_HAS_64BIT_TYPE ! 129: #if defined(__GNUC__) && defined(__i386__) ! 130: static __inline__ Uint64 SDL_Swap64(Uint64 x) ! 131: { ! 132: union { ! 133: struct { Uint32 a,b; } s; ! 134: Uint64 u; ! 135: } v; ! 136: v.u = x; ! 137: __asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1" ! 138: : "=r" (v.s.a), "=r" (v.s.b) ! 139: : "0" (v.s.a), "1" (v.s.b)); ! 140: return v.u; ! 141: } ! 142: #elif defined(__GNUC__) && defined(__x86_64__) ! 143: static __inline__ Uint64 SDL_Swap64(Uint64 x) ! 144: { ! 145: __asm__("bswapq %0" : "=r" (x) : "0" (x)); ! 146: return x; ! 147: } ! 148: #else ! 149: static __inline__ Uint64 SDL_Swap64(Uint64 x) ! 150: { ! 151: Uint32 hi, lo; ! 152: ! 153: /* Separate into high and low 32-bit values and swap them */ ! 154: lo = (Uint32)(x&0xFFFFFFFF); ! 155: x >>= 32; ! 156: hi = (Uint32)(x&0xFFFFFFFF); ! 157: x = SDL_Swap32(lo); ! 158: x <<= 32; ! 159: x |= SDL_Swap32(hi); ! 160: return(x); ! 161: } ! 162: #endif ! 163: #else ! 164: /* This is mainly to keep compilers from complaining in SDL code. ! 165: If there is no real 64-bit datatype, then compilers will complain about ! 166: the fake 64-bit datatype that SDL provides when it compiles user code. ! 167: */ ! 168: #define SDL_Swap64(X) (X) ! 169: #endif /* SDL_HAS_64BIT_TYPE */ ! 170: ! 171: ! 172: /* Byteswap item from the specified endianness to the native endianness */ ! 173: #if SDL_BYTEORDER == SDL_LIL_ENDIAN ! 174: #define SDL_SwapLE16(X) (X) ! 175: #define SDL_SwapLE32(X) (X) ! 176: #define SDL_SwapLE64(X) (X) ! 177: #define SDL_SwapBE16(X) SDL_Swap16(X) ! 178: #define SDL_SwapBE32(X) SDL_Swap32(X) ! 179: #define SDL_SwapBE64(X) SDL_Swap64(X) ! 180: #else ! 181: #define SDL_SwapLE16(X) SDL_Swap16(X) ! 182: #define SDL_SwapLE32(X) SDL_Swap32(X) ! 183: #define SDL_SwapLE64(X) SDL_Swap64(X) ! 184: #define SDL_SwapBE16(X) (X) ! 185: #define SDL_SwapBE32(X) (X) ! 186: #define SDL_SwapBE64(X) (X) ! 187: #endif ! 188: ! 189: /* Read an item of the specified endianness and return in native format */ ! 190: extern DECLSPEC Uint16 SDLCALL SDL_ReadLE16(SDL_RWops *src); ! 191: extern DECLSPEC Uint16 SDLCALL SDL_ReadBE16(SDL_RWops *src); ! 192: extern DECLSPEC Uint32 SDLCALL SDL_ReadLE32(SDL_RWops *src); ! 193: extern DECLSPEC Uint32 SDLCALL SDL_ReadBE32(SDL_RWops *src); ! 194: extern DECLSPEC Uint64 SDLCALL SDL_ReadLE64(SDL_RWops *src); ! 195: extern DECLSPEC Uint64 SDLCALL SDL_ReadBE64(SDL_RWops *src); ! 196: ! 197: /* Write an item of native format to the specified endianness */ ! 198: extern DECLSPEC int SDLCALL SDL_WriteLE16(SDL_RWops *dst, Uint16 value); ! 199: extern DECLSPEC int SDLCALL SDL_WriteBE16(SDL_RWops *dst, Uint16 value); ! 200: extern DECLSPEC int SDLCALL SDL_WriteLE32(SDL_RWops *dst, Uint32 value); ! 201: extern DECLSPEC int SDLCALL SDL_WriteBE32(SDL_RWops *dst, Uint32 value); ! 202: extern DECLSPEC int SDLCALL SDL_WriteLE64(SDL_RWops *dst, Uint64 value); ! 203: extern DECLSPEC int SDLCALL SDL_WriteBE64(SDL_RWops *dst, Uint64 value); ! 204: ! 205: ! 206: /* Ends C function definitions when using C++ */ ! 207: #ifdef __cplusplus ! 208: } ! 209: #endif ! 210: #include "close_code.h" ! 211: ! 212: #endif /* _SDL_endian_h */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.