CpuTestSimdArithmetic.cs 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789
  1. using ChocolArm64.State;
  2. using NUnit.Framework;
  3. using System.Runtime.Intrinsics;
  4. using System.Runtime.Intrinsics.X86;
  5. namespace Ryujinx.Tests.Cpu
  6. {
  7. public class CpuTestSimdArithmetic : CpuTest
  8. {
  9. [TestCase(0xE228420u, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul)]
  10. [TestCase(0xE228420u, 0x00000000FFFFFFFFul, 0x00000000FFFFFFFFul, 0x0000000000000001ul, 0x0000000000000001ul, 0x00000000FFFFFF00ul, 0x0000000000000000ul)]
  11. [TestCase(0xE228420u, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFEFEFEFEFEFEFEFEul, 0x0000000000000000ul)]
  12. [TestCase(0xE228420u, 0x0102030405060708ul, 0xAAAAAAAAAAAAAAAAul, 0x0807060504030201ul, 0x2222222222222222ul, 0x0909090909090909ul, 0x0000000000000000ul)]
  13. [TestCase(0x4E228420u, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul)]
  14. [TestCase(0x4E228420u, 0x00000000FFFFFFFFul, 0x00000000FFFFFFFFul, 0x0000000000000001ul, 0x0000000000000001ul, 0x00000000FFFFFF00ul, 0x00000000FFFFFF00ul)]
  15. [TestCase(0x4E228420u, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFEFEFEFEFEFEFEFEul, 0xFEFEFEFEFEFEFEFEul)]
  16. [TestCase(0x4E228420u, 0x0102030405060708ul, 0xAAAAAAAAAAAAAAAAul, 0x0807060504030201ul, 0x2222222222222222ul, 0x0909090909090909ul, 0xCCCCCCCCCCCCCCCCul)]
  17. [TestCase(0xE628420u, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul)]
  18. [TestCase(0xE628420u, 0x00000000FFFFFFFFul, 0x00000000FFFFFFFFul, 0x0000000000000001ul, 0x0000000000000001ul, 0x00000000FFFF0000ul, 0x0000000000000000ul)]
  19. [TestCase(0xE628420u, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFEFFFEFFFEFFFEul, 0x0000000000000000ul)]
  20. [TestCase(0xE628420u, 0x0102030405060708ul, 0xAAAAAAAAAAAAAAAAul, 0x0807060504030201ul, 0x2222222222222222ul, 0x0909090909090909ul, 0x0000000000000000ul)]
  21. [TestCase(0x4E628420u, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul)]
  22. [TestCase(0x4E628420u, 0x00000000FFFFFFFFul, 0x00000000FFFFFFFFul, 0x0000000000000001ul, 0x0000000000000001ul, 0x00000000FFFF0000ul, 0x00000000FFFF0000ul)]
  23. [TestCase(0x4E628420u, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFEFFFEFFFEFFFEul, 0xFFFEFFFEFFFEFFFEul)]
  24. [TestCase(0x4E628420u, 0x0102030405060708ul, 0xAAAAAAAAAAAAAAAAul, 0x0807060504030201ul, 0x2222222222222222ul, 0x0909090909090909ul, 0xCCCCCCCCCCCCCCCCul)]
  25. [TestCase(0xEA28420u, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul)]
  26. [TestCase(0xEA28420u, 0x00000000FFFFFFFFul, 0x00000000FFFFFFFFul, 0x0000000000000001ul, 0x0000000000000001ul, 0x0000000000000000ul, 0x0000000000000000ul)]
  27. [TestCase(0xEA28420u, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFEFFFFFFFEul, 0x0000000000000000ul)]
  28. [TestCase(0xEA28420u, 0x0102030405060708ul, 0xAAAAAAAAAAAAAAAAul, 0x0807060504030201ul, 0x2222222222222222ul, 0x0909090909090909ul, 0x0000000000000000ul)]
  29. [TestCase(0x4EA28420u, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul)]
  30. [TestCase(0x4EA28420u, 0x00000000FFFFFFFFul, 0x00000000FFFFFFFFul, 0x0000000000000001ul, 0x0000000000000001ul, 0x0000000000000000ul, 0x0000000000000000ul)]
  31. [TestCase(0x4EA28420u, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFEFFFFFFFEul, 0xFFFFFFFEFFFFFFFEul)]
  32. [TestCase(0x4EA28420u, 0x0102030405060708ul, 0xAAAAAAAAAAAAAAAAul, 0x0807060504030201ul, 0x2222222222222222ul, 0x0909090909090909ul, 0xCCCCCCCCCCCCCCCCul)]
  33. [TestCase(0x4EE28420u, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul)]
  34. [TestCase(0x4EE28420u, 0x00000000FFFFFFFFul, 0x00000000FFFFFFFFul, 0x0000000000000001ul, 0x0000000000000001ul, 0x0000000100000000ul, 0x0000000100000000ul)]
  35. [TestCase(0x4EE28420u, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFEul, 0xFFFFFFFFFFFFFFFEul)]
  36. [TestCase(0x4EE28420u, 0x0102030405060708ul, 0xAAAAAAAAAAAAAAAAul, 0x0807060504030201ul, 0x2222222222222222ul, 0x0909090909090909ul, 0xCCCCCCCCCCCCCCCCul)]
  37. public void Add_V(uint Opcode, ulong A0, ulong A1, ulong B0, ulong B1, ulong Result0, ulong Result1)
  38. {
  39. Vector128<float> V1 = MakeVectorE0E1(A0, A1);
  40. Vector128<float> V2 = MakeVectorE0E1(B0, B1);
  41. AThreadState ThreadState = SingleOpcode(Opcode, V1: V1, V2: V2);
  42. Assert.Multiple(() =>
  43. {
  44. Assert.AreEqual(Result0, GetVectorE0(ThreadState.V0));
  45. Assert.AreEqual(Result1, GetVectorE1(ThreadState.V0));
  46. });
  47. }
  48. [TestCase(0x1E224820u, 0x0000000000000000ul, 0x0000000080000000ul, 0x0000000000000000ul)]
  49. [TestCase(0x1E224820u, 0x0000000080000000ul, 0x0000000000000000ul, 0x0000000000000000ul)]
  50. [TestCase(0x1E224820u, 0x0000000080000000ul, 0x0000000080000000ul, 0x0000000080000000ul)]
  51. [TestCase(0x1E224820u, 0x0000000080000000ul, 0x000000003DCCCCCDul, 0x000000003DCCCCCDul)]
  52. [TestCase(0x1E224820u, 0x000000003DCCCCCDul, 0x000000003C9623B1ul, 0x000000003DCCCCCDul)]
  53. [TestCase(0x1E224820u, 0x000000008BA98D27ul, 0x0000000000000076ul, 0x0000000000000076ul)]
  54. [TestCase(0x1E224820u, 0x00000000807FFFFFul, 0x000000007F7FFFFFul, 0x000000007F7FFFFFul)]
  55. [TestCase(0x1E224820u, 0x000000007F7FFFFFul, 0x00000000807FFFFFul, 0x000000007F7FFFFFul)]
  56. [TestCase(0x1E224820u, 0x000000007FC00000ul, 0x000000003F800000ul, 0x000000007FC00000ul)]
  57. [TestCase(0x1E224820u, 0x000000003F800000ul, 0x000000007FC00000ul, 0x000000007FC00000ul)]
  58. [TestCase(0x1E224820u, 0x000000007F800001ul, 0x000000007FC00042ul, 0x000000007FC00001ul, Ignore = "NaN test.")]
  59. [TestCase(0x1E224820u, 0x000000007FC00042ul, 0x000000007F800001ul, 0x000000007FC00001ul, Ignore = "NaN test.")]
  60. [TestCase(0x1E224820u, 0x000000007FC0000Aul, 0x000000007FC0000Bul, 0x000000007FC0000Aul, Ignore = "NaN test.")]
  61. [TestCase(0x1E624820u, 0x0000000000000000ul, 0x8000000000000000ul, 0x0000000000000000ul)]
  62. [TestCase(0x1E624820u, 0x8000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul)]
  63. [TestCase(0x1E624820u, 0x8000000000000000ul, 0x8000000000000000ul, 0x8000000000000000ul)]
  64. [TestCase(0x1E624820u, 0x8000000000000000ul, 0x3FF3333333333333ul, 0x3FF3333333333333ul)]
  65. public void Fmax_S(uint Opcode, ulong A, ulong B, ulong Result)
  66. {
  67. // FMAX S0, S1, S2
  68. AThreadState ThreadState = SingleOpcode(Opcode,
  69. V1: Sse.StaticCast<ulong, float>(Sse2.SetVector128(0, A)),
  70. V2: Sse.StaticCast<ulong, float>(Sse2.SetVector128(0, B)));
  71. Assert.AreEqual(Result, Sse41.Extract(Sse.StaticCast<float, ulong>(ThreadState.V0), 0));
  72. }
  73. [TestCase(0x80000000u, 0x80000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u)]
  74. [TestCase(0x00000000u, 0x00000000u, 0x80000000u, 0x80000000u, 0x00000000u, 0x00000000u)]
  75. [TestCase(0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u)]
  76. [TestCase(0x80000000u, 0x80000000u, 0x3DCCCCCDu, 0x3DCCCCCDu, 0x3DCCCCCDu, 0x3DCCCCCDu)]
  77. [TestCase(0x3DCCCCCDu, 0x3DCCCCCDu, 0x3C9623B1u, 0x3C9623B1u, 0x3DCCCCCDu, 0x3DCCCCCDu)]
  78. [TestCase(0x8BA98D27u, 0x8BA98D27u, 0x00000076u, 0x00000076u, 0x00000076u, 0x00000076u)]
  79. [TestCase(0x807FFFFFu, 0x807FFFFFu, 0x7F7FFFFFu, 0x7F7FFFFFu, 0x7F7FFFFFu, 0x7F7FFFFFu)]
  80. [TestCase(0x7F7FFFFFu, 0x7F7FFFFFu, 0x807FFFFFu, 0x807FFFFFu, 0x7F7FFFFFu, 0x7F7FFFFFu)]
  81. [TestCase(0x7FC00000u, 0x7FC00000u, 0x3F800000u, 0x3F800000u, 0x7FC00000u, 0x7FC00000u)]
  82. [TestCase(0x3F800000u, 0x3F800000u, 0x7FC00000u, 0x7FC00000u, 0x7FC00000u, 0x7FC00000u)]
  83. [TestCase(0x7F800001u, 0x7F800001u, 0x7FC00042u, 0x7FC00042u, 0x7FC00001u, 0x7FC00001u, Ignore = "NaN test.")]
  84. [TestCase(0x7FC00042u, 0x7FC00042u, 0x7F800001u, 0x7F800001u, 0x7FC00001u, 0x7FC00001u, Ignore = "NaN test.")]
  85. [TestCase(0x7FC0000Au, 0x7FC0000Au, 0x7FC0000Bu, 0x7FC0000Bu, 0x7FC0000Au, 0x7FC0000Au, Ignore = "NaN test.")]
  86. public void Fmax_V(uint A, uint B, uint C, uint D, uint Result0, uint Result1)
  87. {
  88. uint Opcode = 0x4E22F420;
  89. Vector128<float> V1 = MakeVectorE0E1(A, B);
  90. Vector128<float> V2 = MakeVectorE0E1(C, D);
  91. AThreadState ThreadState = SingleOpcode(Opcode, V1: V1, V2: V2);
  92. Assert.Multiple(() =>
  93. {
  94. Assert.AreEqual(Result0, GetVectorE0(ThreadState.V0));
  95. Assert.AreEqual(Result1, GetVectorE1(ThreadState.V0));
  96. });
  97. }
  98. [TestCase(0x1E225820u, 0x0000000000000000ul, 0x0000000080000000ul, 0x0000000080000000ul)]
  99. [TestCase(0x1E225820u, 0x0000000080000000ul, 0x0000000000000000ul, 0x0000000080000000ul)]
  100. [TestCase(0x1E225820u, 0x0000000080000000ul, 0x0000000080000000ul, 0x0000000080000000ul)]
  101. [TestCase(0x1E225820u, 0x0000000080000000ul, 0x000000003DCCCCCDul, 0x0000000080000000ul)]
  102. [TestCase(0x1E225820u, 0x000000003DCCCCCDul, 0x000000003C9623B1ul, 0x000000003C9623B1ul)]
  103. [TestCase(0x1E225820u, 0x000000008BA98D27ul, 0x0000000000000076ul, 0x000000008BA98D27ul)]
  104. [TestCase(0x1E225820u, 0x00000000807FFFFFul, 0x000000007F7FFFFFul, 0x00000000807FFFFFul)]
  105. [TestCase(0x1E225820u, 0x000000007F7FFFFFul, 0x00000000807FFFFFul, 0x00000000807FFFFFul)]
  106. [TestCase(0x1E225820u, 0x000000007FC00000ul, 0x000000003F800000ul, 0x000000007FC00000ul)]
  107. [TestCase(0x1E225820u, 0x000000003F800000ul, 0x000000007FC00000ul, 0x000000007FC00000ul)]
  108. [TestCase(0x1E225820u, 0x000000007F800001ul, 0x000000007FC00042ul, 0x000000007FC00001ul, Ignore = "NaN test.")]
  109. [TestCase(0x1E225820u, 0x000000007FC00042ul, 0x000000007F800001ul, 0x000000007FC00001ul, Ignore = "NaN test.")]
  110. [TestCase(0x1E225820u, 0x000000007FC0000Aul, 0x000000007FC0000Bul, 0x000000007FC0000Aul, Ignore = "NaN test.")]
  111. [TestCase(0x1E625820u, 0x0000000000000000ul, 0x8000000000000000ul, 0x8000000000000000ul)]
  112. [TestCase(0x1E625820u, 0x8000000000000000ul, 0x0000000000000000ul, 0x8000000000000000ul)]
  113. [TestCase(0x1E625820u, 0x8000000000000000ul, 0x8000000000000000ul, 0x8000000000000000ul)]
  114. [TestCase(0x1E625820u, 0x8000000000000000ul, 0x3FF3333333333333ul, 0x8000000000000000ul)]
  115. public void Fmin_S(uint Opcode, ulong A, ulong B, ulong Result)
  116. {
  117. // FMIN S0, S1, S2
  118. AThreadState ThreadState = SingleOpcode(Opcode,
  119. V1: Sse.StaticCast<ulong, float>(Sse2.SetVector128(0, A)),
  120. V2: Sse.StaticCast<ulong, float>(Sse2.SetVector128(0, B)));
  121. Assert.AreEqual(Result, Sse41.Extract(Sse.StaticCast<float, ulong>(ThreadState.V0), 0));
  122. }
  123. [TestCase(0x80000000u, 0x80000000u, 0x00000000u, 0x00000000u, 0x80000000u, 0x80000000u)]
  124. [TestCase(0x00000000u, 0x00000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u)]
  125. [TestCase(0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u)]
  126. [TestCase(0x80000000u, 0x80000000u, 0x3DCCCCCDu, 0x3DCCCCCDu, 0x80000000u, 0x80000000u)]
  127. [TestCase(0x3DCCCCCDu, 0x3DCCCCCDu, 0x3C9623B1u, 0x3C9623B1u, 0x3C9623B1u, 0x3C9623B1u)]
  128. [TestCase(0x8BA98D27u, 0x8BA98D27u, 0x00000076u, 0x00000076u, 0x8BA98D27u, 0x8BA98D27u)]
  129. [TestCase(0x807FFFFFu, 0x807FFFFFu, 0x7F7FFFFFu, 0x7F7FFFFFu, 0x807FFFFFu, 0x807FFFFFu)]
  130. [TestCase(0x7F7FFFFFu, 0x7F7FFFFFu, 0x807FFFFFu, 0x807FFFFFu, 0x807FFFFFu, 0x807FFFFFu)]
  131. [TestCase(0x7FC00000u, 0x7FC00000u, 0x3F800000u, 0x3F800000u, 0x7FC00000u, 0x7FC00000u)]
  132. [TestCase(0x3F800000u, 0x3F800000u, 0x7FC00000u, 0x7FC00000u, 0x7FC00000u, 0x7FC00000u)]
  133. [TestCase(0x7F800001u, 0x7F800001u, 0x7FC00042u, 0x7FC00042u, 0x7FC00001u, 0x7FC00001u, Ignore = "NaN test.")]
  134. [TestCase(0x7FC00042u, 0x7FC00042u, 0x7F800001u, 0x7F800001u, 0x7FC00001u, 0x7FC00001u, Ignore = "NaN test.")]
  135. [TestCase(0x7FC0000Au, 0x7FC0000Au, 0x7FC0000Bu, 0x7FC0000Bu, 0x7FC0000Au, 0x7FC0000Au, Ignore = "NaN test.")]
  136. public void Fmin_V(uint A, uint B, uint C, uint D, uint Result0, uint Result1)
  137. {
  138. uint Opcode = 0x4EA2F420;
  139. Vector128<float> V1 = MakeVectorE0E1(A, B);
  140. Vector128<float> V2 = MakeVectorE0E1(C, D);
  141. AThreadState ThreadState = SingleOpcode(Opcode, V1: V1, V2: V2);
  142. Assert.Multiple(() =>
  143. {
  144. Assert.AreEqual(Result0, GetVectorE0(ThreadState.V0));
  145. Assert.AreEqual(Result1, GetVectorE1(ThreadState.V0));
  146. });
  147. }
  148. [Test, Description("FMUL S6, S1, V0.S[2]")]
  149. public void Fmul_Se([Random(10)] float A, [Random(10)] float B)
  150. {
  151. AThreadState ThreadState = SingleOpcode(0x5F809826,
  152. V1: Sse.SetVector128(0, 0, 0, A),
  153. V0: Sse.SetVector128(0, B, 0, 0));
  154. Assert.That(Sse41.Extract(ThreadState.V6, (byte)0), Is.EqualTo(A * B));
  155. }
  156. [TestCase(0x00000000u, 0x7F800000u)]
  157. [TestCase(0x80000000u, 0xFF800000u)]
  158. [TestCase(0x00FFF000u, 0x7E000000u)]
  159. [TestCase(0x41200000u, 0x3DCC8000u)]
  160. [TestCase(0xC1200000u, 0xBDCC8000u)]
  161. [TestCase(0x001FFFFFu, 0x7F800000u)]
  162. [TestCase(0x007FF000u, 0x7E800000u)]
  163. public void Frecpe_S(uint A, uint Result)
  164. {
  165. Vector128<float> V1 = MakeVectorE0(A);
  166. AThreadState ThreadState = SingleOpcode(0x5EA1D820, V1: V1);
  167. Assert.AreEqual(Result, GetVectorE0(ThreadState.V0));
  168. }
  169. [Test, Description("FRECPS D0, D1, D2")]
  170. public void Frecps_S([Random(10)] double A, [Random(10)] double B)
  171. {
  172. AThreadState ThreadState = SingleOpcode(0x5E62FC20,
  173. V1: MakeVectorE0(A),
  174. V2: MakeVectorE0(B));
  175. Assert.That(VectorExtractDouble(ThreadState.V0, 0), Is.EqualTo(2 - (A * B)));
  176. }
  177. [Test, Description("FRECPS V4.4S, V2.4S, V0.4S")]
  178. public void Frecps_V([Random(10)] float A, [Random(10)] float B)
  179. {
  180. AThreadState ThreadState = SingleOpcode(0x4E20FC44,
  181. V2: Sse.SetAllVector128(A),
  182. V0: Sse.SetAllVector128(B));
  183. float Result = (float)(2 - ((double)A * (double)B));
  184. Assert.Multiple(() =>
  185. {
  186. Assert.That(Sse41.Extract(ThreadState.V4, (byte)0), Is.EqualTo(Result));
  187. Assert.That(Sse41.Extract(ThreadState.V4, (byte)1), Is.EqualTo(Result));
  188. Assert.That(Sse41.Extract(ThreadState.V4, (byte)2), Is.EqualTo(Result));
  189. Assert.That(Sse41.Extract(ThreadState.V4, (byte)3), Is.EqualTo(Result));
  190. });
  191. }
  192. [TestCase(0x3FE66666u, false, 0x40000000u)]
  193. [TestCase(0x3F99999Au, false, 0x3F800000u)]
  194. [TestCase(0x404CCCCDu, false, 0x40400000u)]
  195. [TestCase(0x40733333u, false, 0x40800000u)]
  196. [TestCase(0x3fc00000u, false, 0x40000000u)]
  197. [TestCase(0x40200000u, false, 0x40400000u)]
  198. [TestCase(0x00000000u, false, 0x00000000u)]
  199. [TestCase(0x00000000u, false, 0x00000000u)]
  200. [TestCase(0x00000000u, false, 0x00000000u)]
  201. [TestCase(0x00000000u, false, 0x00000000u)]
  202. [TestCase(0x80000000u, false, 0x80000000u)]
  203. [TestCase(0x80000000u, false, 0x80000000u)]
  204. [TestCase(0x80000000u, false, 0x80000000u)]
  205. [TestCase(0x80000000u, false, 0x80000000u)]
  206. [TestCase(0x7F800000u, false, 0x7F800000u)]
  207. [TestCase(0x7F800000u, false, 0x7F800000u)]
  208. [TestCase(0x7F800000u, false, 0x7F800000u)]
  209. [TestCase(0x7F800000u, false, 0x7F800000u)]
  210. [TestCase(0xFF800000u, false, 0xFF800000u)]
  211. [TestCase(0xFF800000u, false, 0xFF800000u)]
  212. [TestCase(0xFF800000u, false, 0xFF800000u)]
  213. [TestCase(0xFF800000u, false, 0xFF800000u)]
  214. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  215. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  216. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  217. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  218. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  219. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  220. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  221. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  222. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  223. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  224. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  225. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  226. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  227. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  228. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  229. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  230. public void Frinta_S(uint A, bool DefaultNaN, uint Result)
  231. {
  232. int FpcrTemp = 0x0;
  233. if(DefaultNaN)
  234. {
  235. FpcrTemp = 0x2000000;
  236. }
  237. Vector128<float> V1 = MakeVectorE0(A);
  238. AThreadState ThreadState = SingleOpcode(0x1E264020, V1: V1, Fpcr: FpcrTemp);
  239. Assert.AreEqual(Result, GetVectorE0(ThreadState.V0));
  240. }
  241. [TestCase(0x6E618820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  242. [TestCase(0x6E618820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, false, 0x4000000000000000ul, 0x4000000000000000ul)]
  243. [TestCase(0x6E618820u, 0x3FF8000000000000ul, 0x3FF8000000000000ul, false, 0x4000000000000000ul, 0x4000000000000000ul)]
  244. [TestCase(0x6E219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, false, 0x3f80000040000000ul, 0x3f80000040000000ul)]
  245. [TestCase(0x6E219820u, 0x3fc000003fc00000ul, 0x3fc000003fc00000ul, false, 0x4000000040000000ul, 0x4000000040000000ul)]
  246. [TestCase(0x2E219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, false, 0x3f80000040000000ul, 0x0000000000000000ul)]
  247. [TestCase(0x2E219820u, 0x3fc000003fc00000ul, 0x3fc000003fc00000ul, false, 0x4000000040000000ul, 0x0000000000000000ul)]
  248. [TestCase(0x2E218820u, 0x0000000080000000ul, 0x0000000000000000ul, false, 0x0000000080000000ul, 0x0000000000000000ul)]
  249. [TestCase(0x2E218820u, 0x7F800000FF800000ul, 0x0000000000000000ul, false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  250. [TestCase(0x2E218820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  251. [TestCase(0x2E218820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  252. public void Frinta_V(uint Opcode, ulong A, ulong B, bool DefaultNaN, ulong Result0, ulong Result1)
  253. {
  254. int FpcrTemp = 0x0;
  255. if(DefaultNaN)
  256. {
  257. FpcrTemp = 0x2000000;
  258. }
  259. Vector128<float> V1 = MakeVectorE0E1(A, B);
  260. AThreadState ThreadState = SingleOpcode(Opcode, V1: V1, Fpcr: FpcrTemp);
  261. Assert.Multiple(() =>
  262. {
  263. Assert.AreEqual(Result0, GetVectorE0(ThreadState.V0));
  264. Assert.AreEqual(Result1, GetVectorE1(ThreadState.V0));
  265. });
  266. }
  267. [TestCase(0x3FE66666u, 'N', false, 0x40000000u)]
  268. [TestCase(0x3F99999Au, 'N', false, 0x3F800000u)]
  269. [TestCase(0x404CCCCDu, 'P', false, 0x40800000u)]
  270. [TestCase(0x40733333u, 'P', false, 0x40800000u)]
  271. [TestCase(0x404CCCCDu, 'M', false, 0x40400000u)]
  272. [TestCase(0x40733333u, 'M', false, 0x40400000u)]
  273. [TestCase(0x3F99999Au, 'Z', false, 0x3F800000u)]
  274. [TestCase(0x3FE66666u, 'Z', false, 0x3F800000u)]
  275. [TestCase(0x00000000u, 'N', false, 0x00000000u)]
  276. [TestCase(0x00000000u, 'P', false, 0x00000000u)]
  277. [TestCase(0x00000000u, 'M', false, 0x00000000u)]
  278. [TestCase(0x00000000u, 'Z', false, 0x00000000u)]
  279. [TestCase(0x80000000u, 'N', false, 0x80000000u)]
  280. [TestCase(0x80000000u, 'P', false, 0x80000000u)]
  281. [TestCase(0x80000000u, 'M', false, 0x80000000u)]
  282. [TestCase(0x80000000u, 'Z', false, 0x80000000u)]
  283. [TestCase(0x7F800000u, 'N', false, 0x7F800000u)]
  284. [TestCase(0x7F800000u, 'P', false, 0x7F800000u)]
  285. [TestCase(0x7F800000u, 'M', false, 0x7F800000u)]
  286. [TestCase(0x7F800000u, 'Z', false, 0x7F800000u)]
  287. [TestCase(0xFF800000u, 'N', false, 0xFF800000u)]
  288. [TestCase(0xFF800000u, 'P', false, 0xFF800000u)]
  289. [TestCase(0xFF800000u, 'M', false, 0xFF800000u)]
  290. [TestCase(0xFF800000u, 'Z', false, 0xFF800000u)]
  291. [TestCase(0xFF800001u, 'N', false, 0xFFC00001u, Ignore = "NaN test.")]
  292. [TestCase(0xFF800001u, 'P', false, 0xFFC00001u, Ignore = "NaN test.")]
  293. [TestCase(0xFF800001u, 'M', false, 0xFFC00001u, Ignore = "NaN test.")]
  294. [TestCase(0xFF800001u, 'Z', false, 0xFFC00001u, Ignore = "NaN test.")]
  295. [TestCase(0xFF800001u, 'N', true, 0x7FC00000u, Ignore = "NaN test.")]
  296. [TestCase(0xFF800001u, 'P', true, 0x7FC00000u, Ignore = "NaN test.")]
  297. [TestCase(0xFF800001u, 'M', true, 0x7FC00000u, Ignore = "NaN test.")]
  298. [TestCase(0xFF800001u, 'Z', true, 0x7FC00000u, Ignore = "NaN test.")]
  299. [TestCase(0x7FC00002u, 'N', false, 0x7FC00002u, Ignore = "NaN test.")]
  300. [TestCase(0x7FC00002u, 'P', false, 0x7FC00002u, Ignore = "NaN test.")]
  301. [TestCase(0x7FC00002u, 'M', false, 0x7FC00002u, Ignore = "NaN test.")]
  302. [TestCase(0x7FC00002u, 'Z', false, 0x7FC00002u, Ignore = "NaN test.")]
  303. [TestCase(0x7FC00002u, 'N', true, 0x7FC00000u, Ignore = "NaN test.")]
  304. [TestCase(0x7FC00002u, 'P', true, 0x7FC00000u, Ignore = "NaN test.")]
  305. [TestCase(0x7FC00002u, 'M', true, 0x7FC00000u, Ignore = "NaN test.")]
  306. [TestCase(0x7FC00002u, 'Z', true, 0x7FC00000u, Ignore = "NaN test.")]
  307. public void Frinti_S(uint A, char RoundType, bool DefaultNaN, uint Result)
  308. {
  309. int FpcrTemp = 0x0;
  310. switch(RoundType)
  311. {
  312. case 'N':
  313. FpcrTemp = 0x0;
  314. break;
  315. case 'P':
  316. FpcrTemp = 0x400000;
  317. break;
  318. case 'M':
  319. FpcrTemp = 0x800000;
  320. break;
  321. case 'Z':
  322. FpcrTemp = 0xC00000;
  323. break;
  324. }
  325. if(DefaultNaN)
  326. {
  327. FpcrTemp |= 1 << 25;
  328. }
  329. Vector128<float> V1 = MakeVectorE0(A);
  330. AThreadState ThreadState = SingleOpcode(0x1E27C020, V1: V1, Fpcr: FpcrTemp);
  331. Assert.AreEqual(Result, GetVectorE0(ThreadState.V0));
  332. }
  333. [TestCase(0x6EE19820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, 'N', false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  334. [TestCase(0x6EE19820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, 'N', false, 0x4000000000000000ul, 0x4000000000000000ul)]
  335. [TestCase(0x6EE19820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, 'P', false, 0x4000000000000000ul, 0x4000000000000000ul)]
  336. [TestCase(0x6EE19820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, 'P', false, 0x4000000000000000ul, 0x4000000000000000ul)]
  337. [TestCase(0x6EE19820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, 'M', false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  338. [TestCase(0x6EE19820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, 'M', false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  339. [TestCase(0x6EE19820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, 'Z', false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  340. [TestCase(0x6EE19820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, 'Z', false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  341. [TestCase(0x6EA19820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'N', false, 0x3f80000040000000ul, 0x3f80000040000000ul)]
  342. [TestCase(0x6EA19820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'P', false, 0x4000000040000000ul, 0x4000000040000000ul)]
  343. [TestCase(0x6EA19820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'M', false, 0x3f8000003f800000ul, 0x3f8000003f800000ul)]
  344. [TestCase(0x6EA19820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'Z', false, 0x3f8000003f800000ul, 0x3f8000003f800000ul)]
  345. [TestCase(0x2EA19820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'N', false, 0x3f80000040000000ul, 0x0000000000000000ul)]
  346. [TestCase(0x2EA19820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'P', false, 0x4000000040000000ul, 0x0000000000000000ul)]
  347. [TestCase(0x2EA19820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'M', false, 0x3f8000003f800000ul, 0x0000000000000000ul)]
  348. [TestCase(0x2EA19820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'Z', false, 0x3f8000003f800000ul, 0x0000000000000000ul)]
  349. [TestCase(0x2EA19820u, 0x0000000080000000ul, 0x0000000000000000ul, 'N', false, 0x0000000080000000ul, 0x0000000000000000ul)]
  350. [TestCase(0x2EA19820u, 0x0000000080000000ul, 0x0000000000000000ul, 'P', false, 0x0000000080000000ul, 0x0000000000000000ul)]
  351. [TestCase(0x2EA19820u, 0x0000000080000000ul, 0x0000000000000000ul, 'M', false, 0x0000000080000000ul, 0x0000000000000000ul)]
  352. [TestCase(0x2EA19820u, 0x0000000080000000ul, 0x0000000000000000ul, 'Z', false, 0x0000000080000000ul, 0x0000000000000000ul)]
  353. [TestCase(0x2EA19820u, 0x7F800000FF800000ul, 0x0000000000000000ul, 'N', false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  354. [TestCase(0x2EA19820u, 0x7F800000FF800000ul, 0x0000000000000000ul, 'P', false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  355. [TestCase(0x2EA19820u, 0x7F800000FF800000ul, 0x0000000000000000ul, 'M', false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  356. [TestCase(0x2EA19820u, 0x7F800000FF800000ul, 0x0000000000000000ul, 'Z', false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  357. [TestCase(0x2EA19820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'N', false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  358. [TestCase(0x2EA19820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'P', false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  359. [TestCase(0x2EA19820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'M', false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  360. [TestCase(0x2EA19820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'Z', false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  361. [TestCase(0x2EA19820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'N', true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  362. [TestCase(0x2EA19820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'P', true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  363. [TestCase(0x2EA19820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'M', true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  364. [TestCase(0x2EA19820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'Z', true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  365. public void Frinti_V(uint Opcode, ulong A, ulong B, char RoundType, bool DefaultNaN, ulong Result0, ulong Result1)
  366. {
  367. int FpcrTemp = 0x0;
  368. switch(RoundType)
  369. {
  370. case 'N':
  371. FpcrTemp = 0x0;
  372. break;
  373. case 'P':
  374. FpcrTemp = 0x400000;
  375. break;
  376. case 'M':
  377. FpcrTemp = 0x800000;
  378. break;
  379. case 'Z':
  380. FpcrTemp = 0xC00000;
  381. break;
  382. }
  383. if(DefaultNaN)
  384. {
  385. FpcrTemp |= 1 << 25;
  386. }
  387. Vector128<float> V1 = MakeVectorE0E1(A, B);
  388. AThreadState ThreadState = SingleOpcode(Opcode, V1: V1, Fpcr: FpcrTemp);
  389. Assert.Multiple(() =>
  390. {
  391. Assert.AreEqual(Result0, GetVectorE0(ThreadState.V0));
  392. Assert.AreEqual(Result1, GetVectorE1(ThreadState.V0));
  393. });
  394. }
  395. [TestCase(0x3FE66666u, false, 0x3F800000u)]
  396. [TestCase(0x3F99999Au, false, 0x3F800000u)]
  397. [TestCase(0x404CCCCDu, false, 0x40400000u)]
  398. [TestCase(0x40733333u, false, 0x40400000u)]
  399. [TestCase(0x3fc00000u, false, 0x3F800000u)]
  400. [TestCase(0x40200000u, false, 0x40000000u)]
  401. [TestCase(0x00000000u, false, 0x00000000u)]
  402. [TestCase(0x00000000u, false, 0x00000000u)]
  403. [TestCase(0x00000000u, false, 0x00000000u)]
  404. [TestCase(0x00000000u, false, 0x00000000u)]
  405. [TestCase(0x80000000u, false, 0x80000000u)]
  406. [TestCase(0x80000000u, false, 0x80000000u)]
  407. [TestCase(0x80000000u, false, 0x80000000u)]
  408. [TestCase(0x80000000u, false, 0x80000000u)]
  409. [TestCase(0x7F800000u, false, 0x7F800000u)]
  410. [TestCase(0x7F800000u, false, 0x7F800000u)]
  411. [TestCase(0x7F800000u, false, 0x7F800000u)]
  412. [TestCase(0x7F800000u, false, 0x7F800000u)]
  413. [TestCase(0xFF800000u, false, 0xFF800000u)]
  414. [TestCase(0xFF800000u, false, 0xFF800000u)]
  415. [TestCase(0xFF800000u, false, 0xFF800000u)]
  416. [TestCase(0xFF800000u, false, 0xFF800000u)]
  417. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  418. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  419. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  420. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  421. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  422. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  423. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  424. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  425. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  426. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  427. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  428. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  429. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  430. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  431. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  432. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  433. public void Frintm_S(uint A, bool DefaultNaN, uint Result)
  434. {
  435. int FpcrTemp = 0x0;
  436. if(DefaultNaN)
  437. {
  438. FpcrTemp = 0x2000000;
  439. }
  440. Vector128<float> V1 = MakeVectorE0(A);
  441. AThreadState ThreadState = SingleOpcode(0x1E254020, V1: V1, Fpcr: FpcrTemp);
  442. Assert.AreEqual(Result, GetVectorE0(ThreadState.V0));
  443. }
  444. [TestCase(0x4E619820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  445. [TestCase(0x4E619820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  446. [TestCase(0x4E219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, false, 0x3f8000003f800000ul, 0x3f8000003f800000ul)]
  447. [TestCase(0xE219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, false, 0x3f8000003f800000ul, 0x0000000000000000ul)]
  448. [TestCase(0xE219820u, 0x0000000080000000ul, 0x0000000000000000ul, false, 0x0000000080000000ul, 0x0000000000000000ul)]
  449. [TestCase(0xE219820u, 0x7F800000FF800000ul, 0x0000000000000000ul, false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  450. [TestCase(0xE219820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  451. [TestCase(0xE219820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  452. public void Frintm_V(uint Opcode, ulong A, ulong B, bool DefaultNaN, ulong Result0, ulong Result1)
  453. {
  454. int FpcrTemp = 0x0;
  455. if(DefaultNaN)
  456. {
  457. FpcrTemp = 0x2000000;
  458. }
  459. Vector128<float> V1 = MakeVectorE0E1(A, B);
  460. AThreadState ThreadState = SingleOpcode(Opcode, V1: V1, Fpcr: FpcrTemp);
  461. Assert.Multiple(() =>
  462. {
  463. Assert.AreEqual(Result0, GetVectorE0(ThreadState.V0));
  464. Assert.AreEqual(Result1, GetVectorE1(ThreadState.V0));
  465. });
  466. }
  467. [TestCase(0x3FE66666u, false, 0x40000000u)]
  468. [TestCase(0x3F99999Au, false, 0x3F800000u)]
  469. [TestCase(0x404CCCCDu, false, 0x40400000u)]
  470. [TestCase(0x40733333u, false, 0x40800000u)]
  471. [TestCase(0x3fc00000u, false, 0x40000000u)]
  472. [TestCase(0x40200000u, false, 0x40400000u)]
  473. [TestCase(0x00000000u, false, 0x00000000u)]
  474. [TestCase(0x00000000u, false, 0x00000000u)]
  475. [TestCase(0x00000000u, false, 0x00000000u)]
  476. [TestCase(0x00000000u, false, 0x00000000u)]
  477. [TestCase(0x80000000u, false, 0x80000000u)]
  478. [TestCase(0x80000000u, false, 0x80000000u)]
  479. [TestCase(0x80000000u, false, 0x80000000u)]
  480. [TestCase(0x80000000u, false, 0x80000000u)]
  481. [TestCase(0x7F800000u, false, 0x7F800000u)]
  482. [TestCase(0x7F800000u, false, 0x7F800000u)]
  483. [TestCase(0x7F800000u, false, 0x7F800000u)]
  484. [TestCase(0x7F800000u, false, 0x7F800000u)]
  485. [TestCase(0xFF800000u, false, 0xFF800000u)]
  486. [TestCase(0xFF800000u, false, 0xFF800000u)]
  487. [TestCase(0xFF800000u, false, 0xFF800000u)]
  488. [TestCase(0xFF800000u, false, 0xFF800000u)]
  489. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  490. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  491. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  492. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  493. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  494. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  495. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  496. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  497. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  498. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  499. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  500. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  501. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  502. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  503. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  504. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  505. public void Frintn_S(uint A, bool DefaultNaN, uint Result)
  506. {
  507. int FpcrTemp = 0x0;
  508. if(DefaultNaN)
  509. {
  510. FpcrTemp = 0x2000000;
  511. }
  512. Vector128<float> V1 = MakeVectorE0(A);
  513. AThreadState ThreadState = SingleOpcode(0x1E264020, V1: V1, Fpcr: FpcrTemp);
  514. Assert.AreEqual(Result, GetVectorE0(ThreadState.V0));
  515. }
  516. [TestCase(0x4E618820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  517. [TestCase(0x4E618820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, false, 0x4000000000000000ul, 0x4000000000000000ul)]
  518. [TestCase(0x4E618820u, 0x3FF8000000000000ul, 0x3FF8000000000000ul, false, 0x4000000000000000ul, 0x4000000000000000ul)]
  519. [TestCase(0x4E218820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, false, 0x3f80000040000000ul, 0x3f80000040000000ul)]
  520. [TestCase(0x4E218820u, 0x3fc000003fc00000ul, 0x3fc000003fc00000ul, false, 0x4000000040000000ul, 0x4000000040000000ul)]
  521. [TestCase(0xE218820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, false, 0x3f80000040000000ul, 0x0000000000000000ul)]
  522. [TestCase(0xE218820u, 0x3fc000003fc00000ul, 0x3fc000003fc00000ul, false, 0x4000000040000000ul, 0x0000000000000000ul)]
  523. [TestCase(0xE218820u, 0x0000000080000000ul, 0x0000000000000000ul, false, 0x0000000080000000ul, 0x0000000000000000ul)]
  524. [TestCase(0xE218820u, 0x7F800000FF800000ul, 0x0000000000000000ul, false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  525. [TestCase(0xE218820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  526. [TestCase(0xE218820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  527. public void Frintn_V(uint Opcode, ulong A, ulong B, bool DefaultNaN, ulong Result0, ulong Result1)
  528. {
  529. int FpcrTemp = 0x0;
  530. if(DefaultNaN)
  531. {
  532. FpcrTemp = 0x2000000;
  533. }
  534. Vector128<float> V1 = MakeVectorE0E1(A, B);
  535. AThreadState ThreadState = SingleOpcode(Opcode, V1: V1, Fpcr: FpcrTemp);
  536. Assert.Multiple(() =>
  537. {
  538. Assert.AreEqual(Result0, GetVectorE0(ThreadState.V0));
  539. Assert.AreEqual(Result1, GetVectorE1(ThreadState.V0));
  540. });
  541. }
  542. [TestCase(0x3FE66666u, false, 0x40000000u)]
  543. [TestCase(0x3F99999Au, false, 0x40000000u)]
  544. [TestCase(0x404CCCCDu, false, 0x40800000u)]
  545. [TestCase(0x40733333u, false, 0x40800000u)]
  546. [TestCase(0x3fc00000u, false, 0x40000000u)]
  547. [TestCase(0x40200000u, false, 0x40400000u)]
  548. [TestCase(0x00000000u, false, 0x00000000u)]
  549. [TestCase(0x00000000u, false, 0x00000000u)]
  550. [TestCase(0x00000000u, false, 0x00000000u)]
  551. [TestCase(0x00000000u, false, 0x00000000u)]
  552. [TestCase(0x80000000u, false, 0x80000000u)]
  553. [TestCase(0x80000000u, false, 0x80000000u)]
  554. [TestCase(0x80000000u, false, 0x80000000u)]
  555. [TestCase(0x80000000u, false, 0x80000000u)]
  556. [TestCase(0x7F800000u, false, 0x7F800000u)]
  557. [TestCase(0x7F800000u, false, 0x7F800000u)]
  558. [TestCase(0x7F800000u, false, 0x7F800000u)]
  559. [TestCase(0x7F800000u, false, 0x7F800000u)]
  560. [TestCase(0xFF800000u, false, 0xFF800000u)]
  561. [TestCase(0xFF800000u, false, 0xFF800000u)]
  562. [TestCase(0xFF800000u, false, 0xFF800000u)]
  563. [TestCase(0xFF800000u, false, 0xFF800000u)]
  564. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  565. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  566. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  567. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  568. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  569. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  570. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  571. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  572. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  573. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  574. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  575. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  576. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  577. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  578. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  579. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  580. public void Frintp_S(uint A, bool DefaultNaN, uint Result)
  581. {
  582. int FpcrTemp = 0x0;
  583. if(DefaultNaN)
  584. {
  585. FpcrTemp = 0x2000000;
  586. }
  587. Vector128<float> V1 = MakeVectorE0(A);
  588. AThreadState ThreadState = SingleOpcode(0x1E24C020, V1: V1, Fpcr: FpcrTemp);
  589. Assert.AreEqual(Result, GetVectorE0(ThreadState.V0));
  590. }
  591. [TestCase(0x4EE18820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, false, 0x4000000000000000ul, 0x4000000000000000ul)]
  592. [TestCase(0x4EE18820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, false, 0x4000000000000000ul, 0x4000000000000000ul)]
  593. [TestCase(0x4EA18820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, false, 0x4000000040000000ul, 0x4000000040000000ul)]
  594. [TestCase(0xEA18820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, false, 0x4000000040000000ul, 0x0000000000000000ul)]
  595. [TestCase(0xEA18820u, 0x0000000080000000ul, 0x0000000000000000ul, false, 0x0000000080000000ul, 0x0000000000000000ul)]
  596. [TestCase(0xEA18820u, 0x7F800000FF800000ul, 0x0000000000000000ul, false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  597. [TestCase(0xEA18820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  598. [TestCase(0xEA18820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  599. public void Frintp_V(uint Opcode, ulong A, ulong B, bool DefaultNaN, ulong Result0, ulong Result1)
  600. {
  601. int FpcrTemp = 0x0;
  602. if(DefaultNaN)
  603. {
  604. FpcrTemp = 0x2000000;
  605. }
  606. Vector128<float> V1 = MakeVectorE0E1(A, B);
  607. AThreadState ThreadState = SingleOpcode(Opcode, V1: V1, Fpcr: FpcrTemp);
  608. Assert.Multiple(() =>
  609. {
  610. Assert.AreEqual(Result0, GetVectorE0(ThreadState.V0));
  611. Assert.AreEqual(Result1, GetVectorE1(ThreadState.V0));
  612. });
  613. }
  614. [TestCase(0x3FE66666u, 'N', false, 0x40000000u)]
  615. [TestCase(0x3F99999Au, 'N', false, 0x3F800000u)]
  616. [TestCase(0x404CCCCDu, 'P', false, 0x40800000u)]
  617. [TestCase(0x40733333u, 'P', false, 0x40800000u)]
  618. [TestCase(0x404CCCCDu, 'M', false, 0x40400000u)]
  619. [TestCase(0x40733333u, 'M', false, 0x40400000u)]
  620. [TestCase(0x3F99999Au, 'Z', false, 0x3F800000u)]
  621. [TestCase(0x3FE66666u, 'Z', false, 0x3F800000u)]
  622. [TestCase(0x00000000u, 'N', false, 0x00000000u)]
  623. [TestCase(0x00000000u, 'P', false, 0x00000000u)]
  624. [TestCase(0x00000000u, 'M', false, 0x00000000u)]
  625. [TestCase(0x00000000u, 'Z', false, 0x00000000u)]
  626. [TestCase(0x80000000u, 'N', false, 0x80000000u)]
  627. [TestCase(0x80000000u, 'P', false, 0x80000000u)]
  628. [TestCase(0x80000000u, 'M', false, 0x80000000u)]
  629. [TestCase(0x80000000u, 'Z', false, 0x80000000u)]
  630. [TestCase(0x7F800000u, 'N', false, 0x7F800000u)]
  631. [TestCase(0x7F800000u, 'P', false, 0x7F800000u)]
  632. [TestCase(0x7F800000u, 'M', false, 0x7F800000u)]
  633. [TestCase(0x7F800000u, 'Z', false, 0x7F800000u)]
  634. [TestCase(0xFF800000u, 'N', false, 0xFF800000u)]
  635. [TestCase(0xFF800000u, 'P', false, 0xFF800000u)]
  636. [TestCase(0xFF800000u, 'M', false, 0xFF800000u)]
  637. [TestCase(0xFF800000u, 'Z', false, 0xFF800000u)]
  638. [TestCase(0xFF800001u, 'N', false, 0xFFC00001u, Ignore = "NaN test.")]
  639. [TestCase(0xFF800001u, 'P', false, 0xFFC00001u, Ignore = "NaN test.")]
  640. [TestCase(0xFF800001u, 'M', false, 0xFFC00001u, Ignore = "NaN test.")]
  641. [TestCase(0xFF800001u, 'Z', false, 0xFFC00001u, Ignore = "NaN test.")]
  642. [TestCase(0xFF800001u, 'N', true, 0x7FC00000u, Ignore = "NaN test.")]
  643. [TestCase(0xFF800001u, 'P', true, 0x7FC00000u, Ignore = "NaN test.")]
  644. [TestCase(0xFF800001u, 'M', true, 0x7FC00000u, Ignore = "NaN test.")]
  645. [TestCase(0xFF800001u, 'Z', true, 0x7FC00000u, Ignore = "NaN test.")]
  646. [TestCase(0x7FC00002u, 'N', false, 0x7FC00002u, Ignore = "NaN test.")]
  647. [TestCase(0x7FC00002u, 'P', false, 0x7FC00002u, Ignore = "NaN test.")]
  648. [TestCase(0x7FC00002u, 'M', false, 0x7FC00002u, Ignore = "NaN test.")]
  649. [TestCase(0x7FC00002u, 'Z', false, 0x7FC00002u, Ignore = "NaN test.")]
  650. [TestCase(0x7FC00002u, 'N', true, 0x7FC00000u, Ignore = "NaN test.")]
  651. [TestCase(0x7FC00002u, 'P', true, 0x7FC00000u, Ignore = "NaN test.")]
  652. [TestCase(0x7FC00002u, 'M', true, 0x7FC00000u, Ignore = "NaN test.")]
  653. [TestCase(0x7FC00002u, 'Z', true, 0x7FC00000u, Ignore = "NaN test.")]
  654. public void Frintx_S(uint A, char RoundType, bool DefaultNaN, uint Result)
  655. {
  656. int FpcrTemp = 0x0;
  657. switch(RoundType)
  658. {
  659. case 'N':
  660. FpcrTemp = 0x0;
  661. break;
  662. case 'P':
  663. FpcrTemp = 0x400000;
  664. break;
  665. case 'M':
  666. FpcrTemp = 0x800000;
  667. break;
  668. case 'Z':
  669. FpcrTemp = 0xC00000;
  670. break;
  671. }
  672. if(DefaultNaN)
  673. {
  674. FpcrTemp |= 1 << 25;
  675. }
  676. Vector128<float> V1 = MakeVectorE0(A);
  677. AThreadState ThreadState = SingleOpcode(0x1E274020, V1: V1, Fpcr: FpcrTemp);
  678. Assert.AreEqual(Result, GetVectorE0(ThreadState.V0));
  679. }
  680. [TestCase(0x6E619820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, 'N', false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  681. [TestCase(0x6E619820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, 'N', false, 0x4000000000000000ul, 0x4000000000000000ul)]
  682. [TestCase(0x6E619820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, 'P', false, 0x4000000000000000ul, 0x4000000000000000ul)]
  683. [TestCase(0x6E619820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, 'P', false, 0x4000000000000000ul, 0x4000000000000000ul)]
  684. [TestCase(0x6E619820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, 'M', false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  685. [TestCase(0x6E619820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, 'M', false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  686. [TestCase(0x6E619820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, 'Z', false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  687. [TestCase(0x6E619820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, 'Z', false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  688. [TestCase(0x6E219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'N', false, 0x3f80000040000000ul, 0x3f80000040000000ul)]
  689. [TestCase(0x6E219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'P', false, 0x4000000040000000ul, 0x4000000040000000ul)]
  690. [TestCase(0x6E219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'M', false, 0x3f8000003f800000ul, 0x3f8000003f800000ul)]
  691. [TestCase(0x6E219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'Z', false, 0x3f8000003f800000ul, 0x3f8000003f800000ul)]
  692. [TestCase(0x2E219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'N', false, 0x3f80000040000000ul, 0x0000000000000000ul)]
  693. [TestCase(0x2E219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'P', false, 0x4000000040000000ul, 0x0000000000000000ul)]
  694. [TestCase(0x2E219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'M', false, 0x3f8000003f800000ul, 0x0000000000000000ul)]
  695. [TestCase(0x2E219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'Z', false, 0x3f8000003f800000ul, 0x0000000000000000ul)]
  696. [TestCase(0x2E219820u, 0x0000000080000000ul, 0x0000000000000000ul, 'N', false, 0x0000000080000000ul, 0x0000000000000000ul)]
  697. [TestCase(0x2E219820u, 0x0000000080000000ul, 0x0000000000000000ul, 'P', false, 0x0000000080000000ul, 0x0000000000000000ul)]
  698. [TestCase(0x2E219820u, 0x0000000080000000ul, 0x0000000000000000ul, 'M', false, 0x0000000080000000ul, 0x0000000000000000ul)]
  699. [TestCase(0x2E219820u, 0x0000000080000000ul, 0x0000000000000000ul, 'Z', false, 0x0000000080000000ul, 0x0000000000000000ul)]
  700. [TestCase(0x2E219820u, 0x7F800000FF800000ul, 0x0000000000000000ul, 'N', false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  701. [TestCase(0x2E219820u, 0x7F800000FF800000ul, 0x0000000000000000ul, 'P', false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  702. [TestCase(0x2E219820u, 0x7F800000FF800000ul, 0x0000000000000000ul, 'M', false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  703. [TestCase(0x2E219820u, 0x7F800000FF800000ul, 0x0000000000000000ul, 'Z', false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  704. [TestCase(0x2E219820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'N', false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  705. [TestCase(0x2E219820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'P', false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  706. [TestCase(0x2E219820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'M', false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  707. [TestCase(0x2E219820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'Z', false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  708. [TestCase(0x2E219820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'N', true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  709. [TestCase(0x2E219820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'P', true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  710. [TestCase(0x2E219820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'M', true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  711. [TestCase(0x2E219820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'Z', true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  712. public void Frintx_V(uint Opcode, ulong A, ulong B, char RoundType, bool DefaultNaN, ulong Result0, ulong Result1)
  713. {
  714. int FpcrTemp = 0x0;
  715. switch(RoundType)
  716. {
  717. case 'N':
  718. FpcrTemp = 0x0;
  719. break;
  720. case 'P':
  721. FpcrTemp = 0x400000;
  722. break;
  723. case 'M':
  724. FpcrTemp = 0x800000;
  725. break;
  726. case 'Z':
  727. FpcrTemp = 0xC00000;
  728. break;
  729. }
  730. if(DefaultNaN)
  731. {
  732. FpcrTemp |= 1 << 25;
  733. }
  734. Vector128<float> V1 = MakeVectorE0E1(A, B);
  735. AThreadState ThreadState = SingleOpcode(Opcode, V1: V1, Fpcr: FpcrTemp);
  736. Assert.Multiple(() =>
  737. {
  738. Assert.AreEqual(Result0, GetVectorE0(ThreadState.V0));
  739. Assert.AreEqual(Result1, GetVectorE1(ThreadState.V0));
  740. });
  741. }
  742. [TestCase(0x41200000u, 0x3EA18000u)]
  743. public void Frsqrte_S(uint A, uint Result)
  744. {
  745. Vector128<float> V1 = MakeVectorE0(A);
  746. AThreadState ThreadState = SingleOpcode(0x7EA1D820, V1: V1);
  747. Assert.AreEqual(Result, GetVectorE0(ThreadState.V0));
  748. }
  749. }
  750. }