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