From 65ab88dd11634df3f44d1afb69f6dc79bff3c82f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Miko=C5=82ajczyk?= Date: Sat, 23 May 2026 20:41:18 +0200 Subject: [PATCH] Fix v_mad_u64_u32 (#4466) --- src/shader_recompiler/frontend/translate/vector_alu.cpp | 4 +--- src/shader_recompiler/ir/ir_emitter.cpp | 7 +++++++ src/shader_recompiler/ir/opcodes.inc | 1 + 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/shader_recompiler/frontend/translate/vector_alu.cpp b/src/shader_recompiler/frontend/translate/vector_alu.cpp index 6227a1814..507f3f281 100644 --- a/src/shader_recompiler/frontend/translate/vector_alu.cpp +++ b/src/shader_recompiler/frontend/translate/vector_alu.cpp @@ -1598,9 +1598,7 @@ void Translator::V_MAD_U64_U32(const GcnInst& inst) { const auto src1 = GetSrc(inst.src[1]); const auto src2 = GetSrc64(inst.src[2]); - // const IR::U64 mul_result = ir.UConvert(64, ir.IMul(src0, src1)); - const IR::U64 mul_result = - ir.PackUint2x32(ir.CompositeConstruct(ir.IMul(src0, src1), ir.Imm32(0U))); + const IR::U64 mul_result = ir.IMul(ir.UConvert(64, src0), ir.UConvert(64, src1)); const IR::U64 sum_result = ir.IAdd(mul_result, src2); SetDst64(inst.dst[0], sum_result); diff --git a/src/shader_recompiler/ir/ir_emitter.cpp b/src/shader_recompiler/ir/ir_emitter.cpp index 8431daf02..63732fb96 100644 --- a/src/shader_recompiler/ir/ir_emitter.cpp +++ b/src/shader_recompiler/ir/ir_emitter.cpp @@ -1923,6 +1923,13 @@ U8U16U32U64 IREmitter::UConvert(size_t result_bitsize, const U8U16U32U64& value) default: break; } + case 64: + switch (value.Type()) { + case Type::U32: + return Inst(Opcode::ConvertU64U32, value); + default: + break; + } default: break; } diff --git a/src/shader_recompiler/ir/opcodes.inc b/src/shader_recompiler/ir/opcodes.inc index 302d95c2f..3893ef6f5 100644 --- a/src/shader_recompiler/ir/opcodes.inc +++ b/src/shader_recompiler/ir/opcodes.inc @@ -404,6 +404,7 @@ OPCODE(ConvertF64U32, F64, U32, OPCODE(ConvertF32U16, F32, U16, ) OPCODE(ConvertU16U32, U16, U32, ) OPCODE(ConvertU32U16, U32, U16, ) +OPCODE(ConvertU64U32, U64, U32, ) OPCODE(ConvertU8U32, U8, U32, ) OPCODE(ConvertU32U8, U32, U8, ) OPCODE(ConvertS32S8, U32, U8, )