Skip to content

Commit 6bcf176

Browse files
mauri870gopherbot
authored andcommitted
runtime/internal/atomic: add ppc64x operators for And/Or
These primitives will be used by the new And/Or sync/atomic apis. For #61395 Change-Id: I9ad92634add0357092e49b5a4a40c177e242a0b6 GitHub-Last-Rev: cf3fb0d GitHub-Pull-Request: #63294 Reviewed-on: https://go-review.googlesource.com/c/go/+/531716 Reviewed-by: Eli Bendersky <[email protected]> Reviewed-by: Michael Pratt <[email protected]> Reviewed-by: Lynn Boger <[email protected]> Run-TryBot: Mauri de Souza Meneguzzo <[email protected]> Auto-Submit: Michael Pratt <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Paul Murphy <[email protected]>
1 parent 3bd3029 commit 6bcf176

File tree

3 files changed

+82
-3
lines changed

3 files changed

+82
-3
lines changed

src/runtime/internal/atomic/atomic_andor_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
// +build wasm
1+
//go:build wasm || ppc64 || ppc64le
2+
// +build wasm ppc64 ppc64le
3+
24
//
35
// Copyright 2023 The Go Authors. All rights reserved.
46
// Use of this source code is governed by a BSD-style
@@ -9,8 +11,8 @@
911
package atomic_test
1012

1113
import (
12-
"testing"
1314
"runtime/internal/atomic"
15+
"testing"
1416
)
1517

1618
func TestAnd32(t *testing.T) {
@@ -166,4 +168,3 @@ func TestOr64(t *testing.T) {
166168
}
167169
}
168170
}
169-

src/runtime/internal/atomic/atomic_ppc64x.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_ppc64x.s

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,3 +360,63 @@ again:
360360
STWCCC R6, (R3)
361361
BNE again
362362
RET
363+
364+
// func Or32(addr *uint32, v uint32) old uint32
365+
TEXT ·Or32(SB), NOSPLIT, $0-20
366+
MOVD ptr+0(FP), R3
367+
MOVW val+8(FP), R4
368+
LWSYNC
369+
again:
370+
LWAR (R3), R6
371+
OR R4, R6, R7
372+
STWCCC R7, (R3)
373+
BNE again
374+
MOVW R6, ret+16(FP)
375+
RET
376+
377+
// func And32(addr *uint32, v uint32) old uint32
378+
TEXT ·And32(SB), NOSPLIT, $0-20
379+
MOVD ptr+0(FP), R3
380+
MOVW val+8(FP), R4
381+
LWSYNC
382+
again:
383+
LWAR (R3),R6
384+
AND R4, R6, R7
385+
STWCCC R7, (R3)
386+
BNE again
387+
MOVW R6, ret+16(FP)
388+
RET
389+
390+
// func Or64(addr *uint64, v uint64) old uint64
391+
TEXT ·Or64(SB), NOSPLIT, $0-24
392+
MOVD ptr+0(FP), R3
393+
MOVD val+8(FP), R4
394+
LWSYNC
395+
again:
396+
LDAR (R3), R6
397+
OR R4, R6, R7
398+
STDCCC R7, (R3)
399+
BNE again
400+
MOVD R6, ret+16(FP)
401+
RET
402+
403+
// func And64(addr *uint64, v uint64) old uint64
404+
TEXT ·And64(SB), NOSPLIT, $0-24
405+
MOVD ptr+0(FP), R3
406+
MOVD val+8(FP), R4
407+
LWSYNC
408+
again:
409+
LDAR (R3),R6
410+
AND R4, R6, R7
411+
STDCCC R7, (R3)
412+
BNE again
413+
MOVD R6, ret+16(FP)
414+
RET
415+
416+
// func Anduintptr(addr *uintptr, v uintptr) old uintptr
417+
TEXT ·Anduintptr(SB), NOSPLIT, $0-24
418+
JMP ·And64(SB)
419+
420+
// func Oruintptr(addr *uintptr, v uintptr) old uintptr
421+
TEXT ·Oruintptr(SB), NOSPLIT, $0-24
422+
JMP ·Or64(SB)

0 commit comments

Comments
 (0)