atomic_386.mx raw

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