]> Cypherpunks repositories - gostls13.git/commitdiff
runtime/internal/atomic: add Store8
authorAustin Clements <austin@google.com>
Wed, 23 Oct 2019 13:47:53 +0000 (09:47 -0400)
committerAustin Clements <austin@google.com>
Tue, 29 Oct 2019 03:18:52 +0000 (03:18 +0000)
We already have Load8, And8, and Or8.

For #10958, #24543, but makes sense on its own.

Change-Id: I478529fc643edc57efdeccaae413c99edd19b2eb
Reviewed-on: https://go-review.googlesource.com/c/go/+/203283
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
18 files changed:
src/runtime/internal/atomic/asm_386.s
src/runtime/internal/atomic/asm_amd64.s
src/runtime/internal/atomic/asm_mips64x.s
src/runtime/internal/atomic/asm_mipsx.s
src/runtime/internal/atomic/asm_ppc64x.s
src/runtime/internal/atomic/asm_s390x.s
src/runtime/internal/atomic/atomic_386.go
src/runtime/internal/atomic/atomic_amd64.go
src/runtime/internal/atomic/atomic_arm.go
src/runtime/internal/atomic/atomic_arm64.go
src/runtime/internal/atomic/atomic_arm64.s
src/runtime/internal/atomic/atomic_mips64x.go
src/runtime/internal/atomic/atomic_mipsx.go
src/runtime/internal/atomic/atomic_ppc64x.go
src/runtime/internal/atomic/atomic_s390x.go
src/runtime/internal/atomic/atomic_wasm.go
src/runtime/internal/atomic/sys_linux_arm.s
src/runtime/internal/atomic/sys_nonlinux_arm.s

index 13289a88d068b7e2abed9e1ae0f204f3e64a1511..9b9dc14a608b7b4ba1d23d18498ccd00caee7c91 100644 (file)
@@ -229,3 +229,9 @@ TEXT runtime∕internal∕atomic·And8(SB), NOSPLIT, $0-5
        LOCK
        ANDB    BX, (AX)
        RET
+
+TEXT runtime∕internal∕atomic·Store8(SB), NOSPLIT, $0-5
+       MOVL    ptr+0(FP), BX
+       MOVB    val+4(FP), AX
+       XCHGB   AX, 0(BX)
+       RET
index e18aee7d59e3106f211ac11c645b3b877257ba2e..90c56424c971584b27d696de8adc92ff6c9d318b 100644 (file)
@@ -136,6 +136,12 @@ TEXT runtime∕internal∕atomic·Store(SB), NOSPLIT, $0-12
 TEXT runtime∕internal∕atomic·StoreRel(SB), NOSPLIT, $0-12
        JMP     runtime∕internal∕atomic·Store(SB)
 
+TEXT runtime∕internal∕atomic·Store8(SB), NOSPLIT, $0-9
+       MOVQ    ptr+0(FP), BX
+       MOVB    val+8(FP), AX
+       XCHGB   AX, 0(BX)
+       RET
+
 TEXT runtime∕internal∕atomic·Store64(SB), NOSPLIT, $0-16
        MOVQ    ptr+0(FP), BX
        MOVQ    val+8(FP), AX
index 9cb10371b7a48427078828752eb9ad5bb0aa5da1..3290fb726a997bf149e0cc09107f597cbab4f471 100644 (file)
@@ -166,6 +166,14 @@ TEXT ·Store(SB), NOSPLIT, $0-12
        SYNC
        RET
 
+TEXT ·Store8(SB), NOSPLIT, $0-9
+       MOVV    ptr+0(FP), R1
+       MOVB    val+8(FP), R2
+       SYNC
+       MOVB    R2, 0(R1)
+       SYNC
+       RET
+
 TEXT ·Store64(SB), NOSPLIT, $0-16
        MOVV    ptr+0(FP), R1
        MOVV    val+8(FP), R2
index af6bce57d601e4ae99250f2e4793b6b345a7d418..62811a6599e2130a9c7ff6e81766f4303df833f6 100644 (file)
@@ -32,6 +32,14 @@ TEXT ·Store(SB),NOSPLIT,$0-8
        SYNC
        RET
 
+TEXT ·Store8(SB),NOSPLIT,$0-5
+       MOVW    ptr+0(FP), R1
+       MOVB    val+4(FP), R2
+       SYNC
+       MOVB    R2, 0(R1)
+       SYNC
+       RET
+
 TEXT ·Load(SB),NOSPLIT,$0-8
        MOVW    ptr+0(FP), R1
        SYNC
index 052b031cfbacef01db9f3717d607c4738bee6385..06dc931bf436b68c58b9ba517085f33effb1c36e 100644 (file)
@@ -170,6 +170,13 @@ TEXT runtime∕internal∕atomic·Store(SB), NOSPLIT, $0-12
        MOVW    R4, 0(R3)
        RET
 
+TEXT runtime∕internal∕atomic·Store8(SB), NOSPLIT, $0-9
+       MOVD    ptr+0(FP), R3
+       MOVB    val+8(FP), R4
+       SYNC
+       MOVB    R4, 0(R3)
+       RET
+
 TEXT runtime∕internal∕atomic·Store64(SB), NOSPLIT, $0-16
        MOVD    ptr+0(FP), R3
        MOVD    val+8(FP), R4
index 084f5b51637b93cb5ccee377db3a3ef93f714a93..78abd48afa749a2cb89ac88a43c026074d245ca1 100644 (file)
@@ -12,6 +12,14 @@ TEXT ·Store(SB), NOSPLIT, $0
        SYNC
        RET
 
+// func Store8(ptr *uint8, val uint8)
+TEXT ·Store8(SB), NOSPLIT, $0
+       MOVD    ptr+0(FP), R2
+       MOVB    val+8(FP), R3
+       MOVB    R3, 0(R2)
+       SYNC
+       RET
+
 // func Store64(ptr *uint64, val uint64)
 TEXT ·Store64(SB), NOSPLIT, $0
        MOVD    ptr+0(FP), R2
index d7f82cc752971cbf4f04ffda8e937c32af60b9a4..8d002ebfe376564f085a2c80fae877880d68474d 100644 (file)
@@ -74,6 +74,9 @@ func CasRel(ptr *uint32, old, new uint32) bool
 //go:noescape
 func Store(ptr *uint32, val uint32)
 
+//go:noescape
+func Store8(ptr *uint8, val uint8)
+
 //go:noescape
 func Store64(ptr *uint64, val uint64)
 
index fc865e892d0efd78e49b76e2e5e915a70aadedac..14b81017204c05d630bcb0f6f7770bd6bb922743 100644 (file)
@@ -76,6 +76,9 @@ func CasRel(ptr *uint32, old, new uint32) bool
 //go:noescape
 func Store(ptr *uint32, val uint32)
 
+//go:noescape
+func Store8(ptr *uint8, val uint8)
+
 //go:noescape
 func Store64(ptr *uint64, val uint64)
 
index c1fc1f727ff6405e193a8baa31217f1ba63c38f8..95713afcc17065570496a261f488c1f5ac90f40a 100644 (file)
@@ -209,5 +209,8 @@ func Xchg64(addr *uint64, v uint64) uint64
 //go:noescape
 func Load64(addr *uint64) uint64
 
+//go:noescape
+func Store8(addr *uint8, v uint8)
+
 //go:noescape
 func Store64(addr *uint64, v uint64)
index 0182f309cc8fb56c980777ec37fbc66c02efafe9..26ca94d54cc7a69f4bb6e1aa53f7e1c5906e3dfc 100644 (file)
@@ -56,6 +56,9 @@ func CasRel(ptr *uint32, old, new uint32) bool
 //go:noescape
 func Store(ptr *uint32, val uint32)
 
+//go:noescape
+func Store8(ptr *uint8, val uint8)
+
 //go:noescape
 func Store64(ptr *uint64, val uint64)
 
index a7e8c354492d480bc90ce0e08633d4f9ec3e1a08..d95689fe2de8e0fbe3c6759a15baa537ab81243d 100644 (file)
@@ -48,6 +48,12 @@ TEXT runtime∕internal∕atomic·Store(SB), NOSPLIT, $0-12
        STLRW   R1, (R0)
        RET
 
+TEXT runtime∕internal∕atomic·Store8(SB), NOSPLIT, $0-9
+       MOVD    ptr+0(FP), R0
+       MOVB    val+8(FP), R1
+       STLRB   R1, (R0)
+       RET
+
 TEXT runtime∕internal∕atomic·Store64(SB), NOSPLIT, $0-16
        MOVD    ptr+0(FP), R0
        MOVD    val+8(FP), R1
index ce11e38a9682dab3b309f1140df9be4d5ed1996c..1d9977850b580f597a3dede432b03875920a5e59 100644 (file)
@@ -58,6 +58,9 @@ func CasRel(ptr *uint32, old, new uint32) bool
 //go:noescape
 func Store(ptr *uint32, val uint32)
 
+//go:noescape
+func Store8(ptr *uint8, val uint8)
+
 //go:noescape
 func Store64(ptr *uint64, val uint64)
 
index 6e39262c15027220cfea8dca358903b5b381ff43..0e2d77ade176bc908374721804a9c54e0d9c68bf 100644 (file)
@@ -141,6 +141,9 @@ func Or8(ptr *uint8, val uint8)
 //go:noescape
 func Store(ptr *uint32, val uint32)
 
+//go:noescape
+func Store8(ptr *uint8, val uint8)
+
 // NO go:noescape annotation; see atomic_pointer.go.
 func StorepNoWB(ptr unsafe.Pointer, val unsafe.Pointer)
 
index 13805a527531aa40d0d37377e12217784b9ebf59..a48ecf5ee8ae88269f85f02b27b3f36ec8585fcf 100644 (file)
@@ -58,6 +58,9 @@ func CasRel(ptr *uint32, old, new uint32) bool
 //go:noescape
 func Store(ptr *uint32, val uint32)
 
+//go:noescape
+func Store8(ptr *uint8, val uint8)
+
 //go:noescape
 func Store64(ptr *uint64, val uint64)
 
index 25fd890524dced7fd0d807223bf0405ab6b4c8b0..4d73b39baf020dde79a13a0588ed8fbea3b1d333 100644 (file)
@@ -44,6 +44,9 @@ func LoadAcq(ptr *uint32) uint32 {
 //go:noescape
 func Store(ptr *uint32, val uint32)
 
+//go:noescape
+func Store8(ptr *uint8, val uint8)
+
 //go:noescape
 func Store64(ptr *uint64, val uint64)
 
index 0731763ac16aaec453d9f1dcfb0166e8775d9a9e..9037c2f7c87c328e335d1b031b3392e725991892 100644 (file)
@@ -141,6 +141,12 @@ func StoreRel(ptr *uint32, val uint32) {
        *ptr = val
 }
 
+//go:nosplit
+//go:noinline
+func Store8(ptr *uint8, val uint8) {
+       *ptr = val
+}
+
 //go:nosplit
 //go:noinline
 func Store64(ptr *uint64, val uint64) {
index df62f6c8ad9aaa1df6571e4ef61591fc39f7254e..0c1cc3dc863f18a939859756b3723a7696ef49b4 100644 (file)
@@ -120,3 +120,25 @@ end:
        MOVB    R1, ret+4(FP)
        RET
 
+TEXT   ·Store8(SB),NOSPLIT,$0-5
+       MOVW    addr+0(FP), R1
+       MOVB    v+4(FP), R2
+
+       MOVB    runtime·goarm(SB), R8
+       CMP     $7, R8
+       BGE     native_barrier
+       BL      memory_barrier<>(SB)
+       B       store
+native_barrier:
+       DMB     MB_ISH
+
+store:
+       MOVB    R2, (R1)
+
+       CMP     $7, R8
+       BGE     native_barrier2
+       BL      memory_barrier<>(SB)
+       RET
+native_barrier2:
+       DMB     MB_ISH
+       RET
index 9d8133479162823f74c4e1224be7d13e6182f5a9..57568b2238dc995f8fbe7f9190614f7427c15ba2 100644 (file)
@@ -60,3 +60,20 @@ TEXT ·Load8(SB),NOSPLIT|NOFRAME,$0-5
 
        MOVB    R1, ret+4(FP)
        RET
+
+TEXT   ·Store8(SB),NOSPLIT,$0-5
+       MOVW    addr+0(FP), R1
+       MOVB    v+4(FP), R2
+
+       MOVB    runtime·goarm(SB), R8
+       CMP     $7, R8
+       BLT     2(PC)
+       DMB     MB_ISH
+
+       MOVB    R2, (R1)
+
+       CMP     $7, R8
+       BLT     2(PC)
+       DMB     MB_ISH
+       RET
+