diff options
Diffstat (limited to 'Ryujinx.Tests/Cpu/CpuTestT32Flow.cs')
-rw-r--r-- | Ryujinx.Tests/Cpu/CpuTestT32Flow.cs | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/Ryujinx.Tests/Cpu/CpuTestT32Flow.cs b/Ryujinx.Tests/Cpu/CpuTestT32Flow.cs new file mode 100644 index 00000000..2c83b01d --- /dev/null +++ b/Ryujinx.Tests/Cpu/CpuTestT32Flow.cs @@ -0,0 +1,167 @@ +using ARMeilleure.State; +using NUnit.Framework; + +namespace Ryujinx.Tests.Cpu +{ + [Category("T32Flow")] + public sealed class CpuTestT32Flow : CpuTest32 + { + [Test] + public void TestT32B1() + { + // BNE label + ThumbOpcode(0xf040); + ThumbOpcode(0x8240); + for (int i = 0; i < 576; i++) + { + ThumbOpcode(0xe7fe); + } + // label: BX LR + ThumbOpcode(0x4770); + + GetContext().SetPstateFlag(PState.TFlag, true); + + ExecuteOpcodes(runUnicorn: false); + } + + [Test] + public void TestT32B2() + { + // BNE label1 + ThumbOpcode(0xf040); + ThumbOpcode(0x8242); + // label2: BNE label3 + ThumbOpcode(0xf040); + ThumbOpcode(0x8242); + for (int i = 0; i < 576; i++) + { + ThumbOpcode(0xe7fe); + } + // label1: BNE label2 + ThumbOpcode(0xf47f); + ThumbOpcode(0xadbc); + // label3: BX LR + ThumbOpcode(0x4770); + + GetContext().SetPstateFlag(PState.TFlag, true); + + ExecuteOpcodes(runUnicorn: false); + } + + [Test] + public void TestT32B3() + { + // B.W label + ThumbOpcode(0xf000); + ThumbOpcode(0xba40); + for (int i = 0; i < 576; i++) + { + ThumbOpcode(0xe7fe); + } + // label: BX LR + ThumbOpcode(0x4770); + + GetContext().SetPstateFlag(PState.TFlag, true); + + ExecuteOpcodes(runUnicorn: false); + } + + [Test] + public void TestT32B4() + { + // B.W label1 + ThumbOpcode(0xf000); + ThumbOpcode(0xba42); + // label2: B.W label3 + ThumbOpcode(0xf000); + ThumbOpcode(0xba42); + for (int i = 0; i < 576; i++) + { + ThumbOpcode(0xe7fe); + } + // label1: B.W label2 + ThumbOpcode(0xf7ff); + ThumbOpcode(0xbdbc); + // label3: BX LR + ThumbOpcode(0x4770); + + GetContext().SetPstateFlag(PState.TFlag, true); + + ExecuteOpcodes(runUnicorn: false); + } + + [Test] + public void TestT32Bl() + { + // BL label + ThumbOpcode(0xf000); + ThumbOpcode(0xf840); + for (int i = 0; i < 64; i++) + { + ThumbOpcode(0xe7fe); + } + ThumbOpcode(0x4670); // label: MOV R0, LR + ThumbOpcode(0x2100); // MOVS R1, #0 + ThumbOpcode(0x468e); // MOV LR, R1 + ThumbOpcode(0x4770); // BX LR + + GetContext().SetPstateFlag(PState.TFlag, true); + + ExecuteOpcodes(runUnicorn: false); + + Assert.That(GetContext().GetX(0), Is.EqualTo(0x1005)); + } + + [Test] + public void TestT32Blx1() + { + // BLX label + ThumbOpcode(0xf000); + ThumbOpcode(0xe840); + for (int i = 0; i < 64; i++) + { + ThumbOpcode(0x4770); + } + // .arm ; label: MOV R0, LR + Opcode(0xe1a0000e); + // MOV LR, #0 + Opcode(0xe3a0e000); + // BX LR + Opcode(0xe12fff1e); + + GetContext().SetPstateFlag(PState.TFlag, true); + + ExecuteOpcodes(runUnicorn: false); + + Assert.That(GetContext().GetX(0), Is.EqualTo(0x1005)); + Assert.That(GetContext().GetPstateFlag(PState.TFlag), Is.EqualTo(false)); + } + + [Test] + public void TestT32Blx2() + { + // NOP + ThumbOpcode(0xbf00); + // BLX label + ThumbOpcode(0xf000); + ThumbOpcode(0xe840); + for (int i = 0; i < 63; i++) + { + ThumbOpcode(0x4770); + } + // .arm ; label: MOV R0, LR + Opcode(0xe1a0000e); + // MOV LR, #0 + Opcode(0xe3a0e000); + // BX LR + Opcode(0xe12fff1e); + + GetContext().SetPstateFlag(PState.TFlag, true); + + ExecuteOpcodes(runUnicorn: false); + + Assert.That(GetContext().GetX(0), Is.EqualTo(0x1007)); + Assert.That(GetContext().GetPstateFlag(PState.TFlag), Is.EqualTo(false)); + } + } +}
\ No newline at end of file |