aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/internal/atomic
diff options
context:
space:
mode:
authorMauri de Souza Meneguzzo <mauri870@gmail.com>2023-09-30 00:53:11 +0000
committerGopher Robot <gobot@golang.org>2023-10-03 19:51:23 +0000
commit6bcf1768291efaa1e6f72ff6159dced8746dc44e (patch)
tree3736428ea18f289d452fe54175b38f0f2043ed29 /src/runtime/internal/atomic
parent3bd30298dd3b59f9c760f7befd6cf21bf479b766 (diff)
downloadgo-6bcf1768291efaa1e6f72ff6159dced8746dc44e.tar.xz
runtime/internal/atomic: add ppc64x operators for And/Or
These primitives will be used by the new And/Or sync/atomic apis. For #61395 Change-Id: I9ad92634add0357092e49b5a4a40c177e242a0b6 GitHub-Last-Rev: cf3fb0dce6a462b5d63fe8fe974573ab86df0b66 GitHub-Pull-Request: golang/go#63294 Reviewed-on: https://go-review.googlesource.com/c/go/+/531716 Reviewed-by: Eli Bendersky <eliben@google.com> Reviewed-by: Michael Pratt <mpratt@google.com> Reviewed-by: Lynn Boger <laboger@linux.vnet.ibm.com> Run-TryBot: Mauri de Souza Meneguzzo <mauri870@gmail.com> Auto-Submit: Michael Pratt <mpratt@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Paul Murphy <murp@ibm.com>
Diffstat (limited to 'src/runtime/internal/atomic')
-rw-r--r--src/runtime/internal/atomic/atomic_andor_test.go7
-rw-r--r--src/runtime/internal/atomic/atomic_ppc64x.go18
-rw-r--r--src/runtime/internal/atomic/atomic_ppc64x.s60
3 files changed, 82 insertions, 3 deletions
diff --git a/src/runtime/internal/atomic/atomic_andor_test.go b/src/runtime/internal/atomic/atomic_andor_test.go
index 0298d75c9b..a1918e3ecf 100644
--- a/src/runtime/internal/atomic/atomic_andor_test.go
+++ b/src/runtime/internal/atomic/atomic_andor_test.go
@@ -1,4 +1,6 @@
-// +build wasm
+//go:build wasm || ppc64 || ppc64le
+// +build wasm ppc64 ppc64le
+
//
// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -9,8 +11,8 @@
package atomic_test
import (
- "testing"
"runtime/internal/atomic"
+ "testing"
)
func TestAnd32(t *testing.T) {
@@ -166,4 +168,3 @@ func TestOr64(t *testing.T) {
}
}
}
-
diff --git a/src/runtime/internal/atomic/atomic_ppc64x.go b/src/runtime/internal/atomic/atomic_ppc64x.go
index 998d16e3f6..33a92b53f4 100644
--- a/src/runtime/internal/atomic/atomic_ppc64x.go
+++ b/src/runtime/internal/atomic/atomic_ppc64x.go
@@ -62,6 +62,24 @@ func And(ptr *uint32, val uint32)
func Or(ptr *uint32, val uint32)
//go:noescape
+func And32(ptr *uint32, val uint32) uint32
+
+//go:noescape
+func Or32(ptr *uint32, val uint32) uint32
+
+//go:noescape
+func And64(ptr *uint64, val uint64) uint64
+
+//go:noescape
+func Or64(ptr *uint64, val uint64) uint64
+
+//go:noescape
+func Anduintptr(ptr *uintptr, val uintptr) uintptr
+
+//go:noescape
+func Oruintptr(ptr *uintptr, val uintptr) uintptr
+
+//go:noescape
func Cas64(ptr *uint64, old, new uint64) bool
//go:noescape
diff --git a/src/runtime/internal/atomic/atomic_ppc64x.s b/src/runtime/internal/atomic/atomic_ppc64x.s
index 04f0eadd06..144439ec23 100644
--- a/src/runtime/internal/atomic/atomic_ppc64x.s
+++ b/src/runtime/internal/atomic/atomic_ppc64x.s
@@ -360,3 +360,63 @@ again:
STWCCC R6, (R3)
BNE again
RET
+
+// func Or32(addr *uint32, v uint32) old uint32
+TEXT ·Or32(SB), NOSPLIT, $0-20
+ MOVD ptr+0(FP), R3
+ MOVW val+8(FP), R4
+ LWSYNC
+again:
+ LWAR (R3), R6
+ OR R4, R6, R7
+ STWCCC R7, (R3)
+ BNE again
+ MOVW R6, ret+16(FP)
+ RET
+
+// func And32(addr *uint32, v uint32) old uint32
+TEXT ·And32(SB), NOSPLIT, $0-20
+ MOVD ptr+0(FP), R3
+ MOVW val+8(FP), R4
+ LWSYNC
+again:
+ LWAR (R3),R6
+ AND R4, R6, R7
+ STWCCC R7, (R3)
+ BNE again
+ MOVW R6, ret+16(FP)
+ RET
+
+// func Or64(addr *uint64, v uint64) old uint64
+TEXT ·Or64(SB), NOSPLIT, $0-24
+ MOVD ptr+0(FP), R3
+ MOVD val+8(FP), R4
+ LWSYNC
+again:
+ LDAR (R3), R6
+ OR R4, R6, R7
+ STDCCC R7, (R3)
+ BNE again
+ MOVD R6, ret+16(FP)
+ RET
+
+// func And64(addr *uint64, v uint64) old uint64
+TEXT ·And64(SB), NOSPLIT, $0-24
+ MOVD ptr+0(FP), R3
+ MOVD val+8(FP), R4
+ LWSYNC
+again:
+ LDAR (R3),R6
+ AND R4, R6, R7
+ STDCCC R7, (R3)
+ BNE again
+ MOVD R6, ret+16(FP)
+ RET
+
+// func Anduintptr(addr *uintptr, v uintptr) old uintptr
+TEXT ·Anduintptr(SB), NOSPLIT, $0-24
+ JMP ·And64(SB)
+
+// func Oruintptr(addr *uintptr, v uintptr) old uintptr
+TEXT ·Oruintptr(SB), NOSPLIT, $0-24
+ JMP ·Or64(SB)