Annotation of sbbs/include/sdl/sdl_endian.h, revision 1.1.1.1

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 */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.