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