通过程序集实现Double Word CAS

时间:2013-11-21 05:42:45

标签: c++ c gcc assembly x86-64

我试图在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不是一种选择。

0 个答案:

没有答案