CpuTestSimdArithmetic.cs 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
  1. using ChocolArm64.State;
  2. using NUnit.Framework;
  3. namespace Ryujinx.Tests.Cpu
  4. {
  5. public class CpuTestSimdArithmetic : CpuTest
  6. {
  7. [TestCase(0xE228420u, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul)]
  8. [TestCase(0xE228420u, 0x00000000FFFFFFFFul, 0x00000000FFFFFFFFul, 0x0000000000000001ul, 0x0000000000000001ul, 0x00000000FFFFFF00ul, 0x0000000000000000ul)]
  9. [TestCase(0xE228420u, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFEFEFEFEFEFEFEFEul, 0x0000000000000000ul)]
  10. [TestCase(0xE228420u, 0x0102030405060708ul, 0xAAAAAAAAAAAAAAAAul, 0x0807060504030201ul, 0x2222222222222222ul, 0x0909090909090909ul, 0x0000000000000000ul)]
  11. [TestCase(0x4E228420u, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul)]
  12. [TestCase(0x4E228420u, 0x00000000FFFFFFFFul, 0x00000000FFFFFFFFul, 0x0000000000000001ul, 0x0000000000000001ul, 0x00000000FFFFFF00ul, 0x00000000FFFFFF00ul)]
  13. [TestCase(0x4E228420u, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFEFEFEFEFEFEFEFEul, 0xFEFEFEFEFEFEFEFEul)]
  14. [TestCase(0x4E228420u, 0x0102030405060708ul, 0xAAAAAAAAAAAAAAAAul, 0x0807060504030201ul, 0x2222222222222222ul, 0x0909090909090909ul, 0xCCCCCCCCCCCCCCCCul)]
  15. [TestCase(0xE628420u, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul)]
  16. [TestCase(0xE628420u, 0x00000000FFFFFFFFul, 0x00000000FFFFFFFFul, 0x0000000000000001ul, 0x0000000000000001ul, 0x00000000FFFF0000ul, 0x0000000000000000ul)]
  17. [TestCase(0xE628420u, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFEFFFEFFFEFFFEul, 0x0000000000000000ul)]
  18. [TestCase(0xE628420u, 0x0102030405060708ul, 0xAAAAAAAAAAAAAAAAul, 0x0807060504030201ul, 0x2222222222222222ul, 0x0909090909090909ul, 0x0000000000000000ul)]
  19. [TestCase(0x4E628420u, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul)]
  20. [TestCase(0x4E628420u, 0x00000000FFFFFFFFul, 0x00000000FFFFFFFFul, 0x0000000000000001ul, 0x0000000000000001ul, 0x00000000FFFF0000ul, 0x00000000FFFF0000ul)]
  21. [TestCase(0x4E628420u, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFEFFFEFFFEFFFEul, 0xFFFEFFFEFFFEFFFEul)]
  22. [TestCase(0x4E628420u, 0x0102030405060708ul, 0xAAAAAAAAAAAAAAAAul, 0x0807060504030201ul, 0x2222222222222222ul, 0x0909090909090909ul, 0xCCCCCCCCCCCCCCCCul)]
  23. [TestCase(0xEA28420u, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul)]
  24. [TestCase(0xEA28420u, 0x00000000FFFFFFFFul, 0x00000000FFFFFFFFul, 0x0000000000000001ul, 0x0000000000000001ul, 0x0000000000000000ul, 0x0000000000000000ul)]
  25. [TestCase(0xEA28420u, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFEFFFFFFFEul, 0x0000000000000000ul)]
  26. [TestCase(0xEA28420u, 0x0102030405060708ul, 0xAAAAAAAAAAAAAAAAul, 0x0807060504030201ul, 0x2222222222222222ul, 0x0909090909090909ul, 0x0000000000000000ul)]
  27. [TestCase(0x4EA28420u, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul)]
  28. [TestCase(0x4EA28420u, 0x00000000FFFFFFFFul, 0x00000000FFFFFFFFul, 0x0000000000000001ul, 0x0000000000000001ul, 0x0000000000000000ul, 0x0000000000000000ul)]
  29. [TestCase(0x4EA28420u, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFEFFFFFFFEul, 0xFFFFFFFEFFFFFFFEul)]
  30. [TestCase(0x4EA28420u, 0x0102030405060708ul, 0xAAAAAAAAAAAAAAAAul, 0x0807060504030201ul, 0x2222222222222222ul, 0x0909090909090909ul, 0xCCCCCCCCCCCCCCCCul)]
  31. [TestCase(0x4EE28420u, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul, 0x0000000000000000ul)]
  32. [TestCase(0x4EE28420u, 0x00000000FFFFFFFFul, 0x00000000FFFFFFFFul, 0x0000000000000001ul, 0x0000000000000001ul, 0x0000000100000000ul, 0x0000000100000000ul)]
  33. [TestCase(0x4EE28420u, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFEul, 0xFFFFFFFFFFFFFFFEul)]
  34. [TestCase(0x4EE28420u, 0x0102030405060708ul, 0xAAAAAAAAAAAAAAAAul, 0x0807060504030201ul, 0x2222222222222222ul, 0x0909090909090909ul, 0xCCCCCCCCCCCCCCCCul)]
  35. public void Add_V(uint Opcode, ulong A0, ulong A1, ulong B0, ulong B1, ulong Result0, ulong Result1)
  36. {
  37. AVec V1 = new AVec { X0 = A0, X1 = A1 };
  38. AVec V2 = new AVec { X0 = B0, X1 = B1 };
  39. AThreadState ThreadState = SingleOpcode(Opcode, V1: V1, V2: V2);
  40. Assert.Multiple(() =>
  41. {
  42. Assert.AreEqual(Result0, ThreadState.V0.X0);
  43. Assert.AreEqual(Result1, ThreadState.V0.X1);
  44. });
  45. }
  46. [TestCase(0x3FE66666u, false, 0x40000000u)]
  47. [TestCase(0x3F99999Au, false, 0x3F800000u)]
  48. [TestCase(0x404CCCCDu, false, 0x40400000u)]
  49. [TestCase(0x40733333u, false, 0x40800000u)]
  50. [TestCase(0x3fc00000u, false, 0x40000000u)]
  51. [TestCase(0x40200000u, false, 0x40400000u)]
  52. [TestCase(0x00000000u, false, 0x00000000u)]
  53. [TestCase(0x00000000u, false, 0x00000000u)]
  54. [TestCase(0x00000000u, false, 0x00000000u)]
  55. [TestCase(0x00000000u, false, 0x00000000u)]
  56. [TestCase(0x80000000u, false, 0x80000000u)]
  57. [TestCase(0x80000000u, false, 0x80000000u)]
  58. [TestCase(0x80000000u, false, 0x80000000u)]
  59. [TestCase(0x80000000u, false, 0x80000000u)]
  60. [TestCase(0x7F800000u, false, 0x7F800000u)]
  61. [TestCase(0x7F800000u, false, 0x7F800000u)]
  62. [TestCase(0x7F800000u, false, 0x7F800000u)]
  63. [TestCase(0x7F800000u, false, 0x7F800000u)]
  64. [TestCase(0xFF800000u, false, 0xFF800000u)]
  65. [TestCase(0xFF800000u, false, 0xFF800000u)]
  66. [TestCase(0xFF800000u, false, 0xFF800000u)]
  67. [TestCase(0xFF800000u, false, 0xFF800000u)]
  68. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  69. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  70. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  71. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  72. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  73. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  74. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  75. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  76. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  77. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  78. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  79. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  80. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  81. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  82. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  83. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  84. public void Frinta_S(uint A, bool DefaultNaN, uint Result)
  85. {
  86. int FpcrTemp = 0x0;
  87. if(DefaultNaN)
  88. {
  89. FpcrTemp = 0x2000000;
  90. }
  91. AVec V1 = new AVec { X0 = A };
  92. AThreadState ThreadState = SingleOpcode(0x1E264020, V1: V1, Fpcr: FpcrTemp);
  93. Assert.AreEqual(Result, ThreadState.V0.X0);
  94. }
  95. [TestCase(0x6E618820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  96. [TestCase(0x6E618820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, false, 0x4000000000000000ul, 0x4000000000000000ul)]
  97. [TestCase(0x6E618820u, 0x3FF8000000000000ul, 0x3FF8000000000000ul, false, 0x4000000000000000ul, 0x4000000000000000ul)]
  98. [TestCase(0x6E219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, false, 0x3f80000040000000ul, 0x3f80000040000000ul)]
  99. [TestCase(0x6E219820u, 0x3fc000003fc00000ul, 0x3fc000003fc00000ul, false, 0x4000000040000000ul, 0x4000000040000000ul)]
  100. [TestCase(0x2E219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, false, 0x3f80000040000000ul, 0x0000000000000000ul)]
  101. [TestCase(0x2E219820u, 0x3fc000003fc00000ul, 0x3fc000003fc00000ul, false, 0x4000000040000000ul, 0x0000000000000000ul)]
  102. [TestCase(0x2E218820u, 0x0000000080000000ul, 0x0000000000000000ul, false, 0x0000000080000000ul, 0x0000000000000000ul)]
  103. [TestCase(0x2E218820u, 0x7F800000FF800000ul, 0x0000000000000000ul, false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  104. [TestCase(0x2E218820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  105. [TestCase(0x2E218820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  106. public void Frinta_V(uint Opcode, ulong A, ulong B, bool DefaultNaN, ulong Result0, ulong Result1)
  107. {
  108. int FpcrTemp = 0x0;
  109. if(DefaultNaN)
  110. {
  111. FpcrTemp = 0x2000000;
  112. }
  113. AVec V1 = new AVec { X0 = A, X1 = B };
  114. AThreadState ThreadState = SingleOpcode(Opcode, V1: V1, Fpcr: FpcrTemp);
  115. Assert.Multiple(() =>
  116. {
  117. Assert.AreEqual(Result0, ThreadState.V0.X0);
  118. Assert.AreEqual(Result1, ThreadState.V0.X1);
  119. });
  120. }
  121. [TestCase(0x3FE66666u, 'N', false, 0x40000000u)]
  122. [TestCase(0x3F99999Au, 'N', false, 0x3F800000u)]
  123. [TestCase(0x404CCCCDu, 'P', false, 0x40800000u)]
  124. [TestCase(0x40733333u, 'P', false, 0x40800000u)]
  125. [TestCase(0x404CCCCDu, 'M', false, 0x40400000u)]
  126. [TestCase(0x40733333u, 'M', false, 0x40400000u)]
  127. [TestCase(0x3F99999Au, 'Z', false, 0x3F800000u)]
  128. [TestCase(0x3FE66666u, 'Z', false, 0x3F800000u)]
  129. [TestCase(0x00000000u, 'N', false, 0x00000000u)]
  130. [TestCase(0x00000000u, 'P', false, 0x00000000u)]
  131. [TestCase(0x00000000u, 'M', false, 0x00000000u)]
  132. [TestCase(0x00000000u, 'Z', false, 0x00000000u)]
  133. [TestCase(0x80000000u, 'N', false, 0x80000000u)]
  134. [TestCase(0x80000000u, 'P', false, 0x80000000u)]
  135. [TestCase(0x80000000u, 'M', false, 0x80000000u)]
  136. [TestCase(0x80000000u, 'Z', false, 0x80000000u)]
  137. [TestCase(0x7F800000u, 'N', false, 0x7F800000u)]
  138. [TestCase(0x7F800000u, 'P', false, 0x7F800000u)]
  139. [TestCase(0x7F800000u, 'M', false, 0x7F800000u)]
  140. [TestCase(0x7F800000u, 'Z', false, 0x7F800000u)]
  141. [TestCase(0xFF800000u, 'N', false, 0xFF800000u)]
  142. [TestCase(0xFF800000u, 'P', false, 0xFF800000u)]
  143. [TestCase(0xFF800000u, 'M', false, 0xFF800000u)]
  144. [TestCase(0xFF800000u, 'Z', false, 0xFF800000u)]
  145. [TestCase(0xFF800001u, 'N', false, 0xFFC00001u, Ignore = "NaN test.")]
  146. [TestCase(0xFF800001u, 'P', false, 0xFFC00001u, Ignore = "NaN test.")]
  147. [TestCase(0xFF800001u, 'M', false, 0xFFC00001u, Ignore = "NaN test.")]
  148. [TestCase(0xFF800001u, 'Z', false, 0xFFC00001u, Ignore = "NaN test.")]
  149. [TestCase(0xFF800001u, 'N', true, 0x7FC00000u, Ignore = "NaN test.")]
  150. [TestCase(0xFF800001u, 'P', true, 0x7FC00000u, Ignore = "NaN test.")]
  151. [TestCase(0xFF800001u, 'M', true, 0x7FC00000u, Ignore = "NaN test.")]
  152. [TestCase(0xFF800001u, 'Z', true, 0x7FC00000u, Ignore = "NaN test.")]
  153. [TestCase(0x7FC00002u, 'N', false, 0x7FC00002u, Ignore = "NaN test.")]
  154. [TestCase(0x7FC00002u, 'P', false, 0x7FC00002u, Ignore = "NaN test.")]
  155. [TestCase(0x7FC00002u, 'M', false, 0x7FC00002u, Ignore = "NaN test.")]
  156. [TestCase(0x7FC00002u, 'Z', false, 0x7FC00002u, Ignore = "NaN test.")]
  157. [TestCase(0x7FC00002u, 'N', true, 0x7FC00000u, Ignore = "NaN test.")]
  158. [TestCase(0x7FC00002u, 'P', true, 0x7FC00000u, Ignore = "NaN test.")]
  159. [TestCase(0x7FC00002u, 'M', true, 0x7FC00000u, Ignore = "NaN test.")]
  160. [TestCase(0x7FC00002u, 'Z', true, 0x7FC00000u, Ignore = "NaN test.")]
  161. public void Frinti_S(uint A, char RoundType, bool DefaultNaN, uint Result)
  162. {
  163. int FpcrTemp = 0x0;
  164. switch(RoundType)
  165. {
  166. case 'N':
  167. FpcrTemp = 0x0;
  168. break;
  169. case 'P':
  170. FpcrTemp = 0x400000;
  171. break;
  172. case 'M':
  173. FpcrTemp = 0x800000;
  174. break;
  175. case 'Z':
  176. FpcrTemp = 0xC00000;
  177. break;
  178. }
  179. if(DefaultNaN)
  180. {
  181. FpcrTemp |= 1 << 25;
  182. }
  183. AVec V1 = new AVec { X0 = A };
  184. AThreadState ThreadState = SingleOpcode(0x1E27C020, V1: V1, Fpcr: FpcrTemp);
  185. Assert.AreEqual(Result, ThreadState.V0.X0);
  186. }
  187. [TestCase(0x6EE19820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, 'N', false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  188. [TestCase(0x6EE19820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, 'N', false, 0x4000000000000000ul, 0x4000000000000000ul)]
  189. [TestCase(0x6EE19820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, 'P', false, 0x4000000000000000ul, 0x4000000000000000ul)]
  190. [TestCase(0x6EE19820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, 'P', false, 0x4000000000000000ul, 0x4000000000000000ul)]
  191. [TestCase(0x6EE19820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, 'M', false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  192. [TestCase(0x6EE19820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, 'M', false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  193. [TestCase(0x6EE19820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, 'Z', false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  194. [TestCase(0x6EE19820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, 'Z', false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  195. [TestCase(0x6EA19820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'N', false, 0x3f80000040000000ul, 0x3f80000040000000ul)]
  196. [TestCase(0x6EA19820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'P', false, 0x4000000040000000ul, 0x4000000040000000ul)]
  197. [TestCase(0x6EA19820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'M', false, 0x3f8000003f800000ul, 0x3f8000003f800000ul)]
  198. [TestCase(0x6EA19820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'Z', false, 0x3f8000003f800000ul, 0x3f8000003f800000ul)]
  199. [TestCase(0x2EA19820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'N', false, 0x3f80000040000000ul, 0x0000000000000000ul)]
  200. [TestCase(0x2EA19820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'P', false, 0x4000000040000000ul, 0x0000000000000000ul)]
  201. [TestCase(0x2EA19820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'M', false, 0x3f8000003f800000ul, 0x0000000000000000ul)]
  202. [TestCase(0x2EA19820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'Z', false, 0x3f8000003f800000ul, 0x0000000000000000ul)]
  203. [TestCase(0x2EA19820u, 0x0000000080000000ul, 0x0000000000000000ul, 'N', false, 0x0000000080000000ul, 0x0000000000000000ul)]
  204. [TestCase(0x2EA19820u, 0x0000000080000000ul, 0x0000000000000000ul, 'P', false, 0x0000000080000000ul, 0x0000000000000000ul)]
  205. [TestCase(0x2EA19820u, 0x0000000080000000ul, 0x0000000000000000ul, 'M', false, 0x0000000080000000ul, 0x0000000000000000ul)]
  206. [TestCase(0x2EA19820u, 0x0000000080000000ul, 0x0000000000000000ul, 'Z', false, 0x0000000080000000ul, 0x0000000000000000ul)]
  207. [TestCase(0x2EA19820u, 0x7F800000FF800000ul, 0x0000000000000000ul, 'N', false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  208. [TestCase(0x2EA19820u, 0x7F800000FF800000ul, 0x0000000000000000ul, 'P', false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  209. [TestCase(0x2EA19820u, 0x7F800000FF800000ul, 0x0000000000000000ul, 'M', false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  210. [TestCase(0x2EA19820u, 0x7F800000FF800000ul, 0x0000000000000000ul, 'Z', false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  211. [TestCase(0x2EA19820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'N', false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  212. [TestCase(0x2EA19820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'P', false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  213. [TestCase(0x2EA19820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'M', false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  214. [TestCase(0x2EA19820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'Z', false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  215. [TestCase(0x2EA19820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'N', true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  216. [TestCase(0x2EA19820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'P', true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  217. [TestCase(0x2EA19820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'M', true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  218. [TestCase(0x2EA19820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'Z', true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  219. public void Frinti_V(uint Opcode, ulong A, ulong B, char RoundType, bool DefaultNaN, ulong Result0, ulong Result1)
  220. {
  221. int FpcrTemp = 0x0;
  222. switch(RoundType)
  223. {
  224. case 'N':
  225. FpcrTemp = 0x0;
  226. break;
  227. case 'P':
  228. FpcrTemp = 0x400000;
  229. break;
  230. case 'M':
  231. FpcrTemp = 0x800000;
  232. break;
  233. case 'Z':
  234. FpcrTemp = 0xC00000;
  235. break;
  236. }
  237. if(DefaultNaN)
  238. {
  239. FpcrTemp |= 1 << 25;
  240. }
  241. AVec V1 = new AVec { X0 = A, X1 = B };
  242. AThreadState ThreadState = SingleOpcode(Opcode, V1: V1, Fpcr: FpcrTemp);
  243. Assert.Multiple(() =>
  244. {
  245. Assert.AreEqual(Result0, ThreadState.V0.X0);
  246. Assert.AreEqual(Result1, ThreadState.V0.X1);
  247. });
  248. }
  249. [TestCase(0x3FE66666u, false, 0x3F800000u)]
  250. [TestCase(0x3F99999Au, false, 0x3F800000u)]
  251. [TestCase(0x404CCCCDu, false, 0x40400000u)]
  252. [TestCase(0x40733333u, false, 0x40400000u)]
  253. [TestCase(0x3fc00000u, false, 0x3F800000u)]
  254. [TestCase(0x40200000u, false, 0x40000000u)]
  255. [TestCase(0x00000000u, false, 0x00000000u)]
  256. [TestCase(0x00000000u, false, 0x00000000u)]
  257. [TestCase(0x00000000u, false, 0x00000000u)]
  258. [TestCase(0x00000000u, false, 0x00000000u)]
  259. [TestCase(0x80000000u, false, 0x80000000u)]
  260. [TestCase(0x80000000u, false, 0x80000000u)]
  261. [TestCase(0x80000000u, false, 0x80000000u)]
  262. [TestCase(0x80000000u, false, 0x80000000u)]
  263. [TestCase(0x7F800000u, false, 0x7F800000u)]
  264. [TestCase(0x7F800000u, false, 0x7F800000u)]
  265. [TestCase(0x7F800000u, false, 0x7F800000u)]
  266. [TestCase(0x7F800000u, false, 0x7F800000u)]
  267. [TestCase(0xFF800000u, false, 0xFF800000u)]
  268. [TestCase(0xFF800000u, false, 0xFF800000u)]
  269. [TestCase(0xFF800000u, false, 0xFF800000u)]
  270. [TestCase(0xFF800000u, false, 0xFF800000u)]
  271. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  272. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  273. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  274. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  275. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  276. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  277. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  278. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  279. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  280. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  281. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  282. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  283. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  284. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  285. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  286. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  287. public void Frintm_S(uint A, bool DefaultNaN, uint Result)
  288. {
  289. int FpcrTemp = 0x0;
  290. if(DefaultNaN)
  291. {
  292. FpcrTemp = 0x2000000;
  293. }
  294. AVec V1 = new AVec { X0 = A };
  295. AThreadState ThreadState = SingleOpcode(0x1E254020, V1: V1, Fpcr: FpcrTemp);
  296. Assert.AreEqual(Result, ThreadState.V0.X0);
  297. }
  298. [TestCase(0x4E619820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  299. [TestCase(0x4E619820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  300. [TestCase(0x4E219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, false, 0x3f8000003f800000ul, 0x3f8000003f800000ul)]
  301. [TestCase(0xE219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, false, 0x3f8000003f800000ul, 0x0000000000000000ul)]
  302. [TestCase(0xE219820u, 0x0000000080000000ul, 0x0000000000000000ul, false, 0x0000000080000000ul, 0x0000000000000000ul)]
  303. [TestCase(0xE219820u, 0x7F800000FF800000ul, 0x0000000000000000ul, false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  304. [TestCase(0xE219820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  305. [TestCase(0xE219820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  306. public void Frintm_V(uint Opcode, ulong A, ulong B, bool DefaultNaN, ulong Result0, ulong Result1)
  307. {
  308. int FpcrTemp = 0x0;
  309. if(DefaultNaN)
  310. {
  311. FpcrTemp = 0x2000000;
  312. }
  313. AVec V1 = new AVec { X0 = A, X1 = B };
  314. AThreadState ThreadState = SingleOpcode(Opcode, V1: V1, Fpcr: FpcrTemp);
  315. Assert.Multiple(() =>
  316. {
  317. Assert.AreEqual(Result0, ThreadState.V0.X0);
  318. Assert.AreEqual(Result1, ThreadState.V0.X1);
  319. });
  320. }
  321. [TestCase(0x3FE66666u, false, 0x40000000u)]
  322. [TestCase(0x3F99999Au, false, 0x3F800000u)]
  323. [TestCase(0x404CCCCDu, false, 0x40400000u)]
  324. [TestCase(0x40733333u, false, 0x40800000u)]
  325. [TestCase(0x3fc00000u, false, 0x40000000u)]
  326. [TestCase(0x40200000u, false, 0x40400000u)]
  327. [TestCase(0x00000000u, false, 0x00000000u)]
  328. [TestCase(0x00000000u, false, 0x00000000u)]
  329. [TestCase(0x00000000u, false, 0x00000000u)]
  330. [TestCase(0x00000000u, false, 0x00000000u)]
  331. [TestCase(0x80000000u, false, 0x80000000u)]
  332. [TestCase(0x80000000u, false, 0x80000000u)]
  333. [TestCase(0x80000000u, false, 0x80000000u)]
  334. [TestCase(0x80000000u, false, 0x80000000u)]
  335. [TestCase(0x7F800000u, false, 0x7F800000u)]
  336. [TestCase(0x7F800000u, false, 0x7F800000u)]
  337. [TestCase(0x7F800000u, false, 0x7F800000u)]
  338. [TestCase(0x7F800000u, false, 0x7F800000u)]
  339. [TestCase(0xFF800000u, false, 0xFF800000u)]
  340. [TestCase(0xFF800000u, false, 0xFF800000u)]
  341. [TestCase(0xFF800000u, false, 0xFF800000u)]
  342. [TestCase(0xFF800000u, false, 0xFF800000u)]
  343. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  344. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  345. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  346. [TestCase(0xFF800001u, false, 0xFFC00001u, Ignore = "NaN test.")]
  347. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  348. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  349. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  350. [TestCase(0xFF800001u, true, 0x7FC00000u, Ignore = "NaN test.")]
  351. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  352. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  353. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  354. [TestCase(0x7FC00002u, false, 0x7FC00002u, Ignore = "NaN test.")]
  355. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  356. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  357. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  358. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  359. public void Frintn_S(uint A, bool DefaultNaN, uint Result)
  360. {
  361. int FpcrTemp = 0x0;
  362. if(DefaultNaN)
  363. {
  364. FpcrTemp = 0x2000000;
  365. }
  366. AVec V1 = new AVec { X0 = A };
  367. AThreadState ThreadState = SingleOpcode(0x1E264020, V1: V1, Fpcr: FpcrTemp);
  368. Assert.AreEqual(Result, ThreadState.V0.X0);
  369. }
  370. [TestCase(0x4E618820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  371. [TestCase(0x4E618820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, false, 0x4000000000000000ul, 0x4000000000000000ul)]
  372. [TestCase(0x4E618820u, 0x3FF8000000000000ul, 0x3FF8000000000000ul, false, 0x4000000000000000ul, 0x4000000000000000ul)]
  373. [TestCase(0x4E218820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, false, 0x3f80000040000000ul, 0x3f80000040000000ul)]
  374. [TestCase(0x4E218820u, 0x3fc000003fc00000ul, 0x3fc000003fc00000ul, false, 0x4000000040000000ul, 0x4000000040000000ul)]
  375. [TestCase(0xE218820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, false, 0x3f80000040000000ul, 0x0000000000000000ul)]
  376. [TestCase(0xE218820u, 0x3fc000003fc00000ul, 0x3fc000003fc00000ul, false, 0x4000000040000000ul, 0x0000000000000000ul)]
  377. [TestCase(0xE218820u, 0x0000000080000000ul, 0x0000000000000000ul, false, 0x0000000080000000ul, 0x0000000000000000ul)]
  378. [TestCase(0xE218820u, 0x7F800000FF800000ul, 0x0000000000000000ul, false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  379. [TestCase(0xE218820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  380. [TestCase(0xE218820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  381. public void Frintn_V(uint Opcode, ulong A, ulong B, bool DefaultNaN, ulong Result0, ulong Result1)
  382. {
  383. int FpcrTemp = 0x0;
  384. if(DefaultNaN)
  385. {
  386. FpcrTemp = 0x2000000;
  387. }
  388. AVec V1 = new AVec { X0 = A, X1 = B };
  389. AThreadState ThreadState = SingleOpcode(Opcode, V1: V1, Fpcr: FpcrTemp);
  390. Assert.Multiple(() =>
  391. {
  392. Assert.AreEqual(Result0, ThreadState.V0.X0);
  393. Assert.AreEqual(Result1, ThreadState.V0.X1);
  394. });
  395. }
  396. [TestCase(0x3FE66666u, false, 0x40000000u)]
  397. [TestCase(0x3F99999Au, false, 0x40000000u)]
  398. [TestCase(0x404CCCCDu, false, 0x40800000u)]
  399. [TestCase(0x40733333u, false, 0x40800000u)]
  400. [TestCase(0x3fc00000u, false, 0x40000000u)]
  401. [TestCase(0x40200000u, false, 0x40400000u)]
  402. [TestCase(0x00000000u, false, 0x00000000u)]
  403. [TestCase(0x00000000u, false, 0x00000000u)]
  404. [TestCase(0x00000000u, false, 0x00000000u)]
  405. [TestCase(0x00000000u, false, 0x00000000u)]
  406. [TestCase(0x80000000u, false, 0x80000000u)]
  407. [TestCase(0x80000000u, false, 0x80000000u)]
  408. [TestCase(0x80000000u, false, 0x80000000u)]
  409. [TestCase(0x80000000u, false, 0x80000000u)]
  410. [TestCase(0x7F800000u, false, 0x7F800000u)]
  411. [TestCase(0x7F800000u, false, 0x7F800000u)]
  412. [TestCase(0x7F800000u, false, 0x7F800000u)]
  413. [TestCase(0x7F800000u, false, 0x7F800000u)]
  414. [TestCase(0xFF800000u, false, 0xFF800000u)]
  415. [TestCase(0xFF800000u, false, 0xFF800000u)]
  416. [TestCase(0xFF800000u, false, 0xFF800000u)]
  417. [TestCase(0xFF800000u, false, 0xFF800000u)]
  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, false, 0xFFC00001u, 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(0xFF800001u, true, 0x7FC00000u, 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, false, 0x7FC00002u, 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. [TestCase(0x7FC00002u, true, 0x7FC00000u, Ignore = "NaN test.")]
  434. public void Frintp_S(uint A, bool DefaultNaN, uint Result)
  435. {
  436. int FpcrTemp = 0x0;
  437. if(DefaultNaN)
  438. {
  439. FpcrTemp = 0x2000000;
  440. }
  441. AVec V1 = new AVec { X0 = A };
  442. AThreadState ThreadState = SingleOpcode(0x1E24C020, V1: V1, Fpcr: FpcrTemp);
  443. Assert.AreEqual(Result, ThreadState.V0.X0);
  444. }
  445. [TestCase(0x4EE18820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, false, 0x4000000000000000ul, 0x4000000000000000ul)]
  446. [TestCase(0x4EE18820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, false, 0x4000000000000000ul, 0x4000000000000000ul)]
  447. [TestCase(0x4EA18820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, false, 0x4000000040000000ul, 0x4000000040000000ul)]
  448. [TestCase(0xEA18820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, false, 0x4000000040000000ul, 0x0000000000000000ul)]
  449. [TestCase(0xEA18820u, 0x0000000080000000ul, 0x0000000000000000ul, false, 0x0000000080000000ul, 0x0000000000000000ul)]
  450. [TestCase(0xEA18820u, 0x7F800000FF800000ul, 0x0000000000000000ul, false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  451. [TestCase(0xEA18820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  452. [TestCase(0xEA18820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  453. public void Frintp_V(uint Opcode, ulong A, ulong B, bool DefaultNaN, ulong Result0, ulong Result1)
  454. {
  455. int FpcrTemp = 0x0;
  456. if(DefaultNaN)
  457. {
  458. FpcrTemp = 0x2000000;
  459. }
  460. AVec V1 = new AVec { X0 = A, X1 = B };
  461. AThreadState ThreadState = SingleOpcode(Opcode, V1: V1, Fpcr: FpcrTemp);
  462. Assert.Multiple(() =>
  463. {
  464. Assert.AreEqual(Result0, ThreadState.V0.X0);
  465. Assert.AreEqual(Result1, ThreadState.V0.X1);
  466. });
  467. }
  468. [TestCase(0x3FE66666u, 'N', false, 0x40000000u)]
  469. [TestCase(0x3F99999Au, 'N', false, 0x3F800000u)]
  470. [TestCase(0x404CCCCDu, 'P', false, 0x40800000u)]
  471. [TestCase(0x40733333u, 'P', false, 0x40800000u)]
  472. [TestCase(0x404CCCCDu, 'M', false, 0x40400000u)]
  473. [TestCase(0x40733333u, 'M', false, 0x40400000u)]
  474. [TestCase(0x3F99999Au, 'Z', false, 0x3F800000u)]
  475. [TestCase(0x3FE66666u, 'Z', false, 0x3F800000u)]
  476. [TestCase(0x00000000u, 'N', false, 0x00000000u)]
  477. [TestCase(0x00000000u, 'P', false, 0x00000000u)]
  478. [TestCase(0x00000000u, 'M', false, 0x00000000u)]
  479. [TestCase(0x00000000u, 'Z', false, 0x00000000u)]
  480. [TestCase(0x80000000u, 'N', false, 0x80000000u)]
  481. [TestCase(0x80000000u, 'P', false, 0x80000000u)]
  482. [TestCase(0x80000000u, 'M', false, 0x80000000u)]
  483. [TestCase(0x80000000u, 'Z', false, 0x80000000u)]
  484. [TestCase(0x7F800000u, 'N', false, 0x7F800000u)]
  485. [TestCase(0x7F800000u, 'P', false, 0x7F800000u)]
  486. [TestCase(0x7F800000u, 'M', false, 0x7F800000u)]
  487. [TestCase(0x7F800000u, 'Z', false, 0x7F800000u)]
  488. [TestCase(0xFF800000u, 'N', false, 0xFF800000u)]
  489. [TestCase(0xFF800000u, 'P', false, 0xFF800000u)]
  490. [TestCase(0xFF800000u, 'M', false, 0xFF800000u)]
  491. [TestCase(0xFF800000u, 'Z', false, 0xFF800000u)]
  492. [TestCase(0xFF800001u, 'N', false, 0xFFC00001u, Ignore = "NaN test.")]
  493. [TestCase(0xFF800001u, 'P', false, 0xFFC00001u, Ignore = "NaN test.")]
  494. [TestCase(0xFF800001u, 'M', false, 0xFFC00001u, Ignore = "NaN test.")]
  495. [TestCase(0xFF800001u, 'Z', false, 0xFFC00001u, Ignore = "NaN test.")]
  496. [TestCase(0xFF800001u, 'N', true, 0x7FC00000u, Ignore = "NaN test.")]
  497. [TestCase(0xFF800001u, 'P', true, 0x7FC00000u, Ignore = "NaN test.")]
  498. [TestCase(0xFF800001u, 'M', true, 0x7FC00000u, Ignore = "NaN test.")]
  499. [TestCase(0xFF800001u, 'Z', true, 0x7FC00000u, Ignore = "NaN test.")]
  500. [TestCase(0x7FC00002u, 'N', false, 0x7FC00002u, Ignore = "NaN test.")]
  501. [TestCase(0x7FC00002u, 'P', false, 0x7FC00002u, Ignore = "NaN test.")]
  502. [TestCase(0x7FC00002u, 'M', false, 0x7FC00002u, Ignore = "NaN test.")]
  503. [TestCase(0x7FC00002u, 'Z', false, 0x7FC00002u, Ignore = "NaN test.")]
  504. [TestCase(0x7FC00002u, 'N', true, 0x7FC00000u, Ignore = "NaN test.")]
  505. [TestCase(0x7FC00002u, 'P', true, 0x7FC00000u, Ignore = "NaN test.")]
  506. [TestCase(0x7FC00002u, 'M', true, 0x7FC00000u, Ignore = "NaN test.")]
  507. [TestCase(0x7FC00002u, 'Z', true, 0x7FC00000u, Ignore = "NaN test.")]
  508. public void Frintx_S(uint A, char RoundType, bool DefaultNaN, uint Result)
  509. {
  510. int FpcrTemp = 0x0;
  511. switch(RoundType)
  512. {
  513. case 'N':
  514. FpcrTemp = 0x0;
  515. break;
  516. case 'P':
  517. FpcrTemp = 0x400000;
  518. break;
  519. case 'M':
  520. FpcrTemp = 0x800000;
  521. break;
  522. case 'Z':
  523. FpcrTemp = 0xC00000;
  524. break;
  525. }
  526. if(DefaultNaN)
  527. {
  528. FpcrTemp |= 1 << 25;
  529. }
  530. AVec V1 = new AVec { X0 = A };
  531. AThreadState ThreadState = SingleOpcode(0x1E274020, V1: V1, Fpcr: FpcrTemp);
  532. Assert.AreEqual(Result, ThreadState.V0.X0);
  533. }
  534. [TestCase(0x6E619820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, 'N', false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  535. [TestCase(0x6E619820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, 'N', false, 0x4000000000000000ul, 0x4000000000000000ul)]
  536. [TestCase(0x6E619820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, 'P', false, 0x4000000000000000ul, 0x4000000000000000ul)]
  537. [TestCase(0x6E619820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, 'P', false, 0x4000000000000000ul, 0x4000000000000000ul)]
  538. [TestCase(0x6E619820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, 'M', false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  539. [TestCase(0x6E619820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, 'M', false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  540. [TestCase(0x6E619820u, 0x3FF3333333333333ul, 0x3FF3333333333333ul, 'Z', false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  541. [TestCase(0x6E619820u, 0x3FFCCCCCCCCCCCCDul, 0x3FFCCCCCCCCCCCCDul, 'Z', false, 0x3FF0000000000000ul, 0x3FF0000000000000ul)]
  542. [TestCase(0x6E219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'N', false, 0x3f80000040000000ul, 0x3f80000040000000ul)]
  543. [TestCase(0x6E219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'P', false, 0x4000000040000000ul, 0x4000000040000000ul)]
  544. [TestCase(0x6E219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'M', false, 0x3f8000003f800000ul, 0x3f8000003f800000ul)]
  545. [TestCase(0x6E219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'Z', false, 0x3f8000003f800000ul, 0x3f8000003f800000ul)]
  546. [TestCase(0x2E219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'N', false, 0x3f80000040000000ul, 0x0000000000000000ul)]
  547. [TestCase(0x2E219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'P', false, 0x4000000040000000ul, 0x0000000000000000ul)]
  548. [TestCase(0x2E219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'M', false, 0x3f8000003f800000ul, 0x0000000000000000ul)]
  549. [TestCase(0x2E219820u, 0x3f99999a3fe66666ul, 0x3f99999a3fe66666ul, 'Z', false, 0x3f8000003f800000ul, 0x0000000000000000ul)]
  550. [TestCase(0x2E219820u, 0x0000000080000000ul, 0x0000000000000000ul, 'N', false, 0x0000000080000000ul, 0x0000000000000000ul)]
  551. [TestCase(0x2E219820u, 0x0000000080000000ul, 0x0000000000000000ul, 'P', false, 0x0000000080000000ul, 0x0000000000000000ul)]
  552. [TestCase(0x2E219820u, 0x0000000080000000ul, 0x0000000000000000ul, 'M', false, 0x0000000080000000ul, 0x0000000000000000ul)]
  553. [TestCase(0x2E219820u, 0x0000000080000000ul, 0x0000000000000000ul, 'Z', false, 0x0000000080000000ul, 0x0000000000000000ul)]
  554. [TestCase(0x2E219820u, 0x7F800000FF800000ul, 0x0000000000000000ul, 'N', false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  555. [TestCase(0x2E219820u, 0x7F800000FF800000ul, 0x0000000000000000ul, 'P', false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  556. [TestCase(0x2E219820u, 0x7F800000FF800000ul, 0x0000000000000000ul, 'M', false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  557. [TestCase(0x2E219820u, 0x7F800000FF800000ul, 0x0000000000000000ul, 'Z', false, 0x7F800000FF800000ul, 0x0000000000000000ul)]
  558. [TestCase(0x2E219820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'N', false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  559. [TestCase(0x2E219820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'P', false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  560. [TestCase(0x2E219820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'M', false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  561. [TestCase(0x2E219820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'Z', false, 0xFFC000017FC00002ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  562. [TestCase(0x2E219820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'N', true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  563. [TestCase(0x2E219820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'P', true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  564. [TestCase(0x2E219820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'M', true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  565. [TestCase(0x2E219820u, 0xFF8000017FC00002ul, 0x0000000000000000ul, 'Z', true, 0x7FC000007FC00000ul, 0x0000000000000000ul, Ignore = "NaN test.")]
  566. public void Frintx_V(uint Opcode, ulong A, ulong B, char RoundType, bool DefaultNaN, ulong Result0, ulong Result1)
  567. {
  568. int FpcrTemp = 0x0;
  569. switch(RoundType)
  570. {
  571. case 'N':
  572. FpcrTemp = 0x0;
  573. break;
  574. case 'P':
  575. FpcrTemp = 0x400000;
  576. break;
  577. case 'M':
  578. FpcrTemp = 0x800000;
  579. break;
  580. case 'Z':
  581. FpcrTemp = 0xC00000;
  582. break;
  583. }
  584. if(DefaultNaN)
  585. {
  586. FpcrTemp |= 1 << 25;
  587. }
  588. AVec V1 = new AVec { X0 = A, X1 = B };
  589. AThreadState ThreadState = SingleOpcode(Opcode, V1: V1, Fpcr: FpcrTemp);
  590. Assert.Multiple(() =>
  591. {
  592. Assert.AreEqual(Result0, ThreadState.V0.X0);
  593. Assert.AreEqual(Result1, ThreadState.V0.X1);
  594. });
  595. }
  596. [TestCase(0x41200000u, 0x3EA18000u)]
  597. public void Frsqrte_S(uint A, uint Result)
  598. {
  599. AVec V1 = new AVec { X0 = A };
  600. AThreadState ThreadState = SingleOpcode(0x7EA1D820, V1: V1);
  601. Assert.AreEqual(Result, ThreadState.V0.X0);
  602. }
  603. }
  604. }