"XORL AX,AX"如何作为记忆围栏工作?



最近我一直在浏览Go的源代码,特别是runtime/internal/atomic/asm_386.s。 下面是一个internal.atomic.Store64函数的实现。

// void runtime∕internal∕atomic·Store64(uint64 volatile* addr, uint64 v);
TEXT runtime∕internal∕atomic·Store64(SB), NOSPLIT, $0-12
MOVL    ptr+0(FP), AX
TESTL   $7, AX
JZ  2(PC)
MOVL    0, AX // crash with nil ptr deref
// MOVQ and EMMS were introduced on the Pentium MMX.
MOVQ    val+4(FP), M0
MOVQ    M0, (AX)
EMMS
// This is essentially a no-op, but it provides required memory fencing.
// It can be replaced with MFENCE, but MFENCE was introduced only on the Pentium4 (SSE2).
XORL    AX, AX
LOCK
XADDL   AX, (SP)
RET

该问题与函数中的第二个注释有关。有人可以解释一下XORL AX, AX如何作为记忆围栏工作吗?

我想这与紧随其后的LOCK有关,但它是如何工作的呢?

谢谢。

它不是充当内存围栏的XOR。这是锁定XADD指令来做到这一点。XOR指令清除EAX,以便XADD指令实际上不会更改内存的内容。

锁定指令的内存排序行为在此问题的答案中描述:x86 CPU 有多少个内存屏障指令?