mirror of
https://github.com/Ryujinx/Ryujinx.git
synced 2025-06-28 15:20:47 -07:00
Allow LocalVariable
to be assigned more than once (#2288)
* Allow `LocalVariable` to be assigned more than once This allows us to write flow controls like loops and if-elses with LocalVariables participating in phi nodes. * Add `GetLocalNumber` to operand
This commit is contained in:
@ -83,9 +83,10 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
|
||||
int intFreeRegisters = regMasks.IntAvailableRegisters;
|
||||
int vecFreeRegisters = regMasks.VecAvailableRegisters;
|
||||
|
||||
BlockInfo[] blockInfo = new BlockInfo[cfg.Blocks.Count];
|
||||
var blockInfo = new BlockInfo[cfg.Blocks.Count];
|
||||
|
||||
List<LocalInfo> locInfo = new List<LocalInfo>();
|
||||
var locInfo = new List<LocalInfo>();
|
||||
var locVisited = new HashSet<Operand>();
|
||||
|
||||
for (int index = cfg.PostOrderBlocks.Length - 1; index >= 0; index--)
|
||||
{
|
||||
@ -109,7 +110,7 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
|
||||
|
||||
if (source.Kind == OperandKind.LocalVariable)
|
||||
{
|
||||
locInfo[source.AsInt32() - 1].SetBlockIndex(block.Index);
|
||||
locInfo[source.GetLocalNumber() - 1].SetBlockIndex(block.Index);
|
||||
}
|
||||
else if (source.Kind == OperandKind.Memory)
|
||||
{
|
||||
@ -117,12 +118,12 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
|
||||
|
||||
if (memOp.BaseAddress != null)
|
||||
{
|
||||
locInfo[memOp.BaseAddress.AsInt32() - 1].SetBlockIndex(block.Index);
|
||||
locInfo[memOp.BaseAddress.GetLocalNumber() - 1].SetBlockIndex(block.Index);
|
||||
}
|
||||
|
||||
if (memOp.Index != null)
|
||||
{
|
||||
locInfo[memOp.Index.AsInt32() - 1].SetBlockIndex(block.Index);
|
||||
locInfo[memOp.Index.GetLocalNumber() - 1].SetBlockIndex(block.Index);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -135,9 +136,9 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
|
||||
{
|
||||
LocalInfo info;
|
||||
|
||||
if (dest.Value != 0)
|
||||
if (!locVisited.Add(dest))
|
||||
{
|
||||
info = locInfo[dest.AsInt32() - 1];
|
||||
info = locInfo[dest.GetLocalNumber() - 1];
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -198,7 +199,7 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
|
||||
|
||||
void AllocateRegister(Operand source, MemoryOperand memOp, int srcIndex)
|
||||
{
|
||||
LocalInfo info = locInfo[source.AsInt32() - 1];
|
||||
LocalInfo info = locInfo[source.GetLocalNumber() - 1];
|
||||
|
||||
info.UseCount++;
|
||||
|
||||
@ -317,7 +318,7 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
|
||||
continue;
|
||||
}
|
||||
|
||||
LocalInfo info = locInfo[dest.AsInt32() - 1];
|
||||
LocalInfo info = locInfo[dest.GetLocalNumber() - 1];
|
||||
|
||||
if (info.UseCount == 0 && !info.PreAllocated)
|
||||
{
|
||||
|
@ -976,7 +976,7 @@ namespace ARMeilleure.CodeGen.RegisterAllocators
|
||||
{
|
||||
if (operand.Kind == OperandKind.LocalVariable)
|
||||
{
|
||||
return operand.AsInt32();
|
||||
return operand.GetLocalNumber();
|
||||
}
|
||||
else if (operand.Kind == OperandKind.Register)
|
||||
{
|
||||
|
Reference in New Issue
Block a user