72 /*@{*/ |
72 /*@{*/ |
73 #if defined(__GNUC__) && defined(__i386__) && \ |
73 #if defined(__GNUC__) && defined(__i386__) && \ |
74 !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) |
74 !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) |
75 static __inline__ Uint16 SDL_Swap16(Uint16 x) |
75 static __inline__ Uint16 SDL_Swap16(Uint16 x) |
76 { |
76 { |
77 __asm__("xchgb %b0,%h0" : "=q" (x) : "0" (x)); |
77 __asm__("xchgb %b0,%h0" : "=q" (x) : "0" (x)); |
78 return x; |
78 return x; |
79 } |
79 } |
80 #elif defined(__GNUC__) && defined(__x86_64__) |
80 #elif defined(__GNUC__) && defined(__x86_64__) |
81 static __inline__ Uint16 SDL_Swap16(Uint16 x) |
81 static __inline__ Uint16 SDL_Swap16(Uint16 x) |
82 { |
82 { |
83 __asm__("xchgb %b0,%h0" : "=Q" (x) : "0" (x)); |
83 __asm__("xchgb %b0,%h0" : "=Q" (x) : "0" (x)); |
84 return x; |
84 return x; |
85 } |
85 } |
86 #elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) |
86 #elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) |
87 static __inline__ Uint16 SDL_Swap16(Uint16 x) |
87 static __inline__ Uint16 SDL_Swap16(Uint16 x) |
88 { |
88 { |
89 Uint16 result; |
89 Uint16 result; |
90 |
90 |
91 __asm__("rlwimi %0,%2,8,16,23" : "=&r" (result) : "0" (x >> 8), "r" (x)); |
91 __asm__("rlwimi %0,%2,8,16,23" : "=&r" (result) : "0" (x >> 8), "r" (x)); |
92 return result; |
92 return result; |
93 } |
93 } |
94 #elif defined(__GNUC__) && (defined(__m68k__) && !defined(__mcoldfire__)) |
94 #elif defined(__GNUC__) && (defined(__m68k__) && !defined(__mcoldfire__)) |
95 static __inline__ Uint16 SDL_Swap16(Uint16 x) |
95 static __inline__ Uint16 SDL_Swap16(Uint16 x) |
96 { |
96 { |
97 __asm__("rorw #8,%0" : "=d" (x) : "0" (x) : "cc"); |
97 __asm__("rorw #8,%0" : "=d" (x) : "0" (x) : "cc"); |
98 return x; |
98 return x; |
99 } |
99 } |
100 #else |
100 #else |
101 static __inline__ Uint16 SDL_Swap16(Uint16 x) { |
101 static __inline__ Uint16 SDL_Swap16(Uint16 x) { |
102 return SDL_static_cast(Uint16, ((x<<8)|(x>>8))); |
102 return SDL_static_cast(Uint16, ((x<<8)|(x>>8))); |
103 } |
103 } |
104 #endif |
104 #endif |
105 |
105 |
106 #if defined(__GNUC__) && defined(__i386__) && \ |
106 #if defined(__GNUC__) && defined(__i386__) && \ |
107 !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) |
107 !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) |
108 static __inline__ Uint32 SDL_Swap32(Uint32 x) |
108 static __inline__ Uint32 SDL_Swap32(Uint32 x) |
109 { |
109 { |
110 __asm__("bswap %0" : "=r" (x) : "0" (x)); |
110 __asm__("bswap %0" : "=r" (x) : "0" (x)); |
111 return x; |
111 return x; |
112 } |
112 } |
113 #elif defined(__GNUC__) && defined(__x86_64__) |
113 #elif defined(__GNUC__) && defined(__x86_64__) |
114 static __inline__ Uint32 SDL_Swap32(Uint32 x) |
114 static __inline__ Uint32 SDL_Swap32(Uint32 x) |
115 { |
115 { |
116 __asm__("bswapl %0" : "=r" (x) : "0" (x)); |
116 __asm__("bswapl %0" : "=r" (x) : "0" (x)); |
117 return x; |
117 return x; |
118 } |
118 } |
119 #elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) |
119 #elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) |
120 static __inline__ Uint32 SDL_Swap32(Uint32 x) |
120 static __inline__ Uint32 SDL_Swap32(Uint32 x) |
121 { |
121 { |
122 Uint32 result; |
122 Uint32 result; |
123 |
123 |
124 __asm__("rlwimi %0,%2,24,16,23" : "=&r" (result) : "0" (x>>24), "r" (x)); |
124 __asm__("rlwimi %0,%2,24,16,23" : "=&r" (result) : "0" (x>>24), "r" (x)); |
125 __asm__("rlwimi %0,%2,8,8,15" : "=&r" (result) : "0" (result), "r" (x)); |
125 __asm__("rlwimi %0,%2,8,8,15" : "=&r" (result) : "0" (result), "r" (x)); |
126 __asm__("rlwimi %0,%2,24,0,7" : "=&r" (result) : "0" (result), "r" (x)); |
126 __asm__("rlwimi %0,%2,24,0,7" : "=&r" (result) : "0" (result), "r" (x)); |
127 return result; |
127 return result; |
128 } |
128 } |
129 #elif defined(__GNUC__) && (defined(__m68k__) && !defined(__mcoldfire__)) |
129 #elif defined(__GNUC__) && (defined(__m68k__) && !defined(__mcoldfire__)) |
130 static __inline__ Uint32 SDL_Swap32(Uint32 x) |
130 static __inline__ Uint32 SDL_Swap32(Uint32 x) |
131 { |
131 { |
132 __asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0" : "=d" (x) : "0" (x) : "cc"); |
132 __asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0" : "=d" (x) : "0" (x) : "cc"); |
133 return x; |
133 return x; |
134 } |
134 } |
135 #else |
135 #else |
136 static __inline__ Uint32 SDL_Swap32(Uint32 x) { |
136 static __inline__ Uint32 SDL_Swap32(Uint32 x) { |
137 return SDL_static_cast(Uint32, ((x<<24)|((x<<8)&0x00FF0000)|((x>>8)&0x0000FF00)|(x>>24))); |
137 return SDL_static_cast(Uint32, ((x<<24)|((x<<8)&0x00FF0000)|((x>>8)&0x0000FF00)|(x>>24))); |
138 } |
138 } |
139 #endif |
139 #endif |
140 |
140 |
141 #ifdef SDL_HAS_64BIT_TYPE |
141 #ifdef SDL_HAS_64BIT_TYPE |
142 #if defined(__GNUC__) && defined(__i386__) && \ |
142 #if defined(__GNUC__) && defined(__i386__) && \ |
143 !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) |
143 !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) |
144 static __inline__ Uint64 SDL_Swap64(Uint64 x) |
144 static __inline__ Uint64 SDL_Swap64(Uint64 x) |
145 { |
145 { |
146 union { |
146 union { |
147 struct { Uint32 a,b; } s; |
147 struct { Uint32 a,b; } s; |
148 Uint64 u; |
148 Uint64 u; |
149 } v; |
149 } v; |
150 v.u = x; |
150 v.u = x; |
151 __asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1" |
151 __asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1" |
152 : "=r" (v.s.a), "=r" (v.s.b) |
152 : "=r" (v.s.a), "=r" (v.s.b) |
153 : "0" (v.s.a), "1" (v.s.b)); |
153 : "0" (v.s.a), "1" (v.s.b)); |
154 return v.u; |
154 return v.u; |
155 } |
155 } |
156 #elif defined(__GNUC__) && defined(__x86_64__) |
156 #elif defined(__GNUC__) && defined(__x86_64__) |
157 static __inline__ Uint64 SDL_Swap64(Uint64 x) |
157 static __inline__ Uint64 SDL_Swap64(Uint64 x) |
158 { |
158 { |
159 __asm__("bswapq %0" : "=r" (x) : "0" (x)); |
159 __asm__("bswapq %0" : "=r" (x) : "0" (x)); |
160 return x; |
160 return x; |
161 } |
161 } |
162 #else |
162 #else |
163 static __inline__ Uint64 SDL_Swap64(Uint64 x) |
163 static __inline__ Uint64 SDL_Swap64(Uint64 x) |
164 { |
164 { |
165 Uint32 hi, lo; |
165 Uint32 hi, lo; |
166 |
166 |
167 /* Separate into high and low 32-bit values and swap them */ |
167 /* Separate into high and low 32-bit values and swap them */ |
168 lo = SDL_static_cast(Uint32, x & 0xFFFFFFFF); |
168 lo = SDL_static_cast(Uint32, x & 0xFFFFFFFF); |
169 x >>= 32; |
169 x >>= 32; |
170 hi = SDL_static_cast(Uint32, x & 0xFFFFFFFF); |
170 hi = SDL_static_cast(Uint32, x & 0xFFFFFFFF); |
171 x = SDL_Swap32(lo); |
171 x = SDL_Swap32(lo); |
172 x <<= 32; |
172 x <<= 32; |
173 x |= SDL_Swap32(hi); |
173 x |= SDL_Swap32(hi); |
174 return (x); |
174 return (x); |
175 } |
175 } |
176 #endif |
176 #endif |
177 #else |
177 #else |
178 /* This is mainly to keep compilers from complaining in SDL code. |
178 /* This is mainly to keep compilers from complaining in SDL code. |
179 * If there is no real 64-bit datatype, then compilers will complain about |
179 * If there is no real 64-bit datatype, then compilers will complain about |
180 * the fake 64-bit datatype that SDL provides when it compiles user code. |
180 * the fake 64-bit datatype that SDL provides when it compiles user code. |
181 */ |
181 */ |
182 #define SDL_Swap64(X) (X) |
182 #define SDL_Swap64(X) (X) |
183 #endif /* SDL_HAS_64BIT_TYPE */ |
183 #endif /* SDL_HAS_64BIT_TYPE */ |
184 /*@}*/ |
184 /*@}*/ |
185 |
185 |
186 /** |
186 /** |
187 * @name SDL_SwapLE and SDL_SwapBE Functions |
187 * @name SDL_SwapLE and SDL_SwapBE Functions |
188 * Byteswap item from the specified endianness to the native endianness |
188 * Byteswap item from the specified endianness to the native endianness |
189 */ |
189 */ |
190 /*@{*/ |
190 /*@{*/ |
191 #if SDL_BYTEORDER == SDL_LIL_ENDIAN |
191 #if SDL_BYTEORDER == SDL_LIL_ENDIAN |
192 #define SDL_SwapLE16(X) (X) |
192 #define SDL_SwapLE16(X) (X) |
193 #define SDL_SwapLE32(X) (X) |
193 #define SDL_SwapLE32(X) (X) |
194 #define SDL_SwapLE64(X) (X) |
194 #define SDL_SwapLE64(X) (X) |
195 #define SDL_SwapBE16(X) SDL_Swap16(X) |
195 #define SDL_SwapBE16(X) SDL_Swap16(X) |
196 #define SDL_SwapBE32(X) SDL_Swap32(X) |
196 #define SDL_SwapBE32(X) SDL_Swap32(X) |
197 #define SDL_SwapBE64(X) SDL_Swap64(X) |
197 #define SDL_SwapBE64(X) SDL_Swap64(X) |
198 #else |
198 #else |
199 #define SDL_SwapLE16(X) SDL_Swap16(X) |
199 #define SDL_SwapLE16(X) SDL_Swap16(X) |
200 #define SDL_SwapLE32(X) SDL_Swap32(X) |
200 #define SDL_SwapLE32(X) SDL_Swap32(X) |
201 #define SDL_SwapLE64(X) SDL_Swap64(X) |
201 #define SDL_SwapLE64(X) SDL_Swap64(X) |
202 #define SDL_SwapBE16(X) (X) |
202 #define SDL_SwapBE16(X) (X) |
203 #define SDL_SwapBE32(X) (X) |
203 #define SDL_SwapBE32(X) (X) |
204 #define SDL_SwapBE64(X) (X) |
204 #define SDL_SwapBE64(X) (X) |
205 #endif |
205 #endif |
206 /*@}*/ |
206 /*@}*/ |
207 |
207 |
208 /* Ends C function definitions when using C++ */ |
208 /* Ends C function definitions when using C++ */ |
209 #ifdef __cplusplus |
209 #ifdef __cplusplus |