aboutsummaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2013-09-22 22:56:05 +0200
committerDrahflow <drahflow@gmx.de>2013-09-22 22:56:05 +0200
commitbd4fe14e2a77ceac5c8c234de05c514fdd6d7bf4 (patch)
tree4c3183835b0fa970f63898c5d562864806d0ce0e /compiler
parent65b530782c309fa7bd9b3781f23a0ce0a3b29a3b (diff)
Faster name resolution
Diffstat (limited to 'compiler')
-rw-r--r--compiler/elymasAsmLib.ey57
1 files changed, 32 insertions, 25 deletions
diff --git a/compiler/elymasAsmLib.ey b/compiler/elymasAsmLib.ey
index 0cb2c6e..b221b3b 100644
--- a/compiler/elymasAsmLib.ey
+++ b/compiler/elymasAsmLib.ey
@@ -769,11 +769,12 @@
[[
/rax /rax :xorqRegReg
/rax :pushqReg
+ /rdi :pushqReg
+ /rsi :pushqReg
@retryWithParent
# CHECK this is just sanity checking
- /rdi :pushqReg
7 /rdi /al :movbMemDisp8Reg
%F0 /al :andbImmReg
%20 /al :cmpbImmReg
@@ -783,51 +784,57 @@
:ud2
@isScope
- /rdi :popqReg
# ENDCHECK
- 8 /rdi /rcx :movqMemDisp8Reg # load name table
- /rcx /rdx :movqRegReg
- 16 /rdx :addqImm8Reg # rdx will iterate over entries
- 8 /rcx /rcx :addqMemDisp8Reg # compute name table effective end
+ 8 /rdi /rbp :movqMemDisp8Reg # load name table
+ 16 /rbp /rdx :leaqMemDisp8Reg # rdx will iterate over entries
+ 8 /rbp /rbp :addqMemDisp8Reg # compute name table effective end
+ /rsi /rax :movqRegReg
- @loop
- /rdx /rcx :cmpqRegReg
+ /rdx /rbp :cmpqRegReg
/end :jbeLbl8
- # TODO this is ridiculous
- /rdi :pushqReg
- /rsi :pushqReg
- /rdx :pushqReg
- /rcx :pushqReg
- /rdx /rdi :movqMemReg
- internalStringEqualsCode _ len dearray
- /rcx :popqReg
- /rdx :popqReg
- /rsi :popqReg
- /rdi :popqReg
-
- /rax /rax :testqRegReg
- /found :jnzLbl8
+ @loop
+ /rdx /rdi :movqMemReg
+ 16 /rax /rcx :movqMemDisp8Reg # load exact length
+ 16 /rdi /rdi :leaqMemDisp8Reg
+ 16 /rax /rsi :leaqMemDisp8Reg
+ :cmpsq # same exact length
+ /fail :jnzLbl8
+ :repz :cmpsb
+ /found :jzLbl8
+
+ @fail
16 /rdx :addqImm8Reg
- /loop :jmpLbl8
- @end
+ /rdx /rbp :cmpqRegReg
+ /loop :jaLbl8
+ @end
# not found at all, retry with parent
+ /rsi :popqReg
+ /rdi :popqReg
/rax :popqReg
+
/rax :incqReg
- /rax :pushqReg
16 /rdi /rdi :movqMemDisp8Reg
/rdi /rdi :testqRegReg
+
+ /rax :pushqReg
+ /rdi :pushqReg
+ /rsi :pushqReg
/retryWithParent :jnzLbl8
@failed
+ /rsi :popqReg
+ /rdi :popqReg
/rax :popqReg
/rax /rax :xorqRegReg
/rdx /rdx :xorqRegReg
:retn
@found
+ /rsi :popqReg # rsi == name to resolve
+ /rdi :popqReg # rdi == scope we are resolving in
# top of stack -> number of parent pointers followed
8 /rdx /rax :movqMemDisp8Reg # load default activation