Skip to content

Commit a2b62cb

Browse files
committed
use Cas64 in And64/Or64
1 parent 6ba98de commit a2b62cb

File tree

3 files changed

+28
-14
lines changed

3 files changed

+28
-14
lines changed

src/runtime/internal/atomic/atomic_mips64x.s

+8
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,14 @@ TEXT ·And64(SB), NOSPLIT, $0-24
370370
MOVV R4, ret+16(FP)
371371
RET
372372

373+
// func Anduintptr(addr *uintptr, v uintptr) old uintptr
374+
TEXT ·Anduintptr(SB), NOSPLIT, $0-24
375+
JMP ·And64(SB)
376+
377+
// func Oruintptr(addr *uintptr, v uintptr) old uintptr
378+
TEXT ·Oruintptr(SB), NOSPLIT, $0-24
379+
JMP ·Or64(SB)
380+
373381
// uint32 ·Load(uint32 volatile* ptr)
374382
TEXT ·Load(SB),NOSPLIT|NOFRAME,$0-12
375383
MOVV ptr+0(FP), R1

src/runtime/internal/atomic/atomic_mipsx.go

+12-14
Original file line numberDiff line numberDiff line change
@@ -106,24 +106,22 @@ func Store64(addr *uint64, val uint64) {
106106

107107
//go:nosplit
108108
func Or64(addr *uint64, val uint64) (old uint64) {
109-
lockAndCheck(addr)
110-
111-
old = *addr
112-
*addr = old | val
113-
114-
unlockNoFence()
115-
return old
109+
for {
110+
old = *addr
111+
if Cas64(addr, old, old|val) {
112+
return old
113+
}
114+
}
116115
}
117116

118117
//go:nosplit
119118
func And64(addr *uint64, val uint64) (old uint64) {
120-
lockAndCheck(addr)
121-
122-
old = *addr
123-
*addr = old & val
124-
125-
unlockNoFence()
126-
return old
119+
for {
120+
old = *addr
121+
if Cas64(addr, old, old&val) {
122+
return old
123+
}
124+
}
127125
}
128126

129127
//go:noescape

src/runtime/internal/atomic/atomic_mipsx.s

+8
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,14 @@ TEXT ·And32(SB), NOSPLIT, $0-12
270270
MOVW R4, ret+8(FP)
271271
RET
272272

273+
// func Anduintptr(addr *uintptr, v uintptr) old uintptr
274+
TEXT ·Anduintptr(SB), NOSPLIT, $0-12
275+
JMP ·And32(SB)
276+
277+
// func Oruintptr(addr *uintptr, v uintptr) old uintptr
278+
TEXT ·Oruintptr(SB), NOSPLIT, $0-12
279+
JMP ·Or32(SB)
280+
273281
TEXT ·spinLock(SB),NOSPLIT,$0-4
274282
MOVW state+0(FP), R1
275283
MOVW $1, R2

0 commit comments

Comments
 (0)