Skip to content

Commit 2bf9edb

Browse files
committed
runtime/internal/atomic: add And/Or operators for ppc64x
These primitives will be used by the new And/Or sync/atomic apis. For #61395
1 parent 9bfaaa1 commit 2bf9edb

File tree

3 files changed

+86
-3
lines changed

3 files changed

+86
-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: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,3 +360,67 @@ 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+
MOVW R6, R7
372+
OR R4, R6
373+
STWCCC R6, (R3)
374+
BNE again
375+
MOVW R7, ret+16(FP)
376+
RET
377+
378+
// func And32(addr *uint32, v uint32) old uint32
379+
TEXT ·And32(SB), NOSPLIT, $0-20
380+
MOVD ptr+0(FP), R3
381+
MOVW val+8(FP), R4
382+
LWSYNC
383+
again:
384+
LWAR (R3),R6
385+
MOVW R6, R7
386+
AND R4, R6
387+
STWCCC R6, (R3)
388+
BNE again
389+
MOVW R7, ret+16(FP)
390+
RET
391+
392+
// func Or64(addr *uint64, v uint64) old uint64
393+
TEXT ·Or64(SB), NOSPLIT, $0-24
394+
MOVD ptr+0(FP), R3
395+
MOVD val+8(FP), R4
396+
LWSYNC
397+
again:
398+
LDAR (R3), R6
399+
MOVD R6, R7
400+
OR R4, R6
401+
STDCCC R6, (R3)
402+
BNE again
403+
MOVD R7, ret+16(FP)
404+
RET
405+
406+
// func And64(addr *uint64, v uint64) old uint64
407+
TEXT ·And64(SB), NOSPLIT, $0-24
408+
MOVD ptr+0(FP), R3
409+
MOVD val+8(FP), R4
410+
LWSYNC
411+
again:
412+
LDAR (R3),R6
413+
MOVD R6, R7
414+
AND R4, R6
415+
STDCCC R6, (R3)
416+
BNE again
417+
MOVD R7, ret+16(FP)
418+
RET
419+
420+
// func Anduintptr(addr *uintptr, v uintptr) old uintptr
421+
TEXT ·Anduintptr(SB), NOSPLIT, $0-24
422+
JMP ·And64(SB)
423+
424+
// func Oruintptr(addr *uintptr, v uintptr) old uintptr
425+
TEXT ·Oruintptr(SB), NOSPLIT, $0-24
426+
JMP ·Or64(SB)

0 commit comments

Comments
 (0)