summaryrefslogtreecommitdiffstats
path: root/src/isa-l/igzip/heap_macros.asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/isa-l/igzip/heap_macros.asm')
-rw-r--r--src/isa-l/igzip/heap_macros.asm69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/isa-l/igzip/heap_macros.asm b/src/isa-l/igzip/heap_macros.asm
new file mode 100644
index 00000000..e41baf97
--- /dev/null
+++ b/src/isa-l/igzip/heap_macros.asm
@@ -0,0 +1,69 @@
+; heapify heap, heap_size, i, child, tmp1, tmp2, tmpd
+%macro heapify2 7
+%define %%heap %1 ; qword ptr
+%define %%heap_size %2 ; dword
+%define %%i %3 ; dword
+%define %%child %4 ; dword
+%define %%tmp1 %5 ; qword
+%define %%tmp2 %6 ; qword
+%define %%tmpd %7 ; dword
+ align 16
+%%heapify1:
+ lea %%child, [%%i + %%i]
+ cmp %%child, %%heap_size
+ ja %%end_heapify1
+ mov %%tmp1, [%%heap + %%child]
+ mov %%tmpd, %%child
+ mov %%tmp2, [%%heap + %%child) + 8]
+ lea %%child, [%%child + 1]
+ cmove %%tmp2, %%tmp1
+ cmp %%tmp1, %%tmp2
+ cmovbe %%child, %%tmpd
+ cmovbe %%tmp2, %%tmp1
+ ; child is correct, %%tmp2 = heap[child]
+ mov %%tmp1, [%%heap + %%i]
+ cmp %%tmp1, %%tmp2
+ jbe %%end_heapify1
+ mov [%%heap + %%i], %%tmp2
+ mov [%%heap + %%child], %%tmp1
+ mov %%i, %%child
+ jmp %%heapify1
+%%end_heapify1
+%endm
+
+; heapify heap, heap_size, i, child, tmp1, tmp2, tmpd, tmp3
+%macro heapify 8
+%define %%heap %1 ; qword ptr
+%define %%heap_size %2 ; qword
+%define %%i %3 ; qword
+%define %%child %4 ; qword
+%define %%tmp1 %5 ; qword
+%define %%tmp2 %6 ; qword
+%define %%tmpd %7 ; qword
+%define %%tmp3 %8
+ align 16
+%%heapify1:
+ lea %%child, [%%i + %%i]
+; mov %%child, %%i
+; add %%child, %%child
+ cmp %%child, %%heap_size
+ ja %%end_heapify1
+ mov %%tmp1, [%%heap + %%child*8]
+ mov %%tmp2, [%%heap + %%child*8 + 8]
+ mov %%tmp3, [%%heap + %%i*8]
+ mov %%tmpd, %%child
+ add %%tmpd, 1
+
+ cmp %%tmp2, %%tmp1
+ cmovb %%child, %%tmpd
+ cmovb %%tmp1, %%tmp2
+ ; child is correct, tmp1 = heap[child]
+ cmp %%tmp3, %%tmp1
+ jbe %%end_heapify1
+ ; swap i and child
+ mov [%%heap + %%i*8], %%tmp1
+ mov [%%heap + %%child*8], %%tmp3
+ mov %%i, %%child
+ jmp %%heapify1
+%%end_heapify1:
+%endm