aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2015-05-13 15:05:07 +0200
committerDrahflow <drahflow@gmx.de>2015-05-13 15:05:07 +0200
commitec762220e5ec0785b8860af226fa517aac8494bc (patch)
treed30db40fc45ccdd8bf4c3d00aa6b9abb894c737d
parent505524b45f59263fb29057e829b9a39ef86e0e99 (diff)
Now with 57% less runtime
-rw-r--r--compiler/elymasAsmLib.ey19
-rw-r--r--compiler/elymasGlobal.ey12
-rw-r--r--elymas/lib/sys/opt.ey42
3 files changed, 62 insertions, 11 deletions
diff --git a/compiler/elymasAsmLib.ey b/compiler/elymasAsmLib.ey
index fdf97b8..ce5ffcf 100644
--- a/compiler/elymasAsmLib.ey
+++ b/compiler/elymasAsmLib.ey
@@ -938,8 +938,17 @@
@allocateFromSystem
heapSize /rax :movqImmReg
/rax /rdi :movqMemReg
- ALLOCCHUNKSIZE /rsi :movqImmReg # size of new block
+ ALLOCCHUNKSIZE /rax :movqImmReg # minimum size of new block
+ /rdi /rcx :movqRegReg
+ 24 /rcx :shrqImm8Reg
+ /rcx :incqReg
+ /rdx /rdx :xorqRegReg
+ /rcx :mulqReg # allocate more if heap is already large
+ /rax /rsi :movqRegReg
+ /rsi :pushqReg
+
/rsi /rdi :addqRegReg
+ heapSize /rax :movqImmReg
/rdi /rax :movqRegMem
/rsi /rdi :subqRegReg
/rax :movqImmOOBReg HEAPBASE
@@ -950,7 +959,11 @@
heapSize /rax :movqImmReg
/rax /rdi :movqMemReg
7 /rdi :shrqImm8Reg
- ALLOCCHUNKSIZE 128 udiv /rsi :movqImmReg
+
+ /rsi :popqReg
+ 7 /rsi :shrqImm8Reg
+ /rsi :pushqReg
+
/rsi /rdi :subqRegReg
/rax :movqImmOOBReg BLOCKBASE
/rax /rdi :addqRegReg
@@ -959,7 +972,7 @@
heapSize /rax :movqImmReg
/rax /rdi :movqMemReg
7 /rdi :shrqImm8Reg
- ALLOCCHUNKSIZE 128 udiv /rsi :movqImmReg
+ /rsi :popqReg
/rsi /rdi :subqRegReg
/rax :movqImmOOBReg MARKBASE
/rax /rdi :addqRegReg
diff --git a/compiler/elymasGlobal.ey b/compiler/elymasGlobal.ey
index e7cea98..90fbfda 100644
--- a/compiler/elymasGlobal.ey
+++ b/compiler/elymasGlobal.ey
@@ -1809,12 +1809,12 @@
%30 -101* /eydefvst defv
%31 -101* /eydeffst defv
%33 -101* /eydefmst defv
- %50 -101* /eydefvc defv
- %51 -101* /eydeffc defv
- %53 -101* /eydefmc defv
- %D0 -101* /eydefvd defv
- %D1 -101* /eydeffd defv
- %D3 -101* /eydefmd defv
+ %40 -101* /eydefvc defv
+ %41 -101* /eydeffc defv
+ %43 -101* /eydefmc defv
+ %C0 -101* /eydefvd defv
+ %C1 -101* /eydeffd defv
+ %C3 -101* /eydefmd defv
--
# retype a function
diff --git a/elymas/lib/sys/opt.ey b/elymas/lib/sys/opt.ey
index 0adef46..74f8380 100644
--- a/elymas/lib/sys/opt.ey
+++ b/elymas/lib/sys/opt.ey
@@ -173,6 +173,9 @@
/keys /dom /add /and /band /bor /bxor /div /eq /ge /gt /le /lt
/mod /mul /neq /or /sub /udiv /umod /xor /bnot /neg /not
] { | ::rawCodeAddress } [ 0 ] [ 0 ] '' * ==:SCOPETIGHTFUNCTIONS
+ [
+ /defvs /deffs /defms /defvst /deffst /defmst
+ ] { | ::rawCodeAddress } [ 0 ] [ 0 ] '' * ==:STATICDEFININGFUNCTIONS
{ ==o ==executingScope
0 ==containsScopeModifications
@@ -250,6 +253,17 @@
} /testNametableTemplatability deffst
{ ==logic
+ [ logic { ==entry 0 entry * ==action
+ action CALL eq { 1 entry * "/" | ::rawCodeAddress eq }' andif {
+ "dropped call to /" dump
+ # drop call to /
+ } {
+ entry
+ } ? *
+ } each ]
+ } /rewriteSlash deffst
+
+ { ==logic
[ NOP ] ==last
[ logic { ==entry 0 entry * ==action
[
@@ -300,12 +314,35 @@
"resolution failed" die
} ? *
}
+ { templateNametable { action CALL eq }' andif { 1 entry * STATICDEFININGFUNCTIONS eq any }' andif
+ { 0 last * PUSH eq }' andif }' {
+ 1 last * ::rawObject ==constant
+
+ constant executingScope sys .resolveInfo {
+ ==mode -- ==parentCount 32 add ==offsetInScope ==inExtensionArea
+ inExtensionArea { offsetInScope 8 add =offsetInScope } rep
+
+ inExtensionArea not { # FIXME: implement the extension area case
+ mode 16 div 1 band {
+ [ STATICWRITE offsetInScope parentCount inExtensionArea ] =last
+ [ NOP ] =entry
+ } { } ? *
+
+ "Rewrote def* of " dump constant dump
+ } rep
+ } {
+ executingScope dump
+ executingScope keys dump
+ constant dump
+ "resolution failed" die
+ } ? *
+ }
] conds
last
entry =last
} each last ]
- } /rewriteConstantEquals deffst
+ } /rewriteConstantAssignment deffst
{ _ ==logic
2 logic len range { ==i i logic * ==entry 0 entry * ==action i 1 sub logic * ==last i 2 sub logic * ==secondLast
@@ -791,9 +828,10 @@
newLogic
testNametableTemplatability
testScopeModifications
+ rewriteSlash
containsScopeModifications not {
rewriteConstantPipe
- rewriteConstantEquals
+ rewriteConstantAssignment
} rep
rewriteConstantDot
rewriteConstantStar