aboutsummaryrefslogtreecommitdiff
path: root/examples/working-compiler/remaining-stack.ey
diff options
context:
space:
mode:
Diffstat (limited to 'examples/working-compiler/remaining-stack.ey')
-rw-r--r--examples/working-compiler/remaining-stack.ey64
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