Skip to content

Commit 0d36fd0

Browse files
mauri870pull[bot]
authored andcommitted
runtime/internal/atomic: add loong64 operators for And/Or
These primitives will be used by the new And/Or sync/atomic apis. For #61395 Change-Id: I64b2e599e4f91412e0342aa01f5fd53271e9a333 GitHub-Last-Rev: 9755db5 GitHub-Pull-Request: #63314 Reviewed-on: https://go-review.googlesource.com/c/go/+/531895 Reviewed-by: abner chenc <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Michael Knyszek <[email protected]> Run-TryBot: Mauri de Souza Meneguzzo <[email protected]> Reviewed-by: Keith Randall <[email protected]> Reviewed-by: Keith Randall <[email protected]>
1 parent 6e3fe31 commit 0d36fd0

File tree

3 files changed

+79
-1
lines changed

3 files changed

+79
-1
lines changed

src/runtime/internal/atomic/atomic_andor_generic.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 arm || s390x || loong64 || mips || mipsle || mips64 || mips64le || wasm
5+
//go:build arm || s390x || mips || mipsle || mips64 || mips64le || wasm
66

77
package atomic
88

src/runtime/internal/atomic/atomic_loong64.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,24 @@ func Or8(ptr *uint8, val uint8)
5959
//go:noescape
6060
func Or(ptr *uint32, val uint32)
6161

62+
//go:noescape
63+
func And32(ptr *uint32, val uint32) uint32
64+
65+
//go:noescape
66+
func Or32(ptr *uint32, val uint32) uint32
67+
68+
//go:noescape
69+
func And64(ptr *uint64, val uint64) uint64
70+
71+
//go:noescape
72+
func Or64(ptr *uint64, val uint64) uint64
73+
74+
//go:noescape
75+
func Anduintptr(ptr *uintptr, val uintptr) uintptr
76+
77+
//go:noescape
78+
func Oruintptr(ptr *uintptr, val uintptr) uintptr
79+
6280
// NOTE: Do not add atomicxor8 (XOR is not idempotent).
6381

6482
//go:noescape

src/runtime/internal/atomic/atomic_loong64.s

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,66 @@ TEXT ·And(SB), NOSPLIT, $0-12
256256
DBAR
257257
RET
258258

259+
// func Or32(addr *uint32, v uint32) old uint32
260+
TEXT ·Or32(SB), NOSPLIT, $0-20
261+
MOVV ptr+0(FP), R4
262+
MOVW val+8(FP), R5
263+
DBAR
264+
LL (R4), R6
265+
OR R5, R6, R7
266+
SC R7, (R4)
267+
BEQ R7, -4(PC)
268+
DBAR
269+
MOVW R6, ret+16(FP)
270+
RET
271+
272+
// func And32(addr *uint32, v uint32) old uint32
273+
TEXT ·And32(SB), NOSPLIT, $0-20
274+
MOVV ptr+0(FP), R4
275+
MOVW val+8(FP), R5
276+
DBAR
277+
LL (R4), R6
278+
AND R5, R6, R7
279+
SC R7, (R4)
280+
BEQ R7, -4(PC)
281+
DBAR
282+
MOVW R6, ret+16(FP)
283+
RET
284+
285+
// func Or64(addr *uint64, v uint64) old uint64
286+
TEXT ·Or64(SB), NOSPLIT, $0-24
287+
MOVV ptr+0(FP), R4
288+
MOVV val+8(FP), R5
289+
DBAR
290+
LLV (R4), R6
291+
OR R5, R6, R7
292+
SCV R7, (R4)
293+
BEQ R7, -4(PC)
294+
DBAR
295+
MOVV R6, ret+16(FP)
296+
RET
297+
298+
// func And64(addr *uint64, v uint64) old uint64
299+
TEXT ·And64(SB), NOSPLIT, $0-24
300+
MOVV ptr+0(FP), R4
301+
MOVV val+8(FP), R5
302+
DBAR
303+
LLV (R4), R6
304+
AND R5, R6, R7
305+
SCV R7, (R4)
306+
BEQ R7, -4(PC)
307+
DBAR
308+
MOVV R6, ret+16(FP)
309+
RET
310+
311+
// func Anduintptr(addr *uintptr, v uintptr) old uintptr
312+
TEXT ·Anduintptr(SB), NOSPLIT, $0-24
313+
JMP ·And64(SB)
314+
315+
// func Oruintptr(addr *uintptr, v uintptr) old uintptr
316+
TEXT ·Oruintptr(SB), NOSPLIT, $0-24
317+
JMP ·Or64(SB)
318+
259319
// uint32 runtime∕internal∕atomic·Load(uint32 volatile* ptr)
260320
TEXT ·Load(SB),NOSPLIT|NOFRAME,$0-12
261321
MOVV ptr+0(FP), R19

0 commit comments

Comments
 (0)