base.isa revision 2469
1//////////////////////////////////////////////////////////////////// 2// 3// Base class for sparc instructions, and some support functions 4// 5 6output header {{ 7 8 struct condCodes 9 { 10 uint8_t c:1; 11 uint8_t v:1; 12 uint8_t z:1; 13 uint8_t n:1; 14 }; 15 16 enum condTest 17 { 18 Always=0x8, 19 Never=0x0, 20 NotEqual=0x9, 21 Equal=0x1, 22 Greater=0xA, 23 LessOrEqual=0x2, 24 GreaterOrEqual=0xB, 25 Less=0x3, 26 GreaterUnsigned=0xC, 27 LessOrEqualUnsigned=0x4, 28 CarryClear=0xD, 29 CarrySet=0x5, 30 Positive=0xE, 31 Negative=0x6, 32 OverflowClear=0xF, 33 OverflowSet=0x7 34 }; 35 36 /** 37 * Base class for all SPARC static instructions. 38 */ 39 class SparcStaticInst : public StaticInst 40 { 41 protected: 42 // Constructor. 43 SparcStaticInst(const char *mnem, 44 MachInst _machInst, OpClass __opClass) 45 : StaticInst(mnem, _machInst, __opClass) 46 { 47 } 48 49 std::string generateDisassembly(Addr pc, 50 const SymbolTable *symtab) const; 51 52 void printReg(std::ostream &os, int reg) const; 53 }; 54 55 bool passesCondition(condCodes codes, condTest condition); 56}}; 57 58output decoder {{ 59 60 void 61 SparcStaticInst::printReg(std::ostream &os, int reg) const 62 { 63 if (reg < FP_Base_DepTag) { 64 ccprintf(os, "r%d", reg); 65 } 66 else { 67 ccprintf(os, "f%d", reg - FP_Base_DepTag); 68 } 69 } 70 71 std::string SparcStaticInst::generateDisassembly(Addr pc, 72 const SymbolTable *symtab) const 73 { 74 std::stringstream ss; 75 76 ccprintf(ss, "%-10s ", mnemonic); 77 78 // just print the first two source regs... if there's 79 // a third one, it's a read-modify-write dest (Rc), 80 // e.g. for CMOVxx 81 if(_numSrcRegs > 0) 82 { 83 printReg(ss, _srcRegIdx[0]); 84 } 85 if(_numSrcRegs > 1) 86 { 87 ss << ","; 88 printReg(ss, _srcRegIdx[1]); 89 } 90 91 // just print the first dest... if there's a second one, 92 // it's generally implicit 93 if(_numDestRegs > 0) 94 { 95 if(_numSrcRegs > 0) 96 ss << ","; 97 printReg(ss, _destRegIdx[0]); 98 } 99 100 return ss.str(); 101 } 102 103 bool passesCondition(condCodes codes, condTest condition) 104 { 105 switch(condition) 106 { 107 case Always: 108 return true; 109 case Never: 110 return false; 111 case NotEqual: 112 return !codes.z; 113 case Equal: 114 return codes.z; 115 case Greater: 116 return !(codes.z | (codes.n ^ codes.v)); 117 case LessOrEqual: 118 return codes.z | (codes.n ^ codes.v); 119 case GreaterOrEqual: 120 return !(codes.n ^ codes.v); 121 case Less: 122 return (codes.n ^ codes.v); 123 case GreaterUnsigned: 124 return !(codes.c | codes.z); 125 case LessOrEqualUnsigned: 126 return (codes.c | codes.z); 127 case CarryClear: 128 return !codes.c; 129 case CarrySet: 130 return codes.c; 131 case Positive: 132 return !codes.n; 133 case Negative: 134 return codes.n; 135 case OverflowClear: 136 return !codes.v; 137 case OverflowSet: 138 return codes.v; 139 } 140 panic("Tried testing condition nonexistant " 141 "condition code %d", condition); 142 } 143}}; 144 145