내가 인터넷에서 __sync_val_compare_and_swap의 구현을 발견했습니다GCC 인라인 어셈블리 스팍 아키텍처
#define LOCK_PREFIX "lock ; "
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))))
내가 컴파일하고 I386 아키텍처이 기능 (CMPXCHG)를 사용하여 - 모든 좋은! 하지만 Sparc 아키텍처에서 컴파일 할 때 다음 오류가 발생했습니다.
error: impossible constraint in `asm'
문제점 :
test_cas.c :(. 텍스트 + 0x70) : 'atomic_cas_8'에 대한 정의되지 않은 참조 –