// Copyright (c) 2017-2018 ARM Limited
// All rights reserved
//
// The license below extends only to copyright in the software and shall
// not be construed as granting a license to any other intellectual
// property including but not limited to intellectual property relating
// to a hardware implementation of the functionality of the software
// licensed hereunder.  You may use the software subject to the license
// terms below provided that you ensure that this notice is replicated
// unmodified and in its entirety in all distributions of the software,
// modified or unmodified, in source code or in binary form.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met: redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer;
// redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution;
// neither the name of the copyright holders nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Authors: Giacomo Gabrielli

// @file Definition of SVE instructions.

output header {{

    // Decodes unary, constructive, predicated (merging) SVE instructions,
    // handling signed and unsigned variants.
    template <template <typename T> class BaseS,
              template <typename T> class BaseU>
    StaticInstPtr
    decodeSveUnaryPred(unsigned size, unsigned u, ExtMachInst machInst,
                       IntRegIndex dest, IntRegIndex op1, IntRegIndex gp)
    {
        switch (size) {
          case 0:
            if (u) {
                return new BaseU<uint8_t>(machInst, dest, op1, gp);
            } else {
                return new BaseS<int8_t>(machInst, dest, op1, gp);
            }
          case 1:
            if (u) {
                return new BaseU<uint16_t>(machInst, dest, op1, gp);
            } else {
                return new BaseS<int16_t>(machInst, dest, op1, gp);
            }
          case 2:
            if (u) {
                return new BaseU<uint32_t>(machInst, dest, op1, gp);
            } else {
                return new BaseS<int32_t>(machInst, dest, op1, gp);
            }
          case 3:
            if (u) {
                return new BaseU<uint64_t>(machInst, dest, op1, gp);
            } else {
                return new BaseS<int64_t>(machInst, dest, op1, gp);
            }
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes SVE widening reductions.
    // handling signed and unsigned variants.
    template <template <typename T1, typename T2> class BaseS,
              template <typename T1, typename T2> class BaseU>
    StaticInstPtr
    decodeSveWideningReduc(unsigned size, unsigned u, ExtMachInst machInst,
                           IntRegIndex dest, IntRegIndex op1, IntRegIndex gp)
    {
        switch (size) {
          case 0:
            if (u) {
                return new BaseU<uint8_t, uint64_t>(machInst, dest, op1, gp);
            } else {
                return new BaseS<int8_t, int64_t>(machInst, dest, op1, gp);
            }
          case 1:
            if (u) {
                return new BaseU<uint16_t, uint64_t>(machInst, dest, op1, gp);
            } else {
                return new BaseS<int16_t, int64_t>(machInst, dest, op1, gp);
            }
          case 2:
            if (u) {
                return new BaseU<uint32_t, uint64_t>(machInst, dest, op1, gp);
            } else {
                return new BaseS<int32_t, int64_t>(machInst, dest, op1, gp);
            }
          case 3:
            assert(u);
            return new BaseU<uint64_t, uint64_t>(machInst, dest, op1, gp);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes unary, constructive, predicated (merging) SVE instructions,
    // handling signed variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveUnaryPredS(unsigned size, ExtMachInst machInst,
                        IntRegIndex dest, IntRegIndex op1, IntRegIndex gp)
    {
        switch (size) {
          case 0:
            return new Base<int8_t>(machInst, dest, op1, gp);
          case 1:
            return new Base<int16_t>(machInst, dest, op1, gp);
          case 2:
            return new Base<int32_t>(machInst, dest, op1, gp);
          case 3:
            return new Base<int64_t>(machInst, dest, op1, gp);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes unary, constructive, predicated (merging) SVE instructions,
    // handling unsigned variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveUnaryPredU(unsigned size, ExtMachInst machInst,
                        IntRegIndex dest, IntRegIndex op1, IntRegIndex gp)
    {
        switch (size) {
          case 0:
            return new Base<uint8_t>(machInst, dest, op1, gp);
          case 1:
            return new Base<uint16_t>(machInst, dest, op1, gp);
          case 2:
            return new Base<uint32_t>(machInst, dest, op1, gp);
          case 3:
            return new Base<uint64_t>(machInst, dest, op1, gp);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes unary, constructive, predicated (merging) SVE instructions,
    // handling signed and unsigned variants, for small element sizes (8- to
    // 32-bit).
    template <template <typename T> class BaseS,
              template <typename T> class BaseU>
    StaticInstPtr
    decodeSveUnaryPredSmall(unsigned size, unsigned u, ExtMachInst machInst,
                            IntRegIndex dest, IntRegIndex op1, IntRegIndex gp)
    {
        switch (size) {
          case 0:
            if (u) {
                return new BaseU<uint8_t>(machInst, dest, op1, gp);
            } else {
                return new BaseS<int8_t>(machInst, dest, op1, gp);
            }
          case 1:
            if (u) {
                return new BaseU<uint16_t>(machInst, dest, op1, gp);
            } else {
                return new BaseS<int16_t>(machInst, dest, op1, gp);
            }
          case 2:
            if (u) {
                return new BaseU<uint32_t>(machInst, dest, op1, gp);
            } else {
                return new BaseS<int32_t>(machInst, dest, op1, gp);
            }
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes unary, constructive, predicated (merging) SVE instructions,
    // handling floating point variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveUnaryPredF(unsigned size, ExtMachInst machInst,
                        IntRegIndex dest, IntRegIndex op1, IntRegIndex gp)
    {
        switch (size) {
          case 1:
            return new Base<uint16_t>(machInst, dest, op1, gp);
          case 2:
            return new Base<uint32_t>(machInst, dest, op1, gp);
          case 3:
            return new Base<uint64_t>(machInst, dest, op1, gp);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes unary, constructive, unpredicated SVE instructions, handling
    // unsigned variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveUnaryUnpredU(unsigned size, ExtMachInst machInst,
                          IntRegIndex dest, IntRegIndex op1)
    {
        switch (size) {
          case 0:
            return new Base<uint8_t>(machInst, dest, op1);
          case 1:
            return new Base<uint16_t>(machInst, dest, op1);
          case 2:
            return new Base<uint32_t>(machInst, dest, op1);
          case 3:
            return new Base<uint64_t>(machInst, dest, op1);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes unary, constructive, unpredicated SVE instructions, handling
    // floating-point variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveUnaryUnpredF(unsigned size, ExtMachInst machInst,
                          IntRegIndex dest, IntRegIndex op1)
    {
        switch (size) {
          case 1:
            return new Base<uint16_t>(machInst, dest, op1);
          case 2:
            return new Base<uint32_t>(machInst, dest, op1);
          case 3:
            return new Base<uint64_t>(machInst, dest, op1);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes binary, destructive, predicated (merging) SVE instructions,
    // handling signed and unsigned variants.
    template <template <typename T> class BaseS,
              template <typename T> class BaseU>
    StaticInstPtr
    decodeSveBinDestrPred(unsigned size, unsigned u, ExtMachInst machInst,
                          IntRegIndex dest, IntRegIndex op2, IntRegIndex gp)
    {
        switch (size) {
          case 0:
            if (u) {
                return new BaseU<uint8_t>(machInst, dest, op2, gp);
            } else {
                return new BaseS<int8_t>(machInst, dest, op2, gp);
            }
          case 1:
            if (u) {
                return new BaseU<uint16_t>(machInst, dest, op2, gp);
            } else {
                return new BaseS<int16_t>(machInst, dest, op2, gp);
            }
          case 2:
            if (u) {
                return new BaseU<uint32_t>(machInst, dest, op2, gp);
            } else {
                return new BaseS<int32_t>(machInst, dest, op2, gp);
            }
          case 3:
            if (u) {
                return new BaseU<uint64_t>(machInst, dest, op2, gp);
            } else {
                return new BaseS<int64_t>(machInst, dest, op2, gp);
            }
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes binary with immediate operand, constructive, unpredicated
    // SVE instructions, handling signed variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveBinImmUnpredS(unsigned size, ExtMachInst machInst,
            IntRegIndex dest, IntRegIndex op1, unsigned immediate)
    {
        switch (size) {
          case 0:
            return new Base<int8_t>(machInst, dest, op1, immediate);
          case 1:
            return new Base<int16_t>(machInst, dest, op1, immediate);
          case 2:
            return new Base<int32_t>(machInst, dest, op1, immediate);
          case 3:
            return new Base<int64_t>(machInst, dest, op1, immediate);
          default:
            return new Unknown64(machInst);
        }
    }


    // Decodes binary with immediate operand, constructive, unpredicated
    // SVE instructions, handling unsigned variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveBinImmUnpredU(unsigned size, ExtMachInst machInst,
            IntRegIndex dest, IntRegIndex op1, unsigned immediate)
    {
        switch (size) {
          case 0:
            return new Base<uint8_t>(machInst, dest, op1, immediate);
          case 1:
            return new Base<uint16_t>(machInst, dest, op1, immediate);
          case 2:
            return new Base<uint32_t>(machInst, dest, op1, immediate);
          case 3:
            return new Base<uint64_t>(machInst, dest, op1, immediate);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes binary with immediate operand, destructive, predicated (merging)
    // SVE instructions, handling unsigned variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveBinImmPredU(unsigned size, ExtMachInst machInst, IntRegIndex dest,
            unsigned immediate, IntRegIndex gp)
    {
        switch (size) {
          case 0:
            return new Base<uint8_t>(machInst, dest, immediate, gp);
          case 1:
            return new Base<uint16_t>(machInst, dest, immediate, gp);
          case 2:
            return new Base<uint32_t>(machInst, dest, immediate, gp);
          case 3:
            return new Base<uint64_t>(machInst, dest, immediate, gp);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes binary with immediate operand, destructive, predicated (merging)
    // SVE instructions, handling signed variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveBinImmPredS(unsigned size, ExtMachInst machInst, IntRegIndex dest,
            unsigned immediate, IntRegIndex gp)
    {
        switch (size) {
          case 0:
            return new Base<int8_t>(machInst, dest, immediate, gp);
          case 1:
            return new Base<int16_t>(machInst, dest, immediate, gp);
          case 2:
            return new Base<int32_t>(machInst, dest, immediate, gp);
          case 3:
            return new Base<int64_t>(machInst, dest, immediate, gp);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes binary with immediate operand, destructive, predicated (merging)
    // SVE instructions, handling floating-point variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveBinImmPredF(unsigned size, ExtMachInst machInst, IntRegIndex dest,
            uint64_t immediate, IntRegIndex gp)
    {
        switch (size) {
          case 1:
            return new Base<uint16_t>(machInst, dest, immediate, gp);
          case 2:
            return new Base<uint32_t>(machInst, dest, immediate, gp);
          case 3:
            return new Base<uint64_t>(machInst, dest, immediate, gp);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes unary/binary with wide immediate operand, destructive,
    // unpredicated SVE instructions, handling unsigned variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveWideImmUnpredU(unsigned size, ExtMachInst machInst,
            IntRegIndex dest, uint64_t immediate)
    {
        switch (size) {
          case 0:
            return new Base<uint8_t>(machInst, dest, immediate);
          case 1:
            return new Base<uint16_t>(machInst, dest, immediate);
          case 2:
            return new Base<uint32_t>(machInst, dest, immediate);
          case 3:
            return new Base<uint64_t>(machInst, dest, immediate);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes unary/binary with wide immediate operand, destructive,
    // unpredicated SVE instructions, handling signed variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveWideImmUnpredS(unsigned size, ExtMachInst machInst,
            IntRegIndex dest, uint64_t immediate)
    {
        switch (size) {
          case 0:
            return new Base<int8_t>(machInst, dest, immediate);
          case 1:
            return new Base<int16_t>(machInst, dest, immediate);
          case 2:
            return new Base<int32_t>(machInst, dest, immediate);
          case 3:
            return new Base<int64_t>(machInst, dest, immediate);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes unary/binary with wide immediate operand, destructive,
    // unpredicated SVE instructions, handling floating-point variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveWideImmUnpredF(unsigned size, ExtMachInst machInst,
            IntRegIndex dest, uint64_t immediate)
    {
        switch (size) {
          case 1:
            return new Base<uint16_t>(machInst, dest, immediate);
          case 2:
            return new Base<uint32_t>(machInst, dest, immediate);
          case 3:
            return new Base<uint64_t>(machInst, dest, immediate);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes unary/binary with wide immediate operand, destructive,
    // predicated SVE instructions, handling unsigned variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveWideImmPredU(unsigned size, ExtMachInst machInst,
            IntRegIndex dest, uint64_t immediate, IntRegIndex gp,
            bool isMerging = true)
    {
        switch (size) {
          case 0:
            return new Base<uint8_t>(machInst, dest, immediate, gp,
                isMerging);
          case 1:
            return new Base<uint16_t>(machInst, dest, immediate, gp,
                isMerging);
          case 2:
            return new Base<uint32_t>(machInst, dest, immediate, gp,
                isMerging);
          case 3:
            return new Base<uint64_t>(machInst, dest, immediate, gp,
                isMerging);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes unary/binary with wide immediate operand, destructive,
    // predicated SVE instructions, handling floating-point variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveWideImmPredF(unsigned size, ExtMachInst machInst,
            IntRegIndex dest, uint64_t immediate, IntRegIndex gp)
    {
        switch (size) {
          case 1:
            return new Base<uint16_t>(machInst, dest, immediate, gp);
          case 2:
            return new Base<uint32_t>(machInst, dest, immediate, gp);
          case 3:
            return new Base<uint64_t>(machInst, dest, immediate, gp);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes binary, destructive, predicated (merging) SVE instructions,
    // handling unsigned variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveBinDestrPredU(unsigned size, ExtMachInst machInst,
                           IntRegIndex dest, IntRegIndex op2, IntRegIndex gp)
    {
        switch (size) {
          case 0:
            return new Base<uint8_t>(machInst, dest, op2, gp);
          case 1:
            return new Base<uint16_t>(machInst, dest, op2, gp);
          case 2:
            return new Base<uint32_t>(machInst, dest, op2, gp);
          case 3:
            return new Base<uint64_t>(machInst, dest, op2, gp);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes binary, destructive, predicated (merging) SVE instructions,
    // handling signed variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveBinDestrPredS(unsigned size, ExtMachInst machInst,
                           IntRegIndex dest, IntRegIndex op2, IntRegIndex gp)
    {
        switch (size) {
          case 0:
            return new Base<int8_t>(machInst, dest, op2, gp);
          case 1:
            return new Base<int16_t>(machInst, dest, op2, gp);
          case 2:
            return new Base<int32_t>(machInst, dest, op2, gp);
          case 3:
            return new Base<int64_t>(machInst, dest, op2, gp);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes binary, destructive, predicated (merging) SVE instructions,
    // handling floating-point variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveBinDestrPredF(unsigned size, ExtMachInst machInst,
                           IntRegIndex dest, IntRegIndex op2, IntRegIndex gp)
    {
        switch (size) {
          case 1:
            return new Base<uint16_t>(machInst, dest, op2, gp);
          case 2:
            return new Base<uint32_t>(machInst, dest, op2, gp);
          case 3:
            return new Base<uint64_t>(machInst, dest, op2, gp);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes binary, constructive, predicated SVE instructions, handling
    // unsigned variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveBinConstrPredU(unsigned size, ExtMachInst machInst,
                            IntRegIndex dest, IntRegIndex op1, IntRegIndex op2,
                            IntRegIndex gp, SvePredType predType)
    {
        switch (size) {
          case 0:
            return new Base<uint8_t>(machInst, dest, op1, op2, gp, predType);
          case 1:
            return new Base<uint16_t>(machInst, dest, op1, op2, gp, predType);
          case 2:
            return new Base<uint32_t>(machInst, dest, op1, op2, gp, predType);
          case 3:
            return new Base<uint64_t>(machInst, dest, op1, op2, gp, predType);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes binary, constructive, unpredicated SVE instructions.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveBinUnpred(unsigned size, unsigned u, ExtMachInst machInst,
                       IntRegIndex dest, IntRegIndex op1, IntRegIndex op2)
    {
        switch (size) {
          case 0:
            if (u) {
                return new Base<uint8_t>(machInst, dest, op1, op2);
            } else {
                return new Base<int8_t>(machInst, dest, op1, op2);
            }
          case 1:
            if (u) {
                return new Base<uint16_t>(machInst, dest, op1, op2);
            } else {
                return new Base<int16_t>(machInst, dest, op1, op2);
            }
          case 2:
            if (u) {
                return new Base<uint32_t>(machInst, dest, op1, op2);
            } else {
                return new Base<int32_t>(machInst, dest, op1, op2);
            }
          case 3:
            if (u) {
                return new Base<uint64_t>(machInst, dest, op1, op2);
            } else {
                return new Base<int64_t>(machInst, dest, op1, op2);
            }
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes binary, constructive, unpredicated SVE instructions.
    // Unsigned instructions only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveBinUnpredU(unsigned size, ExtMachInst machInst, IntRegIndex dest,
            IntRegIndex op1, IntRegIndex op2)
    {
        switch (size) {
          case 0:
            return new Base<uint8_t>(machInst, dest, op1, op2);
          case 1:
            return new Base<uint16_t>(machInst, dest, op1, op2);
          case 2:
            return new Base<uint32_t>(machInst, dest, op1, op2);
          case 3:
            return new Base<uint64_t>(machInst, dest, op1, op2);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes binary, constructive, unpredicated SVE instructions.
    // Signed instructions only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveBinUnpredS(unsigned size, ExtMachInst machInst, IntRegIndex dest,
            IntRegIndex op1, IntRegIndex op2)
    {
        switch (size) {
          case 0:
            return new Base<int8_t>(machInst, dest, op1, op2);
          case 1:
            return new Base<int16_t>(machInst, dest, op1, op2);
          case 2:
            return new Base<int32_t>(machInst, dest, op1, op2);
          case 3:
            return new Base<int64_t>(machInst, dest, op1, op2);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes binary, costructive, unpredicated SVE instructions, handling
    // floating-point variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveBinUnpredF(unsigned size, ExtMachInst machInst, IntRegIndex dest,
            IntRegIndex op1, IntRegIndex op2)
    {
        switch (size) {
          case 1:
            return new Base<uint16_t>(machInst, dest, op1, op2);
          case 2:
            return new Base<uint32_t>(machInst, dest, op1, op2);
          case 3:
            return new Base<uint64_t>(machInst, dest, op1, op2);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes SVE compare instructions - binary, predicated (zeroing),
    // generating a predicate - handling floating-point variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveCmpF(unsigned size, ExtMachInst machInst,
                  IntRegIndex dest, IntRegIndex op1, IntRegIndex op2,
                  IntRegIndex gp)
    {
        switch (size) {
          case 1:
            return new Base<uint16_t>(machInst, dest, op1, op2, gp);
          case 2:
            return new Base<uint32_t>(machInst, dest, op1, op2, gp);
          case 3:
            return new Base<uint64_t>(machInst, dest, op1, op2, gp);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes SVE compare-with-immediate instructions - binary, predicated
    // (zeroing), generating a predicate - handling floating-point variants
    // only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveCmpImmF(unsigned size, ExtMachInst machInst,
                     IntRegIndex dest, IntRegIndex op1, uint64_t imm,
                     IntRegIndex gp)
    {
        switch (size) {
          case 1:
            return new Base<uint16_t>(machInst, dest, op1, imm, gp);
          case 2:
            return new Base<uint32_t>(machInst, dest, op1, imm, gp);
          case 3:
            return new Base<uint64_t>(machInst, dest, op1, imm, gp);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes ternary, destructive, predicated (merging) SVE instructions.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveTerPred(unsigned size, unsigned u, ExtMachInst machInst,
                     IntRegIndex dest, IntRegIndex op1, IntRegIndex op2,
                     IntRegIndex gp)
    {
        switch (size) {
          case 0:
            if (u) {
                return new Base<uint8_t>(machInst, dest, op1, op2, gp);
            } else {
                return new Base<int8_t>(machInst, dest, op1, op2, gp);
            }
          case 1:
            if (u) {
                return new Base<uint16_t>(machInst, dest, op1, op2, gp);
            } else {
                return new Base<int16_t>(machInst, dest, op1, op2, gp);
            }
          case 2:
            if (u) {
                return new Base<uint32_t>(machInst, dest, op1, op2, gp);
            } else {
                return new Base<int32_t>(machInst, dest, op1, op2, gp);
            }
          case 3:
            if (u) {
                return new Base<uint64_t>(machInst, dest, op1, op2, gp);
            } else {
                return new Base<int64_t>(machInst, dest, op1, op2, gp);
            }
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes ternary, destructive, predicated (merging) SVE instructions,
    // handling wide signed variants only. XXX: zeroing for CMP instructions.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveTerPredWS(unsigned size, ExtMachInst machInst,
                      IntRegIndex dest, IntRegIndex op1, IntRegIndex op2,
                      IntRegIndex gp)
    {
        switch (size) {
          case 0:
            return new Base<int8_t>(machInst, dest, op1, op2, gp);
          case 1:
            return new Base<int16_t>(machInst, dest, op1, op2, gp);
          case 2:
            return new Base<int32_t>(machInst, dest, op1, op2, gp);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes ternary, destructive, predicated (merging) SVE instructions,
    // handling wide unsigned variants only. XXX: zeroing for CMP instructions.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveTerPredWU(unsigned size, ExtMachInst machInst,
                      IntRegIndex dest, IntRegIndex op1, IntRegIndex op2,
                      IntRegIndex gp)
    {
        switch (size) {
          case 0:
            return new Base<uint8_t>(machInst, dest, op1, op2, gp);
          case 1:
            return new Base<uint16_t>(machInst, dest, op1, op2, gp);
          case 2:
            return new Base<uint32_t>(machInst, dest, op1, op2, gp);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes ternary, destructive, predicated (merging) SVE instructions,
    // handling signed variants only. XXX: zeroing for CMP instructions.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveTerPredS(unsigned size, ExtMachInst machInst,
                      IntRegIndex dest, IntRegIndex op1, IntRegIndex op2,
                      IntRegIndex gp)
    {
        switch (size) {
          case 0:
            return new Base<int8_t>(machInst, dest, op1, op2, gp);
          case 1:
            return new Base<int16_t>(machInst, dest, op1, op2, gp);
          case 2:
            return new Base<int32_t>(machInst, dest, op1, op2, gp);
          case 3:
            return new Base<int64_t>(machInst, dest, op1, op2, gp);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes ternary, destructive, predicated (merging) SVE instructions,
    // handling unsigned variants only. XXX: zeroing for CMP instructions.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveTerPredU(unsigned size, ExtMachInst machInst,
                      IntRegIndex dest, IntRegIndex op1, IntRegIndex op2,
                      IntRegIndex gp)
    {
        switch (size) {
          case 0:
            return new Base<uint8_t>(machInst, dest, op1, op2, gp);
          case 1:
            return new Base<uint16_t>(machInst, dest, op1, op2, gp);
          case 2:
            return new Base<uint32_t>(machInst, dest, op1, op2, gp);
          case 3:
            return new Base<uint64_t>(machInst, dest, op1, op2, gp);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes SVE signed unary extension instructions (8-bit source element
    // size)
    template <template <typename TS, typename TD> class Base>
    StaticInstPtr
    decodeSveUnaryExtendFromBPredS(unsigned dsize, ExtMachInst machInst,
                                   IntRegIndex dest, IntRegIndex op1,
                                   IntRegIndex gp)
    {
        switch (dsize) {
          case 1:
            return new Base<int8_t, int16_t>(machInst, dest, op1, gp);
          case 2:
            return new Base<int8_t, int32_t>(machInst, dest, op1, gp);
          case 3:
            return new Base<int8_t, int64_t>(machInst, dest, op1, gp);
        }
        return new Unknown64(machInst);
    }

    // Decodes SVE unsigned unary extension instructions (8-bit source element
    // size)
    template <template <typename TS, typename TD> class Base>
    StaticInstPtr
    decodeSveUnaryExtendFromBPredU(unsigned dsize, ExtMachInst machInst,
                                   IntRegIndex dest, IntRegIndex op1,
                                   IntRegIndex gp)
    {
        switch (dsize) {
          case 1:
            return new Base<uint8_t, uint16_t>(machInst, dest, op1, gp);
          case 2:
            return new Base<uint8_t, uint32_t>(machInst, dest, op1, gp);
          case 3:
            return new Base<uint8_t, uint64_t>(machInst, dest, op1, gp);
        }
        return new Unknown64(machInst);
    }

    // Decodes SVE signed unary extension instructions (16-bit source element
    // size)
    template <template <typename TS, typename TD> class Base>
    StaticInstPtr
    decodeSveUnaryExtendFromHPredS(unsigned dsize, ExtMachInst machInst,
                                   IntRegIndex dest, IntRegIndex op1,
                                   IntRegIndex gp)
    {
        switch (dsize) {
          case 2:
            return new Base<int16_t, int32_t>(machInst, dest, op1, gp);
          case 3:
            return new Base<int16_t, int64_t>(machInst, dest, op1, gp);
        }
        return new Unknown64(machInst);
    }

    // Decodes SVE unsigned unary extension instructions (16-bit source element
    // size)
    template <template <typename TS, typename TD> class Base>
    StaticInstPtr
    decodeSveUnaryExtendFromHPredU(unsigned dsize, ExtMachInst machInst,
                                   IntRegIndex dest, IntRegIndex op1,
                                   IntRegIndex gp)
    {
        switch (dsize) {
          case 2:
            return new Base<uint16_t, uint32_t>(machInst, dest, op1, gp);
          case 3:
            return new Base<uint16_t, uint64_t>(machInst, dest, op1, gp);
        }
        return new Unknown64(machInst);
    }

    // Decodes ternary, destructive, predicated (merging) SVE instructions,
    // handling floating-point variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveTerPredF(unsigned size, ExtMachInst machInst,
                      IntRegIndex dest, IntRegIndex op1, IntRegIndex op2,
                      IntRegIndex gp)
    {
        switch (size) {
          case 1:
            return new Base<uint16_t>(machInst, dest, op1, op2, gp);
          case 2:
            return new Base<uint32_t>(machInst, dest, op1, op2, gp);
          case 3:
            return new Base<uint64_t>(machInst, dest, op1, op2, gp);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes ternary with immediate operand, destructive, unpredicated SVE
    // instructions handling floating-point variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveTerImmUnpredF(unsigned size, ExtMachInst machInst,
                           IntRegIndex dest, IntRegIndex op2, uint8_t imm)
    {
        switch (size) {
          case 1:
            return new Base<uint16_t>(machInst, dest, op2, imm);
          case 2:
            return new Base<uint32_t>(machInst, dest, op2, imm);
          case 3:
            return new Base<uint64_t>(machInst, dest, op2, imm);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes SVE PTRUE(S) instructions.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSvePtrue(unsigned size, ExtMachInst machInst,
                   IntRegIndex dest, uint8_t imm)
    {
        switch (size) {
          case 0:
            return new Base<uint8_t>(machInst, dest, imm);
          case 1:
            return new Base<uint16_t>(machInst, dest, imm);
          case 2:
            return new Base<uint32_t>(machInst, dest, imm);
          case 3:
            return new Base<uint64_t>(machInst, dest, imm);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes SVE predicate count instructions, scalar signed variant only
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSvePredCountS(unsigned size, ExtMachInst machInst,
            IntRegIndex dest, IntRegIndex op1)
    {
        switch (size) {
            case 0:
                return new Base<int8_t>(machInst, dest, op1);
            case 1:
                return new Base<int16_t>(machInst, dest, op1);
            case 2:
                return new Base<int32_t>(machInst, dest, op1);
            case 3:
                return new Base<int64_t>(machInst, dest, op1);
            default:
                return new Unknown64(machInst);
        }
    }

    // Decodes SVE predicate count instructions, scalar unsigned variant only
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSvePredCountU(unsigned size, ExtMachInst machInst,
            IntRegIndex dest, IntRegIndex op1)
    {
        switch (size) {
            case 0:
                return new Base<uint8_t>(machInst, dest, op1);
            case 1:
                return new Base<uint16_t>(machInst, dest, op1);
            case 2:
                return new Base<uint32_t>(machInst, dest, op1);
            case 3:
                return new Base<uint64_t>(machInst, dest, op1);
            default:
                return new Unknown64(machInst);
        }
    }

    // Decodes SVE predicate count instructions, vector signed variant only
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSvePredCountVS(unsigned size, ExtMachInst machInst,
            IntRegIndex dest, IntRegIndex op1)
    {
        switch (size) {
            case 1:
                return new Base<int16_t>(machInst, dest, op1);
            case 2:
                return new Base<int32_t>(machInst, dest, op1);
            case 3:
                return new Base<int64_t>(machInst, dest, op1);
            default:
                return new Unknown64(machInst);
        }
    }

    // Decodes SVE predicate count instructions, vector unsigned variant only
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSvePredCountVU(unsigned size, ExtMachInst machInst,
            IntRegIndex dest, IntRegIndex op1)
    {
        switch (size) {
            case 1:
                return new Base<uint16_t>(machInst, dest, op1);
            case 2:
                return new Base<uint32_t>(machInst, dest, op1);
            case 3:
                return new Base<uint64_t>(machInst, dest, op1);
            default:
                return new Unknown64(machInst);
        }
    }

    // Decodes ternary with immediate operand, predicated SVE
    // instructions handling unsigned variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveTerImmPredU(unsigned size, ExtMachInst machInst,
            IntRegIndex dest, IntRegIndex op1, int64_t imm, IntRegIndex gp)
    {
        switch (size) {
          case 0:
            return new Base<uint8_t>(machInst, dest, op1, imm, gp);
          case 1:
            return new Base<uint16_t>(machInst, dest, op1, imm, gp);
          case 2:
            return new Base<uint32_t>(machInst, dest, op1, imm, gp);
          case 3:
            return new Base<uint64_t>(machInst, dest, op1, imm, gp);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes ternary with immediate operand, predicated SVE
    // instructions handling signed variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveTerImmPredS(unsigned size, ExtMachInst machInst,
            IntRegIndex dest, IntRegIndex op1, int64_t imm, IntRegIndex gp)
    {
        switch (size) {
          case 0:
            return new Base<int8_t>(machInst, dest, op1, imm, gp);
          case 1:
            return new Base<int16_t>(machInst, dest, op1, imm, gp);
          case 2:
            return new Base<int32_t>(machInst, dest, op1, imm, gp);
          case 3:
            return new Base<int64_t>(machInst, dest, op1, imm, gp);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes integer element count SVE instructions, handling
    // signed variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveElemIntCountS(unsigned size, ExtMachInst machInst,
            IntRegIndex dest, uint8_t pattern, uint8_t imm4)
    {
        switch (size) {
          case 0:
            return new Base<int8_t>(machInst, dest, pattern, imm4);
          case 1:
            return new Base<int16_t>(machInst, dest, pattern, imm4);
          case 2:
            return new Base<int32_t>(machInst, dest, pattern, imm4);
          case 3:
            return new Base<int64_t>(machInst, dest, pattern, imm4);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes integer element count SVE instructions, handling
    // unsigned variants only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveElemIntCountU(unsigned size, ExtMachInst machInst,
            IntRegIndex dest, uint8_t pattern, uint8_t imm4)
    {
        switch (size) {
          case 0:
            return new Base<uint8_t>(machInst, dest, pattern, imm4);
          case 1:
            return new Base<uint16_t>(machInst, dest, pattern, imm4);
          case 2:
            return new Base<uint32_t>(machInst, dest, pattern, imm4);
          case 3:
            return new Base<uint64_t>(machInst, dest, pattern, imm4);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes integer element count SVE instructions, handling
    // signed variants from 16 to 64 bits only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveElemIntCountLS(unsigned size, ExtMachInst machInst,
            IntRegIndex dest, uint8_t pattern, uint8_t imm4)
    {
        switch (size) {
          case 1:
            return new Base<int16_t>(machInst, dest, pattern, imm4);
          case 2:
            return new Base<int32_t>(machInst, dest, pattern, imm4);
          case 3:
            return new Base<int64_t>(machInst, dest, pattern, imm4);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes integer element count SVE instructions, handling
    // unsigned variants from 16 to 64 bits only.
    template <template <typename T> class Base>
    StaticInstPtr
    decodeSveElemIntCountLU(unsigned size, ExtMachInst machInst,
            IntRegIndex dest, uint8_t pattern, uint8_t imm4)
    {
        switch (size) {
          case 1:
            return new Base<uint16_t>(machInst, dest, pattern, imm4);
          case 2:
            return new Base<uint32_t>(machInst, dest, pattern, imm4);
          case 3:
            return new Base<uint64_t>(machInst, dest, pattern, imm4);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes SVE unpack instructions. Handling signed variants.
    template <template <typename T1, typename T2> class Base>
    StaticInstPtr
    decodeSveUnpackS(unsigned size, ExtMachInst machInst,
                    IntRegIndex dest, IntRegIndex op1)
    {
        switch (size) {
          case 1:
            return new Base<int8_t, int16_t>(machInst, dest, op1);
          case 2:
            return new Base<int16_t, int32_t>(machInst, dest, op1);
          case 3:
            return new Base<int32_t, int64_t>(machInst, dest, op1);
          default:
            return new Unknown64(machInst);
        }
    }

    // Decodes SVE unpack instructions. Handling unsigned variants.
    template <template <typename T1, typename T2> class Base>
    StaticInstPtr
    decodeSveUnpackU(unsigned size, ExtMachInst machInst,
                    IntRegIndex dest, IntRegIndex op1)
    {
        switch (size) {
          case 1:
            return new Base<uint8_t, uint16_t>(machInst, dest, op1);
          case 2:
            return new Base<uint16_t, uint32_t>(machInst, dest, op1);
          case 3:
            return new Base<uint32_t, uint64_t>(machInst, dest, op1);
          default:
            return new Unknown64(machInst);
        }
    }
}};

let {{

    header_output = ''
    exec_output = ''
    decoders = { 'Generic': {} }

    class PredType:
        NONE = 0
        MERGE = 1
        ZERO = 2
        SELECT = 3

    class CvtDir:
        Narrow = 0
        Widen = 1

    class IndexFormat(object):
        ImmImm = 'II'
        ImmReg = 'IR'
        RegImm = 'RI'
        RegReg = 'RR'

    class SrcRegType(object):
        Vector = 0
        Scalar = 1
        SimdFpScalar = 2
        Predicate = 3

    class DestType(object):
        Scalar = 'false'
        Vector = 'true'

    class SrcSize(object):
        Src32bit = 'true'
        Src64bit = 'false'

    class Break(object):
        Before = 0
        After = 1

    class Unpack(object):
        High = 0
        Low = 1

    # Generates definitions for SVE ADR instructions
    def sveAdrInst(name, Name, opClass, types, op):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        for (unsigned i = 0; i < eCount; i++) {
            const Element& srcElem1 = AA64FpOp1_x[i];
            Element srcElem2 = AA64FpOp2_x[i];
            Element destElem = 0;
            %(op)s
            AA64FpDest_x[i] = destElem;
        }''' % {'op': op}
        iop = InstObjParams(name, 'Sve' + Name, 'SveAdrOp',
                            {'code': code, 'op_class': opClass}, [])
        header_output += SveAdrOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type,
                         'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generates definition for SVE while predicate generation instructions
    def sveWhileInst(name, Name, opClass, types, op,
        srcSize = SrcSize.Src64bit):
        global header_output, exec_output, decoders
        extraPrologCode = '''
        auto& destPred = PDest;'''
        if 'int32_t' in types:
            srcType = 'int64_t' if srcSize == SrcSize.Src64bit else 'int32_t'
        else:
            srcType = 'uint64_t' if srcSize == SrcSize.Src64bit else 'uint32_t'
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        %(stype)s srcElem1 = static_cast<%(stype)s>(XOp1);
        %(stype)s srcElem2 = static_cast<%(stype)s>(XOp2);
        bool cond, first = false, none = true, last = true;
        destPred.reset();
        for (unsigned i = 0; i < eCount; i++) {
            %(op)s;
            last = last && cond;
            none = none && !cond;
            first = first || (i == 0 && cond);
            PDest_x[i] = last;
            srcElem1++;
        }
        CondCodesNZ = (first << 1) | none;
        CondCodesC = !last;
        CondCodesV = false;
        '''%{'op': op, 'stype': srcType}
        iop = InstObjParams(name, 'Sve' + Name, 'SveWhileOp',
                {'code': code, 'op_class': opClass, 'srcIs32b': srcSize}, [])
        iop.snippets['code'] = extraPrologCode + iop.snippets['code']
        header_output += SveWhileOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type, 'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict);

    # Generate definition for SVE compare & terminate instructions
    def sveCompTermInst(name, Name, opClass, types, op):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        bool destElem;
        Element srcElem1 = static_cast<Element>(XOp1);
        Element srcElem2 = static_cast<Element>(XOp2);
        %(op)s;
        if (destElem) {
            CondCodesNZ = CondCodesNZ | 0x2;
            CondCodesV = 0;
        } else {
            CondCodesNZ = CondCodesNZ & ~0x2;
            CondCodesV = !CondCodesC;
        }
        ''' % {'op': op}
        iop = InstObjParams(name, 'Sve' + Name, 'SveCompTermOp',
                {'code': code, 'op_class': opClass}, [])
        header_output += SveCompTermOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type, 'class_name': 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict);

    # Generates definition for SVE predicate count instructions
    def svePredCountInst(name, Name, opClass, types, op,
                         destType=DestType.Vector,
                         srcSize=SrcSize.Src64bit):
        global header_output, exec_output, decoders
        assert not (destType == DestType.Vector and
                srcSize != SrcSize.Src64bit)
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        int count = 0;
        for (unsigned i = 0; i < eCount; i++) {
            if (GpOp_x[i]) {
                count++;
            }
        }'''
        if destType == DestType.Vector:
            code += '''
        for (unsigned i = 0; i < eCount; i++) {
            Element destElem = 0;
            const Element& srcElem = AA64FpDestMerge_x[i];
            %(op)s
            AA64FpDest_x[i] = destElem;
        }''' % {'op': op}
        else:
            code += '''
        %(op)s''' % {'op': op}
        iop = InstObjParams(name, 'Sve' + Name, 'SvePredCountOp',
                {'code': code, 'op_class': opClass, 'srcIs32b': srcSize,
                 'destIsVec': destType}, [])
        header_output += SvePredCountOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type, 'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict);

    # Generates definition for SVE predicate count instructions (predicated)
    def svePredCountPredInst(name, Name, opClass, types):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        int count = 0;
        for (unsigned i = 0; i < eCount; i++) {
            if (POp1_x[i] && GpOp_x[i]) {
                count++;
            }
        }
        XDest = count;
        '''
        iop = InstObjParams(name, 'Sve' + Name, 'SvePredCountPredOp',
                            {'code': code, 'op_class': opClass}, [])
        header_output += SvePredCountPredOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type, 'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generates definition for SVE Index generation instructions
    def sveIndex(fmt):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());'''
        if fmt == IndexFormat.ImmReg or fmt == IndexFormat.ImmImm:
            code += '''
        const Element& srcElem1 = imm1;'''
        if fmt == IndexFormat.RegImm or fmt == IndexFormat.RegReg:
            code += '''
        const Element& srcElem1 = XOp1;'''
        if fmt == IndexFormat.RegImm or fmt == IndexFormat.ImmImm:
            code += '''
        const Element& srcElem2 = imm2;'''
        if fmt == IndexFormat.ImmReg or fmt == IndexFormat.RegReg:
            code += '''
        const Element& srcElem2 = XOp2;'''
        code +='''
        for (unsigned i = 0; i < eCount; i++) {
            AA64FpDest_x[i] = srcElem1 + i * srcElem2;
        }'''
        iop = InstObjParams('index', 'SveIndex'+fmt, 'SveIndex'+fmt+'Op',
            {'code': code, 'op_class': 'SimdAluOp'})
        if fmt == IndexFormat.ImmImm:
            header_output += SveIndexIIOpDeclare.subst(iop)
        elif fmt == IndexFormat.ImmReg:
            header_output += SveIndexIROpDeclare.subst(iop)
        elif fmt == IndexFormat.RegImm:
            header_output += SveIndexRIOpDeclare.subst(iop)
        elif fmt == IndexFormat.RegReg:
            header_output += SveIndexRROpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in ['int8_t', 'int16_t', 'int32_t', 'int64_t']:
            substDict = {'targs': type, 'class_name': 'SveIndex'+fmt}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generates definitions for widening unary SVE instructions
    # (always constructive)
    def sveWidenUnaryInst(name, Name, opClass, types, op,
                          predType=PredType.NONE, decoder='Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<DElement>(
                xc->tcBase());
        for (unsigned i = 0; i < eCount; i++) {
            SElement srcElem1 = AA64FpOp1_xd[i];
            DElement destElem = 0;'''
        if predType != PredType.NONE:
            code += '''
            if (GpOp_xd[i]) {
                %(op)s
            } else {
                destElem = %(dest_elem)s;
            }''' % {'op': op,
                    'dest_elem': 'AA64FpDestMerge_xd[i]'
                                 if predType == PredType.MERGE
                                 else '0'}
        else:
            code += '''
            %(op)s''' % {'op': op}
        code += '''
            AA64FpDest_xd[i] = destElem;
        }'''
        iop = InstObjParams(name, 'Sve' + Name,
                            'SveUnaryPredOp' if predType != PredType.NONE
                            else 'SveUnaryUnpredOp',
                            {'code': code, 'op_class': opClass}, [])
        if predType != PredType.NONE:
            header_output += SveWideningUnaryPredOpDeclare.subst(iop)
        else:
            header_output += SveWideningUnaryUnpredOpDeclare.subst(iop)
        exec_output += SveWideningUnaryOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type,
                         'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generates definitions for unary SVE instructions (always constructive)
    def sveUnaryInst(name, Name, opClass, types, op, predType=PredType.NONE,
                     srcRegType=SrcRegType.Vector, decoder='Generic'):
        global header_output, exec_output, decoders
        op1 = ('AA64FpOp1_x[i]' if srcRegType == SrcRegType.Vector
               else 'XOp1' if srcRegType == SrcRegType.Scalar
               else 'AA64FpOp1_x[0]')
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        for (unsigned i = 0; i < eCount; i++) {
            Element srcElem1 = %s;
            Element destElem = 0;''' % op1
        if predType != PredType.NONE:
            code += '''
            if (GpOp_x[i]) {
                %(op)s
            } else {
                destElem = %(dest_elem)s;
            }''' % {'op': op,
                    'dest_elem': 'AA64FpDestMerge_x[i]'
                                 if predType == PredType.MERGE
                                 else '0'}
        else:
            code += '''
            %(op)s''' % {'op': op}
        code += '''
            AA64FpDest_x[i] = destElem;
        }'''
        iop = InstObjParams(name, 'Sve' + Name,
                            'SveUnaryPredOp' if predType != PredType.NONE
                            else 'SveUnaryUnpredOp',
                            {'code': code, 'op_class': opClass}, [])
        if predType != PredType.NONE:
            header_output += SveUnaryPredOpDeclare.subst(iop)
        else:
            header_output += SveUnaryUnpredOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type,
                         'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generates definitions for SVE floating-point conversions (always
    # unary, constructive, merging
    def sveCvtInst(name, Name, opClass, types, op, direction=CvtDir.Narrow,
                   decoder='Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<%(bigElemType)s>(
                xc->tcBase());
        for (unsigned i = 0; i < eCount; i++) {
            SElement srcElem1 = AA64FpOp1_x%(bigElemSuffix)s[i] &
                    mask(sizeof(SElement) * 8);
            DElement destElem = 0;
            if (GpOp_x%(bigElemSuffix)s[i]) {
                %(op)s
                AA64FpDest_x%(bigElemSuffix)s[i] = destElem;
            } else {
                AA64FpDest_x%(bigElemSuffix)s[i] =
                        AA64FpDestMerge_x%(bigElemSuffix)s[i];
            }
        }
        ''' % {'op': op,
               'bigElemType': 'SElement' if direction == CvtDir.Narrow
                                         else 'DElement',
               'bigElemSuffix': 's' if direction == CvtDir.Narrow else 'd'}
        iop = InstObjParams(name, 'Sve' + Name, 'SveUnaryPredOp',
                            {'code': code, 'op_class': opClass}, [])
        header_output += SveWideningUnaryPredOpDeclare.subst(iop)
        exec_output += SveWideningUnaryOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type,
                         'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generates definitions for associative SVE reductions
    def sveAssocReducInst(name, Name, opClass, types, op, identity,
                          decoder='Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        Element destElem = %(identity)s;
        for (unsigned i = 0; i < eCount; i++) {
            AA64FpDest_x[i] = 0;  // zero upper part
            if (GpOp_x[i]) {
                const Element& srcElem1 = AA64FpOp1_x[i];
                %(op)s
            }
        }
        AA64FpDest_x[0] = destElem;
        ''' % {'op': op, 'identity': identity}
        iop = InstObjParams(name, 'Sve' + Name, 'SveReducOp',
                            {'code': code, 'op_class': opClass}, [])
        header_output += SveReducOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type,
                         'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generates definitions for widening associative SVE reductions
    def sveWideningAssocReducInst(name, Name, opClass, types, op, identity,
                                  decoder='Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<SElement>(
                xc->tcBase());
        unsigned eWideCount = ArmStaticInst::getCurSveVecLen<DElement>(
                xc->tcBase());
        DElement destElem = %(identity)s;
        for (unsigned i = 0; i < eCount; i++) {
            if (GpOp_xs[i]) {
                DElement srcElem1 = AA64FpOp1_xs[i];
                %(op)s
            }
        }
        AA64FpDest_xd[0] = destElem;
        for (int i = 1; i < eWideCount; i++) {
            AA64FpDest_xd[i] = 0;
        }
        ''' % {'op': op, 'identity': identity}
        iop = InstObjParams(name, 'Sve' + Name, 'SveReducOp',
                            {'code': code, 'op_class': opClass}, [])
        header_output += SveWideningReducOpDeclare.subst(iop)
        exec_output += SveWideningUnaryOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type,
                         'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generates definitions for non-associative SVE reductions
    def sveNonAssocReducInst(name, Name, opClass, types, op, identity,
                             decoder='Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        TheISA::VecRegContainer tmpVecC;
        auto tmpVec = tmpVecC.as<Element>();
        int ePow2Count = 1;
        while (ePow2Count < eCount) {
            ePow2Count *= 2;
        }

        for (unsigned i = 0; i < ePow2Count; i++) {
            if (i < eCount && GpOp_x[i]) {
                tmpVec[i] = AA64FpOp1_x[i];
            } else {
                tmpVec[i] = %(identity)s;
            }
        }

        unsigned n = ePow2Count;
        while (n > 1) {
            unsigned max = n;
            n = 0;
            for (unsigned i = 0; i < max; i += 2) {
                Element srcElem1 = tmpVec[i];
                Element srcElem2 = tmpVec[i + 1];
                Element destElem = 0;
                %(op)s
                tmpVec[n] = destElem;
                n++;
            }
        }
        AA64FpDest_x[0] = tmpVec[0];
        for (unsigned i = 1; i < eCount; i++) {
            AA64FpDest_x[i] = 0;  // zero upper part
        }
        ''' % {'op': op, 'identity': identity}
        iop = InstObjParams(name, 'Sve' + Name, 'SveReducOp',
                            {'code': code, 'op_class': opClass}, [])
        header_output += SveReducOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type,
                         'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generates definitions for binary SVE instructions with immediate operand
    def sveBinImmInst(name, Name, opClass, types, op, predType=PredType.NONE,
                      decoder='Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        for (unsigned i = 0; i < eCount; i++) {'''
        if predType != PredType.NONE:
            code += '''
            const Element& srcElem1 = %s;''' % (
                'AA64FpDestMerge_x[i]' if predType == PredType.MERGE else '0')
        else:
            code += '''
            const Element& srcElem1 = AA64FpOp1_x[i];'''
        code += '''
            Element srcElem2 = imm;
            Element destElem = 0;'''
        if predType != PredType.NONE:
            code += '''
            if (GpOp_x[i]) {
                %(op)s
            } else {
                destElem = %(dest_elem)s;
            }''' % {'op': op,
                    'dest_elem': 'AA64FpDestMerge_x[i]'
                                 if predType == PredType.MERGE else '0'}
        else:
            code += '''
            %(op)s''' % {'op': op}
        code += '''
            AA64FpDest_x[i] = destElem;
        }'''
        iop = InstObjParams(name, 'Sve' + Name,
                'SveBinImmPredOp' if predType != PredType.NONE
                else 'SveBinImmUnpredConstrOp',
                {'code': code, 'op_class': opClass}, [])
        if predType != PredType.NONE:
            header_output += SveBinImmPredOpDeclare.subst(iop)
        else:
            header_output += SveBinImmUnpredOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type,
                         'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generates definitions for unary and binary SVE instructions with wide
    # immediate operand
    def sveWideImmInst(name, Name, opClass, types, op, predType=PredType.NONE,
                       isUnary=False, decoder='Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        for (unsigned i = 0; i < eCount; i++) {'''
        # TODO: handle unsigned-to-signed conversion properly...
        if isUnary:
            code += '''
            Element srcElem1 = imm;'''
        else:
            code += '''
            const Element& srcElem1 = AA64FpDestMerge_x[i];
            Element srcElem2 = imm;'''
        code += '''
            Element destElem = 0;'''
        if predType != PredType.NONE:
            code += '''
            if (GpOp_x[i]) {
                %(op)s
            } else {
                destElem = %(dest_elem)s;
            }''' % {'op': op,
                    'dest_elem': 'AA64FpDestMerge_x[i]'
                                 if predType == PredType.MERGE else '0'}
        else:
            code += '''
            %(op)s''' % {'op': op}
        code += '''
            AA64FpDest_x[i] = destElem;
        }'''
        iop = InstObjParams(name, 'Sve' + Name,
                'Sve%sWideImm%sOp' % (
                    'Unary' if isUnary else 'Bin',
                    'Unpred' if predType == PredType.NONE else 'Pred'),
                {'code': code, 'op_class': opClass}, [])
        if predType == PredType.NONE:
            header_output += SveWideImmUnpredOpDeclare.subst(iop)
        else:
            header_output += SveWideImmPredOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type,
                         'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generates definitions for shift SVE instructions with wide elements
    def sveShiftByWideElemsInst(name, Name, opClass, types, op,
                                predType=PredType.NONE, decoder='Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        for (unsigned i = 0; i < eCount; i++) {'''
        if predType != PredType.NONE:
            code += '''
            const Element& srcElem1 = AA64FpDestMerge_x[i];'''
        else:
            code += '''
            const Element& srcElem1 = AA64FpOp1_x[i];'''
        code += '''
            const auto& srcElem2 = AA64FpOp2_ud[
                    (i * sizeof(Element) * 8) / 64];
            Element destElem = 0;'''
        if predType != PredType.NONE:
            code += '''
            if (GpOp_x[i]) {
                %(op)s
            } else {
                destElem = %(dest_elem)s;
            }''' % {'op': op,
                    'dest_elem': 'AA64FpDestMerge_x[i]'
                                 if predType == PredType.MERGE else '0'}
        else:
            code += '''
            %(op)s''' % {'op': op}
        code += '''
            AA64FpDest_x[i] = destElem;
        }'''
        iop = InstObjParams(name, 'Sve' + Name,
                            'SveBinDestrPredOp' if predType != PredType.NONE
                            else 'SveBinUnpredOp',
                            {'code': code, 'op_class': opClass}, [])
        if predType != PredType.NONE:
            header_output += SveBinDestrPredOpDeclare.subst(iop)
        else:
            header_output += SveBinUnpredOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type,
                         'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generates definitions for binary SVE instructions
    def sveBinInst(name, Name, opClass, types, op, predType=PredType.NONE,
                   isDestructive=False, customIterCode=None,
                   decoder='Generic'):
        assert not (predType in (PredType.NONE, PredType.SELECT) and
                    isDestructive)
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());'''
        if customIterCode is None:
            code += '''
        for (unsigned i = 0; i < eCount; i++) {'''
            if predType == PredType.MERGE:
                code += '''
                const Element& srcElem1 = AA64FpDestMerge_x[i];'''
            else:
                code += '''
                const Element& srcElem1 = AA64FpOp1_x[i];'''
            code += '''
                const Element& srcElem2 = AA64FpOp2_x[i];
                Element destElem = 0;'''
            if predType != PredType.NONE:
                code += '''
            if (GpOp_x[i]) {
                %(op)s
            } else {
                destElem = %(dest_elem)s;
            }''' % {'op': op,
                    'dest_elem':
                        'AA64FpDestMerge_x[i]' if predType == PredType.MERGE
                        else '0' if predType == PredType.ZERO
                        else 'srcElem2'}
            else:
                code += '''
            %(op)s''' % {'op': op}
            code += '''
            AA64FpDest_x[i] = destElem;
        }'''
        else:
            code += customIterCode
        if predType == PredType.NONE:
            baseClass = 'SveBinUnpredOp'
        elif isDestructive:
            baseClass = 'SveBinDestrPredOp'
        else:
            baseClass = 'SveBinConstrPredOp'
        iop = InstObjParams(name, 'Sve' + Name, baseClass,
                            {'code': code, 'op_class': opClass}, [])
        if predType == PredType.NONE:
            header_output += SveBinUnpredOpDeclare.subst(iop)
        elif isDestructive:
            header_output += SveBinDestrPredOpDeclare.subst(iop)
        else:
            header_output += SveBinConstrPredOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type,
                         'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generates definitions for predicate logical instructions
    def svePredLogicalInst(name, Name, opClass, types, op,
                           predType=PredType.ZERO, isFlagSetting=False,
                           decoder='Generic'):
        global header_output, exec_output, decoders
        assert predType in (PredType.ZERO, PredType.SELECT)
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        for (unsigned i = 0; i < eCount; i++) {
            bool srcElem1 = POp1_x[i];
            bool srcElem2 = POp2_x[i];
            bool destElem = false;
            if (GpOp_x[i]) {
                %(op)s
            } else {
                destElem = %(dest_elem)s;
            }
            PDest_x[i] = destElem;
        }''' % {'op': op,
                'dest_elem': 'false' if predType == PredType.ZERO
                              else 'srcElem2'}
        extraPrologCode = ''
        if isFlagSetting:
            code += '''
        CondCodesNZ = (destPred.firstActive(GpOp, eCount) << 1) |
                      destPred.noneActive(GpOp, eCount);
        CondCodesC = !destPred.lastActive(GpOp, eCount);
        CondCodesV = 0;'''
            extraPrologCode += '''
        auto& destPred = PDest;'''
        iop = InstObjParams(name, 'Sve' + Name, 'SvePredLogicalOp',
                            {'code': code, 'op_class': opClass}, [])
        iop.snippets['code'] = extraPrologCode + iop.snippets['code']
        header_output += SvePredLogicalOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type,
                         'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generates definitions for predicate permute instructions
    def svePredBinPermInst(name, Name, opClass, types, iterCode,
                           decoder='Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());'''
        code += iterCode
        iop = InstObjParams(name, 'Sve' + Name, 'SvePredBinPermOp',
                            {'code': code, 'op_class': opClass}, [])
        header_output += SveBinUnpredOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type,
                         'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generates definitions for SVE compare instructions
    # NOTE: compares are all predicated zeroing
    def sveCmpInst(name, Name, opClass, types, op, isImm=False,
                   decoder='Generic'):
        global header_output, exec_output, decoders
        extraPrologCode = '''
        auto& destPred = PDest;'''
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        destPred.reset();
        for (unsigned i = 0; i < eCount; i++) {
            const Element& srcElem1 = AA64FpOp1_x[i];
            %(src_elem_2_ty)s srcElem2 __attribute__((unused)) =
                                                            %(src_elem_2)s;
            bool destElem = false;
            if (GpOp_x[i]) {
                %(op)s
            } else {
                destElem = false;
            }
            PDest_x[i] = destElem;
        }''' % {'op': op,
                'src_elem_2_ty': 'Element' if isImm else 'const Element&',
                'src_elem_2': 'imm' if isImm else 'AA64FpOp2_x[i]'}
        iop = InstObjParams(name, 'Sve' + Name,
                            'SveCmpImmOp' if isImm else 'SveCmpOp',
                            {'code': code, 'op_class': opClass}, [])
        iop.snippets['code'] = extraPrologCode + iop.snippets['code']
        if isImm:
            header_output += SveCmpImmOpDeclare.subst(iop)
        else:
            header_output += SveCmpOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type,
                         'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generates definitions for ternary SVE intructions (always predicated -
    # merging)
    def sveTerInst(name, Name, opClass, types, op, decoder='Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        for (unsigned i = 0; i < eCount; i++) {
            const Element& srcElem1 = AA64FpOp1_x[i];
            const Element& srcElem2 = AA64FpOp2_x[i];
            Element destElem = AA64FpDestMerge_x[i];
            if (GpOp_x[i]) {
                %(op)s
            }
            AA64FpDest_x[i] = destElem;
        }''' % {'op': op}
        iop = InstObjParams(name, 'Sve' + Name, 'SveTerPredOp',
                            {'code': code, 'op_class': opClass}, [])
        header_output += SveTerPredOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type,
                         'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generates definitions for ternary SVE intructions with immediate operand
    # (always unpredicated)
    def sveTerImmInst(name, Name, opClass, types, op, decoder='Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        for (unsigned i = 0; i < eCount; i++) {
            const Element& srcElem2 = AA64FpOp2_x[i];
            Element srcElem3 = imm;
            Element destElem = AA64FpDestMerge_x[i];
            %(op)s
            AA64FpDest_x[i] = destElem;
        }''' % {'op': op}
        iop = InstObjParams(name, 'Sve' + Name, 'SveTerImmUnpredOp',
                            {'code': code, 'op_class': opClass}, [])
        header_output += SveTerImmUnpredOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type,
                         'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generates definitions for PTRUE and PTRUES instructions.
    def svePtrueInst(name, Name, opClass, types, isFlagSetting=False,
                     decoder='Generic'):
        global header_output, exec_output, decoders
        extraPrologCode = '''
        auto& destPred = PDest;'''
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        unsigned predCount = sveDecodePredCount(imm, eCount);
        destPred.reset();
        for (unsigned i = 0; i < eCount; i++) {
            PDest_x[i] = (i < predCount);
        }'''
        if isFlagSetting:
            code += '''
        CondCodesNZ = (destPred.firstActive(destPred, eCount) << 1) |
                      destPred.noneActive(destPred, eCount);
        CondCodesC = !destPred.lastActive(destPred, eCount);
        CondCodesV = 0;'''
        iop = InstObjParams(name, 'Sve' + Name, 'SvePtrueOp',
                            {'code': code, 'op_class': opClass}, [])
        iop.snippets['code'] = extraPrologCode + iop.snippets['code']
        header_output += SvePtrueOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type,
                         'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generate definitions for integer CMP<cc> instructions
    def sveIntCmpInst(name, Name, opClass, types, op, wideop = False,
            decoder = 'Generic'):
        global header_output, exec_output, decoders
        signed = 'int8_t' in types
        srcType = 'Element'
        op2Suffix = 'x'
        if wideop:
            srcType = 'int64_t' if signed else 'uint64_t'
            op2Suffix = 'sd' if signed else 'ud'
        extraPrologCode = '''
        auto& destPred = PDest;'''
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        destPred.reset();
        for (unsigned i = 0; i < eCount; ++i) {
            %(srcType)s srcElem1 = (%(srcType)s) AA64FpOp1_x[i];
            %(srcType)s srcElem2 = AA64FpOp2_%(op2Suffix)s[%(op2Index)s];
            bool destElem = false;
            if (GpOp_x[i]) {
                %(op)s
            }
            PDest_x[i] = destElem;
        }
        CondCodesNZ = (destPred.firstActive(GpOp, eCount) << 1) |
                      destPred.noneActive(GpOp, eCount);
        CondCodesC = !destPred.lastActive(GpOp, eCount);
        CondCodesV = 0;''' % {
                'op': op,
                'srcType': srcType,
                'op2Suffix': op2Suffix,
                'op2Index': '(i * sizeof(Element)) / 8' if wideop else 'i'
                }
        iop = InstObjParams(name, 'Sve' + Name, 'SveIntCmpOp',
                            {
                                'code': code,
                                'op_class': opClass,
                                'op2IsWide': 'true' if wideop else 'false',
                                }, [])
        iop.snippets['code'] = extraPrologCode + iop.snippets['code']
        header_output += SveIntCmpOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type,
                         'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generate definitions for integer CMP<cc> instructions (with immediate)
    def sveIntCmpImmInst(name, Name, opClass, types, op, decoder = 'Generic'):
        global header_output, exec_output, decoders
        extraPrologCode = '''
        auto& destPred = PDest;'''
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        for (unsigned i = 0; i < eCount; ++i) {
            Element srcElem1 = AA64FpOp1_x[i];
            Element srcElem2 = static_cast<Element>(imm);
            bool destElem = false;
            if (GpOp_x[i]) {
                %(op)s
            }
            PDest_x[i] = destElem;
        }
        CondCodesNZ = (destPred.firstActive(GpOp, eCount) << 1) |
                      destPred.noneActive(GpOp, eCount);
        CondCodesC = !destPred.lastActive(GpOp, eCount);
        CondCodesV = 0;'''%{'op': op}
        iop = InstObjParams(name, 'Sve' + Name, 'SveIntCmpImmOp',
                            {'code': code, 'op_class': opClass,}, [])
        iop.snippets['code'] = extraPrologCode + iop.snippets['code']
        header_output += SveIntCmpImmOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type,
                         'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generate definitions for SVE element count instructions
    def sveElemCountInst(name, Name, opClass, types, op,
            destType = DestType.Scalar, dstIs32b = False,
            dstAcc = True, decoder = 'Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        unsigned count = sveDecodePredCount(pattern, eCount);
        '''
        if destType == DestType.Vector:
            code += '''
        for (unsigned i = 0; i < eCount; ++i) {
            Element srcElem1 = AA64FpDestMerge_x[i];
            Element destElem = 0;
            %(op)s
            AA64FpDest_x[i] = destElem;
        }'''%{'op': op}
        else:
            if 'uint16_t' in types:
                if dstIs32b:
                    dstType = 'uint32_t'
                else:
                    dstType = 'uint64_t'
            else:
                if dstIs32b:
                    dstType = 'int32_t'
                else:
                    dstType = 'int64_t'
            if dstAcc:
                code += '''
        %(dstType)s srcElem1 = XDest;
                '''%{'dstType': dstType}
            code += '''
        %(dstType)s destElem = 0;
        %(op)s;
        XDest = destElem;
        '''%{'op': op, 'dstType': dstType}
        iop = InstObjParams(name, 'Sve' + Name, 'SveElemCountOp',
                {'code': code, 'op_class': opClass, 'dstIsVec': destType,
                 'dstIs32b': 'true' if dstIs32b else 'false'}, [])
        header_output += SveElemCountOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type,
                    'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict);

    def svePartBrkInst(name, Name, opClass, isFlagSetting, predType, whenBrk,
            decoder = 'Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<uint8_t>(
                xc->tcBase());
        bool dobreak = false;
        for (unsigned i = 0; i < eCount; ++i) {
            bool element = POp1_ub[i] == 1;
            if (GpOp_ub[i]) {'''
        breakCode = '''
                dobreak = dobreak || element;'''
        if whenBrk == Break.Before:
            code += breakCode
        code += '''
                PDest_ub[i] = !dobreak;'''
        if whenBrk == Break.After:
            code += breakCode
        code += '''
            }'''
        if predType == PredType.ZERO:
            code += ''' else {
                PDest_ub[i] = 0;
            }'''
        code += '''
        }'''
        extraPrologCode = ''
        if isFlagSetting:
            code += '''
        CondCodesNZ = (destPred.firstActive(GpOp, eCount) << 1) |
                      destPred.noneActive(GpOp, eCount);
        CondCodesC = !destPred.lastActive(GpOp, eCount);
        CondCodesV = 0;'''
            extraPrologCode += '''
        auto& destPred = PDest;'''
        iop = InstObjParams(name, 'Sve' + Name, 'SvePartBrkOp',
                            {'code': code, 'op_class': opClass,
                            'isMerging': 'true' if predType == PredType.MERGE
                                                else 'false'}, [])
        iop.snippets['code'] = extraPrologCode + iop.snippets['code']
        header_output += SvePartBrkOpDeclare.subst(iop)
        exec_output += SveNonTemplatedOpExecute.subst(iop)

    def svePartBrkPropPrevInst(name, Name, opClass, isFlagSetting, whenBrk,
            decoder = 'Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<uint8_t>(
                xc->tcBase());
        bool last = POp1_ub.lastActive(GpOp_ub, eCount);
        for (unsigned i = 0; i < eCount; ++i) {
            if (GpOp_ub[i]) {'''
        breakCode = '''
                last = last && (POp2_ub[i] == 0);'''
        if whenBrk == Break.Before:
            code += breakCode
        code += '''
                PDest_ub[i] = last;'''
        if whenBrk == Break.After:
            code += breakCode
        code += '''
            } else {
                PDest_ub[i] = 0;
            }
        }'''
        extraPrologCode = ''
        if isFlagSetting:
            code += '''
        CondCodesNZ = (destPred.firstActive(GpOp, eCount) << 1) |
                      destPred.noneActive(GpOp, eCount);
        CondCodesC = !destPred.lastActive(GpOp, eCount);
        CondCodesV = 0;'''
            extraPrologCode += '''
        auto& destPred = PDest;'''
        iop = InstObjParams(name, 'Sve' + Name, 'SvePartBrkPropOp',
                            {'code': code, 'op_class': opClass}, [])
        iop.snippets['code'] = extraPrologCode + iop.snippets['code']
        header_output += SvePartBrkPropOpDeclare.subst(iop)
        exec_output += SveNonTemplatedOpExecute.subst(iop)

    def svePartBrkPropNextInst(name, Name, opClass, isFlagSetting,
            decoder = 'Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<uint8_t>(
                xc->tcBase());
        bool last = POp1_ub.lastActive(GpOp_ub, eCount);
        if (!last) {
            for (unsigned i = 0; i < eCount; i++) {
                PDest_ub[i] = 0;
            }
        }'''
        extraPrologCode = ''
        if isFlagSetting:
            code += '''
        PredRegT<uint8_t, MaxSveVecLenInBytes, false, false>::Container c;
        PredRegT<uint8_t, MaxSveVecLenInBytes, false, false> predOnes(c);
        for (unsigned i = 0; i < eCount; i++) {
            predOnes[i] = 1;
        }
        CondCodesNZ = (destPred.firstActive(predOnes, eCount) << 1) |
                      destPred.noneActive(predOnes, eCount);
        CondCodesC = !destPred.lastActive(predOnes, eCount);
        CondCodesV = 0;'''
            extraPrologCode += '''
        auto& destPred = PDest;'''
        iop = InstObjParams(name, 'Sve' + Name, 'SvePartBrkPropOp',
                            {'code': code, 'op_class': opClass}, [])
        iop.snippets['code'] = extraPrologCode + iop.snippets['code']
        header_output += SvePartBrkPropOpDeclare.subst(iop)
        exec_output += SveNonTemplatedOpExecute.subst(iop)

    # Generate definitions for scalar select instructions
    def sveSelectInst(name, Name, opClass, types, op, isCond,
            destType = DestType.Scalar, decoder = 'Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        int last;
        for (last = eCount - 1; last >= 0; --last) {
            if (GpOp_x[last]) {
                break;
            }
        }
        '''
        if isCond:
            code += '''
        if (last >= 0) {'''
        code += '''
            Element destElem;
            %(op)s'''%{'op': op}
        if destType == DestType.Vector:
            code += '''
            for (unsigned i = 0; i < eCount; ++i)
                AA64FpDest_x[i] = destElem;'''
        elif destType == DestType.Scalar:
            code += '''
            XDest = destElem;'''
        if isCond:
            code += '''
        }'''
            if destType == DestType.Scalar:
                code += ''' else {
            XDest = (Element) XDest;
        }'''
        iop = InstObjParams(name, 'Sve' + Name, 'SveSelectOp',
                            {'code': code, 'op_class': opClass,
                             'isCond': 'true' if isCond else 'false',
                             'isScalar': 'true' if destType == DestType.Scalar
                             else 'false'},
                            [])
        header_output += SveSelectOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type,
                         'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generate definitions for PNEXT (find next active predicate)
    # instructions
    def svePNextInst(name, Name, opClass, types, decoder = 'Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        int last;
        for (last = eCount - 1; last >= 0; --last) {
            if (POp1_x[last]) {
                break;
            }
        }
        int next = last + 1;
        while (next < eCount && GpOp_x[next] == 0) {
            next++;
        }
        destPred.reset();
        if (next < eCount) {
            PDest_x[next] = 1;
        }
        CondCodesNZ = (destPred.firstActive(GpOp, eCount) << 1) |
                       destPred.noneActive(GpOp, eCount);
        CondCodesC = !destPred.lastActive(GpOp, eCount);
        CondCodesV = 0;'''
        extraPrologCode = '''
        auto& destPred = PDest;'''
        iop = InstObjParams(name, 'Sve' + Name, 'SveUnaryPredPredOp',
                {'code': code, 'op_class': opClass}, [])
        iop.snippets['code'] = extraPrologCode + iop.snippets['code']
        header_output += SveUnaryPredOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs' : type,
                         'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generate definitions for PFIRST (set first active predicate)
    # instructions
    def svePFirstInst(name, Name, opClass, decoder = 'Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        int first = -1;
        for (int i = 0; i < eCount; ++i) {
            if (GpOp_x[i] && first == -1) {
                first = i;
            }
        }
        if (first >= 0) {
            PDest_x[first] = 1;
        }
        CondCodesNZ = (destPred.firstActive(GpOp, eCount) << 1) |
                       destPred.noneActive(GpOp, eCount);
        CondCodesC = !destPred.lastActive(GpOp, eCount);
        CondCodesV = 0;'''
        extraPrologCode = '''
        auto& destPred = PDest;'''
        iop = InstObjParams(name, 'Sve' + Name, 'SveUnaryPredPredOp',
                {'code': code, 'op_class': opClass}, [])
        iop.snippets['code'] = extraPrologCode + iop.snippets['code']
        header_output += SveUnaryPredOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        substDict = {'targs' : 'uint8_t',
                     'class_name' : 'Sve' + Name}
        exec_output += SveOpExecDeclare.subst(substDict)

    # Generate definitions for SVE TBL instructions
    def sveTblInst(name, Name, opClass, decoder = 'Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        for (int i = 0; i < eCount; ++i) {
            Element idx = AA64FpOp2_x[i];
            Element val;
            if (idx < eCount) {
                val = AA64FpOp1_x[idx];
            } else {
                val = 0;
            }
            AA64FpDest_x[i] = val;
        }'''
        iop = InstObjParams(name, 'Sve' + Name, 'SveTblOp',
                {'code': code, 'op_class': opClass}, [])
        header_output += SveBinUnpredOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in unsignedTypes:
            substDict = {'targs' : type,
                         'class_name' : 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generate definitions for SVE Unpack instructions
    def sveUnpackInst(name, Name, opClass, sdtypes, unpackHalf,
                      regType, decoder = 'Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<DElement>(
                xc->tcBase());
        for (int i = 0; i < eCount; ++i) {'''
        if regType == SrcRegType.Predicate:
            if unpackHalf == Unpack.High:
                code +='''
            const SElement& srcElem1 = POp1_xs[i + eCount];'''
            else:
                code +='''
            const SElement& srcElem1 = POp1_xs[i];'''
            code += '''
            PDest_xd[i] = srcElem1;'''
        else:
            if unpackHalf == Unpack.High:
                code +='''
            const SElement& srcElem1 = AA64FpOp1_xs[i + eCount];'''
            else:
                code +='''
            const SElement& srcElem1 = AA64FpOp1_xs[i];'''
            code += '''
            AA64FpDest_xd[i] = static_cast<DElement>(srcElem1);'''
        code += '''
        }
        '''
        iop = InstObjParams(name, 'Sve' + Name, 'SveUnpackOp',
                {'code': code, 'op_class': opClass}, [])
        header_output += SveUnpackOpDeclare.subst(iop)
        exec_output += SveWideningUnaryOpExecute.subst(iop)
        for srcType, dstType in sdtypes:
            substDict = {'targs': srcType + ', ' + dstType,
                         'class_name': 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generate definition for SVE predicate test instructions
    def svePredTestInst(name, Name, opClass, decoder = 'Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<uint8_t>(
                xc->tcBase());
        CondCodesNZ = (POp1_ub.firstActive(GpOp_ub, eCount) << 1) |
                       POp1_ub.noneActive(GpOp_ub, eCount);
        CondCodesC = !POp1_ub.lastActive(GpOp_ub, eCount);
        CondCodesV = 0;'''
        iop = InstObjParams(name, 'Sve' + Name, 'SvePredTestOp',
                {'code': code, 'op_class': opClass}, [])
        header_output += SvePredicateTestOpDeclare.subst(iop)
        exec_output += SveNonTemplatedOpExecute.subst(iop)

    # Generate definition for SVE predicate compact operations
    def sveCompactInst(name, Name, opClass, types, decoder = 'Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        unsigned x = 0;
        for (unsigned i = 0; i < eCount; ++i) {
            AA64FpDest_x[i] = 0;
            if (GpOp_x[i]) {
                AA64FpDest_x[x] = AA64FpOp1_x[i];
                x++;
            }
        }'''
        iop = InstObjParams(name, 'Sve' + Name, 'SveUnaryPredOp',
                {'code': code, 'op_class': opClass}, [])
        header_output += SveUnaryPredOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs': type, 'class_name': 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generate definition for unary SVE predicate instructions with implicit
    # source operand (PFALSE, RDFFR(S))
    def svePredUnaryWImplicitSrcInst(name, Name, opClass, op,
            predType=PredType.NONE, isFlagSetting=False, decoder='Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + op
        if isFlagSetting:
            code += '''
        CondCodesNZ = (destPred.firstActive(GpOp, eCount) << 1) |
                      destPred.noneActive(GpOp, eCount);
        CondCodesC = !destPred.lastActive(GpOp, eCount);
        CondCodesV = 0;'''
        extraPrologCode = '''
        auto& destPred M5_VAR_USED = PDest;'''
        baseClass = ('SvePredUnaryWImplicitSrcOp' if predType == PredType.NONE
                     else 'SvePredUnaryWImplicitSrcPredOp')
        iop = InstObjParams(name, 'Sve' + Name, baseClass,
                {'code': code, 'op_class': opClass}, [])
        iop.snippets['code'] = extraPrologCode + iop.snippets['code']
        if predType == PredType.NONE:
            header_output += SvePredUnaryOpWImplicitSrcDeclare.subst(iop)
        else:
            header_output += SvePredUnaryPredOpWImplicitSrcDeclare.subst(iop)
        exec_output += SveNonTemplatedOpExecute.subst(iop)

    # Generate definition for SVE instructions writing to the FFR (SETFFR,
    # WRFFR)
    def svePredWriteFfrInst(name, Name, opClass, op, isSetFfr,
            decoder='Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + op
        extraPrologCode = '''
        auto& destPred M5_VAR_USED = Ffr;'''
        baseClass = ('SveWImplicitSrcDstOp' if isSetFfr
                     else 'SvePredUnaryWImplicitDstOp')
        iop = InstObjParams(name, 'Sve' + Name, baseClass,
                {'code': code, 'op_class': opClass}, [])
        iop.snippets['code'] = extraPrologCode + iop.snippets['code']
        if isSetFfr:
            header_output += SveOpWImplicitSrcDstDeclare.subst(iop)
        else:
            header_output += SvePredUnaryOpWImplicitDstDeclare.subst(iop)
        exec_output += SveNonTemplatedOpExecute.subst(iop)

    # Generate definition for SVE Ext instruction
    def sveExtInst(name, Name, opClass, decoder = 'Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        uint64_t pos = imm;
        if (pos >= eCount)
            pos = 0;
        for (int i = 0; i < eCount; ++i, ++pos)
        {
            if (pos < eCount)
                AA64FpDest_x[i] = AA64FpDestMerge_x[pos];
            else
                AA64FpDest_x[i] = AA64FpOp1_x[pos-eCount];
        }
        '''
        iop = InstObjParams(name, 'Sve' + Name, 'SveBinImmUnpredDestrOp',
                {'code': code, 'op_class': opClass}, [])
        header_output += SveBinImmUnpredOpDeclare.subst(iop);
        exec_output += SveOpExecute.subst(iop)
        substDict = {'targs': 'uint8_t', 'class_name': 'Sve' + Name}
        exec_output += SveOpExecDeclare.subst(substDict)

    # Generate definition for SVE Slice instruction
    def sveSpliceInst(name, Name, opClass, types, decoder = 'Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        int firstelem = -1, lastelem = -2;
        for (int i = 0; i < eCount; ++i) {
            if (GpOp_x[i]) {
                lastelem = i;
                if (firstelem < 0)
                    firstelem = i;
            }
        }
        int x = 0;
        for (int i = firstelem; i <= lastelem; ++i, ++x) {
            AA64FpDest_x[x] = AA64FpDestMerge_x[i];
        }
        int remaining = eCount - x;
        for (int i = 0; i < remaining; ++i, ++x) {
            AA64FpDest_x[x] = AA64FpOp2_x[i];
        }
        '''
        iop = InstObjParams(name, 'Sve' + Name, 'SveBinDestrPredOp',
                {'code': code, 'op_class': opClass}, [])
        header_output += SveBinDestrPredOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs': type, 'class_name': 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generate definition for SVE DUP (index) instruction
    def sveDupIndexInst(name, Name, opClass, types, decoder = 'Generic'):
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());
        Element srcElem1 = 0;
        if (imm < eCount) {
            srcElem1 = AA64FpOp1_x[imm];
        }
        for (int i = 0; i < eCount; ++i) {
            AA64FpDest_x[i] = srcElem1;
        }'''
        iop = InstObjParams(name, 'Sve' + Name, 'SveBinImmIdxUnpredOp',
                {'code': code, 'op_class': opClass}, [])
        header_output += SveBinImmUnpredOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs': type, 'class_name': 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generate definition for SVE reverse elements instructions
    def sveReverseElementsInst(name, Name, opClass, types,
            srcType = SrcRegType.Vector, decoder = 'Generic'):
        assert srcType in (SrcRegType.Vector, SrcRegType.Predicate)
        global header_output, exec_output, decoders
        extraPrologCode = '''
        auto& destPred = PDest;'''
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());'''
        if srcType == SrcRegType.Predicate:
            code += '''
        PDest_x[0] = 0;'''
        code += '''
        for (int i = 0; i < eCount; ++i) {'''
        if srcType == SrcRegType.Vector:
            code += '''
            AA64FpDest_x[i] = AA64FpOp1_x[eCount - i - 1];'''
        else:
            code += '''
            destPred.set_raw(i, POp1_x.get_raw(eCount - i - 1));'''
        code += '''
        }'''
        iop = InstObjParams(name, 'Sve' + Name, 'SveUnaryUnpredOp',
                {'code': code, 'op_class': opClass}, [])
        if srcType == SrcRegType.Predicate:
            iop.snippets['code'] = extraPrologCode + iop.snippets['code']
        header_output += SveUnaryUnpredOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs': type, 'class_name': 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    # Generate definition for shift & insert instructions
    def sveShiftAndInsertInst(name, Name, opClass, types,
            srcType = SrcRegType.Scalar, decoder = 'Generic'):
        assert srcType in (SrcRegType.Vector, SrcRegType.Scalar)
        global header_output, exec_output, decoders
        code = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<Element>(
                xc->tcBase());'''
        if srcType == SrcRegType.Scalar:
            code += '''
            auto& srcElem1 = XOp1;'''
        else:
            code += '''
            auto& srcElem1 = AA64FpOp1;'''
        code += '''
        for (int i = eCount - 1; i > 0; --i) {
            AA64FpDest_x[i] = AA64FpDestMerge_x[i-1];
        }
        AA64FpDest_x[0] = srcElem1;'''
        iop = InstObjParams(name, 'Sve' + Name, 'SveUnarySca2VecUnpredOp',
                {'code': code, 'op_class': opClass}, [])
        header_output += SveUnaryUnpredOpDeclare.subst(iop)
        exec_output += SveOpExecute.subst(iop)
        for type in types:
            substDict = {'targs': type, 'class_name': 'Sve' + Name}
            exec_output += SveOpExecDeclare.subst(substDict)

    fpTypes = ('uint16_t', 'uint32_t', 'uint64_t')
    signedTypes = ('int8_t', 'int16_t', 'int32_t', 'int64_t')
    unsignedTypes = ('uint8_t', 'uint16_t', 'uint32_t', 'uint64_t')

    smallSignedTypes = ('int8_t', 'int16_t', 'int32_t')
    bigSignedTypes = ('int16_t', 'int32_t', 'int64_t')
    smallUnsignedTypes = ('uint8_t', 'uint16_t', 'uint32_t')
    bigUnsignedTypes = ('uint16_t', 'uint32_t', 'uint64_t')

    unsignedWideSDTypes = (('uint8_t', 'uint16_t'),
            ('uint16_t', 'uint32_t'), ('uint32_t', 'uint64_t'))
    signedWideSDTypes = (('int8_t', 'int16_t'),
            ('int16_t', 'int32_t'), ('int32_t', 'int64_t'))

    # ABS
    absCode = 'destElem = (Element) std::abs(srcElem1);'
    sveUnaryInst('abs', 'Abs', 'SimdAluOp', signedTypes, absCode,
                 PredType.MERGE)
    # ADD (immediate)
    sveWideImmInst('add', 'AddImm', 'SimdAddOp', unsignedTypes, addCode, False)
    # ADD (vectors, predicated)
    addCode = 'destElem = srcElem1 + srcElem2;'
    sveBinInst('add', 'AddPred', 'SimdAddOp', unsignedTypes, addCode,
               PredType.MERGE, True)
    # ADD (vectors, unpredicated)
    addCode = 'destElem = srcElem1 + srcElem2;'
    sveBinInst('add', 'AddUnpred', 'SimdAddOp', unsignedTypes, addCode)
    # ADDPL
    addvlCode = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<uint%d_t>(
                xc->tcBase());
        XDest = XOp1 + eCount * (int64_t) imm;
    '''
    buildXImmDataInst('addpl', addvlCode % 64, buildCc=False)
    # ADDVL
    buildXImmDataInst('addvl', addvlCode % 8, buildCc=False)
    # ADR
    adrCode = '''
            if (offsetFormat == SveAdrOffsetUnpackedSigned) {
                srcElem2 = sext<32>(srcElem2 & mask(32));
            } else if (offsetFormat == SveAdrOffsetUnpackedUnsigned) {
                srcElem2 = srcElem2 & mask(32);
            }
            destElem = srcElem1 + srcElem2 * mult;
    '''
    sveAdrInst('adr', 'Adr', 'SimdAddOp', ('uint32_t', 'uint64_t'), adrCode)
    # AND (immediate)
    andCode = 'destElem = srcElem1 & srcElem2;'
    sveWideImmInst('and', 'AndImm', 'SimdAluOp', ('uint64_t',), andCode)
    # AND (vectors, predicated)
    sveBinInst('and', 'AndPred', 'SimdAluOp', unsignedTypes, andCode,
               PredType.MERGE, True)
    # AND (vectors, unpredicated)
    andCode = 'destElem = srcElem1 & srcElem2;'
    sveBinInst('and', 'AndUnpred', 'SimdAluOp', ('uint64_t',), andCode)
    # AND, ANDS (predicates)
    svePredLogicalInst('and', 'PredAnd', 'SimdPredAluOp', ('uint8_t',),
                       andCode)
    svePredLogicalInst('ands', 'PredAnds', 'SimdPredAluOp', ('uint8_t',),
                       andCode, isFlagSetting=True)
    # ANDV
    andvCode = 'destElem &= srcElem1;'
    sveAssocReducInst('andv', 'Andv', 'SimdReduceAluOp', unsignedTypes,
                      andvCode, 'std::numeric_limits<Element>::max()')
    # ASR (immediate, predicated)
    asrCode = '''
            int sign_bit = bits(srcElem1, sizeof(Element) * 8 - 1);
            if (srcElem2 == 0) {
                destElem = srcElem1;
            } else if (srcElem2 >= sizeof(Element) * 8) {
                destElem = sign_bit ? std::numeric_limits<Element>::max() : 0;
            } else {
                destElem = srcElem1 >> srcElem2;
                if (sign_bit) {
                    destElem |= ~mask(sizeof(Element) * 8 - srcElem2);
                }
            }
    '''
    sveBinImmInst('asr', 'AsrImmPred', 'SimdAluOp', unsignedTypes, asrCode,
                  PredType.MERGE)
    # ASR (immediate, unpredicated)
    sveBinImmInst('asr', 'AsrImmUnpred', 'SimdAluOp', unsignedTypes, asrCode)
    # ASR (vectors)
    sveBinInst('asr', 'AsrPred', 'SimdAluOp', unsignedTypes, asrCode,
               PredType.MERGE, True)
    # ASR (wide elements, predicated)
    sveShiftByWideElemsInst('asr', 'AsrWidePred', 'SimdAluOp', unsignedTypes,
                            asrCode, PredType.MERGE)
    # ASR (wide elements, unpredicated)
    sveShiftByWideElemsInst('asr', 'AsrWideUnpred', 'SimdAluOp', unsignedTypes,
                            asrCode)
    # ASRD
    asrdCode = '''
        Element element1 = srcElem1;
        Element shift = srcElem2;
        if (srcElem1 < 0) {
            Element tmp = ((1L << shift) - 1L);
            if (tmp == -1L) {
                element1 = 0;
            } else {
                element1 = element1 + tmp;
            }
        }
        destElem = (element1 >> shift);
    '''
    sveBinImmInst('asrd', 'Asrd', 'SimdAluOp', signedTypes, asrdCode,
                  PredType.MERGE)
    # ASRR
    asrrCode = '''
            int sign_bit = bits(srcElem2, sizeof(Element) * 8 - 1);
            if (srcElem1 == 0) {
                destElem = srcElem2;
            } else if (srcElem1 >= sizeof(Element) * 8) {
                destElem = sign_bit ? std::numeric_limits<Element>::max() : 0;
            } else {
                destElem = srcElem2 >> srcElem1;
                if (sign_bit) {
                    destElem |= ~mask(sizeof(Element) * 8 - srcElem1);
                }
            }
    '''
    sveBinInst('asrr', 'Asrr', 'SimdAluOp', unsignedTypes, asrrCode,
               PredType.MERGE, True)
    # BIC (vectors, predicated)
    bicCode = 'destElem = srcElem1 & ~srcElem2;'
    sveBinInst('bic', 'BicPred', 'SimdAluOp', unsignedTypes, bicCode,
               PredType.MERGE, True)
    # BIC (vectors, unpredicated)
    bicCode = 'destElem = srcElem1 & ~srcElem2;'
    sveBinInst('bic', 'BicUnpred', 'SimdAluOp', unsignedTypes, bicCode)
    # BIC, BICS (predicates)
    svePredLogicalInst('bic', 'PredBic', 'SimdPredAluOp', ('uint8_t',),
                       bicCode)
    svePredLogicalInst('bics', 'PredBics', 'SimdPredAluOp', ('uint8_t',),
                       bicCode, isFlagSetting=True)
    # BRKA (merging)
    svePartBrkInst('brka', 'Brkam', 'SimdPredAluOp', isFlagSetting = False,
            predType = PredType.MERGE, whenBrk = Break.After)
    # BRKA (zeroing)
    svePartBrkInst('brka', 'Brkaz', 'SimdPredAluOp', isFlagSetting = False,
            predType = PredType.ZERO, whenBrk = Break.After)
    # BRKAS
    svePartBrkInst('brkas', 'Brkas', 'SimdPredAluOp', isFlagSetting = True,
            predType = PredType.ZERO, whenBrk = Break.After)
    # BRKB (merging)
    svePartBrkInst('brkb', 'Brkbm', 'SimdPredAluOp', isFlagSetting = False,
            predType = PredType.MERGE, whenBrk = Break.Before)
    # BRKB (zeroging)
    svePartBrkInst('brkb', 'Brkbz', 'SimdPredAluOp', isFlagSetting = False,
            predType = PredType.ZERO, whenBrk = Break.Before)
    # BRKBS (zeroing)
    svePartBrkInst('brkbs', 'Brkbs', 'SimdPredAluOp', isFlagSetting = True,
            predType = PredType.ZERO, whenBrk = Break.Before)
    # BRKN
    svePartBrkPropNextInst('brkn', 'Brkn', 'SimdPredAluOp',
            isFlagSetting = False)
    # BRKNS
    svePartBrkPropNextInst('brkns', 'Brkns', 'SimdPredAluOp',
            isFlagSetting = True)
    # BRKPA
    svePartBrkPropPrevInst('brkpa', 'Brkpa', 'SimdPredAluOp',
            isFlagSetting = False, whenBrk = Break.After)
    # BRKPAS
    svePartBrkPropPrevInst('brkpas', 'Brkpas', 'SimdPredAluOp',
            isFlagSetting = True, whenBrk = Break.After)
    # BRKPB
    svePartBrkPropPrevInst('brkpb', 'Brkpb', 'SimdPredAluOp',
            isFlagSetting = False, whenBrk = Break.Before)
    # BRKPBS
    svePartBrkPropPrevInst('brkpbs', 'Brkpbs', 'SimdPredAluOp',
            isFlagSetting = True, whenBrk = Break.Before)
    # CLASTA (scalar)
    clastaCode = '''
        last++;
        if (last >= eCount)
            last = 0;
        destElem = AA64FpOp1_x[last];'''
    sveSelectInst('clasta', 'Clasta', 'SimdAluOp', unsignedTypes, clastaCode,
            isCond = True, destType = DestType.Scalar)
    # CLASTA (vector)
    sveSelectInst('clasta', 'Clastav', 'SimdAluOp', unsignedTypes, clastaCode,
            isCond = True, destType = DestType.Vector)
    # CLASTB (scalar)
    clastbCode = '''
        destElem = AA64FpOp1_x[last];'''
    sveSelectInst('clastb', 'Clastb', 'SimdAluOp', unsignedTypes, clastbCode,
            isCond = True, destType = DestType.Scalar)
    # CLASTB (vector)
    sveSelectInst('clastb', 'Clastbv', 'SimdAluOp', unsignedTypes, clastbCode,
            isCond = True, destType = DestType.Vector)
    # CLS
    clsCode = '''
        destElem = 0;
        Element val = srcElem1;
        if (val < 0) {
            val <<= 1;
            while (val < 0) {
                destElem++;
                val <<= 1;
            }
        } else {
            val <<= 1;
            while (val >= 0 && destElem < sizeof(Element) * 8 - 1) {
                destElem++;
                val <<= 1;
            }
        }
    '''
    sveUnaryInst('cls', 'Cls', 'SimdAluOp', signedTypes, clsCode,
                 PredType.MERGE)
    # CLZ
    clzCode = '''
        destElem = 0;
        Element val = srcElem1;
        while (val >= 0 && destElem < sizeof(Element) * 8) {
            destElem++;
            val <<= 1;
        }
    '''
    sveUnaryInst('clz', 'Clz', 'SimdAluOp', signedTypes, clzCode,
                 PredType.MERGE)
    # CMPEQ (immediate)
    cmpeqCode = '''
        destElem = (srcElem1 == srcElem2);
    '''
    sveIntCmpImmInst('cmpeq', 'Cmpeqi', 'SimdCmpOp', unsignedTypes, cmpeqCode)
    # CMPEQ (vectors)
    sveIntCmpInst('cmpeq', 'Cmpeq', 'SimdCmpOp', unsignedTypes, cmpeqCode)
    # CMPEQ (wide elements)
    sveIntCmpInst('cmpeq', 'Cmpeqw', 'SimdCmpOp', smallUnsignedTypes,
            cmpeqCode, True)
    # CMPGE (immediate)
    cmpgeCode = '''
        destElem = (srcElem1 >= srcElem2);
    '''
    sveIntCmpImmInst('cmpge', 'Cmpgei', 'SimdCmpOp', signedTypes, cmpgeCode)
    # CMPGE (vectors)
    sveIntCmpInst('cmpge', 'Cmpge', 'SimdCmpOp', signedTypes, cmpgeCode)
    # CMPGE (wide elements)
    sveIntCmpInst('cmpge', 'Cmpgew', 'SimdCmpOp', smallSignedTypes,
            cmpgeCode, True)
    # CMPGT (immediate)
    cmpgtCode = '''
        destElem = (srcElem1 > srcElem2);
    '''
    sveIntCmpImmInst('cmpge', 'Cmpgti', 'SimdCmpOp', signedTypes, cmpgtCode)
    # CMPGT (vectors)
    sveIntCmpInst('cmpge', 'Cmpgt', 'SimdCmpOp', signedTypes, cmpgtCode)
    # CMPGT (wide elements)
    sveIntCmpInst('cmpge', 'Cmpgtw', 'SimdCmpOp', smallSignedTypes,
            cmpgtCode, True)
    # CMPHI (immediate)
    sveIntCmpImmInst('cmphi', 'Cmphii', 'SimdCmpOp', unsignedTypes, cmpgtCode)
    # CMPHI (vectors)
    sveIntCmpInst('cmphi', 'Cmphi', 'SimdCmpOp', unsignedTypes, cmpgtCode)
    # CMPHI (wide elements)
    sveIntCmpInst('cmphi', 'Cmphiw', 'SimdCmpOp', smallUnsignedTypes,
            cmpgtCode, True)
    # CMPHS (immediate)
    sveIntCmpImmInst('cmphs', 'Cmphsi', 'SimdCmpOp', unsignedTypes, cmpgeCode)
    # CMPHS (vectors)
    sveIntCmpInst('cmphs', 'Cmphs', 'SimdCmpOp', unsignedTypes, cmpgeCode)
    # CMPHS (wide elements)
    sveIntCmpInst('cmphs', 'Cmphsw', 'SimdCmpOp', smallUnsignedTypes,
            cmpgeCode, True)
    # CMPLE (immediate)
    cmpleCode = '''
        destElem = (srcElem1 <= srcElem2);
    '''
    sveIntCmpImmInst('cmple', 'Cmplei', 'SimdCmpOp', signedTypes, cmpleCode)
    # CMPLE (wide elements)
    sveIntCmpInst('cmple', 'Cmplew', 'SimdCmpOp', smallSignedTypes,
            cmpleCode, True)
    # CMPLO (immediate)
    cmpltCode = '''
        destElem = (srcElem1 < srcElem2);
    '''
    sveIntCmpImmInst('cmplo', 'Cmploi', 'SimdCmpOp', unsignedTypes, cmpltCode)
    # CMPLO (wide elements)
    sveIntCmpInst('cmplo', 'Cmplow', 'SimdCmpOp', smallUnsignedTypes,
            cmpltCode, True)
    # CMPLS (immediate)
    sveIntCmpImmInst('cmpls', 'Cmplsi', 'SimdCmpOp', unsignedTypes, cmpleCode)
    # CMPLS (wide elements)
    sveIntCmpInst('cmpls', 'Cmplsw', 'SimdCmpOp', smallUnsignedTypes,
            cmpleCode, True)
    # CMPLT (immediate)
    sveIntCmpImmInst('cmplt', 'Cmplti', 'SimdCmpOp', signedTypes, cmpltCode)
    # CMPLT (wide elements)
    sveIntCmpInst('cmplt', 'Cmpltw', 'SimdCmpOp', smallSignedTypes,
            cmpltCode, True)
    # CMPNE (immediate)
    cmpneCode = '''
        destElem = (srcElem1 != srcElem2);
    '''
    sveIntCmpImmInst('cmpeq', 'Cmpnei', 'SimdCmpOp', unsignedTypes, cmpneCode)
    # CMPNE (vectors)
    sveIntCmpInst('cmpeq', 'Cmpne', 'SimdCmpOp', unsignedTypes, cmpneCode)
    # CMPNE (wide elements)
    sveIntCmpInst('cmpeq', 'Cmpnew', 'SimdCmpOp', smallUnsignedTypes,
            cmpneCode, True)
    # CNOT
    cnotCode = '''
        destElem = srcElem1?0:1;
    '''
    sveUnaryInst('cnot', 'Cnot', 'SimdAluOp', unsignedTypes, cnotCode,
                 PredType.MERGE)
    # CNT
    cntCode = '''
        destElem = 0;
        Element val = srcElem1;
        while (val) {
            destElem += val & 0x1;
            val >>= 1;
        }
    '''
    sveUnaryInst('cnt', 'Cnt', 'SimdAluOp', unsignedTypes, cntCode,
                 PredType.MERGE)
    # CNTB, CNTD, CNTH, CNTW
    cntxCode = '''
        destElem = (count * imm);
    '''
    sveElemCountInst('cnt', 'Cntx', 'SimdAluOp', unsignedTypes, cntxCode,
            destType = DestType.Scalar, dstIs32b = False, dstAcc = False)
    # COMPACT
    sveCompactInst('compact', 'Compact', 'SimdPredAluOp',
            ('uint32_t', 'uint64_t'))
    # CPY (immediate)
    dupCode = 'destElem = srcElem1;'
    sveWideImmInst('cpy', 'CpyImmMerge', 'SimdAluOp', unsignedTypes, dupCode,
                   predType=PredType.MERGE, isUnary=True)
    sveWideImmInst('cpy', 'CpyImmZero', 'SimdAluOp', unsignedTypes, dupCode,
                   predType=PredType.ZERO, isUnary=True)
    # CPY (scalar)
    sveUnaryInst('cpy', 'CpyScalar', 'SimdAluOp', unsignedTypes, dupCode,
                 PredType.MERGE, srcRegType=SrcRegType.Scalar)
    # CPY (SIMD&FP scalar)
    sveUnaryInst('cpy', 'CpySimdFpScalar', 'SimdAluOp', unsignedTypes, dupCode,
                 PredType.MERGE, srcRegType=SrcRegType.SimdFpScalar)
    # CNTP
    svePredCountPredInst('cntp', 'Cntp', 'SimdAluOp', unsignedTypes)
    # CTERMEQ
    cteqCode = '''
        destElem = srcElem1 == srcElem2;
    '''
    sveCompTermInst('ctermeq', 'Ctermeq', 'IntAluOp',
            ['uint32_t', 'uint64_t'], cteqCode)
    # CTERMNE
    ctneCode = '''
        destElem = srcElem1 != srcElem2;
    '''
    sveCompTermInst('ctermne', 'Ctermne', 'IntAluOp',
            ['uint32_t', 'uint64_t'], ctneCode)
    # DECB, DECH, DECW, DECD (scalar)
    decxCode = '''
        destElem = srcElem1 - (count * imm);
    '''
    sveElemCountInst('dec', 'Dec', 'SimdAluOp', unsignedTypes, decxCode,
            destType = DestType.Scalar, dstIs32b = False)
    # DECH, DECW, DECD (vector)
    sveElemCountInst('dec', 'Decv', 'SimdAluOp', bigUnsignedTypes, decxCode,
            destType = DestType.Vector, dstIs32b = False)
    # DECP (scalar)
    decpCode = '''
    XDest = XDest - count;
    '''
    svePredCountInst('decp', 'Decp', 'SimdAluOp', unsignedTypes, decpCode,
                     DestType.Scalar, SrcSize.Src64bit)
    # DECP (vector)
    decpvCode = '''
    destElem = srcElem - count;
    '''
    svePredCountInst('decp', 'Decpv', 'SimdAluOp', unsignedTypes, decpvCode,
                     DestType.Vector)
    # DUP (immediate)
    sveWideImmInst('dup', 'DupImm', 'SimdAluOp', unsignedTypes, dupCode,
                   isUnary=True)
    # DUP (index)
    sveDupIndexInst('mov', 'DupIdx', 'SimdAluOp', unsignedTypes)
    # DUP (scalar)
    sveUnaryInst('dup', 'DupScalar', 'SimdAluOp', unsignedTypes, dupCode,
                 PredType.NONE, srcRegType=SrcRegType.Scalar)
    # DUPM
    sveWideImmInst('dupm', 'Dupm', 'SimdAluOp', unsignedTypes, dupCode,
                   isUnary=True)
    # EOR (immediate)
    eorCode = 'destElem = srcElem1 ^ srcElem2;'
    sveWideImmInst('eor', 'EorImm', 'SimdAluOp', ('uint64_t',), eorCode)
    # EOR (vectors, predicated)
    sveBinInst('eor', 'EorPred', 'SimdAluOp', unsignedTypes, eorCode,
               PredType.MERGE, True)
    # EOR (vectors, unpredicated)
    eorCode = 'destElem = srcElem1 ^ srcElem2;'
    sveBinInst('eor', 'EorUnpred', 'SimdAluOp', ('uint64_t',), eorCode)
    # EOR, EORS (predicates)
    svePredLogicalInst('eor', 'PredEor', 'SimdPredAluOp', ('uint8_t',),
                       eorCode)
    svePredLogicalInst('eors', 'PredEors', 'SimdPredAluOp', ('uint8_t',),
                       eorCode, isFlagSetting=True)
    # EORV
    eorvCode = 'destElem ^= srcElem1;'
    sveAssocReducInst('eorv', 'Eorv', 'SimdReduceAluOp', unsignedTypes,
                      eorvCode, '0')
    # EXT
    sveExtInst('ext', 'Ext', 'SimdAluOp')
    # FABD
    fpOp = '''
            FPSCR fpscr = (FPSCR) FpscrExc;
            destElem = %s;
            FpscrExc = fpscr;
    '''
    fabdCode = fpOp % 'fplibAbs<Element>(fplibSub(srcElem1, srcElem2, fpscr))'
    sveBinInst('fabd', 'Fabd', 'SimdFloatAddOp', floatTypes, fabdCode,
               PredType.MERGE, True)
    # FABS
    fabsCode = 'destElem = fplibAbs<Element>(srcElem1);'
    sveUnaryInst('fabs', 'Fabs', 'SimdFloatAluOp', fpTypes, fabsCode,
                 PredType.MERGE)
    # FACGE
    fpCmpAbsOp = fpOp % ('fplibCompare%s<Element>(fplibAbs<Element>(srcElem1),'
                         ' fplibAbs<Element>(srcElem2), fpscr)')
    facgeCode = fpCmpAbsOp % 'GE'
    sveCmpInst('facge', 'Facge', 'SimdFloatCmpOp', fpTypes, facgeCode)
    # FACGT
    facgtCode = fpCmpAbsOp % 'GT'
    sveCmpInst('facgt', 'Facgt', 'SimdFloatCmpOp', fpTypes, facgtCode)
    # FADD (immediate)
    fpBinOp = fpOp % 'fplib%s<Element>(srcElem1, srcElem2, fpscr)'
    faddCode = fpBinOp % 'Add'
    sveBinImmInst('fadd', 'FaddImm', 'SimdFloatAddOp', floatTypes, faddCode,
                  PredType.MERGE)
    # FADD (vectors, predicated)
    sveBinInst('fadd', 'FaddPred', 'SimdFloatAddOp', floatTypes, faddCode,
               PredType.MERGE, True)
    # FADD (vectors, unpredicated)
    sveBinInst('fadd', 'FaddUnpred', 'SimdFloatAddOp', floatTypes, faddCode)
    # TODO: FADDA
    # FADDV
    fpReduceOp = '''
            FPSCR fpscr = (FPSCR) FpscrExc;
            destElem = fplib%s<Element>(srcElem1, srcElem2, fpscr);
            FpscrExc = FpscrExc | fpscr;
    '''
    faddvCode = fpReduceOp % 'Add'
    sveNonAssocReducInst('faddv', 'Faddv', 'SimdFloatReduceAddOp', floatTypes,
                         faddvCode, '0')
    # FCMEQ (vectors)
    fpCmpOp = fpOp % ('fplibCompare%s<Element>(srcElem1, srcElem2, fpscr)')
    fcmeqCode = fpCmpOp % 'EQ'
    sveCmpInst('fcmeq', 'Fcmeq', 'SimdFloatCmpOp', fpTypes, fcmeqCode)
    # FCMEQ (zero)
    fpCmpZeroOp = fpOp % 'fplibCompare%s<Element>(srcElem1, 0, fpscr)'
    fcmeqZeroCode = fpCmpZeroOp % 'EQ'
    sveCmpInst('fcmeq', 'FcmeqZero', 'SimdFloatCmpOp', fpTypes, fcmeqZeroCode,
               True)
    # FCMGE (vectors)
    fcmgeCode = fpCmpOp % 'GE'
    sveCmpInst('fcmge', 'Fcmge', 'SimdFloatCmpOp', fpTypes, fcmgeCode)
    # FCMGE (zero)
    fcmgeZeroCode = fpCmpZeroOp % 'GE'
    sveCmpInst('fcmge', 'FcmgeZero', 'SimdFloatCmpOp', fpTypes, fcmgeZeroCode,
               True)
    # FCMGT (vectors)
    fcmgtCode = fpCmpOp % 'GT'
    sveCmpInst('fcmgt', 'Fcmgt', 'SimdFloatCmpOp', fpTypes, fcmgtCode)
    # FCMGT (zero)
    fcmgtZeroCode = fpCmpZeroOp % 'GT'
    sveCmpInst('fcmgt', 'FcmgtZero', 'SimdFloatCmpOp', fpTypes, fcmgtZeroCode,
               True)
    # FCMLE (zero)
    fpCmpRevZeroOp = fpOp % ('fplibCompare%s<Element>(0, srcElem1, fpscr)')
    fcmleZeroCode = fpCmpRevZeroOp % 'GE'
    sveCmpInst('fcmle', 'FcmleZero', 'SimdFloatCmpOp', fpTypes, fcmleZeroCode,
               True)
    # FCMLT (zero)
    fcmltZeroCode = fpCmpRevZeroOp % 'GT'
    sveCmpInst('fcmlt', 'FcmltZero', 'SimdFloatCmpOp', fpTypes, fcmltZeroCode,
               True)
    # FCMNE (vectors)
    fcmneCode = fpOp % ('!fplibCompareEQ<Element>(srcElem1, srcElem2, fpscr)')
    sveCmpInst('fcmne', 'Fcmne', 'SimdFloatCmpOp', fpTypes, fcmneCode)
    # FCMNE (zero)
    fcmneZeroCode = fpOp % ('!fplibCompareEQ<Element>(srcElem1, 0, fpscr)')
    sveCmpInst('fcmne', 'FcmneZero', 'SimdFloatCmpOp', fpTypes, fcmneZeroCode,
               True)
    # FCMUO (vectors)
    fcmuoCode = fpCmpOp % 'UN'
    sveCmpInst('fcmuo', 'Fcmuo', 'SimdFloatCmpOp', fpTypes, fcmuoCode)
    # TODO: FCMLA (indexed)
    # TODO: FCMLA (vectors)
    # FCPY
    sveWideImmInst('fcpy', 'Fcpy', 'SimdAluOp', unsignedTypes, dupCode,
                   predType=PredType.MERGE, isUnary=True)
    # FCVT
    fcvtCode = fpOp % ('fplibConvert<SElement, DElement>('
                       'srcElem1, FPCRRounding(fpscr), fpscr)')
    sveCvtInst('fcvt', 'FcvtNarrow', 'SimdCvtOp',
               ('uint32_t, uint16_t',
                'uint64_t, uint16_t',
                'uint64_t, uint32_t'),
               fcvtCode, CvtDir.Narrow)
    sveCvtInst('fcvt', 'FcvtWiden', 'SimdCvtOp',
               ('uint16_t, uint32_t',
                'uint16_t, uint64_t',
                'uint32_t, uint64_t'),
               fcvtCode, CvtDir.Widen)
    # FCVTZS
    fcvtIntCode = fpOp % ('fplibFPToFixed<SElement, DElement>('
                          'srcElem1, %s, %s, %s, fpscr)')
    fcvtzsCode = fcvtIntCode % ('0', 'false', 'FPRounding_ZERO')
    sveCvtInst('fcvtzs', 'FcvtzsNarrow', 'SimdCvtOp',
               ('uint16_t, uint16_t',
                'uint32_t, uint32_t',
                'uint64_t, uint32_t',
                'uint64_t, uint64_t'),
               fcvtzsCode, CvtDir.Narrow)
    sveCvtInst('fcvtzs', 'FcvtzsWiden', 'SimdCvtOp',
               ('uint16_t, uint32_t',
                'uint16_t, uint64_t',
                'uint32_t, uint64_t'),
               fcvtzsCode, CvtDir.Widen)
    # FCVTZU
    fcvtzuCode = fcvtIntCode % ('0', 'true', 'FPRounding_ZERO')
    sveCvtInst('fcvtzu', 'FcvtzuNarrow', 'SimdCvtOp',
               ('uint16_t, uint16_t',
                'uint32_t, uint32_t',
                'uint64_t, uint32_t',
                'uint64_t, uint64_t'),
               fcvtzuCode, CvtDir.Narrow)
    sveCvtInst('fcvtzu', 'FcvtzuWiden', 'SimdCvtOp',
               ('uint16_t, uint32_t',
                'uint16_t, uint64_t',
                'uint32_t, uint64_t'),
               fcvtzuCode, CvtDir.Widen)
    # FDIV
    fdivCode = fpBinOp % 'Div'
    sveBinInst('fdiv', 'Fdiv', 'SimdFloatDivOp', floatTypes, fdivCode,
               PredType.MERGE, True)
    # FDIVR
    fpBinRevOp = fpOp % 'fplib%s<Element>(srcElem2, srcElem1, fpscr)'
    fdivrCode = fpBinRevOp % 'Div'
    sveBinInst('fdivr', 'Fdivr', 'SimdFloatDivOp', floatTypes, fdivrCode,
               PredType.MERGE, True)
    # FDUP
    sveWideImmInst('fdup', 'Fdup', 'SimdFloatAluOp', floatTypes, dupCode,
                   isUnary=True)
    # FEXPA
    fexpaCode = 'destElem = fplibExpA<Element>(srcElem1);'
    sveUnaryInst('fexpa', 'Fexpa', 'SimdFloatAluOp', fpTypes, fexpaCode)
    # FMAD
    fmadCode = fpOp % ('fplibMulAdd<Element>('
                       'srcElem1, destElem, srcElem2, fpscr)')
    sveTerInst('fmad', 'Fmad', 'SimdFloatMultAccOp', floatTypes, fmadCode,
               PredType.MERGE)
    # FMAX (immediate)
    fmaxCode = fpBinOp % 'Max'
    sveBinImmInst('fmax', 'FmaxImm', 'SimdFloatCmpOp', floatTypes, fmaxCode,
                  PredType.MERGE)
    # FMAX (vectors)
    sveBinInst('fmax', 'Fmax', 'SimdFloatCmpOp', floatTypes, fmaxCode,
               PredType.MERGE, True)
    # FMAXNM (immediate)
    fmaxnmCode = fpBinOp % 'MaxNum'
    sveBinImmInst('fmaxnm', 'FmaxnmImm', 'SimdFloatCmpOp', floatTypes,
                  fmaxnmCode, PredType.MERGE)
    # FMAXNM (vectors)
    sveBinInst('fmaxnm', 'Fmaxnm', 'SimdFloatCmpOp', floatTypes, fmaxnmCode,
               PredType.MERGE, True)
    # FMAXNMV
    fmaxnmvCode = fpReduceOp % 'MaxNum'
    sveNonAssocReducInst('fmaxnmv', 'Fmaxnmv', 'SimdFloatReduceCmpOp',
                         floatTypes, fmaxnmvCode, 'fplibDefaultNaN<Element>()')
    # FMAXV
    fmaxvCode = fpReduceOp % 'Max'
    sveNonAssocReducInst('fmaxv', 'Fmaxv', 'SimdFloatReduceCmpOp', floatTypes,
                         fmaxvCode, 'fplibInfinity<Element>(1)')
    # FMIN (immediate)
    fminCode = fpBinOp % 'Min'
    sveBinImmInst('fmin', 'FminImm', 'SimdFloatCmpOp', floatTypes, fminCode,
                  PredType.MERGE)
    # FMIN (vectors)
    sveBinInst('fmin', 'Fmin', 'SimdFloatCmpOp', floatTypes, fminCode,
               PredType.MERGE, True)
    # FMINNM (immediate)
    fminnmCode = fpBinOp % 'MinNum'
    sveBinImmInst('fminnm', 'FminnmImm', 'SimdFloatCmpOp', floatTypes,
                  fminnmCode, PredType.MERGE)
    # FMINNM (vectors)
    sveBinInst('fminnm', 'Fminnm', 'SimdFloatCmpOp', floatTypes, fminnmCode,
               PredType.MERGE, True)
    # FMINNMV
    fminnmvCode = fpReduceOp % 'MinNum'
    sveNonAssocReducInst('fminnmv', 'Fminnmv', 'SimdFloatReduceCmpOp',
                         floatTypes, fminnmvCode, 'fplibDefaultNaN<Element>()')
    # FMINV
    fminvCode = fpReduceOp % 'Min'
    sveNonAssocReducInst('fminv', 'Fminv', 'SimdFloatReduceCmpOp', floatTypes,
                         fminvCode, 'fplibInfinity<Element>(0)')
    # TODO: FMLA (indexed)
    # FMLA (vectors)
    fmlaCode = fpOp % ('fplibMulAdd<Element>('
                       'destElem, srcElem1, srcElem2, fpscr)')
    sveTerInst('fmla', 'Fmla', 'SimdFloatMultAccOp', floatTypes, fmlaCode,
               PredType.MERGE)
    # TODO: FMLS (indexed)
    # FMLS (vectors)
    fmlsCode = fpOp % ('fplibMulAdd<Element>(destElem, '
                       'fplibNeg<Element>(srcElem1), srcElem2, fpscr)')
    sveTerInst('fmls', 'Fmls', 'SimdFloatMultAccOp', floatTypes, fmlsCode,
               PredType.MERGE)
    # FMSB
    fmsbCode = fpOp % ('fplibMulAdd<Element>(srcElem1, '
                       'fplibNeg<Element>(destElem), srcElem2, fpscr)')
    sveTerInst('fmsb', 'Fmsb', 'SimdFloatMultAccOp', floatTypes, fmsbCode,
               PredType.MERGE)
    # FMUL (immediate)
    fpBinOp = fpOp % 'fplib%s<Element>(srcElem1, srcElem2, fpscr)'
    fmulCode = fpBinOp % 'Mul'
    sveBinImmInst('fmul', 'FmulImm', 'SimdFloatMultOp', floatTypes, fmulCode,
                  PredType.MERGE)
    # FMUL (vectors, predicated)
    fmulCode = fpBinOp % 'Mul'
    sveBinInst('fmul', 'FmulPred', 'SimdFloatMultOp', floatTypes, fmulCode,
               PredType.MERGE, True)
    # FMUL (vectors, unpredicated)
    sveBinInst('fmul', 'FmulUnpred', 'SimdFloatMultOp', floatTypes, fmulCode)
    # FMULX
    fmulxCode = fpBinOp % 'MulX'
    sveBinInst('fmulx', 'Fmulx', 'SimdFloatMultOp', floatTypes, fmulxCode,
               PredType.MERGE, True)
    # FNEG
    fnegCode = 'destElem = fplibNeg<Element>(srcElem1);'
    sveUnaryInst('fneg', 'Fneg', 'SimdFloatAluOp', fpTypes, fnegCode,
                 PredType.MERGE)
    # FNMAD
    fnmadCode = fpOp % ('fplibMulAdd<Element>('
                        'fplibNeg<Element>(srcElem1), '
                        'fplibNeg<Element>(destElem), srcElem2, fpscr)')
    sveTerInst('fnmad', 'Fnmad', 'SimdFloatMultAccOp', floatTypes, fnmadCode,
               PredType.MERGE)
    # FNMLA
    fnmlaCode = fpOp % ('fplibMulAdd<Element>('
                        'fplibNeg<Element>(destElem), '
                        'fplibNeg<Element>(srcElem1), srcElem2, fpscr)')
    sveTerInst('fnmla', 'Fnmla', 'SimdFloatMultAccOp', floatTypes, fnmlaCode,
               PredType.MERGE)
    # FNMLS
    fnmlsCode = fpOp % ('fplibMulAdd<Element>('
                        'fplibNeg<Element>(destElem), srcElem1, srcElem2, '
                        'fpscr)')
    sveTerInst('fnmls', 'Fnmls', 'SimdFloatMultAccOp', floatTypes, fnmlsCode,
               PredType.MERGE)
    # FNMSB
    fnmsbCode = fpOp % ('fplibMulAdd<Element>('
                        'fplibNeg<Element>(srcElem1), destElem, srcElem2, '
                        'fpscr)')
    sveTerInst('fnmsb', 'Fnmsb', 'SimdFloatMultAccOp', floatTypes, fnmsbCode,
               PredType.MERGE)
    # FRECPE
    frecpeCode = fpOp % 'fplibRecipEstimate<Element>(srcElem1, fpscr)'
    sveUnaryInst('frecpe', 'Frecpe', 'SimdFloatMultAccOp', floatTypes,
                 frecpeCode)
    # FRECPS
    frecpsCode = fpBinOp % 'RecipStepFused'
    sveBinInst('frecps', 'Frecps', 'SimdFloatMultAccOp', floatTypes,
               frecpsCode)
    # FRECPX
    frecpxCode = fpOp % "fplibRecpX<Element>(srcElem1, fpscr)"
    sveUnaryInst('frecpx', 'Frecpx', 'SimdFloatMultAccOp', floatTypes,
                 frecpxCode, PredType.MERGE)
    # FRINTA
    frintCode = fpOp % 'fplibRoundInt<Element>(srcElem1, %s, %s, fpscr)'
    frintaCode = frintCode % ('FPRounding_TIEAWAY', 'false')
    sveUnaryInst('frinta', 'Frinta', 'SimdCvtOp', floatTypes, frintaCode,
                 PredType.MERGE)
    # FRINTI
    frintiCode = frintCode % ('FPCRRounding(fpscr)', 'false')
    sveUnaryInst('frinti', 'Frinti', 'SimdCvtOp', floatTypes, frintiCode,
                 PredType.MERGE)
    # FRINTM
    frintmCode = frintCode % ('FPRounding_NEGINF', 'false')
    sveUnaryInst('frintm', 'Frintm', 'SimdCvtOp', floatTypes, frintmCode,
                 PredType.MERGE)
    # FRINTN
    frintnCode = frintCode % ('FPRounding_TIEEVEN', 'false')
    sveUnaryInst('frintn', 'Frintn', 'SimdCvtOp', floatTypes, frintnCode,
                 PredType.MERGE)
    # FRINTP
    frintpCode = frintCode % ('FPRounding_POSINF', 'false')
    sveUnaryInst('frintp', 'Frintp', 'SimdCvtOp', floatTypes, frintpCode,
                 PredType.MERGE)
    # FRINTX
    frintxCode = frintCode % ('FPCRRounding(fpscr)', 'true')
    sveUnaryInst('frintx', 'Frintx', 'SimdCvtOp', floatTypes, frintxCode,
                 PredType.MERGE)
    # FRINTZ
    frintzCode = frintCode % ('FPRounding_ZERO', 'false')
    sveUnaryInst('frintz', 'Frintz', 'SimdCvtOp', floatTypes, frintzCode,
                 PredType.MERGE)
    # FRSQRTE
    frsqrteCode = fpOp % 'fplibRSqrtEstimate<Element>(srcElem1, fpscr)'
    sveUnaryInst('frsqrte', 'Frsqrte', 'SimdFloatSqrtOp', floatTypes,
                 frsqrteCode)
    # FRSQRTS
    frsqrtsCode = fpBinOp % 'RSqrtStepFused'
    sveBinInst('frsqrts', 'Frsqrts', 'SimdFloatMiscOp', floatTypes,
               frsqrtsCode)
    # FSCALE
    fscaleCode = fpBinOp % 'Scale'
    sveBinInst('fscale', 'Fscale', 'SimdFloatMiscOp', floatTypes, fscaleCode,
               PredType.MERGE, True)
    # FSQRT
    fsqrtCode = fpOp % "fplibSqrt<Element>(srcElem1, fpscr)"
    sveUnaryInst('fsqrt', 'Fsqrt', 'SimdFloatSqrtOp', floatTypes, fsqrtCode,
                 PredType.MERGE)
    # FSUB (immediate)
    fsubCode = fpBinOp % 'Sub'
    sveBinImmInst('fsub', 'FsubImm', 'SimdFloatAddOp', floatTypes, fsubCode,
                  PredType.MERGE)
    # FSUB (vectors, predicated)
    sveBinInst('fsub', 'FsubPred', 'SimdFloatAddOp', floatTypes, fsubCode,
               PredType.MERGE, True)
    # FSUB (vectors, unpredicated)
    sveBinInst('fsub', 'FsubUnpred', 'SimdFloatAddOp', floatTypes, fsubCode)
    # FSUBR (immediate)
    fsubrCode = fpBinRevOp % 'Sub'
    sveBinImmInst('fsubr', 'FsubrImm', 'SimdFloatAddOp', floatTypes, fsubrCode,
                  PredType.MERGE)
    # FSUBR (vectors)
    sveBinInst('fsubr', 'Fsubr', 'SimdFloatAddOp', floatTypes, fsubrCode,
               PredType.MERGE, True)
    # FTMAD
    ftmadCode = fpOp % ('fplibTrigMulAdd<Element>('
                        'srcElem3, destElem, srcElem2, fpscr)')
    sveTerImmInst('ftmad', 'Ftmad', 'SimdFloatMultAccOp', floatTypes,
                  ftmadCode)
    # FTSMUL
    ftsmulCode = fpBinOp % 'TrigSMul'
    sveBinInst('ftsmul', 'Ftsmul', 'SimdFloatMiscOp', floatTypes, ftsmulCode)
    # FTSSEL
    ftsselCode = fpBinOp % 'TrigSSel'
    sveBinInst('ftssel', 'Ftssel', 'SimdFloatMultOp', floatTypes, ftsselCode)
    # INCB, INCH, INCW, INCD (scalar)
    incxCode = '''
        destElem = srcElem1 + (count * imm);
    '''
    sveElemCountInst('inc', 'Inc', 'SimdAluOp', unsignedTypes, incxCode,
            destType = DestType.Scalar, dstIs32b = False)
    # INCH, INCW, INCD (vector)
    sveElemCountInst('inc', 'Incv', 'SimdAluOp', bigUnsignedTypes, incxCode,
            destType = DestType.Vector, dstIs32b = False)
    # INCP (scalar)
    incpCode = '''
    XDest = XDest + count;
    '''
    svePredCountInst('incp', 'Incp', 'SimdAluOp', unsignedTypes, incpCode,
                     DestType.Scalar, SrcSize.Src64bit)
    # INCP (vector)
    incpvCode = '''
        destElem = srcElem + count;
    '''
    svePredCountInst('incp', 'Incpv', 'SimdAluOp', unsignedTypes, incpvCode,
                     DestType.Vector)
    # INDEX (immediates)
    sveIndex(IndexFormat.ImmImm)
    # INDEX (immediate, scalar)
    sveIndex(IndexFormat.ImmReg)
    # INDEX (scalar, immediate)
    sveIndex(IndexFormat.RegImm)
    # INDEX (scalars)
    sveIndex(IndexFormat.RegReg)
    # INSR (scalar)
    sveShiftAndInsertInst('insr', 'Insr', 'SimdAluOp', unsignedTypes,
            srcType = SrcRegType.Scalar)
    # LASTA (scalar)
    lastaCode = '''
        last++;
        if (last >= eCount) {
            last = 0;
        }
        destElem = AA64FpOp1_x[last];'''
    sveSelectInst('lasta', 'Lasta', 'SimdAluOp', unsignedTypes, lastaCode,
            isCond = False)
    # LASTB (scalar)
    lastbCode = '''
        if (last < 0) {
            last = eCount - 1;
        }
        destElem = AA64FpOp1_x[last];'''
    sveSelectInst('lastb', 'Lastb', 'SimdAluOp', unsignedTypes, lastbCode,
            isCond = False)
    # LSL (immediate, predicated)
    lslCode = '''
            if (srcElem2 == 0) {
                destElem = srcElem1;
            } else if (srcElem2 >= sizeof(Element) * 8) {
                destElem = 0;
            } else {
                destElem = srcElem1 << srcElem2;
            }
    '''
    sveBinImmInst('lsl', 'LslImmPred', 'SimdAluOp', unsignedTypes, lslCode,
                  PredType.MERGE)
    # LSL (immediate, unpredicated)
    sveBinImmInst('lsl', 'LslImmUnpred', 'SimdAluOp', unsignedTypes, lslCode)
    # LSL (vectors)
    sveBinInst('lsl', 'LslPred', 'SimdAluOp', unsignedTypes, lslCode,
               PredType.MERGE, True)
    # LSL (wide elements, predicated)
    sveShiftByWideElemsInst('lsl', 'LslWidePred', 'SimdAluOp', unsignedTypes,
                            lslCode, PredType.MERGE)
    # LSL (wide elements, unpredicated)
    sveShiftByWideElemsInst('lsl', 'LslWideUnpred', 'SimdAluOp', unsignedTypes,
                            lslCode)
    # LSLR
    lslrCode = '''
            if (srcElem1 == 0) {
                destElem = srcElem2;
            } else if (srcElem1 >= sizeof(Element) * 8) {
                destElem = 0;
            } else {
                destElem = srcElem2 << srcElem1;
            }
    '''
    sveBinInst('lslr', 'Lslr', 'SimdAluOp', unsignedTypes, lslrCode,
               PredType.MERGE, True)
    # LSR (immediate, predicated)
    lsrCode = '''
            if (srcElem2 >= sizeof(Element) * 8) {
                destElem = 0;
            } else {
                destElem = srcElem1 >> srcElem2;
            }
    '''
    sveBinImmInst('lsr', 'LsrImmPred', 'SimdAluOp', unsignedTypes, lsrCode,
                  PredType.MERGE)
    # LSR (immediate, unpredicated)
    sveBinImmInst('lsr', 'LsrImmUnpred', 'SimdAluOp', unsignedTypes, lsrCode)
    # LSR (vectors)
    sveBinInst('lsr', 'LsrPred', 'SimdAluOp', unsignedTypes, lsrCode,
               PredType.MERGE, True)
    # LSR (wide elements, predicated)
    sveShiftByWideElemsInst('lsr', 'LsrWidePred', 'SimdAluOp', unsignedTypes,
                            lsrCode, PredType.MERGE)
    # LSR (wide elements, unpredicated)
    sveShiftByWideElemsInst('lsr', 'LsrWideUnpred', 'SimdAluOp', unsignedTypes,
                            lsrCode)
    # LSRR
    lsrrCode = '''
            if (srcElem1 >= sizeof(Element) * 8) {
                destElem = 0;
            } else {
                destElem = srcElem2 >> srcElem1;
            }
    '''
    sveBinInst('lsrr', 'Lsrr', 'SimdAluOp', unsignedTypes, lsrrCode,
               PredType.MERGE, True)
    # MAD
    madCode = 'destElem = srcElem1 + destElem * srcElem2;'
    sveTerInst('mad', 'Mad', 'SimdMultAccOp', signedTypes, madCode)
    # MLA
    mlaCode = 'destElem += srcElem1 * srcElem2;'
    sveTerInst('mla', 'Mla', 'SimdMultAccOp', signedTypes, mlaCode)
    # MLS
    mlsCode = 'destElem -= srcElem1 * srcElem2;'
    sveTerInst('mls', 'Mls', 'SimdMultAccOp', signedTypes, mlsCode)
    # MOVPRFX (predicated)
    movCode = 'destElem = srcElem1;'
    sveUnaryInst('movprfx', 'MovprfxPredM', 'SimdMiscOp', unsignedTypes,
                 movCode, PredType.MERGE)
    sveUnaryInst('movprfx', 'MovprfxPredZ', 'SimdMiscOp', unsignedTypes,
                 movCode, PredType.ZERO)
    # MOVPRFX (unpredicated)
    sveUnaryInst('movprfx', 'MovprfxUnpred', 'SimdMiscOp', ('uint64_t',),
                 movCode)
    # MSB
    msbCode = 'destElem = srcElem1 - destElem * srcElem2;'
    sveTerInst('msb', 'Msb', 'SimdMultAccOp', signedTypes, msbCode)
    # MUL (immediate)
    mulCode = 'destElem = srcElem1 * srcElem2;'
    sveWideImmInst('mul', 'MulImm', 'SimdMultOp', unsignedTypes, mulCode)
    # MUL (vectors)
    sveBinInst('mul', 'Mul', 'SimdMultOp', unsignedTypes, mulCode,
               PredType.MERGE, True)
    # NAND, NANDS (predicates)
    nandCode = 'destElem = !(srcElem1 & srcElem2);';
    svePredLogicalInst('nand', 'PredNand', 'SimdPredAluOp', ('uint8_t',),
                       nandCode)
    svePredLogicalInst('nands', 'PredNands', 'SimdPredAluOp', ('uint8_t',),
                       nandCode, isFlagSetting=True)
    # NEG
    negCode = 'destElem = -srcElem1;'
    sveUnaryInst('neg', 'Neg', 'SimdAluOp', signedTypes, negCode,
                 PredType.MERGE)
    # NOR, NORS (predicates)
    norCode = 'destElem = !(srcElem1 | srcElem2);';
    svePredLogicalInst('nor', 'PredNor', 'SimdPredAluOp', ('uint8_t',),
                       norCode)
    svePredLogicalInst('nors', 'PredNors', 'SimdPredAluOp', ('uint8_t',),
                       norCode, isFlagSetting=True)
    # NOT (vector)
    notCode = 'destElem = ~srcElem1;'
    sveUnaryInst('not', 'Not', 'SimdAluOp', unsignedTypes, notCode,
                 PredType.MERGE)
    # ORN, ORNS (predicates)
    ornCode = 'destElem = srcElem1 | !srcElem2;';
    svePredLogicalInst('orn', 'PredOrn', 'SimdPredAluOp', ('uint8_t',),
                       ornCode)
    svePredLogicalInst('orns', 'PredOrns', 'SimdPredAluOp', ('uint8_t',),
                       ornCode, isFlagSetting=True)
    # ORR (immediate)
    orCode = 'destElem = srcElem1 | srcElem2;'
    sveWideImmInst('orr', 'OrrImm', 'SimdAluOp', ('uint64_t',), orCode)
    # ORR (vectors, predicated)
    sveBinInst('orr', 'OrrPred', 'SimdAluOp', unsignedTypes, orCode,
               PredType.MERGE, True)
    # ORR (vectors, unpredicated)
    orCode = 'destElem = srcElem1 | srcElem2;'
    sveBinInst('orr', 'OrrUnpred', 'SimdAluOp', ('uint64_t',), orCode)
    # ORR, ORRS (predicates)
    svePredLogicalInst('orr', 'PredOrr', 'SimdPredAluOp', ('uint8_t',), orCode)
    svePredLogicalInst('orrs', 'PredOrrs', 'SimdPredAluOp', ('uint8_t',),
                       orCode, isFlagSetting=True)
    # ORV
    orvCode = 'destElem |= srcElem1;'
    sveAssocReducInst('orv', 'Orv', 'SimdReduceAluOp', unsignedTypes,
                      orvCode, '0')
    # PFALSE
    pfalseCode = '''
        PDest_ub[0] = 0;
        destPred.reset();
    '''
    svePredUnaryWImplicitSrcInst('pfalse', 'Pfalse', 'SimdPredAluOp',
            pfalseCode)
    # PFIRST
    svePFirstInst('pfirst', 'Pfirst', 'SimdPredAluOp')
    # PNEXT
    svePNextInst('pnext', 'Pnext', 'SimdPredAluOp', unsignedTypes)
    # PTEST
    svePredTestInst('ptest', 'Ptest', 'SimdPredAluOp')
    # PTRUE
    svePtrueInst('ptrue', 'Ptrue', 'SimdPredAluOp', unsignedTypes, False)
    # PTRUES
    svePtrueInst('ptrues', 'Ptrues', 'SimdPredAluOp', unsignedTypes, True)
    # PUNPKHI
    sveUnpackInst('punpkhi', 'Punpkhi', 'SimdPredAluOp', unsignedWideSDTypes,
            unpackHalf = Unpack.High, regType = SrcRegType.Predicate)
    # PUNPKLO
    sveUnpackInst('punpklo', 'Punpklo', 'SimdPredAluOp', unsignedWideSDTypes,
            unpackHalf = Unpack.Low, regType = SrcRegType.Predicate)
    # RBIT
    rbitCode = '''
        destElem = reverseBits(srcElem1);'''
    sveUnaryInst('rbit', 'Rbit', 'SimdAluOp', unsignedTypes, rbitCode,
            predType=PredType.MERGE, srcRegType=SrcRegType.Vector)
    # RDFFR, RDFFRS (predicated)
    rdffrPredCode = '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<uint8_t>(
                xc->tcBase());
        for (unsigned i = 0; i < eCount; i++) {
            if (GpOp_ub[i]) {
                PDest_ub[i] = Ffr_ub[i];
            } else {
                PDest_ub[i] = false;
            }
        }'''
    svePredUnaryWImplicitSrcInst('rdffr', 'RdffrPred', 'SimdPredAluOp',
            rdffrPredCode, PredType.ZERO, False)
    svePredUnaryWImplicitSrcInst('rdffrs', 'RdffrsPred', 'SimdPredAluOp',
            rdffrPredCode, PredType.ZERO, True)
    # RDFFR (unpredicated)
    rdffrUnpredCode = '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<uint8_t>(
                xc->tcBase());
        for (unsigned i = 0; i < eCount; i++) {
            PDest_ub[i] = Ffr_ub[i];
        }'''
    svePredUnaryWImplicitSrcInst('rdffr', 'RdffrUnpred', 'SimdPredAluOp',
            rdffrUnpredCode)
    # RDVL
    rdvlCode = sveEnabledCheckCode + '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<uint8_t>(
                xc->tcBase());
        XDest = eCount * (int64_t) imm;
    '''
    rdvlIop = InstObjParams('rdvl', 'SveRdvl', 'RegImmOp', rdvlCode, [])
    header_output += RegImmOpDeclare.subst(rdvlIop)
    decoder_output += RegImmOpConstructor.subst(rdvlIop)
    exec_output += BasicExecute.subst(rdvlIop)
    # REV (predicate)
    sveReverseElementsInst('rev', 'Revp', 'SimdPredAluOp', unsignedTypes,
            srcType = SrcRegType.Predicate)
    # REV (vector)
    sveReverseElementsInst('rev', 'Revv', 'SimdAluOp', unsignedTypes,
            srcType = SrcRegType.Vector)
    # REVB
    revCode = '''
        %(revtype)s* srcPtr = reinterpret_cast<%(revtype)s*>(&srcElem1);
        %(revtype)s* dstPtr = reinterpret_cast<%(revtype)s*>(&destElem);
        uint8_t subelements = sizeof(Element) / sizeof(%(revtype)s);
        for(int i = 0; i < subelements; ++i) {
            dstPtr[subelements - i - 1] = srcPtr[i];
        }'''
    sveUnaryInst('revb', 'Revb', 'SimdAluOp',
            ['uint16_t', 'uint32_t', 'uint64_t'],
            revCode % {'revtype' : 'uint8_t'}, predType=PredType.MERGE,
            srcRegType=SrcRegType.Vector, decoder='Generic')
    # REVH
    sveUnaryInst('revh', 'Revh', 'SimdAluOp', ['uint32_t', 'uint64_t'],
            revCode % {'revtype' : 'uint16_t'}, predType=PredType.MERGE,
            srcRegType=SrcRegType.Vector, decoder='Generic')
    # REVW
    sveUnaryInst('revw', 'Revw', 'SimdAluOp', ['uint64_t'],
            revCode % {'revtype' : 'uint32_t'}, predType=PredType.MERGE,
            srcRegType=SrcRegType.Vector, decoder='Generic')
    # SABD
    abdCode = '''
            destElem = (srcElem1 > srcElem2) ? (srcElem1 - srcElem2) :
                                               (srcElem2 - srcElem1);
    '''
    sveBinInst('sabd', 'Sabd', 'SimdAddOp', signedTypes, abdCode,
               PredType.MERGE, True)
    # SADDV
    addvCode = 'destElem += srcElem1;'
    sveWideningAssocReducInst('saddv', 'Saddv', 'SimdReduceAddOp',
            ['int8_t, int64_t', 'int16_t, int64_t', 'int32_t, int64_t'],
            addvCode, '0')
    # SCVTF
    scvtfCode = fpOp % ('fplibFixedToFP<DElement>('
                        'sext<sizeof(SElement) * 8>(srcElem1), 0,'
                        ' false, FPCRRounding(fpscr), fpscr)')
    sveCvtInst('scvtf', 'ScvtfNarrow', 'SimdCvtOp',
               ('uint16_t, uint16_t',
                'uint32_t, uint16_t',
                'uint64_t, uint16_t',
                'uint32_t, uint32_t',
                'uint64_t, uint32_t',
                'uint64_t, uint64_t'),
               scvtfCode, CvtDir.Narrow)
    sveCvtInst('scvtf', 'ScvtfWiden', 'SimdCvtOp', ('uint32_t, uint64_t',),
               scvtfCode, CvtDir.Widen)
    # SDIV
    sdivCode = '''
        constexpr Element ELEM_MIN = std::numeric_limits<Element>::min();
        destElem = (srcElem2 == 0) ? 0 :
            (srcElem2 == -1 && srcElem1 == ELEM_MIN) ? ELEM_MIN :
                (srcElem1 / srcElem2);
    '''
    sveBinInst('sdiv', 'Sdiv', 'SimdDivOp', signedTypes, sdivCode,
               PredType.MERGE, True)
    # SDIVR
    sdivrCode = '''
        constexpr Element ELEM_MIN = std::numeric_limits<Element>::min();
        destElem = (srcElem1 == 0) ? 0 :
            (srcElem1 == -1 && srcElem2 == ELEM_MIN) ? ELEM_MIN :
                (srcElem2 / srcElem1);
    '''
    sveBinInst('sdivr', 'Sdivr', 'SimdDivOp', signedTypes, sdivrCode,
               PredType.MERGE, True)
    # SEL (predicates)
    selCode = 'destElem = srcElem1;'
    svePredLogicalInst('sel', 'PredSel', 'SimdPredAluOp', ('uint8_t',),
                       selCode, PredType.SELECT)
    # SEL (vectors)
    sveBinInst('sel', 'Sel', 'SimdAluOp', unsignedTypes, selCode,
               PredType.SELECT, False)
    # SETFFR
    setffrCode = '''
        Ffr_ub[0] = true;
        destPred.set();'''
    svePredWriteFfrInst('setffr', 'Setffr', 'SimdPredAluOp', setffrCode, True)
    # SMAX (immediate)
    maxCode = 'destElem = (srcElem1 > srcElem2) ? srcElem1 : srcElem2;'
    sveWideImmInst('smax', 'SmaxImm', 'SimdCmpOp', signedTypes, maxCode)
    # SMAX (vectors)
    sveBinInst('smax', 'Smax', 'SimdCmpOp', signedTypes, maxCode,
               PredType.MERGE, True)
    # SMAXV
    maxvCode = '''
            if (srcElem1 > destElem)
                destElem = srcElem1;
    '''
    sveAssocReducInst('smaxv', 'Smaxv', 'SimdReduceCmpOp', signedTypes,
                      maxvCode, 'std::numeric_limits<Element>::min()')
    # SMIN (immediate)
    minCode = 'destElem = (srcElem1 < srcElem2) ? srcElem1 : srcElem2;'
    sveWideImmInst('smin', 'SminImm', 'SimdCmpOp', signedTypes, minCode)
    # SMIN (vectors)
    sveBinInst('smin', 'Smin', 'SimdCmpOp', signedTypes, minCode,
               PredType.MERGE, True)
    # SMINV
    minvCode = '''
            if (srcElem1 < destElem)
                destElem = srcElem1;
    '''
    sveAssocReducInst('sminv', 'Sminv', 'SimdReduceCmpOp', signedTypes,
                      minvCode, 'std::numeric_limits<Element>::max()')
    # SMULH
    exec_output += '''
    template <class T>
    T do_mulh(T srcElem1, T srcElem2)
    {
        return ((int64_t)srcElem1 * (int64_t)srcElem2) >> sizeof(T) * 8;
    }

    int64_t do_mulh(int64_t srcElem1, int64_t srcElem2)
    {
        uint64_t x = (uint64_t) llabs(srcElem1);
        uint64_t y = (uint64_t) llabs(srcElem2);

        uint64_t a = x >> 32;
        uint64_t b = x & 0xFFFFFFFF;
        uint64_t c = y >> 32;
        uint64_t d = y & 0xFFFFFFFF;

        uint64_t hi = a * c;
        uint64_t lo = b * d;

        hi += (a * d) >> 32;
        uint64_t tmp = lo;
        lo += ((a * d) & 0xFFFFFFFF) << 32;
        if (lo < tmp)
            hi++;

        hi += (b * c) >> 32;
        tmp = lo;
        lo += ((b * c) & 0xFFFFFFFF) << 32;
        if (lo < tmp)
            hi++;

        uint64_t destElem = hi;
        if ((srcElem1 < 0) ^ (srcElem2 < 0)) {
            uint64_t tmp = lo = ~lo;
            destElem = ~hi;
            if (++lo < tmp)
                destElem++;
        }

        return destElem;
    }

    uint64_t do_mulh(uint64_t srcElem1, uint64_t srcElem2)
    {
        uint64_t x = srcElem1;
        uint64_t y = srcElem2;

        uint64_t a = x >> 32;
        uint64_t b = x & 0xFFFFFFFF;
        uint64_t c = y >> 32;
        uint64_t d = y & 0xFFFFFFFF;

        uint64_t hi = a * c;
        uint64_t lo = b * d;

        hi += (a * d) >> 32;
        uint64_t tmp = lo;
        lo += ((a * d) & 0xFFFFFFFF) << 32;
        if (lo < tmp)
            hi++;

        hi += (b * c) >> 32;
        tmp = lo;
        lo += ((b * c) & 0xFFFFFFFF) << 32;
        if (lo < tmp)
            hi++;

        return hi;
    }'''
    mulhCode = '''
    destElem = do_mulh(srcElem1, srcElem2);'''
    sveBinInst('smulh', 'Smulh', 'SimdMultOp', signedTypes, mulhCode,
               PredType.MERGE, True)
    # SPLICE
    sveSpliceInst('splice', 'Splice', 'SimdAluOp', unsignedTypes)
    # SQADD (immediate)
    sqaddCode = '''
            destElem = srcElem1 + srcElem2;
            bool negDest = (destElem < 0);
            bool negSrc1 = (srcElem1 < 0);
            bool negSrc2 = (srcElem2 < 0);
            if ((negDest != negSrc1) && (negSrc1 == negSrc2)) {
                destElem = (Element)1 << (sizeof(Element) * 8 - 1);
                if (negDest)
                    destElem -= 1;
            }
    '''
    sveWideImmInst('sqadd', 'SqaddImm', 'SimdAddOp', signedTypes, sqaddCode)
    # SQADD (vectors)
    sveBinInst('sqadd', 'Sqadd', 'SimdAddOp', signedTypes, sqaddCode)
    # SQDECB, SQDECH, SQDECW, SQDECD (scalar) 32-bit
    sqdecCode = '''
        destElem = srcElem1 - (count * imm);
        bool negDest = (destElem < 0);
        bool negSrc = (srcElem1 < 0);
        bool posCount = ((count * imm) >= 0);
        if ((negDest != negSrc) && (negSrc == posCount)) {
            destElem = (%(dstType)s)1 << (sizeof(%(dstType)s) * 8 - 1);
            if (negDest)
                destElem -= 1;
        }
    '''
    sveElemCountInst('sqdec', 'Sqdec32', 'SimdAluOp', signedTypes,
            sqdecCode%{'dstType':'int32_t'}, destType = DestType.Scalar,
            dstIs32b = True)
    # SQDECB, SQDECH, SQDECW, SQDECD (scalar) 64-bit
    sveElemCountInst('sqdec', 'Sqdec', 'SimdAluOp', signedTypes,
            sqdecCode%{'dstType':'int64_t'}, destType = DestType.Scalar,
            dstIs32b = False)
    # SQDECH, SQDECW, SQDECD (vector)
    sveElemCountInst('sqdec', 'Sqdecv', 'SimdAluOp', bigSignedTypes,
            sqdecCode%{'dstType':'Element'}, destType = DestType.Vector,
            dstIs32b = False)
    # SQDECP (scalar, 32-bit)
    sqdecpCode = '''
        destElem = srcElem - count;
        bool negDest = (destElem < 0);
        bool negSrc = (srcElem < 0);
        bool posCount = (count >= 0);
        if ((negDest != negSrc) && (negSrc == posCount)) {
            destElem = std::numeric_limits<%s>::min();
            if (negDest)
                destElem -= 1;
        }
    '''
    sqdecp32Code = '''
        int32_t srcElem = WDest;
        int32_t destElem;''' + (sqdecpCode % 'int32_t') + '''
        if (destElem < 0) {
            XDest = static_cast<uint32_t>(destElem) | ~mask(32);
        } else {
            XDest = destElem;
        }
    '''
    svePredCountInst('sqdecp', 'Sqdecp32', 'SimdAluOp', signedTypes,
                     sqdecp32Code, DestType.Scalar, SrcSize.Src32bit)
    # SQDECP (scalar, 64-bit)
    sqdecp64Code = '''
        int64_t srcElem = XDest;
        int64_t destElem;''' + (sqdecpCode % 'int64_t') + '''
        XDest = destElem;
    '''
    svePredCountInst('sqdecp', 'Sqdecp64', 'SimdAluOp', signedTypes,
                     sqdecp64Code, DestType.Scalar, SrcSize.Src64bit)
    # SQDECP (vector)
    svePredCountInst('sqdecp', 'Sqdecpv', 'SimdAluOp', signedTypes,
                     sqdecpCode % 'Element', DestType.Vector)
    # SQINCB, SQINCH, SQINCW, SQINCD (scalar) 32-bit
    sqincCode = '''
        destElem = srcElem1 + (count * imm);
        bool negDest = (destElem < 0);
        bool negSrc = (srcElem1 < 0);
        bool negCount = ((count * imm) < 0);
        if ((negDest != negSrc) && (negSrc == negCount)) {
            destElem = (%(dstType)s)1 << (sizeof(%(dstType)s) * 8 - 1);
            if (negDest)
                destElem -= 1;
        }
    '''
    sveElemCountInst('sqinc', 'Sqinc32', 'SimdAluOp', signedTypes,
            sqincCode%{'dstType':'int32_t'}, destType = DestType.Scalar,
            dstIs32b = True)
    # SQINCB, SQINCH, SQINCW, SQINCD (scalar) 64-bit
    sveElemCountInst('sqinc', 'Sqinc', 'SimdAluOp', signedTypes,
            sqincCode%{'dstType':'int64_t'}, destType = DestType.Scalar,
            dstIs32b = False)
    # SQINCH, SQINCW, SQINCD (vector)
    sveElemCountInst('sqinc', 'Sqincv', 'SimdAluOp', bigSignedTypes,
            sqincCode%{'dstType':'Element'}, destType = DestType.Vector,
            dstIs32b = False)
    # SQINCP (scalar) 32-bit
    sqincpCode = '''
        destElem = srcElem + count;
        bool negDest = (destElem < 0);
        bool negSrc = (srcElem < 0);
        bool negCount = (count < 0);
        if ((negDest != negSrc) && (negSrc == negCount)) {
            destElem = std::numeric_limits<%s>::min();
            if (negDest)
                destElem -= 1;
        }
    '''
    sqincp32Code = '''
        int32_t srcElem = WDest;
        int32_t destElem;''' + (sqincpCode % 'int32_t') + '''
        if (destElem < 0) {
            XDest = static_cast<uint32_t>(destElem) | ~mask(32);
        } else {
            XDest = destElem;
        }
    '''
    svePredCountInst('sqincp', 'Sqincp32', 'SimdAluOp', signedTypes,
                     sqincp32Code, DestType.Scalar, SrcSize.Src32bit)
    # SQINCP (scalar) 64-bit
    sqincp64Code = '''
        int64_t srcElem = XDest;
        int64_t destElem;''' + (sqincpCode % 'int64_t') + '''
        XDest = destElem;
    '''
    svePredCountInst('sqincp', 'Sqincp64', 'SimdAluOp', signedTypes,
                     sqincp64Code, DestType.Scalar, SrcSize.Src64bit)
    # SQINCP (vector)
    svePredCountInst('sqincp', 'Sqincpv', 'SimdAluOp', signedTypes,
                     sqincpCode % 'Element', DestType.Vector)
    # SQSUB (immediate)
    sqsubCode = '''
        destElem = srcElem1 - srcElem2;
        bool negDest = (destElem < 0);
        bool negSrc1 = (srcElem1 < 0);
        bool posSrc2 = (srcElem2 >= 0);
        if ((negDest != negSrc1) && (negSrc1 == posSrc2)) {
            destElem = (Element)1 << (sizeof(Element) * 8 - 1);
            if (negDest)
                destElem -= 1;
        }
    '''
    sveWideImmInst('sqsub', 'SqsubImm', 'SimdAddOp', signedTypes, sqsubCode)
    # SQSUB (vectors)
    sveBinInst('sqsub', 'Sqsub', 'SimdAddOp', signedTypes, sqsubCode)
    # SUB (immediate)
    subCode = 'destElem = srcElem1 - srcElem2;'
    sveWideImmInst('sub', 'SubImm', 'SimdAddOp', unsignedTypes, subCode)
    # SUB (vectors, predicated)
    sveBinInst('sub', 'SubPred', 'SimdAddOp', unsignedTypes, subCode,
               PredType.MERGE, True)
    # SUB (vectors, unpredicated)
    subCode = 'destElem = srcElem1 - srcElem2;'
    sveBinInst('sub', 'SubUnpred', 'SimdAddOp', unsignedTypes, subCode)
    # SUBR (immediate)
    subrCode = 'destElem = srcElem2 - srcElem1;'
    sveWideImmInst('subr', 'SubrImm', 'SimdAddOp', unsignedTypes, subrCode)
    # SUBR (vectors)
    sveBinInst('subr', 'Subr', 'SimdAddOp', unsignedTypes, subrCode,
               PredType.MERGE, True)
    # SUNPKHI
    sveUnpackInst('sunpkhi', 'Sunpkhi', 'SimdAluOp', signedWideSDTypes,
            unpackHalf = Unpack.High, regType = SrcRegType.Vector)
    # SUNPKLO
    sveUnpackInst('sunpklo', 'Sunpklo', 'SimdAluOp', signedWideSDTypes,
            unpackHalf = Unpack.Low, regType = SrcRegType.Vector)
    # SXTB
    sxtCode = 'destElem = sext<8 * sizeof(SElement)>(srcElem1);'
    sveWidenUnaryInst('sxtb', 'Sxtb', 'SimdAluOp',
            ['uint8_t, uint16_t', 'uint8_t, uint32_t', 'uint8_t, uint64_t'],
            sxtCode, PredType.MERGE)
    # SXTH
    sveWidenUnaryInst('sxth', 'Sxth', 'SimdAluOp',
            ['uint16_t, uint32_t', 'uint16_t, uint64_t'],
            sxtCode, PredType.MERGE)
    # SXTW
    sveWidenUnaryInst('sxtw', 'Sxtw', 'SimdAluOp',
            ['uint32_t, uint64_t'],
            sxtCode, PredType.MERGE)
    # TBL
    sveTblInst('tbl', 'Tbl', 'SimdAluOp')
    # TRN1, TRN2 (predicates)
    trnPredIterCode = '''
        constexpr unsigned sz = sizeof(Element);
        int s;
        int part = %d;
        for (unsigned i = 0; i < eCount / 2; i++) {
            s = 2 * i + part;
            for (unsigned j = 0; j < sz; j++) {
                PDest_pb[(2 * i) * sz + j] = POp1_pb[s * sz + j];
                PDest_pb[(2 * i + 1) * sz + j] = POp2_pb[s * sz + j];
            }
        }
    '''
    svePredBinPermInst('trn1', 'Trn1Pred', 'SimdPredAluOp', unsignedTypes,
                       trnPredIterCode % 0)
    svePredBinPermInst('trn2', 'Trn2Pred', 'SimdPredAluOp', unsignedTypes,
                       trnPredIterCode % 1)
    # TRN1, TRN2 (vectors)
    trnIterCode = '''
        int s;
        int part = %d;
        for (unsigned i = 0; i < eCount / 2; i++) {
            s = 2 * i + part;
            AA64FpDest_x[2 * i] = AA64FpOp1_x[s];
            AA64FpDest_x[2 * i + 1] = AA64FpOp2_x[s];
        }
    '''
    sveBinInst('trn1', 'Trn1', 'SimdAluOp', unsignedTypes, '',
               customIterCode=trnIterCode % 0)
    sveBinInst('trn2', 'Trn2', 'SimdAluOp', unsignedTypes, '',
               customIterCode=trnIterCode % 1)
    # UABD
    sveBinInst('uabd', 'Uabd', 'SimdAddOp', unsignedTypes, abdCode,
               PredType.MERGE, True)
    # UADDV
    sveWideningAssocReducInst('uaddv', 'Uaddv', 'SimdReduceAddOp',
            ['uint8_t, uint64_t', 'uint16_t, uint64_t', 'uint32_t, uint64_t',
             'uint64_t, uint64_t'],
            addvCode, '0')
    # UCVTF
    ucvtfCode = fpOp % ('fplibFixedToFP<DElement>(srcElem1, 0, true,'
                        ' FPCRRounding(fpscr), fpscr)')
    sveCvtInst('ucvtf', 'UcvtfNarrow', 'SimdCvtOp',
               ('uint16_t, uint16_t',
                'uint32_t, uint16_t',
                'uint64_t, uint16_t',
                'uint32_t, uint32_t',
                'uint64_t, uint32_t',
                'uint64_t, uint64_t'),
               ucvtfCode, CvtDir.Narrow)
    sveCvtInst('ucvtf', 'UcvtfWiden', 'SimdCvtOp', ('uint32_t, uint64_t',),
               ucvtfCode, CvtDir.Widen)
    # UDIV
    udivCode = 'destElem = (srcElem2 == 0) ? 0 : (srcElem1 / srcElem2);'
    sveBinInst('udiv', 'Udiv', 'SimdDivOp', unsignedTypes, udivCode,
               PredType.MERGE, True)
    # UDIVR
    udivrCode = 'destElem = (srcElem1 == 0) ? 0 : (srcElem2 / srcElem1);'
    sveBinInst('udivr', 'Udivr', 'SimdDivOp', unsignedTypes, udivrCode,
               PredType.MERGE, True)
    # UMAX (immediate)
    sveWideImmInst('umax', 'UmaxImm', 'SimdCmpOp', unsignedTypes, maxCode)
    # UMAX (vectors)
    sveBinInst('umax', 'Umax', 'SimdCmpOp', unsignedTypes, maxCode,
               PredType.MERGE, True)
    # UMAXV
    sveAssocReducInst('umaxv', 'Umaxv', 'SimdReduceCmpOp', unsignedTypes,
                      maxvCode, 'std::numeric_limits<Element>::min()')
    # UMIN (immediate)
    sveWideImmInst('umin', 'UminImm', 'SimdCmpOp', unsignedTypes, minCode)
    # UMIN (vectors)
    sveBinInst('umin', 'Umin', 'SimdCmpOp', unsignedTypes, minCode,
               PredType.MERGE, True)
    # UMINV
    sveAssocReducInst('uminv', 'Uminv', 'SimdReduceCmpOp', unsignedTypes,
                      minvCode, 'std::numeric_limits<Element>::max()')
    # UMULH
    sveBinInst('umulh', 'Umulh', 'SimdMultOp', unsignedTypes, mulhCode,
               PredType.MERGE, True)
    # UQADD (immediate)
    uqaddCode = '''
            destElem = srcElem1 + srcElem2;
            if (destElem < srcElem1 || destElem < srcElem2) {
                destElem = (Element)(-1);
            }
    '''
    sveWideImmInst('uqadd', 'UqaddImm', 'SimdAddOp', unsignedTypes, uqaddCode)
    # UQADD (vectors)
    sveBinInst('uqadd', 'Uqadd', 'SimdAddOp', unsignedTypes, uqaddCode)
    # UQDECB, UQDECH, UQDECW, UQDECD (scalar) 32-bit
    uqdecCode = '''
        destElem = srcElem1 - (imm * count);
        if (destElem > srcElem1) {
            destElem = 0;
        }
    '''
    sveElemCountInst('uqdec', 'Uqdec32', 'SimdAluOp', unsignedTypes,
            uqdecCode, destType = DestType.Scalar, dstIs32b = True)
    # UQDECB, UQDECH, UQDECW, UQDECD (scalar) 64-bit
    sveElemCountInst('uqdec', 'Uqdec', 'SimdAluOp', unsignedTypes,
            uqdecCode, destType = DestType.Scalar, dstIs32b = False)
    # UQDECH, UQDECW, UQDECD (vector)
    sveElemCountInst('uqdec', 'Uqdecv', 'SimdAluOp', bigUnsignedTypes,
            uqdecCode, destType = DestType.Vector, dstIs32b = False)
    # UQDECP (scalar) 32-bit
    uqdecpCode = '''
        destElem = srcElem - count;
        if (destElem > srcElem) {
            destElem = 0;
        }
    '''
    uqdecp32Code = '''
        uint32_t srcElem = WDest;
        uint32_t destElem;''' + uqdecpCode + '''
        WDest = destElem;
    '''
    svePredCountInst('uqdecp', 'Uqdecp32', 'SimdAluOp', unsignedTypes,
                     uqdecp32Code, DestType.Scalar, SrcSize.Src32bit)
    # UQDECP (scalar) 64-bit
    uqdecp64Code = '''
        uint64_t srcElem = XDest;
        uint64_t destElem;''' + uqdecpCode + '''
        XDest = destElem;
    '''
    svePredCountInst('uqdecp', 'Uqdecp64', 'SimdAluOp', unsignedTypes,
                     uqdecp64Code, DestType.Scalar, SrcSize.Src64bit)
    # UQDECP (vector)
    svePredCountInst('uqdecp', 'Uqdecpv', 'SimdAluOp', unsignedTypes,
                     uqdecpCode, DestType.Vector)
    # UQDECB, UQDECH, UQDECW, UQDECD (scalar) 32-bit
    uqincCode = '''
        destElem = srcElem1 + (imm * count);
        if (destElem < srcElem1 || destElem < (imm * count)) {
            destElem = static_cast<%(destType)s>(-1);
        }
    '''
    sveElemCountInst('uqinc', 'Uqinc32', 'SimdAluOp', unsignedTypes,
            uqincCode%{'destType': 'uint32_t'}, destType = DestType.Scalar,
            dstIs32b = True)
    # UQDECB, UQDECH, UQDECW, UQDECD (scalar) 64-bit
    sveElemCountInst('uqinc', 'Uqinc', 'SimdAluOp', unsignedTypes,
            uqincCode%{'destType': 'uint64_t'}, destType = DestType.Scalar,
            dstIs32b = False)
    # UQDECH, UQDECW, UQDECD (vector)
    sveElemCountInst('uqinc', 'Uqincv', 'SimdAluOp', bigUnsignedTypes,
            uqincCode%{'destType': 'Element'}, destType = DestType.Vector,
            dstIs32b = False)
    # UQINCP (scalar) 32-bit
    uqincpCode = '''
        destElem = srcElem + count;
        if (destElem < srcElem || destElem < count) {
            destElem = std::numeric_limits<%s>::max();
        }
    '''
    uqincp32Code = '''
        uint32_t srcElem = WDest;
        uint32_t destElem;''' + (uqincpCode % 'uint32_t') + '''
        XDest = destElem;
    '''
    svePredCountInst('uqincp', 'Uqincp32', 'SimdAluOp', unsignedTypes,
                     uqincp32Code, DestType.Scalar, SrcSize.Src32bit)
    # UQINCP (scalar) 64-bit
    uqincp64Code = '''
        uint64_t srcElem = XDest;
        uint64_t destElem;''' + (uqincpCode % 'uint64_t') + '''
        XDest = destElem;
    '''
    svePredCountInst('uqincp', 'Uqincp64', 'SimdAluOp', unsignedTypes,
                     uqincp64Code, DestType.Scalar, SrcSize.Src64bit)
    # UQINCP (vector)
    svePredCountInst('uqincp', 'Uqincpv', 'SimdAluOp', unsignedTypes,
                     uqincpCode % 'Element', DestType.Vector)
    # UQSUB (immediate)
    uqsubCode = '''
            destElem = srcElem1 - srcElem2;
            if (destElem > srcElem1) {
                destElem = 0;
            }
    '''
    sveWideImmInst('uqsub', 'UqsubImm', 'SimdAddOp', unsignedTypes, uqsubCode)
    # UQSUB (vectors)
    sveBinInst('uqsub', 'Uqsub', 'SimdAddOp', unsignedTypes, uqsubCode)
    # UUNPKHI
    sveUnpackInst('uunpkhi', 'Uunpkhi', 'SimdAluOp', unsignedWideSDTypes,
            unpackHalf = Unpack.High, regType = SrcRegType.Vector)
    # UUNPKLO
    sveUnpackInst('uunpklo', 'Uunpklo', 'SimdAluOp', unsignedWideSDTypes,
            unpackHalf = Unpack.Low, regType = SrcRegType.Vector)
    # UXTB
    uxtCode = 'destElem = srcElem1;'
    sveWidenUnaryInst('uxtb', 'Uxtb', 'SimdAluOp',
            ['uint8_t, uint16_t', 'uint8_t, uint32_t', 'uint8_t, uint64_t'],
            uxtCode, PredType.MERGE)
    # UXTH
    sveWidenUnaryInst('uxth', 'Uxth', 'SimdAluOp',
            ['uint16_t, uint32_t', 'uint16_t, uint64_t'],
            uxtCode, PredType.MERGE)
    # UXTW
    sveWidenUnaryInst('uxtw', 'Uxtw', 'SimdAluOp',
            ['uint32_t, uint64_t'],
            uxtCode, PredType.MERGE)
    # UZP1, UZP2 (predicates)
    uzpPredIterCode = '''
        constexpr unsigned sz = sizeof(Element);
        int s;
        int part = %d;
        for (unsigned i = 0; i < eCount; i++) {
            s = 2 * i + part;
            for (unsigned j = 0; j < sz; j++) {
                if (s < eCount) {
                    PDest_pb[i * sz + j] = POp1_pb[s * sz + j];
                } else {
                    PDest_pb[i * sz + j] = POp2_pb[(s - eCount) * sz + j];
                }
            }
        }
    '''
    svePredBinPermInst('uzp1', 'Uzp1Pred', 'SimdPredAluOp', unsignedTypes,
                       uzpPredIterCode % 0)
    svePredBinPermInst('uzp2', 'Uzp2Pred', 'SimdPredAluOp', unsignedTypes,
                       uzpPredIterCode % 1)
    # UZP1, UZP2 (vectors)
    uzpIterCode = '''
        int s;
        int part = %d;
        for (unsigned i = 0; i < eCount; i++) {
            s = 2 * i + part;
            if (s < eCount) {
                AA64FpDest_x[i] = AA64FpOp1_x[s];
            } else {
                AA64FpDest_x[i] = AA64FpOp2_x[s - eCount];
            }
        }
    '''
    sveBinInst('uzp1', 'Uzp1', 'SimdAluOp', unsignedTypes, '',
               customIterCode=uzpIterCode % 0)
    sveBinInst('uzp2', 'Uzp2', 'SimdAluOp', unsignedTypes, '',
               customIterCode=uzpIterCode % 1)
    # WHILELE (32-bit)
    whileLECode = '''
            cond = srcElem1 <= srcElem2;
    '''
    sveWhileInst('whilele', 'Whilele32', 'SimdCmpOp', signedTypes, whileLECode,
                 SrcSize.Src32bit)
    # WHILELE (64-bit)
    sveWhileInst('whilele', 'Whilele64', 'SimdCmpOp', signedTypes, whileLECode,
                 SrcSize.Src64bit)
    # WHILELO (32-bit)
    whileLTCode = '''
            cond = srcElem1 < srcElem2;
    '''
    sveWhileInst('whilelo', 'Whilelo32', 'SimdCmpOp', unsignedTypes,
                 whileLTCode, SrcSize.Src32bit)
    # WHILELO (64-bit)
    sveWhileInst('whilelo', 'Whilelo64', 'SimdCmpOp', unsignedTypes,
                 whileLTCode, SrcSize.Src64bit)
    # WHILELS (32-bit)
    sveWhileInst('whilels', 'Whilels32', 'SimdCmpOp', unsignedTypes,
                 whileLECode, SrcSize.Src32bit)
    # WHILELS (64-bit)
    sveWhileInst('whilels', 'Whilels64', 'SimdCmpOp', unsignedTypes,
                 whileLECode, SrcSize.Src64bit)
    # WHILELT (32-bit)
    sveWhileInst('whilelt', 'Whilelt32', 'SimdCmpOp', signedTypes,
                 whileLTCode, SrcSize.Src32bit)
    # WHILELT (64-bit)
    sveWhileInst('whilelt', 'Whilelt64', 'SimdCmpOp', signedTypes,
                 whileLTCode, SrcSize.Src64bit)
    # WRFFR
    wrffrCode = '''
        unsigned eCount = ArmStaticInst::getCurSveVecLen<uint8_t>(
                xc->tcBase());
        for (unsigned i = 0; i < eCount; i++) {
            Ffr_ub[i] = POp1_ub[i];
        }'''
    svePredWriteFfrInst('wrffr', 'Wrffr', 'SimdPredAluOp', wrffrCode, False)
    # ZIP1, ZIP2 (predicates)
    zipPredIterCode = '''
        constexpr unsigned sz = sizeof(Element);
        int s;
        int part = %d;
        for (unsigned i = 0; i < eCount / 2; i++) {
            s = i + (part * (eCount / 2));
            for (unsigned j = 0; j < sz; j++) {
                PDest_pb[(2 * i) * sz + j] = POp1_pb[s * sz + j];
                PDest_pb[(2 * i + 1) * sz + j] = POp2_pb[s * sz + j];
            }
        }
    '''
    svePredBinPermInst('zip1', 'Zip1Pred', 'SimdPredAluOp', unsignedTypes,
                       zipPredIterCode % 0)
    svePredBinPermInst('zip2', 'Zip2Pred', 'SimdPredAluOp', unsignedTypes,
                       zipPredIterCode % 1)
    # ZIP1, ZIP2 (vectors)
    zipIterCode = '''
        int s;
        int part = %d;
        for (unsigned i = 0; i < eCount / 2; i++) {
            s = i + (part * (eCount / 2));
            AA64FpDest_x[2 * i] = AA64FpOp1_x[s];
            AA64FpDest_x[2 * i + 1] = AA64FpOp2_x[s];
        }
    '''
    sveBinInst('zip1', 'Zip1', 'SimdAluOp', unsignedTypes, '',
               customIterCode=zipIterCode % 0)
    sveBinInst('zip2', 'Zip2', 'SimdAluOp', unsignedTypes, '',
               customIterCode=zipIterCode % 1)

}};
