Change the local hashtable for recording the pointer mapping info used in the gc...
[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 INTPTR *)(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 #ifdef BIT64
39 static inline INTPTR LOCKXCHG(volatile INTPTR * ptr, INTPTR val){
40   INTPTR retval;
41   //note: xchgl always implies lock 
42   __asm__ __volatile__("xchgq %0,%1"
43                        : "=r"(retval)
44                        : "m"(*ptr), "0"(val)
45                        : "memory");
46   return retval;
47  
48 }
49 #else
50 static inline int LOCKXCHG(volatile int* ptr, int val){
51   int retval;
52   //note: xchgl always implies lock 
53   __asm__ __volatile__("xchgl %0,%1"
54                        : "=r"(retval)
55                        : "m"(*ptr), "0"(val)
56                        : "memory");
57   return retval;
58  
59 }
60 #endif
61
62 /*
63 static inline int write_trylock(volatile int *lock) {
64   int retval=0;
65   __asm__ __volatile__("xchgl %0,%1"
66                        : "=r"(retval)
67                        : "m"(*lock), "0"(retval)
68                        : "memory");
69   return retval;
70 }
71 */
72
73 #ifdef BIT64
74 static inline INTPTR CAS(volatile void *ptr, unsigned INTPTR old, unsigned INTPTR new){
75   unsigned INTPTR prev;
76   __asm__ __volatile__("lock; cmpxchgq %1,%2"
77                        : "=a"(prev)
78                        : "r"(new), "m"(*__xg(ptr)), "0"(old)
79                        : "memory");
80   return prev;
81 }
82 #else
83 static inline long CAS(volatile void *ptr, unsigned long old, unsigned long new){
84   unsigned long prev;
85   __asm__ __volatile__("lock; cmpxchgl %k1,%2"
86                        : "=a"(prev)
87                        : "r"(new), "m"(*__xg(ptr)), "0"(old)
88                        : "memory");
89   return prev;
90 }
91 #endif
92
93 static inline int BARRIER(){
94   CFENCE;
95   return 1;
96 }