internal/runtime/atomic: add Xchg8 for mipsx

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>
This commit is contained in:
Julian Zhu 2025-02-21 16:48:07 +08:00 committed by Gopher Robot
parent 1776255742
commit e15d14873f
3 changed files with 37 additions and 1 deletions

View 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

View 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)

View 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