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