113759Sgiacomo.gabrielli@arm.com// Copyright (c) 2018-2019 ARM Limited
213759Sgiacomo.gabrielli@arm.com// All rights reserved
313759Sgiacomo.gabrielli@arm.com//
413759Sgiacomo.gabrielli@arm.com// The license below extends only to copyright in the software and shall
513759Sgiacomo.gabrielli@arm.com// not be construed as granting a license to any other intellectual
613759Sgiacomo.gabrielli@arm.com// property including but not limited to intellectual property relating
713759Sgiacomo.gabrielli@arm.com// to a hardware implementation of the functionality of the software
813759Sgiacomo.gabrielli@arm.com// licensed hereunder.  You may use the software subject to the license
913759Sgiacomo.gabrielli@arm.com// terms below provided that you ensure that this notice is replicated
1013759Sgiacomo.gabrielli@arm.com// unmodified and in its entirety in all distributions of the software,
1113759Sgiacomo.gabrielli@arm.com// modified or unmodified, in source code or in binary form.
1213759Sgiacomo.gabrielli@arm.com//
1313759Sgiacomo.gabrielli@arm.com// Redistribution and use in source and binary forms, with or without
1413759Sgiacomo.gabrielli@arm.com// modification, are permitted provided that the following conditions are
1513759Sgiacomo.gabrielli@arm.com// met: redistributions of source code must retain the above copyright
1613759Sgiacomo.gabrielli@arm.com// notice, this list of conditions and the following disclaimer;
1713759Sgiacomo.gabrielli@arm.com// redistributions in binary form must reproduce the above copyright
1813759Sgiacomo.gabrielli@arm.com// notice, this list of conditions and the following disclaimer in the
1913759Sgiacomo.gabrielli@arm.com// documentation and/or other materials provided with the distribution;
2013759Sgiacomo.gabrielli@arm.com// neither the name of the copyright holders nor the names of its
2113759Sgiacomo.gabrielli@arm.com// contributors may be used to endorse or promote products derived from
2213759Sgiacomo.gabrielli@arm.com// this software without specific prior written permission.
2313759Sgiacomo.gabrielli@arm.com//
2413759Sgiacomo.gabrielli@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2513759Sgiacomo.gabrielli@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2613759Sgiacomo.gabrielli@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2713759Sgiacomo.gabrielli@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2813759Sgiacomo.gabrielli@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2913759Sgiacomo.gabrielli@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3013759Sgiacomo.gabrielli@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3113759Sgiacomo.gabrielli@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3213759Sgiacomo.gabrielli@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3313759Sgiacomo.gabrielli@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3413759Sgiacomo.gabrielli@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3513759Sgiacomo.gabrielli@arm.com//
3613759Sgiacomo.gabrielli@arm.com// Authors: Giacomo Gabrielli
3713759Sgiacomo.gabrielli@arm.com
3813759Sgiacomo.gabrielli@arm.comlet {{
3913759Sgiacomo.gabrielli@arm.com    sveEnabledCheckCode = '''
4013759Sgiacomo.gabrielli@arm.com        if (FullSystem) {
4113955Sgiacomo.gabrielli@arm.com            fault = this->checkSveEnabled(xc->tcBase(), Cpsr, Cpacr64);
4213759Sgiacomo.gabrielli@arm.com            if (fault != NoFault) {
4313759Sgiacomo.gabrielli@arm.com                return fault;
4413759Sgiacomo.gabrielli@arm.com            }
4513759Sgiacomo.gabrielli@arm.com        }
4613759Sgiacomo.gabrielli@arm.com    '''
4713759Sgiacomo.gabrielli@arm.com}};
4813759Sgiacomo.gabrielli@arm.com
4913759Sgiacomo.gabrielli@arm.comdef template SveWideningUnaryPredOpDeclare {{
5013759Sgiacomo.gabrielli@arm.comtemplate <class _SElement, class _DElement>
5113759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
5213759Sgiacomo.gabrielli@arm.com{
5313759Sgiacomo.gabrielli@arm.com  protected:
5413759Sgiacomo.gabrielli@arm.com    typedef _SElement Element;
5513759Sgiacomo.gabrielli@arm.com    typedef _SElement SElement;
5613759Sgiacomo.gabrielli@arm.com    typedef _DElement DElement;
5713759Sgiacomo.gabrielli@arm.com    typedef _SElement TPSElem;
5813759Sgiacomo.gabrielli@arm.com    typedef _DElement TPDElem;
5913759Sgiacomo.gabrielli@arm.com  public:
6013759Sgiacomo.gabrielli@arm.com    // Constructor
6113759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
6213759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _gp)
6313759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
6413759Sgiacomo.gabrielli@arm.com                         _dest, _op1, _gp)
6513759Sgiacomo.gabrielli@arm.com    {
6613759Sgiacomo.gabrielli@arm.com        %(constructor)s;
6713759Sgiacomo.gabrielli@arm.com    }
6813759Sgiacomo.gabrielli@arm.com
6913759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
7013759Sgiacomo.gabrielli@arm.com};
7113759Sgiacomo.gabrielli@arm.com}};
7213759Sgiacomo.gabrielli@arm.com
7313759Sgiacomo.gabrielli@arm.comdef template SveUnaryPredOpDeclare {{
7413759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
7513759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
7613759Sgiacomo.gabrielli@arm.com{
7713759Sgiacomo.gabrielli@arm.com  protected:
7813759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
7913759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
8013759Sgiacomo.gabrielli@arm.com  public:
8113759Sgiacomo.gabrielli@arm.com    // Constructor
8213759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
8313759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _gp)
8413759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
8513759Sgiacomo.gabrielli@arm.com                         _dest, _op1, _gp)
8613759Sgiacomo.gabrielli@arm.com    {
8713759Sgiacomo.gabrielli@arm.com        %(constructor)s;
8813759Sgiacomo.gabrielli@arm.com    }
8913759Sgiacomo.gabrielli@arm.com
9013759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
9113759Sgiacomo.gabrielli@arm.com};
9213759Sgiacomo.gabrielli@arm.com}};
9313759Sgiacomo.gabrielli@arm.com
9413759Sgiacomo.gabrielli@arm.comdef template SveUnaryUnpredOpDeclare {{
9513759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
9613759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
9713759Sgiacomo.gabrielli@arm.com{
9813759Sgiacomo.gabrielli@arm.com  protected:
9913759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
10013759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
10113759Sgiacomo.gabrielli@arm.com  public:
10213759Sgiacomo.gabrielli@arm.com    // Constructor
10313759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
10413759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, IntRegIndex _op1)
10513759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
10613759Sgiacomo.gabrielli@arm.com                         _dest, _op1)
10713759Sgiacomo.gabrielli@arm.com    {
10813759Sgiacomo.gabrielli@arm.com        %(constructor)s;
10913759Sgiacomo.gabrielli@arm.com    }
11013759Sgiacomo.gabrielli@arm.com
11113759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
11213759Sgiacomo.gabrielli@arm.com};
11313759Sgiacomo.gabrielli@arm.com}};
11413759Sgiacomo.gabrielli@arm.com
11513759Sgiacomo.gabrielli@arm.comdef template SveShiftAndInsertOpDeclare {{
11613759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
11713759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
11813759Sgiacomo.gabrielli@arm.com{
11913759Sgiacomo.gabrielli@arm.com  protected:
12013759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
12113759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
12213759Sgiacomo.gabrielli@arm.com  public:
12313759Sgiacomo.gabrielli@arm.com    // Constructor
12413759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
12513759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, IntRegIndex _op1)
12613759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
12713759Sgiacomo.gabrielli@arm.com                         _dest, _op1, %(isSimdFp)s)
12813759Sgiacomo.gabrielli@arm.com    {
12913759Sgiacomo.gabrielli@arm.com        %(constructor)s;
13013759Sgiacomo.gabrielli@arm.com    }
13113759Sgiacomo.gabrielli@arm.com
13213759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
13313759Sgiacomo.gabrielli@arm.com};
13413759Sgiacomo.gabrielli@arm.com}};
13513759Sgiacomo.gabrielli@arm.com
13613759Sgiacomo.gabrielli@arm.comdef template SveWideImmUnpredOpDeclare {{
13713759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
13813759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
13913759Sgiacomo.gabrielli@arm.com{
14013759Sgiacomo.gabrielli@arm.com  protected:
14113759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
14213759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
14313759Sgiacomo.gabrielli@arm.com  public:
14413759Sgiacomo.gabrielli@arm.com    // Constructor
14513759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
14613759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, uint64_t _imm)
14713759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
14813759Sgiacomo.gabrielli@arm.com                         _dest, _imm)
14913759Sgiacomo.gabrielli@arm.com    {
15013759Sgiacomo.gabrielli@arm.com        %(constructor)s;
15113759Sgiacomo.gabrielli@arm.com    }
15213759Sgiacomo.gabrielli@arm.com
15313759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
15413759Sgiacomo.gabrielli@arm.com};
15513759Sgiacomo.gabrielli@arm.com}};
15613759Sgiacomo.gabrielli@arm.com
15713759Sgiacomo.gabrielli@arm.comdef template SveWideImmPredOpDeclare {{
15813759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
15913759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
16013759Sgiacomo.gabrielli@arm.com{
16113759Sgiacomo.gabrielli@arm.com  protected:
16213759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
16313759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
16413759Sgiacomo.gabrielli@arm.com  public:
16513759Sgiacomo.gabrielli@arm.com    // Constructor
16613759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
16713759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, uint64_t _imm, IntRegIndex _gp,
16813759Sgiacomo.gabrielli@arm.com                   bool _isMerging = true)
16913759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
17013759Sgiacomo.gabrielli@arm.com                         _dest, _imm, _gp, _isMerging)
17113759Sgiacomo.gabrielli@arm.com    {
17213759Sgiacomo.gabrielli@arm.com        %(constructor)s;
17313759Sgiacomo.gabrielli@arm.com    }
17413759Sgiacomo.gabrielli@arm.com
17513759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
17613759Sgiacomo.gabrielli@arm.com};
17713759Sgiacomo.gabrielli@arm.com}};
17813759Sgiacomo.gabrielli@arm.com
17913759Sgiacomo.gabrielli@arm.comdef template SveBinImmUnpredOpDeclare {{
18013759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
18113759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
18213759Sgiacomo.gabrielli@arm.com{
18313759Sgiacomo.gabrielli@arm.com  protected:
18413759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
18513759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
18613759Sgiacomo.gabrielli@arm.com  public:
18713759Sgiacomo.gabrielli@arm.com    // Constructor
18813759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
18913759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, IntRegIndex _op1, uint64_t _imm)
19013759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
19113759Sgiacomo.gabrielli@arm.com                         _dest, _op1, _imm)
19213759Sgiacomo.gabrielli@arm.com    {
19313759Sgiacomo.gabrielli@arm.com        %(constructor)s;
19413759Sgiacomo.gabrielli@arm.com    }
19513759Sgiacomo.gabrielli@arm.com
19613759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
19713759Sgiacomo.gabrielli@arm.com};
19813759Sgiacomo.gabrielli@arm.com}};
19913759Sgiacomo.gabrielli@arm.com
20013759Sgiacomo.gabrielli@arm.comdef template SveBinImmPredOpDeclare {{
20113759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
20213759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
20313759Sgiacomo.gabrielli@arm.com{
20413759Sgiacomo.gabrielli@arm.com  protected:
20513759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
20613759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
20713759Sgiacomo.gabrielli@arm.com  public:
20813759Sgiacomo.gabrielli@arm.com    // Constructor
20913759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
21013759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, uint64_t _imm, IntRegIndex _gp)
21113759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
21213759Sgiacomo.gabrielli@arm.com                         _dest, _imm, _gp)
21313759Sgiacomo.gabrielli@arm.com    {
21413759Sgiacomo.gabrielli@arm.com        %(constructor)s;
21513759Sgiacomo.gabrielli@arm.com    }
21613759Sgiacomo.gabrielli@arm.com
21713759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
21813759Sgiacomo.gabrielli@arm.com};
21913759Sgiacomo.gabrielli@arm.com}};
22013759Sgiacomo.gabrielli@arm.com
22113759Sgiacomo.gabrielli@arm.comdef template SveBinDestrPredOpDeclare {{
22213759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
22313759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
22413759Sgiacomo.gabrielli@arm.com{
22513759Sgiacomo.gabrielli@arm.com  protected:
22613759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
22713759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
22813759Sgiacomo.gabrielli@arm.com  public:
22913759Sgiacomo.gabrielli@arm.com    // Constructor
23013759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
23113759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, IntRegIndex _op2, IntRegIndex _gp)
23213759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
23313759Sgiacomo.gabrielli@arm.com                         _dest, _op2, _gp)
23413759Sgiacomo.gabrielli@arm.com    {
23513759Sgiacomo.gabrielli@arm.com        %(constructor)s;
23613759Sgiacomo.gabrielli@arm.com    }
23713759Sgiacomo.gabrielli@arm.com
23813759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
23913759Sgiacomo.gabrielli@arm.com};
24013759Sgiacomo.gabrielli@arm.com}};
24113759Sgiacomo.gabrielli@arm.com
24213759Sgiacomo.gabrielli@arm.comdef template SveBinConstrPredOpDeclare {{
24313759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
24413759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
24513759Sgiacomo.gabrielli@arm.com{
24613759Sgiacomo.gabrielli@arm.com  protected:
24713759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
24813759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
24913759Sgiacomo.gabrielli@arm.com  public:
25013759Sgiacomo.gabrielli@arm.com    // Constructor
25113759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
25213759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2,
25313759Sgiacomo.gabrielli@arm.com                   IntRegIndex _gp, SvePredType _predType)
25413759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
25513759Sgiacomo.gabrielli@arm.com                         _dest, _op1, _op2, _gp, _predType)
25613759Sgiacomo.gabrielli@arm.com    {
25713759Sgiacomo.gabrielli@arm.com        %(constructor)s;
25813759Sgiacomo.gabrielli@arm.com    }
25913759Sgiacomo.gabrielli@arm.com
26013759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
26113759Sgiacomo.gabrielli@arm.com};
26213759Sgiacomo.gabrielli@arm.com}};
26313759Sgiacomo.gabrielli@arm.com
26413759Sgiacomo.gabrielli@arm.comdef template SveBinUnpredOpDeclare {{
26513759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
26613759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
26713759Sgiacomo.gabrielli@arm.com{
26813759Sgiacomo.gabrielli@arm.com  protected:
26913759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
27013759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
27113759Sgiacomo.gabrielli@arm.com  public:
27213759Sgiacomo.gabrielli@arm.com    // Constructor
27313759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
27413759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2)
27513759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
27613759Sgiacomo.gabrielli@arm.com                         _dest, _op1, _op2)
27713759Sgiacomo.gabrielli@arm.com    {
27813759Sgiacomo.gabrielli@arm.com        %(constructor)s;
27913759Sgiacomo.gabrielli@arm.com    }
28013759Sgiacomo.gabrielli@arm.com
28113759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
28213759Sgiacomo.gabrielli@arm.com};
28313759Sgiacomo.gabrielli@arm.com}};
28413759Sgiacomo.gabrielli@arm.com
28513759Sgiacomo.gabrielli@arm.comdef template SveBinIdxUnpredOpDeclare {{
28613759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
28713759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
28813759Sgiacomo.gabrielli@arm.com{
28913759Sgiacomo.gabrielli@arm.com  protected:
29013759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
29113759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
29213759Sgiacomo.gabrielli@arm.com  public:
29313759Sgiacomo.gabrielli@arm.com    // Constructor
29413759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
29513759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2,
29613759Sgiacomo.gabrielli@arm.com                   uint8_t _index)
29713759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
29813759Sgiacomo.gabrielli@arm.com                         _dest, _op1, _op2, _index)
29913759Sgiacomo.gabrielli@arm.com    {
30013759Sgiacomo.gabrielli@arm.com        %(constructor)s;
30113759Sgiacomo.gabrielli@arm.com    }
30213759Sgiacomo.gabrielli@arm.com
30313759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
30413759Sgiacomo.gabrielli@arm.com};
30513759Sgiacomo.gabrielli@arm.com}};
30613759Sgiacomo.gabrielli@arm.com
30713759Sgiacomo.gabrielli@arm.comdef template SvePredLogicalOpDeclare {{
30813759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
30913759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
31013759Sgiacomo.gabrielli@arm.com{
31113759Sgiacomo.gabrielli@arm.com  protected:
31213759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
31313759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
31413759Sgiacomo.gabrielli@arm.com  public:
31513759Sgiacomo.gabrielli@arm.com    // Constructor
31613759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
31713759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2,
31813759Sgiacomo.gabrielli@arm.com                   IntRegIndex _gp, bool _isSel = false)
31913759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
32013759Sgiacomo.gabrielli@arm.com                         _dest, _op1, _op2, _gp, _isSel)
32113759Sgiacomo.gabrielli@arm.com    {
32213759Sgiacomo.gabrielli@arm.com        %(constructor)s;
32313759Sgiacomo.gabrielli@arm.com    }
32413759Sgiacomo.gabrielli@arm.com
32513759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
32613759Sgiacomo.gabrielli@arm.com};
32713759Sgiacomo.gabrielli@arm.com}};
32813759Sgiacomo.gabrielli@arm.com
32913759Sgiacomo.gabrielli@arm.comdef template SveCmpOpDeclare {{
33013759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
33113759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
33213759Sgiacomo.gabrielli@arm.com{
33313759Sgiacomo.gabrielli@arm.com  protected:
33413759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
33513759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
33613759Sgiacomo.gabrielli@arm.com  public:
33713759Sgiacomo.gabrielli@arm.com    // Constructor
33813759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
33913759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2,
34013759Sgiacomo.gabrielli@arm.com                   IntRegIndex _gp)
34113759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
34213759Sgiacomo.gabrielli@arm.com                         _dest, _op1, _op2, _gp)
34313759Sgiacomo.gabrielli@arm.com    {
34413759Sgiacomo.gabrielli@arm.com        %(constructor)s;
34513759Sgiacomo.gabrielli@arm.com    }
34613759Sgiacomo.gabrielli@arm.com
34713759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
34813759Sgiacomo.gabrielli@arm.com};
34913759Sgiacomo.gabrielli@arm.com}};
35013759Sgiacomo.gabrielli@arm.com
35113759Sgiacomo.gabrielli@arm.comdef template SveIntCmpOpDeclare {{
35213759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
35313759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
35413759Sgiacomo.gabrielli@arm.com{
35513759Sgiacomo.gabrielli@arm.com  protected:
35613759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
35713759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
35813759Sgiacomo.gabrielli@arm.com  public:
35913759Sgiacomo.gabrielli@arm.com    // Constructor
36013759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
36113759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2,
36213759Sgiacomo.gabrielli@arm.com                   IntRegIndex _gp)
36313759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
36413759Sgiacomo.gabrielli@arm.com                         _dest, _op1, _op2, _gp, %(op2IsWide)s)
36513759Sgiacomo.gabrielli@arm.com    {
36613759Sgiacomo.gabrielli@arm.com        %(constructor)s;
36713759Sgiacomo.gabrielli@arm.com    }
36813759Sgiacomo.gabrielli@arm.com
36913759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
37013759Sgiacomo.gabrielli@arm.com};
37113759Sgiacomo.gabrielli@arm.com}};
37213759Sgiacomo.gabrielli@arm.com
37313759Sgiacomo.gabrielli@arm.comdef template SveCmpImmOpDeclare {{
37413759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
37513759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
37613759Sgiacomo.gabrielli@arm.com{
37713759Sgiacomo.gabrielli@arm.com  protected:
37813759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
37913759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
38013759Sgiacomo.gabrielli@arm.com  public:
38113759Sgiacomo.gabrielli@arm.com    // Constructor
38213759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
38313759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, IntRegIndex _op1, uint64_t _imm,
38413759Sgiacomo.gabrielli@arm.com                   IntRegIndex _gp)
38513759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
38613759Sgiacomo.gabrielli@arm.com                         _dest, _op1, _imm, _gp)
38713759Sgiacomo.gabrielli@arm.com    {
38813759Sgiacomo.gabrielli@arm.com        %(constructor)s;
38913759Sgiacomo.gabrielli@arm.com    }
39013759Sgiacomo.gabrielli@arm.com
39113759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
39213759Sgiacomo.gabrielli@arm.com};
39313759Sgiacomo.gabrielli@arm.com}};
39413759Sgiacomo.gabrielli@arm.com
39513759Sgiacomo.gabrielli@arm.comdef template SveTerPredOpDeclare {{
39613759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
39713759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
39813759Sgiacomo.gabrielli@arm.com{
39913759Sgiacomo.gabrielli@arm.com  protected:
40013759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
40113759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
40213759Sgiacomo.gabrielli@arm.com  public:
40313759Sgiacomo.gabrielli@arm.com    // Constructor
40413759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
40513759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2,
40613759Sgiacomo.gabrielli@arm.com                   IntRegIndex _gp)
40713759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
40813759Sgiacomo.gabrielli@arm.com                         _dest, _op1, _op2, _gp)
40913759Sgiacomo.gabrielli@arm.com    {
41013759Sgiacomo.gabrielli@arm.com        %(constructor)s;
41113759Sgiacomo.gabrielli@arm.com    }
41213759Sgiacomo.gabrielli@arm.com
41313759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
41413759Sgiacomo.gabrielli@arm.com};
41513759Sgiacomo.gabrielli@arm.com}};
41613759Sgiacomo.gabrielli@arm.com
41713759Sgiacomo.gabrielli@arm.comdef template SveTerImmUnpredOpDeclare {{
41813759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
41913759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
42013759Sgiacomo.gabrielli@arm.com{
42113759Sgiacomo.gabrielli@arm.com  protected:
42213759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
42313759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
42413759Sgiacomo.gabrielli@arm.com  public:
42513759Sgiacomo.gabrielli@arm.com    // Constructor
42613759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
42713759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, IntRegIndex _op1, uint64_t _imm)
42813759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
42913759Sgiacomo.gabrielli@arm.com                         _dest, _op1, _imm)
43013759Sgiacomo.gabrielli@arm.com    {
43113759Sgiacomo.gabrielli@arm.com        %(constructor)s;
43213759Sgiacomo.gabrielli@arm.com    }
43313759Sgiacomo.gabrielli@arm.com
43413759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
43513759Sgiacomo.gabrielli@arm.com};
43613759Sgiacomo.gabrielli@arm.com}};
43713759Sgiacomo.gabrielli@arm.com
43813759Sgiacomo.gabrielli@arm.comdef template SveReducOpDeclare {{
43913759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
44013759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
44113759Sgiacomo.gabrielli@arm.com{
44213759Sgiacomo.gabrielli@arm.com  protected:
44313759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
44413759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
44513759Sgiacomo.gabrielli@arm.com  public:
44613759Sgiacomo.gabrielli@arm.com    // Constructor
44713759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
44813759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _gp)
44913759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
45013759Sgiacomo.gabrielli@arm.com                         _dest, _op1, _gp)
45113759Sgiacomo.gabrielli@arm.com    {
45213759Sgiacomo.gabrielli@arm.com        %(constructor)s;
45313759Sgiacomo.gabrielli@arm.com    }
45413759Sgiacomo.gabrielli@arm.com
45513759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
45613759Sgiacomo.gabrielli@arm.com};
45713759Sgiacomo.gabrielli@arm.com}};
45813759Sgiacomo.gabrielli@arm.com
45913759Sgiacomo.gabrielli@arm.comdef template SveWideningReducOpDeclare {{
46013759Sgiacomo.gabrielli@arm.comtemplate <class _SElement, class _DElement>
46113759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
46213759Sgiacomo.gabrielli@arm.com{
46313759Sgiacomo.gabrielli@arm.com  protected:
46413759Sgiacomo.gabrielli@arm.com    typedef _SElement Element;
46513759Sgiacomo.gabrielli@arm.com    typedef _SElement SElement;
46613759Sgiacomo.gabrielli@arm.com    typedef _DElement DElement;
46713759Sgiacomo.gabrielli@arm.com    typedef _SElement TPSElem;
46813759Sgiacomo.gabrielli@arm.com    typedef _DElement TPDElem;
46913759Sgiacomo.gabrielli@arm.com
47013759Sgiacomo.gabrielli@arm.com  public:
47113759Sgiacomo.gabrielli@arm.com    // Constructor
47213759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
47313759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _gp)
47413759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
47513759Sgiacomo.gabrielli@arm.com                         _dest, _op1, _gp)
47613759Sgiacomo.gabrielli@arm.com    {
47713759Sgiacomo.gabrielli@arm.com        %(constructor)s;
47813759Sgiacomo.gabrielli@arm.com    }
47913759Sgiacomo.gabrielli@arm.com
48013759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
48113759Sgiacomo.gabrielli@arm.com};
48213759Sgiacomo.gabrielli@arm.com}};
48313759Sgiacomo.gabrielli@arm.com
48413759Sgiacomo.gabrielli@arm.comdef template SveIndexIIOpDeclare {{
48513759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
48613759Sgiacomo.gabrielli@arm.comclass SveIndexII : public SveIndexIIOp
48713759Sgiacomo.gabrielli@arm.com{
48813759Sgiacomo.gabrielli@arm.com  protected:
48913759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
49013759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
49113759Sgiacomo.gabrielli@arm.com  public:
49213759Sgiacomo.gabrielli@arm.com    // Constructor
49313759Sgiacomo.gabrielli@arm.com    SveIndexII(ExtMachInst machInst,
49413759Sgiacomo.gabrielli@arm.com            IntRegIndex _dest, int8_t _imm1, int8_t _imm2)
49513759Sgiacomo.gabrielli@arm.com        : SveIndexIIOp("%(mnemonic)s", machInst, %(op_class)s,
49613759Sgiacomo.gabrielli@arm.com                _dest, _imm1, _imm2)
49713759Sgiacomo.gabrielli@arm.com    {
49813759Sgiacomo.gabrielli@arm.com        %(constructor)s;
49913759Sgiacomo.gabrielli@arm.com    }
50013759Sgiacomo.gabrielli@arm.com
50113759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
50213759Sgiacomo.gabrielli@arm.com};
50313759Sgiacomo.gabrielli@arm.com}};
50413759Sgiacomo.gabrielli@arm.com
50513759Sgiacomo.gabrielli@arm.comdef template SveIndexIROpDeclare {{
50613759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
50713759Sgiacomo.gabrielli@arm.comclass SveIndexIR : public SveIndexIROp
50813759Sgiacomo.gabrielli@arm.com{
50913759Sgiacomo.gabrielli@arm.com  protected:
51013759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
51113759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
51213759Sgiacomo.gabrielli@arm.com  public:
51313759Sgiacomo.gabrielli@arm.com    // Constructor
51413759Sgiacomo.gabrielli@arm.com    SveIndexIR(ExtMachInst machInst,
51513759Sgiacomo.gabrielli@arm.com            IntRegIndex _dest, int8_t _imm, IntRegIndex _op)
51613759Sgiacomo.gabrielli@arm.com        : SveIndexIROp("%(mnemonic)s", machInst, %(op_class)s,
51713759Sgiacomo.gabrielli@arm.com                _dest, _imm, _op)
51813759Sgiacomo.gabrielli@arm.com    {
51913759Sgiacomo.gabrielli@arm.com        %(constructor)s;
52013759Sgiacomo.gabrielli@arm.com    }
52113759Sgiacomo.gabrielli@arm.com
52213759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
52313759Sgiacomo.gabrielli@arm.com};
52413759Sgiacomo.gabrielli@arm.com}};
52513759Sgiacomo.gabrielli@arm.com
52613759Sgiacomo.gabrielli@arm.comdef template SveIndexRIOpDeclare {{
52713759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
52813759Sgiacomo.gabrielli@arm.comclass SveIndexRI : public SveIndexRIOp
52913759Sgiacomo.gabrielli@arm.com{
53013759Sgiacomo.gabrielli@arm.com  protected:
53113759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
53213759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
53313759Sgiacomo.gabrielli@arm.com  public:
53413759Sgiacomo.gabrielli@arm.com    // Constructor
53513759Sgiacomo.gabrielli@arm.com    SveIndexRI(ExtMachInst machInst,
53613759Sgiacomo.gabrielli@arm.com            IntRegIndex _dest, IntRegIndex _op, int8_t _imm)
53713759Sgiacomo.gabrielli@arm.com        : SveIndexRIOp("%(mnemonic)s", machInst, %(op_class)s,
53813759Sgiacomo.gabrielli@arm.com                _dest, _op, _imm)
53913759Sgiacomo.gabrielli@arm.com    {
54013759Sgiacomo.gabrielli@arm.com        %(constructor)s;
54113759Sgiacomo.gabrielli@arm.com    }
54213759Sgiacomo.gabrielli@arm.com
54313759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
54413759Sgiacomo.gabrielli@arm.com};
54513759Sgiacomo.gabrielli@arm.com}};
54613759Sgiacomo.gabrielli@arm.com
54713759Sgiacomo.gabrielli@arm.comdef template SveIndexRROpDeclare {{
54813759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
54913759Sgiacomo.gabrielli@arm.comclass SveIndexRR : public SveIndexRROp
55013759Sgiacomo.gabrielli@arm.com{
55113759Sgiacomo.gabrielli@arm.com  protected:
55213759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
55313759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
55413759Sgiacomo.gabrielli@arm.com  public:
55513759Sgiacomo.gabrielli@arm.com    // Constructor
55613759Sgiacomo.gabrielli@arm.com    SveIndexRR(ExtMachInst machInst,
55713759Sgiacomo.gabrielli@arm.com            IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2)
55813759Sgiacomo.gabrielli@arm.com        : SveIndexRROp("%(mnemonic)s", machInst, %(op_class)s,
55913759Sgiacomo.gabrielli@arm.com                _dest, _op1, _op2)
56013759Sgiacomo.gabrielli@arm.com    {
56113759Sgiacomo.gabrielli@arm.com        %(constructor)s;
56213759Sgiacomo.gabrielli@arm.com    }
56313759Sgiacomo.gabrielli@arm.com
56413759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
56513759Sgiacomo.gabrielli@arm.com};
56613759Sgiacomo.gabrielli@arm.com}};
56713759Sgiacomo.gabrielli@arm.com
56813759Sgiacomo.gabrielli@arm.comdef template SvePredCountOpDeclare {{
56913759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
57013759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
57113759Sgiacomo.gabrielli@arm.com{
57213759Sgiacomo.gabrielli@arm.com  protected:
57313759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
57413759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
57513759Sgiacomo.gabrielli@arm.com  public:
57613759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst, IntRegIndex _dest,
57713759Sgiacomo.gabrielli@arm.com            IntRegIndex _op1)
57813759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
57913759Sgiacomo.gabrielli@arm.com                _dest, _op1, %(srcIs32b)s, %(destIsVec)s)
58013759Sgiacomo.gabrielli@arm.com    {
58113759Sgiacomo.gabrielli@arm.com        %(constructor)s;
58213759Sgiacomo.gabrielli@arm.com    }
58313759Sgiacomo.gabrielli@arm.com
58413759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
58513759Sgiacomo.gabrielli@arm.com};
58613759Sgiacomo.gabrielli@arm.com}};
58713759Sgiacomo.gabrielli@arm.com
58813759Sgiacomo.gabrielli@arm.comdef template SvePredCountPredOpDeclare {{
58913759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
59013759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
59113759Sgiacomo.gabrielli@arm.com{
59213759Sgiacomo.gabrielli@arm.com  protected:
59313759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
59413759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
59513759Sgiacomo.gabrielli@arm.com  public:
59613759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst, IntRegIndex _dest,
59713759Sgiacomo.gabrielli@arm.com            IntRegIndex _op1, IntRegIndex _gp)
59813759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
59913759Sgiacomo.gabrielli@arm.com                _dest, _op1, _gp)
60013759Sgiacomo.gabrielli@arm.com    {
60113759Sgiacomo.gabrielli@arm.com        %(constructor)s;
60213759Sgiacomo.gabrielli@arm.com    }
60313759Sgiacomo.gabrielli@arm.com
60413759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
60513759Sgiacomo.gabrielli@arm.com};
60613759Sgiacomo.gabrielli@arm.com
60713759Sgiacomo.gabrielli@arm.com}};
60813759Sgiacomo.gabrielli@arm.com
60913759Sgiacomo.gabrielli@arm.comdef template SvePtrueOpDeclare {{
61013759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
61113759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
61213759Sgiacomo.gabrielli@arm.com{
61313759Sgiacomo.gabrielli@arm.com  protected:
61413759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
61513759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
61613759Sgiacomo.gabrielli@arm.com  public:
61713759Sgiacomo.gabrielli@arm.com    // Constructor
61813759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
61913759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, uint8_t _imm)
62013759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
62113759Sgiacomo.gabrielli@arm.com                         _dest, _imm)
62213759Sgiacomo.gabrielli@arm.com    {
62313759Sgiacomo.gabrielli@arm.com        %(constructor)s;
62413759Sgiacomo.gabrielli@arm.com    }
62513759Sgiacomo.gabrielli@arm.com
62613759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
62713759Sgiacomo.gabrielli@arm.com};
62813759Sgiacomo.gabrielli@arm.com}};
62913759Sgiacomo.gabrielli@arm.com
63013759Sgiacomo.gabrielli@arm.comdef template SveAdrOpDeclare {{
63113759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
63213759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
63313759Sgiacomo.gabrielli@arm.com{
63413759Sgiacomo.gabrielli@arm.com  protected:
63513759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
63613759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
63713759Sgiacomo.gabrielli@arm.com  public:
63813759Sgiacomo.gabrielli@arm.com    // Constructor
63913759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
64013759Sgiacomo.gabrielli@arm.com        IntRegIndex _dest, IntRegIndex _base, IntRegIndex _offset,
64113759Sgiacomo.gabrielli@arm.com        uint8_t _mult, SveAdrOffsetFormat _offsetFormat)
64213759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
64313759Sgiacomo.gabrielli@arm.com            _dest, _base, _offset, _mult, _offsetFormat)
64413759Sgiacomo.gabrielli@arm.com    {
64513759Sgiacomo.gabrielli@arm.com        %(constructor)s;
64613759Sgiacomo.gabrielli@arm.com    }
64713759Sgiacomo.gabrielli@arm.com
64813759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
64913759Sgiacomo.gabrielli@arm.com};
65013759Sgiacomo.gabrielli@arm.com}};
65113759Sgiacomo.gabrielli@arm.com
65213759Sgiacomo.gabrielli@arm.comdef template SveWhileOpDeclare {{
65313759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
65413759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
65513759Sgiacomo.gabrielli@arm.com{
65613759Sgiacomo.gabrielli@arm.com  protected:
65713759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
65813759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
65913759Sgiacomo.gabrielli@arm.com  public:
66013759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst, IntRegIndex _dest,
66113759Sgiacomo.gabrielli@arm.com                   IntRegIndex _op1, IntRegIndex _op2)
66213759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
66313759Sgiacomo.gabrielli@arm.com                         _dest, _op1, _op2, %(srcIs32b)s)
66413759Sgiacomo.gabrielli@arm.com    {
66513759Sgiacomo.gabrielli@arm.com        %(constructor)s;
66613759Sgiacomo.gabrielli@arm.com    }
66713759Sgiacomo.gabrielli@arm.com
66813759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
66913759Sgiacomo.gabrielli@arm.com};
67013759Sgiacomo.gabrielli@arm.com}};
67113759Sgiacomo.gabrielli@arm.com
67213759Sgiacomo.gabrielli@arm.comdef template SveCompTermOpDeclare {{
67313759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
67413759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
67513759Sgiacomo.gabrielli@arm.com{
67613759Sgiacomo.gabrielli@arm.com  protected:
67713759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
67813759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
67913759Sgiacomo.gabrielli@arm.com  public:
68013759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst, IntRegIndex _op1, IntRegIndex _op2)
68113759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _op1, _op2)
68213759Sgiacomo.gabrielli@arm.com    {
68313759Sgiacomo.gabrielli@arm.com        %(constructor)s;
68413759Sgiacomo.gabrielli@arm.com    }
68513759Sgiacomo.gabrielli@arm.com
68613759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
68713759Sgiacomo.gabrielli@arm.com};
68813759Sgiacomo.gabrielli@arm.com}};
68913759Sgiacomo.gabrielli@arm.com
69013759Sgiacomo.gabrielli@arm.comdef template SveIntCmpImmOpDeclare {{
69113759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
69213759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
69313759Sgiacomo.gabrielli@arm.com{
69413759Sgiacomo.gabrielli@arm.com  protected:
69513759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
69613759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
69713759Sgiacomo.gabrielli@arm.com  public:
69813759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst, IntRegIndex _dest, IntRegIndex _op1,
69913759Sgiacomo.gabrielli@arm.com            int64_t _op2, IntRegIndex _gp)
70013759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest, _op1,
70113759Sgiacomo.gabrielli@arm.com                _op2, _gp)
70213759Sgiacomo.gabrielli@arm.com    {
70313759Sgiacomo.gabrielli@arm.com        %(constructor)s;
70413759Sgiacomo.gabrielli@arm.com    }
70513759Sgiacomo.gabrielli@arm.com
70613759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
70713759Sgiacomo.gabrielli@arm.com};
70813759Sgiacomo.gabrielli@arm.com}};
70913759Sgiacomo.gabrielli@arm.com
71013759Sgiacomo.gabrielli@arm.comdef template SveElemCountOpDeclare {{
71113759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
71213759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
71313759Sgiacomo.gabrielli@arm.com{
71413759Sgiacomo.gabrielli@arm.com  protected:
71513759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
71613759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
71713759Sgiacomo.gabrielli@arm.com  public:
71813759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst, IntRegIndex _dest,
71913759Sgiacomo.gabrielli@arm.com            uint8_t _pattern, uint8_t _imm)
72013759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest,
72113759Sgiacomo.gabrielli@arm.com                _pattern, _imm, %(dstIsVec)s, %(dstIs32b)s)
72213759Sgiacomo.gabrielli@arm.com    {
72313759Sgiacomo.gabrielli@arm.com        %(constructor)s;
72413759Sgiacomo.gabrielli@arm.com        esize = sizeof(Element);
72513759Sgiacomo.gabrielli@arm.com    }
72613759Sgiacomo.gabrielli@arm.com
72713759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
72813759Sgiacomo.gabrielli@arm.com};
72913759Sgiacomo.gabrielli@arm.com}};
73013759Sgiacomo.gabrielli@arm.com
73113759Sgiacomo.gabrielli@arm.comdef template SvePartBrkOpDeclare {{
73213759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
73313759Sgiacomo.gabrielli@arm.com{
73413759Sgiacomo.gabrielli@arm.com  public:
73513759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst, IntRegIndex _dest, IntRegIndex _gp,
73613759Sgiacomo.gabrielli@arm.com            IntRegIndex _op1)
73713759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest,
73813759Sgiacomo.gabrielli@arm.com                _gp, _op1, %(isMerging)s)
73913759Sgiacomo.gabrielli@arm.com    {
74013759Sgiacomo.gabrielli@arm.com        %(constructor)s;
74113759Sgiacomo.gabrielli@arm.com    }
74213759Sgiacomo.gabrielli@arm.com
74313759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
74413759Sgiacomo.gabrielli@arm.com};
74513759Sgiacomo.gabrielli@arm.com}};
74613759Sgiacomo.gabrielli@arm.com
74713759Sgiacomo.gabrielli@arm.comdef template SvePartBrkPropOpDeclare {{
74813759Sgiacomo.gabrielli@arm.com// XXX: Might be done with SveTerPredOpDeclare and
74913759Sgiacomo.gabrielli@arm.com// instantiating with uint8_t
75013759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
75113759Sgiacomo.gabrielli@arm.com{
75213759Sgiacomo.gabrielli@arm.com  public:
75313759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst, IntRegIndex _dest,
75413759Sgiacomo.gabrielli@arm.com            IntRegIndex _op1, IntRegIndex _op2, IntRegIndex _gp)
75513759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest,
75613759Sgiacomo.gabrielli@arm.com                _op1, _op2, _gp)
75713759Sgiacomo.gabrielli@arm.com    {
75813759Sgiacomo.gabrielli@arm.com        %(constructor)s;
75913759Sgiacomo.gabrielli@arm.com    }
76013759Sgiacomo.gabrielli@arm.com
76113759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
76213759Sgiacomo.gabrielli@arm.com};
76313759Sgiacomo.gabrielli@arm.com}};
76413759Sgiacomo.gabrielli@arm.com
76513759Sgiacomo.gabrielli@arm.comdef template SveSelectOpDeclare {{
76613759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
76713759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
76813759Sgiacomo.gabrielli@arm.com{
76913759Sgiacomo.gabrielli@arm.com  protected:
77013759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
77113759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
77213759Sgiacomo.gabrielli@arm.com  public:
77313759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst, IntRegIndex _dest,
77413759Sgiacomo.gabrielli@arm.com            IntRegIndex _op1, IntRegIndex _gp)
77513759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest,
77613759Sgiacomo.gabrielli@arm.com                _op1, _gp, %(isCond)s, %(isScalar)s, %(isSimdFp)s)
77713759Sgiacomo.gabrielli@arm.com    {
77813759Sgiacomo.gabrielli@arm.com        %(constructor)s;
77913759Sgiacomo.gabrielli@arm.com        scalar_width = (sizeof(Element) == 8) ? 64 : 32;
78013759Sgiacomo.gabrielli@arm.com    }
78113759Sgiacomo.gabrielli@arm.com
78213759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
78313759Sgiacomo.gabrielli@arm.com};
78413759Sgiacomo.gabrielli@arm.com}};
78513759Sgiacomo.gabrielli@arm.com
78613759Sgiacomo.gabrielli@arm.comdef template SveUnpackOpDeclare {{
78713759Sgiacomo.gabrielli@arm.comtemplate <class _SElement, class _DElement>
78813759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
78913759Sgiacomo.gabrielli@arm.com{
79013759Sgiacomo.gabrielli@arm.com  protected:
79113759Sgiacomo.gabrielli@arm.com    typedef _SElement Element;
79213759Sgiacomo.gabrielli@arm.com    typedef _SElement SElement;
79313759Sgiacomo.gabrielli@arm.com    typedef _DElement DElement;
79413759Sgiacomo.gabrielli@arm.com    typedef _SElement TPSElem;
79513759Sgiacomo.gabrielli@arm.com    typedef _DElement TPDElem;
79613759Sgiacomo.gabrielli@arm.com  public:
79713759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
79813759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, IntRegIndex _op1)
79913759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
80013759Sgiacomo.gabrielli@arm.com                         _dest, _op1)
80113759Sgiacomo.gabrielli@arm.com    {
80213759Sgiacomo.gabrielli@arm.com        %(constructor)s;
80313759Sgiacomo.gabrielli@arm.com    }
80413759Sgiacomo.gabrielli@arm.com
80513759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
80613759Sgiacomo.gabrielli@arm.com};
80713759Sgiacomo.gabrielli@arm.com}};
80813759Sgiacomo.gabrielli@arm.com
80913759Sgiacomo.gabrielli@arm.comdef template SvePredicateTestOpDeclare {{
81013759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
81113759Sgiacomo.gabrielli@arm.com{
81213759Sgiacomo.gabrielli@arm.com  public:
81313759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst, IntRegIndex _op1, IntRegIndex _gp)
81413759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _op1, _gp)
81513759Sgiacomo.gabrielli@arm.com    {
81613759Sgiacomo.gabrielli@arm.com        %(constructor)s;
81713759Sgiacomo.gabrielli@arm.com    }
81813759Sgiacomo.gabrielli@arm.com
81913759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
82013759Sgiacomo.gabrielli@arm.com};
82113759Sgiacomo.gabrielli@arm.com}};
82213759Sgiacomo.gabrielli@arm.com
82313759Sgiacomo.gabrielli@arm.comdef template SvePredUnaryOpWImplicitSrcDeclare {{
82413759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
82513759Sgiacomo.gabrielli@arm.com{
82613759Sgiacomo.gabrielli@arm.com  public:
82713759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst, IntRegIndex _dest)
82813759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest)
82913759Sgiacomo.gabrielli@arm.com    {
83013759Sgiacomo.gabrielli@arm.com        %(constructor)s;
83113759Sgiacomo.gabrielli@arm.com    }
83213759Sgiacomo.gabrielli@arm.com
83313759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
83413759Sgiacomo.gabrielli@arm.com};
83513759Sgiacomo.gabrielli@arm.com}};
83613759Sgiacomo.gabrielli@arm.com
83713759Sgiacomo.gabrielli@arm.comdef template SvePredUnaryPredOpWImplicitSrcDeclare {{
83813759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
83913759Sgiacomo.gabrielli@arm.com{
84013759Sgiacomo.gabrielli@arm.com  public:
84113759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst, IntRegIndex _dest, IntRegIndex _gp)
84213759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest, _gp)
84313759Sgiacomo.gabrielli@arm.com    {
84413759Sgiacomo.gabrielli@arm.com        %(constructor)s;
84513759Sgiacomo.gabrielli@arm.com    }
84613759Sgiacomo.gabrielli@arm.com
84713759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
84813759Sgiacomo.gabrielli@arm.com};
84913759Sgiacomo.gabrielli@arm.com}};
85013759Sgiacomo.gabrielli@arm.com
85113759Sgiacomo.gabrielli@arm.comdef template SvePredUnaryOpWImplicitDstDeclare {{
85213759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
85313759Sgiacomo.gabrielli@arm.com{
85413759Sgiacomo.gabrielli@arm.com  public:
85513759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst, IntRegIndex _op1)
85613759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _op1)
85713759Sgiacomo.gabrielli@arm.com    {
85813759Sgiacomo.gabrielli@arm.com        %(constructor)s;
85913759Sgiacomo.gabrielli@arm.com    }
86013759Sgiacomo.gabrielli@arm.com
86113759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
86213759Sgiacomo.gabrielli@arm.com};
86313759Sgiacomo.gabrielli@arm.com}};
86413759Sgiacomo.gabrielli@arm.com
86513759Sgiacomo.gabrielli@arm.comdef template SveOpWImplicitSrcDstDeclare {{
86613759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
86713759Sgiacomo.gabrielli@arm.com{
86813759Sgiacomo.gabrielli@arm.com  public:
86913759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst)
87013759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s)
87113759Sgiacomo.gabrielli@arm.com    {
87213759Sgiacomo.gabrielli@arm.com        %(constructor)s;
87313759Sgiacomo.gabrielli@arm.com    }
87413759Sgiacomo.gabrielli@arm.com
87513759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
87613759Sgiacomo.gabrielli@arm.com};
87713759Sgiacomo.gabrielli@arm.com}};
87813759Sgiacomo.gabrielli@arm.com
87913759Sgiacomo.gabrielli@arm.comdef template SveWideningTerImmOpDeclare {{
88013759Sgiacomo.gabrielli@arm.comtemplate <class _SElement, class _DElement>
88113759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
88213759Sgiacomo.gabrielli@arm.com{
88313759Sgiacomo.gabrielli@arm.com  protected:
88413759Sgiacomo.gabrielli@arm.com    typedef _DElement Element;
88513759Sgiacomo.gabrielli@arm.com    typedef _SElement SElement;
88613759Sgiacomo.gabrielli@arm.com    typedef _DElement DElement;
88713759Sgiacomo.gabrielli@arm.com    typedef _SElement TPSElem;
88813759Sgiacomo.gabrielli@arm.com    typedef _DElement TPDElem;
88913759Sgiacomo.gabrielli@arm.com
89013759Sgiacomo.gabrielli@arm.com  public:
89113759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
89213759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2,
89313759Sgiacomo.gabrielli@arm.com                   uint64_t _imm)
89413759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
89513759Sgiacomo.gabrielli@arm.com                         _dest, _op1, _op2, _imm)
89613759Sgiacomo.gabrielli@arm.com    {
89713759Sgiacomo.gabrielli@arm.com        %(constructor)s;
89813759Sgiacomo.gabrielli@arm.com        esize = sizeof(Element);
89913759Sgiacomo.gabrielli@arm.com    }
90013759Sgiacomo.gabrielli@arm.com
90113759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
90213759Sgiacomo.gabrielli@arm.com};
90313759Sgiacomo.gabrielli@arm.com}};
90413759Sgiacomo.gabrielli@arm.com
90513759Sgiacomo.gabrielli@arm.comdef template SveWideningTerOpDeclare {{
90613759Sgiacomo.gabrielli@arm.comtemplate <class _SElement, class _DElement>
90713759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
90813759Sgiacomo.gabrielli@arm.com{
90913759Sgiacomo.gabrielli@arm.com  protected:
91013759Sgiacomo.gabrielli@arm.com    typedef _DElement Element;
91113759Sgiacomo.gabrielli@arm.com    typedef _SElement SElement;
91213759Sgiacomo.gabrielli@arm.com    typedef _DElement DElement;
91313759Sgiacomo.gabrielli@arm.com    typedef _SElement TPSElem;
91413759Sgiacomo.gabrielli@arm.com    typedef _DElement TPDElem;
91513759Sgiacomo.gabrielli@arm.com
91613759Sgiacomo.gabrielli@arm.com  public:
91713759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
91813759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2)
91913759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
92013759Sgiacomo.gabrielli@arm.com                         _dest, _op1, _op2)
92113759Sgiacomo.gabrielli@arm.com    {
92213759Sgiacomo.gabrielli@arm.com        %(constructor)s;
92313759Sgiacomo.gabrielli@arm.com        esize = sizeof(Element);
92413759Sgiacomo.gabrielli@arm.com    }
92513759Sgiacomo.gabrielli@arm.com
92613759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
92713759Sgiacomo.gabrielli@arm.com};
92813759Sgiacomo.gabrielli@arm.com}};
92913759Sgiacomo.gabrielli@arm.com
93013759Sgiacomo.gabrielli@arm.comdef template SveComplexOpDeclare {{
93113759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
93213759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
93313759Sgiacomo.gabrielli@arm.com{
93413759Sgiacomo.gabrielli@arm.com  protected:
93513759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
93613759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
93713759Sgiacomo.gabrielli@arm.com  public:
93813759Sgiacomo.gabrielli@arm.com    // Constructor
93913759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
94013759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2,
94113759Sgiacomo.gabrielli@arm.com                   IntRegIndex _gp, uint8_t _rot)
94213759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
94313759Sgiacomo.gabrielli@arm.com                         _dest, _op1, _op2, _gp, _rot)
94413759Sgiacomo.gabrielli@arm.com    {
94513759Sgiacomo.gabrielli@arm.com        %(constructor)s;
94613759Sgiacomo.gabrielli@arm.com    }
94713759Sgiacomo.gabrielli@arm.com
94813759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
94913759Sgiacomo.gabrielli@arm.com};
95013759Sgiacomo.gabrielli@arm.com}};
95113759Sgiacomo.gabrielli@arm.com
95213759Sgiacomo.gabrielli@arm.comdef template SveComplexIndexOpDeclare {{
95313759Sgiacomo.gabrielli@arm.comtemplate <class _Element>
95413759Sgiacomo.gabrielli@arm.comclass %(class_name)s : public %(base_class)s
95513759Sgiacomo.gabrielli@arm.com{
95613759Sgiacomo.gabrielli@arm.com  protected:
95713759Sgiacomo.gabrielli@arm.com    typedef _Element Element;
95813759Sgiacomo.gabrielli@arm.com    typedef _Element TPElem;
95913759Sgiacomo.gabrielli@arm.com  public:
96013759Sgiacomo.gabrielli@arm.com    // Constructor
96113759Sgiacomo.gabrielli@arm.com    %(class_name)s(ExtMachInst machInst,
96213759Sgiacomo.gabrielli@arm.com                   IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2,
96313759Sgiacomo.gabrielli@arm.com                   uint8_t _rot, uint8_t _imm)
96413759Sgiacomo.gabrielli@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
96513759Sgiacomo.gabrielli@arm.com                         _dest, _op1, _op2, _rot, _imm)
96613759Sgiacomo.gabrielli@arm.com    {
96713759Sgiacomo.gabrielli@arm.com        %(constructor)s;
96813759Sgiacomo.gabrielli@arm.com    }
96913759Sgiacomo.gabrielli@arm.com
97013759Sgiacomo.gabrielli@arm.com    Fault execute(ExecContext *, Trace::InstRecord *) const;
97113759Sgiacomo.gabrielli@arm.com};
97213759Sgiacomo.gabrielli@arm.com}};
97313759Sgiacomo.gabrielli@arm.com
97413759Sgiacomo.gabrielli@arm.comdef template SveWideningOpExecute {{
97513759Sgiacomo.gabrielli@arm.com    template <class SElement, class DElement>
97613759Sgiacomo.gabrielli@arm.com    Fault %(class_name)s<SElement, DElement>::execute(ExecContext *xc,
97713759Sgiacomo.gabrielli@arm.com            Trace::InstRecord *traceData) const
97813759Sgiacomo.gabrielli@arm.com    {
97913759Sgiacomo.gabrielli@arm.com        Fault fault = NoFault;
98013759Sgiacomo.gabrielli@arm.com        %(op_decl)s;
98113759Sgiacomo.gabrielli@arm.com        %(op_rd)s;
98213759Sgiacomo.gabrielli@arm.com
98313759Sgiacomo.gabrielli@arm.com        %(code)s;
98413759Sgiacomo.gabrielli@arm.com        if (fault == NoFault)
98513759Sgiacomo.gabrielli@arm.com        {
98613759Sgiacomo.gabrielli@arm.com            %(op_wb)s;
98713759Sgiacomo.gabrielli@arm.com        }
98813759Sgiacomo.gabrielli@arm.com
98913759Sgiacomo.gabrielli@arm.com        return fault;
99013759Sgiacomo.gabrielli@arm.com    }
99113759Sgiacomo.gabrielli@arm.com}};
99213759Sgiacomo.gabrielli@arm.com
99313759Sgiacomo.gabrielli@arm.comdef template SveNonTemplatedOpExecute {{
99413759Sgiacomo.gabrielli@arm.com    Fault %(class_name)s::execute(ExecContext *xc,
99513759Sgiacomo.gabrielli@arm.com            Trace::InstRecord *traceData) const
99613759Sgiacomo.gabrielli@arm.com    {
99713759Sgiacomo.gabrielli@arm.com        Fault fault = NoFault;
99813759Sgiacomo.gabrielli@arm.com        %(op_decl)s;
99913759Sgiacomo.gabrielli@arm.com        %(op_rd)s;
100013759Sgiacomo.gabrielli@arm.com
100113759Sgiacomo.gabrielli@arm.com        %(code)s;
100213759Sgiacomo.gabrielli@arm.com        if (fault == NoFault)
100313759Sgiacomo.gabrielli@arm.com        {
100413759Sgiacomo.gabrielli@arm.com            %(op_wb)s;
100513759Sgiacomo.gabrielli@arm.com        }
100613759Sgiacomo.gabrielli@arm.com
100713759Sgiacomo.gabrielli@arm.com        return fault;
100813759Sgiacomo.gabrielli@arm.com    }
100913759Sgiacomo.gabrielli@arm.com}};
101013759Sgiacomo.gabrielli@arm.com
101113759Sgiacomo.gabrielli@arm.comdef template SveOpExecute {{
101213759Sgiacomo.gabrielli@arm.com    template <class Element>
101313759Sgiacomo.gabrielli@arm.com    Fault %(class_name)s<Element>::execute(ExecContext *xc,
101413759Sgiacomo.gabrielli@arm.com            Trace::InstRecord *traceData) const
101513759Sgiacomo.gabrielli@arm.com    {
101613759Sgiacomo.gabrielli@arm.com        Fault fault = NoFault;
101713759Sgiacomo.gabrielli@arm.com        %(op_decl)s;
101813759Sgiacomo.gabrielli@arm.com        %(op_rd)s;
101913759Sgiacomo.gabrielli@arm.com
102013759Sgiacomo.gabrielli@arm.com        %(code)s;
102113759Sgiacomo.gabrielli@arm.com        if (fault == NoFault)
102213759Sgiacomo.gabrielli@arm.com        {
102313759Sgiacomo.gabrielli@arm.com            %(op_wb)s;
102413759Sgiacomo.gabrielli@arm.com        }
102513759Sgiacomo.gabrielli@arm.com
102613759Sgiacomo.gabrielli@arm.com        return fault;
102713759Sgiacomo.gabrielli@arm.com    }
102813759Sgiacomo.gabrielli@arm.com}};
102913759Sgiacomo.gabrielli@arm.com
103013759Sgiacomo.gabrielli@arm.comdef template SveOpExecDeclare {{
103113759Sgiacomo.gabrielli@arm.com    template
103213759Sgiacomo.gabrielli@arm.com    Fault %(class_name)s<%(targs)s>::execute(
103313759Sgiacomo.gabrielli@arm.com            ExecContext *, Trace::InstRecord *) const;
103413759Sgiacomo.gabrielli@arm.com}};
1035