aboutsummaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2015-06-08 15:21:44 +0200
committerDrahflow <drahflow@gmx.de>2015-06-08 15:21:44 +0200
commit95b067821b5d6d2a8b2ce8c7ff54a5b764154c7c (patch)
tree6c7179b7c690976c66a8e854b02ce3e7cd8cb6ce /compiler
parente7a57a28b61fe4d4bc1cea55e9bfb40c45ebe4cd (diff)
Improved inner alloc loop
Diffstat (limited to 'compiler')
-rw-r--r--compiler/elymasAsmLib.ey22
1 files changed, 10 insertions, 12 deletions
diff --git a/compiler/elymasAsmLib.ey b/compiler/elymasAsmLib.ey
index 33c58de..ff24031 100644
--- a/compiler/elymasAsmLib.ey
+++ b/compiler/elymasAsmLib.ey
@@ -549,20 +549,26 @@
@freeBlockStartFound
%C0 /rbx :andqImm8Reg
/rax /rbx :addqRegReg
+ 8 /rdi /rcx :leaqMemDisp8Reg
+ 4 /rcx :shrqImm8Reg # rcx == number of cells needed overall
+ 1 neg 1 /rbx /rcx /rcx :leaqMemIndexScaleDisp8Reg # rcx == last cell we need to allocate
+ /rcx /rbp :cmpqRegReg
+ /noFreeBlockAvailable :jbeLbl32 # not enough space remaining on heap
+
/rbx /rdx :movqRegReg
@freeBlockContinues
- 16 /rsi :addqImm8Reg
- /rsi /rdi :cmpqRegReg
+ /rbx /rcx :cmpqRegReg
/freeBlockFound :jbeLbl8
/rbx :incqReg
- /rbx /rbp :cmpqRegReg
- /noFreeBlockAvailable :jbeLbl32
/rbx /r8 :btqRegMem # test block bitmap
/blockTooSmall :jcLbl8 # block not free
/rbx /r9 :btrqRegMem # reset mark bit to reconnect free blocks
/freeBlockContinues :jmpLbl8
@blockTooSmall
+ /rbx /rsi :movqRegReg
+ /rdx /rsi :subqRegReg
+ 4 /rsi :shlqImm8Reg # rsi == length of free block
4 /rdx :shlqImm8Reg
/rax :movqImmOOBReg HEAPBASE
/rax /rdx :addqRegReg # rdx == start of empty block in heap
@@ -572,18 +578,10 @@
freeLists /rsi :movqImmReg
8 /rax /rsi /rcx :leaqMemIndexScaleReg # load correct freelist start
/rcx /rsi :movqMemReg
- /rsi /rsi :testqRegReg
- /freeListEmpty :jzLbl8
-
/rsi /rdx :movqRegMem # save old freelist start into heap
/rdx /rcx :movqRegMem # save freelist entry
/resumeFreeBlockStartSearch :jmpLbl32
- @freeListEmpty
- 0 /rdx :andqImm8Mem # put zero into heap to signal end of list
- /rdx /rcx :movqRegMem # save freelist entry
- /resumeFreeBlockStartSearch :jmpLbl32
-
@freeBlockFound
# rdi == size of block to allocate
# rbx == last cell of free block of sufficient size