aboutsummaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2015-06-18 13:54:48 +0200
committerDrahflow <drahflow@gmx.de>2015-06-18 13:54:48 +0200
commit380911d0b8e8a92df6205d4ee180caa95eb2acb8 (patch)
treedc1dcb97d33e3a3b49569955b2a174a476a16740 /compiler
parentbb395ab8e0cdacb6b381f576ff4cae431290da19 (diff)
Optimize rep on inline-created functions
... also finally make label resolution recursive
Diffstat (limited to 'compiler')
-rw-r--r--compiler/elymasAsmLib.ey2
-rw-r--r--compiler/elymasAsmOps.ey41
-rw-r--r--compiler/elymasGlobal.ey2
3 files changed, 27 insertions, 18 deletions
diff --git a/compiler/elymasAsmLib.ey b/compiler/elymasAsmLib.ey
index 2075c74..da98d77 100644
--- a/compiler/elymasAsmLib.ey
+++ b/compiler/elymasAsmLib.ey
@@ -86,7 +86,7 @@
[ ] =linkHoles
} /linkResolve deff
- { [ } "[[" deff
+ { :labelRecord [ } "[[" deff
{ ] :labelResolve stringResolve } "]]" deff
{ %00 %00 %00 %00 %00 %60 %00 %00 } /HEAPBASE deff
diff --git a/compiler/elymasAsmOps.ey b/compiler/elymasAsmOps.ey
index 06efb82..f3fe043 100644
--- a/compiler/elymasAsmOps.ey
+++ b/compiler/elymasAsmOps.ey
@@ -127,48 +127,57 @@
{ %66 } /width16 deff
# label handling
-< { defv }' /put deff > ==labels
-[ ] ==labelHoles
+<
+ < { defv }' /put deff > ==labels
+ [ ] ==labelHoles { =labelHoles }' =*setLabelHoles
+ < > ==outer
+> ==labelStack
{ ==l
- ] _ len l labels .put [ -011 len dearray
+ ] _ len l labelStack .labels .put [ -011 len dearray
} /label deff
{ ==l
] _ len ==offset
- labelHoles [ {
- labels l . offset 1 add sub
+ labelStack .labelHoles [ {
+ labelStack .labels l . offset 1 add sub
_ 128 lt not { "8 bit relative label out of range: " l cat die } rep
_ 128 neg ge not { "8 bit relative label out of range: " l cat die } rep
- imm8 offset -102 =[] } ] cat =labelHoles
+ imm8 offset -102 =[] } ] cat labelStack .setLabelHoles
[ -011 len dearray %00
} /labelRel8 deff
{ ==l
] _ len ==offset
- labelHoles [ {
- labels l . offset 2 add sub
+ labelStack .labelHoles [ {
+ labelStack .labels l . offset 2 add sub
_ 32768 lt not { "16 bit relative label out of range: " l cat die } rep
_ 32768 neg ge not { "16 bit relative label out of range: " l cat die } rep
- imm16 offset [ 0 1 ] add 2 dearray -204314 =[] =[] } ] cat =labelHoles
+ imm16 offset [ 0 1 ] add 2 dearray -204314 =[] =[] } ] cat labelStack .setLabelHoles
[ -011 len dearray %00 %00
} /labelRel16 deff
{ ==l
] _ len ==offset
- labelHoles [ {
- labels l . offset 4 add sub
+ labelStack .labelHoles [ {
+ labelStack .labels l . offset 4 add sub
_ 2147483648 lt not { "32 bit relative label out of range: " l cat die } rep
_ 2147483648 neg ge not { "32 bit relative label out of range" l cat die } rep
- imm32 offset [ 0 1 2 3 ] add 4 dearray -408518628738 =[] =[] =[] =[] } ] cat =labelHoles
+ imm32 offset [ 0 1 2 3 ] add 4 dearray -408518628738 =[] =[] =[] =[] } ] cat labelStack .setLabelHoles
[ -011 len dearray %00 %00 %00 %00
} /labelRel32 deff
-{ ==opcodes
- labelHoles { opcodes -01 * } each
+{
+ <
+ < { defv }' /put deff > ==labels
+ [ ] ==labelHoles { =labelHoles }' =*setLabelHoles
+ labelStack ==outer
+ > =labelStack
+} /labelRecord deff
- < { defv }' /put deff > =labels
- [ ] =labelHoles
+{ ==opcodes
+ labelStack .labelHoles { opcodes -01 * } each
+ labelStack .outer =labelStack
opcodes
} /labelResolve deff
diff --git a/compiler/elymasGlobal.ey b/compiler/elymasGlobal.ey
index a948b53..7afd660 100644
--- a/compiler/elymasGlobal.ey
+++ b/compiler/elymasGlobal.ey
@@ -6,7 +6,7 @@
assembler .|label "@" deff
"%" _ : -01 deff
- { [ } "[[" deff
+ { :labelRecord [ } "[[" deff
{ ] :labelResolve ::stringResolve } "]]" deff
# elymas functions, stack based ABI