对不同的整数宽度使用 xadd

发布于 2024-10-14 07:13:26 字数 404 浏览 7 评论 0原文

我目前正在将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 位数字。有人知道吗?

I'm currently porting atomic.hpp out of boost for a project and would like to generalize the atomic add function whereby it's templated on the type to add:

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;
}

I can't find a clear documentation as to wither it's safe to use signed and unsigned 8, 16, 32 and 64 bit numbers with this. Anyone know?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

み零 2024-10-21 07:13:26

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

来自英特尔手册:

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

警告!

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

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

Yes, you can use lock xadd under IA32 or IA64 with all types of numbers 8, 16, 32 and 64 bit signed or unsigned.
The memory alignment isn't needed but if it is, then the memory access is faster.

From Intel Manual:

The integrity of the LOCK prefix is
not affected by the alignment of the
memory field. Memory locking is
observed for arbitrarily misaligned
fields. This instruction’s operation
is the same in non-64-bit modes and
64-bit mode.

Warning!:

If the LOCK prefix is used with XADD instruction and the source
operand is a memory operand, an
undefined opcode exception (#UD) may
be generated.

So the source operand must be register and the destination operand is memory address!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文