From 58083b57d4f8047d2749196a09b366926e8698da Mon Sep 17 00:00:00 2001 From: Julian Zhu Date: Mon, 25 Nov 2024 22:08:41 +0800 Subject: [PATCH] internal/runtime/atomic: add Xchg8 for riscv64 For #69735 Change-Id: I34ca2b027494525ab64f94beee89ca373a5031ae Reviewed-on: https://go-review.googlesource.com/c/go/+/631615 Reviewed-by: Michael Knyszek Reviewed-by: Keith Randall Reviewed-by: Mark Ryan Reviewed-by: Mauri de Souza Meneguzzo Reviewed-by: Keith Randall LUCI-TryBot-Result: Go LUCI --- src/internal/runtime/atomic/atomic_riscv64.go | 3 +++ src/internal/runtime/atomic/atomic_riscv64.s | 21 +++++++++++++++++++ src/internal/runtime/atomic/xchg8_test.go | 2 +- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/internal/runtime/atomic/atomic_riscv64.go b/src/internal/runtime/atomic/atomic_riscv64.go index 9fc38376ae..d09919d0fa 100644 --- a/src/internal/runtime/atomic/atomic_riscv64.go +++ b/src/internal/runtime/atomic/atomic_riscv64.go @@ -18,6 +18,9 @@ func Xadduintptr(ptr *uintptr, delta uintptr) uintptr //go:noescape func Xchg(ptr *uint32, new uint32) uint32 +//go:noescape +func Xchg8(ptr *uint8, new uint8) uint8 + //go:noescape func Xchg64(ptr *uint64, new uint64) uint64 diff --git a/src/internal/runtime/atomic/atomic_riscv64.s b/src/internal/runtime/atomic/atomic_riscv64.s index bf6bd35ed7..0aa118cc78 100644 --- a/src/internal/runtime/atomic/atomic_riscv64.s +++ b/src/internal/runtime/atomic/atomic_riscv64.s @@ -199,6 +199,27 @@ TEXT ·Xchg(SB), NOSPLIT, $0-20 MOVW A1, ret+16(FP) RET +// func Xchg8(ptr *uint8, new uint8) uint8 +TEXT ·Xchg8(SB), NOSPLIT, $0-17 + MOV ptr+0(FP), A0 + MOVBU new+8(FP), A1 + AND $3, A0, A2 + SLL $3, A2 + MOV $255, A4 + SLL A2, A4 + NOT A4 + AND $~3, A0 + SLL A2, A1 +xchg8_again: + LRW (A0), A5 + AND A4, A5, A3 + OR A1, A3 + SCW A3, (A0), A6 + BNEZ A6, xchg8_again + SRL A2, A5 + MOVB A5, ret+16(FP) + RET + // func Xchg64(ptr *uint64, new uint64) uint64 TEXT ·Xchg64(SB), NOSPLIT, $0-24 MOV ptr+0(FP), A0 diff --git a/src/internal/runtime/atomic/xchg8_test.go b/src/internal/runtime/atomic/xchg8_test.go index 016ce819b0..8d30212adc 100644 --- a/src/internal/runtime/atomic/xchg8_test.go +++ b/src/internal/runtime/atomic/xchg8_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build 386 || amd64 || arm || arm64 || loong64 || ppc64 || ppc64le +//go:build 386 || amd64 || arm || arm64 || loong64 || ppc64 || ppc64le || riscv64 package atomic_test