From 380911d0b8e8a92df6205d4ee180caa95eb2acb8 Mon Sep 17 00:00:00 2001 From: Drahflow Date: Thu, 18 Jun 2015 13:54:48 +0200 Subject: Optimize rep on inline-created functions ... also finally make label resolution recursive --- compiler/elymasAsmLib.ey | 2 +- compiler/elymasAsmOps.ey | 41 +++++++++++++++++++++++++---------------- compiler/elymasGlobal.ey | 2 +- 3 files changed, 27 insertions(+), 18 deletions(-) (limited to 'compiler') 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 -- cgit v1.2.3