Bugzilla bug 151709: implemented atomic operations in assembly on Alpha
Linux. The patch is contributed by falk@debian.org. r=darin,wtc. git-svn-id: svn://10.0.0.236/trunk@166333 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -127,6 +127,62 @@ extern PRInt32 _PR_x86_64_AtomicSet(PRInt32 *val, PRInt32 newval);
|
||||
#define _MD_ATOMIC_SET _PR_x86_64_AtomicSet
|
||||
#endif
|
||||
|
||||
#if defined(__alpha)
|
||||
#define _PR_HAVE_ATOMIC_OPS
|
||||
#define _MD_INIT_ATOMIC()
|
||||
#define _MD_ATOMIC_ADD(ptr, i) ({ \
|
||||
unsigned long __atomic_tmp, __atomic_ret; \
|
||||
__asm__ __volatile__( \
|
||||
"1: ldl_l %[ret], %[val] \n" \
|
||||
" addl %[ret], %[inc], %[tmp] \n" \
|
||||
" addl %[ret], %[inc], %[ret] \n" \
|
||||
" stl_c %[tmp], %[val] \n" \
|
||||
" beq %[tmp], 2f \n" \
|
||||
".subsection 2 \n" \
|
||||
"2: br 1b \n" \
|
||||
".previous" \
|
||||
: [ret] "=&r" (__atomic_ret), \
|
||||
[tmp] "=&r" (__atomic_tmp), \
|
||||
[val] "=m" (*ptr) \
|
||||
: [inc] "Ir" (i), "m" (*ptr)); \
|
||||
__atomic_ret; \
|
||||
})
|
||||
#define _MD_ATOMIC_INCREMENT(ptr) _MD_ATOMIC_ADD(ptr, 1)
|
||||
#define _MD_ATOMIC_DECREMENT(ptr) ({ \
|
||||
unsigned long __atomic_tmp, __atomic_ret; \
|
||||
__asm__ __volatile__( \
|
||||
"1: ldl_l %[ret], %[val] \n" \
|
||||
" subl %[ret], 1, %[tmp] \n" \
|
||||
" subl %[ret], 1, %[ret] \n" \
|
||||
" stl_c %[tmp], %[val] \n" \
|
||||
" beq %[tmp], 2f \n" \
|
||||
".subsection 2 \n" \
|
||||
"2: br 1b \n" \
|
||||
".previous" \
|
||||
: [ret] "=&r" (__atomic_ret), \
|
||||
[tmp] "=&r" (__atomic_tmp), \
|
||||
[val] "=m" (*ptr) \
|
||||
: "m" (*ptr)); \
|
||||
__atomic_ret; \
|
||||
})
|
||||
#define _MD_ATOMIC_SET(ptr, n) ({ \
|
||||
unsigned long __atomic_tmp, __atomic_ret; \
|
||||
__asm__ __volatile__( \
|
||||
"1: ldl_l %[ret], %[val] \n" \
|
||||
" mov %[newval], %[tmp] \n" \
|
||||
" stl_c %[tmp], %[val] \n" \
|
||||
" beq %[tmp], 2f \n" \
|
||||
".subsection 2 \n" \
|
||||
"2: br 1b \n" \
|
||||
".previous" \
|
||||
: [ret] "=&r" (__atomic_ret), \
|
||||
[tmp] "=&r"(__atomic_tmp), \
|
||||
[val] "=m" (*ptr) \
|
||||
: [newval] "Ir" (n), "m" (*ptr)); \
|
||||
__atomic_ret; \
|
||||
})
|
||||
#endif
|
||||
|
||||
#define USE_SETJMP
|
||||
#if defined(__GLIBC__) && __GLIBC__ >= 2
|
||||
#define _PR_POLL_AVAILABLE
|
||||
|
||||
Reference in New Issue
Block a user