]> Cypherpunks repositories - gostls13.git/commitdiff
internal/runtime/atomic: add Xchg8 for mips64x
authorJulian Zhu <jz531210@gmail.com>
Tue, 26 Nov 2024 09:14:45 +0000 (17:14 +0800)
committerGopher Robot <gobot@golang.org>
Thu, 20 Feb 2025 17:44:53 +0000 (09:44 -0800)
For #69735

Change-Id: Ide6b3077768a96b76078e5d4f6460596b8ff1560
Reviewed-on: https://go-review.googlesource.com/c/go/+/631756
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Keith Randall <khr@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Keith Randall <khr@golang.org>

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

index f434c939e3c8150d249e5bb8a22e16bb6347091e..4c0148f8a75f35f8a67f9501a1e9d315db7bfc0a 100644 (file)
@@ -20,6 +20,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 7b0e080238d0b1a695b916313557394a3a59c33a..ce0b5c2f73c5395c5b80363ac41b4c025c48130c 100644 (file)
@@ -147,6 +147,39 @@ TEXT ·Xadd64(SB), NOSPLIT, $0-24
        SYNC
        RET
 
+// uint8 Xchg(ptr *uint8, new uint8)
+// Atomically:
+//     old := *ptr;
+//     *ptr = new;
+//     return old;
+TEXT ·Xchg8(SB), NOSPLIT, $0-17
+       MOVV    ptr+0(FP), R2
+       MOVBU   new+8(FP), R5
+#ifdef GOARCH_mips64
+       // Big endian.  ptr = ptr ^ 3
+       XOR     $3, R2
+#endif
+       // R4 = ((ptr & 3) * 8)
+       AND     $3, R2, R4
+       SLLV    $3, R4
+       // Shift val for aligned ptr. R7 = (0xFF << R4) ^ (-1)
+       MOVV    $0xFF, R7
+       SLLV    R4, R7
+       XOR     $-1, R7
+       AND     $~3, R2
+       SLLV    R4, R5
+
+       SYNC
+       LL      (R2), R9
+       AND     R7, R9, R8
+       OR      R5, R8
+       SC      R8, (R2)
+       BEQ     R8, -5(PC)
+       SYNC
+       SRLV    R4, R9
+       MOVBU   R9, ret+16(FP)
+       RET
+
 // uint32 Xchg(ptr *uint32, new uint32)
 // Atomically:
 //     old := *ptr;
index 8d30212adc027e0784466927dd8193aa3c876699..d62f3dc73ab8e1882baaccb2b82f2bf49805bedf 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 || riscv64
+//go:build 386 || amd64 || arm || arm64 || loong64 || mips64 || mips64le || ppc64 || ppc64le || riscv64
 
 package atomic_test