|
|
|
@@ -379,9 +379,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(rd != 0) *(X+rd) = (int32_t)imm;
|
|
|
|
@@ -411,9 +412,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(rd != 0) *(X+rd) = *PC + (int32_t)imm;
|
|
|
|
@@ -443,9 +445,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -479,9 +482,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -516,9 +520,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(*(X+rs1) == *(X+rs2)) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm);
|
|
|
|
@@ -549,9 +554,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(*(X+rs1) != *(X+rs2)) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm);
|
|
|
|
@@ -582,9 +588,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if((int32_t)*(X+rs1) < (int32_t)*(X+rs2)) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm);
|
|
|
|
@@ -615,9 +622,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if((int32_t)*(X+rs1) >= (int32_t)*(X+rs2)) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm);
|
|
|
|
@@ -648,9 +656,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(*(X+rs1) < *(X+rs2)) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm);
|
|
|
|
@@ -681,9 +690,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(*(X+rs1) >= *(X+rs2)) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<13>(imm);
|
|
|
|
@@ -714,9 +724,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -750,9 +761,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -790,9 +802,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -830,9 +843,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -866,9 +880,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -906,9 +921,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
writeSpace1(traits::MEM, *(X+rs1) + (int16_t)sext<12>(imm), (int8_t)*(X+rs2));
|
|
|
|
@@ -939,9 +955,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -976,9 +993,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -1013,9 +1031,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(rd != 0) *(X+rd) = *(X+rs1) + (int16_t)sext<12>(imm);
|
|
|
|
@@ -1046,9 +1065,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(rd != 0) *(X+rd) = (int32_t)*(X+rs1) < (int16_t)sext<12>(imm)? 1 : 0;
|
|
|
|
@@ -1079,9 +1099,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(rd != 0) *(X+rd) = *(X+rs1) < (int16_t)sext<12>(imm)? 1 : 0;
|
|
|
|
@@ -1112,9 +1133,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(rd != 0) *(X+rd) = *(X+rs1) ^ (int16_t)sext<12>(imm);
|
|
|
|
@@ -1145,9 +1167,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(rd != 0) *(X+rd) = *(X+rs1) | (int16_t)sext<12>(imm);
|
|
|
|
@@ -1178,9 +1201,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(rd != 0) *(X+rd) = *(X+rs1) & (int16_t)sext<12>(imm);
|
|
|
|
@@ -1211,9 +1235,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(shamt > 31) {
|
|
|
|
@@ -1249,9 +1274,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(shamt > 31) {
|
|
|
|
@@ -1287,9 +1313,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(shamt > 31) {
|
|
|
|
@@ -1325,9 +1352,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(rd != 0) *(X+rd) = *(X+rs1) + *(X+rs2);
|
|
|
|
@@ -1358,9 +1386,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(rd != 0) *(X+rd) = *(X+rs1) - *(X+rs2);
|
|
|
|
@@ -1391,9 +1420,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(rd != 0) *(X+rd) = *(X+rs1) << (*(X+rs2) & (traits::XLEN - 1));
|
|
|
|
@@ -1424,9 +1454,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(rd != 0) *(X+rd) = (int32_t)*(X+rs1) < (int32_t)*(X+rs2)? 1 : 0;
|
|
|
|
@@ -1457,9 +1488,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(rd != 0) *(X+rd) = (uint32_t)*(X+rs1) < (uint32_t)*(X+rs2)? 1 : 0;
|
|
|
|
@@ -1490,9 +1522,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(rd != 0) *(X+rd) = *(X+rs1) ^ *(X+rs2);
|
|
|
|
@@ -1523,9 +1556,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(rd != 0) *(X+rd) = *(X+rs1) >> (*(X+rs2) & (traits::XLEN - 1));
|
|
|
|
@@ -1556,9 +1590,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(rd != 0) *(X+rd) = (int32_t)*(X+rs1) >> (*(X+rs2) & (traits::XLEN - 1));
|
|
|
|
@@ -1589,9 +1624,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(rd != 0) *(X+rd) = *(X+rs1) | *(X+rs2);
|
|
|
|
@@ -1622,9 +1658,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(rd != 0) *(X+rd) = *(X+rs1) & *(X+rs2);
|
|
|
|
@@ -1656,9 +1693,9 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
writeSpace1(traits::FENCE, traits::fence, pred << 4 | succ);
|
|
|
|
@@ -1689,9 +1726,9 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
writeSpace2(traits::FENCE, traits::fencei, imm);
|
|
|
|
@@ -1716,9 +1753,9 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
raise(0, 11);
|
|
|
|
@@ -1743,9 +1780,9 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
raise(0, 3);
|
|
|
|
@@ -1770,9 +1807,9 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
leave(0);
|
|
|
|
@@ -1797,9 +1834,9 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
leave(1);
|
|
|
|
@@ -1824,9 +1861,9 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
leave(3);
|
|
|
|
@@ -1851,9 +1888,9 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
wait(1);
|
|
|
|
@@ -1883,9 +1920,9 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -1919,9 +1956,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -1962,9 +2000,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2000,9 +2039,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2038,9 +2078,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2074,9 +2115,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2111,9 +2153,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2148,9 +2191,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2186,9 +2230,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2224,9 +2269,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2262,9 +2308,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2300,9 +2347,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2342,9 +2390,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2380,9 +2429,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2422,9 +2472,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 4;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2459,9 +2510,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2495,9 +2547,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2532,9 +2585,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2568,9 +2622,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
*(X+rs1) = *(X+rs1) + (int8_t)sext<6>(imm);
|
|
|
|
@@ -2596,9 +2651,9 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2628,9 +2683,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2663,9 +2719,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2697,9 +2754,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2732,9 +2790,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(nzimm) *(X+2) = *(X+2) + (int16_t)sext<10>(nzimm);
|
|
|
|
@@ -2765,9 +2824,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2800,9 +2860,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(shamt) {
|
|
|
|
@@ -2839,9 +2900,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2874,9 +2936,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2909,9 +2972,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2944,9 +3008,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -2979,9 +3044,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -3013,9 +3079,9 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
pc_assign(*NEXT_PC) = *PC + (int16_t)sext<12>(imm);
|
|
|
|
@@ -3045,9 +3111,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(*(X+(rs1 + 8)) == 0) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<9>(imm);
|
|
|
|
@@ -3077,9 +3144,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(*(X+(rs1 + 8)) != 0) pc_assign(*NEXT_PC) = *PC + (int16_t)sext<9>(imm);
|
|
|
|
@@ -3109,9 +3177,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(nzuimm) *(X+rs1) = *(X+rs1) << nzuimm;
|
|
|
|
@@ -3141,9 +3210,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(rd) {
|
|
|
|
@@ -3177,9 +3247,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
*(X+rd) = *(X+rs2);
|
|
|
|
@@ -3208,9 +3279,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
if(rs1) pc_assign(*NEXT_PC) = *(X+rs1);
|
|
|
|
@@ -3241,9 +3313,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
*(X+rd) = *(X+rd) + *(X+rs2);
|
|
|
|
@@ -3272,9 +3345,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -3302,9 +3376,9 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
raise(0, 3);
|
|
|
|
@@ -3334,9 +3408,10 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
{
|
|
|
|
@@ -3364,9 +3439,9 @@ private:
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// prepare execution
|
|
|
|
|
uint32_t* X = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::X0]);
|
|
|
|
|
uint32_t* PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
|
|
|
|
|
uint32_t* NEXT_PC = reinterpret_cast<uint32_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
|
|
|
|
|
// used registers// calculate next pc value
|
|
|
|
|
*NEXT_PC = *PC + 2;
|
|
|
|
|
// execute instruction
|
|
|
|
|
raise(0, 2);
|
|
|
|
@@ -3435,6 +3510,9 @@ vm_impl<ARCH>::vm_impl(ARCH &core, unsigned core_id, unsigned cluster_id)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline bool is_count_limit_enabled(finish_cond_e cond){
|
|
|
|
|
return (cond & finish_cond_e::COUNT_LIMIT) == finish_cond_e::COUNT_LIMIT;
|
|
|
|
|
}
|
|
|
|
|
template <typename ARCH>
|
|
|
|
|
typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e cond, virt_addr_t start, uint64_t icount_limit){
|
|
|
|
|
// we fetch at max 4 byte, alignment is 2
|
|
|
|
@@ -3443,8 +3521,7 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co
|
|
|
|
|
auto *const data = (uint8_t *)&insn;
|
|
|
|
|
auto pc=start;
|
|
|
|
|
while(!this->core.should_stop() &&
|
|
|
|
|
!((cond & finish_cond_e::COUNT_LIMIT) == finish_cond_e::COUNT_LIMIT &&
|
|
|
|
|
this->core.get_icount() < icount_limit)){
|
|
|
|
|
!(is_count_limit_enabled(cond) && this->core.get_icount() >= icount_limit)){
|
|
|
|
|
auto res = fetch_ins(pc, data);
|
|
|
|
|
if(res!=iss::Ok){
|
|
|
|
|
auto new_pc = super::core.enter_trap(TRAP_ID, pc.val);
|
|
|
|
|