aboutsummaryrefslogtreecommitdiff
path: root/compiler/elymasAsmLib.ey
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2015-05-22 21:19:56 +0200
committerDrahflow <drahflow@gmx.de>2015-05-22 21:19:56 +0200
commit4d14307c9a3e45ffbf0fc14805da065c4bb66fe8 (patch)
tree63a955b6665864ff3befe62c6c0cfdb971ff6efb /compiler/elymasAsmLib.ey
parentdc1b399ed2e7e144930dbbf0a22bd2baa9e4dc7a (diff)
Make use of oversized freelist blocks
Diffstat (limited to 'compiler/elymasAsmLib.ey')
-rw-r--r--compiler/elymasAsmLib.ey38
1 files changed, 37 insertions, 1 deletions
diff --git a/compiler/elymasAsmLib.ey b/compiler/elymasAsmLib.ey
index fac9efc..4cabaf7 100644
--- a/compiler/elymasAsmLib.ey
+++ b/compiler/elymasAsmLib.ey
@@ -375,7 +375,7 @@
:retn
# free lists are accumulated during searchForFreeBlock when small blocks are skipped
- # they always point downwards in the heap and are terminated by a null pointer
+ # they are terminated by a null pointer
# only cells below unusedHeapStart may be present in the free lists
@takeFromFreelist
@@ -389,12 +389,47 @@
/rcx /rax :movqMemReg # load entry
/rax /rax :testqRegReg
/freeListUseful :jnzLbl8
+
+ 3 {
+ 8 /rcx :addqImm8Reg
+ /rcx /rax :movqMemReg # load entry
+ /rax /rax :testqRegReg
+ /freeListUseful :jnzLbl8
+ } rep # try some larger freelists
+
:retn
@freeListUseful
+ # rdi == requested size
+ # rax == start of free block on heap
+ # rcx == global freelist starts slot
+
/rax /rdx :movqMemReg # load next entry of free list
/rdx /rcx :movqRegMem # and save into global freelist starts
+ 8 /rax /rsi :movqMemDisp8Reg # load length of free block
+ /rdi /rsi :subqRegReg # substract requested size
+ %F0 /rsi :andqImm8Reg # reset lower 4 bit
+ /returnFreeListBlock :jzLbl8
+
+ /rax /rdi /rdx :leaqMemIndexReg
+ 8 /rdx :addqImm8Reg
+ %F0 /rdx :andqImm8Reg # align on 16 byte cell
+
+ # rdx == start of remaining block
+ # rsi == length of remaining block
+
+ /rsi 8 /rdx :movqRegMemDisp8 # save remaining size
+
+ /rsi /rbp :bsrqRegReg # compute log_2(rsi)
+ freeLists /rsi :movqImmReg
+ 8 /rbp /rsi /rcx :leaqMemIndexScaleReg # load correct freelist start
+ /rcx /rsi :movqMemReg
+ /rsi /rdx :movqRegMem # save old freelist start into heap
+ /rdx /rcx :movqRegMem # save freelist entry
+
+ @returnFreeListBlock
+
# rdi == requested size
# rax == start of free block on heap
@@ -496,6 +531,7 @@
4 /rdx :shlqImm8Reg
/rax :movqImmOOBReg HEAPBASE
/rax /rdx :addqRegReg # rdx == start of empty block in heap
+ /rsi 8 /rdx :movqRegMemDisp8 # save length of free block into heap
/rsi /rax :bsrqRegReg # compute log_2(rsi)
freeLists /rsi :movqImmReg