noop.isa revision 2686
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 return csprintf("%-10s %s", "nop", originalDisassembly); 40 } 41 42 /// Helper function for decoding nops. Substitute Nop object 43 /// for original inst passed in as arg (and delete latter). 44 inline 45 MipsStaticInst * 46 makeNop(MipsStaticInst *inst) 47 { 48 MipsStaticInst *nop = new Nop(inst->disassemble(0), inst->machInst); 49 delete inst; 50 return nop; 51 } 52}}; 53 54output exec {{ 55 Fault 56 Nop::execute(%(CPU_exec_context)s *, Trace::InstRecord *) const 57 { 58 return NoFault; 59 } 60}}; 61 62// integer & FP operate instructions use RT as dest, so check for 63// RT == 0 to detect nops 64def template OperateNopCheckDecode {{ 65 { 66 MipsStaticInst *i = new %(class_name)s(machInst); 67 68 //if (RD == 0) { 69 // i = makeNop(i); 70 //} 71 72 return i; 73 } 74}}; 75 76 77// Like BasicOperate format, but generates NOP if RC/FC == 31 78def format BasicOperateWithNopCheck(code, *opt_args) {{ 79 iop = InstObjParams(name, Name, 'MipsStaticInst', CodeBlock(code), 80 opt_args) 81 header_output = BasicDeclare.subst(iop) 82 decoder_output = BasicConstructor.subst(iop) 83 decode_block = OperateNopCheckDecode.subst(iop) 84 exec_output = BasicExecute.subst(iop) 85}}; 86 87def format Nop() {{ 88 decode_block = 'return new Nop(\"\",machInst);\n' 89}}; 90 91