misc: Use assembly for memory functions on x86
This commit is contained in:
parent
17e26c8c95
commit
79e50a82af
55
common/lib/mem.asm_x86_64
Normal file
55
common/lib/mem.asm_x86_64
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
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,5 +1,79 @@
|
|||||||
section .text
|
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
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#if !defined (__x86_64__) && !defined (__i386__)
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
@ -51,3 +53,5 @@ int memcmp(const void *s1, const void *s2, size_t n) {
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
75
decompressor/mem.asm
Normal file
75
decompressor/mem.asm
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
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
|
@ -1,53 +0,0 @@
|
|||||||
#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
Block a user