]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: improve memmove
authorQuan Yong Zhai <qyzhai@gmail.com>
Thu, 9 Jun 2011 20:49:47 +0000 (16:49 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 9 Jun 2011 20:49:47 +0000 (16:49 -0400)
check memory overlap

R=rsc, r, ken, edsrzf
CC=golang-dev
https://golang.org/cl/4602047

src/pkg/runtime/386/memmove.s
src/pkg/runtime/amd64/memmove.s

index 38a0652b5d9c3b2a8f40f7fae892f7362072cda7..471553ba2166e243b2a1e1bbbb54add60b74f9da 100644 (file)
@@ -32,7 +32,6 @@ TEXT runtime·memmove(SB), 7, $0
 
 /*
  * check and set for backwards
- * should we look closer for overlap?
  */
        CMPL    SI, DI
        JLS     back
@@ -40,6 +39,7 @@ TEXT runtime·memmove(SB), 7, $0
 /*
  * forward copy loop
  */
+forward:       
        MOVL    BX, CX
        SHRL    $2, CX
        ANDL    $3, BX
@@ -50,11 +50,19 @@ TEXT runtime·memmove(SB), 7, $0
 
        MOVL    to+0(FP),AX
        RET
+/*
+ * check overlap
+ */
+back:
+       MOVL    SI, CX
+       ADDL    BX, CX
+       CMPL    CX, DI
+       JLS     forward
 /*
  * whole thing backwards has
  * adjusted addresses
  */
-back:
+
        ADDL    BX, DI
        ADDL    BX, SI
        STD
index 9966b0ba7ad9f553370f7e394ef2f4a15d7c735c..fc9573f72e15cadf4cfa358c5217e68b246ae48b 100644 (file)
@@ -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