]> Cypherpunks repositories - gostls13.git/commitdiff
internal/runtime/atomic: add Xchg8 for riscv64
authorJulian Zhu <julian.oerv@isrc.iscas.ac.cn>
Mon, 25 Nov 2024 14:08:41 +0000 (22:08 +0800)
committerMeng Zhuo <mengzhuo1203@gmail.com>
Thu, 20 Feb 2025 01:34:41 +0000 (17:34 -0800)
For #69735

Change-Id: I34ca2b027494525ab64f94beee89ca373a5031ae
Reviewed-on: https://go-review.googlesource.com/c/go/+/631615
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Mark Ryan <markdryan@rivosinc.com>
Reviewed-by: Mauri de Souza Meneguzzo <mauri870@gmail.com>
Reviewed-by: Keith Randall <khr@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

src/internal/runtime/atomic/atomic_riscv64.go
src/internal/runtime/atomic/atomic_riscv64.s
src/internal/runtime/atomic/xchg8_test.go

index 9fc38376aeee44b6e9eb2909bedeae688cf361f1..d09919d0fa4eacaa2dd29ddbfc9a571a84c0635a 100644 (file)
@@ -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
 
index bf6bd35ed73710c851d4cccfc02cfaa45b7271a9..0aa118cc78108a9c93478e813aafce69eb832e2b 100644 (file)
@@ -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
index 016ce819b0f42e4cbdce1cd6d6961b40c070ca25..8d30212adc027e0784466927dd8193aa3c876699 100644 (file)
@@ -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