Mesa (master): aco: add instruction cast and format-check methods

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jan 22 14:21:22 UTC 2021


Module: Mesa
Branch: master
Commit: fb12302b8ee585c3c623062c47e9b2982247a356
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=fb12302b8ee585c3c623062c47e9b2982247a356

Author: Rhys Perry <pendingchaos02 at gmail.com>
Date:   Wed Jan 20 13:46:01 2021 +0000

aco: add instruction cast and format-check methods

Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
Reviewed-by: Daniel Schürmann <daniel at schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8595>

---

 src/amd/compiler/aco_ir.h | 156 ++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 130 insertions(+), 26 deletions(-)

diff --git a/src/amd/compiler/aco_ir.h b/src/amd/compiler/aco_ir.h
index 798d9cc80a6..bdffbc75606 100644
--- a/src/amd/compiler/aco_ir.h
+++ b/src/amd/compiler/aco_ir.h
@@ -985,6 +985,31 @@ private:
 };
 
 struct Block;
+struct Instruction;
+struct Pseudo_instruction;
+struct SOP1_instruction;
+struct SOP2_instruction;
+struct SOPK_instruction;
+struct SOPP_instruction;
+struct SOPC_instruction;
+struct SMEM_instruction;
+struct DS_instruction;
+struct MTBUF_instruction;
+struct MUBUF_instruction;
+struct MIMG_instruction;
+struct Export_instruction;
+struct FLAT_instruction;
+struct Pseudo_branch_instruction;
+struct Pseudo_barrier_instruction;
+struct Pseudo_reduction_instruction;
+struct VOP3P_instruction;
+struct VOP1_instruction;
+struct VOP2_instruction;
+struct VOPC_instruction;
+struct VOP3_instruction;
+struct Interp_instruction;
+struct DPP_instruction;
+struct SDWA_instruction;
 
 struct Instruction {
    aco_opcode opcode;
@@ -994,6 +1019,111 @@ struct Instruction {
    aco::span<Operand> operands;
    aco::span<Definition> definitions;
 
+   constexpr bool usesModifiers() const noexcept;
+
+   constexpr bool reads_exec() const noexcept
+   {
+      for (const Operand& op : operands) {
+         if (op.isFixed() && op.physReg() == exec)
+            return true;
+      }
+      return false;
+   }
+
+   Pseudo_instruction *pseudo() noexcept {assert(isPseudo()); return (Pseudo_instruction *)this;}
+   const Pseudo_instruction *pseudo() const noexcept {assert(isPseudo()); return (Pseudo_instruction *)this;}
+   constexpr bool isPseudo() const noexcept {return format == Format::PSEUDO;}
+   SOP1_instruction *sop1() noexcept {assert(isSOP1()); return (SOP1_instruction *)this;}
+   const SOP1_instruction *sop1() const noexcept {assert(isSOP1()); return (SOP1_instruction *)this;}
+   constexpr bool isSOP1() const noexcept {return format == Format::SOP1;}
+   SOP2_instruction *sop2() noexcept {assert(isSOP2()); return (SOP2_instruction *)this;}
+   const SOP2_instruction *sop2() const noexcept {assert(isSOP2()); return (SOP2_instruction *)this;}
+   constexpr bool isSOP2() const noexcept {return format == Format::SOP2;}
+   SOPK_instruction *sopk() noexcept {assert(isSOPK()); return (SOPK_instruction *)this;}
+   const SOPK_instruction *sopk() const noexcept {assert(isSOPK()); return (SOPK_instruction *)this;}
+   constexpr bool isSOPK() const noexcept {return format == Format::SOPK;}
+   SOPP_instruction *sopp() noexcept {assert(isSOPP()); return (SOPP_instruction *)this;}
+   const SOPP_instruction *sopp() const noexcept {assert(isSOPP()); return (SOPP_instruction *)this;}
+   constexpr bool isSOPP() const noexcept {return format == Format::SOPP;}
+   SOPC_instruction *sopc() noexcept {assert(isSOPC()); return (SOPC_instruction *)this;}
+   const SOPC_instruction *sopc() const noexcept {assert(isSOPC()); return (SOPC_instruction *)this;}
+   constexpr bool isSOPC() const noexcept {return format == Format::SOPC;}
+   SMEM_instruction *smem() noexcept {assert(isSMEM()); return (SMEM_instruction *)this;}
+   const SMEM_instruction *smem() const noexcept {assert(isSMEM()); return (SMEM_instruction *)this;}
+   constexpr bool isSMEM() const noexcept {return format == Format::SMEM;}
+   DS_instruction *ds() noexcept {assert(isDS()); return (DS_instruction *)this;}
+   const DS_instruction *ds() const noexcept {assert(isDS()); return (DS_instruction *)this;}
+   constexpr bool isDS() const noexcept {return format == Format::DS;}
+   MTBUF_instruction *mtbuf() noexcept {assert(isMTBUF()); return (MTBUF_instruction *)this;}
+   const MTBUF_instruction *mtbuf() const noexcept {assert(isMTBUF()); return (MTBUF_instruction *)this;}
+   constexpr bool isMTBUF() const noexcept {return format == Format::MTBUF;}
+   MUBUF_instruction *mubuf() noexcept {assert(isMUBUF()); return (MUBUF_instruction *)this;}
+   const MUBUF_instruction *mubuf() const noexcept {assert(isMUBUF()); return (MUBUF_instruction *)this;}
+   constexpr bool isMUBUF() const noexcept {return format == Format::MUBUF;}
+   MIMG_instruction *mimg() noexcept {assert(isMIMG()); return (MIMG_instruction *)this;}
+   const MIMG_instruction *mimg() const noexcept {assert(isMIMG()); return (MIMG_instruction *)this;}
+   constexpr bool isMIMG() const noexcept {return format == Format::MIMG;}
+   Export_instruction *exp() noexcept {assert(isEXP()); return (Export_instruction *)this;}
+   const Export_instruction *exp() const noexcept {assert(isEXP()); return (Export_instruction *)this;}
+   constexpr bool isEXP() const noexcept {return format == Format::EXP;}
+   FLAT_instruction *flat() noexcept {assert(isFlat()); return (FLAT_instruction *)this;}
+   const FLAT_instruction *flat() const noexcept {assert(isFlat()); return (FLAT_instruction *)this;}
+   constexpr bool isFlat() const noexcept {return format == Format::FLAT;}
+   FLAT_instruction *global() noexcept {assert(isGlobal()); return (FLAT_instruction *)this;}
+   const FLAT_instruction *global() const noexcept {assert(isGlobal()); return (FLAT_instruction *)this;}
+   constexpr bool isGlobal() const noexcept {return format == Format::GLOBAL;}
+   FLAT_instruction *scratch() noexcept {assert(isScratch()); return (FLAT_instruction *)this;}
+   const FLAT_instruction *scratch() const noexcept {assert(isScratch()); return (FLAT_instruction *)this;}
+   constexpr bool isScratch() const noexcept {return format == Format::SCRATCH;}
+   Pseudo_branch_instruction *branch() noexcept {assert(isBranch()); return (Pseudo_branch_instruction *)this;}
+   const Pseudo_branch_instruction *branch() const noexcept {assert(isBranch()); return (Pseudo_branch_instruction *)this;}
+   constexpr bool isBranch() const noexcept {return format == Format::PSEUDO_BRANCH;}
+   Pseudo_barrier_instruction *barrier() noexcept {assert(isBarrier()); return (Pseudo_barrier_instruction *)this;}
+   const Pseudo_barrier_instruction *barrier() const noexcept {assert(isBarrier()); return (Pseudo_barrier_instruction *)this;}
+   constexpr bool isBarrier() const noexcept {return format == Format::PSEUDO_BARRIER;}
+   Pseudo_reduction_instruction *reduction() noexcept {assert(isReduction()); return (Pseudo_reduction_instruction *)this;}
+   const Pseudo_reduction_instruction *reduction() const noexcept {assert(isReduction()); return (Pseudo_reduction_instruction *)this;}
+   constexpr bool isReduction() const noexcept {return format == Format::PSEUDO_REDUCTION;}
+   VOP3P_instruction *vop3p() noexcept {assert(isVOP3P()); return (VOP3P_instruction *)this;}
+   const VOP3P_instruction *vop3p() const noexcept {assert(isVOP3P()); return (VOP3P_instruction *)this;}
+   constexpr bool isVOP3P() const noexcept {return format == Format::VOP3P;}
+   VOP1_instruction *vop1() noexcept {assert(isVOP1()); return (VOP1_instruction *)this;}
+   const VOP1_instruction *vop1() const noexcept {assert(isVOP1()); return (VOP1_instruction *)this;}
+   constexpr bool isVOP1() const noexcept {return (uint16_t)format & (uint16_t)Format::VOP1;}
+   VOP2_instruction *vop2() noexcept {assert(isVOP2()); return (VOP2_instruction *)this;}
+   const VOP2_instruction *vop2() const noexcept {assert(isVOP2()); return (VOP2_instruction *)this;}
+   constexpr bool isVOP2() const noexcept {return (uint16_t)format & (uint16_t)Format::VOP2;}
+   VOPC_instruction *vopc() noexcept {assert(isVOPC()); return (VOPC_instruction *)this;}
+   const VOPC_instruction *vopc() const noexcept {assert(isVOPC()); return (VOPC_instruction *)this;}
+   constexpr bool isVOPC() const noexcept {return (uint16_t)format & (uint16_t)Format::VOPC;}
+   VOP3_instruction *vop3() noexcept {assert(isVOP3()); return (VOP3_instruction *)this;}
+   const VOP3_instruction *vop3() const noexcept {assert(isVOP3()); return (VOP3_instruction *)this;}
+   constexpr bool isVOP3() const noexcept {return (uint16_t)format & (uint16_t)Format::VOP3;}
+   Interp_instruction *vintrp() noexcept {assert(isVINTRP()); return (Interp_instruction *)this;}
+   const Interp_instruction *vintrp() const noexcept {assert(isVINTRP()); return (Interp_instruction *)this;}
+   constexpr bool isVINTRP() const noexcept {return (uint16_t)format & (uint16_t)Format::VINTRP;}
+   DPP_instruction *dpp() noexcept {assert(isDPP()); return (DPP_instruction *)this;}
+   const DPP_instruction *dpp() const noexcept {assert(isDPP()); return (DPP_instruction *)this;}
+   constexpr bool isDPP() const noexcept {return (uint16_t)format & (uint16_t)Format::DPP;}
+   SDWA_instruction *sdwa() noexcept {assert(isSDWA()); return (SDWA_instruction *)this;}
+   const SDWA_instruction *sdwa() const noexcept {assert(isSDWA()); return (SDWA_instruction *)this;}
+   constexpr bool isSDWA() const noexcept {return (uint16_t)format & (uint16_t)Format::SDWA;}
+
+   FLAT_instruction *flatlike()
+   {
+      return (FLAT_instruction *)this;
+   }
+
+   const FLAT_instruction *flatlike() const
+   {
+      return (FLAT_instruction *)this;
+   }
+
+   constexpr bool isFlatLike() const noexcept
+   {
+      return isFlat() || isGlobal() || isScratch();
+   }
+
    constexpr bool isVALU() const noexcept
    {
       return ((uint16_t) format & (uint16_t) Format::VOP1) == (uint16_t) Format::VOP1
@@ -1019,36 +1149,10 @@ struct Instruction {
              format == Format::MIMG;
    }
 
-   constexpr bool isDPP() const noexcept
-   {
-      return (uint16_t) format & (uint16_t) Format::DPP;
-   }
-
-   constexpr bool isVOP3() const noexcept
-   {
-      return (uint16_t) format & (uint16_t) Format::VOP3;
-   }
-
-   constexpr bool isSDWA() const noexcept
-   {
-      return (uint16_t) format & (uint16_t) Format::SDWA;
-   }
-
    constexpr bool isFlatOrGlobal() const noexcept
    {
       return format == Format::FLAT || format == Format::GLOBAL;
    }
-
-   constexpr bool usesModifiers() const noexcept;
-
-   constexpr bool reads_exec() const noexcept
-   {
-      for (const Operand& op : operands) {
-         if (op.isFixed() && op.physReg() == exec)
-            return true;
-      }
-      return false;
-   }
 };
 static_assert(sizeof(Instruction) == 16, "Unexpected padding");
 



More information about the mesa-commit mailing list