Go Assembly 示例: Sync Atomic

这个例子摘自 sync/atomic, 提供了底层的原子操作. SwapT 函数实现了 swap 操作。 1. old = *addr 2. *addr = new 3. return old

package atomic

SwapInt32 自动保存新值到 *addr 并且返回先前的 *addr 的值.

func SwapInt32(addr *int32, new int32) (old int32)
#include "textflag.h"
TEXT ·SwapInt32(SB),NOSPLIT,$0-20
	JMP	·SwapUint32(SB)
TEXT ·SwapUint32(SB),NOSPLIT,$0-20
	MOVQ	addr+0(FP), BP
	MOVL	new+8(FP), AX

XCHGL 并不等价于 Write-After-Read, 因为在数据交换的时候总线是加锁的。

	XCHGL	AX, 0(BP)
	MOVL	AX, old+16(FP)
	RET

 下一个例子: AES.