sve_mem.isa revision 14028
114028Sgiacomo.gabrielli@arm.com// Copyright (c) 2017-2018 ARM Limited
213955Sgiacomo.gabrielli@arm.com// All rights reserved
313955Sgiacomo.gabrielli@arm.com//
413955Sgiacomo.gabrielli@arm.com// The license below extends only to copyright in the software and shall
513955Sgiacomo.gabrielli@arm.com// not be construed as granting a license to any other intellectual
613955Sgiacomo.gabrielli@arm.com// property including but not limited to intellectual property relating
713955Sgiacomo.gabrielli@arm.com// to a hardware implementation of the functionality of the software
813955Sgiacomo.gabrielli@arm.com// licensed hereunder.  You may use the software subject to the license
913955Sgiacomo.gabrielli@arm.com// terms below provided that you ensure that this notice is replicated
1013955Sgiacomo.gabrielli@arm.com// unmodified and in its entirety in all distributions of the software,
1113955Sgiacomo.gabrielli@arm.com// modified or unmodified, in source code or in binary form.
1213955Sgiacomo.gabrielli@arm.com//
1313955Sgiacomo.gabrielli@arm.com// Redistribution and use in source and binary forms, with or without
1413955Sgiacomo.gabrielli@arm.com// modification, are permitted provided that the following conditions are
1513955Sgiacomo.gabrielli@arm.com// met: redistributions of source code must retain the above copyright
1613955Sgiacomo.gabrielli@arm.com// notice, this list of conditions and the following disclaimer;
1713955Sgiacomo.gabrielli@arm.com// redistributions in binary form must reproduce the above copyright
1813955Sgiacomo.gabrielli@arm.com// notice, this list of conditions and the following disclaimer in the
1913955Sgiacomo.gabrielli@arm.com// documentation and/or other materials provided with the distribution;
2013955Sgiacomo.gabrielli@arm.com// neither the name of the copyright holders nor the names of its
2113955Sgiacomo.gabrielli@arm.com// contributors may be used to endorse or promote products derived from
2213955Sgiacomo.gabrielli@arm.com// this software without specific prior written permission.
2313955Sgiacomo.gabrielli@arm.com//
2413955Sgiacomo.gabrielli@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2513955Sgiacomo.gabrielli@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2613955Sgiacomo.gabrielli@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2713955Sgiacomo.gabrielli@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2813955Sgiacomo.gabrielli@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2913955Sgiacomo.gabrielli@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3013955Sgiacomo.gabrielli@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3113955Sgiacomo.gabrielli@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3213955Sgiacomo.gabrielli@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3313955Sgiacomo.gabrielli@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3413955Sgiacomo.gabrielli@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3513955Sgiacomo.gabrielli@arm.com//
3613955Sgiacomo.gabrielli@arm.com// Authors: Giacomo Gabrielli
3713955Sgiacomo.gabrielli@arm.com
3813955Sgiacomo.gabrielli@arm.comdef template SveMemFillSpillOpDeclare {{
3913955Sgiacomo.gabrielli@arm.com    class %(class_name)s : public %(base_class)s
4013955Sgiacomo.gabrielli@arm.com    {
4113955Sgiacomo.gabrielli@arm.com      protected:
4213955Sgiacomo.gabrielli@arm.com        typedef uint8_t TPElem;
4313955Sgiacomo.gabrielli@arm.com        typedef uint8_t RegElemType;
4413955Sgiacomo.gabrielli@arm.com        typedef uint8_t MemElemType;
4513955Sgiacomo.gabrielli@arm.com
4613955Sgiacomo.gabrielli@arm.com      public:
4713955Sgiacomo.gabrielli@arm.com        %(class_name)s(ExtMachInst machInst,
4813955Sgiacomo.gabrielli@arm.com            IntRegIndex _dest, IntRegIndex _base, uint64_t _imm)
4913955Sgiacomo.gabrielli@arm.com            : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
5013955Sgiacomo.gabrielli@arm.com                _dest, _base, _imm)
5113955Sgiacomo.gabrielli@arm.com        {
5213955Sgiacomo.gabrielli@arm.com            %(constructor)s;
5313955Sgiacomo.gabrielli@arm.com        }
5413955Sgiacomo.gabrielli@arm.com
5513955Sgiacomo.gabrielli@arm.com        Fault execute(ExecContext *, Trace::InstRecord *) const;
5613955Sgiacomo.gabrielli@arm.com        Fault initiateAcc(ExecContext *, Trace::InstRecord *) const;
5713955Sgiacomo.gabrielli@arm.com        Fault completeAcc(PacketPtr, ExecContext *, Trace::InstRecord *) const;
5813955Sgiacomo.gabrielli@arm.com
5913955Sgiacomo.gabrielli@arm.com        virtual void
6013955Sgiacomo.gabrielli@arm.com        annotateFault(ArmFault *fault) {
6113955Sgiacomo.gabrielli@arm.com            %(fa_code)s
6213955Sgiacomo.gabrielli@arm.com        }
6313955Sgiacomo.gabrielli@arm.com    };
6413955Sgiacomo.gabrielli@arm.com}};
6513955Sgiacomo.gabrielli@arm.com
6613955Sgiacomo.gabrielli@arm.comdef template SveContigMemSSOpDeclare {{
6713955Sgiacomo.gabrielli@arm.com    %(tpl_header)s
6813955Sgiacomo.gabrielli@arm.com    class %(class_name)s : public %(base_class)s
6913955Sgiacomo.gabrielli@arm.com    {
7013955Sgiacomo.gabrielli@arm.com      protected:
7113955Sgiacomo.gabrielli@arm.com        typedef RegElemType TPElem;
7213955Sgiacomo.gabrielli@arm.com
7313955Sgiacomo.gabrielli@arm.com      public:
7413955Sgiacomo.gabrielli@arm.com        %(class_name)s(const char* mnem, ExtMachInst machInst,
7513955Sgiacomo.gabrielli@arm.com            IntRegIndex _dest, IntRegIndex _gp, IntRegIndex _base,
7613955Sgiacomo.gabrielli@arm.com            IntRegIndex _offset)
7713955Sgiacomo.gabrielli@arm.com            : %(base_class)s(mnem, machInst, %(op_class)s,
7813955Sgiacomo.gabrielli@arm.com                _dest, _gp, _base, _offset)
7913955Sgiacomo.gabrielli@arm.com        {
8013955Sgiacomo.gabrielli@arm.com            %(constructor)s;
8113955Sgiacomo.gabrielli@arm.com        }
8213955Sgiacomo.gabrielli@arm.com
8313955Sgiacomo.gabrielli@arm.com        Fault execute(ExecContext *, Trace::InstRecord *) const;
8413955Sgiacomo.gabrielli@arm.com        Fault initiateAcc(ExecContext *, Trace::InstRecord *) const;
8513955Sgiacomo.gabrielli@arm.com        Fault completeAcc(PacketPtr, ExecContext *, Trace::InstRecord *) const;
8613955Sgiacomo.gabrielli@arm.com
8713955Sgiacomo.gabrielli@arm.com        virtual void
8813955Sgiacomo.gabrielli@arm.com        annotateFault(ArmFault *fault) {
8913955Sgiacomo.gabrielli@arm.com            %(fa_code)s
9013955Sgiacomo.gabrielli@arm.com        }
9113955Sgiacomo.gabrielli@arm.com    };
9213955Sgiacomo.gabrielli@arm.com}};
9313955Sgiacomo.gabrielli@arm.com
9413955Sgiacomo.gabrielli@arm.comdef template SveContigMemSIOpDeclare {{
9513955Sgiacomo.gabrielli@arm.com    %(tpl_header)s
9613955Sgiacomo.gabrielli@arm.com    class %(class_name)s : public %(base_class)s
9713955Sgiacomo.gabrielli@arm.com    {
9813955Sgiacomo.gabrielli@arm.com      protected:
9913955Sgiacomo.gabrielli@arm.com        typedef RegElemType TPElem;
10013955Sgiacomo.gabrielli@arm.com
10113955Sgiacomo.gabrielli@arm.com      public:
10213955Sgiacomo.gabrielli@arm.com        %(class_name)s(const char* mnem, ExtMachInst machInst,
10313955Sgiacomo.gabrielli@arm.com            IntRegIndex _dest, IntRegIndex _gp, IntRegIndex _base,
10413955Sgiacomo.gabrielli@arm.com            uint64_t _imm)
10513955Sgiacomo.gabrielli@arm.com            : %(base_class)s(mnem, machInst, %(op_class)s,
10613955Sgiacomo.gabrielli@arm.com                _dest, _gp, _base, _imm)
10713955Sgiacomo.gabrielli@arm.com        {
10813955Sgiacomo.gabrielli@arm.com            %(constructor)s;
10913955Sgiacomo.gabrielli@arm.com        }
11013955Sgiacomo.gabrielli@arm.com
11113955Sgiacomo.gabrielli@arm.com        Fault execute(ExecContext *, Trace::InstRecord *) const;
11213955Sgiacomo.gabrielli@arm.com        Fault initiateAcc(ExecContext *, Trace::InstRecord *) const;
11313955Sgiacomo.gabrielli@arm.com        Fault completeAcc(PacketPtr, ExecContext *, Trace::InstRecord *) const;
11413955Sgiacomo.gabrielli@arm.com
11513955Sgiacomo.gabrielli@arm.com        virtual void
11613955Sgiacomo.gabrielli@arm.com        annotateFault(ArmFault *fault) {
11713955Sgiacomo.gabrielli@arm.com            %(fa_code)s
11813955Sgiacomo.gabrielli@arm.com        }
11913955Sgiacomo.gabrielli@arm.com    };
12013955Sgiacomo.gabrielli@arm.com}};
12113955Sgiacomo.gabrielli@arm.com
12213955Sgiacomo.gabrielli@arm.comdef template SveContigMemExecDeclare {{
12313955Sgiacomo.gabrielli@arm.com    template
12413955Sgiacomo.gabrielli@arm.com    Fault %(class_name)s%(tpl_args)s::execute(ExecContext *,
12513955Sgiacomo.gabrielli@arm.com        Trace::InstRecord *) const;
12613955Sgiacomo.gabrielli@arm.com
12713955Sgiacomo.gabrielli@arm.com    template
12813955Sgiacomo.gabrielli@arm.com    Fault %(class_name)s%(tpl_args)s::initiateAcc(ExecContext *,
12913955Sgiacomo.gabrielli@arm.com        Trace::InstRecord *) const;
13013955Sgiacomo.gabrielli@arm.com
13113955Sgiacomo.gabrielli@arm.com    template
13213955Sgiacomo.gabrielli@arm.com    Fault %(class_name)s%(tpl_args)s::completeAcc(PacketPtr,
13313955Sgiacomo.gabrielli@arm.com        ExecContext *, Trace::InstRecord *) const;
13413955Sgiacomo.gabrielli@arm.com}};
13513955Sgiacomo.gabrielli@arm.com
13613955Sgiacomo.gabrielli@arm.comdef template SveContigLoadExecute {{
13713955Sgiacomo.gabrielli@arm.com    %(tpl_header)s
13813955Sgiacomo.gabrielli@arm.com    Fault %(class_name)s%(tpl_args)s::execute(ExecContext *xc,
13913955Sgiacomo.gabrielli@arm.com        Trace::InstRecord *traceData) const
14013955Sgiacomo.gabrielli@arm.com    {
14113955Sgiacomo.gabrielli@arm.com        Addr EA;
14213955Sgiacomo.gabrielli@arm.com        Fault fault = NoFault;
14313955Sgiacomo.gabrielli@arm.com        bool aarch64 M5_VAR_USED = true;
14413955Sgiacomo.gabrielli@arm.com        unsigned eCount = ArmStaticInst::getCurSveVecLen<RegElemType>(
14513955Sgiacomo.gabrielli@arm.com            xc->tcBase());
14613955Sgiacomo.gabrielli@arm.com
14713955Sgiacomo.gabrielli@arm.com        %(op_decl)s;
14813955Sgiacomo.gabrielli@arm.com        %(op_rd)s;
14913955Sgiacomo.gabrielli@arm.com        %(ea_code)s;
15013955Sgiacomo.gabrielli@arm.com
15113955Sgiacomo.gabrielli@arm.com        TheISA::VecRegContainer memData;
15213955Sgiacomo.gabrielli@arm.com        auto memDataView = memData.as<MemElemType>();
15313955Sgiacomo.gabrielli@arm.com
15413955Sgiacomo.gabrielli@arm.com        if (fault == NoFault) {
15513955Sgiacomo.gabrielli@arm.com            fault = xc->readMem(EA, memData.raw_ptr<uint8_t>(), memAccessSize,
15613955Sgiacomo.gabrielli@arm.com                this->memAccessFlags);
15713955Sgiacomo.gabrielli@arm.com            %(memacc_code)s;
15813955Sgiacomo.gabrielli@arm.com        }
15913955Sgiacomo.gabrielli@arm.com
16013955Sgiacomo.gabrielli@arm.com        if (fault == NoFault) {
16113955Sgiacomo.gabrielli@arm.com            %(op_wb)s;
16213955Sgiacomo.gabrielli@arm.com        }
16313955Sgiacomo.gabrielli@arm.com
16413955Sgiacomo.gabrielli@arm.com        return fault;
16513955Sgiacomo.gabrielli@arm.com    }
16613955Sgiacomo.gabrielli@arm.com}};
16713955Sgiacomo.gabrielli@arm.com
16813955Sgiacomo.gabrielli@arm.comdef template SveContigLoadInitiateAcc {{
16913955Sgiacomo.gabrielli@arm.com    %(tpl_header)s
17013955Sgiacomo.gabrielli@arm.com    Fault %(class_name)s%(tpl_args)s::initiateAcc(ExecContext *xc,
17113955Sgiacomo.gabrielli@arm.com        Trace::InstRecord *traceData) const
17213955Sgiacomo.gabrielli@arm.com    {
17313955Sgiacomo.gabrielli@arm.com        Addr EA;
17413955Sgiacomo.gabrielli@arm.com        Fault fault = NoFault;
17513955Sgiacomo.gabrielli@arm.com        bool aarch64 M5_VAR_USED = true;
17613955Sgiacomo.gabrielli@arm.com        unsigned eCount = ArmStaticInst::getCurSveVecLen<RegElemType>(
17713955Sgiacomo.gabrielli@arm.com            xc->tcBase());
17813955Sgiacomo.gabrielli@arm.com
17913955Sgiacomo.gabrielli@arm.com        %(op_src_decl)s;
18013955Sgiacomo.gabrielli@arm.com        %(op_rd)s;
18113955Sgiacomo.gabrielli@arm.com
18213955Sgiacomo.gabrielli@arm.com        %(ea_code)s;
18313955Sgiacomo.gabrielli@arm.com
18413955Sgiacomo.gabrielli@arm.com        if (fault == NoFault) {
18513955Sgiacomo.gabrielli@arm.com            fault = xc->initiateMemRead(EA, memAccessSize,
18613955Sgiacomo.gabrielli@arm.com                this->memAccessFlags);
18713955Sgiacomo.gabrielli@arm.com        }
18813955Sgiacomo.gabrielli@arm.com
18913955Sgiacomo.gabrielli@arm.com        return fault;
19013955Sgiacomo.gabrielli@arm.com    }
19113955Sgiacomo.gabrielli@arm.com}};
19213955Sgiacomo.gabrielli@arm.com
19313955Sgiacomo.gabrielli@arm.comdef template SveContigLoadCompleteAcc {{
19413955Sgiacomo.gabrielli@arm.com    %(tpl_header)s
19513955Sgiacomo.gabrielli@arm.com    Fault %(class_name)s%(tpl_args)s::completeAcc(PacketPtr pkt,
19613955Sgiacomo.gabrielli@arm.com        ExecContext *xc, Trace::InstRecord *traceData) const
19713955Sgiacomo.gabrielli@arm.com    {
19813955Sgiacomo.gabrielli@arm.com        Fault fault = NoFault;
19913955Sgiacomo.gabrielli@arm.com        bool aarch64 M5_VAR_USED = true;
20013955Sgiacomo.gabrielli@arm.com        unsigned eCount = ArmStaticInst::getCurSveVecLen<RegElemType>(
20113955Sgiacomo.gabrielli@arm.com            xc->tcBase());
20213955Sgiacomo.gabrielli@arm.com
20313955Sgiacomo.gabrielli@arm.com        %(op_decl)s;
20413955Sgiacomo.gabrielli@arm.com        %(op_rd)s;
20513955Sgiacomo.gabrielli@arm.com
20613955Sgiacomo.gabrielli@arm.com        TheISA::VecRegContainer memData;
20713955Sgiacomo.gabrielli@arm.com        auto memDataView = memData.as<MemElemType>();
20813955Sgiacomo.gabrielli@arm.com
20913955Sgiacomo.gabrielli@arm.com        memcpy(memData.raw_ptr<uint8_t>(), pkt->getPtr<uint8_t>(),
21013955Sgiacomo.gabrielli@arm.com            pkt->getSize());
21113955Sgiacomo.gabrielli@arm.com
21213955Sgiacomo.gabrielli@arm.com        if (fault == NoFault) {
21313955Sgiacomo.gabrielli@arm.com            %(memacc_code)s;
21413955Sgiacomo.gabrielli@arm.com        }
21513955Sgiacomo.gabrielli@arm.com
21613955Sgiacomo.gabrielli@arm.com        if (fault == NoFault) {
21713955Sgiacomo.gabrielli@arm.com            %(op_wb)s;
21813955Sgiacomo.gabrielli@arm.com        }
21913955Sgiacomo.gabrielli@arm.com
22013955Sgiacomo.gabrielli@arm.com        return fault;
22113955Sgiacomo.gabrielli@arm.com    }
22213955Sgiacomo.gabrielli@arm.com}};
22313955Sgiacomo.gabrielli@arm.com
22413955Sgiacomo.gabrielli@arm.comdef template SveContigStoreExecute {{
22513955Sgiacomo.gabrielli@arm.com    %(tpl_header)s
22613955Sgiacomo.gabrielli@arm.com    Fault %(class_name)s%(tpl_args)s::execute(ExecContext *xc,
22713955Sgiacomo.gabrielli@arm.com        Trace::InstRecord *traceData) const
22813955Sgiacomo.gabrielli@arm.com    {
22913955Sgiacomo.gabrielli@arm.com        Addr EA;
23013955Sgiacomo.gabrielli@arm.com        Fault fault = NoFault;
23113955Sgiacomo.gabrielli@arm.com        bool aarch64 M5_VAR_USED = true;
23213955Sgiacomo.gabrielli@arm.com        unsigned eCount = ArmStaticInst::getCurSveVecLen<RegElemType>(
23313955Sgiacomo.gabrielli@arm.com            xc->tcBase());
23413955Sgiacomo.gabrielli@arm.com
23513955Sgiacomo.gabrielli@arm.com        %(op_decl)s;
23613955Sgiacomo.gabrielli@arm.com        %(op_rd)s;
23713955Sgiacomo.gabrielli@arm.com        %(ea_code)s;
23813955Sgiacomo.gabrielli@arm.com
23913955Sgiacomo.gabrielli@arm.com        TheISA::VecRegContainer memData;
24013955Sgiacomo.gabrielli@arm.com        auto memDataView = memData.as<MemElemType>();
24113955Sgiacomo.gabrielli@arm.com
24213955Sgiacomo.gabrielli@arm.com        %(wren_code)s;
24313955Sgiacomo.gabrielli@arm.com
24413955Sgiacomo.gabrielli@arm.com        if (fault == NoFault) {
24513955Sgiacomo.gabrielli@arm.com            %(memacc_code)s;
24613955Sgiacomo.gabrielli@arm.com        }
24713955Sgiacomo.gabrielli@arm.com
24813955Sgiacomo.gabrielli@arm.com        if (fault == NoFault) {
24913955Sgiacomo.gabrielli@arm.com            fault = xc->writeMem(memData.raw_ptr<uint8_t>(), memAccessSize, EA,
25013955Sgiacomo.gabrielli@arm.com                this->memAccessFlags, NULL, wrEn);
25113955Sgiacomo.gabrielli@arm.com        }
25213955Sgiacomo.gabrielli@arm.com
25313955Sgiacomo.gabrielli@arm.com        if (fault == NoFault) {
25413955Sgiacomo.gabrielli@arm.com            %(op_wb)s;
25513955Sgiacomo.gabrielli@arm.com        }
25613955Sgiacomo.gabrielli@arm.com
25713955Sgiacomo.gabrielli@arm.com        return fault;
25813955Sgiacomo.gabrielli@arm.com    }
25913955Sgiacomo.gabrielli@arm.com}};
26013955Sgiacomo.gabrielli@arm.com
26113955Sgiacomo.gabrielli@arm.comdef template SveContigStoreInitiateAcc {{
26213955Sgiacomo.gabrielli@arm.com    %(tpl_header)s
26313955Sgiacomo.gabrielli@arm.com    Fault %(class_name)s%(tpl_args)s::initiateAcc(ExecContext *xc,
26413955Sgiacomo.gabrielli@arm.com        Trace::InstRecord *traceData) const
26513955Sgiacomo.gabrielli@arm.com    {
26613955Sgiacomo.gabrielli@arm.com        Addr EA;
26713955Sgiacomo.gabrielli@arm.com        Fault fault = NoFault;
26813955Sgiacomo.gabrielli@arm.com        bool aarch64 M5_VAR_USED = true;
26913955Sgiacomo.gabrielli@arm.com        unsigned eCount = ArmStaticInst::getCurSveVecLen<RegElemType>(
27013955Sgiacomo.gabrielli@arm.com            xc->tcBase());
27113955Sgiacomo.gabrielli@arm.com
27213955Sgiacomo.gabrielli@arm.com        %(op_decl)s;
27313955Sgiacomo.gabrielli@arm.com        %(op_rd)s;
27413955Sgiacomo.gabrielli@arm.com        %(ea_code)s;
27513955Sgiacomo.gabrielli@arm.com
27613955Sgiacomo.gabrielli@arm.com        TheISA::VecRegContainer memData;
27713955Sgiacomo.gabrielli@arm.com        auto memDataView = memData.as<MemElemType>();
27813955Sgiacomo.gabrielli@arm.com
27913955Sgiacomo.gabrielli@arm.com        %(wren_code)s;
28013955Sgiacomo.gabrielli@arm.com
28113955Sgiacomo.gabrielli@arm.com        if (fault == NoFault) {
28213955Sgiacomo.gabrielli@arm.com            %(memacc_code)s;
28313955Sgiacomo.gabrielli@arm.com        }
28413955Sgiacomo.gabrielli@arm.com
28513955Sgiacomo.gabrielli@arm.com        if (fault == NoFault) {
28613955Sgiacomo.gabrielli@arm.com            fault = xc->writeMem(memData.raw_ptr<uint8_t>(), memAccessSize, EA,
28713955Sgiacomo.gabrielli@arm.com                this->memAccessFlags, NULL, wrEn);
28813955Sgiacomo.gabrielli@arm.com        }
28913955Sgiacomo.gabrielli@arm.com
29013955Sgiacomo.gabrielli@arm.com        return fault;
29113955Sgiacomo.gabrielli@arm.com    }
29213955Sgiacomo.gabrielli@arm.com}};
29313955Sgiacomo.gabrielli@arm.com
29413955Sgiacomo.gabrielli@arm.comdef template SveContigStoreCompleteAcc {{
29513955Sgiacomo.gabrielli@arm.com    %(tpl_header)s
29613955Sgiacomo.gabrielli@arm.com    Fault %(class_name)s%(tpl_args)s::completeAcc(PacketPtr pkt,
29713955Sgiacomo.gabrielli@arm.com        ExecContext *xc, Trace::InstRecord *traceData) const
29813955Sgiacomo.gabrielli@arm.com    {
29913955Sgiacomo.gabrielli@arm.com        return NoFault;
30013955Sgiacomo.gabrielli@arm.com    }
30113955Sgiacomo.gabrielli@arm.com}};
30213955Sgiacomo.gabrielli@arm.com
30313955Sgiacomo.gabrielli@arm.comdef template SveLoadAndReplExecute {{
30413955Sgiacomo.gabrielli@arm.com    %(tpl_header)s
30513955Sgiacomo.gabrielli@arm.com    Fault %(class_name)s%(tpl_args)s::execute(ExecContext *xc,
30613955Sgiacomo.gabrielli@arm.com        Trace::InstRecord *traceData) const
30713955Sgiacomo.gabrielli@arm.com    {
30813955Sgiacomo.gabrielli@arm.com        Addr EA;
30913955Sgiacomo.gabrielli@arm.com        Fault fault = NoFault;
31013955Sgiacomo.gabrielli@arm.com        bool aarch64 M5_VAR_USED = true;
31113955Sgiacomo.gabrielli@arm.com        unsigned eCount = ArmStaticInst::getCurSveVecLen<RegElemType>(
31213955Sgiacomo.gabrielli@arm.com            xc->tcBase());
31313955Sgiacomo.gabrielli@arm.com
31413955Sgiacomo.gabrielli@arm.com        %(op_decl)s;
31513955Sgiacomo.gabrielli@arm.com        %(op_rd)s;
31613955Sgiacomo.gabrielli@arm.com        %(ea_code)s;
31713955Sgiacomo.gabrielli@arm.com
31813955Sgiacomo.gabrielli@arm.com        MemElemType memData;
31913955Sgiacomo.gabrielli@arm.com
32013955Sgiacomo.gabrielli@arm.com        if (fault == NoFault) {
32113955Sgiacomo.gabrielli@arm.com            fault = readMemAtomic(xc, traceData, EA, memData,
32213955Sgiacomo.gabrielli@arm.com                this->memAccessFlags);
32313955Sgiacomo.gabrielli@arm.com            %(memacc_code)s;
32413955Sgiacomo.gabrielli@arm.com        }
32513955Sgiacomo.gabrielli@arm.com
32613955Sgiacomo.gabrielli@arm.com        if (fault == NoFault) {
32713955Sgiacomo.gabrielli@arm.com            %(op_wb)s;
32813955Sgiacomo.gabrielli@arm.com        }
32913955Sgiacomo.gabrielli@arm.com
33013955Sgiacomo.gabrielli@arm.com        return fault;
33113955Sgiacomo.gabrielli@arm.com    }
33213955Sgiacomo.gabrielli@arm.com}};
33313955Sgiacomo.gabrielli@arm.com
33413955Sgiacomo.gabrielli@arm.comdef template SveLoadAndReplInitiateAcc {{
33513955Sgiacomo.gabrielli@arm.com    %(tpl_header)s
33613955Sgiacomo.gabrielli@arm.com    Fault %(class_name)s%(tpl_args)s::initiateAcc(ExecContext *xc,
33713955Sgiacomo.gabrielli@arm.com        Trace::InstRecord *traceData) const
33813955Sgiacomo.gabrielli@arm.com    {
33913955Sgiacomo.gabrielli@arm.com        Addr EA;
34013955Sgiacomo.gabrielli@arm.com        Fault fault = NoFault;
34113955Sgiacomo.gabrielli@arm.com        bool aarch64 M5_VAR_USED = true;
34213955Sgiacomo.gabrielli@arm.com
34313955Sgiacomo.gabrielli@arm.com        %(op_src_decl)s;
34413955Sgiacomo.gabrielli@arm.com        %(op_rd)s;
34513955Sgiacomo.gabrielli@arm.com
34613955Sgiacomo.gabrielli@arm.com        %(ea_code)s;
34713955Sgiacomo.gabrielli@arm.com
34813955Sgiacomo.gabrielli@arm.com        MemElemType memData;
34913955Sgiacomo.gabrielli@arm.com
35013955Sgiacomo.gabrielli@arm.com        if (fault == NoFault) {
35113955Sgiacomo.gabrielli@arm.com            fault = initiateMemRead(xc, traceData, EA, memData,
35213955Sgiacomo.gabrielli@arm.com                this->memAccessFlags);
35313955Sgiacomo.gabrielli@arm.com        }
35413955Sgiacomo.gabrielli@arm.com
35513955Sgiacomo.gabrielli@arm.com        return fault;
35613955Sgiacomo.gabrielli@arm.com    }
35713955Sgiacomo.gabrielli@arm.com}};
35813955Sgiacomo.gabrielli@arm.com
35913955Sgiacomo.gabrielli@arm.comdef template SveLoadAndReplCompleteAcc {{
36013955Sgiacomo.gabrielli@arm.com    %(tpl_header)s
36113955Sgiacomo.gabrielli@arm.com    Fault %(class_name)s%(tpl_args)s::completeAcc(PacketPtr pkt,
36213955Sgiacomo.gabrielli@arm.com        ExecContext *xc, Trace::InstRecord *traceData) const
36313955Sgiacomo.gabrielli@arm.com    {
36413955Sgiacomo.gabrielli@arm.com        Fault fault = NoFault;
36513955Sgiacomo.gabrielli@arm.com        bool aarch64 M5_VAR_USED = true;
36613955Sgiacomo.gabrielli@arm.com        unsigned eCount = ArmStaticInst::getCurSveVecLen<RegElemType>(
36713955Sgiacomo.gabrielli@arm.com            xc->tcBase());
36813955Sgiacomo.gabrielli@arm.com
36913955Sgiacomo.gabrielli@arm.com        %(op_decl)s;
37013955Sgiacomo.gabrielli@arm.com        %(op_rd)s;
37113955Sgiacomo.gabrielli@arm.com
37213955Sgiacomo.gabrielli@arm.com        MemElemType memData;
37313955Sgiacomo.gabrielli@arm.com        getMem(pkt, memData, traceData);
37413955Sgiacomo.gabrielli@arm.com
37513955Sgiacomo.gabrielli@arm.com        if (fault == NoFault) {
37613955Sgiacomo.gabrielli@arm.com            %(memacc_code)s;
37713955Sgiacomo.gabrielli@arm.com        }
37813955Sgiacomo.gabrielli@arm.com
37913955Sgiacomo.gabrielli@arm.com        if (fault == NoFault) {
38013955Sgiacomo.gabrielli@arm.com            %(op_wb)s;
38113955Sgiacomo.gabrielli@arm.com        }
38213955Sgiacomo.gabrielli@arm.com
38313955Sgiacomo.gabrielli@arm.com        return fault;
38413955Sgiacomo.gabrielli@arm.com    }
38513955Sgiacomo.gabrielli@arm.com}};
38613955Sgiacomo.gabrielli@arm.com
38714028Sgiacomo.gabrielli@arm.comdef template SveIndexedMemVIMicroopDeclare {{
38814028Sgiacomo.gabrielli@arm.com    %(tpl_header)s
38914028Sgiacomo.gabrielli@arm.com    class %(class_name)s : public %(base_class)s
39014028Sgiacomo.gabrielli@arm.com    {
39114028Sgiacomo.gabrielli@arm.com      protected:
39214028Sgiacomo.gabrielli@arm.com        typedef RegElemType TPElem;
39314028Sgiacomo.gabrielli@arm.com
39414028Sgiacomo.gabrielli@arm.com        IntRegIndex dest;
39514028Sgiacomo.gabrielli@arm.com        IntRegIndex gp;
39614028Sgiacomo.gabrielli@arm.com        IntRegIndex base;
39714028Sgiacomo.gabrielli@arm.com        uint64_t imm;
39814028Sgiacomo.gabrielli@arm.com
39914028Sgiacomo.gabrielli@arm.com        int elemIndex;
40014028Sgiacomo.gabrielli@arm.com        int numElems;
40114028Sgiacomo.gabrielli@arm.com
40214028Sgiacomo.gabrielli@arm.com        unsigned memAccessFlags;
40314028Sgiacomo.gabrielli@arm.com
40414028Sgiacomo.gabrielli@arm.com      public:
40514028Sgiacomo.gabrielli@arm.com        %(class_name)s(const char* mnem, ExtMachInst machInst,
40614028Sgiacomo.gabrielli@arm.com            OpClass __opClass, IntRegIndex _dest, IntRegIndex _gp,
40714028Sgiacomo.gabrielli@arm.com            IntRegIndex _base, uint64_t _imm, int _elemIndex, int _numElems)
40814028Sgiacomo.gabrielli@arm.com            : %(base_class)s(mnem, machInst, %(op_class)s),
40914028Sgiacomo.gabrielli@arm.com              dest(_dest), gp(_gp), base(_base), imm(_imm),
41014028Sgiacomo.gabrielli@arm.com              elemIndex(_elemIndex), numElems(_numElems),
41114028Sgiacomo.gabrielli@arm.com              memAccessFlags(ArmISA::TLB::AllowUnaligned |
41214028Sgiacomo.gabrielli@arm.com                             ArmISA::TLB::MustBeOne)
41314028Sgiacomo.gabrielli@arm.com        {
41414028Sgiacomo.gabrielli@arm.com            %(constructor)s;
41514028Sgiacomo.gabrielli@arm.com            if (_opClass == MemReadOp && elemIndex == 0) {
41614028Sgiacomo.gabrielli@arm.com                // The first micro-op is responsible for pinning the
41714028Sgiacomo.gabrielli@arm.com                // destination register
41814028Sgiacomo.gabrielli@arm.com                _destRegIdx[0].setNumPinnedWrites(numElems - 1);
41914028Sgiacomo.gabrielli@arm.com            }
42014028Sgiacomo.gabrielli@arm.com        }
42114028Sgiacomo.gabrielli@arm.com
42214028Sgiacomo.gabrielli@arm.com        Fault execute(ExecContext *, Trace::InstRecord *) const;
42314028Sgiacomo.gabrielli@arm.com        Fault initiateAcc(ExecContext *, Trace::InstRecord *) const;
42414028Sgiacomo.gabrielli@arm.com        Fault completeAcc(PacketPtr, ExecContext *, Trace::InstRecord *) const;
42514028Sgiacomo.gabrielli@arm.com
42614028Sgiacomo.gabrielli@arm.com        virtual void
42714028Sgiacomo.gabrielli@arm.com        annotateFault(ArmFault *fault)
42814028Sgiacomo.gabrielli@arm.com        {
42914028Sgiacomo.gabrielli@arm.com            %(fa_code)s
43014028Sgiacomo.gabrielli@arm.com        }
43114028Sgiacomo.gabrielli@arm.com
43214028Sgiacomo.gabrielli@arm.com        std::string
43314028Sgiacomo.gabrielli@arm.com        generateDisassembly(Addr pc, const SymbolTable *symtab) const
43414028Sgiacomo.gabrielli@arm.com        {
43514028Sgiacomo.gabrielli@arm.com            // TODO: add suffix to transfer register
43614028Sgiacomo.gabrielli@arm.com            std::stringstream ss;
43714028Sgiacomo.gabrielli@arm.com            printMnemonic(ss, "", false);
43814028Sgiacomo.gabrielli@arm.com            ccprintf(ss, "{");
43914028Sgiacomo.gabrielli@arm.com            printVecReg(ss, dest, true);
44014028Sgiacomo.gabrielli@arm.com            ccprintf(ss, "}, ");
44114028Sgiacomo.gabrielli@arm.com            printVecPredReg(ss, gp);
44214028Sgiacomo.gabrielli@arm.com            if (_opClass == MemReadOp) {
44314028Sgiacomo.gabrielli@arm.com                ccprintf(ss, "/z");
44414028Sgiacomo.gabrielli@arm.com            }
44514028Sgiacomo.gabrielli@arm.com            ccprintf(ss, ", [");
44614028Sgiacomo.gabrielli@arm.com            printVecReg(ss, base, true);
44714028Sgiacomo.gabrielli@arm.com            if (imm != 0) {
44814028Sgiacomo.gabrielli@arm.com                ccprintf(ss, ", #%d", imm * sizeof(MemElemType));
44914028Sgiacomo.gabrielli@arm.com            }
45014028Sgiacomo.gabrielli@arm.com            ccprintf(ss, "] (uop elem %d tfer)", elemIndex);
45114028Sgiacomo.gabrielli@arm.com            return ss.str();
45214028Sgiacomo.gabrielli@arm.com        }
45314028Sgiacomo.gabrielli@arm.com    };
45414028Sgiacomo.gabrielli@arm.com}};
45514028Sgiacomo.gabrielli@arm.com
45614028Sgiacomo.gabrielli@arm.comdef template SveIndexedMemSVMicroopDeclare {{
45714028Sgiacomo.gabrielli@arm.com    %(tpl_header)s
45814028Sgiacomo.gabrielli@arm.com    class %(class_name)s : public %(base_class)s
45914028Sgiacomo.gabrielli@arm.com    {
46014028Sgiacomo.gabrielli@arm.com      protected:
46114028Sgiacomo.gabrielli@arm.com        typedef RegElemType TPElem;
46214028Sgiacomo.gabrielli@arm.com
46314028Sgiacomo.gabrielli@arm.com        IntRegIndex dest;
46414028Sgiacomo.gabrielli@arm.com        IntRegIndex gp;
46514028Sgiacomo.gabrielli@arm.com        IntRegIndex base;
46614028Sgiacomo.gabrielli@arm.com        IntRegIndex offset;
46714028Sgiacomo.gabrielli@arm.com
46814028Sgiacomo.gabrielli@arm.com        bool offsetIs32;
46914028Sgiacomo.gabrielli@arm.com        bool offsetIsSigned;
47014028Sgiacomo.gabrielli@arm.com        bool offsetIsScaled;
47114028Sgiacomo.gabrielli@arm.com
47214028Sgiacomo.gabrielli@arm.com        int elemIndex;
47314028Sgiacomo.gabrielli@arm.com        int numElems;
47414028Sgiacomo.gabrielli@arm.com
47514028Sgiacomo.gabrielli@arm.com        unsigned memAccessFlags;
47614028Sgiacomo.gabrielli@arm.com
47714028Sgiacomo.gabrielli@arm.com      public:
47814028Sgiacomo.gabrielli@arm.com        %(class_name)s(const char* mnem, ExtMachInst machInst,
47914028Sgiacomo.gabrielli@arm.com            OpClass __opClass, IntRegIndex _dest, IntRegIndex _gp,
48014028Sgiacomo.gabrielli@arm.com            IntRegIndex _base, IntRegIndex _offset, bool _offsetIs32,
48114028Sgiacomo.gabrielli@arm.com            bool _offsetIsSigned, bool _offsetIsScaled, int _elemIndex,
48214028Sgiacomo.gabrielli@arm.com            int _numElems)
48314028Sgiacomo.gabrielli@arm.com            : %(base_class)s(mnem, machInst, %(op_class)s),
48414028Sgiacomo.gabrielli@arm.com              dest(_dest), gp(_gp), base(_base), offset(_offset),
48514028Sgiacomo.gabrielli@arm.com              offsetIs32(_offsetIs32), offsetIsSigned(_offsetIsSigned),
48614028Sgiacomo.gabrielli@arm.com              offsetIsScaled(_offsetIsScaled), elemIndex(_elemIndex),
48714028Sgiacomo.gabrielli@arm.com              numElems(_numElems),
48814028Sgiacomo.gabrielli@arm.com              memAccessFlags(ArmISA::TLB::AllowUnaligned |
48914028Sgiacomo.gabrielli@arm.com                             ArmISA::TLB::MustBeOne)
49014028Sgiacomo.gabrielli@arm.com        {
49114028Sgiacomo.gabrielli@arm.com            %(constructor)s;
49214028Sgiacomo.gabrielli@arm.com            if (_opClass == MemReadOp && elemIndex == 0) {
49314028Sgiacomo.gabrielli@arm.com                // The first micro-op is responsible for pinning the
49414028Sgiacomo.gabrielli@arm.com                // destination register
49514028Sgiacomo.gabrielli@arm.com                _destRegIdx[0].setNumPinnedWrites(numElems - 1);
49614028Sgiacomo.gabrielli@arm.com            }
49714028Sgiacomo.gabrielli@arm.com        }
49814028Sgiacomo.gabrielli@arm.com
49914028Sgiacomo.gabrielli@arm.com        Fault execute(ExecContext *, Trace::InstRecord *) const;
50014028Sgiacomo.gabrielli@arm.com        Fault initiateAcc(ExecContext *, Trace::InstRecord *) const;
50114028Sgiacomo.gabrielli@arm.com        Fault completeAcc(PacketPtr, ExecContext *, Trace::InstRecord *) const;
50214028Sgiacomo.gabrielli@arm.com
50314028Sgiacomo.gabrielli@arm.com        virtual void
50414028Sgiacomo.gabrielli@arm.com        annotateFault(ArmFault *fault)
50514028Sgiacomo.gabrielli@arm.com        {
50614028Sgiacomo.gabrielli@arm.com            %(fa_code)s
50714028Sgiacomo.gabrielli@arm.com        }
50814028Sgiacomo.gabrielli@arm.com
50914028Sgiacomo.gabrielli@arm.com        std::string
51014028Sgiacomo.gabrielli@arm.com        generateDisassembly(Addr pc, const SymbolTable *symtab) const
51114028Sgiacomo.gabrielli@arm.com        {
51214028Sgiacomo.gabrielli@arm.com            // TODO: add suffix to transfer and base registers
51314028Sgiacomo.gabrielli@arm.com            std::stringstream ss;
51414028Sgiacomo.gabrielli@arm.com            printMnemonic(ss, "", false);
51514028Sgiacomo.gabrielli@arm.com            ccprintf(ss, "{");
51614028Sgiacomo.gabrielli@arm.com            printVecReg(ss, dest, true);
51714028Sgiacomo.gabrielli@arm.com            ccprintf(ss, "}, ");
51814028Sgiacomo.gabrielli@arm.com            printVecPredReg(ss, gp);
51914028Sgiacomo.gabrielli@arm.com            if (_opClass == MemReadOp) {
52014028Sgiacomo.gabrielli@arm.com                ccprintf(ss, "/z");
52114028Sgiacomo.gabrielli@arm.com            }
52214028Sgiacomo.gabrielli@arm.com            ccprintf(ss, ", [");
52314028Sgiacomo.gabrielli@arm.com            printIntReg(ss, base);
52414028Sgiacomo.gabrielli@arm.com            ccprintf(ss, ", ");
52514028Sgiacomo.gabrielli@arm.com            printVecReg(ss, offset, true);
52614028Sgiacomo.gabrielli@arm.com            ccprintf(ss, "] (uop elem %d tfer)", elemIndex);
52714028Sgiacomo.gabrielli@arm.com            return ss.str();
52814028Sgiacomo.gabrielli@arm.com        }
52914028Sgiacomo.gabrielli@arm.com    };
53014028Sgiacomo.gabrielli@arm.com}};
53114028Sgiacomo.gabrielli@arm.com
53214028Sgiacomo.gabrielli@arm.comdef template SveGatherLoadMicroopExecute {{
53314028Sgiacomo.gabrielli@arm.com    %(tpl_header)s
53414028Sgiacomo.gabrielli@arm.com    Fault %(class_name)s%(tpl_args)s::execute(ExecContext *xc,
53514028Sgiacomo.gabrielli@arm.com        Trace::InstRecord *traceData) const
53614028Sgiacomo.gabrielli@arm.com    {
53714028Sgiacomo.gabrielli@arm.com        Addr EA;
53814028Sgiacomo.gabrielli@arm.com        Fault fault = NoFault;
53914028Sgiacomo.gabrielli@arm.com        bool aarch64 M5_VAR_USED = true;
54014028Sgiacomo.gabrielli@arm.com
54114028Sgiacomo.gabrielli@arm.com        %(op_decl)s;
54214028Sgiacomo.gabrielli@arm.com        %(op_rd)s;
54314028Sgiacomo.gabrielli@arm.com        %(ea_code)s;
54414028Sgiacomo.gabrielli@arm.com
54514028Sgiacomo.gabrielli@arm.com        MemElemType memData;
54614028Sgiacomo.gabrielli@arm.com
54714028Sgiacomo.gabrielli@arm.com        if (%(pred_check_code)s) {
54814028Sgiacomo.gabrielli@arm.com            fault = readMemAtomic(xc, traceData, EA, memData,
54914028Sgiacomo.gabrielli@arm.com                this->memAccessFlags);
55014028Sgiacomo.gabrielli@arm.com        }
55114028Sgiacomo.gabrielli@arm.com
55214028Sgiacomo.gabrielli@arm.com        if (fault == NoFault) {
55314028Sgiacomo.gabrielli@arm.com            %(memacc_code)s;
55414028Sgiacomo.gabrielli@arm.com            %(op_wb)s;
55514028Sgiacomo.gabrielli@arm.com        }
55614028Sgiacomo.gabrielli@arm.com
55714028Sgiacomo.gabrielli@arm.com        return fault;
55814028Sgiacomo.gabrielli@arm.com    }
55914028Sgiacomo.gabrielli@arm.com}};
56014028Sgiacomo.gabrielli@arm.com
56114028Sgiacomo.gabrielli@arm.comdef template SveGatherLoadMicroopInitiateAcc {{
56214028Sgiacomo.gabrielli@arm.com    %(tpl_header)s
56314028Sgiacomo.gabrielli@arm.com    Fault %(class_name)s%(tpl_args)s::initiateAcc(ExecContext *xc,
56414028Sgiacomo.gabrielli@arm.com        Trace::InstRecord *traceData) const
56514028Sgiacomo.gabrielli@arm.com    {
56614028Sgiacomo.gabrielli@arm.com        Addr EA;
56714028Sgiacomo.gabrielli@arm.com        Fault fault = NoFault;
56814028Sgiacomo.gabrielli@arm.com        bool aarch64 M5_VAR_USED = true;
56914028Sgiacomo.gabrielli@arm.com
57014028Sgiacomo.gabrielli@arm.com        %(op_src_decl)s;
57114028Sgiacomo.gabrielli@arm.com        %(op_rd)s;
57214028Sgiacomo.gabrielli@arm.com        %(ea_code)s;
57314028Sgiacomo.gabrielli@arm.com
57414028Sgiacomo.gabrielli@arm.com        MemElemType memData;
57514028Sgiacomo.gabrielli@arm.com
57614028Sgiacomo.gabrielli@arm.com        if (%(pred_check_code)s) {
57714028Sgiacomo.gabrielli@arm.com            fault = initiateMemRead(xc, traceData, EA, memData,
57814028Sgiacomo.gabrielli@arm.com                this->memAccessFlags);
57914028Sgiacomo.gabrielli@arm.com        } else {
58014028Sgiacomo.gabrielli@arm.com            xc->setMemAccPredicate(false);
58114028Sgiacomo.gabrielli@arm.com        }
58214028Sgiacomo.gabrielli@arm.com
58314028Sgiacomo.gabrielli@arm.com        return fault;
58414028Sgiacomo.gabrielli@arm.com    }
58514028Sgiacomo.gabrielli@arm.com}};
58614028Sgiacomo.gabrielli@arm.com
58714028Sgiacomo.gabrielli@arm.comdef template SveGatherLoadMicroopCompleteAcc {{
58814028Sgiacomo.gabrielli@arm.com    %(tpl_header)s
58914028Sgiacomo.gabrielli@arm.com    Fault %(class_name)s%(tpl_args)s::completeAcc(PacketPtr pkt,
59014028Sgiacomo.gabrielli@arm.com        ExecContext *xc, Trace::InstRecord *traceData) const
59114028Sgiacomo.gabrielli@arm.com    {
59214028Sgiacomo.gabrielli@arm.com        Fault fault = NoFault;
59314028Sgiacomo.gabrielli@arm.com        bool aarch64 M5_VAR_USED = true;
59414028Sgiacomo.gabrielli@arm.com
59514028Sgiacomo.gabrielli@arm.com        %(op_decl)s;
59614028Sgiacomo.gabrielli@arm.com        %(op_rd)s;
59714028Sgiacomo.gabrielli@arm.com
59814028Sgiacomo.gabrielli@arm.com        MemElemType memData = 0;
59914028Sgiacomo.gabrielli@arm.com        if (%(pred_check_code)s) {
60014028Sgiacomo.gabrielli@arm.com            getMem(pkt, memData, traceData);
60114028Sgiacomo.gabrielli@arm.com        }
60214028Sgiacomo.gabrielli@arm.com
60314028Sgiacomo.gabrielli@arm.com        if (fault == NoFault) {
60414028Sgiacomo.gabrielli@arm.com            %(memacc_code)s;
60514028Sgiacomo.gabrielli@arm.com        }
60614028Sgiacomo.gabrielli@arm.com
60714028Sgiacomo.gabrielli@arm.com        if (fault == NoFault) {
60814028Sgiacomo.gabrielli@arm.com            %(op_wb)s;
60914028Sgiacomo.gabrielli@arm.com        }
61014028Sgiacomo.gabrielli@arm.com
61114028Sgiacomo.gabrielli@arm.com        return fault;
61214028Sgiacomo.gabrielli@arm.com    }
61314028Sgiacomo.gabrielli@arm.com}};
61414028Sgiacomo.gabrielli@arm.com
61514028Sgiacomo.gabrielli@arm.comdef template SveScatterStoreMicroopExecute {{
61614028Sgiacomo.gabrielli@arm.com    %(tpl_header)s
61714028Sgiacomo.gabrielli@arm.com    Fault %(class_name)s%(tpl_args)s::execute(ExecContext *xc,
61814028Sgiacomo.gabrielli@arm.com        Trace::InstRecord *traceData) const
61914028Sgiacomo.gabrielli@arm.com    {
62014028Sgiacomo.gabrielli@arm.com        Addr EA;
62114028Sgiacomo.gabrielli@arm.com        Fault fault = NoFault;
62214028Sgiacomo.gabrielli@arm.com        bool aarch64 M5_VAR_USED = true;
62314028Sgiacomo.gabrielli@arm.com
62414028Sgiacomo.gabrielli@arm.com        %(op_decl)s;
62514028Sgiacomo.gabrielli@arm.com        %(op_rd)s;
62614028Sgiacomo.gabrielli@arm.com        %(ea_code)s;
62714028Sgiacomo.gabrielli@arm.com
62814028Sgiacomo.gabrielli@arm.com        MemElemType memData;
62914028Sgiacomo.gabrielli@arm.com        %(memacc_code)s;
63014028Sgiacomo.gabrielli@arm.com
63114028Sgiacomo.gabrielli@arm.com        if (%(pred_check_code)s) {
63214028Sgiacomo.gabrielli@arm.com            fault = writeMemAtomic(xc, traceData, memData, EA,
63314028Sgiacomo.gabrielli@arm.com                                   this->memAccessFlags, NULL);
63414028Sgiacomo.gabrielli@arm.com        }
63514028Sgiacomo.gabrielli@arm.com
63614028Sgiacomo.gabrielli@arm.com        if (fault == NoFault) {
63714028Sgiacomo.gabrielli@arm.com            %(op_wb)s;
63814028Sgiacomo.gabrielli@arm.com        }
63914028Sgiacomo.gabrielli@arm.com
64014028Sgiacomo.gabrielli@arm.com        return fault;
64114028Sgiacomo.gabrielli@arm.com    }
64214028Sgiacomo.gabrielli@arm.com}};
64314028Sgiacomo.gabrielli@arm.com
64414028Sgiacomo.gabrielli@arm.comdef template SveScatterStoreMicroopInitiateAcc {{
64514028Sgiacomo.gabrielli@arm.com    %(tpl_header)s
64614028Sgiacomo.gabrielli@arm.com    Fault %(class_name)s%(tpl_args)s::initiateAcc(ExecContext *xc,
64714028Sgiacomo.gabrielli@arm.com        Trace::InstRecord *traceData) const
64814028Sgiacomo.gabrielli@arm.com    {
64914028Sgiacomo.gabrielli@arm.com        Addr EA;
65014028Sgiacomo.gabrielli@arm.com        Fault fault = NoFault;
65114028Sgiacomo.gabrielli@arm.com        bool aarch64 M5_VAR_USED = true;
65214028Sgiacomo.gabrielli@arm.com
65314028Sgiacomo.gabrielli@arm.com        %(op_decl)s;
65414028Sgiacomo.gabrielli@arm.com        %(op_rd)s;
65514028Sgiacomo.gabrielli@arm.com        %(ea_code)s;
65614028Sgiacomo.gabrielli@arm.com
65714028Sgiacomo.gabrielli@arm.com        MemElemType memData;
65814028Sgiacomo.gabrielli@arm.com        %(memacc_code)s;
65914028Sgiacomo.gabrielli@arm.com
66014028Sgiacomo.gabrielli@arm.com        if (%(pred_check_code)s) {
66114028Sgiacomo.gabrielli@arm.com            fault = writeMemTiming(xc, traceData, memData, EA,
66214028Sgiacomo.gabrielli@arm.com                                   this->memAccessFlags, NULL);
66314028Sgiacomo.gabrielli@arm.com        } else {
66414028Sgiacomo.gabrielli@arm.com            xc->setPredicate(false);
66514028Sgiacomo.gabrielli@arm.com        }
66614028Sgiacomo.gabrielli@arm.com
66714028Sgiacomo.gabrielli@arm.com        return fault;
66814028Sgiacomo.gabrielli@arm.com    }
66914028Sgiacomo.gabrielli@arm.com}};
67014028Sgiacomo.gabrielli@arm.com
67114028Sgiacomo.gabrielli@arm.comdef template SveScatterStoreMicroopCompleteAcc {{
67214028Sgiacomo.gabrielli@arm.com    %(tpl_header)s
67314028Sgiacomo.gabrielli@arm.com    Fault %(class_name)s%(tpl_args)s::completeAcc(PacketPtr pkt,
67414028Sgiacomo.gabrielli@arm.com        ExecContext *xc, Trace::InstRecord *traceData) const
67514028Sgiacomo.gabrielli@arm.com    {
67614028Sgiacomo.gabrielli@arm.com        return NoFault;
67714028Sgiacomo.gabrielli@arm.com    }
67814028Sgiacomo.gabrielli@arm.com}};
67914028Sgiacomo.gabrielli@arm.com
68014028Sgiacomo.gabrielli@arm.comdef template SveGatherLoadCpySrcVecMicroopDeclare {{
68114028Sgiacomo.gabrielli@arm.com    class SveGatherLoadCpySrcVecMicroop : public MicroOp
68214028Sgiacomo.gabrielli@arm.com    {
68314028Sgiacomo.gabrielli@arm.com      protected:
68414028Sgiacomo.gabrielli@arm.com        IntRegIndex op1;
68514028Sgiacomo.gabrielli@arm.com
68614028Sgiacomo.gabrielli@arm.com        StaticInst *macroOp;
68714028Sgiacomo.gabrielli@arm.com
68814028Sgiacomo.gabrielli@arm.com      public:
68914028Sgiacomo.gabrielli@arm.com        SveGatherLoadCpySrcVecMicroop(const char* mnem, ExtMachInst machInst,
69014028Sgiacomo.gabrielli@arm.com            IntRegIndex _op1, StaticInst *_macroOp)
69114028Sgiacomo.gabrielli@arm.com            : MicroOp(mnem, machInst, SimdAluOp), op1(_op1), macroOp(_macroOp)
69214028Sgiacomo.gabrielli@arm.com        {
69314028Sgiacomo.gabrielli@arm.com            %(constructor)s;
69414028Sgiacomo.gabrielli@arm.com        }
69514028Sgiacomo.gabrielli@arm.com
69614028Sgiacomo.gabrielli@arm.com        Fault execute(ExecContext *, Trace::InstRecord *) const;
69714028Sgiacomo.gabrielli@arm.com
69814028Sgiacomo.gabrielli@arm.com        std::string
69914028Sgiacomo.gabrielli@arm.com        generateDisassembly(Addr pc, const SymbolTable *symtab) const
70014028Sgiacomo.gabrielli@arm.com        {
70114028Sgiacomo.gabrielli@arm.com            std::stringstream ss;
70214028Sgiacomo.gabrielli@arm.com            ccprintf(ss, "%s", macroOp->disassemble(pc, symtab));
70314028Sgiacomo.gabrielli@arm.com            ccprintf(ss, " (uop src vec cpy)");
70414028Sgiacomo.gabrielli@arm.com            return ss.str();
70514028Sgiacomo.gabrielli@arm.com        }
70614028Sgiacomo.gabrielli@arm.com    };
70714028Sgiacomo.gabrielli@arm.com}};
70814028Sgiacomo.gabrielli@arm.com
70914028Sgiacomo.gabrielli@arm.comdef template SveGatherLoadCpySrcVecMicroopExecute {{
71014028Sgiacomo.gabrielli@arm.com    Fault SveGatherLoadCpySrcVecMicroop::execute(ExecContext *xc,
71114028Sgiacomo.gabrielli@arm.com            Trace::InstRecord *traceData) const
71214028Sgiacomo.gabrielli@arm.com    {
71314028Sgiacomo.gabrielli@arm.com        Fault fault = NoFault;
71414028Sgiacomo.gabrielli@arm.com        %(op_decl)s;
71514028Sgiacomo.gabrielli@arm.com        %(op_rd)s;
71614028Sgiacomo.gabrielli@arm.com
71714028Sgiacomo.gabrielli@arm.com        %(code)s;
71814028Sgiacomo.gabrielli@arm.com        if (fault == NoFault)
71914028Sgiacomo.gabrielli@arm.com        {
72014028Sgiacomo.gabrielli@arm.com            %(op_wb)s;
72114028Sgiacomo.gabrielli@arm.com        }
72214028Sgiacomo.gabrielli@arm.com
72314028Sgiacomo.gabrielli@arm.com        return fault;
72414028Sgiacomo.gabrielli@arm.com    }
72514028Sgiacomo.gabrielli@arm.com}};
726