unimp.isa revision 3268
13268Sgblack@eecs.umich.edu// -*- mode:c++ -*- 23268Sgblack@eecs.umich.edu 33268Sgblack@eecs.umich.edu// Copyright (c) 2003-2005 The Regents of The University of Michigan 43268Sgblack@eecs.umich.edu// All rights reserved. 53268Sgblack@eecs.umich.edu// 63268Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without 73268Sgblack@eecs.umich.edu// modification, are permitted provided that the following conditions are 83268Sgblack@eecs.umich.edu// met: redistributions of source code must retain the above copyright 93268Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer; 103268Sgblack@eecs.umich.edu// redistributions in binary form must reproduce the above copyright 113268Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the 123268Sgblack@eecs.umich.edu// documentation and/or other materials provided with the distribution; 133268Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its 143268Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from 153268Sgblack@eecs.umich.edu// this software without specific prior written permission. 163268Sgblack@eecs.umich.edu// 173268Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 183268Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 193268Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 203268Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 213268Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 223268Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 233268Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 243268Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 253268Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 263268Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 273268Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 283268Sgblack@eecs.umich.edu// 293268Sgblack@eecs.umich.edu// Authors: Steve Reinhardt 303268Sgblack@eecs.umich.edu 313268Sgblack@eecs.umich.edu//////////////////////////////////////////////////////////////////// 323268Sgblack@eecs.umich.edu// 333268Sgblack@eecs.umich.edu// Unimplemented instructions 343268Sgblack@eecs.umich.edu// 353268Sgblack@eecs.umich.edu 363268Sgblack@eecs.umich.eduoutput header {{ 373268Sgblack@eecs.umich.edu /** 383268Sgblack@eecs.umich.edu * Static instruction class for unimplemented instructions that 393268Sgblack@eecs.umich.edu * cause simulator termination. Note that these are recognized 403268Sgblack@eecs.umich.edu * (legal) instructions that the simulator does not support; the 413268Sgblack@eecs.umich.edu * 'Unknown' class is used for unrecognized/illegal instructions. 423268Sgblack@eecs.umich.edu * This is a leaf class. 433268Sgblack@eecs.umich.edu */ 443268Sgblack@eecs.umich.edu class FailUnimplemented : public SparcStaticInst 453268Sgblack@eecs.umich.edu { 463268Sgblack@eecs.umich.edu public: 473268Sgblack@eecs.umich.edu /// Constructor 483268Sgblack@eecs.umich.edu FailUnimplemented(const char *_mnemonic, ExtMachInst _machInst) 493268Sgblack@eecs.umich.edu : SparcStaticInst(_mnemonic, _machInst, No_OpClass) 503268Sgblack@eecs.umich.edu { 513268Sgblack@eecs.umich.edu // don't call execute() (which panics) if we're on a 523268Sgblack@eecs.umich.edu // speculative path 533268Sgblack@eecs.umich.edu flags[IsNonSpeculative] = true; 543268Sgblack@eecs.umich.edu } 553268Sgblack@eecs.umich.edu 563268Sgblack@eecs.umich.edu %(BasicExecDeclare)s 573268Sgblack@eecs.umich.edu 583268Sgblack@eecs.umich.edu std::string 593268Sgblack@eecs.umich.edu generateDisassembly(Addr pc, const SymbolTable *symtab) const; 603268Sgblack@eecs.umich.edu }; 613268Sgblack@eecs.umich.edu 623268Sgblack@eecs.umich.edu /** 633268Sgblack@eecs.umich.edu * Base class for unimplemented instructions that cause a warning 643268Sgblack@eecs.umich.edu * to be printed (but do not terminate simulation). This 653268Sgblack@eecs.umich.edu * implementation is a little screwy in that it will print a 663268Sgblack@eecs.umich.edu * warning for each instance of a particular unimplemented machine 673268Sgblack@eecs.umich.edu * instruction, not just for each unimplemented opcode. Should 683268Sgblack@eecs.umich.edu * probably make the 'warned' flag a static member of the derived 693268Sgblack@eecs.umich.edu * class. 703268Sgblack@eecs.umich.edu */ 713268Sgblack@eecs.umich.edu class WarnUnimplemented : public SparcStaticInst 723268Sgblack@eecs.umich.edu { 733268Sgblack@eecs.umich.edu private: 743268Sgblack@eecs.umich.edu /// Have we warned on this instruction yet? 753268Sgblack@eecs.umich.edu mutable bool warned; 763268Sgblack@eecs.umich.edu 773268Sgblack@eecs.umich.edu public: 783268Sgblack@eecs.umich.edu /// Constructor 793268Sgblack@eecs.umich.edu WarnUnimplemented(const char *_mnemonic, ExtMachInst _machInst) 803268Sgblack@eecs.umich.edu : SparcStaticInst(_mnemonic, _machInst, No_OpClass), warned(false) 813268Sgblack@eecs.umich.edu { 823268Sgblack@eecs.umich.edu // don't call execute() (which panics) if we're on a 833268Sgblack@eecs.umich.edu // speculative path 843268Sgblack@eecs.umich.edu flags[IsNonSpeculative] = true; 853268Sgblack@eecs.umich.edu } 863268Sgblack@eecs.umich.edu 873268Sgblack@eecs.umich.edu %(BasicExecDeclare)s 883268Sgblack@eecs.umich.edu 893268Sgblack@eecs.umich.edu std::string 903268Sgblack@eecs.umich.edu generateDisassembly(Addr pc, const SymbolTable *symtab) const; 913268Sgblack@eecs.umich.edu }; 923268Sgblack@eecs.umich.edu}}; 933268Sgblack@eecs.umich.edu 943268Sgblack@eecs.umich.eduoutput decoder {{ 953268Sgblack@eecs.umich.edu std::string 963268Sgblack@eecs.umich.edu FailUnimplemented::generateDisassembly(Addr pc, 973268Sgblack@eecs.umich.edu const SymbolTable *symtab) const 983268Sgblack@eecs.umich.edu { 993268Sgblack@eecs.umich.edu return csprintf("%-10s (unimplemented)", mnemonic); 1003268Sgblack@eecs.umich.edu } 1013268Sgblack@eecs.umich.edu 1023268Sgblack@eecs.umich.edu std::string 1033268Sgblack@eecs.umich.edu WarnUnimplemented::generateDisassembly(Addr pc, 1043268Sgblack@eecs.umich.edu const SymbolTable *symtab) const 1053268Sgblack@eecs.umich.edu { 1063268Sgblack@eecs.umich.edu#ifdef SS_COMPATIBLE_DISASSEMBLY 1073268Sgblack@eecs.umich.edu return csprintf("%-10s", mnemonic); 1083268Sgblack@eecs.umich.edu#else 1093268Sgblack@eecs.umich.edu return csprintf("%-10s (unimplemented)", mnemonic); 1103268Sgblack@eecs.umich.edu#endif 1113268Sgblack@eecs.umich.edu } 1123268Sgblack@eecs.umich.edu}}; 1133268Sgblack@eecs.umich.edu 1143268Sgblack@eecs.umich.eduoutput exec {{ 1153268Sgblack@eecs.umich.edu Fault 1163268Sgblack@eecs.umich.edu FailUnimplemented::execute(%(CPU_exec_context)s *xc, 1173268Sgblack@eecs.umich.edu Trace::InstRecord *traceData) const 1183268Sgblack@eecs.umich.edu { 1193268Sgblack@eecs.umich.edu panic("attempt to execute unimplemented instruction '%s' " 1203268Sgblack@eecs.umich.edu "(inst 0x%08x)", mnemonic, machInst); 1213268Sgblack@eecs.umich.edu return NoFault; 1223268Sgblack@eecs.umich.edu } 1233268Sgblack@eecs.umich.edu 1243268Sgblack@eecs.umich.edu Fault 1253268Sgblack@eecs.umich.edu WarnUnimplemented::execute(%(CPU_exec_context)s *xc, 1263268Sgblack@eecs.umich.edu Trace::InstRecord *traceData) const 1273268Sgblack@eecs.umich.edu { 1283268Sgblack@eecs.umich.edu if (!warned) { 1293268Sgblack@eecs.umich.edu warn("instruction '%s' unimplemented\n", mnemonic); 1303268Sgblack@eecs.umich.edu warned = true; 1313268Sgblack@eecs.umich.edu } 1323268Sgblack@eecs.umich.edu 1333268Sgblack@eecs.umich.edu return NoFault; 1343268Sgblack@eecs.umich.edu } 1353268Sgblack@eecs.umich.edu}}; 1363268Sgblack@eecs.umich.edu 1373268Sgblack@eecs.umich.edu 1383268Sgblack@eecs.umich.edudef format FailUnimpl() {{ 1393268Sgblack@eecs.umich.edu iop = InstObjParams(name, 'FailUnimplemented') 1403268Sgblack@eecs.umich.edu decode_block = BasicDecodeWithMnemonic.subst(iop) 1413268Sgblack@eecs.umich.edu}}; 1423268Sgblack@eecs.umich.edu 1433268Sgblack@eecs.umich.edudef format WarnUnimpl() {{ 1443268Sgblack@eecs.umich.edu iop = InstObjParams(name, 'WarnUnimplemented') 1453268Sgblack@eecs.umich.edu decode_block = BasicDecodeWithMnemonic.subst(iop) 1463268Sgblack@eecs.umich.edu}}; 1473268Sgblack@eecs.umich.edu 148