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 }