aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/internal
diff options
context:
space:
mode:
authorMauri de Souza Meneguzzo <mauri870@gmail.com>2024-02-17 10:30:01 +0000
committerKeith Randall <khr@golang.org>2024-02-20 22:55:07 +0000
commit1a8ee033f84d9ea53c15c3b395ddcc42a4cb9cd2 (patch)
treecb4dbe58ce48c2c1c8d026fae512fffa4ddf9034 /src/runtime/internal
parent290835298067014e906c540d64dcaa706d66b2ce (diff)
downloadgo-1a8ee033f84d9ea53c15c3b395ddcc42a4cb9cd2.tar.xz
runtime/internal/atomic: add s390x operators for And/Or
These primitives will be used by the new And/Or sync/atomic apis. For #61395 Change-Id: Ia9b4877048002d3d7d1dffa2311d0ec5f38e4ee5 GitHub-Last-Rev: 20dea110c824913c0c3d9c259e3e21e7ff8e4ba9 GitHub-Pull-Request: golang/go#63318 Reviewed-on: https://go-review.googlesource.com/c/go/+/531678 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Keith Randall <khr@google.com> Reviewed-by: Michael Knyszek <mknyszek@google.com> Reviewed-by: Keith Randall <khr@golang.org> Run-TryBot: Mauri de Souza Meneguzzo <mauri870@gmail.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Cherry Mui <cherryyz@google.com>
Diffstat (limited to 'src/runtime/internal')
-rw-r--r--src/runtime/internal/atomic/atomic_andor_generic.go2
-rw-r--r--src/runtime/internal/atomic/atomic_s390x.go18
-rw-r--r--src/runtime/internal/atomic/atomic_s390x.s56
3 files changed, 75 insertions, 1 deletions
diff --git a/src/runtime/internal/atomic/atomic_andor_generic.go b/src/runtime/internal/atomic/atomic_andor_generic.go
index a3a974911c..f8b148dda5 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 || mips || mipsle || mips64 || mips64le || wasm
+//go:build arm || mips || mipsle || mips64 || mips64le || wasm
package atomic
diff --git a/src/runtime/internal/atomic/atomic_s390x.go b/src/runtime/internal/atomic/atomic_s390x.go
index 9855bf0780..68b4e160f9 100644
--- a/src/runtime/internal/atomic/atomic_s390x.go
+++ b/src/runtime/internal/atomic/atomic_s390x.go
@@ -99,6 +99,24 @@ func And(ptr *uint32, val uint32)
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
+
+//go:noescape
func Xadd(ptr *uint32, delta int32) uint32
//go:noescape
diff --git a/src/runtime/internal/atomic/atomic_s390x.s b/src/runtime/internal/atomic/atomic_s390x.s
index a0c204b0e1..6e4ea0e32a 100644
--- a/src/runtime/internal/atomic/atomic_s390x.s
+++ b/src/runtime/internal/atomic/atomic_s390x.s
@@ -246,3 +246,59 @@ TEXT ·And(SB), NOSPLIT, $0-12
MOVW val+8(FP), R4
LAN R4, R6, 0(R3) // R6 = *R3; *R3 &= R4; (atomic)
RET
+
+// func Or32(addr *uint32, v uint32) old uint32
+TEXT ·Or32(SB), NOSPLIT, $0-20
+ MOVD ptr+0(FP), R4
+ MOVW val+8(FP), R5
+ MOVW (R4), R3
+repeat:
+ OR R5, R3, R6
+ CS R3, R6, (R4) // if R3==(R4) then (R4)=R6 else R3=(R4)
+ BNE repeat
+ MOVW R3, ret+16(FP)
+ RET
+
+// func And32(addr *uint32, v uint32) old uint32
+TEXT ·And32(SB), NOSPLIT, $0-20
+ MOVD ptr+0(FP), R4
+ MOVW val+8(FP), R5
+ MOVW (R4), R3
+repeat:
+ AND R5, R3, R6
+ CS R3, R6, (R4) // if R3==(R4) then (R4)=R6 else R3=(R4)
+ BNE repeat
+ MOVW R3, ret+16(FP)
+ RET
+
+// func Or64(addr *uint64, v uint64) old uint64
+TEXT ·Or64(SB), NOSPLIT, $0-24
+ MOVD ptr+0(FP), R4
+ MOVD val+8(FP), R5
+ MOVD (R4), R3
+repeat:
+ OR R5, R3, R6
+ CSG R3, R6, (R4) // if R3==(R4) then (R4)=R6 else R3=(R4)
+ BNE repeat
+ MOVD R3, ret+16(FP)
+ RET
+
+// func And64(addr *uint64, v uint64) old uint64
+TEXT ·And64(SB), NOSPLIT, $0-24
+ MOVD ptr+0(FP), R4
+ MOVD val+8(FP), R5
+ MOVD (R4), R3
+repeat:
+ AND R5, R3, R6
+ CSG R3, R6, (R4) // if R3==(R4) then (R4)=R6 else R3=(R4)
+ BNE repeat
+ MOVD R3, ret+16(FP)
+ RET
+
+// func Anduintptr(addr *uintptr, v uintptr) old uintptr
+TEXT ·Anduintptr(SB), NOSPLIT, $0-24
+ BR ·And64(SB)
+
+// func Oruintptr(addr *uintptr, v uintptr) old uintptr
+TEXT ·Oruintptr(SB), NOSPLIT, $0-24
+ BR ·Or64(SB)