annotate include/SDL_endian.h @ 4105:84882a89ca50 SDL-1.2

Date: Thu, 27 Dec 2007 07:38:25 +0000 From: John Bartholomew Subject: [SDL] SDL Semaphore implementation broken on Windows? Hi, Over the past couple of days, I've been battling with SDL, SDL_Mixer and SMPEG to try to find an audio hang bug. I believe I've found the problem, which I think is a race condition inside SDL's semaphore implementation (at least the Windows implementation). The semaphore code uses Windows' built in semaphore functions, but it also maintains a separate count value. This count value is updated with bare increment and decrement operations in SemPost and SemWaitTimeout - no locking primitives to protect them. In tracking down the apparent audio bug, I found that at some point a semaphore's count value was being decremented to -1, which is clearly not a valid value for it to take. I'm still not certain exactly what sequence of operations is occuring for this to happen, but I believe that overall it's a race condition between a thread calling SemPost (which increments the count) and the thread on the other end calling SemWait (which decrements it). I will try to make a test case to verify this, but I'm not sure if I'll be able to (threading errors being difficult to reproduce even in the best circumstances). However, assuming this is the cause of my problems, there is a very simple fix: Windows provides InterlockedIncrement() and InterlockedDecrement() functions to perform increments and decrements which are guaranteed to be atomic. So the fix is in thread/win32/SDL_syssem.c: replace occurrences of --sem->count with InterlockedDecrement(&sem->count); and replace occurrences of ++sem->count with InterlockedIncrement(&sem->count); This is using SDL v1.2.12, built with VC++ 2008 Express, running on a Core 2 duo processor.
author Sam Lantinga <slouken@libsdl.org>
date Fri, 28 Dec 2007 22:05:17 +0000
parents 6832b00d3594
children a1b03ba2fcd0
rev   line source
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1 /*
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
2 SDL - Simple DirectMedia Layer
1312
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1044
diff changeset
3 Copyright (C) 1997-2006 Sam Lantinga
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
4
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
5 This library is free software; you can redistribute it and/or
1312
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1044
diff changeset
6 modify it under the terms of the GNU Lesser General Public
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
7 License as published by the Free Software Foundation; either
1312
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1044
diff changeset
8 version 2.1 of the License, or (at your option) any later version.
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
9
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
10 This library is distributed in the hope that it will be useful,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1312
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1044
diff changeset
13 Lesser General Public License for more details.
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
14
1312
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1044
diff changeset
15 You should have received a copy of the GNU Lesser General Public
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1044
diff changeset
16 License along with this library; if not, write to the Free Software
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1044
diff changeset
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
18
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
19 Sam Lantinga
251
b8688cfdc232 Updated the headers with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents: 0
diff changeset
20 slouken@libsdl.org
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
21 */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
22
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
23 /* Functions for reading and writing endian-specific values */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
24
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
25 #ifndef _SDL_endian_h
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
26 #define _SDL_endian_h
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
27
1354
22f39393668a Fixed build problem with SDL_string.c
Sam Lantinga <slouken@libsdl.org>
parents: 1353
diff changeset
28 #include "SDL_stdinc.h"
22f39393668a Fixed build problem with SDL_string.c
Sam Lantinga <slouken@libsdl.org>
parents: 1353
diff changeset
29
22f39393668a Fixed build problem with SDL_string.c
Sam Lantinga <slouken@libsdl.org>
parents: 1353
diff changeset
30 /* The two types of endianness */
22f39393668a Fixed build problem with SDL_string.c
Sam Lantinga <slouken@libsdl.org>
parents: 1353
diff changeset
31 #define SDL_LIL_ENDIAN 1234
22f39393668a Fixed build problem with SDL_string.c
Sam Lantinga <slouken@libsdl.org>
parents: 1353
diff changeset
32 #define SDL_BIG_ENDIAN 4321
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
33
1354
22f39393668a Fixed build problem with SDL_string.c
Sam Lantinga <slouken@libsdl.org>
parents: 1353
diff changeset
34 #ifndef SDL_BYTEORDER /* Not defined in SDL_config.h? */
1474
351d757c7edd Maybe it's easier to collect the big-endian architectures. :)
Sam Lantinga <slouken@libsdl.org>
parents: 1469
diff changeset
35 #if defined(__hppa__) || \
1475
d45aefcac017 Get Microsoft's preprocessor symbols in there
Sam Lantinga <slouken@libsdl.org>
parents: 1474
diff changeset
36 defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \
1474
351d757c7edd Maybe it's easier to collect the big-endian architectures. :)
Sam Lantinga <slouken@libsdl.org>
parents: 1469
diff changeset
37 (defined(__MIPS__) && defined(__MISPEB__)) || \
1475
d45aefcac017 Get Microsoft's preprocessor symbols in there
Sam Lantinga <slouken@libsdl.org>
parents: 1474
diff changeset
38 defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \
1474
351d757c7edd Maybe it's easier to collect the big-endian architectures. :)
Sam Lantinga <slouken@libsdl.org>
parents: 1469
diff changeset
39 defined(__sparc__)
351d757c7edd Maybe it's easier to collect the big-endian architectures. :)
Sam Lantinga <slouken@libsdl.org>
parents: 1469
diff changeset
40 #define SDL_BYTEORDER SDL_BIG_ENDIAN
351d757c7edd Maybe it's easier to collect the big-endian architectures. :)
Sam Lantinga <slouken@libsdl.org>
parents: 1469
diff changeset
41 #else
1354
22f39393668a Fixed build problem with SDL_string.c
Sam Lantinga <slouken@libsdl.org>
parents: 1353
diff changeset
42 #define SDL_BYTEORDER SDL_LIL_ENDIAN
22f39393668a Fixed build problem with SDL_string.c
Sam Lantinga <slouken@libsdl.org>
parents: 1353
diff changeset
43 #endif
22f39393668a Fixed build problem with SDL_string.c
Sam Lantinga <slouken@libsdl.org>
parents: 1353
diff changeset
44 #endif /* !SDL_BYTEORDER */
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
45
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
46
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
47 #include "begin_code.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
48 /* Set up for C function definitions, even when using C++ */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
49 #ifdef __cplusplus
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
50 extern "C" {
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
51 #endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
52
1369
42eeb14770e3 Doh! Bitten by search and replace. :)
Sam Lantinga <slouken@libsdl.org>
parents: 1368
diff changeset
53 /* Use inline functions for compilers that support them, and static
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
54 functions for those that do not. Because these functions become
1369
42eeb14770e3 Doh! Bitten by search and replace. :)
Sam Lantinga <slouken@libsdl.org>
parents: 1368
diff changeset
55 static for compilers that do not support inline functions, this
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
56 header should only be included in files that actually use them.
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
57 */
1372
Sam Lantinga <slouken@libsdl.org>
parents: 1369
diff changeset
58 #if defined(__GNUC__) && defined(__i386__) && \
3909
6832b00d3594 Patched to compile on BeOS and old, old GCC releases.
Ryan C. Gordon <icculus@icculus.org>
parents: 1475
diff changeset
59 !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */)
849
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
60 static __inline__ Uint16 SDL_Swap16(Uint16 x)
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
61 {
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
62 __asm__("xchgb %b0,%h0" : "=q" (x) : "0" (x));
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
63 return x;
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
64 }
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
65 #elif defined(__GNUC__) && defined(__x86_64__)
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
66 static __inline__ Uint16 SDL_Swap16(Uint16 x)
848
85af65457959 Avoid using kernel internal headers
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
67 {
1033
aebfa3ce2a53 The fix is going back in. :)
Sam Lantinga <slouken@libsdl.org>
parents: 1031
diff changeset
68 __asm__("xchgb %b0,%h0" : "=Q" (x) : "0" (x));
849
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
69 return x;
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
70 }
859
6b28c91bf3d2 This works on MacOS X too. :)
Sam Lantinga <slouken@libsdl.org>
parents: 849
diff changeset
71 #elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
849
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
72 static __inline__ Uint16 SDL_Swap16(Uint16 x)
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
73 {
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
74 Uint16 result;
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
75
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
76 __asm__("rlwimi %0,%2,8,16,23" : "=&r" (result) : "0" (x >> 8), "r" (x));
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
77 return result;
848
85af65457959 Avoid using kernel internal headers
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
78 }
1044
d36ea7925763 Optimize also for 68020 and higher CPUs
Patrice Mandin <patmandin@gmail.com>
parents: 1033
diff changeset
79 #elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__))
985
cec525374267 Add m68k assembly routines for endianness conversion
Patrice Mandin <patmandin@gmail.com>
parents: 859
diff changeset
80 static __inline__ Uint16 SDL_Swap16(Uint16 x)
cec525374267 Add m68k assembly routines for endianness conversion
Patrice Mandin <patmandin@gmail.com>
parents: 859
diff changeset
81 {
cec525374267 Add m68k assembly routines for endianness conversion
Patrice Mandin <patmandin@gmail.com>
parents: 859
diff changeset
82 __asm__("rorw #8,%0" : "=d" (x) : "0" (x) : "cc");
cec525374267 Add m68k assembly routines for endianness conversion
Patrice Mandin <patmandin@gmail.com>
parents: 859
diff changeset
83 return x;
cec525374267 Add m68k assembly routines for endianness conversion
Patrice Mandin <patmandin@gmail.com>
parents: 859
diff changeset
84 }
848
85af65457959 Avoid using kernel internal headers
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
85 #else
849
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
86 static __inline__ Uint16 SDL_Swap16(Uint16 x) {
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
87 return((x<<8)|(x>>8));
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
88 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
89 #endif
848
85af65457959 Avoid using kernel internal headers
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
90
3909
6832b00d3594 Patched to compile on BeOS and old, old GCC releases.
Ryan C. Gordon <icculus@icculus.org>
parents: 1475
diff changeset
91 #if defined(__GNUC__) && defined(__i386__) && \
6832b00d3594 Patched to compile on BeOS and old, old GCC releases.
Ryan C. Gordon <icculus@icculus.org>
parents: 1475
diff changeset
92 !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */)
849
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
93 static __inline__ Uint32 SDL_Swap32(Uint32 x)
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
94 {
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
95 __asm__("bswap %0" : "=r" (x) : "0" (x));
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
96 return x;
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
97 }
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
98 #elif defined(__GNUC__) && defined(__x86_64__)
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
99 static __inline__ Uint32 SDL_Swap32(Uint32 x)
848
85af65457959 Avoid using kernel internal headers
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
100 {
849
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
101 __asm__("bswapl %0" : "=r" (x) : "0" (x));
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
102 return x;
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
103 }
859
6b28c91bf3d2 This works on MacOS X too. :)
Sam Lantinga <slouken@libsdl.org>
parents: 849
diff changeset
104 #elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
849
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
105 static __inline__ Uint32 SDL_Swap32(Uint32 x)
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
106 {
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
107 Uint32 result;
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
108
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
109 __asm__("rlwimi %0,%2,24,16,23" : "=&r" (result) : "0" (x>>24), "r" (x));
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
110 __asm__("rlwimi %0,%2,8,8,15" : "=&r" (result) : "0" (result), "r" (x));
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
111 __asm__("rlwimi %0,%2,24,0,7" : "=&r" (result) : "0" (result), "r" (x));
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
112 return result;
848
85af65457959 Avoid using kernel internal headers
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
113 }
1044
d36ea7925763 Optimize also for 68020 and higher CPUs
Patrice Mandin <patmandin@gmail.com>
parents: 1033
diff changeset
114 #elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__))
994
c4e5473672b6 Wrong size of parameters for SDL_Swap32 m68k assembly routine
Patrice Mandin <patmandin@gmail.com>
parents: 985
diff changeset
115 static __inline__ Uint32 SDL_Swap32(Uint32 x)
985
cec525374267 Add m68k assembly routines for endianness conversion
Patrice Mandin <patmandin@gmail.com>
parents: 859
diff changeset
116 {
1044
d36ea7925763 Optimize also for 68020 and higher CPUs
Patrice Mandin <patmandin@gmail.com>
parents: 1033
diff changeset
117 __asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0" : "=d" (x) : "0" (x) : "cc");
985
cec525374267 Add m68k assembly routines for endianness conversion
Patrice Mandin <patmandin@gmail.com>
parents: 859
diff changeset
118 return x;
cec525374267 Add m68k assembly routines for endianness conversion
Patrice Mandin <patmandin@gmail.com>
parents: 859
diff changeset
119 }
848
85af65457959 Avoid using kernel internal headers
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
120 #else
849
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
121 static __inline__ Uint32 SDL_Swap32(Uint32 x) {
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
122 return((x<<24)|((x<<8)&0x00FF0000)|((x>>8)&0x0000FF00)|(x>>24));
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
123 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
124 #endif
848
85af65457959 Avoid using kernel internal headers
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
125
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
126 #ifdef SDL_HAS_64BIT_TYPE
3909
6832b00d3594 Patched to compile on BeOS and old, old GCC releases.
Ryan C. Gordon <icculus@icculus.org>
parents: 1475
diff changeset
127 #if defined(__GNUC__) && defined(__i386__) && \
6832b00d3594 Patched to compile on BeOS and old, old GCC releases.
Ryan C. Gordon <icculus@icculus.org>
parents: 1475
diff changeset
128 !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */)
849
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
129 static __inline__ Uint64 SDL_Swap64(Uint64 x)
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
130 {
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
131 union {
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
132 struct { Uint32 a,b; } s;
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
133 Uint64 u;
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
134 } v;
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
135 v.u = x;
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
136 __asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1"
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
137 : "=r" (v.s.a), "=r" (v.s.b)
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
138 : "0" (v.s.a), "1" (v.s.b));
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
139 return v.u;
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
140 }
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
141 #elif defined(__GNUC__) && defined(__x86_64__)
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
142 static __inline__ Uint64 SDL_Swap64(Uint64 x)
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
143 {
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
144 __asm__("bswapq %0" : "=r" (x) : "0" (x));
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
145 return x;
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
146 }
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
147 #else
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
148 static __inline__ Uint64 SDL_Swap64(Uint64 x)
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
149 {
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
150 Uint32 hi, lo;
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
151
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
152 /* Separate into high and low 32-bit values and swap them */
849
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
153 lo = (Uint32)(x&0xFFFFFFFF);
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
154 x >>= 32;
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
155 hi = (Uint32)(x&0xFFFFFFFF);
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
156 x = SDL_Swap32(lo);
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
157 x <<= 32;
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
158 x |= SDL_Swap32(hi);
bab227101de4 Added inline byte swapping code for other architectures
Sam Lantinga <slouken@libsdl.org>
parents: 848
diff changeset
159 return(x);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
160 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
161 #endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
162 #else
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
163 /* This is mainly to keep compilers from complaining in SDL code.
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
164 If there is no real 64-bit datatype, then compilers will complain about
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
165 the fake 64-bit datatype that SDL provides when it compiles user code.
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
166 */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
167 #define SDL_Swap64(X) (X)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
168 #endif /* SDL_HAS_64BIT_TYPE */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
169
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
170
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
171 /* Byteswap item from the specified endianness to the native endianness */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
172 #if SDL_BYTEORDER == SDL_LIL_ENDIAN
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
173 #define SDL_SwapLE16(X) (X)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
174 #define SDL_SwapLE32(X) (X)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
175 #define SDL_SwapLE64(X) (X)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
176 #define SDL_SwapBE16(X) SDL_Swap16(X)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
177 #define SDL_SwapBE32(X) SDL_Swap32(X)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
178 #define SDL_SwapBE64(X) SDL_Swap64(X)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
179 #else
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
180 #define SDL_SwapLE16(X) SDL_Swap16(X)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
181 #define SDL_SwapLE32(X) SDL_Swap32(X)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
182 #define SDL_SwapLE64(X) SDL_Swap64(X)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
183 #define SDL_SwapBE16(X) (X)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
184 #define SDL_SwapBE32(X) (X)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
185 #define SDL_SwapBE64(X) (X)
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
186 #endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
187
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
188 /* Ends C function definitions when using C++ */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
189 #ifdef __cplusplus
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
190 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
191 #endif
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
192 #include "close_code.h"
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
193
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
194 #endif /* _SDL_endian_h */