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