base.isa revision 2469
12124SN/A////////////////////////////////////////////////////////////////////
22124SN/A//
32754Sksewell@umich.edu// Base class for sparc instructions, and some support functions
42124SN/A//
52022SN/A
62124SN/Aoutput header {{
72124SN/A
82124SN/A        struct condCodes
92124SN/A        {
102124SN/A            uint8_t c:1;
112124SN/A            uint8_t v:1;
122124SN/A            uint8_t z:1;
132124SN/A            uint8_t n:1;
142124SN/A        };
152124SN/A
162022SN/A        enum condTest
172124SN/A        {
182124SN/A            Always=0x8,
192124SN/A            Never=0x0,
202124SN/A            NotEqual=0x9,
212124SN/A            Equal=0x1,
222124SN/A            Greater=0xA,
232124SN/A            LessOrEqual=0x2,
242124SN/A            GreaterOrEqual=0xB,
252124SN/A            Less=0x3,
262124SN/A            GreaterUnsigned=0xC,
272124SN/A            LessOrEqualUnsigned=0x4,
282665Ssaidi@eecs.umich.edu            CarryClear=0xD,
292935Sksewell@umich.edu            CarrySet=0x5,
302665Ssaidi@eecs.umich.edu            Positive=0xE,
312022SN/A            Negative=0x6,
322649Ssaidi@eecs.umich.edu            OverflowClear=0xF,
332649Ssaidi@eecs.umich.edu            OverflowSet=0x7
342706Sksewell@umich.edu        };
352649Ssaidi@eecs.umich.edu
362649Ssaidi@eecs.umich.edu        /**
372022SN/A         * Base class for all SPARC static instructions.
382124SN/A         */
392124SN/A        class SparcStaticInst : public StaticInst
402124SN/A        {
412124SN/A          protected:
422124SN/A            // Constructor.
432124SN/A            SparcStaticInst(const char *mnem,
442124SN/A                 MachInst _machInst, OpClass __opClass)
452124SN/A                    : StaticInst(mnem, _machInst, __opClass)
462124SN/A                {
472124SN/A                }
482124SN/A
492124SN/A            std::string generateDisassembly(Addr pc,
502124SN/A                const SymbolTable *symtab) const;
512239SN/A
522124SN/A            void printReg(std::ostream &os, int reg) const;
532124SN/A        };
542124SN/A
552124SN/A        bool passesCondition(condCodes codes, condTest condition);
562124SN/A}};
572124SN/A
582124SN/Aoutput decoder {{
592124SN/A
602124SN/A        void
612742Sksewell@umich.edu        SparcStaticInst::printReg(std::ostream &os, int reg) const
622022SN/A        {
632124SN/A            if (reg < FP_Base_DepTag) {
642022SN/A                ccprintf(os, "r%d", reg);
652124SN/A            }
662124SN/A            else {
672022SN/A                ccprintf(os, "f%d", reg - FP_Base_DepTag);
682124SN/A            }
692124SN/A        }
702124SN/A
712124SN/A        std::string SparcStaticInst::generateDisassembly(Addr pc,
724661Sksewell@umich.edu            const SymbolTable *symtab) const
734661Sksewell@umich.edu        {
742124SN/A            std::stringstream ss;
752124SN/A
762742Sksewell@umich.edu            ccprintf(ss, "%-10s ", mnemonic);
772742Sksewell@umich.edu
782742Sksewell@umich.edu            // just print the first two source regs... if there's
792742Sksewell@umich.edu            // a third one, it's a read-modify-write dest (Rc),
802742Sksewell@umich.edu            // e.g. for CMOVxx
812742Sksewell@umich.edu            if(_numSrcRegs > 0)
822742Sksewell@umich.edu            {
832742Sksewell@umich.edu                printReg(ss, _srcRegIdx[0]);
842742Sksewell@umich.edu            }
852742Sksewell@umich.edu            if(_numSrcRegs > 1)
862742Sksewell@umich.edu            {
872742Sksewell@umich.edu                ss << ",";
882742Sksewell@umich.edu                printReg(ss, _srcRegIdx[1]);
892742Sksewell@umich.edu            }
902742Sksewell@umich.edu
912742Sksewell@umich.edu            // just print the first dest... if there's a second one,
922742Sksewell@umich.edu            // it's generally implicit
932742Sksewell@umich.edu            if(_numDestRegs > 0)
942022SN/A            {
952022SN/A                if(_numSrcRegs > 0)
962124SN/A                    ss << ",";
972022SN/A                    printReg(ss, _destRegIdx[0]);
982124SN/A            }
992124SN/A
1002124SN/A            return ss.str();
1012742Sksewell@umich.edu        }
1022239SN/A
1032124SN/A        bool passesCondition(condCodes codes, condTest condition)
1042124SN/A        {
1052742Sksewell@umich.edu            switch(condition)
1062742Sksewell@umich.edu            {
1072742Sksewell@umich.edu              case Always:
1082742Sksewell@umich.edu                return true;
1092742Sksewell@umich.edu              case Never:
1102742Sksewell@umich.edu                return false;
1112742Sksewell@umich.edu              case NotEqual:
1122742Sksewell@umich.edu                return !codes.z;
1134661Sksewell@umich.edu              case Equal:
1144661Sksewell@umich.edu                return codes.z;
1154661Sksewell@umich.edu              case Greater:
1164661Sksewell@umich.edu                return !(codes.z | (codes.n ^ codes.v));
1174661Sksewell@umich.edu              case LessOrEqual:
1184661Sksewell@umich.edu                return codes.z | (codes.n ^ codes.v);
1194661Sksewell@umich.edu              case GreaterOrEqual:
1204661Sksewell@umich.edu                return !(codes.n ^ codes.v);
1214661Sksewell@umich.edu              case Less:
1224661Sksewell@umich.edu                return (codes.n ^ codes.v);
1234661Sksewell@umich.edu              case GreaterUnsigned:
1244661Sksewell@umich.edu                return !(codes.c | codes.z);
1254661Sksewell@umich.edu              case LessOrEqualUnsigned:
1264661Sksewell@umich.edu                return (codes.c | codes.z);
1274661Sksewell@umich.edu              case CarryClear:
1284661Sksewell@umich.edu                return !codes.c;
1294661Sksewell@umich.edu              case CarrySet:
1304661Sksewell@umich.edu                return codes.c;
1314661Sksewell@umich.edu              case Positive:
1324661Sksewell@umich.edu                return !codes.n;
1334661Sksewell@umich.edu              case Negative:
1344661Sksewell@umich.edu                return codes.n;
1354661Sksewell@umich.edu              case OverflowClear:
1364661Sksewell@umich.edu                return !codes.v;
1374661Sksewell@umich.edu              case OverflowSet:
1384661Sksewell@umich.edu                return codes.v;
1394661Sksewell@umich.edu            }
1404661Sksewell@umich.edu            panic("Tried testing condition nonexistant "
1414661Sksewell@umich.edu                    "condition code %d", condition);
1424661Sksewell@umich.edu        }
1434661Sksewell@umich.edu}};
1442022SN/A
1452022SN/A