CpuTestAlu.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. using ChocolArm64.State;
  2. using NUnit.Framework;
  3. namespace Ryujinx.Tests.Cpu
  4. {
  5. public class CpuTestAlu : CpuTest
  6. {
  7. [TestCase(0x9A020020u, 2u, 3u, true, 6u)]
  8. [TestCase(0x9A020020u, 2u, 3u, false, 5u)]
  9. [TestCase(0x1A020020u, 2u, 3u, true, 6u)]
  10. [TestCase(0x1A020020u, 2u, 3u, false, 5u)]
  11. [TestCase(0x1A020020u, 0xFFFFFFFFu, 0x2u, false, 0x1u)]
  12. public void Adc(uint Opcode, uint A, uint B, bool CarryState, uint Result)
  13. {
  14. // ADC (X0/W0), (X1/W1), (X2/W2)
  15. AThreadState ThreadState = SingleOpcode(Opcode, X1: A, X2: B, Carry: CarryState);
  16. Assert.AreEqual(Result, ThreadState.X0);
  17. }
  18. [TestCase(0x3A020020u, 2u, 3u, false, false, false, false, 5u)]
  19. [TestCase(0x3A020020u, 2u, 3u, true, false, false, false, 6u)]
  20. [TestCase(0xBA020020u, 2u, 3u, false, false, false, false, 5u)]
  21. [TestCase(0xBA020020u, 2u, 3u, true, false, false, false, 6u)]
  22. [TestCase(0x3A020020u, 0xFFFFFFFEu, 0x1u, true, false, true, true, 0x0u)]
  23. [TestCase(0x3A020020u, 0xFFFFFFFFu, 0xFFFFFFFFu, true, true, false, true, 0xFFFFFFFFu)]
  24. public void Adcs(uint Opcode, uint A, uint B, bool CarryState, bool Negative, bool Zero, bool Carry, uint Result)
  25. {
  26. //ADCS (X0/W0), (X1, W1), (X2/W2)
  27. AThreadState ThreadState = SingleOpcode(Opcode, X1: A, X2: B, Carry: CarryState);
  28. Assert.Multiple(() =>
  29. {
  30. Assert.IsFalse(ThreadState.Overflow);
  31. Assert.AreEqual(Negative, ThreadState.Negative);
  32. Assert.AreEqual(Zero, ThreadState.Zero);
  33. Assert.AreEqual(Carry, ThreadState.Carry);
  34. Assert.AreEqual(Result, ThreadState.X0);
  35. });
  36. }
  37. [Test]
  38. public void Add()
  39. {
  40. // ADD X0, X1, X2
  41. AThreadState ThreadState = SingleOpcode(0x8B020020, X1: 1, X2: 2);
  42. Assert.AreEqual(3, ThreadState.X0);
  43. }
  44. [TestCase(2u, false, false)]
  45. [TestCase(5u, false, false)]
  46. [TestCase(7u, false, false)]
  47. [TestCase(0xFFFFFFFFu, false, true )]
  48. [TestCase(0xFFFFFFFBu, true, true )]
  49. public void Adds(uint A, bool Zero, bool Carry)
  50. {
  51. //ADDS WZR, WSP, #5
  52. AThreadState ThreadState = SingleOpcode(0x310017FF, X31: A);
  53. Assert.Multiple(() =>
  54. {
  55. Assert.IsFalse(ThreadState.Negative);
  56. Assert.IsFalse(ThreadState.Overflow);
  57. Assert.AreEqual(Zero, ThreadState.Zero);
  58. Assert.AreEqual(Carry, ThreadState.Carry);
  59. Assert.AreEqual(A, ThreadState.X31);
  60. });
  61. }
  62. [TestCase(0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFul, true, false)]
  63. [TestCase(0xFFFFFFFFu, 0x00000000u, 0x00000000ul, false, true)]
  64. [TestCase(0x12345678u, 0x7324A993u, 0x12240010ul, false, false)]
  65. public void Ands(uint A, uint B, ulong Result, bool Negative, bool Zero)
  66. {
  67. // ANDS W0, W1, W2
  68. uint Opcode = 0x6A020020;
  69. AThreadState ThreadState = SingleOpcode(Opcode, X1: A, X2: B);
  70. Assert.Multiple(() =>
  71. {
  72. Assert.AreEqual(Result, ThreadState.X0);
  73. Assert.AreEqual(Negative, ThreadState.Negative);
  74. Assert.AreEqual(Zero, ThreadState.Zero);
  75. });
  76. }
  77. [TestCase(0x0000FF44u, 0x00000004u, 0x00000FF4u)]
  78. [TestCase(0x00000000u, 0x00000004u, 0x00000000u)]
  79. [TestCase(0x0000FF44u, 0x00000008u, 0x000000FFu)]
  80. [TestCase(0xFFFFFFFFu, 0x00000004u, 0xFFFFFFFFu)]
  81. [TestCase(0xFFFFFFFFu, 0x00000008u, 0xFFFFFFFFu)]
  82. [TestCase(0xFFFFFFFFu, 0x00000020u, 0xFFFFFFFFu)]
  83. [TestCase(0x0FFFFFFFu, 0x0000001Cu, 0x00000000u)]
  84. [TestCase(0x80000000u, 0x0000001Fu, 0xFFFFFFFFu)]
  85. [TestCase(0xCAFE0000u, 0x00000020u, 0xCAFE0000u)]
  86. public void Asrv32(uint A, uint ShiftValue, uint Result)
  87. {
  88. // ASRV W0, W1, W2
  89. AThreadState ThreadState = SingleOpcode(0x1AC22820, X1: A, X2: ShiftValue);
  90. Assert.AreEqual(Result, ThreadState.X0);
  91. }
  92. [TestCase(0x000000000000FF44ul, 0x00000004u, 0x0000000000000FF4ul)]
  93. [TestCase(0x0000000000000000ul, 0x00000004u, 0x0000000000000000ul)]
  94. [TestCase(0x000000000000FF44ul, 0x00000008u, 0x00000000000000FFul)]
  95. [TestCase(0x00000000FFFFFFFFul, 0x00000004u, 0x000000000FFFFFFFul)]
  96. [TestCase(0x00000000FFFFFFFFul, 0x00000008u, 0x0000000000FFFFFFul)]
  97. [TestCase(0x00000000FFFFFFFFul, 0x00000020u, 0x0000000000000000ul)]
  98. [TestCase(0x000000000FFFFFFFul, 0x0000001Cu, 0x0000000000000000ul)]
  99. [TestCase(0x000CC4488FFFFFFFul, 0x0000001Cu, 0x0000000000CC4488ul)]
  100. [TestCase(0xFFFFFFFFFFFFFFFFul, 0x0000001Cu, 0xFFFFFFFFFFFFFFFFul)]
  101. [TestCase(0x8000000000000000ul, 0x0000003Fu, 0xFFFFFFFFFFFFFFFFul)]
  102. [TestCase(0xCAFE000000000000ul, 0x00000040u, 0xCAFE000000000000ul)]
  103. public void Asrv64(ulong A, uint ShiftValue, ulong Result)
  104. {
  105. // ASRV X0, X1, X2
  106. AThreadState ThreadState = SingleOpcode(0x9AC22820, X1: A, X2: ShiftValue);
  107. Assert.AreEqual(Result, ThreadState.X0);
  108. }
  109. [TestCase(0x01010101u, 0x3200C3E2u)]
  110. [TestCase(0x00F000F0u, 0x320C8FE2u)]
  111. [TestCase(0x00000001u, 0x320003E2u)]
  112. public void OrrBitmasks(uint Bitmask, uint Opcode)
  113. {
  114. // ORR W2, WZR, #Bitmask
  115. Assert.AreEqual(Bitmask, SingleOpcode(Opcode).X2);
  116. }
  117. [Test]
  118. public void RevX0X0()
  119. {
  120. // REV X0, X0
  121. AThreadState ThreadState = SingleOpcode(0xDAC00C00, X0: 0xAABBCCDDEEFF1100);
  122. Assert.AreEqual(0x0011FFEEDDCCBBAA, ThreadState.X0);
  123. }
  124. [Test]
  125. public void RevW1W1()
  126. {
  127. // REV W1, W1
  128. AThreadState ThreadState = SingleOpcode(0x5AC00821, X1: 0x12345678);
  129. Assert.AreEqual(0x78563412, ThreadState.X1);
  130. }
  131. [TestCase(0x7A020020u, 4u, 2u, false, false, false, true, 1u)]
  132. [TestCase(0x7A020020u, 4u, 2u, true, false, false, true, 2u)]
  133. [TestCase(0xFA020020u, 4u, 2u, false, false, false, true, 1u)]
  134. [TestCase(0xFA020020u, 4u, 2u, true, false, false, true, 2u)]
  135. [TestCase(0x7A020020u, 4u, 4u, false, true, false, false, 0xFFFFFFFFu)]
  136. [TestCase(0x7A020020u, 4u, 4u, true, false, true, true, 0x0u)]
  137. public void Sbcs(uint Opcode, uint A, uint B, bool CarryState, bool Negative, bool Zero, bool Carry, uint Result)
  138. {
  139. //SBCS (X0/W0), (X1, W1), (X2/W2)
  140. AThreadState ThreadState = SingleOpcode(Opcode, X1: A, X2: B, Carry: CarryState);
  141. Assert.Multiple(() =>
  142. {
  143. Assert.IsFalse(ThreadState.Overflow);
  144. Assert.AreEqual(Negative, ThreadState.Negative);
  145. Assert.AreEqual(Zero, ThreadState.Zero);
  146. Assert.AreEqual(Carry, ThreadState.Carry);
  147. Assert.AreEqual(Result, ThreadState.X0);
  148. });
  149. }
  150. }
  151. }