From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Thu, 4 Oct 2018 15:55:32 +0200 Subject: [PATCH] linux: prefer GCC-provided atomics to asssembly implementation --- pr/include/md/_linux.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/pr/include/md/_linux.h b/pr/include/md/_linux.h index ad57d083301c..57877b86fd84 100644 --- a/pr/include/md/_linux.h +++ b/pr/include/md/_linux.h @@ -105,43 +105,63 @@ #endif #if defined(__i386__) +#if defined(__GNUC__) +/* Use GCC built-in functions */ +#define _PR_HAVE_ATOMIC_OPS +#define _MD_INIT_ATOMIC() +#define _MD_ATOMIC_INCREMENT(ptr) __sync_add_and_fetch(ptr, 1) +#define _MD_ATOMIC_DECREMENT(ptr) __sync_sub_and_fetch(ptr, 1) +#define _MD_ATOMIC_ADD(ptr, i) __sync_add_and_fetch(ptr, i) +#define _MD_ATOMIC_SET(ptr, nv) __sync_lock_test_and_set(ptr, nv) +#else #define _PR_HAVE_ATOMIC_OPS #define _MD_INIT_ATOMIC() extern PRInt32 _PR_x86_AtomicIncrement(PRInt32 *val); #define _MD_ATOMIC_INCREMENT _PR_x86_AtomicIncrement extern PRInt32 _PR_x86_AtomicDecrement(PRInt32 *val); #define _MD_ATOMIC_DECREMENT _PR_x86_AtomicDecrement extern PRInt32 _PR_x86_AtomicAdd(PRInt32 *ptr, PRInt32 val); #define _MD_ATOMIC_ADD _PR_x86_AtomicAdd extern PRInt32 _PR_x86_AtomicSet(PRInt32 *val, PRInt32 newval); #define _MD_ATOMIC_SET _PR_x86_AtomicSet #endif +#endif #if defined(__ia64__) #define _PR_HAVE_ATOMIC_OPS #define _MD_INIT_ATOMIC() extern PRInt32 _PR_ia64_AtomicIncrement(PRInt32 *val); #define _MD_ATOMIC_INCREMENT _PR_ia64_AtomicIncrement extern PRInt32 _PR_ia64_AtomicDecrement(PRInt32 *val); #define _MD_ATOMIC_DECREMENT _PR_ia64_AtomicDecrement extern PRInt32 _PR_ia64_AtomicAdd(PRInt32 *ptr, PRInt32 val); #define _MD_ATOMIC_ADD _PR_ia64_AtomicAdd extern PRInt32 _PR_ia64_AtomicSet(PRInt32 *val, PRInt32 newval); #define _MD_ATOMIC_SET _PR_ia64_AtomicSet #endif #if defined(__x86_64__) +#if defined(__GNUC__) +/* Use GCC built-in functions */ +#define _PR_HAVE_ATOMIC_OPS +#define _MD_INIT_ATOMIC() +#define _MD_ATOMIC_INCREMENT(ptr) __sync_add_and_fetch(ptr, 1) +#define _MD_ATOMIC_DECREMENT(ptr) __sync_sub_and_fetch(ptr, 1) +#define _MD_ATOMIC_ADD(ptr, i) __sync_add_and_fetch(ptr, i) +#define _MD_ATOMIC_SET(ptr, nv) __sync_lock_test_and_set(ptr, nv) +#else #define _PR_HAVE_ATOMIC_OPS #define _MD_INIT_ATOMIC() extern PRInt32 _PR_x86_64_AtomicIncrement(PRInt32 *val); #define _MD_ATOMIC_INCREMENT _PR_x86_64_AtomicIncrement extern PRInt32 _PR_x86_64_AtomicDecrement(PRInt32 *val); #define _MD_ATOMIC_DECREMENT _PR_x86_64_AtomicDecrement extern PRInt32 _PR_x86_64_AtomicAdd(PRInt32 *ptr, PRInt32 val); #define _MD_ATOMIC_ADD _PR_x86_64_AtomicAdd extern PRInt32 _PR_x86_64_AtomicSet(PRInt32 *val, PRInt32 newval); #define _MD_ATOMIC_SET _PR_x86_64_AtomicSet #endif +#endif #if defined(__loongarch__) #if defined(__GNUC__)