Skip to content

Commit e15d148

Browse files
HeliC829gopherbot
authored andcommitted
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 <[email protected]> Reviewed-by: Keith Randall <[email protected]> Auto-Submit: Keith Randall <[email protected]> Reviewed-by: Keith Randall <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]>
1 parent 1776255 commit e15d148

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed

src/internal/runtime/atomic/atomic_mipsx.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,9 @@ func Xadduintptr(ptr *uintptr, delta uintptr) uintptr
135135
//go:noescape
136136
func Xchg(ptr *uint32, new uint32) uint32
137137

138+
//go:noescape
139+
func Xchg8(ptr *uint8, new uint8) uint8
140+
138141
//go:noescape
139142
func Xchguintptr(ptr *uintptr, new uintptr) uintptr
140143

src/internal/runtime/atomic/atomic_mipsx.s

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,39 @@ try_xchg:
100100
MOVW R1, ret+8(FP)
101101
RET
102102

103+
// uint8 Xchg(ptr *uint8, new uint8)
104+
// Atomically:
105+
// old := *ptr;
106+
// *ptr = new;
107+
// return old;
108+
TEXT ·Xchg8(SB), NOSPLIT, $0-9
109+
MOVW ptr+0(FP), R2
110+
MOVBU new+4(FP), R5
111+
#ifdef GOARCH_mips
112+
// Big endian. ptr = ptr ^ 3
113+
XOR $3, R2
114+
#endif
115+
// R4 = ((ptr & 3) * 8)
116+
AND $3, R2, R4
117+
SLL $3, R4
118+
// Shift val for aligned ptr. R7 = (0xFF << R4) ^ (-1)
119+
MOVW $0xFF, R7
120+
SLL R4, R7
121+
XOR $-1, R7
122+
AND $~3, R2
123+
SLL R4, R5
124+
125+
SYNC
126+
LL (R2), R9
127+
AND R7, R9, R8
128+
OR R5, R8
129+
SC R8, (R2)
130+
BEQ R8, -5(PC)
131+
SYNC
132+
SRL R4, R9
133+
MOVBU R9, ret+8(FP)
134+
RET
135+
103136
TEXT ·Casint32(SB),NOSPLIT,$0-13
104137
JMP ·Cas(SB)
105138

src/internal/runtime/atomic/xchg8_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// Use of this source code is governed by a BSD-style
33
// license that can be found in the LICENSE file.
44

5-
//go:build 386 || amd64 || arm || arm64 || loong64 || mips64 || mips64le || ppc64 || ppc64le || riscv64
5+
//go:build 386 || amd64 || arm || arm64 || loong64 || mips || mipsle || mips64 || mips64le || ppc64 || ppc64le || riscv64
66

77
package atomic_test
88

0 commit comments

Comments
 (0)