17202Sgblack@eecs.umich.edu// -*- mode:c++ -*-
27202Sgblack@eecs.umich.edu
312503Snikos.nikoleris@arm.com// Copyright (c) 2010-2013,2017-2018 ARM Limited
47202Sgblack@eecs.umich.edu// All rights reserved
57202Sgblack@eecs.umich.edu//
67202Sgblack@eecs.umich.edu// The license below extends only to copyright in the software and shall
77202Sgblack@eecs.umich.edu// not be construed as granting a license to any other intellectual
87202Sgblack@eecs.umich.edu// property including but not limited to intellectual property relating
97202Sgblack@eecs.umich.edu// to a hardware implementation of the functionality of the software
107202Sgblack@eecs.umich.edu// licensed hereunder.  You may use the software subject to the license
117202Sgblack@eecs.umich.edu// terms below provided that you ensure that this notice is replicated
127202Sgblack@eecs.umich.edu// unmodified and in its entirety in all distributions of the software,
137202Sgblack@eecs.umich.edu// modified or unmodified, in source code or in binary form.
147202Sgblack@eecs.umich.edu//
157202Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without
167202Sgblack@eecs.umich.edu// modification, are permitted provided that the following conditions are
177202Sgblack@eecs.umich.edu// met: redistributions of source code must retain the above copyright
187202Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer;
197202Sgblack@eecs.umich.edu// redistributions in binary form must reproduce the above copyright
207202Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the
217202Sgblack@eecs.umich.edu// documentation and/or other materials provided with the distribution;
227202Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its
237202Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from
247202Sgblack@eecs.umich.edu// this software without specific prior written permission.
257202Sgblack@eecs.umich.edu//
267202Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
277202Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
287202Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
297202Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
307202Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
317202Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
327202Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
337202Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
347202Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
357202Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
367202Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
377202Sgblack@eecs.umich.edu//
387202Sgblack@eecs.umich.edu// Authors: Gabe Black
397202Sgblack@eecs.umich.edu
407202Sgblack@eecs.umich.edudef template MrsDeclare {{
417202Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
427202Sgblack@eecs.umich.edu{
437202Sgblack@eecs.umich.edu  protected:
447202Sgblack@eecs.umich.edu    public:
457202Sgblack@eecs.umich.edu        // Constructor
467202Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst, IntRegIndex _dest);
4712616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
487202Sgblack@eecs.umich.edu};
497202Sgblack@eecs.umich.edu}};
507202Sgblack@eecs.umich.edu
517202Sgblack@eecs.umich.edudef template MrsConstructor {{
5210184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
537202Sgblack@eecs.umich.edu                                          IntRegIndex _dest)
547202Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest)
557202Sgblack@eecs.umich.edu    {
567202Sgblack@eecs.umich.edu        %(constructor)s;
577848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
587848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
597848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
607848SAli.Saidi@ARM.com            }
617848SAli.Saidi@ARM.com        }
627202Sgblack@eecs.umich.edu    }
637202Sgblack@eecs.umich.edu}};
647202Sgblack@eecs.umich.edu
6510037SARM gem5 Developersdef template MrsBankedRegDeclare {{
6610037SARM gem5 Developersclass %(class_name)s : public %(base_class)s
6710037SARM gem5 Developers{
6810037SARM gem5 Developers  protected:
6910037SARM gem5 Developers    uint8_t byteMask;
7010037SARM gem5 Developers    bool    r;
7110037SARM gem5 Developers
7210037SARM gem5 Developers  public:
7310037SARM gem5 Developers        // Constructor
7410037SARM gem5 Developers        %(class_name)s(ExtMachInst machInst, IntRegIndex _dest,
7510037SARM gem5 Developers                       uint8_t _sysM, bool _r);
7612616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
7710037SARM gem5 Developers};
7810037SARM gem5 Developers}};
7910037SARM gem5 Developers
8010037SARM gem5 Developersdef template MrsBankedRegConstructor {{
8110184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
8210037SARM gem5 Developers                                          IntRegIndex _dest,
8310037SARM gem5 Developers                                          uint8_t     _sysM,
8410037SARM gem5 Developers                                          bool        _r)
8510037SARM gem5 Developers        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest),
8610037SARM gem5 Developers          byteMask(_sysM), r(_r)
8710037SARM gem5 Developers    {
8810037SARM gem5 Developers        %(constructor)s;
8910037SARM gem5 Developers        if (!(condCode == COND_AL || condCode == COND_UC)) {
9010037SARM gem5 Developers            for (int x = 0; x < _numDestRegs; x++) {
9110037SARM gem5 Developers                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
9210037SARM gem5 Developers            }
9310037SARM gem5 Developers        }
9410037SARM gem5 Developers    }
9510037SARM gem5 Developers}};
9610037SARM gem5 Developers
9710037SARM gem5 Developersdef template MsrBankedRegDeclare {{
9810037SARM gem5 Developersclass %(class_name)s : public %(base_class)s
9910037SARM gem5 Developers{
10010037SARM gem5 Developers  protected:
10110037SARM gem5 Developers    bool r;
10210037SARM gem5 Developers
10310037SARM gem5 Developers  public:
10410037SARM gem5 Developers        // Constructor
10510037SARM gem5 Developers        %(class_name)s(ExtMachInst machInst, IntRegIndex _op1,
10610037SARM gem5 Developers                       uint8_t _sysM, bool _r);
10712616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
10810037SARM gem5 Developers};
10910037SARM gem5 Developers}};
11010037SARM gem5 Developers
11110037SARM gem5 Developersdef template MsrBankedRegConstructor {{
11210184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
11310037SARM gem5 Developers                                          IntRegIndex _op1,
11410037SARM gem5 Developers                                          uint8_t     _sysM,
11510037SARM gem5 Developers                                          bool        _r)
11610037SARM gem5 Developers        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _op1, _sysM),
11710037SARM gem5 Developers          r(_r)
11810037SARM gem5 Developers    {
11910037SARM gem5 Developers        %(constructor)s;
12010037SARM gem5 Developers        if (!(condCode == COND_AL || condCode == COND_UC)) {
12110037SARM gem5 Developers            for (int x = 0; x < _numDestRegs; x++) {
12210037SARM gem5 Developers                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
12310037SARM gem5 Developers            }
12410037SARM gem5 Developers        }
12510037SARM gem5 Developers    }
12610037SARM gem5 Developers}};
12710037SARM gem5 Developers
1287202Sgblack@eecs.umich.edudef template MsrRegDeclare {{
1297202Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
1307202Sgblack@eecs.umich.edu{
1317202Sgblack@eecs.umich.edu  protected:
1327202Sgblack@eecs.umich.edu    public:
1337202Sgblack@eecs.umich.edu        // Constructor
1347202Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst, IntRegIndex _op1, uint8_t mask);
13512616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
1367202Sgblack@eecs.umich.edu};
1377202Sgblack@eecs.umich.edu}};
1387202Sgblack@eecs.umich.edu
1397202Sgblack@eecs.umich.edudef template MsrRegConstructor {{
14010184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
1417202Sgblack@eecs.umich.edu                                          IntRegIndex _op1,
1427202Sgblack@eecs.umich.edu                                          uint8_t mask)
1437202Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _op1, mask)
1447202Sgblack@eecs.umich.edu    {
1457202Sgblack@eecs.umich.edu        %(constructor)s;
1467848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
1477848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
1487848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
1497848SAli.Saidi@ARM.com            }
1507848SAli.Saidi@ARM.com        }
1517202Sgblack@eecs.umich.edu    }
1527202Sgblack@eecs.umich.edu}};
1537202Sgblack@eecs.umich.edu
1547202Sgblack@eecs.umich.edudef template MsrImmDeclare {{
1557202Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
1567202Sgblack@eecs.umich.edu{
1577202Sgblack@eecs.umich.edu  protected:
1587202Sgblack@eecs.umich.edu    public:
1597202Sgblack@eecs.umich.edu        // Constructor
1607202Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst, uint32_t imm, uint8_t mask);
16112616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
1627202Sgblack@eecs.umich.edu};
1637202Sgblack@eecs.umich.edu}};
1647202Sgblack@eecs.umich.edu
1657202Sgblack@eecs.umich.edudef template MsrImmConstructor {{
16610184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
1677202Sgblack@eecs.umich.edu                                          uint32_t imm,
1687202Sgblack@eecs.umich.edu                                          uint8_t mask)
1697202Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, imm, mask)
1707202Sgblack@eecs.umich.edu    {
1717202Sgblack@eecs.umich.edu        %(constructor)s;
1727848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
1737848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
1747848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
1757848SAli.Saidi@ARM.com            }
1767848SAli.Saidi@ARM.com        }
1777202Sgblack@eecs.umich.edu    }
1787202Sgblack@eecs.umich.edu}};
1797208Sgblack@eecs.umich.edu
18010037SARM gem5 Developersdef template MrrcOpDeclare {{
18110037SARM gem5 Developersclass %(class_name)s : public %(base_class)s
18210037SARM gem5 Developers{
18310037SARM gem5 Developers  protected:
18410037SARM gem5 Developers    public:
18510037SARM gem5 Developers        // Constructor
18610420Sandreas.hansson@arm.com        %(class_name)s(ExtMachInst machInst, MiscRegIndex _op1,
18710037SARM gem5 Developers                       IntRegIndex _dest, IntRegIndex _dest2, uint32_t imm);
18812616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
18910037SARM gem5 Developers};
19010037SARM gem5 Developers}};
19110037SARM gem5 Developers
19210037SARM gem5 Developersdef template MrrcOpConstructor {{
19310184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
19410420Sandreas.hansson@arm.com                                          MiscRegIndex op1,
19510037SARM gem5 Developers                                          IntRegIndex dest,
19610037SARM gem5 Developers                                          IntRegIndex dest2,
19710037SARM gem5 Developers                                          uint32_t    imm)
19810037SARM gem5 Developers        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, op1, dest,
19910037SARM gem5 Developers                         dest2, imm)
20010037SARM gem5 Developers    {
20110037SARM gem5 Developers        %(constructor)s;
20210037SARM gem5 Developers        if (!(condCode == COND_AL || condCode == COND_UC)) {
20310037SARM gem5 Developers            for (int x = 0; x < _numDestRegs; x++) {
20410037SARM gem5 Developers                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
20510037SARM gem5 Developers            }
20610037SARM gem5 Developers        }
20710037SARM gem5 Developers    }
20810037SARM gem5 Developers}};
20910037SARM gem5 Developers
21010037SARM gem5 Developersdef template McrrOpDeclare {{
21110037SARM gem5 Developersclass %(class_name)s : public %(base_class)s
21210037SARM gem5 Developers{
21310037SARM gem5 Developers  protected:
21410037SARM gem5 Developers    public:
21510037SARM gem5 Developers        // Constructor
21610037SARM gem5 Developers        %(class_name)s(ExtMachInst machInst, IntRegIndex _op1, IntRegIndex _op2,
21710420Sandreas.hansson@arm.com                       MiscRegIndex _dest, uint32_t imm);
21812616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
21910037SARM gem5 Developers};
22010037SARM gem5 Developers}};
22110037SARM gem5 Developers
22210037SARM gem5 Developersdef template McrrOpConstructor {{
22310184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
22410037SARM gem5 Developers                                          IntRegIndex op1,
22510037SARM gem5 Developers                                          IntRegIndex op2,
22610420Sandreas.hansson@arm.com                                          MiscRegIndex dest,
22710037SARM gem5 Developers                                          uint32_t    imm)
22810037SARM gem5 Developers        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, op1, op2,
22910037SARM gem5 Developers                         dest, imm)
23010037SARM gem5 Developers    {
23110037SARM gem5 Developers        %(constructor)s;
23210037SARM gem5 Developers        if (!(condCode == COND_AL || condCode == COND_UC)) {
23310037SARM gem5 Developers            for (int x = 0; x < _numDestRegs; x++) {
23410037SARM gem5 Developers                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
23510037SARM gem5 Developers            }
23610037SARM gem5 Developers        }
23710037SARM gem5 Developers    }
23810037SARM gem5 Developers}};
23910037SARM gem5 Developers
2407306Sgblack@eecs.umich.edudef template ImmOpDeclare {{
2417306Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
2427306Sgblack@eecs.umich.edu{
2437306Sgblack@eecs.umich.edu  protected:
2447306Sgblack@eecs.umich.edu    public:
2457306Sgblack@eecs.umich.edu        // Constructor
2467330Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst, uint64_t _imm);
24712616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
2487306Sgblack@eecs.umich.edu};
2497306Sgblack@eecs.umich.edu}};
2507306Sgblack@eecs.umich.edu
2517306Sgblack@eecs.umich.edudef template ImmOpConstructor {{
25210184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst, uint64_t _imm)
2537306Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _imm)
2547306Sgblack@eecs.umich.edu    {
2557306Sgblack@eecs.umich.edu        %(constructor)s;
2567848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
2577848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
2587848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
2597848SAli.Saidi@ARM.com            }
2607848SAli.Saidi@ARM.com        }
2617306Sgblack@eecs.umich.edu    }
2627306Sgblack@eecs.umich.edu}};
2637306Sgblack@eecs.umich.edu
2647332Sgblack@eecs.umich.edudef template RegImmOpDeclare {{
2657332Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
2667332Sgblack@eecs.umich.edu{
2677332Sgblack@eecs.umich.edu  protected:
2687332Sgblack@eecs.umich.edu    public:
2697332Sgblack@eecs.umich.edu        // Constructor
2707332Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst, IntRegIndex _dest, uint64_t _imm);
27112616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
2727332Sgblack@eecs.umich.edu};
2737332Sgblack@eecs.umich.edu}};
2747332Sgblack@eecs.umich.edu
2757332Sgblack@eecs.umich.edudef template RegImmOpConstructor {{
27610184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
2777332Sgblack@eecs.umich.edu            IntRegIndex _dest, uint64_t _imm)
2787332Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest, _imm)
2797332Sgblack@eecs.umich.edu    {
2807332Sgblack@eecs.umich.edu        %(constructor)s;
2817848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
2827848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
2837848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
2847848SAli.Saidi@ARM.com            }
2857848SAli.Saidi@ARM.com        }
2867332Sgblack@eecs.umich.edu    }
2877332Sgblack@eecs.umich.edu}};
2887332Sgblack@eecs.umich.edu
2897261Sgblack@eecs.umich.edudef template RegRegOpDeclare {{
2907208Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
2917208Sgblack@eecs.umich.edu{
2927208Sgblack@eecs.umich.edu  protected:
2937208Sgblack@eecs.umich.edu    public:
2947208Sgblack@eecs.umich.edu        // Constructor
2957208Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
2967208Sgblack@eecs.umich.edu                       IntRegIndex _dest, IntRegIndex _op1);
29712616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
2987208Sgblack@eecs.umich.edu};
2997208Sgblack@eecs.umich.edu}};
3007208Sgblack@eecs.umich.edu
3017261Sgblack@eecs.umich.edudef template RegRegOpConstructor {{
30210184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
3037208Sgblack@eecs.umich.edu                                          IntRegIndex _dest, IntRegIndex _op1)
3047208Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest, _op1)
3057208Sgblack@eecs.umich.edu    {
3067208Sgblack@eecs.umich.edu        %(constructor)s;
3077848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
3087848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
3097848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
3107848SAli.Saidi@ARM.com            }
3117848SAli.Saidi@ARM.com        }
3127208Sgblack@eecs.umich.edu    }
3137208Sgblack@eecs.umich.edu}};
3147225Sgblack@eecs.umich.edu
3157233Sgblack@eecs.umich.edudef template RegRegRegImmOpDeclare {{
3167233Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
3177233Sgblack@eecs.umich.edu{
3187233Sgblack@eecs.umich.edu  protected:
3197233Sgblack@eecs.umich.edu    public:
3207233Sgblack@eecs.umich.edu        // Constructor
3217233Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
3227233Sgblack@eecs.umich.edu                       IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2,
3237330Sgblack@eecs.umich.edu                       uint64_t _imm);
32412616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
3257233Sgblack@eecs.umich.edu};
3267233Sgblack@eecs.umich.edu}};
3277233Sgblack@eecs.umich.edu
3287233Sgblack@eecs.umich.edudef template RegRegRegImmOpConstructor {{
32910184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
3307233Sgblack@eecs.umich.edu                                          IntRegIndex _dest,
3317233Sgblack@eecs.umich.edu                                          IntRegIndex _op1,
3327233Sgblack@eecs.umich.edu                                          IntRegIndex _op2,
3337330Sgblack@eecs.umich.edu                                          uint64_t _imm)
3347233Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
3357233Sgblack@eecs.umich.edu                         _dest, _op1, _op2, _imm)
3367233Sgblack@eecs.umich.edu    {
3377233Sgblack@eecs.umich.edu        %(constructor)s;
3387848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
3397848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
3407848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
3417848SAli.Saidi@ARM.com            }
3427848SAli.Saidi@ARM.com        }
3437233Sgblack@eecs.umich.edu    }
3447233Sgblack@eecs.umich.edu}};
3457233Sgblack@eecs.umich.edu
3467241Sgblack@eecs.umich.edudef template RegRegRegRegOpDeclare {{
3477241Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
3487241Sgblack@eecs.umich.edu{
3497241Sgblack@eecs.umich.edu  protected:
3507241Sgblack@eecs.umich.edu    public:
3517241Sgblack@eecs.umich.edu        // Constructor
3527241Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
3537241Sgblack@eecs.umich.edu                       IntRegIndex _dest, IntRegIndex _op1,
3547241Sgblack@eecs.umich.edu                       IntRegIndex _op2, IntRegIndex _op3);
35512616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
3567241Sgblack@eecs.umich.edu};
3577241Sgblack@eecs.umich.edu}};
3587241Sgblack@eecs.umich.edu
3597241Sgblack@eecs.umich.edudef template RegRegRegRegOpConstructor {{
36010184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
3617241Sgblack@eecs.umich.edu                                          IntRegIndex _dest,
3627241Sgblack@eecs.umich.edu                                          IntRegIndex _op1,
3637241Sgblack@eecs.umich.edu                                          IntRegIndex _op2,
3647241Sgblack@eecs.umich.edu                                          IntRegIndex _op3)
3657241Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
3667241Sgblack@eecs.umich.edu                         _dest, _op1, _op2, _op3)
3677241Sgblack@eecs.umich.edu    {
3687241Sgblack@eecs.umich.edu        %(constructor)s;
3697848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
3707848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
3717848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
3727848SAli.Saidi@ARM.com            }
3737848SAli.Saidi@ARM.com        }
3747241Sgblack@eecs.umich.edu    }
3757241Sgblack@eecs.umich.edu}};
3767241Sgblack@eecs.umich.edu
3777238Sgblack@eecs.umich.edudef template RegRegRegOpDeclare {{
3787238Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
3797238Sgblack@eecs.umich.edu{
3807238Sgblack@eecs.umich.edu  protected:
3817238Sgblack@eecs.umich.edu    public:
3827238Sgblack@eecs.umich.edu        // Constructor
3837238Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
3847238Sgblack@eecs.umich.edu                       IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2);
38512616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
3867238Sgblack@eecs.umich.edu};
3877238Sgblack@eecs.umich.edu}};
3887238Sgblack@eecs.umich.edu
3897238Sgblack@eecs.umich.edudef template RegRegRegOpConstructor {{
39010184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
3917238Sgblack@eecs.umich.edu                                          IntRegIndex _dest,
3927238Sgblack@eecs.umich.edu                                          IntRegIndex _op1,
3937238Sgblack@eecs.umich.edu                                          IntRegIndex _op2)
3947238Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
3957238Sgblack@eecs.umich.edu                         _dest, _op1, _op2)
3967238Sgblack@eecs.umich.edu    {
3977238Sgblack@eecs.umich.edu        %(constructor)s;
3987848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
3997848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
4007848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
4017848SAli.Saidi@ARM.com            }
4027848SAli.Saidi@ARM.com        }
4037238Sgblack@eecs.umich.edu    }
4047238Sgblack@eecs.umich.edu}};
4057238Sgblack@eecs.umich.edu
4067331Sgblack@eecs.umich.edudef template RegRegImmOpDeclare {{
4077331Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
4087331Sgblack@eecs.umich.edu{
4097331Sgblack@eecs.umich.edu  protected:
4107331Sgblack@eecs.umich.edu    public:
4117331Sgblack@eecs.umich.edu        // Constructor
4127331Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
4137331Sgblack@eecs.umich.edu                       IntRegIndex _dest, IntRegIndex _op1,
4147331Sgblack@eecs.umich.edu                       uint64_t _imm);
41512616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
4167331Sgblack@eecs.umich.edu};
4177331Sgblack@eecs.umich.edu}};
4187331Sgblack@eecs.umich.edu
4197331Sgblack@eecs.umich.edudef template RegRegImmOpConstructor {{
42010184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
4217331Sgblack@eecs.umich.edu                                          IntRegIndex _dest,
4227331Sgblack@eecs.umich.edu                                          IntRegIndex _op1,
4237331Sgblack@eecs.umich.edu                                          uint64_t _imm)
4247331Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
4257331Sgblack@eecs.umich.edu                         _dest, _op1, _imm)
4267331Sgblack@eecs.umich.edu    {
4277331Sgblack@eecs.umich.edu        %(constructor)s;
4287848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
4297848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
4307848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
4317848SAli.Saidi@ARM.com            }
4327848SAli.Saidi@ARM.com        }
4337331Sgblack@eecs.umich.edu    }
4347331Sgblack@eecs.umich.edu}};
4357331Sgblack@eecs.umich.edu
43610418Sandreas.hansson@arm.comdef template MiscRegRegImmOpDeclare {{
43710418Sandreas.hansson@arm.comclass %(class_name)s : public %(base_class)s
43810418Sandreas.hansson@arm.com{
43910418Sandreas.hansson@arm.com  protected:
44010418Sandreas.hansson@arm.com    public:
44110418Sandreas.hansson@arm.com        // Constructor
44210418Sandreas.hansson@arm.com        %(class_name)s(ExtMachInst machInst,
44310418Sandreas.hansson@arm.com                       MiscRegIndex _dest, IntRegIndex _op1,
44410418Sandreas.hansson@arm.com                       uint64_t _imm);
44512616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
44610418Sandreas.hansson@arm.com};
44710418Sandreas.hansson@arm.com}};
44810418Sandreas.hansson@arm.com
44910418Sandreas.hansson@arm.comdef template MiscRegRegImmOpConstructor {{
45010418Sandreas.hansson@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
45110418Sandreas.hansson@arm.com                                          MiscRegIndex _dest,
45210418Sandreas.hansson@arm.com                                          IntRegIndex _op1,
45310418Sandreas.hansson@arm.com                                          uint64_t _imm)
45410418Sandreas.hansson@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
45510418Sandreas.hansson@arm.com                         _dest, _op1, _imm)
45610418Sandreas.hansson@arm.com    {
45710418Sandreas.hansson@arm.com        %(constructor)s;
45810418Sandreas.hansson@arm.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
45910418Sandreas.hansson@arm.com            for (int x = 0; x < _numDestRegs; x++) {
46010418Sandreas.hansson@arm.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
46110418Sandreas.hansson@arm.com            }
46210418Sandreas.hansson@arm.com        }
46310418Sandreas.hansson@arm.com    }
46410418Sandreas.hansson@arm.com}};
46510418Sandreas.hansson@arm.com
46610418Sandreas.hansson@arm.comdef template RegMiscRegImmOpDeclare {{
46710418Sandreas.hansson@arm.comclass %(class_name)s : public %(base_class)s
46810418Sandreas.hansson@arm.com{
46910418Sandreas.hansson@arm.com  protected:
47010418Sandreas.hansson@arm.com    public:
47110418Sandreas.hansson@arm.com        // Constructor
47210418Sandreas.hansson@arm.com        %(class_name)s(ExtMachInst machInst,
47310418Sandreas.hansson@arm.com                       IntRegIndex _dest, MiscRegIndex _op1,
47410418Sandreas.hansson@arm.com                       uint64_t _imm);
47512616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
47610418Sandreas.hansson@arm.com};
47710418Sandreas.hansson@arm.com}};
47810418Sandreas.hansson@arm.com
47910418Sandreas.hansson@arm.comdef template RegMiscRegImmOpConstructor {{
48010418Sandreas.hansson@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
48110418Sandreas.hansson@arm.com                                          IntRegIndex _dest,
48210418Sandreas.hansson@arm.com                                          MiscRegIndex _op1,
48310418Sandreas.hansson@arm.com                                          uint64_t _imm)
48410418Sandreas.hansson@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
48510418Sandreas.hansson@arm.com                         _dest, _op1, _imm)
48610418Sandreas.hansson@arm.com    {
48710418Sandreas.hansson@arm.com        %(constructor)s;
48810418Sandreas.hansson@arm.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
48910418Sandreas.hansson@arm.com            for (int x = 0; x < _numDestRegs; x++) {
49010418Sandreas.hansson@arm.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
49110418Sandreas.hansson@arm.com            }
49210418Sandreas.hansson@arm.com        }
49310418Sandreas.hansson@arm.com    }
49410418Sandreas.hansson@arm.com}};
49510418Sandreas.hansson@arm.com
49610037SARM gem5 Developersdef template RegImmImmOpDeclare {{
49710037SARM gem5 Developersclass %(class_name)s : public %(base_class)s
49810037SARM gem5 Developers{
49910037SARM gem5 Developers  protected:
50010037SARM gem5 Developers    public:
50110037SARM gem5 Developers        // Constructor
50210037SARM gem5 Developers        %(class_name)s(ExtMachInst machInst,
50310037SARM gem5 Developers                       IntRegIndex _dest, uint64_t _imm1, uint64_t _imm2);
50412616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
50510037SARM gem5 Developers};
50610037SARM gem5 Developers}};
50710037SARM gem5 Developers
50810037SARM gem5 Developersdef template RegImmImmOpConstructor {{
50910184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
51010037SARM gem5 Developers                                          IntRegIndex _dest,
51110037SARM gem5 Developers                                          uint64_t _imm1,
51210037SARM gem5 Developers                                          uint64_t _imm2)
51310037SARM gem5 Developers        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
51410037SARM gem5 Developers                         _dest, _imm1, _imm2)
51510037SARM gem5 Developers    {
51610037SARM gem5 Developers        %(constructor)s;
51710037SARM gem5 Developers        if (!(condCode == COND_AL || condCode == COND_UC)) {
51810037SARM gem5 Developers            for (int x = 0; x < _numDestRegs; x++) {
51910037SARM gem5 Developers                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
52010037SARM gem5 Developers            }
52110037SARM gem5 Developers        }
52210037SARM gem5 Developers    }
52310037SARM gem5 Developers}};
52410037SARM gem5 Developers
5257253Sgblack@eecs.umich.edudef template RegRegImmImmOpDeclare {{
5267253Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
5277253Sgblack@eecs.umich.edu{
5287253Sgblack@eecs.umich.edu  protected:
5297253Sgblack@eecs.umich.edu    public:
5307253Sgblack@eecs.umich.edu        // Constructor
5317253Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
5327253Sgblack@eecs.umich.edu                       IntRegIndex _dest, IntRegIndex _op1,
5337330Sgblack@eecs.umich.edu                       uint64_t _imm1, uint64_t _imm2);
53412616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
5357253Sgblack@eecs.umich.edu};
5367253Sgblack@eecs.umich.edu}};
5377253Sgblack@eecs.umich.edu
5387253Sgblack@eecs.umich.edudef template RegRegImmImmOpConstructor {{
53910184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
5407253Sgblack@eecs.umich.edu                                          IntRegIndex _dest,
5417253Sgblack@eecs.umich.edu                                          IntRegIndex _op1,
5427330Sgblack@eecs.umich.edu                                          uint64_t _imm1,
5437330Sgblack@eecs.umich.edu                                          uint64_t _imm2)
5447253Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
5457253Sgblack@eecs.umich.edu                         _dest, _op1, _imm1, _imm2)
5467253Sgblack@eecs.umich.edu    {
5477253Sgblack@eecs.umich.edu        %(constructor)s;
5487848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
5497848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
5507848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
5517848SAli.Saidi@ARM.com            }
5527848SAli.Saidi@ARM.com        }
5537253Sgblack@eecs.umich.edu    }
5547253Sgblack@eecs.umich.edu}};
5557253Sgblack@eecs.umich.edu
5567232Sgblack@eecs.umich.edudef template RegImmRegOpDeclare {{
5577225Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
5587225Sgblack@eecs.umich.edu{
5597225Sgblack@eecs.umich.edu  protected:
5607225Sgblack@eecs.umich.edu    public:
5617225Sgblack@eecs.umich.edu        // Constructor
5627225Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
5637330Sgblack@eecs.umich.edu                       IntRegIndex _dest, uint64_t _imm, IntRegIndex _op1);
56412616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
5657225Sgblack@eecs.umich.edu};
5667225Sgblack@eecs.umich.edu}};
5677225Sgblack@eecs.umich.edu
5687232Sgblack@eecs.umich.edudef template RegImmRegOpConstructor {{
56910184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
5707225Sgblack@eecs.umich.edu                                          IntRegIndex _dest,
5717330Sgblack@eecs.umich.edu                                          uint64_t _imm,
5727225Sgblack@eecs.umich.edu                                          IntRegIndex _op1)
5737225Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
5747232Sgblack@eecs.umich.edu                         _dest, _imm, _op1)
5757225Sgblack@eecs.umich.edu    {
5767225Sgblack@eecs.umich.edu        %(constructor)s;
5777848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
5787848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
5797848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
5807848SAli.Saidi@ARM.com            }
5817848SAli.Saidi@ARM.com        }
5827225Sgblack@eecs.umich.edu    }
5837225Sgblack@eecs.umich.edu}};
5847225Sgblack@eecs.umich.edu
5857232Sgblack@eecs.umich.edudef template RegImmRegShiftOpDeclare {{
5867225Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
5877225Sgblack@eecs.umich.edu{
5887225Sgblack@eecs.umich.edu  protected:
5897225Sgblack@eecs.umich.edu    public:
5907225Sgblack@eecs.umich.edu        // Constructor
5917225Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
5927330Sgblack@eecs.umich.edu                       IntRegIndex _dest, uint64_t _imm, IntRegIndex _op1,
5937225Sgblack@eecs.umich.edu                       int32_t _shiftAmt, ArmShiftType _shiftType);
59412616Sgabeblack@google.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
5957225Sgblack@eecs.umich.edu};
5967225Sgblack@eecs.umich.edu}};
5977225Sgblack@eecs.umich.edu
5987232Sgblack@eecs.umich.edudef template RegImmRegShiftOpConstructor {{
59910184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
6007225Sgblack@eecs.umich.edu                                          IntRegIndex _dest,
6017330Sgblack@eecs.umich.edu                                          uint64_t _imm,
6027225Sgblack@eecs.umich.edu                                          IntRegIndex _op1,
6037225Sgblack@eecs.umich.edu                                          int32_t _shiftAmt,
6047225Sgblack@eecs.umich.edu                                          ArmShiftType _shiftType)
6057225Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
6067232Sgblack@eecs.umich.edu                         _dest, _imm, _op1, _shiftAmt, _shiftType)
6077225Sgblack@eecs.umich.edu    {
6087225Sgblack@eecs.umich.edu        %(constructor)s;
6097848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
6107848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
6117848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
6127848SAli.Saidi@ARM.com            }
6137848SAli.Saidi@ARM.com        }
6147225Sgblack@eecs.umich.edu    }
6157225Sgblack@eecs.umich.edu}};
6167609SGene.Wu@arm.com
61712358Snikos.nikoleris@arm.comdef template MiscRegRegImmMemOpDeclare {{
61812358Snikos.nikoleris@arm.com    class %(class_name)s : public %(base_class)s
61912358Snikos.nikoleris@arm.com    {
62012358Snikos.nikoleris@arm.com    protected:
62112358Snikos.nikoleris@arm.com    public:
62212358Snikos.nikoleris@arm.com      // Constructor
62312358Snikos.nikoleris@arm.com      %(class_name)s(ExtMachInst machInst,
62412358Snikos.nikoleris@arm.com                     MiscRegIndex _dest, IntRegIndex _op1,
62512358Snikos.nikoleris@arm.com                     uint64_t _imm);
62612616Sgabeblack@google.com      Fault execute(ExecContext *, Trace::InstRecord *) const override;
62712616Sgabeblack@google.com      Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override;
62812616Sgabeblack@google.com      Fault completeAcc(PacketPtr, ExecContext *,
62912616Sgabeblack@google.com                        Trace::InstRecord *) const override;
63012358Snikos.nikoleris@arm.com    };
63112358Snikos.nikoleris@arm.com}};
63212358Snikos.nikoleris@arm.com
63312358Snikos.nikoleris@arm.comdef template Mcr15Execute {{
63412358Snikos.nikoleris@arm.com    Fault %(class_name)s::execute(ExecContext *xc,
63512358Snikos.nikoleris@arm.com                                  Trace::InstRecord *traceData) const
63612358Snikos.nikoleris@arm.com    {
63712358Snikos.nikoleris@arm.com        Addr EA;
63812358Snikos.nikoleris@arm.com        Fault fault = NoFault;
63912358Snikos.nikoleris@arm.com
64012358Snikos.nikoleris@arm.com        %(op_decl)s;
64112358Snikos.nikoleris@arm.com        %(op_rd)s;
64212358Snikos.nikoleris@arm.com        %(ea_code)s;
64312358Snikos.nikoleris@arm.com
64412358Snikos.nikoleris@arm.com        if (%(predicate_test)s) {
64512358Snikos.nikoleris@arm.com            if (fault == NoFault) {
64612358Snikos.nikoleris@arm.com                %(memacc_code)s;
64712358Snikos.nikoleris@arm.com            }
64812358Snikos.nikoleris@arm.com
64912358Snikos.nikoleris@arm.com            if (fault == NoFault) {
65012503Snikos.nikoleris@arm.com                Addr op_size = xc->tcBase()->getSystemPtr()->cacheLineSize();
65112503Snikos.nikoleris@arm.com                EA &= ~(op_size - 1);
65212503Snikos.nikoleris@arm.com                fault = xc->writeMem(NULL, op_size, EA, memAccessFlags, NULL);
65312358Snikos.nikoleris@arm.com            }
65412358Snikos.nikoleris@arm.com        } else {
65512358Snikos.nikoleris@arm.com            xc->setPredicate(false);
65612358Snikos.nikoleris@arm.com        }
65712358Snikos.nikoleris@arm.com
65812358Snikos.nikoleris@arm.com        return fault;
65912358Snikos.nikoleris@arm.com    }
66012358Snikos.nikoleris@arm.com}};
66112358Snikos.nikoleris@arm.com
66212358Snikos.nikoleris@arm.comdef template Mcr15InitiateAcc {{
66312358Snikos.nikoleris@arm.com    Fault %(class_name)s::initiateAcc(ExecContext *xc,
66412358Snikos.nikoleris@arm.com                                      Trace::InstRecord *traceData) const
66512358Snikos.nikoleris@arm.com    {
66612358Snikos.nikoleris@arm.com        Addr EA;
66712358Snikos.nikoleris@arm.com        Fault fault = NoFault;
66812358Snikos.nikoleris@arm.com
66912358Snikos.nikoleris@arm.com        %(op_decl)s;
67012358Snikos.nikoleris@arm.com        %(op_rd)s;
67112358Snikos.nikoleris@arm.com        %(ea_code)s;
67212358Snikos.nikoleris@arm.com
67312358Snikos.nikoleris@arm.com        if (%(predicate_test)s) {
67412358Snikos.nikoleris@arm.com            if (fault == NoFault) {
67512358Snikos.nikoleris@arm.com                %(memacc_code)s;
67612358Snikos.nikoleris@arm.com            }
67712358Snikos.nikoleris@arm.com
67812358Snikos.nikoleris@arm.com            if (fault == NoFault) {
67912503Snikos.nikoleris@arm.com                Addr op_size = xc->tcBase()->getSystemPtr()->cacheLineSize();
68012503Snikos.nikoleris@arm.com                EA &= ~(op_size - 1);
68112503Snikos.nikoleris@arm.com                fault = xc->writeMem(NULL, op_size, EA, memAccessFlags, NULL);
68212358Snikos.nikoleris@arm.com            }
68312358Snikos.nikoleris@arm.com        } else {
68412358Snikos.nikoleris@arm.com            xc->setPredicate(false);
68512358Snikos.nikoleris@arm.com        }
68612358Snikos.nikoleris@arm.com
68712358Snikos.nikoleris@arm.com        return fault;
68812358Snikos.nikoleris@arm.com    }
68912358Snikos.nikoleris@arm.com}};
69012358Snikos.nikoleris@arm.com
69112358Snikos.nikoleris@arm.comdef template Mcr15CompleteAcc {{
69212358Snikos.nikoleris@arm.com    Fault %(class_name)s::completeAcc(PacketPtr pkt,
69312358Snikos.nikoleris@arm.com                                      ExecContext *xc,
69412358Snikos.nikoleris@arm.com                                      Trace::InstRecord *traceData) const
69512358Snikos.nikoleris@arm.com    {
69612358Snikos.nikoleris@arm.com        return NoFault;
69712358Snikos.nikoleris@arm.com    }
69812358Snikos.nikoleris@arm.com}};
699