]> Cypherpunks repositories - gostls13.git/commitdiff
sync/atomic: replace MFENCE with LOCK XADD
authorDmitriy Vyukov <dvyukov@google.com>
Mon, 19 Sep 2011 18:09:00 +0000 (11:09 -0700)
committerDmitriy Vyukov <dvyukov@google.com>
Mon, 19 Sep 2011 18:09:00 +0000 (11:09 -0700)
MFENCE was introduced only on the Pentium4 (SSE2),
while XADD was introduced on the 486.
Fixes #2268.

R=golang-dev, rsc
CC=fshahriar, golang-dev
https://golang.org/cl/5056045

src/pkg/sync/atomic/asm_386.s

index 0d9dec21675c8d8a0f0429722506b13811a4b16c..d149eb66abea3fc69ae2e300933a21e2892100e0 100644 (file)
@@ -103,6 +103,7 @@ TEXT ·LoadInt64(SB),7,$0
 
 TEXT ·LoadUint64(SB),7,$0
        MOVL    addrptr+0(FP), AX
+       // MOVQ and EMMS were introduced on the Pentium MMX.
        // MOVQ (%EAX), %MM0
        BYTE $0x0f; BYTE $0x6f; BYTE $0x00
        // MOVQ %MM0, 0x8(%ESP)
@@ -131,14 +132,18 @@ TEXT ·StoreInt64(SB),7,$0
 
 TEXT ·StoreUint64(SB),7,$0
        MOVL    addrptr+0(FP), AX
+       // MOVQ and EMMS were introduced on the Pentium MMX.
        // MOVQ 0x8(%ESP), %MM0
        BYTE $0x0f; BYTE $0x6f; BYTE $0x44; BYTE $0x24; BYTE $0x08
        // MOVQ %MM0, (%EAX)
        BYTE $0x0f; BYTE $0x7f; BYTE $0x00 
        // EMMS
        BYTE $0x0F; BYTE $0x77
-       // MFENCE
-       BYTE $0x0f; BYTE $0xae; BYTE $0xf0
+       // 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
 
 TEXT ·StoreUintptr(SB),7,$0