/ src / ARMeilleure / CodeGen / RegisterAllocators / RegisterMasks.cs
RegisterMasks.cs
 1  using ARMeilleure.IntermediateRepresentation;
 2  using System;
 3  
 4  namespace ARMeilleure.CodeGen.RegisterAllocators
 5  {
 6      readonly struct RegisterMasks
 7      {
 8          public int IntAvailableRegisters { get; }
 9          public int VecAvailableRegisters { get; }
10          public int IntCallerSavedRegisters { get; }
11          public int VecCallerSavedRegisters { get; }
12          public int IntCalleeSavedRegisters { get; }
13          public int VecCalleeSavedRegisters { get; }
14          public int RegistersCount { get; }
15  
16          public RegisterMasks(
17              int intAvailableRegisters,
18              int vecAvailableRegisters,
19              int intCallerSavedRegisters,
20              int vecCallerSavedRegisters,
21              int intCalleeSavedRegisters,
22              int vecCalleeSavedRegisters,
23              int registersCount)
24          {
25              IntAvailableRegisters = intAvailableRegisters;
26              VecAvailableRegisters = vecAvailableRegisters;
27              IntCallerSavedRegisters = intCallerSavedRegisters;
28              VecCallerSavedRegisters = vecCallerSavedRegisters;
29              IntCalleeSavedRegisters = intCalleeSavedRegisters;
30              VecCalleeSavedRegisters = vecCalleeSavedRegisters;
31              RegistersCount = registersCount;
32          }
33  
34          public int GetAvailableRegisters(RegisterType type)
35          {
36              if (type == RegisterType.Integer)
37              {
38                  return IntAvailableRegisters;
39              }
40              else if (type == RegisterType.Vector)
41              {
42                  return VecAvailableRegisters;
43              }
44              else
45              {
46                  throw new ArgumentException($"Invalid register type \"{type}\".");
47              }
48          }
49      }
50  }