diff options
| author | Mauri de Souza Meneguzzo <mauri870@gmail.com> | 2023-09-30 00:53:11 +0000 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2023-10-03 19:51:23 +0000 |
| commit | 6bcf1768291efaa1e6f72ff6159dced8746dc44e (patch) | |
| tree | 3736428ea18f289d452fe54175b38f0f2043ed29 /src/runtime/internal | |
| parent | 3bd30298dd3b59f9c760f7befd6cf21bf479b766 (diff) | |
| download | go-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')
| -rw-r--r-- | src/runtime/internal/atomic/atomic_andor_test.go | 7 | ||||
| -rw-r--r-- | src/runtime/internal/atomic/atomic_ppc64x.go | 18 | ||||
| -rw-r--r-- | src/runtime/internal/atomic/atomic_ppc64x.s | 60 |
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) |
