]> Cypherpunks repositories - gostls13.git/commitdiff
sync/atomic: add support for GOARCH=mips{,le}
authorVladimir Stefanovic <vladimir.stefanovic@imgtec.com>
Tue, 18 Oct 2016 21:51:06 +0000 (23:51 +0200)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 3 Nov 2016 22:48:09 +0000 (22:48 +0000)
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>
src/runtime/internal/atomic/atomic_test.go
src/sync/atomic/asm_mipsx.s [new file with mode: 0644]
src/sync/atomic/atomic_test.go

index d5dc552b9521353021b883f9681b6caa561a82ec..d0a39a14332fd6904b241efde21e91d7b0c45ed3 100644 (file)
@@ -7,6 +7,7 @@ package atomic_test
 import (
        "runtime"
        "runtime/internal/atomic"
+       "runtime/internal/sys"
        "testing"
        "unsafe"
 )
@@ -51,13 +52,13 @@ func TestXadduintptr(t *testing.T) {
 // Tests that xadduintptr correctly updates 64-bit values. The place where
 // we actually do so is mstats.go, functions mSysStat{Inc,Dec}.
 func TestXadduintptrOnUint64(t *testing.T) {
-       /*      if runtime.BigEndian != 0 {
+       if sys.BigEndian != 0 {
                // On big endian architectures, we never use xadduintptr to update
                // 64-bit values and hence we skip the test.  (Note that functions
                // mSysStat{Inc,Dec} in mstats.go have explicit checks for
                // big-endianness.)
-               return
-       }*/
+               t.Skip("skip xadduintptr on big endian architecture")
+       }
        const inc = 100
        val := uint64(0)
        atomic.Xadduintptr((*uintptr)(unsafe.Pointer(&val)), inc)
diff --git a/src/sync/atomic/asm_mipsx.s b/src/sync/atomic/asm_mipsx.s
new file mode 100644 (file)
index 0000000..cf3318f
--- /dev/null
@@ -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)
index 4f44f48f514db12d16159368b2878c69824c7448..a230d633297f0ee8ec77b9b75be2aa538c3ca513 100644 (file)
@@ -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)