diff --git a/common/lib/mem.asm_x86_64 b/common/lib/mem.asm_x86_64 new file mode 100644 index 00000000..4463c197 --- /dev/null +++ b/common/lib/mem.asm_x86_64 @@ -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 diff --git a/common/lib/mem.s2.asm_ia32 b/common/lib/mem.s2.asm_ia32 index dc0b8d92..c4452247 100644 --- a/common/lib/mem.s2.asm_ia32 +++ b/common/lib/mem.s2.asm_ia32 @@ -1,5 +1,79 @@ 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 memcpy32to64: push ebp diff --git a/common/lib/memory.s2.c b/common/lib/memory.s2.c index 6d530115..0c3b7edd 100644 --- a/common/lib/memory.s2.c +++ b/common/lib/memory.s2.c @@ -1,3 +1,5 @@ +#if !defined (__x86_64__) && !defined (__i386__) + #include #include @@ -51,3 +53,5 @@ int memcmp(const void *s1, const void *s2, size_t n) { return 0; } + +#endif diff --git a/decompressor/mem.asm b/decompressor/mem.asm new file mode 100644 index 00000000..d3a7d9e7 --- /dev/null +++ b/decompressor/mem.asm @@ -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 diff --git a/decompressor/memory.c b/decompressor/memory.c deleted file mode 100644 index 6d530115..00000000 --- a/decompressor/memory.c +++ /dev/null @@ -1,53 +0,0 @@ -#include -#include - -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; -}