aboutsummaryrefslogtreecommitdiff
path: root/src/sync
diff options
context:
space:
mode:
authorVladimir Stefanovic <vladimir.stefanovic@imgtec.com>2016-10-18 23:51:06 +0200
committerBrad Fitzpatrick <bradfitz@golang.org>2016-11-03 22:48:09 +0000
commit9788e3d4d72792da22a12e54f8a86e25a03b58ab (patch)
tree02f4cc8e4d70e5e4a6714633367dea5e248d1c16 /src/sync
parentb241a06479864b85c2377e52b775b176f686e192 (diff)
downloadgo-9788e3d4d72792da22a12e54f8a86e25a03b58ab.tar.xz
sync/atomic: add support for GOARCH=mips{,le}
Change-Id: I10f36710dd95b9bd31b3b82a3c32edcadb90ffa9 Reviewed-on: https://go-review.googlesource.com/31510 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
Diffstat (limited to 'src/sync')
-rw-r--r--src/sync/atomic/asm_mipsx.s85
-rw-r--r--src/sync/atomic/atomic_test.go15
2 files changed, 94 insertions, 6 deletions
diff --git a/src/sync/atomic/asm_mipsx.s b/src/sync/atomic/asm_mipsx.s
new file mode 100644
index 0000000000..cf3318ff85
--- /dev/null
+++ b/src/sync/atomic/asm_mipsx.s
@@ -0,0 +1,85 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build mips mipsle
+
+#include "textflag.h"
+
+TEXT ·SwapInt32(SB),NOSPLIT,$0-12
+ JMP runtime∕internal∕atomic·Xchg(SB)
+
+TEXT ·SwapUint32(SB),NOSPLIT,$0-12
+ JMP runtime∕internal∕atomic·Xchg(SB)
+
+TEXT ·SwapInt64(SB),NOSPLIT,$0-24
+ JMP runtime∕internal∕atomic·Xchg64(SB)
+
+TEXT ·SwapUint64(SB),NOSPLIT,$0-24
+ JMP runtime∕internal∕atomic·Xchg64(SB)
+
+TEXT ·SwapUintptr(SB),NOSPLIT,$0-20
+ JMP runtime∕internal∕atomic·Xchg(SB)
+
+TEXT ·CompareAndSwapInt32(SB),NOSPLIT,$0-13
+ JMP runtime∕internal∕atomic·Cas(SB)
+
+TEXT ·CompareAndSwapUint32(SB),NOSPLIT,$0-13
+ JMP runtime∕internal∕atomic·Cas(SB)
+
+TEXT ·CompareAndSwapUintptr(SB),NOSPLIT,$0-13
+ JMP runtime∕internal∕atomic·Cas(SB)
+
+TEXT ·CompareAndSwapInt64(SB),NOSPLIT,$0-21
+ JMP runtime∕internal∕atomic·Cas64(SB)
+
+TEXT ·CompareAndSwapUint64(SB),NOSPLIT,$0-21
+ JMP runtime∕internal∕atomic·Cas64(SB)
+
+TEXT ·AddInt32(SB),NOSPLIT,$0-12
+ JMP runtime∕internal∕atomic·Xadd(SB)
+
+TEXT ·AddUint32(SB),NOSPLIT,$0-12
+ JMP runtime∕internal∕atomic·Xadd(SB)
+
+TEXT ·AddUintptr(SB),NOSPLIT,$0-12
+ JMP runtime∕internal∕atomic·Xadd(SB)
+
+TEXT ·AddInt64(SB),NOSPLIT,$0-20
+ JMP runtime∕internal∕atomic·Xadd64(SB)
+
+TEXT ·AddUint64(SB),NOSPLIT,$0-20
+ JMP runtime∕internal∕atomic·Xadd64(SB)
+
+TEXT ·LoadInt32(SB),NOSPLIT,$0-8
+ JMP runtime∕internal∕atomic·Load(SB)
+
+TEXT ·LoadUint32(SB),NOSPLIT,$0-8
+ JMP runtime∕internal∕atomic·Load(SB)
+
+TEXT ·LoadInt64(SB),NOSPLIT,$0-12
+ JMP runtime∕internal∕atomic·Load64(SB)
+
+TEXT ·LoadUint64(SB),NOSPLIT,$0-12
+ JMP runtime∕internal∕atomic·Load64(SB)
+
+TEXT ·LoadUintptr(SB),NOSPLIT,$0-8
+ JMP runtime∕internal∕atomic·Load(SB)
+
+TEXT ·LoadPointer(SB),NOSPLIT,$0-8
+ JMP runtime∕internal∕atomic·Load(SB)
+
+TEXT ·StoreInt32(SB),NOSPLIT,$0-8
+ JMP runtime∕internal∕atomic·Store(SB)
+
+TEXT ·StoreUint32(SB),NOSPLIT,$0-8
+ JMP runtime∕internal∕atomic·Store(SB)
+
+TEXT ·StoreInt64(SB),NOSPLIT,$0-12
+ JMP runtime∕internal∕atomic·Store64(SB)
+
+TEXT ·StoreUint64(SB),NOSPLIT,$0-12
+ JMP runtime∕internal∕atomic·Store64(SB)
+
+TEXT ·StoreUintptr(SB),NOSPLIT,$0-8
+ JMP runtime∕internal∕atomic·Store(SB)
diff --git a/src/sync/atomic/atomic_test.go b/src/sync/atomic/atomic_test.go
index 4f44f48f51..a230d63329 100644
--- a/src/sync/atomic/atomic_test.go
+++ b/src/sync/atomic/atomic_test.go
@@ -1389,12 +1389,15 @@ func TestUnaligned64(t *testing.T) {
// Unaligned 64-bit atomics on 32-bit systems are
// a continual source of pain. Test that on 32-bit systems they crash
// instead of failing silently.
- 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")
+
+ switch runtime.GOARCH {
+ default:
+ if unsafe.Sizeof(int(0)) != 4 {
+ t.Skip("test only runs on 32-bit systems")
+ }
+ case "amd64p32", "mips", "mipsle":
+ // amd64p32 and mips can handle unaligned atomics.
+ t.Skipf("test not needed on %v", runtime.GOARCH)
}
x := make([]uint32, 4)