* Merged executionstate branch.
[cacao.git] / src / vm / jit / arm / machine-instr.h
1 #ifndef _MACHINE_INSTR_H
2 #define _MACHINE_INSTR_H
3
4 static inline long compare_and_swap(long *p, long oldval, long newval)
5 {
6         long ret, temp;
7         /*dolog("compare_and_swap(%p [%d], %d, %d)", p, *p, oldval, newval);*/
8
9         /* TODO: improve this one! */
10         __asm__ __volatile__ (
11                 "1:\t"
12                 "ldr   %0,[%2]\n\t"
13                 "cmp   %0,%4\n\t"
14                 "bne   2f\n\t"
15                 "swp   %1,%3,[%2]\n\t"
16                 "cmp   %1,%0\n\t"
17                 "swpne %0,%1,[%2]\n\t"
18                 "bne   1b\n\t"
19                 "2:"
20                 : "=&r" (ret), "=&r" (temp)
21                 : "r" (p), "r" (newval), "r" (oldval)
22                 : "cc", "memory"
23         );
24
25         /*dolog("compare_and_swap() return=%d mem=%d", ret, *p);*/
26         return ret;
27 }
28
29 #define STORE_ORDER_BARRIER() __asm__ __volatile__ ("" : : : "memory");
30 #define MEMORY_BARRIER_AFTER_ATOMIC() __asm__ __volatile__ ("" : : : "memory");
31 #define MEMORY_BARRIER() __asm__ __volatile__ ("" : : : "memory" );
32
33 #endif