* src/vm/jit/alpha/codegen.c (codegen_emit_stub_builtin): Removed.
[cacao.git] / src / vm / jit / arm / machine-instr.h
1 #ifndef _MACHINE_INSTR_H
2 #define _MACHINE_INSTR_H
3
4 static inline void atomic_add(int *mem, int val)
5 {
6         int temp, temp2, temp3;
7         /*dolog("atomic_add(%p [%d], %d)", mem, *mem, val);*/
8
9         /* TODO: improve this one! */
10         __asm__ __volatile__ (
11                 "1:\t"
12                 "ldr   %0,[%3]\n\t"
13                 "add   %1,%0,%4\n\t"
14                 "swp   %2,%1,[%3]\n\t"
15                 "cmp   %0,%2\n\t"
16                 "swpne %1,%2,[%3]\n\t"
17                 "bne   1b"
18                 : "=&r" (temp), "=&r" (temp2), "=&r" (temp3)
19                 : "r" (mem), "r"(val)
20                 : "cc", "memory"
21         );
22
23         /*dolog("atomic_add() mem=%d", *mem);*/
24 }
25
26 static inline long compare_and_swap(long *p, long oldval, long newval)
27 {
28         long ret, temp;
29         /*dolog("compare_and_swap(%p [%d], %d, %d)", p, *p, oldval, newval);*/
30
31         /* TODO: improve this one! */
32         __asm__ __volatile__ (
33                 "1:\t"
34                 "ldr   %0,[%2]\n\t"
35                 "cmp   %0,%4\n\t"
36                 "bne   2f\n\t"
37                 "swp   %1,%3,[%2]\n\t"
38                 "cmp   %1,%0\n\t"
39                 "swpne %0,%1,[%2]\n\t"
40                 "bne   1b\n\t"
41                 "2:"
42                 : "=&r" (ret), "=&r" (temp)
43                 : "r" (p), "r" (newval), "r" (oldval)
44                 : "cc", "memory"
45         );
46
47         /*dolog("compare_and_swap() return=%d mem=%d", ret, *p);*/
48         return ret;
49 }
50
51 #define STORE_ORDER_BARRIER() __asm__ __volatile__ ("" : : : "memory");
52 #define MEMORY_BARRIER_BEFORE_ATOMIC() __asm__ __volatile__ ("" : : : "memory");
53 #define MEMORY_BARRIER_AFTER_ATOMIC() __asm__ __volatile__ ("" : : : "memory");
54 #define MEMORY_BARRIER() __asm__ __volatile__ ("" : : : "memory" );
55
56 #endif