pcsxr-1.9.92
[pcsx_rearmed.git] / macosx / plugins / DFInput / SDL / include / SDL_endian.h
CommitLineData
ef79bbde
P
1/*
2 SDL - Simple DirectMedia Layer
3 Copyright (C) 1997-2010 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 *
26 * Functions for reading and writing endian-specific values
27 */
28
29#ifndef _SDL_endian_h
30#define _SDL_endian_h
31
32#include "SDL_stdinc.h"
33
34/**
35 * \name The two types of endianness
36 */
37/*@{*/
38#define SDL_LIL_ENDIAN 1234
39#define SDL_BIG_ENDIAN 4321
40/*@}*/
41
42#ifndef SDL_BYTEORDER /* Not defined in SDL_config.h? */
43#ifdef __linux__
44#include <endian.h>
45#define SDL_BYTEORDER __BYTE_ORDER
46#else /* __linux __ */
47#if defined(__hppa__) || \
48 defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \
49 (defined(__MIPS__) && defined(__MISPEB__)) || \
50 defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \
51 defined(__sparc__)
52#define SDL_BYTEORDER SDL_BIG_ENDIAN
53#else
54#define SDL_BYTEORDER SDL_LIL_ENDIAN
55#endif
56#endif /* __linux __ */
57#endif /* !SDL_BYTEORDER */
58
59
60#include "begin_code.h"
61/* Set up for C function definitions, even when using C++ */
62#ifdef __cplusplus
63/* *INDENT-OFF* */
64extern "C" {
65/* *INDENT-ON* */
66#endif
67
68/**
69 * \file SDL_endian.h
70 *
71 * Uses inline functions for compilers that support them, and static
72 * functions for those that do not. Because these functions become
73 * static for compilers that do not support inline functions, this
74 * header should only be included in files that actually use them.
75 */
76#if defined(__GNUC__) && defined(__i386__) && \
77 !(__GNUC__ == 2 && __GNUC_MINOR__ == 95 /* broken gcc version */)
78static __inline__ Uint16
79SDL_Swap16(Uint16 x)
80{
81 __asm__("xchgb %b0,%h0": "=q"(x):"0"(x));
82 return x;
83}
84#elif defined(__GNUC__) && defined(__x86_64__)
85static __inline__ Uint16
86SDL_Swap16(Uint16 x)
87{
88 __asm__("xchgb %b0,%h0": "=Q"(x):"0"(x));
89 return x;
90}
91#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
92static __inline__ Uint16
93SDL_Swap16(Uint16 x)
94{
95 Uint16 result;
96
97 __asm__("rlwimi %0,%2,8,16,23": "=&r"(result):"0"(x >> 8), "r"(x));
98 return result;
99}
100#elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) && !defined(__mcoldfire__)
101static __inline__ Uint16
102SDL_Swap16(Uint16 x)
103{
104 __asm__("rorw #8,%0": "=d"(x): "0"(x):"cc");
105 return x;
106}
107#else
108static __inline__ Uint16
109SDL_Swap16(Uint16 x)
110{
111 return SDL_static_cast(Uint16, ((x << 8) | (x >> 8)));
112}
113#endif
114
115#if defined(__GNUC__) && defined(__i386__)
116static __inline__ Uint32
117SDL_Swap32(Uint32 x)
118{
119 __asm__("bswap %0": "=r"(x):"0"(x));
120 return x;
121}
122#elif defined(__GNUC__) && defined(__x86_64__)
123static __inline__ Uint32
124SDL_Swap32(Uint32 x)
125{
126 __asm__("bswapl %0": "=r"(x):"0"(x));
127 return x;
128}
129#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
130static __inline__ Uint32
131SDL_Swap32(Uint32 x)
132{
133 Uint32 result;
134
135 __asm__("rlwimi %0,%2,24,16,23": "=&r"(result):"0"(x >> 24), "r"(x));
136 __asm__("rlwimi %0,%2,8,8,15": "=&r"(result):"0"(result), "r"(x));
137 __asm__("rlwimi %0,%2,24,0,7": "=&r"(result):"0"(result), "r"(x));
138 return result;
139}
140#elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) && !defined(__mcoldfire__)
141static __inline__ Uint32
142SDL_Swap32(Uint32 x)
143{
144 __asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0": "=d"(x): "0"(x):"cc");
145 return x;
146}
147#else
148static __inline__ Uint32
149SDL_Swap32(Uint32 x)
150{
151 return SDL_static_cast(Uint32, ((x << 24) | ((x << 8) & 0x00FF0000) |
152 ((x >> 8) & 0x0000FF00) | (x >> 24)));
153}
154#endif
155
156#ifdef SDL_HAS_64BIT_TYPE
157#if defined(__GNUC__) && defined(__i386__)
158static __inline__ Uint64
159SDL_Swap64(Uint64 x)
160{
161 union
162 {
163 struct
164 {
165 Uint32 a, b;
166 } s;
167 Uint64 u;
168 } v;
169 v.u = x;
170 __asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1": "=r"(v.s.a), "=r"(v.s.b):"0"(v.s.a),
171 "1"(v.s.
172 b));
173 return v.u;
174}
175#elif defined(__GNUC__) && defined(__x86_64__)
176static __inline__ Uint64
177SDL_Swap64(Uint64 x)
178{
179 __asm__("bswapq %0": "=r"(x):"0"(x));
180 return x;
181}
182#else
183static __inline__ Uint64
184SDL_Swap64(Uint64 x)
185{
186 Uint32 hi, lo;
187
188 /* Separate into high and low 32-bit values and swap them */
189 lo = SDL_static_cast(Uint32, x & 0xFFFFFFFF);
190 x >>= 32;
191 hi = SDL_static_cast(Uint32, x & 0xFFFFFFFF);
192 x = SDL_Swap32(lo);
193 x <<= 32;
194 x |= SDL_Swap32(hi);
195 return (x);
196}
197#endif
198#else
199/**
200 * This is mainly to keep compilers from complaining in SDL code.
201 * If there is no real 64-bit datatype, then compilers will complain about
202 * the fake 64-bit datatype that SDL provides when it compiles user code.
203 */
204#define SDL_Swap64(X) (X)
205#endif /* SDL_HAS_64BIT_TYPE */
206
207
208static __inline__ float
209SDL_SwapFloat(float x)
210{
211 union
212 {
213 float f;
214 Uint32 ui32;
215 } swapper;
216 swapper.f = x;
217 swapper.ui32 = SDL_Swap32(swapper.ui32);
218 return swapper.f;
219}
220
221
222/**
223 * \name Swap to native
224 * Byteswap item from the specified endianness to the native endianness.
225 */
226/*@{*/
227#if SDL_BYTEORDER == SDL_LIL_ENDIAN
228#define SDL_SwapLE16(X) (X)
229#define SDL_SwapLE32(X) (X)
230#define SDL_SwapLE64(X) (X)
231#define SDL_SwapFloatLE(X) (X)
232#define SDL_SwapBE16(X) SDL_Swap16(X)
233#define SDL_SwapBE32(X) SDL_Swap32(X)
234#define SDL_SwapBE64(X) SDL_Swap64(X)
235#define SDL_SwapFloatBE(X) SDL_SwapFloat(X)
236#else
237#define SDL_SwapLE16(X) SDL_Swap16(X)
238#define SDL_SwapLE32(X) SDL_Swap32(X)
239#define SDL_SwapLE64(X) SDL_Swap64(X)
240#define SDL_SwapFloatLE(X) SDL_SwapFloat(X)
241#define SDL_SwapBE16(X) (X)
242#define SDL_SwapBE32(X) (X)
243#define SDL_SwapBE64(X) (X)
244#define SDL_SwapFloatBE(X) (X)
245#endif
246/*@}*//*Swap to native*/
247
248/* Ends C function definitions when using C++ */
249#ifdef __cplusplus
250/* *INDENT-OFF* */
251}
252/* *INDENT-ON* */
253#endif
254#include "close_code.h"
255
256#endif /* _SDL_endian_h */
257
258/* vi: set ts=4 sw=4 expandtab: */