Website Summary Files Commits Branches @commit @diff @stats
path: root / spasm / src / spasm.cpp
diff options
context:
space:
mode:
Commit3ce342b97b6c22b7ce6dded7be7b5c6bf9edcc04 (patch)
Author
 Dimitar Trendafilov <dimitar@coherent-labs.com>
2018-11-19 23:49:15 +0200
Committer
 Dimitar Trendafilov <dimitar@coherent-labs.com>
2018-11-21 21:20:34 +0200
Files8a6bc5aa0fb2fcc3c9589e53b91bc316141c7cda /spasm/src/spasm.cpp
IPL-3ce342b97b6c22b7ce6dded7be7b5c6bf9edcc04.tar
IPL-3ce342b97b6c22b7ce6dded7be7b5c6bf9edcc04.tar.gz
IPL-3ce342b97b6c22b7ce6dded7be7b5c6bf9edcc04.zip
Parent36711f22e4d3449d75f8412654330a7ca5c3275a (diff)
Support for doubles in the assembler
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 6e09be9..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, int64_t(get_local(a1)) % int64_t(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