0f3c6ff9df64c8c8e17881be6683bada3d09bd64
[cacao.git] / src / vm / jit / x86_64 / machine-instr.h
1 #ifndef _MACHINE_INSTR_H
2 #define _MACHINE_INSTR_H
3
4 static inline long
5 __attribute__ ((unused))
6 compare_and_swap (volatile long *p, long oldval, long newval)
7 {
8   long ret;
9
10   __asm__ __volatile__ ("lock; cmpxchgq %2, %1"
11                         : "=a" (ret), "=m" (*p)
12                         : "r" (newval), "m" (*p), "0" (oldval));
13   return ret;
14 }
15
16 #define STORE_ORDER_BARRIER() __asm__ __volatile__ ("" : : : "memory");
17 #define MEMORY_BARRIER_BEFORE_ATOMIC() /* nothing */
18 #define MEMORY_BARRIER_AFTER_ATOMIC() /* nothing */
19 #define MEMORY_BARRIER() __asm__ __volatile__ ( \
20                 "mfence" : : : "memory" );
21
22 #endif