+2009-05-27 Hans Boehm <Hans.Boehm@hp.com> (Really Ivan Maidanski)
+ (diff87_cvs, resembling diff29, diff68, diff78 partly)
+ * doc/README.txt: Remove outdated info about Windows support.
+ * src/atomic_ops/generalize.h (AO_nop_full): Replace
+ K&R-style function definition with ANSI C one.
+ * src/atomic_ops/sysdeps/armcc/arm_v6.h (AO_nop_full): Ditto.
+ * src/atomic_ops/sysdeps/gcc/alpha.h (AO_nop_full, AO_nop_write):
+ Ditto.
+ * src/atomic_ops/sysdeps/gcc/arm.h (AO_nop_full): Ditto.
+ * src/atomic_ops/sysdeps/gcc/ia64.h (AO_nop_full): Ditto.
+ * src/atomic_ops/sysdeps/gcc/mips.h (AO_nop_full): Ditto.
+ * src/atomic_ops/sysdeps/gcc/powerpc.h (AO_nop_full, AO_lwsync): Ditto.
+ * src/atomic_ops/sysdeps/gcc/x86.h (AO_nop_full): Ditto.
+ * src/atomic_ops/sysdeps/generic_pthread.h (AO_nop_full): Ditto.
+ * src/atomic_ops/sysdeps/hpc/ia64.h (AO_nop_full): Ditto.
+ * src/atomic_ops/sysdeps/icc/ia64.h (AO_nop_full): Ditto.
+ * src/atomic_ops/sysdeps/ordered.h (AO_nop_full): Ditto.
+ * src/atomic_ops/sysdeps/ordered_except_wr.h (AO_nop_write): Ditto.
+ * src/atomic_ops/sysdeps/read_ordered.h (AO_nop_read): Ditto.
+ * src/atomic_ops/sysdeps/test_and_set_t_is_ao_t.h (AO_TS_val): Fix
+ comment.
+
2009-02-24 Hans Boehm <Hans.Boehm@hp.com> (Really primarily Earl Chew)
* src/atomic_ops/sysdeps/gcc/powerpc.h: Add index,
update modifiers to asms, refine clobbers to "cr0", use
All X86: We quietly assume 486 or better.
-Windows:
-Currently AO_REQUIRE_CAS is not supported.
-
Microsoft compilers:
Define AO_ASSUME_WINDOWS98 to get access to hardware compare-and-swap
functionality. This relies on the InterlockedCompareExchange() function
which was apparently not supported in Windows95. (There may be a better
-way to get access to this.) Currently only X86(32 bit) is supported for
-Windows.
+way to get access to this.)
Gcc on x86:
Define AO_USE_PENTIUM4_INSTRS to use the Pentium 4 mfence instruction.
#if defined(AO_HAVE_test_and_set_full) && !defined(AO_HAVE_nop_full)
AO_INLINE void
- AO_nop_full()
+ AO_nop_full(void)
{
AO_TS_t dummy = AO_TS_INITIALIZER;
AO_test_and_set_full(&dummy);
*/
AO_INLINE void
-AO_nop_full()
+AO_nop_full(void)
{
#ifndef AO_UNIPROCESSOR
unsigned int dest=0;
/* Data dependence does not imply read ordering. */
AO_INLINE void
-AO_nop_full()
+AO_nop_full(void)
{
__asm__ __volatile__("mb" : : : "memory");
}
#define AO_HAVE_nop_full
AO_INLINE void
-AO_nop_write()
+AO_nop_write(void)
{
__asm__ __volatile__("wmb" : : : "memory");
}
#include "../standard_ao_double_t.h"
AO_INLINE void
-AO_nop_full()
+AO_nop_full(void)
{
#ifndef AO_UNIPROCESSOR
/* issue an data memory barrier (keeps ordering of memory transactions */
#endif
AO_INLINE void
-AO_nop_full()
+AO_nop_full(void)
{
__asm__ __volatile__("mf" : : : "memory");
}
#define AO_NO_DD_ORDERING\r
\r
AO_INLINE void\r
-AO_nop_full()\r
+AO_nop_full(void)\r
{\r
__asm__ __volatile__(\r
" .set push \n"\r
/* may really be what we want, at least in the 32-bit case. */
AO_INLINE void
-AO_nop_full()
+AO_nop_full(void)
{
__asm__ __volatile__("sync" : : : "memory");
}
/* lwsync apparently works for everything but a StoreLoad barrier. */
AO_INLINE void
-AO_lwsync()
+AO_lwsync(void)
{
#ifdef __NO_LWSYNC__
__asm__ __volatile__("sync" : : : "memory");
#if defined(AO_USE_PENTIUM4_INSTRS)
AO_INLINE void
-AO_nop_full()
+AO_nop_full(void)
{
__asm__ __volatile__("mfence" : : : "memory");
}
extern pthread_mutex_t AO_pt_lock;
AO_INLINE void
-AO_nop_full()
+AO_nop_full(void)
{
pthread_mutex_lock(&AO_pt_lock);
pthread_mutex_unlock(&AO_pt_lock);
#endif
AO_INLINE void
-AO_nop_full()
+AO_nop_full(void)
{
_Asm_mf();
}
#define AO_HAVE_int_store_release
AO_INLINE void
-AO_nop_full()
+AO_nop_full(void)
{
__mf();
}
#include "ordered_except_wr.h"
AO_INLINE void
-AO_nop_full()
+AO_nop_full(void)
{
AO_compiler_barrier();
}
#include "read_ordered.h"
AO_INLINE void
-AO_nop_write()
+AO_nop_write(void)
{
AO_compiler_barrier();
/* sfence according to Intel docs. Pentium 3 and up. */
*/
AO_INLINE void
-AO_nop_read()
+AO_nop_read(void)
{
AO_compiler_barrier();
}
/*
* These are common definitions for architectures on which test_and_set
* operates on pointer-sized quantities, the "clear" value contains
- * all zeroes, and the "set" value contains all ones.
+ * all zeroes, and the "set" value contains only one lowest bit set.
* This can be used if test_and_set is synthesized from compare_and_swap.
*/
typedef enum {AO_TS_clear = 0, AO_TS_set = 1} AO_TS_val;