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:
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)