aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/CodeGen/PreAllocatorCommon.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2023-03-08 19:25:35 -0300
committerGitHub <noreply@github.com>2023-03-08 23:25:35 +0100
commitf0562b9c75308c8cfcaa2458dfd37ac42751a374 (patch)
treebdcd7c9af2ad687c7cb4f4f519ff5a6a1b6a2092 /ARMeilleure/CodeGen/PreAllocatorCommon.cs
parentb8556530f2b160db70ff571adf25ae26d4b8f58f (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.cs57
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));
+ }
+ }
+ }
+ }
+ }
+ }
+}