golang: fix patch 0012 format
Signed-off-by: Grooooot <isula@huawei.com>
This commit is contained in:
parent
8b0d150421
commit
1ce9a9033f
@ -1,7 +1,8 @@
|
|||||||
From f1887468d1ae9781407f24a2b121ed34a6dfec4c Mon Sep 17 00:00:00 2001
|
From acc723af2646200d13f76ffde80b000c4095074a Mon Sep 17 00:00:00 2001
|
||||||
From: Cherry Zhang <cherryyz@google.com>
|
From: Cherry Zhang <cherryyz@google.com>
|
||||||
Date: Fri, 27 Dec 2019 12:02:00 -0500
|
Date: Fri, 27 Dec 2019 12:02:00 -0500
|
||||||
Subject: [PATCH] [release-branch.go1.13] runtime: ensure memmove write pointer atomically on ARM64
|
Subject: [PATCH] [release-branch.go1.13] runtime: ensure memmove write pointer
|
||||||
|
atomically on ARM64
|
||||||
|
|
||||||
If a pointer write is not atomic, if the GC is running
|
If a pointer write is not atomic, if the GC is running
|
||||||
concurrently, it may observe a partially updated pointer, which
|
concurrently, it may observe a partially updated pointer, which
|
||||||
@ -19,99 +20,107 @@ Change-Id: I1b3ca24c6b1ac8a8aaf9ee470115e9a89ec1b00b
|
|||||||
Reviewed-on: https://go-review.googlesource.com/c/go/+/212626
|
Reviewed-on: https://go-review.googlesource.com/c/go/+/212626
|
||||||
Reviewed-by: Austin Clements <austin@google.com>
|
Reviewed-by: Austin Clements <austin@google.com>
|
||||||
(cherry picked from commit ffbc02761abb47106ce88e09290a31513b5f6c8a)
|
(cherry picked from commit ffbc02761abb47106ce88e09290a31513b5f6c8a)
|
||||||
|
Reviewed-on: https://go-review.googlesource.com/c/go/+/213683
|
||||||
|
Run-TryBot: Cherry Zhang <cherryyz@google.com>
|
||||||
|
TryBot-Result: Gobot Gobot <gobot@golang.org>
|
||||||
---
|
---
|
||||||
|
src/runtime/memmove_arm64.s | 42 +++++++++++++++++++++++++++++++++++++-----
|
||||||
|
1 file changed, 37 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
diff --git a/src/runtime/memmove_arm64.s b/src/runtime/memmove_arm64.s
|
diff --git a/src/runtime/memmove_arm64.s b/src/runtime/memmove_arm64.s
|
||||||
index ac29f94..cedb018 100644
|
index ac29f94..cedb018 100644
|
||||||
--- a/src/runtime/memmove_arm64.s
|
--- a/src/runtime/memmove_arm64.s
|
||||||
+++ b/src/runtime/memmove_arm64.s
|
+++ b/src/runtime/memmove_arm64.s
|
||||||
@@ -22,7 +22,7 @@
|
@@ -22,7 +22,7 @@ check:
|
||||||
CMP R3, R4
|
CMP R3, R4
|
||||||
BLT backward
|
BLT backward
|
||||||
|
|
||||||
- // Copying forward proceeds by copying R7/8 words then copying R6 bytes.
|
- // Copying forward proceeds by copying R7/8 words then copying R6 bytes.
|
||||||
+ // Copying forward proceeds by copying R7/32 quadwords then R6 <= 31 tail bytes.
|
+ // Copying forward proceeds by copying R7/32 quadwords then R6 <= 31 tail bytes.
|
||||||
// R3 and R4 are advanced as we copy.
|
// R3 and R4 are advanced as we copy.
|
||||||
|
|
||||||
// (There may be implementations of armv8 where copying by bytes until
|
// (There may be implementations of armv8 where copying by bytes until
|
||||||
@@ -30,11 +30,12 @@
|
@@ -30,11 +30,12 @@ check:
|
||||||
// optimization, but the on the one tested so far (xgene) it did not
|
// optimization, but the on the one tested so far (xgene) it did not
|
||||||
// make a significance difference.)
|
// make a significance difference.)
|
||||||
|
|
||||||
- CBZ R7, noforwardlarge // Do we need to do any doubleword-by-doubleword copying?
|
- CBZ R7, noforwardlarge // Do we need to do any doubleword-by-doubleword copying?
|
||||||
+ CBZ R7, noforwardlarge // Do we need to do any quadword copying?
|
+ CBZ R7, noforwardlarge // Do we need to do any quadword copying?
|
||||||
|
|
||||||
ADD R3, R7, R9 // R9 points just past where we copy by word
|
ADD R3, R7, R9 // R9 points just past where we copy by word
|
||||||
|
|
||||||
forwardlargeloop:
|
forwardlargeloop:
|
||||||
+ // Copy 32 bytes at a time.
|
+ // Copy 32 bytes at a time.
|
||||||
LDP.P 32(R4), (R8, R10)
|
LDP.P 32(R4), (R8, R10)
|
||||||
STP.P (R8, R10), 32(R3)
|
STP.P (R8, R10), 32(R3)
|
||||||
LDP -16(R4), (R11, R12)
|
LDP -16(R4), (R11, R12)
|
||||||
@@ -43,10 +44,26 @@
|
@@ -43,10 +44,26 @@ forwardlargeloop:
|
||||||
CBNZ R7, forwardlargeloop
|
CBNZ R7, forwardlargeloop
|
||||||
|
|
||||||
noforwardlarge:
|
noforwardlarge:
|
||||||
- CBNZ R6, forwardtail // Do we need to do any byte-by-byte copying?
|
- CBNZ R6, forwardtail // Do we need to do any byte-by-byte copying?
|
||||||
+ CBNZ R6, forwardtail // Do we need to copy any tail bytes?
|
+ CBNZ R6, forwardtail // Do we need to copy any tail bytes?
|
||||||
RET
|
RET
|
||||||
|
|
||||||
forwardtail:
|
forwardtail:
|
||||||
+ // There are R6 <= 31 bytes remaining to copy.
|
+ // There are R6 <= 31 bytes remaining to copy.
|
||||||
+ // This is large enough to still contain pointers,
|
+ // This is large enough to still contain pointers,
|
||||||
+ // which must be copied atomically.
|
+ // which must be copied atomically.
|
||||||
+ // Copy the next 16 bytes, then 8 bytes, then any remaining bytes.
|
+ // Copy the next 16 bytes, then 8 bytes, then any remaining bytes.
|
||||||
+ TBZ $4, R6, 3(PC) // write 16 bytes if R6&16 != 0
|
+ TBZ $4, R6, 3(PC) // write 16 bytes if R6&16 != 0
|
||||||
+ LDP.P 16(R4), (R8, R10)
|
+ LDP.P 16(R4), (R8, R10)
|
||||||
+ STP.P (R8, R10), 16(R3)
|
+ STP.P (R8, R10), 16(R3)
|
||||||
+
|
+
|
||||||
+ TBZ $3, R6, 3(PC) // write 8 bytes if R6&8 != 0
|
+ TBZ $3, R6, 3(PC) // write 8 bytes if R6&8 != 0
|
||||||
+ MOVD.P 8(R4), R8
|
+ MOVD.P 8(R4), R8
|
||||||
+ MOVD.P R8, 8(R3)
|
+ MOVD.P R8, 8(R3)
|
||||||
+
|
+
|
||||||
+ AND $7, R6
|
+ AND $7, R6
|
||||||
+ CBNZ R6, 2(PC)
|
+ CBNZ R6, 2(PC)
|
||||||
+ RET
|
+ RET
|
||||||
+
|
+
|
||||||
ADD R3, R6, R9 // R9 points just past the destination memory
|
ADD R3, R6, R9 // R9 points just past the destination memory
|
||||||
|
|
||||||
forwardtailloop:
|
forwardtailloop:
|
||||||
@@ -90,7 +107,7 @@
|
@@ -90,7 +107,7 @@ copy1:
|
||||||
RET
|
RET
|
||||||
|
|
||||||
backward:
|
backward:
|
||||||
- // Copying backwards proceeds by copying R6 bytes then copying R7/8 words.
|
- // Copying backwards proceeds by copying R6 bytes then copying R7/8 words.
|
||||||
+ // Copying backwards first copies R6 <= 31 tail bytes, then R7/32 quadwords.
|
+ // Copying backwards first copies R6 <= 31 tail bytes, then R7/32 quadwords.
|
||||||
// R3 and R4 are advanced to the end of the destination/source buffers
|
// R3 and R4 are advanced to the end of the destination/source buffers
|
||||||
// respectively and moved back as we copy.
|
// respectively and moved back as we copy.
|
||||||
|
|
||||||
@@ -99,13 +116,28 @@
|
@@ -99,13 +116,28 @@ backward:
|
||||||
|
|
||||||
CBZ R6, nobackwardtail // Do we need to do any byte-by-byte copying?
|
CBZ R6, nobackwardtail // Do we need to do any byte-by-byte copying?
|
||||||
|
|
||||||
- SUB R6, R3, R9 // R9 points at the lowest destination byte that should be copied by byte.
|
- SUB R6, R3, R9 // R9 points at the lowest destination byte that should be copied by byte.
|
||||||
+ AND $7, R6, R12
|
+ AND $7, R6, R12
|
||||||
+ CBZ R12, backwardtaillarge
|
+ CBZ R12, backwardtaillarge
|
||||||
+
|
+
|
||||||
+ SUB R12, R3, R9 // R9 points at the lowest destination byte that should be copied by byte.
|
+ SUB R12, R3, R9 // R9 points at the lowest destination byte that should be copied by byte.
|
||||||
backwardtailloop:
|
backwardtailloop:
|
||||||
+ // Copy sub-pointer-size tail.
|
+ // Copy sub-pointer-size tail.
|
||||||
MOVBU.W -1(R4), R8
|
MOVBU.W -1(R4), R8
|
||||||
MOVBU.W R8, -1(R3)
|
MOVBU.W R8, -1(R3)
|
||||||
CMP R9, R3
|
CMP R9, R3
|
||||||
BNE backwardtailloop
|
BNE backwardtailloop
|
||||||
|
|
||||||
+backwardtaillarge:
|
+backwardtaillarge:
|
||||||
+ // Do 8/16-byte write if possible.
|
+ // Do 8/16-byte write if possible.
|
||||||
+ // See comment at forwardtail.
|
+ // See comment at forwardtail.
|
||||||
+ TBZ $3, R6, 3(PC)
|
+ TBZ $3, R6, 3(PC)
|
||||||
+ MOVD.W -8(R4), R8
|
+ MOVD.W -8(R4), R8
|
||||||
+ MOVD.W R8, -8(R3)
|
+ MOVD.W R8, -8(R3)
|
||||||
+
|
+
|
||||||
+ TBZ $4, R6, 3(PC)
|
+ TBZ $4, R6, 3(PC)
|
||||||
+ LDP.W -16(R4), (R8, R10)
|
+ LDP.W -16(R4), (R8, R10)
|
||||||
+ STP.W (R8, R10), -16(R3)
|
+ STP.W (R8, R10), -16(R3)
|
||||||
+
|
+
|
||||||
nobackwardtail:
|
nobackwardtail:
|
||||||
CBNZ R7, backwardlarge // Do we need to do any doubleword-by-doubleword copying?
|
CBNZ R7, backwardlarge // Do we need to do any doubleword-by-doubleword copying?
|
||||||
RET
|
RET
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
||||||
|
|||||||
@ -67,7 +67,6 @@ Summary: The Go Programming Language
|
|||||||
License: BSD and Public Domain
|
License: BSD and Public Domain
|
||||||
URL: http://golang.org/
|
URL: http://golang.org/
|
||||||
Source0: https://dl.google.com/go/go%{version}.src.tar.gz
|
Source0: https://dl.google.com/go/go%{version}.src.tar.gz
|
||||||
Source100: golang-gdbinit
|
|
||||||
|
|
||||||
%if !%{golang_bootstrap}
|
%if !%{golang_bootstrap}
|
||||||
BuildRequires: gcc-go >= 5
|
BuildRequires: gcc-go >= 5
|
||||||
@ -335,9 +334,6 @@ mkdir -p %{buildroot}%{gopath}/src/bitbucket.org
|
|||||||
mkdir -p %{buildroot}%{gopath}/src/code.google.com/p
|
mkdir -p %{buildroot}%{gopath}/src/code.google.com/p
|
||||||
mkdir -p %{buildroot}%{gopath}/src/golang.org/x
|
mkdir -p %{buildroot}%{gopath}/src/golang.org/x
|
||||||
|
|
||||||
mkdir -p %{buildroot}%{_sysconfdir}/gdbinit.d
|
|
||||||
cp -av %{SOURCE100} %{buildroot}%{_sysconfdir}/gdbinit.d/golang.gdb
|
|
||||||
|
|
||||||
%check
|
%check
|
||||||
export GOROOT=$(pwd -P)
|
export GOROOT=$(pwd -P)
|
||||||
export PATH="$GOROOT"/bin:"$PATH"
|
export PATH="$GOROOT"/bin:"$PATH"
|
||||||
@ -392,8 +388,6 @@ fi
|
|||||||
%dir %{gopath}/src/golang.org
|
%dir %{gopath}/src/golang.org
|
||||||
%dir %{gopath}/src/golang.org/x
|
%dir %{gopath}/src/golang.org/x
|
||||||
|
|
||||||
%{_sysconfdir}/gdbinit.d
|
|
||||||
|
|
||||||
%files help -f go-docs.list -f go-shared.list
|
%files help -f go-docs.list -f go-shared.list
|
||||||
|
|
||||||
%files devel -f go-tests.list -f go-misc.list -f go-src.list
|
%files devel -f go-tests.list -f go-misc.list -f go-src.list
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user