aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Cpu/LightningJit/CodeWriter.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Cpu/LightningJit/CodeWriter.cs')
-rw-r--r--src/Ryujinx.Cpu/LightningJit/CodeWriter.cs61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/Ryujinx.Cpu/LightningJit/CodeWriter.cs b/src/Ryujinx.Cpu/LightningJit/CodeWriter.cs
new file mode 100644
index 00000000..ac4b22ff
--- /dev/null
+++ b/src/Ryujinx.Cpu/LightningJit/CodeWriter.cs
@@ -0,0 +1,61 @@
+using System;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+
+namespace Ryujinx.Cpu.LightningJit
+{
+ class CodeWriter
+ {
+ private readonly List<uint> _instructions;
+
+ public int InstructionPointer => _instructions.Count;
+
+ public CodeWriter()
+ {
+ _instructions = new();
+ }
+
+ public void WriteInstruction(uint instruction)
+ {
+ _instructions.Add(instruction);
+ }
+
+ public void WriteInstructionAt(int index, uint instruction)
+ {
+ _instructions[index] = instruction;
+ }
+
+ public void WriteInstructionsAt(int index, CodeWriter writer)
+ {
+ _instructions.InsertRange(index, writer._instructions);
+ }
+
+ public uint ReadInstructionAt(int index)
+ {
+ return _instructions[index];
+ }
+
+ public List<uint> GetList()
+ {
+ return _instructions;
+ }
+
+ public void RemoveLastInstruction()
+ {
+ if (_instructions.Count > 0)
+ {
+ _instructions.RemoveAt(_instructions.Count - 1);
+ }
+ }
+
+ public ReadOnlySpan<uint> AsSpan()
+ {
+ return CollectionsMarshal.AsSpan(_instructions);
+ }
+
+ public ReadOnlySpan<byte> AsByteSpan()
+ {
+ return MemoryMarshal.Cast<uint, byte>(AsSpan());
+ }
+ }
+}