2a3
> * Copyright (c) The University of Virginia
28a30
> * Alec Roelke
31a34,35
> #include "arch/riscv/types.hh"
> #include "debug/Decode.hh"
36c40,44
< GenericISA::BasicDecodeCache Decoder::defaultCache;
---
> void
> Decoder::moreBytes(const PCState &pc, Addr fetchPC, MachInst inst)
> {
> DPRINTF(Decode, "Getting bytes 0x%08x from address %#x\n",
> inst, pc.pc());
37a46,62
> bool aligned = pc.pc() % sizeof(MachInst) == 0;
> if (mid) {
> assert(!aligned);
> emi |= (inst & 0xFFFF) << 16;
> instDone = true;
> } else {
> MachInst instChunk = aligned ? inst & 0xFFFF :
> (inst & 0xFFFF0000) >> 16;
> if (aligned) {
> emi = (inst & 0x3) < 0x3 ? instChunk : inst;
> instDone = true;
> } else {
> emi = instChunk;
> instDone = (instChunk & 0x3) < 0x3;
> }
> }
> mid = !instDone;
38a64,97
>
> StaticInstPtr
> Decoder::decode(ExtMachInst mach_inst, Addr addr)
> {
> DPRINTF(Decode, "Decoding instruction 0x%08x at address %#x\n",
> mach_inst, addr);
> if (instMap.find(mach_inst) != instMap.end())
> return instMap[mach_inst];
> else {
> StaticInstPtr si = decodeInst(mach_inst);
> instMap[mach_inst] = si;
> return si;
> }
> }
>
> StaticInstPtr
> Decoder::decode(RiscvISA::PCState &nextPC)
> {
> if (!instDone)
> return nullptr;
> instDone = false;
>
> if ((emi & 0x3) < 0x3) {
> nextPC.compressed(true);
> nextPC.npc(nextPC.pc() + sizeof(MachInst)/2);
> } else {
> nextPC.compressed(false);
> nextPC.npc(nextPC.pc() + sizeof(MachInst));
> }
>
> return decode(emi, nextPC.instAddr());
> }
>
> }