aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime/amd64
diff options
context:
space:
mode:
authorQuan Yong Zhai <qyzhai@gmail.com>2011-06-09 16:49:47 -0400
committerRuss Cox <rsc@golang.org>2011-06-09 16:49:47 -0400
commit439694125f980fc0c96e99b347fa9742633f4757 (patch)
tree4a8a603ef69afff7463e8bf44887dc87e778389e /src/pkg/runtime/amd64
parent17ca32e9db2f58a6ed431c4502f6ab031147673f (diff)
downloadgo-439694125f980fc0c96e99b347fa9742633f4757.tar.xz
runtime: improve memmove
check memory overlap R=rsc, r, ken, edsrzf CC=golang-dev https://golang.org/cl/4602047
Diffstat (limited to 'src/pkg/runtime/amd64')
-rw-r--r--src/pkg/runtime/amd64/memmove.s12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/pkg/runtime/amd64/memmove.s b/src/pkg/runtime/amd64/memmove.s
index 9966b0ba7a..fc9573f72e 100644
--- a/src/pkg/runtime/amd64/memmove.s
+++ b/src/pkg/runtime/amd64/memmove.s
@@ -33,7 +33,6 @@ TEXT runtime·memmove(SB), 7, $0
/*
* check and set for backwards
- * should we look closer for overlap?
*/
CMPQ SI, DI
JLS back
@@ -41,6 +40,7 @@ TEXT runtime·memmove(SB), 7, $0
/*
* forward copy loop
*/
+forward:
MOVQ BX, CX
SHRQ $3, CX
ANDQ $7, BX
@@ -51,11 +51,19 @@ TEXT runtime·memmove(SB), 7, $0
MOVQ to+0(FP),AX
RET
+back:
+/*
+ * check overlap
+ */
+ MOVQ SI, CX
+ ADDQ BX, CX
+ CMPQ CX, DI
+ JLS forward
+
/*
* whole thing backwards has
* adjusted addresses
*/
-back:
ADDQ BX, DI
ADDQ BX, SI
STD