Website Summary Files Commits Branches @commit @diff @stats
path: root / spasm / src / spasm.cpp
diff options
context:
space:
mode:
Commit43b6cf4a91e0222d9840ae4474df38f93dd13ac5 (patch)
Author
 Dimitar Trendafilov <dimitar@coherent-labs.com>
2018-11-26 21:47:02 +0200
Committer
 Dimitar Trendafilov <dimitar@coherent-labs.com>
2018-11-26 21:47:02 +0200
Filesbbb343f6198ada4d413169f853d8a301ecbdce66 /spasm/src/spasm.cpp
IPL-43b6cf4a91e0222d9840ae4474df38f93dd13ac5.tar
IPL-43b6cf4a91e0222d9840ae4474df38f93dd13ac5.tar.gz
IPL-43b6cf4a91e0222d9840ae4474df38f93dd13ac5.zip
Parentf6cdfe77480452f152b916e129fa7ae06ed1a37b (diff)
Made spasm to work with nan-boxed values
1 files changed, 44 insertions, 44 deletions
-rw-r--r--spasm/src/spasm.cpp88
diff --git a/spasm/src/spasm.cpp b/spasm/src/spasm.cpp
index 4d30946..63e09a0 100644
--- a/spasm/src/spasm.cpp
+++ b/spasm/src/spasm.cpp
@@ -76,7 +76,7 @@ Spasm::RunResult Spasm::run()
{
const auto count = PC_t(read_reg(size));
assert(m_SP + count <= &data_stack[data_stack.size() - 1]);
- std::fill(m_SP, m_SP + count, 0);
+ std::fill(m_SP, m_SP + count, data_t{});
m_SP += count;
break;
}
@@ -187,38 +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;
- }
+ 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;
@@ -312,7 +312,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, data_t(int64_t(get_local(a1)) % int64_t(get_local(a2))));
+ set_local(a0, get_local(a1) % get_local(a2));
}
/*!
@@ -357,7 +357,7 @@ void Spasm::go(reg_t a0)
void Spasm::call(reg_t a0)
{
Frame call{m_PC, PC_t(m_FP - &data_stack[0]),
- m_SP - &data_stack[0] - PC_t(*(m_SP - 1)) - 1};
+ m_SP - &data_stack[0] - PC_t((*(m_SP - 1)).get_double()) - 1};
m_Frames.push(std::move(call));
m_FP = m_SP - 1;
go(a0);
@@ -414,22 +414,22 @@ void Spasm::lesseq(reg_t a0, reg_t a1, reg_t a2)
void Spasm::greater(reg_t a0, reg_t a1, reg_t a2)
{
- set_local(a0, get_local(a1) > get_local(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));
+ 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);
+ set_local(a0, get_local(a1) == get_local(a2));
}
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);
+ set_local(a0, get_local(a1) != get_local(a2));
}
data_t Spasm::get_local(reg_t reg)
@@ -493,28 +493,28 @@ data_t Spasm::read_number(size_t size)
switch (size)
{
case 0:
- return m_ByteCode[m_PC++];
+ return data_t(double(m_ByteCode[m_PC++]));
case 1:
{
auto result = *reinterpret_cast<int16_t*>(&m_ByteCode[0] + m_PC);
m_PC += 2;
- return result;
+ return data_t(double(result));
}
case 2:
{
auto result = *reinterpret_cast<int32_t*>(&m_ByteCode[0] + m_PC);
m_PC += 4;
- return result;
+ return data_t(double(result));
}
case 3:
{
auto result = *reinterpret_cast<double*>(&m_ByteCode[0] + m_PC);
m_PC += 8;
- return result;
+ return data_t(double(result));
}
}
assert(false && "not reached");
- return 0;
+ return data_t{};
}
} // namespace SpasmImpl