110037SARM gem5 Developers// -*- mode:c++ -*-
210037SARM gem5 Developers
314058Sgiacomo.travaglini@arm.com// Copyright (c) 2011-2014, 2017, 2019 ARM Limited
410037SARM gem5 Developers// All rights reserved
510037SARM gem5 Developers//
610037SARM gem5 Developers// The license below extends only to copyright in the software and shall
710037SARM gem5 Developers// not be construed as granting a license to any other intellectual
810037SARM gem5 Developers// property including but not limited to intellectual property relating
910037SARM gem5 Developers// to a hardware implementation of the functionality of the software
1010037SARM gem5 Developers// licensed hereunder.  You may use the software subject to the license
1110037SARM gem5 Developers// terms below provided that you ensure that this notice is replicated
1210037SARM gem5 Developers// unmodified and in its entirety in all distributions of the software,
1310037SARM gem5 Developers// modified or unmodified, in source code or in binary form.
1410037SARM gem5 Developers//
1510037SARM gem5 Developers// Redistribution and use in source and binary forms, with or without
1610037SARM gem5 Developers// modification, are permitted provided that the following conditions are
1710037SARM gem5 Developers// met: redistributions of source code must retain the above copyright
1810037SARM gem5 Developers// notice, this list of conditions and the following disclaimer;
1910037SARM gem5 Developers// redistributions in binary form must reproduce the above copyright
2010037SARM gem5 Developers// notice, this list of conditions and the following disclaimer in the
2110037SARM gem5 Developers// documentation and/or other materials provided with the distribution;
2210037SARM gem5 Developers// neither the name of the copyright holders nor the names of its
2310037SARM gem5 Developers// contributors may be used to endorse or promote products derived from
2410037SARM gem5 Developers// this software without specific prior written permission.
2510037SARM gem5 Developers//
2610037SARM gem5 Developers// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2710037SARM gem5 Developers// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2810037SARM gem5 Developers// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2910037SARM gem5 Developers// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3010037SARM gem5 Developers// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3110037SARM gem5 Developers// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3210037SARM gem5 Developers// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3310037SARM gem5 Developers// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3410037SARM gem5 Developers// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3510037SARM gem5 Developers// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3610037SARM gem5 Developers// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3710037SARM gem5 Developers//
3810037SARM gem5 Developers// Authors: Gabe Black
3910037SARM gem5 Developers
4010037SARM gem5 Developerslet {{
4110037SARM gem5 Developers    SPAlignmentCheckCode = '''
4210037SARM gem5 Developers        if (baseIsSP && bits(XBase, 3, 0) &&
4310037SARM gem5 Developers            SPAlignmentCheckEnabled(xc->tcBase())) {
4410474Sandreas.hansson@arm.com            return std::make_shared<SPAlignmentFault>();
4510037SARM gem5 Developers        }
4610037SARM gem5 Developers   '''
4710037SARM gem5 Developers}};
4810037SARM gem5 Developers
4910037SARM gem5 Developersdef template Load64Execute {{
5012234Sgabeblack@google.com    Fault %(class_name)s::execute(ExecContext *xc,
5110037SARM gem5 Developers                                  Trace::InstRecord *traceData) const
5210037SARM gem5 Developers    {
5310037SARM gem5 Developers        Addr EA;
5410037SARM gem5 Developers        Fault fault = NoFault;
5510037SARM gem5 Developers
5610037SARM gem5 Developers        %(op_decl)s;
5710037SARM gem5 Developers        %(op_rd)s;
5810037SARM gem5 Developers        %(ea_code)s;
5910037SARM gem5 Developers
6010037SARM gem5 Developers        if (fault == NoFault) {
6110037SARM gem5 Developers            fault = readMemAtomic(xc, traceData, EA, Mem, memAccessFlags);
6210037SARM gem5 Developers            %(memacc_code)s;
6310037SARM gem5 Developers        }
6410037SARM gem5 Developers
6510037SARM gem5 Developers        if (fault == NoFault) {
6610037SARM gem5 Developers            %(op_wb)s;
6710037SARM gem5 Developers        }
6810037SARM gem5 Developers
6910037SARM gem5 Developers        return fault;
7010037SARM gem5 Developers    }
7110037SARM gem5 Developers}};
7210037SARM gem5 Developers
7314058Sgiacomo.travaglini@arm.comdef template Load64FpExecute {{
7414058Sgiacomo.travaglini@arm.com    Fault %(class_name)s::execute(ExecContext *xc,
7514058Sgiacomo.travaglini@arm.com                                  Trace::InstRecord *traceData) const
7614058Sgiacomo.travaglini@arm.com    {
7714058Sgiacomo.travaglini@arm.com        Addr EA;
7814058Sgiacomo.travaglini@arm.com        Fault fault = NoFault;
7914058Sgiacomo.travaglini@arm.com
8014058Sgiacomo.travaglini@arm.com        %(op_decl)s;
8114058Sgiacomo.travaglini@arm.com        %(op_rd)s;
8214058Sgiacomo.travaglini@arm.com        %(ea_code)s;
8314058Sgiacomo.travaglini@arm.com
8414058Sgiacomo.travaglini@arm.com        if (fault == NoFault) {
8514058Sgiacomo.travaglini@arm.com            fault = readMemAtomic(xc, traceData, EA, Mem, memAccessFlags);
8614058Sgiacomo.travaglini@arm.com        }
8714058Sgiacomo.travaglini@arm.com
8814058Sgiacomo.travaglini@arm.com        if (fault == NoFault) {
8914058Sgiacomo.travaglini@arm.com            %(memacc_code)s;
9014058Sgiacomo.travaglini@arm.com            %(op_wb)s;
9114058Sgiacomo.travaglini@arm.com        }
9214058Sgiacomo.travaglini@arm.com
9314058Sgiacomo.travaglini@arm.com        return fault;
9414058Sgiacomo.travaglini@arm.com    }
9514058Sgiacomo.travaglini@arm.com}};
9614058Sgiacomo.travaglini@arm.com
9710037SARM gem5 Developersdef template Store64Execute {{
9812234Sgabeblack@google.com    Fault %(class_name)s::execute(ExecContext *xc,
9910037SARM gem5 Developers                                  Trace::InstRecord *traceData) const
10010037SARM gem5 Developers    {
10110037SARM gem5 Developers        Addr EA;
10210037SARM gem5 Developers        Fault fault = NoFault;
10310037SARM gem5 Developers
10410037SARM gem5 Developers        %(op_decl)s;
10510037SARM gem5 Developers        %(op_rd)s;
10610037SARM gem5 Developers        %(ea_code)s;
10710037SARM gem5 Developers
10810037SARM gem5 Developers        if (fault == NoFault) {
10910037SARM gem5 Developers            %(memacc_code)s;
11010037SARM gem5 Developers        }
11110037SARM gem5 Developers
11210037SARM gem5 Developers        if (fault == NoFault) {
11310037SARM gem5 Developers            fault = writeMemAtomic(xc, traceData, Mem, EA,
11410037SARM gem5 Developers                                   memAccessFlags, NULL);
11510037SARM gem5 Developers        }
11610037SARM gem5 Developers
11710037SARM gem5 Developers        if (fault == NoFault) {
11810037SARM gem5 Developers            %(op_wb)s;
11910037SARM gem5 Developers        }
12010037SARM gem5 Developers
12110037SARM gem5 Developers        return fault;
12210037SARM gem5 Developers    }
12310037SARM gem5 Developers}};
12410037SARM gem5 Developers
12510037SARM gem5 Developersdef template Store64InitiateAcc {{
12612234Sgabeblack@google.com    Fault %(class_name)s::initiateAcc(ExecContext *xc,
12710037SARM gem5 Developers                                      Trace::InstRecord *traceData) const
12810037SARM gem5 Developers    {
12910037SARM gem5 Developers        Addr EA;
13010037SARM gem5 Developers        Fault fault = NoFault;
13110037SARM gem5 Developers
13210037SARM gem5 Developers        %(op_decl)s;
13310037SARM gem5 Developers        %(op_rd)s;
13410037SARM gem5 Developers        %(ea_code)s;
13510037SARM gem5 Developers
13610037SARM gem5 Developers        if (fault == NoFault) {
13710037SARM gem5 Developers            %(memacc_code)s;
13810037SARM gem5 Developers        }
13910037SARM gem5 Developers
14010037SARM gem5 Developers        if (fault == NoFault) {
14110037SARM gem5 Developers            fault = writeMemTiming(xc, traceData, Mem, EA, memAccessFlags,
14210037SARM gem5 Developers                                   NULL);
14310037SARM gem5 Developers        }
14410037SARM gem5 Developers
14510037SARM gem5 Developers        return fault;
14610037SARM gem5 Developers    }
14710037SARM gem5 Developers}};
14810037SARM gem5 Developers
14910037SARM gem5 Developersdef template StoreEx64Execute {{
15012234Sgabeblack@google.com    Fault %(class_name)s::execute(ExecContext *xc,
15110037SARM gem5 Developers                                  Trace::InstRecord *traceData) const
15210037SARM gem5 Developers    {
15310037SARM gem5 Developers        Addr EA;
15410037SARM gem5 Developers        Fault fault = NoFault;
15510037SARM gem5 Developers
15610037SARM gem5 Developers        %(op_decl)s;
15710037SARM gem5 Developers        %(op_rd)s;
15810037SARM gem5 Developers        %(ea_code)s;
15910037SARM gem5 Developers
16010037SARM gem5 Developers        if (fault == NoFault) {
16110037SARM gem5 Developers            %(memacc_code)s;
16210037SARM gem5 Developers        }
16310037SARM gem5 Developers
16410037SARM gem5 Developers        uint64_t writeResult = 0;
16510037SARM gem5 Developers        if (fault == NoFault) {
16610037SARM gem5 Developers            fault = writeMemAtomic(xc, traceData, Mem, EA, memAccessFlags,
16710037SARM gem5 Developers                                   &writeResult);
16810037SARM gem5 Developers        }
16910037SARM gem5 Developers
17010037SARM gem5 Developers        if (fault == NoFault) {
17110037SARM gem5 Developers            %(postacc_code)s;
17210037SARM gem5 Developers        }
17310037SARM gem5 Developers
17410037SARM gem5 Developers        if (fault == NoFault) {
17510037SARM gem5 Developers            %(op_wb)s;
17610037SARM gem5 Developers        }
17710037SARM gem5 Developers
17810037SARM gem5 Developers        return fault;
17910037SARM gem5 Developers    }
18010037SARM gem5 Developers}};
18110037SARM gem5 Developers
18210037SARM gem5 Developersdef template StoreEx64InitiateAcc {{
18312234Sgabeblack@google.com    Fault %(class_name)s::initiateAcc(ExecContext *xc,
18410037SARM gem5 Developers                                      Trace::InstRecord *traceData) const
18510037SARM gem5 Developers    {
18610037SARM gem5 Developers        Addr EA;
18710037SARM gem5 Developers        Fault fault = NoFault;
18810037SARM gem5 Developers
18910037SARM gem5 Developers        %(op_decl)s;
19010037SARM gem5 Developers        %(op_rd)s;
19110037SARM gem5 Developers        %(ea_code)s;
19210037SARM gem5 Developers
19310037SARM gem5 Developers        if (fault == NoFault) {
19410037SARM gem5 Developers            %(memacc_code)s;
19510037SARM gem5 Developers        }
19610037SARM gem5 Developers
19710037SARM gem5 Developers        if (fault == NoFault) {
19810037SARM gem5 Developers            fault = writeMemTiming(xc, traceData, Mem, EA, memAccessFlags,
19910037SARM gem5 Developers                                   NULL);
20010037SARM gem5 Developers        }
20110037SARM gem5 Developers
20210037SARM gem5 Developers        return fault;
20310037SARM gem5 Developers    }
20410037SARM gem5 Developers}};
20510037SARM gem5 Developers
20610037SARM gem5 Developersdef template Load64InitiateAcc {{
20712234Sgabeblack@google.com    Fault %(class_name)s::initiateAcc(ExecContext *xc,
20810037SARM gem5 Developers                                      Trace::InstRecord *traceData) const
20910037SARM gem5 Developers    {
21010037SARM gem5 Developers        Addr EA;
21110037SARM gem5 Developers        Fault fault = NoFault;
21210037SARM gem5 Developers
21310037SARM gem5 Developers        %(op_src_decl)s;
21410037SARM gem5 Developers        %(op_rd)s;
21510037SARM gem5 Developers        %(ea_code)s;
21610037SARM gem5 Developers
21710037SARM gem5 Developers        if (fault == NoFault) {
21811303Ssteve.reinhardt@amd.com            fault = initiateMemRead(xc, traceData, EA, Mem, memAccessFlags);
21910037SARM gem5 Developers        }
22010037SARM gem5 Developers
22110037SARM gem5 Developers        return fault;
22210037SARM gem5 Developers    }
22310037SARM gem5 Developers}};
22410037SARM gem5 Developers
22510037SARM gem5 Developersdef template Load64CompleteAcc {{
22612234Sgabeblack@google.com    Fault %(class_name)s::completeAcc(PacketPtr pkt, ExecContext *xc,
22710037SARM gem5 Developers                                      Trace::InstRecord *traceData) const
22810037SARM gem5 Developers    {
22910037SARM gem5 Developers        Fault fault = NoFault;
23010037SARM gem5 Developers
23110037SARM gem5 Developers        %(op_decl)s;
23210037SARM gem5 Developers        %(op_rd)s;
23310037SARM gem5 Developers
23410037SARM gem5 Developers        // ARM instructions will not have a pkt if the predicate is false
23510037SARM gem5 Developers        getMem(pkt, Mem, traceData);
23610037SARM gem5 Developers
23710037SARM gem5 Developers        if (fault == NoFault) {
23810037SARM gem5 Developers            %(memacc_code)s;
23910037SARM gem5 Developers        }
24010037SARM gem5 Developers
24110037SARM gem5 Developers        if (fault == NoFault) {
24210037SARM gem5 Developers            %(op_wb)s;
24310037SARM gem5 Developers        }
24410037SARM gem5 Developers
24510037SARM gem5 Developers        return fault;
24610037SARM gem5 Developers    }
24710037SARM gem5 Developers}};
24810037SARM gem5 Developers
24910037SARM gem5 Developersdef template Store64CompleteAcc {{
25012234Sgabeblack@google.com    Fault %(class_name)s::completeAcc(PacketPtr pkt, ExecContext *xc,
25110037SARM gem5 Developers                                      Trace::InstRecord *traceData) const
25210037SARM gem5 Developers    {
25310037SARM gem5 Developers        return NoFault;
25410037SARM gem5 Developers    }
25510037SARM gem5 Developers}};
25610037SARM gem5 Developers
25710037SARM gem5 Developersdef template StoreEx64CompleteAcc {{
25812234Sgabeblack@google.com    Fault %(class_name)s::completeAcc(PacketPtr pkt, ExecContext *xc,
25910037SARM gem5 Developers                                      Trace::InstRecord *traceData) const
26010037SARM gem5 Developers    {
26110037SARM gem5 Developers        Fault fault = NoFault;
26210037SARM gem5 Developers
26310037SARM gem5 Developers        %(op_decl)s;
26410037SARM gem5 Developers        %(op_rd)s;
26510037SARM gem5 Developers
26610037SARM gem5 Developers        uint64_t writeResult = pkt->req->getExtraData();
26710037SARM gem5 Developers        %(postacc_code)s;
26810037SARM gem5 Developers
26910037SARM gem5 Developers        if (fault == NoFault) {
27010037SARM gem5 Developers            %(op_wb)s;
27110037SARM gem5 Developers        }
27210037SARM gem5 Developers
27310037SARM gem5 Developers        return fault;
27410037SARM gem5 Developers    }
27510037SARM gem5 Developers}};
27610037SARM gem5 Developers
27710037SARM gem5 Developersdef template DCStore64Declare {{
27810037SARM gem5 Developers    class %(class_name)s : public %(base_class)s
27910037SARM gem5 Developers    {
28010037SARM gem5 Developers      public:
28110037SARM gem5 Developers
28210037SARM gem5 Developers        /// Constructor.
28312359Snikos.nikoleris@arm.com        %(class_name)s(ExtMachInst machInst, IntRegIndex _base,
28412359Snikos.nikoleris@arm.com                       MiscRegIndex _dest, uint64_t _imm);
28510037SARM gem5 Developers
28612616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
28712616Sgabeblack@google.com        Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override;
28812616Sgabeblack@google.com        Fault completeAcc(PacketPtr, ExecContext *,
28912616Sgabeblack@google.com                          Trace::InstRecord *) const override;
29010037SARM gem5 Developers
29112616Sgabeblack@google.com        void
29212616Sgabeblack@google.com        annotateFault(ArmFault *fault) override
29312616Sgabeblack@google.com        {
29410037SARM gem5 Developers            %(fa_code)s
29510037SARM gem5 Developers        }
29610037SARM gem5 Developers    };
29710037SARM gem5 Developers}};
29810037SARM gem5 Developers
29910037SARM gem5 Developersdef template DCStore64Constructor {{
30012359Snikos.nikoleris@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst, IntRegIndex _base,
30112359Snikos.nikoleris@arm.com                                   MiscRegIndex _dest, uint64_t _imm)
30210037SARM gem5 Developers         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
30312359Snikos.nikoleris@arm.com                          _base, _dest, _imm)
30410037SARM gem5 Developers    {
30510037SARM gem5 Developers        %(constructor)s;
30610037SARM gem5 Developers        assert(!%(use_uops)d);
30710037SARM gem5 Developers    }
30810037SARM gem5 Developers}};
30910037SARM gem5 Developers
31010037SARM gem5 Developersdef template DCStore64Execute {{
31112234Sgabeblack@google.com    Fault %(class_name)s::execute(ExecContext *xc,
31210037SARM gem5 Developers                                  Trace::InstRecord *traceData) const
31310037SARM gem5 Developers    {
31410037SARM gem5 Developers        Addr EA;
31510037SARM gem5 Developers        Fault fault = NoFault;
31610037SARM gem5 Developers
31710037SARM gem5 Developers        %(op_decl)s;
31810037SARM gem5 Developers        %(op_rd)s;
31910037SARM gem5 Developers        %(ea_code)s;
32010037SARM gem5 Developers
32110037SARM gem5 Developers
32210037SARM gem5 Developers        if (fault == NoFault) {
32310037SARM gem5 Developers            %(memacc_code)s;
32410037SARM gem5 Developers        }
32510037SARM gem5 Developers
32610037SARM gem5 Developers        if (fault == NoFault) {
32710037SARM gem5 Developers            fault = xc->writeMem(NULL, op_size, EA, memAccessFlags, NULL);
32810037SARM gem5 Developers        }
32910037SARM gem5 Developers
33010037SARM gem5 Developers        if (fault == NoFault) {
33110037SARM gem5 Developers            %(op_wb)s;
33210037SARM gem5 Developers        }
33310037SARM gem5 Developers
33410037SARM gem5 Developers        return fault;
33510037SARM gem5 Developers    }
33610037SARM gem5 Developers}};
33710037SARM gem5 Developers
33810037SARM gem5 Developersdef template DCStore64InitiateAcc {{
33912234Sgabeblack@google.com    Fault %(class_name)s::initiateAcc(ExecContext *xc,
34010037SARM gem5 Developers                                      Trace::InstRecord *traceData) const
34110037SARM gem5 Developers    {
34210037SARM gem5 Developers        Addr EA;
34310037SARM gem5 Developers        Fault fault = NoFault;
34410037SARM gem5 Developers
34510037SARM gem5 Developers        %(op_decl)s;
34610037SARM gem5 Developers        %(op_rd)s;
34710037SARM gem5 Developers        %(ea_code)s;
34810037SARM gem5 Developers
34910037SARM gem5 Developers        if (fault == NoFault) {
35010037SARM gem5 Developers            %(memacc_code)s;
35110037SARM gem5 Developers        }
35210037SARM gem5 Developers
35310037SARM gem5 Developers        if (fault == NoFault) {
35410037SARM gem5 Developers            fault = xc->writeMem(NULL, op_size, EA, memAccessFlags, NULL);
35510037SARM gem5 Developers        }
35610037SARM gem5 Developers
35710037SARM gem5 Developers        return fault;
35810037SARM gem5 Developers    }
35910037SARM gem5 Developers}};
36010037SARM gem5 Developers
36110037SARM gem5 Developers
36210037SARM gem5 Developersdef template LoadStoreImm64Declare {{
36310037SARM gem5 Developers    class %(class_name)s : public %(base_class)s
36410037SARM gem5 Developers    {
36510037SARM gem5 Developers      public:
36610037SARM gem5 Developers
36710037SARM gem5 Developers        /// Constructor.
36810037SARM gem5 Developers        %(class_name)s(ExtMachInst machInst,
36910037SARM gem5 Developers                IntRegIndex _dest, IntRegIndex _base, int64_t _imm);
37010037SARM gem5 Developers
37112616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
37212616Sgabeblack@google.com        Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override;
37312616Sgabeblack@google.com        Fault completeAcc(PacketPtr, ExecContext *,
37412616Sgabeblack@google.com                          Trace::InstRecord *) const override;
37510037SARM gem5 Developers
37612616Sgabeblack@google.com        void
37712616Sgabeblack@google.com        annotateFault(ArmFault *fault) override
37812616Sgabeblack@google.com        {
37910037SARM gem5 Developers            %(fa_code)s
38010037SARM gem5 Developers        }
38110037SARM gem5 Developers    };
38210037SARM gem5 Developers}};
38310037SARM gem5 Developers
38410037SARM gem5 Developersdef template LoadStoreImmU64Declare {{
38510037SARM gem5 Developers    class %(class_name)s : public %(base_class)s
38610037SARM gem5 Developers    {
38710037SARM gem5 Developers      public:
38810037SARM gem5 Developers
38910037SARM gem5 Developers        /// Constructor.
39010037SARM gem5 Developers        %(class_name)s(ExtMachInst machInst,
39110037SARM gem5 Developers                IntRegIndex _dest, IntRegIndex _base, int64_t _imm,
39210037SARM gem5 Developers                bool noAlloc = false, bool exclusive = false,
39310037SARM gem5 Developers                bool acrel = false);
39410037SARM gem5 Developers
39512616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
39612616Sgabeblack@google.com        Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override;
39712616Sgabeblack@google.com        Fault completeAcc(PacketPtr, ExecContext *,
39812616Sgabeblack@google.com                          Trace::InstRecord *) const override;
39910037SARM gem5 Developers
40012616Sgabeblack@google.com        void
40112616Sgabeblack@google.com        annotateFault(ArmFault *fault) override
40212616Sgabeblack@google.com        {
40310037SARM gem5 Developers            %(fa_code)s
40410037SARM gem5 Developers        }
40510037SARM gem5 Developers    };
40610037SARM gem5 Developers}};
40710037SARM gem5 Developers
40810037SARM gem5 Developersdef template LoadStoreImmDU64Declare {{
40910037SARM gem5 Developers    class %(class_name)s : public %(base_class)s
41010037SARM gem5 Developers    {
41110037SARM gem5 Developers      public:
41210037SARM gem5 Developers
41310037SARM gem5 Developers        /// Constructor.
41410037SARM gem5 Developers        %(class_name)s(ExtMachInst machInst,
41510037SARM gem5 Developers                IntRegIndex _dest, IntRegIndex _dest2, IntRegIndex _base,
41610037SARM gem5 Developers                int64_t _imm = 0, bool noAlloc = false, bool exclusive = false,
41710037SARM gem5 Developers                bool acrel = false);
41810037SARM gem5 Developers
41912616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
42012616Sgabeblack@google.com        Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override;
42112616Sgabeblack@google.com        Fault completeAcc(PacketPtr, ExecContext *,
42212616Sgabeblack@google.com                          Trace::InstRecord *) const override;
42310037SARM gem5 Developers
42412616Sgabeblack@google.com        void
42512616Sgabeblack@google.com        annotateFault(ArmFault *fault) override
42612616Sgabeblack@google.com        {
42710037SARM gem5 Developers            %(fa_code)s
42810037SARM gem5 Developers        }
42910037SARM gem5 Developers    };
43010037SARM gem5 Developers}};
43110037SARM gem5 Developers
43210037SARM gem5 Developersdef template StoreImmDEx64Declare {{
43310037SARM gem5 Developers    /**
43410037SARM gem5 Developers     * Static instruction class for "%(mnemonic)s".
43510037SARM gem5 Developers     */
43610037SARM gem5 Developers    class %(class_name)s : public %(base_class)s
43710037SARM gem5 Developers    {
43810037SARM gem5 Developers      public:
43910037SARM gem5 Developers
44010037SARM gem5 Developers        /// Constructor.
44110037SARM gem5 Developers        %(class_name)s(ExtMachInst machInst,
44210037SARM gem5 Developers                IntRegIndex _result, IntRegIndex _dest, IntRegIndex _dest2,
44310037SARM gem5 Developers                IntRegIndex _base, int64_t _imm = 0);
44410037SARM gem5 Developers
44512616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
44612616Sgabeblack@google.com        Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override;
44712616Sgabeblack@google.com        Fault completeAcc(PacketPtr, ExecContext *,
44812616Sgabeblack@google.com                          Trace::InstRecord *) const override;
44910037SARM gem5 Developers    };
45010037SARM gem5 Developers}};
45110037SARM gem5 Developers
45210037SARM gem5 Developers
45310037SARM gem5 Developersdef template LoadStoreReg64Declare {{
45410037SARM gem5 Developers    class %(class_name)s : public %(base_class)s
45510037SARM gem5 Developers    {
45610037SARM gem5 Developers      public:
45710037SARM gem5 Developers
45810037SARM gem5 Developers        /// Constructor.
45910037SARM gem5 Developers        %(class_name)s(ExtMachInst machInst,
46010037SARM gem5 Developers                IntRegIndex _dest, IntRegIndex _base, IntRegIndex _offset,
46110037SARM gem5 Developers                ArmExtendType _type, uint32_t _shiftAmt);
46210037SARM gem5 Developers
46312616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
46412616Sgabeblack@google.com        Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override;
46512616Sgabeblack@google.com        Fault completeAcc(PacketPtr, ExecContext *,
46612616Sgabeblack@google.com                          Trace::InstRecord *) const override;
46710037SARM gem5 Developers
46812616Sgabeblack@google.com        void
46912616Sgabeblack@google.com        annotateFault(ArmFault *fault) override
47012616Sgabeblack@google.com        {
47110037SARM gem5 Developers            %(fa_code)s
47210037SARM gem5 Developers        }
47310037SARM gem5 Developers    };
47410037SARM gem5 Developers}};
47510037SARM gem5 Developers
47610037SARM gem5 Developersdef template LoadStoreRegU64Declare {{
47710037SARM gem5 Developers    class %(class_name)s : public %(base_class)s
47810037SARM gem5 Developers    {
47910037SARM gem5 Developers      public:
48010037SARM gem5 Developers
48110037SARM gem5 Developers        /// Constructor.
48210037SARM gem5 Developers        %(class_name)s(ExtMachInst machInst,
48310037SARM gem5 Developers                IntRegIndex _dest, IntRegIndex _base, IntRegIndex _offset,
48410037SARM gem5 Developers                ArmExtendType _type, uint32_t _shiftAmt,
48510037SARM gem5 Developers                bool noAlloc = false, bool exclusive = false,
48610037SARM gem5 Developers                bool acrel = false);
48710037SARM gem5 Developers
48812616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
48912616Sgabeblack@google.com        Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override;
49012616Sgabeblack@google.com        Fault completeAcc(PacketPtr, ExecContext *,
49112616Sgabeblack@google.com                          Trace::InstRecord *) const override;
49210037SARM gem5 Developers
49312616Sgabeblack@google.com        void
49412616Sgabeblack@google.com        annotateFault(ArmFault *fault) override
49512616Sgabeblack@google.com        {
49610037SARM gem5 Developers            %(fa_code)s
49710037SARM gem5 Developers        }
49810037SARM gem5 Developers    };
49910037SARM gem5 Developers}};
50010037SARM gem5 Developers
50110037SARM gem5 Developersdef template LoadStoreRaw64Declare {{
50210037SARM gem5 Developers    class %(class_name)s : public %(base_class)s
50310037SARM gem5 Developers    {
50410037SARM gem5 Developers      public:
50510037SARM gem5 Developers
50610037SARM gem5 Developers        /// Constructor.
50710037SARM gem5 Developers        %(class_name)s(ExtMachInst machInst, IntRegIndex _dest,
50810037SARM gem5 Developers                       IntRegIndex _base);
50910037SARM gem5 Developers
51012616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
51112616Sgabeblack@google.com        Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override;
51212616Sgabeblack@google.com        Fault completeAcc(PacketPtr, ExecContext *,
51312616Sgabeblack@google.com                          Trace::InstRecord *) const override;
51410037SARM gem5 Developers
51512616Sgabeblack@google.com        void
51612616Sgabeblack@google.com        annotateFault(ArmFault *fault) override
51712616Sgabeblack@google.com        {
51810037SARM gem5 Developers            %(fa_code)s
51910037SARM gem5 Developers        }
52010037SARM gem5 Developers    };
52110037SARM gem5 Developers}};
52210037SARM gem5 Developers
52310037SARM gem5 Developersdef template LoadStoreEx64Declare {{
52410037SARM gem5 Developers    class %(class_name)s : public %(base_class)s
52510037SARM gem5 Developers    {
52610037SARM gem5 Developers      public:
52710037SARM gem5 Developers
52810037SARM gem5 Developers        /// Constructor.
52910037SARM gem5 Developers        %(class_name)s(ExtMachInst machInst, IntRegIndex _dest,
53010037SARM gem5 Developers                       IntRegIndex _base, IntRegIndex _result);
53110037SARM gem5 Developers
53212616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
53312616Sgabeblack@google.com        Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override;
53412616Sgabeblack@google.com        Fault completeAcc(PacketPtr, ExecContext *,
53512616Sgabeblack@google.com                          Trace::InstRecord *) const override;
53610037SARM gem5 Developers
53712616Sgabeblack@google.com        void
53812616Sgabeblack@google.com        annotateFault(ArmFault *fault) override
53912616Sgabeblack@google.com        {
54010037SARM gem5 Developers            %(fa_code)s
54110037SARM gem5 Developers        }
54210037SARM gem5 Developers    };
54310037SARM gem5 Developers}};
54410037SARM gem5 Developers
54510037SARM gem5 Developersdef template LoadStoreLit64Declare {{
54610037SARM gem5 Developers    class %(class_name)s : public %(base_class)s
54710037SARM gem5 Developers    {
54810037SARM gem5 Developers      public:
54910037SARM gem5 Developers
55010037SARM gem5 Developers        /// Constructor.
55110037SARM gem5 Developers        %(class_name)s(ExtMachInst machInst, IntRegIndex _dest, int64_t _imm);
55210037SARM gem5 Developers
55312616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
55412616Sgabeblack@google.com        Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override;
55512616Sgabeblack@google.com        Fault completeAcc(PacketPtr, ExecContext *,
55612616Sgabeblack@google.com                          Trace::InstRecord *) const override;
55710037SARM gem5 Developers
55812616Sgabeblack@google.com        void
55912616Sgabeblack@google.com        annotateFault(ArmFault *fault) override
56012616Sgabeblack@google.com        {
56110037SARM gem5 Developers            %(fa_code)s
56210037SARM gem5 Developers        }
56310037SARM gem5 Developers    };
56410037SARM gem5 Developers}};
56510037SARM gem5 Developers
56610037SARM gem5 Developersdef template LoadStoreLitU64Declare {{
56710037SARM gem5 Developers    class %(class_name)s : public %(base_class)s
56810037SARM gem5 Developers    {
56910037SARM gem5 Developers      public:
57010037SARM gem5 Developers
57110037SARM gem5 Developers        /// Constructor.
57210037SARM gem5 Developers        %(class_name)s(ExtMachInst machInst, IntRegIndex _dest, int64_t _imm,
57310037SARM gem5 Developers                bool noAlloc = false, bool exclusive = false,
57410037SARM gem5 Developers                bool acrel = false);
57510037SARM gem5 Developers
57612616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
57712616Sgabeblack@google.com        Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override;
57812616Sgabeblack@google.com        Fault completeAcc(PacketPtr, ExecContext *,
57912616Sgabeblack@google.com                          Trace::InstRecord *) const override;
58010037SARM gem5 Developers
58112616Sgabeblack@google.com        void
58212616Sgabeblack@google.com        annotateFault(ArmFault *fault) override
58312616Sgabeblack@google.com        {
58410037SARM gem5 Developers            %(fa_code)s
58510037SARM gem5 Developers        }
58610037SARM gem5 Developers    };
58710037SARM gem5 Developers}};
58810037SARM gem5 Developers
58910037SARM gem5 Developersdef template LoadStoreImm64Constructor {{
59010037SARM gem5 Developers    %(class_name)s::%(class_name)s(ExtMachInst machInst,
59110037SARM gem5 Developers            IntRegIndex _dest, IntRegIndex _base, int64_t _imm)
59210037SARM gem5 Developers         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
59310037SARM gem5 Developers                 (IntRegIndex)_dest, (IntRegIndex)_base, _imm)
59410037SARM gem5 Developers    {
59510037SARM gem5 Developers        %(constructor)s;
59610037SARM gem5 Developers#if %(use_uops)d
59710037SARM gem5 Developers        assert(numMicroops >= 2);
59810037SARM gem5 Developers        uops = new StaticInstPtr[numMicroops];
59910037SARM gem5 Developers        uops[0] = new %(acc_name)s(machInst, _dest, _base, _imm);
60010037SARM gem5 Developers        uops[0]->setDelayedCommit();
60110666SAli.Saidi@ARM.com        uops[0]->setFirstMicroop();
60210037SARM gem5 Developers        uops[1] = new %(wb_decl)s;
60310037SARM gem5 Developers        uops[1]->setLastMicroop();
60410037SARM gem5 Developers#endif
60510037SARM gem5 Developers    }
60610037SARM gem5 Developers}};
60710037SARM gem5 Developers
60810037SARM gem5 Developersdef template LoadStoreImmU64Constructor {{
60910037SARM gem5 Developers    %(class_name)s::%(class_name)s(ExtMachInst machInst,
61010037SARM gem5 Developers            IntRegIndex _dest, IntRegIndex _base, int64_t _imm,
61110037SARM gem5 Developers            bool noAlloc, bool exclusive, bool acrel)
61210037SARM gem5 Developers         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
61310037SARM gem5 Developers                 _dest, _base, _imm)
61410037SARM gem5 Developers    {
61510037SARM gem5 Developers        %(constructor)s;
61610037SARM gem5 Developers        assert(!%(use_uops)d);
61710037SARM gem5 Developers        setExcAcRel(exclusive, acrel);
61810037SARM gem5 Developers    }
61910037SARM gem5 Developers}};
62010037SARM gem5 Developers
62110037SARM gem5 Developersdef template LoadStoreImmDU64Constructor {{
62210037SARM gem5 Developers    %(class_name)s::%(class_name)s(ExtMachInst machInst,
62310037SARM gem5 Developers            IntRegIndex _dest, IntRegIndex _dest2, IntRegIndex _base,
62410037SARM gem5 Developers            int64_t _imm, bool noAlloc, bool exclusive, bool acrel)
62510037SARM gem5 Developers         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
62610037SARM gem5 Developers                 _dest, _dest2, _base, _imm)
62710037SARM gem5 Developers    {
62810037SARM gem5 Developers        %(constructor)s;
62910037SARM gem5 Developers        assert(!%(use_uops)d);
63010037SARM gem5 Developers        setExcAcRel(exclusive, acrel);
63110037SARM gem5 Developers    }
63210037SARM gem5 Developers}};
63310037SARM gem5 Developers
63410037SARM gem5 Developersdef template StoreImmDEx64Constructor {{
63510184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
63610037SARM gem5 Developers            IntRegIndex _result, IntRegIndex _dest, IntRegIndex _dest2,
63710037SARM gem5 Developers            IntRegIndex _base, int64_t _imm)
63810037SARM gem5 Developers         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
63910037SARM gem5 Developers                 _result, _dest, _dest2, _base, _imm)
64010037SARM gem5 Developers    {
64110037SARM gem5 Developers        %(constructor)s;
64210037SARM gem5 Developers        assert(!%(use_uops)d);
64310037SARM gem5 Developers    }
64410037SARM gem5 Developers}};
64510037SARM gem5 Developers
64610037SARM gem5 Developers
64710037SARM gem5 Developersdef template LoadStoreReg64Constructor {{
64810037SARM gem5 Developers    %(class_name)s::%(class_name)s(ExtMachInst machInst,
64910037SARM gem5 Developers            IntRegIndex _dest, IntRegIndex _base, IntRegIndex _offset,
65010037SARM gem5 Developers            ArmExtendType _type, uint32_t _shiftAmt)
65110037SARM gem5 Developers         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
65210037SARM gem5 Developers                 _dest, _base, _offset, _type, _shiftAmt)
65310037SARM gem5 Developers    {
65410037SARM gem5 Developers        %(constructor)s;
65510037SARM gem5 Developers#if %(use_uops)d
65610037SARM gem5 Developers        assert(numMicroops >= 2);
65710037SARM gem5 Developers        uops = new StaticInstPtr[numMicroops];
65810037SARM gem5 Developers        uops[0] = new %(acc_name)s(machInst, _dest, _base, _offset,
65910037SARM gem5 Developers                                   _type, _shiftAmt);
66010037SARM gem5 Developers        uops[0]->setDelayedCommit();
66110666SAli.Saidi@ARM.com        uops[0]->setFirstMicroop();
66210037SARM gem5 Developers        uops[1] = new %(wb_decl)s;
66310037SARM gem5 Developers        uops[1]->setLastMicroop();
66410037SARM gem5 Developers#endif
66510037SARM gem5 Developers    }
66610037SARM gem5 Developers}};
66710037SARM gem5 Developers
66810037SARM gem5 Developersdef template LoadStoreRegU64Constructor {{
66910037SARM gem5 Developers    %(class_name)s::%(class_name)s(ExtMachInst machInst,
67010037SARM gem5 Developers            IntRegIndex _dest, IntRegIndex _base, IntRegIndex _offset,
67110037SARM gem5 Developers            ArmExtendType _type, uint32_t _shiftAmt,
67210037SARM gem5 Developers            bool noAlloc, bool exclusive, bool acrel)
67310037SARM gem5 Developers         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
67410037SARM gem5 Developers                 _dest, _base, _offset, _type, _shiftAmt)
67510037SARM gem5 Developers    {
67610037SARM gem5 Developers        %(constructor)s;
67710037SARM gem5 Developers        assert(!%(use_uops)d);
67810037SARM gem5 Developers        setExcAcRel(exclusive, acrel);
67910037SARM gem5 Developers    }
68010037SARM gem5 Developers}};
68110037SARM gem5 Developers
68210037SARM gem5 Developersdef template LoadStoreRaw64Constructor {{
68310037SARM gem5 Developers    %(class_name)s::%(class_name)s(ExtMachInst machInst,
68410037SARM gem5 Developers            IntRegIndex _dest, IntRegIndex _base)
68510037SARM gem5 Developers         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest, _base)
68610037SARM gem5 Developers    {
68710037SARM gem5 Developers        %(constructor)s;
68810037SARM gem5 Developers    }
68910037SARM gem5 Developers}};
69010037SARM gem5 Developers
69110037SARM gem5 Developersdef template LoadStoreEx64Constructor {{
69210037SARM gem5 Developers    %(class_name)s::%(class_name)s(ExtMachInst machInst,
69310037SARM gem5 Developers            IntRegIndex _dest, IntRegIndex _base, IntRegIndex _result)
69410037SARM gem5 Developers         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
69510037SARM gem5 Developers                          _dest, _base, _result)
69610037SARM gem5 Developers    {
69710037SARM gem5 Developers        %(constructor)s;
69810037SARM gem5 Developers    }
69910037SARM gem5 Developers}};
70010037SARM gem5 Developers
70110037SARM gem5 Developersdef template LoadStoreLit64Constructor {{
70210037SARM gem5 Developers    %(class_name)s::%(class_name)s(ExtMachInst machInst,
70310037SARM gem5 Developers            IntRegIndex _dest, int64_t _imm)
70410037SARM gem5 Developers         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
70510037SARM gem5 Developers                 (IntRegIndex)_dest, _imm)
70610037SARM gem5 Developers    {
70710037SARM gem5 Developers        %(constructor)s;
70810037SARM gem5 Developers#if %(use_uops)d
70910037SARM gem5 Developers        assert(numMicroops >= 2);
71010037SARM gem5 Developers        uops = new StaticInstPtr[numMicroops];
71110037SARM gem5 Developers        uops[0] = new %(acc_name)s(machInst, _dest, _imm);
71210037SARM gem5 Developers        uops[0]->setDelayedCommit();
71310666SAli.Saidi@ARM.com        uops[0]->setFirstMicroop();
71410037SARM gem5 Developers        uops[1] = new %(wb_decl)s;
71510037SARM gem5 Developers        uops[1]->setLastMicroop();
71610037SARM gem5 Developers#endif
71710037SARM gem5 Developers    }
71810037SARM gem5 Developers}};
71910037SARM gem5 Developers
72010037SARM gem5 Developersdef template LoadStoreLitU64Constructor {{
72110037SARM gem5 Developers    %(class_name)s::%(class_name)s(ExtMachInst machInst,
72210037SARM gem5 Developers            IntRegIndex _dest, int64_t _imm,
72310037SARM gem5 Developers            bool noAlloc, bool exclusive, bool acrel)
72410037SARM gem5 Developers         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
72510037SARM gem5 Developers                 (IntRegIndex)_dest, _imm)
72610037SARM gem5 Developers    {
72710037SARM gem5 Developers        %(constructor)s;
72810037SARM gem5 Developers        assert(!%(use_uops)d);
72910037SARM gem5 Developers        setExcAcRel(exclusive, acrel);
73010037SARM gem5 Developers    }
73110037SARM gem5 Developers}};
73214150Sjordi.vaquero@metempsy.com
73314150Sjordi.vaquero@metempsy.com// Atomic operations in memory
73414150Sjordi.vaquero@metempsy.com
73514150Sjordi.vaquero@metempsy.comdef template AmoOpExecute {{
73614150Sjordi.vaquero@metempsy.com    Fault %(class_name)s::execute(ExecContext *xc,
73714150Sjordi.vaquero@metempsy.com                                  Trace::InstRecord *traceData) const
73814150Sjordi.vaquero@metempsy.com    {
73914150Sjordi.vaquero@metempsy.com        Addr EA;
74014150Sjordi.vaquero@metempsy.com        Fault fault = NoFault;
74114150Sjordi.vaquero@metempsy.com
74214150Sjordi.vaquero@metempsy.com        %(op_decl)s;
74314150Sjordi.vaquero@metempsy.com        %(op_rd)s;
74414150Sjordi.vaquero@metempsy.com        %(ea_code)s;
74514150Sjordi.vaquero@metempsy.com
74614150Sjordi.vaquero@metempsy.com        %(usrDecl)s;
74714150Sjordi.vaquero@metempsy.com        if (fault == NoFault) {
74814150Sjordi.vaquero@metempsy.com            %(memacc_code)s;
74914150Sjordi.vaquero@metempsy.com        }
75014150Sjordi.vaquero@metempsy.com
75114150Sjordi.vaquero@metempsy.com        %(amo_code)s
75214150Sjordi.vaquero@metempsy.com        assert(amo_op);
75314150Sjordi.vaquero@metempsy.com
75414150Sjordi.vaquero@metempsy.com        if (fault == NoFault) {
75514150Sjordi.vaquero@metempsy.com            fault = amoMemAtomic(xc, traceData, Mem, EA,
75614150Sjordi.vaquero@metempsy.com                memAccessFlags, amo_op);
75714150Sjordi.vaquero@metempsy.com        }
75814150Sjordi.vaquero@metempsy.com
75914150Sjordi.vaquero@metempsy.com        if (fault == NoFault) {
76014150Sjordi.vaquero@metempsy.com            %(postacc_code)s;
76114150Sjordi.vaquero@metempsy.com        }
76214150Sjordi.vaquero@metempsy.com
76314150Sjordi.vaquero@metempsy.com        if (fault == NoFault) {
76414150Sjordi.vaquero@metempsy.com            %(op_wb)s;
76514150Sjordi.vaquero@metempsy.com        }
76614150Sjordi.vaquero@metempsy.com
76714150Sjordi.vaquero@metempsy.com         return fault;
76814150Sjordi.vaquero@metempsy.com    }
76914150Sjordi.vaquero@metempsy.com}};
77014150Sjordi.vaquero@metempsy.com
77114150Sjordi.vaquero@metempsy.comdef template AmoOpInitiateAcc {{
77214150Sjordi.vaquero@metempsy.com    Fault %(class_name)s::initiateAcc(ExecContext *xc,
77314150Sjordi.vaquero@metempsy.com                                      Trace::InstRecord *traceData) const
77414150Sjordi.vaquero@metempsy.com    {
77514150Sjordi.vaquero@metempsy.com        Addr EA;
77614150Sjordi.vaquero@metempsy.com        Fault fault = NoFault;
77714150Sjordi.vaquero@metempsy.com
77814150Sjordi.vaquero@metempsy.com        %(op_src_decl)s;
77914150Sjordi.vaquero@metempsy.com        %(op_rd)s;
78014150Sjordi.vaquero@metempsy.com        %(ea_code)s;
78114150Sjordi.vaquero@metempsy.com        %(usrDecl)s;
78214150Sjordi.vaquero@metempsy.com
78314150Sjordi.vaquero@metempsy.com        if (fault == NoFault) {
78414150Sjordi.vaquero@metempsy.com            %(memacc_code)s;
78514150Sjordi.vaquero@metempsy.com        }
78614150Sjordi.vaquero@metempsy.com
78714150Sjordi.vaquero@metempsy.com        %(amo_code)s;
78814150Sjordi.vaquero@metempsy.com
78914150Sjordi.vaquero@metempsy.com        assert(amo_op);
79014150Sjordi.vaquero@metempsy.com        if (fault == NoFault) {
79114150Sjordi.vaquero@metempsy.com            fault = initiateMemAMO(xc, traceData, EA, Mem, memAccessFlags,
79214150Sjordi.vaquero@metempsy.com                                   amo_op);
79314150Sjordi.vaquero@metempsy.com        }
79414150Sjordi.vaquero@metempsy.com
79514150Sjordi.vaquero@metempsy.com        return fault;
79614150Sjordi.vaquero@metempsy.com     }
79714150Sjordi.vaquero@metempsy.com}};
79814150Sjordi.vaquero@metempsy.com
79914150Sjordi.vaquero@metempsy.comdef template AmoOpCompleteAcc {{
80014150Sjordi.vaquero@metempsy.com    Fault %(class_name)s::completeAcc(PacketPtr pkt, ExecContext *xc,
80114150Sjordi.vaquero@metempsy.com                                      Trace::InstRecord *traceData) const
80214150Sjordi.vaquero@metempsy.com    {
80314150Sjordi.vaquero@metempsy.com         Fault fault = NoFault;
80414150Sjordi.vaquero@metempsy.com
80514150Sjordi.vaquero@metempsy.com         %(op_decl)s;
80614150Sjordi.vaquero@metempsy.com         %(op_rd)s;
80714150Sjordi.vaquero@metempsy.com
80814150Sjordi.vaquero@metempsy.com         // ARM instructions will not have a pkt if the predicate is false
80914150Sjordi.vaquero@metempsy.com        getMem(pkt, Mem, traceData);
81014150Sjordi.vaquero@metempsy.com
81114150Sjordi.vaquero@metempsy.com        if (fault == NoFault) {
81214150Sjordi.vaquero@metempsy.com            %(postacc_code)s;
81314150Sjordi.vaquero@metempsy.com        }
81414150Sjordi.vaquero@metempsy.com
81514150Sjordi.vaquero@metempsy.com        if (fault == NoFault) {
81614150Sjordi.vaquero@metempsy.com            %(op_wb)s;
81714150Sjordi.vaquero@metempsy.com        }
81814150Sjordi.vaquero@metempsy.com
81914150Sjordi.vaquero@metempsy.com         return fault;
82014150Sjordi.vaquero@metempsy.com    }
82114150Sjordi.vaquero@metempsy.com
82214150Sjordi.vaquero@metempsy.com}};
82314150Sjordi.vaquero@metempsy.com
82414150Sjordi.vaquero@metempsy.comdef template AmoOpDeclare {{
82514150Sjordi.vaquero@metempsy.com    class %(class_name)s : public %(base_class)s
82614150Sjordi.vaquero@metempsy.com    {
82714150Sjordi.vaquero@metempsy.com      public:
82814150Sjordi.vaquero@metempsy.com
82914150Sjordi.vaquero@metempsy.com        /// Constructor.
83014150Sjordi.vaquero@metempsy.com        %(class_name)s(ExtMachInst machInst, IntRegIndex _dest,
83114150Sjordi.vaquero@metempsy.com                       IntRegIndex _base, IntRegIndex _result);
83214150Sjordi.vaquero@metempsy.com
83314150Sjordi.vaquero@metempsy.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
83414150Sjordi.vaquero@metempsy.com        Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override;
83514150Sjordi.vaquero@metempsy.com        Fault completeAcc(PacketPtr, ExecContext *,
83614150Sjordi.vaquero@metempsy.com                          Trace::InstRecord *) const override;
83714150Sjordi.vaquero@metempsy.com
83814150Sjordi.vaquero@metempsy.com        void
83914150Sjordi.vaquero@metempsy.com        annotateFault(ArmFault *fault) override
84014150Sjordi.vaquero@metempsy.com        {
84114150Sjordi.vaquero@metempsy.com            %(fa_code)s
84214150Sjordi.vaquero@metempsy.com        }
84314150Sjordi.vaquero@metempsy.com    };
84414150Sjordi.vaquero@metempsy.com}};
84514150Sjordi.vaquero@metempsy.com
84614150Sjordi.vaquero@metempsy.com
84714150Sjordi.vaquero@metempsy.comdef template AmoOpConstructor {{
84814150Sjordi.vaquero@metempsy.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
84914150Sjordi.vaquero@metempsy.com            IntRegIndex _dest, IntRegIndex _base, IntRegIndex _result)
85014150Sjordi.vaquero@metempsy.com         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
85114150Sjordi.vaquero@metempsy.com                          _dest, _base, _result)
85214150Sjordi.vaquero@metempsy.com    {
85314150Sjordi.vaquero@metempsy.com        %(constructor)s;
85414157Sjordi.vaquero@metempsy.com        flags[IsStore] = false;
85514157Sjordi.vaquero@metempsy.com        flags[IsLoad] = false;
85614150Sjordi.vaquero@metempsy.com    }
85714150Sjordi.vaquero@metempsy.com}};
85814150Sjordi.vaquero@metempsy.com
85914150Sjordi.vaquero@metempsy.comdef template AmoPairOpDeclare {{
86014150Sjordi.vaquero@metempsy.com    class %(class_name)s : public %(base_class)s
86114150Sjordi.vaquero@metempsy.com    {
86214150Sjordi.vaquero@metempsy.com      public:
86314150Sjordi.vaquero@metempsy.com        uint32_t d2_src ;
86414150Sjordi.vaquero@metempsy.com        uint32_t r2_src ;
86514150Sjordi.vaquero@metempsy.com        uint32_t r2_dst ;
86614150Sjordi.vaquero@metempsy.com        /// Constructor.
86714150Sjordi.vaquero@metempsy.com        %(class_name)s(ExtMachInst machInst, IntRegIndex _dest,
86814150Sjordi.vaquero@metempsy.com                       IntRegIndex _base, IntRegIndex _result);
86914150Sjordi.vaquero@metempsy.com
87014150Sjordi.vaquero@metempsy.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
87114150Sjordi.vaquero@metempsy.com        Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override;
87214150Sjordi.vaquero@metempsy.com        Fault completeAcc(PacketPtr, ExecContext *,
87314150Sjordi.vaquero@metempsy.com                          Trace::InstRecord *) const override;
87414150Sjordi.vaquero@metempsy.com
87514150Sjordi.vaquero@metempsy.com        void
87614150Sjordi.vaquero@metempsy.com        annotateFault(ArmFault *fault) override
87714150Sjordi.vaquero@metempsy.com        {
87814150Sjordi.vaquero@metempsy.com            %(fa_code)s
87914150Sjordi.vaquero@metempsy.com        }
88014150Sjordi.vaquero@metempsy.com    };
88114150Sjordi.vaquero@metempsy.com}};
88214150Sjordi.vaquero@metempsy.com
88314150Sjordi.vaquero@metempsy.com
88414150Sjordi.vaquero@metempsy.comdef template AmoPairOpConstructor {{
88514150Sjordi.vaquero@metempsy.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
88614150Sjordi.vaquero@metempsy.com            IntRegIndex _dest, IntRegIndex _base, IntRegIndex _result)
88714150Sjordi.vaquero@metempsy.com         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
88814150Sjordi.vaquero@metempsy.com                          _dest,  _base, _result)
88914150Sjordi.vaquero@metempsy.com    {
89014150Sjordi.vaquero@metempsy.com        %(constructor)s;
89114150Sjordi.vaquero@metempsy.com
89214150Sjordi.vaquero@metempsy.com        uint32_t d2 = RegId(IntRegClass, dest).index() + 1 ;
89314150Sjordi.vaquero@metempsy.com        uint32_t r2 = RegId(IntRegClass, result).index() + 1 ;
89414150Sjordi.vaquero@metempsy.com
89514150Sjordi.vaquero@metempsy.com        d2_src = _numSrcRegs ;
89614150Sjordi.vaquero@metempsy.com        _srcRegIdx[_numSrcRegs++] = RegId(IntRegClass, d2);
89714150Sjordi.vaquero@metempsy.com        r2_src = _numSrcRegs ;
89814150Sjordi.vaquero@metempsy.com        _srcRegIdx[_numSrcRegs++] = RegId(IntRegClass, r2);
89914150Sjordi.vaquero@metempsy.com        r2_dst = _numDestRegs ;
90014150Sjordi.vaquero@metempsy.com        _destRegIdx[_numDestRegs++] = RegId(IntRegClass, r2);
90114157Sjordi.vaquero@metempsy.com        flags[IsStore] = false;
90214157Sjordi.vaquero@metempsy.com        flags[IsLoad] = false;
90314150Sjordi.vaquero@metempsy.com    }
90414150Sjordi.vaquero@metempsy.com}};
90514150Sjordi.vaquero@metempsy.com
90614150Sjordi.vaquero@metempsy.comdef template AmoArithmeticOpDeclare {{
90714150Sjordi.vaquero@metempsy.com    class %(class_name)s : public %(base_class)s
90814150Sjordi.vaquero@metempsy.com    {
90914150Sjordi.vaquero@metempsy.com      public:
91014150Sjordi.vaquero@metempsy.com        bool isXZR ;
91114150Sjordi.vaquero@metempsy.com        /// Constructor.
91214150Sjordi.vaquero@metempsy.com        %(class_name)s(ExtMachInst machInst, IntRegIndex _dest,
91314150Sjordi.vaquero@metempsy.com                       IntRegIndex _base, IntRegIndex _result);
91414150Sjordi.vaquero@metempsy.com
91514150Sjordi.vaquero@metempsy.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
91614150Sjordi.vaquero@metempsy.com        Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override;
91714150Sjordi.vaquero@metempsy.com        Fault completeAcc(PacketPtr, ExecContext *,
91814150Sjordi.vaquero@metempsy.com                          Trace::InstRecord *) const override;
91914150Sjordi.vaquero@metempsy.com
92014150Sjordi.vaquero@metempsy.com        void
92114150Sjordi.vaquero@metempsy.com        annotateFault(ArmFault *fault) override
92214150Sjordi.vaquero@metempsy.com        {
92314150Sjordi.vaquero@metempsy.com            %(fa_code)s
92414150Sjordi.vaquero@metempsy.com        }
92514150Sjordi.vaquero@metempsy.com    };
92614150Sjordi.vaquero@metempsy.com}};
92714150Sjordi.vaquero@metempsy.com
92814150Sjordi.vaquero@metempsy.comdef template AmoArithmeticOpConstructor {{
92914150Sjordi.vaquero@metempsy.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
93014150Sjordi.vaquero@metempsy.com            IntRegIndex _dest, IntRegIndex _base, IntRegIndex _result)
93114150Sjordi.vaquero@metempsy.com         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
93214150Sjordi.vaquero@metempsy.com                          _dest,  _base, _result)
93314150Sjordi.vaquero@metempsy.com    {
93414150Sjordi.vaquero@metempsy.com        %(constructor)s;
93514150Sjordi.vaquero@metempsy.com        isXZR = false;
93614150Sjordi.vaquero@metempsy.com        uint32_t r2 = RegId(IntRegClass, dest).index() ;
93714157Sjordi.vaquero@metempsy.com        flags[IsStore] = false;
93814157Sjordi.vaquero@metempsy.com        flags[IsLoad] = false;
93914150Sjordi.vaquero@metempsy.com        if (r2 == 31){
94014150Sjordi.vaquero@metempsy.com            isXZR = true;
94114150Sjordi.vaquero@metempsy.com        }
94214150Sjordi.vaquero@metempsy.com    }
94314150Sjordi.vaquero@metempsy.com}};
944