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: cf3fb0dce6
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>
This commit is contained in:
Mauri de Souza Meneguzzo 2023-09-30 00:53:11 +00:00 committed by Gopher Robot
parent 3bd30298dd
commit 6bcf176829
3 changed files with 82 additions and 3 deletions

View File

@ -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) {
}
}
}

View File

@ -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

View File

@ -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)