CpuTestCcmpImm.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. //#define CcmpImm
  2. using NUnit.Framework;
  3. namespace Ryujinx.Tests.Cpu
  4. {
  5. [Category("CcmpImm"), Ignore("Tested: first half of 2018.")]
  6. public sealed class CpuTestCcmpImm : CpuTest
  7. {
  8. #if CcmpImm
  9. [SetUp]
  10. public void SetupTester()
  11. {
  12. AArch64.TakeReset(false);
  13. }
  14. [Test, Description("CCMN <Xn>, #<imm>, #<nzcv>, <cond>")]
  15. public void Ccmn_64bit([Values(1u, 31u)] uint Rn,
  16. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  17. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xn,
  18. [Values(0u, 31u)] [Random(0u, 31u, 3)] uint imm,
  19. [Random(0u, 15u, 1)] uint nzcv,
  20. [Values(0b0000u, 0b0001u, 0b0010u, 0b0011u, // <EQ, NE, CS/HS, CC/LO,
  21. 0b0100u, 0b0101u, 0b0110u, 0b0111u, // MI, PL, VS, VC,
  22. 0b1000u, 0b1001u, 0b1010u, 0b1011u, // HI, LS, GE, LT,
  23. 0b1100u, 0b1101u, 0b1110u, 0b1111u)] uint cond) // GT, LE, AL, NV>
  24. {
  25. uint Opcode = 0xBA400800; // CCMN X0, #0, #0, EQ
  26. Opcode |= ((Rn & 31) << 5);
  27. Opcode |= ((imm & 31) << 16) | ((cond & 15) << 12) | ((nzcv & 15) << 0);
  28. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  29. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X31: _X31);
  30. Bits Op = new Bits(Opcode);
  31. AArch64.X((int)Rn, new Bits(Xn));
  32. Base.Ccmn_Imm(Op[31], Op[20, 16], Op[15, 12], Op[9, 5], Op[3, 0]);
  33. Assert.Multiple(() =>
  34. {
  35. Assert.That(ThreadState.Negative, Is.EqualTo(Shared.PSTATE.N));
  36. Assert.That(ThreadState.Zero, Is.EqualTo(Shared.PSTATE.Z));
  37. Assert.That(ThreadState.Carry, Is.EqualTo(Shared.PSTATE.C));
  38. Assert.That(ThreadState.Overflow, Is.EqualTo(Shared.PSTATE.V));
  39. });
  40. }
  41. [Test, Description("CCMN <Wn>, #<imm>, #<nzcv>, <cond>")]
  42. public void Ccmn_32bit([Values(1u, 31u)] uint Rn,
  43. [Values(0x00000000u, 0x7FFFFFFFu,
  44. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wn,
  45. [Values(0u, 31u)] [Random(0u, 31u, 3)] uint imm,
  46. [Random(0u, 15u, 1)] uint nzcv,
  47. [Values(0b0000u, 0b0001u, 0b0010u, 0b0011u, // <EQ, NE, CS/HS, CC/LO,
  48. 0b0100u, 0b0101u, 0b0110u, 0b0111u, // MI, PL, VS, VC,
  49. 0b1000u, 0b1001u, 0b1010u, 0b1011u, // HI, LS, GE, LT,
  50. 0b1100u, 0b1101u, 0b1110u, 0b1111u)] uint cond) // GT, LE, AL, NV>
  51. {
  52. uint Opcode = 0x3A400800; // CCMN W0, #0, #0, EQ
  53. Opcode |= ((Rn & 31) << 5);
  54. Opcode |= ((imm & 31) << 16) | ((cond & 15) << 12) | ((nzcv & 15) << 0);
  55. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  56. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X31: _W31);
  57. Bits Op = new Bits(Opcode);
  58. AArch64.X((int)Rn, new Bits(Wn));
  59. Base.Ccmn_Imm(Op[31], Op[20, 16], Op[15, 12], Op[9, 5], Op[3, 0]);
  60. Assert.Multiple(() =>
  61. {
  62. Assert.That(ThreadState.Negative, Is.EqualTo(Shared.PSTATE.N));
  63. Assert.That(ThreadState.Zero, Is.EqualTo(Shared.PSTATE.Z));
  64. Assert.That(ThreadState.Carry, Is.EqualTo(Shared.PSTATE.C));
  65. Assert.That(ThreadState.Overflow, Is.EqualTo(Shared.PSTATE.V));
  66. });
  67. }
  68. [Test, Description("CCMP <Xn>, #<imm>, #<nzcv>, <cond>")]
  69. public void Ccmp_64bit([Values(1u, 31u)] uint Rn,
  70. [Values(0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  71. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul)] [Random(1)] ulong Xn,
  72. [Values(0u, 31u)] [Random(0u, 31u, 3)] uint imm,
  73. [Random(0u, 15u, 1)] uint nzcv,
  74. [Values(0b0000u, 0b0001u, 0b0010u, 0b0011u, // <EQ, NE, CS/HS, CC/LO,
  75. 0b0100u, 0b0101u, 0b0110u, 0b0111u, // MI, PL, VS, VC,
  76. 0b1000u, 0b1001u, 0b1010u, 0b1011u, // HI, LS, GE, LT,
  77. 0b1100u, 0b1101u, 0b1110u, 0b1111u)] uint cond) // GT, LE, AL, NV>
  78. {
  79. uint Opcode = 0xFA400800; // CCMP X0, #0, #0, EQ
  80. Opcode |= ((Rn & 31) << 5);
  81. Opcode |= ((imm & 31) << 16) | ((cond & 15) << 12) | ((nzcv & 15) << 0);
  82. ulong _X31 = TestContext.CurrentContext.Random.NextULong();
  83. AThreadState ThreadState = SingleOpcode(Opcode, X1: Xn, X31: _X31);
  84. Bits Op = new Bits(Opcode);
  85. AArch64.X((int)Rn, new Bits(Xn));
  86. Base.Ccmp_Imm(Op[31], Op[20, 16], Op[15, 12], Op[9, 5], Op[3, 0]);
  87. Assert.Multiple(() =>
  88. {
  89. Assert.That(ThreadState.Negative, Is.EqualTo(Shared.PSTATE.N));
  90. Assert.That(ThreadState.Zero, Is.EqualTo(Shared.PSTATE.Z));
  91. Assert.That(ThreadState.Carry, Is.EqualTo(Shared.PSTATE.C));
  92. Assert.That(ThreadState.Overflow, Is.EqualTo(Shared.PSTATE.V));
  93. });
  94. }
  95. [Test, Description("CCMP <Wn>, #<imm>, #<nzcv>, <cond>")]
  96. public void Ccmp_32bit([Values(1u, 31u)] uint Rn,
  97. [Values(0x00000000u, 0x7FFFFFFFu,
  98. 0x80000000u, 0xFFFFFFFFu)] [Random(1)] uint Wn,
  99. [Values(0u, 31u)] [Random(0u, 31u, 3)] uint imm,
  100. [Random(0u, 15u, 1)] uint nzcv,
  101. [Values(0b0000u, 0b0001u, 0b0010u, 0b0011u, // <EQ, NE, CS/HS, CC/LO,
  102. 0b0100u, 0b0101u, 0b0110u, 0b0111u, // MI, PL, VS, VC,
  103. 0b1000u, 0b1001u, 0b1010u, 0b1011u, // HI, LS, GE, LT,
  104. 0b1100u, 0b1101u, 0b1110u, 0b1111u)] uint cond) // GT, LE, AL, NV>
  105. {
  106. uint Opcode = 0x7A400800; // CCMP W0, #0, #0, EQ
  107. Opcode |= ((Rn & 31) << 5);
  108. Opcode |= ((imm & 31) << 16) | ((cond & 15) << 12) | ((nzcv & 15) << 0);
  109. uint _W31 = TestContext.CurrentContext.Random.NextUInt();
  110. AThreadState ThreadState = SingleOpcode(Opcode, X1: Wn, X31: _W31);
  111. Bits Op = new Bits(Opcode);
  112. AArch64.X((int)Rn, new Bits(Wn));
  113. Base.Ccmp_Imm(Op[31], Op[20, 16], Op[15, 12], Op[9, 5], Op[3, 0]);
  114. Assert.Multiple(() =>
  115. {
  116. Assert.That(ThreadState.Negative, Is.EqualTo(Shared.PSTATE.N));
  117. Assert.That(ThreadState.Zero, Is.EqualTo(Shared.PSTATE.Z));
  118. Assert.That(ThreadState.Carry, Is.EqualTo(Shared.PSTATE.C));
  119. Assert.That(ThreadState.Overflow, Is.EqualTo(Shared.PSTATE.V));
  120. });
  121. }
  122. #endif
  123. }
  124. }