base.isa revision 2030
1//////////////////////////////////////////////////////////////////// 2// 3// Base class for sparc instructions, and some support functions 4// 5 6output header {{ 7 /** 8 * Base class for all SPARC static instructions. 9 */ 10 class SparcStaticInst : public StaticInst<SPARCISA> 11 { 12 protected: 13 14 // Constructor. 15 SparcStaticInst(const char *mnem, MachInst _machInst, OpClass __opClass) 16 : StaticInst<SPARCISA>(mnem, _machInst, __opClass) 17 { 18 } 19 20 std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; 21 }; 22 23 bool passesCondition(struct {uint8_t c:1; uint8_t v:1; uint8_t z:1; uint8_t n:1} codes, uint8_t condition); 24}}; 25 26output decoder {{ 27 28 std::string SparcStaticInst::generateDisassembly(Addr pc, const SymbolTable *symtab) const 29 { 30 std::stringstream ss; 31 32 ccprintf(ss, "%-10s ", mnemonic); 33 34 // just print the first two source regs... if there's 35 // a third one, it's a read-modify-write dest (Rc), 36 // e.g. for CMOVxx 37 if(_numSrcRegs > 0) 38 { 39 printReg(ss, _srcRegIdx[0]); 40 } 41 if(_numSrcRegs > 1) 42 { 43 ss << ","; 44 printReg(ss, _srcRegIdx[1]); 45 } 46 47 // just print the first dest... if there's a second one, 48 // it's generally implicit 49 if(_numDestRegs > 0) 50 { 51 if(_numSrcRegs > 0) 52 ss << ","; 53 printReg(ss, _destRegIdx[0]); 54 } 55 56 return ss.str(); 57 } 58 59 bool passesCondition(struct {uint8_t c:1; uint8_t v:1; uint8_t z:1; uint8_t n:1} codes, uint8_t condition) 60 { 61 switch(condition) 62 { 63 case 0b1000: return true; 64 case 0b0000: return false; 65 case 0b1001: return !codes.z; 66 case 0b0001: return codes.z; 67 case 0b1010: return !(codes.z | (codes.n ^ codes.v)); 68 case 0b0010: return codes.z | (codes.n ^ codes.v); 69 case 0b1011: return !(codes.n ^ codes.v); 70 case 0b0011: return (codes.n ^ codes.v); 71 case 0b1100: return !(codes.c | codes.z); 72 case 0b0100: return (codes.c | codes.z); 73 case 0b1101: return !codes.c; 74 case 0b0101: return codes.c; 75 case 0b1110: return !codes.n; 76 case 0b0110: return codes.n; 77 case 0b1111: return !codes.v; 78 case 0b0111: return codes.v; 79 } 80 } 81}}; 82 83