/*
 * 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.
 */

// TODO: add support for suffixes of register specifiers in disasm strings.

#include "arch/arm/insts/sve.hh"

namespace gem5
{

namespace ArmISA {

const char*
svePredTypeToStr(SvePredType pt)
{
    switch (pt) {
      case SvePredType::MERGE:
        return "m";
      case SvePredType::ZERO:
        return "z";
      default:
        return "";
    }
}

std::string
SvePredCountPredOp::generateDisassembly(Addr pc,
        const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printIntReg(ss, dest);
    ccprintf(ss, ", ");
    printVecPredReg(ss, gp);
    ccprintf(ss, ", ");
    printVecPredReg(ss, op1);
    return ss.str();
}

std::string
SvePredCountOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    if (destIsVec) {
        printVecReg(ss, dest, true);
    } else {
        printIntReg(ss, dest);
    }
    ccprintf(ss, ", ");
    uint8_t opWidth = 64;
    printVecPredReg(ss, gp);
    ccprintf(ss, ", ");
    if (srcIs32b)
        opWidth = 32;
    printIntReg(ss, dest, opWidth);
    return ss.str();
}

std::string
SveIndexIIOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", #%d, #%d", imm1, imm2);
    return ss.str();
}

std::string
SveIndexIROp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", #%d, ", imm1);
    printIntReg(ss, op2);
    return ss.str();
}

std::string
SveIndexRIOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printIntReg(ss, op1);
    ccprintf(ss, ", #%d", imm2);
    return ss.str();
}

std::string
SveIndexRROp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printIntReg(ss, op1);
    ccprintf(ss, ", ");
    printIntReg(ss, op2);
    return ss.str();
}

std::string
SveWhileOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecPredReg(ss, dest);
    ccprintf(ss, ", ");
    uint8_t opWidth;
    if (srcIs32b)
        opWidth = 32;
    else
        opWidth = 64;
    printIntReg(ss, op1, opWidth);
    ccprintf(ss, ", ");
    printIntReg(ss, op2, opWidth);
    return ss.str();
}

std::string
SvePselOp::generateDisassembly(Addr pc,
                               const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecPredReg(ss, dest);
    ss << ", ";
    printVecPredReg(ss, op1);
    ss << ", ";
    printVecPredReg(ss, gp);
    ss << ", ";
    printIntReg(ss, op2);
    ss << ", ";
    ccprintf(ss, "#%d", imm);
    return ss.str();
}

std::string
SveCompTermOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printIntReg(ss, op1);
    ccprintf(ss, ", ");
    printIntReg(ss, op2);
    return ss.str();
}

std::string
SveUnaryPredOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printVecPredReg(ss, gp);
    ccprintf(ss, "/m, ");
    printVecReg(ss, op1, true);
    return ss.str();
}

std::string
SveUnaryUnpredOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printVecReg(ss, op1, true);
    return ss.str();
}

std::string
SveUnaryWideImmUnpredOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", #");
    ss << imm;
    return ss.str();
}

std::string
SveUnaryWideImmPredOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printVecPredReg(ss, gp);
    ccprintf(ss, (isMerging ? "/m" : "/z"));
    ccprintf(ss, ", #");
    ss << imm;
    return ss.str();
}

std::string
SveBinImmUnpredConstrOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printVecPredReg(ss, op1);
    ccprintf(ss, ", #");
    ss << imm;
    return ss.str();
}

std::string
SveBinImmPredOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printVecPredReg(ss, gp);
    ccprintf(ss, "/m, ");
    printVecReg(ss, dest, true);
    ccprintf(ss, ", #");
    ss << imm;
    return ss.str();
}

std::string
SveBinWideImmUnpredOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printVecReg(ss, dest, true);
    ccprintf(ss, ", #");
    ss << imm;
    return ss.str();
}

std::string
SveBinDestrPredOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printVecPredReg(ss, gp);
    ccprintf(ss, "/m, ");
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printVecReg(ss, op2, true);
    return ss.str();
}

std::string
SveBinConstrPredOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printVecPredReg(ss, gp);
    if (predType == SvePredType::MERGE || predType == SvePredType::ZERO) {
        ccprintf(ss, "/%s", svePredTypeToStr(predType));
    }
    ccprintf(ss, ", ");
    printVecReg(ss, op1, true);
    ccprintf(ss, ", ");
    printVecReg(ss, op2, true);
    return ss.str();
}

std::string
SveBinUnpredOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printVecReg(ss, op1, true);
    ccprintf(ss, ", ");
    printVecReg(ss, op2, true);
    return ss.str();
}

std::string
SveBinIdxUnpredOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printVecReg(ss, op1, true);
    ccprintf(ss, ", ");
    printVecReg(ss, op2, true);
    ccprintf(ss, "[");
    ss << (uint64_t)index;
    ccprintf(ss, "]");
    return ss.str();
}

std::string
SvePredLogicalOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printVecPredReg(ss, gp);
    if (isSel) {
        ccprintf(ss, ", ");
    } else {
        ccprintf(ss, "/z, ");
    }
    printVecPredReg(ss, op1);
    ccprintf(ss, ", ");
    printVecPredReg(ss, op2);
    return ss.str();
}

std::string
SvePredBinPermOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecPredReg(ss, dest);
    ccprintf(ss, ", ");
    printVecPredReg(ss, op1);
    ccprintf(ss, ", ");
    printVecPredReg(ss, op2);
    return ss.str();
}

std::string
SveCmpOp::generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecPredReg(ss, dest);
    ccprintf(ss, ", ");
    printVecPredReg(ss, gp);
    ccprintf(ss, "/z, ");
    printVecReg(ss, op1, true);
    ccprintf(ss, ", ");
    printVecReg(ss, op2, true);
    return ss.str();
}

std::string
SveCmpImmOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecPredReg(ss, dest);
    ccprintf(ss, ", ");
    printVecPredReg(ss, gp);
    ccprintf(ss, "/z, ");
    printVecReg(ss, op1, true);
    ccprintf(ss, ", #");
    ss << imm;
    return ss.str();
}

std::string
SveTerPredOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printVecPredReg(ss, gp);
    ccprintf(ss, "/m, ");
    printVecReg(ss, op1, true);
    ccprintf(ss, ", ");
    printVecReg(ss, op2, true);
    return ss.str();
}

std::string
SveTerUnpredOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printVecReg(ss, op1, true);
    ccprintf(ss, ", ");
    printVecReg(ss, op2, true);
    return ss.str();
}

std::string
SveTerImmUnpredOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printVecReg(ss, op2, true);
    ccprintf(ss, ", #");
    ss << imm;
    return ss.str();
}

std::string
SveReducOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printFloatReg(ss, dest);
    ccprintf(ss, ", ");
    printVecPredReg(ss, gp);
    ccprintf(ss, ", ");
    printVecReg(ss, op1, true);
    return ss.str();
}

std::string
SveOrdReducOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printFloatReg(ss, dest);
    ccprintf(ss, ", ");
    printVecPredReg(ss, gp);
    ccprintf(ss, ", ");
    printFloatReg(ss, dest);
    ccprintf(ss, ", ");
    printVecReg(ss, op1, true);
    return ss.str();
}

std::string
SvePtrueOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecPredReg(ss, dest);
    if (imm != 0x1f) {
        ccprintf(ss, ", ");
        ss << sveDisasmPredCountImm(imm);
    }
    return ss.str();
}

std::string
SveIntCmpOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecPredReg(ss, dest);
    ccprintf(ss, ", ");
    printVecPredReg(ss, gp);
    ccprintf(ss, "/z, ");
    printVecReg(ss, op1, true);
    ccprintf(ss, ", ");
    if (op2IsWide) {
        printVecReg(ss, op2, true);
    } else {
        printVecReg(ss, op2, true);
    }
    return ss.str();
}

std::string
SveIntCmpImmOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecPredReg(ss, dest);
    ccprintf(ss, "/z, ");
    printVecPredReg(ss, gp);
    ccprintf(ss, ", ");
    printVecReg(ss, op1, true);
    ccprintf(ss, ", #");
    ss << imm;
    return ss.str();
}

std::string
SveAdrOp::generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", [");
    printVecReg(ss, op1, true);
    ccprintf(ss, ", ");
    printVecReg(ss, op2, true);
    if (offsetFormat == SveAdrOffsetUnpackedSigned) {
        ccprintf(ss, ", sxtw");
    } else if (offsetFormat == SveAdrOffsetUnpackedUnsigned) {
        ccprintf(ss, ", uxtw");
    } else if (mult != 1) {
        ccprintf(ss, ", lsl");
    }
    if (mult != 1) {
        ss << __builtin_ctz(mult);
    }
    ccprintf(ss, "]");
    return ss.str();
}

std::string
SveElemCountOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    static const char suffix[9] =
        {'\0', 'b', 'h', '\0', 'w', '\0', '\0', '\0', 'd'};
    std::stringstream ss;
    ss << "  " << mnemonic << suffix[esize] << "   ";
    if (dstIsVec) {
        printVecReg(ss, dest, true);
    } else {
        if (dstIs32b) {
            printIntReg(ss, dest, 32);
        } else {
            printIntReg(ss, dest, 64);
        }
    }
    if (pattern != 0x1f) {
        ccprintf(ss, ", ");
        ss << sveDisasmPredCountImm(pattern);
        if (imm != 1) {
            ccprintf(ss, ", mul #");
            ss << std::to_string(imm);
        }
    }
    return ss.str();
}

std::string
SvePartBrkOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecPredReg(ss, dest);
    ccprintf(ss, ", ");
    printVecPredReg(ss, gp);
    ccprintf(ss, isMerging ? "/m, " : "/z, ");
    printVecPredReg(ss, op1);
    return ss.str();
}

std::string
SvePartBrkPropOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecPredReg(ss, dest);
    ccprintf(ss, ", ");
    printVecPredReg(ss, gp);
    ccprintf(ss, "/z, ");
    printVecPredReg(ss, op1);
    ccprintf(ss, ", ");
    printVecPredReg(ss, op2);
    return ss.str();
}

std::string
SveSelectOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    if (scalar)
        printIntReg(ss, dest, scalar_width);
    else if (simdFp)
        printFloatReg(ss, dest);
    else
        printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printVecPredReg(ss, gp);
    if (conditional) {
        ccprintf(ss, ", ");
        if (scalar)
            printIntReg(ss, dest, scalar_width);
        else
            printVecReg(ss, dest, true);
    }
    ccprintf(ss, ", ");
    printVecReg(ss, op1, true);
    return ss.str();
}

std::string
SveUnaryPredPredOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecPredReg(ss, dest);
    ccprintf(ss, ", ");
    printVecPredReg(ss, gp);
    ccprintf(ss, ", ");
    printVecPredReg(ss, op1);
    return ss.str();
}

std::string
SveTblOp::generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", { ");
    printVecReg(ss, op1, true);
    ccprintf(ss, " }, ");
    printVecReg(ss, op2, true);
    return ss.str();
}

std::string
SveUnpackOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecPredReg(ss, dest);
    ccprintf(ss, ", ");
    printVecPredReg(ss, op1);
    return ss.str();
}

std::string
SvePredTestOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecPredReg(ss, gp);
    ccprintf(ss, ", ");
    printVecPredReg(ss, op1);
    return ss.str();
}

std::string
SvePredUnaryWImplicitSrcOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecPredReg(ss, dest);
    return ss.str();
}

std::string
SvePredUnaryWImplicitSrcPredOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecPredReg(ss, dest);
    ccprintf(ss, ", ");
    printVecPredReg(ss, gp);
    ccprintf(ss, "/z, ");
    return ss.str();
}

std::string
SvePredUnaryWImplicitDstOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecPredReg(ss, op1);
    return ss.str();
}

std::string
SveWImplicitSrcDstOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    return ss.str();
}

std::string
SveBinImmUnpredDestrOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printVecReg(ss, op1, true);
    ccprintf(ss, ", #");
    ss << imm;
    return ss.str();
}

std::string
SveBinImmIdxUnpredOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printVecReg(ss, op1, true);
    ccprintf(ss, "[");
    ss << imm;
    ccprintf(ss, "]");
    return ss.str();
}

std::string
SveUnarySca2VecUnpredOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    if (simdFp) {
        printFloatReg(ss, op1);
    } else {
        printIntReg(ss, op1);
    }
    return ss.str();
}

std::string
SveDotProdIdxOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printVecReg(ss, op1, true);
    ccprintf(ss, ", ");
    printVecReg(ss, op2, true);
    ccprintf(ss, "[");
    ccprintf(ss, "%lu", imm);
    ccprintf(ss, "]");
    return ss.str();
}

std::string
SveDotProdOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ccprintf(ss, ", ");
    printVecReg(ss, op1, true);
    ccprintf(ss, ", ");
    printVecReg(ss, op2, true);
    return ss.str();
}

std::string
SveComplexOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecPredReg(ss, dest);
    ccprintf(ss, ", ");
    printVecPredReg(ss, gp);
    ccprintf(ss, "/m, ");
    printVecPredReg(ss, op1);
    ccprintf(ss, ", ");
    printVecPredReg(ss, op2);
    ccprintf(ss, ", #");
    const char* rotstr[4] = {"0", "90", "180", "270"};
    ccprintf(ss, rotstr[rot]);

    return ss.str();
}

std::string
SveComplexIdxOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecPredReg(ss, dest);
    ccprintf(ss, ", ");
    printVecPredReg(ss, op1);
    ccprintf(ss, ", ");
    printVecPredReg(ss, op2);
    ccprintf(ss, "[");
    ss << imm;
    ccprintf(ss, "], #");
    const char* rotstr[4] = {"0", "90", "180", "270"};
    ccprintf(ss, rotstr[rot]);
    return ss.str();
}

std::string
SveClampOp::generateDisassembly(
        Addr pc, const loader::SymbolTable *symtab) const
{
    std::stringstream ss;
    printMnemonic(ss, "", false);
    printVecReg(ss, dest, true);
    ss << ", ";
    printVecReg(ss, op1, true);
    ss << ", ";
    printVecReg(ss, op2, true);
    return ss.str();
}

std::string
sveDisasmPredCountImm(uint8_t imm)
{
    switch (imm) {
      case 0x0:
        return "POW2";
      case 0x1:
      case 0x2:
      case 0x3:
      case 0x4:
      case 0x5:
      case 0x6:
      case 0x7:
        return "VL" + std::to_string(imm);
      case 0x8:
      case 0x9:
      case 0xa:
      case 0xb:
      case 0xc:
      case 0xd:
        return "VL" + std::to_string(1 << ((imm & 0x7) + 3));
      case 0x1d:
        return "MUL4";
      case 0x1e:
        return "MUL3";
      case 0x1f:
        return "ALL";
      default:
        return "#" + std::to_string(imm);
    }
}

unsigned int
sveDecodePredCount(uint8_t imm, unsigned int num_elems)
{
    assert(num_elems > 0);

    switch (imm) {
      case 0x0:
        // POW2
        return 1 << (31 - __builtin_clz((uint32_t) num_elems));
      case 0x1:
      case 0x2:
      case 0x3:
      case 0x4:
      case 0x5:
      case 0x6:
      case 0x7:
        // VL1, VL2, VL3, VL4, VL5, VL6, VL7
        return (num_elems >= imm) ? imm : 0;
      case 0x8:
      case 0x9:
      case 0xa:
      case 0xb:
      case 0xc:
      case 0xd:
        // VL8, VL16, VL32, VL64, VL128, VL256
        {
            unsigned int pcount = 1 << ((imm & 0x7) + 3);
            return (num_elems >= pcount) ? pcount : 0;
        }
      case 0x1d:
        // MUL4
        return num_elems - (num_elems % 4);
      case 0x1e:
        // MUL3
        return num_elems - (num_elems % 3);
      case 0x1f:
        // ALL
        return num_elems;
      default:
        return 0;
    }
}

uint64_t
sveExpandFpImmAddSub(uint8_t imm, uint8_t size)
{
    static constexpr uint16_t fpOne16 = 0x3c00;
    static constexpr uint16_t fpPointFive16 = 0x3800;
    static constexpr uint32_t fpOne32 = 0x3f800000;
    static constexpr uint32_t fpPointFive32 = 0x3f000000;
    static constexpr uint64_t fpOne64 = 0x3ff0000000000000;
    static constexpr uint64_t fpPointFive64 = 0x3fe0000000000000;

    switch (size) {
      case 0x1:
        return imm ? fpOne16 : fpPointFive16;
      case 0x2:
        return imm ? fpOne32 : fpPointFive32;
      case 0x3:
        return imm ? fpOne64 : fpPointFive64;
      default:
        panic("Unsupported size");
    }
}

uint64_t
sveExpandFpImmMaxMin(uint8_t imm, uint8_t size)
{
    static constexpr uint16_t fpOne16 = 0x3c00;
    static constexpr uint32_t fpOne32 = 0x3f800000;
    static constexpr uint64_t fpOne64 = 0x3ff0000000000000;

    switch (size) {
      case 0x1:
        return imm ? fpOne16 : 0x0;
      case 0x2:
        return imm ? fpOne32 : 0x0;
      case 0x3:
        return imm ? fpOne64 : 0x0;
      default:
        panic("Unsupported size");
    }
}

uint64_t
sveExpandFpImmMul(uint8_t imm, uint8_t size)
{
    static constexpr uint16_t fpTwo16 = 0x4000;
    static constexpr uint16_t fpPointFive16 = 0x3800;
    static constexpr uint32_t fpTwo32 = 0x40000000;
    static constexpr uint32_t fpPointFive32 = 0x3f000000;
    static constexpr uint64_t fpTwo64 = 0x4000000000000000;
    static constexpr uint64_t fpPointFive64 = 0x3fe0000000000000;

    switch (size) {
      case 0x1:
        return imm ? fpTwo16 : fpPointFive16;
      case 0x2:
        return imm ? fpTwo32 : fpPointFive32;
      case 0x3:
        return imm ? fpTwo64 : fpPointFive64;
      default:
        panic("Unsupported size");
    }
}

} // namespace ArmISA
} // namespace gem5
