noop.isa revision 2135
1// -*- mode:c++ -*- 2 3//////////////////////////////////////////////////////////////////// 4// 5// Nop 6// 7 8output header {{ 9 /** 10 * Static instruction class for no-ops. This is a leaf class. 11 */ 12 class Nop : public MipsStaticInst 13 { 14 /// Disassembly of original instruction. 15 const std::string originalDisassembly; 16 17 public: 18 /// Constructor 19 Nop(const std::string _originalDisassembly, MachInst _machInst) 20 : MipsStaticInst("nop", _machInst, No_OpClass), 21 originalDisassembly(_originalDisassembly) 22 { 23 flags[IsNop] = true; 24 } 25 26 ~Nop() { } 27 28 std::string 29 generateDisassembly(Addr pc, const SymbolTable *symtab) const; 30 31 %(BasicExecDeclare)s 32 }; 33}}; 34 35output decoder {{ 36 std::string Nop::generateDisassembly(Addr pc, 37 const SymbolTable *symtab) const 38 { 39#ifdef SS_COMPATIBLE_DISASSEMBLY 40 return originalDisassembly; 41#else 42 return csprintf("%-10s (%s)", "nop", originalDisassembly); 43#endif 44 } 45 46 /// Helper function for decoding nops. Substitute Nop object 47 /// for original inst passed in as arg (and delete latter). 48 inline 49 MipsStaticInst * 50 makeNop(MipsStaticInst *inst) 51 { 52 MipsStaticInst *nop = new Nop(inst->disassemble(0), inst->machInst); 53 delete inst; 54 return nop; 55 } 56}}; 57 58output exec {{ 59 Fault 60 Nop::execute(%(CPU_exec_context)s *, Trace::InstRecord *) const 61 { 62 return No_Fault; 63 } 64}}; 65 66// integer & FP operate instructions use RT as dest, so check for 67// RT == 0 to detect nops 68def template OperateNopCheckDecode {{ 69 { 70 MipsStaticInst *i = new %(class_name)s(machInst); 71 if (RD == 0) { 72 i = makeNop(i); 73 } 74 return i; 75 } 76}}; 77 78 79// Like BasicOperate format, but generates NOP if RC/FC == 31 80def format BasicOperateWithNopCheck(code, *opt_args) {{ 81 iop = InstObjParams(name, Name, 'MipsStaticInst', CodeBlock(code), 82 opt_args) 83 header_output = BasicDeclare.subst(iop) 84 decoder_output = BasicConstructor.subst(iop) 85 decode_block = OperateNopCheckDecode.subst(iop) 86 exec_output = BasicExecute.subst(iop) 87}}; 88 89