From c67557ba519b6d94898a031e86a8db69675f6c1c Mon Sep 17 00:00:00 2001 From: Martin Perner Date: Sat, 13 Nov 2010 18:39:45 +0100 Subject: [PATCH] sim: instrs can have different effect on perf count --- 3b_sim/ccpu.cpp | 8 +++++++- 3b_sim/ccpu.hpp | 1 + 3c_disasm/Iinstr.hpp | 8 ++++++-- 3c_disasm/instr/branch.cpp | 2 ++ 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/3b_sim/ccpu.cpp b/3b_sim/ccpu.cpp index 5f533ce..6bfb654 100644 --- a/3b_sim/ccpu.cpp +++ b/3b_sim/ccpu.cpp @@ -17,13 +17,14 @@ void CCpu::tick() if(instr == NULL) { throw string("Out of Instructions!"); } - this->incPerf(); if(this->conditionMet(instr->getCondition())) { cout << "Executing: " << instr->toString() << endl; instr->execInstr(); + this->incPerfBy(instr->getClockCount()); } else { cout << "Didn't Execute " << instr->toString() << "; condition wasn't met" << endl; + this->incPerf(); } } @@ -206,6 +207,11 @@ void CCpu::incPerf() this->m_perf++; } +void CCpu::incPerfBy(short inc) +{ + this->m_perf += inc; +} + CCpu::CCpu(int regs, int ram, int prog) : m_Z(false), m_S(false), m_C(false), m_O(false), m_pc(0), m_pc_next(0), m_perf(0), m_reg(regs), m_ram(ram), m_prog(prog), m_stack(0) { diff --git a/3b_sim/ccpu.hpp b/3b_sim/ccpu.hpp index ebe15f9..4c250b5 100644 --- a/3b_sim/ccpu.hpp +++ b/3b_sim/ccpu.hpp @@ -37,6 +37,7 @@ class CCpu { CDat getPerf() const; void setPerf(CDat); void incPerf(); + void incPerfBy(short); CDat getCurPC() const; CDat getNextPC() const; diff --git a/3c_disasm/Iinstr.hpp b/3c_disasm/Iinstr.hpp index 2cc17df..e16c26c 100644 --- a/3c_disasm/Iinstr.hpp +++ b/3c_disasm/Iinstr.hpp @@ -51,7 +51,7 @@ enum CONDITIONS { class Iinstr { protected: - short opcode; + short opcode, clockcount; std::string name; short m_ra, m_rb, m_rd; bool m_c, m_d, m_hl, m_f, m_s; @@ -59,7 +59,7 @@ class Iinstr { short m_cond; boost::dynamic_bitset<> argbits; CDat hexdump; - Iinstr() : opcode(0), name(""), m_ra(0), m_rb(0), m_rd(0), m_c(0), m_d(0), m_hl(0), m_f(0), m_s(0), m_imm(0), m_cond(ALWAYS), argbits(32), hexdump(0) {} + Iinstr() : opcode(0), clockcount(1), name(""), m_ra(0), m_rb(0), m_rd(0), m_c(0), m_d(0), m_hl(0), m_f(0), m_s(0), m_imm(0), m_cond(ALWAYS), argbits(32), hexdump(0) {} CDat generate16ImmFill(const CDat value) const { CDat i = value; @@ -141,6 +141,10 @@ class Iinstr { return m_cond; } + short getClockCount() { + return clockcount; + } + void decodeCondition(short condition) { if(condition >= 0 && condition <= 15) { m_cond = condition; diff --git a/3c_disasm/instr/branch.cpp b/3c_disasm/instr/branch.cpp index 39b2e73..b8781da 100644 --- a/3c_disasm/instr/branch.cpp +++ b/3c_disasm/instr/branch.cpp @@ -64,9 +64,11 @@ void Cbranch::evalInstr() break; case 2: this->name = "ret"; + this->clockcount = 3; break; case 3: this->name = "reti"; + this->clockcount = 3; break; default: cerr << "What have you done? 2 bits that have more than 4 values?!" << endl; -- 2.25.1