diff options
| Commit | 09e59ae226f2fcb469b944c815b1e1bf46d4c569 (patch) | |
|---|---|---|
| Author | 2018-11-25 17:49:14 +0200 | |
| Committer | 2018-11-25 17:49:14 +0200 | |
| Files | d8273d7a27cab059957720e06dc19c2c0fd728d1 /spasm/src | |
| IPL-09e59ae226f2fcb469b944c815b1e1bf46d4c569.tar IPL-09e59ae226f2fcb469b944c815b1e1bf46d4c569.tar.gz IPL-09e59ae226f2fcb469b944c815b1e1bf46d4c569.zip | ||
| Parent | 2425ccff65421e82dc406125c52b7bf804dcc918 (diff) | |
Implement comparison operators (#71)
* Implement comparison operators.
* Remove debug code.
* Undo test code.
2 files changed, 63 insertions, 1 deletions
| -rw-r--r-- | spasm/src/spasm.cpp | 52 | ||||
| -rw-r--r-- | spasm/src/spasm_impl.hpp | 12 |
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)); diff --git a/spasm/src/spasm_impl.hpp b/spasm/src/spasm_impl.hpp index 7c2bd38..2548828 100644 --- a/spasm/src/spasm_impl.hpp +++ b/spasm/src/spasm_impl.hpp @@ -30,7 +30,11 @@ enum OpCodes : char Mod, Less, LessEq, - LastIndex = LessEq, + Greater, + GreaterEq, + Equal, + NotEqual, + LastIndex = NotEqual, }; static_assert(LastIndex < 0x3f, "Too many opcodes"); @@ -121,6 +125,12 @@ class Spasm void less(reg_t a0, reg_t a1, reg_t a2); void lesseq(reg_t a0, reg_t a1, reg_t a2); + void greater(reg_t a0, reg_t a1, reg_t a2); + void greatereq(reg_t a0, reg_t a1, reg_t a2); + + void equal(reg_t a0, reg_t a1, reg_t a2); + void not_equal(reg_t a0, reg_t a1, reg_t a2); + data_t get_local(reg_t reg); void set_local(reg_t reg, data_t data); data_t pop_data(); |
