Rev 534 | Rev 627 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 534 | Rev 625 | ||
|---|---|---|---|
| Line 29... | Line 29... | ||
| 29 | #ifndef __ia64_ATOMIC_H__ |
29 | #ifndef __ia64_ATOMIC_H__ |
| 30 | #define __ia64_ATOMIC_H__ |
30 | #define __ia64_ATOMIC_H__ |
| 31 | 31 | ||
| 32 | #include <arch/types.h> |
32 | #include <arch/types.h> |
| 33 | 33 | ||
| 34 | typedef volatile __u64 atomic_t; |
34 | typedef struct { volatile __u64 count; } atomic_t; |
| 35 | 35 | ||
| 36 | static inline atomic_t atomic_add(atomic_t *val, int imm) |
36 | static inline atomic_t atomic_add(atomic_t *val, int imm) |
| 37 | { |
37 | { |
| 38 | atomic_t v; |
38 | atomic_t v; |
| 39 | 39 | ||
| 40 | 40 | ||
| 41 | __asm__ volatile ("fetchadd8.rel %0 = %1, %2\n" : "=r" (v), "+m" (*val) : "i" (imm)); |
41 | __asm__ volatile ("fetchadd8.rel %0 = %1, %2\n" : "=r" (v), "+m" (val->count) : "i" (imm)); |
| 42 | 42 | ||
| 43 | return v; |
43 | return v; |
| 44 | } |
44 | } |
| 45 | 45 | ||
| - | 46 | static inline void atomic_set(atomic_t *val, __u64 i) |
|
| - | 47 | { |
|
| - | 48 | val->count = i; |
|
| - | 49 | } |
|
| - | 50 | ||
| - | 51 | static inline __u32 atomic_get(atomic_t *val) |
|
| - | 52 | { |
|
| - | 53 | return val->count; |
|
| - | 54 | } |
|
| - | 55 | ||
| 46 | static inline void atomic_inc(atomic_t *val) { atomic_add(val, 1); } |
56 | static inline void atomic_inc(atomic_t *val) { atomic_add(val, 1); } |
| 47 | static inline void atomic_dec(atomic_t *val) { atomic_add(val, -1); } |
57 | static inline void atomic_dec(atomic_t *val) { atomic_add(val, -1); } |
| 48 | 58 | ||
| 49 | 59 | ||
| 50 | static inline atomic_t atomic_inc_pre(atomic_t *val) { return atomic_add(val, 1); } |
60 | static inline atomic_t atomic_inc_pre(atomic_t *val) { return atomic_add(val, 1); } |