diff options
| author | Austin Clements <austin@google.com> | 2019-03-28 14:58:06 -0400 |
|---|---|---|
| committer | Austin Clements <austin@google.com> | 2019-05-03 19:25:37 +0000 |
| commit | 4a4e05b0b166ef17d62789d7ca6d58aeb846c5d1 (patch) | |
| tree | 678cafc2a6988214970602778ce15b85a8840ff9 /src/runtime/internal | |
| parent | 7fcba81549b7088e8f4cda3a2702d948de42839e (diff) | |
| download | go-4a4e05b0b166ef17d62789d7ca6d58aeb846c5d1.tar.xz | |
cmd/compile,runtime/internal/atomic: add Load8
Change-Id: Id52a5730cf9207ee7ccebac4ef12791dc5720e7c
Reviewed-on: https://go-review.googlesource.com/c/go/+/172283
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
Diffstat (limited to 'src/runtime/internal')
| -rw-r--r-- | src/runtime/internal/atomic/asm_mipsx.s | 8 | ||||
| -rw-r--r-- | src/runtime/internal/atomic/atomic_386.go | 6 | ||||
| -rw-r--r-- | src/runtime/internal/atomic/atomic_amd64x.go | 6 | ||||
| -rw-r--r-- | src/runtime/internal/atomic/atomic_arm.go | 3 | ||||
| -rw-r--r-- | src/runtime/internal/atomic/atomic_arm64.go | 3 | ||||
| -rw-r--r-- | src/runtime/internal/atomic/atomic_arm64.s | 7 | ||||
| -rw-r--r-- | src/runtime/internal/atomic/atomic_mips64x.go | 3 | ||||
| -rw-r--r-- | src/runtime/internal/atomic/atomic_mips64x.s | 9 | ||||
| -rw-r--r-- | src/runtime/internal/atomic/atomic_mipsx.go | 3 | ||||
| -rw-r--r-- | src/runtime/internal/atomic/atomic_ppc64x.go | 3 | ||||
| -rw-r--r-- | src/runtime/internal/atomic/atomic_ppc64x.s | 11 | ||||
| -rw-r--r-- | src/runtime/internal/atomic/atomic_s390x.go | 6 | ||||
| -rw-r--r-- | src/runtime/internal/atomic/atomic_wasm.go | 6 | ||||
| -rw-r--r-- | src/runtime/internal/atomic/sys_linux_arm.s | 16 | ||||
| -rw-r--r-- | src/runtime/internal/atomic/sys_nonlinux_arm.s | 12 |
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 |
