aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/internal/atomic
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/internal/atomic')
-rw-r--r--src/runtime/internal/atomic/asm_mipsx.s8
-rw-r--r--src/runtime/internal/atomic/atomic_386.go6
-rw-r--r--src/runtime/internal/atomic/atomic_amd64x.go6
-rw-r--r--src/runtime/internal/atomic/atomic_arm.go3
-rw-r--r--src/runtime/internal/atomic/atomic_arm64.go3
-rw-r--r--src/runtime/internal/atomic/atomic_arm64.s7
-rw-r--r--src/runtime/internal/atomic/atomic_mips64x.go3
-rw-r--r--src/runtime/internal/atomic/atomic_mips64x.s9
-rw-r--r--src/runtime/internal/atomic/atomic_mipsx.go3
-rw-r--r--src/runtime/internal/atomic/atomic_ppc64x.go3
-rw-r--r--src/runtime/internal/atomic/atomic_ppc64x.s11
-rw-r--r--src/runtime/internal/atomic/atomic_s390x.go6
-rw-r--r--src/runtime/internal/atomic/atomic_wasm.go6
-rw-r--r--src/runtime/internal/atomic/sys_linux_arm.s16
-rw-r--r--src/runtime/internal/atomic/sys_nonlinux_arm.s12
15 files changed, 102 insertions, 0 deletions
diff --git a/src/runtime/internal/atomic/asm_mipsx.s b/src/runtime/internal/atomic/asm_mipsx.s
index 73d7ea3ad4..af6bce57d6 100644
--- a/src/runtime/internal/atomic/asm_mipsx.s
+++ b/src/runtime/internal/atomic/asm_mipsx.s
@@ -40,6 +40,14 @@ TEXT ·Load(SB),NOSPLIT,$0-8
MOVW R1, ret+4(FP)
RET
+TEXT ·Load8(SB),NOSPLIT,$0-5
+ MOVW ptr+0(FP), R1
+ SYNC
+ MOVB 0(R1), R1
+ SYNC
+ MOVB R1, ret+4(FP)
+ RET
+
TEXT ·Xadd(SB),NOSPLIT,$0-12
MOVW ptr+0(FP), R2
MOVW delta+4(FP), R3
diff --git a/src/runtime/internal/atomic/atomic_386.go b/src/runtime/internal/atomic/atomic_386.go
index ad71ebd971..143cd45e61 100644
--- a/src/runtime/internal/atomic/atomic_386.go
+++ b/src/runtime/internal/atomic/atomic_386.go
@@ -47,6 +47,12 @@ func Xchguintptr(ptr *uintptr, new uintptr) uintptr
//go:noescape
func Load64(ptr *uint64) uint64
+//go:nosplit
+//go:noinline
+func Load8(ptr *uint8) uint8 {
+ return *ptr
+}
+
//go:noescape
func And8(ptr *uint8, val uint8)
diff --git a/src/runtime/internal/atomic/atomic_amd64x.go b/src/runtime/internal/atomic/atomic_amd64x.go
index d4fe461609..b7e01a3ad5 100644
--- a/src/runtime/internal/atomic/atomic_amd64x.go
+++ b/src/runtime/internal/atomic/atomic_amd64x.go
@@ -50,6 +50,12 @@ func Xchg64(ptr *uint64, new uint64) uint64
//go:noescape
func Xchguintptr(ptr *uintptr, new uintptr) uintptr
+//go:nosplit
+//go:noinline
+func Load8(ptr *uint8) uint8 {
+ return *ptr
+}
+
//go:noescape
func And8(ptr *uint8, val uint8)
diff --git a/src/runtime/internal/atomic/atomic_arm.go b/src/runtime/internal/atomic/atomic_arm.go
index abedee0e35..3834ce5b91 100644
--- a/src/runtime/internal/atomic/atomic_arm.go
+++ b/src/runtime/internal/atomic/atomic_arm.go
@@ -185,6 +185,9 @@ func Load(addr *uint32) uint32
func Loadp(addr unsafe.Pointer) unsafe.Pointer
//go:noescape
+func Load8(addr *uint8) uint8
+
+//go:noescape
func LoadAcq(addr *uint32) uint32
//go:noescape
diff --git a/src/runtime/internal/atomic/atomic_arm64.go b/src/runtime/internal/atomic/atomic_arm64.go
index 8e83cc6f53..0182f309cc 100644
--- a/src/runtime/internal/atomic/atomic_arm64.go
+++ b/src/runtime/internal/atomic/atomic_arm64.go
@@ -30,6 +30,9 @@ func Xchguintptr(ptr *uintptr, new uintptr) uintptr
func Load(ptr *uint32) uint32
//go:noescape
+func Load8(ptr *uint8) uint8
+
+//go:noescape
func Load64(ptr *uint64) uint64
// NO go:noescape annotation; *ptr escapes if result escapes (#31525)
diff --git a/src/runtime/internal/atomic/atomic_arm64.s b/src/runtime/internal/atomic/atomic_arm64.s
index c979f2246f..a7e8c35449 100644
--- a/src/runtime/internal/atomic/atomic_arm64.s
+++ b/src/runtime/internal/atomic/atomic_arm64.s
@@ -11,6 +11,13 @@ TEXT ·Load(SB),NOSPLIT,$0-12
MOVW R0, ret+8(FP)
RET
+// uint8 runtime∕internal∕atomic·Load8(uint8 volatile* addr)
+TEXT ·Load8(SB),NOSPLIT,$0-9
+ MOVD ptr+0(FP), R0
+ LDARB (R0), R0
+ MOVB R0, ret+8(FP)
+ RET
+
// uint64 runtime∕internal∕atomic·Load64(uint64 volatile* addr)
TEXT ·Load64(SB),NOSPLIT,$0-16
MOVD ptr+0(FP), R0
diff --git a/src/runtime/internal/atomic/atomic_mips64x.go b/src/runtime/internal/atomic/atomic_mips64x.go
index ca2e509266..ce11e38a96 100644
--- a/src/runtime/internal/atomic/atomic_mips64x.go
+++ b/src/runtime/internal/atomic/atomic_mips64x.go
@@ -30,6 +30,9 @@ func Xchguintptr(ptr *uintptr, new uintptr) uintptr
func Load(ptr *uint32) uint32
//go:noescape
+func Load8(ptr *uint8) uint8
+
+//go:noescape
func Load64(ptr *uint64) uint64
// NO go:noescape annotation; *ptr escapes if result escapes (#31525)
diff --git a/src/runtime/internal/atomic/atomic_mips64x.s b/src/runtime/internal/atomic/atomic_mips64x.s
index 5214afe2d6..1ed90937c9 100644
--- a/src/runtime/internal/atomic/atomic_mips64x.s
+++ b/src/runtime/internal/atomic/atomic_mips64x.s
@@ -17,6 +17,15 @@ TEXT ·Load(SB),NOSPLIT|NOFRAME,$0-12
MOVW R1, ret+8(FP)
RET
+// uint8 runtime∕internal∕atomic·Load8(uint8 volatile* ptr)
+TEXT ·Load8(SB),NOSPLIT|NOFRAME,$0-9
+ MOVV ptr+0(FP), R1
+ SYNC
+ MOVBU 0(R1), R1
+ SYNC
+ MOVB R1, ret+8(FP)
+ RET
+
// uint64 runtime∕internal∕atomic·Load64(uint64 volatile* ptr)
TEXT ·Load64(SB),NOSPLIT|NOFRAME,$0-16
MOVV ptr+0(FP), R1
diff --git a/src/runtime/internal/atomic/atomic_mipsx.go b/src/runtime/internal/atomic/atomic_mipsx.go
index 79eb582232..210fc27d9b 100644
--- a/src/runtime/internal/atomic/atomic_mipsx.go
+++ b/src/runtime/internal/atomic/atomic_mipsx.go
@@ -116,6 +116,9 @@ func Xchguintptr(ptr *uintptr, new uintptr) uintptr
//go:noescape
func Load(ptr *uint32) uint32
+//go:noescape
+func Load8(ptr *uint8) uint8
+
// NO go:noescape annotation; *ptr escapes if result escapes (#31525)
func Loadp(ptr unsafe.Pointer) unsafe.Pointer
diff --git a/src/runtime/internal/atomic/atomic_ppc64x.go b/src/runtime/internal/atomic/atomic_ppc64x.go
index 0e9a51f6a1..13805a5275 100644
--- a/src/runtime/internal/atomic/atomic_ppc64x.go
+++ b/src/runtime/internal/atomic/atomic_ppc64x.go
@@ -30,6 +30,9 @@ func Xchguintptr(ptr *uintptr, new uintptr) uintptr
func Load(ptr *uint32) uint32
//go:noescape
+func Load8(ptr *uint8) uint8
+
+//go:noescape
func Load64(ptr *uint64) uint64
// NO go:noescape annotation; *ptr escapes if result escapes (#31525)
diff --git a/src/runtime/internal/atomic/atomic_ppc64x.s b/src/runtime/internal/atomic/atomic_ppc64x.s
index c079ea494f..c2f696fb34 100644
--- a/src/runtime/internal/atomic/atomic_ppc64x.s
+++ b/src/runtime/internal/atomic/atomic_ppc64x.s
@@ -17,6 +17,17 @@ TEXT ·Load(SB),NOSPLIT|NOFRAME,$-8-12
MOVW R3, ret+8(FP)
RET
+// uint8 runtime∕internal∕atomic·Load8(uint8 volatile* ptr)
+TEXT ·Load8(SB),NOSPLIT|NOFRAME,$-8-9
+ MOVD ptr+0(FP), R3
+ SYNC
+ MOVBZ 0(R3), R3
+ CMP R3, R3, CR7
+ BC 4, 30, 1(PC) // bne- cr7,0x4
+ ISYNC
+ MOVB R3, ret+8(FP)
+ RET
+
// uint64 runtime∕internal∕atomic·Load64(uint64 volatile* ptr)
TEXT ·Load64(SB),NOSPLIT|NOFRAME,$-8-16
MOVD ptr+0(FP), R3
diff --git a/src/runtime/internal/atomic/atomic_s390x.go b/src/runtime/internal/atomic/atomic_s390x.go
index 2ffbec0b3f..0ad96d3502 100644
--- a/src/runtime/internal/atomic/atomic_s390x.go
+++ b/src/runtime/internal/atomic/atomic_s390x.go
@@ -20,6 +20,12 @@ func Loadp(ptr unsafe.Pointer) unsafe.Pointer {
//go:nosplit
//go:noinline
+func Load8(ptr *uint8) uint8 {
+ return *ptr
+}
+
+//go:nosplit
+//go:noinline
func Load64(ptr *uint64) uint64 {
return *ptr
}
diff --git a/src/runtime/internal/atomic/atomic_wasm.go b/src/runtime/internal/atomic/atomic_wasm.go
index 9c2193fa1b..9ce4892cb6 100644
--- a/src/runtime/internal/atomic/atomic_wasm.go
+++ b/src/runtime/internal/atomic/atomic_wasm.go
@@ -29,6 +29,12 @@ func LoadAcq(ptr *uint32) uint32 {
//go:nosplit
//go:noinline
+func Load8(ptr *uint8) uint8 {
+ return *ptr
+}
+
+//go:nosplit
+//go:noinline
func Load64(ptr *uint64) uint64 {
return *ptr
}
diff --git a/src/runtime/internal/atomic/sys_linux_arm.s b/src/runtime/internal/atomic/sys_linux_arm.s
index 0fd39d4ee8..df62f6c8ad 100644
--- a/src/runtime/internal/atomic/sys_linux_arm.s
+++ b/src/runtime/internal/atomic/sys_linux_arm.s
@@ -104,3 +104,19 @@ store:
native_barrier2:
DMB MB_ISH
RET
+
+TEXT ·Load8(SB),NOSPLIT,$0-5
+ MOVW addr+0(FP), R0
+ MOVB (R0), R1
+
+ MOVB runtime·goarm(SB), R11
+ CMP $7, R11
+ BGE native_barrier
+ BL memory_barrier<>(SB)
+ B end
+native_barrier:
+ DMB MB_ISH
+end:
+ MOVB R1, ret+4(FP)
+ RET
+
diff --git a/src/runtime/internal/atomic/sys_nonlinux_arm.s b/src/runtime/internal/atomic/sys_nonlinux_arm.s
index e593b3c92b..9d81334791 100644
--- a/src/runtime/internal/atomic/sys_nonlinux_arm.s
+++ b/src/runtime/internal/atomic/sys_nonlinux_arm.s
@@ -48,3 +48,15 @@ TEXT ·Store(SB),NOSPLIT,$0-8
BLT 2(PC)
DMB MB_ISH
RET
+
+TEXT ·Load8(SB),NOSPLIT|NOFRAME,$0-5
+ MOVW addr+0(FP), R0
+ MOVB (R0), R1
+
+ MOVB runtime·goarm(SB), R11
+ CMP $7, R11
+ BLT 2(PC)
+ DMB MB_ISH
+
+ MOVB R1, ret+4(FP)
+ RET