#pragma once #include "dialect/builtin.hpp" // IWYU pragma: export #include "dialect/ds.hpp" // IWYU pragma: export #include "dialect/exp.hpp" // IWYU pragma: export #include "dialect/memssa.hpp" // IWYU pragma: export #include "dialect/mimg.hpp" // IWYU pragma: export #include "dialect/mtbuf.hpp" // IWYU pragma: export #include "dialect/mubuf.hpp" // IWYU pragma: export #include "dialect/smrd.hpp" // IWYU pragma: export #include "dialect/sop1.hpp" // IWYU pragma: export #include "dialect/sop2.hpp" // IWYU pragma: export #include "dialect/sopc.hpp" // IWYU pragma: export #include "dialect/sopk.hpp" // IWYU pragma: export #include "dialect/sopp.hpp" // IWYU pragma: export #include "dialect/vintrp.hpp" // IWYU pragma: export #include "dialect/vop1.hpp" // IWYU pragma: export #include "dialect/vop2.hpp" // IWYU pragma: export #include "dialect/vop3.hpp" // IWYU pragma: export #include "dialect/vopc.hpp" // IWYU pragma: export #include "dialect/spv.hpp" // IWYU pragma: export #include "dialect/amdgpu.hpp" // IWYU pragma: export #include namespace shader::ir { template <> inline constexpr Kind kOpToKind = Kind::Spv; template <> inline constexpr Kind kOpToKind = Kind::Builtin; template <> inline constexpr Kind kOpToKind = Kind::AmdGpu; template <> inline constexpr Kind kOpToKind = Kind::Vop2; template <> inline constexpr Kind kOpToKind = Kind::Sop2; template <> inline constexpr Kind kOpToKind = Kind::Sopk; template <> inline constexpr Kind kOpToKind = Kind::Smrd; template <> inline constexpr Kind kOpToKind = Kind::Vop3; template <> inline constexpr Kind kOpToKind = Kind::Mubuf; template <> inline constexpr Kind kOpToKind = Kind::Mtbuf; template <> inline constexpr Kind kOpToKind = Kind::Mimg; template <> inline constexpr Kind kOpToKind = Kind::Ds; template <> inline constexpr Kind kOpToKind = Kind::Vintrp; template <> inline constexpr Kind kOpToKind = Kind::Exp; template <> inline constexpr Kind kOpToKind = Kind::Vop1; template <> inline constexpr Kind kOpToKind = Kind::Vopc; template <> inline constexpr Kind kOpToKind = Kind::Sop1; template <> inline constexpr Kind kOpToKind = Kind::Sopc; template <> inline constexpr Kind kOpToKind = Kind::Sopp; template <> inline constexpr Kind kOpToKind = Kind::MemSSA; template requires(kOpToKind> != Kind::Count) constexpr InstructionId getInstructionId(T op) { return getInstructionId(kOpToKind>, op); } constexpr bool operator==(ir::Instruction lhs, InstructionId rhs) { return lhs && lhs.getInstId() == rhs; } template constexpr bool operator==(L lhs, R rhs) requires requires { requires(!std::is_same_v); { getInstructionId(lhs) == rhs } -> std::convertible_to; } { return getInstructionId(lhs) == rhs; } template constexpr bool operator==(L lhs, R rhs) requires requires { requires(!std::is_same_v); { getTypeId(lhs) == rhs } -> std::convertible_to; } { return getTypeId(lhs) == rhs; } } // namespace ir