yuzu/src/shader_recompiler/frontend/maxwell/translate/translate.cpp

52 lines
1.9 KiB
C++
Raw Normal View History

2021-01-09 06:30:07 +00:00
// Copyright 2021 yuzu Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#include "shader_recompiler/environment.h"
#include "shader_recompiler/frontend/ir/basic_block.h"
#include "shader_recompiler/frontend/maxwell/decode.h"
#include "shader_recompiler/frontend/maxwell/location.h"
#include "shader_recompiler/frontend/maxwell/translate/impl/impl.h"
#include "shader_recompiler/frontend/maxwell/translate/translate.h"
namespace Shader::Maxwell {
2021-02-08 05:54:35 +00:00
template <auto method>
2021-01-09 06:30:07 +00:00
static void Invoke(TranslatorVisitor& visitor, Location pc, u64 insn) {
2021-02-08 05:54:35 +00:00
using MethodType = decltype(method);
2021-01-09 06:30:07 +00:00
if constexpr (std::is_invocable_r_v<void, MethodType, TranslatorVisitor&, Location, u64>) {
2021-02-08 05:54:35 +00:00
(visitor.*method)(pc, insn);
2021-01-09 06:30:07 +00:00
} else if constexpr (std::is_invocable_r_v<void, MethodType, TranslatorVisitor&, u64>) {
2021-02-08 05:54:35 +00:00
(visitor.*method)(insn);
2021-01-09 06:30:07 +00:00
} else {
2021-02-08 05:54:35 +00:00
(visitor.*method)();
2021-01-09 06:30:07 +00:00
}
}
2021-02-06 02:11:23 +00:00
IR::Block Translate(ObjectPool<IR::Inst>& inst_pool, Environment& env,
const Flow::Block& flow_block) {
IR::Block block{inst_pool, flow_block.begin.Offset(), flow_block.end.Offset()};
2021-01-09 06:30:07 +00:00
TranslatorVisitor visitor{env, block};
const Location pc_end{flow_block.end};
Location pc{flow_block.begin};
while (pc != pc_end) {
const u64 insn{env.ReadInstruction(pc.Offset())};
const Opcode opcode{Decode(insn)};
switch (opcode) {
#define INST(name, cute, mask) \
case Opcode::name: \
Invoke<&TranslatorVisitor::name>(visitor, pc, insn); \
break;
#include "shader_recompiler/frontend/maxwell/maxwell.inc"
#undef OPCODE
default:
throw LogicError("Invalid opcode {}", opcode);
}
++pc;
}
return block;
}
} // namespace Shader::Maxwell