]> Cypherpunks.ru repositories - gostls13.git/commitdiff
runtime/internal/atomic: add ppc64x operators for And/Or
authorMauri de Souza Meneguzzo <mauri870@gmail.com>
Sat, 30 Sep 2023 00:53:11 +0000 (00:53 +0000)
committerGopher Robot <gobot@golang.org>
Tue, 3 Oct 2023 19:51:23 +0000 (19:51 +0000)
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>
src/runtime/internal/atomic/atomic_andor_test.go
src/runtime/internal/atomic/atomic_ppc64x.go
src/runtime/internal/atomic/atomic_ppc64x.s

index 0298d75c9b759daa886fb0157a22e5b5bf1331f4..a1918e3ecfa944e7d713accbd819935119bdb481 100644 (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) {
                }
        }
 }
-
index 998d16e3f6862dcfae609432932ffe6dbf57cbe5..33a92b53f47ff051fafe2c89dc2925b263f9cb1b 100644 (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
 
index 04f0eadd065e6fb28519bb80fd304d95b9445581..144439ec2353ebda02376f94835baf280c3b3d20 100644 (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)