aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Shader/Instructions/InstEmitFlowControl.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics.Shader/Instructions/InstEmitFlowControl.cs')
-rw-r--r--Ryujinx.Graphics.Shader/Instructions/InstEmitFlowControl.cs19
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