base.isa revision 2224
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 53 bool passesCondition(condCodes codes, condTest condition); 54}}; 55 56output decoder {{ 57 58 std::string SparcStaticInst::generateDisassembly(Addr pc, 59 const SymbolTable *symtab) const 60 { 61 std::stringstream ss; 62 63 ccprintf(ss, "%-10s ", mnemonic); 64 65 // just print the first two source regs... if there's 66 // a third one, it's a read-modify-write dest (Rc), 67 // e.g. for CMOVxx 68 if(_numSrcRegs > 0) 69 { 70 printReg(ss, _srcRegIdx[0]); 71 } 72 if(_numSrcRegs > 1) 73 { 74 ss << ","; 75 printReg(ss, _srcRegIdx[1]); 76 } 77 78 // just print the first dest... if there's a second one, 79 // it's generally implicit 80 if(_numDestRegs > 0) 81 { 82 if(_numSrcRegs > 0) 83 ss << ","; 84 printReg(ss, _destRegIdx[0]); 85 } 86 87 return ss.str(); 88 } 89 90 bool passesCondition(condCodes codes, condTest condition) 91 { 92 switch(condition) 93 { 94 case Always: 95 return true; 96 case Never: 97 return false; 98 case NotEqual: 99 return !codes.z; 100 case Equal: 101 return codes.z; 102 case Greater: 103 return !(codes.z | (codes.n ^ codes.v)); 104 case LessOrEqual: 105 return codes.z | (codes.n ^ codes.v); 106 case GreaterOrEqual: 107 return !(codes.n ^ codes.v); 108 case Less: 109 return (codes.n ^ codes.v); 110 case GreaterUnsigned: 111 return !(codes.c | codes.z); 112 case LessOrEqualUnsigned: 113 return (codes.c | codes.z); 114 case CarryClear: 115 return !codes.c; 116 case CarrySet: 117 return codes.c; 118 case Positive: 119 return !codes.n; 120 case Negative: 121 return codes.n; 122 case OverflowClear: 123 return !codes.v; 124 case OverflowSet: 125 return codes.v; 126 } 127 } 128}}; 129 130