diff options
author | gdkchan <gab.dark.100@gmail.com> | 2023-03-08 19:25:35 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-08 23:25:35 +0100 |
commit | f0562b9c75308c8cfcaa2458dfd37ac42751a374 (patch) | |
tree | bdcd7c9af2ad687c7cb4f4f519ff5a6a1b6a2092 /ARMeilleure/CodeGen/PreAllocatorCommon.cs | |
parent | b8556530f2b160db70ff571adf25ae26d4b8f58f (diff) |
CPU: Avoid argument value copies on the JIT (#4484)1.1.651
* Minor refactoring of the pre-allocator
* Avoid LoadArgument copies
* PPTC version bump
Diffstat (limited to 'ARMeilleure/CodeGen/PreAllocatorCommon.cs')
-rw-r--r-- | ARMeilleure/CodeGen/PreAllocatorCommon.cs | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/ARMeilleure/CodeGen/PreAllocatorCommon.cs b/ARMeilleure/CodeGen/PreAllocatorCommon.cs new file mode 100644 index 00000000..53f279fb --- /dev/null +++ b/ARMeilleure/CodeGen/PreAllocatorCommon.cs @@ -0,0 +1,57 @@ +using ARMeilleure.IntermediateRepresentation; +using System; +using static ARMeilleure.IntermediateRepresentation.Operand.Factory; + +namespace ARMeilleure.CodeGen +{ + static class PreAllocatorCommon + { + public static void Propagate(ref Span<Operation> buffer, Operand dest, Operand value) + { + ReadOnlySpan<Operation> uses = dest.GetUses(ref buffer); + + foreach (Operation use in uses) + { + for (int srcIndex = 0; srcIndex < use.SourcesCount; srcIndex++) + { + Operand useSrc = use.GetSource(srcIndex); + + if (useSrc == dest) + { + use.SetSource(srcIndex, value); + } + else if (useSrc.Kind == OperandKind.Memory) + { + MemoryOperand memoryOp = useSrc.GetMemory(); + + Operand baseAddr = memoryOp.BaseAddress; + Operand index = memoryOp.Index; + bool changed = false; + + if (baseAddr == dest) + { + baseAddr = value; + changed = true; + } + + if (index == dest) + { + index = value; + changed = true; + } + + if (changed) + { + use.SetSource(srcIndex, MemoryOp( + useSrc.Type, + baseAddr, + index, + memoryOp.Scale, + memoryOp.Displacement)); + } + } + } + } + } + } +} |