]> Cypherpunks.ru repositories - gostls13.git/commitdiff
runtime/internal/atomic: add riscv64 operators for And/Or
authorMauri de Souza Meneguzzo <mauri870@gmail.com>
Wed, 25 Oct 2023 10:51:58 +0000 (10:51 +0000)
committerJoel Sing <joel@sing.id.au>
Wed, 25 Oct 2023 21:32:01 +0000 (21:32 +0000)
These primitives will be used by the new And/Or sync/atomic apis.

For #61395

Change-Id: I4062d6317e01afd94d3588f5425237723ab15ade
GitHub-Last-Rev: c0a8d8f34dc355997fa697d4d8da7d45a00bb3c7
GitHub-Pull-Request: golang/go#63272
Reviewed-on: https://go-review.googlesource.com/c/go/+/531575
Reviewed-by: Than McIntosh <thanm@google.com>
Run-TryBot: Mauri de Souza Meneguzzo <mauri870@gmail.com>
Reviewed-by: Mark Ryan <markdryan@rivosinc.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Joel Sing <joel@sing.id.au>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
src/runtime/internal/atomic/atomic_andor_test.go
src/runtime/internal/atomic/atomic_riscv64.go
src/runtime/internal/atomic/atomic_riscv64.s

index 03c2c754f33d48c2053decffbe30eade2a48d1ea..73e8a3320d90ed44a4a69658624f570883ae396c 100644 (file)
@@ -1,4 +1,4 @@
-//go:build wasm || ppc64 || ppc64le
+//go:build ppc64 || ppc64le || riscv64 || wasm
 
 //
 // Copyright 2023 The Go Authors. All rights reserved.
index 8f24d616259c6530c1219302db0a866a7099cffc..9fc38376aeee44b6e9eb2909bedeae688cf361f1 100644 (file)
@@ -57,6 +57,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 21d5adcdbc5cfce77480569153a490de4c5101ba..bf6bd35ed73710c851d4cccfc02cfaa45b7271a9 100644 (file)
@@ -282,3 +282,43 @@ TEXT ·Or(SB), NOSPLIT, $0-12
        MOVW    val+8(FP), A1
        AMOORW  A1, (A0), ZERO
        RET
+
+// func Or32(ptr *uint32, val uint32) uint32
+TEXT ·Or32(SB), NOSPLIT, $0-20
+       MOV     ptr+0(FP), A0
+       MOVW    val+8(FP), A1
+       AMOORW  A1, (A0), A2
+       MOVW    A2, ret+16(FP)
+       RET
+
+// func And32(ptr *uint32, val uint32) uint32
+TEXT ·And32(SB), NOSPLIT, $0-20
+       MOV     ptr+0(FP), A0
+       MOVW    val+8(FP), A1
+       AMOANDW A1, (A0), A2
+       MOVW    A2, ret+16(FP)
+       RET
+
+// func Or64(ptr *uint64, val uint64) uint64
+TEXT ·Or64(SB), NOSPLIT, $0-24
+       MOV     ptr+0(FP), A0
+       MOV     val+8(FP), A1
+       AMOORD  A1, (A0), A2
+       MOV     A2, ret+16(FP)
+       RET
+
+// func And64(ptr *uint64, val uint64) uint64
+TEXT ·And64(SB), NOSPLIT, $0-24
+       MOV     ptr+0(FP), A0
+       MOV     val+8(FP), A1
+       AMOANDD A1, (A0), A2
+       MOV     A2, ret+16(FP)
+       RET
+
+// func Anduintptr(ptr *uintptr, val uintptr) uintptr
+TEXT ·Anduintptr(SB), NOSPLIT, $0-24
+       JMP     ·And64(SB)
+
+// func Oruintptr(ptr *uintptr, val uintptr) uintptr
+TEXT ·Oruintptr(SB), NOSPLIT, $0-24
+       JMP     ·Or64(SB)