vec_insert_many
This commit is contained in:
parent
9509931bc2
commit
1adeca36ec
|
|
@ -23,6 +23,7 @@ global vec_get_or
|
||||||
global vec_drop
|
global vec_drop
|
||||||
global vec_find
|
global vec_find
|
||||||
global vec_insert
|
global vec_insert
|
||||||
|
global vec_insert_many
|
||||||
global vec_insert_sorted
|
global vec_insert_sorted
|
||||||
global vec_binary_search_by
|
global vec_binary_search_by
|
||||||
|
|
||||||
|
|
@ -482,7 +483,7 @@ vec_find:
|
||||||
;; rdi: pointer to Vec struct
|
;; rdi: pointer to Vec struct
|
||||||
;; rsi : index
|
;; rsi : index
|
||||||
;; rdx: pointer to data to insert
|
;; 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:
|
vec_insert:
|
||||||
push rbp
|
push rbp
|
||||||
mov rbp, rsp
|
mov rbp, rsp
|
||||||
|
|
@ -530,6 +531,65 @@ vec_insert:
|
||||||
pop rbp
|
pop rbp
|
||||||
ret
|
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
|
;; rdi: pointer to Vec struct
|
||||||
;; rsi: pointer to key
|
;; rsi: pointer to key
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue