aboutsummaryrefslogtreecommitdiff
path: root/ft_list_remove_if.s
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-02-08 04:44:12 +0100
committerCharles <sircharlesaze@gmail.com>2020-02-08 21:17:22 +0100
commitfcc8ce8503f42980e6e8ed390363c8e8dc961363 (patch)
tree2c20084aa0db8ea0b913cee02d0342d26f8aade6 /ft_list_remove_if.s
parent56150213f54af9a37abf8a1a719d51eb4491087c (diff)
downloadlibasm-fcc8ce8503f42980e6e8ed390363c8e8dc961363.tar.gz
libasm-fcc8ce8503f42980e6e8ed390363c8e8dc961363.tar.bz2
libasm-fcc8ce8503f42980e6e8ed390363c8e8dc961363.zip
Added ft_list_remove_if
Diffstat (limited to 'ft_list_remove_if.s')
-rw-r--r--ft_list_remove_if.s82
1 files changed, 59 insertions, 23 deletions
diff --git a/ft_list_remove_if.s b/ft_list_remove_if.s
index 9ae6ba5..5a2fd8b 100644
--- a/ft_list_remove_if.s
+++ b/ft_list_remove_if.s
@@ -12,47 +12,83 @@
global _ft_list_remove_if
-; ft_list_remove_if(t_list **begin_list, void *data_ref,
-; int (*cmp)(), void (*free_fct)(void *))
+extern _free
+
+%define NULL 0x0
+
+%macro EXTERN_FUNCTION_SAVE 0
+ push rdi
+ push rsi
+ push rdx
+ push rcx
+%endmacro
+
+%macro EXTERN_FUNCTION_SAVE_END 0
+ pop rcx
+ pop rdx
+ pop rsi
+ pop rdi
+%endmacro
+; ft_list_remove_if(t_list **begin_list, void *data_ref,
+; int (*cmp)(void *data, void *data_ref),
+; void (*free_fct)(void *))
_ft_list_remove_if:
+ ; t_list *saved_next
+
+ ; === prolog ===
+ push rbp
+ mov rbp, rsp
sub rsp, 8
- cmp rdi, 0x0
+ ; === base condition ===
+ cmp rdi, NULL
je FT_LIST_REMOVE_IF_END
- cmp [rdi], 0x0
+ cmp qword [rdi], NULL
je FT_LIST_REMOVE_IF_END
- push rdi
- mov rdi, [rdi] + 8 ;&(*begin_list)->val
- call rdx
- pop rdi
- cmp rax, 0x0
+ ; === compare (*begin_list)->data and data_ref
+ EXTERN_FUNCTION_SAVE
+ mov rdi, [rdi]
+ mov rdi, [rdi + 0]
+ call rdx ; cmp((*begin_list)->data, data_ref)
+ EXTERN_FUNCTION_SAVE_END
+ cmp rax, 0
je FT_LIST_REMOVE_IF_REMOVE
-
- mov rdi, [rdi] + 8
+ ; === next element ===
+ push rdi
+ mov rdi, [rdi]
+ lea rdi, [rdi + 8]
call _ft_list_remove_if
- add rsp, 8
- ret
+ pop rdi
+ jmp FT_LIST_REMOVE_IF_END
+ ; === remove head and go next ===
FT_LIST_REMOVE_IF_REMOVE:
- mov [rsp], [rdi] + 8 ; saved_next = (*begin_list)->next
+ mov rax, [rdi] ; rax = *begin_list
+ mov rax, [rax + 8] ; rax = rax->next
+ mov [rbp - 8], rax ; saved_next = (*begin_list)->next
- push rdi
- mov rdi, [[rdi]]
- call rcx ; free_fct((*begin_list)->data)
- pop rdi
-
- push rdi
+ push rdi ; strange behavior
+ EXTERN_FUNCTION_SAVE
mov rdi, [rdi]
- call _free ; free(*begin_list)
+ mov rdi, [rdi + 0]
+ call rcx ; free_fct((*begin_list)->data)
+ EXTERN_FUNCTION_SAVE_END
pop rdi
- mov [rdi], [rsp] ; *begin_list = saved_next
+ EXTERN_FUNCTION_SAVE
+ mov rdi, [rdi]
+ call _free ; free(*begin_list)
+ EXTERN_FUNCTION_SAVE_END
+ mov rax, [rbp - 8]
+ mov [rdi], rax
call _ft_list_remove_if
FT_LIST_REMOVE_IF_END:
- add rsp, 8
+ ; === epilog ===
+ mov rsp, rbp
+ pop rbp
ret