diff options
| author | Drahflow <drahflow@gmx.de> | 2015-06-08 15:21:44 +0200 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2015-06-08 15:21:44 +0200 |
| commit | 95b067821b5d6d2a8b2ce8c7ff54a5b764154c7c (patch) | |
| tree | 6c7179b7c690976c66a8e854b02ce3e7cd8cb6ce /compiler | |
| parent | e7a57a28b61fe4d4bc1cea55e9bfb40c45ebe4cd (diff) | |
Improved inner alloc loop
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/elymasAsmLib.ey | 22 |
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 |
