diff options
Diffstat (limited to 'src/runtime/internal/atomic/atomic_arm.go')
| -rw-r--r-- | src/runtime/internal/atomic/atomic_arm.go | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/runtime/internal/atomic/atomic_arm.go b/src/runtime/internal/atomic/atomic_arm.go index 567e951244..ae609cf4db 100644 --- a/src/runtime/internal/atomic/atomic_arm.go +++ b/src/runtime/internal/atomic/atomic_arm.go @@ -209,6 +209,66 @@ func And(addr *uint32, v uint32) { } //go:nosplit +func Or32(addr *uint32, v uint32) uint32 { + for { + old := *addr + if Cas(addr, old, old|v) { + return old + } + } +} + +//go:nosplit +func And32(addr *uint32, v uint32) uint32 { + for { + old := *addr + if Cas(addr, old, old&v) { + return old + } + } +} + +//go:nosplit +func Or64(addr *uint64, v uint64) uint64 { + for { + old := *addr + if Cas64(addr, old, old|v) { + return old + } + } +} + +//go:nosplit +func And64(addr *uint64, v uint64) uint64 { + for { + old := *addr + if Cas64(addr, old, old&v) { + return old + } + } +} + +//go:nosplit +func Oruintptr(addr *uintptr, v uintptr) uintptr { + for { + old := *addr + if Casuintptr(addr, old, old|v) { + return old + } + } +} + +//go:nosplit +func Anduintptr(addr *uintptr, v uintptr) uintptr { + for { + old := *addr + if Casuintptr(addr, old, old&v) { + return old + } + } +} + +//go:nosplit func armcas(ptr *uint32, old, new uint32) bool //go:noescape |
