mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
We're skating on thin ice, and things are finally starting to melt around here. (I want to avoid the debugging session that will happen when someone uses atomicand8 expecting it to be atomic with respect to other operations.) Change-Id: I254f1582be4eb1f2d7fbba05335a91c6bf0c7f02 Reviewed-on: https://go-review.googlesource.com/7861 Reviewed-by: Minux Ma <minux@golang.org>
69 lines
1.5 KiB
Go
69 lines
1.5 KiB
Go
// Copyright 2009 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 amd64 amd64p32
|
|
|
|
package runtime
|
|
|
|
import "unsafe"
|
|
|
|
// The calls to nop are to keep these functions from being inlined.
|
|
// If they are inlined we have no guarantee that later rewrites of the
|
|
// code by optimizers will preserve the relative order of memory accesses.
|
|
|
|
//go:nosplit
|
|
func atomicload(ptr *uint32) uint32 {
|
|
nop()
|
|
return *ptr
|
|
}
|
|
|
|
//go:nosplit
|
|
func atomicloadp(ptr unsafe.Pointer) unsafe.Pointer {
|
|
nop()
|
|
return *(*unsafe.Pointer)(ptr)
|
|
}
|
|
|
|
//go:nosplit
|
|
func atomicload64(ptr *uint64) uint64 {
|
|
nop()
|
|
return *ptr
|
|
}
|
|
|
|
//go:noescape
|
|
func xadd(ptr *uint32, delta int32) uint32
|
|
|
|
//go:noescape
|
|
func xadd64(ptr *uint64, delta int64) uint64
|
|
|
|
//go:noescape
|
|
func xchg(ptr *uint32, new uint32) uint32
|
|
|
|
//go:noescape
|
|
func xchg64(ptr *uint64, new uint64) uint64
|
|
|
|
// NO go:noescape annotation; see atomic_pointer.go.
|
|
func xchgp1(ptr unsafe.Pointer, new unsafe.Pointer) unsafe.Pointer
|
|
|
|
//go:noescape
|
|
func xchguintptr(ptr *uintptr, new uintptr) uintptr
|
|
|
|
//go:noescape
|
|
func atomicand8(ptr *uint8, val uint8)
|
|
|
|
//go:noescape
|
|
func atomicor8(ptr *uint8, val uint8)
|
|
|
|
// NOTE: Do not add atomicxor8 (XOR is not idempotent).
|
|
|
|
//go:noescape
|
|
func cas64(ptr *uint64, old, new uint64) bool
|
|
|
|
//go:noescape
|
|
func atomicstore(ptr *uint32, val uint32)
|
|
|
|
//go:noescape
|
|
func atomicstore64(ptr *uint64, val uint64)
|
|
|
|
// NO go:noescape annotation; see atomic_pointer.go.
|
|
func atomicstorep1(ptr unsafe.Pointer, val unsafe.Pointer)
|