:: commit 4f3d63f8c6dfed9fd0a6cf6b8294f56736550689

Mintsuki <mintsuki@protonmail.com> — 2026-01-05 05:17

parents: 67ccf78bd6

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;
+}
tab: 248 wrap: offon