unimp.isa revision 12236:126ac9da6050
111730Sar4jc@virginia.edu// -*- mode:c++ -*- 211730Sar4jc@virginia.edu 311730Sar4jc@virginia.edu// Copyright (c) 2003-2005 The Regents of The University of Michigan 411730Sar4jc@virginia.edu// All rights reserved. 511730Sar4jc@virginia.edu// 611730Sar4jc@virginia.edu// Redistribution and use in source and binary forms, with or without 711730Sar4jc@virginia.edu// modification, are permitted provided that the following conditions are 811730Sar4jc@virginia.edu// met: redistributions of source code must retain the above copyright 911730Sar4jc@virginia.edu// notice, this list of conditions and the following disclaimer; 1011730Sar4jc@virginia.edu// redistributions in binary form must reproduce the above copyright 1111730Sar4jc@virginia.edu// notice, this list of conditions and the following disclaimer in the 1211730Sar4jc@virginia.edu// documentation and/or other materials provided with the distribution; 1311730Sar4jc@virginia.edu// neither the name of the copyright holders nor the names of its 1411730Sar4jc@virginia.edu// contributors may be used to endorse or promote products derived from 1511730Sar4jc@virginia.edu// this software without specific prior written permission. 1611730Sar4jc@virginia.edu// 1711730Sar4jc@virginia.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1811730Sar4jc@virginia.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1911730Sar4jc@virginia.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2011730Sar4jc@virginia.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2111730Sar4jc@virginia.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2211730Sar4jc@virginia.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2311730Sar4jc@virginia.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2411730Sar4jc@virginia.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2511730Sar4jc@virginia.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2611730Sar4jc@virginia.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2711730Sar4jc@virginia.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2811730Sar4jc@virginia.edu// 2911730Sar4jc@virginia.edu// Authors: Steve Reinhardt 3011730Sar4jc@virginia.edu 3111730Sar4jc@virginia.edu//////////////////////////////////////////////////////////////////// 3211730Sar4jc@virginia.edu// 3311730Sar4jc@virginia.edu// Unimplemented instructions 3411730Sar4jc@virginia.edu// 3511730Sar4jc@virginia.edu 3611730Sar4jc@virginia.eduoutput header {{ 3711730Sar4jc@virginia.edu /** 3811730Sar4jc@virginia.edu * Static instruction class for unimplemented instructions that 3911730Sar4jc@virginia.edu * cause simulator termination. Note that these are recognized 4011730Sar4jc@virginia.edu * (legal) instructions that the simulator does not support; the 4111730Sar4jc@virginia.edu * 'Unknown' class is used for unrecognized/illegal instructions. 4211730Sar4jc@virginia.edu * This is a leaf class. 4311965Sar4jc@virginia.edu */ 4411730Sar4jc@virginia.edu class FailUnimplemented : public AlphaStaticInst 4511730Sar4jc@virginia.edu { 4611965Sar4jc@virginia.edu public: 4711965Sar4jc@virginia.edu /// Constructor 4811965Sar4jc@virginia.edu FailUnimplemented(const char *_mnemonic, ExtMachInst _machInst) 4911965Sar4jc@virginia.edu : AlphaStaticInst(_mnemonic, _machInst, No_OpClass) 5011965Sar4jc@virginia.edu { 5111965Sar4jc@virginia.edu // don't call execute() (which panics) if we're on a 5211965Sar4jc@virginia.edu // speculative path 5311730Sar4jc@virginia.edu flags[IsNonSpeculative] = true; 5411730Sar4jc@virginia.edu } 5511730Sar4jc@virginia.edu 5611730Sar4jc@virginia.edu Fault execute(ExecContext *, Trace::InstRecord *) const; 5711730Sar4jc@virginia.edu 5811730Sar4jc@virginia.edu std::string 5911730Sar4jc@virginia.edu generateDisassembly(Addr pc, const SymbolTable *symtab) const; 6011730Sar4jc@virginia.edu }; 6111730Sar4jc@virginia.edu 6211730Sar4jc@virginia.edu /** 6311730Sar4jc@virginia.edu * Base class for unimplemented instructions that cause a warning 6411730Sar4jc@virginia.edu * to be printed (but do not terminate simulation). This 6511730Sar4jc@virginia.edu * implementation is a little screwy in that it will print a 6611730Sar4jc@virginia.edu * warning for each instance of a particular unimplemented machine 6711730Sar4jc@virginia.edu * instruction, not just for each unimplemented opcode. Should 6811730Sar4jc@virginia.edu * probably make the 'warned' flag a static member of the derived 6911730Sar4jc@virginia.edu * class. 7011730Sar4jc@virginia.edu */ 7111730Sar4jc@virginia.edu class WarnUnimplemented : public AlphaStaticInst 7211730Sar4jc@virginia.edu { 7311730Sar4jc@virginia.edu private: 7411730Sar4jc@virginia.edu /// Have we warned on this instruction yet? 7511730Sar4jc@virginia.edu mutable bool warned; 7611730Sar4jc@virginia.edu 7711730Sar4jc@virginia.edu public: 7811730Sar4jc@virginia.edu /// Constructor 7911730Sar4jc@virginia.edu WarnUnimplemented(const char *_mnemonic, ExtMachInst _machInst) 8011730Sar4jc@virginia.edu : AlphaStaticInst(_mnemonic, _machInst, No_OpClass), warned(false) 8111730Sar4jc@virginia.edu { 8211730Sar4jc@virginia.edu // don't call execute() (which panics) if we're on a 8311730Sar4jc@virginia.edu // speculative path 8411730Sar4jc@virginia.edu flags[IsNonSpeculative] = true; 8511730Sar4jc@virginia.edu } 8611730Sar4jc@virginia.edu 8711730Sar4jc@virginia.edu Fault execute(ExecContext *, Trace::InstRecord *) const; 8811730Sar4jc@virginia.edu 8911730Sar4jc@virginia.edu std::string 9011730Sar4jc@virginia.edu generateDisassembly(Addr pc, const SymbolTable *symtab) const; 9111730Sar4jc@virginia.edu }; 9211730Sar4jc@virginia.edu}}; 9311730Sar4jc@virginia.edu 9411730Sar4jc@virginia.eduoutput decoder {{ 9511730Sar4jc@virginia.edu std::string 9611730Sar4jc@virginia.edu FailUnimplemented::generateDisassembly(Addr pc, 9711730Sar4jc@virginia.edu const SymbolTable *symtab) const 9811730Sar4jc@virginia.edu { 9911730Sar4jc@virginia.edu return csprintf("%-10s (unimplemented)", mnemonic); 10011730Sar4jc@virginia.edu } 10111730Sar4jc@virginia.edu 10211730Sar4jc@virginia.edu std::string 10311730Sar4jc@virginia.edu WarnUnimplemented::generateDisassembly(Addr pc, 10411730Sar4jc@virginia.edu const SymbolTable *symtab) const 10511730Sar4jc@virginia.edu { 10611730Sar4jc@virginia.edu#ifdef SS_COMPATIBLE_DISASSEMBLY 10711730Sar4jc@virginia.edu return csprintf("%-10s", mnemonic); 10811730Sar4jc@virginia.edu#else 10911730Sar4jc@virginia.edu return csprintf("%-10s (unimplemented)", mnemonic); 11011730Sar4jc@virginia.edu#endif 11111730Sar4jc@virginia.edu } 11211730Sar4jc@virginia.edu}}; 11311730Sar4jc@virginia.edu 11411730Sar4jc@virginia.eduoutput exec {{ 11511730Sar4jc@virginia.edu Fault 11611730Sar4jc@virginia.edu FailUnimplemented::execute(ExecContext *xc, 11711730Sar4jc@virginia.edu Trace::InstRecord *traceData) const 11811730Sar4jc@virginia.edu { 11911730Sar4jc@virginia.edu panic("attempt to execute unimplemented instruction '%s' " 12011730Sar4jc@virginia.edu "(inst 0x%08x, opcode 0x%x)", mnemonic, machInst, OPCODE); 12111730Sar4jc@virginia.edu return std::make_shared<UnimplementedOpcodeFault>(); 12211730Sar4jc@virginia.edu } 12311730Sar4jc@virginia.edu 12411730Sar4jc@virginia.edu Fault 12511730Sar4jc@virginia.edu WarnUnimplemented::execute(ExecContext *xc, 12611730Sar4jc@virginia.edu Trace::InstRecord *traceData) const 12711730Sar4jc@virginia.edu { 12811730Sar4jc@virginia.edu if (!warned) { 12911730Sar4jc@virginia.edu warn("instruction '%s' unimplemented\n", mnemonic); 13011730Sar4jc@virginia.edu warned = true; 13111730Sar4jc@virginia.edu } 13211730Sar4jc@virginia.edu 13311730Sar4jc@virginia.edu return NoFault; 13411730Sar4jc@virginia.edu } 13511730Sar4jc@virginia.edu}}; 13611730Sar4jc@virginia.edu 13711965Sar4jc@virginia.edu 13811730Sar4jc@virginia.edudef format FailUnimpl() {{ 13911730Sar4jc@virginia.edu iop = InstObjParams(name, 'FailUnimplemented') 14011965Sar4jc@virginia.edu decode_block = BasicDecodeWithMnemonic.subst(iop) 14111965Sar4jc@virginia.edu}}; 14211965Sar4jc@virginia.edu 14311965Sar4jc@virginia.edudef format WarnUnimpl() {{ 14411965Sar4jc@virginia.edu iop = InstObjParams(name, 'WarnUnimplemented') 14511965Sar4jc@virginia.edu decode_block = BasicDecodeWithMnemonic.subst(iop) 14611965Sar4jc@virginia.edu}}; 14711730Sar4jc@virginia.edu 14811730Sar4jc@virginia.eduoutput header {{ 14911730Sar4jc@virginia.edu /** 15011730Sar4jc@virginia.edu * Static instruction class for unknown (illegal) instructions. 15111730Sar4jc@virginia.edu * These cause simulator termination if they are executed in a 15211730Sar4jc@virginia.edu * non-speculative mode. This is a leaf class. 15311730Sar4jc@virginia.edu */ 15411730Sar4jc@virginia.edu class Unknown : public AlphaStaticInst 15511730Sar4jc@virginia.edu { 15611730Sar4jc@virginia.edu public: 15711730Sar4jc@virginia.edu /// Constructor 15811730Sar4jc@virginia.edu Unknown(ExtMachInst _machInst) 15911730Sar4jc@virginia.edu : AlphaStaticInst("unknown", _machInst, No_OpClass) 16011730Sar4jc@virginia.edu { 16111730Sar4jc@virginia.edu // don't call execute() (which panics) if we're on a 16211730Sar4jc@virginia.edu // speculative path 16311730Sar4jc@virginia.edu flags[IsNonSpeculative] = true; 16411730Sar4jc@virginia.edu } 16511730Sar4jc@virginia.edu 16611730Sar4jc@virginia.edu Fault execute(ExecContext *, Trace::InstRecord *) const; 16711730Sar4jc@virginia.edu 16811730Sar4jc@virginia.edu std::string 16911730Sar4jc@virginia.edu generateDisassembly(Addr pc, const SymbolTable *symtab) const; 17011730Sar4jc@virginia.edu }; 17111730Sar4jc@virginia.edu}}; 17211730Sar4jc@virginia.edu 17311730Sar4jc@virginia.edu