atomic_s390x.mx raw

   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  package atomic
   6  
   7  import "unsafe"
   8  
   9  // Export some functions via linkname to assembly in sync/atomic.
  10  //
  11  //go:linkname Load
  12  //go:linkname Loadp
  13  //go:linkname Load64
  14  
  15  //go:nosplit
  16  //go:noinline
  17  func Load(ptr *uint32) uint32 {
  18  	return *ptr
  19  }
  20  
  21  //go:nosplit
  22  //go:noinline
  23  func Loadp(ptr unsafe.Pointer) unsafe.Pointer {
  24  	return *(*unsafe.Pointer)(ptr)
  25  }
  26  
  27  //go:nosplit
  28  //go:noinline
  29  func Load8(ptr *uint8) uint8 {
  30  	return *ptr
  31  }
  32  
  33  //go:nosplit
  34  //go:noinline
  35  func Load64(ptr *uint64) uint64 {
  36  	return *ptr
  37  }
  38  
  39  //go:nosplit
  40  //go:noinline
  41  func LoadAcq(ptr *uint32) uint32 {
  42  	return *ptr
  43  }
  44  
  45  //go:nosplit
  46  //go:noinline
  47  func LoadAcq64(ptr *uint64) uint64 {
  48  	return *ptr
  49  }
  50  
  51  //go:nosplit
  52  //go:noinline
  53  func LoadAcquintptr(ptr *uintptr) uintptr {
  54  	return *ptr
  55  }
  56  
  57  //go:noescape
  58  func Store(ptr *uint32, val uint32)
  59  
  60  //go:noescape
  61  func Store8(ptr *uint8, val uint8)
  62  
  63  //go:noescape
  64  func Store64(ptr *uint64, val uint64)
  65  
  66  // NO go:noescape annotation; see atomic_pointer.go.
  67  func StorepNoWB(ptr unsafe.Pointer, val unsafe.Pointer)
  68  
  69  //go:nosplit
  70  //go:noinline
  71  func StoreRel(ptr *uint32, val uint32) {
  72  	*ptr = val
  73  }
  74  
  75  //go:nosplit
  76  //go:noinline
  77  func StoreRel64(ptr *uint64, val uint64) {
  78  	*ptr = val
  79  }
  80  
  81  //go:nosplit
  82  //go:noinline
  83  func StoreReluintptr(ptr *uintptr, val uintptr) {
  84  	*ptr = val
  85  }
  86  
  87  //go:noescape
  88  func And8(ptr *uint8, val uint8)
  89  
  90  //go:noescape
  91  func Or8(ptr *uint8, val uint8)
  92  
  93  // NOTE: Do not add atomicxor8 (XOR is not idempotent).
  94  
  95  //go:noescape
  96  func And(ptr *uint32, val uint32)
  97  
  98  //go:noescape
  99  func Or(ptr *uint32, val uint32)
 100  
 101  //go:noescape
 102  func And32(ptr *uint32, val uint32) uint32
 103  
 104  //go:noescape
 105  func Or32(ptr *uint32, val uint32) uint32
 106  
 107  //go:noescape
 108  func And64(ptr *uint64, val uint64) uint64
 109  
 110  //go:noescape
 111  func Or64(ptr *uint64, val uint64) uint64
 112  
 113  //go:noescape
 114  func Anduintptr(ptr *uintptr, val uintptr) uintptr
 115  
 116  //go:noescape
 117  func Oruintptr(ptr *uintptr, val uintptr) uintptr
 118  
 119  //go:noescape
 120  func Xadd(ptr *uint32, delta int32) uint32
 121  
 122  //go:noescape
 123  func Xadd64(ptr *uint64, delta int64) uint64
 124  
 125  //go:noescape
 126  func Xadduintptr(ptr *uintptr, delta uintptr) uintptr
 127  
 128  //go:noescape
 129  func Xchg(ptr *uint32, new uint32) uint32
 130  
 131  //go:nosplit
 132  func Xchg8(addr *uint8, v uint8) uint8 {
 133  	return goXchg8(addr, v)
 134  }
 135  
 136  //go:noescape
 137  func Xchg64(ptr *uint64, new uint64) uint64
 138  
 139  //go:noescape
 140  func Xchguintptr(ptr *uintptr, new uintptr) uintptr
 141  
 142  //go:noescape
 143  func Cas64(ptr *uint64, old, new uint64) bool
 144  
 145  //go:noescape
 146  func CasRel(ptr *uint32, old, new uint32) bool
 147