用于Sparc架构的GCC内联汇编

G-7*_*-71 1 c assembly gcc sparc

我在互联网上找到了__sync_val_compare_and_swap的实现:

#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))))
Run Code Online (Sandbox Code Playgroud)

当我编译并使用此功能(cmpxchg)用于i386架构时 - 一切都很好!但是,当我在Sparc架构下编译时,我有以下错误:

error: impossible constraint in `asm'
Run Code Online (Sandbox Code Playgroud)

有什么问题?

oua*_*uah 5

cmpxchgb 是一个i386指令,它不会在Sparc下工作.