2 #ifndef _QORE_MACHINE_MACROS_H
4 #define _QORE_MACHINE_MACROS_H
7 #if !defined(__sparcv9)
9 #define STACK_DIRECTION_DOWN 1
13 #define HAVE_ATOMIC_MACROS
16 inline int compare_and_swap(
int *dest_,
int compare_,
int swap_) {
17 __asm__ __volatile__(
"cas %0, %2, %1"
18 :
"+m" (*dest_),
"+r" (swap_)
25 inline int atomic_fetch_and_add(
int * pw,
int dv) {
29 if (__builtin_expect((compare_and_swap(pw, r, r + dv) == r), 1)) {
35 static inline int atomic_dec(
int *pw) {
36 return !atomic_fetch_and_add(pw, -1);
39 static inline void atomic_inc(
int *pw) {
40 atomic_fetch_and_add(pw, 1);
43 #define HAVE_CHECK_STACK_POS
45 static inline size_t get_stack_pos() {
47 __asm__(
"mov %%sp,%0" :
"=r" (addr) );
54 #define HAVE_ATOMIC_MACROS
57 extern "C" int atomic_dec(
int *pw);
58 extern "C" void atomic_inc(
int *pw);
60 #define HAVE_CHECK_STACK_POS
62 extern "C" size_t get_stack_pos();