1
/** Atomic instructions for i386. To be populated as need arises.
2
* @author Sriram Krishnamoorthy
4
#ifndef __ATOMICS_I386__
5
#define __ATOMICS_I386__
9
#define v4b (volatile unsigned int *)
11
static inline void atomic_exchange(void *val, void *ptr, int size) {
13
__asm__ __volatile__ ("lock xchgl %0, %1"
14
: "=r"(*v4b(val)), "+m"(*v4b(ptr))
19
/*SK: fixme. only available in 486+. This breaks i386 compatibility.
20
atomic: *(type*)ploc = *(type*)prem; *(type*)prem += extra*/
21
static inline void atomic_fetch_and_add(void *prem, void *ploc, int extra, int size) {
25
*(int*)ploc = __sync_fetch_and_add((int*)prem, extra);
27
__asm__ __volatile__ ("movq %2, %%rax; \
28
lock xaddl %0, (%%rax);"
30
: "0"(extra), "m"((int*)prem)
32
*(int *)ploc = _a_temp;
34
__asm__ __volatile__ ("lock xaddl %0, (%2)"
36
: "0"(extra), "r"((int*)prem)
38
*(int *)ploc = _a_temp;
44
#endif /*__ATOMICS_I386__*/