From 90757d6d0926f8f53f5f0378ecf71670d1093742 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Fri, 29 Aug 2025 18:33:19 -0500 Subject: [PATCH] Handle `S_LSHL_B32` in ParseCopyShader (#3477) Fixes an assert in My First Gran Turismo Co-authored-by: TheTurtle <47210458+raphaelthegreat@users.noreply.github.com> --- src/shader_recompiler/frontend/copy_shader.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/shader_recompiler/frontend/copy_shader.cpp b/src/shader_recompiler/frontend/copy_shader.cpp index 152ba196b..52b433dbc 100644 --- a/src/shader_recompiler/frontend/copy_shader.cpp +++ b/src/shader_recompiler/frontend/copy_shader.cpp @@ -25,6 +25,14 @@ CopyShaderData ParseCopyShader(std::span code) { while (!code_slice.atEnd()) { auto inst = decoder.decodeInstruction(code_slice); switch (inst.opcode) { + case Gcn::Opcode::S_LSHL_B32: { + ASSERT(inst.src[0].field == Gcn::OperandField::SignedConstIntPos && + inst.src[1].field == Gcn::OperandField::SignedConstIntPos); + sources[inst.dst[0].code] = + (inst.src[0].code - Gcn::OperandFieldRange::SignedConstIntPosMin + 1) + << (inst.src[1].code - Gcn::OperandFieldRange::SignedConstIntPosMin + 1); + break; + } case Gcn::Opcode::S_MOVK_I32: { sources[inst.dst[0].code] = inst.control.sopk.simm; break;