diff --git a/Ryujinx.Graphics.Shader/Instructions/InstEmitAlu.cs b/Ryujinx.Graphics.Shader/Instructions/InstEmitAlu.cs index 0cb854e9..77df3d8d 100644 --- a/Ryujinx.Graphics.Shader/Instructions/InstEmitAlu.cs +++ b/Ryujinx.Graphics.Shader/Instructions/InstEmitAlu.cs @@ -327,14 +327,18 @@ namespace Ryujinx.Graphics.Shader.Instructions if (boolFloat) { - context.Copy(dest, context.ConditionalSelect(res, ConstF(1), Const(0))); + res = context.ConditionalSelect(res, ConstF(1), Const(0)); + + context.Copy(dest, res); + + SetFPZnFlags(context, res, op.SetCondCode); } else { context.Copy(dest, res); - } - SetZnFlags(context, res, op.SetCondCode, op.Extended); + SetZnFlags(context, res, op.SetCondCode, op.Extended); + } // TODO: X } diff --git a/Ryujinx.Graphics.Shader/Instructions/InstEmitAluHelper.cs b/Ryujinx.Graphics.Shader/Instructions/InstEmitAluHelper.cs index e283c3b7..da5c7fed 100644 --- a/Ryujinx.Graphics.Shader/Instructions/InstEmitAluHelper.cs +++ b/Ryujinx.Graphics.Shader/Instructions/InstEmitAluHelper.cs @@ -84,5 +84,14 @@ namespace Ryujinx.Graphics.Shader.Instructions context.Copy(GetNF(context), context.ICompareLess(dest, Const(0))); } + + public static void SetFPZnFlags(EmitterContext context, Operand dest, bool setCC) + { + if (setCC) + { + context.Copy(GetZF(context), context.FPCompareEqual(dest, ConstF(0))); + context.Copy(GetNF(context), context.FPCompareLess (dest, ConstF(0))); + } + } } } \ No newline at end of file diff --git a/Ryujinx.Graphics.Shader/Instructions/InstEmitFArith.cs b/Ryujinx.Graphics.Shader/Instructions/InstEmitFArith.cs index 63d1efcb..23f40d46 100644 --- a/Ryujinx.Graphics.Shader/Instructions/InstEmitFArith.cs +++ b/Ryujinx.Graphics.Shader/Instructions/InstEmitFArith.cs @@ -163,14 +163,20 @@ namespace Ryujinx.Graphics.Shader.Instructions if (boolFloat) { - context.Copy(dest, context.ConditionalSelect(res, ConstF(1), Const(0))); + res = context.ConditionalSelect(res, ConstF(1), Const(0)); + + context.Copy(dest, res); + + SetFPZnFlags(context, res, op.SetCondCode); } else { context.Copy(dest, res); + + SetZnFlags(context, res, op.SetCondCode, op.Extended); } - // TODO: CC, X + // TODO: X } public static void Fsetp(EmitterContext context) @@ -453,15 +459,6 @@ namespace Ryujinx.Graphics.Shader.Instructions return res; } - private static void SetFPZnFlags(EmitterContext context, Operand dest, bool setCC) - { - if (setCC) - { - context.Copy(GetZF(context), context.FPCompareEqual(dest, ConstF(0))); - context.Copy(GetNF(context), context.FPCompareLess (dest, ConstF(0))); - } - } - private static Operand[] GetHfmaSrcA(EmitterContext context) { IOpCodeHfma op = (IOpCodeHfma)context.CurrOp;