Skip to content

Commit 555af99

Browse files
mauri8704a6f656c
authored andcommitted
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: c0a8d8f GitHub-Pull-Request: #63272 Reviewed-on: https://go-review.googlesource.com/c/go/+/531575 Reviewed-by: Than McIntosh <[email protected]> Run-TryBot: Mauri de Souza Meneguzzo <[email protected]> Reviewed-by: Mark Ryan <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Joel Sing <[email protected]> Reviewed-by: Dmitri Shuralyov <[email protected]>
1 parent e7908ab commit 555af99

File tree

3 files changed

+59
-1
lines changed

3 files changed

+59
-1
lines changed

src/runtime/internal/atomic/atomic_andor_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//go:build wasm || ppc64 || ppc64le
1+
//go:build ppc64 || ppc64le || riscv64 || wasm
22

33
//
44
// Copyright 2023 The Go Authors. All rights reserved.

src/runtime/internal/atomic/atomic_riscv64.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,24 @@ func And(ptr *uint32, val uint32)
5757
//go:noescape
5858
func Or(ptr *uint32, val uint32)
5959

60+
//go:noescape
61+
func And32(ptr *uint32, val uint32) uint32
62+
63+
//go:noescape
64+
func Or32(ptr *uint32, val uint32) uint32
65+
66+
//go:noescape
67+
func And64(ptr *uint64, val uint64) uint64
68+
69+
//go:noescape
70+
func Or64(ptr *uint64, val uint64) uint64
71+
72+
//go:noescape
73+
func Anduintptr(ptr *uintptr, val uintptr) uintptr
74+
75+
//go:noescape
76+
func Oruintptr(ptr *uintptr, val uintptr) uintptr
77+
6078
//go:noescape
6179
func Cas64(ptr *uint64, old, new uint64) bool
6280

src/runtime/internal/atomic/atomic_riscv64.s

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,3 +282,43 @@ TEXT ·Or(SB), NOSPLIT, $0-12
282282
MOVW val+8(FP), A1
283283
AMOORW A1, (A0), ZERO
284284
RET
285+
286+
// func Or32(ptr *uint32, val uint32) uint32
287+
TEXT ·Or32(SB), NOSPLIT, $0-20
288+
MOV ptr+0(FP), A0
289+
MOVW val+8(FP), A1
290+
AMOORW A1, (A0), A2
291+
MOVW A2, ret+16(FP)
292+
RET
293+
294+
// func And32(ptr *uint32, val uint32) uint32
295+
TEXT ·And32(SB), NOSPLIT, $0-20
296+
MOV ptr+0(FP), A0
297+
MOVW val+8(FP), A1
298+
AMOANDW A1, (A0), A2
299+
MOVW A2, ret+16(FP)
300+
RET
301+
302+
// func Or64(ptr *uint64, val uint64) uint64
303+
TEXT ·Or64(SB), NOSPLIT, $0-24
304+
MOV ptr+0(FP), A0
305+
MOV val+8(FP), A1
306+
AMOORD A1, (A0), A2
307+
MOV A2, ret+16(FP)
308+
RET
309+
310+
// func And64(ptr *uint64, val uint64) uint64
311+
TEXT ·And64(SB), NOSPLIT, $0-24
312+
MOV ptr+0(FP), A0
313+
MOV val+8(FP), A1
314+
AMOANDD A1, (A0), A2
315+
MOV A2, ret+16(FP)
316+
RET
317+
318+
// func Anduintptr(ptr *uintptr, val uintptr) uintptr
319+
TEXT ·Anduintptr(SB), NOSPLIT, $0-24
320+
JMP ·And64(SB)
321+
322+
// func Oruintptr(ptr *uintptr, val uintptr) uintptr
323+
TEXT ·Oruintptr(SB), NOSPLIT, $0-24
324+
JMP ·Or64(SB)

0 commit comments

Comments
 (0)