x86 128位原子操作

6

如何在x86中实现128位原子操作?

英特尔的系统编程指南第一部分8.1锁定原子操作规定了16位、32位和64位原子操作。那么,通过在两个64位操作中使用LOCK前缀来实现128位原子操作吗?就像这样...

LOCK mov 64bits->addr
LOCK mov 64bits->addr+64bits

显然,SSE拥有128位的XMM寄存器。你是否可以只使用这些寄存器进行128位比较和交换?

10
您可以执行一个原子的16字节比较并交换操作(CMPXCHG16B)。 - James McNellis
你是想在32位x86还是x64上实现这个? - user200783
1个回答

11

MOV指令不能与LOCK前缀一起使用。

LOCK前缀只能添加到以下操作码中,且只能添加到目标操作数是内存操作数的形式:ADD、ADC、AND、BTC、BTR、BTS、CMPXCHG、CMPXCH8B、DEC、INC、NEG、NOT、OR、SBB、SUB、XOR、XADD和XCHG。英特尔指令集参考

这样做会生成一个Invalid Opcode Exception(无效操作码异常),因此LOCK CMPXCHG16B是唯一可行的方式。


关于Intel指令集参考,需要添加“LOCK”。 “此指令可以与LOCK前缀一起使用,以允许原子执行该指令。为了简化处理器总线的接口,目标操作数将在不考虑比较结果的情况下接收写入周期。” - bkausbk
@brooksbp:有一些cmpxchg无需lock的使用情况,例如在非MMIO端口的内存上用于单处理器系统。这也使其与内存目标add和其他具有明显用途而不涉及并发性的指令保持一致。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接