Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZoltan Varga <vargaz@gmail.com>2008-08-10 18:43:54 +0400
committerZoltan Varga <vargaz@gmail.com>2008-08-10 18:43:54 +0400
commitf0ea98d5286992ab703bf60cb3946a7a0d2e6e28 (patch)
tree09dde9db24fa6031406224f91fd4c0af4521cde9 /libgc/include
parent18ced2302abaefe1553c3c6633bb899d2d120a48 (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.h23
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