// Copyright (c) 2017-2019 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
/// SVE 2nd-level decoder.

output decoder {{
namespace Aarch64
{

    StaticInstPtr
    decodeSveIntArithBinPred(ExtMachInst machInst)
    {
        IntRegIndex zdn = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 12, 10);

        switch (bits(machInst, 20, 19)) {
          case 0x0:
            {
                uint8_t size = bits(machInst, 23, 22);
                uint8_t opc = bits(machInst, 18, 16);
                switch (opc) {
                  case 0x0:
                    return decodeSveBinDestrPredU<SveAddPred>(
                            size, machInst, zdn, zm, pg);
                  case 0x1:
                    return decodeSveBinDestrPredU<SveSubPred>(
                            size, machInst, zdn, zm, pg);
                  case 0x3:
                    return decodeSveBinDestrPredU<SveSubr>(
                            size, machInst, zdn, zm, pg);
                  default:
                    return new Unknown64(machInst);
                }
            }
          case 0x1:
            {
                uint8_t size = bits(machInst, 23, 22);
                uint8_t u = bits(machInst, 16);
                uint8_t opc = bits(machInst, 18, 17);
                switch (opc) {
                  case 0x0:
                    return decodeSveBinDestrPred<SveSmax, SveUmax>(
                            size, u, machInst, zdn, zm, pg);
                  case 0x1:
                    return decodeSveBinDestrPred<SveSmin, SveUmin>(
                            size, u, machInst, zdn, zm, pg);
                  case 0x2:
                    return decodeSveBinDestrPred<SveSabd, SveUabd>(
                            size, u, machInst, zdn, zm, pg);
                  default:
                    return new Unknown64(machInst);
                }
            }
          case 0x2:
            {
                uint8_t size = bits(machInst, 23, 22);
                uint8_t u = bits(machInst, 16);
                uint8_t opc = bits(machInst, 18, 17);
                switch (opc) {
                  case 0x0:
                    if (u == 0) {
                        return decodeSveBinDestrPredU<SveMul>(
                                size, machInst, zdn, zm, pg);
                    } else {
                        return new Unknown64(machInst);
                    }
                  case 0x1:
                    return decodeSveBinDestrPred<SveSmulh, SveUmulh>(
                            size, u, machInst, zdn, zm, pg);
                  case 0x2:
                    if (size == 0x2 || size == 0x3) {
                        return decodeSveBinDestrPred<SveSdiv, SveUdiv>(
                                size, u, machInst, zdn, zm, pg);
                    } else {
                        return new Unknown64(machInst);
                    }
                  case 0x3:
                    if (size == 0x2 || size == 0x3) {
                        return decodeSveBinDestrPred<SveSdivr, SveUdivr>(
                                size, u, machInst, zdn, zm, pg);
                    } else {
                        return new Unknown64(machInst);
                    }
                }
            }
          case 0x3:
            {
                uint8_t size = bits(machInst, 23, 22);
                uint8_t opc = bits(machInst, 18, 16);

                switch (opc) {
                  case 0x0:
                    return decodeSveBinDestrPredU<SveOrrPred>(
                            size, machInst, zdn, zm, pg);
                  case 0x1:
                    return decodeSveBinDestrPredU<SveEorPred>(
                            size, machInst, zdn, zm, pg);
                  case 0x2:
                    return decodeSveBinDestrPredU<SveAndPred>(
                            size, machInst, zdn, zm, pg);
                  case 0x3:
                    return decodeSveBinDestrPredU<SveBicPred>(
                            size, machInst, zdn, zm, pg);
                  default:
                    return new Unknown64(machInst);
                }
            }
        }
        return new Unknown64(machInst);
    }  // decodeSveArithBinPred

    StaticInstPtr
    decodeSveIntReduc(ExtMachInst machInst)
    {
        IntRegIndex vd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 12, 10);

        uint8_t size = bits(machInst, 23, 22);

        switch (bits(machInst, 20, 19)) {
          case 0x0:
            {
                uint8_t u = bits(machInst, 16);
                uint8_t opc = bits(machInst, 18, 17);
                if (opc != 0x0 || (!u && size == 0x3)) {
                    return new Unknown64(machInst);
                } else {
                    return decodeSveWideningReduc<SveSaddv, SveUaddv>(
                            size, u, machInst, vd, zn, pg);
                }
            }
          case 0x1:
            {
                uint8_t u = bits(machInst, 16);
                uint8_t opc = bits(machInst, 18, 17);
                switch (opc) {
                  case 0x0:
                    return decodeSveUnaryPred<SveSmaxv, SveUmaxv>(
                            size, u, machInst, vd, zn, pg);
                  case 0x1:
                    return decodeSveUnaryPred<SveSminv, SveUminv>(
                            size, u, machInst, vd, zn, pg);
                  default:
                    return new Unknown64(machInst);
                }
            }
          case 0x2:
            {
                uint8_t opc = bits(machInst, 18, 17);
                uint8_t merge = bits(machInst, 16);
                switch (opc) {
                  case 0x0:
                    if (merge) {
                        return decodeSveUnaryPredU<SveMovprfxPredM>(
                                size, machInst, vd /* zd */, zn, pg);
                    } else {
                        return decodeSveUnaryPredU<SveMovprfxPredZ>(
                                size, machInst, vd /* zd */, zn, pg);
                    }
                  default:
                    return new Unknown64(machInst);
                }
            }
          case 0x3:
            {
                uint8_t opc = bits(machInst, 18, 16);
                switch (opc) {
                  case 0x0:
                    return decodeSveUnaryPredU<SveOrv>(
                            size, machInst, vd, zn, pg);
                  case 0x1:
                    return decodeSveUnaryPredU<SveEorv>(
                            size, machInst, vd, zn, pg);
                  case 0x2:
                    return decodeSveUnaryPredU<SveAndv>(
                            size, machInst, vd, zn, pg);
                  default:
                    return new Unknown64(machInst);
                }
            }
        }
        return new Unknown64(machInst);
    }  // decodeSveIntReduc

    StaticInstPtr
    decodeSveIntMulAdd(ExtMachInst machInst)
    {
        IntRegIndex zda = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 20, 16);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 12, 10);

        uint8_t size = bits(machInst, 23, 22);
        uint8_t opc = (bits(machInst, 15) << 1) | bits(machInst, 13);
        switch (opc) {
          case 0x0:
            return decodeSveTerPredS<SveMla>(
                    size, machInst, zda, zn, zm, pg);
          case 0x1:
            return decodeSveTerPredS<SveMls>(
                    size, machInst, zda, zn, zm, pg);
          case 0x2:
            return decodeSveTerPredS<SveMad>(
                    size, machInst, zda /* zdn */, zn /* za */, zm, pg);
          case 0x3:
            return decodeSveTerPredS<SveMsb>(
                    size, machInst, zda /* zdn */, zn /* za */, zm, pg);
        }
        return new Unknown64(machInst);
    }  // decodeSveIntMulAdd

    StaticInstPtr
    decodeSveShiftByImmPred0(ExtMachInst machInst)
    {
        IntRegIndex zdn = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 12, 10);
        uint8_t imm3 = (uint8_t) bits(machInst, 7, 5);

        uint8_t tsize = (bits(machInst, 23, 22) << 2) | bits(machInst, 9, 8);
        uint8_t esize = 0;
        uint8_t size = 0;

        if (tsize == 0x0) {
            return new Unknown64(machInst);
        } else if (tsize == 0x1) {
            esize = 8;
        } else if ((tsize & 0x0E) == 0x2) {
            esize = 16;
            size = 1;
        } else if ((tsize & 0x0C) == 0x4) {
            esize = 32;
            size = 2;
        } else if ((tsize & 0x08) == 0x8) {
            esize = 64;
            size = 3;
        }

        uint8_t opc = bits(machInst, 18, 16);
        switch (opc) {
            case 0x0:
                {
                    unsigned shiftAmt = 2 * esize - ((tsize << 3) | imm3);
                    return decodeSveBinImmPredU<SveAsrImmPred>(
                            size, machInst, zdn, shiftAmt, pg);
                }
            case 0x01:
                {
                    unsigned shiftAmt = 2 * esize - ((tsize << 3) | imm3);
                    return decodeSveBinImmPredU<SveLsrImmPred>(
                            size, machInst, zdn, shiftAmt, pg);
                }
            case 0x03:
                {
                    unsigned shiftAmt = ((tsize << 3) | imm3) - esize;
                    return decodeSveBinImmPredU<SveLslImmPred>(
                            size, machInst, zdn, shiftAmt, pg);
                }
            case 0x04:
                {
                    unsigned shiftAmt = 2 * esize - ((tsize << 3) | imm3);
                    return decodeSveBinImmPredS<SveAsrd>(
                            size, machInst, zdn, shiftAmt, pg);
                }
        }
        return new Unknown64(machInst);
    } // decodeSveShiftByImmPred0

    StaticInstPtr
    decodeSveShiftByVectorPred(ExtMachInst machInst)
    {
        IntRegIndex zdn = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 12, 10);
        uint8_t size = bits(machInst, 23, 22);
        uint8_t opc = bits(machInst, 18, 16);
        switch (opc) {
            case 0:
                return decodeSveBinDestrPredU<SveAsrPred>(
                        size, machInst, zdn, zm, pg);
            case 1:
                return decodeSveBinDestrPredU<SveLsrPred>(
                        size, machInst, zdn, zm, pg);
            case 3:
                return decodeSveBinDestrPredU<SveLslPred>(
                        size, machInst, zdn, zm, pg);
            case 4:
                return decodeSveBinDestrPredU<SveAsrr>(
                        size, machInst, zdn, zm, pg);
            case 5:
                return decodeSveBinDestrPredU<SveLsrr>(
                        size, machInst, zdn, zm, pg);
            case 7:
                return decodeSveBinDestrPredU<SveLslr>(
                        size, machInst, zdn, zm, pg);
        }
        return new Unknown64(machInst);
    } // decodeSveShiftByVectorPred

    StaticInstPtr
    decodeSveShiftByWideElemsPred(ExtMachInst machInst)
    {
        IntRegIndex zdn = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 12, 10);
        uint8_t size = bits(machInst, 23, 22);
        uint8_t opc = bits(machInst, 18, 16);
        switch (opc) {
            case 0x0:
                return decodeSveBinDestrPredU<SveAsrWidePred>(
                        size, machInst, zdn, zm, pg);
            case 0x1:
                return decodeSveBinDestrPredU<SveLsrWidePred>(
                        size, machInst, zdn, zm, pg);
            case 0x3:
                return decodeSveBinDestrPredU<SveLslWidePred>(
                        size, machInst, zdn, zm, pg);
        }
        return new Unknown64(machInst);
    } // decodeSveShiftByWideElemsPred

    StaticInstPtr
    decodeSveShiftByImmPred(ExtMachInst machInst)
    {
        uint8_t b20_19 = bits(machInst, 20, 19);
        uint8_t b23_22 = bits(machInst, 23, 22);

        if (b20_19 == 0x0) {
            return decodeSveShiftByImmPred0(machInst);
        } else if (b20_19 == 0x2) {
            return decodeSveShiftByVectorPred(machInst);
        } else if (b20_19 == 0x3 && b23_22 != 0x3) {
            return decodeSveShiftByWideElemsPred(machInst);
        }
        return new Unknown64(machInst);
    }  // decodeSveShiftByImmPred

    StaticInstPtr
    decodeSveIntArithUnaryPred(ExtMachInst machInst)
    {
        IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 12, 10);
        unsigned esize = bits(machInst, 23, 22);
        uint8_t opg = bits(machInst, 20, 19);
        uint8_t opc = bits(machInst, 18, 16);
        if (opg == 0x2) {
            bool unsig = static_cast<bool>(opc & 1);
            switch (opc) {
                case 0:
                case 1:
                    if (esize == 0) break;
                    if (unsig) {
                        return decodeSveUnaryExtendFromBPredU<SveUxtb>(
                                esize, machInst, zd, zn, pg);
                    } else {
                        return decodeSveUnaryExtendFromBPredU<SveSxtb>(
                                esize, machInst, zd, zn, pg);
                    }
                case 2:
                case 3:
                    if (esize < 2) break;
                    if (unsig) {
                        return decodeSveUnaryExtendFromHPredU<SveUxth>(
                                esize, machInst, zd, zn, pg);
                    } else {
                        return decodeSveUnaryExtendFromHPredU<SveSxth>(
                                esize, machInst, zd, zn, pg);
                    }
                case 4:
                case 5:
                    if (esize != 3) break;
                    if (unsig) {
                        return new SveUxtw<uint32_t, uint64_t>(
                                machInst, zd, zn, pg);
                    } else {
                        return new SveSxtw<uint32_t, uint64_t>(
                                machInst, zd, zn, pg);
                    }
                case 6:
                    return decodeSveUnaryPredS<SveAbs>(
                            esize, machInst, zd, zn, pg);
                case 7:
                    return decodeSveUnaryPredS<SveNeg>(
                            esize, machInst, zd, zn, pg);
            }
        } else if (opg == 0x3) {
            switch (opc) {
                case 0:
                    return decodeSveUnaryPredS<SveCls>(
                            esize, machInst, zd, zn, pg);
                case 1:
                    return decodeSveUnaryPredS<SveClz>(
                            esize, machInst, zd, zn, pg);
                case 2:
                    return decodeSveUnaryPredU<SveCnt>(
                            esize, machInst, zd, zn, pg);
                case 3:
                    return decodeSveUnaryPredU<SveCnot>(
                            esize, machInst, zd, zn, pg);
                case 4:
                    return decodeSveUnaryPredF<SveFabs>(
                            esize, machInst, zd, zn, pg);
                case 5:
                    return decodeSveUnaryPredF<SveFneg>(
                            esize, machInst, zd, zn, pg);
                case 6:
                    return decodeSveUnaryPredU<SveNot>(
                            esize, machInst, zd, zn, pg);
                    break;
            }
        }
        return new Unknown64(machInst);
    }  // decodeSveIntArithUnaryPred

    StaticInstPtr
    decodeSveIntArithUnpred(ExtMachInst machInst)
    {
        IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 20, 16);

        uint8_t opc = (uint8_t) bits(machInst, 12, 10);
        uint8_t size = (uint8_t) bits(machInst, 23, 22);

        switch (opc) {
            case 0x0:
                return decodeSveBinUnpredU<SveAddUnpred>(size, machInst,
                        zd, zn, zm);
            case 0x1:
                return decodeSveBinUnpredU<SveSubUnpred>(size, machInst,
                        zd, zn, zm);
            case 0x4:
                return decodeSveBinUnpredS<SveSqadd>(size, machInst,
                        zd, zn, zm);
            case 0x5:
                return decodeSveBinUnpredU<SveUqadd>(size, machInst,
                        zd, zn, zm);
            case 0x6:
                return decodeSveBinUnpredS<SveSqsub>(size, machInst,
                        zd, zn, zm);
            case 0x7:
                return decodeSveBinUnpredU<SveUqsub>(size, machInst,
                        zd, zn, zm);
        }

        return new Unknown64(machInst);
    }  // decodeSveIntArithUnpred

    StaticInstPtr
    decodeSveIntLogUnpred(ExtMachInst machInst)
    {
        IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 20, 16);
        uint8_t opc = (uint8_t) (bits(machInst, 23, 22) << 3
                | bits(machInst, 12, 10));

        switch (opc) {
            case 0x4:
                return new SveAndUnpred<uint64_t>(machInst, zd, zn, zm);
            case 0xc:
                return new SveOrrUnpred<uint64_t>(machInst, zd, zn, zm);
            case 0x14:
                return new SveEorUnpred<uint64_t>(machInst, zd, zn, zm);
            case 0x1c:
                return new SveBicUnpred<uint64_t>(machInst, zd, zn, zm);
        }

        return new Unknown64(machInst);
    }  // decodeSveIntLogUnpred

    StaticInstPtr
    decodeSveIndexGen(ExtMachInst machInst)
    {
        IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        uint8_t size = (uint8_t) bits(machInst, 23, 22);
        uint8_t grp = (uint8_t) bits(machInst, 11, 10);

        switch (grp) {
            case 0:
                { // INDEX (immediate)
                    int8_t imm5 = sext<5>(bits(machInst, 9, 5));
                    int8_t imm5b = sext<5>(bits(machInst, 20, 16));
                    switch (size) {
                        case 0:
                            return new SveIndexII<int8_t>(machInst,
                                    zd, imm5, imm5b);
                        case 1:
                            return new SveIndexII<int16_t>(machInst,
                                    zd, imm5, imm5b);
                        case 2:
                            return new SveIndexII<int32_t>(machInst,
                                    zd, imm5, imm5b);
                        case 3:
                            return new SveIndexII<int64_t>(machInst,
                                    zd, imm5, imm5b);
                    }
                }
            case 1:
                { // INDEX (scalar, immediate)
                    int8_t imm5 = sext<5>(bits(machInst, 20, 16));
                    IntRegIndex zn = (IntRegIndex) (uint8_t) bits(
                            machInst, 9, 5);
                    switch (size) {
                        case 0:
                            return new SveIndexRI<int8_t>(machInst,
                                    zd, zn, imm5);
                        case 1:
                            return new SveIndexRI<int16_t>(machInst,
                                    zd, zn, imm5);
                        case 2:
                            return new SveIndexRI<int32_t>(machInst,
                                    zd, zn, imm5);
                        case 3:
                            return new SveIndexRI<int64_t>(machInst,
                                    zd, zn, imm5);
                    }
                }
            case 2:
                { // INDEX (immediate, scalar)
                    int8_t imm5 = sext<5>(bits(machInst, 9, 5));
                    IntRegIndex zm = (IntRegIndex) (uint8_t) bits(
                            machInst, 20, 16);
                    switch (size) {
                        case 0:
                            return new SveIndexIR<int8_t>(machInst,
                                    zd, imm5, zm);
                        case 1:
                            return new SveIndexIR<int16_t>(machInst,
                                    zd, imm5, zm);
                        case 2:
                            return new SveIndexIR<int32_t>(machInst,
                                    zd, imm5, zm);
                        case 3:
                            return new SveIndexIR<int64_t>(machInst,
                                    zd, imm5, zm);
                    }
                }
            case 3:
                { // INDEX (scalars)
                    IntRegIndex zn = (IntRegIndex) (uint8_t) bits(
                            machInst, 9, 5);
                    IntRegIndex zm = (IntRegIndex) (uint8_t) bits(
                            machInst, 20, 16);
                    switch (size) {
                        case 0:
                            return new SveIndexRR<int8_t>(machInst,
                                    zd, zn, zm);
                        case 1:
                            return new SveIndexRR<int16_t>(machInst,
                                    zd, zn, zm);
                        case 2:
                            return new SveIndexRR<int32_t>(machInst,
                                    zd, zn, zm);
                        case 3:
                            return new SveIndexRR<int64_t>(machInst,
                                    zd, zn, zm);
                    }
                }
        }
        return new Unknown64(machInst);
    }  // decodeSveIndexGen

    StaticInstPtr
    decodeSveStackAlloc(ExtMachInst machInst)
    {
        uint8_t b23_22 = bits(machInst, 23, 22);
        uint8_t b11 = bits(machInst, 11);
        if ((b23_22 & 0x2) == 0x0 && b11 == 0x0) {
            IntRegIndex rd = makeSP(
                (IntRegIndex) (uint8_t) bits(machInst, 4, 0));
            IntRegIndex rn = makeSP(
                (IntRegIndex) (uint8_t) bits(machInst, 20, 16));
            uint64_t imm = sext<6>(bits(machInst, 10, 5));
            if ((b23_22 & 0x1) == 0x0) {
                return new AddvlXImm(machInst, rd, rn, imm);
            } else {
                return new AddplXImm(machInst, rd, rn, imm);
            }
        } else if (b23_22 == 0x2 && b11 == 0x0) {
            IntRegIndex rd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
            uint64_t imm = sext<6>(bits(machInst, 10, 5));
            if (bits(machInst, 20, 16) == 0x1f) {
                return new SveRdvl(machInst, rd, imm);
            }
        }
        return new Unknown64(machInst);
    }  // decodeSveStackAlloc

    StaticInstPtr
    decodeSveShiftByWideElemsUnpred(ExtMachInst machInst)
    {
        IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 20, 16);
        uint8_t size = bits(machInst, 23, 22);
        uint8_t opc = (uint8_t) bits(machInst, 11, 10);
        switch (opc) {
            case 0x0:
                return decodeSveBinUnpredU<SveAsrWideUnpred>(
                        size, machInst, zd, zn, zm);
            case 0x1:
                return decodeSveBinUnpredU<SveLsrWideUnpred>(
                        size, machInst, zd, zn, zm);
            case 0x3:
                return decodeSveBinUnpredU<SveLslWideUnpred>(
                        size, machInst, zd, zn, zm);
        }
        return new Unknown64(machInst);
    }  // decodeSveShiftByWideElemsUnpred

    StaticInstPtr
    decodeSveShiftByImmUnpredB(ExtMachInst machInst)
    {
        IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        uint8_t imm3 = (uint8_t) bits(machInst, 18, 16);

        uint8_t tsize = (bits(machInst, 23, 22) << 2) | bits(machInst, 20, 19);
        uint8_t esize = 0;
        uint8_t size = 0;
        if (tsize == 0x0) {
            return new Unknown64(machInst);
        } else if (tsize == 0x1) {
            esize = 8;
        } else if ((tsize & 0x0E) == 0x2) {
            esize = 16;
            size = 1;
        } else if ((tsize & 0x0C) == 0x4) {
            esize = 32;
            size = 2;
        } else if ((tsize & 0x08) == 0x8) {
            esize = 64;
            size = 3;
        }

        uint8_t opc = bits(machInst, 11, 10);
        switch (opc) {
            case 0x00:
                {
                    unsigned shiftAmt = 2 * esize - ((tsize << 3) | imm3);
                    return decodeSveBinImmUnpredU<SveAsrImmUnpred>(
                            size, machInst, zd, zn, shiftAmt);
                }
            case 0x01:
                {
                    unsigned shiftAmt = 2 * esize - ((tsize << 3) | imm3);
                    return decodeSveBinImmUnpredU<SveLsrImmUnpred>(
                            size, machInst, zd, zn, shiftAmt);
                }
            case 0x03:
                {
                    unsigned shiftAmt = ((tsize << 3) | imm3) - esize;
                    return decodeSveBinImmUnpredU<SveLslImmUnpred>(
                            size, machInst, zd, zn, shiftAmt);
                }
        }

        return new Unknown64(machInst);
    }  // decodeSveShiftByImmUnpredB

    StaticInstPtr
    decodeSveShiftByImmUnpred(ExtMachInst machInst)
    {
        if (bits(machInst, 12)) {
            return decodeSveShiftByImmUnpredB(machInst);
        } else {
            return decodeSveShiftByWideElemsUnpred(machInst);
        }
        return new Unknown64(machInst);
    }  // decodeSveShiftByImmUnpred

    StaticInstPtr
    decodeSveCompVecAddr(ExtMachInst machInst)
    {
        IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 20, 16);
        uint8_t mult = 1 << bits(machInst, 11, 10);

        uint8_t opc = bits(machInst, 23, 22);

        switch (opc) {
          case 0x0:
            return new SveAdr<uint64_t>(machInst, zd, zn, zm, mult,
                    SveAdr<uint64_t>::SveAdrOffsetUnpackedSigned);
          case 0x1:
            return new SveAdr<uint64_t>(machInst, zd, zn, zm, mult,
                    SveAdr<uint64_t>::SveAdrOffsetUnpackedUnsigned);
          case 0x2:
            return new SveAdr<uint32_t>(machInst, zd, zn, zm, mult,
                    SveAdr<uint32_t>::SveAdrOffsetPacked);
          case 0x3:
            return new SveAdr<uint64_t>(machInst, zd, zn, zm, mult,
                    SveAdr<uint64_t>::SveAdrOffsetPacked);
        }
        return new Unknown64(machInst);
    }  // decodeSveCompVecAddr

    StaticInstPtr
    decodeSveIntMiscUnpred(ExtMachInst machInst)
    {
        IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);

        uint8_t size = bits(machInst, 23, 22);
        uint8_t opc = bits(machInst, 11, 10);
        switch (opc) {
          case 0x0:
            // SVE floating-point trig select coefficient
            {
                if (size == 0) {
                    break;
                }
                IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst,
                                                              20, 16);
                return decodeSveBinUnpredF<SveFtssel>(
                    size, machInst, zd, zn, zm);
            }
          case 0x2:
            // SVE floating-point exponential accelerator
            if (size == 0) {
                break;
            }
            return decodeSveUnaryUnpredF<SveFexpa>(size, machInst, zd, zn);
          case 0x3:
            // SVE constructive prefix (unpredicated)
            if (size == 0x0 && bits(machInst, 20, 16) == 0x0) {
                return new SveMovprfxUnpred<uint64_t>(machInst, zd, zn);
            }
            break;
        }
        return new Unknown64(machInst);
    }  // decodeSveIntMiscUnpred

    StaticInstPtr
    decodeSveElemCount(ExtMachInst machInst)
    {
        uint8_t opc20 = (uint8_t) bits(machInst, 20);
        uint8_t b13_12 = (uint8_t) bits(machInst, 13, 12);
        uint8_t opc11 = (uint8_t) bits(machInst, 11);
        uint8_t opc10 = (uint8_t) bits(machInst, 10);
        uint8_t opc11_10 = (uint8_t) bits(machInst, 11, 10);
        if (b13_12 == 0) {
            uint8_t pattern = (uint8_t) bits(machInst, 9, 5);
            uint8_t imm4 = (uint8_t) bits(machInst, 19, 16) + 1;
            IntRegIndex zdn = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
            unsigned size = (unsigned) bits(machInst, 23, 22);
            if (opc20) {
                if (opc11 == 0) {
                    if (opc10) {
                        return decodeSveElemIntCountLU<SveDecv>(size,
                                machInst, zdn, pattern, imm4);
                    } else {
                        return decodeSveElemIntCountLU<SveIncv>(size,
                                machInst, zdn, pattern, imm4);
                    }
                }
            } else {
                if (opc11) {
                    if (opc10) {
                        return decodeSveElemIntCountLU<SveUqdecv>(size,
                                machInst, zdn, pattern, imm4);
                    } else {
                        return decodeSveElemIntCountLS<SveSqdecv>(size,
                                machInst, zdn, pattern, imm4);
                    }
                } else {
                    if (opc10) {
                        return decodeSveElemIntCountLU<SveUqincv>(size,
                                machInst, zdn, pattern, imm4);
                    } else {
                        return decodeSveElemIntCountLS<SveSqincv>(size,
                                machInst, zdn, pattern, imm4);
                    }
                }
            }
        } else if (b13_12 == 3) {
            uint8_t pattern = (uint8_t) bits(machInst, 9, 5);
            uint8_t imm4 = (uint8_t) bits(machInst, 19, 16) + 1;
            IntRegIndex rdn = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
            unsigned size = (unsigned) bits(machInst, 23, 22);
            switch (opc11_10) {
                case 0:
                    if (opc20) {
                        return decodeSveElemIntCountS<SveSqinc>(size,
                                machInst, rdn, pattern, imm4);
                    } else {
                        return decodeSveElemIntCountS<SveSqinc32>(size,
                                machInst, rdn, pattern, imm4);
                    }
                case 1:
                    if (opc20) {
                        return decodeSveElemIntCountU<SveUqinc>(size,
                                machInst, rdn, pattern, imm4);
                    } else {
                        return decodeSveElemIntCountU<SveUqinc32>(size,
                                machInst, rdn, pattern, imm4);
                    }
                case 2:
                    if (opc20) {
                        return decodeSveElemIntCountS<SveSqdec>(size,
                                machInst, rdn, pattern, imm4);
                    } else {
                        return decodeSveElemIntCountS<SveSqdec32>(size,
                                machInst, rdn, pattern, imm4);
                    }
                case 3:
                    if (opc20) {
                        return decodeSveElemIntCountU<SveUqdec>(size,
                                machInst, rdn, pattern, imm4);
                    } else {
                        return decodeSveElemIntCountU<SveUqdec32>(size,
                                machInst, rdn, pattern, imm4);
                    }
            }
        } else if (opc20 && b13_12 == 2 && !(opc11_10 & 0x2)) {
            uint8_t pattern = (uint8_t) bits(machInst, 9, 5);
            uint8_t imm4 = (uint8_t) bits(machInst, 19, 16) + 1;
            IntRegIndex rdn = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
            unsigned size = (unsigned) bits(machInst, 23, 22);
            if (opc11_10 & 0x1) {
                return decodeSveElemIntCountU<SveDec>(size, machInst,
                        rdn, pattern, imm4);
            } else {
                return decodeSveElemIntCountU<SveInc>(size, machInst,
                        rdn, pattern, imm4);
            }
        } else if (!opc20 && b13_12 == 2 && opc11_10 == 0) {
            uint8_t pattern = (uint8_t) bits(machInst, 9, 5);
            uint8_t imm4 = (uint8_t) bits(machInst, 19, 16) + 1;
            IntRegIndex rd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
            unsigned size = (unsigned) bits(machInst, 23, 22);
            return decodeSveElemIntCountU<SveCntx>(size, machInst,
                    rd, pattern, imm4);
        }
        return new Unknown64(machInst);
    }  // decodeSveElemCount

    StaticInstPtr
    decodeSveLogMaskImm(ExtMachInst machInst)
    {
        IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        bool n = bits(machInst, 17);
        uint8_t immr = bits(machInst, 16, 11);
        uint8_t imms = bits(machInst, 10, 5);

        // Decode bitmask
        // len = MSB(n:NOT(imms)), len < 1 is undefined
        uint8_t len = 0;
        if (n) {
            len = 6;
        } else if (imms == 0x3f || imms == 0x3e) {
            return new Unknown64(machInst);
        } else {
            len = findMsbSet(imms ^ 0x3f);
        }
        // Generate r, s, and size
        uint64_t r = bits(immr, len - 1, 0);
        uint64_t s = bits(imms, len - 1, 0);
        uint8_t size = 1 << len;
        if (s == size - 1)
            return new Unknown64(machInst);
        // Generate the pattern with s 1s, rotated by r, with size bits
        uint64_t pattern = mask(s + 1);
        if (r) {
            pattern = (pattern >> r) | (pattern << (size - r));
            pattern &= mask(size);
        }
        // Replicate that to fill up the immediate
        for (unsigned i = 1; i < (64 / size); i *= 2)
            pattern |= (pattern << (i * size));
        uint64_t imm = pattern;

        if (bits(machInst, 19, 18) == 0x0) {
            if (bits(machInst, 23, 22) == 0x3) {
                return new SveDupm<uint64_t>(machInst, zd, imm);
            } else {
                switch (bits(machInst, 23, 22)) {
                  case 0x0:
                    return new SveOrrImm<uint64_t>(machInst, zd, imm);
                  case 0x1:
                    return new SveEorImm<uint64_t>(machInst, zd, imm);
                  case 0x2:
                    return new SveAndImm<uint64_t>(machInst, zd, imm);
                }
            }
        }

        return new Unknown64(machInst);
    }  // decodeSveLogMaskImm

    StaticInstPtr
    decodeSveIntWideImmPred(ExtMachInst machInst)
    {
        IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 19, 16);
        uint8_t size = bits(machInst, 23, 22);

        if (bits(machInst, 15) == 0x0) {
            uint64_t imm = bits(machInst, 12, 5);
            uint8_t sh = bits(machInst, 13);
            uint8_t m = bits(machInst, 14);
            if (sh) {
                if (size == 0x0) {
                    return new Unknown64(machInst);
                }
                imm <<= 8;
            }
            if (m) {
                if (sh) {
                    return decodeSveWideImmPredU<SveCpyImmMerge>(
                        size, machInst, zd, sext<16>(imm), pg);
                } else {
                    return decodeSveWideImmPredU<SveCpyImmMerge>(
                        size, machInst, zd, sext<8>(imm), pg);
                }
            } else {
                if (sh) {
                    return decodeSveWideImmPredU<SveCpyImmZero>(
                        size, machInst, zd, sext<16>(imm), pg,
                        false /* isMerging */);
                } else {
                    return decodeSveWideImmPredU<SveCpyImmZero>(
                        size, machInst, zd, sext<8>(imm), pg,
                        false /* isMerging */);
                }
            }
        } else if (bits(machInst, 15, 13) == 0x6 && size != 0x0) {
            uint64_t imm = vfp_modified_imm(bits(machInst, 12, 5),
                decode_fp_data_type(size));
            return decodeSveWideImmPredF<SveFcpy>(
                        size, machInst, zd, imm, pg);
        }

        return new Unknown64(machInst);
    }  // decodeSveIntWideImmPred

    StaticInstPtr
    decodeSvePermExtract(ExtMachInst machInst)
    {
        uint8_t b23_22 = (unsigned) bits(machInst, 23, 22);
        if (!b23_22) {
            uint8_t position =
                bits(machInst, 20, 16) << 3 | bits(machInst, 12, 10);
            IntRegIndex zdn = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
            IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
            return new SveExt<uint8_t>(machInst, zdn, zm, position);
        }
        return new Unknown64(machInst);
    }  // decodeSvePermExtract

    StaticInstPtr
    decodeSvePermUnpred(ExtMachInst machInst)
    {
        uint8_t b12_10 = bits(machInst, 12, 10);
        if (b12_10 == 0x4) {
            unsigned size = (unsigned) bits(machInst, 23, 22);
            IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
            IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
            IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 20, 16);
            return decodeSveBinUnpredU<SveTbl>(size, machInst, zd, zn, zm);
        } else if (bits(machInst, 20, 16) == 0x0 && b12_10 == 0x6) {
            uint8_t size = bits(machInst, 23, 22);
            IntRegIndex rn = makeSP(
                    (IntRegIndex) (uint8_t) bits(machInst, 9, 5));
            IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
            return decodeSveUnaryUnpredU<SveDupScalar>(size, machInst, zd, rn);
        } else if (bits(machInst, 20, 16) == 0x4 && b12_10 == 0x6) {
            uint8_t size = bits(machInst, 23, 22);
            IntRegIndex zdn = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
            IntRegIndex rm = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
            return decodeSveUnaryUnpredU<SveInsr>(size, machInst, zdn, rm);
        } else if (bits(machInst, 20, 16) == 0x14 && b12_10 == 0x6) {
            uint8_t size = bits(machInst, 23, 22);
            IntRegIndex zdn = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
            IntRegIndex vm = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
            return decodeSveUnaryUnpredU<SveInsrf>(size, machInst, zdn, vm);
        } else if (bits(machInst, 20, 16) == 0x18 && b12_10 == 0x6) {
            uint8_t size = bits(machInst, 23, 22);
            IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
            IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
            return decodeSveUnaryUnpredU<SveRevv>(size, machInst, zd, zn);
        } else if (b12_10 == 0x0 && bits(machInst, 20, 16) != 0x0) {
            uint8_t imm =
                bits(machInst, 23, 22) << 5 | // imm3h
                bits(machInst, 20) << 4 |     // imm3l
                bits(machInst, 19, 16);       // tsz
            IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
            IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
            if (imm & 0x1) {
                imm >>= 1;
                return new SveDupIdx<uint8_t>(machInst, zd, zn, imm);
            } else if (imm & 0x2) {
                imm >>= 2;
                return new SveDupIdx<uint16_t>(machInst, zd, zn, imm);
            } else if (imm & 0x4) {
                imm >>= 3;
                return new SveDupIdx<uint32_t>(machInst, zd, zn, imm);
            } else if (imm & 0x8) {
                imm >>= 4;
                return new SveDupIdx<uint64_t>(machInst, zd, zn, imm);
            } else if (imm & 0x10) {
                imm >>= 5;
                return new SveDupIdx<__uint128_t>(machInst, zd, zn, imm);
            }
            return new Unknown64(machInst);
        } else if (bits(machInst, 23, 22) != 0x0 &&
                   bits(machInst, 20, 18) == 0x4 && b12_10 == 0x6) {
            unsigned size = (unsigned) bits(machInst, 23, 22);
            IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
            IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
            if (bits(machInst, 17)) {
                if (bits(machInst, 16)) {
                    return decodeSveUnpackU<SveUunpkhi>(size, machInst,
                                                        zd, zn);
                } else {
                    return decodeSveUnpackU<SveUunpklo>(size, machInst,
                                                        zd, zn);
                }
            } else {
                if (bits(machInst, 16)) {
                    return decodeSveUnpackS<SveSunpkhi>(size, machInst,
                                                        zd, zn);
                } else {
                    return decodeSveUnpackS<SveSunpklo>(size, machInst,
                                                        zd, zn);
                }
            }
        }
        return new Unknown64(machInst);
    }  // decodeSvePermUnpred

    StaticInstPtr
    decodeSvePermPredicates(ExtMachInst machInst)
    {
        if (bits(machInst, 20) == 0x0 && bits(machInst, 12, 11) != 0x3 &&
                bits(machInst, 9) == 0x0 && bits(machInst, 4) == 0x0) {
            IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
            IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
            IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 20, 16);

            uint8_t size = bits(machInst, 23, 22);

            uint8_t opc = bits(machInst, 12, 10);

            switch (opc) {
              case 0x0:
                return decodeSveBinUnpredU<SveZip1Pred>(size,
                        machInst, zd, zn, zm);
              case 0x1:
                return decodeSveBinUnpredU<SveZip2Pred>(size,
                        machInst, zd, zn, zm);
              case 0x2:
                return decodeSveBinUnpredU<SveUzp1Pred>(size,
                        machInst, zd, zn, zm);
              case 0x3:
                return decodeSveBinUnpredU<SveUzp2Pred>(size,
                        machInst, zd, zn, zm);
              case 0x4:
                return decodeSveBinUnpredU<SveTrn1Pred>(size,
                        machInst, zd, zn, zm);
              case 0x5:
                return decodeSveBinUnpredU<SveTrn2Pred>(size,
                        machInst, zd, zn, zm);
            }
        } else if (bits(machInst, 23, 22) == 0x0 &&
                bits(machInst, 20, 17) == 0x8 && bits(machInst, 12, 9) == 0x0
                && bits(machInst, 4) == 0x0) {
            IntRegIndex pd = (IntRegIndex) (uint8_t) bits(machInst, 3, 0);
            IntRegIndex pn = (IntRegIndex) (uint8_t) bits(machInst, 8, 5);
            if (bits(machInst, 16)) {
                return new SvePunpkhi<uint8_t, uint16_t>(machInst, pd, pn);
            } else {
                return new SvePunpklo<uint8_t, uint16_t>(machInst, pd, pn);
            }
        } else if (bits(machInst, 20, 16) == 0x14 &&
                bits(machInst, 12, 9) == 0x00 && bits(machInst, 4) == 0) {
            uint8_t size = bits(machInst, 23, 22);
            IntRegIndex pd = (IntRegIndex) (uint8_t) bits(machInst, 3, 0);
            IntRegIndex pn = (IntRegIndex) (uint8_t) bits(machInst, 8, 5);
            return decodeSveUnaryUnpredU<SveRevp>(size, machInst, pd, pn);
        }
        return new Unknown64(machInst);
    }  // decodeSvePermPredicates

    StaticInstPtr
    decodeSvePermIntlv(ExtMachInst machInst)
    {
        IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 20, 16);

        uint8_t size = bits(machInst, 23, 22);

        uint8_t opc = bits(machInst, 12, 10);

        switch (opc) {
          case 0x0:
            return decodeSveBinUnpredU<SveZip1>(size, machInst, zd, zn, zm);
          case 0x1:
            return decodeSveBinUnpredU<SveZip2>(size, machInst, zd, zn, zm);
          case 0x2:
            return decodeSveBinUnpredU<SveUzp1>(size, machInst, zd, zn, zm);
          case 0x3:
            return decodeSveBinUnpredU<SveUzp2>(size, machInst, zd, zn, zm);
          case 0x4:
            return decodeSveBinUnpredU<SveTrn1>(size, machInst, zd, zn, zm);
          case 0x5:
            return decodeSveBinUnpredU<SveTrn2>(size, machInst, zd, zn, zm);
        }
        return new Unknown64(machInst);
    }  // decodeSvePermIntlv

    StaticInstPtr
    decodeSvePermPred(ExtMachInst machInst)
    {
        uint8_t b13 = bits(machInst, 13);
        uint8_t b23 = bits(machInst, 23);
        switch (bits(machInst, 20, 16)) {
          case 0x0:
            if (!b13) {
                uint8_t size = bits(machInst, 23, 22);
                IntRegIndex pg = (IntRegIndex)(uint8_t) bits(machInst, 12, 10);
                IntRegIndex vn = (IntRegIndex)(uint8_t) bits(machInst, 9, 5);
                IntRegIndex zd = (IntRegIndex)(uint8_t) bits(machInst, 4, 0);
                return decodeSveUnaryPredU<SveCpySimdFpScalar>(size,
                        machInst, zd, vn, pg);
            }
            break;
          case 0x1:
            if (!b13 && b23) {
                // sve_int_perm_compact
                IntRegIndex pg = (IntRegIndex)(uint8_t) bits(machInst, 12, 10);
                IntRegIndex zn = (IntRegIndex)(uint8_t) bits(machInst, 9, 5);
                IntRegIndex zd = (IntRegIndex)(uint8_t) bits(machInst, 4, 0);
                if (bits(machInst, 22)) {
                    return new SveCompact<uint64_t>(machInst, zd, zn, pg);
                } else {
                    return new SveCompact<uint32_t>(machInst, zd, zn, pg);
                }
            }
            break;
          case 0x8:
            if (b13) {
                uint8_t size = bits(machInst, 23, 22);
                IntRegIndex pg = (IntRegIndex)(uint8_t) bits(machInst, 12, 10);
                IntRegIndex rn = makeSP(
                        (IntRegIndex)(uint8_t) bits(machInst, 9, 5));
                IntRegIndex zd = (IntRegIndex)(uint8_t) bits(machInst, 4, 0);
                return decodeSveUnaryPredU<SveCpyScalar>(size,
                        machInst, zd, rn, pg);
            }
            break;
          case 0xC:
            if (!b13) {
                uint8_t size = bits(machInst, 23, 22);
                IntRegIndex pg = (IntRegIndex)(uint8_t) bits(machInst, 12, 10);
                IntRegIndex zdn = (IntRegIndex)(uint8_t) bits(machInst, 4, 0);
                IntRegIndex zm = (IntRegIndex)(uint8_t) bits(machInst, 9, 5);
                return decodeSveBinDestrPredU<SveSplice>(size, machInst,
                        zdn, zm, pg);
            }
            break;
        }
        switch (bits(machInst, 20, 17)) {
          case 0x0:
            if (b13) {
                uint8_t AB = bits(machInst, 16);
                uint8_t size = bits(machInst, 23, 22);
                IntRegIndex pg = (IntRegIndex)(uint8_t) bits(machInst, 12, 10);
                IntRegIndex zn = (IntRegIndex)(uint8_t) bits(machInst, 9, 5);
                IntRegIndex rd = (IntRegIndex)(uint8_t) bits(machInst, 4, 0);
                if (!AB) {
                    return decodeSveUnaryPredU<SveLasta>(size,
                            machInst, rd, zn, pg);
                } else {
                    return decodeSveUnaryPredU<SveLastb>(size,
                            machInst, rd, zn, pg);
                }
            }
            break;
          case 0x1:
            if (!b13) {
                uint8_t AB = bits(machInst, 16);
                uint8_t size = bits(machInst, 23, 22);
                IntRegIndex pg = (IntRegIndex)(uint8_t) bits(machInst, 12, 10);
                IntRegIndex zn = (IntRegIndex)(uint8_t) bits(machInst, 9, 5);
                IntRegIndex vd = (IntRegIndex)(uint8_t) bits(machInst, 4, 0);
                if (!AB) {
                    return decodeSveUnaryPredU<SveLastaf>(size,
                            machInst, vd, zn, pg);
                } else {
                    return decodeSveUnaryPredU<SveLastbf>(size,
                            machInst, vd, zn, pg);
                }
            }
            break;
          case 0x4:
            if (!b13) {
                uint8_t AB = bits(machInst, 16);
                uint8_t size = bits(machInst, 23, 22);
                IntRegIndex pg = (IntRegIndex)(uint8_t) bits(machInst, 12, 10);
                IntRegIndex zm = (IntRegIndex)(uint8_t) bits(machInst, 9, 5);
                IntRegIndex zdn = (IntRegIndex)(uint8_t) bits(machInst, 4, 0);
                if (!AB) {
                    return decodeSveUnaryPredU<SveClastav>(size,
                            machInst, zdn, zm, pg);
                } else {
                    return decodeSveUnaryPredU<SveClastbv>(size,
                            machInst, zdn, zm, pg);
                }
            }
            break;
          case 0x5:
            if (!b13) {
                uint8_t AB = bits(machInst, 16);
                uint8_t size = bits(machInst, 23, 22);
                IntRegIndex pg = (IntRegIndex)(uint8_t) bits(machInst, 12, 10);
                IntRegIndex zm = (IntRegIndex)(uint8_t) bits(machInst, 9, 5);
                IntRegIndex zdn = (IntRegIndex)(uint8_t) bits(machInst, 4, 0);
                if (!AB) {
                    return decodeSveUnaryPredU<SveClastaf>(size,
                            machInst, zdn, zm, pg);
                } else {
                    return decodeSveUnaryPredU<SveClastbf>(size,
                            machInst, zdn, zm, pg);
                }
            }
            break;
          case 0x8:
            if (b13) {
                uint8_t AB = bits(machInst, 16);
                uint8_t size = bits(machInst, 23, 22);
                IntRegIndex pg = (IntRegIndex)(uint8_t) bits(machInst, 12, 10);
                IntRegIndex zm = (IntRegIndex)(uint8_t) bits(machInst, 9, 5);
                IntRegIndex rdn = (IntRegIndex)(uint8_t) bits(machInst, 4, 0);
                if (!AB) {
                    return decodeSveUnaryPredU<SveClasta>(size,
                            machInst, rdn, zm, pg);
                } else {
                    return decodeSveUnaryPredU<SveClastb>(size,
                            machInst, rdn, zm, pg);
                }
            }
            break;
        }
        if (bits(machInst, 20, 18) == 0x1 && !b13) {
            unsigned size = (unsigned) bits(machInst, 23, 22);
            IntRegIndex pg = (IntRegIndex)(uint8_t) bits(machInst, 12, 10);
            IntRegIndex zn = (IntRegIndex)(uint8_t) bits(machInst, 9, 5);
            IntRegIndex zd = (IntRegIndex)(uint8_t) bits(machInst, 4, 0);
            uint8_t opc17_16 = bits(machInst, 17, 16);
            switch (opc17_16) {
                case 0x00:
                    switch (size) {
                        case 1:
                            return new SveRevb<uint16_t>(machInst, zd, zn, pg);
                        case 2:
                            return new SveRevb<uint32_t>(machInst, zd, zn, pg);
                        case 3:
                            return new SveRevb<uint64_t>(machInst, zd, zn, pg);
                    }
                    break;
                case 0x01:
                    switch (size) {
                        case 2:
                            return new SveRevh<uint32_t>(machInst, zd, zn, pg);
                        case 3:
                            return new SveRevh<uint64_t>(machInst, zd, zn, pg);
                    }
                    break;
                case 0x02:
                    if (size == 3) {
                        return new SveRevw<uint64_t>(machInst, zd, zn, pg);
                    }
                    break;
                case 0x03:
                    return decodeSveUnaryPredU<SveRbit>(
                            size, machInst, zd, zn, pg);
            }
        }
        return new Unknown64(machInst);
    }  // decodeSvePermPred

    StaticInstPtr
    decodeSveSelVec(ExtMachInst machInst)
    {
        IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 13, 10);
        IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 20, 16);

        uint8_t size = bits(machInst, 23, 22);

        return decodeSveBinConstrPredU<SveSel>(size,
            machInst, zd, zn, zm, pg, SvePredType::SELECT);
    }  // decodeSveSelVec

    StaticInstPtr
    decodeSveIntCmpVec(ExtMachInst machInst)
    {
        uint8_t size = bits(machInst, 23, 22);
        uint8_t b14 = bits(machInst, 14);
        uint8_t opc =
            bits(machInst, 15) << 2 |
            bits(machInst, 13) << 1 |
            bits(machInst, 4);
        IntRegIndex pd = (IntRegIndex) (uint8_t)bits(machInst, 3, 0);
        IntRegIndex pg = (IntRegIndex) (uint8_t)bits(machInst, 12, 10);
        IntRegIndex zn = (IntRegIndex) (uint8_t)bits(machInst, 9, 5);
        IntRegIndex zm = (IntRegIndex) (uint8_t)bits(machInst, 20, 16);
        if (b14 && size != 3) {
            // sve_int_cmp_1
            switch (opc) {
                case 0:
                    return decodeSveTerPredWS<SveCmpgew>(size,
                            machInst, pd, zn, zm, pg);
                case 1:
                    return decodeSveTerPredWS<SveCmpgtw>(size,
                            machInst, pd, zn, zm, pg);
                case 2:
                    return decodeSveTerPredWS<SveCmpltw>(size,
                            machInst, pd, zn, zm, pg);
                case 3:
                    return decodeSveTerPredWS<SveCmplew>(size,
                            machInst, pd, zn, zm, pg);
                case 4:
                    return decodeSveTerPredWU<SveCmphsw>(size,
                            machInst, pd, zn, zm, pg);
                case 5:
                    return decodeSveTerPredWU<SveCmphiw>(size,
                            machInst, pd, zn, zm, pg);
                case 6:
                    return decodeSveTerPredWU<SveCmplow>(size,
                            machInst, pd, zn, zm, pg);
                case 7:
                    return decodeSveTerPredWU<SveCmplsw>(size,
                            machInst, pd, zn, zm, pg);
            }
        } else if (!b14) {
            switch (opc) {
                case 0:
                    return decodeSveTerPredU<SveCmphs>(size,
                            machInst, pd, zn, zm, pg);
                case 1:
                    return decodeSveTerPredU<SveCmphi>(size,
                            machInst, pd, zn, zm, pg);
                case 2:
                    if (size != 3) {
                        return decodeSveTerPredWU<SveCmpeqw>(size,
                                machInst, pd, zn, zm, pg);
                    }
                    break;
                case 3:
                    if (size != 3) {
                        return decodeSveTerPredWU<SveCmpnew>(size,
                                machInst, pd, zn, zm, pg);
                    }
                    break;
                case 4:
                    return decodeSveTerPredS<SveCmpge>(size,
                            machInst, pd, zn, zm, pg);
                case 5:
                    return decodeSveTerPredS<SveCmpgt>(size,
                            machInst, pd, zn, zm, pg);
                case 6:
                    return decodeSveTerPredU<SveCmpeq>(size,
                            machInst, pd, zn, zm, pg);
                case 7:
                    return decodeSveTerPredU<SveCmpne>(size,
                            machInst, pd, zn, zm, pg);
            }
        }
        return new Unknown64(machInst);
    }  // decodeSveIntCmpVec

    StaticInstPtr
    decodeSveIntCmpUImm(ExtMachInst machInst)
    {
        uint8_t cmp = bits(machInst, 13) << 1 | bits(machInst, 4);
        IntRegIndex pd = (IntRegIndex) (uint8_t) bits(machInst, 3, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 12, 10);
        int64_t imm = (int64_t) bits(machInst, 20, 14);
        uint8_t size = bits(machInst, 23, 22);
        switch (cmp) {
            case 0:
                return decodeSveTerImmPredU<SveCmphsi>(size,
                        machInst, pd, zn, imm, pg);
            case 1:
                return decodeSveTerImmPredU<SveCmphii>(size,
                        machInst, pd, zn, imm, pg);
            case 2:
                return decodeSveTerImmPredU<SveCmploi>(size,
                        machInst, pd, zn, imm, pg);
            case 3:
                return decodeSveTerImmPredU<SveCmplsi>(size,
                        machInst, pd, zn, imm, pg);
        }
        return new Unknown64(machInst);
    }  // decodeSveIntCmpUImm

    StaticInstPtr
    decodeSveIntCmpSImm(ExtMachInst machInst)
    {
        uint8_t opc = bits(machInst, 15) << 2 | bits(machInst, 13) << 1 |
            bits(machInst, 4);
        IntRegIndex pd = (IntRegIndex) (uint8_t) bits(machInst, 3, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 12, 10);
        int64_t imm = sext<5>(bits(machInst, 20, 16));
        uint8_t size = bits(machInst, 23, 22);
        switch (opc) {
            case 0:
                return decodeSveTerImmPredS<SveCmpgei>(size,
                        machInst, pd, zn, imm, pg);
            case 1:
                return decodeSveTerImmPredS<SveCmpgti>(size,
                        machInst, pd, zn, imm, pg);
            case 2:
                return decodeSveTerImmPredS<SveCmplti>(size,
                        machInst, pd, zn, imm, pg);
            case 3:
                return decodeSveTerImmPredS<SveCmplei>(size,
                        machInst, pd, zn, imm, pg);
            case 4:
                return decodeSveTerImmPredU<SveCmpeqi>(size,
                        machInst, pd, zn, imm, pg);
            case 5:
                return decodeSveTerImmPredU<SveCmpnei>(size,
                        machInst, pd, zn, imm, pg);
            default:
                return new Unknown64(machInst);
        }
        return new Unknown64(machInst);
    }  // decodeSveIntCmpSImm

    StaticInstPtr
    decodeSvePredLogicalOps(ExtMachInst machInst)
    {
        IntRegIndex pd = (IntRegIndex) (uint8_t) bits(machInst, 3, 0);
        IntRegIndex pn = (IntRegIndex) (uint8_t) bits(machInst, 8, 5);
        IntRegIndex pm = (IntRegIndex) (uint8_t) bits(machInst, 19, 16);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 13, 10);
        uint8_t opc = (bits(machInst, 23, 22) << 2) |
                      (bits(machInst, 9) << 1) |
                      bits(machInst, 4);
        switch (opc) {
          case 0x0:
            return new SvePredAnd<uint8_t>(machInst, pd, pn, pm, pg);
          case 0x1:
            return new SvePredBic<uint8_t>(machInst, pd, pn, pm, pg);
          case 0x2:
            return new SvePredEor<uint8_t>(machInst, pd, pn, pm, pg);
          case 0x3:
            return new SvePredSel<uint8_t>(machInst, pd, pn, pm, pg, true);
          case 0x4:
            return new SvePredAnds<uint8_t>(machInst, pd, pn, pm, pg);
          case 0x5:
            return new SvePredBics<uint8_t>(machInst, pd, pn, pm, pg);
          case 0x6:
            return new SvePredEors<uint8_t>(machInst, pd, pn, pm, pg);
          case 0x8:
            return new SvePredOrr<uint8_t>(machInst, pd, pn, pm, pg);
          case 0x9:
            return new SvePredOrn<uint8_t>(machInst, pd, pn, pm, pg);
          case 0xa:
            return new SvePredNor<uint8_t>(machInst, pd, pn, pm, pg);
          case 0xb:
            return new SvePredNand<uint8_t>(machInst, pd, pn, pm, pg);
          case 0xc:
            return new SvePredOrrs<uint8_t>(machInst, pd, pn, pm, pg);
          case 0xd:
            return new SvePredOrns<uint8_t>(machInst, pd, pn, pm, pg);
          case 0xe:
            return new SvePredNors<uint8_t>(machInst, pd, pn, pm, pg);
          case 0xf:
            return new SvePredNands<uint8_t>(machInst, pd, pn, pm, pg);
        }

        return new Unknown64(machInst);
    }  // decodeSvePredLogicalOps

    StaticInstPtr
    decodeSvePropBreakFromPrevPartition(ExtMachInst machInst)
    {
        if (bits(machInst, 23) == 0x0 && bits(machInst, 9) == 0x0) {
            uint8_t opc = (bits(machInst, 22) << 1) | bits(machInst, 4);
            IntRegIndex pm = (IntRegIndex)(uint8_t) bits(machInst, 19, 16);
            IntRegIndex pg = (IntRegIndex)(uint8_t) bits(machInst, 13, 10);
            IntRegIndex pn = (IntRegIndex)(uint8_t) bits(machInst, 8, 5);
            IntRegIndex pd = (IntRegIndex)(uint8_t) bits(machInst, 3, 0);
            switch (opc) {
              case 0x0:
                // BRKPA
                return new SveBrkpa(machInst, pd, pn, pm, pg);
              case 0x1:
                // BRKPB
                return new SveBrkpb(machInst, pd, pn, pm, pg);
              case 0x2:
                // BRKPAS
                return new SveBrkpas(machInst, pd, pn, pm, pg);
              case 0x3:
                // BRKPBS
                return new SveBrkpbs(machInst, pd, pn, pm, pg);
            }
        }
        return new Unknown64(machInst);
    }  // decodeSvePropBreakFromPrevPartition

    StaticInstPtr
    decodeSvePartitionBreakCond(ExtMachInst machInst)
    {
        if (bits(machInst, 18, 16) == 0x0 && bits(machInst, 9) == 0x0) {
            bool flagset = bits(machInst, 22);
            bool merging = bits(machInst, 4);
            IntRegIndex pg = (IntRegIndex)(uint8_t) bits(machInst, 13, 10);
            IntRegIndex pn = (IntRegIndex)(uint8_t) bits(machInst, 8, 5);
            IntRegIndex pd = (IntRegIndex)(uint8_t) bits(machInst, 3, 0);
            if (bits(machInst, 23)) {
                if (flagset) {
                    if (!merging) {
                        return new SveBrkbs(machInst, pd, pg, pn);
                    }
                } else {
                    if (merging) {
                        return new SveBrkbm(machInst, pd, pg, pn);
                    } else {
                        return new SveBrkbz(machInst, pd, pg, pn);
                    }
                }
            } else {
                if (flagset) {
                    if (!merging) {
                        return new SveBrkas(machInst, pd, pg, pn);
                    }
                } else {
                    if (merging) {
                        return new SveBrkam(machInst, pd, pg, pn);
                    } else {
                        return new SveBrkaz(machInst, pd, pg, pn);
                    }
                }
            }
            return new Unknown64(machInst);
        }
        return new Unknown64(machInst);
    }  // decodeSvePartitionBreakCond

    StaticInstPtr
    decodeSvePredTest(ExtMachInst machInst)
    {
        if (bits(machInst, 23, 22) == 0x1 &&
                bits(machInst, 18, 16) == 0x0 &&
                bits(machInst, 9) == 0x0) {
            IntRegIndex pn = (IntRegIndex) (uint8_t) bits(machInst, 8, 5);
            IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 13, 10);
            return new SvePtest(machInst, pn, pg);
        }
        return new Unknown64(machInst);
    }  // decodeSvePredTest

    StaticInstPtr
    decodeSvePredIteration(ExtMachInst machInst)
    {
        uint8_t size = bits(machInst, 23, 22);
        uint8_t opc18_16 = bits(machInst, 18, 16);
        uint8_t opc10_9 = bits(machInst, 10, 9);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 8, 5);
        IntRegIndex pdn = (IntRegIndex) (uint8_t) bits(machInst, 3, 0);
        if (opc18_16 == 0x1 && opc10_9 == 0x2) {
            return decodeSveUnaryPredU<SvePnext>(size,
                    machInst, pdn, pdn, pg);
        } else if (size == 0x1 && opc18_16 == 0x0 && opc10_9 == 0) {
            return new SvePfirst<uint8_t>(machInst, pdn, pdn, pg);
        }
        return new Unknown64(machInst);
    }  // decodeSvePredIteration

    StaticInstPtr
    decodeSveInitPred(ExtMachInst machInst)
    {
        IntRegIndex pd = (IntRegIndex) (uint8_t) bits(machInst, 3, 0);
        unsigned size = bits(machInst, 23, 22);
        uint8_t imm = bits(machInst, 9, 5);

        if (bits(machInst, 16) == 0x0) {
            return decodeSvePtrue<SvePtrue>(size, machInst, pd, imm);
        } else {
            return decodeSvePtrue<SvePtrues>(size, machInst, pd, imm);
        }
        return new Unknown64(machInst);
    }  // decodeSveInitPred

    StaticInstPtr
    decodeSveZeroPredReg(ExtMachInst machInst)
    {
        if (bits(machInst, 23, 22) == 0x0 && bits(machInst, 18, 16) == 0x0) {
            IntRegIndex pd = (IntRegIndex) (uint8_t) bits(machInst, 3, 0);
            return new SvePfalse(machInst, pd);
        }
        return new Unknown64(machInst);
    }  // decodeSveZeroPredReg

    StaticInstPtr
    decodeSvePropBreakToNextPartition(ExtMachInst machInst)
    {
        if (bits(machInst, 23) == 0x0 &&
                bits(machInst, 18, 16) == 0x0 &&
                bits(machInst, 9) == 0x0 &&
                bits(machInst, 4) == 0x0) {
            IntRegIndex pg = (IntRegIndex)(uint8_t) bits(machInst, 13, 10);
            IntRegIndex pn = (IntRegIndex)(uint8_t) bits(machInst, 8, 5);
            IntRegIndex pdm = (IntRegIndex)(uint8_t) bits(machInst, 3, 0);
            if (bits(machInst, 22) == 0x0) {
                return new SveBrkn(machInst, pdm, pn, pdm, pg);
            } else {
                return new SveBrkns(machInst, pdm, pn, pdm, pg);
            }
            return new Unknown64(machInst);
        }
        return new Unknown64(machInst);
    }  // decodeSvePropBreakToNextPartition

    StaticInstPtr
    decodeSveReadPredFromFFRPred(ExtMachInst machInst)
    {
        if (bits(machInst, 23)) {
            return new Unknown64(machInst);
        }
        IntRegIndex pd = (IntRegIndex)(uint8_t) bits(machInst, 3, 0);
        IntRegIndex pg = (IntRegIndex)(uint8_t) bits(machInst, 8, 5);
        if (bits(machInst, 22)) {
            return new SveRdffrsPred(machInst, pd, pg);
        } else {
            return new SveRdffrPred(machInst, pd, pg);
        }
    }  // decodeSveReadPredFromFFRPred

    StaticInstPtr
    decodeSveReadPredFromFFRUnpred(ExtMachInst machInst)
    {
        if (bits(machInst, 23, 22) != 0) {
            return new Unknown64(machInst);
        }
        IntRegIndex pd = (IntRegIndex)(uint8_t) bits(machInst, 3, 0);
        return new SveRdffrUnpred(machInst, pd);
    }  // decodeSveReadPredFromFFRUnpred

    StaticInstPtr
    decodeSvePredGen(ExtMachInst machInst)
    {
        uint8_t b_20_15 = (bits(machInst, 20) << 1) | bits(machInst, 15);
        switch (b_20_15) {
          case 0x0:
            return decodeSvePredLogicalOps(machInst);
          case 0x1:
            return decodeSvePropBreakFromPrevPartition(machInst);
          case 0x2:
            if (bits(machInst, 19) == 0x0) {
                return decodeSvePartitionBreakCond(machInst);
            } else {
                return decodeSvePropBreakToNextPartition(machInst);
            }
          case 0x3:
            if (bits(machInst, 19) == 0x0) {
                if (bits(machInst, 4, 0) == 0x0) {
                    return decodeSvePredTest(machInst);
                } else {
                    break;
                }
            } else {
                switch (bits(machInst, 13, 12)) {
                  case 0x0:
                    if (bits(machInst, 11) == 0x0 &&
                            bits(machInst, 4) == 0x0) {
                        return decodeSvePredIteration(machInst);
                    } else {
                        break;
                    }
                  case 0x1:
                    break;
                  case 0x2:
                    if (bits(machInst, 11, 10) == 0x0 &&
                            bits(machInst, 4) == 0x0) {
                        return decodeSveInitPred(machInst);
                    } else if (bits(machInst, 11, 4) == 0x40) {
                        return decodeSveZeroPredReg(machInst);
                    }
                    break;
                  case 0x3:
                    if (bits(machInst, 11) == 0x0) {
                        if (bits(machInst, 16) == 0x0) {
                            return decodeSveReadPredFromFFRPred(machInst);
                        } else if (bits(machInst, 8, 4) == 0x0) {
                            return decodeSveReadPredFromFFRUnpred(machInst);
                        }
                    }
                    break;
                }
            }
            break;
        }
        return new Unknown64(machInst);
    }  // decodeSvePredGen

    StaticInstPtr
    decodeSvePredCount(ExtMachInst machInst)
    {
        uint8_t b19 = bits(machInst, 19);
        if (b19) {
            uint8_t b13_11 = bits(machInst, 13, 11);
            switch (b13_11) {
              case 0x0:
                {
                    if (bits(machInst, 10, 9) != 0x0) {
                        return new Unknown64(machInst);
                    }
                    IntRegIndex zdn = (IntRegIndex) (uint8_t)
                        bits(machInst, 4, 0);
                    IntRegIndex pg = (IntRegIndex) (uint8_t)
                        bits(machInst, 8, 5);
                    uint8_t esize = bits(machInst, 23, 22);
                    if (esize == 0x0) {
                        return new Unknown64(machInst);
                    }
                    uint8_t opc = bits(machInst, 18, 17);
                    if (opc == 0x0) {
                        uint8_t u = bits(machInst, 16);
                        if (u) {
                            return decodeSvePredCountVU<SveUqincpv>(esize,
                                    machInst, zdn, pg);
                        } else {
                            return decodeSvePredCountVS<SveSqincpv>(esize,
                                    machInst, zdn, pg);
                        }
                    } else if (opc == 0x1) {
                        uint8_t u = bits(machInst, 16);
                        if (u) {
                            return decodeSvePredCountVU<SveUqdecpv>(esize,
                                    machInst, zdn, pg);
                        } else {
                            return decodeSvePredCountVS<SveSqdecpv>(esize,
                                    machInst, zdn, pg);
                        }
                    } else if (opc == 0x2) {
                        uint8_t d = bits(machInst, 16);
                        if (d) {
                            return decodeSvePredCountVU<SveDecpv>(esize,
                                    machInst, zdn, pg);
                        } else {
                            return decodeSvePredCountVU<SveIncpv>(esize,
                                    machInst, zdn, pg);
                        }
                    }
                }
                break;
              case 0x1:
                {
                    IntRegIndex rdn = (IntRegIndex) (uint8_t)
                        bits(machInst, 4, 0);
                    IntRegIndex pg = (IntRegIndex) (uint8_t)
                        bits(machInst, 8, 5);
                    uint8_t esize = bits(machInst, 23, 22);
                    uint8_t opc = bits(machInst, 18, 17);
                    uint8_t opc2 = bits(machInst, 10, 9);
                    if (opc == 0x0) {
                        uint8_t u = bits(machInst, 16);
                        if (opc2 == 0x0) {
                            if (u) {
                                return decodeSvePredCountU<SveUqincp32>(esize,
                                        machInst, rdn, pg);
                            } else {
                                return decodeSvePredCountS<SveSqincp32>(esize,
                                        machInst, rdn, pg);
                            }
                        } else if (opc2 == 0x2) {
                            if (u) {
                                return decodeSvePredCountU<SveUqincp64>(esize,
                                        machInst, rdn, pg);
                            } else {
                                return decodeSvePredCountS<SveSqincp64>(esize,
                                        machInst, rdn, pg);
                            }
                        }
                    } else if (opc == 0x1) {
                        uint8_t u = bits(machInst, 16);
                        if (opc2 == 0x0) {
                            if (u) {
                                return decodeSvePredCountU<SveUqdecp32>(esize,
                                        machInst, rdn, pg);
                            } else {
                                return decodeSvePredCountS<SveSqdecp32>(esize,
                                        machInst, rdn, pg);
                            }
                        } else if (opc2 == 0x2) {
                            if (u) {
                                return decodeSvePredCountU<SveUqdecp64>(esize,
                                        machInst, rdn, pg);
                            } else {
                                return decodeSvePredCountS<SveSqdecp64>(esize,
                                        machInst, rdn, pg);
                            }
                        }
                    } else if (opc == 0x2) {
                        if (opc2 == 0x0) {
                            if (bits(machInst, 16)) {
                                return decodeSvePredCountU<SveDecp>(esize,
                                        machInst, rdn, pg);
                            } else {
                                return decodeSvePredCountU<SveIncp>(esize,
                                        machInst, rdn, pg);
                            }
                        }
                    }
                }
                break;
              case 0x2:
                if (bits(machInst, 23, 22) == 0x0 &&
                        bits(machInst, 10, 9) == 0x0 &&
                        bits(machInst, 4, 0) == 0x0) {
                    uint8_t opc = bits(machInst, 18, 16);
                    if (opc == 0x0) {
                        IntRegIndex pn = (IntRegIndex)(uint8_t)
                            bits(machInst, 8, 5);
                        return new SveWrffr(machInst, pn);
                    } else if (opc == 0x4 && bits(machInst, 8, 5) == 0x0) {
                        return new SveSetffr(machInst);
                    }
                }
                break;
            }
        } else {
            uint8_t opc = bits(machInst, 18, 16);
            if (opc == 0 && bits(machInst, 9) == 0) {
                IntRegIndex rd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
                IntRegIndex pn = (IntRegIndex) (uint8_t) bits(machInst, 8, 5);
                IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 13,
                        10);
                uint8_t esize = bits(machInst, 23, 22);
                return decodeSveUnaryPredU<SveCntp>(esize,
                        machInst, rd, pn, pg);
            }
        }
        return new Unknown64(machInst);
    }  // decodeSvePredCount

    StaticInstPtr
    decodeSveIntCmpSca(ExtMachInst machInst)
    {
        uint16_t b23_13_12_11_10_3_2_1_0 = (uint16_t)
            (bits(machInst, 23) << 8) | (bits(machInst, 13, 10) << 4) |
            bits(machInst, 3, 0);
        uint8_t b10 = (uint8_t) bits(machInst, 10);
        IntRegIndex rn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex rm = (IntRegIndex) (uint8_t) bits(machInst, 20, 16);
        if (b23_13_12_11_10_3_2_1_0 == 0x180) {
            uint8_t s64b = bits(machInst, 22);
            uint8_t ne = bits(machInst, 4);
            if (ne) {
                if (s64b) {
                    return new SveCtermne<uint64_t>(machInst, rn, rm);
                } else {
                    return new SveCtermne<uint32_t>(machInst, rn, rm);
                }
            } else {
                if (s64b) {
                    return new SveCtermeq<uint64_t>(machInst, rn, rm);
                } else {
                    return new SveCtermeq<uint32_t>(machInst, rn, rm);
                }
            }
        } else if (b10) {
            IntRegIndex pd = (IntRegIndex) (uint8_t) bits(machInst, 3, 0);
            uint8_t size = (uint8_t) bits(machInst, 23, 22);
            uint8_t s64b = (uint8_t) bits(machInst, 12);
            uint8_t opc = (uint8_t) bits(machInst, 11) << 1 |
                bits(machInst, 4);
            if (s64b) {
                switch (opc) {
                    case 0:
                        return decodeSveBinUnpredS<SveWhilelt64>(size,
                                machInst, pd, rn, rm);
                    case 1:
                        return decodeSveBinUnpredS<SveWhilele64>(size,
                                machInst, pd, rn, rm);
                    case 2:
                        return decodeSveBinUnpredU<SveWhilelo64>(size,
                                machInst, pd, rn, rm);
                    case 3:
                        return decodeSveBinUnpredU<SveWhilels64>(size,
                                machInst, pd, rn, rm);
                }
            } else {
                switch (opc) {
                    case 0:
                        return decodeSveBinUnpredS<SveWhilelt32>(size,
                                machInst, pd, rn, rm);
                    case 1:
                        return decodeSveBinUnpredS<SveWhilele32>(size,
                                machInst, pd, rn, rm);
                    case 2:
                        return decodeSveBinUnpredU<SveWhilelo32>(size,
                                machInst, pd, rn, rm);
                    case 3:
                        return decodeSveBinUnpredU<SveWhilels32>(size,
                                machInst, pd, rn, rm);
                }
            }
        }
        return new Unknown64(machInst);
    }  // decodeSveIntCmpSca

    StaticInstPtr
    decodeSveIntWideImmUnpred0(ExtMachInst machInst)
    {
        IntRegIndex zdn = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        uint64_t imm = bits(machInst, 12, 5);
        uint8_t sh = bits(machInst, 13);
        uint8_t size = bits(machInst, 23, 22);

        if (sh) {
            if (size == 0x0) {
                return new Unknown64(machInst);
            }
            imm <<= 8;
        }

        switch (bits(machInst, 18, 16)) {
          case 0x0:
            return decodeSveWideImmUnpredU<SveAddImm>(
                size, machInst, zdn, imm);
          case 0x1:
            return decodeSveWideImmUnpredU<SveSubImm>(
                size, machInst, zdn, imm);
          case 0x3:
            return decodeSveWideImmUnpredU<SveSubrImm>(
                size, machInst, zdn, imm);
          case 0x4:
            return decodeSveWideImmUnpredS<SveSqaddImm>(
                size, machInst, zdn, imm);
          case 0x5:
            return decodeSveWideImmUnpredU<SveUqaddImm>(
                size, machInst, zdn, imm);
          case 0x6:
            return decodeSveWideImmUnpredS<SveSqsubImm>(
                size, machInst, zdn, imm);
          case 0x7:
            return decodeSveWideImmUnpredU<SveUqsubImm>(
                size, machInst, zdn, imm);
        }

        return new Unknown64(machInst);
    }  // decodeSveIntWideImmUnpred0

    StaticInstPtr
    decodeSveIntWideImmUnpred1(ExtMachInst machInst)
    {
        IntRegIndex zdn = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        uint64_t imm = bits(machInst, 12, 5);
        uint8_t size = bits(machInst, 23, 22);

        switch (bits(machInst, 18, 16)) {
          case 0x0:
            return decodeSveWideImmUnpredS<SveSmaxImm>(
                size, machInst, zdn, sext<8>(imm));
          case 0x1:
            return decodeSveWideImmUnpredU<SveUmaxImm>(
                size, machInst, zdn, imm);
          case 0x2:
            return decodeSveWideImmUnpredS<SveSminImm>(
                size, machInst, zdn, sext<8>(imm));
          case 0x3:
            return decodeSveWideImmUnpredU<SveUminImm>(
                size, machInst, zdn, imm);
        }

        return new Unknown64(machInst);
    }  // decodeSveIntWideImmUnpred1

    StaticInstPtr
    decodeSveIntWideImmUnpred2(ExtMachInst machInst)
    {
        IntRegIndex zdn = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        uint64_t imm = bits(machInst, 12, 5);
        uint8_t size = bits(machInst, 23, 22);

        if (bits(machInst, 18, 16) == 0x0) {
            return decodeSveWideImmUnpredU<SveMulImm>(
                size, machInst, zdn, sext<8>(imm));
        }

        return new Unknown64(machInst);
    }  // decodeSveIntWideImmUnpred2

    StaticInstPtr
    decodeSveIntWideImmUnpred3(ExtMachInst machInst)
    {
        IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        uint64_t imm = bits(machInst, 12, 5);
        uint8_t sh = bits(machInst, 13);
        uint8_t size = bits(machInst, 23, 22);

        if (sh) {
            if (size == 0x0) {
                return new Unknown64(machInst);
            }
            imm <<= 8;
        }

        if (bits(machInst, 18, 17) == 0x0) {
            if (sh) {
                return decodeSveWideImmUnpredU<SveDupImm>(
                    size, machInst, zd, sext<16>(imm));
            } else {
                return decodeSveWideImmUnpredU<SveDupImm>(
                    size, machInst, zd, sext<8>(imm));
            }
        }

        return new Unknown64(machInst);
    }  // decodeSveIntWideImmUnpred3

    StaticInstPtr
    decodeSveIntWideImmUnpred4(ExtMachInst machInst)
    {
        IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        uint8_t size = bits(machInst, 23, 22);

        if (bits(machInst, 18, 17) == 0x0 && size != 0x0) {
            uint64_t imm = vfp_modified_imm(bits(machInst, 12, 5),
                decode_fp_data_type(size));
            return decodeSveWideImmUnpredF<SveFdup>(size, machInst, zd, imm);
        }

        return new Unknown64(machInst);
    }  // decodeSveIntWideImmUnpred4

    StaticInstPtr
    decodeSveIntWideImmUnpred(ExtMachInst machInst)
    {
        switch (bits(machInst, 20, 19)) {
          case 0x0:
            if (bits(machInst, 18, 16) != 0x2) {
                return decodeSveIntWideImmUnpred0(machInst);
            }
            break;
          case 0x1:
            if (bits(machInst, 13) == 0x0) {
                return decodeSveIntWideImmUnpred1(machInst);
            }
            break;
          case 0x2:
            if (bits(machInst, 13) == 0x0) {
                return decodeSveIntWideImmUnpred2(machInst);
            }
            break;
          case 0x3:
            if (bits(machInst, 16) == 0x0) {
                return decodeSveIntWideImmUnpred3(machInst);
            } else if (bits(machInst, 13) == 0x0) {
                return decodeSveIntWideImmUnpred4(machInst);
            }
            break;
        }
        return new Unknown64(machInst);
    }  // decodeSveIntWideImmUnpred

    StaticInstPtr
    decodeSveMultiplyAddUnpred(ExtMachInst machInst)
    {
        IntRegIndex zda = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 20, 16);

        uint8_t size = (uint8_t) bits(machInst, 23, 22);

        if (bits(machInst, 12, 11) != 0 || !(size & 0x2)) {
            return new Unknown64(machInst);
        }

        uint8_t usig = (uint8_t) bits(machInst, 10);
        if (size & 0x1) {
            if (usig) {
                return new SveUdotv<uint16_t, uint64_t>(machInst,
                                                        zda, zn, zm);
            } else {
                return new SveSdotv<int16_t, int64_t>(machInst,
                                                        zda, zn, zm);
            }
        } else {
            if (usig) {
                return new SveUdotv<uint8_t, uint32_t>(machInst,
                                                        zda, zn, zm);
            } else {
                return new SveSdotv<int8_t, int32_t>(machInst,
                                                        zda, zn, zm);
            }
        }

        return new Unknown64(machInst);
    } // decodeSveMultiplyAddUnpred

    StaticInstPtr
    decodeSveMultiplyIndexed(ExtMachInst machInst)
    {
        IntRegIndex zda = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);

        uint8_t size = (uint8_t) bits(machInst, 23, 22);

        if (bits(machInst, 12, 11) != 0 || !(size & 0x2)) {
            return new Unknown64(machInst);
        }

        uint8_t usig = (uint8_t) bits(machInst, 10);
        if (size & 0x1) {
            IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 19, 16);
            uint8_t i1 = (uint8_t) bits(machInst, 20);
            if (usig) {
                return new SveUdoti<uint16_t, uint64_t>(machInst,
                                                        zda, zn, zm, i1);
            } else {
                return new SveSdoti<int16_t, int64_t>(machInst,
                                                        zda, zn, zm, i1);
            }
        } else {
            IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 18, 16);
            uint8_t i2 = (uint8_t) bits(machInst, 20, 19);
            if (usig) {
                return new SveUdoti<uint8_t, uint32_t>(machInst,
                                                        zda, zn, zm, i2);
            } else {
                return new SveSdoti<int8_t, int32_t>(machInst,
                                                        zda, zn, zm, i2);
            }
        }
        return new Unknown64(machInst);
    } // decodeSveMultiplyIndexed

    StaticInstPtr
    decodeSveFpFastReduc(ExtMachInst machInst)
    {
        IntRegIndex vd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 12, 10);

        uint8_t size = bits(machInst, 23, 22);

        if (size == 0x0) {
            return new Unknown64(machInst);
        }

        switch (bits(machInst, 18, 16)) {
          case 0x0:
            return decodeSveUnaryPredF<SveFaddv>(size, machInst, vd, zn, pg);
          case 0x4:
            return decodeSveUnaryPredF<SveFmaxnmv>(size, machInst, vd, zn, pg);
          case 0x5:
            return decodeSveUnaryPredF<SveFminnmv>(size, machInst, vd, zn, pg);
          case 0x6:
            return decodeSveUnaryPredF<SveFmaxv>(size, machInst, vd, zn, pg);
          case 0x7:
            return decodeSveUnaryPredF<SveFminv>(size, machInst, vd, zn, pg);
        }

        return new Unknown64(machInst);
    }  // decodeSveFpFastReduc

    StaticInstPtr
    decodeSveFpUnaryUnpred(ExtMachInst machInst)
    {
        IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);

        uint8_t size = (uint8_t) bits(machInst, 23, 22);
        if (size == 0) {
            return new Unknown64(machInst);
        }
        uint8_t opc = (uint8_t) bits(machInst, 18, 16);

        switch (opc) {
          case 0x6:
            return decodeSveUnaryUnpredF<SveFrecpe>(
                    size, machInst, zd, zn);
          case 0x7:
            return decodeSveUnaryUnpredF<SveFrsqrte>(
                    size, machInst, zd, zn);
        }
        return new Unknown64(machInst);
    }  // decodeSveFpUnaryUnpred

    StaticInstPtr
    decodeSveFpCmpZero(ExtMachInst machInst)
    {
        IntRegIndex pd = (IntRegIndex) (uint8_t) bits(machInst, 3, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 12, 10);

        uint8_t size = bits(machInst, 23, 22);
        if (size == 0) {
            return new Unknown64(machInst);
        }
        uint8_t opc = (bits(machInst, 17, 16) << 1) | bits(machInst, 4);

        switch (opc) {
          case 0x0:
            return decodeSveCmpImmF<SveFcmgeZero>(
                size, machInst, pd, zn, 0x0, pg);
          case 0x1:
            return decodeSveCmpImmF<SveFcmgtZero>(
                size, machInst, pd, zn, 0x0, pg);
          case 0x2:
            return decodeSveCmpImmF<SveFcmltZero>(
                size, machInst, pd, zn, 0x0, pg);
          case 0x3:
            return decodeSveCmpImmF<SveFcmleZero>(
                size, machInst, pd, zn, 0x0, pg);
          case 0x4:
            return decodeSveCmpImmF<SveFcmeqZero>(
                size, machInst, pd, zn, 0x0, pg);
          case 0x6:
            return decodeSveCmpImmF<SveFcmneZero>(
                size, machInst, pd, zn, 0x0, pg);
        }
        return new Unknown64(machInst);
    }  // decodeSveFpCmpZero

    StaticInstPtr
    decodeSveFpAccumReduc(ExtMachInst machInst)
    {
        uint8_t opc = bits(machInst, 18, 16);
        uint8_t size = bits(machInst, 23, 22);
        if (opc != 0 || size == 0) {
            return new Unknown64(machInst);
        }

        IntRegIndex vdn = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 12, 10);

        return decodeSveUnaryPredF<SveFadda>(size, machInst, vdn, zm, pg);
    }  // decodeSveFpAccumReduc

    StaticInstPtr
    decodeSveFpArithUnpred(ExtMachInst machInst)
    {
        IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 20, 16);

        uint8_t size = bits(machInst, 23, 22);
        if (size == 0) {
            return new Unknown64(machInst);
        }
        uint8_t opc = (uint8_t) bits(machInst, 12, 10);

        switch (opc) {
          case 0x0:
            return decodeSveBinUnpredF<SveFaddUnpred>(
                    size, machInst, zd, zn, zm);
          case 0x1:
            return decodeSveBinUnpredF<SveFsubUnpred>(
                    size, machInst, zd, zn, zm);
          case 0x2:
            return decodeSveBinUnpredF<SveFmulUnpred>(
                    size, machInst, zd, zn, zm);
          case 0x3:
            return decodeSveBinUnpredF<SveFtsmul>(
                    size, machInst, zd, zn, zm);
          case 0x6:
            return decodeSveBinUnpredF<SveFrecps>(
                    size, machInst, zd, zn, zm);
          case 0x7:
            return decodeSveBinUnpredF<SveFrsqrts>(
                    size, machInst, zd, zn, zm);
        }
        return new Unknown64(machInst);
    }  // decodeSveFpArithUnpred

    StaticInstPtr
    decodeSveFpArithPred0(ExtMachInst machInst)
    {
        IntRegIndex zdn = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 12, 10);

        uint8_t size = (uint8_t) bits(machInst, 23, 22);
        if (size == 0) {
            return new Unknown64(machInst);
        }
        uint8_t opc = (uint8_t) bits(machInst, 19, 16);

        switch (opc) {
          case 0x0:
            return decodeSveBinDestrPredF<SveFaddPred>(
                    size, machInst, zdn, zm, pg);
          case 0x1:
            return decodeSveBinDestrPredF<SveFsubPred>(
                    size, machInst, zdn, zm, pg);
          case 0x2:
            return decodeSveBinDestrPredF<SveFmulPred>(
                    size, machInst, zdn, zm, pg);
          case 0x3:
            return decodeSveBinDestrPredF<SveFsubr>(
                    size, machInst, zdn, zm, pg);
          case 0x4:
            return decodeSveBinDestrPredF<SveFmaxnm>(
                    size, machInst, zdn, zm, pg);
          case 0x5:
            return decodeSveBinDestrPredF<SveFminnm>(
                    size, machInst, zdn, zm, pg);
          case 0x6:
            return decodeSveBinDestrPredF<SveFmax>(
                    size, machInst, zdn, zm, pg);
          case 0x7:
            return decodeSveBinDestrPredF<SveFmin>(
                    size, machInst, zdn, zm, pg);
          case 0x8:
            return decodeSveBinDestrPredF<SveFabd>(
                    size, machInst, zdn, zm, pg);
          case 0x9:
            return decodeSveBinDestrPredF<SveFscale>(
                    size, machInst, zdn, zm, pg);
          case 0xa:
            return decodeSveBinDestrPredF<SveFmulx>(
                    size, machInst, zdn, zm, pg);
          case 0xc:
            return decodeSveBinDestrPredF<SveFdivr>(
                    size, machInst, zdn, zm, pg);
          case 0xd:
            return decodeSveBinDestrPredF<SveFdiv>(
                    size, machInst, zdn, zm, pg);
        }
        return new Unknown64(machInst);
    }  // decodeSveFpArithPred0

    StaticInstPtr
    decodeSveFpTrigMAddCoeff(ExtMachInst machInst)
    {
        IntRegIndex zdn = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        uint8_t imm = (uint8_t) bits(machInst, 18, 16);

        uint8_t size = (uint8_t) bits(machInst, 23, 22);
        if (size == 0) {
            return new Unknown64(machInst);
        }

        return decodeSveTerImmUnpredF<SveFtmad>(size, machInst, zdn, zm, imm);
    }  // decodeSveFpTrigMAddCoeff

    StaticInstPtr
    decodeSveFpArithImmPred(ExtMachInst machInst)
    {
        IntRegIndex zdn = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 12, 10);
        uint64_t imm;

        uint8_t size = (uint8_t) bits(machInst, 23, 22);
        if (size == 0) {
            return new Unknown64(machInst);
        }

        uint8_t opc = (uint8_t) bits(machInst, 18, 16);

        switch (opc) {
          case 0x0:
            imm = sveExpandFpImmAddSub((uint8_t) bits(machInst, 5), size);
            return decodeSveBinImmPredF<SveFaddImm>(
                    size, machInst, zdn, imm, pg);
          case 0x1:
            imm = sveExpandFpImmAddSub((uint8_t) bits(machInst, 5), size);
            return decodeSveBinImmPredF<SveFsubImm>(
                    size, machInst, zdn, imm, pg);
          case 0x2:
            imm = sveExpandFpImmMul((uint8_t) bits(machInst, 5), size);
            return decodeSveBinImmPredF<SveFmulImm>(
                    size, machInst, zdn, imm, pg);
          case 0x3:
            imm = sveExpandFpImmAddSub((uint8_t) bits(machInst, 5), size);
            return decodeSveBinImmPredF<SveFsubrImm>(
                    size, machInst, zdn, imm, pg);
          case 0x4:
            imm = sveExpandFpImmMaxMin((uint8_t) bits(machInst, 5), size);
            return decodeSveBinImmPredF<SveFmaxnmImm>(
                    size, machInst, zdn, imm, pg);
          case 0x5:
            imm = sveExpandFpImmMaxMin((uint8_t) bits(machInst, 5), size);
            return decodeSveBinImmPredF<SveFminnmImm>(
                    size, machInst, zdn, imm, pg);
          case 0x6:
            imm = sveExpandFpImmMaxMin((uint8_t) bits(machInst, 5), size);
            return decodeSveBinImmPredF<SveFmaxImm>(
                    size, machInst, zdn, imm, pg);
          case 0x7:
            imm = sveExpandFpImmMaxMin((uint8_t) bits(machInst, 5), size);
            return decodeSveBinImmPredF<SveFminImm>(
                    size, machInst, zdn, imm, pg);
        }
        return new Unknown64(machInst);
    }  // decodeSveFpArithImmPred

    StaticInstPtr
    decodeSveFpArithPred(ExtMachInst machInst)
    {
        if (bits(machInst, 20) == 0) {
            return decodeSveFpArithPred0(machInst);
        } else if (bits(machInst, 19) == 0) {
            return decodeSveFpTrigMAddCoeff(machInst);
        } else {
            return decodeSveFpArithImmPred(machInst);
        }
    }  // decodeSveFpArithPred

    StaticInstPtr
    decodeSveFpUnaryPred(ExtMachInst machInst)
    {
        IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 12, 10);

        uint8_t size = (uint8_t) bits(machInst, 23, 22);
        if (size == 0) {
            return new Unknown64(machInst);
        }

        uint8_t b20_19 = bits(machInst, 20, 19);
        switch (b20_19) {
          case 0x0:
            {
                if (bits(machInst, 18, 16) == 0x5) {
                    return new Unknown64(machInst);
                }
                // SVE floating-point round to integral value
                uint8_t opc = (uint8_t) bits(machInst, 18, 16);
                switch (opc) {
                  case 0x0:
                    return decodeSveUnaryPredF<SveFrintn>(
                        size, machInst, zd, zn, pg);
                  case 0x1:
                    return decodeSveUnaryPredF<SveFrintp>(
                        size, machInst, zd, zn, pg);
                  case 0x2:
                    return decodeSveUnaryPredF<SveFrintm>(
                        size, machInst, zd, zn, pg);
                  case 0x3:
                    return decodeSveUnaryPredF<SveFrintz>(
                        size, machInst, zd, zn, pg);
                  case 0x4:
                    return decodeSveUnaryPredF<SveFrinta>(
                        size, machInst, zd, zn, pg);
                  case 0x6:
                    return decodeSveUnaryPredF<SveFrintx>(
                        size, machInst, zd, zn, pg);
                  case 0x7:
                    return decodeSveUnaryPredF<SveFrinti>(
                        size, machInst, zd, zn, pg);
                }
            }
            break;
          case 0x1:
            {
                // SVE floating-point unary operations (predicated)
                uint8_t b18_16 = bits(machInst, 18, 16);
                switch (b18_16) {
                  case 0x0:
                    if (size == 0x2) {
                        return new SveFcvtNarrow<uint32_t, uint16_t>(
                            machInst, zd, zn, pg);
                    } else if (size == 0x3) {
                        return new SveFcvtNarrow<uint64_t, uint16_t>(
                            machInst, zd, zn, pg);
                    }
                    break;
                  case 0x1:
                    if (size == 0x2) {
                        return new SveFcvtWiden<uint16_t, uint32_t>(
                            machInst, zd, zn, pg);
                    } else if (size == 0x3) {
                        return new SveFcvtWiden<uint16_t, uint64_t>(
                            machInst, zd, zn, pg);
                    }
                    break;
                  case 0x2:
                    if (size == 0x3) {
                        return new SveFcvtNarrow<uint64_t, uint32_t>(
                            machInst, zd, zn, pg);
                    }
                    break;
                  case 0x3:
                    if (size == 0x3) {
                        return new SveFcvtWiden<uint32_t, uint64_t>(
                            machInst, zd, zn, pg);
                    }
                    break;
                  case 0x4:
                    if (size != 0x0) {
                        return decodeSveUnaryPredF<SveFrecpx>(
                            size, machInst, zd, zn, pg);
                    }
                    break;
                  case 0x5:
                    if (size != 0x0) {
                        return decodeSveUnaryPredF<SveFsqrt>(
                            size, machInst, zd, zn, pg);
                    }
                    break;
                }
            }
            break;
          case 0x2:
            {
                // SVE integer convert to floating-point
                uint8_t opc = (size << 3) | bits(machInst, 18, 16);
                switch (opc) {
                  case 0xa:
                    return new SveScvtfNarrow<uint16_t, uint16_t>(
                        machInst, zd, zn, pg);
                  case 0xb:
                    return new SveUcvtfNarrow<uint16_t, uint16_t>(
                        machInst, zd, zn, pg);
                  case 0xc:
                    return new SveScvtfNarrow<uint32_t, uint16_t>(
                        machInst, zd, zn, pg);
                  case 0xd:
                    return new SveUcvtfNarrow<uint32_t, uint16_t>(
                        machInst, zd, zn, pg);
                  case 0xe:
                    return new SveScvtfNarrow<uint64_t, uint16_t>(
                        machInst, zd, zn, pg);
                  case 0xf:
                    return new SveUcvtfNarrow<uint64_t, uint16_t>(
                        machInst, zd, zn, pg);
                  case 0x14:
                    return new SveScvtfNarrow<uint32_t, uint32_t>(
                        machInst, zd, zn, pg);
                  case 0x15:
                    return new SveUcvtfNarrow<uint32_t, uint32_t>(
                        machInst, zd, zn, pg);
                  case 0x18:
                    return new SveScvtfWiden<uint32_t, uint64_t>(
                        machInst, zd, zn, pg);
                  case 0x19:
                    return new SveUcvtfWiden<uint32_t, uint64_t>(
                        machInst, zd, zn, pg);
                  case 0x1c:
                    return new SveScvtfNarrow<uint64_t, uint32_t>(
                        machInst, zd, zn, pg);
                  case 0x1d:
                    return new SveUcvtfNarrow<uint64_t, uint32_t>(
                        machInst, zd, zn, pg);
                  case 0x1e:
                    return new SveScvtfNarrow<uint64_t, uint64_t>(
                        machInst, zd, zn, pg);
                  case 0x1f:
                    return new SveUcvtfNarrow<uint64_t, uint64_t>(
                        machInst, zd, zn, pg);
                }
            }
            break;
          case 0x3:
            {
                // SVE floating-point convert to integer
                uint8_t opc = (size << 3) | bits(machInst, 18, 16);
                switch (opc) {
                  case 0xa:
                    return new SveFcvtzsNarrow<uint16_t, uint16_t>(
                        machInst, zd, zn, pg);
                  case 0xb:
                    return new SveFcvtzuNarrow<uint16_t, uint16_t>(
                        machInst, zd, zn, pg);
                  case 0xc:
                    return new SveFcvtzsWiden<uint16_t, uint32_t>(
                        machInst, zd, zn, pg);
                  case 0xd:
                    return new SveFcvtzuWiden<uint16_t, uint32_t>(
                        machInst, zd, zn, pg);
                  case 0xe:
                    return new SveFcvtzsWiden<uint16_t, uint64_t>(
                        machInst, zd, zn, pg);
                  case 0xf:
                    return new SveFcvtzuWiden<uint16_t, uint64_t>(
                        machInst, zd, zn, pg);
                  case 0x14:
                    return new SveFcvtzsNarrow<uint32_t, uint32_t>(
                        machInst, zd, zn, pg);
                  case 0x15:
                    return new SveFcvtzuNarrow<uint32_t, uint32_t>(
                        machInst, zd, zn, pg);
                  case 0x18:
                    return new SveFcvtzsNarrow<uint64_t, uint32_t>(
                        machInst, zd, zn, pg);
                  case 0x19:
                    return new SveFcvtzuNarrow<uint64_t, uint32_t>(
                        machInst, zd, zn, pg);
                  case 0x1c:
                    return new SveFcvtzsWiden<uint32_t, uint64_t>(
                        machInst, zd, zn, pg);
                  case 0x1d:
                    return new SveFcvtzuWiden<uint32_t, uint64_t>(
                        machInst, zd, zn, pg);
                  case 0x1e:
                    return new SveFcvtzsNarrow<uint64_t, uint64_t>(
                        machInst, zd, zn, pg);
                  case 0x1f:
                    return new SveFcvtzuNarrow<uint64_t, uint64_t>(
                        machInst, zd, zn, pg);
                }
            }
            break;
        }
        return new Unknown64(machInst);
    }  // decodeSveFpUnaryPred

    StaticInstPtr
    decodeSveFpCmpVec(ExtMachInst machInst)
    {
        IntRegIndex pd = (IntRegIndex) (uint8_t) bits(machInst, 3, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 20, 16);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 12, 10);

        uint8_t size = bits(machInst, 23, 22);
        if (size == 0) {
            return new Unknown64(machInst);
        }
        uint8_t opc = (bits(machInst, 15) << 2) |
                      (bits(machInst, 13) << 1) |
                      bits(machInst, 4);

        switch (opc) {
          case 0x0:
            return decodeSveCmpF<SveFcmge>(size, machInst, pd, zn, zm, pg);
          case 0x1:
            return decodeSveCmpF<SveFcmgt>(size, machInst, pd, zn, zm, pg);
          case 0x2:
            return decodeSveCmpF<SveFcmeq>(size, machInst, pd, zn, zm, pg);
          case 0x3:
            return decodeSveCmpF<SveFcmne>(size, machInst, pd, zn, zm, pg);
          case 0x4:
            return decodeSveCmpF<SveFcmuo>(size, machInst, pd, zn, zm, pg);
          case 0x5:
            return decodeSveCmpF<SveFacge>(size, machInst, pd, zn, zm, pg);
          case 0x7:
            return decodeSveCmpF<SveFacgt>(size, machInst, pd, zn, zm, pg);
        }
        return new Unknown64(machInst);
    }  // decodeSveFpCmpVec

    StaticInstPtr
    decodeSveFpFusedMulAdd(ExtMachInst machInst)
    {
        IntRegIndex zda = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 20, 16);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 12, 10);

        uint8_t size = bits(machInst, 23, 22);
        if (size == 0) {
            return new Unknown64(machInst);
        }
        uint8_t opc = bits(machInst, 15, 13);

        switch (opc) {
          case 0x0:
            return decodeSveTerPredF<SveFmla>(
                    size, machInst, zda, zn, zm, pg);
          case 0x1:
            return decodeSveTerPredF<SveFmls>(
                    size, machInst, zda, zn, zm, pg);
          case 0x2:
            return decodeSveTerPredF<SveFnmla>(
                    size, machInst, zda, zn, zm, pg);
          case 0x3:
            return decodeSveTerPredF<SveFnmls>(
                    size, machInst, zda, zn, zm, pg);
          case 0x4:
            return decodeSveTerPredF<SveFmad>(
                    size, machInst, zda /* zdn */, zm /* za */, zn, pg);
          case 0x5:
            return decodeSveTerPredF<SveFmsb>(
                    size, machInst, zda /* zdn */, zm /* za */, zn, pg);
          case 0x6:
            return decodeSveTerPredF<SveFnmad>(
                    size, machInst, zda /* zdn */, zm /* za */, zn, pg);
          case 0x7:
            return decodeSveTerPredF<SveFnmsb>(
                    size, machInst, zda /* zdn */, zm /* za */, zn, pg);
        }
        return new Unknown64(machInst);
    }  // decodeSveFpFusedMulAdd

    StaticInstPtr
    decodeSveFpCplxAdd(ExtMachInst machInst)
    {
        uint8_t size = bits(machInst, 23, 22);
        uint8_t rot = bits(machInst, 16) << 1 | 0x01;
        IntRegIndex zdn = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 12, 10);
        switch (size) {
            case 1:
                return new SveFcadd<uint16_t>(machInst,
                        zdn, zdn, zm, pg, rot);
            case 2:
                return new SveFcadd<uint32_t>(machInst,
                        zdn, zdn, zm, pg, rot);
            case 3:
                return new SveFcadd<uint64_t>(machInst,
                        zdn, zdn, zm, pg, rot);
        }
        return new Unknown64(machInst);
    }

    StaticInstPtr
    decodeSveFpCplxMulAddVec(ExtMachInst machInst)
    {
        uint8_t size = bits(machInst, 23, 22);
        if (size == 0) {
            return new Unknown64(machInst);
        }

        IntRegIndex zda = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex pg = (IntRegIndex) (uint8_t) bits(machInst, 12, 10);
        IntRegIndex zm = (IntRegIndex) (uint8_t) bits(machInst, 20, 16);
        uint8_t rot = bits(machInst, 14, 13);
        switch (size) {
            case 1:
                return new SveFcmlav<uint16_t>(machInst,
                        zda, zn, zm, pg, rot);
            case 2:
                return new SveFcmlav<uint32_t>(machInst,
                        zda, zn, zm, pg, rot);
            case 3:
                return new SveFcmlav<uint64_t>(machInst,
                        zda, zn, zm, pg, rot);
        }

        return new Unknown64(machInst);
    } // decodeSveFpCplxMulAddVec

    StaticInstPtr
    decodeSveFpCplxMulAddIndexed(ExtMachInst machInst)
    {
        uint8_t size = bits(machInst, 23, 22);
        if (size < 2) {
            return new Unknown64(machInst);
        }

        IntRegIndex zda = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        IntRegIndex zm;
        uint8_t rot = bits(machInst, 11, 10);
        uint8_t imm;

        switch (size) {
            case 2:
                zm = (IntRegIndex) (uint8_t) bits(machInst, 18, 16);
                imm = bits(machInst, 20, 19);
                return new SveFcmlai<uint32_t>(machInst,
                        zda, zn, zm, rot, imm);
            case 3:
                zm = (IntRegIndex) (uint8_t) bits(machInst, 19, 16);
                imm = bits(machInst, 20);
                return new SveFcmlai<uint64_t>(machInst,
                        zda, zn, zm, rot, imm);
        }
        return new Unknown64(machInst);
    } // decodeSveFpCplxMulAddIndexed

    StaticInstPtr
    decodeSveFpMulIndexed(ExtMachInst machInst)
    {
        IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);

        uint8_t size = bits(machInst, 23, 22);
        switch (size) {
          case 0x0:
          case 0x1:
            return new SveFmulIdx<uint16_t>(
                machInst, zd, zn,
                (IntRegIndex) (uint8_t) bits(machInst, 18, 16),
                bits(machInst, 20, 19) | (bits(machInst, 22) << 2));
          case 0x2:
            return new SveFmulIdx<uint32_t>(
                machInst, zd, zn,
                (IntRegIndex) (uint8_t) bits(machInst, 18, 16),
                bits(machInst, 20, 19));
          case 0x3:
            return new SveFmulIdx<uint64_t>(
                machInst, zd, zn,
                (IntRegIndex) (uint8_t) bits(machInst, 19, 16),
                bits(machInst, 20));
          default:
            return new Unknown64(machInst);
        }

    } // decodeSveFpMulIndexed

    StaticInstPtr
    decodeSveFpMulAddIndexed(ExtMachInst machInst)
    {
        IntRegIndex zd = (IntRegIndex) (uint8_t) bits(machInst, 4, 0);
        IntRegIndex zn = (IntRegIndex) (uint8_t) bits(machInst, 9, 5);
        const uint8_t op = bits(machInst, 10);

        uint8_t size = bits(machInst, 23, 22);
        switch (size) {
          case 0x0:
          case 0x1:
            if (op) {
                return new SveFmlsIdx<uint16_t>(
                    machInst, zd, zn,
                    (IntRegIndex) (uint8_t) bits(machInst, 18, 16),
                    bits(machInst, 20, 19) | (bits(machInst, 22) << 2));
            } else {
                return new SveFmlaIdx<uint16_t>(
                    machInst, zd, zn,
                    (IntRegIndex) (uint8_t) bits(machInst, 18, 16),
                    bits(machInst, 20, 19) | (bits(machInst, 22) << 2));
            }
          case 0x2:
            if (op) {
                return new SveFmlsIdx<uint32_t>(
                    machInst, zd, zn,
                    (IntRegIndex) (uint8_t) bits(machInst, 18, 16),
                    bits(machInst, 20, 19));
            } else {
                return new SveFmlaIdx<uint32_t>(
                    machInst, zd, zn,
                    (IntRegIndex) (uint8_t) bits(machInst, 18, 16),
                    bits(machInst, 20, 19));
            }
          case 0x3:
            if (op) {
                return new SveFmlsIdx<uint64_t>(
                    machInst, zd, zn,
                    (IntRegIndex) (uint8_t) bits(machInst, 19, 16),
                    bits(machInst, 20));
            } else {
                return new SveFmlaIdx<uint64_t>(
                    machInst, zd, zn,
                    (IntRegIndex) (uint8_t) bits(machInst, 19, 16),
                    bits(machInst, 20));
            }
          default:
              return new Unknown64(machInst);
        }
    } // decodeSveFpMulAddIndexed

    StaticInstPtr
    decodeSveMemGather32(ExtMachInst machInst)
    {
        return new Unknown64(machInst);
    }  // decodeSveMemGather32

    StaticInstPtr
    decodeSveMemContigLoad(ExtMachInst machInst)
    {
        return new Unknown64(machInst);
    }  // decodeSveMemContigLoad

    StaticInstPtr
    decodeSveMemGather64(ExtMachInst machInst)
    {
        return new Unknown64(machInst);
    }  // decodeSveMemGather64

    StaticInstPtr
    decodeSveMemStore(ExtMachInst machInst)
    {
        return new Unknown64(machInst);
    }  // decodeSveMemStore

}  // namespace Aarch64
}};
