#include "insn_template.h"
-reg_t rv32_NAME(processor_t* p, insn_t insn, reg_t pc)
+#ifdef SPIKE_SIMPLEV
+#include "sv_decode.h"
+#endif
+
+reg_t rv32_NAME(processor_t* p, insn_t s_insn, reg_t pc)
{
int xlen = 32;
reg_t npc = sext_xlen(pc + insn_length(OPCODE));
+ insn_bits_t bits = s_insn.bits();
+#ifdef SPIKE_SIMPLEV
+ sv_insn_t insn(bits);
+ #include "insns/NAME.h"
+ trace_opcode(p, OPCODE, s_insn);
+#else
+ insn_t insn(bits);
#include "insns/NAME.h"
- trace_opcode(p, OPCODE, insn);
+ trace_opcode(p, OPCODE, s_insn);
+#endif
return npc;
}
-reg_t rv64_NAME(processor_t* p, insn_t insn, reg_t pc)
+reg_t rv64_NAME(processor_t* p, insn_t s_insn, reg_t pc)
{
int xlen = 64;
reg_t npc = sext_xlen(pc + insn_length(OPCODE));
+ insn_bits_t bits = s_insn.bits();
+#ifdef SPIKE_SIMPLEV
+ sv_insn_t insn(bits);
+ #include "insns/NAME.h"
+ trace_opcode(p, OPCODE, s_insn);
+#else
+ insn_t insn(bits);
#include "insns/NAME.h"
- trace_opcode(p, OPCODE, insn);
+ trace_opcode(p, OPCODE, s_insn);
+#endif
return npc;
}
class sv_insn_t: public insn_t
{
public:
+ sv_insn_t(insn_bits_t bits) : insn_t(bits) {}
uint64_t rd () { return remap(insn_t::rd()); }
- uint64_t rs1() { return remap(insn_t::rs1(); }
- uint64_t rs2() { return remap(insn_t::rs2(); }
- uint64_t rs3() { return remap(insn_t::rs3(); }
+ uint64_t rs1() { return remap(insn_t::rs1()); }
+ uint64_t rs2() { return remap(insn_t::rs2()); }
+ uint64_t rs3() { return remap(insn_t::rs3()); }
private:
// remaps the register through the lookup table.
// will need to take the current loop index/offset somehow