CpuTestCsel.cs 11 KB

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