aboutsummaryrefslogtreecommitdiff
path: root/Spv.Generator/InstructionOperands.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Spv.Generator/InstructionOperands.cs')
-rw-r--r--Spv.Generator/InstructionOperands.cs53
1 files changed, 53 insertions, 0 deletions
diff --git a/Spv.Generator/InstructionOperands.cs b/Spv.Generator/InstructionOperands.cs
new file mode 100644
index 00000000..c7170ec1
--- /dev/null
+++ b/Spv.Generator/InstructionOperands.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace Spv.Generator
+{
+ public struct InstructionOperands
+ {
+ private const int InternalCount = 5;
+
+ public int Count;
+ public Operand Operand1;
+ public Operand Operand2;
+ public Operand Operand3;
+ public Operand Operand4;
+ public Operand Operand5;
+ public Operand[] Overflow;
+
+ public Span<Operand> ToSpan()
+ {
+ if (Count > InternalCount)
+ {
+ return MemoryMarshal.CreateSpan(ref this.Overflow[0], Count);
+ }
+ else
+ {
+ return MemoryMarshal.CreateSpan(ref this.Operand1, Count);
+ }
+ }
+
+ public void Add(Operand operand)
+ {
+ if (Count < InternalCount)
+ {
+ MemoryMarshal.CreateSpan(ref this.Operand1, Count + 1)[Count] = operand;
+ Count++;
+ }
+ else
+ {
+ if (Overflow == null)
+ {
+ Overflow = new Operand[InternalCount * 2];
+ MemoryMarshal.CreateSpan(ref this.Operand1, InternalCount).CopyTo(Overflow.AsSpan());
+ }
+ else if (Count == Overflow.Length)
+ {
+ Array.Resize(ref Overflow, Overflow.Length * 2);
+ }
+
+ Overflow[Count++] = operand;
+ }
+ }
+ }
+}