base.isa revision 2469
112027Sjungma@eit.uni-kl.de////////////////////////////////////////////////////////////////////
212027Sjungma@eit.uni-kl.de//
312027Sjungma@eit.uni-kl.de// Base class for sparc instructions, and some support functions
412027Sjungma@eit.uni-kl.de//
512027Sjungma@eit.uni-kl.de
612027Sjungma@eit.uni-kl.deoutput header {{
712027Sjungma@eit.uni-kl.de
812027Sjungma@eit.uni-kl.de        struct condCodes
912027Sjungma@eit.uni-kl.de        {
1012027Sjungma@eit.uni-kl.de            uint8_t c:1;
1112027Sjungma@eit.uni-kl.de            uint8_t v:1;
1212027Sjungma@eit.uni-kl.de            uint8_t z:1;
1312027Sjungma@eit.uni-kl.de            uint8_t n:1;
1412027Sjungma@eit.uni-kl.de        };
1512027Sjungma@eit.uni-kl.de
1612027Sjungma@eit.uni-kl.de        enum condTest
1712027Sjungma@eit.uni-kl.de        {
1812027Sjungma@eit.uni-kl.de            Always=0x8,
1912027Sjungma@eit.uni-kl.de            Never=0x0,
2012027Sjungma@eit.uni-kl.de            NotEqual=0x9,
2112027Sjungma@eit.uni-kl.de            Equal=0x1,
2212027Sjungma@eit.uni-kl.de            Greater=0xA,
2312027Sjungma@eit.uni-kl.de            LessOrEqual=0x2,
2412027Sjungma@eit.uni-kl.de            GreaterOrEqual=0xB,
2512027Sjungma@eit.uni-kl.de            Less=0x3,
2612027Sjungma@eit.uni-kl.de            GreaterUnsigned=0xC,
2712027Sjungma@eit.uni-kl.de            LessOrEqualUnsigned=0x4,
2812027Sjungma@eit.uni-kl.de            CarryClear=0xD,
2912027Sjungma@eit.uni-kl.de            CarrySet=0x5,
3012027Sjungma@eit.uni-kl.de            Positive=0xE,
3112027Sjungma@eit.uni-kl.de            Negative=0x6,
3212027Sjungma@eit.uni-kl.de            OverflowClear=0xF,
3312027Sjungma@eit.uni-kl.de            OverflowSet=0x7
3412027Sjungma@eit.uni-kl.de        };
3512027Sjungma@eit.uni-kl.de
3612027Sjungma@eit.uni-kl.de        /**
3712027Sjungma@eit.uni-kl.de         * Base class for all SPARC static instructions.
3812027Sjungma@eit.uni-kl.de         */
3912027Sjungma@eit.uni-kl.de        class SparcStaticInst : public StaticInst
4012027Sjungma@eit.uni-kl.de        {
4112027Sjungma@eit.uni-kl.de          protected:
4212027Sjungma@eit.uni-kl.de            // Constructor.
4312027Sjungma@eit.uni-kl.de            SparcStaticInst(const char *mnem,
4412027Sjungma@eit.uni-kl.de                 MachInst _machInst, OpClass __opClass)
4512027Sjungma@eit.uni-kl.de                    : StaticInst(mnem, _machInst, __opClass)
4612027Sjungma@eit.uni-kl.de                {
4712027Sjungma@eit.uni-kl.de                }
4812027Sjungma@eit.uni-kl.de
4912027Sjungma@eit.uni-kl.de            std::string generateDisassembly(Addr pc,
5012027Sjungma@eit.uni-kl.de                const SymbolTable *symtab) const;
5112027Sjungma@eit.uni-kl.de
5212027Sjungma@eit.uni-kl.de            void printReg(std::ostream &os, int reg) const;
5312027Sjungma@eit.uni-kl.de        };
5412027Sjungma@eit.uni-kl.de
5512027Sjungma@eit.uni-kl.de        bool passesCondition(condCodes codes, condTest condition);
5612027Sjungma@eit.uni-kl.de}};
5712027Sjungma@eit.uni-kl.de
5812027Sjungma@eit.uni-kl.deoutput decoder {{
5912027Sjungma@eit.uni-kl.de
6012027Sjungma@eit.uni-kl.de        void
6112027Sjungma@eit.uni-kl.de        SparcStaticInst::printReg(std::ostream &os, int reg) const
6212027Sjungma@eit.uni-kl.de        {
6312027Sjungma@eit.uni-kl.de            if (reg < FP_Base_DepTag) {
6412027Sjungma@eit.uni-kl.de                ccprintf(os, "r%d", reg);
6512027Sjungma@eit.uni-kl.de            }
6612027Sjungma@eit.uni-kl.de            else {
6712027Sjungma@eit.uni-kl.de                ccprintf(os, "f%d", reg - FP_Base_DepTag);
6812027Sjungma@eit.uni-kl.de            }
6912027Sjungma@eit.uni-kl.de        }
7012027Sjungma@eit.uni-kl.de
7112027Sjungma@eit.uni-kl.de        std::string SparcStaticInst::generateDisassembly(Addr pc,
7212027Sjungma@eit.uni-kl.de            const SymbolTable *symtab) const
7312027Sjungma@eit.uni-kl.de        {
7412027Sjungma@eit.uni-kl.de            std::stringstream ss;
7512027Sjungma@eit.uni-kl.de
7612027Sjungma@eit.uni-kl.de            ccprintf(ss, "%-10s ", mnemonic);
7712027Sjungma@eit.uni-kl.de
7812027Sjungma@eit.uni-kl.de            // just print the first two source regs... if there's
7912027Sjungma@eit.uni-kl.de            // a third one, it's a read-modify-write dest (Rc),
8012027Sjungma@eit.uni-kl.de            // e.g. for CMOVxx
8112027Sjungma@eit.uni-kl.de            if(_numSrcRegs > 0)
8212027Sjungma@eit.uni-kl.de            {
8312027Sjungma@eit.uni-kl.de                printReg(ss, _srcRegIdx[0]);
8412027Sjungma@eit.uni-kl.de            }
8512027Sjungma@eit.uni-kl.de            if(_numSrcRegs > 1)
8612027Sjungma@eit.uni-kl.de            {
8712027Sjungma@eit.uni-kl.de                ss << ",";
8812027Sjungma@eit.uni-kl.de                printReg(ss, _srcRegIdx[1]);
8912027Sjungma@eit.uni-kl.de            }
9012027Sjungma@eit.uni-kl.de
9112027Sjungma@eit.uni-kl.de            // just print the first dest... if there's a second one,
9212027Sjungma@eit.uni-kl.de            // it's generally implicit
9312027Sjungma@eit.uni-kl.de            if(_numDestRegs > 0)
9412027Sjungma@eit.uni-kl.de            {
9512027Sjungma@eit.uni-kl.de                if(_numSrcRegs > 0)
9612027Sjungma@eit.uni-kl.de                    ss << ",";
9712027Sjungma@eit.uni-kl.de                    printReg(ss, _destRegIdx[0]);
9812027Sjungma@eit.uni-kl.de            }
9912027Sjungma@eit.uni-kl.de
10012027Sjungma@eit.uni-kl.de            return ss.str();
10112027Sjungma@eit.uni-kl.de        }
10212027Sjungma@eit.uni-kl.de
10312027Sjungma@eit.uni-kl.de        bool passesCondition(condCodes codes, condTest condition)
10412027Sjungma@eit.uni-kl.de        {
10512027Sjungma@eit.uni-kl.de            switch(condition)
10612027Sjungma@eit.uni-kl.de            {
10712027Sjungma@eit.uni-kl.de              case Always:
10812027Sjungma@eit.uni-kl.de                return true;
10912027Sjungma@eit.uni-kl.de              case Never:
11012027Sjungma@eit.uni-kl.de                return false;
11112027Sjungma@eit.uni-kl.de              case NotEqual:
11212027Sjungma@eit.uni-kl.de                return !codes.z;
11312027Sjungma@eit.uni-kl.de              case Equal:
11412027Sjungma@eit.uni-kl.de                return codes.z;
11512027Sjungma@eit.uni-kl.de              case Greater:
11612027Sjungma@eit.uni-kl.de                return !(codes.z | (codes.n ^ codes.v));
11712027Sjungma@eit.uni-kl.de              case LessOrEqual:
11812027Sjungma@eit.uni-kl.de                return codes.z | (codes.n ^ codes.v);
11912027Sjungma@eit.uni-kl.de              case GreaterOrEqual:
12012027Sjungma@eit.uni-kl.de                return !(codes.n ^ codes.v);
12112027Sjungma@eit.uni-kl.de              case Less:
12212027Sjungma@eit.uni-kl.de                return (codes.n ^ codes.v);
12312027Sjungma@eit.uni-kl.de              case GreaterUnsigned:
12412027Sjungma@eit.uni-kl.de                return !(codes.c | codes.z);
12512027Sjungma@eit.uni-kl.de              case LessOrEqualUnsigned:
12612027Sjungma@eit.uni-kl.de                return (codes.c | codes.z);
12712027Sjungma@eit.uni-kl.de              case CarryClear:
12812027Sjungma@eit.uni-kl.de                return !codes.c;
12912027Sjungma@eit.uni-kl.de              case CarrySet:
13012027Sjungma@eit.uni-kl.de                return codes.c;
13112027Sjungma@eit.uni-kl.de              case Positive:
13212027Sjungma@eit.uni-kl.de                return !codes.n;
13312027Sjungma@eit.uni-kl.de              case Negative:
13412027Sjungma@eit.uni-kl.de                return codes.n;
13512027Sjungma@eit.uni-kl.de              case OverflowClear:
13612027Sjungma@eit.uni-kl.de                return !codes.v;
13712027Sjungma@eit.uni-kl.de              case OverflowSet:
13812027Sjungma@eit.uni-kl.de                return codes.v;
13912027Sjungma@eit.uni-kl.de            }
14012027Sjungma@eit.uni-kl.de            panic("Tried testing condition nonexistant "
14112027Sjungma@eit.uni-kl.de                    "condition code %d", condition);
14212027Sjungma@eit.uni-kl.de        }
14312027Sjungma@eit.uni-kl.de}};
14412027Sjungma@eit.uni-kl.de
14512027Sjungma@eit.uni-kl.de