mirror of
https://github.com/golang/go
synced 2024-11-19 23:34:40 -07:00
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>
This commit is contained in:
parent
b241a06479
commit
9788e3d4d7
@ -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)
|
||||
|
85
src/sync/atomic/asm_mipsx.s
Normal file
85
src/sync/atomic/asm_mipsx.s
Normal file
@ -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)
|
@ -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.
|
||||
|
||||
switch runtime.GOARCH {
|
||||
default:
|
||||
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")
|
||||
case "amd64p32", "mips", "mipsle":
|
||||
// amd64p32 and mips can handle unaligned atomics.
|
||||
t.Skipf("test not needed on %v", runtime.GOARCH)
|
||||
}
|
||||
|
||||
x := make([]uint32, 4)
|
||||
|
Loading…
Reference in New Issue
Block a user