aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics/Shader/Instructions/InstEmitFlow.cs
diff options
context:
space:
mode:
authorgdk <gab.dark.100@gmail.com>2019-10-13 03:02:07 -0300
committerThog <thog@protonmail.com>2020-01-09 02:13:00 +0100
commit1876b346fea647e8284a66bb6d62c38801035cff (patch)
tree6eeff094298cda84d1613dc5ec0691e51d7b35f1 /Ryujinx.Graphics/Shader/Instructions/InstEmitFlow.cs
parentf617fb542a0e3d36012d77a4b5acbde7b08902f2 (diff)
Initial work
Diffstat (limited to 'Ryujinx.Graphics/Shader/Instructions/InstEmitFlow.cs')
-rw-r--r--Ryujinx.Graphics/Shader/Instructions/InstEmitFlow.cs107
1 files changed, 0 insertions, 107 deletions
diff --git a/Ryujinx.Graphics/Shader/Instructions/InstEmitFlow.cs b/Ryujinx.Graphics/Shader/Instructions/InstEmitFlow.cs
deleted file mode 100644
index fb76e06a..00000000
--- a/Ryujinx.Graphics/Shader/Instructions/InstEmitFlow.cs
+++ /dev/null
@@ -1,107 +0,0 @@
-using Ryujinx.Graphics.Shader.Decoders;
-using Ryujinx.Graphics.Shader.IntermediateRepresentation;
-using Ryujinx.Graphics.Shader.Translation;
-using System.Collections.Generic;
-using System.Linq;
-
-using static Ryujinx.Graphics.Shader.IntermediateRepresentation.OperandHelper;
-
-namespace Ryujinx.Graphics.Shader.Instructions
-{
- static partial class InstEmit
- {
- public static void Bra(EmitterContext context)
- {
- EmitBranch(context, context.CurrBlock.Branch.Address);
- }
-
- public static void Exit(EmitterContext context)
- {
- OpCodeExit op = (OpCodeExit)context.CurrOp;
-
- // TODO: Figure out how this is supposed to work in the
- // presence of other condition codes.
- if (op.Condition == Condition.Always)
- {
- context.Return();
- }
- }
-
- public static void Kil(EmitterContext context)
- {
- context.Discard();
- }
-
- public static void Ssy(EmitterContext context)
- {
- OpCodeSsy op = (OpCodeSsy)context.CurrOp;
-
- foreach (KeyValuePair<OpCodeSync, Operand> kv in op.Syncs)
- {
- OpCodeSync opSync = kv.Key;
-
- Operand local = kv.Value;
-
- int ssyIndex = opSync.Targets[op];
-
- context.Copy(local, Const(ssyIndex));
- }
- }
-
- public static void Sync(EmitterContext context)
- {
- OpCodeSync op = (OpCodeSync)context.CurrOp;
-
- if (op.Targets.Count == 1)
- {
- // If we have only one target, then the SSY is basically
- // a branch, we can produce better codegen for this case.
- OpCodeSsy opSsy = op.Targets.Keys.First();
-
- EmitBranch(context, opSsy.GetAbsoluteAddress());
- }
- else
- {
- foreach (KeyValuePair<OpCodeSsy, int> kv in op.Targets)
- {
- OpCodeSsy opSsy = kv.Key;
-
- Operand label = context.GetLabel(opSsy.GetAbsoluteAddress());
-
- Operand local = opSsy.Syncs[op];
-
- int ssyIndex = kv.Value;
-
- context.BranchIfTrue(label, context.ICompareEqual(local, Const(ssyIndex)));
- }
- }
- }
-
- private static void EmitBranch(EmitterContext context, ulong address)
- {
- // If we're branching to the next instruction, then the branch
- // is useless and we can ignore it.
- if (address == context.CurrOp.Address + 8)
- {
- return;
- }
-
- Operand label = context.GetLabel(address);
-
- Operand pred = Register(context.CurrOp.Predicate);
-
- if (context.CurrOp.Predicate.IsPT)
- {
- context.Branch(label);
- }
- else if (context.CurrOp.InvertPredicate)
- {
- context.BranchIfFalse(label, pred);
- }
- else
- {
- context.BranchIfTrue(label, pred);
- }
- }
- }
-} \ No newline at end of file