diff options
author | Tom Stellard <tstellar@gmail.com> | 2011-01-01 16:36:31 -0800 |
---|---|---|
committer | Tom Stellard <tstellar@gmail.com> | 2011-01-01 16:36:31 -0800 |
commit | 0a26190e3dcfc8909505fe017de4b710281b4879 (patch) | |
tree | 7fa77a1dc3fe7039b0c2b4a2b57b82909ab67dae | |
parent | 5bc2a1f3dd379dc2b642a094dbeb191901fccafa (diff) |
queue writes and commit them after an instruction has finished executing
-rw-r--r-- | emulator.cpp | 20 | ||||
-rw-r--r-- | emulator.h | 17 | ||||
-rw-r--r-- | instruction.cpp | 10 |
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)); +} @@ -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); } } |