diff options
Diffstat (limited to 'compiler/elymasAsmOps.ey')
| -rw-r--r-- | compiler/elymasAsmOps.ey | 41 |
1 files changed, 25 insertions, 16 deletions
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 |
