diff options
author | Thiemo Seufer <ths@networkno.de> | 2007-11-08 15:11:48 -0700 |
---|---|---|
committer | LaMont Jones <lamont@mmjgroup.com> | 2013-08-17 06:58:53 -0600 |
commit | 14cb2d0750593e2d51c7e028a678f3fd00775fea (patch) | |
tree | 975c8b223ae413d639bc093c41a091f0159d11ea | |
parent | b1e10345898655cb19f7ffed50e6759962a60b03 (diff) | |
download | bind9-14cb2d0750593e2d51c7e028a678f3fd00775fea.tar.gz |
mips:atomic.h: improve implementation of atomic ops, fix mips{el,64}
The appended patch extends the configure check to cover mips64 and
mipsel, and improves the mips atomics implementation.
See http://bugs.debian.org/406409 for more detail.
Signed-off-by: LaMont Jones <lamont@debian.org>
-rw-r--r-- | lib/isc/mips/include/isc/atomic.h | 66 |
1 files changed, 31 insertions, 35 deletions
diff --git a/lib/isc/mips/include/isc/atomic.h b/lib/isc/mips/include/isc/atomic.h index bb739f74..9281c10f 100644 --- a/lib/isc/mips/include/isc/atomic.h +++ b/lib/isc/mips/include/isc/atomic.h @@ -31,18 +31,20 @@ static inline isc_int32_t isc_atomic_xadd(isc_int32_t *p, int val) { isc_int32_t orig; - /* add is a cheat, since MIPS has no mov instruction */ - __asm__ volatile ( - "1:" - "ll $3, %1\n" - "add %0, $0, $3\n" - "add $3, $3, %2\n" - "sc $3, %1\n" - "beq $3, 0, 1b" - : "=&r"(orig) - : "m"(*p), "r"(val) - : "memory", "$3" - ); + __asm__ __volatile__ ( + " .set push \n" + " .set mips2 \n" + " .set noreorder \n" + " .set noat \n" + "1: ll $1, %1 \n" + " addu %0, $1, %2 \n" + " sc %0, %1 \n" + " beqz %0, 1b \n" + " addu %0, $1, %2 \n" + " .set pop \n" + : "=&r" (orig), "+R" (*p) + : "r" (val) + : "memory"); return (orig); } @@ -52,16 +54,7 @@ isc_atomic_xadd(isc_int32_t *p, int val) { */ static inline void isc_atomic_store(isc_int32_t *p, isc_int32_t val) { - __asm__ volatile ( - "1:" - "ll $3, %0\n" - "add $3, $0, %1\n" - "sc $3, %0\n" - "beq $3, 0, 1b" - : - : "m"(*p), "r"(val) - : "memory", "$3" - ); + *p = val; } /* @@ -72,20 +65,23 @@ isc_atomic_store(isc_int32_t *p, isc_int32_t val) { static inline isc_int32_t isc_atomic_cmpxchg(isc_int32_t *p, int cmpval, int val) { isc_int32_t orig; + isc_int32_t tmp; - __asm__ volatile( - "1:" - "ll $3, %1\n" - "add %0, $0, $3\n" - "bne $3, %2, 2f\n" - "add $3, $0, %3\n" - "sc $3, %1\n" - "beq $3, 0, 1b\n" - "2:" - : "=&r"(orig) - : "m"(*p), "r"(cmpval), "r"(val) - : "memory", "$3" - ); + __asm__ __volatile__ ( + " .set push \n" + " .set mips2 \n" + " .set noreorder \n" + " .set noat \n" + "1: ll $1, %1 \n" + " bne $1, %3, 2f \n" + " move %2, %4 \n" + " sc %2, %1 \n" + " beqz %2, 1b \n" + "2: move %0, $1 \n" + " .set pop \n" + : "=&r"(orig), "+R" (*p), "=r" (tmp) + : "r"(cmpval), "r"(val) + : "memory"); return (orig); } |