diff options
Diffstat (limited to 'examples/working-compiler/remaining-stack.ey')
| -rw-r--r-- | examples/working-compiler/remaining-stack.ey | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/examples/working-compiler/remaining-stack.ey b/examples/working-compiler/remaining-stack.ey new file mode 100644 index 0000000..c763ec9 --- /dev/null +++ b/examples/working-compiler/remaining-stack.ey @@ -0,0 +1,64 @@ +sys .asm .ops ==:sysasmops +{ + quoted { + _ sys .typed .type 1 eq { + sysasmops -01 .| + } { + "sysasmops" "|" | -102 "." | + } ? * + } { + sysasmops -01 . + } ? * +} ":" defq +{ :labelRecord [ } "[[" deff +{ ] :labelResolve } "]]" deff +sysasmops .|label "@" deff + +6148914691236516950 ==STACKTOPMARKER + +# Count unused cells up to top of data stack +# 0 <- number of remaining stack cells +[[ + /rbx :popqReg + + /rcx /rcx :xorqRegReg + /rcx :decqReg + STACKTOPMARKER /rax :movqImmReg + /rsp /rdi :movqRegReg + :std + :repnz :scasq + :cld + /rcx :negqReg + 63 /rcx :btsqImm8Reg + /rcx :pushqReg + + /rbx :pushqReg + :retn +]] [ ] sys .asm .createFunction =*remainingDataStack + +# Count unused cells up to top of call stack +# 0 <- number of remaining stack cells +[[ + /rbx :popqReg + + /rcx /rcx :xorqRegReg + /rcx :decqReg + STACKTOPMARKER /rax :movqImmReg + /r15 /rdi :movqRegReg + :std + :repnz :scasq + :cld + /rcx :negqReg + 63 /rcx :btsqImm8Reg + /rcx :pushqReg + + /rbx :pushqReg + :retn +]] [ ] sys .asm .createFunction =*remainingCallStack + +{ + remainingCallStack txt .produce .u dump + f +} _ =*f * + +# vim: syn=elymas |
