From b6225f66a578c6667a284deac765d3f713df7b0e Mon Sep 17 00:00:00 2001 From: Kevin Tew Date: Sat, 4 Jun 2011 14:32:06 -0600 Subject: [PATCH] Fix mzrt_cas for GCC < 4.1 --- src/racket/src/mzrt.h | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/racket/src/mzrt.h b/src/racket/src/mzrt.h index c8cbaf093f..e57ec0b984 100644 --- a/src/racket/src/mzrt.h +++ b/src/racket/src/mzrt.h @@ -108,7 +108,24 @@ void pt_mbox_send_recv(pt_mbox *mbox, int type, void *payload, pt_mbox *origin, void pt_mbox_destroy(pt_mbox *mbox); static MZ_INLINE int mzrt_cas(volatile size_t *addr, size_t old, size_t new_val) { -#if defined(__GNUC__) && !defined(__INTEL_COMPILER) +#if defined(__GNUC__) && !defined(__INTEL_COMPILER) && __GNUC__ <= 4 && __GNUC_MINOR__ < 1 +# if defined(__i386__) + char result; + __asm__ __volatile__("lock; cmpxchgl %3, %0; setz %1" + : "=m"(*addr), "=q"(result) + : "m"(*addr), "r" (new_val), "a"(old) + : "memory"); + return (int) result; +# elif defined(__x86_64__) + char result; + __asm__ __volatile__("lock; cmpxchgq %3, %0; setz %1" + : "=m"(*addr), "=q"(result) + : "m"(*addr), "r" (new_val), "a"(old) + : "memory"); + return (int) result; +# endif + +#elif defined(__GNUC__) && !defined(__INTEL_COMPILER) return __sync_bool_compare_and_swap(addr, old, new_val); #elif defined(_MSC_VER) # if defined(_AMD64_)