:: commit d014236e4d59d04ac7f0a7b6b4dd5ad074764110

mintsuki <mintsuki@protonmail.com> — 2021-12-10 01:56

parents: f3e64380fc

misc: Move to assembly for mem family functions

diff --git a/stage23/lib/libc.s2.c b/stage23/lib/libc.s2.c
index aa3112e7..24af2bec 100644
--- a/stage23/lib/libc.s2.c
+++ b/stage23/lib/libc.s2.c
@@ -18,56 +18,6 @@ int tolower(int c) {
     return c;
 }
 
-void *memcpy(void *dest, const void *src, size_t n) {
-    uint8_t *pdest = dest;
-    const uint8_t *psrc = 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 = 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 = dest;
-    const uint8_t *psrc = 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 = s1;
-    const uint8_t *p2 = s2;
-
-    for (size_t i = 0; i < n; i++) {
-        if (p1[i] != p2[i])
-            return p1[i] < p2[i] ? -1 : 1;
-    }
-
-    return 0;
-}
-
 char *strcpy(char *dest, const char *src) {
     size_t i;
 
diff --git a/stage23/lib/libgcc.s2.asm32 b/stage23/lib/libgcc.s2.asm32
index a9496aa9..743f11f8 100644
--- a/stage23/lib/libgcc.s2.asm32
+++ b/stage23/lib/libgcc.s2.asm32
@@ -55,38 +55,3 @@ __divmoddi4:
     mov dword [ecx+4], 0
     xor edx, edx
     ret
-
-global memcpy32to64
-memcpy32to64:
-bits 32
-    push ebp
-    mov ebp, esp
-
-    push esi
-    push edi
-
-    push 0x28
-    call .p1
-  .p1:
-    add dword [esp], .mode64 - .p1
-    retfd
-
-bits 64
-  .mode64:
-    mov rdi, [rbp + 8]
-    mov rsi, [rbp + 16]
-    mov rcx, [rbp + 24]
-    rep movsb
-
-    push 0x18
-    call .p2
-  .p2:
-    add qword [rsp], .mode32 - .p2
-    retfq
-
-bits 32
-  .mode32:
-    pop edi
-    pop esi
-    pop ebp
-    ret
diff --git a/stage23/lib/mem.asm64 b/stage23/lib/mem.asm64
new file mode 100644
index 00000000..42ef1d89
--- /dev/null
+++ b/stage23/lib/mem.asm64
@@ -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
+    jecxz .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/stage23/lib/mem.s2.asm32 b/stage23/lib/mem.s2.asm32
new file mode 100644
index 00000000..4fdd4a12
--- /dev/null
+++ b/stage23/lib/mem.s2.asm32
@@ -0,0 +1,109 @@
+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
+    jecxz .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
+    mov ebp, esp
+
+    push esi
+    push edi
+
+    push 0x28
+    call .p1
+  .p1:
+    add dword [esp], .mode64 - .p1
+    retfd
+
+bits 64
+  .mode64:
+    mov rdi, [rbp + 8]
+    mov rsi, [rbp + 16]
+    mov rcx, [rbp + 24]
+    rep movsb
+
+    push 0x18
+    call .p2
+  .p2:
+    add qword [rsp], .mode32 - .p2
+    retfq
+
+bits 32
+  .mode32:
+    pop edi
+    pop esi
+    pop ebp
+    ret
tab: 248 wrap: offon