From d6fccedab88d8125b2ff80fa34612a34daecd2ce Mon Sep 17 00:00:00 2001 From: kostyaff Date: Tue, 14 Jul 2026 00:29:05 +0300 Subject: [PATCH] [AGC] Support scalar high 32-bit multiplies (#109) Signed-off-by: kostyaff --- .../Agc/Gen5SpirvTranslator.Alu.cs | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/SharpEmu.Libs/Agc/Gen5SpirvTranslator.Alu.cs b/src/SharpEmu.Libs/Agc/Gen5SpirvTranslator.Alu.cs index 2d8d3c7..595f5c5 100644 --- a/src/SharpEmu.Libs/Agc/Gen5SpirvTranslator.Alu.cs +++ b/src/SharpEmu.Libs/Agc/Gen5SpirvTranslator.Alu.cs @@ -1136,6 +1136,52 @@ internal static partial class Gen5SpirvTranslator left, right); break; + case "SMulHiU32": + { + var wideLeft = _module.AddInstruction( + SpirvOp.UConvert, + _ulongType, + left); + var wideRight = _module.AddInstruction( + SpirvOp.UConvert, + _ulongType, + right); + var product = _module.AddInstruction( + SpirvOp.IMul, + _ulongType, + wideLeft, + wideRight); + result = _module.AddInstruction( + SpirvOp.UConvert, + _uintType, + ShiftRightLogical64( + product, + _module.Constant64(_ulongType, 32))); + break; + } + case "SMulHiI32": + { + var wideLeft = _module.AddInstruction( + SpirvOp.SConvert, + _longType, + Bitcast(_intType, left)); + var wideRight = _module.AddInstruction( + SpirvOp.SConvert, + _longType, + Bitcast(_intType, right)); + var product = _module.AddInstruction( + SpirvOp.IMul, + _longType, + wideLeft, + wideRight); + result = _module.AddInstruction( + SpirvOp.UConvert, + _uintType, + ShiftRightLogical64( + Bitcast(_ulongType, product), + _module.Constant64(_ulongType, 32))); + break; + } case "SAndB32": result = BitwiseAnd(left, right); Store(_scc, IsNotZero(result));