CpuTestBfm.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #define Bfm
  2. using ChocolArm64.State;
  3. using NUnit.Framework;
  4. namespace Ryujinx.Tests.Cpu
  5. {
  6. [Category("Bfm")] // Tested: second half of 2018.
  7. public sealed class CpuTestBfm : CpuTest
  8. {
  9. #if Bfm
  10. private const int RndCnt = 2;
  11. private const int RndCntImmr = 2;
  12. private const int RndCntImms = 2;
  13. [Test, Pairwise, Description("BFM <Xd>, <Xn>, #<immr>, #<imms>")]
  14. public void Bfm_64bit([Values(0u, 31u)] uint Rd,
  15. [Values(1u, 31u)] uint Rn,
  16. [Random(RndCnt)] ulong _Xd,
  17. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  18. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  19. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, RndCntImmr)] uint immr,
  20. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, RndCntImms)] uint imms)
  21. {
  22. uint Opcode = 0xB3400000; // BFM X0, X0, #0, #0
  23. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  24. Opcode |= ((immr & 63) << 16) | ((imms & 63) << 10);
  25. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  26. AThreadState ThreadState = SingleOpcode(Opcode, X0: _Xd, X1: Xn, X31: _X31);
  27. CompareAgainstUnicorn();
  28. }
  29. [Test, Pairwise, Description("BFM <Wd>, <Wn>, #<immr>, #<imms>")]
  30. public void Bfm_32bit([Values(0u, 31u)] uint Rd,
  31. [Values(1u, 31u)] uint Rn,
  32. [Random(RndCnt)] uint _Wd,
  33. [Values(0x00000000u, 0x7FFFFFFFu,
  34. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  35. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, RndCntImmr)] uint immr,
  36. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, RndCntImms)] uint imms)
  37. {
  38. uint Opcode = 0x33000000; // BFM W0, W0, #0, #0
  39. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  40. Opcode |= ((immr & 63) << 16) | ((imms & 63) << 10);
  41. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  42. AThreadState ThreadState = SingleOpcode(Opcode, X0: _Wd, X1: Wn, X31: _W31);
  43. CompareAgainstUnicorn();
  44. }
  45. [Test, Pairwise, Description("SBFM <Xd>, <Xn>, #<immr>, #<imms>")]
  46. public void Sbfm_64bit([Values(0u, 31u)] uint Rd,
  47. [Values(1u, 31u)] uint Rn,
  48. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  49. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  50. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, RndCntImmr)] uint immr,
  51. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, RndCntImms)] uint imms)
  52. {
  53. uint Opcode = 0x93400000; // SBFM X0, X0, #0, #0
  54. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  55. Opcode |= ((immr & 63) << 16) | ((imms & 63) << 10);
  56. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  57. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X31: _X31);
  58. CompareAgainstUnicorn();
  59. }
  60. [Test, Pairwise, Description("SBFM <Wd>, <Wn>, #<immr>, #<imms>")]
  61. public void Sbfm_32bit([Values(0u, 31u)] uint Rd,
  62. [Values(1u, 31u)] uint Rn,
  63. [Values(0x00000000u, 0x7FFFFFFFu,
  64. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  65. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, RndCntImmr)] uint immr,
  66. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, RndCntImms)] uint imms)
  67. {
  68. uint Opcode = 0x13000000; // SBFM W0, W0, #0, #0
  69. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  70. Opcode |= ((immr & 63) << 16) | ((imms & 63) << 10);
  71. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  72. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X31: _W31);
  73. CompareAgainstUnicorn();
  74. }
  75. [Test, Pairwise, Description("UBFM <Xd>, <Xn>, #<immr>, #<imms>")]
  76. public void Ubfm_64bit([Values(0u, 31u)] uint Rd,
  77. [Values(1u, 31u)] uint Rn,
  78. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  79. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(RndCnt)] ulong Xn,
  80. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, RndCntImmr)] uint immr,
  81. [Values(0u, 31u, 32u, 63u)] [Random(0u, 63u, RndCntImms)] uint imms)
  82. {
  83. uint Opcode = 0xD3400000; // UBFM X0, X0, #0, #0
  84. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  85. Opcode |= ((immr & 63) << 16) | ((imms & 63) << 10);
  86. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  87. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X31: _X31);
  88. CompareAgainstUnicorn();
  89. }
  90. [Test, Pairwise, Description("UBFM <Wd>, <Wn>, #<immr>, #<imms>")]
  91. public void Ubfm_32bit([Values(0u, 31u)] uint Rd,
  92. [Values(1u, 31u)] uint Rn,
  93. [Values(0x00000000u, 0x7FFFFFFFu,
  94. 0x80000000u, 0xFFFFFFFFu)] [Random(RndCnt)] uint Wn,
  95. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, RndCntImmr)] uint immr,
  96. [Values(0u, 15u, 16u, 31u)] [Random(0u, 31u, RndCntImms)] uint imms)
  97. {
  98. uint Opcode = 0x53000000; // UBFM W0, W0, #0, #0
  99. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  100. Opcode |= ((immr & 63) << 16) | ((imms & 63) << 10);
  101. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  102. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X31: _W31);
  103. CompareAgainstUnicorn();
  104. }
  105. #endif
  106. }
  107. }