Sparc体系结构的GCC内联汇编

Sparc体系结构的GCC内联汇编,c,gcc,assembly,sparc,C,Gcc,Assembly,Sparc,我在互联网上发现了以下方面的实施: 当我为i386架构编译并使用这个函数cmpxchg时-一切都很好!但是,当我在Sparc体系结构下编译时,我有以下错误: error: impossible constraint in `asm' 有什么问题吗?您无法为sparc编译x86 asm。以下是我使用clang得到的结果: [~] main% ~/ellcc/bin/sparc-linux-ecc asm.c asm.c:13:20: error: invalid output constrain

我在互联网上发现了以下方面的实施:

当我为i386架构编译并使用这个函数cmpxchg时-一切都很好!但是,当我在Sparc体系结构下编译时,我有以下错误:

error: impossible constraint in `asm'

有什么问题吗?

您无法为sparc编译x86 asm。以下是我使用clang得到的结果:

[~] main% ~/ellcc/bin/sparc-linux-ecc asm.c
asm.c:13:20: error: invalid output constraint '=a' in asm
             : "=a"(prev)
“a”不是sparc寄存器,它特定于x86


即使修复了约束,当sparc汇编程序看到特定于x86的cmpxchgb操作码时,也会出现汇编时错误。

您无法为sparc编译x86 asm。以下是我使用clang得到的结果:

[~] main% ~/ellcc/bin/sparc-linux-ecc asm.c
asm.c:13:20: error: invalid output constraint '=a' in asm
             : "=a"(prev)
“a”不是sparc寄存器,它特定于x86


即使修复了约束,当sparc汇编程序看到特定于x86的cmpxchgb操作码时,也会出现汇编时错误。

cmpxchgb是一条i386指令,在sparc下无法工作。

cmpxchgb是一条i386指令,在Solaris上无法在sparc下工作。

,最好不要在SPARC或x86上为此编写自己的代码;相反,使用这些功能的目的是:

static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
              unsigned long new, int size)
{
    switch (size) {
    case 1: return atomic_cas_8(ptr, (unsigned char)old, (unsigned char)new);
    case 2: return atomic_cas_16(ptr, (unsigned short)old, (unsigned short)new);
    case 4: return atomic_cas_32(ptr, (unsigned int)old, (unsigned int)new);
#ifdef _LP64
    case 8: return atomic_cas_64(ptr, old, new);
#endif
    default: break;    
    }
    return old;
}
这对Solaris就行了

编辑:如果您必须内联这类内容,那么SPARC v8+,也称为UltraSPARC指令将使用比较和交换,也称为CAS。原子sparc总是不知道锁前缀。它只有32位和64位CASX变体,因此8/16位库函数执行32位CAS屏蔽非目标字/字节。我不会帮助重新实现它-这不是一个好主意,使用库接口


Edit2:如果您无法链接到Solaris libc,则可以获得一些关于重新实现的帮助。

在Solaris上,最好不要在SPARC或x86上为此编写自己的代码;相反,使用这些功能的目的是:

static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
              unsigned long new, int size)
{
    switch (size) {
    case 1: return atomic_cas_8(ptr, (unsigned char)old, (unsigned char)new);
    case 2: return atomic_cas_16(ptr, (unsigned short)old, (unsigned short)new);
    case 4: return atomic_cas_32(ptr, (unsigned int)old, (unsigned int)new);
#ifdef _LP64
    case 8: return atomic_cas_64(ptr, old, new);
#endif
    default: break;    
    }
    return old;
}
这对Solaris就行了

编辑:如果您必须内联这类内容,那么SPARC v8+,也称为UltraSPARC指令将使用比较和交换,也称为CAS。原子sparc总是不知道锁前缀。它只有32位和64位CASX变体,因此8/16位库函数执行32位CAS屏蔽非目标字/字节。我不会帮助重新实现它-这不是一个好主意,使用库接口


Edit2:如果无法链接到Solaris libc,则可以获得一些关于重新实现的帮助。

当我可以找到sparc的uu sync u val ; compare u和交换实现时,如果我不懂汇编程序,或者我必须开始学习asm?:当我可以找到sparc的u sync u val ; compare u和swap实现时,如果我不懂汇编程序,或者我必须开始学习asm?:test_cas.c:.text+0x70:未定义对“原子”的引用test_cas.c:.text+0x70:未定义对“原子”的引用