From: Mauri de Souza Meneguzzo Date: Sat, 18 Nov 2023 17:52:22 +0000 (+0000) Subject: runtime/internal/atomic: add generic implementation for And/Or X-Git-Tag: go1.22rc1~254 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=237715cf7c4c2aabf6d3c04473488c1b2477f8ea;p=gostls13.git runtime/internal/atomic: add generic implementation for And/Or Without having all the architectures implementing the And/Or operators merged I can't proceed with the public sync/atomic apis. This CL adds a generic implementation that should work for all the remaining arches, while waiting for the native assembly implementations in CL 531835, CL 531678, CL 531895. I regret the oversight of not pushing this earlier. For #61395 Change-Id: Ib2d67f359fe324b4743eb79e9c8e52e8f6f5476c GitHub-Last-Rev: d350927ba1c51d1f708be2f2904f826fdb79b8cd GitHub-Pull-Request: golang/go#64214 Reviewed-on: https://go-review.googlesource.com/c/go/+/543175 Reviewed-by: Cherry Mui LUCI-TryBot-Result: Go LUCI TryBot-Result: Gopher Robot Reviewed-by: David Chase Run-TryBot: Cherry Mui --- diff --git a/src/runtime/internal/atomic/atomic_andor_generic.go b/src/runtime/internal/atomic/atomic_andor_generic.go new file mode 100644 index 0000000000..c790e062c5 --- /dev/null +++ b/src/runtime/internal/atomic/atomic_andor_generic.go @@ -0,0 +1,67 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build s390x || loong64 || mips || mipsle || mips64 || mips64le + +package atomic + +//go:nosplit +func And32(ptr *uint32, val uint32) uint32 { + for { + old := *ptr + if Cas(ptr, old, old&val) { + return old + } + } +} + +//go:nosplit +func Or32(ptr *uint32, val uint32) uint32 { + for { + old := *ptr + if Cas(ptr, old, old|val) { + return old + } + } +} + +//go:nosplit +func And64(ptr *uint64, val uint64) uint64 { + for { + old := *ptr + if Cas64(ptr, old, old&val) { + return old + } + } +} + +//go:nosplit +func Or64(ptr *uint64, val uint64) uint64 { + for { + old := *ptr + if Cas64(ptr, old, old|val) { + return old + } + } +} + +//go:nosplit +func Anduintptr(ptr *uintptr, val uintptr) uintptr { + for { + old := *ptr + if Casuintptr(ptr, old, old&val) { + return old + } + } +} + +//go:nosplit +func Oruintptr(ptr *uintptr, val uintptr) uintptr { + for { + old := *ptr + if Casuintptr(ptr, old, old|val) { + return old + } + } +} diff --git a/src/runtime/internal/atomic/atomic_andor_test.go b/src/runtime/internal/atomic/atomic_andor_test.go index 9dd8b60ae4..a2f3b6f3a9 100644 --- a/src/runtime/internal/atomic/atomic_andor_test.go +++ b/src/runtime/internal/atomic/atomic_andor_test.go @@ -1,6 +1,3 @@ -//go:build 386 || amd64 || arm || arm64 || ppc64 || ppc64le || riscv64 || wasm - -// // Copyright 2023 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file.