使用xadd表示不同的整数宽度

时间:2011-01-26 19:08:57

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

我目前正在将atomic.hpp移植到项目的boost之外,并且想要推广原子添加函数,从而对要添加的类型进行模板化处理:

template <typename T, typename V>
inline T add(volatile T* mem, V val)
{
    T r;

    asm volatile
    (
        "lock\n\t"
        "xadd %1, %0":
        "+m"( *mem ), "=r"( r ):
        "1"( val ):
        "memory", "cc"
    );

    return r;
}

我找不到一个明确的文档,因为使用有符号和无符号的8,16,32和64位数字是安全的。有人知道吗?

1 个答案:

答案 0 :(得分:2)

是的,你可以在IA32或IA64下使用lock xadd所有类型的数字8,16,32和64位有符号或无符号。 不需要内存对齐,但如果是,则内存访问速度更快。

来自英特尔手册:

  

LOCK前缀的完整性是   不受对齐的影响   记忆领域。内存锁定是   观察到任意错位   领域。这条指令的操作   在非64位模式下是相同的   64位模式。

警告

  

如果LOCK前缀与XADD指令和源一起使用   操作数是一个内存操作数,一个   未定义的操作码异常(#UD)可以   生成。

因此源操作数必须是寄存器,目标操作数是内存地址!