1 #ifndef _MACHINE_INSTR_H
2 #define _MACHINE_INSTR_H
4 static inline void atomic_add(int *mem, int val)
6 int temp, temp2, temp3;
7 /*dolog("atomic_add(%p [%d], %d)", mem, *mem, val);*/
9 /* TODO: improve this one! */
10 __asm__ __volatile__ (
16 "swpne %1,%2,[%3]\n\t"
18 : "=&r" (temp), "=&r" (temp2), "=&r" (temp3)
23 /*dolog("atomic_add() mem=%d", *mem);*/
26 static inline long compare_and_swap(long *p, long oldval, long newval)
29 /*dolog("compare_and_swap(%p [%d], %d, %d)", p, *p, oldval, newval);*/
31 /* TODO: improve this one! */
32 __asm__ __volatile__ (
39 "swpne %0,%1,[%2]\n\t"
42 : "=&r" (ret), "=&r" (temp)
43 : "r" (p), "r" (newval), "r" (oldval)
47 /*dolog("compare_and_swap() return=%d mem=%d", ret, *p);*/
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" );