CpuTestAlu.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. //#define Alu
  2. using ChocolArm64.State;
  3. using NUnit.Framework;
  4. namespace Ryujinx.Tests.Cpu
  5. {
  6. using Tester;
  7. using Tester.Types;
  8. [Category("Alu"), Ignore("Tested: second half of 2018.")]
  9. public sealed class CpuTestAlu : CpuTest
  10. {
  11. #if Alu
  12. [SetUp]
  13. public void SetupTester()
  14. {
  15. AArch64.TakeReset(false);
  16. }
  17. [Test, Description("CLS <Xd>, <Xn>")]
  18. public void Cls_64bit([Values(0u, 31u)] uint Rd,
  19. [Values(1u, 31u)] uint Rn,
  20. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  21. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(256)] ulong Xn)
  22. {
  23. uint Opcode = 0xDAC01400; // CLS X0, X0
  24. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  25. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  26. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X31: _X31);
  27. if (Rd != 31)
  28. {
  29. Bits Op = new Bits(Opcode);
  30. AArch64.X((int)Rn, new Bits(Xn));
  31. Base.Cls(Op[31], Op[9, 5], Op[4, 0]);
  32. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  33. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  34. }
  35. else
  36. {
  37. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  38. }
  39. CompareAgainstUnicorn();
  40. }
  41. [Test, Description("CLS <Wd>, <Wn>")]
  42. public void Cls_32bit([Values(0u, 31u)] uint Rd,
  43. [Values(1u, 31u)] uint Rn,
  44. [Values(0x00000000u, 0x7FFFFFFFu,
  45. 0x80000000u, 0xFFFFFFFFu)] [Random(256)] uint Wn)
  46. {
  47. uint Opcode = 0x5AC01400; // CLS W0, W0
  48. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  49. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  50. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X31: _W31);
  51. if (Rd != 31)
  52. {
  53. Bits Op = new Bits(Opcode);
  54. AArch64.X((int)Rn, new Bits(Wn));
  55. Base.Cls(Op[31], Op[9, 5], Op[4, 0]);
  56. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  57. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  58. }
  59. else
  60. {
  61. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  62. }
  63. }
  64. [Test, Description("CLZ <Xd>, <Xn>")]
  65. public void Clz_64bit([Values(0u, 31u)] uint Rd,
  66. [Values(1u, 31u)] uint Rn,
  67. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  68. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(256)] ulong Xn)
  69. {
  70. uint Opcode = 0xDAC01000; // CLZ X0, X0
  71. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  72. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  73. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X31: _X31);
  74. if (Rd != 31)
  75. {
  76. Bits Op = new Bits(Opcode);
  77. AArch64.X((int)Rn, new Bits(Xn));
  78. Base.Clz(Op[31], Op[9, 5], Op[4, 0]);
  79. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  80. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  81. }
  82. else
  83. {
  84. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  85. }
  86. CompareAgainstUnicorn();
  87. }
  88. [Test, Description("CLZ <Wd>, <Wn>")]
  89. public void Clz_32bit([Values(0u, 31u)] uint Rd,
  90. [Values(1u, 31u)] uint Rn,
  91. [Values(0x00000000u, 0x7FFFFFFFu,
  92. 0x80000000u, 0xFFFFFFFFu)] [Random(256)] uint Wn)
  93. {
  94. uint Opcode = 0x5AC01000; // CLZ W0, W0
  95. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  96. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  97. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X31: _W31);
  98. if (Rd != 31)
  99. {
  100. Bits Op = new Bits(Opcode);
  101. AArch64.X((int)Rn, new Bits(Wn));
  102. Base.Clz(Op[31], Op[9, 5], Op[4, 0]);
  103. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  104. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  105. }
  106. else
  107. {
  108. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  109. }
  110. CompareAgainstUnicorn();
  111. }
  112. [Test, Description("RBIT <Xd>, <Xn>")]
  113. public void Rbit_64bit([Values(0u, 31u)] uint Rd,
  114. [Values(1u, 31u)] uint Rn,
  115. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  116. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(256)] ulong Xn)
  117. {
  118. uint Opcode = 0xDAC00000; // RBIT X0, X0
  119. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  120. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  121. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X31: _X31);
  122. if (Rd != 31)
  123. {
  124. Bits Op = new Bits(Opcode);
  125. AArch64.X((int)Rn, new Bits(Xn));
  126. Base.Rbit(Op[31], Op[9, 5], Op[4, 0]);
  127. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  128. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  129. }
  130. else
  131. {
  132. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  133. }
  134. CompareAgainstUnicorn();
  135. }
  136. [Test, Description("RBIT <Wd>, <Wn>")]
  137. public void Rbit_32bit([Values(0u, 31u)] uint Rd,
  138. [Values(1u, 31u)] uint Rn,
  139. [Values(0x00000000u, 0x7FFFFFFFu,
  140. 0x80000000u, 0xFFFFFFFFu)] [Random(256)] uint Wn)
  141. {
  142. uint Opcode = 0x5AC00000; // RBIT W0, W0
  143. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  144. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  145. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X31: _W31);
  146. if (Rd != 31)
  147. {
  148. Bits Op = new Bits(Opcode);
  149. AArch64.X((int)Rn, new Bits(Wn));
  150. Base.Rbit(Op[31], Op[9, 5], Op[4, 0]);
  151. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  152. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  153. }
  154. else
  155. {
  156. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  157. }
  158. CompareAgainstUnicorn();
  159. }
  160. [Test, Description("REV16 <Xd>, <Xn>")]
  161. public void Rev16_64bit([Values(0u, 31u)] uint Rd,
  162. [Values(1u, 31u)] uint Rn,
  163. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  164. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(256)] ulong Xn)
  165. {
  166. uint Opcode = 0xDAC00400; // REV16 X0, X0
  167. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  168. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  169. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X31: _X31);
  170. if (Rd != 31)
  171. {
  172. Bits Op = new Bits(Opcode);
  173. AArch64.X((int)Rn, new Bits(Xn));
  174. Base.Rev16(Op[31], Op[9, 5], Op[4, 0]);
  175. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  176. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  177. }
  178. else
  179. {
  180. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  181. }
  182. CompareAgainstUnicorn();
  183. }
  184. [Test, Description("REV16 <Wd>, <Wn>")]
  185. public void Rev16_32bit([Values(0u, 31u)] uint Rd,
  186. [Values(1u, 31u)] uint Rn,
  187. [Values(0x00000000u, 0x7FFFFFFFu,
  188. 0x80000000u, 0xFFFFFFFFu)] [Random(256)] uint Wn)
  189. {
  190. uint Opcode = 0x5AC00400; // REV16 W0, W0
  191. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  192. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  193. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X31: _W31);
  194. if (Rd != 31)
  195. {
  196. Bits Op = new Bits(Opcode);
  197. AArch64.X((int)Rn, new Bits(Wn));
  198. Base.Rev16(Op[31], Op[9, 5], Op[4, 0]);
  199. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  200. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  201. }
  202. else
  203. {
  204. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  205. }
  206. CompareAgainstUnicorn();
  207. }
  208. [Test, Description("REV32 <Xd>, <Xn>")]
  209. public void Rev32_64bit([Values(0u, 31u)] uint Rd,
  210. [Values(1u, 31u)] uint Rn,
  211. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  212. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(256)] ulong Xn)
  213. {
  214. uint Opcode = 0xDAC00800; // REV32 X0, X0
  215. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  216. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  217. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X31: _X31);
  218. if (Rd != 31)
  219. {
  220. Bits Op = new Bits(Opcode);
  221. AArch64.X((int)Rn, new Bits(Xn));
  222. Base.Rev32(Op[31], Op[9, 5], Op[4, 0]);
  223. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  224. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  225. }
  226. else
  227. {
  228. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  229. }
  230. CompareAgainstUnicorn();
  231. }
  232. [Test, Description("REV <Wd>, <Wn>")]
  233. public void Rev32_32bit([Values(0u, 31u)] uint Rd,
  234. [Values(1u, 31u)] uint Rn,
  235. [Values(0x00000000u, 0x7FFFFFFFu,
  236. 0x80000000u, 0xFFFFFFFFu)] [Random(256)] uint Wn)
  237. {
  238. uint Opcode = 0x5AC00800; // REV W0, W0
  239. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  240. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  241. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X31: _W31);
  242. if (Rd != 31)
  243. {
  244. Bits Op = new Bits(Opcode);
  245. AArch64.X((int)Rn, new Bits(Wn));
  246. Base.Rev32(Op[31], Op[9, 5], Op[4, 0]);
  247. uint Wd = AArch64.X(32, (int)Rd).ToUInt32();
  248. Assert.That((uint)ThreadState.X0, Is.EqualTo(Wd));
  249. }
  250. else
  251. {
  252. Assert.That((uint)ThreadState.X31, Is.EqualTo(_W31));
  253. }
  254. CompareAgainstUnicorn();
  255. }
  256. [Test, Description("REV64 <Xd>, <Xn>")]
  257. public void Rev64_64bit([Values(0u, 31u)] uint Rd,
  258. [Values(1u, 31u)] uint Rn,
  259. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  260. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(256)] ulong Xn)
  261. {
  262. uint Opcode = 0xDAC00C00; // REV64 X0, X0
  263. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  264. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  265. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X31: _X31);
  266. if (Rd != 31)
  267. {
  268. Bits Op = new Bits(Opcode);
  269. AArch64.X((int)Rn, new Bits(Xn));
  270. Base.Rev64(Op[9, 5], Op[4, 0]);
  271. ulong Xd = AArch64.X(64, (int)Rd).ToUInt64();
  272. Assert.That((ulong)ThreadState.X0, Is.EqualTo(Xd));
  273. }
  274. else
  275. {
  276. Assert.That((ulong)ThreadState.X31, Is.EqualTo(_X31));
  277. }
  278. CompareAgainstUnicorn();
  279. }
  280. #endif
  281. }
  282. }