Implement IMUL, PCNT and CONT shader instructions, fix FFMA32I and HFMA32I (#2972)

* Implement IMUL shader instruction

* Implement PCNT/CONT instruction and fix FFMA32I

* Add HFMA232I to the table

* Shader cache version bump

* No Rc on Ffma32i
This commit is contained in:
gdkchan 2022-01-10 12:08:00 -03:00 committed by GitHub
parent 952c6e4d45
commit 7f6b3d234a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 108 additions and 68 deletions

View file

@ -22,7 +22,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
{
InstBrk op = context.GetOp<InstBrk>();
EmitBrkOrSync(context);
EmitBrkContSync(context);
}
public static void Brx(EmitterContext context)
@ -87,6 +87,13 @@ namespace Ryujinx.Graphics.Shader.Instructions
}
}
public static void Cont(EmitterContext context)
{
InstCont op = context.GetOp<InstCont>();
EmitBrkContSync(context);
}
public static void Exit(EmitterContext context)
{
InstExit op = context.GetOp<InstExit>();
@ -116,7 +123,14 @@ namespace Ryujinx.Graphics.Shader.Instructions
{
InstPbk op = context.GetOp<InstPbk>();
EmitPbkOrSsy(context);
EmitPbkPcntSsy(context);
}
public static void Pcnt(EmitterContext context)
{
InstPcnt op = context.GetOp<InstPcnt>();
EmitPbkPcntSsy(context);
}
public static void Ret(EmitterContext context)
@ -137,17 +151,17 @@ namespace Ryujinx.Graphics.Shader.Instructions
{
InstSsy op = context.GetOp<InstSsy>();
EmitPbkOrSsy(context);
EmitPbkPcntSsy(context);
}
public static void Sync(EmitterContext context)
{
InstSync op = context.GetOp<InstSync>();
EmitBrkOrSync(context);
EmitBrkContSync(context);
}
private static void EmitPbkOrSsy(EmitterContext context)
private static void EmitPbkPcntSsy(EmitterContext context)
{
var consumers = context.CurrBlock.PushOpCodes.First(x => x.Op.Address == context.CurrOp.Address).Consumers;
@ -162,7 +176,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
}
}
private static void EmitBrkOrSync(EmitterContext context)
private static void EmitBrkContSync(EmitterContext context)
{
var targets = context.CurrBlock.SyncTargets;