CpuTestMul.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. #define Mul
  2. using NUnit.Framework;
  3. namespace Ryujinx.Tests.Cpu
  4. {
  5. [Category("Mul")]
  6. public sealed class CpuTestMul : CpuTest
  7. {
  8. #if Mul
  9. private const int RndCnt = 2;
  10. [Test, Pairwise, Description("MADD <Xd>, <Xn>, <Xm>, <Xa>")]
  11. public void Madd_64bit([Values(0u, 31u)] uint rd,
  12. [Values(1u, 31u)] uint rn,
  13. [Values(2u, 31u)] uint rm,
  14. [Values(3u, 31u)] uint ra,
  15. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  16. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xn,
  17. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  18. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xm,
  19. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  20. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xa)
  21. {
  22. uint opcode = 0x9B000000; // MADD X0, X0, X0, X0
  23. opcode |= ((rm & 31) << 16) | ((ra & 31) << 10) | ((rn & 31) << 5) | ((rd & 31) << 0);
  24. ulong x31 = TestContext.CurrentContext.Random.NextULong();
  25. SingleOpcode(opcode, x1: xn, x2: xm, x3: xa, x31: x31);
  26. CompareAgainstUnicorn();
  27. }
  28. [Test, Pairwise, Description("MADD <Wd>, <Wn>, <Wm>, <Wa>")]
  29. public void Madd_32bit([Values(0u, 31u)] uint rd,
  30. [Values(1u, 31u)] uint rn,
  31. [Values(2u, 31u)] uint rm,
  32. [Values(3u, 31u)] uint ra,
  33. [Values(0x00000000u, 0x7FFFFFFFu,
  34. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn,
  35. [Values(0x00000000u, 0x7FFFFFFFu,
  36. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wm,
  37. [Values(0x00000000u, 0x7FFFFFFFu,
  38. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wa)
  39. {
  40. uint opcode = 0x1B000000; // MADD W0, W0, W0, W0
  41. opcode |= ((rm & 31) << 16) | ((ra & 31) << 10) | ((rn & 31) << 5) | ((rd & 31) << 0);
  42. uint w31 = TestContext.CurrentContext.Random.NextUInt();
  43. SingleOpcode(opcode, x1: wn, x2: wm, x3: wa, x31: w31);
  44. CompareAgainstUnicorn();
  45. }
  46. [Test, Pairwise, Description("MSUB <Xd>, <Xn>, <Xm>, <Xa>")]
  47. public void Msub_64bit([Values(0u, 31u)] uint rd,
  48. [Values(1u, 31u)] uint rn,
  49. [Values(2u, 31u)] uint rm,
  50. [Values(3u, 31u)] uint ra,
  51. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  52. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xn,
  53. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  54. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xm,
  55. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  56. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xa)
  57. {
  58. uint opcode = 0x9B008000; // MSUB X0, X0, X0, X0
  59. opcode |= ((rm & 31) << 16) | ((ra & 31) << 10) | ((rn & 31) << 5) | ((rd & 31) << 0);
  60. ulong x31 = TestContext.CurrentContext.Random.NextULong();
  61. SingleOpcode(opcode, x1: xn, x2: xm, x3: xa, x31: x31);
  62. CompareAgainstUnicorn();
  63. }
  64. [Test, Pairwise, Description("MSUB <Wd>, <Wn>, <Wm>, <Wa>")]
  65. public void Msub_32bit([Values(0u, 31u)] uint rd,
  66. [Values(1u, 31u)] uint rn,
  67. [Values(2u, 31u)] uint rm,
  68. [Values(3u, 31u)] uint ra,
  69. [Values(0x00000000u, 0x7FFFFFFFu,
  70. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn,
  71. [Values(0x00000000u, 0x7FFFFFFFu,
  72. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wm,
  73. [Values(0x00000000u, 0x7FFFFFFFu,
  74. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wa)
  75. {
  76. uint opcode = 0x1B008000; // MSUB W0, W0, W0, W0
  77. opcode |= ((rm & 31) << 16) | ((ra & 31) << 10) | ((rn & 31) << 5) | ((rd & 31) << 0);
  78. uint w31 = TestContext.CurrentContext.Random.NextUInt();
  79. SingleOpcode(opcode, x1: wn, x2: wm, x3: wa, x31: w31);
  80. CompareAgainstUnicorn();
  81. }
  82. [Test, Pairwise, Description("SMADDL <Xd>, <Wn>, <Wm>, <Xa>")]
  83. public void Smaddl_64bit([Values(0u, 31u)] uint rd,
  84. [Values(1u, 31u)] uint rn,
  85. [Values(2u, 31u)] uint rm,
  86. [Values(3u, 31u)] uint ra,
  87. [Values(0x00000000u, 0x7FFFFFFFu,
  88. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn,
  89. [Values(0x00000000u, 0x7FFFFFFFu,
  90. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wm,
  91. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  92. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xa)
  93. {
  94. uint opcode = 0x9B200000; // SMADDL X0, W0, W0, X0
  95. opcode |= ((rm & 31) << 16) | ((ra & 31) << 10) | ((rn & 31) << 5) | ((rd & 31) << 0);
  96. ulong x31 = TestContext.CurrentContext.Random.NextULong();
  97. SingleOpcode(opcode, x1: wn, x2: wm, x3: xa, x31: x31);
  98. CompareAgainstUnicorn();
  99. }
  100. [Test, Pairwise, Description("UMADDL <Xd>, <Wn>, <Wm>, <Xa>")]
  101. public void Umaddl_64bit([Values(0u, 31u)] uint rd,
  102. [Values(1u, 31u)] uint rn,
  103. [Values(2u, 31u)] uint rm,
  104. [Values(3u, 31u)] uint ra,
  105. [Values(0x00000000u, 0x7FFFFFFFu,
  106. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn,
  107. [Values(0x00000000u, 0x7FFFFFFFu,
  108. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wm,
  109. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  110. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xa)
  111. {
  112. uint opcode = 0x9BA00000; // UMADDL X0, W0, W0, X0
  113. opcode |= ((rm & 31) << 16) | ((ra & 31) << 10) | ((rn & 31) << 5) | ((rd & 31) << 0);
  114. ulong x31 = TestContext.CurrentContext.Random.NextULong();
  115. SingleOpcode(opcode, x1: wn, x2: wm, x3: xa, x31: x31);
  116. CompareAgainstUnicorn();
  117. }
  118. [Test, Pairwise, Description("SMSUBL <Xd>, <Wn>, <Wm>, <Xa>")]
  119. public void Smsubl_64bit([Values(0u, 31u)] uint rd,
  120. [Values(1u, 31u)] uint rn,
  121. [Values(2u, 31u)] uint rm,
  122. [Values(3u, 31u)] uint ra,
  123. [Values(0x00000000u, 0x7FFFFFFFu,
  124. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn,
  125. [Values(0x00000000u, 0x7FFFFFFFu,
  126. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wm,
  127. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  128. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xa)
  129. {
  130. uint opcode = 0x9B208000; // SMSUBL X0, W0, W0, X0
  131. opcode |= ((rm & 31) << 16) | ((ra & 31) << 10) | ((rn & 31) << 5) | ((rd & 31) << 0);
  132. ulong x31 = TestContext.CurrentContext.Random.NextULong();
  133. SingleOpcode(opcode, x1: wn, x2: wm, x3: xa, x31: x31);
  134. CompareAgainstUnicorn();
  135. }
  136. [Test, Pairwise, Description("UMSUBL <Xd>, <Wn>, <Wm>, <Xa>")]
  137. public void Umsubl_64bit([Values(0u, 31u)] uint rd,
  138. [Values(1u, 31u)] uint rn,
  139. [Values(2u, 31u)] uint rm,
  140. [Values(3u, 31u)] uint ra,
  141. [Values(0x00000000u, 0x7FFFFFFFu,
  142. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn,
  143. [Values(0x00000000u, 0x7FFFFFFFu,
  144. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wm,
  145. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  146. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xa)
  147. {
  148. uint opcode = 0x9BA08000; // UMSUBL X0, W0, W0, X0
  149. opcode |= ((rm & 31) << 16) | ((ra & 31) << 10) | ((rn & 31) << 5) | ((rd & 31) << 0);
  150. ulong x31 = TestContext.CurrentContext.Random.NextULong();
  151. SingleOpcode(opcode, x1: wn, x2: wm, x3: xa, x31: x31);
  152. CompareAgainstUnicorn();
  153. }
  154. [Test, Pairwise, Description("SMULH <Xd>, <Xn>, <Xm>")]
  155. public void Smulh_64bit([Values(0u, 31u)] uint rd,
  156. [Values(1u, 31u)] uint rn,
  157. [Values(2u, 31u)] uint rm,
  158. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  159. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xn,
  160. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  161. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xm)
  162. {
  163. uint opcode = 0x9B407C00; // SMULH X0, X0, X0
  164. opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
  165. ulong x31 = TestContext.CurrentContext.Random.NextULong();
  166. SingleOpcode(opcode, x1: xn, x2: xm, x31: x31);
  167. CompareAgainstUnicorn();
  168. }
  169. [Test, Pairwise, Description("UMULH <Xd>, <Xn>, <Xm>")]
  170. public void Umulh_64bit([Values(0u, 31u)] uint rd,
  171. [Values(1u, 31u)] uint rn,
  172. [Values(2u, 31u)] uint rm,
  173. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  174. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xn,
  175. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  176. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xm)
  177. {
  178. uint opcode = 0x9BC07C00; // UMULH X0, X0, X0
  179. opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
  180. ulong x31 = TestContext.CurrentContext.Random.NextULong();
  181. SingleOpcode(opcode, x1: xn, x2: xm, x31: x31);
  182. CompareAgainstUnicorn();
  183. }
  184. #endif
  185. }
  186. }