#include "../Iinstr.hpp" class Cbranchreg : public Iinstr { private: bool m_taken; char m_typ; public: Cbranchreg(); void evalInstr(); void execInstr(); std::string toString(); Iinstr* getNew(); }; /** * Name: create_instruction * Purpose: if compiled as shared library, this functions creates the instruction object * Returns: pointer to instruction object */ extern "C" Iinstr* create_instruction() { return new Cbranchreg(); } Iinstr* Cbranchreg::getNew() { return new Cbranchreg(); } /** * Name: destroy_instruction * Purpose: if compiled as shared library, this functions destoys the instruction object * Parameter: IInstruction - the instruction object to delete */ extern "C" void destroy_instruction(Iinstr* p) { delete p; } Cbranchreg::Cbranchreg() : m_taken(1), m_typ(0) { opcode = B5(10111); name = "branchreg"; } void Cbranchreg::evalInstr() { argbits >>= 2; dynamic_bitset<> type = argbits; type.resize(1); this->m_typ = type.to_ulong(); switch(this->m_typ) { case 0: this->name = "brr"; break; case 1: this->name = "callr"; break; default: cerr << "What have you done? 1 bits that have more than 2 values?!" << endl; } argbits >>= 17; m_rd = this->getRegister(argbits); } void Cbranchreg::execInstr() { //cout << "should exec " << this->toString() << endl; CDat pc = this->m_cpu->getRegister(this->m_rd); pc *= 4; //komisch fix? if(this->m_typ == 1) { CDat sp = this->m_cpu->getStack(); sp -= 4; this->m_cpu->setRAM(sp, this->m_cpu->getNextPC()); this->m_cpu->setStack(sp); } this->m_cpu->setNextPC(pc); } std::string Cbranchreg::toString() { stringstream op; op << this->getName(); op << this->getConditionFlag(); op << " r" << m_rd; return op.str(); }