base.isa revision 2632:1bb2f91485ea
1// -*- mode:c++ -*- 2 3//////////////////////////////////////////////////////////////////// 4// 5// Base class for MIPS instructions, and some support functions 6// 7 8//Outputs to decoder.hh 9output header {{ 10 11 using namespace MipsISA; 12 13 14 /** 15 * Base class for all MIPS static instructions. 16 */ 17 class MipsStaticInst : public StaticInst 18 { 19 protected: 20 21 /// Make MipsISA register dependence tags directly visible in 22 /// this class and derived classes. Maybe these should really 23 /// live here and not in the MipsISA namespace. 24 /*enum DependenceTags { 25 FP_Base_DepTag = MipsISA::FP_Base_DepTag, 26 Fpcr_DepTag = MipsISA::Fpcr_DepTag, 27 Uniq_DepTag = MipsISA::Uniq_DepTag, 28 IPR_Base_DepTag = MipsISA::IPR_Base_DepTag 29 };*/ 30 31 // Constructor 32 MipsStaticInst(const char *mnem, MachInst _machInst, OpClass __opClass) 33 : StaticInst(mnem, _machInst, __opClass) 34 { 35 } 36 37 /// Print a register name for disassembly given the unique 38 /// dependence tag number (FP or int). 39 void printReg(std::ostream &os, int reg) const; 40 41 std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; 42 }; 43 44}}; 45 46//Ouputs to decoder.cc 47output decoder {{ 48 49 void MipsStaticInst::printReg(std::ostream &os, int reg) const 50 { 51 if (reg < FP_Base_DepTag) { 52 ccprintf(os, "r%d", reg); 53 } 54 else { 55 ccprintf(os, "f%d", reg - FP_Base_DepTag); 56 } 57 } 58 59 std::string MipsStaticInst::generateDisassembly(Addr pc, const SymbolTable *symtab) const 60 { 61 std::stringstream ss; 62 63 ccprintf(ss, "%-10s ", mnemonic); 64 65 if(_numDestRegs > 0){ 66 printReg(ss, _destRegIdx[0]); 67 } 68 69 if(_numSrcRegs > 0) { 70 ss << ","; 71 printReg(ss, _srcRegIdx[0]); 72 } 73 74 if(_numSrcRegs > 1) { 75 ss << ","; 76 printReg(ss, _srcRegIdx[1]); 77 } 78 79 80 if(mnemonic == "sll" || mnemonic == "sra"){ 81 ccprintf(ss,", %d",SA); 82 } 83 84 return ss.str(); 85 } 86 87}}; 88 89