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_ppc32_ATOMIC_H_
00036 #define LIBC_ppc32_ATOMIC_H_
00037
00038 #define LIBC_ARCH_ATOMIC_H_
00039
00040 #include <atomicdflt.h>
00041
00042 static inline void atomic_inc(atomic_t *val)
00043 {
00044 atomic_count_t tmp;
00045
00046 asm volatile (
00047 "1:\n"
00048 "lwarx %0, 0, %2\n"
00049 "addic %0, %0, 1\n"
00050 "stwcx. %0, 0, %2\n"
00051 "bne- 1b"
00052 : "=&r" (tmp),
00053 "=m" (val->count)
00054 : "r" (&val->count),
00055 "m" (val->count)
00056 : "cc"
00057 );
00058 }
00059
00060 static inline void atomic_dec(atomic_t *val)
00061 {
00062 atomic_count_t tmp;
00063
00064 asm volatile (
00065 "1:\n"
00066 "lwarx %0, 0, %2\n"
00067 "addic %0, %0, -1\n"
00068 "stwcx. %0, 0, %2\n"
00069 "bne- 1b"
00070 : "=&r" (tmp),
00071 "=m" (val->count)
00072 : "r" (&val->count),
00073 "m" (val->count)
00074 : "cc"
00075 );
00076 }
00077
00078 static inline atomic_count_t atomic_postinc(atomic_t *val)
00079 {
00080 atomic_inc(val);
00081 return val->count - 1;
00082 }
00083
00084 static inline atomic_count_t atomic_postdec(atomic_t *val)
00085 {
00086 atomic_dec(val);
00087 return val->count + 1;
00088 }
00089
00090 static inline atomic_count_t atomic_preinc(atomic_t *val)
00091 {
00092 atomic_inc(val);
00093 return val->count;
00094 }
00095
00096 static inline atomic_count_t atomic_predec(atomic_t *val)
00097 {
00098 atomic_dec(val);
00099 return val->count;
00100 }
00101
00102 #endif
00103