23bbec6a34
arch/alpha/main.isa to test my files ... arch/mips/isa/operands.isa: use sd and ud instead of sdw and udw --HG-- extra : convert_revision : d66f3fd2c4a4d70e6015f0f1643c400cdfe73055
134 lines
3.6 KiB
Text
134 lines
3.6 KiB
Text
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Noop instruction
|
|
//
|
|
|
|
output header {{
|
|
/**
|
|
* Base class for integer operations.
|
|
*/
|
|
class Noop : public MipsStaticInst
|
|
{
|
|
protected:
|
|
|
|
/// Constructor
|
|
Noop(const char *mnem, MachInst _machInst, OpClass __opClass) : MipsStaticInst(mnem, _machInst, __opClass)
|
|
{
|
|
}
|
|
|
|
std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
|
|
};
|
|
}};
|
|
|
|
output decoder {{
|
|
std::string Noop::generateDisassembly(Addr pc, const SymbolTable *symtab) const
|
|
{
|
|
return "Disassembly of integer instruction\n";
|
|
}
|
|
}};
|
|
|
|
def template NoopExecute {{
|
|
Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const
|
|
{
|
|
//Nothing to see here, move along
|
|
return No_Fault;
|
|
}
|
|
}};
|
|
|
|
// Primary format for integer operate instructions:
|
|
def format Noop(code, *opt_flags) {{
|
|
orig_code = code
|
|
cblk = CodeBlock(code)
|
|
iop = InstObjParams(name, Name, 'MipsStaticInst', cblk, opt_flags)
|
|
header_output = BasicDeclare.subst(iop)
|
|
decoder_output = BasicConstructor.subst(iop)
|
|
decode_block = BasicDecodeWithMnemonic.subst(iop)
|
|
exec_output = NoopExecute.subst(iop)
|
|
}};
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Nop
|
|
//
|
|
|
|
output header {{
|
|
/**
|
|
* Static instruction class for no-ops. This is a leaf class.
|
|
*/
|
|
class Nop : public AlphaStaticInst
|
|
{
|
|
/// Disassembly of original instruction.
|
|
const std::string originalDisassembly;
|
|
|
|
public:
|
|
/// Constructor
|
|
Nop(const std::string _originalDisassembly, MachInst _machInst)
|
|
: AlphaStaticInst("nop", _machInst, No_OpClass),
|
|
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
|
|
AlphaStaticInst *
|
|
makeNop(AlphaStaticInst *inst)
|
|
{
|
|
AlphaStaticInst *nop = new Nop(inst->disassemble(0), inst->machInst);
|
|
delete inst;
|
|
return nop;
|
|
}
|
|
}};
|
|
|
|
output exec {{
|
|
Fault
|
|
Nop::execute(%(CPU_exec_context)s *, Trace::InstRecord *) const
|
|
{
|
|
return No_Fault;
|
|
}
|
|
}};
|
|
|
|
// integer & FP operate instructions use Rc as dest, so check for
|
|
// Rc == 31 to detect nops
|
|
def template OperateNopCheckDecode {{
|
|
{
|
|
AlphaStaticInst *i = new %(class_name)s(machInst);
|
|
if (RC == 31) {
|
|
i = makeNop(i);
|
|
}
|
|
return i;
|
|
}
|
|
}};
|
|
|
|
|
|
// Like BasicOperate format, but generates NOP if RC/FC == 31
|
|
def format BasicOperateWithNopCheck(code, *opt_args) {{
|
|
iop = InstObjParams(name, Name, 'AlphaStaticInst', CodeBlock(code),
|
|
opt_args)
|
|
header_output = BasicDeclare.subst(iop)
|
|
decoder_output = BasicConstructor.subst(iop)
|
|
decode_block = OperateNopCheckDecode.subst(iop)
|
|
exec_output = BasicExecute.subst(iop)
|
|
}};
|
|
|