From 4d14307c9a3e45ffbf0fc14805da065c4bb66fe8 Mon Sep 17 00:00:00 2001 From: Drahflow Date: Fri, 22 May 2015 21:19:56 +0200 Subject: Make use of oversized freelist blocks --- TODO | 4 +++- compiler/elymasAsmLib.ey | 38 +++++++++++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/TODO b/TODO index a27f07b..ee7575d 100644 --- a/TODO +++ b/TODO @@ -1,4 +1,3 @@ -* make '' applicable to arrays, too, i.e. save input type * utf8 * regex substitution * asm-based regex engine @@ -6,9 +5,12 @@ * txt .consume .u sollte nicht negative Zahlen liefern * evtl. BigNums bauen und die Int-Funktionen entsprechend machen * trigonometrics +* make jmp-pads after optimization rewrite call site if ... /rax movqImmReg; /rax :callqReg pattern * testsuite (incl. coverage test) +* make '' applicable to arrays, too, i.e. save input type + * consider polymorphic call-site caches instead of deffs_t_ / deffs? * eliminate all FIXMEs 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 -- cgit v1.2.3