CPU: Merge the predecoder and decoder.
These classes are always used together, and merging them will give the ISAs more flexibility in how they cache things and manage the process. --HG-- rename : src/arch/x86/predecoder_tables.cc => src/arch/x86/decoder_tables.cc
This commit is contained in:
@@ -31,15 +31,72 @@
|
||||
#ifndef __ARCH_MIPS_DECODER_HH__
|
||||
#define __ARCH_MIPS_DECODER_HH__
|
||||
|
||||
#include "arch/types.hh"
|
||||
#include "arch/mips/types.hh"
|
||||
#include "base/misc.hh"
|
||||
#include "base/types.hh"
|
||||
#include "cpu/decode_cache.hh"
|
||||
#include "cpu/static_inst_fwd.hh"
|
||||
|
||||
class ThreadContext;
|
||||
|
||||
namespace MipsISA
|
||||
{
|
||||
|
||||
class Decoder
|
||||
{
|
||||
protected:
|
||||
ThreadContext * tc;
|
||||
//The extended machine instruction being generated
|
||||
ExtMachInst emi;
|
||||
bool instDone;
|
||||
|
||||
public:
|
||||
Decoder(ThreadContext * _tc) : tc(_tc), instDone(false)
|
||||
{}
|
||||
|
||||
ThreadContext *getTC()
|
||||
{
|
||||
return tc;
|
||||
}
|
||||
|
||||
void
|
||||
setTC(ThreadContext *_tc)
|
||||
{
|
||||
tc = _tc;
|
||||
}
|
||||
|
||||
void
|
||||
process()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
reset()
|
||||
{
|
||||
instDone = false;
|
||||
}
|
||||
|
||||
//Use this to give data to the decoder. This should be used
|
||||
//when there is control flow.
|
||||
void
|
||||
moreBytes(const PCState &pc, Addr fetchPC, MachInst inst)
|
||||
{
|
||||
emi = inst;
|
||||
instDone = true;
|
||||
}
|
||||
|
||||
bool
|
||||
needMoreBytes()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
instReady()
|
||||
{
|
||||
return instDone;
|
||||
}
|
||||
|
||||
protected:
|
||||
/// A cache of decoded instruction objects.
|
||||
static DecodeCache defaultCache;
|
||||
@@ -55,6 +112,15 @@ class Decoder
|
||||
{
|
||||
return defaultCache.decode(this, mach_inst, addr);
|
||||
}
|
||||
|
||||
StaticInstPtr
|
||||
decode(MipsISA::PCState &nextPC)
|
||||
{
|
||||
if (!instDone)
|
||||
return NULL;
|
||||
instDone = false;
|
||||
return decode(emi, nextPC.instAddr());
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace MipsISA
|
||||
|
||||
Reference in New Issue
Block a user