initial commit of new memory queue. still just working with fine-grain cases.
[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
8 #define CFENCE   asm volatile("":::"memory");
9
10 #define LOCK_PREFIX \
11   ".section .smp_locks,\"a\"\n"   \
12   "  .align 4\n"                  \
13   "  .long 661f\n"             /* address */\
14   ".previous\n"                   \
15   "661:\n\tlock; "
16
17
18 static inline void atomic_dec(volatile int *v) {
19   __asm__ __volatile__ (LOCK_PREFIX "decl %0"
20                         : "+m" (*v));
21 }
22
23 static inline void atomic_inc(volatile int *v) {
24   __asm__ __volatile__ (LOCK_PREFIX "incl %0"
25                         : "+m" (*v));
26 }
27
28 static inline int atomic_sub_and_test(int i, volatile int *v) {
29   unsigned char c;
30
31   __asm__ __volatile__ (LOCK_PREFIX "subl %2,%0; sete %1"
32                         : "+m" (*v), "=qm" (c)
33                         : "ir" (i) : "memory");
34   return c;
35 }
36
37 static inline int LOCKXCHG(volatile int* ptr, int val){
38   
39   int retval;
40   //note: xchgl always implies lock 
41   __asm__ __volatile__("xchgl %0,%1"
42                        : "=r"(retval)
43                        : "m"(*ptr), "0"(val)
44                        : "memory");
45   return retval;
46  
47 }
48
49 /*
50 static inline int write_trylock(volatile int *lock) {
51   int retval=0;
52   __asm__ __volatile__("xchgl %0,%1"
53                        : "=r"(retval)
54                        : "m"(*lock), "0"(retval)
55                        : "memory");
56   return retval;
57 }
58 */
59
60 static inline int CAS(volatile int* mem, int cmp, int val){
61   int prev;
62   asm volatile ("lock; cmpxchgl %1, %2"             
63                 : "=a" (prev)               
64                 : "r" (val), "m" (*(mem)), "0"(cmp) 
65                 : "memory", "cc");
66   return prev;
67 }
68
69 static inline int BARRIER(){
70   CFENCE;
71   return 1;
72 }