A32InstInterpretFlow.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using ChocolArm64.Decoder;
  2. using ChocolArm64.Decoder32;
  3. using ChocolArm64.Memory;
  4. using ChocolArm64.State;
  5. using static ChocolArm64.Instruction32.A32InstInterpretHelper;
  6. namespace ChocolArm64.Instruction32
  7. {
  8. static partial class A32InstInterpret
  9. {
  10. public static void B(AThreadState State, AMemory Memory, AOpCode OpCode)
  11. {
  12. A32OpCodeBImmAl Op = (A32OpCodeBImmAl)OpCode;
  13. if (IsConditionTrue(State, Op.Cond))
  14. {
  15. BranchWritePc(State, GetPc(State) + (uint)Op.Imm);
  16. }
  17. }
  18. public static void Bl(AThreadState State, AMemory Memory, AOpCode OpCode)
  19. {
  20. Blx(State, Memory, OpCode, false);
  21. }
  22. public static void Blx(AThreadState State, AMemory Memory, AOpCode OpCode)
  23. {
  24. Blx(State, Memory, OpCode, true);
  25. }
  26. public static void Blx(AThreadState State, AMemory Memory, AOpCode OpCode, bool X)
  27. {
  28. A32OpCodeBImmAl Op = (A32OpCodeBImmAl)OpCode;
  29. if (IsConditionTrue(State, Op.Cond))
  30. {
  31. uint Pc = GetPc(State);
  32. if (State.Thumb)
  33. {
  34. State.R14 = Pc | 1;
  35. }
  36. else
  37. {
  38. State.R14 = Pc - 4U;
  39. }
  40. if (X)
  41. {
  42. State.Thumb = !State.Thumb;
  43. }
  44. if (!State.Thumb)
  45. {
  46. Pc &= ~3U;
  47. }
  48. BranchWritePc(State, Pc + (uint)Op.Imm);
  49. }
  50. }
  51. private static void BranchWritePc(AThreadState State, uint Pc)
  52. {
  53. State.R15 = State.Thumb
  54. ? Pc & ~1U
  55. : Pc & ~3U;
  56. }
  57. }
  58. }