Skip to content

runtime/internal/atomic: add ppc64x operators for And/Or #63294

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions src/runtime/internal/atomic/atomic_andor_test.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
// +build wasm
//go:build wasm || ppc64 || ppc64le
// +build wasm ppc64 ppc64le

//
// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
Expand All @@ -9,8 +11,8 @@
package atomic_test

import (
"testing"
"runtime/internal/atomic"
"testing"
)

func TestAnd32(t *testing.T) {
Expand Down Expand Up @@ -166,4 +168,3 @@ func TestOr64(t *testing.T) {
}
}
}

18 changes: 18 additions & 0 deletions src/runtime/internal/atomic/atomic_ppc64x.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,24 @@ func And(ptr *uint32, val uint32)
//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

//go:noescape
func Cas64(ptr *uint64, old, new uint64) bool

Expand Down
60 changes: 60 additions & 0 deletions src/runtime/internal/atomic/atomic_ppc64x.s
Original file line number Diff line number Diff line change
Expand Up @@ -360,3 +360,63 @@ again:
STWCCC R6, (R3)
BNE again
RET

// func Or32(addr *uint32, v uint32) old uint32
TEXT ·Or32(SB), NOSPLIT, $0-20
MOVD ptr+0(FP), R3
MOVW val+8(FP), R4
LWSYNC
again:
LWAR (R3), R6
OR R4, R6, R7
STWCCC R7, (R3)
BNE again
MOVW R6, ret+16(FP)
RET

// func And32(addr *uint32, v uint32) old uint32
TEXT ·And32(SB), NOSPLIT, $0-20
MOVD ptr+0(FP), R3
MOVW val+8(FP), R4
LWSYNC
again:
LWAR (R3),R6
AND R4, R6, R7
STWCCC R7, (R3)
BNE again
MOVW R6, ret+16(FP)
RET

// func Or64(addr *uint64, v uint64) old uint64
TEXT ·Or64(SB), NOSPLIT, $0-24
MOVD ptr+0(FP), R3
MOVD val+8(FP), R4
LWSYNC
again:
LDAR (R3), R6
OR R4, R6, R7
STDCCC R7, (R3)
BNE again
MOVD R6, ret+16(FP)
RET

// func And64(addr *uint64, v uint64) old uint64
TEXT ·And64(SB), NOSPLIT, $0-24
MOVD ptr+0(FP), R3
MOVD val+8(FP), R4
LWSYNC
again:
LDAR (R3),R6
AND R4, R6, R7
STDCCC R7, (R3)
BNE again
MOVD 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)