Fix for ld/str with size > 32

This commit is contained in:
gdkchan 2018-03-23 21:47:50 -03:00
parent 7949ceffa5
commit 8ed55be9c5
4 changed files with 22 additions and 12 deletions

View file

@ -39,7 +39,7 @@ namespace Ryujinx.Graphics.Gal.Shader
private const string GprName = "gpr";
private string IdentationStr = "\t";
private const string IdentationStr = "\t";
private int GprsCount;

View file

@ -2,45 +2,45 @@ namespace Ryujinx.Graphics.Gal.Shader
{
static class ShaderDecodeHelper
{
public static ShaderIrOper[] GetAluOperANode_A(long OpCode)
public static ShaderIrOperAbuf[] GetAluOperANode_A(long OpCode)
{
int Abuf = (int)(OpCode >> 20) & 0x3ff;
int Reg = (int)(OpCode >> 39) & 0xff;
int Size = (int)(OpCode >> 47) & 3;
ShaderIrOper[] Opers = new ShaderIrOper[Size + 1];
ShaderIrOperAbuf[] Opers = new ShaderIrOperAbuf[Size + 1];
for (int Index = 0; Index <= Size; Index++)
{
Opers[Index] = new ShaderIrOperAbuf(Abuf, (Reg + Index) & 0xff);
Opers[Index] = new ShaderIrOperAbuf(Abuf, Reg);
}
return Opers;
}
public static ShaderIrOper GetAluOperANode_R(long OpCode)
public static ShaderIrOperReg GetAluOperANode_R(long OpCode)
{
return new ShaderIrOperReg((int)(OpCode >> 8) & 0xff);
}
public static ShaderIrOper GetAluOperBNode_RR(long OpCode)
public static ShaderIrOperReg GetAluOperBNode_RR(long OpCode)
{
return new ShaderIrOperReg((int)(OpCode >> 20) & 0xff);
}
public static ShaderIrOper GetAluOperBCNode_R(long OpCode)
public static ShaderIrOperReg GetAluOperBCNode_R(long OpCode)
{
return new ShaderIrOperReg((int)(OpCode >> 39) & 0xff);
}
public static ShaderIrOper GetAluOperBCNode_C(long OpCode)
public static ShaderIrOperCbuf GetAluOperBCNode_C(long OpCode)
{
return new ShaderIrOperCbuf(
(int)(OpCode >> 34) & 0x1f,
(int)(OpCode >> 20) & 0x3fff);
}
public static ShaderIrOper GetAluOperDNode(long OpCode)
public static ShaderIrOperReg GetAluOperDNode(long OpCode)
{
return new ShaderIrOperReg((int)(OpCode >> 0) & 0xff);
}

View file

@ -7,10 +7,15 @@ namespace Ryujinx.Graphics.Gal.Shader
public static void Ld_A(ShaderIrBlock Block, long OpCode)
{
ShaderIrOper[] Opers = GetAluOperANode_A(OpCode);
ShaderIrOper OperD = GetAluOperDNode(OpCode);
int Index = 0;
foreach (ShaderIrOper OperA in Opers)
{
ShaderIrOperReg OperD = GetAluOperDNode(OpCode);
OperD.GprIndex += Index++;
Block.AddNode(new ShaderIrNode(OperD, OperA));
}
}
@ -18,10 +23,15 @@ namespace Ryujinx.Graphics.Gal.Shader
public static void St_A(ShaderIrBlock Block, long OpCode)
{
ShaderIrOper[] Opers = GetAluOperANode_A(OpCode);
ShaderIrOper OperD = GetAluOperDNode(OpCode);
int Index = 0;
foreach (ShaderIrOper OperA in Opers)
{
ShaderIrOperReg OperD = GetAluOperDNode(OpCode);
OperD.GprIndex += Index++;
Block.AddNode(new ShaderIrNode(OperA, OperD));
}
}

View file

@ -4,7 +4,7 @@ namespace Ryujinx.Graphics.Gal.Shader
{
public const int ZRIndex = 0xff;
public int GprIndex { get; private set; }
public int GprIndex { get; set; }
public ShaderIrOperReg(int GprIndex)
{