CpuTestT32Flow.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. using ARMeilleure.State;
  2. using NUnit.Framework;
  3. namespace Ryujinx.Tests.Cpu
  4. {
  5. [Category("T32Flow")]
  6. public sealed class CpuTestT32Flow : CpuTest32
  7. {
  8. [Test]
  9. public void TestT32B1()
  10. {
  11. // BNE label
  12. ThumbOpcode(0xf040);
  13. ThumbOpcode(0x8240);
  14. for (int i = 0; i < 576; i++)
  15. {
  16. ThumbOpcode(0xe7fe);
  17. }
  18. // label: BX LR
  19. ThumbOpcode(0x4770);
  20. GetContext().SetPstateFlag(PState.TFlag, true);
  21. ExecuteOpcodes(runUnicorn: false);
  22. }
  23. [Test]
  24. public void TestT32B2()
  25. {
  26. // BNE label1
  27. ThumbOpcode(0xf040);
  28. ThumbOpcode(0x8242);
  29. // label2: BNE label3
  30. ThumbOpcode(0xf040);
  31. ThumbOpcode(0x8242);
  32. for (int i = 0; i < 576; i++)
  33. {
  34. ThumbOpcode(0xe7fe);
  35. }
  36. // label1: BNE label2
  37. ThumbOpcode(0xf47f);
  38. ThumbOpcode(0xadbc);
  39. // label3: BX LR
  40. ThumbOpcode(0x4770);
  41. GetContext().SetPstateFlag(PState.TFlag, true);
  42. ExecuteOpcodes(runUnicorn: false);
  43. }
  44. [Test]
  45. public void TestT32B3()
  46. {
  47. // B.W label
  48. ThumbOpcode(0xf000);
  49. ThumbOpcode(0xba40);
  50. for (int i = 0; i < 576; i++)
  51. {
  52. ThumbOpcode(0xe7fe);
  53. }
  54. // label: BX LR
  55. ThumbOpcode(0x4770);
  56. GetContext().SetPstateFlag(PState.TFlag, true);
  57. ExecuteOpcodes(runUnicorn: false);
  58. }
  59. [Test]
  60. public void TestT32B4()
  61. {
  62. // B.W label1
  63. ThumbOpcode(0xf000);
  64. ThumbOpcode(0xba42);
  65. // label2: B.W label3
  66. ThumbOpcode(0xf000);
  67. ThumbOpcode(0xba42);
  68. for (int i = 0; i < 576; i++)
  69. {
  70. ThumbOpcode(0xe7fe);
  71. }
  72. // label1: B.W label2
  73. ThumbOpcode(0xf7ff);
  74. ThumbOpcode(0xbdbc);
  75. // label3: BX LR
  76. ThumbOpcode(0x4770);
  77. GetContext().SetPstateFlag(PState.TFlag, true);
  78. ExecuteOpcodes(runUnicorn: false);
  79. }
  80. [Test]
  81. public void TestT32Bl()
  82. {
  83. // BL label
  84. ThumbOpcode(0xf000);
  85. ThumbOpcode(0xf840);
  86. for (int i = 0; i < 64; i++)
  87. {
  88. ThumbOpcode(0xe7fe);
  89. }
  90. ThumbOpcode(0x4670); // label: MOV R0, LR
  91. ThumbOpcode(0x2100); // MOVS R1, #0
  92. ThumbOpcode(0x468e); // MOV LR, R1
  93. ThumbOpcode(0x4770); // BX LR
  94. GetContext().SetPstateFlag(PState.TFlag, true);
  95. ExecuteOpcodes(runUnicorn: false);
  96. Assert.That(GetContext().GetX(0), Is.EqualTo(0x1005));
  97. }
  98. [Test]
  99. public void TestT32Blx1()
  100. {
  101. // BLX label
  102. ThumbOpcode(0xf000);
  103. ThumbOpcode(0xe840);
  104. for (int i = 0; i < 64; i++)
  105. {
  106. ThumbOpcode(0x4770);
  107. }
  108. // .arm ; label: MOV R0, LR
  109. Opcode(0xe1a0000e);
  110. // MOV LR, #0
  111. Opcode(0xe3a0e000);
  112. // BX LR
  113. Opcode(0xe12fff1e);
  114. GetContext().SetPstateFlag(PState.TFlag, true);
  115. ExecuteOpcodes(runUnicorn: false);
  116. Assert.That(GetContext().GetX(0), Is.EqualTo(0x1005));
  117. Assert.That(GetContext().GetPstateFlag(PState.TFlag), Is.EqualTo(false));
  118. }
  119. [Test]
  120. public void TestT32Blx2()
  121. {
  122. // NOP
  123. ThumbOpcode(0xbf00);
  124. // BLX label
  125. ThumbOpcode(0xf000);
  126. ThumbOpcode(0xe840);
  127. for (int i = 0; i < 63; i++)
  128. {
  129. ThumbOpcode(0x4770);
  130. }
  131. // .arm ; label: MOV R0, LR
  132. Opcode(0xe1a0000e);
  133. // MOV LR, #0
  134. Opcode(0xe3a0e000);
  135. // BX LR
  136. Opcode(0xe12fff1e);
  137. GetContext().SetPstateFlag(PState.TFlag, true);
  138. ExecuteOpcodes(runUnicorn: false);
  139. Assert.That(GetContext().GetX(0), Is.EqualTo(0x1007));
  140. Assert.That(GetContext().GetPstateFlag(PState.TFlag), Is.EqualTo(false));
  141. }
  142. }
  143. }