From 1fc86a6c9d2e191a398e10a280178cab1114fb98 Mon Sep 17 00:00:00 2001 From: psucien Date: Sun, 16 Jun 2024 20:26:24 +0200 Subject: [PATCH] shader_recompiler: added SOPK MOVK (45) --- src/shader_recompiler/frontend/translate/scalar_alu.cpp | 9 +++++++++ src/shader_recompiler/frontend/translate/translate.cpp | 3 +++ src/shader_recompiler/frontend/translate/translate.h | 1 + 3 files changed, 13 insertions(+) diff --git a/src/shader_recompiler/frontend/translate/scalar_alu.cpp b/src/shader_recompiler/frontend/translate/scalar_alu.cpp index 69005f1a..939803a3 100644 --- a/src/shader_recompiler/frontend/translate/scalar_alu.cpp +++ b/src/shader_recompiler/frontend/translate/scalar_alu.cpp @@ -5,6 +5,15 @@ namespace Shader::Gcn { +void Translator::S_MOVK(const GcnInst& inst) { + const auto simm16 = inst.control.sopk.simm.Value(); + if (simm16 & (1 << 15)) { + // TODO: need to verify the case of imm sign extension + UNREACHABLE(); + } + SetDst(inst.dst[0], ir.Imm32(simm16)); +} + void Translator::S_MOV(const GcnInst& inst) { SetDst(inst.dst[0], GetSrc(inst.src[0])); } diff --git a/src/shader_recompiler/frontend/translate/translate.cpp b/src/shader_recompiler/frontend/translate/translate.cpp index 610c11e7..40b74303 100644 --- a/src/shader_recompiler/frontend/translate/translate.cpp +++ b/src/shader_recompiler/frontend/translate/translate.cpp @@ -210,6 +210,9 @@ void Translate(IR::Block* block, std::span inst_list, Info& info) Translator translator{block, info}; for (const auto& inst : inst_list) { switch (inst.opcode) { + case Opcode::S_MOVK_I32: + translator.S_MOVK(inst); + break; case Opcode::S_MOV_B32: translator.S_MOV(inst); break; diff --git a/src/shader_recompiler/frontend/translate/translate.h b/src/shader_recompiler/frontend/translate/translate.h index 64e45a2c..fe2a88f1 100644 --- a/src/shader_recompiler/frontend/translate/translate.h +++ b/src/shader_recompiler/frontend/translate/translate.h @@ -34,6 +34,7 @@ public: void EmitFetch(const GcnInst& inst); // Scalar ALU + void S_MOVK(const GcnInst& inst); void S_MOV(const GcnInst& inst); void S_MUL_I32(const GcnInst& inst); void S_CMP(ConditionOp cond, bool is_signed, const GcnInst& inst);