barrier changes
[cacao.git] / jit / alpha / 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 static inline long
21 __attribute__ ((unused))
22 compare_and_swap (volatile long *p, long oldval, long newval)
23 {
24   long ret, temp;
25
26   __asm__ __volatile__ (
27     "1:\t"
28     "ldq_l  %0,%5\n\t"
29     "cmpeq  %0,%3,%2\n\t"
30     "beq    %2,2f\n\t"
31     "mov    %4,%2\n\t"
32     "stq_c  %2,%1\n\t"
33     "beq    %2,1b\n\t"
34     "2:\t"
35     : "=&r"(ret), "=m"(*p), "=&r"(temp)
36     : "r"(oldval), "r"(newval), "m"(*p));
37
38   return ret;
39 }
40
41 #define STORE_ORDER_BARRIER() __asm__ __volatile__ ("wmb" : : : "memory");
42 #define MEMORY_BARRIER_BEFORE_ATOMIC() __asm__ __volatile__ ("mb" : : : "memory");
43 #define MEMORY_BARRIER_AFTER_ATOMIC() __asm__ __volatile__ ("rmb" : : : "memory");
44 #define MEMORY_BARRIER() __asm__ __volatile__ ( \
45                 "mb" : : : "memory" );
46
47 #endif