diff options
| author | Mauri de Souza Meneguzzo <mauri870@gmail.com> | 2024-01-24 10:19:30 +0000 |
|---|---|---|
| committer | Keith Randall <khr@golang.org> | 2024-02-05 15:30:09 +0000 |
| commit | 76ff0caa594bfb76cd3dd39b169da54545cffd64 (patch) | |
| tree | 6948198eae75526b3ba6330ae484f94bfffdf5bc /src/runtime/internal | |
| parent | e8d87728bd4ac93ed207df1261da673749c6bd0c (diff) | |
| download | go-76ff0caa594bfb76cd3dd39b169da54545cffd64.tar.xz | |
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: 9755db5406b84dd84fa5432382bfabc801a34ed3
GitHub-Pull-Request: golang/go#63314
Reviewed-on: https://go-review.googlesource.com/c/go/+/531895
Reviewed-by: abner chenc <chenguoqi@loongson.cn>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Run-TryBot: Mauri de Souza Meneguzzo <mauri870@gmail.com>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/runtime/internal')
| -rw-r--r-- | src/runtime/internal/atomic/atomic_andor_generic.go | 2 | ||||
| -rw-r--r-- | src/runtime/internal/atomic/atomic_loong64.go | 18 | ||||
| -rw-r--r-- | src/runtime/internal/atomic/atomic_loong64.s | 60 |
3 files changed, 79 insertions, 1 deletions
diff --git a/src/runtime/internal/atomic/atomic_andor_generic.go b/src/runtime/internal/atomic/atomic_andor_generic.go index 00b402681e..a3a974911c 100644 --- a/src/runtime/internal/atomic/atomic_andor_generic.go +++ b/src/runtime/internal/atomic/atomic_andor_generic.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build arm || s390x || loong64 || mips || mipsle || mips64 || mips64le || wasm +//go:build arm || s390x || mips || mipsle || mips64 || mips64le || wasm package atomic diff --git a/src/runtime/internal/atomic/atomic_loong64.go b/src/runtime/internal/atomic/atomic_loong64.go index d82a5b8e2a..de6d4b4ba6 100644 --- a/src/runtime/internal/atomic/atomic_loong64.go +++ b/src/runtime/internal/atomic/atomic_loong64.go @@ -59,6 +59,24 @@ func Or8(ptr *uint8, val uint8) //go:noescape func Or(ptr *uint32, val uint32) +//go:noescape +func And32(ptr *uint32, val uint32) uint32 + +//go:noescape +func Or32(ptr *uint32, val uint32) uint32 + +//go:noescape +func And64(ptr *uint64, val uint64) uint64 + +//go:noescape +func Or64(ptr *uint64, val uint64) uint64 + +//go:noescape +func Anduintptr(ptr *uintptr, val uintptr) uintptr + +//go:noescape +func Oruintptr(ptr *uintptr, val uintptr) uintptr + // NOTE: Do not add atomicxor8 (XOR is not idempotent). //go:noescape diff --git a/src/runtime/internal/atomic/atomic_loong64.s b/src/runtime/internal/atomic/atomic_loong64.s index 34193add3e..c7452d2e11 100644 --- a/src/runtime/internal/atomic/atomic_loong64.s +++ b/src/runtime/internal/atomic/atomic_loong64.s @@ -256,6 +256,66 @@ TEXT ·And(SB), NOSPLIT, $0-12 DBAR RET +// func Or32(addr *uint32, v uint32) old uint32 +TEXT ·Or32(SB), NOSPLIT, $0-20 + MOVV ptr+0(FP), R4 + MOVW val+8(FP), R5 + DBAR + LL (R4), R6 + OR R5, R6, R7 + SC R7, (R4) + BEQ R7, -4(PC) + DBAR + MOVW R6, ret+16(FP) + RET + +// func And32(addr *uint32, v uint32) old uint32 +TEXT ·And32(SB), NOSPLIT, $0-20 + MOVV ptr+0(FP), R4 + MOVW val+8(FP), R5 + DBAR + LL (R4), R6 + AND R5, R6, R7 + SC R7, (R4) + BEQ R7, -4(PC) + DBAR + MOVW R6, ret+16(FP) + RET + +// func Or64(addr *uint64, v uint64) old uint64 +TEXT ·Or64(SB), NOSPLIT, $0-24 + MOVV ptr+0(FP), R4 + MOVV val+8(FP), R5 + DBAR + LLV (R4), R6 + OR R5, R6, R7 + SCV R7, (R4) + BEQ R7, -4(PC) + DBAR + MOVV R6, ret+16(FP) + RET + +// func And64(addr *uint64, v uint64) old uint64 +TEXT ·And64(SB), NOSPLIT, $0-24 + MOVV ptr+0(FP), R4 + MOVV val+8(FP), R5 + DBAR + LLV (R4), R6 + AND R5, R6, R7 + SCV R7, (R4) + BEQ R7, -4(PC) + DBAR + MOVV R6, ret+16(FP) + RET + +// func Anduintptr(addr *uintptr, v uintptr) old uintptr +TEXT ·Anduintptr(SB), NOSPLIT, $0-24 + JMP ·And64(SB) + +// func Oruintptr(addr *uintptr, v uintptr) old uintptr +TEXT ·Oruintptr(SB), NOSPLIT, $0-24 + JMP ·Or64(SB) + // uint32 runtime∕internal∕atomic·Load(uint32 volatile* ptr) TEXT ·Load(SB),NOSPLIT|NOFRAME,$0-12 MOVV ptr+0(FP), R19 |
