我试图在Linux g ++ 4.4.6 X86_64中使用cmpxchg16b
来实现Double Word CAS,
不幸的是,在我搜索了许多网站后,我对汇编代码并不熟悉,
并且这些天实施了测试源,它似乎工作!但我不知道
以下2个装配源可以做得更好。任何建议和意见
非常感谢!
struct ptr_
{
uint64_t pointer;
uint64_t serial;
} __attribute__ (( __aligned__( 16 ) )) ;
typedef struct ptr_ nodeptr ;
来源1:
inline static bool
cas_64_2(nodeptr *original,nodeptr *expected,nodeptr *newone)
{
uint64_t *target ;
uint64_t *compare;
uint64_t *set ;
target = (uint64_t *) original ;
compare = (uint64_t *) expected ;
set = (uint64_t *) newone ;
bool z;
__asm__ __volatile__("movq 0(%4), %%rax;"
"movq 8(%4), %%rdx;"
"lock;" "cmpxchg16b %0; setz %1"
: "+m" (*target),
"=q" (z)
: "b" (set[0]),
"c" (set[1]),
"q" (compare)
: "memory", "cc", "%rax", "%rdx");
return z;
}
来源2:
inline static bool
cas_64_2(nodeptr *original,nodeptr *expected,nodeptr *newone)
{
uint64_t *target ;
uint64_t *compare;
uint64_t *set ;
target = (uint64_t *) original ;
compare = (uint64_t *) expected ;
set = (uint64_t *) newone ;
bool z;
__asm__ __volatile__ (
"lock cmpxchg16b %1\n\t"
"setz %0\n"
: "=q" (z)
,"+m" ( *target )
: "a" ( expected->pointer ), "d" (expected->serial )
,"b" ( newone->pointer ), "c" ( newone->serial )
: "cc"
);
return z;
}
我注意到网站上发现的几乎所有来源都像source2一样实现,
我找到的工具只有一个像source1,我的g ++编译器太旧了,
所以使用__uint128_t
不是一种选择。