MacOSX threads working (somewhat)
[cacao.git] / jit / powerpc / machine-instr.h
1 #ifndef _MACHINE_INSTR_H
2 #define _MACHINE_INSTR_H
3
4 static inline long
5 atomic_swap (volatile long *p, long val)
6 {
7   long int result;
8   __asm__ __volatile__ ("\n\
9 0:  lwarx   %0,0,%1 \n\
10     stwcx.  %2,0,%1 \n\
11     bne-    0b  \n\
12 " : "=&r"(result) : "r"(p), "r"(val) : "cr0", "memory");
13   return result;
14 }
15
16 static inline int
17 compare_and_swap (volatile long *p, long oldval, long newval)
18 {
19   int result;
20   __asm__ __volatile__ ("\n\
21 0:  lwarx   %0,0,%1 \n\
22     sub%I2c.  %0,%0,%2    \n\
23     cntlzw  %0,%0   \n\
24     bne-    1f  \n\
25     stwcx.  %3,0,%1 \n\
26     bne-    0b  \n\
27 1:  \n\
28 " : "=&b"(result) : "r"(p), "Ir"(oldval), "r"(newval) : "cr0", "memory");
29   return result >> 5;
30 }
31
32 #endif