aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.s4
-rwxr-xr-x[-rw-r--r--]src/qsort.s124
2 files changed, 70 insertions, 58 deletions
diff --git a/src/main.s b/src/main.s
index bad6042..9c04823 100644
--- a/src/main.s
+++ b/src/main.s
@@ -15,8 +15,8 @@ _start:
# Sort
movq %rax, %rdi # Select address of array
- movq %r15, %rsi # Select length of array
- decq %rsi
+ leaq -1(%r15), %rcx # Select length of array -1 as high
+ xorq %rsi, %rsi # low = 0
movq $1, %rdx # Sort by key 1
call qsort # Sort the array
diff --git a/src/qsort.s b/src/qsort.s
index 233ec34..564a25e 100644..100755
--- a/src/qsort.s
+++ b/src/qsort.s
@@ -4,102 +4,114 @@
# based on the given key in A_i,
# address and size of A.
# INPUTS : rdi = address for A
-# rsi = number of coordinates n
+# rsi = low
# rdx = index of key to sort by
+# rcx = high
# OUTPUTS : rax = address for sorted A
-# CLOBBERS: none
+# NOTES : preserves rdi, rdx
# --------------------------------------------
.section .text
.globl qsort
.type qsort, @function
qsort:
- pushq %rbx
pushq %r12
pushq %r13
+ pushq %r14
- cmp $1, %rsi
- jle .qsort_done
+ 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
- movq %rdi, %r12 # r12 = original array pointer
- movq %rsi, %r13 # r13 = original length
- call hoare_part
- movq %rax, %rbx # rbx = partition
+ call hoare_part # rax = p
- # --- left recursion ---
- movq %r12, %rdi
- movq %rbx, %rsi # n = p
- call qsort
+ movq %rsi, %r12 # save low
+ movq %rcx, %r13 # save high
+ movq %rax, %r14 # save p
- # --- right recursion ---
- leaq 1(%rbx), %rax # rax = p + 1
- leaq (%r12, %rax, 8), %rdi # rdi = A + (p + 1)
- movq %r13, %rsi # rsi = original length
- subq %rax, %rsi # rsi = n - (p + 1)
+# --- 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
-.qsort_done:
- movq %r12, %rax # just returning the same buffer
- popq %r13 # as quicksort is inplace
+ popq %r14
+ popq %r13
popq %r12
- popq %rbx
ret
# --------------------------------------------
# FUNCTION: hoare_part
-# PURPOSE :
+# 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 = number of coordinates n
+# rsi = low
# rdx = index of key to sort by
-# OUTPUTS : rax = Returns the partition index
-# for quicksort.
-# NOTES : rdx is preserved
+# rcx = high
+# OUTPUTS : rax = address for sorted A
+# NOTES : preserves rdi, rdx
# --------------------------------------------
+.section .text
.globl hoare_part
.type hoare_part, @function
-hoare_part:
+hoare_part:
pushq %rbx
pushq %r12
pushq %r13
pushq %r14
- movq $-1, %rax # i = -1
- leaq 1(%rsi), %rbx # j = n + 1
- movq (%rdi), %r12 # pivot pointer = A[0]
- movq (%r12, %rdx, 8), %r13 # value of pivot
+ leaq -1(%rsi), %rax # i = low - 1
+ leaq 1(%rcx), %rbx # j = high + 1
-.hoare_loop:
-# increment i
-.hoare_Li:
+ # 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), %r12
- movq (%r12, %rdx, 8), %r12 # value of arr[i]
- cmpq %r13, %r12 # if arr[i] < pivot
- jl .hoare_Li
-
-# decrement j
-.hoare_Lj:
+ 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), %r12 # r12 = arr[j]
- movq (%r12, %rdx, 8), %r12 # value of arr[j]
- cmpq %r13, %r12 # if arr[j] > pivot
- jg .hoare_Lj
+ movq (%rdi, %rbx, 8), %r13 # &A[j]
+ movq (%r13, %rdx, 8), %r13 # A[j][idx]
- # check crossing
- cmpq %rbx, %rax # if i >= j
- jge .hoare_done
-
- # swap a[i] and a[j]
- movq (%rdi, %rax, 8), %r12
+ 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 %r12, (%rdi, %rbx, 8)
+ movq %r13, (%rdi, %rbx, 8)
+
+ jmp .hoare_part_left
- jmp .hoare_loop
+.hoare_part_done:
+ movq %rbx, %rax # return j as partion index
-.hoare_done:
- movq %rbx, %rax # return j as pivot
popq %r14
popq %r13
popq %r12