CpuTestMul.cs 11 KB

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