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