2006-02-18 09:12:04 +01:00
|
|
|
// -*- mode:c++ -*-
|
2006-02-15 04:43:14 +01:00
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
|
|
// Nop
|
|
|
|
//
|
|
|
|
|
|
|
|
output header {{
|
|
|
|
/**
|
|
|
|
* Static instruction class for no-ops. This is a leaf class.
|
|
|
|
*/
|
2006-02-18 09:12:04 +01:00
|
|
|
class Nop : public MipsStaticInst
|
2006-02-15 04:43:14 +01:00
|
|
|
{
|
|
|
|
/// Disassembly of original instruction.
|
|
|
|
const std::string originalDisassembly;
|
|
|
|
|
|
|
|
public:
|
|
|
|
/// Constructor
|
|
|
|
Nop(const std::string _originalDisassembly, MachInst _machInst)
|
2006-02-18 09:12:04 +01:00
|
|
|
: MipsStaticInst("nop", _machInst, No_OpClass),
|
2006-02-15 04:43:14 +01:00
|
|
|
originalDisassembly(_originalDisassembly)
|
|
|
|
{
|
|
|
|
flags[IsNop] = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
~Nop() { }
|
|
|
|
|
|
|
|
std::string
|
|
|
|
generateDisassembly(Addr pc, const SymbolTable *symtab) const;
|
|
|
|
|
|
|
|
%(BasicExecDeclare)s
|
|
|
|
};
|
|
|
|
}};
|
|
|
|
|
|
|
|
output decoder {{
|
|
|
|
std::string Nop::generateDisassembly(Addr pc,
|
|
|
|
const SymbolTable *symtab) const
|
|
|
|
{
|
|
|
|
#ifdef SS_COMPATIBLE_DISASSEMBLY
|
|
|
|
return originalDisassembly;
|
|
|
|
#else
|
|
|
|
return csprintf("%-10s (%s)", "nop", originalDisassembly);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Helper function for decoding nops. Substitute Nop object
|
|
|
|
/// for original inst passed in as arg (and delete latter).
|
|
|
|
inline
|
2006-02-18 09:12:04 +01:00
|
|
|
MipsStaticInst *
|
|
|
|
makeNop(MipsStaticInst *inst)
|
2006-02-15 04:43:14 +01:00
|
|
|
{
|
2006-02-18 09:12:04 +01:00
|
|
|
MipsStaticInst *nop = new Nop(inst->disassemble(0), inst->machInst);
|
2006-02-15 04:43:14 +01:00
|
|
|
delete inst;
|
|
|
|
return nop;
|
|
|
|
}
|
|
|
|
}};
|
|
|
|
|
|
|
|
output exec {{
|
|
|
|
Fault
|
|
|
|
Nop::execute(%(CPU_exec_context)s *, Trace::InstRecord *) const
|
|
|
|
{
|
|
|
|
return No_Fault;
|
|
|
|
}
|
|
|
|
}};
|
|
|
|
|
2006-02-22 09:33:35 +01:00
|
|
|
// integer & FP operate instructions use RT as dest, so check for
|
|
|
|
// RT == 0 to detect nops
|
2006-02-15 04:43:14 +01:00
|
|
|
def template OperateNopCheckDecode {{
|
|
|
|
{
|
2006-02-18 09:12:04 +01:00
|
|
|
MipsStaticInst *i = new %(class_name)s(machInst);
|
2006-02-22 09:33:35 +01:00
|
|
|
if (RD == 0) {
|
2006-02-15 04:43:14 +01:00
|
|
|
i = makeNop(i);
|
|
|
|
}
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
}};
|
|
|
|
|
|
|
|
|
|
|
|
// Like BasicOperate format, but generates NOP if RC/FC == 31
|
|
|
|
def format BasicOperateWithNopCheck(code, *opt_args) {{
|
2006-02-18 09:12:04 +01:00
|
|
|
iop = InstObjParams(name, Name, 'MipsStaticInst', CodeBlock(code),
|
2006-02-15 04:43:14 +01:00
|
|
|
opt_args)
|
|
|
|
header_output = BasicDeclare.subst(iop)
|
|
|
|
decoder_output = BasicConstructor.subst(iop)
|
|
|
|
decode_block = OperateNopCheckDecode.subst(iop)
|
|
|
|
exec_output = BasicExecute.subst(iop)
|
|
|
|
}};
|
|
|
|
|