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