CpuTestAluBinary.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. #define AluBinary
  2. using NUnit.Framework;
  3. namespace Ryujinx.Tests.Cpu
  4. {
  5. [Category("AluBinary")]
  6. public sealed class CpuTestAluBinary : CpuTest
  7. {
  8. #if AluBinary
  9. private const int RndCnt = 2;
  10. [Test, Pairwise, Description("CRC32X <Wd>, <Wn>, <Xm>"), Ignore("Unicorn fails.")]
  11. public void Crc32x([Values(0u, 31u)] uint rd,
  12. [Values(1u, 31u)] uint rn,
  13. [Values(2u, 31u)] uint rm,
  14. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn,
  15. [Values((ulong)0x00_00_00_00_00_00_00_00,
  16. (ulong)0x7F_FF_FF_FF_FF_FF_FF_FF,
  17. (ulong)0x80_00_00_00_00_00_00_00,
  18. (ulong)0xFF_FF_FF_FF_FF_FF_FF_FF)] [Random(RndCnt)] ulong xm)
  19. {
  20. uint opcode = 0x9AC04C00; // CRC32X W0, W0, X0
  21. opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
  22. uint w31 = TestContext.CurrentContext.Random.NextUInt();
  23. SingleOpcode(opcode, x1: wn, x2: xm, x31: w31);
  24. CompareAgainstUnicorn();
  25. }
  26. [Test, Pairwise, Description("CRC32W <Wd>, <Wn>, <Wm>"), Ignore("Unicorn fails.")]
  27. public void Crc32w([Values(0u, 31u)] uint rd,
  28. [Values(1u, 31u)] uint rn,
  29. [Values(2u, 31u)] uint rm,
  30. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn,
  31. [Values((uint)0x00_00_00_00, (uint)0x7F_FF_FF_FF,
  32. (uint)0x80_00_00_00, (uint)0xFF_FF_FF_FF)] [Random(RndCnt)] uint wm)
  33. {
  34. uint opcode = 0x1AC04800; // CRC32W W0, W0, W0
  35. opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
  36. uint w31 = TestContext.CurrentContext.Random.NextUInt();
  37. SingleOpcode(opcode, x1: wn, x2: wm, x31: w31);
  38. CompareAgainstUnicorn();
  39. }
  40. [Test, Pairwise, Description("CRC32H <Wd>, <Wn>, <Wm>"), Ignore("Unicorn fails.")]
  41. public void Crc32h([Values(0u, 31u)] uint rd,
  42. [Values(1u, 31u)] uint rn,
  43. [Values(2u, 31u)] uint rm,
  44. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn,
  45. [Values((ushort)0x00_00, (ushort)0x7F_FF,
  46. (ushort)0x80_00, (ushort)0xFF_FF)] [Random(RndCnt)] ushort wm)
  47. {
  48. uint opcode = 0x1AC04400; // CRC32H W0, W0, W0
  49. opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
  50. uint w31 = TestContext.CurrentContext.Random.NextUInt();
  51. SingleOpcode(opcode, x1: wn, x2: wm, x31: w31);
  52. CompareAgainstUnicorn();
  53. }
  54. [Test, Pairwise, Description("CRC32B <Wd>, <Wn>, <Wm>"), Ignore("Unicorn fails.")]
  55. public void Crc32b([Values(0u, 31u)] uint rd,
  56. [Values(1u, 31u)] uint rn,
  57. [Values(2u, 31u)] uint rm,
  58. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn,
  59. [Values((byte)0x00, (byte)0x7F,
  60. (byte)0x80, (byte)0xFF)] [Random(RndCnt)] byte wm)
  61. {
  62. uint opcode = 0x1AC04000; // CRC32B W0, W0, W0
  63. opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
  64. uint w31 = TestContext.CurrentContext.Random.NextUInt();
  65. SingleOpcode(opcode, x1: wn, x2: wm, x31: w31);
  66. CompareAgainstUnicorn();
  67. }
  68. [Test, Pairwise, Description("CRC32CX <Wd>, <Wn>, <Xm>")]
  69. public void Crc32cx([Values(0u, 31u)] uint rd,
  70. [Values(1u, 31u)] uint rn,
  71. [Values(2u, 31u)] uint rm,
  72. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn,
  73. [Values((ulong)0x00_00_00_00_00_00_00_00,
  74. (ulong)0x7F_FF_FF_FF_FF_FF_FF_FF,
  75. (ulong)0x80_00_00_00_00_00_00_00,
  76. (ulong)0xFF_FF_FF_FF_FF_FF_FF_FF)] [Random(RndCnt)] ulong xm)
  77. {
  78. uint opcode = 0x9AC05C00; // CRC32CX W0, W0, X0
  79. opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
  80. uint w31 = TestContext.CurrentContext.Random.NextUInt();
  81. SingleOpcode(opcode, x1: wn, x2: xm, x31: w31);
  82. CompareAgainstUnicorn();
  83. }
  84. [Test, Pairwise, Description("CRC32CW <Wd>, <Wn>, <Wm>")]
  85. public void Crc32cw([Values(0u, 31u)] uint rd,
  86. [Values(1u, 31u)] uint rn,
  87. [Values(2u, 31u)] uint rm,
  88. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn,
  89. [Values((uint)0x00_00_00_00, (uint)0x7F_FF_FF_FF,
  90. (uint)0x80_00_00_00, (uint)0xFF_FF_FF_FF)] [Random(RndCnt)] uint wm)
  91. {
  92. uint opcode = 0x1AC05800; // CRC32CW W0, W0, W0
  93. opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
  94. uint w31 = TestContext.CurrentContext.Random.NextUInt();
  95. SingleOpcode(opcode, x1: wn, x2: wm, x31: w31);
  96. CompareAgainstUnicorn();
  97. }
  98. [Test, Pairwise, Description("CRC32CH <Wd>, <Wn>, <Wm>")]
  99. public void Crc32ch([Values(0u, 31u)] uint rd,
  100. [Values(1u, 31u)] uint rn,
  101. [Values(2u, 31u)] uint rm,
  102. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn,
  103. [Values((ushort)0x00_00, (ushort)0x7F_FF,
  104. (ushort)0x80_00, (ushort)0xFF_FF)] [Random(RndCnt)] ushort wm)
  105. {
  106. uint opcode = 0x1AC05400; // CRC32CH W0, W0, W0
  107. opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
  108. uint w31 = TestContext.CurrentContext.Random.NextUInt();
  109. SingleOpcode(opcode, x1: wn, x2: wm, x31: w31);
  110. CompareAgainstUnicorn();
  111. }
  112. [Test, Pairwise, Description("CRC32CB <Wd>, <Wn>, <Wm>")]
  113. public void Crc32cb([Values(0u, 31u)] uint rd,
  114. [Values(1u, 31u)] uint rn,
  115. [Values(2u, 31u)] uint rm,
  116. [Values(0x00000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn,
  117. [Values((byte)0x00, (byte)0x7F,
  118. (byte)0x80, (byte)0xFF)] [Random(RndCnt)] byte wm)
  119. {
  120. uint opcode = 0x1AC05000; // CRC32CB W0, W0, W0
  121. opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
  122. uint w31 = TestContext.CurrentContext.Random.NextUInt();
  123. SingleOpcode(opcode, x1: wn, x2: wm, x31: w31);
  124. CompareAgainstUnicorn();
  125. }
  126. [Test, Pairwise, Description("SDIV <Xd>, <Xn>, <Xm>")]
  127. public void Sdiv_64bit([Values(0u, 31u)] uint rd,
  128. [Values(1u, 31u)] uint rn,
  129. [Values(2u, 31u)] uint rm,
  130. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  131. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xn,
  132. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  133. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xm)
  134. {
  135. uint opcode = 0x9AC00C00; // SDIV X0, X0, X0
  136. opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
  137. ulong x31 = TestContext.CurrentContext.Random.NextULong();
  138. SingleOpcode(opcode, x1: xn, x2: xm, x31: x31);
  139. CompareAgainstUnicorn();
  140. }
  141. [Test, Pairwise, Description("SDIV <Wd>, <Wn>, <Wm>")]
  142. public void Sdiv_32bit([Values(0u, 31u)] uint rd,
  143. [Values(1u, 31u)] uint rn,
  144. [Values(2u, 31u)] uint rm,
  145. [Values(0x00000000u, 0x7FFFFFFFu,
  146. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn,
  147. [Values(0x00000000u, 0x7FFFFFFFu,
  148. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wm)
  149. {
  150. uint opcode = 0x1AC00C00; // SDIV W0, W0, W0
  151. opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
  152. uint w31 = TestContext.CurrentContext.Random.NextUInt();
  153. SingleOpcode(opcode, x1: wn, x2: wm, x31: w31);
  154. CompareAgainstUnicorn();
  155. }
  156. [Test, Pairwise, Description("UDIV <Xd>, <Xn>, <Xm>")]
  157. public void Udiv_64bit([Values(0u, 31u)] uint rd,
  158. [Values(1u, 31u)] uint rn,
  159. [Values(2u, 31u)] uint rm,
  160. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  161. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xn,
  162. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  163. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xm)
  164. {
  165. uint opcode = 0x9AC00800; // UDIV X0, X0, X0
  166. opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
  167. ulong x31 = TestContext.CurrentContext.Random.NextULong();
  168. SingleOpcode(opcode, x1: xn, x2: xm, x31: x31);
  169. CompareAgainstUnicorn();
  170. }
  171. [Test, Pairwise, Description("UDIV <Wd>, <Wn>, <Wm>")]
  172. public void Udiv_32bit([Values(0u, 31u)] uint rd,
  173. [Values(1u, 31u)] uint rn,
  174. [Values(2u, 31u)] uint rm,
  175. [Values(0x00000000u, 0x7FFFFFFFu,
  176. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn,
  177. [Values(0x00000000u, 0x7FFFFFFFu,
  178. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wm)
  179. {
  180. uint opcode = 0x1AC00800; // UDIV W0, W0, W0
  181. opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
  182. uint w31 = TestContext.CurrentContext.Random.NextUInt();
  183. SingleOpcode(opcode, x1: wn, x2: wm, x31: w31);
  184. CompareAgainstUnicorn();
  185. }
  186. #endif
  187. }
  188. }