Skip to content

Commit 9788e3d

Browse files
Vladimir Stefanovicbradfitz
Vladimir Stefanovic
authored andcommitted
sync/atomic: add support for GOARCH=mips{,le}
Change-Id: I10f36710dd95b9bd31b3b82a3c32edcadb90ffa9 Reviewed-on: https://go-review.googlesource.com/31510 Run-TryBot: Brad Fitzpatrick <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Cherry Zhang <[email protected]>
1 parent b241a06 commit 9788e3d

File tree

3 files changed

+98
-9
lines changed

3 files changed

+98
-9
lines changed

src/runtime/internal/atomic/atomic_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package atomic_test
77
import (
88
"runtime"
99
"runtime/internal/atomic"
10+
"runtime/internal/sys"
1011
"testing"
1112
"unsafe"
1213
)
@@ -51,13 +52,13 @@ func TestXadduintptr(t *testing.T) {
5152
// Tests that xadduintptr correctly updates 64-bit values. The place where
5253
// we actually do so is mstats.go, functions mSysStat{Inc,Dec}.
5354
func TestXadduintptrOnUint64(t *testing.T) {
54-
/* if runtime.BigEndian != 0 {
55+
if sys.BigEndian != 0 {
5556
// On big endian architectures, we never use xadduintptr to update
5657
// 64-bit values and hence we skip the test. (Note that functions
5758
// mSysStat{Inc,Dec} in mstats.go have explicit checks for
5859
// big-endianness.)
59-
return
60-
}*/
60+
t.Skip("skip xadduintptr on big endian architecture")
61+
}
6162
const inc = 100
6263
val := uint64(0)
6364
atomic.Xadduintptr((*uintptr)(unsafe.Pointer(&val)), inc)

src/sync/atomic/asm_mipsx.s

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// Copyright 2016 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
// +build mips mipsle
6+
7+
#include "textflag.h"
8+
9+
TEXT ·SwapInt32(SB),NOSPLIT,$0-12
10+
JMP runtime∕internal∕atomic·Xchg(SB)
11+
12+
TEXT ·SwapUint32(SB),NOSPLIT,$0-12
13+
JMP runtime∕internal∕atomic·Xchg(SB)
14+
15+
TEXT ·SwapInt64(SB),NOSPLIT,$0-24
16+
JMP runtime∕internal∕atomic·Xchg64(SB)
17+
18+
TEXT ·SwapUint64(SB),NOSPLIT,$0-24
19+
JMP runtime∕internal∕atomic·Xchg64(SB)
20+
21+
TEXT ·SwapUintptr(SB),NOSPLIT,$0-20
22+
JMP runtime∕internal∕atomic·Xchg(SB)
23+
24+
TEXT ·CompareAndSwapInt32(SB),NOSPLIT,$0-13
25+
JMP runtime∕internal∕atomic·Cas(SB)
26+
27+
TEXT ·CompareAndSwapUint32(SB),NOSPLIT,$0-13
28+
JMP runtime∕internal∕atomic·Cas(SB)
29+
30+
TEXT ·CompareAndSwapUintptr(SB),NOSPLIT,$0-13
31+
JMP runtime∕internal∕atomic·Cas(SB)
32+
33+
TEXT ·CompareAndSwapInt64(SB),NOSPLIT,$0-21
34+
JMP runtime∕internal∕atomic·Cas64(SB)
35+
36+
TEXT ·CompareAndSwapUint64(SB),NOSPLIT,$0-21
37+
JMP runtime∕internal∕atomic·Cas64(SB)
38+
39+
TEXT ·AddInt32(SB),NOSPLIT,$0-12
40+
JMP runtime∕internal∕atomic·Xadd(SB)
41+
42+
TEXT ·AddUint32(SB),NOSPLIT,$0-12
43+
JMP runtime∕internal∕atomic·Xadd(SB)
44+
45+
TEXT ·AddUintptr(SB),NOSPLIT,$0-12
46+
JMP runtime∕internal∕atomic·Xadd(SB)
47+
48+
TEXT ·AddInt64(SB),NOSPLIT,$0-20
49+
JMP runtime∕internal∕atomic·Xadd64(SB)
50+
51+
TEXT ·AddUint64(SB),NOSPLIT,$0-20
52+
JMP runtime∕internal∕atomic·Xadd64(SB)
53+
54+
TEXT ·LoadInt32(SB),NOSPLIT,$0-8
55+
JMP runtime∕internal∕atomic·Load(SB)
56+
57+
TEXT ·LoadUint32(SB),NOSPLIT,$0-8
58+
JMP runtime∕internal∕atomic·Load(SB)
59+
60+
TEXT ·LoadInt64(SB),NOSPLIT,$0-12
61+
JMP runtime∕internal∕atomic·Load64(SB)
62+
63+
TEXT ·LoadUint64(SB),NOSPLIT,$0-12
64+
JMP runtime∕internal∕atomic·Load64(SB)
65+
66+
TEXT ·LoadUintptr(SB),NOSPLIT,$0-8
67+
JMP runtime∕internal∕atomic·Load(SB)
68+
69+
TEXT ·LoadPointer(SB),NOSPLIT,$0-8
70+
JMP runtime∕internal∕atomic·Load(SB)
71+
72+
TEXT ·StoreInt32(SB),NOSPLIT,$0-8
73+
JMP runtime∕internal∕atomic·Store(SB)
74+
75+
TEXT ·StoreUint32(SB),NOSPLIT,$0-8
76+
JMP runtime∕internal∕atomic·Store(SB)
77+
78+
TEXT ·StoreInt64(SB),NOSPLIT,$0-12
79+
JMP runtime∕internal∕atomic·Store64(SB)
80+
81+
TEXT ·StoreUint64(SB),NOSPLIT,$0-12
82+
JMP runtime∕internal∕atomic·Store64(SB)
83+
84+
TEXT ·StoreUintptr(SB),NOSPLIT,$0-8
85+
JMP runtime∕internal∕atomic·Store(SB)

src/sync/atomic/atomic_test.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1389,12 +1389,15 @@ func TestUnaligned64(t *testing.T) {
13891389
// Unaligned 64-bit atomics on 32-bit systems are
13901390
// a continual source of pain. Test that on 32-bit systems they crash
13911391
// instead of failing silently.
1392-
if unsafe.Sizeof(int(0)) != 4 {
1393-
t.Skip("test only runs on 32-bit systems")
1394-
}
1395-
if runtime.GOARCH == "amd64p32" {
1396-
// amd64p32 can handle unaligned atomics.
1397-
t.Skip("test not needed on amd64p32")
1392+
1393+
switch runtime.GOARCH {
1394+
default:
1395+
if unsafe.Sizeof(int(0)) != 4 {
1396+
t.Skip("test only runs on 32-bit systems")
1397+
}
1398+
case "amd64p32", "mips", "mipsle":
1399+
// amd64p32 and mips can handle unaligned atomics.
1400+
t.Skipf("test not needed on %v", runtime.GOARCH)
13981401
}
13991402

14001403
x := make([]uint32, 4)

0 commit comments

Comments
 (0)