misc: Use C implementations of mem*() functions for x86
diff --git a/common/lib/libc.h b/common/lib/libc.h
index 2722e107..803ffd1b 100644
--- a/common/lib/libc.h
+++ b/common/lib/libc.h
@@ -15,7 +15,7 @@ int tolower(int c);
int abs(int i);
void *memset(void *, int, size_t);
-void *memcpy(void *, const void *, size_t);
+void *memcpy(void *restrict, const void *restrict, size_t);
int memcmp(const void *, const void *, size_t);
void *memmove(void *, const void *, size_t);
void *memchr(const void *, int, size_t);
diff --git a/common/lib/mem.asm_x86_64 b/common/lib/mem.asm_x86_64
deleted file mode 100644
index f082324f..00000000
--- a/common/lib/mem.asm_x86_64
+++ /dev/null
@@ -1,57 +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
-
-section .note.GNU-stack noalloc noexec nowrite progbits
diff --git a/common/lib/mem.s2.asm_ia32 b/common/lib/mem.s2.asm_ia32
deleted file mode 100644
index a23f685d..00000000
--- a/common/lib/mem.s2.asm_ia32
+++ /dev/null
@@ -1,77 +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
-
-section .note.GNU-stack noalloc noexec nowrite progbits
diff --git a/common/lib/memory.s2.c b/common/lib/memory.s2.c
index 0c3b7edd..37ce5b74 100644
--- a/common/lib/memory.s2.c
+++ b/common/lib/memory.s2.c
@@ -1,11 +1,9 @@
-#if !defined (__x86_64__) && !defined (__i386__)
-
#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;
+void *memcpy(void *restrict dest, const void *restrict src, size_t n) {
+ uint8_t *restrict pdest = (uint8_t *restrict)dest;
+ const uint8_t *restrict psrc = (const uint8_t *restrict)src;
for (size_t i = 0; i < n; i++) {
pdest[i] = psrc[i];
@@ -53,5 +51,3 @@ int memcmp(const void *s1, const void *s2, size_t n) {
return 0;
}
-
-#endif
diff --git a/common/libc-compat/string.h b/common/libc-compat/string.h
index 4f597da7..df3fa05b 100644
--- a/common/libc-compat/string.h
+++ b/common/libc-compat/string.h
@@ -4,7 +4,7 @@
#include <stddef.h>
void *memset(void *, int, size_t);
-void *memcpy(void *, const void *, size_t);
+void *memcpy(void *restrict, const void *restrict, size_t);
int memcmp(const void *, const void *, size_t);
void *memmove(void *, const void *, size_t);
void *memchr(const void *, int, size_t);
diff --git a/decompressor/mem.asm b/decompressor/mem.asm
deleted file mode 100644
index a23f685d..00000000
--- a/decompressor/mem.asm
+++ /dev/null
@@ -1,77 +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
-
-section .note.GNU-stack noalloc noexec nowrite progbits
diff --git a/decompressor/memory.c b/decompressor/memory.c
new file mode 100644
index 00000000..37ce5b74
--- /dev/null
+++ b/decompressor/memory.c
@@ -0,0 +1,53 @@
+#include <stdint.h>
+#include <stddef.h>
+
+void *memcpy(void *restrict dest, const void *restrict src, size_t n) {
+ uint8_t *restrict pdest = (uint8_t *restrict)dest;
+ const uint8_t *restrict psrc = (const uint8_t *restrict)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;
+}
