From 9eafc640fdcfc0a0e8c463501b4a18ea91f8f14e Mon Sep 17 00:00:00 2001 From: mykola2312 <49044616+mykola2312@users.noreply.github.com> Date: Sun, 15 May 2022 22:23:48 +0300 Subject: [PATCH] fix _cu_memmove in assembly, now it's byte-by-byte moving --- arch/x86_64.S | 22 ---------------------- test.c | 5 ++++- 2 files changed, 4 insertions(+), 23 deletions(-) diff --git a/arch/x86_64.S b/arch/x86_64.S index 55f7b79..60a7c04 100644 --- a/arch/x86_64.S +++ b/arch/x86_64.S @@ -46,36 +46,14 @@ _cu_memmove: add %rdx, %rdi add %rdx, %rsi std - mov %rdx, %rcx - shr $3, %rcx - je .greater1_ - sub $8, %rdi - sub $8, %rsi - rep movsq -.greater1: - add $8, %rdi - add $8, %rsi - mov %rdx, %rcx - and $7, %rcx - rep movsb - cld - jmp .retmove -.greater1_: dec %rdi dec %rsi mov %rdx, %rcx - and $7, %rcx rep movsb cld jmp .retmove .lessmove: // dst < src mov %rdx, %rcx - shr $3, %rcx - je .less1 - rep movsq -.less1: - mov %rdx, %rcx - and $7, %rcx rep movsb .retmove: ret diff --git a/test.c b/test.c index 0e63860..d84b7dd 100644 --- a/test.c +++ b/test.c @@ -121,7 +121,10 @@ int main() printf("\t%u\n", val4[i]); printf("\n"); - _cu_memmove(&val4[1], &val4[0], sizeof(uint) * 3); + void* dst = &val4[1]; + void* src = &val4[0]; + printf("memmove delta\t%lx\n", (uintptr_t)dst - (uintptr_t)src); + _cu_memmove(dst, src, sizeof(uint) * 3); printf("val4 memmove ->\n"); for (unsigned i = 0; i < 5; i++) printf("\t%u\n", val4[i]);