00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _QORE_MACHINE_MACROS_H
00022 #define _QORE_MACHINE_MACROS_H
00023
00024 #define STACK_DIRECTION_DOWN 1
00025
00026 #ifdef __GNUC__
00027 #define HAVE_ATOMIC_MACROS
00028
00029
00030 static inline int atomic_dec(volatile int *a) {
00031 unsigned char rc;
00032
00033 __asm(
00034 "lock; decl %0; sete %1"
00035 : "=m" (*a), "=qm" (rc)
00036 : "m" (*a) : "memory"
00037 );
00038 return rc != 0;
00039 }
00040
00041 static inline void atomic_inc(volatile int *a) {
00042 __asm(
00043 "lock; incl %0"
00044 : "=m" (*a)
00045 );
00046 }
00047
00048 #define HAVE_CHECK_STACK_POS
00049
00050 static inline size_t get_stack_pos() {
00051 size_t addr;
00052 __asm("movl %%esp, %0" : "=g" (addr) );
00053 return addr;
00054 }
00055
00056 #endif // __GNUC__
00057
00058 #ifdef __SUNPRO_CC
00059 #define HAVE_ATOMIC_MACROS
00060
00061
00062 extern "C" int atomic_dec(volatile int *a);
00063 extern "C" void atomic_inc(volatile int *a);
00064
00065 #define HAVE_CHECK_STACK_POS
00066 extern "C" size_t get_stack_pos();
00067 #endif // #ifdef __SUNPRO_CC
00068
00069 #endif // #ifndef _QORE_MACHINE_MACROS_H
00070