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