forked from Mirror/Ryujinx
Fold constant offsets and group constant addresses (#2285)
* Fold constant offsets and group constant addresses * PPTC version bump
This commit is contained in:
parent
57ea3f93a3
commit
e318022b89
3 changed files with 42 additions and 21 deletions
|
@ -1,6 +1,7 @@
|
||||||
using ARMeilleure.CodeGen.Optimizations;
|
using ARMeilleure.CodeGen.Optimizations;
|
||||||
using ARMeilleure.IntermediateRepresentation;
|
using ARMeilleure.IntermediateRepresentation;
|
||||||
using ARMeilleure.Translation;
|
using ARMeilleure.Translation;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
using static ARMeilleure.IntermediateRepresentation.OperandHelper;
|
using static ARMeilleure.IntermediateRepresentation.OperandHelper;
|
||||||
using static ARMeilleure.IntermediateRepresentation.OperationHelper;
|
using static ARMeilleure.IntermediateRepresentation.OperationHelper;
|
||||||
|
@ -11,8 +12,28 @@ namespace ARMeilleure.CodeGen.X86
|
||||||
{
|
{
|
||||||
public static void RunPass(ControlFlowGraph cfg)
|
public static void RunPass(ControlFlowGraph cfg)
|
||||||
{
|
{
|
||||||
|
var constants = new Dictionary<ulong, Operand>();
|
||||||
|
|
||||||
|
Operand GetConstantCopy(BasicBlock block, Operation operation, Operand source)
|
||||||
|
{
|
||||||
|
if (!constants.TryGetValue(source.Value, out var constant))
|
||||||
|
{
|
||||||
|
constant = Local(source.Type);
|
||||||
|
|
||||||
|
Operation copyOp = Operation(Instruction.Copy, constant, source);
|
||||||
|
|
||||||
|
block.Operations.AddBefore(operation, copyOp);
|
||||||
|
|
||||||
|
constants.Add(source.Value, constant);
|
||||||
|
}
|
||||||
|
|
||||||
|
return constant;
|
||||||
|
}
|
||||||
|
|
||||||
for (BasicBlock block = cfg.Blocks.First; block != null; block = block.ListNext)
|
for (BasicBlock block = cfg.Blocks.First; block != null; block = block.ListNext)
|
||||||
{
|
{
|
||||||
|
constants.Clear();
|
||||||
|
|
||||||
Node nextNode;
|
Node nextNode;
|
||||||
|
|
||||||
for (Node node = block.Operations.First; node != null; node = nextNode)
|
for (Node node = block.Operations.First; node != null; node = nextNode)
|
||||||
|
@ -33,24 +54,12 @@ namespace ARMeilleure.CodeGen.X86
|
||||||
|
|
||||||
if (src1.Kind == OperandKind.Constant && (src1.Relocatable || CodeGenCommon.IsLongConst(src1)))
|
if (src1.Kind == OperandKind.Constant && (src1.Relocatable || CodeGenCommon.IsLongConst(src1)))
|
||||||
{
|
{
|
||||||
Operand temp = Local(src1.Type);
|
operation.SetSource(0, GetConstantCopy(block, operation, src1));
|
||||||
|
|
||||||
Operation copyOp = Operation(Instruction.Copy, temp, src1);
|
|
||||||
|
|
||||||
block.Operations.AddBefore(operation, copyOp);
|
|
||||||
|
|
||||||
operation.SetSource(0, temp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (src2.Kind == OperandKind.Constant && (src2.Relocatable || CodeGenCommon.IsLongConst(src2)))
|
if (src2.Kind == OperandKind.Constant && (src2.Relocatable || CodeGenCommon.IsLongConst(src2)))
|
||||||
{
|
{
|
||||||
Operand temp = Local(src2.Type);
|
operation.SetSource(1, GetConstantCopy(block, operation, src2));
|
||||||
|
|
||||||
Operation copyOp = Operation(Instruction.Copy, temp, src2);
|
|
||||||
|
|
||||||
block.Operations.AddBefore(operation, copyOp);
|
|
||||||
|
|
||||||
operation.SetSource(1, temp);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,6 +120,11 @@ namespace ARMeilleure.CodeGen.X86
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (imm == 0 && scale == Multiplier.x1 && indexOp != null)
|
||||||
|
{
|
||||||
|
imm = GetConstOp(ref indexOp);
|
||||||
|
}
|
||||||
|
|
||||||
return MemoryOp(type, baseOp, indexOp, scale, imm);
|
return MemoryOp(type, baseOp, indexOp, scale, imm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -87,8 +87,7 @@ namespace ARMeilleure.Instructions
|
||||||
}
|
}
|
||||||
|
|
||||||
Operand address = GetAddress(context);
|
Operand address = GetAddress(context);
|
||||||
|
Operand address2 = GetAddress(context, 1L << op.Size);
|
||||||
Operand address2 = context.Add(address, Const(1L << op.Size));
|
|
||||||
|
|
||||||
EmitLoad(op.Rt, address);
|
EmitLoad(op.Rt, address);
|
||||||
EmitLoad(op.Rt2, address2);
|
EmitLoad(op.Rt2, address2);
|
||||||
|
@ -112,8 +111,7 @@ namespace ARMeilleure.Instructions
|
||||||
OpCodeMemPair op = (OpCodeMemPair)context.CurrOp;
|
OpCodeMemPair op = (OpCodeMemPair)context.CurrOp;
|
||||||
|
|
||||||
Operand address = GetAddress(context);
|
Operand address = GetAddress(context);
|
||||||
|
Operand address2 = GetAddress(context, 1L << op.Size);
|
||||||
Operand address2 = context.Add(address, Const(1L << op.Size));
|
|
||||||
|
|
||||||
InstEmitMemoryHelper.EmitStore(context, address, op.Rt, op.Size);
|
InstEmitMemoryHelper.EmitStore(context, address, op.Rt, op.Size);
|
||||||
InstEmitMemoryHelper.EmitStore(context, address2, op.Rt2, op.Size);
|
InstEmitMemoryHelper.EmitStore(context, address2, op.Rt2, op.Size);
|
||||||
|
@ -121,7 +119,7 @@ namespace ARMeilleure.Instructions
|
||||||
EmitWBackIfNeeded(context, address);
|
EmitWBackIfNeeded(context, address);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Operand GetAddress(ArmEmitterContext context)
|
private static Operand GetAddress(ArmEmitterContext context, long addend = 0)
|
||||||
{
|
{
|
||||||
Operand address = null;
|
Operand address = null;
|
||||||
|
|
||||||
|
@ -134,7 +132,11 @@ namespace ARMeilleure.Instructions
|
||||||
// Pre-indexing.
|
// Pre-indexing.
|
||||||
if (!op.PostIdx)
|
if (!op.PostIdx)
|
||||||
{
|
{
|
||||||
address = context.Add(address, Const(op.Immediate));
|
address = context.Add(address, Const(op.Immediate + addend));
|
||||||
|
}
|
||||||
|
else if (addend != 0)
|
||||||
|
{
|
||||||
|
address = context.Add(address, Const(addend));
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -153,6 +155,11 @@ namespace ARMeilleure.Instructions
|
||||||
|
|
||||||
address = context.Add(n, m);
|
address = context.Add(n, m);
|
||||||
|
|
||||||
|
if (addend != 0)
|
||||||
|
{
|
||||||
|
address = context.Add(address, Const(addend));
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@ namespace ARMeilleure.Translation.PTC
|
||||||
private const string OuterHeaderMagicString = "PTCohd\0\0";
|
private const string OuterHeaderMagicString = "PTCohd\0\0";
|
||||||
private const string InnerHeaderMagicString = "PTCihd\0\0";
|
private const string InnerHeaderMagicString = "PTCihd\0\0";
|
||||||
|
|
||||||
private const uint InternalVersion = 1866; //! To be incremented manually for each change to the ARMeilleure project.
|
private const uint InternalVersion = 2285; //! To be incremented manually for each change to the ARMeilleure project.
|
||||||
|
|
||||||
private const string ActualDir = "0";
|
private const string ActualDir = "0";
|
||||||
private const string BackupDir = "1";
|
private const string BackupDir = "1";
|
||||||
|
|
Loading…
Reference in a new issue