]> Cypherpunks repositories - gostls13.git/commitdiff
internal/runtime/atomic: add Xchg8 for mipsx
authorJulian Zhu <jz531210@gmail.com>
Fri, 21 Feb 2025 08:48:07 +0000 (16:48 +0800)
committerGopher Robot <gobot@golang.org>
Sat, 22 Feb 2025 02:57:27 +0000 (18:57 -0800)
For #69735

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

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

index aba4143ea6613d1f19bddfb6fb9da8272e56fdfb..bf3578734a106931c3d2679a0d3c4ba850926d4c 100644 (file)
@@ -135,6 +135,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 Xchguintptr(ptr *uintptr, new uintptr) uintptr
 
index 4ccc0a363b7f085cbf83658b86d3581014f14434..b725016f7bc114802d6319a5ad0ebf6583d24403 100644 (file)
@@ -100,6 +100,39 @@ try_xchg:
        MOVW    R1, ret+8(FP)
        RET
 
+// uint8 Xchg(ptr *uint8, new uint8)
+// Atomically:
+//     old := *ptr;
+//     *ptr = new;
+//     return old;
+TEXT ·Xchg8(SB), NOSPLIT, $0-9
+       MOVW    ptr+0(FP), R2
+       MOVBU   new+4(FP), R5
+#ifdef GOARCH_mips
+       // Big endian.  ptr = ptr ^ 3
+       XOR     $3, R2
+#endif
+       // R4 = ((ptr & 3) * 8)
+       AND     $3, R2, R4
+       SLL     $3, R4
+       // Shift val for aligned ptr. R7 = (0xFF << R4) ^ (-1)
+       MOVW    $0xFF, R7
+       SLL     R4, R7
+       XOR     $-1, R7
+       AND     $~3, R2
+       SLL     R4, R5
+
+       SYNC
+       LL      (R2), R9
+       AND     R7, R9, R8
+       OR      R5, R8
+       SC      R8, (R2)
+       BEQ     R8, -5(PC)
+       SYNC
+       SRL     R4, R9
+       MOVBU   R9, ret+8(FP)
+       RET
+
 TEXT ·Casint32(SB),NOSPLIT,$0-13
        JMP     ·Cas(SB)
 
index d62f3dc73ab8e1882baaccb2b82f2bf49805bedf..952dfe4aad5645bc98b3abd171167b64d0fcf225 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 || mips64 || mips64le || ppc64 || ppc64le || riscv64
+//go:build 386 || amd64 || arm || arm64 || loong64 || mips || mipsle || mips64 || mips64le || ppc64 || ppc64le || riscv64
 
 package atomic_test