Реализация функции __sync_val_compare_and_swap для Sparc V8

1,00
р.
Имеется кросс компилятор под архитектуру Sparc. Но он не поддерживает Built-in functions for atomic memory access. Меня интересует функция __sync_val_compare_and_swap (long *ptr, long oldval long newval)
она выполняет атомарную операцию сравнения и обмена: That is, if the current value of *ptr is oldval, then write newval into *ptr.
Вот есть реализация для i386: Код:
struct __xchg_dummy { unsigned long a[100] } #define __xg(x) ((struct __xchg_dummy *)(x))
static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) { unsigned long prev switch (size) { case 1: __asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2" : "=a"(prev) : "q"(new), "m"(*__xg(ptr)), "0"(old) : "memory") return prev case 2: __asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2" : "=a"(prev) : "q"(new), "m"(*__xg(ptr)), "0"(old) : "memory") return prev case 4: __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %1,%2" : "=a"(prev) : "q"(new), "m"(*__xg(ptr)), "0"(old) : "memory") return prev } return old }
#define cmpxchg(ptr,o,n)\ ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\ (unsigned long)(n),sizeof(*(ptr))))
Кто-нибудь знаком с написанием ассемблерных вставок (для кода на языке C) под архитектуру Sparc V8? Буду очень благодарен помощи

Ответ
Для Sparc то же самое делается инструкциями под названиями CASA и CASXA. Можете посмотреть, например, во FreeBSD: функции: см. casa, casxa, и их использование atomic_cas_32, atomic_cas_64.