This source file includes following definitions.
- atomic_add
- atomic_sub
1 #ifndef __ARCH_ALPHA_ATOMIC__
2 #define __ARCH_ALPHA_ATOMIC__
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #define __atomic_fool_gcc(x) (*(struct { int a[100]; } *)x)
18
19 typedef int atomic_t;
20
21 extern __inline__ void atomic_add(atomic_t i, atomic_t * v)
22 {
23 unsigned long temp;
24 __asm__ __volatile__(
25 "\n1:\t"
26 "ldl_l %0,%1\n\t"
27 "addl %0,%2,%0\n\t"
28 "stl_c %0,%1\n\t"
29 "beq %0,1b\n"
30 "2:"
31 :"=&r" (temp),
32 "=m" (__atomic_fool_gcc(v))
33 :"Ir" (i),
34 "m" (__atomic_fool_gcc(v)));
35 }
36
37 extern __inline__ void atomic_sub(atomic_t i, atomic_t * v)
38 {
39 unsigned long temp;
40 __asm__ __volatile__(
41 "\n1:\t"
42 "ldl_l %0,%1\n\t"
43 "subl %0,%2,%0\n\t"
44 "stl_c %0,%1\n\t"
45 "beq %0,1b\n"
46 "2:"
47 :"=&r" (temp),
48 "=m" (__atomic_fool_gcc(v))
49 :"Ir" (i),
50 "m" (__atomic_fool_gcc(v)));
51 }
52
53 #define atomic_inc(v) atomic_add(1,(v))
54 #define atomic_dec(v) atomic_sub(1,(v))
55
56 #endif