summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorivmai <ivmai>2011-06-01 13:57:18 +0000
committerIvan Maidanski <ivmai@mail.ru>2011-07-25 16:03:26 +0400
commitafce5aeeb99c12f40438bf75536323a5cd81b0b7 (patch)
tree4a4da68f753d595cedb8c239bc58998efaedc555
parent6fe8d9f16793264f1c3c5e510e7c98204e6cf113 (diff)
downloadlibatomic_ops-afce5aeeb99c12f40438bf75536323a5cd81b0b7.tar.gz
2011-06-01 Ivan Maidanski <ivmai@mail.ru>
* src/atomic_ops/sysdeps/sunc/x86.h (AO_test_and_set_full): Specify "%b0" (instead of "%0") in "xchg" instruction (to workaround a bug in Sun C 5.11). * src/atomic_ops/sysdeps/sunc/x86_64.h (AO_test_and_set_full): Ditto.
-rw-r--r--ChangeLog8
-rw-r--r--src/atomic_ops/sysdeps/sunc/x86.h21
-rw-r--r--src/atomic_ops/sysdeps/sunc/x86_64.h35
3 files changed, 35 insertions, 29 deletions
diff --git a/ChangeLog b/ChangeLog
index e241328..ad7e863 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
2011-06-01 Ivan Maidanski <ivmai@mail.ru>
+ * src/atomic_ops/sysdeps/sunc/x86.h (AO_test_and_set_full):
+ Specify "%b0" (instead of "%0") in "xchg" instruction (to
+ workaround a bug in Sun C 5.11).
+ * src/atomic_ops/sysdeps/sunc/x86_64.h (AO_test_and_set_full):
+ Ditto.
+
+2011-06-01 Ivan Maidanski <ivmai@mail.ru>
+
* src/atomic_ops_malloc.c (AO_malloc_enable_mmap): Workaround for
Sun C compiler (call "release" variant of AO_store).
diff --git a/src/atomic_ops/sysdeps/sunc/x86.h b/src/atomic_ops/sysdeps/sunc/x86.h
index 5086e84..e1e054a 100644
--- a/src/atomic_ops/sysdeps/sunc/x86.h
+++ b/src/atomic_ops/sysdeps/sunc/x86.h
@@ -37,7 +37,7 @@
AO_INLINE void
AO_nop_full(void)
{
- __asm__ __volatile__("mfence" : : : "memory");
+ __asm__ __volatile__ ("mfence" : : : "memory");
}
#define AO_HAVE_nop_full
@@ -105,14 +105,14 @@ AO_or_full (volatile AO_t *p, AO_t incr)
#define AO_HAVE_or_full
AO_INLINE AO_TS_VAL_t
-AO_test_and_set_full(volatile AO_TS_t *addr)
+AO_test_and_set_full (volatile AO_TS_t *addr)
{
AO_TS_t oldval;
/* Note: the "xchg" instruction does not need a "lock" prefix */
- __asm__ __volatile__("xchg %0, %1"
- : "=q"(oldval), "=m"(*addr)
- : "0"(0xff) /* , "m"(*addr) */
- : "memory");
+ __asm__ __volatile__ ("xchg %b0, %1"
+ : "=q"(oldval), "=m"(*addr)
+ : "0"(0xff) /* , "m"(*addr) */
+ : "memory");
return (AO_TS_VAL_t)oldval;
}
@@ -120,13 +120,12 @@ AO_test_and_set_full(volatile AO_TS_t *addr)
/* Returns nonzero if the comparison succeeded. */
AO_INLINE int
-AO_compare_and_swap_full(volatile AO_t *addr,
- AO_t old, AO_t new_val)
+AO_compare_and_swap_full (volatile AO_t *addr, AO_t old, AO_t new_val)
{
char result;
- __asm__ __volatile__("lock; cmpxchgl %2, %0; setz %1"
- : "=m"(*addr), "=a"(result)
- : "r" (new_val), "a"(old) : "memory");
+ __asm__ __volatile__ ("lock; cmpxchgl %2, %0; setz %1"
+ : "=m"(*addr), "=a"(result)
+ : "r" (new_val), "a"(old) : "memory");
return (int) result;
}
diff --git a/src/atomic_ops/sysdeps/sunc/x86_64.h b/src/atomic_ops/sysdeps/sunc/x86_64.h
index ac5f51d..4d47c2f 100644
--- a/src/atomic_ops/sysdeps/sunc/x86_64.h
+++ b/src/atomic_ops/sysdeps/sunc/x86_64.h
@@ -35,7 +35,7 @@ AO_INLINE void
AO_nop_full(void)
{
/* Note: "mfence" (SSE2) is supported on all x86_64/amd64 chips. */
- __asm__ __volatile__("mfence" : : : "memory");
+ __asm__ __volatile__ ("mfence" : : : "memory");
}
#define AO_HAVE_nop_full
@@ -106,14 +106,14 @@ AO_or_full (volatile AO_t *p, AO_t incr)
#define AO_HAVE_or_full
AO_INLINE AO_TS_VAL_t
-AO_test_and_set_full(volatile AO_TS_t *addr)
+AO_test_and_set_full (volatile AO_TS_t *addr)
{
AO_TS_t oldval;
/* Note: the "xchg" instruction does not need a "lock" prefix */
- __asm__ __volatile__("xchg %0, %1"
- : "=q"(oldval), "=m"(*addr)
- : "0"(0xff) /* , "m"(*addr) */
- : "memory");
+ __asm__ __volatile__ ("xchg %b0, %1"
+ : "=q"(oldval), "=m"(*addr)
+ : "0"(0xff) /* , "m"(*addr) */
+ : "memory");
return (AO_TS_VAL_t)oldval;
}
@@ -121,13 +121,12 @@ AO_test_and_set_full(volatile AO_TS_t *addr)
/* Returns nonzero if the comparison succeeded. */
AO_INLINE int
-AO_compare_and_swap_full(volatile AO_t *addr,
- AO_t old, AO_t new_val)
+AO_compare_and_swap_full (volatile AO_t *addr, AO_t old, AO_t new_val)
{
char result;
- __asm__ __volatile__("lock; cmpxchgq %2, %0; setz %1"
- : "=m"(*addr), "=a"(result)
- : "r" (new_val), "a"(old) : "memory");
+ __asm__ __volatile__ ("lock; cmpxchgq %2, %0; setz %1"
+ : "=m"(*addr), "=a"(result)
+ : "r" (new_val), "a"(old) : "memory");
return (int) result;
}
@@ -144,15 +143,15 @@ AO_compare_and_swap_full(volatile AO_t *addr,
* Hoewever both are clearly useful in certain cases.
*/
AO_INLINE int
-AO_compare_double_and_swap_double_full(volatile AO_double_t *addr,
- AO_t old_val1, AO_t old_val2,
- AO_t new_val1, AO_t new_val2)
+AO_compare_double_and_swap_double_full (volatile AO_double_t *addr,
+ AO_t old_val1, AO_t old_val2,
+ AO_t new_val1, AO_t new_val2)
{
char result;
- __asm__ __volatile__("lock; cmpxchg16b %0; setz %1"
- : "=m"(*addr), "=a"(result)
- : "m"(*addr), "d" (old_val2), "a" (old_val1),
- "c" (new_val2), "b" (new_val1) : "memory");
+ __asm__ __volatile__ ("lock; cmpxchg16b %0; setz %1"
+ : "=m"(*addr), "=a"(result)
+ : "m"(*addr), "d" (old_val2), "a" (old_val1),
+ "c" (new_val2), "b" (new_val1) : "memory");
return (int) result;
}
#define AO_HAVE_compare_double_and_swap_double_full