A32InstInterpretFlow.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using ChocolArm64.Decoders;
  2. using ChocolArm64.Decoders32;
  3. using ChocolArm64.Memory;
  4. using ChocolArm64.State;
  5. using static ChocolArm64.Instructions32.A32InstInterpretHelper;
  6. namespace ChocolArm64.Instructions32
  7. {
  8. static partial class A32InstInterpret
  9. {
  10. public static void B(CpuThreadState state, MemoryManager memory, OpCode64 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(CpuThreadState state, MemoryManager memory, OpCode64 opCode)
  19. {
  20. Blx(state, memory, opCode, false);
  21. }
  22. public static void Blx(CpuThreadState state, MemoryManager memory, OpCode64 opCode)
  23. {
  24. Blx(state, memory, opCode, true);
  25. }
  26. public static void Blx(CpuThreadState state, MemoryManager memory, OpCode64 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(CpuThreadState state, uint pc)
  52. {
  53. state.R15 = state.Thumb
  54. ? pc & ~1U
  55. : pc & ~3U;
  56. }
  57. }
  58. }