对不同的整数宽度使用 xadd
我目前正在将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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
是的,您可以在 IA32 或 IA64 下对所有类型的 8、16、32 和 64 位有符号或无符号数字使用
lock xadd
。不需要内存对齐,但如果需要,则内存访问速度会更快。
来自英特尔手册:
警告!:
所以源操作数必须是寄存器,目标操作数是内存地址!
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:
Warning!:
So the source operand must be register and the destination operand is memory address!