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
00029 #define HAVE_ATOMIC_MACROS
00030 #define HAVE_CHECK_STACK_POS
00031
00032
00033 static inline int atomic_dec(volatile int *a) {
00034 unsigned char rc;
00035
00036 __asm(
00037 "lock; decl %0; sete %1"
00038 : "=m" (*a), "=qm" (rc)
00039 : "m" (*a) : "memory"
00040 );
00041 return rc != 0;
00042 }
00043
00044 static inline void atomic_inc(volatile int *a) {
00045 __asm(
00046 "lock; incl %0"
00047 : "=m" (*a)
00048 );
00049 }
00050
00051 static inline size_t get_stack_pos() {
00052 size_t addr;
00053 __asm("movq %%rsp, %0" : "=g" (addr) );
00054 return addr;
00055 }
00056
00057 #endif // #ifdef __GNUC__
00058
00059 #ifdef __SUNPRO_CC
00060
00061 #define HAVE_ATOMIC_MACROS
00062 #define HAVE_CHECK_STACK_POS
00063
00064
00065 extern "C" int atomic_dec(volatile int *a);
00066 extern "C" void atomic_inc(volatile int *a);
00067
00068 extern "C" size_t get_stack_pos();
00069
00070 #endif // #ifdef __SUNPRO_CC
00071
00072 #endif // #ifndef _QORE_MACHINE_MACROS_H
00073