diff options
| author | Andreas Kapp Lindquist <andkaplin05@gmail.com> | 2025-10-28 10:58:47 +0100 |
|---|---|---|
| committer | mithe24 <mithe24@student.sdu.dk> | 2025-10-29 13:49:57 +0100 |
| commit | fe3b403d5788c3ead9391d02a95c4684daab0272 (patch) | |
| tree | 9a01fdc8d0966b031121aa41cac5d27613d987d6 /src/qsort.s | |
| parent | c9e74c0f7ddcc9b53a857ebca331998b1470ba7c (diff) | |
| download | sorter-fe3b403d5788c3ead9391d02a95c4684daab0272.tar.gz sorter-fe3b403d5788c3ead9391d02a95c4684daab0272.zip | |
refactor(quicksort): renamed to qsort to quicksort and added helper function for better interface
Diffstat (limited to 'src/qsort.s')
| -rwxr-xr-x | src/qsort.s | 119 |
1 files changed, 0 insertions, 119 deletions
diff --git a/src/qsort.s b/src/qsort.s deleted file mode 100755 index 564a25e..0000000 --- a/src/qsort.s +++ /dev/null @@ -1,119 +0,0 @@ -# -------------------------------------------- -# FUNCTION: qsort -# PURPOSE : Sorts array A, with references to arrays A_i, -# based on the given key in A_i, -# address and size of A. -# INPUTS : rdi = address for A -# rsi = low -# rdx = index of key to sort by -# rcx = high -# OUTPUTS : rax = address for sorted A -# NOTES : preserves rdi, rdx -# -------------------------------------------- -.section .text -.globl qsort -.type qsort, @function -qsort: - pushq %r12 - pushq %r13 - pushq %r14 - - cmpq $0, %rsi # if 0 < low - jl .qsort_exit - cmpq $0, %rcx # if 0 < high - jl .qsort_exit - cmpq %rcx, %rsi # if high < low - jge .qsort_exit - - call hoare_part # rax = p - - movq %rsi, %r12 # save low - movq %rcx, %r13 # save high - movq %rax, %r14 # save p - -# --- left recursion --- - movq %r12, %rsi # low - movq %r14, %rcx # high = p - call qsort - -# --- right recursion --- - leaq 1(%r14), %rsi # low = p + 1 - movq %r13, %rcx # high - call qsort - -.qsort_exit: - movq %rdi, %rax - - popq %r14 - popq %r13 - popq %r12 - ret - -# -------------------------------------------- -# FUNCTION: hoare_part -# PURPOSE : Sorts array A, with references to arrays A_i, -# based on the given key in A_i, -# address and size of A. -# INPUTS : rdi = address for A -# rsi = low -# rdx = index of key to sort by -# rcx = high -# OUTPUTS : rax = address for sorted A -# NOTES : preserves rdi, rdx -# -------------------------------------------- -.section .text -.globl hoare_part -.type hoare_part, @function -hoare_part: - pushq %rbx - pushq %r12 - pushq %r13 - pushq %r14 - - leaq -1(%rsi), %rax # i = low - 1 - leaq 1(%rcx), %rbx # j = high + 1 - - # r12 = pivot - movq (%rdi, %rsi, 8), %r12 # &A[low] - movq (%r12, %rdx, 8), %r12 # A[low][idx] - -# left index -.hoare_part_left: - incq %rax - - movq (%rdi, %rax, 8), %r13 # &A[i] - movq (%r13, %rdx, 8), %r13 # A[i][idx] - - cmpq %r12, %r13 # while pivot < A[i][idx] - jl .hoare_part_left - -# right index -.hoare_part_right: - decq %rbx - - movq (%rdi, %rbx, 8), %r13 # &A[j] - movq (%r13, %rdx, 8), %r13 # A[j][idx] - - cmpq %r12, %r13 # while pivot > A[j][idx] - jg .hoare_part_right - -# check crossing - cmpq %rbx, %rax # i >= j - jge .hoare_part_done - -# swap A[i] and A[j] - movq (%rdi, %rax, 8), %r13 - movq (%rdi, %rbx, 8), %r14 - movq %r14, (%rdi, %rax, 8) - movq %r13, (%rdi, %rbx, 8) - - jmp .hoare_part_left - -.hoare_part_done: - movq %rbx, %rax # return j as partion index - - popq %r14 - popq %r13 - popq %r12 - popq %rbx - ret |