Skip to content

Commit 6ba98de

Browse files
committed
runtime/internal/atomic: add And/Or operators for mips
These primitives will be used by the new And/Or sync/atomic apis. Implemented for mips/mipsle and mips64/mips64le. For [reserved]
1 parent ff19f8e commit 6ba98de

File tree

5 files changed

+143
-1
lines changed

5 files changed

+143
-1
lines changed

src/runtime/internal/atomic/atomic_andor_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//go:build 386 || amd64 || arm || arm64 || ppc64 || ppc64le || riscv64 || wasm
1+
//go:build 386 || amd64 || arm || arm64 || mips || mipsle || mips64 || mips64le || ppc64 || ppc64le || riscv64 || wasm
22

33
//
44
// Copyright 2023 The Go Authors. All rights reserved.

src/runtime/internal/atomic/atomic_mips64x.go

Lines changed: 18 additions & 0 deletions
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/runtime/internal/atomic/atomic_mips64x.s

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,66 @@ 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+
MOVW R3, R4
321+
OR R2, R3
322+
SC R3, (R1)
323+
BEQ R3, -4(PC)
324+
SYNC
325+
MOVW R4, ret+16(FP)
326+
RET
327+
328+
// func And32(addr *uint32, v uint32) old uint32
329+
TEXT ·And32(SB), NOSPLIT, $0-20
330+
MOVV ptr+0(FP), R1
331+
MOVW val+8(FP), R2
332+
333+
SYNC
334+
LL (R1), R3
335+
MOVW R3, R4
336+
AND R2, R3
337+
SC R3, (R1)
338+
BEQ R3, -4(PC)
339+
SYNC
340+
MOVW R4, ret+16(FP)
341+
RET
342+
343+
// func Or64(addr *uint64, v uint64) old uint64
344+
TEXT ·Or64(SB), NOSPLIT, $0-24
345+
MOVV ptr+0(FP), R1
346+
MOVV val+8(FP), R2
347+
348+
SYNC
349+
LLV (R1), R3
350+
MOVV R3, R4
351+
OR R2, R3
352+
SCV R3, (R1)
353+
BEQ R3, -4(PC)
354+
SYNC
355+
MOVV R4, ret+16(FP)
356+
RET
357+
358+
// func And64(addr *uint64, v uint64) old uint64
359+
TEXT ·And64(SB), NOSPLIT, $0-24
360+
MOVV ptr+0(FP), R1
361+
MOVV val+8(FP), R2
362+
363+
SYNC
364+
LLV (R1), R3
365+
MOVV R3, R4
366+
AND R2, R3
367+
SCV R3, (R1)
368+
BEQ R3, -4(PC)
369+
SYNC
370+
MOVV R4, ret+16(FP)
371+
RET
372+
313373
// uint32 ·Load(uint32 volatile* ptr)
314374
TEXT ·Load(SB),NOSPLIT|NOFRAME,$0-12
315375
MOVV ptr+0(FP), R1

src/runtime/internal/atomic/atomic_mipsx.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,28 @@ func Store64(addr *uint64, val uint64) {
104104
return
105105
}
106106

107+
//go:nosplit
108+
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
116+
}
117+
118+
//go:nosplit
119+
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
127+
}
128+
107129
//go:noescape
108130
func Xadd(ptr *uint32, delta int32) uint32
109131

@@ -143,6 +165,18 @@ func And(ptr *uint32, val uint32)
143165
//go:noescape
144166
func Or(ptr *uint32, val uint32)
145167

168+
//go:noescape
169+
func And32(ptr *uint32, val uint32) uint32
170+
171+
//go:noescape
172+
func Or32(ptr *uint32, val uint32) uint32
173+
174+
//go:noescape
175+
func Anduintptr(ptr *uintptr, val uintptr) uintptr
176+
177+
//go:noescape
178+
func Oruintptr(ptr *uintptr, val uintptr) uintptr
179+
146180
//go:noescape
147181
func Store(ptr *uint32, val uint32)
148182

src/runtime/internal/atomic/atomic_mipsx.s

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,36 @@ 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+
MOVW R3, R4
251+
OR R2, R3
252+
SC R3, (R1)
253+
BEQ R3, -4(PC)
254+
SYNC
255+
MOVW R4, ret+8(FP)
256+
RET
257+
258+
// func And32(addr *uint32, v uint32) old uint32
259+
TEXT ·And32(SB), NOSPLIT, $0-12
260+
MOVW ptr+0(FP), R1
261+
MOVW val+4(FP), R2
262+
263+
SYNC
264+
LL (R1), R3
265+
MOVW R3, R4
266+
AND R2, R3
267+
SC R3, (R1)
268+
BEQ R3, -4(PC)
269+
SYNC
270+
MOVW R4, ret+8(FP)
271+
RET
272+
243273
TEXT ·spinLock(SB),NOSPLIT,$0-4
244274
MOVW state+0(FP), R1
245275
MOVW $1, R2

0 commit comments

Comments
 (0)