/*
 * Copyright (c) 2015-2021 Advanced Micro Devices, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 *
 * 2. 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.
 *
 * 3. Neither the name of the copyright holder 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 HOLDER 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.
 */

#ifndef __ARCH_GCN3_INSTS_INSTRUCTIONS_HH__
#define __ARCH_GCN3_INSTS_INSTRUCTIONS_HH__

#include "arch/amdgpu/gcn3/gpu_decoder.hh"
#include "arch/amdgpu/gcn3/insts/gpu_static_inst.hh"
#include "arch/amdgpu/gcn3/insts/op_encodings.hh"
#include "debug/GCN3.hh"

namespace gem5
{

namespace Gcn3ISA
{
    class Inst_SOP2__S_ADD_U32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_ADD_U32(InFmt_SOP2*);
        ~Inst_SOP2__S_ADD_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_ADD_U32

    class Inst_SOP2__S_SUB_U32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_SUB_U32(InFmt_SOP2*);
        ~Inst_SOP2__S_SUB_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_SUB_U32

    class Inst_SOP2__S_ADD_I32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_ADD_I32(InFmt_SOP2*);
        ~Inst_SOP2__S_ADD_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_ADD_I32

    class Inst_SOP2__S_SUB_I32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_SUB_I32(InFmt_SOP2*);
        ~Inst_SOP2__S_SUB_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_SUB_I32

    class Inst_SOP2__S_ADDC_U32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_ADDC_U32(InFmt_SOP2*);
        ~Inst_SOP2__S_ADDC_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_ADDC_U32

    class Inst_SOP2__S_SUBB_U32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_SUBB_U32(InFmt_SOP2*);
        ~Inst_SOP2__S_SUBB_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_SUBB_U32

    class Inst_SOP2__S_MIN_I32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_MIN_I32(InFmt_SOP2*);
        ~Inst_SOP2__S_MIN_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_MIN_I32

    class Inst_SOP2__S_MIN_U32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_MIN_U32(InFmt_SOP2*);
        ~Inst_SOP2__S_MIN_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_MIN_U32

    class Inst_SOP2__S_MAX_I32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_MAX_I32(InFmt_SOP2*);
        ~Inst_SOP2__S_MAX_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_MAX_I32

    class Inst_SOP2__S_MAX_U32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_MAX_U32(InFmt_SOP2*);
        ~Inst_SOP2__S_MAX_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_MAX_U32

    class Inst_SOP2__S_CSELECT_B32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_CSELECT_B32(InFmt_SOP2*);
        ~Inst_SOP2__S_CSELECT_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_CSELECT_B32

    class Inst_SOP2__S_CSELECT_B64 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_CSELECT_B64(InFmt_SOP2*);
        ~Inst_SOP2__S_CSELECT_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 8;
              case 1: //ssrc_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_CSELECT_B64

    class Inst_SOP2__S_AND_B32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_AND_B32(InFmt_SOP2*);
        ~Inst_SOP2__S_AND_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_AND_B32

    class Inst_SOP2__S_AND_B64 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_AND_B64(InFmt_SOP2*);
        ~Inst_SOP2__S_AND_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 8;
              case 1: //ssrc_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_AND_B64

    class Inst_SOP2__S_OR_B32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_OR_B32(InFmt_SOP2*);
        ~Inst_SOP2__S_OR_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_OR_B32

    class Inst_SOP2__S_OR_B64 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_OR_B64(InFmt_SOP2*);
        ~Inst_SOP2__S_OR_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 8;
              case 1: //ssrc_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_OR_B64

    class Inst_SOP2__S_XOR_B32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_XOR_B32(InFmt_SOP2*);
        ~Inst_SOP2__S_XOR_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_XOR_B32

    class Inst_SOP2__S_XOR_B64 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_XOR_B64(InFmt_SOP2*);
        ~Inst_SOP2__S_XOR_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 8;
              case 1: //ssrc_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_XOR_B64

    class Inst_SOP2__S_ANDN2_B32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_ANDN2_B32(InFmt_SOP2*);
        ~Inst_SOP2__S_ANDN2_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_ANDN2_B32

    class Inst_SOP2__S_ANDN2_B64 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_ANDN2_B64(InFmt_SOP2*);
        ~Inst_SOP2__S_ANDN2_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 8;
              case 1: //ssrc_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_ANDN2_B64

    class Inst_SOP2__S_ORN2_B32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_ORN2_B32(InFmt_SOP2*);
        ~Inst_SOP2__S_ORN2_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_ORN2_B32

    class Inst_SOP2__S_ORN2_B64 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_ORN2_B64(InFmt_SOP2*);
        ~Inst_SOP2__S_ORN2_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 8;
              case 1: //ssrc_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_ORN2_B64

    class Inst_SOP2__S_NAND_B32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_NAND_B32(InFmt_SOP2*);
        ~Inst_SOP2__S_NAND_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_NAND_B32

    class Inst_SOP2__S_NAND_B64 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_NAND_B64(InFmt_SOP2*);
        ~Inst_SOP2__S_NAND_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 8;
              case 1: //ssrc_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_NAND_B64

    class Inst_SOP2__S_NOR_B32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_NOR_B32(InFmt_SOP2*);
        ~Inst_SOP2__S_NOR_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_NOR_B32

    class Inst_SOP2__S_NOR_B64 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_NOR_B64(InFmt_SOP2*);
        ~Inst_SOP2__S_NOR_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 8;
              case 1: //ssrc_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_NOR_B64

    class Inst_SOP2__S_XNOR_B32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_XNOR_B32(InFmt_SOP2*);
        ~Inst_SOP2__S_XNOR_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_XNOR_B32

    class Inst_SOP2__S_XNOR_B64 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_XNOR_B64(InFmt_SOP2*);
        ~Inst_SOP2__S_XNOR_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 8;
              case 1: //ssrc_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_XNOR_B64

    class Inst_SOP2__S_LSHL_B32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_LSHL_B32(InFmt_SOP2*);
        ~Inst_SOP2__S_LSHL_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_LSHL_B32

    class Inst_SOP2__S_LSHL_B64 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_LSHL_B64(InFmt_SOP2*);
        ~Inst_SOP2__S_LSHL_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 8;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_LSHL_B64

    class Inst_SOP2__S_LSHR_B32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_LSHR_B32(InFmt_SOP2*);
        ~Inst_SOP2__S_LSHR_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_LSHR_B32

    class Inst_SOP2__S_LSHR_B64 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_LSHR_B64(InFmt_SOP2*);
        ~Inst_SOP2__S_LSHR_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 8;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_LSHR_B64

    class Inst_SOP2__S_ASHR_I32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_ASHR_I32(InFmt_SOP2*);
        ~Inst_SOP2__S_ASHR_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_ASHR_I32

    class Inst_SOP2__S_ASHR_I64 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_ASHR_I64(InFmt_SOP2*);
        ~Inst_SOP2__S_ASHR_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 8;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_ASHR_I64

    class Inst_SOP2__S_BFM_B32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_BFM_B32(InFmt_SOP2*);
        ~Inst_SOP2__S_BFM_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_BFM_B32

    class Inst_SOP2__S_BFM_B64 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_BFM_B64(InFmt_SOP2*);
        ~Inst_SOP2__S_BFM_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_BFM_B64

    class Inst_SOP2__S_MUL_I32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_MUL_I32(InFmt_SOP2*);
        ~Inst_SOP2__S_MUL_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_MUL_I32

    class Inst_SOP2__S_BFE_U32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_BFE_U32(InFmt_SOP2*);
        ~Inst_SOP2__S_BFE_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_BFE_U32

    class Inst_SOP2__S_BFE_I32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_BFE_I32(InFmt_SOP2*);
        ~Inst_SOP2__S_BFE_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_BFE_I32

    class Inst_SOP2__S_BFE_U64 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_BFE_U64(InFmt_SOP2*);
        ~Inst_SOP2__S_BFE_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 8;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_BFE_U64

    class Inst_SOP2__S_BFE_I64 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_BFE_I64(InFmt_SOP2*);
        ~Inst_SOP2__S_BFE_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 8;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_BFE_I64

    class Inst_SOP2__S_CBRANCH_G_FORK : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_CBRANCH_G_FORK(InFmt_SOP2*);
        ~Inst_SOP2__S_CBRANCH_G_FORK();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 8;
              case 1: //ssrc_1
                return 8;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_CBRANCH_G_FORK

    class Inst_SOP2__S_ABSDIFF_I32 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_ABSDIFF_I32(InFmt_SOP2*);
        ~Inst_SOP2__S_ABSDIFF_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_ABSDIFF_I32

    class Inst_SOP2__S_RFE_RESTORE_B64 : public Inst_SOP2
    {
      public:
        Inst_SOP2__S_RFE_RESTORE_B64(InFmt_SOP2*);
        ~Inst_SOP2__S_RFE_RESTORE_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 8;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP2__S_RFE_RESTORE_B64

    class Inst_SOPK__S_MOVK_I32 : public Inst_SOPK
    {
      public:
        Inst_SOPK__S_MOVK_I32(InFmt_SOPK*);
        ~Inst_SOPK__S_MOVK_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPK__S_MOVK_I32

    class Inst_SOPK__S_CMOVK_I32 : public Inst_SOPK
    {
      public:
        Inst_SOPK__S_CMOVK_I32(InFmt_SOPK*);
        ~Inst_SOPK__S_CMOVK_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPK__S_CMOVK_I32

    class Inst_SOPK__S_CMPK_EQ_I32 : public Inst_SOPK
    {
      public:
        Inst_SOPK__S_CMPK_EQ_I32(InFmt_SOPK*);
        ~Inst_SOPK__S_CMPK_EQ_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPK__S_CMPK_EQ_I32

    class Inst_SOPK__S_CMPK_LG_I32 : public Inst_SOPK
    {
      public:
        Inst_SOPK__S_CMPK_LG_I32(InFmt_SOPK*);
        ~Inst_SOPK__S_CMPK_LG_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPK__S_CMPK_LG_I32

    class Inst_SOPK__S_CMPK_GT_I32 : public Inst_SOPK
    {
      public:
        Inst_SOPK__S_CMPK_GT_I32(InFmt_SOPK*);
        ~Inst_SOPK__S_CMPK_GT_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPK__S_CMPK_GT_I32

    class Inst_SOPK__S_CMPK_GE_I32 : public Inst_SOPK
    {
      public:
        Inst_SOPK__S_CMPK_GE_I32(InFmt_SOPK*);
        ~Inst_SOPK__S_CMPK_GE_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPK__S_CMPK_GE_I32

    class Inst_SOPK__S_CMPK_LT_I32 : public Inst_SOPK
    {
      public:
        Inst_SOPK__S_CMPK_LT_I32(InFmt_SOPK*);
        ~Inst_SOPK__S_CMPK_LT_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPK__S_CMPK_LT_I32

    class Inst_SOPK__S_CMPK_LE_I32 : public Inst_SOPK
    {
      public:
        Inst_SOPK__S_CMPK_LE_I32(InFmt_SOPK*);
        ~Inst_SOPK__S_CMPK_LE_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPK__S_CMPK_LE_I32

    class Inst_SOPK__S_CMPK_EQ_U32 : public Inst_SOPK
    {
      public:
        Inst_SOPK__S_CMPK_EQ_U32(InFmt_SOPK*);
        ~Inst_SOPK__S_CMPK_EQ_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPK__S_CMPK_EQ_U32

    class Inst_SOPK__S_CMPK_LG_U32 : public Inst_SOPK
    {
      public:
        Inst_SOPK__S_CMPK_LG_U32(InFmt_SOPK*);
        ~Inst_SOPK__S_CMPK_LG_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPK__S_CMPK_LG_U32

    class Inst_SOPK__S_CMPK_GT_U32 : public Inst_SOPK
    {
      public:
        Inst_SOPK__S_CMPK_GT_U32(InFmt_SOPK*);
        ~Inst_SOPK__S_CMPK_GT_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPK__S_CMPK_GT_U32

    class Inst_SOPK__S_CMPK_GE_U32 : public Inst_SOPK
    {
      public:
        Inst_SOPK__S_CMPK_GE_U32(InFmt_SOPK*);
        ~Inst_SOPK__S_CMPK_GE_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPK__S_CMPK_GE_U32

    class Inst_SOPK__S_CMPK_LT_U32 : public Inst_SOPK
    {
      public:
        Inst_SOPK__S_CMPK_LT_U32(InFmt_SOPK*);
        ~Inst_SOPK__S_CMPK_LT_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPK__S_CMPK_LT_U32

    class Inst_SOPK__S_CMPK_LE_U32 : public Inst_SOPK
    {
      public:
        Inst_SOPK__S_CMPK_LE_U32(InFmt_SOPK*);
        ~Inst_SOPK__S_CMPK_LE_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPK__S_CMPK_LE_U32

    class Inst_SOPK__S_ADDK_I32 : public Inst_SOPK
    {
      public:
        Inst_SOPK__S_ADDK_I32(InFmt_SOPK*);
        ~Inst_SOPK__S_ADDK_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPK__S_ADDK_I32

    class Inst_SOPK__S_MULK_I32 : public Inst_SOPK
    {
      public:
        Inst_SOPK__S_MULK_I32(InFmt_SOPK*);
        ~Inst_SOPK__S_MULK_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPK__S_MULK_I32

    class Inst_SOPK__S_CBRANCH_I_FORK : public Inst_SOPK
    {
      public:
        Inst_SOPK__S_CBRANCH_I_FORK(InFmt_SOPK*);
        ~Inst_SOPK__S_CBRANCH_I_FORK();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //sdst
                return 8;
              case 1: //
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPK__S_CBRANCH_I_FORK

    class Inst_SOPK__S_GETREG_B32 : public Inst_SOPK
    {
      public:
        Inst_SOPK__S_GETREG_B32(InFmt_SOPK*);
        ~Inst_SOPK__S_GETREG_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPK__S_GETREG_B32

    class Inst_SOPK__S_SETREG_B32 : public Inst_SOPK
    {
      public:
        Inst_SOPK__S_SETREG_B32(InFmt_SOPK*);
        ~Inst_SOPK__S_SETREG_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPK__S_SETREG_B32

    class Inst_SOPK__S_SETREG_IMM32_B32 : public Inst_SOPK
    {
      public:
        Inst_SOPK__S_SETREG_IMM32_B32(InFmt_SOPK*);
        ~Inst_SOPK__S_SETREG_IMM32_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm32
                return 4;
              case 1: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPK__S_SETREG_IMM32_B32

    class Inst_SOP1__S_MOV_B32 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_MOV_B32(InFmt_SOP1*);
        ~Inst_SOP1__S_MOV_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_MOV_B32

    class Inst_SOP1__S_MOV_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_MOV_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_MOV_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_MOV_B64

    class Inst_SOP1__S_CMOV_B32 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_CMOV_B32(InFmt_SOP1*);
        ~Inst_SOP1__S_CMOV_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_CMOV_B32

    class Inst_SOP1__S_CMOV_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_CMOV_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_CMOV_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_CMOV_B64

    class Inst_SOP1__S_NOT_B32 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_NOT_B32(InFmt_SOP1*);
        ~Inst_SOP1__S_NOT_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_NOT_B32

    class Inst_SOP1__S_NOT_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_NOT_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_NOT_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_NOT_B64

    class Inst_SOP1__S_WQM_B32 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_WQM_B32(InFmt_SOP1*);
        ~Inst_SOP1__S_WQM_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_WQM_B32

    class Inst_SOP1__S_WQM_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_WQM_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_WQM_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_WQM_B64

    class Inst_SOP1__S_BREV_B32 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_BREV_B32(InFmt_SOP1*);
        ~Inst_SOP1__S_BREV_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_BREV_B32

    class Inst_SOP1__S_BREV_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_BREV_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_BREV_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_BREV_B64

    class Inst_SOP1__S_BCNT0_I32_B32 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_BCNT0_I32_B32(InFmt_SOP1*);
        ~Inst_SOP1__S_BCNT0_I32_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_BCNT0_I32_B32

    class Inst_SOP1__S_BCNT0_I32_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_BCNT0_I32_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_BCNT0_I32_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_BCNT0_I32_B64

    class Inst_SOP1__S_BCNT1_I32_B32 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_BCNT1_I32_B32(InFmt_SOP1*);
        ~Inst_SOP1__S_BCNT1_I32_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_BCNT1_I32_B32

    class Inst_SOP1__S_BCNT1_I32_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_BCNT1_I32_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_BCNT1_I32_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_BCNT1_I32_B64

    class Inst_SOP1__S_FF0_I32_B32 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_FF0_I32_B32(InFmt_SOP1*);
        ~Inst_SOP1__S_FF0_I32_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_FF0_I32_B32

    class Inst_SOP1__S_FF0_I32_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_FF0_I32_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_FF0_I32_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_FF0_I32_B64

    class Inst_SOP1__S_FF1_I32_B32 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_FF1_I32_B32(InFmt_SOP1*);
        ~Inst_SOP1__S_FF1_I32_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_FF1_I32_B32

    class Inst_SOP1__S_FF1_I32_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_FF1_I32_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_FF1_I32_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_FF1_I32_B64

    class Inst_SOP1__S_FLBIT_I32_B32 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_FLBIT_I32_B32(InFmt_SOP1*);
        ~Inst_SOP1__S_FLBIT_I32_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_FLBIT_I32_B32

    class Inst_SOP1__S_FLBIT_I32_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_FLBIT_I32_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_FLBIT_I32_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_FLBIT_I32_B64

    class Inst_SOP1__S_FLBIT_I32 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_FLBIT_I32(InFmt_SOP1*);
        ~Inst_SOP1__S_FLBIT_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_FLBIT_I32

    class Inst_SOP1__S_FLBIT_I32_I64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_FLBIT_I32_I64(InFmt_SOP1*);
        ~Inst_SOP1__S_FLBIT_I32_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_FLBIT_I32_I64

    class Inst_SOP1__S_SEXT_I32_I8 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_SEXT_I32_I8(InFmt_SOP1*);
        ~Inst_SOP1__S_SEXT_I32_I8();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_SEXT_I32_I8

    class Inst_SOP1__S_SEXT_I32_I16 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_SEXT_I32_I16(InFmt_SOP1*);
        ~Inst_SOP1__S_SEXT_I32_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_SEXT_I32_I16

    class Inst_SOP1__S_BITSET0_B32 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_BITSET0_B32(InFmt_SOP1*);
        ~Inst_SOP1__S_BITSET0_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_BITSET0_B32

    class Inst_SOP1__S_BITSET0_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_BITSET0_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_BITSET0_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_BITSET0_B64

    class Inst_SOP1__S_BITSET1_B32 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_BITSET1_B32(InFmt_SOP1*);
        ~Inst_SOP1__S_BITSET1_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_BITSET1_B32

    class Inst_SOP1__S_BITSET1_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_BITSET1_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_BITSET1_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_BITSET1_B64

    class Inst_SOP1__S_GETPC_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_GETPC_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_GETPC_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_GETPC_B64

    class Inst_SOP1__S_SETPC_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_SETPC_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_SETPC_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_SETPC_B64

    class Inst_SOP1__S_SWAPPC_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_SWAPPC_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_SWAPPC_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_SWAPPC_B64

    class Inst_SOP1__S_RFE_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_RFE_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_RFE_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_RFE_B64

    class Inst_SOP1__S_AND_SAVEEXEC_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_AND_SAVEEXEC_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_AND_SAVEEXEC_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_AND_SAVEEXEC_B64

    class Inst_SOP1__S_OR_SAVEEXEC_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_OR_SAVEEXEC_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_OR_SAVEEXEC_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_OR_SAVEEXEC_B64

    class Inst_SOP1__S_XOR_SAVEEXEC_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_XOR_SAVEEXEC_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_XOR_SAVEEXEC_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_XOR_SAVEEXEC_B64

    class Inst_SOP1__S_ANDN2_SAVEEXEC_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_ANDN2_SAVEEXEC_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_ANDN2_SAVEEXEC_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_ANDN2_SAVEEXEC_B64

    class Inst_SOP1__S_ORN2_SAVEEXEC_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_ORN2_SAVEEXEC_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_ORN2_SAVEEXEC_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_ORN2_SAVEEXEC_B64

    class Inst_SOP1__S_NAND_SAVEEXEC_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_NAND_SAVEEXEC_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_NAND_SAVEEXEC_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_NAND_SAVEEXEC_B64

    class Inst_SOP1__S_NOR_SAVEEXEC_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_NOR_SAVEEXEC_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_NOR_SAVEEXEC_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_NOR_SAVEEXEC_B64

    class Inst_SOP1__S_XNOR_SAVEEXEC_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_XNOR_SAVEEXEC_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_XNOR_SAVEEXEC_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_XNOR_SAVEEXEC_B64

    class Inst_SOP1__S_QUADMASK_B32 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_QUADMASK_B32(InFmt_SOP1*);
        ~Inst_SOP1__S_QUADMASK_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_QUADMASK_B32

    class Inst_SOP1__S_QUADMASK_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_QUADMASK_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_QUADMASK_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_QUADMASK_B64

    class Inst_SOP1__S_MOVRELS_B32 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_MOVRELS_B32(InFmt_SOP1*);
        ~Inst_SOP1__S_MOVRELS_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_MOVRELS_B32

    class Inst_SOP1__S_MOVRELS_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_MOVRELS_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_MOVRELS_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //sdst
                return 8;
              case 1: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_MOVRELS_B64

    class Inst_SOP1__S_MOVRELD_B32 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_MOVRELD_B32(InFmt_SOP1*);
        ~Inst_SOP1__S_MOVRELD_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_MOVRELD_B32

    class Inst_SOP1__S_MOVRELD_B64 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_MOVRELD_B64(InFmt_SOP1*);
        ~Inst_SOP1__S_MOVRELD_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 8;
              case 1: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_MOVRELD_B64

    class Inst_SOP1__S_CBRANCH_JOIN : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_CBRANCH_JOIN(InFmt_SOP1*);
        ~Inst_SOP1__S_CBRANCH_JOIN();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_CBRANCH_JOIN

    class Inst_SOP1__S_ABS_I32 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_ABS_I32(InFmt_SOP1*);
        ~Inst_SOP1__S_ABS_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_ABS_I32

    class Inst_SOP1__S_MOV_FED_B32 : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_MOV_FED_B32(InFmt_SOP1*);
        ~Inst_SOP1__S_MOV_FED_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_MOV_FED_B32

    class Inst_SOP1__S_SET_GPR_IDX_IDX : public Inst_SOP1
    {
      public:
        Inst_SOP1__S_SET_GPR_IDX_IDX(InFmt_SOP1*);
        ~Inst_SOP1__S_SET_GPR_IDX_IDX();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOP1__S_SET_GPR_IDX_IDX

    class Inst_SOPC__S_CMP_EQ_I32 : public Inst_SOPC
    {
      public:
        Inst_SOPC__S_CMP_EQ_I32(InFmt_SOPC*);
        ~Inst_SOPC__S_CMP_EQ_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPC__S_CMP_EQ_I32

    class Inst_SOPC__S_CMP_LG_I32 : public Inst_SOPC
    {
      public:
        Inst_SOPC__S_CMP_LG_I32(InFmt_SOPC*);
        ~Inst_SOPC__S_CMP_LG_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPC__S_CMP_LG_I32

    class Inst_SOPC__S_CMP_GT_I32 : public Inst_SOPC
    {
      public:
        Inst_SOPC__S_CMP_GT_I32(InFmt_SOPC*);
        ~Inst_SOPC__S_CMP_GT_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPC__S_CMP_GT_I32

    class Inst_SOPC__S_CMP_GE_I32 : public Inst_SOPC
    {
      public:
        Inst_SOPC__S_CMP_GE_I32(InFmt_SOPC*);
        ~Inst_SOPC__S_CMP_GE_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPC__S_CMP_GE_I32

    class Inst_SOPC__S_CMP_LT_I32 : public Inst_SOPC
    {
      public:
        Inst_SOPC__S_CMP_LT_I32(InFmt_SOPC*);
        ~Inst_SOPC__S_CMP_LT_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPC__S_CMP_LT_I32

    class Inst_SOPC__S_CMP_LE_I32 : public Inst_SOPC
    {
      public:
        Inst_SOPC__S_CMP_LE_I32(InFmt_SOPC*);
        ~Inst_SOPC__S_CMP_LE_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPC__S_CMP_LE_I32

    class Inst_SOPC__S_CMP_EQ_U32 : public Inst_SOPC
    {
      public:
        Inst_SOPC__S_CMP_EQ_U32(InFmt_SOPC*);
        ~Inst_SOPC__S_CMP_EQ_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPC__S_CMP_EQ_U32

    class Inst_SOPC__S_CMP_LG_U32 : public Inst_SOPC
    {
      public:
        Inst_SOPC__S_CMP_LG_U32(InFmt_SOPC*);
        ~Inst_SOPC__S_CMP_LG_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPC__S_CMP_LG_U32

    class Inst_SOPC__S_CMP_GT_U32 : public Inst_SOPC
    {
      public:
        Inst_SOPC__S_CMP_GT_U32(InFmt_SOPC*);
        ~Inst_SOPC__S_CMP_GT_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPC__S_CMP_GT_U32

    class Inst_SOPC__S_CMP_GE_U32 : public Inst_SOPC
    {
      public:
        Inst_SOPC__S_CMP_GE_U32(InFmt_SOPC*);
        ~Inst_SOPC__S_CMP_GE_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPC__S_CMP_GE_U32

    class Inst_SOPC__S_CMP_LT_U32 : public Inst_SOPC
    {
      public:
        Inst_SOPC__S_CMP_LT_U32(InFmt_SOPC*);
        ~Inst_SOPC__S_CMP_LT_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPC__S_CMP_LT_U32

    class Inst_SOPC__S_CMP_LE_U32 : public Inst_SOPC
    {
      public:
        Inst_SOPC__S_CMP_LE_U32(InFmt_SOPC*);
        ~Inst_SOPC__S_CMP_LE_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPC__S_CMP_LE_U32

    class Inst_SOPC__S_BITCMP0_B32 : public Inst_SOPC
    {
      public:
        Inst_SOPC__S_BITCMP0_B32(InFmt_SOPC*);
        ~Inst_SOPC__S_BITCMP0_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPC__S_BITCMP0_B32

    class Inst_SOPC__S_BITCMP1_B32 : public Inst_SOPC
    {
      public:
        Inst_SOPC__S_BITCMP1_B32(InFmt_SOPC*);
        ~Inst_SOPC__S_BITCMP1_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPC__S_BITCMP1_B32

    class Inst_SOPC__S_BITCMP0_B64 : public Inst_SOPC
    {
      public:
        Inst_SOPC__S_BITCMP0_B64(InFmt_SOPC*);
        ~Inst_SOPC__S_BITCMP0_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 8;
              case 1: //ssrc_1
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPC__S_BITCMP0_B64

    class Inst_SOPC__S_BITCMP1_B64 : public Inst_SOPC
    {
      public:
        Inst_SOPC__S_BITCMP1_B64(InFmt_SOPC*);
        ~Inst_SOPC__S_BITCMP1_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 8;
              case 1: //ssrc_1
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPC__S_BITCMP1_B64

    class Inst_SOPC__S_SETVSKIP : public Inst_SOPC
    {
      public:
        Inst_SOPC__S_SETVSKIP(InFmt_SOPC*);
        ~Inst_SOPC__S_SETVSKIP();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPC__S_SETVSKIP

    class Inst_SOPC__S_SET_GPR_IDX_ON : public Inst_SOPC
    {
      public:
        Inst_SOPC__S_SET_GPR_IDX_ON(InFmt_SOPC*);
        ~Inst_SOPC__S_SET_GPR_IDX_ON();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //simm4
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPC__S_SET_GPR_IDX_ON

    class Inst_SOPC__S_CMP_EQ_U64 : public Inst_SOPC
    {
      public:
        Inst_SOPC__S_CMP_EQ_U64(InFmt_SOPC*);
        ~Inst_SOPC__S_CMP_EQ_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 8;
              case 1: //ssrc_1
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPC__S_CMP_EQ_U64

    class Inst_SOPC__S_CMP_LG_U64 : public Inst_SOPC
    {
      public:
        Inst_SOPC__S_CMP_LG_U64(InFmt_SOPC*);
        ~Inst_SOPC__S_CMP_LG_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 8;
              case 1: //ssrc_1
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPC__S_CMP_LG_U64

    class Inst_SOPP__S_NOP : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_NOP(InFmt_SOPP*);
        ~Inst_SOPP__S_NOP();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_NOP

    class Inst_SOPP__S_ENDPGM : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_ENDPGM(InFmt_SOPP*);
        ~Inst_SOPP__S_ENDPGM();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_ENDPGM

    class Inst_SOPP__S_BRANCH : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_BRANCH(InFmt_SOPP*);
        ~Inst_SOPP__S_BRANCH();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //label
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_BRANCH

    class Inst_SOPP__S_WAKEUP : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_WAKEUP(InFmt_SOPP*);
        ~Inst_SOPP__S_WAKEUP();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_WAKEUP

    class Inst_SOPP__S_CBRANCH_SCC0 : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_CBRANCH_SCC0(InFmt_SOPP*);
        ~Inst_SOPP__S_CBRANCH_SCC0();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //label
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_CBRANCH_SCC0

    class Inst_SOPP__S_CBRANCH_SCC1 : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_CBRANCH_SCC1(InFmt_SOPP*);
        ~Inst_SOPP__S_CBRANCH_SCC1();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //label
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_CBRANCH_SCC1

    class Inst_SOPP__S_CBRANCH_VCCZ : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_CBRANCH_VCCZ(InFmt_SOPP*);
        ~Inst_SOPP__S_CBRANCH_VCCZ();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //label
                return 2;
              case 1:
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_CBRANCH_VCCZ

    class Inst_SOPP__S_CBRANCH_VCCNZ : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_CBRANCH_VCCNZ(InFmt_SOPP*);
        ~Inst_SOPP__S_CBRANCH_VCCNZ();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //label
                return 2;
              case 1:
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_CBRANCH_VCCNZ

    class Inst_SOPP__S_CBRANCH_EXECZ : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_CBRANCH_EXECZ(InFmt_SOPP*);
        ~Inst_SOPP__S_CBRANCH_EXECZ();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //label
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_CBRANCH_EXECZ

    class Inst_SOPP__S_CBRANCH_EXECNZ : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_CBRANCH_EXECNZ(InFmt_SOPP*);
        ~Inst_SOPP__S_CBRANCH_EXECNZ();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //label
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_CBRANCH_EXECNZ

    class Inst_SOPP__S_BARRIER : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_BARRIER(InFmt_SOPP*);
        ~Inst_SOPP__S_BARRIER();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_BARRIER

    class Inst_SOPP__S_SETKILL : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_SETKILL(InFmt_SOPP*);
        ~Inst_SOPP__S_SETKILL();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_SETKILL

    class Inst_SOPP__S_WAITCNT : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_WAITCNT(InFmt_SOPP*);
        ~Inst_SOPP__S_WAITCNT();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_WAITCNT

    class Inst_SOPP__S_SETHALT : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_SETHALT(InFmt_SOPP*);
        ~Inst_SOPP__S_SETHALT();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_SETHALT

    class Inst_SOPP__S_SLEEP : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_SLEEP(InFmt_SOPP*);
        ~Inst_SOPP__S_SLEEP();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_SLEEP

    class Inst_SOPP__S_SETPRIO : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_SETPRIO(InFmt_SOPP*);
        ~Inst_SOPP__S_SETPRIO();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_SETPRIO

    class Inst_SOPP__S_SENDMSG : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_SENDMSG(InFmt_SOPP*);
        ~Inst_SOPP__S_SENDMSG();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_SENDMSG

    class Inst_SOPP__S_SENDMSGHALT : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_SENDMSGHALT(InFmt_SOPP*);
        ~Inst_SOPP__S_SENDMSGHALT();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_SENDMSGHALT

    class Inst_SOPP__S_TRAP : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_TRAP(InFmt_SOPP*);
        ~Inst_SOPP__S_TRAP();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_TRAP

    class Inst_SOPP__S_ICACHE_INV : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_ICACHE_INV(InFmt_SOPP*);
        ~Inst_SOPP__S_ICACHE_INV();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_ICACHE_INV

    class Inst_SOPP__S_INCPERFLEVEL : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_INCPERFLEVEL(InFmt_SOPP*);
        ~Inst_SOPP__S_INCPERFLEVEL();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_INCPERFLEVEL

    class Inst_SOPP__S_DECPERFLEVEL : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_DECPERFLEVEL(InFmt_SOPP*);
        ~Inst_SOPP__S_DECPERFLEVEL();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_DECPERFLEVEL

    class Inst_SOPP__S_TTRACEDATA : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_TTRACEDATA(InFmt_SOPP*);
        ~Inst_SOPP__S_TTRACEDATA();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_TTRACEDATA

    class Inst_SOPP__S_CBRANCH_CDBGSYS : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_CBRANCH_CDBGSYS(InFmt_SOPP*);
        ~Inst_SOPP__S_CBRANCH_CDBGSYS();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //label
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_CBRANCH_CDBGSYS

    class Inst_SOPP__S_CBRANCH_CDBGUSER : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_CBRANCH_CDBGUSER(InFmt_SOPP*);
        ~Inst_SOPP__S_CBRANCH_CDBGUSER();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //label
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_CBRANCH_CDBGUSER

    class Inst_SOPP__S_CBRANCH_CDBGSYS_OR_USER : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_CBRANCH_CDBGSYS_OR_USER(InFmt_SOPP*);
        ~Inst_SOPP__S_CBRANCH_CDBGSYS_OR_USER();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //label
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_CBRANCH_CDBGSYS_OR_USER

    class Inst_SOPP__S_CBRANCH_CDBGSYS_AND_USER : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_CBRANCH_CDBGSYS_AND_USER(InFmt_SOPP*);
        ~Inst_SOPP__S_CBRANCH_CDBGSYS_AND_USER();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //label
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_CBRANCH_CDBGSYS_AND_USER

    class Inst_SOPP__S_ENDPGM_SAVED : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_ENDPGM_SAVED(InFmt_SOPP*);
        ~Inst_SOPP__S_ENDPGM_SAVED();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_ENDPGM_SAVED

    class Inst_SOPP__S_SET_GPR_IDX_OFF : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_SET_GPR_IDX_OFF(InFmt_SOPP*);
        ~Inst_SOPP__S_SET_GPR_IDX_OFF();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_SET_GPR_IDX_OFF

    class Inst_SOPP__S_SET_GPR_IDX_MODE : public Inst_SOPP
    {
      public:
        Inst_SOPP__S_SET_GPR_IDX_MODE(InFmt_SOPP*);
        ~Inst_SOPP__S_SET_GPR_IDX_MODE();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //simm16
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SOPP__S_SET_GPR_IDX_MODE

    class Inst_SMEM__S_LOAD_DWORD : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_LOAD_DWORD(InFmt_SMEM*);
        ~Inst_SMEM__S_LOAD_DWORD();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //sgpr_base
                return 8;
              case 1: //offset
                return 4;
              case 2: //sgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_LOAD_DWORD

    class Inst_SMEM__S_LOAD_DWORDX2 : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_LOAD_DWORDX2(InFmt_SMEM*);
        ~Inst_SMEM__S_LOAD_DWORDX2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //sgpr_base
                return 8;
              case 1: //offset
                return 4;
              case 2: //sgpr_dst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_LOAD_DWORDX2

    class Inst_SMEM__S_LOAD_DWORDX4 : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_LOAD_DWORDX4(InFmt_SMEM*);
        ~Inst_SMEM__S_LOAD_DWORDX4();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //sgpr_base
                return 8;
              case 1: //offset
                return 4;
              case 2: //sgpr_dst
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_LOAD_DWORDX4

    class Inst_SMEM__S_LOAD_DWORDX8 : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_LOAD_DWORDX8(InFmt_SMEM*);
        ~Inst_SMEM__S_LOAD_DWORDX8();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //sgpr_base
                return 8;
              case 1: //offset
                return 4;
              case 2: //sgpr_dst
                return 32;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_LOAD_DWORDX8

    class Inst_SMEM__S_LOAD_DWORDX16 : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_LOAD_DWORDX16(InFmt_SMEM*);
        ~Inst_SMEM__S_LOAD_DWORDX16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //sgpr_base
                return 8;
              case 1: //offset
                return 4;
              case 2: //sgpr_dst
                return 64;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_LOAD_DWORDX16

    class Inst_SMEM__S_BUFFER_LOAD_DWORD : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_BUFFER_LOAD_DWORD(InFmt_SMEM*);
        ~Inst_SMEM__S_BUFFER_LOAD_DWORD();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //sgpr_base
                return 16;
              case 1: //offset
                return 4;
              case 2: //sgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_BUFFER_LOAD_DWORD

    class Inst_SMEM__S_BUFFER_LOAD_DWORDX2 : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_BUFFER_LOAD_DWORDX2(InFmt_SMEM*);
        ~Inst_SMEM__S_BUFFER_LOAD_DWORDX2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //sgpr_base
                return 16;
              case 1: //offset
                return 4;
              case 2: //sgpr_dst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_BUFFER_LOAD_DWORDX2

    class Inst_SMEM__S_BUFFER_LOAD_DWORDX4 : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_BUFFER_LOAD_DWORDX4(InFmt_SMEM*);
        ~Inst_SMEM__S_BUFFER_LOAD_DWORDX4();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //sgpr_base
                return 16;
              case 1: //offset
                return 4;
              case 2: //sgpr_dst
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_BUFFER_LOAD_DWORDX4

    class Inst_SMEM__S_BUFFER_LOAD_DWORDX8 : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_BUFFER_LOAD_DWORDX8(InFmt_SMEM*);
        ~Inst_SMEM__S_BUFFER_LOAD_DWORDX8();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //sgpr_base
                return 16;
              case 1: //offset
                return 4;
              case 2: //sgpr_dst
                return 32;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_BUFFER_LOAD_DWORDX8

    class Inst_SMEM__S_BUFFER_LOAD_DWORDX16 : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_BUFFER_LOAD_DWORDX16(InFmt_SMEM*);
        ~Inst_SMEM__S_BUFFER_LOAD_DWORDX16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //sgpr_base
                return 16;
              case 1: //offset
                return 4;
              case 2: //sgpr_dst
                return 64;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_BUFFER_LOAD_DWORDX16

    class Inst_SMEM__S_STORE_DWORD : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_STORE_DWORD(InFmt_SMEM*);
        ~Inst_SMEM__S_STORE_DWORD();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //sgpr_data
                return 4;
              case 1: //sgpr_base
                return 8;
              case 2: //offset
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_STORE_DWORD

    class Inst_SMEM__S_STORE_DWORDX2 : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_STORE_DWORDX2(InFmt_SMEM*);
        ~Inst_SMEM__S_STORE_DWORDX2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //sgpr_data
                return 8;
              case 1: //sgpr_base
                return 8;
              case 2: //offset
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_STORE_DWORDX2

    class Inst_SMEM__S_STORE_DWORDX4 : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_STORE_DWORDX4(InFmt_SMEM*);
        ~Inst_SMEM__S_STORE_DWORDX4();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //sgpr_data
                return 16;
              case 1: //sgpr_base
                return 8;
              case 2: //offset
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_STORE_DWORDX4

    class Inst_SMEM__S_BUFFER_STORE_DWORD : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_BUFFER_STORE_DWORD(InFmt_SMEM*);
        ~Inst_SMEM__S_BUFFER_STORE_DWORD();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //sgpr_data
                return 4;
              case 1: //sgpr_base
                return 16;
              case 2: //offset
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_BUFFER_STORE_DWORD

    class Inst_SMEM__S_BUFFER_STORE_DWORDX2 : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_BUFFER_STORE_DWORDX2(InFmt_SMEM*);
        ~Inst_SMEM__S_BUFFER_STORE_DWORDX2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //sgpr_data
                return 8;
              case 1: //sgpr_base
                return 16;
              case 2: //offset
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_BUFFER_STORE_DWORDX2

    class Inst_SMEM__S_BUFFER_STORE_DWORDX4 : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_BUFFER_STORE_DWORDX4(InFmt_SMEM*);
        ~Inst_SMEM__S_BUFFER_STORE_DWORDX4();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //sgpr_data
                return 16;
              case 1: //sgpr_base
                return 16;
              case 2: //offset
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_BUFFER_STORE_DWORDX4

    class Inst_SMEM__S_DCACHE_INV : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_DCACHE_INV(InFmt_SMEM*);
        ~Inst_SMEM__S_DCACHE_INV();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_DCACHE_INV

    class Inst_SMEM__S_DCACHE_WB : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_DCACHE_WB(InFmt_SMEM*);
        ~Inst_SMEM__S_DCACHE_WB();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_DCACHE_WB

    class Inst_SMEM__S_DCACHE_INV_VOL : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_DCACHE_INV_VOL(InFmt_SMEM*);
        ~Inst_SMEM__S_DCACHE_INV_VOL();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_DCACHE_INV_VOL

    class Inst_SMEM__S_DCACHE_WB_VOL : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_DCACHE_WB_VOL(InFmt_SMEM*);
        ~Inst_SMEM__S_DCACHE_WB_VOL();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_DCACHE_WB_VOL

    class Inst_SMEM__S_MEMTIME : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_MEMTIME(InFmt_SMEM*);
        ~Inst_SMEM__S_MEMTIME();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //sgpr_dst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_MEMTIME

    class Inst_SMEM__S_MEMREALTIME : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_MEMREALTIME(InFmt_SMEM*);
        ~Inst_SMEM__S_MEMREALTIME();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //sgpr_dst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_MEMREALTIME

    class Inst_SMEM__S_ATC_PROBE : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_ATC_PROBE(InFmt_SMEM*);
        ~Inst_SMEM__S_ATC_PROBE();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //perm_rwx
                return 32;
              case 1: //sgpr_base
                return 8;
              case 2: //offset
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_ATC_PROBE

    class Inst_SMEM__S_ATC_PROBE_BUFFER : public Inst_SMEM
    {
      public:
        Inst_SMEM__S_ATC_PROBE_BUFFER(InFmt_SMEM*);
        ~Inst_SMEM__S_ATC_PROBE_BUFFER();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //perm_rwx
                return 32;
              case 1: //sgpr_base
                return 16;
              case 2: //offset
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_SMEM__S_ATC_PROBE_BUFFER

    class Inst_VOP2__V_CNDMASK_B32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_CNDMASK_B32(InFmt_VOP2*);
        ~Inst_VOP2__V_CNDMASK_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_CNDMASK_B32

    class Inst_VOP2__V_ADD_F32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_ADD_F32(InFmt_VOP2*);
        ~Inst_VOP2__V_ADD_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_ADD_F32

    class Inst_VOP2__V_SUB_F32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_SUB_F32(InFmt_VOP2*);
        ~Inst_VOP2__V_SUB_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_SUB_F32

    class Inst_VOP2__V_SUBREV_F32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_SUBREV_F32(InFmt_VOP2*);
        ~Inst_VOP2__V_SUBREV_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_SUBREV_F32

    class Inst_VOP2__V_MUL_LEGACY_F32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MUL_LEGACY_F32(InFmt_VOP2*);
        ~Inst_VOP2__V_MUL_LEGACY_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MUL_LEGACY_F32

    class Inst_VOP2__V_MUL_F32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MUL_F32(InFmt_VOP2*);
        ~Inst_VOP2__V_MUL_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MUL_F32

    class Inst_VOP2__V_MUL_I32_I24 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MUL_I32_I24(InFmt_VOP2*);
        ~Inst_VOP2__V_MUL_I32_I24();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MUL_I32_I24

    class Inst_VOP2__V_MUL_HI_I32_I24 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MUL_HI_I32_I24(InFmt_VOP2*);
        ~Inst_VOP2__V_MUL_HI_I32_I24();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MUL_HI_I32_I24

    class Inst_VOP2__V_MUL_U32_U24 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MUL_U32_U24(InFmt_VOP2*);
        ~Inst_VOP2__V_MUL_U32_U24();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MUL_U32_U24

    class Inst_VOP2__V_MUL_HI_U32_U24 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MUL_HI_U32_U24(InFmt_VOP2*);
        ~Inst_VOP2__V_MUL_HI_U32_U24();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MUL_HI_U32_U24

    class Inst_VOP2__V_MIN_F32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MIN_F32(InFmt_VOP2*);
        ~Inst_VOP2__V_MIN_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MIN_F32

    class Inst_VOP2__V_MAX_F32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MAX_F32(InFmt_VOP2*);
        ~Inst_VOP2__V_MAX_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MAX_F32

    class Inst_VOP2__V_MIN_I32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MIN_I32(InFmt_VOP2*);
        ~Inst_VOP2__V_MIN_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MIN_I32

    class Inst_VOP2__V_MAX_I32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MAX_I32(InFmt_VOP2*);
        ~Inst_VOP2__V_MAX_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MAX_I32

    class Inst_VOP2__V_MIN_U32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MIN_U32(InFmt_VOP2*);
        ~Inst_VOP2__V_MIN_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MIN_U32

    class Inst_VOP2__V_MAX_U32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MAX_U32(InFmt_VOP2*);
        ~Inst_VOP2__V_MAX_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MAX_U32

    class Inst_VOP2__V_LSHRREV_B32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_LSHRREV_B32(InFmt_VOP2*);
        ~Inst_VOP2__V_LSHRREV_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_LSHRREV_B32

    class Inst_VOP2__V_ASHRREV_I32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_ASHRREV_I32(InFmt_VOP2*);
        ~Inst_VOP2__V_ASHRREV_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_ASHRREV_I32

    class Inst_VOP2__V_LSHLREV_B32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_LSHLREV_B32(InFmt_VOP2*);
        ~Inst_VOP2__V_LSHLREV_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_LSHLREV_B32

    class Inst_VOP2__V_AND_B32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_AND_B32(InFmt_VOP2*);
        ~Inst_VOP2__V_AND_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_AND_B32

    class Inst_VOP2__V_OR_B32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_OR_B32(InFmt_VOP2*);
        ~Inst_VOP2__V_OR_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_OR_B32

    class Inst_VOP2__V_XOR_B32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_XOR_B32(InFmt_VOP2*);
        ~Inst_VOP2__V_XOR_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_XOR_B32

    class Inst_VOP2__V_MAC_F32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MAC_F32(InFmt_VOP2*);
        ~Inst_VOP2__V_MAC_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MAC_F32

    class Inst_VOP2__V_MADMK_F32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MADMK_F32(InFmt_VOP2*);
        ~Inst_VOP2__V_MADMK_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MADMK_F32

    class Inst_VOP2__V_MADAK_F32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MADAK_F32(InFmt_VOP2*);
        ~Inst_VOP2__V_MADAK_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MADAK_F32

    class Inst_VOP2__V_ADD_U32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_ADD_U32(InFmt_VOP2*);
        ~Inst_VOP2__V_ADD_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 2; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              case 3: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_ADD_U32

    class Inst_VOP2__V_SUB_U32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_SUB_U32(InFmt_VOP2*);
        ~Inst_VOP2__V_SUB_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 2; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              case 3: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_SUB_U32

    class Inst_VOP2__V_SUBREV_U32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_SUBREV_U32(InFmt_VOP2*);
        ~Inst_VOP2__V_SUBREV_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 2; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              case 3: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_SUBREV_U32

    class Inst_VOP2__V_ADDC_U32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_ADDC_U32(InFmt_VOP2*);
        ~Inst_VOP2__V_ADDC_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 2; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              case 3: //vdst
                return 4;
              case 4: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_ADDC_U32

    class Inst_VOP2__V_SUBB_U32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_SUBB_U32(InFmt_VOP2*);
        ~Inst_VOP2__V_SUBB_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 2; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              case 3: //vdst
                return 4;
              case 4: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_SUBB_U32

    class Inst_VOP2__V_SUBBREV_U32 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_SUBBREV_U32(InFmt_VOP2*);
        ~Inst_VOP2__V_SUBBREV_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 2; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              case 3: //vdst
                return 4;
              case 4: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_SUBBREV_U32

    class Inst_VOP2__V_ADD_F16 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_ADD_F16(InFmt_VOP2*);
        ~Inst_VOP2__V_ADD_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_ADD_F16

    class Inst_VOP2__V_SUB_F16 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_SUB_F16(InFmt_VOP2*);
        ~Inst_VOP2__V_SUB_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_SUB_F16

    class Inst_VOP2__V_SUBREV_F16 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_SUBREV_F16(InFmt_VOP2*);
        ~Inst_VOP2__V_SUBREV_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_SUBREV_F16

    class Inst_VOP2__V_MUL_F16 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MUL_F16(InFmt_VOP2*);
        ~Inst_VOP2__V_MUL_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MUL_F16

    class Inst_VOP2__V_MAC_F16 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MAC_F16(InFmt_VOP2*);
        ~Inst_VOP2__V_MAC_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MAC_F16

    class Inst_VOP2__V_MADMK_F16 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MADMK_F16(InFmt_VOP2*);
        ~Inst_VOP2__V_MADMK_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //src_2
                return 2;
              case 3: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MADMK_F16

    class Inst_VOP2__V_MADAK_F16 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MADAK_F16(InFmt_VOP2*);
        ~Inst_VOP2__V_MADAK_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //src_2
                return 2;
              case 3: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MADAK_F16

    class Inst_VOP2__V_ADD_U16 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_ADD_U16(InFmt_VOP2*);
        ~Inst_VOP2__V_ADD_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_ADD_U16

    class Inst_VOP2__V_SUB_U16 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_SUB_U16(InFmt_VOP2*);
        ~Inst_VOP2__V_SUB_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_SUB_U16

    class Inst_VOP2__V_SUBREV_U16 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_SUBREV_U16(InFmt_VOP2*);
        ~Inst_VOP2__V_SUBREV_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_SUBREV_U16

    class Inst_VOP2__V_MUL_LO_U16 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MUL_LO_U16(InFmt_VOP2*);
        ~Inst_VOP2__V_MUL_LO_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MUL_LO_U16

    class Inst_VOP2__V_LSHLREV_B16 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_LSHLREV_B16(InFmt_VOP2*);
        ~Inst_VOP2__V_LSHLREV_B16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_LSHLREV_B16

    class Inst_VOP2__V_LSHRREV_B16 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_LSHRREV_B16(InFmt_VOP2*);
        ~Inst_VOP2__V_LSHRREV_B16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_LSHRREV_B16

    class Inst_VOP2__V_ASHRREV_I16 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_ASHRREV_I16(InFmt_VOP2*);
        ~Inst_VOP2__V_ASHRREV_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_ASHRREV_I16

    class Inst_VOP2__V_MAX_F16 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MAX_F16(InFmt_VOP2*);
        ~Inst_VOP2__V_MAX_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MAX_F16

    class Inst_VOP2__V_MIN_F16 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MIN_F16(InFmt_VOP2*);
        ~Inst_VOP2__V_MIN_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MIN_F16

    class Inst_VOP2__V_MAX_U16 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MAX_U16(InFmt_VOP2*);
        ~Inst_VOP2__V_MAX_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MAX_U16

    class Inst_VOP2__V_MAX_I16 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MAX_I16(InFmt_VOP2*);
        ~Inst_VOP2__V_MAX_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MAX_I16

    class Inst_VOP2__V_MIN_U16 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MIN_U16(InFmt_VOP2*);
        ~Inst_VOP2__V_MIN_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MIN_U16

    class Inst_VOP2__V_MIN_I16 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_MIN_I16(InFmt_VOP2*);
        ~Inst_VOP2__V_MIN_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_MIN_I16

    class Inst_VOP2__V_LDEXP_F16 : public Inst_VOP2
    {
      public:
        Inst_VOP2__V_LDEXP_F16(InFmt_VOP2*);
        ~Inst_VOP2__V_LDEXP_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP2__V_LDEXP_F16

    class Inst_VOP1__V_NOP : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_NOP(InFmt_VOP1*);
        ~Inst_VOP1__V_NOP();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_NOP

    class Inst_VOP1__V_MOV_B32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_MOV_B32(InFmt_VOP1*);
        ~Inst_VOP1__V_MOV_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_MOV_B32

    class Inst_VOP1__V_READFIRSTLANE_B32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_READFIRSTLANE_B32(InFmt_VOP1*);
        ~Inst_VOP1__V_READFIRSTLANE_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vsrc
                return 4;
              case 1: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_READFIRSTLANE_B32

    class Inst_VOP1__V_CVT_I32_F64 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_I32_F64(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_I32_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_I32_F64

    class Inst_VOP1__V_CVT_F64_I32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_F64_I32(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_F64_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_F64_I32

    class Inst_VOP1__V_CVT_F32_I32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_F32_I32(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_F32_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_F32_I32

    class Inst_VOP1__V_CVT_F32_U32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_F32_U32(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_F32_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_F32_U32

    class Inst_VOP1__V_CVT_U32_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_U32_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_U32_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_U32_F32

    class Inst_VOP1__V_CVT_I32_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_I32_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_I32_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_I32_F32

    class Inst_VOP1__V_MOV_FED_B32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_MOV_FED_B32(InFmt_VOP1*);
        ~Inst_VOP1__V_MOV_FED_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_MOV_FED_B32

    class Inst_VOP1__V_CVT_F16_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_F16_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_F16_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_F16_F32

    class Inst_VOP1__V_CVT_F32_F16 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_F32_F16(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_F32_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_F32_F16

    class Inst_VOP1__V_CVT_RPI_I32_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_RPI_I32_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_RPI_I32_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_RPI_I32_F32

    class Inst_VOP1__V_CVT_FLR_I32_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_FLR_I32_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_FLR_I32_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_FLR_I32_F32

    class Inst_VOP1__V_CVT_OFF_F32_I4 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_OFF_F32_I4(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_OFF_F32_I4();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_OFF_F32_I4

    class Inst_VOP1__V_CVT_F32_F64 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_F32_F64(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_F32_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_F32_F64

    class Inst_VOP1__V_CVT_F64_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_F64_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_F64_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_F64_F32

    class Inst_VOP1__V_CVT_F32_UBYTE0 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_F32_UBYTE0(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_F32_UBYTE0();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_F32_UBYTE0

    class Inst_VOP1__V_CVT_F32_UBYTE1 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_F32_UBYTE1(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_F32_UBYTE1();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_F32_UBYTE1

    class Inst_VOP1__V_CVT_F32_UBYTE2 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_F32_UBYTE2(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_F32_UBYTE2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_F32_UBYTE2

    class Inst_VOP1__V_CVT_F32_UBYTE3 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_F32_UBYTE3(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_F32_UBYTE3();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_F32_UBYTE3

    class Inst_VOP1__V_CVT_U32_F64 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_U32_F64(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_U32_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_U32_F64

    class Inst_VOP1__V_CVT_F64_U32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_F64_U32(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_F64_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_F64_U32

    class Inst_VOP1__V_TRUNC_F64 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_TRUNC_F64(InFmt_VOP1*);
        ~Inst_VOP1__V_TRUNC_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_TRUNC_F64

    class Inst_VOP1__V_CEIL_F64 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CEIL_F64(InFmt_VOP1*);
        ~Inst_VOP1__V_CEIL_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CEIL_F64

    class Inst_VOP1__V_RNDNE_F64 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_RNDNE_F64(InFmt_VOP1*);
        ~Inst_VOP1__V_RNDNE_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_RNDNE_F64

    class Inst_VOP1__V_FLOOR_F64 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_FLOOR_F64(InFmt_VOP1*);
        ~Inst_VOP1__V_FLOOR_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_FLOOR_F64

    class Inst_VOP1__V_FRACT_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_FRACT_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_FRACT_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_FRACT_F32

    class Inst_VOP1__V_TRUNC_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_TRUNC_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_TRUNC_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_TRUNC_F32

    class Inst_VOP1__V_CEIL_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CEIL_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_CEIL_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CEIL_F32

    class Inst_VOP1__V_RNDNE_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_RNDNE_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_RNDNE_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_RNDNE_F32

    class Inst_VOP1__V_FLOOR_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_FLOOR_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_FLOOR_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_FLOOR_F32

    class Inst_VOP1__V_EXP_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_EXP_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_EXP_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_EXP_F32

    class Inst_VOP1__V_LOG_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_LOG_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_LOG_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_LOG_F32

    class Inst_VOP1__V_RCP_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_RCP_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_RCP_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_RCP_F32

    class Inst_VOP1__V_RCP_IFLAG_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_RCP_IFLAG_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_RCP_IFLAG_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_RCP_IFLAG_F32

    class Inst_VOP1__V_RSQ_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_RSQ_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_RSQ_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_RSQ_F32

    class Inst_VOP1__V_RCP_F64 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_RCP_F64(InFmt_VOP1*);
        ~Inst_VOP1__V_RCP_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_RCP_F64

    class Inst_VOP1__V_RSQ_F64 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_RSQ_F64(InFmt_VOP1*);
        ~Inst_VOP1__V_RSQ_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_RSQ_F64

    class Inst_VOP1__V_SQRT_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_SQRT_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_SQRT_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_SQRT_F32

    class Inst_VOP1__V_SQRT_F64 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_SQRT_F64(InFmt_VOP1*);
        ~Inst_VOP1__V_SQRT_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_SQRT_F64

    class Inst_VOP1__V_SIN_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_SIN_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_SIN_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_SIN_F32

    class Inst_VOP1__V_COS_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_COS_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_COS_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_COS_F32

    class Inst_VOP1__V_NOT_B32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_NOT_B32(InFmt_VOP1*);
        ~Inst_VOP1__V_NOT_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_NOT_B32

    class Inst_VOP1__V_BFREV_B32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_BFREV_B32(InFmt_VOP1*);
        ~Inst_VOP1__V_BFREV_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_BFREV_B32

    class Inst_VOP1__V_FFBH_U32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_FFBH_U32(InFmt_VOP1*);
        ~Inst_VOP1__V_FFBH_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_FFBH_U32

    class Inst_VOP1__V_FFBL_B32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_FFBL_B32(InFmt_VOP1*);
        ~Inst_VOP1__V_FFBL_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_FFBL_B32

    class Inst_VOP1__V_FFBH_I32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_FFBH_I32(InFmt_VOP1*);
        ~Inst_VOP1__V_FFBH_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_FFBH_I32

    class Inst_VOP1__V_FREXP_EXP_I32_F64 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_FREXP_EXP_I32_F64(InFmt_VOP1*);
        ~Inst_VOP1__V_FREXP_EXP_I32_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_FREXP_EXP_I32_F64

    class Inst_VOP1__V_FREXP_MANT_F64 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_FREXP_MANT_F64(InFmt_VOP1*);
        ~Inst_VOP1__V_FREXP_MANT_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_FREXP_MANT_F64

    class Inst_VOP1__V_FRACT_F64 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_FRACT_F64(InFmt_VOP1*);
        ~Inst_VOP1__V_FRACT_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_FRACT_F64

    class Inst_VOP1__V_FREXP_EXP_I32_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_FREXP_EXP_I32_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_FREXP_EXP_I32_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_FREXP_EXP_I32_F32

    class Inst_VOP1__V_FREXP_MANT_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_FREXP_MANT_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_FREXP_MANT_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_FREXP_MANT_F32

    class Inst_VOP1__V_CLREXCP : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CLREXCP(InFmt_VOP1*);
        ~Inst_VOP1__V_CLREXCP();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CLREXCP

    class Inst_VOP1__V_CVT_F16_U16 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_F16_U16(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_F16_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_F16_U16

    class Inst_VOP1__V_CVT_F16_I16 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_F16_I16(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_F16_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_F16_I16

    class Inst_VOP1__V_CVT_U16_F16 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_U16_F16(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_U16_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_U16_F16

    class Inst_VOP1__V_CVT_I16_F16 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CVT_I16_F16(InFmt_VOP1*);
        ~Inst_VOP1__V_CVT_I16_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CVT_I16_F16

    class Inst_VOP1__V_RCP_F16 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_RCP_F16(InFmt_VOP1*);
        ~Inst_VOP1__V_RCP_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_RCP_F16

    class Inst_VOP1__V_SQRT_F16 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_SQRT_F16(InFmt_VOP1*);
        ~Inst_VOP1__V_SQRT_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_SQRT_F16

    class Inst_VOP1__V_RSQ_F16 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_RSQ_F16(InFmt_VOP1*);
        ~Inst_VOP1__V_RSQ_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_RSQ_F16

    class Inst_VOP1__V_LOG_F16 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_LOG_F16(InFmt_VOP1*);
        ~Inst_VOP1__V_LOG_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_LOG_F16

    class Inst_VOP1__V_EXP_F16 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_EXP_F16(InFmt_VOP1*);
        ~Inst_VOP1__V_EXP_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_EXP_F16

    class Inst_VOP1__V_FREXP_MANT_F16 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_FREXP_MANT_F16(InFmt_VOP1*);
        ~Inst_VOP1__V_FREXP_MANT_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_FREXP_MANT_F16

    class Inst_VOP1__V_FREXP_EXP_I16_F16 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_FREXP_EXP_I16_F16(InFmt_VOP1*);
        ~Inst_VOP1__V_FREXP_EXP_I16_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_FREXP_EXP_I16_F16

    class Inst_VOP1__V_FLOOR_F16 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_FLOOR_F16(InFmt_VOP1*);
        ~Inst_VOP1__V_FLOOR_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_FLOOR_F16

    class Inst_VOP1__V_CEIL_F16 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_CEIL_F16(InFmt_VOP1*);
        ~Inst_VOP1__V_CEIL_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_CEIL_F16

    class Inst_VOP1__V_TRUNC_F16 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_TRUNC_F16(InFmt_VOP1*);
        ~Inst_VOP1__V_TRUNC_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_TRUNC_F16

    class Inst_VOP1__V_RNDNE_F16 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_RNDNE_F16(InFmt_VOP1*);
        ~Inst_VOP1__V_RNDNE_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_RNDNE_F16

    class Inst_VOP1__V_FRACT_F16 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_FRACT_F16(InFmt_VOP1*);
        ~Inst_VOP1__V_FRACT_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_FRACT_F16

    class Inst_VOP1__V_SIN_F16 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_SIN_F16(InFmt_VOP1*);
        ~Inst_VOP1__V_SIN_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_SIN_F16

    class Inst_VOP1__V_COS_F16 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_COS_F16(InFmt_VOP1*);
        ~Inst_VOP1__V_COS_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_COS_F16

    class Inst_VOP1__V_EXP_LEGACY_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_EXP_LEGACY_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_EXP_LEGACY_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_EXP_LEGACY_F32

    class Inst_VOP1__V_LOG_LEGACY_F32 : public Inst_VOP1
    {
      public:
        Inst_VOP1__V_LOG_LEGACY_F32(InFmt_VOP1*);
        ~Inst_VOP1__V_LOG_LEGACY_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP1__V_LOG_LEGACY_F32

    class Inst_VOPC__V_CMP_CLASS_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_CLASS_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_CLASS_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_CLASS_F32

    class Inst_VOPC__V_CMPX_CLASS_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_CLASS_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_CLASS_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_CLASS_F32

    class Inst_VOPC__V_CMP_CLASS_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_CLASS_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_CLASS_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_CLASS_F64

    class Inst_VOPC__V_CMPX_CLASS_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_CLASS_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_CLASS_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_CLASS_F64

    class Inst_VOPC__V_CMP_CLASS_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_CLASS_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_CLASS_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_CLASS_F16

    class Inst_VOPC__V_CMPX_CLASS_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_CLASS_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_CLASS_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_CLASS_F16

    class Inst_VOPC__V_CMP_F_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_F_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_F_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_F_F16

    class Inst_VOPC__V_CMP_LT_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_LT_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_LT_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_LT_F16

    class Inst_VOPC__V_CMP_EQ_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_EQ_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_EQ_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_EQ_F16

    class Inst_VOPC__V_CMP_LE_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_LE_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_LE_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_LE_F16

    class Inst_VOPC__V_CMP_GT_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_GT_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_GT_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_GT_F16

    class Inst_VOPC__V_CMP_LG_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_LG_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_LG_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_LG_F16

    class Inst_VOPC__V_CMP_GE_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_GE_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_GE_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_GE_F16

    class Inst_VOPC__V_CMP_O_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_O_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_O_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_O_F16

    class Inst_VOPC__V_CMP_U_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_U_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_U_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_U_F16

    class Inst_VOPC__V_CMP_NGE_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NGE_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NGE_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NGE_F16

    class Inst_VOPC__V_CMP_NLG_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NLG_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NLG_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NLG_F16

    class Inst_VOPC__V_CMP_NGT_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NGT_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NGT_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NGT_F16

    class Inst_VOPC__V_CMP_NLE_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NLE_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NLE_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NLE_F16

    class Inst_VOPC__V_CMP_NEQ_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NEQ_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NEQ_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NEQ_F16

    class Inst_VOPC__V_CMP_NLT_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NLT_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NLT_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NLT_F16

    class Inst_VOPC__V_CMP_TRU_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_TRU_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_TRU_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_TRU_F16

    class Inst_VOPC__V_CMPX_F_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_F_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_F_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_F_F16

    class Inst_VOPC__V_CMPX_LT_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_LT_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_LT_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_LT_F16

    class Inst_VOPC__V_CMPX_EQ_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_EQ_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_EQ_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_EQ_F16

    class Inst_VOPC__V_CMPX_LE_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_LE_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_LE_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_LE_F16

    class Inst_VOPC__V_CMPX_GT_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_GT_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_GT_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_GT_F16

    class Inst_VOPC__V_CMPX_LG_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_LG_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_LG_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_LG_F16

    class Inst_VOPC__V_CMPX_GE_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_GE_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_GE_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_GE_F16

    class Inst_VOPC__V_CMPX_O_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_O_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_O_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_O_F16

    class Inst_VOPC__V_CMPX_U_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_U_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_U_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_U_F16

    class Inst_VOPC__V_CMPX_NGE_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NGE_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NGE_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NGE_F16

    class Inst_VOPC__V_CMPX_NLG_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NLG_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NLG_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NLG_F16

    class Inst_VOPC__V_CMPX_NGT_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NGT_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NGT_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NGT_F16

    class Inst_VOPC__V_CMPX_NLE_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NLE_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NLE_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NLE_F16

    class Inst_VOPC__V_CMPX_NEQ_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NEQ_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NEQ_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NEQ_F16

    class Inst_VOPC__V_CMPX_NLT_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NLT_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NLT_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NLT_F16

    class Inst_VOPC__V_CMPX_TRU_F16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_TRU_F16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_TRU_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_TRU_F16

    class Inst_VOPC__V_CMP_F_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_F_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_F_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_F_F32

    class Inst_VOPC__V_CMP_LT_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_LT_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_LT_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_LT_F32

    class Inst_VOPC__V_CMP_EQ_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_EQ_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_EQ_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_EQ_F32

    class Inst_VOPC__V_CMP_LE_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_LE_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_LE_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_LE_F32

    class Inst_VOPC__V_CMP_GT_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_GT_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_GT_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_GT_F32

    class Inst_VOPC__V_CMP_LG_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_LG_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_LG_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_LG_F32

    class Inst_VOPC__V_CMP_GE_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_GE_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_GE_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_GE_F32

    class Inst_VOPC__V_CMP_O_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_O_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_O_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_O_F32

    class Inst_VOPC__V_CMP_U_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_U_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_U_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_U_F32

    class Inst_VOPC__V_CMP_NGE_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NGE_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NGE_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NGE_F32

    class Inst_VOPC__V_CMP_NLG_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NLG_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NLG_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NLG_F32

    class Inst_VOPC__V_CMP_NGT_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NGT_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NGT_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NGT_F32

    class Inst_VOPC__V_CMP_NLE_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NLE_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NLE_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NLE_F32

    class Inst_VOPC__V_CMP_NEQ_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NEQ_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NEQ_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NEQ_F32

    class Inst_VOPC__V_CMP_NLT_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NLT_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NLT_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NLT_F32

    class Inst_VOPC__V_CMP_TRU_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_TRU_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_TRU_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_TRU_F32

    class Inst_VOPC__V_CMPX_F_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_F_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_F_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_F_F32

    class Inst_VOPC__V_CMPX_LT_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_LT_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_LT_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_LT_F32

    class Inst_VOPC__V_CMPX_EQ_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_EQ_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_EQ_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_EQ_F32

    class Inst_VOPC__V_CMPX_LE_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_LE_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_LE_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_LE_F32

    class Inst_VOPC__V_CMPX_GT_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_GT_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_GT_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_GT_F32

    class Inst_VOPC__V_CMPX_LG_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_LG_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_LG_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_LG_F32

    class Inst_VOPC__V_CMPX_GE_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_GE_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_GE_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_GE_F32

    class Inst_VOPC__V_CMPX_O_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_O_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_O_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_O_F32

    class Inst_VOPC__V_CMPX_U_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_U_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_U_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_U_F32

    class Inst_VOPC__V_CMPX_NGE_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NGE_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NGE_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NGE_F32

    class Inst_VOPC__V_CMPX_NLG_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NLG_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NLG_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NLG_F32

    class Inst_VOPC__V_CMPX_NGT_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NGT_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NGT_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NGT_F32

    class Inst_VOPC__V_CMPX_NLE_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NLE_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NLE_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NLE_F32

    class Inst_VOPC__V_CMPX_NEQ_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NEQ_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NEQ_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NEQ_F32

    class Inst_VOPC__V_CMPX_NLT_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NLT_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NLT_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NLT_F32

    class Inst_VOPC__V_CMPX_TRU_F32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_TRU_F32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_TRU_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_TRU_F32

    class Inst_VOPC__V_CMP_F_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_F_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_F_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_F_F64

    class Inst_VOPC__V_CMP_LT_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_LT_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_LT_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_LT_F64

    class Inst_VOPC__V_CMP_EQ_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_EQ_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_EQ_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_EQ_F64

    class Inst_VOPC__V_CMP_LE_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_LE_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_LE_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_LE_F64

    class Inst_VOPC__V_CMP_GT_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_GT_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_GT_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_GT_F64

    class Inst_VOPC__V_CMP_LG_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_LG_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_LG_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_LG_F64

    class Inst_VOPC__V_CMP_GE_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_GE_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_GE_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_GE_F64

    class Inst_VOPC__V_CMP_O_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_O_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_O_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_O_F64

    class Inst_VOPC__V_CMP_U_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_U_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_U_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_U_F64

    class Inst_VOPC__V_CMP_NGE_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NGE_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NGE_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NGE_F64

    class Inst_VOPC__V_CMP_NLG_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NLG_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NLG_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NLG_F64

    class Inst_VOPC__V_CMP_NGT_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NGT_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NGT_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NGT_F64

    class Inst_VOPC__V_CMP_NLE_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NLE_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NLE_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NLE_F64

    class Inst_VOPC__V_CMP_NEQ_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NEQ_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NEQ_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NEQ_F64

    class Inst_VOPC__V_CMP_NLT_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NLT_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NLT_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NLT_F64

    class Inst_VOPC__V_CMP_TRU_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_TRU_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_TRU_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_TRU_F64

    class Inst_VOPC__V_CMPX_F_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_F_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_F_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_F_F64

    class Inst_VOPC__V_CMPX_LT_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_LT_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_LT_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_LT_F64

    class Inst_VOPC__V_CMPX_EQ_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_EQ_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_EQ_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_EQ_F64

    class Inst_VOPC__V_CMPX_LE_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_LE_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_LE_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_LE_F64

    class Inst_VOPC__V_CMPX_GT_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_GT_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_GT_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_GT_F64

    class Inst_VOPC__V_CMPX_LG_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_LG_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_LG_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_LG_F64

    class Inst_VOPC__V_CMPX_GE_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_GE_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_GE_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_GE_F64

    class Inst_VOPC__V_CMPX_O_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_O_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_O_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_O_F64

    class Inst_VOPC__V_CMPX_U_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_U_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_U_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_U_F64

    class Inst_VOPC__V_CMPX_NGE_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NGE_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NGE_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NGE_F64

    class Inst_VOPC__V_CMPX_NLG_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NLG_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NLG_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NLG_F64

    class Inst_VOPC__V_CMPX_NGT_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NGT_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NGT_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NGT_F64

    class Inst_VOPC__V_CMPX_NLE_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NLE_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NLE_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NLE_F64

    class Inst_VOPC__V_CMPX_NEQ_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NEQ_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NEQ_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NEQ_F64

    class Inst_VOPC__V_CMPX_NLT_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NLT_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NLT_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NLT_F64

    class Inst_VOPC__V_CMPX_TRU_F64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_TRU_F64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_TRU_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_TRU_F64

    class Inst_VOPC__V_CMP_F_I16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_F_I16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_F_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_F_I16

    class Inst_VOPC__V_CMP_LT_I16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_LT_I16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_LT_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_LT_I16

    class Inst_VOPC__V_CMP_EQ_I16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_EQ_I16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_EQ_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_EQ_I16

    class Inst_VOPC__V_CMP_LE_I16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_LE_I16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_LE_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_LE_I16

    class Inst_VOPC__V_CMP_GT_I16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_GT_I16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_GT_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_GT_I16

    class Inst_VOPC__V_CMP_NE_I16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NE_I16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NE_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NE_I16

    class Inst_VOPC__V_CMP_GE_I16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_GE_I16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_GE_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_GE_I16

    class Inst_VOPC__V_CMP_T_I16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_T_I16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_T_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_T_I16

    class Inst_VOPC__V_CMP_F_U16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_F_U16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_F_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_F_U16

    class Inst_VOPC__V_CMP_LT_U16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_LT_U16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_LT_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_LT_U16

    class Inst_VOPC__V_CMP_EQ_U16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_EQ_U16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_EQ_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_EQ_U16

    class Inst_VOPC__V_CMP_LE_U16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_LE_U16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_LE_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_LE_U16

    class Inst_VOPC__V_CMP_GT_U16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_GT_U16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_GT_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_GT_U16

    class Inst_VOPC__V_CMP_NE_U16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NE_U16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NE_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NE_U16

    class Inst_VOPC__V_CMP_GE_U16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_GE_U16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_GE_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_GE_U16

    class Inst_VOPC__V_CMP_T_U16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_T_U16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_T_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_T_U16

    class Inst_VOPC__V_CMPX_F_I16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_F_I16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_F_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_F_I16

    class Inst_VOPC__V_CMPX_LT_I16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_LT_I16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_LT_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_LT_I16

    class Inst_VOPC__V_CMPX_EQ_I16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_EQ_I16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_EQ_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_EQ_I16

    class Inst_VOPC__V_CMPX_LE_I16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_LE_I16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_LE_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_LE_I16

    class Inst_VOPC__V_CMPX_GT_I16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_GT_I16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_GT_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_GT_I16

    class Inst_VOPC__V_CMPX_NE_I16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NE_I16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NE_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NE_I16

    class Inst_VOPC__V_CMPX_GE_I16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_GE_I16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_GE_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_GE_I16

    class Inst_VOPC__V_CMPX_T_I16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_T_I16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_T_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_T_I16

    class Inst_VOPC__V_CMPX_F_U16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_F_U16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_F_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_F_U16

    class Inst_VOPC__V_CMPX_LT_U16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_LT_U16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_LT_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_LT_U16

    class Inst_VOPC__V_CMPX_EQ_U16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_EQ_U16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_EQ_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_EQ_U16

    class Inst_VOPC__V_CMPX_LE_U16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_LE_U16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_LE_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_LE_U16

    class Inst_VOPC__V_CMPX_GT_U16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_GT_U16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_GT_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_GT_U16

    class Inst_VOPC__V_CMPX_NE_U16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NE_U16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NE_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NE_U16

    class Inst_VOPC__V_CMPX_GE_U16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_GE_U16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_GE_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_GE_U16

    class Inst_VOPC__V_CMPX_T_U16 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_T_U16(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_T_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_T_U16

    class Inst_VOPC__V_CMP_F_I32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_F_I32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_F_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_F_I32

    class Inst_VOPC__V_CMP_LT_I32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_LT_I32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_LT_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_LT_I32

    class Inst_VOPC__V_CMP_EQ_I32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_EQ_I32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_EQ_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_EQ_I32

    class Inst_VOPC__V_CMP_LE_I32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_LE_I32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_LE_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_LE_I32

    class Inst_VOPC__V_CMP_GT_I32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_GT_I32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_GT_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_GT_I32

    class Inst_VOPC__V_CMP_NE_I32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NE_I32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NE_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NE_I32

    class Inst_VOPC__V_CMP_GE_I32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_GE_I32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_GE_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_GE_I32

    class Inst_VOPC__V_CMP_T_I32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_T_I32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_T_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_T_I32

    class Inst_VOPC__V_CMP_F_U32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_F_U32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_F_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_F_U32

    class Inst_VOPC__V_CMP_LT_U32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_LT_U32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_LT_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_LT_U32

    class Inst_VOPC__V_CMP_EQ_U32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_EQ_U32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_EQ_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_EQ_U32

    class Inst_VOPC__V_CMP_LE_U32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_LE_U32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_LE_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_LE_U32

    class Inst_VOPC__V_CMP_GT_U32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_GT_U32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_GT_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_GT_U32

    class Inst_VOPC__V_CMP_NE_U32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NE_U32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NE_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NE_U32

    class Inst_VOPC__V_CMP_GE_U32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_GE_U32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_GE_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_GE_U32

    class Inst_VOPC__V_CMP_T_U32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_T_U32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_T_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_T_U32

    class Inst_VOPC__V_CMPX_F_I32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_F_I32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_F_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_F_I32

    class Inst_VOPC__V_CMPX_LT_I32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_LT_I32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_LT_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_LT_I32

    class Inst_VOPC__V_CMPX_EQ_I32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_EQ_I32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_EQ_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_EQ_I32

    class Inst_VOPC__V_CMPX_LE_I32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_LE_I32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_LE_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_LE_I32

    class Inst_VOPC__V_CMPX_GT_I32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_GT_I32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_GT_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_GT_I32

    class Inst_VOPC__V_CMPX_NE_I32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NE_I32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NE_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NE_I32

    class Inst_VOPC__V_CMPX_GE_I32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_GE_I32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_GE_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_GE_I32

    class Inst_VOPC__V_CMPX_T_I32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_T_I32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_T_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_T_I32

    class Inst_VOPC__V_CMPX_F_U32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_F_U32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_F_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_F_U32

    class Inst_VOPC__V_CMPX_LT_U32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_LT_U32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_LT_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_LT_U32

    class Inst_VOPC__V_CMPX_EQ_U32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_EQ_U32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_EQ_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_EQ_U32

    class Inst_VOPC__V_CMPX_LE_U32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_LE_U32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_LE_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_LE_U32

    class Inst_VOPC__V_CMPX_GT_U32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_GT_U32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_GT_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_GT_U32

    class Inst_VOPC__V_CMPX_NE_U32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NE_U32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NE_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NE_U32

    class Inst_VOPC__V_CMPX_GE_U32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_GE_U32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_GE_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_GE_U32

    class Inst_VOPC__V_CMPX_T_U32 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_T_U32(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_T_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_T_U32

    class Inst_VOPC__V_CMP_F_I64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_F_I64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_F_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_F_I64

    class Inst_VOPC__V_CMP_LT_I64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_LT_I64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_LT_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_LT_I64

    class Inst_VOPC__V_CMP_EQ_I64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_EQ_I64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_EQ_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_EQ_I64

    class Inst_VOPC__V_CMP_LE_I64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_LE_I64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_LE_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_LE_I64

    class Inst_VOPC__V_CMP_GT_I64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_GT_I64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_GT_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_GT_I64

    class Inst_VOPC__V_CMP_NE_I64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NE_I64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NE_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NE_I64

    class Inst_VOPC__V_CMP_GE_I64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_GE_I64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_GE_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_GE_I64

    class Inst_VOPC__V_CMP_T_I64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_T_I64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_T_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_T_I64

    class Inst_VOPC__V_CMP_F_U64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_F_U64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_F_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_F_U64

    class Inst_VOPC__V_CMP_LT_U64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_LT_U64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_LT_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_LT_U64

    class Inst_VOPC__V_CMP_EQ_U64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_EQ_U64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_EQ_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_EQ_U64

    class Inst_VOPC__V_CMP_LE_U64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_LE_U64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_LE_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_LE_U64

    class Inst_VOPC__V_CMP_GT_U64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_GT_U64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_GT_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_GT_U64

    class Inst_VOPC__V_CMP_NE_U64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_NE_U64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_NE_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_NE_U64

    class Inst_VOPC__V_CMP_GE_U64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_GE_U64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_GE_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_GE_U64

    class Inst_VOPC__V_CMP_T_U64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMP_T_U64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMP_T_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMP_T_U64

    class Inst_VOPC__V_CMPX_F_I64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_F_I64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_F_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_F_I64

    class Inst_VOPC__V_CMPX_LT_I64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_LT_I64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_LT_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_LT_I64

    class Inst_VOPC__V_CMPX_EQ_I64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_EQ_I64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_EQ_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_EQ_I64

    class Inst_VOPC__V_CMPX_LE_I64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_LE_I64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_LE_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_LE_I64

    class Inst_VOPC__V_CMPX_GT_I64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_GT_I64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_GT_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_GT_I64

    class Inst_VOPC__V_CMPX_NE_I64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NE_I64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NE_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NE_I64

    class Inst_VOPC__V_CMPX_GE_I64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_GE_I64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_GE_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_GE_I64

    class Inst_VOPC__V_CMPX_T_I64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_T_I64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_T_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_T_I64

    class Inst_VOPC__V_CMPX_F_U64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_F_U64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_F_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_F_U64

    class Inst_VOPC__V_CMPX_LT_U64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_LT_U64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_LT_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_LT_U64

    class Inst_VOPC__V_CMPX_EQ_U64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_EQ_U64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_EQ_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_EQ_U64

    class Inst_VOPC__V_CMPX_LE_U64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_LE_U64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_LE_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_LE_U64

    class Inst_VOPC__V_CMPX_GT_U64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_GT_U64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_GT_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_GT_U64

    class Inst_VOPC__V_CMPX_NE_U64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_NE_U64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_NE_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_NE_U64

    class Inst_VOPC__V_CMPX_GE_U64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_GE_U64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_GE_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_GE_U64

    class Inst_VOPC__V_CMPX_T_U64 : public Inst_VOPC
    {
      public:
        Inst_VOPC__V_CMPX_T_U64(InFmt_VOPC*);
        ~Inst_VOPC__V_CMPX_T_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOPC__V_CMPX_T_U64

    class Inst_VINTRP__V_INTERP_P1_F32 : public Inst_VINTRP
    {
      public:
        Inst_VINTRP__V_INTERP_P1_F32(InFmt_VINTRP*);
        ~Inst_VINTRP__V_INTERP_P1_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_ij
                return 4;
              case 1: //attr
                return 16;
              case 2: //vgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VINTRP__V_INTERP_P1_F32

    class Inst_VINTRP__V_INTERP_P2_F32 : public Inst_VINTRP
    {
      public:
        Inst_VINTRP__V_INTERP_P2_F32(InFmt_VINTRP*);
        ~Inst_VINTRP__V_INTERP_P2_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_ij
                return 4;
              case 1: //attr
                return 16;
              case 2: //vgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VINTRP__V_INTERP_P2_F32

    class Inst_VINTRP__V_INTERP_MOV_F32 : public Inst_VINTRP
    {
      public:
        Inst_VINTRP__V_INTERP_MOV_F32(InFmt_VINTRP*);
        ~Inst_VINTRP__V_INTERP_MOV_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //param
                return 4;
              case 1: //attr
                return 16;
              case 2: //vgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VINTRP__V_INTERP_MOV_F32

    class Inst_VOP3__V_CMP_CLASS_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_CLASS_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_CLASS_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_CLASS_F32

    class Inst_VOP3__V_CMPX_CLASS_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_CLASS_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_CLASS_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_CLASS_F32

    class Inst_VOP3__V_CMP_CLASS_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_CLASS_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_CLASS_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_CLASS_F64

    class Inst_VOP3__V_CMPX_CLASS_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_CLASS_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_CLASS_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_CLASS_F64

    class Inst_VOP3__V_CMP_CLASS_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_CLASS_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_CLASS_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_CLASS_F16

    class Inst_VOP3__V_CMPX_CLASS_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_CLASS_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_CLASS_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_CLASS_F16

    class Inst_VOP3__V_CMP_F_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_F_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_F_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_F_F16

    class Inst_VOP3__V_CMP_LT_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_LT_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_LT_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_LT_F16

    class Inst_VOP3__V_CMP_EQ_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_EQ_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_EQ_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_EQ_F16

    class Inst_VOP3__V_CMP_LE_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_LE_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_LE_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_LE_F16

    class Inst_VOP3__V_CMP_GT_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_GT_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_GT_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_GT_F16

    class Inst_VOP3__V_CMP_LG_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_LG_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_LG_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_LG_F16

    class Inst_VOP3__V_CMP_GE_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_GE_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_GE_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_GE_F16

    class Inst_VOP3__V_CMP_O_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_O_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_O_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_O_F16

    class Inst_VOP3__V_CMP_U_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_U_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_U_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_U_F16

    class Inst_VOP3__V_CMP_NGE_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NGE_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NGE_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NGE_F16

    class Inst_VOP3__V_CMP_NLG_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NLG_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NLG_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NLG_F16

    class Inst_VOP3__V_CMP_NGT_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NGT_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NGT_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NGT_F16

    class Inst_VOP3__V_CMP_NLE_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NLE_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NLE_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NLE_F16

    class Inst_VOP3__V_CMP_NEQ_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NEQ_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NEQ_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NEQ_F16

    class Inst_VOP3__V_CMP_NLT_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NLT_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NLT_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NLT_F16

    class Inst_VOP3__V_CMP_TRU_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_TRU_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_TRU_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_TRU_F16

    class Inst_VOP3__V_CMPX_F_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_F_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_F_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_F_F16

    class Inst_VOP3__V_CMPX_LT_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_LT_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_LT_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_LT_F16

    class Inst_VOP3__V_CMPX_EQ_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_EQ_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_EQ_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_EQ_F16

    class Inst_VOP3__V_CMPX_LE_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_LE_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_LE_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_LE_F16

    class Inst_VOP3__V_CMPX_GT_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_GT_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_GT_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_GT_F16

    class Inst_VOP3__V_CMPX_LG_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_LG_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_LG_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_LG_F16

    class Inst_VOP3__V_CMPX_GE_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_GE_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_GE_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_GE_F16

    class Inst_VOP3__V_CMPX_O_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_O_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_O_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_O_F16

    class Inst_VOP3__V_CMPX_U_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_U_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_U_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_U_F16

    class Inst_VOP3__V_CMPX_NGE_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NGE_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NGE_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NGE_F16

    class Inst_VOP3__V_CMPX_NLG_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NLG_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NLG_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NLG_F16

    class Inst_VOP3__V_CMPX_NGT_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NGT_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NGT_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NGT_F16

    class Inst_VOP3__V_CMPX_NLE_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NLE_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NLE_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NLE_F16

    class Inst_VOP3__V_CMPX_NEQ_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NEQ_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NEQ_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NEQ_F16

    class Inst_VOP3__V_CMPX_NLT_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NLT_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NLT_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NLT_F16

    class Inst_VOP3__V_CMPX_TRU_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_TRU_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_TRU_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_TRU_F16

    class Inst_VOP3__V_CMP_F_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_F_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_F_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_F_F32

    class Inst_VOP3__V_CMP_LT_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_LT_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_LT_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_LT_F32

    class Inst_VOP3__V_CMP_EQ_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_EQ_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_EQ_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_EQ_F32

    class Inst_VOP3__V_CMP_LE_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_LE_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_LE_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_LE_F32

    class Inst_VOP3__V_CMP_GT_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_GT_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_GT_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_GT_F32

    class Inst_VOP3__V_CMP_LG_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_LG_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_LG_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_LG_F32

    class Inst_VOP3__V_CMP_GE_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_GE_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_GE_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_GE_F32

    class Inst_VOP3__V_CMP_O_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_O_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_O_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_O_F32

    class Inst_VOP3__V_CMP_U_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_U_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_U_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_U_F32

    class Inst_VOP3__V_CMP_NGE_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NGE_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NGE_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NGE_F32

    class Inst_VOP3__V_CMP_NLG_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NLG_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NLG_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NLG_F32

    class Inst_VOP3__V_CMP_NGT_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NGT_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NGT_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NGT_F32

    class Inst_VOP3__V_CMP_NLE_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NLE_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NLE_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NLE_F32

    class Inst_VOP3__V_CMP_NEQ_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NEQ_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NEQ_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NEQ_F32

    class Inst_VOP3__V_CMP_NLT_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NLT_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NLT_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NLT_F32

    class Inst_VOP3__V_CMP_TRU_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_TRU_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_TRU_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_TRU_F32

    class Inst_VOP3__V_CMPX_F_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_F_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_F_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_F_F32

    class Inst_VOP3__V_CMPX_LT_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_LT_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_LT_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_LT_F32

    class Inst_VOP3__V_CMPX_EQ_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_EQ_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_EQ_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_EQ_F32

    class Inst_VOP3__V_CMPX_LE_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_LE_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_LE_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_LE_F32

    class Inst_VOP3__V_CMPX_GT_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_GT_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_GT_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_GT_F32

    class Inst_VOP3__V_CMPX_LG_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_LG_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_LG_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_LG_F32

    class Inst_VOP3__V_CMPX_GE_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_GE_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_GE_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_GE_F32

    class Inst_VOP3__V_CMPX_O_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_O_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_O_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_O_F32

    class Inst_VOP3__V_CMPX_U_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_U_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_U_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_U_F32

    class Inst_VOP3__V_CMPX_NGE_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NGE_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NGE_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NGE_F32

    class Inst_VOP3__V_CMPX_NLG_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NLG_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NLG_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NLG_F32

    class Inst_VOP3__V_CMPX_NGT_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NGT_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NGT_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NGT_F32

    class Inst_VOP3__V_CMPX_NLE_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NLE_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NLE_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NLE_F32

    class Inst_VOP3__V_CMPX_NEQ_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NEQ_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NEQ_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NEQ_F32

    class Inst_VOP3__V_CMPX_NLT_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NLT_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NLT_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NLT_F32

    class Inst_VOP3__V_CMPX_TRU_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_TRU_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_TRU_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_TRU_F32

    class Inst_VOP3__V_CMP_F_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_F_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_F_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_F_F64

    class Inst_VOP3__V_CMP_LT_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_LT_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_LT_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_LT_F64

    class Inst_VOP3__V_CMP_EQ_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_EQ_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_EQ_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_EQ_F64

    class Inst_VOP3__V_CMP_LE_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_LE_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_LE_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_LE_F64

    class Inst_VOP3__V_CMP_GT_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_GT_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_GT_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_GT_F64

    class Inst_VOP3__V_CMP_LG_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_LG_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_LG_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_LG_F64

    class Inst_VOP3__V_CMP_GE_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_GE_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_GE_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_GE_F64

    class Inst_VOP3__V_CMP_O_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_O_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_O_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_O_F64

    class Inst_VOP3__V_CMP_U_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_U_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_U_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_U_F64

    class Inst_VOP3__V_CMP_NGE_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NGE_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NGE_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NGE_F64

    class Inst_VOP3__V_CMP_NLG_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NLG_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NLG_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NLG_F64

    class Inst_VOP3__V_CMP_NGT_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NGT_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NGT_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NGT_F64

    class Inst_VOP3__V_CMP_NLE_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NLE_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NLE_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NLE_F64

    class Inst_VOP3__V_CMP_NEQ_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NEQ_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NEQ_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NEQ_F64

    class Inst_VOP3__V_CMP_NLT_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NLT_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NLT_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NLT_F64

    class Inst_VOP3__V_CMP_TRU_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_TRU_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_TRU_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_TRU_F64

    class Inst_VOP3__V_CMPX_F_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_F_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_F_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_F_F64

    class Inst_VOP3__V_CMPX_LT_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_LT_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_LT_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_LT_F64

    class Inst_VOP3__V_CMPX_EQ_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_EQ_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_EQ_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_EQ_F64

    class Inst_VOP3__V_CMPX_LE_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_LE_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_LE_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_LE_F64

    class Inst_VOP3__V_CMPX_GT_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_GT_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_GT_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_GT_F64

    class Inst_VOP3__V_CMPX_LG_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_LG_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_LG_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_LG_F64

    class Inst_VOP3__V_CMPX_GE_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_GE_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_GE_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_GE_F64

    class Inst_VOP3__V_CMPX_O_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_O_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_O_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_O_F64

    class Inst_VOP3__V_CMPX_U_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_U_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_U_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_U_F64

    class Inst_VOP3__V_CMPX_NGE_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NGE_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NGE_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NGE_F64

    class Inst_VOP3__V_CMPX_NLG_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NLG_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NLG_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NLG_F64

    class Inst_VOP3__V_CMPX_NGT_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NGT_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NGT_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NGT_F64

    class Inst_VOP3__V_CMPX_NLE_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NLE_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NLE_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NLE_F64

    class Inst_VOP3__V_CMPX_NEQ_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NEQ_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NEQ_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NEQ_F64

    class Inst_VOP3__V_CMPX_NLT_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NLT_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NLT_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NLT_F64

    class Inst_VOP3__V_CMPX_TRU_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_TRU_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_TRU_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_TRU_F64

    class Inst_VOP3__V_CMP_F_I16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_F_I16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_F_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_F_I16

    class Inst_VOP3__V_CMP_LT_I16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_LT_I16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_LT_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_LT_I16

    class Inst_VOP3__V_CMP_EQ_I16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_EQ_I16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_EQ_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_EQ_I16

    class Inst_VOP3__V_CMP_LE_I16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_LE_I16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_LE_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_LE_I16

    class Inst_VOP3__V_CMP_GT_I16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_GT_I16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_GT_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_GT_I16

    class Inst_VOP3__V_CMP_NE_I16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NE_I16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NE_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NE_I16

    class Inst_VOP3__V_CMP_GE_I16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_GE_I16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_GE_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_GE_I16

    class Inst_VOP3__V_CMP_T_I16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_T_I16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_T_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_T_I16

    class Inst_VOP3__V_CMP_F_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_F_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_F_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_F_U16

    class Inst_VOP3__V_CMP_LT_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_LT_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_LT_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_LT_U16

    class Inst_VOP3__V_CMP_EQ_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_EQ_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_EQ_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_EQ_U16

    class Inst_VOP3__V_CMP_LE_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_LE_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_LE_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_LE_U16

    class Inst_VOP3__V_CMP_GT_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_GT_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_GT_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_GT_U16

    class Inst_VOP3__V_CMP_NE_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NE_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NE_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NE_U16

    class Inst_VOP3__V_CMP_GE_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_GE_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_GE_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_GE_U16

    class Inst_VOP3__V_CMP_T_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_T_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_T_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_T_U16

    class Inst_VOP3__V_CMPX_F_I16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_F_I16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_F_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_F_I16

    class Inst_VOP3__V_CMPX_LT_I16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_LT_I16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_LT_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_LT_I16

    class Inst_VOP3__V_CMPX_EQ_I16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_EQ_I16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_EQ_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_EQ_I16

    class Inst_VOP3__V_CMPX_LE_I16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_LE_I16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_LE_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_LE_I16

    class Inst_VOP3__V_CMPX_GT_I16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_GT_I16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_GT_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_GT_I16

    class Inst_VOP3__V_CMPX_NE_I16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NE_I16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NE_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NE_I16

    class Inst_VOP3__V_CMPX_GE_I16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_GE_I16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_GE_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_GE_I16

    class Inst_VOP3__V_CMPX_T_I16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_T_I16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_T_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_T_I16

    class Inst_VOP3__V_CMPX_F_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_F_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_F_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_F_U16

    class Inst_VOP3__V_CMPX_LT_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_LT_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_LT_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_LT_U16

    class Inst_VOP3__V_CMPX_EQ_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_EQ_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_EQ_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_EQ_U16

    class Inst_VOP3__V_CMPX_LE_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_LE_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_LE_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_LE_U16

    class Inst_VOP3__V_CMPX_GT_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_GT_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_GT_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_GT_U16

    class Inst_VOP3__V_CMPX_NE_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NE_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NE_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NE_U16

    class Inst_VOP3__V_CMPX_GE_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_GE_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_GE_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_GE_U16

    class Inst_VOP3__V_CMPX_T_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_T_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_T_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_T_U16

    class Inst_VOP3__V_CMP_F_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_F_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_F_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_F_I32

    class Inst_VOP3__V_CMP_LT_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_LT_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_LT_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_LT_I32

    class Inst_VOP3__V_CMP_EQ_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_EQ_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_EQ_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_EQ_I32

    class Inst_VOP3__V_CMP_LE_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_LE_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_LE_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_LE_I32

    class Inst_VOP3__V_CMP_GT_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_GT_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_GT_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_GT_I32

    class Inst_VOP3__V_CMP_NE_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NE_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NE_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NE_I32

    class Inst_VOP3__V_CMP_GE_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_GE_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_GE_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_GE_I32

    class Inst_VOP3__V_CMP_T_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_T_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_T_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_T_I32

    class Inst_VOP3__V_CMP_F_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_F_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_F_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_F_U32

    class Inst_VOP3__V_CMP_LT_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_LT_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_LT_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_LT_U32

    class Inst_VOP3__V_CMP_EQ_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_EQ_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_EQ_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_EQ_U32

    class Inst_VOP3__V_CMP_LE_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_LE_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_LE_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_LE_U32

    class Inst_VOP3__V_CMP_GT_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_GT_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_GT_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_GT_U32

    class Inst_VOP3__V_CMP_NE_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NE_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NE_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NE_U32

    class Inst_VOP3__V_CMP_GE_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_GE_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_GE_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_GE_U32

    class Inst_VOP3__V_CMP_T_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_T_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_T_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_T_U32

    class Inst_VOP3__V_CMPX_F_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_F_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_F_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_F_I32

    class Inst_VOP3__V_CMPX_LT_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_LT_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_LT_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_LT_I32

    class Inst_VOP3__V_CMPX_EQ_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_EQ_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_EQ_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_EQ_I32

    class Inst_VOP3__V_CMPX_LE_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_LE_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_LE_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_LE_I32

    class Inst_VOP3__V_CMPX_GT_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_GT_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_GT_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_GT_I32

    class Inst_VOP3__V_CMPX_NE_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NE_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NE_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NE_I32

    class Inst_VOP3__V_CMPX_GE_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_GE_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_GE_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_GE_I32

    class Inst_VOP3__V_CMPX_T_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_T_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_T_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_T_I32

    class Inst_VOP3__V_CMPX_F_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_F_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_F_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_F_U32

    class Inst_VOP3__V_CMPX_LT_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_LT_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_LT_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_LT_U32

    class Inst_VOP3__V_CMPX_EQ_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_EQ_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_EQ_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_EQ_U32

    class Inst_VOP3__V_CMPX_LE_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_LE_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_LE_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_LE_U32

    class Inst_VOP3__V_CMPX_GT_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_GT_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_GT_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_GT_U32

    class Inst_VOP3__V_CMPX_NE_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NE_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NE_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NE_U32

    class Inst_VOP3__V_CMPX_GE_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_GE_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_GE_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_GE_U32

    class Inst_VOP3__V_CMPX_T_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_T_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_T_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_T_U32

    class Inst_VOP3__V_CMP_F_I64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_F_I64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_F_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_F_I64

    class Inst_VOP3__V_CMP_LT_I64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_LT_I64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_LT_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_LT_I64

    class Inst_VOP3__V_CMP_EQ_I64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_EQ_I64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_EQ_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_EQ_I64

    class Inst_VOP3__V_CMP_LE_I64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_LE_I64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_LE_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_LE_I64

    class Inst_VOP3__V_CMP_GT_I64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_GT_I64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_GT_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_GT_I64

    class Inst_VOP3__V_CMP_NE_I64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NE_I64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NE_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NE_I64

    class Inst_VOP3__V_CMP_GE_I64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_GE_I64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_GE_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_GE_I64

    class Inst_VOP3__V_CMP_T_I64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_T_I64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_T_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_T_I64

    class Inst_VOP3__V_CMP_F_U64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_F_U64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_F_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_F_U64

    class Inst_VOP3__V_CMP_LT_U64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_LT_U64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_LT_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_LT_U64

    class Inst_VOP3__V_CMP_EQ_U64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_EQ_U64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_EQ_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_EQ_U64

    class Inst_VOP3__V_CMP_LE_U64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_LE_U64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_LE_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_LE_U64

    class Inst_VOP3__V_CMP_GT_U64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_GT_U64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_GT_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_GT_U64

    class Inst_VOP3__V_CMP_NE_U64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_NE_U64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_NE_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_NE_U64

    class Inst_VOP3__V_CMP_GE_U64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_GE_U64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_GE_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_GE_U64

    class Inst_VOP3__V_CMP_T_U64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMP_T_U64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMP_T_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMP_T_U64

    class Inst_VOP3__V_CMPX_F_I64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_F_I64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_F_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_F_I64

    class Inst_VOP3__V_CMPX_LT_I64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_LT_I64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_LT_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_LT_I64

    class Inst_VOP3__V_CMPX_EQ_I64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_EQ_I64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_EQ_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_EQ_I64

    class Inst_VOP3__V_CMPX_LE_I64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_LE_I64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_LE_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_LE_I64

    class Inst_VOP3__V_CMPX_GT_I64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_GT_I64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_GT_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_GT_I64

    class Inst_VOP3__V_CMPX_NE_I64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NE_I64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NE_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NE_I64

    class Inst_VOP3__V_CMPX_GE_I64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_GE_I64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_GE_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_GE_I64

    class Inst_VOP3__V_CMPX_T_I64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_T_I64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_T_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_T_I64

    class Inst_VOP3__V_CMPX_F_U64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_F_U64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_F_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_F_U64

    class Inst_VOP3__V_CMPX_LT_U64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_LT_U64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_LT_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_LT_U64

    class Inst_VOP3__V_CMPX_EQ_U64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_EQ_U64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_EQ_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_EQ_U64

    class Inst_VOP3__V_CMPX_LE_U64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_LE_U64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_LE_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_LE_U64

    class Inst_VOP3__V_CMPX_GT_U64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_GT_U64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_GT_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_GT_U64

    class Inst_VOP3__V_CMPX_NE_U64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_NE_U64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_NE_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_NE_U64

    class Inst_VOP3__V_CMPX_GE_U64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_GE_U64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_GE_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_GE_U64

    class Inst_VOP3__V_CMPX_T_U64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CMPX_T_U64(InFmt_VOP3*);
        ~Inst_VOP3__V_CMPX_T_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //sdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CMPX_T_U64

    class Inst_VOP3__V_CNDMASK_B32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CNDMASK_B32(InFmt_VOP3*);
        ~Inst_VOP3__V_CNDMASK_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //carryin
                return 8;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CNDMASK_B32

    class Inst_VOP3__V_ADD_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_ADD_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_ADD_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_ADD_F32

    class Inst_VOP3__V_SUB_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_SUB_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_SUB_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_SUB_F32

    class Inst_VOP3__V_SUBREV_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_SUBREV_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_SUBREV_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_SUBREV_F32

    class Inst_VOP3__V_MUL_LEGACY_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MUL_LEGACY_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_MUL_LEGACY_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MUL_LEGACY_F32

    class Inst_VOP3__V_MUL_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MUL_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_MUL_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MUL_F32

    class Inst_VOP3__V_MUL_I32_I24 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MUL_I32_I24(InFmt_VOP3*);
        ~Inst_VOP3__V_MUL_I32_I24();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MUL_I32_I24

    class Inst_VOP3__V_MUL_HI_I32_I24 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MUL_HI_I32_I24(InFmt_VOP3*);
        ~Inst_VOP3__V_MUL_HI_I32_I24();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MUL_HI_I32_I24

    class Inst_VOP3__V_MUL_U32_U24 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MUL_U32_U24(InFmt_VOP3*);
        ~Inst_VOP3__V_MUL_U32_U24();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MUL_U32_U24

    class Inst_VOP3__V_MUL_HI_U32_U24 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MUL_HI_U32_U24(InFmt_VOP3*);
        ~Inst_VOP3__V_MUL_HI_U32_U24();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MUL_HI_U32_U24

    class Inst_VOP3__V_MIN_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MIN_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_MIN_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MIN_F32

    class Inst_VOP3__V_MAX_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MAX_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_MAX_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MAX_F32

    class Inst_VOP3__V_MIN_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MIN_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_MIN_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MIN_I32

    class Inst_VOP3__V_MAX_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MAX_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_MAX_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MAX_I32

    class Inst_VOP3__V_MIN_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MIN_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_MIN_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MIN_U32

    class Inst_VOP3__V_MAX_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MAX_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_MAX_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MAX_U32

    class Inst_VOP3__V_LSHRREV_B32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_LSHRREV_B32(InFmt_VOP3*);
        ~Inst_VOP3__V_LSHRREV_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_LSHRREV_B32

    class Inst_VOP3__V_ASHRREV_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_ASHRREV_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_ASHRREV_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_ASHRREV_I32

    class Inst_VOP3__V_LSHLREV_B32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_LSHLREV_B32(InFmt_VOP3*);
        ~Inst_VOP3__V_LSHLREV_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_LSHLREV_B32

    class Inst_VOP3__V_AND_B32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_AND_B32(InFmt_VOP3*);
        ~Inst_VOP3__V_AND_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_AND_B32

    class Inst_VOP3__V_OR_B32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_OR_B32(InFmt_VOP3*);
        ~Inst_VOP3__V_OR_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_OR_B32

    class Inst_VOP3__V_XOR_B32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_XOR_B32(InFmt_VOP3*);
        ~Inst_VOP3__V_XOR_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_XOR_B32

    class Inst_VOP3__V_MAC_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MAC_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_MAC_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MAC_F32

    class Inst_VOP3__V_ADD_U32 : public Inst_VOP3_SDST_ENC
    {
      public:
        Inst_VOP3__V_ADD_U32(InFmt_VOP3_SDST_ENC*);
        ~Inst_VOP3__V_ADD_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 2; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              case 3: //carryout
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_ADD_U32

    class Inst_VOP3__V_SUB_U32 : public Inst_VOP3_SDST_ENC
    {
      public:
        Inst_VOP3__V_SUB_U32(InFmt_VOP3_SDST_ENC*);
        ~Inst_VOP3__V_SUB_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 2; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              case 3: //carryout
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_SUB_U32

    class Inst_VOP3__V_SUBREV_U32 : public Inst_VOP3_SDST_ENC
    {
      public:
        Inst_VOP3__V_SUBREV_U32(InFmt_VOP3_SDST_ENC*);
        ~Inst_VOP3__V_SUBREV_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 2; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              case 3: //carryout
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_SUBREV_U32

    class Inst_VOP3__V_ADDC_U32 : public Inst_VOP3_SDST_ENC
    {
      public:
        Inst_VOP3__V_ADDC_U32(InFmt_VOP3_SDST_ENC*);
        ~Inst_VOP3__V_ADDC_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 2; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //carryin
                return 8;
              case 3: //vdst
                return 4;
              case 4: //carryout
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_ADDC_U32

    class Inst_VOP3__V_SUBB_U32 : public Inst_VOP3_SDST_ENC
    {
      public:
        Inst_VOP3__V_SUBB_U32(InFmt_VOP3_SDST_ENC*);
        ~Inst_VOP3__V_SUBB_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 2; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //carryin
                return 8;
              case 3: //vdst
                return 4;
              case 4: //carryout
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_SUBB_U32

    class Inst_VOP3__V_SUBBREV_U32 : public Inst_VOP3_SDST_ENC
    {
      public:
        Inst_VOP3__V_SUBBREV_U32(InFmt_VOP3_SDST_ENC*);
        ~Inst_VOP3__V_SUBBREV_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 2; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //carryin
                return 8;
              case 3: //vdst
                return 4;
              case 4: //carryout
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_SUBBREV_U32

    class Inst_VOP3__V_ADD_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_ADD_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_ADD_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_ADD_F16

    class Inst_VOP3__V_SUB_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_SUB_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_SUB_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_SUB_F16

    class Inst_VOP3__V_SUBREV_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_SUBREV_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_SUBREV_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_SUBREV_F16

    class Inst_VOP3__V_MUL_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MUL_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_MUL_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MUL_F16

    class Inst_VOP3__V_MAC_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MAC_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_MAC_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MAC_F16

    class Inst_VOP3__V_ADD_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_ADD_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_ADD_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_ADD_U16

    class Inst_VOP3__V_SUB_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_SUB_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_SUB_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_SUB_U16

    class Inst_VOP3__V_SUBREV_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_SUBREV_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_SUBREV_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_SUBREV_U16

    class Inst_VOP3__V_MUL_LO_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MUL_LO_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_MUL_LO_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MUL_LO_U16

    class Inst_VOP3__V_LSHLREV_B16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_LSHLREV_B16(InFmt_VOP3*);
        ~Inst_VOP3__V_LSHLREV_B16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_LSHLREV_B16

    class Inst_VOP3__V_LSHRREV_B16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_LSHRREV_B16(InFmt_VOP3*);
        ~Inst_VOP3__V_LSHRREV_B16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_LSHRREV_B16

    class Inst_VOP3__V_ASHRREV_I16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_ASHRREV_I16(InFmt_VOP3*);
        ~Inst_VOP3__V_ASHRREV_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_ASHRREV_I16

    class Inst_VOP3__V_MAX_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MAX_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_MAX_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MAX_F16

    class Inst_VOP3__V_MIN_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MIN_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_MIN_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MIN_F16

    class Inst_VOP3__V_MAX_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MAX_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_MAX_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MAX_U16

    class Inst_VOP3__V_MAX_I16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MAX_I16(InFmt_VOP3*);
        ~Inst_VOP3__V_MAX_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MAX_I16

    class Inst_VOP3__V_MIN_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MIN_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_MIN_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MIN_U16

    class Inst_VOP3__V_MIN_I16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MIN_I16(InFmt_VOP3*);
        ~Inst_VOP3__V_MIN_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MIN_I16

    class Inst_VOP3__V_LDEXP_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_LDEXP_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_LDEXP_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_LDEXP_F16

    class Inst_VOP3__V_NOP : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_NOP(InFmt_VOP3*);
        ~Inst_VOP3__V_NOP();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_NOP

    class Inst_VOP3__V_MOV_B32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MOV_B32(InFmt_VOP3*);
        ~Inst_VOP3__V_MOV_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MOV_B32

    class Inst_VOP3__V_CVT_I32_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_I32_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_I32_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_I32_F64

    class Inst_VOP3__V_CVT_F64_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_F64_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_F64_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_F64_I32

    class Inst_VOP3__V_CVT_F32_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_F32_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_F32_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_F32_I32

    class Inst_VOP3__V_CVT_F32_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_F32_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_F32_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_F32_U32

    class Inst_VOP3__V_CVT_U32_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_U32_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_U32_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_U32_F32

    class Inst_VOP3__V_CVT_I32_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_I32_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_I32_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_I32_F32

    class Inst_VOP3__V_MOV_FED_B32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MOV_FED_B32(InFmt_VOP3*);
        ~Inst_VOP3__V_MOV_FED_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MOV_FED_B32

    class Inst_VOP3__V_CVT_F16_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_F16_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_F16_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_F16_F32

    class Inst_VOP3__V_CVT_F32_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_F32_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_F32_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_F32_F16

    class Inst_VOP3__V_CVT_RPI_I32_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_RPI_I32_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_RPI_I32_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_RPI_I32_F32

    class Inst_VOP3__V_CVT_FLR_I32_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_FLR_I32_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_FLR_I32_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_FLR_I32_F32

    class Inst_VOP3__V_CVT_OFF_F32_I4 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_OFF_F32_I4(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_OFF_F32_I4();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_OFF_F32_I4

    class Inst_VOP3__V_CVT_F32_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_F32_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_F32_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_F32_F64

    class Inst_VOP3__V_CVT_F64_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_F64_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_F64_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_F64_F32

    class Inst_VOP3__V_CVT_F32_UBYTE0 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_F32_UBYTE0(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_F32_UBYTE0();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_F32_UBYTE0

    class Inst_VOP3__V_CVT_F32_UBYTE1 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_F32_UBYTE1(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_F32_UBYTE1();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_F32_UBYTE1

    class Inst_VOP3__V_CVT_F32_UBYTE2 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_F32_UBYTE2(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_F32_UBYTE2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_F32_UBYTE2

    class Inst_VOP3__V_CVT_F32_UBYTE3 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_F32_UBYTE3(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_F32_UBYTE3();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_F32_UBYTE3

    class Inst_VOP3__V_CVT_U32_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_U32_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_U32_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_U32_F64

    class Inst_VOP3__V_CVT_F64_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_F64_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_F64_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_F64_U32

    class Inst_VOP3__V_TRUNC_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_TRUNC_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_TRUNC_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_TRUNC_F64

    class Inst_VOP3__V_CEIL_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CEIL_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_CEIL_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CEIL_F64

    class Inst_VOP3__V_RNDNE_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_RNDNE_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_RNDNE_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_RNDNE_F64

    class Inst_VOP3__V_FLOOR_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_FLOOR_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_FLOOR_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_FLOOR_F64

    class Inst_VOP3__V_FRACT_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_FRACT_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_FRACT_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_FRACT_F32

    class Inst_VOP3__V_TRUNC_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_TRUNC_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_TRUNC_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_TRUNC_F32

    class Inst_VOP3__V_CEIL_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CEIL_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CEIL_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CEIL_F32

    class Inst_VOP3__V_RNDNE_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_RNDNE_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_RNDNE_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_RNDNE_F32

    class Inst_VOP3__V_FLOOR_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_FLOOR_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_FLOOR_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_FLOOR_F32

    class Inst_VOP3__V_EXP_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_EXP_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_EXP_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_EXP_F32

    class Inst_VOP3__V_LOG_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_LOG_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_LOG_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_LOG_F32

    class Inst_VOP3__V_RCP_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_RCP_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_RCP_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_RCP_F32

    class Inst_VOP3__V_RCP_IFLAG_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_RCP_IFLAG_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_RCP_IFLAG_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_RCP_IFLAG_F32

    class Inst_VOP3__V_RSQ_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_RSQ_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_RSQ_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_RSQ_F32

    class Inst_VOP3__V_RCP_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_RCP_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_RCP_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_RCP_F64

    class Inst_VOP3__V_RSQ_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_RSQ_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_RSQ_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_RSQ_F64

    class Inst_VOP3__V_SQRT_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_SQRT_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_SQRT_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_SQRT_F32

    class Inst_VOP3__V_SQRT_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_SQRT_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_SQRT_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_SQRT_F64

    class Inst_VOP3__V_SIN_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_SIN_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_SIN_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_SIN_F32

    class Inst_VOP3__V_COS_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_COS_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_COS_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_COS_F32

    class Inst_VOP3__V_NOT_B32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_NOT_B32(InFmt_VOP3*);
        ~Inst_VOP3__V_NOT_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_NOT_B32

    class Inst_VOP3__V_BFREV_B32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_BFREV_B32(InFmt_VOP3*);
        ~Inst_VOP3__V_BFREV_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_BFREV_B32

    class Inst_VOP3__V_FFBH_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_FFBH_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_FFBH_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_FFBH_U32

    class Inst_VOP3__V_FFBL_B32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_FFBL_B32(InFmt_VOP3*);
        ~Inst_VOP3__V_FFBL_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_FFBL_B32

    class Inst_VOP3__V_FFBH_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_FFBH_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_FFBH_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_FFBH_I32

    class Inst_VOP3__V_FREXP_EXP_I32_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_FREXP_EXP_I32_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_FREXP_EXP_I32_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_FREXP_EXP_I32_F64

    class Inst_VOP3__V_FREXP_MANT_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_FREXP_MANT_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_FREXP_MANT_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_FREXP_MANT_F64

    class Inst_VOP3__V_FRACT_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_FRACT_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_FRACT_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 8;
              case 1: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_FRACT_F64

    class Inst_VOP3__V_FREXP_EXP_I32_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_FREXP_EXP_I32_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_FREXP_EXP_I32_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_FREXP_EXP_I32_F32

    class Inst_VOP3__V_FREXP_MANT_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_FREXP_MANT_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_FREXP_MANT_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_FREXP_MANT_F32

    class Inst_VOP3__V_CLREXCP : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CLREXCP(InFmt_VOP3*);
        ~Inst_VOP3__V_CLREXCP();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CLREXCP

    class Inst_VOP3__V_CVT_F16_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_F16_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_F16_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_F16_U16

    class Inst_VOP3__V_CVT_F16_I16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_F16_I16(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_F16_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_F16_I16

    class Inst_VOP3__V_CVT_U16_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_U16_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_U16_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_U16_F16

    class Inst_VOP3__V_CVT_I16_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_I16_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_I16_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_I16_F16

    class Inst_VOP3__V_RCP_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_RCP_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_RCP_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_RCP_F16

    class Inst_VOP3__V_SQRT_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_SQRT_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_SQRT_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_SQRT_F16

    class Inst_VOP3__V_RSQ_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_RSQ_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_RSQ_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_RSQ_F16

    class Inst_VOP3__V_LOG_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_LOG_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_LOG_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_LOG_F16

    class Inst_VOP3__V_EXP_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_EXP_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_EXP_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_EXP_F16

    class Inst_VOP3__V_FREXP_MANT_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_FREXP_MANT_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_FREXP_MANT_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_FREXP_MANT_F16

    class Inst_VOP3__V_FREXP_EXP_I16_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_FREXP_EXP_I16_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_FREXP_EXP_I16_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_FREXP_EXP_I16_F16

    class Inst_VOP3__V_FLOOR_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_FLOOR_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_FLOOR_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_FLOOR_F16

    class Inst_VOP3__V_CEIL_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CEIL_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_CEIL_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CEIL_F16

    class Inst_VOP3__V_TRUNC_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_TRUNC_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_TRUNC_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_TRUNC_F16

    class Inst_VOP3__V_RNDNE_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_RNDNE_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_RNDNE_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_RNDNE_F16

    class Inst_VOP3__V_FRACT_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_FRACT_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_FRACT_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_FRACT_F16

    class Inst_VOP3__V_SIN_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_SIN_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_SIN_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_SIN_F16

    class Inst_VOP3__V_COS_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_COS_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_COS_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 2;
              case 1: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_COS_F16

    class Inst_VOP3__V_EXP_LEGACY_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_EXP_LEGACY_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_EXP_LEGACY_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_EXP_LEGACY_F32

    class Inst_VOP3__V_LOG_LEGACY_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_LOG_LEGACY_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_LOG_LEGACY_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src
                return 4;
              case 1: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_LOG_LEGACY_F32

    class Inst_VOP3__V_MAD_LEGACY_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MAD_LEGACY_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_MAD_LEGACY_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MAD_LEGACY_F32

    class Inst_VOP3__V_MAD_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MAD_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_MAD_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MAD_F32

    class Inst_VOP3__V_MAD_I32_I24 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MAD_I32_I24(InFmt_VOP3*);
        ~Inst_VOP3__V_MAD_I32_I24();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MAD_I32_I24

    class Inst_VOP3__V_MAD_U32_U24 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MAD_U32_U24(InFmt_VOP3*);
        ~Inst_VOP3__V_MAD_U32_U24();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MAD_U32_U24

    class Inst_VOP3__V_CUBEID_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CUBEID_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CUBEID_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CUBEID_F32

    class Inst_VOP3__V_CUBESC_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CUBESC_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CUBESC_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CUBESC_F32

    class Inst_VOP3__V_CUBETC_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CUBETC_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CUBETC_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CUBETC_F32

    class Inst_VOP3__V_CUBEMA_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CUBEMA_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CUBEMA_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CUBEMA_F32

    class Inst_VOP3__V_BFE_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_BFE_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_BFE_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_BFE_U32

    class Inst_VOP3__V_BFE_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_BFE_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_BFE_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_BFE_I32

    class Inst_VOP3__V_BFI_B32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_BFI_B32(InFmt_VOP3*);
        ~Inst_VOP3__V_BFI_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_BFI_B32

    class Inst_VOP3__V_FMA_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_FMA_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_FMA_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_FMA_F32

    class Inst_VOP3__V_FMA_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_FMA_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_FMA_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //src_2
                return 8;
              case 3: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_FMA_F64

    class Inst_VOP3__V_LERP_U8 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_LERP_U8(InFmt_VOP3*);
        ~Inst_VOP3__V_LERP_U8();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_LERP_U8

    class Inst_VOP3__V_ALIGNBIT_B32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_ALIGNBIT_B32(InFmt_VOP3*);
        ~Inst_VOP3__V_ALIGNBIT_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_ALIGNBIT_B32

    class Inst_VOP3__V_ALIGNBYTE_B32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_ALIGNBYTE_B32(InFmt_VOP3*);
        ~Inst_VOP3__V_ALIGNBYTE_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_ALIGNBYTE_B32

    class Inst_VOP3__V_MIN3_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MIN3_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_MIN3_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MIN3_F32

    class Inst_VOP3__V_MIN3_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MIN3_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_MIN3_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MIN3_I32

    class Inst_VOP3__V_MIN3_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MIN3_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_MIN3_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MIN3_U32

    class Inst_VOP3__V_MAX3_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MAX3_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_MAX3_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MAX3_F32

    class Inst_VOP3__V_MAX3_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MAX3_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_MAX3_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MAX3_I32

    class Inst_VOP3__V_MAX3_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MAX3_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_MAX3_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MAX3_U32

    class Inst_VOP3__V_MED3_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MED3_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_MED3_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MED3_F32

    class Inst_VOP3__V_MED3_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MED3_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_MED3_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MED3_I32

    class Inst_VOP3__V_MED3_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MED3_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_MED3_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MED3_U32

    class Inst_VOP3__V_SAD_U8 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_SAD_U8(InFmt_VOP3*);
        ~Inst_VOP3__V_SAD_U8();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_SAD_U8

    class Inst_VOP3__V_SAD_HI_U8 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_SAD_HI_U8(InFmt_VOP3*);
        ~Inst_VOP3__V_SAD_HI_U8();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_SAD_HI_U8

    class Inst_VOP3__V_SAD_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_SAD_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_SAD_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_SAD_U16

    class Inst_VOP3__V_SAD_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_SAD_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_SAD_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_SAD_U32

    class Inst_VOP3__V_CVT_PK_U8_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_PK_U8_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_PK_U8_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_PK_U8_F32

    class Inst_VOP3__V_DIV_FIXUP_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_DIV_FIXUP_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_DIV_FIXUP_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_DIV_FIXUP_F32

    class Inst_VOP3__V_DIV_FIXUP_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_DIV_FIXUP_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_DIV_FIXUP_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //src_2
                return 8;
              case 3: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_DIV_FIXUP_F64

    class Inst_VOP3__V_DIV_SCALE_F32 : public Inst_VOP3_SDST_ENC
    {
      public:
        Inst_VOP3__V_DIV_SCALE_F32(InFmt_VOP3_SDST_ENC*);
        ~Inst_VOP3__V_DIV_SCALE_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 2; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              case 4: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_DIV_SCALE_F32

    class Inst_VOP3__V_DIV_SCALE_F64 : public Inst_VOP3_SDST_ENC
    {
      public:
        Inst_VOP3__V_DIV_SCALE_F64(InFmt_VOP3_SDST_ENC*);
        ~Inst_VOP3__V_DIV_SCALE_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 2; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //src_2
                return 8;
              case 3: //vdst
                return 8;
              case 4: //vcc
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_DIV_SCALE_F64

    class Inst_VOP3__V_DIV_FMAS_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_DIV_FMAS_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_DIV_FMAS_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3:
                return 8;
              case 4: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_DIV_FMAS_F32

    class Inst_VOP3__V_DIV_FMAS_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_DIV_FMAS_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_DIV_FMAS_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //src_2
                return 8;
              case 3: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_DIV_FMAS_F64

    class Inst_VOP3__V_MSAD_U8 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MSAD_U8(InFmt_VOP3*);
        ~Inst_VOP3__V_MSAD_U8();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MSAD_U8

    class Inst_VOP3__V_QSAD_PK_U16_U8 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_QSAD_PK_U16_U8(InFmt_VOP3*);
        ~Inst_VOP3__V_QSAD_PK_U16_U8();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 8;
              case 3: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_QSAD_PK_U16_U8

    class Inst_VOP3__V_MQSAD_PK_U16_U8 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MQSAD_PK_U16_U8(InFmt_VOP3*);
        ~Inst_VOP3__V_MQSAD_PK_U16_U8();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 8;
              case 3: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MQSAD_PK_U16_U8

    class Inst_VOP3__V_MQSAD_U32_U8 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MQSAD_U32_U8(InFmt_VOP3*);
        ~Inst_VOP3__V_MQSAD_U32_U8();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 16;
              case 3: //vdst
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MQSAD_U32_U8

    class Inst_VOP3__V_MAD_U64_U32 : public Inst_VOP3_SDST_ENC
    {
      public:
        Inst_VOP3__V_MAD_U64_U32(InFmt_VOP3_SDST_ENC*);
        ~Inst_VOP3__V_MAD_U64_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 2; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              case 4: //carryout
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MAD_U64_U32

    class Inst_VOP3__V_MAD_I64_I32 : public Inst_VOP3_SDST_ENC
    {
      public:
        Inst_VOP3__V_MAD_I64_I32(InFmt_VOP3_SDST_ENC*);
        ~Inst_VOP3__V_MAD_I64_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 2; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              case 4: //carryout
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MAD_I64_I32

    class Inst_VOP3__V_MAD_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MAD_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_MAD_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //src_2
                return 2;
              case 3: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MAD_F16

    class Inst_VOP3__V_MAD_U16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MAD_U16(InFmt_VOP3*);
        ~Inst_VOP3__V_MAD_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //src_2
                return 2;
              case 3: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MAD_U16

    class Inst_VOP3__V_MAD_I16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MAD_I16(InFmt_VOP3*);
        ~Inst_VOP3__V_MAD_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //src_2
                return 2;
              case 3: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MAD_I16

    class Inst_VOP3__V_PERM_B32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_PERM_B32(InFmt_VOP3*);
        ~Inst_VOP3__V_PERM_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //src_2
                return 4;
              case 3: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        // From the GCN3 ISA SPEC:
        // byte permute(byte in[8], byte sel) {
        //     if (sel>=13) then return 0xff;
        //     elsif (sel==12) then return 0x00;
        //     elsif (sel==11) then return in[7][7] * 0xff;
        //     elsif (sel==10) then return in[5][7] * 0xff;
        //     elsif (sel==9) then return in[3][7] * 0xff;
        //     elsif (sel==8) then return in[1][7] * 0xff;
        //     else return in[sel];
        //     }
        // NOTE: I interpret the in[x][7] notation to mean "the high order
        // bit of byte x".
        uint8_t
        permute(uint64_t in_dword2x, uint32_t sel)
        {
            assert (sel < 256);
            uint8_t *in = reinterpret_cast<uint8_t*>(&in_dword2x);
            DPRINTF(GCN3, "in_dword2x = 0x%08x\n", in_dword2x);
            DPRINTF(GCN3, "Selecting %x using index %d\n", in[sel], sel);
            if (sel >= 13) return 0xFF;
            else if (sel == 12) return 0;
            else if (sel == 11) return (in[7] & 0x80) ? 0xFF : 0;
            else if (sel == 10) return (in[5] & 0x80) ? 0xFF : 0;
            else if (sel == 9) return (in[3] & 0x80) ? 0xFF : 0;
            else if (sel == 8) return (in[1] & 0x80) ? 0xFF : 0;
            else return in[sel];
        }

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_PERM_B32

    class Inst_VOP3__V_FMA_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_FMA_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_FMA_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //src_2
                return 2;
              case 3: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_FMA_F16

    class Inst_VOP3__V_DIV_FIXUP_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_DIV_FIXUP_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_DIV_FIXUP_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 2;
              case 1: //src_1
                return 2;
              case 2: //src_2
                return 2;
              case 3: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_DIV_FIXUP_F16

    class Inst_VOP3__V_CVT_PKACCUM_U8_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_PKACCUM_U8_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_PKACCUM_U8_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_PKACCUM_U8_F32

    class Inst_VOP3__V_INTERP_P1_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_INTERP_P1_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_INTERP_P1_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_ij
                return 4;
              case 1: //attr
                return 32;
              case 2: //vgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_INTERP_P1_F32

    class Inst_VOP3__V_INTERP_P2_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_INTERP_P2_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_INTERP_P2_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_ij
                return 4;
              case 1: //attr
                return 32;
              case 2: //vgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_INTERP_P2_F32

    class Inst_VOP3__V_INTERP_MOV_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_INTERP_MOV_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_INTERP_MOV_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //param
                return 4;
              case 1: //attr
                return 32;
              case 2: //vgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_INTERP_MOV_F32

    class Inst_VOP3__V_INTERP_P1LL_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_INTERP_P1LL_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_INTERP_P1LL_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_ij
                return 4;
              case 1: //attr
                return 2;
              case 2: //vgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_INTERP_P1LL_F16

    class Inst_VOP3__V_INTERP_P1LV_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_INTERP_P1LV_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_INTERP_P1LV_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_ij
                return 4;
              case 1: //attr
                return 2;
              case 2: //vgpr_add
                return 2;
              case 3: //vgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_INTERP_P1LV_F16

    class Inst_VOP3__V_INTERP_P2_F16 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_INTERP_P2_F16(InFmt_VOP3*);
        ~Inst_VOP3__V_INTERP_P2_F16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_ij
                return 4;
              case 1: //attr
                return 2;
              case 2: //vgpr_add
                return 4;
              case 3: //vgpr_dst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_INTERP_P2_F16

    class Inst_VOP3__V_ADD_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_ADD_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_ADD_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_ADD_F64

    class Inst_VOP3__V_MUL_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MUL_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_MUL_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MUL_F64

    class Inst_VOP3__V_MIN_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MIN_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_MIN_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MIN_F64

    class Inst_VOP3__V_MAX_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MAX_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_MAX_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 8;
              case 2: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MAX_F64

    class Inst_VOP3__V_LDEXP_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_LDEXP_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_LDEXP_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_LDEXP_F64

    class Inst_VOP3__V_MUL_LO_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MUL_LO_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_MUL_LO_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MUL_LO_U32

    class Inst_VOP3__V_MUL_HI_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MUL_HI_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_MUL_HI_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MUL_HI_U32

    class Inst_VOP3__V_MUL_HI_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MUL_HI_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_MUL_HI_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MUL_HI_I32

    class Inst_VOP3__V_LDEXP_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_LDEXP_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_LDEXP_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_LDEXP_F32

    class Inst_VOP3__V_READLANE_B32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_READLANE_B32(InFmt_VOP3*);
        ~Inst_VOP3__V_READLANE_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vsrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //sdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_READLANE_B32

    class Inst_VOP3__V_WRITELANE_B32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_WRITELANE_B32(InFmt_VOP3*);
        ~Inst_VOP3__V_WRITELANE_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //ssrc_0
                return 4;
              case 1: //ssrc_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_WRITELANE_B32

    class Inst_VOP3__V_BCNT_U32_B32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_BCNT_U32_B32(InFmt_VOP3*);
        ~Inst_VOP3__V_BCNT_U32_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_BCNT_U32_B32

    class Inst_VOP3__V_MBCNT_LO_U32_B32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MBCNT_LO_U32_B32(InFmt_VOP3*);
        ~Inst_VOP3__V_MBCNT_LO_U32_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MBCNT_LO_U32_B32

    class Inst_VOP3__V_MBCNT_HI_U32_B32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_MBCNT_HI_U32_B32(InFmt_VOP3*);
        ~Inst_VOP3__V_MBCNT_HI_U32_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_MBCNT_HI_U32_B32

    class Inst_VOP3__V_LSHLREV_B64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_LSHLREV_B64(InFmt_VOP3*);
        ~Inst_VOP3__V_LSHLREV_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 8;
              case 2: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_LSHLREV_B64

    class Inst_VOP3__V_LSHRREV_B64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_LSHRREV_B64(InFmt_VOP3*);
        ~Inst_VOP3__V_LSHRREV_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 8;
              case 2: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_LSHRREV_B64

    class Inst_VOP3__V_ASHRREV_I64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_ASHRREV_I64(InFmt_VOP3*);
        ~Inst_VOP3__V_ASHRREV_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 8;
              case 2: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_ASHRREV_I64

    class Inst_VOP3__V_TRIG_PREOP_F64 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_TRIG_PREOP_F64(InFmt_VOP3*);
        ~Inst_VOP3__V_TRIG_PREOP_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 8;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_TRIG_PREOP_F64

    class Inst_VOP3__V_BFM_B32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_BFM_B32(InFmt_VOP3*);
        ~Inst_VOP3__V_BFM_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_BFM_B32

    class Inst_VOP3__V_CVT_PKNORM_I16_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_PKNORM_I16_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_PKNORM_I16_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_PKNORM_I16_F32

    class Inst_VOP3__V_CVT_PKNORM_U16_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_PKNORM_U16_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_PKNORM_U16_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_PKNORM_U16_F32

    class Inst_VOP3__V_CVT_PKRTZ_F16_F32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_PKRTZ_F16_F32(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_PKRTZ_F16_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_PKRTZ_F16_F32

    class Inst_VOP3__V_CVT_PK_U16_U32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_PK_U16_U32(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_PK_U16_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_PK_U16_U32

    class Inst_VOP3__V_CVT_PK_I16_I32 : public Inst_VOP3
    {
      public:
        Inst_VOP3__V_CVT_PK_I16_I32(InFmt_VOP3*);
        ~Inst_VOP3__V_CVT_PK_I16_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //src_0
                return 4;
              case 1: //src_1
                return 4;
              case 2: //vdst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_VOP3__V_CVT_PK_I16_I32

    class Inst_DS__DS_ADD_U32 : public Inst_DS
    {
      public:
        Inst_DS__DS_ADD_U32(InFmt_DS*);
        ~Inst_DS__DS_ADD_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_ADD_U32

    class Inst_DS__DS_SUB_U32 : public Inst_DS
    {
      public:
        Inst_DS__DS_SUB_U32(InFmt_DS*);
        ~Inst_DS__DS_SUB_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_SUB_U32

    class Inst_DS__DS_RSUB_U32 : public Inst_DS
    {
      public:
        Inst_DS__DS_RSUB_U32(InFmt_DS*);
        ~Inst_DS__DS_RSUB_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_RSUB_U32

    class Inst_DS__DS_INC_U32 : public Inst_DS
    {
      public:
        Inst_DS__DS_INC_U32(InFmt_DS*);
        ~Inst_DS__DS_INC_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_INC_U32

    class Inst_DS__DS_DEC_U32 : public Inst_DS
    {
      public:
        Inst_DS__DS_DEC_U32(InFmt_DS*);
        ~Inst_DS__DS_DEC_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_DEC_U32

    class Inst_DS__DS_MIN_I32 : public Inst_DS
    {
      public:
        Inst_DS__DS_MIN_I32(InFmt_DS*);
        ~Inst_DS__DS_MIN_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MIN_I32

    class Inst_DS__DS_MAX_I32 : public Inst_DS
    {
      public:
        Inst_DS__DS_MAX_I32(InFmt_DS*);
        ~Inst_DS__DS_MAX_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MAX_I32

    class Inst_DS__DS_MIN_U32 : public Inst_DS
    {
      public:
        Inst_DS__DS_MIN_U32(InFmt_DS*);
        ~Inst_DS__DS_MIN_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MIN_U32

    class Inst_DS__DS_MAX_U32 : public Inst_DS
    {
      public:
        Inst_DS__DS_MAX_U32(InFmt_DS*);
        ~Inst_DS__DS_MAX_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MAX_U32

    class Inst_DS__DS_AND_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_AND_B32(InFmt_DS*);
        ~Inst_DS__DS_AND_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_AND_B32

    class Inst_DS__DS_OR_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_OR_B32(InFmt_DS*);
        ~Inst_DS__DS_OR_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_OR_B32

    class Inst_DS__DS_XOR_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_XOR_B32(InFmt_DS*);
        ~Inst_DS__DS_XOR_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_XOR_B32

    class Inst_DS__DS_MSKOR_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_MSKOR_B32(InFmt_DS*);
        ~Inst_DS__DS_MSKOR_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d1
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MSKOR_B32

    class Inst_DS__DS_WRITE_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_WRITE_B32(InFmt_DS*);
        ~Inst_DS__DS_WRITE_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_DS__DS_WRITE_B32

    class Inst_DS__DS_WRITE2_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_WRITE2_B32(InFmt_DS*);
        ~Inst_DS__DS_WRITE2_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              case 2: //vgpr_d1
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_DS__DS_WRITE2_B32

    class Inst_DS__DS_WRITE2ST64_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_WRITE2ST64_B32(InFmt_DS*);
        ~Inst_DS__DS_WRITE2ST64_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              case 2: //vgpr_d1
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_DS__DS_WRITE2ST64_B32

    class Inst_DS__DS_CMPST_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_CMPST_B32(InFmt_DS*);
        ~Inst_DS__DS_CMPST_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d1
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_CMPST_B32

    class Inst_DS__DS_CMPST_F32 : public Inst_DS
    {
      public:
        Inst_DS__DS_CMPST_F32(InFmt_DS*);
        ~Inst_DS__DS_CMPST_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d1
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_CMPST_F32

    class Inst_DS__DS_MIN_F32 : public Inst_DS
    {
      public:
        Inst_DS__DS_MIN_F32(InFmt_DS*);
        ~Inst_DS__DS_MIN_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MIN_F32

    class Inst_DS__DS_MAX_F32 : public Inst_DS
    {
      public:
        Inst_DS__DS_MAX_F32(InFmt_DS*);
        ~Inst_DS__DS_MAX_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MAX_F32

    class Inst_DS__DS_NOP : public Inst_DS
    {
      public:
        Inst_DS__DS_NOP(InFmt_DS*);
        ~Inst_DS__DS_NOP();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_NOP

    class Inst_DS__DS_ADD_F32 : public Inst_DS
    {
      public:
        Inst_DS__DS_ADD_F32(InFmt_DS*);
        ~Inst_DS__DS_ADD_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_ADD_F32

    class Inst_DS__DS_WRITE_B8 : public Inst_DS
    {
      public:
        Inst_DS__DS_WRITE_B8(InFmt_DS*);
        ~Inst_DS__DS_WRITE_B8();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 1;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_DS__DS_WRITE_B8

    class Inst_DS__DS_WRITE_B16 : public Inst_DS
    {
      public:
        Inst_DS__DS_WRITE_B16(InFmt_DS*);
        ~Inst_DS__DS_WRITE_B16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_DS__DS_WRITE_B16

    class Inst_DS__DS_ADD_RTN_U32 : public Inst_DS
    {
      public:
        Inst_DS__DS_ADD_RTN_U32(InFmt_DS*);
        ~Inst_DS__DS_ADD_RTN_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_ADD_RTN_U32

    class Inst_DS__DS_SUB_RTN_U32 : public Inst_DS
    {
      public:
        Inst_DS__DS_SUB_RTN_U32(InFmt_DS*);
        ~Inst_DS__DS_SUB_RTN_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_SUB_RTN_U32

    class Inst_DS__DS_RSUB_RTN_U32 : public Inst_DS
    {
      public:
        Inst_DS__DS_RSUB_RTN_U32(InFmt_DS*);
        ~Inst_DS__DS_RSUB_RTN_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_RSUB_RTN_U32

    class Inst_DS__DS_INC_RTN_U32 : public Inst_DS
    {
      public:
        Inst_DS__DS_INC_RTN_U32(InFmt_DS*);
        ~Inst_DS__DS_INC_RTN_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_INC_RTN_U32

    class Inst_DS__DS_DEC_RTN_U32 : public Inst_DS
    {
      public:
        Inst_DS__DS_DEC_RTN_U32(InFmt_DS*);
        ~Inst_DS__DS_DEC_RTN_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_DEC_RTN_U32

    class Inst_DS__DS_MIN_RTN_I32 : public Inst_DS
    {
      public:
        Inst_DS__DS_MIN_RTN_I32(InFmt_DS*);
        ~Inst_DS__DS_MIN_RTN_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MIN_RTN_I32

    class Inst_DS__DS_MAX_RTN_I32 : public Inst_DS
    {
      public:
        Inst_DS__DS_MAX_RTN_I32(InFmt_DS*);
        ~Inst_DS__DS_MAX_RTN_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MAX_RTN_I32

    class Inst_DS__DS_MIN_RTN_U32 : public Inst_DS
    {
      public:
        Inst_DS__DS_MIN_RTN_U32(InFmt_DS*);
        ~Inst_DS__DS_MIN_RTN_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MIN_RTN_U32

    class Inst_DS__DS_MAX_RTN_U32 : public Inst_DS
    {
      public:
        Inst_DS__DS_MAX_RTN_U32(InFmt_DS*);
        ~Inst_DS__DS_MAX_RTN_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MAX_RTN_U32

    class Inst_DS__DS_AND_RTN_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_AND_RTN_B32(InFmt_DS*);
        ~Inst_DS__DS_AND_RTN_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_AND_RTN_B32

    class Inst_DS__DS_OR_RTN_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_OR_RTN_B32(InFmt_DS*);
        ~Inst_DS__DS_OR_RTN_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_OR_RTN_B32

    class Inst_DS__DS_XOR_RTN_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_XOR_RTN_B32(InFmt_DS*);
        ~Inst_DS__DS_XOR_RTN_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_XOR_RTN_B32

    class Inst_DS__DS_MSKOR_RTN_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_MSKOR_RTN_B32(InFmt_DS*);
        ~Inst_DS__DS_MSKOR_RTN_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d1
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MSKOR_RTN_B32

    class Inst_DS__DS_WRXCHG_RTN_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_WRXCHG_RTN_B32(InFmt_DS*);
        ~Inst_DS__DS_WRXCHG_RTN_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_WRXCHG_RTN_B32

    class Inst_DS__DS_WRXCHG2_RTN_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_WRXCHG2_RTN_B32(InFmt_DS*);
        ~Inst_DS__DS_WRXCHG2_RTN_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d1
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_WRXCHG2_RTN_B32

    class Inst_DS__DS_WRXCHG2ST64_RTN_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_WRXCHG2ST64_RTN_B32(InFmt_DS*);
        ~Inst_DS__DS_WRXCHG2ST64_RTN_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d1
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_WRXCHG2ST64_RTN_B32

    class Inst_DS__DS_CMPST_RTN_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_CMPST_RTN_B32(InFmt_DS*);
        ~Inst_DS__DS_CMPST_RTN_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d1
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_CMPST_RTN_B32

    class Inst_DS__DS_CMPST_RTN_F32 : public Inst_DS
    {
      public:
        Inst_DS__DS_CMPST_RTN_F32(InFmt_DS*);
        ~Inst_DS__DS_CMPST_RTN_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d1
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_CMPST_RTN_F32

    class Inst_DS__DS_MIN_RTN_F32 : public Inst_DS
    {
      public:
        Inst_DS__DS_MIN_RTN_F32(InFmt_DS*);
        ~Inst_DS__DS_MIN_RTN_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MIN_RTN_F32

    class Inst_DS__DS_MAX_RTN_F32 : public Inst_DS
    {
      public:
        Inst_DS__DS_MAX_RTN_F32(InFmt_DS*);
        ~Inst_DS__DS_MAX_RTN_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MAX_RTN_F32

    class Inst_DS__DS_WRAP_RTN_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_WRAP_RTN_B32(InFmt_DS*);
        ~Inst_DS__DS_WRAP_RTN_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d1
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_WRAP_RTN_B32

    class Inst_DS__DS_ADD_RTN_F32 : public Inst_DS
    {
      public:
        Inst_DS__DS_ADD_RTN_F32(InFmt_DS*);
        ~Inst_DS__DS_ADD_RTN_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_ADD_RTN_F32

    class Inst_DS__DS_READ_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_READ_B32(InFmt_DS*);
        ~Inst_DS__DS_READ_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_DS__DS_READ_B32

    class Inst_DS__DS_READ2_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_READ2_B32(InFmt_DS*);
        ~Inst_DS__DS_READ2_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_DS__DS_READ2_B32

    class Inst_DS__DS_READ2ST64_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_READ2ST64_B32(InFmt_DS*);
        ~Inst_DS__DS_READ2ST64_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_DS__DS_READ2ST64_B32

    class Inst_DS__DS_READ_I8 : public Inst_DS
    {
      public:
        Inst_DS__DS_READ_I8(InFmt_DS*);
        ~Inst_DS__DS_READ_I8();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_rtn
                return 1;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_READ_I8

    class Inst_DS__DS_READ_U8 : public Inst_DS
    {
      public:
        Inst_DS__DS_READ_U8(InFmt_DS*);
        ~Inst_DS__DS_READ_U8();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_rtn
                return 1;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_DS__DS_READ_U8

    class Inst_DS__DS_READ_I16 : public Inst_DS
    {
      public:
        Inst_DS__DS_READ_I16(InFmt_DS*);
        ~Inst_DS__DS_READ_I16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_rtn
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_READ_I16

    class Inst_DS__DS_READ_U16 : public Inst_DS
    {
      public:
        Inst_DS__DS_READ_U16(InFmt_DS*);
        ~Inst_DS__DS_READ_U16();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_rtn
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_DS__DS_READ_U16

    class Inst_DS__DS_SWIZZLE_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_SWIZZLE_B32(InFmt_DS*);
        ~Inst_DS__DS_SWIZZLE_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_SWIZZLE_B32

    class Inst_DS__DS_PERMUTE_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_PERMUTE_B32(InFmt_DS*);
        ~Inst_DS__DS_PERMUTE_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_PERMUTE_B32

    class Inst_DS__DS_BPERMUTE_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_BPERMUTE_B32(InFmt_DS*);
        ~Inst_DS__DS_BPERMUTE_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 4;
              case 2: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_BPERMUTE_B32

    class Inst_DS__DS_ADD_U64 : public Inst_DS
    {
      public:
        Inst_DS__DS_ADD_U64(InFmt_DS*);
        ~Inst_DS__DS_ADD_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_ADD_U64

    class Inst_DS__DS_SUB_U64 : public Inst_DS
    {
      public:
        Inst_DS__DS_SUB_U64(InFmt_DS*);
        ~Inst_DS__DS_SUB_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_SUB_U64

    class Inst_DS__DS_RSUB_U64 : public Inst_DS
    {
      public:
        Inst_DS__DS_RSUB_U64(InFmt_DS*);
        ~Inst_DS__DS_RSUB_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_RSUB_U64

    class Inst_DS__DS_INC_U64 : public Inst_DS
    {
      public:
        Inst_DS__DS_INC_U64(InFmt_DS*);
        ~Inst_DS__DS_INC_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_INC_U64

    class Inst_DS__DS_DEC_U64 : public Inst_DS
    {
      public:
        Inst_DS__DS_DEC_U64(InFmt_DS*);
        ~Inst_DS__DS_DEC_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_DEC_U64

    class Inst_DS__DS_MIN_I64 : public Inst_DS
    {
      public:
        Inst_DS__DS_MIN_I64(InFmt_DS*);
        ~Inst_DS__DS_MIN_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MIN_I64

    class Inst_DS__DS_MAX_I64 : public Inst_DS
    {
      public:
        Inst_DS__DS_MAX_I64(InFmt_DS*);
        ~Inst_DS__DS_MAX_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MAX_I64

    class Inst_DS__DS_MIN_U64 : public Inst_DS
    {
      public:
        Inst_DS__DS_MIN_U64(InFmt_DS*);
        ~Inst_DS__DS_MIN_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MIN_U64

    class Inst_DS__DS_MAX_U64 : public Inst_DS
    {
      public:
        Inst_DS__DS_MAX_U64(InFmt_DS*);
        ~Inst_DS__DS_MAX_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MAX_U64

    class Inst_DS__DS_AND_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_AND_B64(InFmt_DS*);
        ~Inst_DS__DS_AND_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_AND_B64

    class Inst_DS__DS_OR_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_OR_B64(InFmt_DS*);
        ~Inst_DS__DS_OR_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_OR_B64

    class Inst_DS__DS_XOR_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_XOR_B64(InFmt_DS*);
        ~Inst_DS__DS_XOR_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_XOR_B64

    class Inst_DS__DS_MSKOR_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_MSKOR_B64(InFmt_DS*);
        ~Inst_DS__DS_MSKOR_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d1
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MSKOR_B64

    class Inst_DS__DS_WRITE_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_WRITE_B64(InFmt_DS*);
        ~Inst_DS__DS_WRITE_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_DS__DS_WRITE_B64

    class Inst_DS__DS_WRITE2_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_WRITE2_B64(InFmt_DS*);
        ~Inst_DS__DS_WRITE2_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              case 2: //vgpr_d1
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_DS__DS_WRITE2_B64

    class Inst_DS__DS_WRITE2ST64_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_WRITE2ST64_B64(InFmt_DS*);
        ~Inst_DS__DS_WRITE2ST64_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d1
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_WRITE2ST64_B64

    class Inst_DS__DS_CMPST_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_CMPST_B64(InFmt_DS*);
        ~Inst_DS__DS_CMPST_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d1
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_CMPST_B64

    class Inst_DS__DS_CMPST_F64 : public Inst_DS
    {
      public:
        Inst_DS__DS_CMPST_F64(InFmt_DS*);
        ~Inst_DS__DS_CMPST_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d1
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_CMPST_F64

    class Inst_DS__DS_MIN_F64 : public Inst_DS
    {
      public:
        Inst_DS__DS_MIN_F64(InFmt_DS*);
        ~Inst_DS__DS_MIN_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MIN_F64

    class Inst_DS__DS_MAX_F64 : public Inst_DS
    {
      public:
        Inst_DS__DS_MAX_F64(InFmt_DS*);
        ~Inst_DS__DS_MAX_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MAX_F64

    class Inst_DS__DS_ADD_RTN_U64 : public Inst_DS
    {
      public:
        Inst_DS__DS_ADD_RTN_U64(InFmt_DS*);
        ~Inst_DS__DS_ADD_RTN_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              case 2: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_ADD_RTN_U64

    class Inst_DS__DS_SUB_RTN_U64 : public Inst_DS
    {
      public:
        Inst_DS__DS_SUB_RTN_U64(InFmt_DS*);
        ~Inst_DS__DS_SUB_RTN_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              case 2: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_SUB_RTN_U64

    class Inst_DS__DS_RSUB_RTN_U64 : public Inst_DS
    {
      public:
        Inst_DS__DS_RSUB_RTN_U64(InFmt_DS*);
        ~Inst_DS__DS_RSUB_RTN_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              case 2: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_RSUB_RTN_U64

    class Inst_DS__DS_INC_RTN_U64 : public Inst_DS
    {
      public:
        Inst_DS__DS_INC_RTN_U64(InFmt_DS*);
        ~Inst_DS__DS_INC_RTN_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              case 2: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_INC_RTN_U64

    class Inst_DS__DS_DEC_RTN_U64 : public Inst_DS
    {
      public:
        Inst_DS__DS_DEC_RTN_U64(InFmt_DS*);
        ~Inst_DS__DS_DEC_RTN_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              case 2: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_DEC_RTN_U64

    class Inst_DS__DS_MIN_RTN_I64 : public Inst_DS
    {
      public:
        Inst_DS__DS_MIN_RTN_I64(InFmt_DS*);
        ~Inst_DS__DS_MIN_RTN_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              case 2: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MIN_RTN_I64

    class Inst_DS__DS_MAX_RTN_I64 : public Inst_DS
    {
      public:
        Inst_DS__DS_MAX_RTN_I64(InFmt_DS*);
        ~Inst_DS__DS_MAX_RTN_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              case 2: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MAX_RTN_I64

    class Inst_DS__DS_MIN_RTN_U64 : public Inst_DS
    {
      public:
        Inst_DS__DS_MIN_RTN_U64(InFmt_DS*);
        ~Inst_DS__DS_MIN_RTN_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              case 2: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MIN_RTN_U64

    class Inst_DS__DS_MAX_RTN_U64 : public Inst_DS
    {
      public:
        Inst_DS__DS_MAX_RTN_U64(InFmt_DS*);
        ~Inst_DS__DS_MAX_RTN_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              case 2: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MAX_RTN_U64

    class Inst_DS__DS_AND_RTN_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_AND_RTN_B64(InFmt_DS*);
        ~Inst_DS__DS_AND_RTN_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              case 2: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_AND_RTN_B64

    class Inst_DS__DS_OR_RTN_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_OR_RTN_B64(InFmt_DS*);
        ~Inst_DS__DS_OR_RTN_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              case 2: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_OR_RTN_B64

    class Inst_DS__DS_XOR_RTN_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_XOR_RTN_B64(InFmt_DS*);
        ~Inst_DS__DS_XOR_RTN_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              case 2: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_XOR_RTN_B64

    class Inst_DS__DS_MSKOR_RTN_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_MSKOR_RTN_B64(InFmt_DS*);
        ~Inst_DS__DS_MSKOR_RTN_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d1
                return 8;
              case 2: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MSKOR_RTN_B64

    class Inst_DS__DS_WRXCHG_RTN_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_WRXCHG_RTN_B64(InFmt_DS*);
        ~Inst_DS__DS_WRXCHG_RTN_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              case 2: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_WRXCHG_RTN_B64

    class Inst_DS__DS_WRXCHG2_RTN_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_WRXCHG2_RTN_B64(InFmt_DS*);
        ~Inst_DS__DS_WRXCHG2_RTN_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d1
                return 8;
              case 2: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_WRXCHG2_RTN_B64

    class Inst_DS__DS_WRXCHG2ST64_RTN_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_WRXCHG2ST64_RTN_B64(InFmt_DS*);
        ~Inst_DS__DS_WRXCHG2ST64_RTN_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d1
                return 8;
              case 2: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_WRXCHG2ST64_RTN_B64

    class Inst_DS__DS_CMPST_RTN_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_CMPST_RTN_B64(InFmt_DS*);
        ~Inst_DS__DS_CMPST_RTN_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d1
                return 8;
              case 2: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_CMPST_RTN_B64

    class Inst_DS__DS_CMPST_RTN_F64 : public Inst_DS
    {
      public:
        Inst_DS__DS_CMPST_RTN_F64(InFmt_DS*);
        ~Inst_DS__DS_CMPST_RTN_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d1
                return 8;
              case 2: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_CMPST_RTN_F64

    class Inst_DS__DS_MIN_RTN_F64 : public Inst_DS
    {
      public:
        Inst_DS__DS_MIN_RTN_F64(InFmt_DS*);
        ~Inst_DS__DS_MIN_RTN_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              case 2: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MIN_RTN_F64

    class Inst_DS__DS_MAX_RTN_F64 : public Inst_DS
    {
      public:
        Inst_DS__DS_MAX_RTN_F64(InFmt_DS*);
        ~Inst_DS__DS_MAX_RTN_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              case 2: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MAX_RTN_F64

    class Inst_DS__DS_READ_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_READ_B64(InFmt_DS*);
        ~Inst_DS__DS_READ_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_DS__DS_READ_B64

    class Inst_DS__DS_READ2_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_READ2_B64(InFmt_DS*);
        ~Inst_DS__DS_READ2_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_rtn
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_DS__DS_READ2_B64

    class Inst_DS__DS_READ2ST64_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_READ2ST64_B64(InFmt_DS*);
        ~Inst_DS__DS_READ2ST64_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_DS__DS_READ2ST64_B64

    class Inst_DS__DS_CONDXCHG32_RTN_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_CONDXCHG32_RTN_B64(InFmt_DS*);
        ~Inst_DS__DS_CONDXCHG32_RTN_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 8;
              case 2: //vgpr_rtn
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_CONDXCHG32_RTN_B64

    class Inst_DS__DS_ADD_SRC2_U32 : public Inst_DS
    {
      public:
        Inst_DS__DS_ADD_SRC2_U32(InFmt_DS*);
        ~Inst_DS__DS_ADD_SRC2_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_ADD_SRC2_U32

    class Inst_DS__DS_SUB_SRC2_U32 : public Inst_DS
    {
      public:
        Inst_DS__DS_SUB_SRC2_U32(InFmt_DS*);
        ~Inst_DS__DS_SUB_SRC2_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_SUB_SRC2_U32

    class Inst_DS__DS_RSUB_SRC2_U32 : public Inst_DS
    {
      public:
        Inst_DS__DS_RSUB_SRC2_U32(InFmt_DS*);
        ~Inst_DS__DS_RSUB_SRC2_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_RSUB_SRC2_U32

    class Inst_DS__DS_INC_SRC2_U32 : public Inst_DS
    {
      public:
        Inst_DS__DS_INC_SRC2_U32(InFmt_DS*);
        ~Inst_DS__DS_INC_SRC2_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_INC_SRC2_U32

    class Inst_DS__DS_DEC_SRC2_U32 : public Inst_DS
    {
      public:
        Inst_DS__DS_DEC_SRC2_U32(InFmt_DS*);
        ~Inst_DS__DS_DEC_SRC2_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_DEC_SRC2_U32

    class Inst_DS__DS_MIN_SRC2_I32 : public Inst_DS
    {
      public:
        Inst_DS__DS_MIN_SRC2_I32(InFmt_DS*);
        ~Inst_DS__DS_MIN_SRC2_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MIN_SRC2_I32

    class Inst_DS__DS_MAX_SRC2_I32 : public Inst_DS
    {
      public:
        Inst_DS__DS_MAX_SRC2_I32(InFmt_DS*);
        ~Inst_DS__DS_MAX_SRC2_I32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MAX_SRC2_I32

    class Inst_DS__DS_MIN_SRC2_U32 : public Inst_DS
    {
      public:
        Inst_DS__DS_MIN_SRC2_U32(InFmt_DS*);
        ~Inst_DS__DS_MIN_SRC2_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MIN_SRC2_U32

    class Inst_DS__DS_MAX_SRC2_U32 : public Inst_DS
    {
      public:
        Inst_DS__DS_MAX_SRC2_U32(InFmt_DS*);
        ~Inst_DS__DS_MAX_SRC2_U32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MAX_SRC2_U32

    class Inst_DS__DS_AND_SRC2_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_AND_SRC2_B32(InFmt_DS*);
        ~Inst_DS__DS_AND_SRC2_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_AND_SRC2_B32

    class Inst_DS__DS_OR_SRC2_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_OR_SRC2_B32(InFmt_DS*);
        ~Inst_DS__DS_OR_SRC2_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_OR_SRC2_B32

    class Inst_DS__DS_XOR_SRC2_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_XOR_SRC2_B32(InFmt_DS*);
        ~Inst_DS__DS_XOR_SRC2_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_XOR_SRC2_B32

    class Inst_DS__DS_WRITE_SRC2_B32 : public Inst_DS
    {
      public:
        Inst_DS__DS_WRITE_SRC2_B32(InFmt_DS*);
        ~Inst_DS__DS_WRITE_SRC2_B32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_WRITE_SRC2_B32

    class Inst_DS__DS_MIN_SRC2_F32 : public Inst_DS
    {
      public:
        Inst_DS__DS_MIN_SRC2_F32(InFmt_DS*);
        ~Inst_DS__DS_MIN_SRC2_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MIN_SRC2_F32

    class Inst_DS__DS_MAX_SRC2_F32 : public Inst_DS
    {
      public:
        Inst_DS__DS_MAX_SRC2_F32(InFmt_DS*);
        ~Inst_DS__DS_MAX_SRC2_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MAX_SRC2_F32

    class Inst_DS__DS_ADD_SRC2_F32 : public Inst_DS
    {
      public:
        Inst_DS__DS_ADD_SRC2_F32(InFmt_DS*);
        ~Inst_DS__DS_ADD_SRC2_F32();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_ADD_SRC2_F32

    class Inst_DS__DS_GWS_SEMA_RELEASE_ALL : public Inst_DS
    {
      public:
        Inst_DS__DS_GWS_SEMA_RELEASE_ALL(InFmt_DS*);
        ~Inst_DS__DS_GWS_SEMA_RELEASE_ALL();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_GWS_SEMA_RELEASE_ALL

    class Inst_DS__DS_GWS_INIT : public Inst_DS
    {
      public:
        Inst_DS__DS_GWS_INIT(InFmt_DS*);
        ~Inst_DS__DS_GWS_INIT();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_d0
                return 4;
              case 1: //vgpr_d0
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_GWS_INIT

    class Inst_DS__DS_GWS_SEMA_V : public Inst_DS
    {
      public:
        Inst_DS__DS_GWS_SEMA_V(InFmt_DS*);
        ~Inst_DS__DS_GWS_SEMA_V();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_GWS_SEMA_V

    class Inst_DS__DS_GWS_SEMA_BR : public Inst_DS
    {
      public:
        Inst_DS__DS_GWS_SEMA_BR(InFmt_DS*);
        ~Inst_DS__DS_GWS_SEMA_BR();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_d0
                return 4;
              case 1: //vgpr_d0
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_GWS_SEMA_BR

    class Inst_DS__DS_GWS_SEMA_P : public Inst_DS
    {
      public:
        Inst_DS__DS_GWS_SEMA_P(InFmt_DS*);
        ~Inst_DS__DS_GWS_SEMA_P();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_GWS_SEMA_P

    class Inst_DS__DS_GWS_BARRIER : public Inst_DS
    {
      public:
        Inst_DS__DS_GWS_BARRIER(InFmt_DS*);
        ~Inst_DS__DS_GWS_BARRIER();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_d0
                return 4;
              case 1: //vgpr_d0
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_GWS_BARRIER

    class Inst_DS__DS_CONSUME : public Inst_DS
    {
      public:
        Inst_DS__DS_CONSUME(InFmt_DS*);
        ~Inst_DS__DS_CONSUME();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_CONSUME

    class Inst_DS__DS_APPEND : public Inst_DS
    {
      public:
        Inst_DS__DS_APPEND(InFmt_DS*);
        ~Inst_DS__DS_APPEND();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_APPEND

    class Inst_DS__DS_ORDERED_COUNT : public Inst_DS
    {
      public:
        Inst_DS__DS_ORDERED_COUNT(InFmt_DS*);
        ~Inst_DS__DS_ORDERED_COUNT();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_rtn
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_ORDERED_COUNT

    class Inst_DS__DS_ADD_SRC2_U64 : public Inst_DS
    {
      public:
        Inst_DS__DS_ADD_SRC2_U64(InFmt_DS*);
        ~Inst_DS__DS_ADD_SRC2_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_ADD_SRC2_U64

    class Inst_DS__DS_SUB_SRC2_U64 : public Inst_DS
    {
      public:
        Inst_DS__DS_SUB_SRC2_U64(InFmt_DS*);
        ~Inst_DS__DS_SUB_SRC2_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_SUB_SRC2_U64

    class Inst_DS__DS_RSUB_SRC2_U64 : public Inst_DS
    {
      public:
        Inst_DS__DS_RSUB_SRC2_U64(InFmt_DS*);
        ~Inst_DS__DS_RSUB_SRC2_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_RSUB_SRC2_U64

    class Inst_DS__DS_INC_SRC2_U64 : public Inst_DS
    {
      public:
        Inst_DS__DS_INC_SRC2_U64(InFmt_DS*);
        ~Inst_DS__DS_INC_SRC2_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_INC_SRC2_U64

    class Inst_DS__DS_DEC_SRC2_U64 : public Inst_DS
    {
      public:
        Inst_DS__DS_DEC_SRC2_U64(InFmt_DS*);
        ~Inst_DS__DS_DEC_SRC2_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_DEC_SRC2_U64

    class Inst_DS__DS_MIN_SRC2_I64 : public Inst_DS
    {
      public:
        Inst_DS__DS_MIN_SRC2_I64(InFmt_DS*);
        ~Inst_DS__DS_MIN_SRC2_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MIN_SRC2_I64

    class Inst_DS__DS_MAX_SRC2_I64 : public Inst_DS
    {
      public:
        Inst_DS__DS_MAX_SRC2_I64(InFmt_DS*);
        ~Inst_DS__DS_MAX_SRC2_I64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MAX_SRC2_I64

    class Inst_DS__DS_MIN_SRC2_U64 : public Inst_DS
    {
      public:
        Inst_DS__DS_MIN_SRC2_U64(InFmt_DS*);
        ~Inst_DS__DS_MIN_SRC2_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MIN_SRC2_U64

    class Inst_DS__DS_MAX_SRC2_U64 : public Inst_DS
    {
      public:
        Inst_DS__DS_MAX_SRC2_U64(InFmt_DS*);
        ~Inst_DS__DS_MAX_SRC2_U64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MAX_SRC2_U64

    class Inst_DS__DS_AND_SRC2_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_AND_SRC2_B64(InFmt_DS*);
        ~Inst_DS__DS_AND_SRC2_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_AND_SRC2_B64

    class Inst_DS__DS_OR_SRC2_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_OR_SRC2_B64(InFmt_DS*);
        ~Inst_DS__DS_OR_SRC2_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_OR_SRC2_B64

    class Inst_DS__DS_XOR_SRC2_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_XOR_SRC2_B64(InFmt_DS*);
        ~Inst_DS__DS_XOR_SRC2_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_XOR_SRC2_B64

    class Inst_DS__DS_WRITE_SRC2_B64 : public Inst_DS
    {
      public:
        Inst_DS__DS_WRITE_SRC2_B64(InFmt_DS*);
        ~Inst_DS__DS_WRITE_SRC2_B64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_WRITE_SRC2_B64

    class Inst_DS__DS_MIN_SRC2_F64 : public Inst_DS
    {
      public:
        Inst_DS__DS_MIN_SRC2_F64(InFmt_DS*);
        ~Inst_DS__DS_MIN_SRC2_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MIN_SRC2_F64

    class Inst_DS__DS_MAX_SRC2_F64 : public Inst_DS
    {
      public:
        Inst_DS__DS_MAX_SRC2_F64(InFmt_DS*);
        ~Inst_DS__DS_MAX_SRC2_F64();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_DS__DS_MAX_SRC2_F64

    class Inst_DS__DS_WRITE_B96 : public Inst_DS
    {
      public:
        Inst_DS__DS_WRITE_B96(InFmt_DS*);
        ~Inst_DS__DS_WRITE_B96();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 12;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_DS__DS_WRITE_B96

    class Inst_DS__DS_WRITE_B128 : public Inst_DS
    {
      public:
        Inst_DS__DS_WRITE_B128(InFmt_DS*);
        ~Inst_DS__DS_WRITE_B128();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_d0
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_DS__DS_WRITE_B128

    class Inst_DS__DS_READ_B96 : public Inst_DS
    {
      public:
        Inst_DS__DS_READ_B96(InFmt_DS*);
        ~Inst_DS__DS_READ_B96();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_rtn
                return 12;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_DS__DS_READ_B96

    class Inst_DS__DS_READ_B128 : public Inst_DS
    {
      public:
        Inst_DS__DS_READ_B128(InFmt_DS*);
        ~Inst_DS__DS_READ_B128();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //vgpr_rtn
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_DS__DS_READ_B128

    class Inst_MUBUF__BUFFER_LOAD_FORMAT_X : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_LOAD_FORMAT_X(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_LOAD_FORMAT_X();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 4;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 32;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_LOAD_FORMAT_X

    class Inst_MUBUF__BUFFER_LOAD_FORMAT_XY : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_LOAD_FORMAT_XY(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_LOAD_FORMAT_XY();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 4;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_LOAD_FORMAT_XY

    class Inst_MUBUF__BUFFER_LOAD_FORMAT_XYZ : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_LOAD_FORMAT_XYZ(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_LOAD_FORMAT_XYZ();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 4;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 12;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_LOAD_FORMAT_XYZ

    class Inst_MUBUF__BUFFER_LOAD_FORMAT_XYZW : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_LOAD_FORMAT_XYZW(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_LOAD_FORMAT_XYZW();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 4;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_LOAD_FORMAT_XYZW

    class Inst_MUBUF__BUFFER_STORE_FORMAT_X : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_STORE_FORMAT_X(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_STORE_FORMAT_X();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_s
                return 4;
              case 1: //vgpr_a
                return 8;
              case 2: //sgpr_r
                return 4;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_STORE_FORMAT_X

    class Inst_MUBUF__BUFFER_STORE_FORMAT_XY : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_STORE_FORMAT_XY(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_STORE_FORMAT_XY();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_s
                return 8;
              case 1: //vgpr_a
                return 8;
              case 2: //sgpr_r
                return 4;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_STORE_FORMAT_XY

    class Inst_MUBUF__BUFFER_STORE_FORMAT_XYZ : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_STORE_FORMAT_XYZ(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_STORE_FORMAT_XYZ();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_s
                return 12;
              case 1: //vgpr_a
                return 8;
              case 2: //sgpr_r
                return 4;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_STORE_FORMAT_XYZ

    class Inst_MUBUF__BUFFER_STORE_FORMAT_XYZW : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_STORE_FORMAT_XYZW(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_STORE_FORMAT_XYZW();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_s
                return 16;
              case 1: //vgpr_a
                return 8;
              case 2: //sgpr_r
                return 4;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_STORE_FORMAT_XYZW

    class Inst_MUBUF__BUFFER_LOAD_FORMAT_D16_X : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_LOAD_FORMAT_D16_X(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_LOAD_FORMAT_D16_X();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 4;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_LOAD_FORMAT_D16_X

    class Inst_MUBUF__BUFFER_LOAD_FORMAT_D16_XY : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_LOAD_FORMAT_D16_XY(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_LOAD_FORMAT_D16_XY();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 4;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_LOAD_FORMAT_D16_XY

    class Inst_MUBUF__BUFFER_LOAD_FORMAT_D16_XYZ : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_LOAD_FORMAT_D16_XYZ(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_LOAD_FORMAT_D16_XYZ();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 4;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 12;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_LOAD_FORMAT_D16_XYZ

    class Inst_MUBUF__BUFFER_LOAD_FORMAT_D16_XYZW : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_LOAD_FORMAT_D16_XYZW(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_LOAD_FORMAT_D16_XYZW();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 4;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_LOAD_FORMAT_D16_XYZW

    class Inst_MUBUF__BUFFER_STORE_FORMAT_D16_X : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_STORE_FORMAT_D16_X(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_STORE_FORMAT_D16_X();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_s
                return 4;
              case 1: //vgpr_a
                return 8;
              case 2: //sgpr_r
                return 4;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_STORE_FORMAT_D16_X

    class Inst_MUBUF__BUFFER_STORE_FORMAT_D16_XY : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_STORE_FORMAT_D16_XY(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_STORE_FORMAT_D16_XY();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_s
                return 8;
              case 1: //vgpr_a
                return 8;
              case 2: //sgpr_r
                return 4;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_STORE_FORMAT_D16_XY

    class Inst_MUBUF__BUFFER_STORE_FORMAT_D16_XYZ : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_STORE_FORMAT_D16_XYZ(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_STORE_FORMAT_D16_XYZ();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_s
                return 12;
              case 1: //vgpr_a
                return 8;
              case 2: //sgpr_r
                return 4;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_STORE_FORMAT_D16_XYZ

    class Inst_MUBUF__BUFFER_STORE_FORMAT_D16_XYZW : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_STORE_FORMAT_D16_XYZW(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_STORE_FORMAT_D16_XYZW();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_s
                return 16;
              case 1: //vgpr_a
                return 8;
              case 2: //sgpr_r
                return 4;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_STORE_FORMAT_D16_XYZW

    class Inst_MUBUF__BUFFER_LOAD_UBYTE : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_LOAD_UBYTE(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_LOAD_UBYTE();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_d
                return 4;
              case 1: //vgpr_a
                if (instData.OFFEN && instData.IDXEN) {
                    // if we need an idx and offset from a
                    // VGPR, we'll read VGPR[VADDR] and
                    // VGPR[VADDR + 1], otherwise we just
                    // read VGPR[VADDR]
                    return 8;
                } else {
                    return 4;
                }
              case 2: //sgpr_r
                return 16;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_LOAD_UBYTE

    class Inst_MUBUF__BUFFER_LOAD_SBYTE : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_LOAD_SBYTE(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_LOAD_SBYTE();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_LOAD_SBYTE

    class Inst_MUBUF__BUFFER_LOAD_USHORT : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_LOAD_USHORT(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_LOAD_USHORT();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_LOAD_USHORT

    class Inst_MUBUF__BUFFER_LOAD_SSHORT : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_LOAD_SSHORT(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_LOAD_SSHORT();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 32;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_LOAD_SSHORT

    class Inst_MUBUF__BUFFER_LOAD_DWORD : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_LOAD_DWORD(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_LOAD_DWORD();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_LOAD_DWORD

    class Inst_MUBUF__BUFFER_LOAD_DWORDX2 : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_LOAD_DWORDX2(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_LOAD_DWORDX2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_LOAD_DWORDX2

    class Inst_MUBUF__BUFFER_LOAD_DWORDX3 : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_LOAD_DWORDX3(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_LOAD_DWORDX3();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 12;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_LOAD_DWORDX3

    class Inst_MUBUF__BUFFER_LOAD_DWORDX4 : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_LOAD_DWORDX4(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_LOAD_DWORDX4();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_LOAD_DWORDX4

    class Inst_MUBUF__BUFFER_STORE_BYTE : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_STORE_BYTE(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_STORE_BYTE();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_s
                return 4;
              case 1: //vgpr_a
                if (instData.OFFEN && instData.IDXEN) {
                    // if we need an idx and offset from a
                    // VGPR, we'll read VGPR[VADDR] and
                    // VGPR[VADDR + 1], otherwise we just
                    // read VGPR[VADDR]
                    return 8;
                } else {
                    return 4;
                }
              case 2: //sgpr_r
                return 16;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_STORE_BYTE

    class Inst_MUBUF__BUFFER_STORE_SHORT : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_STORE_SHORT(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_STORE_SHORT();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_s
                return 4;
              case 1: //vgpr_a
                return 8;
              case 2: //sgpr_r
                return 16;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_STORE_SHORT

    class Inst_MUBUF__BUFFER_STORE_DWORD : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_STORE_DWORD(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_STORE_DWORD();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_s
                return 4;
              case 1: //vgpr_a
                return 8;
              case 2: //sgpr_r
                return 16;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_STORE_DWORD

    class Inst_MUBUF__BUFFER_STORE_DWORDX2 : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_STORE_DWORDX2(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_STORE_DWORDX2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_s
                return 8;
              case 1: //vgpr_a
                return 8;
              case 2: //sgpr_r
                return 16;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_STORE_DWORDX2

    class Inst_MUBUF__BUFFER_STORE_DWORDX3 : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_STORE_DWORDX3(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_STORE_DWORDX3();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_s
                return 12;
              case 1: //vgpr_a
                return 8;
              case 2: //sgpr_r
                return 16;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_STORE_DWORDX3

    class Inst_MUBUF__BUFFER_STORE_DWORDX4 : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_STORE_DWORDX4(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_STORE_DWORDX4();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_s
                return 16;
              case 1: //vgpr_a
                return 8;
              case 2: //sgpr_r
                return 16;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_STORE_DWORDX4

    class Inst_MUBUF__BUFFER_STORE_LDS_DWORD : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_STORE_LDS_DWORD(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_STORE_LDS_DWORD();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //sgpr_r
                return 16;
              case 1: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_STORE_LDS_DWORD

    class Inst_MUBUF__BUFFER_WBINVL1 : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_WBINVL1(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_WBINVL1();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_WBINVL1

    class Inst_MUBUF__BUFFER_WBINVL1_VOL : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_WBINVL1_VOL(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_WBINVL1_VOL();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 0; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_WBINVL1_VOL

    class Inst_MUBUF__BUFFER_ATOMIC_SWAP : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_SWAP(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_SWAP();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_SWAP

    class Inst_MUBUF__BUFFER_ATOMIC_CMPSWAP : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_CMPSWAP(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_CMPSWAP();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_CMPSWAP

    class Inst_MUBUF__BUFFER_ATOMIC_ADD : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_ADD(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_ADD();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_ADD

    class Inst_MUBUF__BUFFER_ATOMIC_SUB : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_SUB(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_SUB();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_SUB

    class Inst_MUBUF__BUFFER_ATOMIC_SMIN : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_SMIN(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_SMIN();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_SMIN

    class Inst_MUBUF__BUFFER_ATOMIC_UMIN : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_UMIN(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_UMIN();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 32;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_UMIN

    class Inst_MUBUF__BUFFER_ATOMIC_SMAX : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_SMAX(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_SMAX();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 32;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_SMAX

    class Inst_MUBUF__BUFFER_ATOMIC_UMAX : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_UMAX(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_UMAX();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 32;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_UMAX

    class Inst_MUBUF__BUFFER_ATOMIC_AND : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_AND(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_AND();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 32;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_AND

    class Inst_MUBUF__BUFFER_ATOMIC_OR : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_OR(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_OR();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 32;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_OR

    class Inst_MUBUF__BUFFER_ATOMIC_XOR : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_XOR(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_XOR();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 32;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_XOR

    class Inst_MUBUF__BUFFER_ATOMIC_INC : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_INC(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_INC();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 32;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_INC

    class Inst_MUBUF__BUFFER_ATOMIC_DEC : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_DEC(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_DEC();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 32;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_DEC

    class Inst_MUBUF__BUFFER_ATOMIC_SWAP_X2 : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_SWAP_X2(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_SWAP_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_SWAP_X2

    class Inst_MUBUF__BUFFER_ATOMIC_CMPSWAP_X2 : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_CMPSWAP_X2(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_CMPSWAP_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_CMPSWAP_X2

    class Inst_MUBUF__BUFFER_ATOMIC_ADD_X2 : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_ADD_X2(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_ADD_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_ADD_X2

    class Inst_MUBUF__BUFFER_ATOMIC_SUB_X2 : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_SUB_X2(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_SUB_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_SUB_X2

    class Inst_MUBUF__BUFFER_ATOMIC_SMIN_X2 : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_SMIN_X2(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_SMIN_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_SMIN_X2

    class Inst_MUBUF__BUFFER_ATOMIC_UMIN_X2 : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_UMIN_X2(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_UMIN_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_UMIN_X2

    class Inst_MUBUF__BUFFER_ATOMIC_SMAX_X2 : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_SMAX_X2(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_SMAX_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_SMAX_X2

    class Inst_MUBUF__BUFFER_ATOMIC_UMAX_X2 : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_UMAX_X2(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_UMAX_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_UMAX_X2

    class Inst_MUBUF__BUFFER_ATOMIC_AND_X2 : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_AND_X2(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_AND_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_AND_X2

    class Inst_MUBUF__BUFFER_ATOMIC_OR_X2 : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_OR_X2(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_OR_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_OR_X2

    class Inst_MUBUF__BUFFER_ATOMIC_XOR_X2 : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_XOR_X2(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_XOR_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_XOR_X2

    class Inst_MUBUF__BUFFER_ATOMIC_INC_X2 : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_INC_X2(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_INC_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_INC_X2

    class Inst_MUBUF__BUFFER_ATOMIC_DEC_X2 : public Inst_MUBUF
    {
      public:
        Inst_MUBUF__BUFFER_ATOMIC_DEC_X2(InFmt_MUBUF*);
        ~Inst_MUBUF__BUFFER_ATOMIC_DEC_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 16;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MUBUF__BUFFER_ATOMIC_DEC_X2

    class Inst_MTBUF__TBUFFER_LOAD_FORMAT_X : public Inst_MTBUF
    {
      public:
        Inst_MTBUF__TBUFFER_LOAD_FORMAT_X(InFmt_MTBUF*);
        ~Inst_MTBUF__TBUFFER_LOAD_FORMAT_X();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 4;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 32;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MTBUF__TBUFFER_LOAD_FORMAT_X

    class Inst_MTBUF__TBUFFER_LOAD_FORMAT_XY : public Inst_MTBUF
    {
      public:
        Inst_MTBUF__TBUFFER_LOAD_FORMAT_XY(InFmt_MTBUF*);
        ~Inst_MTBUF__TBUFFER_LOAD_FORMAT_XY();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 4;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MTBUF__TBUFFER_LOAD_FORMAT_XY

    class Inst_MTBUF__TBUFFER_LOAD_FORMAT_XYZ : public Inst_MTBUF
    {
      public:
        Inst_MTBUF__TBUFFER_LOAD_FORMAT_XYZ(InFmt_MTBUF*);
        ~Inst_MTBUF__TBUFFER_LOAD_FORMAT_XYZ();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 4;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 12;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MTBUF__TBUFFER_LOAD_FORMAT_XYZ

    class Inst_MTBUF__TBUFFER_LOAD_FORMAT_XYZW : public Inst_MTBUF
    {
      public:
        Inst_MTBUF__TBUFFER_LOAD_FORMAT_XYZW(InFmt_MTBUF*);
        ~Inst_MTBUF__TBUFFER_LOAD_FORMAT_XYZW();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 4;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MTBUF__TBUFFER_LOAD_FORMAT_XYZW

    class Inst_MTBUF__TBUFFER_STORE_FORMAT_X : public Inst_MTBUF
    {
      public:
        Inst_MTBUF__TBUFFER_STORE_FORMAT_X(InFmt_MTBUF*);
        ~Inst_MTBUF__TBUFFER_STORE_FORMAT_X();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_d
                return 32;
              case 1: //vgpr_a
                return 8;
              case 2: //sgpr_r
                return 4;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MTBUF__TBUFFER_STORE_FORMAT_X

    class Inst_MTBUF__TBUFFER_STORE_FORMAT_XY : public Inst_MTBUF
    {
      public:
        Inst_MTBUF__TBUFFER_STORE_FORMAT_XY(InFmt_MTBUF*);
        ~Inst_MTBUF__TBUFFER_STORE_FORMAT_XY();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_d
                return 8;
              case 1: //vgpr_a
                return 8;
              case 2: //sgpr_r
                return 4;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MTBUF__TBUFFER_STORE_FORMAT_XY

    class Inst_MTBUF__TBUFFER_STORE_FORMAT_XYZ : public Inst_MTBUF
    {
      public:
        Inst_MTBUF__TBUFFER_STORE_FORMAT_XYZ(InFmt_MTBUF*);
        ~Inst_MTBUF__TBUFFER_STORE_FORMAT_XYZ();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_d
                return 12;
              case 1: //vgpr_a
                return 8;
              case 2: //sgpr_r
                return 4;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MTBUF__TBUFFER_STORE_FORMAT_XYZ

    class Inst_MTBUF__TBUFFER_STORE_FORMAT_XYZW : public Inst_MTBUF
    {
      public:
        Inst_MTBUF__TBUFFER_STORE_FORMAT_XYZW(InFmt_MTBUF*);
        ~Inst_MTBUF__TBUFFER_STORE_FORMAT_XYZW();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_d
                return 16;
              case 1: //vgpr_a
                return 8;
              case 2: //sgpr_r
                return 4;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MTBUF__TBUFFER_STORE_FORMAT_XYZW

    class Inst_MTBUF__TBUFFER_LOAD_FORMAT_D16_X : public Inst_MTBUF
    {
      public:
        Inst_MTBUF__TBUFFER_LOAD_FORMAT_D16_X(InFmt_MTBUF*);
        ~Inst_MTBUF__TBUFFER_LOAD_FORMAT_D16_X();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 4;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 32;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MTBUF__TBUFFER_LOAD_FORMAT_D16_X

    class Inst_MTBUF__TBUFFER_LOAD_FORMAT_D16_XY : public Inst_MTBUF
    {
      public:
        Inst_MTBUF__TBUFFER_LOAD_FORMAT_D16_XY(InFmt_MTBUF*);
        ~Inst_MTBUF__TBUFFER_LOAD_FORMAT_D16_XY();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 4;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MTBUF__TBUFFER_LOAD_FORMAT_D16_XY

    class Inst_MTBUF__TBUFFER_LOAD_FORMAT_D16_XYZ : public Inst_MTBUF
    {
      public:
        Inst_MTBUF__TBUFFER_LOAD_FORMAT_D16_XYZ(InFmt_MTBUF*);
        ~Inst_MTBUF__TBUFFER_LOAD_FORMAT_D16_XYZ();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 4;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 12;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MTBUF__TBUFFER_LOAD_FORMAT_D16_XYZ

    class Inst_MTBUF__TBUFFER_LOAD_FORMAT_D16_XYZW : public Inst_MTBUF
    {
      public:
        Inst_MTBUF__TBUFFER_LOAD_FORMAT_D16_XYZW(InFmt_MTBUF*);
        ~Inst_MTBUF__TBUFFER_LOAD_FORMAT_D16_XYZW();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 8;
              case 1: //sgpr_r
                return 4;
              case 2: //sgpr_o
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MTBUF__TBUFFER_LOAD_FORMAT_D16_XYZW

    class Inst_MTBUF__TBUFFER_STORE_FORMAT_D16_X : public Inst_MTBUF
    {
      public:
        Inst_MTBUF__TBUFFER_STORE_FORMAT_D16_X(InFmt_MTBUF*);
        ~Inst_MTBUF__TBUFFER_STORE_FORMAT_D16_X();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_d
                return 32;
              case 1: //vgpr_a
                return 8;
              case 2: //sgpr_r
                return 4;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MTBUF__TBUFFER_STORE_FORMAT_D16_X

    class Inst_MTBUF__TBUFFER_STORE_FORMAT_D16_XY : public Inst_MTBUF
    {
      public:
        Inst_MTBUF__TBUFFER_STORE_FORMAT_D16_XY(InFmt_MTBUF*);
        ~Inst_MTBUF__TBUFFER_STORE_FORMAT_D16_XY();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_d
                return 8;
              case 1: //vgpr_a
                return 8;
              case 2: //sgpr_r
                return 4;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MTBUF__TBUFFER_STORE_FORMAT_D16_XY

    class Inst_MTBUF__TBUFFER_STORE_FORMAT_D16_XYZ : public Inst_MTBUF
    {
      public:
        Inst_MTBUF__TBUFFER_STORE_FORMAT_D16_XYZ(InFmt_MTBUF*);
        ~Inst_MTBUF__TBUFFER_STORE_FORMAT_D16_XYZ();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_d
                return 12;
              case 1: //vgpr_a
                return 8;
              case 2: //sgpr_r
                return 4;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MTBUF__TBUFFER_STORE_FORMAT_D16_XYZ

    class Inst_MTBUF__TBUFFER_STORE_FORMAT_D16_XYZW : public Inst_MTBUF
    {
      public:
        Inst_MTBUF__TBUFFER_STORE_FORMAT_D16_XYZW(InFmt_MTBUF*);
        ~Inst_MTBUF__TBUFFER_STORE_FORMAT_D16_XYZW();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_d
                return 16;
              case 1: //vgpr_a
                return 8;
              case 2: //sgpr_r
                return 4;
              case 3: //sgpr_o
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MTBUF__TBUFFER_STORE_FORMAT_D16_XYZW

    class Inst_MIMG__IMAGE_LOAD : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_LOAD(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_LOAD();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 16;
              case 1: //sgpr_r
                return 32;
              case 2: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_LOAD

    class Inst_MIMG__IMAGE_LOAD_MIP : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_LOAD_MIP(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_LOAD_MIP();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 16;
              case 1: //sgpr_r
                return 32;
              case 2: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_LOAD_MIP

    class Inst_MIMG__IMAGE_LOAD_PCK : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_LOAD_PCK(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_LOAD_PCK();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 16;
              case 1: //sgpr_r
                return 32;
              case 2: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_LOAD_PCK

    class Inst_MIMG__IMAGE_LOAD_PCK_SGN : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_LOAD_PCK_SGN(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_LOAD_PCK_SGN();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 16;
              case 1: //sgpr_r
                return 32;
              case 2: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_LOAD_PCK_SGN

    class Inst_MIMG__IMAGE_LOAD_MIP_PCK : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_LOAD_MIP_PCK(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_LOAD_MIP_PCK();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 16;
              case 1: //sgpr_r
                return 32;
              case 2: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_LOAD_MIP_PCK

    class Inst_MIMG__IMAGE_LOAD_MIP_PCK_SGN : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_LOAD_MIP_PCK_SGN(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_LOAD_MIP_PCK_SGN();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 16;
              case 1: //sgpr_r
                return 32;
              case 2: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_LOAD_MIP_PCK_SGN

    class Inst_MIMG__IMAGE_STORE : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_STORE(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_STORE();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_d
                return 16;
              case 1: //vgpr_a
                return 16;
              case 2: //sgpr_r
                return 32;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_STORE

    class Inst_MIMG__IMAGE_STORE_MIP : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_STORE_MIP(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_STORE_MIP();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_d
                return 16;
              case 1: //vgpr_a
                return 16;
              case 2: //sgpr_r
                return 32;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_STORE_MIP

    class Inst_MIMG__IMAGE_STORE_PCK : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_STORE_PCK(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_STORE_PCK();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_d
                return 16;
              case 1: //vgpr_a
                return 16;
              case 2: //sgpr_r
                return 32;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_STORE_PCK

    class Inst_MIMG__IMAGE_STORE_MIP_PCK : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_STORE_MIP_PCK(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_STORE_MIP_PCK();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_d
                return 16;
              case 1: //vgpr_a
                return 16;
              case 2: //sgpr_r
                return 32;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_STORE_MIP_PCK

    class Inst_MIMG__IMAGE_GET_RESINFO : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GET_RESINFO(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GET_RESINFO();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 16;
              case 1: //sgpr_r
                return 32;
              case 2: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GET_RESINFO

    class Inst_MIMG__IMAGE_ATOMIC_SWAP : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_ATOMIC_SWAP(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_ATOMIC_SWAP();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 32;
              case 1: //sgpr_r
                return 32;
              case 2: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_ATOMIC_SWAP

    class Inst_MIMG__IMAGE_ATOMIC_CMPSWAP : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_ATOMIC_CMPSWAP(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_ATOMIC_CMPSWAP();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 32;
              case 1: //sgpr_r
                return 32;
              case 2: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_ATOMIC_CMPSWAP

    class Inst_MIMG__IMAGE_ATOMIC_ADD : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_ATOMIC_ADD(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_ATOMIC_ADD();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 32;
              case 1: //sgpr_r
                return 32;
              case 2: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_ATOMIC_ADD

    class Inst_MIMG__IMAGE_ATOMIC_SUB : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_ATOMIC_SUB(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_ATOMIC_SUB();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 32;
              case 1: //sgpr_r
                return 32;
              case 2: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_ATOMIC_SUB

    class Inst_MIMG__IMAGE_ATOMIC_SMIN : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_ATOMIC_SMIN(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_ATOMIC_SMIN();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 32;
              case 1: //sgpr_r
                return 32;
              case 2: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_ATOMIC_SMIN

    class Inst_MIMG__IMAGE_ATOMIC_UMIN : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_ATOMIC_UMIN(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_ATOMIC_UMIN();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 32;
              case 1: //sgpr_r
                return 32;
              case 2: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_ATOMIC_UMIN

    class Inst_MIMG__IMAGE_ATOMIC_SMAX : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_ATOMIC_SMAX(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_ATOMIC_SMAX();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 32;
              case 1: //sgpr_r
                return 32;
              case 2: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_ATOMIC_SMAX

    class Inst_MIMG__IMAGE_ATOMIC_UMAX : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_ATOMIC_UMAX(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_ATOMIC_UMAX();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 32;
              case 1: //sgpr_r
                return 32;
              case 2: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_ATOMIC_UMAX

    class Inst_MIMG__IMAGE_ATOMIC_AND : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_ATOMIC_AND(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_ATOMIC_AND();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 32;
              case 1: //sgpr_r
                return 32;
              case 2: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_ATOMIC_AND

    class Inst_MIMG__IMAGE_ATOMIC_OR : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_ATOMIC_OR(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_ATOMIC_OR();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 32;
              case 1: //sgpr_r
                return 32;
              case 2: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_ATOMIC_OR

    class Inst_MIMG__IMAGE_ATOMIC_XOR : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_ATOMIC_XOR(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_ATOMIC_XOR();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 32;
              case 1: //sgpr_r
                return 32;
              case 2: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_ATOMIC_XOR

    class Inst_MIMG__IMAGE_ATOMIC_INC : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_ATOMIC_INC(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_ATOMIC_INC();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 32;
              case 1: //sgpr_r
                return 32;
              case 2: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_ATOMIC_INC

    class Inst_MIMG__IMAGE_ATOMIC_DEC : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_ATOMIC_DEC(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_ATOMIC_DEC();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 32;
              case 1: //sgpr_r
                return 32;
              case 2: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_ATOMIC_DEC

    class Inst_MIMG__IMAGE_SAMPLE : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE

    class Inst_MIMG__IMAGE_SAMPLE_CL : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_CL(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_CL();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_CL

    class Inst_MIMG__IMAGE_SAMPLE_D : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_D(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_D();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_D

    class Inst_MIMG__IMAGE_SAMPLE_D_CL : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_D_CL(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_D_CL();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_D_CL

    class Inst_MIMG__IMAGE_SAMPLE_L : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_L(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_L();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_L

    class Inst_MIMG__IMAGE_SAMPLE_B : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_B(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_B();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_B

    class Inst_MIMG__IMAGE_SAMPLE_B_CL : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_B_CL(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_B_CL();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_B_CL

    class Inst_MIMG__IMAGE_SAMPLE_LZ : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_LZ(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_LZ();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_LZ

    class Inst_MIMG__IMAGE_SAMPLE_C : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_C(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_C();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_C

    class Inst_MIMG__IMAGE_SAMPLE_C_CL : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_C_CL(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_C_CL();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_C_CL

    class Inst_MIMG__IMAGE_SAMPLE_C_D : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_C_D(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_C_D();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_C_D

    class Inst_MIMG__IMAGE_SAMPLE_C_D_CL : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_C_D_CL(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_C_D_CL();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_C_D_CL

    class Inst_MIMG__IMAGE_SAMPLE_C_L : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_C_L(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_C_L();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_C_L

    class Inst_MIMG__IMAGE_SAMPLE_C_B : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_C_B(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_C_B();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_C_B

    class Inst_MIMG__IMAGE_SAMPLE_C_B_CL : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_C_B_CL(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_C_B_CL();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_C_B_CL

    class Inst_MIMG__IMAGE_SAMPLE_C_LZ : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_C_LZ(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_C_LZ();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_C_LZ

    class Inst_MIMG__IMAGE_SAMPLE_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_O

    class Inst_MIMG__IMAGE_SAMPLE_CL_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_CL_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_CL_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_CL_O

    class Inst_MIMG__IMAGE_SAMPLE_D_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_D_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_D_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_D_O

    class Inst_MIMG__IMAGE_SAMPLE_D_CL_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_D_CL_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_D_CL_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_D_CL_O

    class Inst_MIMG__IMAGE_SAMPLE_L_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_L_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_L_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_L_O

    class Inst_MIMG__IMAGE_SAMPLE_B_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_B_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_B_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_B_O

    class Inst_MIMG__IMAGE_SAMPLE_B_CL_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_B_CL_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_B_CL_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_B_CL_O

    class Inst_MIMG__IMAGE_SAMPLE_LZ_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_LZ_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_LZ_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_LZ_O

    class Inst_MIMG__IMAGE_SAMPLE_C_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_C_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_C_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_C_O

    class Inst_MIMG__IMAGE_SAMPLE_C_CL_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_C_CL_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_C_CL_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_C_CL_O

    class Inst_MIMG__IMAGE_SAMPLE_C_D_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_C_D_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_C_D_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_C_D_O

    class Inst_MIMG__IMAGE_SAMPLE_C_D_CL_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_C_D_CL_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_C_D_CL_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_C_D_CL_O

    class Inst_MIMG__IMAGE_SAMPLE_C_L_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_C_L_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_C_L_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_C_L_O

    class Inst_MIMG__IMAGE_SAMPLE_C_B_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_C_B_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_C_B_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_C_B_O

    class Inst_MIMG__IMAGE_SAMPLE_C_B_CL_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_C_B_CL_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_C_B_CL_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_C_B_CL_O

    class Inst_MIMG__IMAGE_SAMPLE_C_LZ_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_C_LZ_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_C_LZ_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_C_LZ_O

    class Inst_MIMG__IMAGE_GATHER4 : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4

    class Inst_MIMG__IMAGE_GATHER4_CL : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_CL(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_CL();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_CL

    class Inst_MIMG__IMAGE_GATHER4_L : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_L(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_L();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_L

    class Inst_MIMG__IMAGE_GATHER4_B : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_B(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_B();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_B

    class Inst_MIMG__IMAGE_GATHER4_B_CL : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_B_CL(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_B_CL();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_B_CL

    class Inst_MIMG__IMAGE_GATHER4_LZ : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_LZ(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_LZ();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_LZ

    class Inst_MIMG__IMAGE_GATHER4_C : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_C(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_C();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_C

    class Inst_MIMG__IMAGE_GATHER4_C_CL : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_C_CL(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_C_CL();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_C_CL

    class Inst_MIMG__IMAGE_GATHER4_C_L : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_C_L(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_C_L();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_C_L

    class Inst_MIMG__IMAGE_GATHER4_C_B : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_C_B(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_C_B();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_C_B

    class Inst_MIMG__IMAGE_GATHER4_C_B_CL : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_C_B_CL(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_C_B_CL();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_C_B_CL

    class Inst_MIMG__IMAGE_GATHER4_C_LZ : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_C_LZ(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_C_LZ();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_C_LZ

    class Inst_MIMG__IMAGE_GATHER4_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_O

    class Inst_MIMG__IMAGE_GATHER4_CL_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_CL_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_CL_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_CL_O

    class Inst_MIMG__IMAGE_GATHER4_L_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_L_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_L_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_L_O

    class Inst_MIMG__IMAGE_GATHER4_B_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_B_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_B_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_B_O

    class Inst_MIMG__IMAGE_GATHER4_B_CL_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_B_CL_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_B_CL_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_B_CL_O

    class Inst_MIMG__IMAGE_GATHER4_LZ_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_LZ_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_LZ_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_LZ_O

    class Inst_MIMG__IMAGE_GATHER4_C_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_C_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_C_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_C_O

    class Inst_MIMG__IMAGE_GATHER4_C_CL_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_C_CL_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_C_CL_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_C_CL_O

    class Inst_MIMG__IMAGE_GATHER4_C_L_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_C_L_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_C_L_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_C_L_O

    class Inst_MIMG__IMAGE_GATHER4_C_B_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_C_B_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_C_B_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_C_B_O

    class Inst_MIMG__IMAGE_GATHER4_C_B_CL_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_C_B_CL_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_C_B_CL_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_C_B_CL_O

    class Inst_MIMG__IMAGE_GATHER4_C_LZ_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GATHER4_C_LZ_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GATHER4_C_LZ_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GATHER4_C_LZ_O

    class Inst_MIMG__IMAGE_GET_LOD : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_GET_LOD(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_GET_LOD();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_GET_LOD

    class Inst_MIMG__IMAGE_SAMPLE_CD : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_CD(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_CD();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_CD

    class Inst_MIMG__IMAGE_SAMPLE_CD_CL : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_CD_CL(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_CD_CL();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_CD_CL

    class Inst_MIMG__IMAGE_SAMPLE_C_CD : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_C_CD(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_C_CD();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_C_CD

    class Inst_MIMG__IMAGE_SAMPLE_C_CD_CL : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_C_CD_CL(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_C_CD_CL();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_C_CD_CL

    class Inst_MIMG__IMAGE_SAMPLE_CD_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_CD_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_CD_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_CD_O

    class Inst_MIMG__IMAGE_SAMPLE_CD_CL_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_CD_CL_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_CD_CL_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_CD_CL_O

    class Inst_MIMG__IMAGE_SAMPLE_C_CD_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_C_CD_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_C_CD_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_C_CD_O

    class Inst_MIMG__IMAGE_SAMPLE_C_CD_CL_O : public Inst_MIMG
    {
      public:
        Inst_MIMG__IMAGE_SAMPLE_C_CD_CL_O(InFmt_MIMG*);
        ~Inst_MIMG__IMAGE_SAMPLE_C_CD_CL_O();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 3; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_a
                return 4;
              case 1: //sgpr_r
                return 32;
              case 2: //sgpr_s
                return 4;
              case 3: //vgpr_d
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_MIMG__IMAGE_SAMPLE_C_CD_CL_O

    class Inst_EXP__EXP : public Inst_EXP
    {
      public:
        Inst_EXP__EXP(InFmt_EXP*);
        ~Inst_EXP__EXP();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 4; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //
                return 32;
              case 1: //
                return 32;
              case 2: //
                return 32;
              case 3: //
                return 32;
              case 4: //
                return 32;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_EXP__EXP

    class Inst_FLAT__FLAT_LOAD_UBYTE : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_LOAD_UBYTE(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_LOAD_UBYTE();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_dst
                return 1;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_LOAD_UBYTE

    class Inst_FLAT__FLAT_LOAD_SBYTE : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_LOAD_SBYTE(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_LOAD_SBYTE();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_dst
                return 1;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_LOAD_SBYTE

    class Inst_FLAT__FLAT_LOAD_USHORT : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_LOAD_USHORT(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_LOAD_USHORT();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_dst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_LOAD_USHORT

    class Inst_FLAT__FLAT_LOAD_SSHORT : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_LOAD_SSHORT(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_LOAD_SSHORT();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_dst
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_LOAD_SSHORT

    class Inst_FLAT__FLAT_LOAD_DWORD : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_LOAD_DWORD(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_LOAD_DWORD();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_LOAD_DWORD

    class Inst_FLAT__FLAT_LOAD_DWORDX2 : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_LOAD_DWORDX2(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_LOAD_DWORDX2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_dst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_LOAD_DWORDX2

    class Inst_FLAT__FLAT_LOAD_DWORDX3 : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_LOAD_DWORDX3(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_LOAD_DWORDX3();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_dst
                return 12;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_LOAD_DWORDX3

    class Inst_FLAT__FLAT_LOAD_DWORDX4 : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_LOAD_DWORDX4(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_LOAD_DWORDX4();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 1; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_dst
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_LOAD_DWORDX4

    class Inst_FLAT__FLAT_STORE_BYTE : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_STORE_BYTE(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_STORE_BYTE();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 1;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_STORE_BYTE

    class Inst_FLAT__FLAT_STORE_SHORT : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_STORE_SHORT(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_STORE_SHORT();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 2;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_STORE_SHORT

    class Inst_FLAT__FLAT_STORE_DWORD : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_STORE_DWORD(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_STORE_DWORD();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_STORE_DWORD

    class Inst_FLAT__FLAT_STORE_DWORDX2 : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_STORE_DWORDX2(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_STORE_DWORDX2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_STORE_DWORDX2

    class Inst_FLAT__FLAT_STORE_DWORDX3 : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_STORE_DWORDX3(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_STORE_DWORDX3();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 12;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_STORE_DWORDX3

    class Inst_FLAT__FLAT_STORE_DWORDX4 : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_STORE_DWORDX4(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_STORE_DWORDX4();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 0; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 16;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_STORE_DWORDX4

    class Inst_FLAT__FLAT_ATOMIC_SWAP : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_SWAP(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_SWAP();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 4;
              case 2: //vgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_SWAP

    class Inst_FLAT__FLAT_ATOMIC_CMPSWAP : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_CMPSWAP(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_CMPSWAP();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 8;
              case 2: //vgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_CMPSWAP

    class Inst_FLAT__FLAT_ATOMIC_ADD : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_ADD(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_ADD();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 4;
              case 2: //vgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_ADD

    class Inst_FLAT__FLAT_ATOMIC_SUB : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_SUB(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_SUB();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 4;
              case 2: //vgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_SUB

    class Inst_FLAT__FLAT_ATOMIC_SMIN : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_SMIN(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_SMIN();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 4;
              case 2: //vgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_SMIN

    class Inst_FLAT__FLAT_ATOMIC_UMIN : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_UMIN(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_UMIN();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 4;
              case 2: //vgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_UMIN

    class Inst_FLAT__FLAT_ATOMIC_SMAX : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_SMAX(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_SMAX();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 4;
              case 2: //vgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_SMAX

    class Inst_FLAT__FLAT_ATOMIC_UMAX : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_UMAX(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_UMAX();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 4;
              case 2: //vgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_UMAX

    class Inst_FLAT__FLAT_ATOMIC_AND : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_AND(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_AND();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 4;
              case 2: //vgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_AND

    class Inst_FLAT__FLAT_ATOMIC_OR : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_OR(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_OR();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 4;
              case 2: //vgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_OR

    class Inst_FLAT__FLAT_ATOMIC_XOR : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_XOR(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_XOR();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 4;
              case 2: //vgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_XOR

    class Inst_FLAT__FLAT_ATOMIC_INC : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_INC(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_INC();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 4;
              case 2: //vgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_INC

    class Inst_FLAT__FLAT_ATOMIC_DEC : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_DEC(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_DEC();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 4;
              case 2: //vgpr_dst
                return 4;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_DEC

    class Inst_FLAT__FLAT_ATOMIC_SWAP_X2 : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_SWAP_X2(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_SWAP_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 8;
              case 2: //vgpr_dst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_SWAP_X2

    class Inst_FLAT__FLAT_ATOMIC_CMPSWAP_X2 : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_CMPSWAP_X2(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_CMPSWAP_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 16;
              case 2: //vgpr_dst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_CMPSWAP_X2

    class Inst_FLAT__FLAT_ATOMIC_ADD_X2 : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_ADD_X2(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_ADD_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 8;
              case 2: //vgpr_dst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_ADD_X2

    class Inst_FLAT__FLAT_ATOMIC_SUB_X2 : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_SUB_X2(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_SUB_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 8;
              case 2: //vgpr_dst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_SUB_X2

    class Inst_FLAT__FLAT_ATOMIC_SMIN_X2 : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_SMIN_X2(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_SMIN_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 8;
              case 2: //vgpr_dst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_SMIN_X2

    class Inst_FLAT__FLAT_ATOMIC_UMIN_X2 : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_UMIN_X2(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_UMIN_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 8;
              case 2: //vgpr_dst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_UMIN_X2

    class Inst_FLAT__FLAT_ATOMIC_SMAX_X2 : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_SMAX_X2(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_SMAX_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 8;
              case 2: //vgpr_dst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_SMAX_X2

    class Inst_FLAT__FLAT_ATOMIC_UMAX_X2 : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_UMAX_X2(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_UMAX_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 8;
              case 2: //vgpr_dst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_UMAX_X2

    class Inst_FLAT__FLAT_ATOMIC_AND_X2 : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_AND_X2(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_AND_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 8;
              case 2: //vgpr_dst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_AND_X2

    class Inst_FLAT__FLAT_ATOMIC_OR_X2 : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_OR_X2(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_OR_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 8;
              case 2: //vgpr_dst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_OR_X2

    class Inst_FLAT__FLAT_ATOMIC_XOR_X2 : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_XOR_X2(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_XOR_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 8;
              case 2: //vgpr_dst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_XOR_X2

    class Inst_FLAT__FLAT_ATOMIC_INC_X2 : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_INC_X2(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_INC_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 8;
              case 2: //vgpr_dst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_INC_X2

    class Inst_FLAT__FLAT_ATOMIC_DEC_X2 : public Inst_FLAT
    {
      public:
        Inst_FLAT__FLAT_ATOMIC_DEC_X2(InFmt_FLAT*);
        ~Inst_FLAT__FLAT_ATOMIC_DEC_X2();

        int
        getNumOperands() override
        {
            return numDstRegOperands() + numSrcRegOperands();
        } // getNumOperands

        int numDstRegOperands() override { return 1; }
        int numSrcRegOperands() override { return 2; }

        int
        getOperandSize(int opIdx) override
        {
            switch (opIdx) {
              case 0: //vgpr_addr
                return 8;
              case 1: //vgpr_src
                return 8;
              case 2: //vgpr_dst
                return 8;
              default:
                fatal("op idx %i out of bounds\n", opIdx);
                return -1;
            }
        } // getOperandSize

        void execute(GPUDynInstPtr) override;
        void initiateAcc(GPUDynInstPtr) override;
        void completeAcc(GPUDynInstPtr) override;
    }; // Inst_FLAT__FLAT_ATOMIC_DEC_X2
} // namespace Gcn3ISA
} // namespace gem5

#endif // __ARCH_GCN3_INSTS_INSTRUCTIONS_HH__
