RegisterMasks.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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 RegisterMasks(
  14. int intAvailableRegisters,
  15. int vecAvailableRegisters,
  16. int intCallerSavedRegisters,
  17. int vecCallerSavedRegisters,
  18. int intCalleeSavedRegisters,
  19. int vecCalleeSavedRegisters)
  20. {
  21. IntAvailableRegisters = intAvailableRegisters;
  22. VecAvailableRegisters = vecAvailableRegisters;
  23. IntCallerSavedRegisters = intCallerSavedRegisters;
  24. VecCallerSavedRegisters = vecCallerSavedRegisters;
  25. IntCalleeSavedRegisters = intCalleeSavedRegisters;
  26. VecCalleeSavedRegisters = vecCalleeSavedRegisters;
  27. }
  28. public int GetAvailableRegisters(RegisterType type)
  29. {
  30. if (type == RegisterType.Integer)
  31. {
  32. return IntAvailableRegisters;
  33. }
  34. else if (type == RegisterType.Vector)
  35. {
  36. return VecAvailableRegisters;
  37. }
  38. else
  39. {
  40. throw new ArgumentException($"Invalid register type \"{type}\".");
  41. }
  42. }
  43. }
  44. }