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
6 * Portions of this code are based on atomic operations found in the
7 * linux kernel source code.
10 #if defined (ACE_INCLUDE_ATOMIC_OP_SPARC)
12 #if defined(__i386) && defined(__SUNPRO_C)
16 .globl ace_atomic_add_long \n\
17 .type ace_atomic_add_long,@function \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\
28 .globl ace_atomic_swap_long \n\
29 .type ace_atomic_swap_long,@function \n\
31 ace_atomic_swap_long: \n\
32 movl 0x00000004(%esp), %edx \n\
33 movl 0x00000008(%esp), %eax \n\
39 .globl ace_atomic_swap_add_long \n\
40 .type ace_atomic_swap_add_long,@function \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\
50 #elif defined(__x86_64) && defined(__SUNPRO_C)
55 .globl ace_atomic_add_long \n\
56 .type ace_atomic_add_long,@function \n\
58 ace_atomic_add_long: \n\
60 lock; xaddq %rax, (%rdi) \n\
66 .globl ace_atomic_swap_long \n\
67 .type ace_atomic_swap_long,@function \n\
69 ace_atomic_swap_long: \n\
70 xchgq %rsi, (%rdi) \n\
76 .globl ace_atomic_swap_add_long \n\
77 .type ace_atomic_swap_add_long,@function \n\
79 ace_atomic_swap_add_long: \n\
80 lock; xaddq %rsi, (%rdi) \n\
86 #elif defined (__sparcv9)
89 ace_atomic_add_long (volatile unsigned long *dest
, long rhs
)
95 "casx [%o0], %o2, %o3\n"
97 "bne,pn %xcc, .again_add\n"
100 "add %o2, %o1, %o0\n");
104 ace_atomic_swap_long (volatile unsigned long *dest
, unsigned long rhs
)
110 "casx [%o0], %o2, %o3\n"
112 "bne,pn %xcc, .again_swap\n"
119 ace_atomic_swap_add_long (volatile unsigned long *dest
, long rhs
)
125 "add %o2, %o1, %o3\n"
126 "casx [%o0], %o2, %o3\n"
128 "bne,pn %xcc, .again_swap_add\n"
137 ace_atomic_add_long (volatile unsigned long *dest
, long rhs
)
142 "add %o2, %o1, %o3\n"
143 "cas [%o0], %o2, %o3\n"
145 "bne,pn %icc, .again_add\n"
148 "add %o2, %o1, %o0\n");
152 ace_atomic_swap_long (volatile unsigned long *dest
, unsigned long rhs
)
158 "cas [%o0], %o2, %o3\n"
160 "bne,pn %icc, .again_swap\n"
167 ace_atomic_swap_add_long (volatile unsigned long *dest
, long rhs
)
173 "add %o2, %o1, %o3\n"
174 "cas [%o0], %o2, %o3\n"
176 "bne,pn %icc, .again_swap_add\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 */