Skip to content

Commit 9623a35

Browse files
mauri870randall77
authored andcommitted
runtime/internal/atomic: add mips operators for And/Or
These primitives will be used by the new And/Or sync/atomic apis. Implemented for mips/mipsle and mips64/mips64le. For #61395 Change-Id: Icc604a2b5cdfe72646d47d3c6a0bb49a0fd0d353 GitHub-Last-Rev: 95dca2a GitHub-Pull-Request: #63297 Reviewed-on: https://go-review.googlesource.com/c/go/+/531835 Reviewed-by: Cherry Mui <[email protected]> Reviewed-by: Keith Randall <[email protected]> Reviewed-by: Keith Randall <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]>
1 parent 7f9edb4 commit 9623a35

File tree

5 files changed

+151
-1
lines changed

5 files changed

+151
-1
lines changed

src/internal/runtime/atomic/atomic_andor_generic.go

+1-1
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 arm || mips || mipsle || mips64 || mips64le || wasm
5+
//go:build arm || wasm
66

77
package atomic
88

src/internal/runtime/atomic/atomic_mips64x.go

+18
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,24 @@ func And(ptr *uint32, val uint32)
6161
//go:noescape
6262
func Or(ptr *uint32, val uint32)
6363

64+
//go:noescape
65+
func And32(ptr *uint32, val uint32) uint32
66+
67+
//go:noescape
68+
func Or32(ptr *uint32, val uint32) uint32
69+
70+
//go:noescape
71+
func And64(ptr *uint64, val uint64) uint64
72+
73+
//go:noescape
74+
func Or64(ptr *uint64, val uint64) uint64
75+
76+
//go:noescape
77+
func Anduintptr(ptr *uintptr, val uintptr) uintptr
78+
79+
//go:noescape
80+
func Oruintptr(ptr *uintptr, val uintptr) uintptr
81+
6482
//go:noescape
6583
func Cas64(ptr *uint64, old, new uint64) bool
6684

src/internal/runtime/atomic/atomic_mips64x.s

+64
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,70 @@ TEXT ·And(SB), NOSPLIT, $0-12
310310
SYNC
311311
RET
312312

313+
// func Or32(addr *uint32, v uint32) old uint32
314+
TEXT ·Or32(SB), NOSPLIT, $0-20
315+
MOVV ptr+0(FP), R1
316+
MOVW val+8(FP), R2
317+
318+
SYNC
319+
LL (R1), R3
320+
OR R2, R3, R4
321+
SC R4, (R1)
322+
BEQ R4, -3(PC)
323+
SYNC
324+
MOVW R3, ret+16(FP)
325+
RET
326+
327+
// func And32(addr *uint32, v uint32) old uint32
328+
TEXT ·And32(SB), NOSPLIT, $0-20
329+
MOVV ptr+0(FP), R1
330+
MOVW val+8(FP), R2
331+
332+
SYNC
333+
LL (R1), R3
334+
AND R2, R3, R4
335+
SC R4, (R1)
336+
BEQ R4, -3(PC)
337+
SYNC
338+
MOVW R3, ret+16(FP)
339+
RET
340+
341+
// func Or64(addr *uint64, v uint64) old uint64
342+
TEXT ·Or64(SB), NOSPLIT, $0-24
343+
MOVV ptr+0(FP), R1
344+
MOVV val+8(FP), R2
345+
346+
SYNC
347+
LLV (R1), R3
348+
OR R2, R3, R4
349+
SCV R4, (R1)
350+
BEQ R4, -3(PC)
351+
SYNC
352+
MOVV R3, ret+16(FP)
353+
RET
354+
355+
// func And64(addr *uint64, v uint64) old uint64
356+
TEXT ·And64(SB), NOSPLIT, $0-24
357+
MOVV ptr+0(FP), R1
358+
MOVV val+8(FP), R2
359+
360+
SYNC
361+
LLV (R1), R3
362+
AND R2, R3, R4
363+
SCV R4, (R1)
364+
BEQ R4, -3(PC)
365+
SYNC
366+
MOVV R3, ret+16(FP)
367+
RET
368+
369+
// func Anduintptr(addr *uintptr, v uintptr) old uintptr
370+
TEXT ·Anduintptr(SB), NOSPLIT, $0-24
371+
JMP ·And64(SB)
372+
373+
// func Oruintptr(addr *uintptr, v uintptr) old uintptr
374+
TEXT ·Oruintptr(SB), NOSPLIT, $0-24
375+
JMP ·Or64(SB)
376+
313377
// uint32 ·Load(uint32 volatile* ptr)
314378
TEXT ·Load(SB),NOSPLIT|NOFRAME,$0-12
315379
MOVV ptr+0(FP), R1

src/internal/runtime/atomic/atomic_mipsx.go

+32
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,26 @@ func Store64(addr *uint64, val uint64) {
104104
return
105105
}
106106

107+
//go:nosplit
108+
func Or64(addr *uint64, val uint64) (old uint64) {
109+
for {
110+
old = *addr
111+
if Cas64(addr, old, old|val) {
112+
return old
113+
}
114+
}
115+
}
116+
117+
//go:nosplit
118+
func And64(addr *uint64, val uint64) (old uint64) {
119+
for {
120+
old = *addr
121+
if Cas64(addr, old, old&val) {
122+
return old
123+
}
124+
}
125+
}
126+
107127
//go:noescape
108128
func Xadd(ptr *uint32, delta int32) uint32
109129

@@ -143,6 +163,18 @@ func And(ptr *uint32, val uint32)
143163
//go:noescape
144164
func Or(ptr *uint32, val uint32)
145165

166+
//go:noescape
167+
func And32(ptr *uint32, val uint32) uint32
168+
169+
//go:noescape
170+
func Or32(ptr *uint32, val uint32) uint32
171+
172+
//go:noescape
173+
func Anduintptr(ptr *uintptr, val uintptr) uintptr
174+
175+
//go:noescape
176+
func Oruintptr(ptr *uintptr, val uintptr) uintptr
177+
146178
//go:noescape
147179
func Store(ptr *uint32, val uint32)
148180

src/internal/runtime/atomic/atomic_mipsx.s

+36
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,42 @@ TEXT ·And(SB), NOSPLIT, $0-8
240240
SYNC
241241
RET
242242

243+
// func Or32(addr *uint32, v uint32) old uint32
244+
TEXT ·Or32(SB), NOSPLIT, $0-12
245+
MOVW ptr+0(FP), R1
246+
MOVW val+4(FP), R2
247+
248+
SYNC
249+
LL (R1), R3
250+
OR R2, R3, R4
251+
SC R4, (R1)
252+
BEQ R4, -4(PC)
253+
SYNC
254+
MOVW R3, ret+8(FP)
255+
RET
256+
257+
// func And32(addr *uint32, v uint32) old uint32
258+
TEXT ·And32(SB), NOSPLIT, $0-12
259+
MOVW ptr+0(FP), R1
260+
MOVW val+4(FP), R2
261+
262+
SYNC
263+
LL (R1), R3
264+
AND R2, R3, R4
265+
SC R4, (R1)
266+
BEQ R4, -4(PC)
267+
SYNC
268+
MOVW R3, ret+8(FP)
269+
RET
270+
271+
// func Anduintptr(addr *uintptr, v uintptr) old uintptr
272+
TEXT ·Anduintptr(SB), NOSPLIT, $0-12
273+
JMP ·And32(SB)
274+
275+
// func Oruintptr(addr *uintptr, v uintptr) old uintptr
276+
TEXT ·Oruintptr(SB), NOSPLIT, $0-12
277+
JMP ·Or32(SB)
278+
243279
TEXT ·spinLock(SB),NOSPLIT,$0-4
244280
MOVW state+0(FP), R1
245281
MOVW $1, R2

0 commit comments

Comments
 (0)