00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00035 #ifndef LIBC_sparc64_ATOMIC_H_
00036 #define LIBC_sparc64_ATOMIC_H_
00037
00038 #define LIBC_ARCH_ATOMIC_H_
00039
00040 #include <atomicdflt.h>
00041 #include <sys/types.h>
00042
00053 static inline atomic_count_t atomic_add(atomic_t *val, atomic_count_t i)
00054 {
00055 atomic_count_t a;
00056 atomic_count_t b;
00057
00058 do {
00059 volatile uintptr_t ptr = (uintptr_t) &val->count;
00060
00061 a = *((atomic_count_t *) ptr);
00062 b = a + i;
00063
00064 asm volatile (
00065 "casx %0, %2, %1\n"
00066 : "+m" (*((atomic_count_t *) ptr)),
00067 "+r" (b)
00068 : "r" (a)
00069 );
00070 } while (a != b);
00071
00072 return a;
00073 }
00074
00075 static inline atomic_count_t atomic_preinc(atomic_t *val)
00076 {
00077 return atomic_add(val, 1) + 1;
00078 }
00079
00080 static inline atomic_count_t atomic_postinc(atomic_t *val)
00081 {
00082 return atomic_add(val, 1);
00083 }
00084
00085 static inline atomic_count_t atomic_predec(atomic_t *val)
00086 {
00087 return atomic_add(val, -1) - 1;
00088 }
00089
00090 static inline atomic_count_t atomic_postdec(atomic_t *val)
00091 {
00092 return atomic_add(val, -1);
00093 }
00094
00095 static inline void atomic_inc(atomic_t *val)
00096 {
00097 (void) atomic_add(val, 1);
00098 }
00099
00100 static inline void atomic_dec(atomic_t *val)
00101 {
00102 (void) atomic_add(val, -1);
00103 }
00104
00105 #endif
00106