mirror of
https://github.com/golang/go.git
synced 2025-10-19 19:13:18 +00:00
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:
parent
1776255742
commit
e15d14873f
3 changed files with 37 additions and 1 deletions
|
@ -135,6 +135,9 @@ func Xadduintptr(ptr *uintptr, delta uintptr) uintptr
|
||||||
//go:noescape
|
//go:noescape
|
||||||
func Xchg(ptr *uint32, new uint32) uint32
|
func Xchg(ptr *uint32, new uint32) uint32
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
func Xchg8(ptr *uint8, new uint8) uint8
|
||||||
|
|
||||||
//go:noescape
|
//go:noescape
|
||||||
func Xchguintptr(ptr *uintptr, new uintptr) uintptr
|
func Xchguintptr(ptr *uintptr, new uintptr) uintptr
|
||||||
|
|
||||||
|
|
|
@ -100,6 +100,39 @@ try_xchg:
|
||||||
MOVW R1, ret+8(FP)
|
MOVW R1, ret+8(FP)
|
||||||
RET
|
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
|
TEXT ·Casint32(SB),NOSPLIT,$0-13
|
||||||
JMP ·Cas(SB)
|
JMP ·Cas(SB)
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// 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
|
package atomic_test
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue