Website Summary Files Commits Branches @commit @diff @stats
path: root / spasm / src / spasm.cpp
diff options
context:
space:
mode:
Commit4fca8e8e6c1056aed11437c87e9175232b48c8f4 (patch)
Author
 dtrendafilov <trendafilov.dn@gmail.com>
2018-11-22 16:04:22 +0200
Committer
 GitHub <noreply@github.com>
2018-11-22 16:04:22 +0200
Filesbda85506ae253afd73d3ab36d3685b4e5bae3847 /spasm/src/spasm.cpp
IPL-4fca8e8e6c1056aed11437c87e9175232b48c8f4.tar
IPL-4fca8e8e6c1056aed11437c87e9175232b48c8f4.tar.gz
IPL-4fca8e8e6c1056aed11437c87e9175232b48c8f4.zip
Parent75faff8b35b8f9bfa0a00b973e9323c1dc4c614e (diff)
Parentddc50fe944df0a33386a3213c8021f07ac8ffdd9 (diff)
Merge pull request #62 from SofiaCPP/feature/double
Feature/double
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