misc: Use C instead of asm for mem*() family of functions
This commit is contained in:
parent
4190710dc6
commit
679fdd4351
|
@ -1,66 +0,0 @@
|
||||||
.section .text
|
|
||||||
|
|
||||||
.global memcpy
|
|
||||||
memcpy:
|
|
||||||
mov x3, x0
|
|
||||||
0:
|
|
||||||
cbz x2, 1f
|
|
||||||
ldrb w4, [x1], #1
|
|
||||||
strb w4, [x0], #1
|
|
||||||
sub x2, x2, #1
|
|
||||||
b 0b
|
|
||||||
1:
|
|
||||||
mov x0, x3
|
|
||||||
ret
|
|
||||||
|
|
||||||
.global memset
|
|
||||||
memset:
|
|
||||||
mov x3, x0
|
|
||||||
0:
|
|
||||||
cbz x2, 1f
|
|
||||||
strb w1, [x0], #1
|
|
||||||
sub x2, x2, #1
|
|
||||||
b 0b
|
|
||||||
1:
|
|
||||||
mov x0, x3
|
|
||||||
ret
|
|
||||||
|
|
||||||
.global memmove
|
|
||||||
memmove:
|
|
||||||
mov x3, x0
|
|
||||||
mov x5, x2
|
|
||||||
|
|
||||||
cmp x0, x1
|
|
||||||
b.gt 1f
|
|
||||||
0:
|
|
||||||
cbz x2, 2f
|
|
||||||
ldrb w4, [x1], #1
|
|
||||||
strb w4, [x0], #1
|
|
||||||
sub x2, x2, #1
|
|
||||||
b 0b
|
|
||||||
1:
|
|
||||||
sub x5, x5, #1
|
|
||||||
cbz x2, 2f
|
|
||||||
ldrb w4, [x1, x5]
|
|
||||||
strb w4, [x0, x5]
|
|
||||||
sub x2, x2, #1
|
|
||||||
b 1b
|
|
||||||
2:
|
|
||||||
mov x0, x3
|
|
||||||
ret
|
|
||||||
|
|
||||||
.global memcmp
|
|
||||||
memcmp:
|
|
||||||
mov x3, xzr
|
|
||||||
0:
|
|
||||||
cbz x2, 1f
|
|
||||||
ldrb w3, [x0], #1
|
|
||||||
ldrb w4, [x1], #1
|
|
||||||
sub w3, w3, w4
|
|
||||||
cbnz w3, 1f
|
|
||||||
sub x2, x2, #1
|
|
||||||
b 0b
|
|
||||||
1:
|
|
||||||
sxtw x0, w3
|
|
||||||
mov x0, x3
|
|
||||||
ret
|
|
|
@ -1,55 +0,0 @@
|
||||||
section .text
|
|
||||||
|
|
||||||
global memcpy
|
|
||||||
memcpy:
|
|
||||||
mov rcx, rdx
|
|
||||||
mov rax, rdi
|
|
||||||
rep movsb
|
|
||||||
ret
|
|
||||||
|
|
||||||
global memset
|
|
||||||
memset:
|
|
||||||
push rdi
|
|
||||||
mov rax, rsi
|
|
||||||
mov rcx, rdx
|
|
||||||
rep stosb
|
|
||||||
pop rax
|
|
||||||
ret
|
|
||||||
|
|
||||||
global memmove
|
|
||||||
memmove:
|
|
||||||
mov rcx, rdx
|
|
||||||
mov rax, rdi
|
|
||||||
|
|
||||||
cmp rdi, rsi
|
|
||||||
ja .copy_backwards
|
|
||||||
|
|
||||||
rep movsb
|
|
||||||
jmp .done
|
|
||||||
|
|
||||||
.copy_backwards:
|
|
||||||
lea rdi, [rdi+rcx-1]
|
|
||||||
lea rsi, [rsi+rcx-1]
|
|
||||||
std
|
|
||||||
rep movsb
|
|
||||||
cld
|
|
||||||
|
|
||||||
.done:
|
|
||||||
ret
|
|
||||||
|
|
||||||
global memcmp
|
|
||||||
memcmp:
|
|
||||||
mov rcx, rdx
|
|
||||||
repe cmpsb
|
|
||||||
je .equal
|
|
||||||
|
|
||||||
mov al, byte [rdi-1]
|
|
||||||
sub al, byte [rsi-1]
|
|
||||||
movsx rax, al
|
|
||||||
jmp .done
|
|
||||||
|
|
||||||
.equal:
|
|
||||||
xor eax, eax
|
|
||||||
|
|
||||||
.done:
|
|
||||||
ret
|
|
|
@ -1,79 +1,3 @@
|
||||||
section .text
|
|
||||||
|
|
||||||
global memcpy
|
|
||||||
memcpy:
|
|
||||||
push esi
|
|
||||||
push edi
|
|
||||||
mov eax, dword [esp+12]
|
|
||||||
mov edi, eax
|
|
||||||
mov esi, dword [esp+16]
|
|
||||||
mov ecx, dword [esp+20]
|
|
||||||
rep movsb
|
|
||||||
pop edi
|
|
||||||
pop esi
|
|
||||||
ret
|
|
||||||
|
|
||||||
global memset
|
|
||||||
memset:
|
|
||||||
push edi
|
|
||||||
mov edx, dword [esp+8]
|
|
||||||
mov edi, edx
|
|
||||||
mov eax, dword [esp+12]
|
|
||||||
mov ecx, dword [esp+16]
|
|
||||||
rep stosb
|
|
||||||
mov eax, edx
|
|
||||||
pop edi
|
|
||||||
ret
|
|
||||||
|
|
||||||
global memmove
|
|
||||||
memmove:
|
|
||||||
push esi
|
|
||||||
push edi
|
|
||||||
mov eax, dword [esp+12]
|
|
||||||
mov edi, eax
|
|
||||||
mov esi, dword [esp+16]
|
|
||||||
mov ecx, dword [esp+20]
|
|
||||||
|
|
||||||
cmp edi, esi
|
|
||||||
ja .copy_backwards
|
|
||||||
|
|
||||||
rep movsb
|
|
||||||
jmp .done
|
|
||||||
|
|
||||||
.copy_backwards:
|
|
||||||
lea edi, [edi+ecx-1]
|
|
||||||
lea esi, [esi+ecx-1]
|
|
||||||
std
|
|
||||||
rep movsb
|
|
||||||
cld
|
|
||||||
|
|
||||||
.done:
|
|
||||||
pop edi
|
|
||||||
pop esi
|
|
||||||
ret
|
|
||||||
|
|
||||||
global memcmp
|
|
||||||
memcmp:
|
|
||||||
push esi
|
|
||||||
push edi
|
|
||||||
mov edi, dword [esp+12]
|
|
||||||
mov esi, dword [esp+16]
|
|
||||||
mov ecx, dword [esp+20]
|
|
||||||
repe cmpsb
|
|
||||||
je .equal
|
|
||||||
mov al, byte [edi-1]
|
|
||||||
sub al, byte [esi-1]
|
|
||||||
movsx eax, al
|
|
||||||
jmp .done
|
|
||||||
|
|
||||||
.equal:
|
|
||||||
xor eax, eax
|
|
||||||
|
|
||||||
.done:
|
|
||||||
pop edi
|
|
||||||
pop esi
|
|
||||||
ret
|
|
||||||
|
|
||||||
global memcpy32to64
|
global memcpy32to64
|
||||||
memcpy32to64:
|
memcpy32to64:
|
||||||
push ebp
|
push ebp
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
void *memcpy(void *dest, const void *src, size_t n) {
|
||||||
|
uint8_t *pdest = (uint8_t *)dest;
|
||||||
|
const uint8_t *psrc = (const uint8_t *)src;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < n; i++) {
|
||||||
|
pdest[i] = psrc[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *memset(void *s, int c, size_t n) {
|
||||||
|
uint8_t *p = (uint8_t *)s;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < n; i++) {
|
||||||
|
p[i] = (uint8_t)c;
|
||||||
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *memmove(void *dest, const void *src, size_t n) {
|
||||||
|
uint8_t *pdest = (uint8_t *)dest;
|
||||||
|
const uint8_t *psrc = (const uint8_t *)src;
|
||||||
|
|
||||||
|
if (src > dest) {
|
||||||
|
for (size_t i = 0; i < n; i++) {
|
||||||
|
pdest[i] = psrc[i];
|
||||||
|
}
|
||||||
|
} else if (src < dest) {
|
||||||
|
for (size_t i = n; i > 0; i--) {
|
||||||
|
pdest[i-1] = psrc[i-1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
int memcmp(const void *s1, const void *s2, size_t n) {
|
||||||
|
const uint8_t *p1 = (const uint8_t *)s1;
|
||||||
|
const uint8_t *p2 = (const uint8_t *)s2;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < n; i++) {
|
||||||
|
if (p1[i] != p2[i]) {
|
||||||
|
return p1[i] < p2[i] ? -1 : 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -1,75 +0,0 @@
|
||||||
section .text
|
|
||||||
|
|
||||||
global memcpy
|
|
||||||
memcpy:
|
|
||||||
push esi
|
|
||||||
push edi
|
|
||||||
mov eax, dword [esp+12]
|
|
||||||
mov edi, eax
|
|
||||||
mov esi, dword [esp+16]
|
|
||||||
mov ecx, dword [esp+20]
|
|
||||||
rep movsb
|
|
||||||
pop edi
|
|
||||||
pop esi
|
|
||||||
ret
|
|
||||||
|
|
||||||
global memset
|
|
||||||
memset:
|
|
||||||
push edi
|
|
||||||
mov edx, dword [esp+8]
|
|
||||||
mov edi, edx
|
|
||||||
mov eax, dword [esp+12]
|
|
||||||
mov ecx, dword [esp+16]
|
|
||||||
rep stosb
|
|
||||||
mov eax, edx
|
|
||||||
pop edi
|
|
||||||
ret
|
|
||||||
|
|
||||||
global memmove
|
|
||||||
memmove:
|
|
||||||
push esi
|
|
||||||
push edi
|
|
||||||
mov eax, dword [esp+12]
|
|
||||||
mov edi, eax
|
|
||||||
mov esi, dword [esp+16]
|
|
||||||
mov ecx, dword [esp+20]
|
|
||||||
|
|
||||||
cmp edi, esi
|
|
||||||
ja .copy_backwards
|
|
||||||
|
|
||||||
rep movsb
|
|
||||||
jmp .done
|
|
||||||
|
|
||||||
.copy_backwards:
|
|
||||||
lea edi, [edi+ecx-1]
|
|
||||||
lea esi, [esi+ecx-1]
|
|
||||||
std
|
|
||||||
rep movsb
|
|
||||||
cld
|
|
||||||
|
|
||||||
.done:
|
|
||||||
pop edi
|
|
||||||
pop esi
|
|
||||||
ret
|
|
||||||
|
|
||||||
global memcmp
|
|
||||||
memcmp:
|
|
||||||
push esi
|
|
||||||
push edi
|
|
||||||
mov edi, dword [esp+12]
|
|
||||||
mov esi, dword [esp+16]
|
|
||||||
mov ecx, dword [esp+20]
|
|
||||||
repe cmpsb
|
|
||||||
je .equal
|
|
||||||
mov al, byte [edi-1]
|
|
||||||
sub al, byte [esi-1]
|
|
||||||
movsx eax, al
|
|
||||||
jmp .done
|
|
||||||
|
|
||||||
.equal:
|
|
||||||
xor eax, eax
|
|
||||||
|
|
||||||
.done:
|
|
||||||
pop edi
|
|
||||||
pop esi
|
|
||||||
ret
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
void *memcpy(void *dest, const void *src, size_t n) {
|
||||||
|
uint8_t *pdest = (uint8_t *)dest;
|
||||||
|
const uint8_t *psrc = (const uint8_t *)src;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < n; i++) {
|
||||||
|
pdest[i] = psrc[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *memset(void *s, int c, size_t n) {
|
||||||
|
uint8_t *p = (uint8_t *)s;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < n; i++) {
|
||||||
|
p[i] = (uint8_t)c;
|
||||||
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *memmove(void *dest, const void *src, size_t n) {
|
||||||
|
uint8_t *pdest = (uint8_t *)dest;
|
||||||
|
const uint8_t *psrc = (const uint8_t *)src;
|
||||||
|
|
||||||
|
if (src > dest) {
|
||||||
|
for (size_t i = 0; i < n; i++) {
|
||||||
|
pdest[i] = psrc[i];
|
||||||
|
}
|
||||||
|
} else if (src < dest) {
|
||||||
|
for (size_t i = n; i > 0; i--) {
|
||||||
|
pdest[i-1] = psrc[i-1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
int memcmp(const void *s1, const void *s2, size_t n) {
|
||||||
|
const uint8_t *p1 = (const uint8_t *)s1;
|
||||||
|
const uint8_t *p2 = (const uint8_t *)s2;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < n; i++) {
|
||||||
|
if (p1[i] != p2[i]) {
|
||||||
|
return p1[i] < p2[i] ? -1 : 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue