base.isa revision 2088
1////////////////////////////////////////////////////////////////////
2//
3// Base class for sparc instructions, and some support functions
4//
5
6output header {{
7        /**
8         * Base class for all SPARC static instructions.
9         */
10        class SparcStaticInst : public StaticInst<SPARCISA>
11        {
12        protected:
13
14                // Constructor.
15                SparcStaticInst(const char *mnem, MachInst _machInst, OpClass __opClass)
16                    : StaticInst<SPARCISA>(mnem, _machInst, __opClass)
17                {
18                }
19
20                std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
21        };
22
23        bool passesCondition(struct {uint8_t c:1; uint8_t v:1; uint8_t z:1; uint8_t n:1} codes, uint8_t condition);
24}};
25
26output decoder {{
27
28        std::string SparcStaticInst::generateDisassembly(Addr pc, const SymbolTable *symtab) const
29        {
30                std::stringstream ss;
31
32                ccprintf(ss, "%-10s ", mnemonic);
33
34                // just print the first two source regs... if there's
35                // a third one, it's a read-modify-write dest (Rc),
36                // e.g. for CMOVxx
37                if(_numSrcRegs > 0)
38                {
39                        printReg(ss, _srcRegIdx[0]);
40                }
41                if(_numSrcRegs > 1)
42                {
43                        ss << ",";
44                        printReg(ss, _srcRegIdx[1]);
45                }
46
47                // just print the first dest... if there's a second one,
48                // it's generally implicit
49                if(_numDestRegs > 0)
50                {
51                        if(_numSrcRegs > 0)
52                                ss << ",";
53                        printReg(ss, _destRegIdx[0]);
54                }
55
56                return ss.str();
57        }
58
59        bool passesCondition(struct {uint8_t c:1; uint8_t v:1; uint8_t z:1; uint8_t n:1} codes, uint8_t condition)
60        {
61                switch(condition)
62                {
63                        case 0b1000: return true;
64                        case 0b0000: return false;
65                        case 0b1001: return !codes.z;
66                        case 0b0001: return codes.z;
67                        case 0b1010: return !(codes.z | (codes.n ^ codes.v));
68                        case 0b0010: return codes.z | (codes.n ^ codes.v);
69                        case 0b1011: return !(codes.n ^ codes.v);
70                        case 0b0011: return (codes.n ^ codes.v);
71                        case 0b1100: return !(codes.c | codes.z);
72                        case 0b0100: return (codes.c | codes.z);
73                        case 0b1101: return !codes.c;
74                        case 0b0101: return codes.c;
75                        case 0b1110: return !codes.n;
76                        case 0b0110: return codes.n;
77                        case 0b1111: return !codes.v;
78                        case 0b0111: return codes.v;
79                }
80        }
81}};
82
83