c989a2a5724768140c2cb74f5716f5587ae96f15
[cacao.git] / src / vm / jit / sparc64 / machine-instr.h
1 #ifndef _MACHINE_INSTR_H
2 #define _MACHINE_INSTR_H
3 /*
4 static inline void
5 __attribute__ ((unused))
6 atomic_add (volatile int *mem, int val)
7 {
8     int temp;
9
10   __asm__ __volatile__ (
11     "1:\t"
12     "ldl_l  %1,%3\n\t"
13     "addl   %1,%2,%1\n\t"
14     "stl_c  %1,%0\n\t"
15     "beq    %1,1b\n\t"
16     : "=m"(*mem), "=&r"(temp)
17     : "r"(val), "m"(*mem));
18 }
19 */
20
21 static inline long
22 __attribute__ ((unused))
23 compare_and_swap (volatile long *p, long oldval, long newval)
24 {
25   long ret;
26
27   __asm__ __volatile__ (
28     "mov %3,%0\n\t"
29     "casx %1,%2,%0\n\t"
30     : "=&r"(ret), "=m"(*p) 
31     : "r"(oldval), "r"(newval), "m"(*p));
32
33   return ret;
34 }
35
36 #define STORE_ORDER_BARRIER() __asm__ __volatile__ ("wmb" : : : "memory");
37 #define MEMORY_BARRIER_BEFORE_ATOMIC() __asm__ __volatile__ ("mb" : : : "memory");
38 #define MEMORY_BARRIER_AFTER_ATOMIC() __asm__ __volatile__ ("mb" : : : "memory");
39 #define MEMORY_BARRIER() __asm__ __volatile__ ( \
40                 "mb" : : : "memory" );
41
42 #endif