summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Stellard <tstellar@gmail.com>2011-01-01 16:36:31 -0800
committerTom Stellard <tstellar@gmail.com>2011-01-01 16:36:31 -0800
commit0a26190e3dcfc8909505fe017de4b710281b4879 (patch)
tree7fa77a1dc3fe7039b0c2b4a2b57b82909ab67dae
parent5bc2a1f3dd379dc2b642a094dbeb191901fccafa (diff)
queue writes and commit them after an instruction has finished executing
-rw-r--r--emulator.cpp20
-rw-r--r--emulator.h17
-rw-r--r--instruction.cpp10
3 files changed, 40 insertions, 7 deletions
diff --git a/emulator.cpp b/emulator.cpp
index 14377ac..565f3cc 100644
--- a/emulator.cpp
+++ b/emulator.cpp
@@ -9,6 +9,13 @@
#include "program.h"
#include "register_address.h"
+emulator::write::write(
+ register_address addr,
+ value * val) :
+ m_addr(addr),
+ m_val(val)
+ { }
+
emulator::emulator(
program_loader * loader,
int num_temp_regs,
@@ -36,6 +43,11 @@ emulator::run()
for(it = p->m_instructions.begin();
it < p->m_instructions.end(); ++it) {
(*it)->execute(*this);
+ while (!m_write_queue.empty()) {
+ write w = m_write_queue.front();
+ set_value(w.m_addr, w.m_val);
+ m_write_queue.pop();
+ }
}
return true;
}
@@ -125,3 +137,11 @@ emulator::get_output_value(unsigned int index)
}
return m_out_regs[index]->simplify();
}
+
+void
+emulator::queue_write(
+ register_address addr,
+ value * val)
+{
+ m_write_queue.push(write(addr, val));
+}
diff --git a/emulator.h b/emulator.h
index c3fcd1f..c9ad2e3 100644
--- a/emulator.h
+++ b/emulator.h
@@ -2,6 +2,7 @@
#ifndef EMULATOR_H_
#define EMULATOR_H_
+#include <queue>
#include <vector>
#include "value.h"
@@ -21,12 +22,23 @@ public:
bool run();
void set_constants(float value);
value * get_value(register_address addr);
- void set_value(
+ value * get_output_value(unsigned int index);
+ void queue_write(
register_address addr,
value * val);
- value * get_output_value(unsigned int index);
private:
+ class write {
+ public:
+ write(register_address addr, value * val);
+ register_address m_addr;
+ value * m_val;
+ };
+
+ void set_value(
+ register_address addr,
+ value * val);
+
program_loader * m_loader;
std::vector<value *> m_temp_regs;
std::vector<float_value *> m_const_regs;
@@ -34,6 +46,7 @@ private:
std::vector<value *> m_private_regs;
std::vector<float_value*> m_immediate_regs;
std::vector<float_value*> m_input_regs;
+ std::queue<write> m_write_queue;
};
#endif //EMULATOR_H
diff --git a/instruction.cpp b/instruction.cpp
index 779b397..52dc8ba 100644
--- a/instruction.cpp
+++ b/instruction.cpp
@@ -29,7 +29,7 @@ void instruction::execute(emulator & emulator)
l = emulator.get_value(m_src_regs[0][i]);
break;
}
- emulator.set_value(m_dst[i],
+ emulator.queue_write(m_dst[i],
new tree_value(m_evaluator, l, r));
}
}
@@ -64,7 +64,7 @@ add_instruction::execute(emulator & emulator)
tree_value * val = new tree_value(this->m_evaluator,
emulator.get_value(m_src_regs[0][i]),
emulator.get_value(m_src_regs[1][i]));
- emulator.set_value(m_dst[i], val);
+ emulator.queue_write(m_dst[i], val);
}
}
@@ -77,7 +77,7 @@ mov_instruction::execute(emulator & emulator)
{
unsigned int i;
for (i = 0; i < m_dst.size(); i++) {
- emulator.set_value(m_dst[i],
+ emulator.queue_write(m_dst[i],
emulator.get_value(m_src_regs[0][i]));
}
}
@@ -94,7 +94,7 @@ mul_instruction::execute(emulator & emulator)
tree_value * val = new tree_value(this->m_evaluator,
emulator.get_value(m_src_regs[0][i]),
emulator.get_value(m_src_regs[1][i]));
- emulator.set_value(m_dst[i], val);
+ emulator.queue_write(m_dst[i], val);
}
}
@@ -112,7 +112,7 @@ mad_instruction::execute(emulator & emulator)
emulator.get_value(m_src_regs[1][i]));
tree_value * mad = new tree_value(new add_evaluator(),
mul, emulator.get_value(m_src_regs[2][i]));
- emulator.set_value(m_dst[i], mad);
+ emulator.queue_write(m_dst[i], mad);
}
}