mem.isa
来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· ISA 代码 · 共 882 行 · 第 1/2 页
ISA
882 行
// -*- mode:c++ -*-// Copyright (c) 2007 MIPS Technologies, Inc. All Rights Reserved// This software is part of the M5 simulator.// THIS IS A LEGAL AGREEMENT. BY DOWNLOADING, USING, COPYING, CREATING// DERIVATIVE WORKS, AND/OR DISTRIBUTING THIS SOFTWARE YOU ARE AGREEING// TO THESE TERMS AND CONDITIONS.// Permission is granted to use, copy, create derivative works and// distribute this software and such derivative works for any purpose,// so long as (1) the copyright notice above, this grant of permission,// and the disclaimer below appear in all copies and derivative works// made, (2) the copyright notice above is augmented as appropriate to// reflect the addition of any new copyrightable work in a derivative// work (e.g., Copyright (c) <Publication Year> Copyright Owner), and (3)// the name of MIPS Technologies, Inc. ($(B!H(BMIPS$(B!I(B) is not used in any// advertising or publicity pertaining to the use or distribution of// this software without specific, written prior authorization.// THIS SOFTWARE IS PROVIDED $(B!H(BAS IS.$(B!I(B MIPS MAKES NO WARRANTIES AND// DISCLAIMS ALL WARRANTIES, WHETHER EXPRESS, STATUTORY, IMPLIED OR// OTHERWISE, INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND// NON-INFRINGEMENT OF THIRD PARTY RIGHTS, REGARDING THIS SOFTWARE.// IN NO EVENT SHALL MIPS BE LIABLE FOR ANY DAMAGES, INCLUDING DIRECT,// INDIRECT, INCIDENTAL, CONSEQUENTIAL, SPECIAL, OR PUNITIVE DAMAGES OF// ANY KIND OR NATURE, ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT,// THIS SOFTWARE AND/OR THE USE OF THIS SOFTWARE, WHETHER SUCH LIABILITY// IS ASSERTED ON THE BASIS OF CONTRACT, TORT (INCLUDING NEGLIGENCE OR// STRICT LIABILITY), OR OTHERWISE, EVEN IF MIPS HAS BEEN WARNED OF THE// POSSIBILITY OF ANY SUCH LOSS OR DAMAGE IN ADVANCE.//Authors: Steve Reinhardt// Korey L. Sewell//////////////////////////////////////////////////////////////////////// Memory-format instructions//output header {{ /** * Base class for general Mips memory-format instructions. */ class Memory : public MipsStaticInst { protected: /// Memory request flags. See mem_req_base.hh. unsigned memAccessFlags; /// Pointer to EAComp object. const StaticInstPtr eaCompPtr; /// Pointer to MemAcc object. const StaticInstPtr memAccPtr; /// Displacement for EA calculation (signed). int32_t disp; /// Constructor Memory(const char *mnem, MachInst _machInst, OpClass __opClass, StaticInstPtr _eaCompPtr = nullStaticInstPtr, StaticInstPtr _memAccPtr = nullStaticInstPtr) : MipsStaticInst(mnem, _machInst, __opClass), memAccessFlags(0), eaCompPtr(_eaCompPtr), memAccPtr(_memAccPtr), disp(sext<16>(OFFSET)) { } std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; public: const StaticInstPtr &eaCompInst() const { return eaCompPtr; } const StaticInstPtr &memAccInst() const { return memAccPtr; } unsigned memAccFlags() { return memAccessFlags; } }; /** * Base class for a few miscellaneous memory-format insts * that don't interpret the disp field */ class MemoryNoDisp : public Memory { protected: /// Constructor MemoryNoDisp(const char *mnem, ExtMachInst _machInst, OpClass __opClass, StaticInstPtr _eaCompPtr = nullStaticInstPtr, StaticInstPtr _memAccPtr = nullStaticInstPtr) : Memory(mnem, _machInst, __opClass, _eaCompPtr, _memAccPtr) { } std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; };}};output decoder {{ std::string Memory::generateDisassembly(Addr pc, const SymbolTable *symtab) const { return csprintf("%-10s %c%d, %d(r%d)", mnemonic, flags[IsFloating] ? 'f' : 'r', RT, disp, RS); } std::string MemoryNoDisp::generateDisassembly(Addr pc, const SymbolTable *symtab) const { return csprintf("%-10s %c%d, r%d(r%d)", mnemonic, flags[IsFloating] ? 'f' : 'r', flags[IsFloating] ? FD : RD, RS, RT); }}};output exec {{ /** return data in cases where there the size of data is only known in the packet */ uint64_t getMemData(%(CPU_exec_context)s *xc, Packet *packet) { switch (packet->getSize()) { case 1: return packet->get<uint8_t>(); case 2: return packet->get<uint16_t>(); case 4: return packet->get<uint32_t>(); case 8: return packet->get<uint64_t>(); default: std::cerr << "bad store data size = " << packet->getSize() << std::endl; assert(0); return 0; } } }};def template LoadStoreDeclare {{ /** * Static instruction class for "%(mnemonic)s". */ class %(class_name)s : public %(base_class)s { protected: /** * "Fake" effective address computation class for "%(mnemonic)s". */ class EAComp : public %(base_class)s { public: /// Constructor EAComp(ExtMachInst machInst); %(BasicExecDeclare)s }; /** * "Fake" memory access instruction class for "%(mnemonic)s". */ class MemAcc : public %(base_class)s { public: /// Constructor MemAcc(ExtMachInst machInst); %(BasicExecDeclare)s }; public: /// Constructor. %(class_name)s(ExtMachInst machInst); %(BasicExecDeclare)s %(InitiateAccDeclare)s %(CompleteAccDeclare)s %(MemAccSizeDeclare)s };}};def template InitiateAccDeclare {{ Fault initiateAcc(%(CPU_exec_context)s *, Trace::InstRecord *) const;}};def template CompleteAccDeclare {{ Fault completeAcc(Packet *, %(CPU_exec_context)s *, Trace::InstRecord *) const;}};def template MemAccSizeDeclare {{ int memAccSize(%(CPU_exec_context)s *xc);}};def template MiscMemAccSize {{ int %(class_name)s::memAccSize(%(CPU_exec_context)s *xc) { panic("Misc instruction does not support split access method!"); return 0; }}};def template EACompConstructor {{ /** TODO: change op_class to AddrGenOp or something (requires * creating new member of OpClass enum in op_class.hh, updating * config files, etc.). */ inline %(class_name)s::EAComp::EAComp(ExtMachInst machInst) : %(base_class)s("%(mnemonic)s (EAComp)", machInst, IntAluOp) { %(constructor)s; }}};def template MemAccConstructor {{ inline %(class_name)s::MemAcc::MemAcc(ExtMachInst machInst) : %(base_class)s("%(mnemonic)s (MemAcc)", machInst, %(op_class)s) { %(constructor)s; }}};def template LoadStoreConstructor {{ inline %(class_name)s::%(class_name)s(ExtMachInst machInst) : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, new EAComp(machInst), new MemAcc(machInst)) { %(constructor)s; }}};def template EACompExecute {{ Fault %(class_name)s::EAComp::execute(%(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const { Addr EA; Fault fault = NoFault; if (this->isFloating()) { %(fp_enable_check)s; if(fault != NoFault) return fault; } %(op_decl)s; %(op_rd)s; %(ea_code)s; // NOTE: Trace Data is written using execute or completeAcc templates if (fault == NoFault) { xc->setEA(EA); } return fault; }}};def template LoadStoreFPEACompExecute {{ Fault %(class_name)s::EAComp::execute(%(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const { Addr EA; Fault fault = NoFault; %(fp_enable_check)s; if(fault != NoFault) return fault; %(op_decl)s; %(op_rd)s; %(ea_code)s; // NOTE: Trace Data is written using execute or completeAcc templates if (fault == NoFault) { xc->setEA(EA); } return fault; }}};def template LoadMemAccExecute {{ Fault %(class_name)s::MemAcc::execute(%(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const { Addr EA; Fault fault = NoFault; if (this->isFloating()) { %(fp_enable_check)s; if(fault != NoFault) return fault; } %(op_decl)s; %(op_rd)s; EA = xc->getEA(); fault = xc->read(EA, (uint%(mem_acc_size)d_t&)Mem, memAccessFlags); %(memacc_code)s; // NOTE: Write back data using execute or completeAcc templates return fault; }}};def template LoadExecute {{ Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const { Addr EA; Fault fault = NoFault; if (this->isFloating()) { %(fp_enable_check)s; if(fault != NoFault) return fault; } %(op_decl)s; %(op_rd)s; %(ea_code)s; if (fault == NoFault) { fault = xc->read(EA, (uint%(mem_acc_size)d_t&)Mem, memAccessFlags); %(memacc_code)s; } if (fault == NoFault) { %(op_wb)s; } return fault; }}};def template LoadInitiateAcc {{ Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const { Addr EA; Fault fault = NoFault; if (this->isFloating()) { %(fp_enable_check)s; if(fault != NoFault) return fault; } %(op_src_decl)s; %(op_rd)s; %(ea_code)s; if (fault == NoFault) { fault = xc->read(EA, (uint%(mem_acc_size)d_t &)Mem, memAccessFlags); } return fault; }}};def template LoadCompleteAcc {{ Fault %(class_name)s::completeAcc(Packet *pkt, %(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const { Fault fault = NoFault; if (this->isFloating()) { %(fp_enable_check)s; if(fault != NoFault) return fault; } %(op_decl)s; %(op_rd)s; Mem = pkt->get<typeof(Mem)>(); if (fault == NoFault) { %(memacc_code)s; } if (fault == NoFault) { %(op_wb)s; } return fault; }}};def template LoadStoreMemAccSize {{ int %(class_name)s::memAccSize(%(CPU_exec_context)s *xc) { // Return the memory access size in bytes return (%(mem_acc_size)d / 8); }}};def template StoreMemAccExecute {{ Fault %(class_name)s::MemAcc::execute(%(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const { Addr EA;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?