diff options
| Commit | 72d9bbcc3154142af79fb686d9dc7e4d1fa1badb (patch) | |
|---|---|---|
| Author | 2018-11-29 09:13:12 +0200 | |
| Committer | 2018-11-29 09:13:12 +0200 | |
| Files | 3cea4377cba9370f3f2248557f82831d617d89d1 /spasm/src/spasm_impl.hpp | |
| IPL-72d9bbcc3154142af79fb686d9dc7e4d1fa1badb.tar IPL-72d9bbcc3154142af79fb686d9dc7e4d1fa1badb.tar.gz IPL-72d9bbcc3154142af79fb686d9dc7e4d1fa1badb.zip | ||
| Parent | cdfd42d72030a031e5c5d810fcd53441902b5cff (diff) | |
Feature/strings (#75)
* The assembler supports string opcode
* disabled the string test until implmented
* strings can be printed
1 files changed, 29 insertions, 8 deletions
| -rw-r--r-- | spasm/src/spasm_impl.hpp | 37 |
diff --git a/spasm/src/spasm_impl.hpp b/spasm/src/spasm_impl.hpp index 2548828..04e809a 100644 --- a/spasm/src/spasm_impl.hpp +++ b/spasm/src/spasm_impl.hpp @@ -3,6 +3,7 @@ #include <iostream> +#include <unordered_set> #include "types.hpp" namespace SpasmImpl @@ -23,6 +24,7 @@ enum OpCodes : char JumpT, JumpF, Const, + String, Add, Sub, Mul, @@ -30,14 +32,29 @@ enum OpCodes : char Mod, Less, LessEq, - Greater, - GreaterEq, - Equal, - NotEqual, + Greater, + GreaterEq, + Equal, + NotEqual, LastIndex = NotEqual, }; static_assert(LastIndex < 0x3f, "Too many opcodes"); +class StringTable +{ + public: + const SPStringValue* Get(const char* s, size_t length) + { + SPString v(s, length); + auto pos = m_Strings.insert(SPStringValue(v)); + return &(*pos.first); + } + + private: + typedef std::unordered_set<SPStringValue> StringMap; + StringMap m_Strings; +}; + //! The Abstract Stack Machine /*! ** The machine contains a data stack for operations and control flow and @@ -93,6 +110,8 @@ class Spasm //! Stack for function frames FrameStack m_Frames; + StringTable m_Strings; + //! Input stream for read () operation std::istream* istr; @@ -125,11 +144,11 @@ 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 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); + 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); @@ -137,6 +156,8 @@ class Spasm void push_data(data_t); reg_t read_reg(size_t size); data_t read_number(size_t size); + int64_t read_integer(size_t size); + data_t read_string(size_t size); }; } // namespace SpasmImpl |
