changes.
[IRC.git] / Robust / src / Runtime / mlp_lock.h
1 #include "runtime.h"
2
3 #include <stdlib.h>
4 #include <stdio.h>
5 #include <assert.h>
6
7 #define __xg(x) ((volatile long *)(x))
8
9 #define CFENCE   asm volatile("":::"memory");
10
11 #define LOCK_PREFIX \
12   ".section .smp_locks,\"a\"\n"   \
13   "  .align 4\n"                  \
14   "  .long 661f\n"             /* address */\
15   ".previous\n"                   \
16   "661:\n\tlock; "
17
18
19 static inline void atomic_dec(volatile int *v) {
20   __asm__ __volatile__ (LOCK_PREFIX "decl %0"
21                         : "+m" (*v));
22 }
23
24 static inline void atomic_inc(volatile int *v) {
25   __asm__ __volatile__ (LOCK_PREFIX "incl %0"
26                         : "+m" (*v));
27 }
28
29 static inline int atomic_sub_and_test(int i, volatile int *v) {
30   unsigned char c;
31
32   __asm__ __volatile__ (LOCK_PREFIX "subl %2,%0; sete %1"
33                         : "+m" (*v), "=qm" (c)
34                         : "ir" (i) : "memory");
35   return c;
36 }
37
38 static inline int LOCKXCHG(volatile int* ptr, int val){
39   
40   int retval;
41   //note: xchgl always implies lock 
42   __asm__ __volatile__("xchgl %0,%1"
43                        : "=r"(retval)
44                        : "m"(*ptr), "0"(val)
45                        : "memory");
46   return retval;
47  
48 }
49
50 /*
51 static inline int write_trylock(volatile int *lock) {
52   int retval=0;
53   __asm__ __volatile__("xchgl %0,%1"
54                        : "=r"(retval)
55                        : "m"(*lock), "0"(retval)
56                        : "memory");
57   return retval;
58 }
59 */
60
61 static inline int CAS(volatile int* mem, int cmp, int val){
62   int prev;
63   asm volatile ("lock; cmpxchgl %1, %2"             
64                 : "=a" (prev)               
65                 : "r" (val), "m" (*(mem)), "0"(cmp) 
66                 : "memory", "cc");
67   return prev;
68 }
69
70 static inline long CAS32(volatile void *ptr, unsigned long old, unsigned long new){
71   unsigned long prev;
72   __asm__ __volatile__("lock; cmpxchgl %k1,%2"
73                        : "=a"(prev)
74                        : "r"(new), "m"(*__xg(ptr)), "0"(old)
75                        : "memory");
76   return prev;
77 }
78
79 static inline long long CAS64(volatile void *ptr, unsigned long long old, unsigned long long new){
80   unsigned long long prev;
81   __asm__ __volatile__(LOCK_PREFIX "cmpxchgq %1,%2"
82                        : "=a"(prev)
83                        : "r"(new), "m"(*__xg(ptr)), "0"(old)
84                        : "memory");
85   return prev;
86 }
87
88 static inline int BARRIER(){
89   CFENCE;
90   return 1;
91 }