| 3// Copyright (c) 2003-2006 The Regents of The University of Michigan 4// All rights reserved. 5// 6// Redistribution and use in source and binary forms, with or without 7// modification, are permitted provided that the following conditions are 8// met: redistributions of source code must retain the above copyright 9// notice, this list of conditions and the following disclaimer; 10// redistributions in binary form must reproduce the above copyright 11// notice, this list of conditions and the following disclaimer in the 12// documentation and/or other materials provided with the distribution; 13// neither the name of the copyright holders nor the names of its 14// contributors may be used to endorse or promote products derived from 15// this software without specific prior written permission. 16// 17// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28// 29// Authors: Korey Sewell 30
|
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
| 31//////////////////////////////////////////////////////////////////// 32// 33// Nop 34// 35 36output header {{ 37 /** 38 * Static instruction class for no-ops. This is a leaf class. 39 */ 40 class Nop : public MipsStaticInst 41 { 42 /// Disassembly of original instruction. 43 const std::string originalDisassembly; 44 45 public: 46 /// Constructor 47 Nop(const std::string _originalDisassembly, MachInst _machInst) 48 : MipsStaticInst("nop", _machInst, No_OpClass), 49 originalDisassembly(_originalDisassembly) 50 { 51 flags[IsNop] = true; 52 } 53 54 ~Nop() { } 55 56 std::string 57 generateDisassembly(Addr pc, const SymbolTable *symtab) const; 58 59 %(BasicExecDeclare)s 60 }; 61}}; 62 63output decoder {{ 64 std::string Nop::generateDisassembly(Addr pc, 65 const SymbolTable *symtab) const 66 { 67 return csprintf("%-10s %s", "nop", originalDisassembly); 68 } 69 70 /// Helper function for decoding nops. Substitute Nop object 71 /// for original inst passed in as arg (and delete latter). 72 inline 73 MipsStaticInst * 74 makeNop(MipsStaticInst *inst) 75 { 76 MipsStaticInst *nop = new Nop(inst->disassemble(0), inst->machInst); 77 delete inst; 78 return nop; 79 } 80}}; 81 82output exec {{ 83 Fault 84 Nop::execute(%(CPU_exec_context)s *, Trace::InstRecord *) const 85 { 86 return NoFault; 87 } 88}}; 89 90// integer & FP operate instructions use RT as dest, so check for 91// RT == 0 to detect nops 92def template OperateNopCheckDecode {{ 93 { 94 MipsStaticInst *i = new %(class_name)s(machInst); 95 96 //if (RD == 0) { 97 // i = makeNop(i); 98 //} 99 100 return i; 101 } 102}}; 103 104 105// Like BasicOperate format, but generates NOP if RC/FC == 31 106def format BasicOperateWithNopCheck(code, *opt_args) {{ 107 iop = InstObjParams(name, Name, 'MipsStaticInst', CodeBlock(code), 108 opt_args) 109 header_output = BasicDeclare.subst(iop) 110 decoder_output = BasicConstructor.subst(iop) 111 decode_block = OperateNopCheckDecode.subst(iop) 112 exec_output = BasicExecute.subst(iop) 113}}; 114 115def format Nop() {{ 116 decode_block = 'return new Nop(\"\",machInst);\n' 117}}; 118
|