CpuTestAlu.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using ChocolArm64.State;
  2. using NUnit.Framework;
  3. namespace Ryujinx.Tests.Cpu
  4. {
  5. public class CpuTestAlu : CpuTest
  6. {
  7. [Test]
  8. public void Add()
  9. {
  10. // ADD X0, X1, X2
  11. AThreadState ThreadState = SingleOpcode(0x8B020020, X1: 1, X2: 2);
  12. Assert.AreEqual(3, ThreadState.X0);
  13. }
  14. [TestCase(0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFul, true, false)]
  15. [TestCase(0xFFFFFFFFu, 0x00000000u, 0x00000000ul, false, true)]
  16. [TestCase(0x12345678u, 0x7324A993u, 0x12240010ul, false, false)]
  17. public void Ands(uint A, uint B, ulong Result, bool Negative, bool Zero)
  18. {
  19. // ANDS W0, W1, W2
  20. uint Opcode = 0x6A020020;
  21. AThreadState ThreadState = SingleOpcode(Opcode, X1: A, X2: B);
  22. Assert.AreEqual(Result, ThreadState.X0);
  23. Assert.AreEqual(Negative, ThreadState.Negative);
  24. Assert.AreEqual(Zero, ThreadState.Zero);
  25. }
  26. [Test]
  27. public void OrrBitmasks()
  28. {
  29. // ORR W0, WZR, #0x01010101
  30. Assert.AreEqual(0x01010101, SingleOpcode(0x3200C3E0).X0);
  31. Reset();
  32. // ORR W1, WZR, #0x00F000F0
  33. Assert.AreEqual(0x00F000F0, SingleOpcode(0x320C8FE1).X1);
  34. Reset();
  35. // ORR W2, WZR, #1
  36. Assert.AreEqual(0x00000001, SingleOpcode(0x320003E2).X2);
  37. }
  38. [Test]
  39. public void RevX0X0()
  40. {
  41. // REV X0, X0
  42. AThreadState ThreadState = SingleOpcode(0xDAC00C00, X0: 0xAABBCCDDEEFF1100);
  43. Assert.AreEqual(0x0011FFEEDDCCBBAA, ThreadState.X0);
  44. }
  45. [Test]
  46. public void RevW1W1()
  47. {
  48. // REV W1, W1
  49. AThreadState ThreadState = SingleOpcode(0x5AC00821, X1: 0x12345678);
  50. Assert.AreEqual(0x78563412, ThreadState.X1);
  51. }
  52. }
  53. }