* src/vm/jit/i386/darwin/md-asm.h: Repaired --enable-cycles-stats.
[cacao.git] / src / vm / jit / i386 / machine-instr.h
1 #ifndef _MACHINE_INSTR_H
2 #define _MACHINE_INSTR_H
3
4 static inline void
5 __attribute__ ((unused))
6 atomic_add (volatile int *mem, int val)
7 {
8   __asm__ __volatile__ ("lock; addl %1,%0"
9                                                 : "=m" (*mem) 
10                                                 : "ir" (val), "m" (*mem));
11 }
12
13 /* compare_and_swap ********************************************************
14
15   Atomically do the following: Check if the location still contains
16   `oldval`. If so, replace it by `newval` and return `oldval`.
17
18   RETURN VALUE:
19       the old value at *p
20
21 ***************************************************************************/
22
23 static inline long
24 __attribute__ ((unused))
25 compare_and_swap (volatile long *p, long oldval, long newval)
26 {
27   long ret;
28
29   __asm__ __volatile__ ("lock; cmpxchgl %2, %1"
30                         : "=a" (ret), "=m" (*p)
31                         : "r" (newval), "m" (*p), "0" (oldval));
32   return ret;
33 }
34
35 #define STORE_ORDER_BARRIER() __asm__ __volatile__ ("" : : : "memory");
36 #define MEMORY_BARRIER_BEFORE_ATOMIC() __asm__ __volatile__ ("" : : : "memory");
37 #define MEMORY_BARRIER_AFTER_ATOMIC() __asm__ __volatile__ ("" : : : "memory");
38 #define MEMORY_BARRIER() __asm__ __volatile__ ( \
39                 "lock; add $0, 0(%%esp)" : : : "memory" );
40
41 #endif