libasm/ft_list_sort.s

97 lines
1.8 KiB
ArmAsm

global ft_list_sort
ft_list_sort:
push rsp
push rdi ; push begin_list
push rsi ; push cmp_func
push r12 ; callee saved
push r13 ; same
push r14 ; same
push r15
cmp qword [rdi], 0
je .done
mov r12, 0 ; r12 "prev" = NULL
mov r13, [rdi] ; r13 "curr" = begin_list
mov r14, rdi ; r14 begin_list memory
mov r15, rsi
.loop:
cmp qword [r13 + 8], 0 ; if curr->next is null then exit
je .done
mov rdi, [r13] ; first arg is curr->data
mov rsi, [r13 + 8] ; rsi = curr->next;
mov rsi, [rsi] ; rsi = rsi->data;
;push rcx ; rcx is caller saved
;push r13 ; same
; align stack here ?
sub rsp, 72; align stack ???
call r15
add rsp, 72
;pop rdx ; rdx is caller saved
;pop rcx ; rcx is caller saved
cmp eax, 0
jle .else ; if in order continue...
cmp r13, [r14]
je .is_first_elem
mov rdx, [r13 + 8]
mov [r12 + 8], rdx
mov rcx, [r13 + 8]
mov rdx, [rcx + 8]
mov [r13 + 8], rdx
mov rcx, [r12 + 8]
mov [rcx + 8], r13
mov r12, 0
mov r13, [r14]
;mov rcx, [r13 + 8]
;mov rcx, [r13 + 8]
;mov rcx, [rcx + 8]
;mov [r13 + 8], rcx
;mov rcx, [r12 + 8]
;mov rcx, [rcx + 8]
;mov rcx, r13
;mov r12, 0, ; reset prev
;mov r13, [r14] ; reset curr
jmp .loop
.is_first_elem:
;mov r14, [r13 + 8] ; begin_list = curr->next
;mov rcx, [r13 + 8] ; rcx = curr->next
;mov rdx, [rcx + 8] ; rcx = curr->next->next
;mov [r13 + 8], rdx ; curr->next = curr->next->next
;mov [r14 + 8], r13 ; begin_list->next = curr
;mov rdx, [r13 + 8]
mov rcx, [r13 + 8]
mov [r14], rcx
;je .done
mov rcx, [r13 + 8]
mov rdx, [rcx + 8]
mov [r13 + 8], rdx
mov rcx, [r14]
mov [rcx + 8], r13
;jmp .done
mov r12, 0 ; reset prev
mov r13, [r14] ; reset curr
jmp .loop
.else: ; ...here
mov r12, r13 ; prev = curr;
mov r13, [r13 + 8] ; curr = curr->next;
jmp .loop
.done:
pop r15
pop r14
pop r13 ; restore stack and return
pop r12
pop rsi
pop rdi
pop rsp
ret