78 lines
3 KiB
Diff
78 lines
3 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Daiki Ueno <dueno@redhat.com>
|
|
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__)
|