toctave

t(iny)octave
Log | Files | Refs | README

commit 13c5eea0844d801eef3037f4d9ab5c966809b920
parent 2c91e1330ad07ddd5fad1f8110b928c528f5ad78
Author: Mohammad-Reza Nabipoor <mnabipoor@gnu.org>
Date:   Sat, 28 May 2022 00:49:22 +0430

Add pushnan insn and improve assignment codegen

Diffstat:
Mcgen.cpp | 10++++++++++
Mcgen.hpp | 1+
Mcgen.test.cpp | 15++++++++++-----
Mtoctave.jitter | 6++++++
4 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/cgen.cpp b/cgen.cpp @@ -193,6 +193,12 @@ JRoutine::push(double d) } void +JRoutine::pushnan() +{ + TOCTAVE_MUTABLE_ROUTINE_APPEND_INSTRUCTION(r.get(), pushnan); +} + +void JRoutine::pop() { TOCTAVE_MUTABLE_ROUTINE_APPEND_INSTRUCTION(r.get(), pop); @@ -385,6 +391,10 @@ jitter_(JRoutine& r, jitter_(r, f, ++stlab::trailing_of(f)); // visit children r.popvar(as.id.id.c_str()); // move the value to variable + if (toplevel) { + r.pushnan(); + r.pop(); + } }, [&](const ast::Call& call) { auto f{ ++stlab::leading_of(first) }; diff --git a/cgen.hpp b/cgen.hpp @@ -74,6 +74,7 @@ public: // stack manipulation void push(double d); + void pushnan(); void pop(); void drop(); diff --git a/cgen.test.cpp b/cgen.test.cpp @@ -199,11 +199,14 @@ cgen_jitter() ast::Nodes num1{ ast::mknum(120) }; auto j{ cgen::jitter(num1.begin(), num1.end()) }; auto s{ cgen::disasm(j) }; + auto je{ j.mkexec() }; + env::Env env; p(s); assert(s == R"( push 120.000000 pop )"); + je.exec(env); } { @@ -230,14 +233,16 @@ cgen_jitter() auto s{ cgen::disasm(j) }; p(s); - assert(s == R"( push 1.000000 - push 2.000000 + assert(s == R"( push 1.000000 + push 2.000000 div - push 3.000000 - push 4.000000 + push 3.000000 + push 4.000000 mul add - popvar x + popvar x + pushnan + pop )"); } diff --git a/toctave.jitter b/toctave.jitter @@ -147,6 +147,12 @@ instruction popvar (?n var_literal_printer) end end +instruction pushnan () + code + TOCTAVE_PUSH_MAINSTACK(0.0 / 0.0); + end +end + # Arithmetic # Stack: (a b -- a^b)