如何在x86中实现128位原子操作?
英特尔的系统编程指南第一部分8.1锁定原子操作规定了16位、32位和64位原子操作。那么,通过在两个64位操作中使用LOCK前缀来实现128位原子操作吗?就像这样...
LOCK mov 64bits->addr
LOCK mov 64bits->addr+64bits
显然,SSE拥有128位的XMM寄存器。你是否可以只使用这些寄存器进行128位比较和交换?
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
是唯一可行的方式。
cmpxchg
无需lock
的使用情况,例如在非MMIO端口的内存上用于单处理器系统。这也使其与内存目标add
和其他具有明显用途而不涉及并发性的指令保持一致。 - Peter Cordes
CMPXCHG16B
)。 - James McNellis