Avoid gpr overwritting on LD_C instruction

This commit is contained in:
ReinUsesLisp 2018-08-20 23:06:34 -03:00
commit 11d9f3348d
2 changed files with 12 additions and 3 deletions

View file

@ -52,19 +52,26 @@ namespace Ryujinx.Graphics.Gal.Shader
public static void Ld_C(ShaderIrBlock Block, long OpCode) public static void Ld_C(ShaderIrBlock Block, long OpCode)
{ {
int Type = (int)(OpCode >> 48) & 7; int Type = (int)(OpCode >> 48) & 7;
int CbufIndex = (int)(OpCode >> 36) & 0x1f;
int CbufPos = (int)(OpCode >> 22) & 0x3fff;
if (Type > 5) if (Type > 5)
{ {
throw new InvalidOperationException(); throw new InvalidOperationException();
} }
ShaderIrOperGpr Temp = ShaderIrOperGpr.MakeTemporary();
Block.AddNode(new ShaderIrAsg(Temp, GetOperGpr8(OpCode)));
int Count = Type == 5 ? 2 : 1; int Count = Type == 5 ? 2 : 1;
for (int Index = 0; Index < Count; Index++) for (int Index = 0; Index < Count; Index++)
{ {
ShaderIrOperCbuf OperA = GetOperCbuf36(OpCode); ShaderIrOperCbuf OperA = new ShaderIrOperCbuf(CbufIndex, CbufPos, Temp);
ShaderIrOperGpr OperD = GetOperGpr0 (OpCode);
ShaderIrOperGpr OperD = GetOperGpr0(OpCode);
OperA.Pos += Index; OperA.Pos += Index;
OperD.Index += Index; OperD.Index += Index;

View file

@ -4,6 +4,8 @@ namespace Ryujinx.Graphics.Gal.Shader
{ {
public const int ZRIndex = 0xff; public const int ZRIndex = 0xff;
public static ShaderIrOperGpr MakeTemporary() => new ShaderIrOperGpr(0x100);
public bool IsConst => Index == ZRIndex; public bool IsConst => Index == ZRIndex;
public int Index { get; set; } public int Index { get; set; }