diff options
Diffstat (limited to 'Ryujinx.Graphics.Shader/Instructions/InstEmitFlowControl.cs')
-rw-r--r-- | Ryujinx.Graphics.Shader/Instructions/InstEmitFlowControl.cs | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/Ryujinx.Graphics.Shader/Instructions/InstEmitFlowControl.cs b/Ryujinx.Graphics.Shader/Instructions/InstEmitFlowControl.cs index 3cb8fe72..aee52c51 100644 --- a/Ryujinx.Graphics.Shader/Instructions/InstEmitFlowControl.cs +++ b/Ryujinx.Graphics.Shader/Instructions/InstEmitFlowControl.cs @@ -104,12 +104,23 @@ namespace Ryujinx.Graphics.Shader.Instructions return; } - // TODO: Figure out how this is supposed to work in the - // presence of other condition codes. if (op.Ccc == Ccc.T) { context.Return(); } + else + { + Operand cond = GetCondition(context, op.Ccc, IrConsts.False); + + // If the condition is always false, we don't need to do anything. + if (cond.Type != OperandType.Constant || cond.Value != IrConsts.False) + { + Operand lblSkip = Label(); + context.BranchIfFalse(lblSkip, cond); + context.Return(); + context.MarkLabel(lblSkip); + } + } } public static void Kil(EmitterContext context) @@ -250,7 +261,7 @@ namespace Ryujinx.Graphics.Shader.Instructions } } - private static Operand GetCondition(EmitterContext context, Ccc cond) + private static Operand GetCondition(EmitterContext context, Ccc cond, int defaultCond = IrConsts.True) { // TODO: More condition codes, figure out how they work. switch (cond) @@ -263,7 +274,7 @@ namespace Ryujinx.Graphics.Shader.Instructions return context.BitwiseNot(GetZF()); } - return Const(IrConsts.True); + return Const(defaultCond); } } }
\ No newline at end of file |