New function to increase PC by 2 (incPCby2) instead of a parameter to incPC function, could be faster code.
This commit is contained in:
parent
429a67fbef
commit
d8a20db976
|
@ -197,7 +197,7 @@ public:
|
|||
* @param reg_num register number
|
||||
* @return register value
|
||||
*/
|
||||
uint32_t getValue(int reg_num);
|
||||
uint32_t getValue(int reg_num) const;
|
||||
|
||||
/**
|
||||
* Returns PC value
|
||||
|
@ -220,9 +220,12 @@ public:
|
|||
} else {
|
||||
register_PC += 4;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
inline void incPCby2() {
|
||||
register_PC += 2;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get CSR value
|
||||
* @param csr CSR number to access
|
||||
|
@ -255,10 +258,8 @@ private:
|
|||
/**
|
||||
* CSR registers (4096 maximum)
|
||||
*/
|
||||
//uint32_t CSR[4096];
|
||||
std::unordered_map<unsigned int, uint32_t> CSR{0};
|
||||
|
||||
|
||||
Performance *perf;
|
||||
|
||||
void initCSR();
|
||||
|
|
25
src/CPU.cpp
25
src/CPU.cpp
|
@ -114,8 +114,6 @@ bool CPU::cpu_process_IRQ() {
|
|||
}
|
||||
|
||||
bool CPU::CPU_step() {
|
||||
|
||||
bool incPCby2 = false;
|
||||
bool PC_not_affected = false;
|
||||
|
||||
/* Get new PC value */
|
||||
|
@ -142,7 +140,6 @@ bool CPU::CPU_step() {
|
|||
}
|
||||
|
||||
perf->codeMemoryRead();
|
||||
|
||||
log->SC_log(Log::INFO) << "PC: 0x" << std::hex << register_bank->getPC()
|
||||
<< ". ";
|
||||
|
||||
|
@ -153,20 +150,28 @@ bool CPU::CPU_step() {
|
|||
switch (inst->check_extension()) {
|
||||
[[likely]] case BASE_EXTENSION:
|
||||
PC_not_affected = exec->process_instruction(inst, &breakpoint);
|
||||
incPCby2 = false;
|
||||
if (PC_not_affected) {
|
||||
register_bank->incPC();
|
||||
}
|
||||
break;
|
||||
case C_EXTENSION:
|
||||
PC_not_affected = c_inst->process_instruction(inst, &breakpoint);
|
||||
incPCby2 = true;
|
||||
if (PC_not_affected) {
|
||||
register_bank->incPCby2();
|
||||
}
|
||||
break;
|
||||
case M_EXTENSION:
|
||||
PC_not_affected = m_inst->process_instruction(inst);
|
||||
incPCby2 = false;
|
||||
if (PC_not_affected) {
|
||||
register_bank->incPC();
|
||||
}
|
||||
break;
|
||||
case A_EXTENSION:
|
||||
PC_not_affected = a_inst->process_instruction(inst);
|
||||
incPCby2 = false;
|
||||
break;
|
||||
if (PC_not_affected) {
|
||||
register_bank->incPC();
|
||||
}
|
||||
break;
|
||||
[[unlikely]] default:
|
||||
std::cout << "Extension not implemented yet" << std::endl;
|
||||
inst->dump();
|
||||
|
@ -179,10 +184,6 @@ bool CPU::CPU_step() {
|
|||
|
||||
perf->instructionsInc();
|
||||
|
||||
if (PC_not_affected) {
|
||||
register_bank->incPC(incPCby2);
|
||||
}
|
||||
|
||||
return breakpoint;
|
||||
}
|
||||
|
||||
|
|
|
@ -325,7 +325,7 @@ bool C_extension::Exec_C_BEQZ() {
|
|||
new_pc = static_cast<int32_t>(regs->getPC()) + get_imm_CB();
|
||||
regs->setPC(new_pc);
|
||||
} else {
|
||||
regs->incPC(true); //PC <- PC + 2
|
||||
regs->incPCby2();
|
||||
new_pc = static_cast<int32_t>(regs->getPC());
|
||||
}
|
||||
|
||||
|
@ -350,7 +350,7 @@ bool C_extension::Exec_C_BNEZ() {
|
|||
new_pc = static_cast<int32_t>(regs->getPC()) + get_imm_CB();
|
||||
regs->setPC(new_pc);
|
||||
} else {
|
||||
regs->incPC(true); //PC <- PC +2
|
||||
regs->incPCby2(); //PC <- PC +2
|
||||
new_pc = static_cast<int32_t>(regs->getPC());
|
||||
}
|
||||
|
||||
|
|
|
@ -9,14 +9,9 @@
|
|||
#include "Registers.h"
|
||||
|
||||
Registers::Registers() {
|
||||
|
||||
perf = Performance::getInstance();
|
||||
|
||||
initCSR();
|
||||
|
||||
//std::cout << "Memory size: 0x" << std::hex << Memory::SIZE << std::endl;
|
||||
//std::cout << "SP address: 0x" << std::hex << (0x10000000 / 4) - 1 << std::endl;
|
||||
|
||||
register_bank[sp] = Memory::SIZE - 4; // default stack at the end of the memory
|
||||
register_PC = 0x80000000; // default _start address
|
||||
}
|
||||
|
@ -108,7 +103,7 @@ void Registers::setValue(int reg_num, int32_t value) {
|
|||
}
|
||||
}
|
||||
|
||||
uint32_t Registers::getValue(int reg_num) {
|
||||
uint32_t Registers::getValue(int reg_num) const {
|
||||
if ((reg_num >= 0) && (reg_num < 32)) {
|
||||
perf->registerRead();
|
||||
return register_bank[reg_num];
|
||||
|
@ -125,7 +120,7 @@ void Registers::setPC(uint32_t new_pc) {
|
|||
register_PC = new_pc;
|
||||
}
|
||||
|
||||
uint32_t Registers::getCSR(int csr) {
|
||||
uint32_t Registers::getCSR(const int csr) {
|
||||
uint32_t ret_value;
|
||||
|
||||
switch (csr) {
|
||||
|
@ -156,14 +151,14 @@ uint32_t Registers::getCSR(int csr) {
|
|||
>> 32 & 0x00000000FFFFFFFF);
|
||||
break;
|
||||
[[likely]] default:
|
||||
ret_value = CSR[csr];
|
||||
ret_value = CSR[csr];
|
||||
break;
|
||||
}
|
||||
return ret_value;
|
||||
}
|
||||
|
||||
void Registers::setCSR(int csr, uint32_t value) {
|
||||
/* @FIXME: rv32mi-p-ma_fetch tests doesn't allow MISA to writable,
|
||||
/* @FIXME: rv32mi-p-ma_fetch tests doesn't allow MISA to be writable,
|
||||
* but Volume II: Privileged Architecture v1.10 says MISA is writable (?)
|
||||
*/
|
||||
if (csr != CSR_MISA) {
|
||||
|
|
Loading…
Reference in New Issue