base.isa revision 2492
1// -*- mode:c++ -*-
2
3////////////////////////////////////////////////////////////////////
4//
5// Base class for MIPS instructions, and some support functions
6//
7
8//Outputs to decoder.hh
9output header {{
10
11#define R31 31
12#include "arch/mips/faults.hh"
13#include "arch/mips/isa_traits.hh"
14
15    using namespace MipsISA;
16
17
18    /**
19     * Base class for all MIPS static instructions.
20     */
21    class MipsStaticInst : public StaticInst
22    {
23      protected:
24
25        /// Make MipsISA register dependence tags directly visible in
26        /// this class and derived classes.  Maybe these should really
27        /// live here and not in the MipsISA namespace.
28        /*enum DependenceTags {
29            FP_Base_DepTag = MipsISA::FP_Base_DepTag,
30            Fpcr_DepTag = MipsISA::Fpcr_DepTag,
31            Uniq_DepTag = MipsISA::Uniq_DepTag,
32            IPR_Base_DepTag = MipsISA::IPR_Base_DepTag
33            };*/
34
35        // Constructor
36        MipsStaticInst(const char *mnem, MachInst _machInst, OpClass __opClass)
37            : StaticInst(mnem, _machInst, __opClass)
38        {
39        }
40
41        /// Print a register name for disassembly given the unique
42        /// dependence tag number (FP or int).
43        void printReg(std::ostream &os, int reg) const;
44
45        std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
46    };
47
48}};
49
50//Ouputs to decoder.cc
51output decoder {{
52
53    void MipsStaticInst::printReg(std::ostream &os, int reg) const
54    {
55        if (reg < FP_Base_DepTag) {
56            ccprintf(os, "r%d", reg);
57        }
58        else {
59            ccprintf(os, "f%d", reg - FP_Base_DepTag);
60        }
61    }
62
63    std::string MipsStaticInst::generateDisassembly(Addr pc, const SymbolTable *symtab) const
64    {
65        std::stringstream ss;
66
67        ccprintf(ss, "%-10s ", mnemonic);
68
69        if(_numDestRegs > 0){
70            printReg(ss, _destRegIdx[0]);
71        }
72
73        if(_numSrcRegs > 0) {
74            ss << ",";
75            printReg(ss, _srcRegIdx[0]);
76        }
77
78        if(_numSrcRegs > 1) {
79            ss << ",";
80            printReg(ss, _srcRegIdx[1]);
81        }
82
83
84        if(mnemonic == "sll" || mnemonic == "sra"){
85            ccprintf(ss,", %d",SA);
86        }
87
88        return ss.str();
89    }
90
91}};
92
93