aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/CodeGen/X86/CodeGenContext.cs
diff options
context:
space:
mode:
authorTSR Berry <20988865+TSRBerry@users.noreply.github.com>2023-04-08 01:22:00 +0200
committerMary <thog@protonmail.com>2023-04-27 23:51:14 +0200
commitcee712105850ac3385cd0091a923438167433f9f (patch)
tree4a5274b21d8b7f938c0d0ce18736d3f2993b11b1 /ARMeilleure/CodeGen/X86/CodeGenContext.cs
parentcd124bda587ef09668a971fa1cac1c3f0cfc9f21 (diff)
Move solution and projects to src
Diffstat (limited to 'ARMeilleure/CodeGen/X86/CodeGenContext.cs')
-rw-r--r--ARMeilleure/CodeGen/X86/CodeGenContext.cs105
1 files changed, 0 insertions, 105 deletions
diff --git a/ARMeilleure/CodeGen/X86/CodeGenContext.cs b/ARMeilleure/CodeGen/X86/CodeGenContext.cs
deleted file mode 100644
index 89948724..00000000
--- a/ARMeilleure/CodeGen/X86/CodeGenContext.cs
+++ /dev/null
@@ -1,105 +0,0 @@
-using ARMeilleure.CodeGen.RegisterAllocators;
-using ARMeilleure.IntermediateRepresentation;
-using Ryujinx.Common.Memory;
-using System.IO;
-using System.Numerics;
-
-namespace ARMeilleure.CodeGen.X86
-{
- class CodeGenContext
- {
- private readonly Stream _stream;
- private readonly Operand[] _blockLabels;
-
- public int StreamOffset => (int)_stream.Length;
-
- public AllocationResult AllocResult { get; }
-
- public Assembler Assembler { get; }
- public BasicBlock CurrBlock { get; private set; }
-
- public int CallArgsRegionSize { get; }
- public int XmmSaveRegionSize { get; }
-
- public CodeGenContext(AllocationResult allocResult, int maxCallArgs, int blocksCount, bool relocatable)
- {
- _stream = MemoryStreamManager.Shared.GetStream();
- _blockLabels = new Operand[blocksCount];
-
- AllocResult = allocResult;
- Assembler = new Assembler(_stream, relocatable);
-
- CallArgsRegionSize = GetCallArgsRegionSize(allocResult, maxCallArgs, out int xmmSaveRegionSize);
- XmmSaveRegionSize = xmmSaveRegionSize;
- }
-
- private static int GetCallArgsRegionSize(AllocationResult allocResult, int maxCallArgs, out int xmmSaveRegionSize)
- {
- // We need to add 8 bytes to the total size, as the call to this function already pushed 8 bytes (the
- // return address).
- int intMask = CallingConvention.GetIntCalleeSavedRegisters() & allocResult.IntUsedRegisters;
- int vecMask = CallingConvention.GetVecCalleeSavedRegisters() & allocResult.VecUsedRegisters;
-
- xmmSaveRegionSize = BitOperations.PopCount((uint)vecMask) * 16;
-
- int calleeSaveRegionSize = BitOperations.PopCount((uint)intMask) * 8 + xmmSaveRegionSize + 8;
-
- int argsCount = maxCallArgs;
-
- if (argsCount < 0)
- {
- // When the function has no calls, argsCount is -1. In this case, we don't need to allocate the shadow
- // space.
- argsCount = 0;
- }
- else if (argsCount < 4)
- {
- // The ABI mandates that the space for at least 4 arguments is reserved on the stack (this is called
- // shadow space).
- argsCount = 4;
- }
-
- // TODO: Align XMM save region to 16 bytes because unwinding on Windows requires it.
- int frameSize = calleeSaveRegionSize + allocResult.SpillRegionSize;
-
- // TODO: Instead of always multiplying by 16 (the largest possible size of a variable, since a V128 has 16
- // bytes), we should calculate the exact size consumed by the arguments passed to the called functions on
- // the stack.
- int callArgsAndFrameSize = frameSize + argsCount * 16;
-
- // Ensure that the Stack Pointer will be aligned to 16 bytes.
- callArgsAndFrameSize = (callArgsAndFrameSize + 0xf) & ~0xf;
-
- return callArgsAndFrameSize - frameSize;
- }
-
- public void EnterBlock(BasicBlock block)
- {
- Assembler.MarkLabel(GetLabel(block));
-
- CurrBlock = block;
- }
-
- public void JumpTo(BasicBlock target)
- {
- Assembler.Jmp(GetLabel(target));
- }
-
- public void JumpTo(X86Condition condition, BasicBlock target)
- {
- Assembler.Jcc(condition, GetLabel(target));
- }
-
- private Operand GetLabel(BasicBlock block)
- {
- ref Operand label = ref _blockLabels[block.Index];
-
- if (label == default)
- {
- label = Operand.Factory.Label();
- }
-
- return label;
- }
- }
-} \ No newline at end of file