1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
; **************************************************************************** ;
; ;
; ::: :::::::: ;
; ft_list_sort.s :+: :+: :+: ;
; +:+ +:+ +:+ ;
; By: cacharle <marvin@42.fr> +#+ +:+ +#+ ;
; +#+#+#+#+#+ +#+ ;
; Created: 2019/11/22 21:03:52 by cacharle #+# #+# ;
; Updated: 2019/11/22 21:27:27 by cacharle ### ########.fr ;
; ;
; **************************************************************************** ;
global _ft_list_sort
; void ft_list_sort(t_list **begin_list, int (*cmp)());
_ft_list_sort:
; t_list *fast
; t_list *slow
; t_list *middle
sub rsp, 24
cmp rdi, 0x0
je FT_LIST_SORT_END
cmp [rdi], 0x0
je FT_LIST_SORT_END
cmp [[rdi] + 8], 0x0 ; use tmp register
je FT_LIST_SORT_END
mov [rsp], [[rdi] + 8]
mov [rsp + 8], [rdi]
FT_GET_MIDDLE_LOOP:
mov [rsp], [rsp + 8]
cmp [rsp], 0x0
je FT_GET_MIDDLE_LOOP_END
mov [rsp], [rsp + 8]
mov [rsp + 8], [[rsp + 8] + 8] ; i want c pointers back plz
FT_GET_MIDDLE_LOOP_END:
mov [rsp + 16], [[rsp + 8] + 8]
mov [[rsp + 8] + 8], 0x0
push rdi
call _ft_list_sort
pop rdi
push rdi
mov rdi, [rsp + 16]
call _ft_list_sort
pop rdi
push rdi
push rsi
mov rdx, rsi
mov rdi, [rdi]
mov rsi, [rsp + 16]
call _merge_sorted_list
pop rsi
pop rdi
mov [rdi], rax
add rsp, 24
FT_LIST_SORT_END:
ret
; t_list *merge_sorted_list(t_list* l1, t_list* l2, int (*cmp)())
_merge_sorted_list:
sub rsp, 8
cmp rdi, 0x0
je MERGE_SORTED_LIST_RETURN_L2
cmp rsi, 0x0
je MERGE_SORTED_LIST_RETURN_L1
push rdi
push rsi
mov rdi, [rdi]
mov rsi, [rsi]
call rdx ; cmp
pop rsi
pop rdi
cmp rax, 0x0
jl L1_LT_L2
; L1_GE_L2
mov rsp, rsi
push rdi
push rsi
mov rdi, [rdi + 8]
call _merge_sorted_list
pop rsi
pop rdi
mov [rsp + 8], rax
jmp MERGE_SORTED_LIST_END
L1_LT_L2:
mov rsp, rdi
push rdi
push rsi
mov rsi, [rsi + 8]
call _merge_sorted_list
pop rsi
pop rdi
mov [rsp + 8], rax
MERGE_SORTED_LIST_END:
mov rax, [rsp]
add rsp, 8
ret
MERGE_SORTED_LIST_RETURN_L1:
mov rax, rdi
ret
MERGE_SORTED_LIST_RETURN_L2:
mov rax, rsi
ret
|