36,133d35
< output header {{
< /**
< * Static instruction class for unimplemented instructions that
< * cause simulator termination. Note that these are recognized
< * (legal) instructions that the simulator does not support; the
< * 'Unknown' class is used for unrecognized/illegal instructions.
< * This is a leaf class.
< */
< class FailUnimplemented : public SparcStaticInst
< {
< public:
< /// Constructor
< FailUnimplemented(const char *_mnemonic, ExtMachInst _machInst)
< : SparcStaticInst(_mnemonic, _machInst, No_OpClass)
< {
< // don't call execute() (which panics) if we're on a
< // speculative path
< flags[IsNonSpeculative] = true;
< }
<
< Fault execute(ExecContext *, Trace::InstRecord *) const;
<
< std::string
< generateDisassembly(Addr pc, const SymbolTable *symtab) const;
< };
<
< /**
< * Base class for unimplemented instructions that cause a warning
< * to be printed (but do not terminate simulation). This
< * implementation is a little screwy in that it will print a
< * warning for each instance of a particular unimplemented machine
< * instruction, not just for each unimplemented opcode. Should
< * probably make the 'warned' flag a static member of the derived
< * class.
< */
< class WarnUnimplemented : public SparcStaticInst
< {
< private:
< /// Have we warned on this instruction yet?
< mutable bool warned;
<
< public:
< /// Constructor
< WarnUnimplemented(const char *_mnemonic, ExtMachInst _machInst)
< : SparcStaticInst(_mnemonic, _machInst, No_OpClass), warned(false)
< {
< // don't call execute() (which panics) if we're on a
< // speculative path
< flags[IsNonSpeculative] = true;
< }
<
< Fault execute(ExecContext *, Trace::InstRecord *) const;
<
< std::string
< generateDisassembly(Addr pc, const SymbolTable *symtab) const;
< };
< }};
<
< output decoder {{
< std::string
< FailUnimplemented::generateDisassembly(Addr pc,
< const SymbolTable *symtab) const
< {
< return csprintf("%-10s (unimplemented)", mnemonic);
< }
<
< std::string
< WarnUnimplemented::generateDisassembly(Addr pc,
< const SymbolTable *symtab) const
< {
< return csprintf("%-10s (unimplemented)", mnemonic);
< }
< }};
<
< output exec {{
< Fault
< FailUnimplemented::execute(ExecContext *xc,
< Trace::InstRecord *traceData) const
< {
< panic("attempt to execute unimplemented instruction '%s' "
< "(inst 0x%08x)", mnemonic, machInst);
< return NoFault;
< }
<
< Fault
< WarnUnimplemented::execute(ExecContext *xc,
< Trace::InstRecord *traceData) const
< {
< if (!warned) {
< warn("instruction '%s' unimplemented\n", mnemonic);
< warned = true;
< }
<
< return NoFault;
< }
< }};
<
<