aboutsummaryrefslogtreecommitdiff
path: root/compiler/elymasAsmLib.ey
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2013-08-12 23:49:27 +0200
committerDrahflow <drahflow@gmx.de>2013-08-12 23:49:27 +0200
commit6f056dfa3531a9ddea4bc4369f5f19e07ffc85e2 (patch)
treed78baa2edf87070c47ad42961ae0d373c1f5c055 /compiler/elymasAsmLib.ey
parent0133daad6426cc8b50000d79c27de8ebffe34fc9 (diff)
Some optimizations to the allocator
Diffstat (limited to 'compiler/elymasAsmLib.ey')
-rw-r--r--compiler/elymasAsmLib.ey70
1 files changed, 45 insertions, 25 deletions
diff --git a/compiler/elymasAsmLib.ey b/compiler/elymasAsmLib.ey
index c8565ee..0e77994 100644
--- a/compiler/elymasAsmLib.ey
+++ b/compiler/elymasAsmLib.ey
@@ -212,49 +212,66 @@
# /rbx /rbx :xorqRegReg
# rbx == index of cell currently tested
- @startFreeBlockScan
- /rsi /rsi :xorqRegReg
- # rsi > 0 => currently counting block extent of free block
+ /r8 :pushqReg
+ /r9 :pushqReg
+
+ /r8 :movqImmOOBReg BLOCKBASE
+ /r9 :movqImmOOBReg MARKBASE
- @testBlockBitLoop
/rbx /rbp :cmpqRegReg
/noFreeBlockAvailable :jbeLbl32
/rbx /rax :movqRegReg
- 3 /rax :shrqImm8Reg # extract byte
- /rdx :movqImmOOBReg BLOCKBASE
- /rdx /rax /al :movbMemIndexReg
/rbx /rcx :movqRegReg
- 7 /cl :andbImmReg
- /cl :incbReg
- /rax :shrqClReg
+ %3F /rcx :andqImm8Reg # extract bit position in quadword
+ 6 /rax :shrqImm8Reg # extract quadword
+ 6 /rbp :shrqImm8Reg # extract one-after-last quadword
+
+ /rsi /rsi :xorqRegReg
+ # rsi > 0 => currently counting block extent of free block
+
+ @testBlockBitLoop
+ /rcx 8 /rax /r8 :btqRegMemIndexScale # test block bitmap
/nonFreeBlock :jcLbl8 # block not free
/rsi /rsi :andqRegReg
- /currentlyCounting :jnzLbl8
-
- /rbx /rax :movqRegReg
- 3 /rax :shrqImm8Reg # extract byte
- /rdx :movqImmOOBReg MARKBASE
- /rdx /rax /al :movbMemIndexReg
- /rbx /rcx :movqRegReg
- 7 /cl :andbImmReg
- /cl :incbReg
- /rax :shrqClReg
- /nonFreeBlock :jncLbl8 # block not marked, i.e. just block extent
+ /notCurrentlyCounting :jzLbl8
@currentlyCounting
16 /rsi :addqImm8Reg
/rsi /rdi :cmpqRegReg
/freeBlockFound :jbeLbl8
- /rbx :incqReg
- /testBlockBitLoop :jmpLbl8
+ /rcx :incqReg
+ 6 /rcx :btqImm8Reg
+ 0 /rax :adcqImm8Reg
+ %3F /rcx :andqImm8Reg
+ /rax /rbp :cmpqRegReg
+ /testBlockBitLoop :jaLbl8
+ /noFreeBlockAvailable :jmpLbl32
+
+ @notCurrentlyCounting
+ /rcx 8 /rax /r9 :btqRegMemIndexScale # test mark bitmap
+ /currentlyCounting :jcLbl8 # block marked, i.e. truly free block start
@nonFreeBlock
- /rbx :incqReg
- /startFreeBlockScan :jmpLbl8
+ /rsi /rsi :xorqRegReg
+ /rcx :incqReg
+ 6 /rcx :btqImm8Reg
+ 0 /rax :adcqImm8Reg
+ %3F /rcx :andqImm8Reg
+ /rax /rbp :cmpqRegReg
+ /testBlockBitLoop :jaLbl8
+ /noFreeBlockAvailable :jmpLbl32
@freeBlockFound
+ /r9 :popqReg
+ /r8 :popqReg
+
+ 6 /rbp :shlqImm8Reg
+ 6 /rax :shlqImm8Reg
+ /rcx /rax :addqRegReg
+ /rax /rbx :movqRegReg
+
# rdi == size of block to allocate
# rbx == last cell of free block of sufficient size
@@ -353,6 +370,9 @@
:retn
@noFreeBlockAvailable
+ /r9 :popqReg
+ /r8 :popqReg
+
/rax /rax :xorqRegReg
:retn