Website Summary Files Commits Branches @commit @diff @stats
path: root / spasm / src / spasm.cpp
diff options
context:
space:
mode:
Commit0b2444013dfb6bfb0c033b5b827610f6df49ede5 (patch)
Author
 dtrendafilov <trendafilov.dn@gmail.com>
2018-11-25 09:08:47 +0200
Committer
 GitHub <noreply@github.com>
2018-11-25 09:08:47 +0200
Filese6206cd3329067cd48dd0ccf90262f6eaa6cdbbb /spasm/src/spasm.cpp
IPL-0b2444013dfb6bfb0c033b5b827610f6df49ede5.tar
IPL-0b2444013dfb6bfb0c033b5b827610f6df49ede5.tar.gz
IPL-0b2444013dfb6bfb0c033b5b827610f6df49ede5.zip
Parent156d0957c1b36bba2685fef548a8573e9337309a (diff)
Parent4fca8e8e6c1056aed11437c87e9175232b48c8f4 (diff)
Merge branch 'master' into json-to-ast
1 files changed, 51 insertions, 6 deletions
-rw-r--r--spasm/src/spasm.cpp57
diff --git a/spasm/src/spasm.cpp b/spasm/src/spasm.cpp
index 8e5e36d..58fb6d4 100644
--- a/spasm/src/spasm.cpp
+++ b/spasm/src/spasm.cpp
@@ -46,7 +46,6 @@ Spasm::RunResult Spasm::run()
const auto instruction = m_ByteCode[m_PC++];
const auto opcode = OpCodes(instruction & 0x3f);
const auto size = instruction >> 6;
- assert(size == 0 && "no long args yet");
switch (opcode)
{
case OpCodes::Halt:
@@ -281,7 +280,7 @@ void Spasm::divide(reg_t a0, reg_t a1, reg_t a2)
*/
void Spasm::modulus(reg_t a0, reg_t a1, reg_t a2)
{
- set_local(a0, get_local(a1) % get_local(a2));
+ set_local(a0, data_t(int64_t(get_local(a1)) % int64_t(get_local(a2))));
}
/*!
@@ -410,14 +409,60 @@ void Spasm::push_data(data_t data)
reg_t Spasm::read_reg(size_t size)
{
- assert(size == 0);
- return m_ByteCode[m_PC++];
+ switch (size)
+ {
+ case 0:
+ return m_ByteCode[m_PC++];
+ case 1:
+ {
+ auto result = *reinterpret_cast<int16_t*>(&m_ByteCode[0] + m_PC);
+ m_PC += 2;
+ return result;
+ }
+ case 2:
+ {
+ auto result = *reinterpret_cast<int32_t*>(&m_ByteCode[0] + m_PC);
+ m_PC += 4;
+ return result;
+ }
+ case 3:
+ {
+ auto result = *reinterpret_cast<int64_t*>(&m_ByteCode[0] + m_PC);
+ m_PC += 8;
+ return result;
+ }
+ }
+ assert(false && "not reached");
+ return 0;
}
data_t Spasm::read_number(size_t size)
{
- assert(size == 0);
- return m_ByteCode[m_PC++];
+ switch (size)
+ {
+ case 0:
+ return m_ByteCode[m_PC++];
+ case 1:
+ {
+ auto result = *reinterpret_cast<int16_t*>(&m_ByteCode[0] + m_PC);
+ m_PC += 2;
+ return result;
+ }
+ case 2:
+ {
+ auto result = *reinterpret_cast<int32_t*>(&m_ByteCode[0] + m_PC);
+ m_PC += 4;
+ return result;
+ }
+ case 3:
+ {
+ auto result = *reinterpret_cast<double*>(&m_ByteCode[0] + m_PC);
+ m_PC += 8;
+ return result;
+ }
+ }
+ assert(false && "not reached");
+ return 0;
}
} // namespace SpasmImpl