aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Ryujinx.Graphics.Shader/Decoders/OpCodeTable.cs4
-rw-r--r--Ryujinx.Graphics.Shader/Instructions/InstEmitFArith.cs18
2 files changed, 22 insertions, 0 deletions
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)