diff --git a/src/shader_recompiler/frontend/ir/opcodes.cpp b/src/shader_recompiler/frontend/ir/opcodes.cpp index 9e4d9e65a8..7fb6694a9b 100644 --- a/src/shader_recompiler/frontend/ir/opcodes.cpp +++ b/src/shader_recompiler/frontend/ir/opcodes.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,6 +8,27 @@ namespace Shader::IR { +namespace Detail { + +OpcodeMeta META_TABLE[532] = { +#define OPCODE(name_token, type_token, ...) \ + { \ + .name{#name_token}, \ + .type = type_token, \ + .arg_types{__VA_ARGS__}, \ + }, +#include "opcodes.inc" +#undef OPCODE +}; + +u8 NUM_ARGS[532] = { +#define OPCODE(name_token, type_token, ...) u8(CalculateNumArgsOf(Opcode::name_token)), +#include "opcodes.inc" +#undef OPCODE +}; + +} + std::string_view NameOf(Opcode op) { return Detail::META_TABLE[static_cast(op)].name; } diff --git a/src/shader_recompiler/frontend/ir/opcodes.h b/src/shader_recompiler/frontend/ir/opcodes.h index 3d6a3539bb..5549edc9d7 100644 --- a/src/shader_recompiler/frontend/ir/opcodes.h +++ b/src/shader_recompiler/frontend/ir/opcodes.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -30,69 +30,54 @@ struct OpcodeMeta { }; // using enum Type; -constexpr Type Void{Type::Void}; -constexpr Type Opaque{Type::Opaque}; -constexpr Type Reg{Type::Reg}; -constexpr Type Pred{Type::Pred}; -constexpr Type Attribute{Type::Attribute}; -constexpr Type Patch{Type::Patch}; -constexpr Type U1{Type::U1}; -constexpr Type U8{Type::U8}; -constexpr Type U16{Type::U16}; -constexpr Type U32{Type::U32}; -constexpr Type U64{Type::U64}; -constexpr Type F16{Type::F16}; -constexpr Type F32{Type::F32}; -constexpr Type F64{Type::F64}; -constexpr Type U32x2{Type::U32x2}; -constexpr Type U32x3{Type::U32x3}; -constexpr Type U32x4{Type::U32x4}; -constexpr Type F16x2{Type::F16x2}; -constexpr Type F16x3{Type::F16x3}; -constexpr Type F16x4{Type::F16x4}; -constexpr Type F32x2{Type::F32x2}; -constexpr Type F32x3{Type::F32x3}; -constexpr Type F32x4{Type::F32x4}; -constexpr Type F64x2{Type::F64x2}; -constexpr Type F64x3{Type::F64x3}; -constexpr Type F64x4{Type::F64x4}; +static constexpr Type Void{Type::Void}; +static constexpr Type Opaque{Type::Opaque}; +static constexpr Type Reg{Type::Reg}; +static constexpr Type Pred{Type::Pred}; +static constexpr Type Attribute{Type::Attribute}; +static constexpr Type Patch{Type::Patch}; +static constexpr Type U1{Type::U1}; +static constexpr Type U8{Type::U8}; +static constexpr Type U16{Type::U16}; +static constexpr Type U32{Type::U32}; +static constexpr Type U64{Type::U64}; +static constexpr Type F16{Type::F16}; +static constexpr Type F32{Type::F32}; +static constexpr Type F64{Type::F64}; +static constexpr Type U32x2{Type::U32x2}; +static constexpr Type U32x3{Type::U32x3}; +static constexpr Type U32x4{Type::U32x4}; +static constexpr Type F16x2{Type::F16x2}; +static constexpr Type F16x3{Type::F16x3}; +static constexpr Type F16x4{Type::F16x4}; +static constexpr Type F32x2{Type::F32x2}; +static constexpr Type F32x3{Type::F32x3}; +static constexpr Type F32x4{Type::F32x4}; +static constexpr Type F64x2{Type::F64x2}; +static constexpr Type F64x3{Type::F64x3}; +static constexpr Type F64x4{Type::F64x4}; -constexpr OpcodeMeta META_TABLE[]{ -#define OPCODE(name_token, type_token, ...) \ - { \ - .name{#name_token}, \ - .type = type_token, \ - .arg_types{__VA_ARGS__}, \ - }, -#include "opcodes.inc" -#undef OPCODE -}; -constexpr size_t CalculateNumArgsOf(Opcode op) { - const auto& arg_types{META_TABLE[static_cast(op)].arg_types}; - return static_cast( - std::distance(arg_types.begin(), std::ranges::find(arg_types, Type::Void))); +extern OpcodeMeta META_TABLE[532]; +constexpr size_t CalculateNumArgsOf(Opcode op) noexcept { + const auto& arg_types = META_TABLE[size_t(op)].arg_types; + return size_t(std::distance(arg_types.begin(), std::ranges::find(arg_types, Type::Void))); } - -constexpr u8 NUM_ARGS[]{ -#define OPCODE(name_token, type_token, ...) static_cast(CalculateNumArgsOf(Opcode::name_token)), -#include "opcodes.inc" -#undef OPCODE -}; +extern u8 NUM_ARGS[532]; } // namespace Detail /// Get return type of an opcode [[nodiscard]] inline Type TypeOf(Opcode op) noexcept { - return Detail::META_TABLE[static_cast(op)].type; + return Detail::META_TABLE[size_t(op)].type; } /// Get the number of arguments an opcode accepts [[nodiscard]] inline size_t NumArgsOf(Opcode op) noexcept { - return static_cast(Detail::NUM_ARGS[static_cast(op)]); + return size_t(Detail::NUM_ARGS[size_t(op)]); } /// Get the required type of an argument of an opcode [[nodiscard]] inline Type ArgTypeOf(Opcode op, size_t arg_index) noexcept { - return Detail::META_TABLE[static_cast(op)].arg_types[arg_index]; + return Detail::META_TABLE[size_t(op)].arg_types[arg_index]; } /// Get the name of an opcode