| //////////////////////////////////////////////////////////////////// |
| // |
| // Nop instruction |
| // |
| |
| output header {{ |
| /** |
| * Nop class. |
| */ |
| class Nop : public SparcStaticInst |
| { |
| public: |
| // Constructor |
| Nop(const char *mnem, ExtMachInst _machInst, OpClass __opClass) : |
| SparcStaticInst(mnem, _machInst, __opClass) |
| { |
| } |
| |
| // All Nop instructions do the same thing, so this can be |
| // defined here. Nops can be defined directly, so there needs |
| // to be a default implementation |
| Fault execute(%(CPU_exec_context)s *xc, |
| Trace::InstRecord *traceData) const |
| { |
| //Nothing to see here, move along |
| return NoFault; |
| } |
| |
| std::string generateDisassembly(Addr pc, |
| const SymbolTable *symtab) const; |
| }; |
| }}; |
| |
| output decoder {{ |
| std::string Nop::generateDisassembly(Addr pc, |
| const SymbolTable *symtab) const |
| { |
| std::stringstream response; |
| printMnemonic(response, mnemonic); |
| return response.str(); |
| } |
| }}; |
| |
| def template NopExecute {{ |
| Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, |
| Trace::InstRecord *traceData) const |
| { |
| //Nothing to see here, move along |
| return NoFault; |
| } |
| }}; |
| |
| // Primary format for integer operate instructions: |
| def format Nop(code, *opt_flags) {{ |
| orig_code = code |
| cblk = CodeBlock(code) |
| iop = InstObjParams(name, Name, 'Nop', cblk, opt_flags) |
| header_output = BasicDeclare.subst(iop) |
| decoder_output = BasicConstructor.subst(iop) |
| decode_block = BasicDecode.subst(iop) |
| exec_output = NopExecute.subst(iop) |
| }}; |