base.isa revision 2469
1////////////////////////////////////////////////////////////////////
2//
3// Base class for sparc instructions, and some support functions
4//
5
6output header {{
7
8        struct condCodes
9        {
10            uint8_t c:1;
11            uint8_t v:1;
12            uint8_t z:1;
13            uint8_t n:1;
14        };
15
16        enum condTest
17        {
18            Always=0x8,
19            Never=0x0,
20            NotEqual=0x9,
21            Equal=0x1,
22            Greater=0xA,
23            LessOrEqual=0x2,
24            GreaterOrEqual=0xB,
25            Less=0x3,
26            GreaterUnsigned=0xC,
27            LessOrEqualUnsigned=0x4,
28            CarryClear=0xD,
29            CarrySet=0x5,
30            Positive=0xE,
31            Negative=0x6,
32            OverflowClear=0xF,
33            OverflowSet=0x7
34        };
35
36        /**
37         * Base class for all SPARC static instructions.
38         */
39        class SparcStaticInst : public StaticInst
40        {
41          protected:
42            // Constructor.
43            SparcStaticInst(const char *mnem,
44                 MachInst _machInst, OpClass __opClass)
45                    : StaticInst(mnem, _machInst, __opClass)
46                {
47                }
48
49            std::string generateDisassembly(Addr pc,
50                const SymbolTable *symtab) const;
51
52            void printReg(std::ostream &os, int reg) const;
53        };
54
55        bool passesCondition(condCodes codes, condTest condition);
56}};
57
58output decoder {{
59
60        void
61        SparcStaticInst::printReg(std::ostream &os, int reg) const
62        {
63            if (reg < FP_Base_DepTag) {
64                ccprintf(os, "r%d", reg);
65            }
66            else {
67                ccprintf(os, "f%d", reg - FP_Base_DepTag);
68            }
69        }
70
71        std::string SparcStaticInst::generateDisassembly(Addr pc,
72            const SymbolTable *symtab) const
73        {
74            std::stringstream ss;
75
76            ccprintf(ss, "%-10s ", mnemonic);
77
78            // just print the first two source regs... if there's
79            // a third one, it's a read-modify-write dest (Rc),
80            // e.g. for CMOVxx
81            if(_numSrcRegs > 0)
82            {
83                printReg(ss, _srcRegIdx[0]);
84            }
85            if(_numSrcRegs > 1)
86            {
87                ss << ",";
88                printReg(ss, _srcRegIdx[1]);
89            }
90
91            // just print the first dest... if there's a second one,
92            // it's generally implicit
93            if(_numDestRegs > 0)
94            {
95                if(_numSrcRegs > 0)
96                    ss << ",";
97                    printReg(ss, _destRegIdx[0]);
98            }
99
100            return ss.str();
101        }
102
103        bool passesCondition(condCodes codes, condTest condition)
104        {
105            switch(condition)
106            {
107              case Always:
108                return true;
109              case Never:
110                return false;
111              case NotEqual:
112                return !codes.z;
113              case Equal:
114                return codes.z;
115              case Greater:
116                return !(codes.z | (codes.n ^ codes.v));
117              case LessOrEqual:
118                return codes.z | (codes.n ^ codes.v);
119              case GreaterOrEqual:
120                return !(codes.n ^ codes.v);
121              case Less:
122                return (codes.n ^ codes.v);
123              case GreaterUnsigned:
124                return !(codes.c | codes.z);
125              case LessOrEqualUnsigned:
126                return (codes.c | codes.z);
127              case CarryClear:
128                return !codes.c;
129              case CarrySet:
130                return codes.c;
131              case Positive:
132                return !codes.n;
133              case Negative:
134                return codes.n;
135              case OverflowClear:
136                return !codes.v;
137              case OverflowSet:
138                return codes.v;
139            }
140            panic("Tried testing condition nonexistant "
141                    "condition code %d", condition);
142        }
143}};
144
145