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 }