Website Summary Files Commits Branches @commit @diff @stats
path: root / spasm / src / spasm.cpp
diff options
context:
space:
mode:
Commit09e59ae226f2fcb469b944c815b1e1bf46d4c569 (patch)
Author
 ValeriHristov <valeri.dhristov@gmail.com>
2018-11-25 17:49:14 +0200
Committer
 Martin Dobrev <martindobrev0@gmail.com>
2018-11-25 17:49:14 +0200
Filesd8273d7a27cab059957720e06dc19c2c0fd728d1 /spasm/src/spasm.cpp
IPL-09e59ae226f2fcb469b944c815b1e1bf46d4c569.tar
IPL-09e59ae226f2fcb469b944c815b1e1bf46d4c569.tar.gz
IPL-09e59ae226f2fcb469b944c815b1e1bf46d4c569.zip
Parent2425ccff65421e82dc406125c52b7bf804dcc918 (diff)
Implement comparison operators (#71)
* Implement comparison operators. * Remove debug code. * Undo test code.
1 files changed, 52 insertions, 0 deletions
-rw-r--r--spasm/src/spasm.cpp52
diff --git a/spasm/src/spasm.cpp b/spasm/src/spasm.cpp
index 58fb6d4..4d30946 100644
--- a/spasm/src/spasm.cpp
+++ b/spasm/src/spasm.cpp
@@ -187,6 +187,38 @@ Spasm::RunResult Spasm::run()
lesseq(arg0, arg1, arg2);
break;
}
+ case OpCodes::Greater:
+ {
+ const auto arg0 = read_reg(size);
+ const auto arg1 = read_reg(size);
+ const auto arg2 = read_reg(size);
+ greater(arg0, arg1, arg2);
+ break;
+ }
+ case OpCodes::GreaterEq:
+ {
+ const auto arg0 = read_reg(size);
+ const auto arg1 = read_reg(size);
+ const auto arg2 = read_reg(size);
+ greatereq(arg0, arg1, arg2);
+ break;
+ }
+ case OpCodes::Equal:
+ {
+ const auto arg0 = read_reg(size);
+ const auto arg1 = read_reg(size);
+ const auto arg2 = read_reg(size);
+ equal(arg0, arg1, arg2);
+ break;
+ }
+ case OpCodes::NotEqual:
+ {
+ const auto arg0 = read_reg(size);
+ const auto arg1 = read_reg(size);
+ const auto arg2 = read_reg(size);
+ not_equal(arg0, arg1, arg2);
+ break;
+ }
default:
{
std::cerr << opcode << ": not implemented" << std::endl;
@@ -380,6 +412,26 @@ void Spasm::lesseq(reg_t a0, reg_t a1, reg_t a2)
set_local(a0, get_local(a1) <= get_local(a2));
}
+void Spasm::greater(reg_t a0, reg_t a1, reg_t a2)
+{
+ set_local(a0, get_local(a1) > get_local(a2));
+}
+
+void Spasm::greatereq(reg_t a0, reg_t a1, reg_t a2)
+{
+ set_local(a0, get_local(a1) >= get_local(a2));
+}
+
+void Spasm::equal(reg_t a0, reg_t a1, reg_t a2)
+{
+ set_local(a0, fabs(get_local(a1) - get_local(a2)) < 0.0001);
+}
+
+void Spasm::not_equal(reg_t a0, reg_t a1, reg_t a2)
+{
+ set_local(a0, fabs(get_local(a1) - get_local(a2)) > 0.0001);
+}
+
data_t Spasm::get_local(reg_t reg)
{
assert(&data_stack[0] <= (m_FP + reg));