From 299e06a03eac7c8cf5442b6a071dfd7707822889 Mon Sep 17 00:00:00 2001 From: nub31 Date: Tue, 10 Jun 2025 22:22:49 +0200 Subject: [PATCH] clean up runtime --- src/runtime/baseline/entry.s | 3 ++- src/runtime/baseline/nub_memcpy.s | 32 ++++++++++++++----------------- src/runtime/baseline/nub_memset.s | 29 +++++++++++++--------------- src/runtime/baseline/nub_panic.s | 6 ++---- src/runtime/baseline/nub_strcmp.s | 18 ++++++++--------- src/runtime/core/syscall.s | 2 +- 6 files changed, 40 insertions(+), 50 deletions(-) diff --git a/src/runtime/baseline/entry.s b/src/runtime/baseline/entry.s index 48e1b87..d471b53 100644 --- a/src/runtime/baseline/entry.s +++ b/src/runtime/baseline/entry.s @@ -2,9 +2,10 @@ .extern main .section .text -.globl _start +.global _start _start: mov rdi, rsp + # main([]^string): i64 call main mov rdi, rax mov rax, 60 diff --git a/src/runtime/baseline/nub_memcpy.s b/src/runtime/baseline/nub_memcpy.s index cfe960d..9fdf4b6 100644 --- a/src/runtime/baseline/nub_memcpy.s +++ b/src/runtime/baseline/nub_memcpy.s @@ -1,24 +1,20 @@ .intel_syntax noprefix .section .text -# Memory copy function -# Arguments: rdi = destination, rsi = source, rdx = count -# Returns: rdi (original destination pointer) -.globl nub_memcpy +# func nub_memcpy(destination: ^u8, source: ^u8, count: u64): ^u8 +.global nub_memcpy nub_memcpy: - push rdi # Save original destination for return value - mov rcx, rdx # Load count into counter register - # Handle zero count case + push rdi + mov rcx, rdx test rcx, rcx - jz .done - # Simple byte-by-byte copy (no overlap handling) -.loop: - mov al, BYTE PTR [rsi] # Load byte from source - mov BYTE PTR [rdi], al # Store byte to destination - inc rsi # Move to next source byte - inc rdi # Move to next destination byte - dec rcx # Decrement counter - jnz .loop # Continue if counter not zero -.done: - pop rax # Return original destination pointer + jz memcpy_done +memcpy_loop: + mov al, BYTE PTR [rsi] + mov BYTE PTR [rdi], al + inc rsi + inc rdi + dec rcx + jnz memcpy_loop +memcpy_done: + pop rax ret diff --git a/src/runtime/baseline/nub_memset.s b/src/runtime/baseline/nub_memset.s index 18a64c3..4c29263 100644 --- a/src/runtime/baseline/nub_memset.s +++ b/src/runtime/baseline/nub_memset.s @@ -1,22 +1,19 @@ .intel_syntax noprefix .section .text -# Memory set function -# Arguments: rdi = destination pointer, rsi = value (byte), rdx = count -# Returns: rdi (original destination pointer) -.globl nub_memset +# func nub_memset(destination: ^u8, value: i8, count: u64): ^u8 +.global nub_memset nub_memset: - push rdi # Save original destination for return value - mov rcx, rdx # Load count into counter register - mov al, sil # Move byte value to al (lower 8 bits of rsi) - # Handle zero count case + push rdi + mov rcx, rdx + mov al, sil test rcx, rcx - jz .done -.loop: - mov BYTE PTR [rdi], al # Store byte at current position - inc rdi # Move to next byte - dec rcx # Decrement counter - jnz .loop # Continue if counter not zero -.done: - pop rax # Return original destination pointer + jz memset_done +memset_loop: + mov BYTE PTR [rdi], al + inc rdi + dec rcx + jnz memset_loop +memset_done: + pop rax ret diff --git a/src/runtime/baseline/nub_panic.s b/src/runtime/baseline/nub_panic.s index 97a5d6f..66e643f 100644 --- a/src/runtime/baseline/nub_panic.s +++ b/src/runtime/baseline/nub_panic.s @@ -1,10 +1,8 @@ .intel_syntax noprefix .section .text -# Panic function with message -# Arguments: rdi = message (*char), rsi = message length (long) -# Remarks: exits the program -.globl nub_panic +# func nub_panic(message: ^u8, message_length: u64): void +.global nub_panic nub_panic: mov rdx, rsi mov rsi, rdi diff --git a/src/runtime/baseline/nub_strcmp.s b/src/runtime/baseline/nub_strcmp.s index 6990b1b..da502ec 100644 --- a/src/runtime/baseline/nub_strcmp.s +++ b/src/runtime/baseline/nub_strcmp.s @@ -1,24 +1,22 @@ .intel_syntax noprefix .section .text -# String comparison function null-terminated strings -# Arguments: rdi = lhs (*char), rsi = rhs (*char) -# Returns: 1 if equal, else 0 -.globl nub_strcmp +# func nub_strcmp(lhs: ^u8, rhs: ^u8): bool +.global nub_strcmp nub_strcmp: xor rdx, rdx -.loop: +strcmp_loop: mov al, BYTE PTR [rsi + rdx] mov bl, BYTE PTR [rdi + rdx] inc rdx cmp al, bl - jne .not_equal + jne strcmp_not_equal cmp al, 0 - je .equal - jmp .loop -.not_equal: + je strcmp_equal + jmp strcmp_loop +strcmp_not_equal: mov rax, 0 ret -.equal: +strcmp_equal: mov rax, 1 ret diff --git a/src/runtime/core/syscall.s b/src/runtime/core/syscall.s index a4a368b..d68df95 100644 --- a/src/runtime/core/syscall.s +++ b/src/runtime/core/syscall.s @@ -1,5 +1,5 @@ .intel_syntax noprefix -.globl core_syscall +.global core_syscall .section .text core_syscall: