aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/internal/atomic
diff options
context:
space:
mode:
authorMauri de Souza Meneguzzo <mauri870@gmail.com>2023-10-25 10:51:58 +0000
committerJoel Sing <joel@sing.id.au>2023-10-25 21:32:01 +0000
commit555af99bcc6b7515ebad5a3c947f3e4ab147fd29 (patch)
tree7f2436334311d992b315b9b3833d5e84bbc81669 /src/runtime/internal/atomic
parente7908ab9a266da09a247480cb45dab213fb3e00e (diff)
downloadgo-555af99bcc6b7515ebad5a3c947f3e4ab147fd29.tar.xz
runtime/internal/atomic: add riscv64 operators for And/Or
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>
Diffstat (limited to 'src/runtime/internal/atomic')
-rw-r--r--src/runtime/internal/atomic/atomic_andor_test.go2
-rw-r--r--src/runtime/internal/atomic/atomic_riscv64.go18
-rw-r--r--src/runtime/internal/atomic/atomic_riscv64.s40
3 files changed, 59 insertions, 1 deletions
diff --git a/src/runtime/internal/atomic/atomic_andor_test.go b/src/runtime/internal/atomic/atomic_andor_test.go
index 03c2c754f3..73e8a3320d 100644
--- a/src/runtime/internal/atomic/atomic_andor_test.go
+++ b/src/runtime/internal/atomic/atomic_andor_test.go
@@ -1,4 +1,4 @@
-//go:build wasm || ppc64 || ppc64le
+//go:build ppc64 || ppc64le || riscv64 || wasm
//
// Copyright 2023 The Go Authors. All rights reserved.
diff --git a/src/runtime/internal/atomic/atomic_riscv64.go b/src/runtime/internal/atomic/atomic_riscv64.go
index 8f24d61625..9fc38376ae 100644
--- a/src/runtime/internal/atomic/atomic_riscv64.go
+++ b/src/runtime/internal/atomic/atomic_riscv64.go
@@ -58,6 +58,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_riscv64.s b/src/runtime/internal/atomic/atomic_riscv64.s
index 21d5adcdbc..bf6bd35ed7 100644
--- a/src/runtime/internal/atomic/atomic_riscv64.s
+++ b/src/runtime/internal/atomic/atomic_riscv64.s
@@ -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)