From 79c2e43fcd5a254121d48e6957ac159041c4fac0 Mon Sep 17 00:00:00 2001
From: ReinUsesLisp <reinuseslisp@airmail.cc>
Date: Tue, 20 Apr 2021 22:20:46 -0300
Subject: shader: Calculate number of arguments in an opcode at compile time

---
 src/shader_recompiler/frontend/ir/opcodes.cpp | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

(limited to 'src/shader_recompiler/frontend/ir/opcodes.cpp')

diff --git a/src/shader_recompiler/frontend/ir/opcodes.cpp b/src/shader_recompiler/frontend/ir/opcodes.cpp
index 7f04b647b0..4207d548c5 100644
--- a/src/shader_recompiler/frontend/ir/opcodes.cpp
+++ b/src/shader_recompiler/frontend/ir/opcodes.cpp
@@ -57,6 +57,17 @@ constexpr std::array META_TABLE{
 #undef OPCODE
 };
 
+constexpr size_t CalculateNumArgsOf(Opcode op) {
+    const auto& arg_types{META_TABLE[static_cast<size_t>(op)].arg_types};
+    return std::distance(arg_types.begin(), std::ranges::find(arg_types, Type::Void));
+}
+
+constexpr std::array NUM_ARGS{
+#define OPCODE(name_token, type_token, ...) CalculateNumArgsOf(Opcode::name_token),
+#include "opcodes.inc"
+#undef OPCODE
+};
+
 void ValidateOpcode(Opcode op) {
     const size_t raw{static_cast<size_t>(op)};
     if (raw >= META_TABLE.size()) {
@@ -72,9 +83,7 @@ Type TypeOf(Opcode op) {
 
 size_t NumArgsOf(Opcode op) {
     ValidateOpcode(op);
-    const auto& arg_types{META_TABLE[static_cast<size_t>(op)].arg_types};
-    const auto distance{std::distance(arg_types.begin(), std::ranges::find(arg_types, Type::Void))};
-    return static_cast<size_t>(distance);
+    return NUM_ARGS[static_cast<size_t>(op)];
 }
 
 Type ArgTypeOf(Opcode op, size_t arg_index) {
-- 
cgit v1.2.3-70-g09d2