diff options
| author | Keith Randall <khr@golang.org> | 2016-08-29 20:28:20 -0700 |
|---|---|---|
| committer | Keith Randall <khr@golang.org> | 2016-08-30 15:23:23 +0000 |
| commit | d6098e4277bab633c2df752ed90e1e826918ca67 (patch) | |
| tree | bd46336b292a33dce204bb23313850b9da1c82bf /src/sync/atomic | |
| parent | adb1e67f02fa58b13d1baf60c84556f375f6ceeb (diff) | |
| download | go-d6098e4277bab633c2df752ed90e1e826918ca67.tar.xz | |
cmd/compile: intrinsify sync/atomic for amd64
Uses the same implementation as runtime/internal/atomic.
Reorganize the intrinsic detector to make it more table-driven.
Also works on amd64p32.
Change-Id: I7a5238951d6018d7d5d1bc01f339f6ee9282b2d0
Reviewed-on: https://go-review.googlesource.com/28076
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Diffstat (limited to 'src/sync/atomic')
| -rw-r--r-- | src/sync/atomic/asm_amd64.s | 3 | ||||
| -rw-r--r-- | src/sync/atomic/asm_amd64p32.s | 15 | ||||
| -rw-r--r-- | src/sync/atomic/atomic_test.go | 4 |
3 files changed, 10 insertions, 12 deletions
diff --git a/src/sync/atomic/asm_amd64.s b/src/sync/atomic/asm_amd64.s index 690907c802..eddc6c52cb 100644 --- a/src/sync/atomic/asm_amd64.s +++ b/src/sync/atomic/asm_amd64.s @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// Note: some of these functions are semantically inlined +// by the compiler (in src/cmd/compile/internal/gc/ssa.go). + // +build !race #include "textflag.h" diff --git a/src/sync/atomic/asm_amd64p32.s b/src/sync/atomic/asm_amd64p32.s index 8164b3e8b6..5c64dc015a 100644 --- a/src/sync/atomic/asm_amd64p32.s +++ b/src/sync/atomic/asm_amd64p32.s @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// Note: some of these functions are semantically inlined +// by the compiler (in src/cmd/compile/internal/gc/ssa.go). + #include "textflag.h" TEXT ·SwapInt32(SB),NOSPLIT,$0-12 @@ -50,9 +53,6 @@ TEXT ·CompareAndSwapInt64(SB),NOSPLIT,$0-25 TEXT ·CompareAndSwapUint64(SB),NOSPLIT,$0-25 MOVL addr+0(FP), BX - TESTL $7, BX - JZ 2(PC) - MOVL 0, BX // crash with nil ptr deref MOVQ old+8(FP), AX MOVQ new+16(FP), CX LOCK @@ -81,9 +81,6 @@ TEXT ·AddInt64(SB),NOSPLIT,$0-24 TEXT ·AddUint64(SB),NOSPLIT,$0-24 MOVL addr+0(FP), BX - TESTL $7, BX - JZ 2(PC) - MOVL 0, BX // crash with nil ptr deref MOVQ delta+8(FP), AX MOVQ AX, CX LOCK @@ -106,9 +103,6 @@ TEXT ·LoadInt64(SB),NOSPLIT,$0-16 TEXT ·LoadUint64(SB),NOSPLIT,$0-16 MOVL addr+0(FP), AX - TESTL $7, AX - JZ 2(PC) - MOVL 0, AX // crash with nil ptr deref MOVQ 0(AX), AX MOVQ AX, val+8(FP) RET @@ -136,9 +130,6 @@ TEXT ·StoreInt64(SB),NOSPLIT,$0-16 TEXT ·StoreUint64(SB),NOSPLIT,$0-16 MOVL addr+0(FP), BX - TESTL $7, BX - JZ 2(PC) - MOVL 0, BX // crash with nil ptr deref MOVQ val+8(FP), AX XCHGQ AX, 0(BX) RET diff --git a/src/sync/atomic/atomic_test.go b/src/sync/atomic/atomic_test.go index deb3ccb55b..4f44f48f51 100644 --- a/src/sync/atomic/atomic_test.go +++ b/src/sync/atomic/atomic_test.go @@ -1392,6 +1392,10 @@ func TestUnaligned64(t *testing.T) { if unsafe.Sizeof(int(0)) != 4 { t.Skip("test only runs on 32-bit systems") } + if runtime.GOARCH == "amd64p32" { + // amd64p32 can handle unaligned atomics. + t.Skip("test not needed on amd64p32") + } x := make([]uint32, 4) p := (*uint64)(unsafe.Pointer(&x[1])) // misaligned |
