CpuTestAlu32.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. #define Alu32
  2. using NUnit.Framework;
  3. namespace Ryujinx.Tests.Cpu
  4. {
  5. [Category("Alu32")]
  6. public sealed class CpuTestAlu32 : CpuTest32
  7. {
  8. #if Alu32
  9. #region "ValueSource (Opcodes)"
  10. private static uint[] _Ssat_Usat_()
  11. {
  12. return new uint[]
  13. {
  14. 0xe6a00010u, // SSAT R0, #1, R0, LSL #0
  15. 0xe6a00050u, // SSAT R0, #1, R0, ASR #32
  16. 0xe6e00010u, // USAT R0, #0, R0, LSL #0
  17. 0xe6e00050u // USAT R0, #0, R0, ASR #32
  18. };
  19. }
  20. private static uint[] _Ssat16_Usat16_()
  21. {
  22. return new uint[]
  23. {
  24. 0xe6a00f30u, // SSAT16 R0, #1, R0
  25. 0xe6e00f30u, // USAT16 R0, #0, R0
  26. };
  27. }
  28. private static uint[] _Lsr_Lsl_Asr_Ror_()
  29. {
  30. return new uint[]
  31. {
  32. 0xe1b00030u, // LSRS R0, R0, R0
  33. 0xe1b00010u, // LSLS R0, R0, R0
  34. 0xe1b00050u, // ASRS R0, R0, R0
  35. 0xe1b00070u // RORS R0, R0, R0
  36. };
  37. }
  38. #endregion
  39. private const int RndCnt = 2;
  40. [Test, Pairwise, Description("RBIT <Rd>, <Rn>")]
  41. public void Rbit_32bit([Values(0u, 0xdu)] uint rd,
  42. [Values(1u, 0xdu)] uint rm,
  43. [Values(0x00000000u, 0x7FFFFFFFu,
  44. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn)
  45. {
  46. uint opcode = 0xe6ff0f30u; // RBIT R0, R0
  47. opcode |= ((rm & 15) << 0) | ((rd & 15) << 12);
  48. uint w31 = TestContext.CurrentContext.Random.NextUInt();
  49. SingleOpcode(opcode, r1: wn, sp: w31);
  50. CompareAgainstUnicorn();
  51. }
  52. [Test, Pairwise]
  53. public void Lsr_Lsl_Asr_Ror([ValueSource("_Lsr_Lsl_Asr_Ror_")] uint opcode,
  54. [Values(0x00000000u, 0x7FFFFFFFu,
  55. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint shiftValue,
  56. [Range(0, 31)] [Values(32, 256, 768, -1, -23)] int shiftAmount)
  57. {
  58. uint rd = 0;
  59. uint rm = 1;
  60. uint rs = 2;
  61. opcode |= ((rm & 15) << 0) | ((rd & 15) << 12) | ((rs & 15) << 8);
  62. SingleOpcode(opcode, r1: shiftValue, r2: (uint)shiftAmount);
  63. CompareAgainstUnicorn();
  64. }
  65. [Test, Pairwise]
  66. public void Shadd8([Values(0u, 0xdu)] uint rd,
  67. [Values(1u)] uint rm,
  68. [Values(2u)] uint rn,
  69. [Random(RndCnt)] uint w0,
  70. [Random(RndCnt)] uint w1,
  71. [Random(RndCnt)] uint w2)
  72. {
  73. uint opcode = 0xE6300F90u; // SHADD8 R0, R0, R0
  74. opcode |= ((rm & 15) << 0) | ((rd & 15) << 12) | ((rn & 15) << 16);
  75. uint sp = TestContext.CurrentContext.Random.NextUInt();
  76. SingleOpcode(opcode, r0: w0, r1: w1, r2: w2, sp: sp);
  77. CompareAgainstUnicorn();
  78. }
  79. [Test, Pairwise]
  80. public void Shsub8([Values(0u, 0xdu)] uint rd,
  81. [Values(1u)] uint rm,
  82. [Values(2u)] uint rn,
  83. [Random(RndCnt)] uint w0,
  84. [Random(RndCnt)] uint w1,
  85. [Random(RndCnt)] uint w2)
  86. {
  87. uint opcode = 0xE6300FF0u; // SHSUB8 R0, R0, R0
  88. opcode |= ((rm & 15) << 0) | ((rd & 15) << 12) | ((rn & 15) << 16);
  89. uint sp = TestContext.CurrentContext.Random.NextUInt();
  90. SingleOpcode(opcode, r0: w0, r1: w1, r2: w2, sp: sp);
  91. CompareAgainstUnicorn();
  92. }
  93. [Test, Pairwise]
  94. public void Ssat_Usat([ValueSource("_Ssat_Usat_")] uint opcode,
  95. [Values(0u, 0xdu)] uint rd,
  96. [Values(1u, 0xdu)] uint rn,
  97. [Values(0u, 7u, 8u, 0xfu, 0x10u, 0x1fu)] uint sat,
  98. [Values(0u, 7u, 8u, 0xfu, 0x10u, 0x1fu)] uint shift,
  99. [Values(0x00000000u, 0x7FFFFFFFu,
  100. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn)
  101. {
  102. opcode |= ((rn & 15) << 0) | ((shift & 31) << 7) | ((rd & 15) << 12) | ((sat & 31) << 16);
  103. uint w31 = TestContext.CurrentContext.Random.NextUInt();
  104. SingleOpcode(opcode, r1: wn, sp: w31);
  105. CompareAgainstUnicorn();
  106. }
  107. [Test, Pairwise]
  108. public void Ssat16_Usat16([ValueSource("_Ssat16_Usat16_")] uint opcode,
  109. [Values(0u, 0xdu)] uint rd,
  110. [Values(1u, 0xdu)] uint rn,
  111. [Values(0u, 7u, 8u, 0xfu)] uint sat,
  112. [Values(0x00000000u, 0x7FFFFFFFu,
  113. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint wn)
  114. {
  115. opcode |= ((rn & 15) << 0) | ((rd & 15) << 12) | ((sat & 15) << 16);
  116. uint w31 = TestContext.CurrentContext.Random.NextUInt();
  117. SingleOpcode(opcode, r1: wn, sp: w31);
  118. CompareAgainstUnicorn();
  119. }
  120. [Test, Pairwise]
  121. public void Uhadd8([Values(0u, 0xdu)] uint rd,
  122. [Values(1u)] uint rm,
  123. [Values(2u)] uint rn,
  124. [Random(RndCnt)] uint w0,
  125. [Random(RndCnt)] uint w1,
  126. [Random(RndCnt)] uint w2)
  127. {
  128. uint opcode = 0xE6700F90u; // UHADD8 R0, R0, R0
  129. opcode |= ((rm & 15) << 0) | ((rd & 15) << 12) | ((rn & 15) << 16);
  130. uint sp = TestContext.CurrentContext.Random.NextUInt();
  131. SingleOpcode(opcode, r0: w0, r1: w1, r2: w2, sp: sp);
  132. CompareAgainstUnicorn();
  133. }
  134. [Test, Pairwise]
  135. public void Uhsub8([Values(0u, 0xdu)] uint rd,
  136. [Values(1u)] uint rm,
  137. [Values(2u)] uint rn,
  138. [Random(RndCnt)] uint w0,
  139. [Random(RndCnt)] uint w1,
  140. [Random(RndCnt)] uint w2)
  141. {
  142. uint opcode = 0xE6700FF0u; // UHSUB8 R0, R0, R0
  143. opcode |= ((rm & 15) << 0) | ((rd & 15) << 12) | ((rn & 15) << 16);
  144. uint sp = TestContext.CurrentContext.Random.NextUInt();
  145. SingleOpcode(opcode, r0: w0, r1: w1, r2: w2, sp: sp);
  146. CompareAgainstUnicorn();
  147. }
  148. #endif
  149. }
  150. }