Sparc体系结构的GCC内联汇编
我在互联网上发现了以下方面的实施: 当我为i386架构编译并使用这个函数cmpxchg时-一切都很好!但是,当我在Sparc体系结构下编译时,我有以下错误: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
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:未定义对“原子”的引用