00001 #ifndef _QORE_MACHINE_MACROS_H
00002
00003 #define _QORE_MACHINE_MACROS_H
00004
00005
00006 #if !defined(__sparcv9)
00007
00008 #define STACK_DIRECTION_DOWN 1
00009
00010 #ifdef __GNUC__
00011
00012 #define HAVE_ATOMIC_MACROS
00013
00014
00015 inline int compare_and_swap(int *dest_, int compare_, int swap_) {
00016 __asm__ __volatile__( "cas %0, %2, %1"
00017 : "+m" (*dest_), "+r" (swap_)
00018 : "r" (compare_)
00019 : "memory" );
00020
00021 return swap_;
00022 }
00023
00024 inline int atomic_fetch_and_add(int * pw, int dv) {
00025 for( ;; ) {
00026 int r = *pw;
00027
00028 if (__builtin_expect((compare_and_swap(pw, r, r + dv) == r), 1)) {
00029 return r;
00030 }
00031 }
00032 }
00033
00034 static inline int atomic_dec(int *pw) {
00035 return !atomic_fetch_and_add(pw, -1);
00036 }
00037
00038 static inline void atomic_inc(int *pw) {
00039 atomic_fetch_and_add(pw, 1);
00040 }
00041
00042 #define HAVE_CHECK_STACK_POS
00043
00044 static inline size_t get_stack_pos() {
00045 size_t addr;
00046 __asm__("mov %%sp,%0" : "=r" (addr) );
00047 return addr;
00048 }
00049
00050 #endif
00051
00052 #ifdef __SUNPRO_CC
00053 #define HAVE_ATOMIC_MACROS
00054
00055
00056 extern "C" int atomic_dec(int *pw);
00057 extern "C" void atomic_inc(int *pw);
00058
00059 #define HAVE_CHECK_STACK_POS
00060
00061 extern "C" size_t get_stack_pos();
00062
00063 #endif
00064
00065 #endif
00066
00067 #endif