* src/vm/jit/i386/darwin/md-asm.h: Repaired --enable-cycles-stats.
[cacao.git] / src / vm / jit / powerpc / machine-instr.h
1 #ifndef _MACHINE_INSTR_H
2 #define _MACHINE_INSTR_H
3
4 static inline void
5 atomic_add(int *mem, int val)
6 {
7         int temp;
8
9   __asm__ __volatile__ ("\n\
10 1:  lwarx  %0,0,%2 \n\
11     add    %0,%0,%1 \n\
12         stwcx. %0,0,%2 \n\
13         bne-   1b \n\
14 "   : "=&r"(temp)
15     : "r"(val), "r"(mem) : "cr0", "memory");
16 }
17
18 static inline long compare_and_swap(long *p, long oldval, long newval)
19 {
20   long ret, temp;
21
22   __asm__ __volatile__ ("\n\
23 1:  lwarx  %0,0,%4 \n\
24     subf.  %1,%0,%2 \n\
25     bne-   2f \n\
26     or     %1,%3,%3 \n\
27     stwcx. %1,0,%4 \n\
28     bne-   1b \n\
29 2: \n\
30 "   : "=&r"(ret), "=&r"(temp)
31     : "r"(oldval), "r"(newval), "r"(p) : "cr0", "memory");
32
33   return ret;
34 }
35
36 #define STORE_ORDER_BARRIER() __asm__ __volatile__ ("" : : : "memory");
37 #define MEMORY_BARRIER_BEFORE_ATOMIC() __asm__ __volatile__ ("sync" : : : "memory");
38 #define MEMORY_BARRIER_AFTER_ATOMIC() __asm__ __volatile__ ("isync" : : : "memory");
39 #define MEMORY_BARRIER() __asm__ __volatile__ ( "sync" : : : "memory" );
40
41 #endif