diff --git a/lang/src/vec.asm b/lang/src/vec.asm index 4a21e6c..86c096b 100644 --- a/lang/src/vec.asm +++ b/lang/src/vec.asm @@ -23,6 +23,7 @@ global vec_get_or global vec_drop global vec_find global vec_insert +global vec_insert_many global vec_insert_sorted global vec_binary_search_by @@ -482,7 +483,7 @@ vec_find: ;; rdi: pointer to Vec struct ;; rsi : index ;; rdx: pointer to data to insert -;; fn vec_insert(vec: *mut Vec, index: usize, data: *const T, size: usize) +;; fn vec_insert(vec: *mut Vec, index: usize, data: *const T) vec_insert: push rbp mov rbp, rsp @@ -530,6 +531,65 @@ vec_insert: pop rbp ret +;; rdi: pointer to Vec struct +;; rsi : index +;; rdx: pointer to data to insert +;; rcx: count +;; define-fn: fn vec_insert_many(vec: *mut BlobVec, index: usize, data: *const u8, count: usize) +vec_insert_many: + push rbp + mov rbp, rsp + push r12 + push rbx + sub rsp, 0x20 + mov [rsp], rdi ; save vec + mov [rsp + 8], rsi ; save index + mov [rsp + 0x10], rdx ; save data ptr + mov [rsp + 0x18], rcx ; save count + + mov rsi, [rdi + 8] + add rsi, rcx ; len + count + call vec_try_grow + + mov rbx, [rsp] ; vec + mov rdi, [rbx] ; vec.data + mov rcx, [rbx + 24] ; item_size + mov rdx, [rbx + 8] ; len + sub rdx, [rsp + 8] ; len - index + mov rax, rdx + mul rcx ; (len - index) * item_size + mov r12, rax ; number of bytes to move + mov rsi, [rbx] ; vec.data + mov rax, [rsp + 8] ; index + mov rcx, [rbx + 24] ; item_size + mul rcx ; index * item_size + add rsi, rax ; src ptr + mov rdi, rsi + + mov rax, [rsp + 18] ; count + mul rcx ; count * item_size + add rdi, rcx ; dst ptr + mov rdx, r12 ; number of bytes to move + call memmove + + mov rdi, rsi + mov rsi, [rsp + 0x10] + mov rdx, [rsp + 0x18] ; count + mov rax, [rbx + 24] ; item_size + mul rdx ; count * item_size + mov rax, rdx + call memcpy + + mov rax, [rbx + 8] ; len + add rax, [rsp + 0x18] ; len += count + mov [rbx + 8], rax + + add rsp, 32 + pop rbx + pop r12 + pop rbp + ret + ;; rdi: pointer to Vec struct ;; rsi: pointer to key