Commit ab596cae authored by Dmitriy Vyukov's avatar Dmitriy Vyukov

sync/atomic: replace MFENCE with LOCK XADD

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
parent 6f182333
...@@ -103,6 +103,7 @@ TEXT ·LoadInt64(SB),7,$0 ...@@ -103,6 +103,7 @@ TEXT ·LoadInt64(SB),7,$0
TEXT ·LoadUint64(SB),7,$0 TEXT ·LoadUint64(SB),7,$0
MOVL addrptr+0(FP), AX MOVL addrptr+0(FP), AX
// MOVQ and EMMS were introduced on the Pentium MMX.
// MOVQ (%EAX), %MM0 // MOVQ (%EAX), %MM0
BYTE $0x0f; BYTE $0x6f; BYTE $0x00 BYTE $0x0f; BYTE $0x6f; BYTE $0x00
// MOVQ %MM0, 0x8(%ESP) // MOVQ %MM0, 0x8(%ESP)
...@@ -131,14 +132,18 @@ TEXT ·StoreInt64(SB),7,$0 ...@@ -131,14 +132,18 @@ TEXT ·StoreInt64(SB),7,$0
TEXT ·StoreUint64(SB),7,$0 TEXT ·StoreUint64(SB),7,$0
MOVL addrptr+0(FP), AX MOVL addrptr+0(FP), AX
// MOVQ and EMMS were introduced on the Pentium MMX.
// MOVQ 0x8(%ESP), %MM0 // MOVQ 0x8(%ESP), %MM0
BYTE $0x0f; BYTE $0x6f; BYTE $0x44; BYTE $0x24; BYTE $0x08 BYTE $0x0f; BYTE $0x6f; BYTE $0x44; BYTE $0x24; BYTE $0x08
// MOVQ %MM0, (%EAX) // MOVQ %MM0, (%EAX)
BYTE $0x0f; BYTE $0x7f; BYTE $0x00 BYTE $0x0f; BYTE $0x7f; BYTE $0x00
// EMMS // EMMS
BYTE $0x0F; BYTE $0x77 BYTE $0x0F; BYTE $0x77
// MFENCE // This is essentially a no-op, but it provides required memory fencing.
BYTE $0x0f; BYTE $0xae; BYTE $0xf0 // It can be replaced with MFENCE, but MFENCE was introduced only on the Pentium4 (SSE2).
XORL AX, AX
LOCK
XADDL AX, (SP)
RET RET
TEXT ·StoreUintptr(SB),7,$0 TEXT ·StoreUintptr(SB),7,$0
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment