diff options
author | Zoltan Varga <vargaz@gmail.com> | 2008-08-10 18:43:54 +0400 |
---|---|---|
committer | Zoltan Varga <vargaz@gmail.com> | 2008-08-10 18:43:54 +0400 |
commit | f0ea98d5286992ab703bf60cb3946a7a0d2e6e28 (patch) | |
tree | 09dde9db24fa6031406224f91fd4c0af4521cde9 /libgc/include | |
parent | 18ced2302abaefe1553c3c6633bb899d2d120a48 (diff) |
2008-08-10 Zoltan Varga <vargaz@gmail.com>
* include/private/gc_locks.h: Add amd64 support so parallel mark works on
amd64 too.
svn path=/trunk/mono/; revision=110070
Diffstat (limited to 'libgc/include')
-rw-r--r-- | libgc/include/private/gc_locks.h | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/libgc/include/private/gc_locks.h b/libgc/include/private/gc_locks.h index d1ccf0ed0da..ee38aff5bc5 100644 --- a/libgc/include/private/gc_locks.h +++ b/libgc/include/private/gc_locks.h @@ -437,6 +437,29 @@ } # endif /* I386 */ +# if defined(X86_64) +# if !defined(GENERIC_COMPARE_AND_SWAP) + /* Returns TRUE if the comparison succeeded. */ + inline static GC_bool GC_compare_and_exchange(volatile GC_word *addr, + GC_word old, + GC_word new_val) + { + char result; + __asm__ __volatile__("lock; cmpxchgq %2, %0; setz %1" + : "+m"(*(addr)), "=r"(result) + : "r" (new_val), "a"(old) : "memory"); + return (GC_bool) result; + } +# endif /* !GENERIC_COMPARE_AND_SWAP */ + inline static void GC_memory_barrier() + { + /* We believe the processor ensures at least processor */ + /* consistent ordering. Thus a compiler barrier */ + /* should suffice. */ + __asm__ __volatile__("" : : : "memory"); + } +# endif /* X86_64 */ + # if defined(POWERPC) # if !defined(GENERIC_COMPARE_AND_SWAP) # if CPP_WORDSZ == 64 |