From 94f3cd383fe53f6329e0d608080f37e4a5ebacc5 Mon Sep 17 00:00:00 2001 From: Stefan Ring Date: Fri, 9 Jan 2009 22:37:21 +0100 Subject: [PATCH] Stronger assembler constraints for cmpxchg on i386/x86_64. * src/vm/jit/i386/md-atomic.hpp, src/vm/jit/x86_64/md-atomic.hpp: Said changes. --- src/vm/jit/i386/md-atomic.hpp | 7 +++++-- src/vm/jit/x86_64/md-atomic.hpp | 10 +++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/vm/jit/i386/md-atomic.hpp b/src/vm/jit/i386/md-atomic.hpp index d6ea3d777..37944004c 100644 --- a/src/vm/jit/i386/md-atomic.hpp +++ b/src/vm/jit/i386/md-atomic.hpp @@ -48,7 +48,8 @@ inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval, __asm__ __volatile__ ("lock; cmpxchgl %2, %1" : "=a" (result), "=m" (*p) - : "r" (newval), "m" (*p), "0" (oldval)); + : "r" (newval), "m" (*p), "0" (oldval) + : "cc"); return result; } @@ -108,7 +109,9 @@ inline void Atomic::write_memory_barrier(void) */ inline void Atomic::instruction_barrier(void) { - // Nothing. + // We need the "memory" constraint here because compare_and_swap does not + // have it. + __asm__ __volatile__ ("" : : : "memory"); } #endif // _MD_ATOMIC_HPP diff --git a/src/vm/jit/x86_64/md-atomic.hpp b/src/vm/jit/x86_64/md-atomic.hpp index accef01af..74e6b707a 100644 --- a/src/vm/jit/x86_64/md-atomic.hpp +++ b/src/vm/jit/x86_64/md-atomic.hpp @@ -48,7 +48,8 @@ inline uint32_t Atomic::compare_and_swap(volatile uint32_t *p, uint32_t oldval, __asm__ __volatile__ ("lock; cmpxchgl %2, %1" : "=a" (result), "=m" (*p) - : "r" (newval), "m" (*p), "0" (oldval)); + : "r" (newval), "m" (*p), "0" (oldval) + : "cc"); return result; } @@ -69,7 +70,8 @@ inline uint64_t Atomic::compare_and_swap(volatile uint64_t *p, uint64_t oldval, __asm__ __volatile__ ("lock; cmpxchgq %2, %1" : "=a" (result), "=m" (*p) - : "r" (newval), "m" (*p), "0" (oldval)); + : "r" (newval), "m" (*p), "0" (oldval) + : "cc"); return result; } @@ -113,7 +115,9 @@ inline void Atomic::write_memory_barrier(void) */ inline void Atomic::instruction_barrier(void) { - // Nothing. + // We need the "memory" constraint here because compare_and_swap does not + // have it. + __asm__ __volatile__ ("" : : : "memory"); } #endif // _MD_ATOMIC_HPP -- 2.25.1