CpuTestCsel.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. #define Csel
  2. using NUnit.Framework;
  3. namespace Ryujinx.Tests.Cpu
  4. {
  5. [Category("Csel")]
  6. public sealed class CpuTestCsel : CpuTest
  7. {
  8. #if Csel
  9. private const int RndCnt = 2;
  10. [Test, Pairwise, Description("CSEL <Xd>, <Xn>, <Xm>, <cond>")]
  11. public void Csel_64bit([Values(0u, 31u)] uint rd,
  12. [Values(1u, 31u)] uint rn,
  13. [Values(2u, 31u)] uint rm,
  14. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  15. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xn,
  16. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  17. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xm,
  18. [Values(0b0000u, 0b0001u, 0b0010u, 0b0011u, // <EQ, NE, CS/HS, CC/LO,
  19. 0b0100u, 0b0101u, 0b0110u, 0b0111u, // MI, PL, VS, VC,
  20. 0b1000u, 0b1001u, 0b1010u, 0b1011u, // HI, LS, GE, LT,
  21. 0b1100u, 0b1101u, 0b1110u, 0b1111u)] uint cond) // GT, LE, AL, NV>
  22. {
  23. uint opcode = 0x9A800000; // CSEL X0, X0, X0, EQ
  24. opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
  25. opcode |= ((cond & 15) << 12);
  26. ulong x31 = TestContext.CurrentContext.Random.NextULong();
  27. SingleOpcode(opcode, x1: xn, x2: xm, x31: x31);
  28. CompareAgainstUnicorn();
  29. }
  30. [Test, Pairwise, Description("CSEL <Wd>, <Wn>, <Wm>, <cond>")]
  31. public void Csel_32bit([Values(0u, 31u)] uint rd,
  32. [Values(1u, 31u)] uint rn,
  33. [Values(2u, 31u)] uint rm,
  34. [Values(0x00000000u, 0x7FFFFFFFu,
  35. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn,
  36. [Values(0x00000000u, 0x7FFFFFFFu,
  37. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wm,
  38. [Values(0b0000u, 0b0001u, 0b0010u, 0b0011u, // <EQ, NE, CS/HS, CC/LO,
  39. 0b0100u, 0b0101u, 0b0110u, 0b0111u, // MI, PL, VS, VC,
  40. 0b1000u, 0b1001u, 0b1010u, 0b1011u, // HI, LS, GE, LT,
  41. 0b1100u, 0b1101u, 0b1110u, 0b1111u)] uint cond) // GT, LE, AL, NV>
  42. {
  43. uint opcode = 0x1A800000; // CSEL W0, W0, W0, EQ
  44. opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
  45. opcode |= ((cond & 15) << 12);
  46. uint w31 = TestContext.CurrentContext.Random.NextUInt();
  47. SingleOpcode(opcode, x1: wn, x2: wm, x31: w31);
  48. CompareAgainstUnicorn();
  49. }
  50. [Test, Pairwise, Description("CSINC <Xd>, <Xn>, <Xm>, <cond>")]
  51. public void Csinc_64bit([Values(0u, 31u)] uint rd,
  52. [Values(1u, 31u)] uint rn,
  53. [Values(2u, 31u)] uint rm,
  54. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  55. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xn,
  56. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  57. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xm,
  58. [Values(0b0000u, 0b0001u, 0b0010u, 0b0011u, // <EQ, NE, CS/HS, CC/LO,
  59. 0b0100u, 0b0101u, 0b0110u, 0b0111u, // MI, PL, VS, VC,
  60. 0b1000u, 0b1001u, 0b1010u, 0b1011u, // HI, LS, GE, LT,
  61. 0b1100u, 0b1101u, 0b1110u, 0b1111u)] uint cond) // GT, LE, AL, NV>
  62. {
  63. uint opcode = 0x9A800400; // CSINC X0, X0, X0, EQ
  64. opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
  65. opcode |= ((cond & 15) << 12);
  66. ulong x31 = TestContext.CurrentContext.Random.NextULong();
  67. SingleOpcode(opcode, x1: xn, x2: xm, x31: x31);
  68. CompareAgainstUnicorn();
  69. }
  70. [Test, Pairwise, Description("CSINC <Wd>, <Wn>, <Wm>, <cond>")]
  71. public void Csinc_32bit([Values(0u, 31u)] uint rd,
  72. [Values(1u, 31u)] uint rn,
  73. [Values(2u, 31u)] uint rm,
  74. [Values(0x00000000u, 0x7FFFFFFFu,
  75. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn,
  76. [Values(0x00000000u, 0x7FFFFFFFu,
  77. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wm,
  78. [Values(0b0000u, 0b0001u, 0b0010u, 0b0011u, // <EQ, NE, CS/HS, CC/LO,
  79. 0b0100u, 0b0101u, 0b0110u, 0b0111u, // MI, PL, VS, VC,
  80. 0b1000u, 0b1001u, 0b1010u, 0b1011u, // HI, LS, GE, LT,
  81. 0b1100u, 0b1101u, 0b1110u, 0b1111u)] uint cond) // GT, LE, AL, NV>
  82. {
  83. uint opcode = 0x1A800400; // CSINC W0, W0, W0, EQ
  84. opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
  85. opcode |= ((cond & 15) << 12);
  86. uint w31 = TestContext.CurrentContext.Random.NextUInt();
  87. SingleOpcode(opcode, x1: wn, x2: wm, x31: w31);
  88. CompareAgainstUnicorn();
  89. }
  90. [Test, Pairwise, Description("CSINV <Xd>, <Xn>, <Xm>, <cond>")]
  91. public void Csinv_64bit([Values(0u, 31u)] uint rd,
  92. [Values(1u, 31u)] uint rn,
  93. [Values(2u, 31u)] uint rm,
  94. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  95. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xn,
  96. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  97. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xm,
  98. [Values(0b0000u, 0b0001u, 0b0010u, 0b0011u, // <EQ, NE, CS/HS, CC/LO,
  99. 0b0100u, 0b0101u, 0b0110u, 0b0111u, // MI, PL, VS, VC,
  100. 0b1000u, 0b1001u, 0b1010u, 0b1011u, // HI, LS, GE, LT,
  101. 0b1100u, 0b1101u, 0b1110u, 0b1111u)] uint cond) // GT, LE, AL, NV>
  102. {
  103. uint opcode = 0xDA800000; // CSINV X0, X0, X0, EQ
  104. opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
  105. opcode |= ((cond & 15) << 12);
  106. ulong x31 = TestContext.CurrentContext.Random.NextULong();
  107. SingleOpcode(opcode, x1: xn, x2: xm, x31: x31);
  108. CompareAgainstUnicorn();
  109. }
  110. [Test, Pairwise, Description("CSINV <Wd>, <Wn>, <Wm>, <cond>")]
  111. public void Csinv_32bit([Values(0u, 31u)] uint rd,
  112. [Values(1u, 31u)] uint rn,
  113. [Values(2u, 31u)] uint rm,
  114. [Values(0x00000000u, 0x7FFFFFFFu,
  115. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn,
  116. [Values(0x00000000u, 0x7FFFFFFFu,
  117. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wm,
  118. [Values(0b0000u, 0b0001u, 0b0010u, 0b0011u, // <EQ, NE, CS/HS, CC/LO,
  119. 0b0100u, 0b0101u, 0b0110u, 0b0111u, // MI, PL, VS, VC,
  120. 0b1000u, 0b1001u, 0b1010u, 0b1011u, // HI, LS, GE, LT,
  121. 0b1100u, 0b1101u, 0b1110u, 0b1111u)] uint cond) // GT, LE, AL, NV>
  122. {
  123. uint opcode = 0x5A800000; // CSINV W0, W0, W0, EQ
  124. opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
  125. opcode |= ((cond & 15) << 12);
  126. uint w31 = TestContext.CurrentContext.Random.NextUInt();
  127. SingleOpcode(opcode, x1: wn, x2: wm, x31: w31);
  128. CompareAgainstUnicorn();
  129. }
  130. [Test, Pairwise, Description("CSNEG <Xd>, <Xn>, <Xm>, <cond>")]
  131. public void Csneg_64bit([Values(0u, 31u)] uint rd,
  132. [Values(1u, 31u)] uint rn,
  133. [Values(2u, 31u)] uint rm,
  134. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  135. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xn,
  136. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  137. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong xm,
  138. [Values(0b0000u, 0b0001u, 0b0010u, 0b0011u, // <EQ, NE, CS/HS, CC/LO,
  139. 0b0100u, 0b0101u, 0b0110u, 0b0111u, // MI, PL, VS, VC,
  140. 0b1000u, 0b1001u, 0b1010u, 0b1011u, // HI, LS, GE, LT,
  141. 0b1100u, 0b1101u, 0b1110u, 0b1111u)] uint cond) // GT, LE, AL, NV>
  142. {
  143. uint opcode = 0xDA800400; // CSNEG X0, X0, X0, EQ
  144. opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
  145. opcode |= ((cond & 15) << 12);
  146. ulong x31 = TestContext.CurrentContext.Random.NextULong();
  147. SingleOpcode(opcode, x1: xn, x2: xm, x31: x31);
  148. CompareAgainstUnicorn();
  149. }
  150. [Test, Pairwise, Description("CSNEG <Wd>, <Wn>, <Wm>, <cond>")]
  151. public void Csneg_32bit([Values(0u, 31u)] uint rd,
  152. [Values(1u, 31u)] uint rn,
  153. [Values(2u, 31u)] uint rm,
  154. [Values(0x00000000u, 0x7FFFFFFFu,
  155. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn,
  156. [Values(0x00000000u, 0x7FFFFFFFu,
  157. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wm,
  158. [Values(0b0000u, 0b0001u, 0b0010u, 0b0011u, // <EQ, NE, CS/HS, CC/LO,
  159. 0b0100u, 0b0101u, 0b0110u, 0b0111u, // MI, PL, VS, VC,
  160. 0b1000u, 0b1001u, 0b1010u, 0b1011u, // HI, LS, GE, LT,
  161. 0b1100u, 0b1101u, 0b1110u, 0b1111u)] uint cond) // GT, LE, AL, NV>
  162. {
  163. uint opcode = 0x5A800400; // CSNEG W0, W0, W0, EQ
  164. opcode |= ((rm & 31) << 16) | ((rn & 31) << 5) | ((rd & 31) << 0);
  165. opcode |= ((cond & 15) << 12);
  166. uint w31 = TestContext.CurrentContext.Random.NextUInt();
  167. SingleOpcode(opcode, x1: wn, x2: wm, x31: w31);
  168. CompareAgainstUnicorn();
  169. }
  170. #endif
  171. }
  172. }