[shader_recompiler] fix META_TABLE/NUM_ARGS table being duplicated per TU that included opcodes.h (#4180)

small oopsie; we dont need 6 copies of the same 22KB table
(removes 5*22 = 110 KB worth of redundant stuff)

this also enforces static on the types defined in the header so they arent memoized into a non-inlined value (aka. compiler just grabs value instead of well, yknow, assuming its a constant area)

Signed-off-by: lizzie <lizzie@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4180
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
This commit is contained in:
lizzie 2026-07-07 19:50:56 +02:00 • committed by crueter
parent 66b073ab8d
commit 072be286d1
No known key found for this signature in database
GPG key ID: 425ACD2D4830EBC6
2 changed files with 59 additions and 50 deletions

View file

@ -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-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
@ -5,6 +8,27 @@
namespace Shader::IR { 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) { std::string_view NameOf(Opcode op) {
return Detail::META_TABLE[static_cast<size_t>(op)].name; return Detail::META_TABLE[static_cast<size_t>(op)].name;
} }

View file

@ -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-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
@ -30,69 +30,54 @@ struct OpcodeMeta {
}; };
// using enum Type; // using enum Type;
constexpr Type Void{Type::Void}; static constexpr Type Void{Type::Void};
constexpr Type Opaque{Type::Opaque}; static constexpr Type Opaque{Type::Opaque};
constexpr Type Reg{Type::Reg}; static constexpr Type Reg{Type::Reg};
constexpr Type Pred{Type::Pred}; static constexpr Type Pred{Type::Pred};
constexpr Type Attribute{Type::Attribute}; static constexpr Type Attribute{Type::Attribute};
constexpr Type Patch{Type::Patch}; static constexpr Type Patch{Type::Patch};
constexpr Type U1{Type::U1}; static constexpr Type U1{Type::U1};
constexpr Type U8{Type::U8}; static constexpr Type U8{Type::U8};
constexpr Type U16{Type::U16}; static constexpr Type U16{Type::U16};
constexpr Type U32{Type::U32}; static constexpr Type U32{Type::U32};
constexpr Type U64{Type::U64}; static constexpr Type U64{Type::U64};
constexpr Type F16{Type::F16}; static constexpr Type F16{Type::F16};
constexpr Type F32{Type::F32}; static constexpr Type F32{Type::F32};
constexpr Type F64{Type::F64}; static constexpr Type F64{Type::F64};
constexpr Type U32x2{Type::U32x2}; static constexpr Type U32x2{Type::U32x2};
constexpr Type U32x3{Type::U32x3}; static constexpr Type U32x3{Type::U32x3};
constexpr Type U32x4{Type::U32x4}; static constexpr Type U32x4{Type::U32x4};
constexpr Type F16x2{Type::F16x2}; static constexpr Type F16x2{Type::F16x2};
constexpr Type F16x3{Type::F16x3}; static constexpr Type F16x3{Type::F16x3};
constexpr Type F16x4{Type::F16x4}; static constexpr Type F16x4{Type::F16x4};
constexpr Type F32x2{Type::F32x2}; static constexpr Type F32x2{Type::F32x2};
constexpr Type F32x3{Type::F32x3}; static constexpr Type F32x3{Type::F32x3};
constexpr Type F32x4{Type::F32x4}; static constexpr Type F32x4{Type::F32x4};
constexpr Type F64x2{Type::F64x2}; static constexpr Type F64x2{Type::F64x2};
constexpr Type F64x3{Type::F64x3}; static constexpr Type F64x3{Type::F64x3};
constexpr Type F64x4{Type::F64x4}; static constexpr Type F64x4{Type::F64x4};
constexpr OpcodeMeta META_TABLE[]{ extern OpcodeMeta META_TABLE[532];
#define OPCODE(name_token, type_token, ...) \ constexpr size_t CalculateNumArgsOf(Opcode op) noexcept {
{ \ const auto& arg_types = META_TABLE[size_t(op)].arg_types;
.name{#name_token}, \ return size_t(std::distance(arg_types.begin(), std::ranges::find(arg_types, Type::Void)));
.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<size_t>(op)].arg_types};
return static_cast<size_t>(
std::distance(arg_types.begin(), std::ranges::find(arg_types, Type::Void)));
} }
extern u8 NUM_ARGS[532];
constexpr u8 NUM_ARGS[]{
#define OPCODE(name_token, type_token, ...) static_cast<u8>(CalculateNumArgsOf(Opcode::name_token)),
#include "opcodes.inc"
#undef OPCODE
};
} // namespace Detail } // namespace Detail
/// Get return type of an opcode /// Get return type of an opcode
[[nodiscard]] inline Type TypeOf(Opcode op) noexcept { [[nodiscard]] inline Type TypeOf(Opcode op) noexcept {
return Detail::META_TABLE[static_cast<size_t>(op)].type; return Detail::META_TABLE[size_t(op)].type;
} }
/// Get the number of arguments an opcode accepts /// Get the number of arguments an opcode accepts
[[nodiscard]] inline size_t NumArgsOf(Opcode op) noexcept { [[nodiscard]] inline size_t NumArgsOf(Opcode op) noexcept {
return static_cast<size_t>(Detail::NUM_ARGS[static_cast<size_t>(op)]); return size_t(Detail::NUM_ARGS[size_t(op)]);
} }
/// Get the required type of an argument of an opcode /// Get the required type of an argument of an opcode
[[nodiscard]] inline Type ArgTypeOf(Opcode op, size_t arg_index) noexcept { [[nodiscard]] inline Type ArgTypeOf(Opcode op, size_t arg_index) noexcept {
return Detail::META_TABLE[static_cast<size_t>(op)].arg_types[arg_index]; return Detail::META_TABLE[size_t(op)].arg_types[arg_index];
} }
/// Get the name of an opcode /// Get the name of an opcode