RegisterMasks.cs 1.7 KB

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