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