| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- 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));
- }
- }
- }
|