vec_insert_many

This commit is contained in:
janis 2025-11-01 00:08:44 +01:00
parent 9509931bc2
commit 1adeca36ec
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8

View file

@ -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