diff options
Diffstat (limited to 'src/runtime/memmove_amd64.s')
| -rw-r--r-- | src/runtime/memmove_amd64.s | 24 |
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 |
