github.com/gocuntian/go@v0.0.0-20160610041250-fee02d270bf8/src/runtime/internal/atomic/atomic_arm64.go (about)

     1  // Copyright 2015 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 arm64
     6  
     7  package atomic
     8  
     9  import "unsafe"
    10  
    11  //go:noescape
    12  func Xadd(ptr *uint32, delta int32) uint32
    13  
    14  //go:noescape
    15  func Xadd64(ptr *uint64, delta int64) uint64
    16  
    17  //go:noescape
    18  func Xadduintptr(ptr *uintptr, delta uintptr) uintptr
    19  
    20  //go:noescape
    21  func Xchg(ptr *uint32, new uint32) uint32
    22  
    23  //go:noescape
    24  func Xchg64(ptr *uint64, new uint64) uint64
    25  
    26  //go:noescape
    27  func Xchguintptr(ptr *uintptr, new uintptr) uintptr
    28  
    29  //go:noescape
    30  func Load(ptr *uint32) uint32
    31  
    32  //go:noescape
    33  func Load64(ptr *uint64) uint64
    34  
    35  //go:noescape
    36  func Loadp(ptr unsafe.Pointer) unsafe.Pointer
    37  
    38  //go:nosplit
    39  func Or8(addr *uint8, v uint8) {
    40  	// TODO(dfc) implement this in asm.
    41  	// Align down to 4 bytes and use 32-bit CAS.
    42  	uaddr := uintptr(unsafe.Pointer(addr))
    43  	addr32 := (*uint32)(unsafe.Pointer(uaddr &^ 3))
    44  	word := uint32(v) << ((uaddr & 3) * 8) // little endian
    45  	for {
    46  		old := *addr32
    47  		if Cas(addr32, old, old|word) {
    48  			return
    49  		}
    50  	}
    51  }
    52  
    53  //go:nosplit
    54  func And8(addr *uint8, v uint8) {
    55  	// TODO(dfc) implement this in asm.
    56  	// Align down to 4 bytes and use 32-bit CAS.
    57  	uaddr := uintptr(unsafe.Pointer(addr))
    58  	addr32 := (*uint32)(unsafe.Pointer(uaddr &^ 3))
    59  	word := uint32(v) << ((uaddr & 3) * 8)    // little endian
    60  	mask := uint32(0xFF) << ((uaddr & 3) * 8) // little endian
    61  	word |= ^mask
    62  	for {
    63  		old := *addr32
    64  		if Cas(addr32, old, old&word) {
    65  			return
    66  		}
    67  	}
    68  }
    69  
    70  //go:noescape
    71  func Cas64(ptr *uint64, old, new uint64) bool
    72  
    73  //go:noescape
    74  func Store(ptr *uint32, val uint32)
    75  
    76  //go:noescape
    77  func Store64(ptr *uint64, val uint64)
    78  
    79  // NO go:noescape annotation; see atomic_pointer.go.
    80  func StorepNoWB(ptr unsafe.Pointer, val unsafe.Pointer)