From 6bcf1768291efaa1e6f72ff6159dced8746dc44e Mon Sep 17 00:00:00 2001 From: Mauri de Souza Meneguzzo Date: Sat, 30 Sep 2023 00:53:11 +0000 Subject: [PATCH] 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 Reviewed-by: Michael Pratt Reviewed-by: Lynn Boger Run-TryBot: Mauri de Souza Meneguzzo Auto-Submit: Michael Pratt TryBot-Result: Gopher Robot Reviewed-by: Paul Murphy --- .../internal/atomic/atomic_andor_test.go | 7 ++- src/runtime/internal/atomic/atomic_ppc64x.go | 18 ++++++ 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 @@ -61,6 +61,24 @@ func And(ptr *uint32, val uint32) //go:noescape 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 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) -- 2.50.0