basicmem.isa revision 2591
11156SN/A//////////////////////////////////////////////////////////////////// 21762SN/A// 31156SN/A// Mem instructions 41156SN/A// 51156SN/A 61156SN/Aoutput header {{ 71156SN/A /** 81156SN/A * Base class for memory operations. 91156SN/A */ 101156SN/A class Mem : public SparcStaticInst 111156SN/A { 121156SN/A protected: 131156SN/A 141156SN/A // Constructor 151156SN/A Mem(const char *mnem, ExtMachInst _machInst, OpClass __opClass) : 161156SN/A SparcStaticInst(mnem, _machInst, __opClass) 171156SN/A { 181156SN/A } 191156SN/A 201156SN/A std::string generateDisassembly(Addr pc, 211156SN/A const SymbolTable *symtab) const; 221156SN/A }; 231156SN/A 241156SN/A /** 251156SN/A * Class for memory operations which use an immediate offset. 261156SN/A */ 272665SN/A class MemImm : public Mem 282665SN/A { 291156SN/A protected: 301156SN/A 3111263Sandreas.sandberg@arm.com // Constructor 3211263Sandreas.sandberg@arm.com MemImm(const char *mnem, ExtMachInst _machInst, OpClass __opClass) : 331156SN/A Mem(mnem, _machInst, __opClass) 342566SN/A { 351156SN/A imm = sign_ext(SIMM13, 13); 361156SN/A } 379850SN/A 384762SN/A std::string generateDisassembly(Addr pc, 3911263Sandreas.sandberg@arm.com const SymbolTable *symtab) const; 409850SN/A 418641SN/A int32_t imm; 425882SN/A }; 431156SN/A}}; 446216SN/A 456658SN/Aoutput decoder {{ 468232SN/A std::string Mem::generateDisassembly(Addr pc, 4711263Sandreas.sandberg@arm.com const SymbolTable *symtab) const 482566SN/A { 493348SN/A std::stringstream response; 501156SN/A bool load = flags[IsLoad]; 511157SN/A bool save = flags[IsStore]; 521156SN/A 535603SN/A printMnemonic(response, mnemonic); 541156SN/A if(save) 552107SN/A { 561156SN/A printReg(response, _srcRegIdx[0]); 571156SN/A ccprintf(response, ", "); 581156SN/A } 591156SN/A ccprintf(response, "[ "); 601156SN/A printReg(response, _srcRegIdx[!save ? 0 : 1]); 611156SN/A ccprintf(response, " + "); 621156SN/A printReg(response, _srcRegIdx[!save ? 1 : 2]); 631156SN/A ccprintf(response, " ]"); 641156SN/A if(load) 651156SN/A { 661156SN/A ccprintf(response, ", "); 671156SN/A printReg(response, _destRegIdx[0]); 681156SN/A } 691156SN/A 701156SN/A return response.str(); 711156SN/A } 721156SN/A 731156SN/A std::string MemImm::generateDisassembly(Addr pc, 741156SN/A const SymbolTable *symtab) const 751156SN/A { 761156SN/A std::stringstream response; 771156SN/A bool load = flags[IsLoad]; 781156SN/A bool save = flags[IsStore]; 791156SN/A 801156SN/A printMnemonic(response, mnemonic); 811156SN/A if(save) 824981SN/A { 839339SN/A printReg(response, _srcRegIdx[0]); 841634SN/A ccprintf(response, ", "); 851634SN/A } 861156SN/A ccprintf(response, "[ "); 871156SN/A printReg(response, _srcRegIdx[!save ? 0 : 1]); 881156SN/A if(imm >= 0) 894981SN/A ccprintf(response, " + 0x%x ]", imm); 902627SN/A else 912282SN/A ccprintf(response, " + -0x%x ]", -imm); 922627SN/A if(load) 931156SN/A { 941156SN/A ccprintf(response, ", "); 951156SN/A printReg(response, _destRegIdx[0]); 961156SN/A } 971156SN/A 984981SN/A return response.str(); 991156SN/A } 1001156SN/A}}; 1011156SN/A 1021156SN/Adef template MemExecute {{ 1031156SN/A Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, 1041156SN/A Trace::InstRecord *traceData) const 1051156SN/A { 1061156SN/A Fault fault = NoFault; 1071156SN/A Addr EA; 1081156SN/A %(op_decl)s; 1099339SN/A %(op_rd)s; 1105603SN/A %(ea_code)s; 1115603SN/A DPRINTF(Sparc, "The address is 0x%x\n", EA); 1125603SN/A %(load)s; 1135603SN/A %(code)s; 1145603SN/A %(store)s; 1155603SN/A 1165603SN/A if(fault == NoFault) 1175603SN/A { 1185603SN/A //Write the resulting state to the execution context 1195603SN/A %(op_wb)s; 1205603SN/A } 1215603SN/A 1225603SN/A return fault; 1235603SN/A } 1245603SN/A}}; 1255603SN/A 1265603SN/Alet {{ 1275603SN/A # Leave memAccessFlags at 0 for now 1285603SN/A loadString = "xc->read(EA, (uint%(width)s_t&)Mem, 0);" 1295603SN/A storeString = "uint64_t write_result = 0; \ 1305603SN/A xc->write((uint%(width)s_t)Mem, EA, 0, &write_result);" 1315603SN/A 1325603SN/A def doMemFormat(code, load, store, name, Name, opt_flags): 1335603SN/A addrCalcReg = 'EA = Rs1 + Rs2;' 1345603SN/A addrCalcImm = 'EA = Rs1 + imm;' 1355603SN/A iop = InstObjParams(name, Name, 'Mem', code, 1365603SN/A opt_flags, ("ea_code", addrCalcReg), 1375603SN/A ("load", load), ("store", store)) 1389339SN/A iop_imm = InstObjParams(name, Name + 'Imm', 'MemImm', code, 1399339SN/A opt_flags, ("ea_code", addrCalcImm), 1405603SN/A ("load", load), ("store", store)) 1411156SN/A header_output = BasicDeclare.subst(iop) + BasicDeclare.subst(iop_imm) 1421156SN/A decoder_output = BasicConstructor.subst(iop) + BasicConstructor.subst(iop_imm) 1434981SN/A decode_block = ROrImmDecode.subst(iop) 1444981SN/A exec_output = MemExecute.subst(iop) + MemExecute.subst(iop_imm) 1454981SN/A return (header_output, decoder_output, exec_output, decode_block) 1464981SN/A}}; 1474981SN/A 1484981SN/Adef format Load(code, width, *opt_flags) {{ 1494981SN/A (header_output, 1504981SN/A decoder_output, 1514981SN/A exec_output, 1524981SN/A decode_block) = doMemFormat(code, 1534981SN/A loadString % {"width":width}, '', name, Name, opt_flags) 1544981SN/A}}; 1554981SN/A 1561939SN/Adef format Store(code, width, *opt_flags) {{ 15711005SN/A (header_output, 1582008SN/A decoder_output, 1592008SN/A exec_output, 1602282SN/A decode_block) = doMemFormat(code, '', 1612282SN/A storeString % {"width":width}, name, Name, opt_flags) 1622282SN/A}}; 1632008SN/A 1642008SN/Adef format LoadStore(code, width, *opt_flags) {{ 1655603SN/A (header_output, 1665603SN/A decoder_output, 1675603SN/A exec_output, 1685603SN/A decode_block) = doMemFormat(code, 1692008SN/A loadString % {"width":width}, storeString % {"width":width}, 17011005SN/A name, Name, opt_flags) 1712008SN/A}}; 1722008SN/A