CpuTestAlu.cs 2.2 KB

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