AILBlock.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using System.Collections.Generic;
  2. namespace ChocolArm64.Translation
  3. {
  4. class AILBlock : IAILEmit
  5. {
  6. public long IntInputs { get; private set; }
  7. public long IntOutputs { get; private set; }
  8. public long VecInputs { get; private set; }
  9. public long VecOutputs { get; private set; }
  10. public bool HasStateStore { get; private set; }
  11. public List<IAILEmit> ILEmitters { get; private set; }
  12. public AILBlock Next { get; set; }
  13. public AILBlock Branch { get; set; }
  14. public AILBlock()
  15. {
  16. ILEmitters = new List<IAILEmit>();
  17. }
  18. public void Add(IAILEmit ILEmitter)
  19. {
  20. if (ILEmitter is AILOpCodeLoad Ld && AILEmitter.IsRegIndex(Ld.Index))
  21. {
  22. switch (Ld.IoType)
  23. {
  24. case AIoType.Flag: IntInputs |= ((1L << Ld.Index) << 32) & ~IntOutputs; break;
  25. case AIoType.Int: IntInputs |= (1L << Ld.Index) & ~IntOutputs; break;
  26. case AIoType.Vector: VecInputs |= (1L << Ld.Index) & ~VecOutputs; break;
  27. }
  28. }
  29. else if (ILEmitter is AILOpCodeStore St)
  30. {
  31. if (AILEmitter.IsRegIndex(St.Index))
  32. {
  33. switch (St.IoType)
  34. {
  35. case AIoType.Flag: IntOutputs |= (1L << St.Index) << 32; break;
  36. case AIoType.Int: IntOutputs |= 1L << St.Index; break;
  37. case AIoType.Vector: VecOutputs |= 1L << St.Index; break;
  38. }
  39. }
  40. if (St.IoType == AIoType.Fields)
  41. {
  42. HasStateStore = true;
  43. }
  44. }
  45. ILEmitters.Add(ILEmitter);
  46. }
  47. public void Emit(AILEmitter Context)
  48. {
  49. foreach (IAILEmit ILEmitter in ILEmitters)
  50. {
  51. ILEmitter.Emit(Context);
  52. }
  53. }
  54. }
  55. }