atomic_andor_generic.mx raw

   1  // Copyright 2023 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 arm || wasm
   6  
   7  // Export some functions via linkname to assembly in sync/atomic.
   8  //
   9  //go:linkname And32
  10  //go:linkname Or32
  11  //go:linkname And64
  12  //go:linkname Or64
  13  //go:linkname Anduintptr
  14  //go:linkname Oruintptr
  15  
  16  package atomic
  17  
  18  import _ "unsafe" // For linkname
  19  
  20  //go:nosplit
  21  func And32(ptr *uint32, val uint32) uint32 {
  22  	for {
  23  		old := *ptr
  24  		if Cas(ptr, old, old&val) {
  25  			return old
  26  		}
  27  	}
  28  }
  29  
  30  //go:nosplit
  31  func Or32(ptr *uint32, val uint32) uint32 {
  32  	for {
  33  		old := *ptr
  34  		if Cas(ptr, old, old|val) {
  35  			return old
  36  		}
  37  	}
  38  }
  39  
  40  //go:nosplit
  41  func And64(ptr *uint64, val uint64) uint64 {
  42  	for {
  43  		old := *ptr
  44  		if Cas64(ptr, old, old&val) {
  45  			return old
  46  		}
  47  	}
  48  }
  49  
  50  //go:nosplit
  51  func Or64(ptr *uint64, val uint64) uint64 {
  52  	for {
  53  		old := *ptr
  54  		if Cas64(ptr, old, old|val) {
  55  			return old
  56  		}
  57  	}
  58  }
  59  
  60  //go:nosplit
  61  func Anduintptr(ptr *uintptr, val uintptr) uintptr {
  62  	for {
  63  		old := *ptr
  64  		if Casuintptr(ptr, old, old&val) {
  65  			return old
  66  		}
  67  	}
  68  }
  69  
  70  //go:nosplit
  71  func Oruintptr(ptr *uintptr, val uintptr) uintptr {
  72  	for {
  73  		old := *ptr
  74  		if Casuintptr(ptr, old, old|val) {
  75  			return old
  76  		}
  77  	}
  78  }
  79