Skip to content

Commit

Permalink
Avoid gpr overwritting on Ld_C instruction (Ryubing#371)
Browse files Browse the repository at this point in the history
* Avoid gpr overwritting on LD_C instruction

* Address feedback

* Ignore invalid registers
  • Loading branch information
ReinUsesLisp authored and gdkchan committed Aug 21, 2018
1 parent afdeee2 commit afc4485
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 10 deletions.
7 changes: 0 additions & 7 deletions Ryujinx.Graphics/Gal/Shader/ShaderDecodeHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,6 @@ public static ShaderIrOperCbuf GetOperCbuf34(long OpCode)
(int)(OpCode >> 20) & 0x3fff);
}

public static ShaderIrOperCbuf GetOperCbuf36(long OpCode)
{
return new ShaderIrOperCbuf(
(int)(OpCode >> 36) & 0x1f,
(int)(OpCode >> 22) & 0x3fff, GetOperGpr8(OpCode));
}

public static ShaderIrOperGpr GetOperGpr8(long OpCode)
{
return new ShaderIrOperGpr((int)(OpCode >> 8) & 0xff);
Expand Down
18 changes: 15 additions & 3 deletions Ryujinx.Graphics/Gal/Shader/ShaderDecodeMem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,23 +52,35 @@ public static void Ld_A(ShaderIrBlock Block, long OpCode)

public static void Ld_C(ShaderIrBlock Block, long OpCode)
{
int Type = (int)(OpCode >> 48) & 7;
int CbufPos = (int)(OpCode >> 22) & 0x3fff;
int CbufIndex = (int)(OpCode >> 36) & 0x1f;
int Type = (int)(OpCode >> 48) & 7;

if (Type > 5)
{
throw new InvalidOperationException();
}

ShaderIrOperGpr Temp = ShaderIrOperGpr.MakeTemporary();

Block.AddNode(new ShaderIrAsg(Temp, GetOperGpr8(OpCode)));

int Count = Type == 5 ? 2 : 1;

for (int Index = 0; Index < Count; Index++)
{
ShaderIrOperCbuf OperA = GetOperCbuf36(OpCode);
ShaderIrOperGpr OperD = GetOperGpr0 (OpCode);
ShaderIrOperCbuf OperA = new ShaderIrOperCbuf(CbufIndex, CbufPos, Temp);

ShaderIrOperGpr OperD = GetOperGpr0(OpCode);

OperA.Pos += Index;
OperD.Index += Index;

if (!OperD.IsValidRegister)
{
break;
}

ShaderIrNode Node = OperA;

if (Type < 4)
Expand Down
7 changes: 7 additions & 0 deletions Ryujinx.Graphics/Gal/Shader/ShaderIrOperGpr.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,18 @@ class ShaderIrOperGpr : ShaderIrNode

public bool IsConst => Index == ZRIndex;

public bool IsValidRegister => (Index <= ZRIndex);

public int Index { get; set; }

public ShaderIrOperGpr(int Index)
{
this.Index = Index;
}

public static ShaderIrOperGpr MakeTemporary(int Index = 0)
{
return new ShaderIrOperGpr(0x100 + Index);
}
}
}

0 comments on commit afc4485

Please sign in to comment.