[7297] Fixed profession spells sorting in trainer spell list at client.
[getmangos.git] / dep / ACE_wrappers / ace / Atomic_Op_Sparc.c
blob842673e58ccc0974fcb973bcfc31b598bc15234c
1 /* $Id: Atomic_Op_Sparc.c 80826 2008-03-04 14:51:23Z wotte $
3 * This is a C file for a reason. The Sun C++ compiler does not accept
4 * inline assembler.
6 * Portions of this code are based on atomic operations found in the
7 * linux kernel source code.
8 */
10 #if defined (ACE_INCLUDE_ATOMIC_OP_SPARC)
12 #if defined(__i386) && defined(__SUNPRO_C)
13 static void
14 __sunpro_asm_code() {
15 __asm("\n\
16 .globl ace_atomic_add_long \n\
17 .type ace_atomic_add_long,@function \n\
18 .align 4 \n\
19 ace_atomic_add_long: \n\
20 movl 0x00000004(%esp), %edx \n\
21 movl 0x00000008(%esp), %eax \n\
22 lock; xadd %eax, (%edx) \n\
23 addl 0x00000008(%esp), %eax \n\
24 ret \n\
25 ");
27 __asm("\n\
28 .globl ace_atomic_swap_long \n\
29 .type ace_atomic_swap_long,@function \n\
30 .align 4 \n\
31 ace_atomic_swap_long: \n\
32 movl 0x00000004(%esp), %edx \n\
33 movl 0x00000008(%esp), %eax \n\
34 xchg %eax, (%edx) \n\
35 ret \n\
36 ");
38 __asm("\n\
39 .globl ace_atomic_swap_add_long \n\
40 .type ace_atomic_swap_add_long,@function \n\
41 .align 4 \n\
42 ace_atomic_swap_add_long: \n\
43 movl 0x00000004(%esp), %edx \n\
44 movl 0x00000008(%esp), %eax \n\
45 lock; xadd %eax, (%edx) \n\
46 ret \n\
47 ");
50 #elif defined(__x86_64) && defined(__SUNPRO_C)
52 static void
53 __sunpro_asm_code() {
54 __asm("\n\
55 .globl ace_atomic_add_long \n\
56 .type ace_atomic_add_long,@function \n\
57 .align 16 \n\
58 ace_atomic_add_long: \n\
59 movq %rsi, %rax \n\
60 lock; xaddq %rax, (%rdi) \n\
61 addq %rsi, %rax \n\
62 ret \n\
63 ");
65 __asm("\n\
66 .globl ace_atomic_swap_long \n\
67 .type ace_atomic_swap_long,@function \n\
68 .align 16 \n\
69 ace_atomic_swap_long: \n\
70 xchgq %rsi, (%rdi) \n\
71 movq %rsi, %rax \n\
72 ret \n\
73 ");
75 __asm("\n\
76 .globl ace_atomic_swap_add_long \n\
77 .type ace_atomic_swap_add_long,@function \n\
78 .align 16 \n\
79 ace_atomic_swap_add_long: \n\
80 lock; xaddq %rsi, (%rdi) \n\
81 movq %rsi, %rax \n\
82 ret \n\
83 ");
86 #elif defined (__sparcv9)
88 unsigned long
89 ace_atomic_add_long (volatile unsigned long *dest, long rhs)
91 __asm ("restore\n"
92 "ldx [%o0], %o2\n"
93 ".again_add:\n"
94 "add %o2, %o1, %o3\n"
95 "casx [%o0], %o2, %o3\n"
96 "cmp %o2, %o3\n"
97 "bne,pn %xcc, .again_add\n"
98 "mov %o3, %o2\n"
99 "retl\n"
100 "add %o2, %o1, %o0\n");
103 unsigned long
104 ace_atomic_swap_long (volatile unsigned long *dest, unsigned long rhs)
106 __asm ("restore\n"
107 "ldx [%o0], %o2\n"
108 ".again_swap:\n"
109 "mov %o1, %o3\n"
110 "casx [%o0], %o2, %o3\n"
111 "cmp %o2, %o3\n"
112 "bne,pn %xcc, .again_swap\n"
113 "mov %o3, %o2\n"
114 "retl\n"
115 "mov %o3, %o0\n");
118 unsigned long
119 ace_atomic_swap_add_long (volatile unsigned long *dest, long rhs)
121 __asm ("restore\n"
122 "ldx [%o0], %o2\n"
123 ".again_swap_add:\n"
124 "mov %o2, %o4\n"
125 "add %o2, %o1, %o3\n"
126 "casx [%o0], %o2, %o3\n"
127 "cmp %o2, %o3\n"
128 "bne,pn %xcc, .again_swap_add\n"
129 "mov %o3, %o2\n"
130 "retl\n"
131 "mov %o4, %o0\n");
134 #else
136 unsigned long
137 ace_atomic_add_long (volatile unsigned long *dest, long rhs)
139 __asm ("restore\n"
140 "ld [%o0], %o2\n"
141 ".again_add:\n"
142 "add %o2, %o1, %o3\n"
143 "cas [%o0], %o2, %o3\n"
144 "cmp %o2, %o3\n"
145 "bne,pn %icc, .again_add\n"
146 "mov %o3, %o2\n"
147 "retl\n"
148 "add %o2, %o1, %o0\n");
151 unsigned long
152 ace_atomic_swap_long (volatile unsigned long *dest, unsigned long rhs)
154 __asm ("restore\n"
155 "ld [%o0], %o2\n"
156 ".again_swap:\n"
157 "mov %o1, %o3\n"
158 "cas [%o0], %o2, %o3\n"
159 "cmp %o2, %o3\n"
160 "bne,pn %icc, .again_swap\n"
161 "mov %o3, %o2\n"
162 "retl\n"
163 "mov %o3, %o0\n");
166 unsigned long
167 ace_atomic_swap_add_long (volatile unsigned long *dest, long rhs)
169 __asm ("restore\n"
170 "ld [%o0], %o2\n"
171 ".again_swap_add:\n"
172 "mov %o2, %o4\n"
173 "add %o2, %o1, %o3\n"
174 "cas [%o0], %o2, %o3\n"
175 "cmp %o2, %o3\n"
176 "bne,pn %icc, .again_swap_add\n"
177 "mov %o3, %o2\n"
178 "retl\n"
179 "mov %o4, %o0\n");
182 # endif /* __sparcv9 */
184 #elif !defined (__GNUC__) && !defined (__INTEL_COMPILER)
185 /* Make compilers stop complaining about an empty translation unit */
186 static int shut_up_compiler = 0;
187 #endif /* ACE_INCLUDE_ATOMIC_OP_SPARC */