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