mem.isa revision 2132
112697Santhony.gutierrez@amd.com// -*- mode:c++ -*- 212697Santhony.gutierrez@amd.com 311308Santhony.gutierrez@amd.com// Copyright (c) 2003-2005 The Regents of The University of Michigan 412697Santhony.gutierrez@amd.com// All rights reserved. 511308Santhony.gutierrez@amd.com// 612697Santhony.gutierrez@amd.com// Redistribution and use in source and binary forms, with or without 712697Santhony.gutierrez@amd.com// modification, are permitted provided that the following conditions are 811308Santhony.gutierrez@amd.com// met: redistributions of source code must retain the above copyright 912697Santhony.gutierrez@amd.com// notice, this list of conditions and the following disclaimer; 1012697Santhony.gutierrez@amd.com// redistributions in binary form must reproduce the above copyright 1111308Santhony.gutierrez@amd.com// notice, this list of conditions and the following disclaimer in the 1212697Santhony.gutierrez@amd.com// documentation and/or other materials provided with the distribution; 1312697Santhony.gutierrez@amd.com// neither the name of the copyright holders nor the names of its 1412697Santhony.gutierrez@amd.com// contributors may be used to endorse or promote products derived from 1511308Santhony.gutierrez@amd.com// this software without specific prior written permission. 1612697Santhony.gutierrez@amd.com// 1712697Santhony.gutierrez@amd.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1812697Santhony.gutierrez@amd.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1911308Santhony.gutierrez@amd.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2012697Santhony.gutierrez@amd.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2112697Santhony.gutierrez@amd.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2212697Santhony.gutierrez@amd.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2312697Santhony.gutierrez@amd.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2412697Santhony.gutierrez@amd.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2512697Santhony.gutierrez@amd.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2612697Santhony.gutierrez@amd.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2712697Santhony.gutierrez@amd.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2812697Santhony.gutierrez@amd.com 2912697Santhony.gutierrez@amd.comoutput header {{ 3012697Santhony.gutierrez@amd.com /** 3111308Santhony.gutierrez@amd.com * Base class for general Mips memory-format instructions. 3212697Santhony.gutierrez@amd.com */ 3311308Santhony.gutierrez@amd.com class Memory : public MipsStaticInst 3411308Santhony.gutierrez@amd.com { 3511308Santhony.gutierrez@amd.com protected: 3611308Santhony.gutierrez@amd.com 3711308Santhony.gutierrez@amd.com /// Memory request flags. See mem_req_base.hh. 3813400Sodanrc@yahoo.com.br unsigned memAccessFlags; 3911308Santhony.gutierrez@amd.com /// Pointer to EAComp object. 4011308Santhony.gutierrez@amd.com const StaticInstPtr eaCompPtr; 4113951Sodanrc@yahoo.com.br /// Pointer to MemAcc object. 4211308Santhony.gutierrez@amd.com const StaticInstPtr memAccPtr; 4313400Sodanrc@yahoo.com.br /// Displacement for EA calculation (signed). 4413400Sodanrc@yahoo.com.br int32_t disp; 4511670Sandreas.hansson@arm.com 4611670Sandreas.hansson@arm.com /// Constructor 4711308Santhony.gutierrez@amd.com Memory(const char *mnem, MachInst _machInst, OpClass __opClass, 4811308Santhony.gutierrez@amd.com StaticInstPtr _eaCompPtr = nullStaticInstPtr, 4911308Santhony.gutierrez@amd.com StaticInstPtr _memAccPtr = nullStaticInstPtr) 5011308Santhony.gutierrez@amd.com : MipsStaticInst(mnem, _machInst, __opClass), 5111308Santhony.gutierrez@amd.com memAccessFlags(0), eaCompPtr(_eaCompPtr), memAccPtr(_memAccPtr), 5211308Santhony.gutierrez@amd.com disp(OFFSET) 5311308Santhony.gutierrez@amd.com { 5411308Santhony.gutierrez@amd.com } 5511308Santhony.gutierrez@amd.com 5611308Santhony.gutierrez@amd.com std::string 5711308Santhony.gutierrez@amd.com generateDisassembly(Addr pc, const SymbolTable *symtab) const; 5811308Santhony.gutierrez@amd.com 5911308Santhony.gutierrez@amd.com public: 6011308Santhony.gutierrez@amd.com 6111308Santhony.gutierrez@amd.com const StaticInstPtr &eaCompInst() const { return eaCompPtr; } 6211308Santhony.gutierrez@amd.com const StaticInstPtr &memAccInst() const { return memAccPtr; } 6311308Santhony.gutierrez@amd.com }; 6411308Santhony.gutierrez@amd.com 6511308Santhony.gutierrez@amd.com}}; 6611308Santhony.gutierrez@amd.com 6711308Santhony.gutierrez@amd.com 6811308Santhony.gutierrez@amd.comoutput decoder {{ 6911308Santhony.gutierrez@amd.com std::string 7011308Santhony.gutierrez@amd.com Memory::generateDisassembly(Addr pc, const SymbolTable *symtab) const 7111308Santhony.gutierrez@amd.com { 7211308Santhony.gutierrez@amd.com return csprintf("%-10s %c%d,%d(r%d)", mnemonic, 7311308Santhony.gutierrez@amd.com flags[IsFloating] ? 'f' : 'r', RA, MEMDISP, RB); 7411308Santhony.gutierrez@amd.com } 7511308Santhony.gutierrez@amd.com 7611308Santhony.gutierrez@amd.com}}; 7711308Santhony.gutierrez@amd.com 7811308Santhony.gutierrez@amd.comdef format LoadAddress(code) {{ 7911308Santhony.gutierrez@amd.com iop = InstObjParams(name, Name, 'MemoryDisp32', CodeBlock(code)) 8011308Santhony.gutierrez@amd.com header_output = BasicDeclare.subst(iop) 8111308Santhony.gutierrez@amd.com decoder_output = BasicConstructor.subst(iop) 8211308Santhony.gutierrez@amd.com decode_block = BasicDecode.subst(iop) 8311308Santhony.gutierrez@amd.com exec_output = BasicExecute.subst(iop) 8411308Santhony.gutierrez@amd.com}}; 8511308Santhony.gutierrez@amd.com 8611308Santhony.gutierrez@amd.com 8711308Santhony.gutierrez@amd.comdef template LoadStoreDeclare {{ 8811308Santhony.gutierrez@amd.com /** 8911308Santhony.gutierrez@amd.com * Static instruction class for "%(mnemonic)s". 9011308Santhony.gutierrez@amd.com */ 9111308Santhony.gutierrez@amd.com class %(class_name)s : public %(base_class)s 9211308Santhony.gutierrez@amd.com { 9311308Santhony.gutierrez@amd.com protected: 9411308Santhony.gutierrez@amd.com 9511308Santhony.gutierrez@amd.com /** 9611308Santhony.gutierrez@amd.com * "Fake" effective address computation class for "%(mnemonic)s". 9711308Santhony.gutierrez@amd.com */ 9811308Santhony.gutierrez@amd.com class EAComp : public %(base_class)s 9911308Santhony.gutierrez@amd.com { 10011308Santhony.gutierrez@amd.com public: 10111308Santhony.gutierrez@amd.com /// Constructor 10211308Santhony.gutierrez@amd.com EAComp(MachInst machInst); 10311308Santhony.gutierrez@amd.com 10411308Santhony.gutierrez@amd.com %(BasicExecDeclare)s 10511308Santhony.gutierrez@amd.com }; 10611308Santhony.gutierrez@amd.com 10711308Santhony.gutierrez@amd.com /** 10811308Santhony.gutierrez@amd.com * "Fake" memory access instruction class for "%(mnemonic)s". 10911308Santhony.gutierrez@amd.com */ 11011308Santhony.gutierrez@amd.com class MemAcc : public %(base_class)s 11111308Santhony.gutierrez@amd.com { 11211308Santhony.gutierrez@amd.com public: 11311308Santhony.gutierrez@amd.com /// Constructor 11411308Santhony.gutierrez@amd.com MemAcc(MachInst machInst); 11511308Santhony.gutierrez@amd.com 11611308Santhony.gutierrez@amd.com %(BasicExecDeclare)s 11711308Santhony.gutierrez@amd.com }; 11811308Santhony.gutierrez@amd.com 11911308Santhony.gutierrez@amd.com public: 12013974Stiago.muck@arm.com 12113974Stiago.muck@arm.com /// Constructor. 12213974Stiago.muck@arm.com %(class_name)s(MachInst machInst); 12311308Santhony.gutierrez@amd.com 12411308Santhony.gutierrez@amd.com %(BasicExecDeclare)s 12511308Santhony.gutierrez@amd.com 12611308Santhony.gutierrez@amd.com %(InitiateAccDeclare)s 12711308Santhony.gutierrez@amd.com 12811308Santhony.gutierrez@amd.com %(CompleteAccDeclare)s 12911308Santhony.gutierrez@amd.com }; 13011308Santhony.gutierrez@amd.com}}; 13111308Santhony.gutierrez@amd.com 13211308Santhony.gutierrez@amd.com 13311308Santhony.gutierrez@amd.comdef template InitiateAccDeclare {{ 13411308Santhony.gutierrez@amd.com Fault initiateAcc(%(CPU_exec_context)s *, Trace::InstRecord *) const; 13511308Santhony.gutierrez@amd.com}}; 13611308Santhony.gutierrez@amd.com 13711308Santhony.gutierrez@amd.com 13811308Santhony.gutierrez@amd.comdef template CompleteAccDeclare {{ 13911308Santhony.gutierrez@amd.com Fault completeAcc(uint8_t *, %(CPU_exec_context)s *, Trace::InstRecord *) const; 14011308Santhony.gutierrez@amd.com}}; 14111308Santhony.gutierrez@amd.com 14211308Santhony.gutierrez@amd.com 14311308Santhony.gutierrez@amd.comdef template LoadStoreConstructor {{ 14411308Santhony.gutierrez@amd.com /** TODO: change op_class to AddrGenOp or something (requires 14511308Santhony.gutierrez@amd.com * creating new member of OpClass enum in op_class.hh, updating 14611308Santhony.gutierrez@amd.com * config files, etc.). */ 14711308Santhony.gutierrez@amd.com inline %(class_name)s::EAComp::EAComp(MachInst machInst) 14811308Santhony.gutierrez@amd.com : %(base_class)s("%(mnemonic)s (EAComp)", machInst, IntAluOp) 14911308Santhony.gutierrez@amd.com { 15011308Santhony.gutierrez@amd.com %(ea_constructor)s; 15111308Santhony.gutierrez@amd.com } 15211308Santhony.gutierrez@amd.com 15311308Santhony.gutierrez@amd.com inline %(class_name)s::MemAcc::MemAcc(MachInst machInst) 15411308Santhony.gutierrez@amd.com : %(base_class)s("%(mnemonic)s (MemAcc)", machInst, %(op_class)s) 15511308Santhony.gutierrez@amd.com { 15611308Santhony.gutierrez@amd.com %(memacc_constructor)s; 15711308Santhony.gutierrez@amd.com } 15811308Santhony.gutierrez@amd.com 15911308Santhony.gutierrez@amd.com inline %(class_name)s::%(class_name)s(MachInst machInst) 16011308Santhony.gutierrez@amd.com : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 16111308Santhony.gutierrez@amd.com new EAComp(machInst), new MemAcc(machInst)) 16211308Santhony.gutierrez@amd.com { 16311308Santhony.gutierrez@amd.com %(constructor)s; 16411308Santhony.gutierrez@amd.com } 16511308Santhony.gutierrez@amd.com}}; 16611308Santhony.gutierrez@amd.com 16711308Santhony.gutierrez@amd.com 16811308Santhony.gutierrez@amd.comdef template EACompExecute {{ 16911308Santhony.gutierrez@amd.com Fault 17011308Santhony.gutierrez@amd.com %(class_name)s::EAComp::execute(%(CPU_exec_context)s *xc, 17112065Snikos.nikoleris@arm.com Trace::InstRecord *traceData) const 17211308Santhony.gutierrez@amd.com { 17311308Santhony.gutierrez@amd.com Addr EA; 17411308Santhony.gutierrez@amd.com Fault fault = NoFault; 17511308Santhony.gutierrez@amd.com 17612065Snikos.nikoleris@arm.com %(fp_enable_check)s; 17712065Snikos.nikoleris@arm.com %(op_decl)s; 17811308Santhony.gutierrez@amd.com %(op_rd)s; 17911308Santhony.gutierrez@amd.com %(code)s; 18011308Santhony.gutierrez@amd.com 18111308Santhony.gutierrez@amd.com if (fault == NoFault) { 18211308Santhony.gutierrez@amd.com %(op_wb)s; 18311308Santhony.gutierrez@amd.com xc->setEA(EA); 18411308Santhony.gutierrez@amd.com } 18511308Santhony.gutierrez@amd.com 18611308Santhony.gutierrez@amd.com return fault; 18711308Santhony.gutierrez@amd.com } 18811308Santhony.gutierrez@amd.com}}; 18911308Santhony.gutierrez@amd.com 19011308Santhony.gutierrez@amd.comdef template LoadMemAccExecute {{ 19111308Santhony.gutierrez@amd.com Fault 19211308Santhony.gutierrez@amd.com %(class_name)s::MemAcc::execute(%(CPU_exec_context)s *xc, 19311308Santhony.gutierrez@amd.com Trace::InstRecord *traceData) const 19411308Santhony.gutierrez@amd.com { 19511308Santhony.gutierrez@amd.com Addr EA; 19611308Santhony.gutierrez@amd.com Fault fault = NoFault; 19711308Santhony.gutierrez@amd.com 19811308Santhony.gutierrez@amd.com %(fp_enable_check)s; 19911308Santhony.gutierrez@amd.com %(op_decl)s; 20011308Santhony.gutierrez@amd.com %(op_rd)s; 20111308Santhony.gutierrez@amd.com EA = xc->getEA(); 20211308Santhony.gutierrez@amd.com 20311308Santhony.gutierrez@amd.com if (fault == NoFault) { 20411308Santhony.gutierrez@amd.com fault = xc->read(EA, (uint%(mem_acc_size)d_t&)Mem, memAccessFlags); 20511308Santhony.gutierrez@amd.com %(code)s; 20611308Santhony.gutierrez@amd.com } 20711308Santhony.gutierrez@amd.com 20811308Santhony.gutierrez@amd.com if (fault == NoFault) { 20911308Santhony.gutierrez@amd.com %(op_wb)s; 21011308Santhony.gutierrez@amd.com } 21111308Santhony.gutierrez@amd.com 21211308Santhony.gutierrez@amd.com return fault; 21312598Snikos.nikoleris@arm.com } 21412598Snikos.nikoleris@arm.com}}; 21511308Santhony.gutierrez@amd.com 21611308Santhony.gutierrez@amd.com 21711308Santhony.gutierrez@amd.comdef template LoadExecute {{ 21811308Santhony.gutierrez@amd.com Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, 21911308Santhony.gutierrez@amd.com Trace::InstRecord *traceData) const 22011308Santhony.gutierrez@amd.com { 22111308Santhony.gutierrez@amd.com Addr EA; 22211308Santhony.gutierrez@amd.com Fault fault = NoFault; 22311308Santhony.gutierrez@amd.com 22411308Santhony.gutierrez@amd.com %(fp_enable_check)s; 22511308Santhony.gutierrez@amd.com %(op_decl)s; 22611308Santhony.gutierrez@amd.com %(op_rd)s; 22711308Santhony.gutierrez@amd.com %(ea_code)s; 22811308Santhony.gutierrez@amd.com 22911308Santhony.gutierrez@amd.com if (fault == NoFault) { 23011308Santhony.gutierrez@amd.com fault = xc->read(EA, (uint%(mem_acc_size)d_t&)Mem, memAccessFlags); 23111308Santhony.gutierrez@amd.com %(memacc_code)s; 23211308Santhony.gutierrez@amd.com } 23311308Santhony.gutierrez@amd.com 23411308Santhony.gutierrez@amd.com if (fault == NoFault) { 23511308Santhony.gutierrez@amd.com %(op_wb)s; 23611308Santhony.gutierrez@amd.com } 23711308Santhony.gutierrez@amd.com 23811308Santhony.gutierrez@amd.com return fault; 23911308Santhony.gutierrez@amd.com } 24012065Snikos.nikoleris@arm.com}}; 24112065Snikos.nikoleris@arm.com 24212065Snikos.nikoleris@arm.com 24312065Snikos.nikoleris@arm.comdef template LoadInitiateAcc {{ 24412065Snikos.nikoleris@arm.com Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s *xc, 24512065Snikos.nikoleris@arm.com Trace::InstRecord *traceData) const 24612065Snikos.nikoleris@arm.com { 24712065Snikos.nikoleris@arm.com Addr EA; 24812065Snikos.nikoleris@arm.com Fault fault = NoFault; 24912065Snikos.nikoleris@arm.com 25012065Snikos.nikoleris@arm.com %(fp_enable_check)s; 25113731Sandreas.sandberg@arm.com %(op_src_decl)s; 25212065Snikos.nikoleris@arm.com %(op_rd)s; 25312065Snikos.nikoleris@arm.com %(ea_code)s; 25412065Snikos.nikoleris@arm.com 25512065Snikos.nikoleris@arm.com if (fault == NoFault) { 25612065Snikos.nikoleris@arm.com fault = xc->read(EA, (uint%(mem_acc_size)d_t &)Mem, memAccessFlags); 25712065Snikos.nikoleris@arm.com } 25812065Snikos.nikoleris@arm.com 25912065Snikos.nikoleris@arm.com return fault; 26011308Santhony.gutierrez@amd.com } 26111308Santhony.gutierrez@amd.com}}; 26212065Snikos.nikoleris@arm.com 26311308Santhony.gutierrez@amd.com 26411308Santhony.gutierrez@amd.comdef template LoadCompleteAcc {{ 26511308Santhony.gutierrez@amd.com Fault %(class_name)s::completeAcc(uint8_t *data, 26611308Santhony.gutierrez@amd.com %(CPU_exec_context)s *xc, 26711308Santhony.gutierrez@amd.com Trace::InstRecord *traceData) const 26811308Santhony.gutierrez@amd.com { 26911308Santhony.gutierrez@amd.com Fault fault = NoFault; 27011308Santhony.gutierrez@amd.com 27111308Santhony.gutierrez@amd.com %(fp_enable_check)s; 27211308Santhony.gutierrez@amd.com %(op_src_decl)s; 27311308Santhony.gutierrez@amd.com %(op_dest_decl)s; 27411308Santhony.gutierrez@amd.com 27511308Santhony.gutierrez@amd.com memcpy(&Mem, data, sizeof(Mem)); 27611308Santhony.gutierrez@amd.com 27711308Santhony.gutierrez@amd.com if (fault == NoFault) { 27811308Santhony.gutierrez@amd.com %(memacc_code)s; 27911308Santhony.gutierrez@amd.com } 28011308Santhony.gutierrez@amd.com 28111308Santhony.gutierrez@amd.com if (fault == NoFault) { 28211308Santhony.gutierrez@amd.com %(op_wb)s; 28311308Santhony.gutierrez@amd.com } 28411308Santhony.gutierrez@amd.com 28511308Santhony.gutierrez@amd.com return fault; 28611308Santhony.gutierrez@amd.com } 28711308Santhony.gutierrez@amd.com}}; 28811308Santhony.gutierrez@amd.com 28911308Santhony.gutierrez@amd.com 29011308Santhony.gutierrez@amd.comdef template StoreMemAccExecute {{ 29111308Santhony.gutierrez@amd.com Fault 29211308Santhony.gutierrez@amd.com %(class_name)s::MemAcc::execute(%(CPU_exec_context)s *xc, 29311308Santhony.gutierrez@amd.com Trace::InstRecord *traceData) const 29411308Santhony.gutierrez@amd.com { 29511308Santhony.gutierrez@amd.com Addr EA; 29611308Santhony.gutierrez@amd.com Fault fault = NoFault; 29713731Sandreas.sandberg@arm.com uint64_t write_result = 0; 29811308Santhony.gutierrez@amd.com 29911308Santhony.gutierrez@amd.com %(fp_enable_check)s; 30011308Santhony.gutierrez@amd.com %(op_decl)s; 30111308Santhony.gutierrez@amd.com %(op_rd)s; 30211308Santhony.gutierrez@amd.com EA = xc->getEA(); 30311308Santhony.gutierrez@amd.com 30411308Santhony.gutierrez@amd.com if (fault == NoFault) { 30511308Santhony.gutierrez@amd.com %(code)s; 30611308Santhony.gutierrez@amd.com } 30711308Santhony.gutierrez@amd.com 30811308Santhony.gutierrez@amd.com if (fault == NoFault) { 30911308Santhony.gutierrez@amd.com fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA, 31011308Santhony.gutierrez@amd.com memAccessFlags, &write_result); 31111308Santhony.gutierrez@amd.com if (traceData) { traceData->setData(Mem); } 31211308Santhony.gutierrez@amd.com } 31311308Santhony.gutierrez@amd.com 31411308Santhony.gutierrez@amd.com if (fault == NoFault) { 31511308Santhony.gutierrez@amd.com %(postacc_code)s; 31611308Santhony.gutierrez@amd.com } 31711308Santhony.gutierrez@amd.com 31811308Santhony.gutierrez@amd.com if (fault == NoFault) { 31911308Santhony.gutierrez@amd.com %(op_wb)s; 32011308Santhony.gutierrez@amd.com } 32111308Santhony.gutierrez@amd.com 32211308Santhony.gutierrez@amd.com return fault; 32311308Santhony.gutierrez@amd.com } 32411308Santhony.gutierrez@amd.com}}; 32511308Santhony.gutierrez@amd.com 32611308Santhony.gutierrez@amd.com 32711308Santhony.gutierrez@amd.comdef template StoreExecute {{ 32811308Santhony.gutierrez@amd.com Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, 32913885Sdavid.hashe@amd.com Trace::InstRecord *traceData) const 33013885Sdavid.hashe@amd.com { 33113885Sdavid.hashe@amd.com Addr EA; 33213885Sdavid.hashe@amd.com Fault fault = NoFault; 33313885Sdavid.hashe@amd.com uint64_t write_result = 0; 33413885Sdavid.hashe@amd.com 33513885Sdavid.hashe@amd.com %(fp_enable_check)s; 33613885Sdavid.hashe@amd.com %(op_decl)s; 33713885Sdavid.hashe@amd.com %(op_rd)s; 33813885Sdavid.hashe@amd.com %(ea_code)s; 33913885Sdavid.hashe@amd.com 34013885Sdavid.hashe@amd.com if (fault == NoFault) { 34113885Sdavid.hashe@amd.com %(memacc_code)s; 34213885Sdavid.hashe@amd.com } 34313885Sdavid.hashe@amd.com 34413885Sdavid.hashe@amd.com if (fault == NoFault) { 34513885Sdavid.hashe@amd.com fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA, 34613885Sdavid.hashe@amd.com memAccessFlags, &write_result); 34713885Sdavid.hashe@amd.com if (traceData) { traceData->setData(Mem); } 34813885Sdavid.hashe@amd.com } 34913885Sdavid.hashe@amd.com 35013885Sdavid.hashe@amd.com if (fault == NoFault) { 35113885Sdavid.hashe@amd.com %(postacc_code)s; 35213885Sdavid.hashe@amd.com } 35313885Sdavid.hashe@amd.com 35413885Sdavid.hashe@amd.com if (fault == NoFault) { 35513885Sdavid.hashe@amd.com %(op_wb)s; 35613885Sdavid.hashe@amd.com } 35713885Sdavid.hashe@amd.com 35813885Sdavid.hashe@amd.com return fault; 35913885Sdavid.hashe@amd.com } 36013885Sdavid.hashe@amd.com}}; 36113885Sdavid.hashe@amd.com 36213885Sdavid.hashe@amd.comdef template StoreInitiateAcc {{ 36313885Sdavid.hashe@amd.com Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s *xc, 36413885Sdavid.hashe@amd.com Trace::InstRecord *traceData) const 36513885Sdavid.hashe@amd.com { 36613885Sdavid.hashe@amd.com Addr EA; 36713885Sdavid.hashe@amd.com Fault fault = NoFault; 36813885Sdavid.hashe@amd.com uint64_t write_result = 0; 36913885Sdavid.hashe@amd.com 37013885Sdavid.hashe@amd.com %(fp_enable_check)s; 37113885Sdavid.hashe@amd.com %(op_src_decl)s; 37213885Sdavid.hashe@amd.com %(op_dest_decl)s; 37313885Sdavid.hashe@amd.com %(op_rd)s; 37413885Sdavid.hashe@amd.com %(ea_code)s; 37513885Sdavid.hashe@amd.com 37613885Sdavid.hashe@amd.com if (fault == NoFault) { 37713885Sdavid.hashe@amd.com %(memacc_code)s; 37813885Sdavid.hashe@amd.com } 37913885Sdavid.hashe@amd.com 38013885Sdavid.hashe@amd.com if (fault == NoFault) { 38113885Sdavid.hashe@amd.com fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA, 38211308Santhony.gutierrez@amd.com memAccessFlags, &write_result); 38311308Santhony.gutierrez@amd.com if (traceData) { traceData->setData(Mem); } 38411308Santhony.gutierrez@amd.com } 38511308Santhony.gutierrez@amd.com 38611308Santhony.gutierrez@amd.com return fault; 38711308Santhony.gutierrez@amd.com } 38811308Santhony.gutierrez@amd.com}}; 38911308Santhony.gutierrez@amd.com 39011308Santhony.gutierrez@amd.com 391def template StoreCompleteAcc {{ 392 Fault %(class_name)s::completeAcc(uint8_t *data, 393 %(CPU_exec_context)s *xc, 394 Trace::InstRecord *traceData) const 395 { 396 Fault fault = NoFault; 397 uint64_t write_result = 0; 398 399 %(fp_enable_check)s; 400 %(op_dest_decl)s; 401 402 memcpy(&write_result, data, sizeof(write_result)); 403 404 if (fault == NoFault) { 405 %(postacc_code)s; 406 } 407 408 if (fault == NoFault) { 409 %(op_wb)s; 410 } 411 412 return fault; 413 } 414}}; 415 416// load instructions use Rt as dest, so check for 417// Rt == 31 to detect nops 418def template LoadNopCheckDecode {{ 419 { 420 MipsStaticInst *i = new %(class_name)s(machInst); 421 if (RT == 0) { 422 i = makeNop(i); 423 } 424 return i; 425 } 426}}; 427 428def format LoadMemory(memacc_code, ea_code = {{ EA = Rs + disp; }}, 429 mem_flags = [], inst_flags = []) {{ 430 (header_output, decoder_output, decode_block, exec_output) = \ 431 LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags, 432 decode_template = LoadNopCheckDecode, 433 exec_template_base = 'Load') 434}}; 435 436 437def format StoreMemory(memacc_code, ea_code = {{ EA = Rs + disp; }}, 438 mem_flags = [], inst_flags = []) {{ 439 (header_output, decoder_output, decode_block, exec_output) = \ 440 LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags, 441 exec_template_base = 'Store') 442}}; 443 444//FP loads are offloaded to these formats for now ... 445def format LoadMemory2(ea_code = {{ EA = Rs + disp; }}, memacc_code = {{ }}, 446 mem_flags = [], inst_flags = []) {{ 447 (header_output, decoder_output, decode_block, exec_output) = \ 448 LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags, 449 decode_template = LoadNopCheckDecode, 450 exec_template_base = 'Load') 451}}; 452 453 454//FP stores are offloaded to these formats for now ... 455def format StoreMemory2(ea_code = {{ EA = Rs + disp; }},memacc_code = {{ }}, 456 mem_flags = [], inst_flags = []) {{ 457 (header_output, decoder_output, decode_block, exec_output) = \ 458 LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags, 459 decode_template = LoadNopCheckDecode, 460 exec_template_base = 'Store') 461}}; 462 463