aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/memmove_amd64.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/memmove_amd64.s')
-rw-r--r--src/runtime/memmove_amd64.s24
1 files changed, 14 insertions, 10 deletions
diff --git a/src/runtime/memmove_amd64.s b/src/runtime/memmove_amd64.s
index 514eb169f1..39b4c3a2bb 100644
--- a/src/runtime/memmove_amd64.s
+++ b/src/runtime/memmove_amd64.s
@@ -77,25 +77,29 @@ forward:
CMPQ BX, $2048
JLS move_256through2048
+ // If REP MOVSB isn't fast, don't use it
+ TESTL $(1<<9), runtime·cpuid_ebx7(SB) // erms, aka enhanced REP MOVSB/STOSB
+ JEQ fwdBy8
+
// Check alignment
- MOVQ SI, AX
- ORQ DI, AX
+ MOVL SI, AX
+ ORL DI, AX
TESTL $7, AX
- JNE unaligned_fwd
+ JEQ fwdBy8
+
+ // Do 1 byte at a time
+ MOVQ BX, CX
+ REP; MOVSB
+ RET
- // Aligned - do 8 bytes at a time
+fwdBy8:
+ // Do 8 bytes at a time
MOVQ BX, CX
SHRQ $3, CX
ANDQ $7, BX
REP; MOVSQ
JMP tail
-unaligned_fwd:
- // Unaligned - do 1 byte at a time
- MOVQ BX, CX
- REP; MOVSB
- RET
-
back:
/*
* check overlap