fix _cu_memmove in assembly, now it's byte-by-byte moving
This commit is contained in:
parent
4dc9fe3a55
commit
9eafc640fd
2 changed files with 4 additions and 23 deletions
|
|
@ -46,36 +46,14 @@ _cu_memmove:
|
||||||
add %rdx, %rdi
|
add %rdx, %rdi
|
||||||
add %rdx, %rsi
|
add %rdx, %rsi
|
||||||
std
|
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 %rdi
|
||||||
dec %rsi
|
dec %rsi
|
||||||
mov %rdx, %rcx
|
mov %rdx, %rcx
|
||||||
and $7, %rcx
|
|
||||||
rep movsb
|
rep movsb
|
||||||
cld
|
cld
|
||||||
jmp .retmove
|
jmp .retmove
|
||||||
.lessmove: // dst < src
|
.lessmove: // dst < src
|
||||||
mov %rdx, %rcx
|
mov %rdx, %rcx
|
||||||
shr $3, %rcx
|
|
||||||
je .less1
|
|
||||||
rep movsq
|
|
||||||
.less1:
|
|
||||||
mov %rdx, %rcx
|
|
||||||
and $7, %rcx
|
|
||||||
rep movsb
|
rep movsb
|
||||||
.retmove:
|
.retmove:
|
||||||
ret
|
ret
|
||||||
|
|
|
||||||
5
test.c
5
test.c
|
|
@ -121,7 +121,10 @@ int main()
|
||||||
printf("\t%u\n", val4[i]);
|
printf("\t%u\n", val4[i]);
|
||||||
printf("\n");
|
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");
|
printf("val4 memmove ->\n");
|
||||||
for (unsigned i = 0; i < 5; i++)
|
for (unsigned i = 0; i < 5; i++)
|
||||||
printf("\t%u\n", val4[i]);
|
printf("\t%u\n", val4[i]);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue