Actually we do need a separate class for Integer Ops with Immediates!!!
The extra class is needed because of the necessisty of an immediate member variable. Also, added some 'very modest' python code to choose between the IntOp and the IntImmOp based on the instruction name ... --HG-- extra : convert_revision : f109c12418202a99b40e270360134e8335739836
This commit is contained in:
parent
d30262d480
commit
7219693f4c
1 changed files with 28 additions and 29 deletions
|
@ -12,7 +12,22 @@ output header {{
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
/// Constructor
|
/// Constructor
|
||||||
IntegerOp(const char *mnem, MachInst _machInst, OpClass __opClass) : MipsStaticInst(mnem, _machInst, __opClass)
|
IntegerOp(const char *mnem, MachInst _machInst, OpClass __opClass) :
|
||||||
|
MipsStaticInst(mnem, _machInst, __opClass)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
class IntImmOp : public MipsStaticInst
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
uint16_t imm;
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
IntegerOp(const char *mnem, MachInst _machInst, OpClass __opClass) :
|
||||||
|
MipsStaticInst(mnem, _machInst, __opClass),imm(INTIMM)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,39 +48,23 @@ output decoder {{
|
||||||
}
|
}
|
||||||
}};
|
}};
|
||||||
|
|
||||||
def template IntExecute {{
|
|
||||||
Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const
|
|
||||||
{
|
|
||||||
//Attempt to execute the instruction
|
|
||||||
try
|
|
||||||
{
|
|
||||||
%(op_decl)s;
|
|
||||||
%(op_rd)s;
|
|
||||||
%(code)s;
|
|
||||||
}
|
|
||||||
//If we have an exception for some reason,
|
|
||||||
//deal with it
|
|
||||||
catch(MipsException except)
|
|
||||||
{
|
|
||||||
//Deal with exception
|
|
||||||
return No_Fault;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Write the resulting state to the execution context
|
|
||||||
%(op_wb)s;
|
|
||||||
|
|
||||||
return No_Fault;
|
|
||||||
}
|
|
||||||
}};
|
|
||||||
|
|
||||||
// Primary format for integer operate instructions:
|
// Primary format for integer operate instructions:
|
||||||
def format IntOp(code, *opt_flags) {{
|
def format IntOp(code, *opt_flags) {{
|
||||||
orig_code = code
|
orig_code = code
|
||||||
cblk = CodeBlock(code)
|
cblk = CodeBlock(code)
|
||||||
iop = InstObjParams(name, Name, 'MipsStaticInst', cblk, opt_flags)
|
|
||||||
|
//Figure out if we are creating a IntImmOp or a IntOp
|
||||||
|
strlen = len(name)
|
||||||
|
if ( name[strlen-1] = 'i' or ( name[strlen-2:] = 'iu'))
|
||||||
|
iop = InstObjParams(name, Name, 'IntOp', cblk, opt_flags)
|
||||||
|
else:
|
||||||
|
iop = InstObjParams(name, Name, 'IntImmOp', cblk, opt_flags)
|
||||||
|
|
||||||
header_output = BasicDeclare.subst(iop)
|
header_output = BasicDeclare.subst(iop)
|
||||||
decoder_output = BasicConstructor.subst(iop)
|
decoder_output = BasicConstructor.subst(iop)
|
||||||
decode_block = BasicDecodeWithMnemonic.subst(iop)
|
decode_block = OperateNopCheckDecode.subst(iop)
|
||||||
exec_output = IntegerExecute.subst(iop)
|
exec_output = BasicExecute.subst(iop)
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue