New function to increase PC by 2 (incPCby2) instead of a parameter to incPC function, could be faster code.

This commit is contained in:
Màrius Montón 2021-11-11 14:52:50 +01:00
parent 429a67fbef
commit d8a20db976
4 changed files with 24 additions and 27 deletions

View File

@ -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();

View File

@ -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;
}

View File

@ -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());
}

View File

@ -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) {