From d599fba711146e2b92a1fc6be19b0f5f83abab58 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Mon, 30 Mar 2020 07:04:00 -0300 Subject: [PATCH] Implement FCMP shader instruction (#1067) --- .../Decoders/OpCodeTable.cs | 4 ++++ .../Instructions/InstEmitFArith.cs | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/Ryujinx.Graphics.Shader/Decoders/OpCodeTable.cs b/Ryujinx.Graphics.Shader/Decoders/OpCodeTable.cs index 9835be34..2f46ee32 100644 --- a/Ryujinx.Graphics.Shader/Decoders/OpCodeTable.cs +++ b/Ryujinx.Graphics.Shader/Decoders/OpCodeTable.cs @@ -90,6 +90,10 @@ namespace Ryujinx.Graphics.Shader.Decoders Set("0011100x01011x", InstEmit.Fadd, typeof(OpCodeFArithImm)); Set("000010xxxxxxxx", InstEmit.Fadd, typeof(OpCodeFArithImm32)); Set("0101110001011x", InstEmit.Fadd, typeof(OpCodeFArithReg)); + Set("010010111010xx", InstEmit.Fcmp, typeof(OpCodeFArithCbuf)); + Set("0011011x1010xx", InstEmit.Fcmp, typeof(OpCodeFArithImm)); + Set("010110111010xx", InstEmit.Fcmp, typeof(OpCodeFArithReg)); + Set("010100111010xx", InstEmit.Fcmp, typeof(OpCodeFArithRegCbuf)); Set("010010011xxxxx", InstEmit.Ffma, typeof(OpCodeFArithCbuf)); Set("0011001x1xxxxx", InstEmit.Ffma, typeof(OpCodeFArithImm)); Set("000011xxxxxxxx", InstEmit.Ffma32i, typeof(OpCodeFArithImm32)); diff --git a/Ryujinx.Graphics.Shader/Instructions/InstEmitFArith.cs b/Ryujinx.Graphics.Shader/Instructions/InstEmitFArith.cs index fa5c684c..c171a986 100644 --- a/Ryujinx.Graphics.Shader/Instructions/InstEmitFArith.cs +++ b/Ryujinx.Graphics.Shader/Instructions/InstEmitFArith.cs @@ -16,6 +16,24 @@ namespace Ryujinx.Graphics.Shader.Instructions public static void Dmul(EmitterContext context) => EmitFPMultiply(context, Instruction.FP64); public static void Fadd(EmitterContext context) => EmitFPAdd(context, Instruction.FP32); + + public static void Fcmp(EmitterContext context) + { + OpCode op = context.CurrOp; + + Condition cmpOp = (Condition)op.RawOpCode.Extract(48, 4); + + Operand srcA = GetSrcA(context); + Operand srcB = GetSrcB(context); + Operand srcC = GetSrcC(context); + + Operand cmpRes = GetFPComparison(context, cmpOp, srcC, ConstF(0)); + + Operand res = context.ConditionalSelect(cmpRes, srcA, srcB); + + context.Copy(GetDest(context), res); + } + public static void Ffma(EmitterContext context) => EmitFPFma(context, Instruction.FP32); public static void Ffma32i(EmitterContext context)