X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fmm%2Fboehm-gc%2Flibatomic_ops-1.2%2Fsrc%2Fatomic_ops%2Fsysdeps%2Fgcc%2Fm68k.h;h=4bec437c12143450b9b821288bda5f353646d232;hb=c83bff94e40ee0a218a39931af17814d1a42cb5c;hp=9e7f70a4bfb8ba9c9e95f61cd22bd05a179cdf11;hpb=7cdbbe3be2b5834a248a600176c742bd94aaf730;p=cacao.git diff --git a/src/mm/boehm-gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/gcc/m68k.h b/src/mm/boehm-gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/gcc/m68k.h index 9e7f70a4b..4bec437c1 100644 --- a/src/mm/boehm-gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/gcc/m68k.h +++ b/src/mm/boehm-gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/gcc/m68k.h @@ -15,6 +15,11 @@ * */ +/* The cas instruction causes an emulation trap for the */ +/* 060 with a misaligned pointer, so let's avoid this. */ +#undef AO_t +typedef unsigned long AO_t __attribute__ ((aligned (4))); + /* FIXME. Very incomplete. */ #include "../all_aligned_atomic_load_store.h" @@ -22,24 +27,43 @@ /* AFAIK, Alliants were sequentially consistent. */ #include "../ordered.h" -#include "../test_and_set_t_is_ao_t.h" +#include "../test_and_set_t_is_char.h" /* Contributed by Tony Mantler or new. Should be changed to MIT license? */ AO_INLINE AO_TS_VAL_t AO_test_and_set_full(volatile AO_TS_t *addr) { - int oldval; + AO_TS_t oldval; - /* The return value is semi-phony. */ - /* 'tas' sets bit 7 while the return */ - /* value pretends bit 0 was set */ + /* The value at addr is semi-phony. */ + /* 'tas' sets bit 7 while the return */ + /* value pretends all bits were set, */ + /* which at least matches AO_TS_SET. */ __asm__ __volatile__( - "tas %1@; sne %0; negb %0" - : "=d" (oldval) - : "a" (addr) : "memory"); + "tas %1; sne %0" + : "=d" (oldval), "=m" (*addr) + : "m" (*addr) + : "memory"); return oldval; } #define AO_HAVE_test_and_set_full +/* Returns nonzero if the comparison succeeded. */ +AO_INLINE int +AO_compare_and_swap_full(volatile AO_t *addr, + AO_t old, AO_t new_val) +{ + char result; + + __asm__ __volatile__( + "cas.l %3,%4,%1; seq %0" + : "=d" (result), "=m" (*addr) + : "m" (*addr), "d" (old), "d" (new_val) + : "memory"); + return -result; +} + +#define AO_HAVE_compare_and_swap_full +#include "../ao_t_is_int.h"