mirror of
https://github.com/golang/go.git
synced 2024-09-22 02:48:50 +00:00
runtime/internal/atomic: add loong64 operators for And/Or
These primitives will be used by the new And/Or sync/atomic apis. For #61395
This commit is contained in:
parent
36e75f67ab
commit
0d0fca82b0
@ -1,4 +1,6 @@
|
|||||||
// +build wasm
|
//go:build wasm || loong64
|
||||||
|
// +build wasm loong64
|
||||||
|
|
||||||
//
|
//
|
||||||
// Copyright 2023 The Go Authors. All rights reserved.
|
// Copyright 2023 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
@ -9,8 +11,8 @@
|
|||||||
package atomic_test
|
package atomic_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
|
||||||
"runtime/internal/atomic"
|
"runtime/internal/atomic"
|
||||||
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestAnd32(t *testing.T) {
|
func TestAnd32(t *testing.T) {
|
||||||
@ -166,4 +168,3 @@ func TestOr64(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,6 +59,24 @@ func Or8(ptr *uint8, val uint8)
|
|||||||
//go:noescape
|
//go:noescape
|
||||||
func Or(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
|
||||||
|
|
||||||
// NOTE: Do not add atomicxor8 (XOR is not idempotent).
|
// NOTE: Do not add atomicxor8 (XOR is not idempotent).
|
||||||
|
|
||||||
//go:noescape
|
//go:noescape
|
||||||
|
@ -256,6 +256,66 @@ TEXT ·And(SB), NOSPLIT, $0-12
|
|||||||
DBAR
|
DBAR
|
||||||
RET
|
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)
|
// uint32 runtime∕internal∕atomic·Load(uint32 volatile* ptr)
|
||||||
TEXT ·Load(SB),NOSPLIT|NOFRAME,$0-12
|
TEXT ·Load(SB),NOSPLIT|NOFRAME,$0-12
|
||||||
MOVV ptr+0(FP), R19
|
MOVV ptr+0(FP), R19
|
||||||
|
Loading…
Reference in New Issue
Block a user