CpuTestSimd.cs 88 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846
  1. #define Simd
  2. using ChocolArm64.State;
  3. using NUnit.Framework;
  4. using System.Runtime.Intrinsics;
  5. namespace Ryujinx.Tests.Cpu
  6. {
  7. using Tester;
  8. using Tester.Types;
  9. [Category("Simd")/*, Ignore("Tested: second half of 2018.")*/]
  10. public sealed class CpuTestSimd : CpuTest
  11. {
  12. #if Simd
  13. [SetUp]
  14. public void SetupTester()
  15. {
  16. AArch64.TakeReset(false);
  17. }
  18. #region "ValueSource"
  19. private static ulong[] _1B1H1S1D_()
  20. {
  21. return new ulong[] { 0x0000000000000000ul, 0x000000000000007Ful,
  22. 0x0000000000000080ul, 0x00000000000000FFul,
  23. 0x0000000000007FFFul, 0x0000000000008000ul,
  24. 0x000000000000FFFFul, 0x000000007FFFFFFFul,
  25. 0x0000000080000000ul, 0x00000000FFFFFFFFul,
  26. 0x7FFFFFFFFFFFFFFFul, 0x8000000000000000ul,
  27. 0xFFFFFFFFFFFFFFFFul };
  28. }
  29. private static ulong[] _1D_()
  30. {
  31. return new ulong[] { 0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul,
  32. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul };
  33. }
  34. private static ulong[] _1H1S1D_()
  35. {
  36. return new ulong[] { 0x0000000000000000ul, 0x0000000000007FFFul,
  37. 0x0000000000008000ul, 0x000000000000FFFFul,
  38. 0x000000007FFFFFFFul, 0x0000000080000000ul,
  39. 0x00000000FFFFFFFFul, 0x7FFFFFFFFFFFFFFFul,
  40. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul };
  41. }
  42. private static ulong[] _4H2S1D_()
  43. {
  44. return new ulong[] { 0x0000000000000000ul, 0x7FFF7FFF7FFF7FFFul,
  45. 0x8000800080008000ul, 0x7FFFFFFF7FFFFFFFul,
  46. 0x8000000080000000ul, 0x7FFFFFFFFFFFFFFFul,
  47. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul };
  48. }
  49. private static ulong[] _8B_()
  50. {
  51. return new ulong[] { 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful,
  52. 0x8080808080808080ul, 0xFFFFFFFFFFFFFFFFul };
  53. }
  54. private static ulong[] _8B4H_()
  55. {
  56. return new ulong[] { 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful,
  57. 0x8080808080808080ul, 0x7FFF7FFF7FFF7FFFul,
  58. 0x8000800080008000ul, 0xFFFFFFFFFFFFFFFFul };
  59. }
  60. private static ulong[] _8B4H2S_()
  61. {
  62. return new ulong[] { 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful,
  63. 0x8080808080808080ul, 0x7FFF7FFF7FFF7FFFul,
  64. 0x8000800080008000ul, 0x7FFFFFFF7FFFFFFFul,
  65. 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul };
  66. }
  67. private static ulong[] _8B4H2S1D_()
  68. {
  69. return new ulong[] { 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful,
  70. 0x8080808080808080ul, 0x7FFF7FFF7FFF7FFFul,
  71. 0x8000800080008000ul, 0x7FFFFFFF7FFFFFFFul,
  72. 0x8000000080000000ul, 0x7FFFFFFFFFFFFFFFul,
  73. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul };
  74. }
  75. #endregion
  76. private const int RndCnt = 1;
  77. [Test, Description("ABS <V><d>, <V><n>")]
  78. public void Abs_S_D([Values(0u)] uint Rd,
  79. [Values(1u, 0u)] uint Rn,
  80. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  81. [ValueSource("_1D_")] [Random(RndCnt)] ulong A)
  82. {
  83. uint Opcode = 0x5EE0B800; // ABS D0, D0
  84. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  85. Bits Op = new Bits(Opcode);
  86. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  87. Vector128<float> V1 = MakeVectorE0(A);
  88. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  89. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  90. AArch64.V(1, new Bits(A));
  91. SimdFp.Abs_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  92. Assert.Multiple(() =>
  93. {
  94. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  95. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  96. });
  97. }
  98. [Test, Description("ABS <Vd>.<T>, <Vn>.<T>")]
  99. public void Abs_V_8B_4H_2S([Values(0u)] uint Rd,
  100. [Values(1u, 0u)] uint Rn,
  101. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  102. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  103. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  104. {
  105. uint Opcode = 0x0E20B800; // ABS V0.8B, V0.8B
  106. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  107. Opcode |= ((size & 3) << 22);
  108. Bits Op = new Bits(Opcode);
  109. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  110. Vector128<float> V1 = MakeVectorE0(A);
  111. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  112. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  113. AArch64.V(1, new Bits(A));
  114. SimdFp.Abs_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  115. Assert.Multiple(() =>
  116. {
  117. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  118. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  119. });
  120. }
  121. [Test, Description("ABS <Vd>.<T>, <Vn>.<T>")]
  122. public void Abs_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  123. [Values(1u, 0u)] uint Rn,
  124. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  125. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  126. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  127. {
  128. uint Opcode = 0x4E20B800; // ABS V0.16B, V0.16B
  129. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  130. Opcode |= ((size & 3) << 22);
  131. Bits Op = new Bits(Opcode);
  132. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  133. Vector128<float> V1 = MakeVectorE0E1(A, A);
  134. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  135. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  136. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  137. SimdFp.Abs_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  138. Assert.Multiple(() =>
  139. {
  140. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  141. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  142. });
  143. }
  144. [Test, Description("ADDP <V><d>, <Vn>.<T>")]
  145. public void Addp_S_2DD([Values(0u)] uint Rd,
  146. [Values(1u, 0u)] uint Rn,
  147. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  148. [ValueSource("_1D_")] [Random(RndCnt)] ulong A)
  149. {
  150. uint Opcode = 0x5EF1B800; // ADDP D0, V0.2D
  151. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  152. Bits Op = new Bits(Opcode);
  153. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  154. Vector128<float> V1 = MakeVectorE0E1(A, A);
  155. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  156. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  157. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  158. SimdFp.Addp_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  159. Assert.Multiple(() =>
  160. {
  161. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  162. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  163. });
  164. }
  165. [Test, Description("ADDV <V><d>, <Vn>.<T>")]
  166. public void Addv_V_8BB_4HH([Values(0u)] uint Rd,
  167. [Values(1u, 0u)] uint Rn,
  168. [ValueSource("_8B4H_")] [Random(RndCnt)] ulong Z,
  169. [ValueSource("_8B4H_")] [Random(RndCnt)] ulong A,
  170. [Values(0b00u, 0b01u)] uint size) // <8BB, 4HH>
  171. {
  172. uint Opcode = 0x0E31B800; // ADDV B0, V0.8B
  173. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  174. Opcode |= ((size & 3) << 22);
  175. Bits Op = new Bits(Opcode);
  176. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  177. Vector128<float> V1 = MakeVectorE0(A);
  178. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  179. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  180. AArch64.V(1, new Bits(A));
  181. SimdFp.Addv_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  182. Assert.Multiple(() =>
  183. {
  184. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  185. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  186. });
  187. }
  188. [Test, Description("ADDV <V><d>, <Vn>.<T>")]
  189. public void Addv_V_16BB_8HH_4SS([Values(0u)] uint Rd,
  190. [Values(1u, 0u)] uint Rn,
  191. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  192. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  193. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16BB, 8HH, 4SS>
  194. {
  195. uint Opcode = 0x4E31B800; // ADDV B0, V0.16B
  196. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  197. Opcode |= ((size & 3) << 22);
  198. Bits Op = new Bits(Opcode);
  199. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  200. Vector128<float> V1 = MakeVectorE0E1(A, A);
  201. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  202. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  203. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  204. SimdFp.Addv_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  205. Assert.Multiple(() =>
  206. {
  207. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  208. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  209. });
  210. }
  211. [Test, Description("CLS <Vd>.<T>, <Vn>.<T>")]
  212. public void Cls_V_8B_4H_2S([Values(0u)] uint Rd,
  213. [Values(1u, 0u)] uint Rn,
  214. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  215. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  216. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  217. {
  218. uint Opcode = 0x0E204800; // CLS V0.8B, V0.8B
  219. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  220. Opcode |= ((size & 3) << 22);
  221. Bits Op = new Bits(Opcode);
  222. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  223. Vector128<float> V1 = MakeVectorE0(A);
  224. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  225. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  226. AArch64.V(1, new Bits(A));
  227. SimdFp.Cls_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  228. Assert.Multiple(() =>
  229. {
  230. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  231. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  232. });
  233. }
  234. [Test, Description("CLS <Vd>.<T>, <Vn>.<T>")]
  235. public void Cls_V_16B_8H_4S([Values(0u)] uint Rd,
  236. [Values(1u, 0u)] uint Rn,
  237. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  238. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  239. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
  240. {
  241. uint Opcode = 0x4E204800; // CLS V0.16B, V0.16B
  242. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  243. Opcode |= ((size & 3) << 22);
  244. Bits Op = new Bits(Opcode);
  245. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  246. Vector128<float> V1 = MakeVectorE0E1(A, A);
  247. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  248. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  249. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  250. SimdFp.Cls_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  251. Assert.Multiple(() =>
  252. {
  253. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  254. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  255. });
  256. }
  257. [Test, Description("CLZ <Vd>.<T>, <Vn>.<T>")]
  258. public void Clz_V_8B_4H_2S([Values(0u)] uint Rd,
  259. [Values(1u, 0u)] uint Rn,
  260. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  261. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  262. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  263. {
  264. uint Opcode = 0x2E204800; // CLZ V0.8B, V0.8B
  265. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  266. Opcode |= ((size & 3) << 22);
  267. Bits Op = new Bits(Opcode);
  268. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  269. Vector128<float> V1 = MakeVectorE0(A);
  270. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  271. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  272. AArch64.V(1, new Bits(A));
  273. SimdFp.Clz_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  274. Assert.Multiple(() =>
  275. {
  276. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  277. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  278. });
  279. }
  280. [Test, Description("CLZ <Vd>.<T>, <Vn>.<T>")]
  281. public void Clz_V_16B_8H_4S([Values(0u)] uint Rd,
  282. [Values(1u, 0u)] uint Rn,
  283. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  284. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  285. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
  286. {
  287. uint Opcode = 0x6E204800; // CLZ V0.16B, V0.16B
  288. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  289. Opcode |= ((size & 3) << 22);
  290. Bits Op = new Bits(Opcode);
  291. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  292. Vector128<float> V1 = MakeVectorE0E1(A, A);
  293. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  294. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  295. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  296. SimdFp.Clz_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  297. Assert.Multiple(() =>
  298. {
  299. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  300. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  301. });
  302. }
  303. [Test, Description("CMEQ <V><d>, <V><n>, #0")]
  304. public void Cmeq_S_D([Values(0u)] uint Rd,
  305. [Values(1u, 0u)] uint Rn,
  306. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  307. [ValueSource("_1D_")] [Random(RndCnt)] ulong A)
  308. {
  309. uint Opcode = 0x5EE09800; // CMEQ D0, D0, #0
  310. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  311. Bits Op = new Bits(Opcode);
  312. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  313. Vector128<float> V1 = MakeVectorE0(A);
  314. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  315. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  316. AArch64.V(1, new Bits(A));
  317. SimdFp.Cmeq_Zero_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  318. Assert.Multiple(() =>
  319. {
  320. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  321. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  322. });
  323. }
  324. [Test, Description("CMEQ <Vd>.<T>, <Vn>.<T>, #0")]
  325. public void Cmeq_V_8B_4H_2S([Values(0u)] uint Rd,
  326. [Values(1u, 0u)] uint Rn,
  327. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  328. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  329. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  330. {
  331. uint Opcode = 0x0E209800; // CMEQ V0.8B, V0.8B, #0
  332. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  333. Opcode |= ((size & 3) << 22);
  334. Bits Op = new Bits(Opcode);
  335. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  336. Vector128<float> V1 = MakeVectorE0(A);
  337. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  338. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  339. AArch64.V(1, new Bits(A));
  340. SimdFp.Cmeq_Zero_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  341. Assert.Multiple(() =>
  342. {
  343. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  344. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  345. });
  346. }
  347. [Test, Description("CMEQ <Vd>.<T>, <Vn>.<T>, #0")]
  348. public void Cmeq_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  349. [Values(1u, 0u)] uint Rn,
  350. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  351. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  352. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  353. {
  354. uint Opcode = 0x4E209800; // CMEQ V0.16B, V0.16B, #0
  355. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  356. Opcode |= ((size & 3) << 22);
  357. Bits Op = new Bits(Opcode);
  358. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  359. Vector128<float> V1 = MakeVectorE0E1(A, A);
  360. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  361. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  362. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  363. SimdFp.Cmeq_Zero_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  364. Assert.Multiple(() =>
  365. {
  366. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  367. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  368. });
  369. }
  370. [Test, Description("CMGE <V><d>, <V><n>, #0")]
  371. public void Cmge_S_D([Values(0u)] uint Rd,
  372. [Values(1u, 0u)] uint Rn,
  373. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  374. [ValueSource("_1D_")] [Random(RndCnt)] ulong A)
  375. {
  376. uint Opcode = 0x7EE08800; // CMGE D0, D0, #0
  377. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  378. Bits Op = new Bits(Opcode);
  379. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  380. Vector128<float> V1 = MakeVectorE0(A);
  381. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  382. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  383. AArch64.V(1, new Bits(A));
  384. SimdFp.Cmge_Zero_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  385. Assert.Multiple(() =>
  386. {
  387. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  388. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  389. });
  390. }
  391. [Test, Description("CMGE <Vd>.<T>, <Vn>.<T>, #0")]
  392. public void Cmge_V_8B_4H_2S([Values(0u)] uint Rd,
  393. [Values(1u, 0u)] uint Rn,
  394. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  395. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  396. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  397. {
  398. uint Opcode = 0x2E208800; // CMGE V0.8B, V0.8B, #0
  399. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  400. Opcode |= ((size & 3) << 22);
  401. Bits Op = new Bits(Opcode);
  402. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  403. Vector128<float> V1 = MakeVectorE0(A);
  404. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  405. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  406. AArch64.V(1, new Bits(A));
  407. SimdFp.Cmge_Zero_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  408. Assert.Multiple(() =>
  409. {
  410. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  411. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  412. });
  413. }
  414. [Test, Description("CMGE <Vd>.<T>, <Vn>.<T>, #0")]
  415. public void Cmge_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  416. [Values(1u, 0u)] uint Rn,
  417. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  418. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  419. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  420. {
  421. uint Opcode = 0x6E208800; // CMGE V0.16B, V0.16B, #0
  422. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  423. Opcode |= ((size & 3) << 22);
  424. Bits Op = new Bits(Opcode);
  425. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  426. Vector128<float> V1 = MakeVectorE0E1(A, A);
  427. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  428. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  429. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  430. SimdFp.Cmge_Zero_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  431. Assert.Multiple(() =>
  432. {
  433. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  434. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  435. });
  436. }
  437. [Test, Description("CMGT <V><d>, <V><n>, #0")]
  438. public void Cmgt_S_D([Values(0u)] uint Rd,
  439. [Values(1u, 0u)] uint Rn,
  440. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  441. [ValueSource("_1D_")] [Random(RndCnt)] ulong A)
  442. {
  443. uint Opcode = 0x5EE08800; // CMGT D0, D0, #0
  444. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  445. Bits Op = new Bits(Opcode);
  446. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  447. Vector128<float> V1 = MakeVectorE0(A);
  448. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  449. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  450. AArch64.V(1, new Bits(A));
  451. SimdFp.Cmgt_Zero_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  452. Assert.Multiple(() =>
  453. {
  454. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  455. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  456. });
  457. }
  458. [Test, Description("CMGT <Vd>.<T>, <Vn>.<T>, #0")]
  459. public void Cmgt_V_8B_4H_2S([Values(0u)] uint Rd,
  460. [Values(1u, 0u)] uint Rn,
  461. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  462. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  463. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  464. {
  465. uint Opcode = 0x0E208800; // CMGT V0.8B, V0.8B, #0
  466. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  467. Opcode |= ((size & 3) << 22);
  468. Bits Op = new Bits(Opcode);
  469. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  470. Vector128<float> V1 = MakeVectorE0(A);
  471. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  472. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  473. AArch64.V(1, new Bits(A));
  474. SimdFp.Cmgt_Zero_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  475. Assert.Multiple(() =>
  476. {
  477. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  478. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  479. });
  480. }
  481. [Test, Description("CMGT <Vd>.<T>, <Vn>.<T>, #0")]
  482. public void Cmgt_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  483. [Values(1u, 0u)] uint Rn,
  484. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  485. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  486. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  487. {
  488. uint Opcode = 0x4E208800; // CMGT V0.16B, V0.16B, #0
  489. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  490. Opcode |= ((size & 3) << 22);
  491. Bits Op = new Bits(Opcode);
  492. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  493. Vector128<float> V1 = MakeVectorE0E1(A, A);
  494. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  495. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  496. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  497. SimdFp.Cmgt_Zero_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  498. Assert.Multiple(() =>
  499. {
  500. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  501. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  502. });
  503. }
  504. [Test, Description("CMLE <V><d>, <V><n>, #0")]
  505. public void Cmle_S_D([Values(0u)] uint Rd,
  506. [Values(1u, 0u)] uint Rn,
  507. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  508. [ValueSource("_1D_")] [Random(RndCnt)] ulong A)
  509. {
  510. uint Opcode = 0x7EE09800; // CMLE D0, D0, #0
  511. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  512. Bits Op = new Bits(Opcode);
  513. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  514. Vector128<float> V1 = MakeVectorE0(A);
  515. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  516. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  517. AArch64.V(1, new Bits(A));
  518. SimdFp.Cmle_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  519. Assert.Multiple(() =>
  520. {
  521. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  522. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  523. });
  524. }
  525. [Test, Description("CMLE <Vd>.<T>, <Vn>.<T>, #0")]
  526. public void Cmle_V_8B_4H_2S([Values(0u)] uint Rd,
  527. [Values(1u, 0u)] uint Rn,
  528. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  529. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  530. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  531. {
  532. uint Opcode = 0x2E209800; // CMLE V0.8B, V0.8B, #0
  533. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  534. Opcode |= ((size & 3) << 22);
  535. Bits Op = new Bits(Opcode);
  536. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  537. Vector128<float> V1 = MakeVectorE0(A);
  538. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  539. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  540. AArch64.V(1, new Bits(A));
  541. SimdFp.Cmle_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  542. Assert.Multiple(() =>
  543. {
  544. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  545. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  546. });
  547. }
  548. [Test, Description("CMLE <Vd>.<T>, <Vn>.<T>, #0")]
  549. public void Cmle_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  550. [Values(1u, 0u)] uint Rn,
  551. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  552. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  553. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  554. {
  555. uint Opcode = 0x6E209800; // CMLE V0.16B, V0.16B, #0
  556. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  557. Opcode |= ((size & 3) << 22);
  558. Bits Op = new Bits(Opcode);
  559. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  560. Vector128<float> V1 = MakeVectorE0E1(A, A);
  561. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  562. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  563. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  564. SimdFp.Cmle_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  565. Assert.Multiple(() =>
  566. {
  567. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  568. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  569. });
  570. }
  571. [Test, Description("CMLT <V><d>, <V><n>, #0")]
  572. public void Cmlt_S_D([Values(0u)] uint Rd,
  573. [Values(1u, 0u)] uint Rn,
  574. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  575. [ValueSource("_1D_")] [Random(RndCnt)] ulong A)
  576. {
  577. uint Opcode = 0x5EE0A800; // CMLT D0, D0, #0
  578. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  579. Bits Op = new Bits(Opcode);
  580. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  581. Vector128<float> V1 = MakeVectorE0(A);
  582. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  583. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  584. AArch64.V(1, new Bits(A));
  585. SimdFp.Cmlt_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  586. Assert.Multiple(() =>
  587. {
  588. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  589. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  590. });
  591. }
  592. [Test, Description("CMLT <Vd>.<T>, <Vn>.<T>, #0")]
  593. public void Cmlt_V_8B_4H_2S([Values(0u)] uint Rd,
  594. [Values(1u, 0u)] uint Rn,
  595. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  596. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  597. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  598. {
  599. uint Opcode = 0x0E20A800; // CMLT V0.8B, V0.8B, #0
  600. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  601. Opcode |= ((size & 3) << 22);
  602. Bits Op = new Bits(Opcode);
  603. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  604. Vector128<float> V1 = MakeVectorE0(A);
  605. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  606. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  607. AArch64.V(1, new Bits(A));
  608. SimdFp.Cmlt_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  609. Assert.Multiple(() =>
  610. {
  611. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  612. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  613. });
  614. }
  615. [Test, Description("CMLT <Vd>.<T>, <Vn>.<T>, #0")]
  616. public void Cmlt_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  617. [Values(1u, 0u)] uint Rn,
  618. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  619. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  620. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  621. {
  622. uint Opcode = 0x4E20A800; // CMLT V0.16B, V0.16B, #0
  623. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  624. Opcode |= ((size & 3) << 22);
  625. Bits Op = new Bits(Opcode);
  626. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  627. Vector128<float> V1 = MakeVectorE0E1(A, A);
  628. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  629. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  630. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  631. SimdFp.Cmlt_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  632. Assert.Multiple(() =>
  633. {
  634. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  635. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  636. });
  637. }
  638. [Test, Description("CNT <Vd>.<T>, <Vn>.<T>")]
  639. public void Cnt_V_8B([Values(0u)] uint Rd,
  640. [Values(1u, 0u)] uint Rn,
  641. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  642. [ValueSource("_8B_")] [Random(RndCnt)] ulong A)
  643. {
  644. uint Opcode = 0x0E205800; // CNT V0.8B, V0.8B
  645. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  646. Bits Op = new Bits(Opcode);
  647. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  648. Vector128<float> V1 = MakeVectorE0(A);
  649. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  650. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  651. AArch64.V(1, new Bits(A));
  652. SimdFp.Cnt_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  653. Assert.Multiple(() =>
  654. {
  655. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  656. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  657. });
  658. }
  659. [Test, Description("CNT <Vd>.<T>, <Vn>.<T>")]
  660. public void Cnt_V_16B([Values(0u)] uint Rd,
  661. [Values(1u, 0u)] uint Rn,
  662. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  663. [ValueSource("_8B_")] [Random(RndCnt)] ulong A)
  664. {
  665. uint Opcode = 0x4E205800; // CNT V0.16B, V0.16B
  666. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  667. Bits Op = new Bits(Opcode);
  668. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  669. Vector128<float> V1 = MakeVectorE0E1(A, A);
  670. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  671. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  672. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  673. SimdFp.Cnt_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  674. Assert.Multiple(() =>
  675. {
  676. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  677. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  678. });
  679. }
  680. [Test, Description("NEG <V><d>, <V><n>")]
  681. public void Neg_S_D([Values(0u)] uint Rd,
  682. [Values(1u, 0u)] uint Rn,
  683. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  684. [ValueSource("_1D_")] [Random(RndCnt)] ulong A)
  685. {
  686. uint Opcode = 0x7EE0B800; // NEG D0, D0
  687. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  688. Bits Op = new Bits(Opcode);
  689. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  690. Vector128<float> V1 = MakeVectorE0(A);
  691. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  692. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  693. AArch64.V(1, new Bits(A));
  694. SimdFp.Neg_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  695. Assert.Multiple(() =>
  696. {
  697. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  698. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  699. });
  700. }
  701. [Test, Description("NEG <Vd>.<T>, <Vn>.<T>")]
  702. public void Neg_V_8B_4H_2S([Values(0u)] uint Rd,
  703. [Values(1u, 0u)] uint Rn,
  704. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  705. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  706. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  707. {
  708. uint Opcode = 0x2E20B800; // NEG V0.8B, V0.8B
  709. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  710. Opcode |= ((size & 3) << 22);
  711. Bits Op = new Bits(Opcode);
  712. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  713. Vector128<float> V1 = MakeVectorE0(A);
  714. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  715. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  716. AArch64.V(1, new Bits(A));
  717. SimdFp.Neg_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  718. Assert.Multiple(() =>
  719. {
  720. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  721. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  722. });
  723. }
  724. [Test, Description("NEG <Vd>.<T>, <Vn>.<T>")]
  725. public void Neg_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  726. [Values(1u, 0u)] uint Rn,
  727. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  728. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  729. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  730. {
  731. uint Opcode = 0x6E20B800; // NEG V0.16B, V0.16B
  732. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  733. Opcode |= ((size & 3) << 22);
  734. Bits Op = new Bits(Opcode);
  735. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  736. Vector128<float> V1 = MakeVectorE0E1(A, A);
  737. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  738. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  739. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  740. SimdFp.Neg_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  741. Assert.Multiple(() =>
  742. {
  743. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  744. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  745. });
  746. }
  747. [Test, Description("NOT <Vd>.<T>, <Vn>.<T>")]
  748. public void Not_V_8B([Values(0u)] uint Rd,
  749. [Values(1u, 0u)] uint Rn,
  750. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  751. [ValueSource("_8B_")] [Random(RndCnt)] ulong A)
  752. {
  753. uint Opcode = 0x2E205800; // NOT V0.8B, V0.8B
  754. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  755. Bits Op = new Bits(Opcode);
  756. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  757. Vector128<float> V1 = MakeVectorE0(A);
  758. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  759. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  760. AArch64.V(1, new Bits(A));
  761. SimdFp.Not_V(Op[30], Op[9, 5], Op[4, 0]);
  762. Assert.Multiple(() =>
  763. {
  764. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  765. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  766. });
  767. }
  768. [Test, Description("NOT <Vd>.<T>, <Vn>.<T>")]
  769. public void Not_V_16B([Values(0u)] uint Rd,
  770. [Values(1u, 0u)] uint Rn,
  771. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  772. [ValueSource("_8B_")] [Random(RndCnt)] ulong A)
  773. {
  774. uint Opcode = 0x6E205800; // NOT V0.16B, V0.16B
  775. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  776. Bits Op = new Bits(Opcode);
  777. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  778. Vector128<float> V1 = MakeVectorE0E1(A, A);
  779. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  780. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  781. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  782. SimdFp.Not_V(Op[30], Op[9, 5], Op[4, 0]);
  783. Assert.Multiple(() =>
  784. {
  785. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  786. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  787. });
  788. }
  789. [Test, Description("RBIT <Vd>.<T>, <Vn>.<T>")]
  790. public void Rbit_V_8B([Values(0u)] uint Rd,
  791. [Values(1u, 0u)] uint Rn,
  792. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  793. [ValueSource("_8B_")] [Random(RndCnt)] ulong A)
  794. {
  795. uint Opcode = 0x2E605800; // RBIT V0.8B, V0.8B
  796. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  797. Bits Op = new Bits(Opcode);
  798. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  799. Vector128<float> V1 = MakeVectorE0(A);
  800. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  801. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  802. AArch64.V(1, new Bits(A));
  803. SimdFp.Rbit_V(Op[30], Op[9, 5], Op[4, 0]);
  804. Assert.Multiple(() =>
  805. {
  806. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  807. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  808. });
  809. }
  810. [Test, Description("RBIT <Vd>.<T>, <Vn>.<T>")]
  811. public void Rbit_V_16B([Values(0u)] uint Rd,
  812. [Values(1u, 0u)] uint Rn,
  813. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  814. [ValueSource("_8B_")] [Random(RndCnt)] ulong A)
  815. {
  816. uint Opcode = 0x6E605800; // RBIT V0.16B, V0.16B
  817. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  818. Bits Op = new Bits(Opcode);
  819. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  820. Vector128<float> V1 = MakeVectorE0E1(A, A);
  821. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  822. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  823. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  824. SimdFp.Rbit_V(Op[30], Op[9, 5], Op[4, 0]);
  825. Assert.Multiple(() =>
  826. {
  827. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  828. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  829. });
  830. }
  831. [Test, Description("REV16 <Vd>.<T>, <Vn>.<T>")]
  832. public void Rev16_V_8B([Values(0u)] uint Rd,
  833. [Values(1u, 0u)] uint Rn,
  834. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  835. [ValueSource("_8B_")] [Random(RndCnt)] ulong A)
  836. {
  837. uint Opcode = 0x0E201800; // REV16 V0.8B, V0.8B
  838. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  839. Bits Op = new Bits(Opcode);
  840. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  841. Vector128<float> V1 = MakeVectorE0(A);
  842. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  843. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  844. AArch64.V(1, new Bits(A));
  845. SimdFp.Rev16_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  846. Assert.Multiple(() =>
  847. {
  848. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  849. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  850. });
  851. }
  852. [Test, Description("REV16 <Vd>.<T>, <Vn>.<T>")]
  853. public void Rev16_V_16B([Values(0u)] uint Rd,
  854. [Values(1u, 0u)] uint Rn,
  855. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  856. [ValueSource("_8B_")] [Random(RndCnt)] ulong A)
  857. {
  858. uint Opcode = 0x4E201800; // REV16 V0.16B, V0.16B
  859. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  860. Bits Op = new Bits(Opcode);
  861. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  862. Vector128<float> V1 = MakeVectorE0E1(A, A);
  863. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  864. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  865. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  866. SimdFp.Rev16_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  867. Assert.Multiple(() =>
  868. {
  869. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  870. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  871. });
  872. }
  873. [Test, Description("REV32 <Vd>.<T>, <Vn>.<T>")]
  874. public void Rev32_V_8B_4H([Values(0u)] uint Rd,
  875. [Values(1u, 0u)] uint Rn,
  876. [ValueSource("_8B4H_")] [Random(RndCnt)] ulong Z,
  877. [ValueSource("_8B4H_")] [Random(RndCnt)] ulong A,
  878. [Values(0b00u, 0b01u)] uint size) // <8B, 4H>
  879. {
  880. uint Opcode = 0x2E200800; // REV32 V0.8B, V0.8B
  881. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  882. Opcode |= ((size & 3) << 22);
  883. Bits Op = new Bits(Opcode);
  884. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  885. Vector128<float> V1 = MakeVectorE0(A);
  886. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  887. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  888. AArch64.V(1, new Bits(A));
  889. SimdFp.Rev32_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  890. Assert.Multiple(() =>
  891. {
  892. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  893. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  894. });
  895. }
  896. [Test, Description("REV32 <Vd>.<T>, <Vn>.<T>")]
  897. public void Rev32_V_16B_8H([Values(0u)] uint Rd,
  898. [Values(1u, 0u)] uint Rn,
  899. [ValueSource("_8B4H_")] [Random(RndCnt)] ulong Z,
  900. [ValueSource("_8B4H_")] [Random(RndCnt)] ulong A,
  901. [Values(0b00u, 0b01u)] uint size) // <16B, 8H>
  902. {
  903. uint Opcode = 0x6E200800; // REV32 V0.16B, V0.16B
  904. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  905. Opcode |= ((size & 3) << 22);
  906. Bits Op = new Bits(Opcode);
  907. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  908. Vector128<float> V1 = MakeVectorE0E1(A, A);
  909. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  910. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  911. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  912. SimdFp.Rev32_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  913. Assert.Multiple(() =>
  914. {
  915. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  916. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  917. });
  918. }
  919. [Test, Description("REV64 <Vd>.<T>, <Vn>.<T>")]
  920. public void Rev64_V_8B_4H_2S([Values(0u)] uint Rd,
  921. [Values(1u, 0u)] uint Rn,
  922. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  923. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  924. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  925. {
  926. uint Opcode = 0x0E200800; // REV64 V0.8B, V0.8B
  927. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  928. Opcode |= ((size & 3) << 22);
  929. Bits Op = new Bits(Opcode);
  930. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  931. Vector128<float> V1 = MakeVectorE0(A);
  932. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  933. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  934. AArch64.V(1, new Bits(A));
  935. SimdFp.Rev64_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  936. Assert.Multiple(() =>
  937. {
  938. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  939. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  940. });
  941. }
  942. [Test, Description("REV64 <Vd>.<T>, <Vn>.<T>")]
  943. public void Rev64_V_16B_8H_4S([Values(0u)] uint Rd,
  944. [Values(1u, 0u)] uint Rn,
  945. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  946. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  947. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
  948. {
  949. uint Opcode = 0x4E200800; // REV64 V0.16B, V0.16B
  950. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  951. Opcode |= ((size & 3) << 22);
  952. Bits Op = new Bits(Opcode);
  953. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  954. Vector128<float> V1 = MakeVectorE0E1(A, A);
  955. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  956. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  957. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  958. SimdFp.Rev64_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  959. Assert.Multiple(() =>
  960. {
  961. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  962. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  963. });
  964. }
  965. [Test, Description("SQABS <V><d>, <V><n>")]
  966. public void Sqabs_S_B_H_S_D([Values(0u)] uint Rd,
  967. [Values(1u, 0u)] uint Rn,
  968. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong Z,
  969. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong A,
  970. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <B, H, S, D>
  971. {
  972. uint Opcode = 0x5E207800; // SQABS B0, B0
  973. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  974. Opcode |= ((size & 3) << 22);
  975. Bits Op = new Bits(Opcode);
  976. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  977. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  978. Vector128<float> V1 = MakeVectorE0(A);
  979. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  980. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  981. AArch64.V(1, new Bits(A));
  982. Shared.FPSR = new Bits((uint)Fpsr);
  983. SimdFp.Sqabs_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  984. Assert.Multiple(() =>
  985. {
  986. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  987. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  988. });
  989. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  990. }
  991. [Test, Description("SQABS <Vd>.<T>, <Vn>.<T>")]
  992. public void Sqabs_V_8B_4H_2S([Values(0u)] uint Rd,
  993. [Values(1u, 0u)] uint Rn,
  994. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  995. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  996. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  997. {
  998. uint Opcode = 0x0E207800; // SQABS V0.8B, V0.8B
  999. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1000. Opcode |= ((size & 3) << 22);
  1001. Bits Op = new Bits(Opcode);
  1002. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1003. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1004. Vector128<float> V1 = MakeVectorE0(A);
  1005. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1006. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1007. AArch64.V(1, new Bits(A));
  1008. Shared.FPSR = new Bits((uint)Fpsr);
  1009. SimdFp.Sqabs_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1010. Assert.Multiple(() =>
  1011. {
  1012. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1013. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1014. });
  1015. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1016. }
  1017. [Test, Description("SQABS <Vd>.<T>, <Vn>.<T>")]
  1018. public void Sqabs_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  1019. [Values(1u, 0u)] uint Rn,
  1020. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  1021. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  1022. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  1023. {
  1024. uint Opcode = 0x4E207800; // SQABS V0.16B, V0.16B
  1025. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1026. Opcode |= ((size & 3) << 22);
  1027. Bits Op = new Bits(Opcode);
  1028. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1029. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1030. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1031. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1032. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1033. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1034. Shared.FPSR = new Bits((uint)Fpsr);
  1035. SimdFp.Sqabs_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1036. Assert.Multiple(() =>
  1037. {
  1038. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1039. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1040. });
  1041. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1042. }
  1043. [Test, Description("SQNEG <V><d>, <V><n>")]
  1044. public void Sqneg_S_B_H_S_D([Values(0u)] uint Rd,
  1045. [Values(1u, 0u)] uint Rn,
  1046. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong Z,
  1047. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong A,
  1048. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <B, H, S, D>
  1049. {
  1050. uint Opcode = 0x7E207800; // SQNEG B0, B0
  1051. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1052. Opcode |= ((size & 3) << 22);
  1053. Bits Op = new Bits(Opcode);
  1054. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1055. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1056. Vector128<float> V1 = MakeVectorE0(A);
  1057. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1058. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1059. AArch64.V(1, new Bits(A));
  1060. Shared.FPSR = new Bits((uint)Fpsr);
  1061. SimdFp.Sqneg_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  1062. Assert.Multiple(() =>
  1063. {
  1064. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1065. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1066. });
  1067. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1068. }
  1069. [Test, Description("SQNEG <Vd>.<T>, <Vn>.<T>")]
  1070. public void Sqneg_V_8B_4H_2S([Values(0u)] uint Rd,
  1071. [Values(1u, 0u)] uint Rn,
  1072. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1073. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1074. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  1075. {
  1076. uint Opcode = 0x2E207800; // SQNEG V0.8B, V0.8B
  1077. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1078. Opcode |= ((size & 3) << 22);
  1079. Bits Op = new Bits(Opcode);
  1080. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1081. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1082. Vector128<float> V1 = MakeVectorE0(A);
  1083. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1084. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1085. AArch64.V(1, new Bits(A));
  1086. Shared.FPSR = new Bits((uint)Fpsr);
  1087. SimdFp.Sqneg_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1088. Assert.Multiple(() =>
  1089. {
  1090. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1091. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1092. });
  1093. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1094. }
  1095. [Test, Description("SQNEG <Vd>.<T>, <Vn>.<T>")]
  1096. public void Sqneg_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  1097. [Values(1u, 0u)] uint Rn,
  1098. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  1099. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  1100. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  1101. {
  1102. uint Opcode = 0x6E207800; // SQNEG V0.16B, V0.16B
  1103. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1104. Opcode |= ((size & 3) << 22);
  1105. Bits Op = new Bits(Opcode);
  1106. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1107. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1108. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1109. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1110. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1111. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1112. Shared.FPSR = new Bits((uint)Fpsr);
  1113. SimdFp.Sqneg_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1114. Assert.Multiple(() =>
  1115. {
  1116. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1117. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1118. });
  1119. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1120. }
  1121. [Test, Description("SQXTN <Vb><d>, <Va><n>")]
  1122. public void Sqxtn_S_HB_SH_DS([Values(0u)] uint Rd,
  1123. [Values(1u, 0u)] uint Rn,
  1124. [ValueSource("_1H1S1D_")] [Random(RndCnt)] ulong Z,
  1125. [ValueSource("_1H1S1D_")] [Random(RndCnt)] ulong A,
  1126. [Values(0b00u, 0b01u, 0b10u)] uint size) // <HB, SH, DS>
  1127. {
  1128. uint Opcode = 0x5E214800; // SQXTN B0, H0
  1129. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1130. Opcode |= ((size & 3) << 22);
  1131. Bits Op = new Bits(Opcode);
  1132. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1133. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1134. Vector128<float> V1 = MakeVectorE0(A);
  1135. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1136. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1137. AArch64.V(1, new Bits(A));
  1138. Shared.FPSR = new Bits((uint)Fpsr);
  1139. SimdFp.Sqxtn_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  1140. Assert.Multiple(() =>
  1141. {
  1142. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1143. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1144. });
  1145. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1146. }
  1147. [Test, Description("SQXTN{2} <Vd>.<Tb>, <Vn>.<Ta>")]
  1148. public void Sqxtn_V_8H8B_4S4H_2D2S([Values(0u)] uint Rd,
  1149. [Values(1u, 0u)] uint Rn,
  1150. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  1151. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1152. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H8B, 4S4H, 2D2S>
  1153. {
  1154. uint Opcode = 0x0E214800; // SQXTN V0.8B, V0.8H
  1155. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1156. Opcode |= ((size & 3) << 22);
  1157. Bits Op = new Bits(Opcode);
  1158. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1159. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1160. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1161. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1162. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1163. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1164. Shared.FPSR = new Bits((uint)Fpsr);
  1165. SimdFp.Sqxtn_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1166. Assert.Multiple(() =>
  1167. {
  1168. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1169. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1170. });
  1171. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1172. }
  1173. [Test, Description("SQXTN{2} <Vd>.<Tb>, <Vn>.<Ta>")]
  1174. public void Sqxtn_V_8H16B_4S8H_2D4S([Values(0u)] uint Rd,
  1175. [Values(1u, 0u)] uint Rn,
  1176. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  1177. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1178. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H16B, 4S8H, 2D4S>
  1179. {
  1180. uint Opcode = 0x4E214800; // SQXTN2 V0.16B, V0.8H
  1181. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1182. Opcode |= ((size & 3) << 22);
  1183. Bits Op = new Bits(Opcode);
  1184. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1185. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1186. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1187. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1188. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1189. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1190. Shared.FPSR = new Bits((uint)Fpsr);
  1191. SimdFp.Sqxtn_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1192. Assert.Multiple(() =>
  1193. {
  1194. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1195. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1196. });
  1197. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1198. }
  1199. [Test, Description("SQXTUN <Vb><d>, <Va><n>")]
  1200. public void Sqxtun_S_HB_SH_DS([Values(0u)] uint Rd,
  1201. [Values(1u, 0u)] uint Rn,
  1202. [ValueSource("_1H1S1D_")] [Random(RndCnt)] ulong Z,
  1203. [ValueSource("_1H1S1D_")] [Random(RndCnt)] ulong A,
  1204. [Values(0b00u, 0b01u, 0b10u)] uint size) // <HB, SH, DS>
  1205. {
  1206. uint Opcode = 0x7E212800; // SQXTUN B0, H0
  1207. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1208. Opcode |= ((size & 3) << 22);
  1209. Bits Op = new Bits(Opcode);
  1210. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1211. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1212. Vector128<float> V1 = MakeVectorE0(A);
  1213. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1214. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1215. AArch64.V(1, new Bits(A));
  1216. Shared.FPSR = new Bits((uint)Fpsr);
  1217. SimdFp.Sqxtun_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  1218. Assert.Multiple(() =>
  1219. {
  1220. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1221. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1222. });
  1223. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1224. }
  1225. [Test, Description("SQXTUN{2} <Vd>.<Tb>, <Vn>.<Ta>")]
  1226. public void Sqxtun_V_8H8B_4S4H_2D2S([Values(0u)] uint Rd,
  1227. [Values(1u, 0u)] uint Rn,
  1228. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  1229. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1230. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H8B, 4S4H, 2D2S>
  1231. {
  1232. uint Opcode = 0x2E212800; // SQXTUN V0.8B, V0.8H
  1233. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1234. Opcode |= ((size & 3) << 22);
  1235. Bits Op = new Bits(Opcode);
  1236. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1237. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1238. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1239. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1240. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1241. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1242. Shared.FPSR = new Bits((uint)Fpsr);
  1243. SimdFp.Sqxtun_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1244. Assert.Multiple(() =>
  1245. {
  1246. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1247. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1248. });
  1249. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1250. }
  1251. [Test, Description("SQXTUN{2} <Vd>.<Tb>, <Vn>.<Ta>")]
  1252. public void Sqxtun_V_8H16B_4S8H_2D4S([Values(0u)] uint Rd,
  1253. [Values(1u, 0u)] uint Rn,
  1254. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  1255. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1256. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H16B, 4S8H, 2D4S>
  1257. {
  1258. uint Opcode = 0x6E212800; // SQXTUN2 V0.16B, V0.8H
  1259. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1260. Opcode |= ((size & 3) << 22);
  1261. Bits Op = new Bits(Opcode);
  1262. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1263. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1264. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1265. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1266. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1267. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1268. Shared.FPSR = new Bits((uint)Fpsr);
  1269. SimdFp.Sqxtun_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1270. Assert.Multiple(() =>
  1271. {
  1272. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1273. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1274. });
  1275. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1276. }
  1277. [Test, Description("SUQADD <V><d>, <V><n>")]
  1278. public void Suqadd_S_B_H_S_D([Values(0u)] uint Rd,
  1279. [Values(1u, 0u)] uint Rn,
  1280. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong Z,
  1281. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong A,
  1282. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <B, H, S, D>
  1283. {
  1284. uint Opcode = 0x5E203800; // SUQADD B0, B0
  1285. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1286. Opcode |= ((size & 3) << 22);
  1287. Bits Op = new Bits(Opcode);
  1288. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1289. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1290. Vector128<float> V1 = MakeVectorE0(A);
  1291. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1292. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1293. AArch64.V(1, new Bits(A));
  1294. Shared.FPSR = new Bits((uint)Fpsr);
  1295. SimdFp.Suqadd_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  1296. Assert.Multiple(() =>
  1297. {
  1298. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1299. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1300. });
  1301. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1302. }
  1303. [Test, Description("SUQADD <Vd>.<T>, <Vn>.<T>")]
  1304. public void Suqadd_V_8B_4H_2S([Values(0u)] uint Rd,
  1305. [Values(1u, 0u)] uint Rn,
  1306. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1307. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1308. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  1309. {
  1310. uint Opcode = 0x0E203800; // SUQADD V0.8B, V0.8B
  1311. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1312. Opcode |= ((size & 3) << 22);
  1313. Bits Op = new Bits(Opcode);
  1314. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1315. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1316. Vector128<float> V1 = MakeVectorE0(A);
  1317. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1318. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1319. AArch64.V(1, new Bits(A));
  1320. Shared.FPSR = new Bits((uint)Fpsr);
  1321. SimdFp.Suqadd_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1322. Assert.Multiple(() =>
  1323. {
  1324. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1325. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1326. });
  1327. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1328. }
  1329. [Test, Description("SUQADD <Vd>.<T>, <Vn>.<T>")]
  1330. public void Suqadd_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  1331. [Values(1u, 0u)] uint Rn,
  1332. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  1333. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  1334. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  1335. {
  1336. uint Opcode = 0x4E203800; // SUQADD V0.16B, V0.16B
  1337. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1338. Opcode |= ((size & 3) << 22);
  1339. Bits Op = new Bits(Opcode);
  1340. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1341. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1342. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1343. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1344. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1345. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1346. Shared.FPSR = new Bits((uint)Fpsr);
  1347. SimdFp.Suqadd_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1348. Assert.Multiple(() =>
  1349. {
  1350. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1351. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1352. });
  1353. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1354. }
  1355. [Test, Description("UQXTN <Vb><d>, <Va><n>")]
  1356. public void Uqxtn_S_HB_SH_DS([Values(0u)] uint Rd,
  1357. [Values(1u, 0u)] uint Rn,
  1358. [ValueSource("_1H1S1D_")] [Random(RndCnt)] ulong Z,
  1359. [ValueSource("_1H1S1D_")] [Random(RndCnt)] ulong A,
  1360. [Values(0b00u, 0b01u, 0b10u)] uint size) // <HB, SH, DS>
  1361. {
  1362. uint Opcode = 0x7E214800; // UQXTN B0, H0
  1363. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1364. Opcode |= ((size & 3) << 22);
  1365. Bits Op = new Bits(Opcode);
  1366. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1367. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1368. Vector128<float> V1 = MakeVectorE0(A);
  1369. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1370. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1371. AArch64.V(1, new Bits(A));
  1372. Shared.FPSR = new Bits((uint)Fpsr);
  1373. SimdFp.Uqxtn_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  1374. Assert.Multiple(() =>
  1375. {
  1376. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1377. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1378. });
  1379. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1380. }
  1381. [Test, Description("UQXTN{2} <Vd>.<Tb>, <Vn>.<Ta>")]
  1382. public void Uqxtn_V_8H8B_4S4H_2D2S([Values(0u)] uint Rd,
  1383. [Values(1u, 0u)] uint Rn,
  1384. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  1385. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1386. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H8B, 4S4H, 2D2S>
  1387. {
  1388. uint Opcode = 0x2E214800; // UQXTN V0.8B, V0.8H
  1389. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1390. Opcode |= ((size & 3) << 22);
  1391. Bits Op = new Bits(Opcode);
  1392. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1393. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1394. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1395. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1396. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1397. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1398. Shared.FPSR = new Bits((uint)Fpsr);
  1399. SimdFp.Uqxtn_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1400. Assert.Multiple(() =>
  1401. {
  1402. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1403. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1404. });
  1405. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1406. }
  1407. [Test, Description("UQXTN{2} <Vd>.<Tb>, <Vn>.<Ta>")]
  1408. public void Uqxtn_V_8H16B_4S8H_2D4S([Values(0u)] uint Rd,
  1409. [Values(1u, 0u)] uint Rn,
  1410. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  1411. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1412. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H16B, 4S8H, 2D4S>
  1413. {
  1414. uint Opcode = 0x6E214800; // UQXTN2 V0.16B, V0.8H
  1415. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1416. Opcode |= ((size & 3) << 22);
  1417. Bits Op = new Bits(Opcode);
  1418. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1419. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1420. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1421. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1422. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1423. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1424. Shared.FPSR = new Bits((uint)Fpsr);
  1425. SimdFp.Uqxtn_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1426. Assert.Multiple(() =>
  1427. {
  1428. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1429. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1430. });
  1431. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1432. }
  1433. [Test, Description("USQADD <V><d>, <V><n>")]
  1434. public void Usqadd_S_B_H_S_D([Values(0u)] uint Rd,
  1435. [Values(1u, 0u)] uint Rn,
  1436. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong Z,
  1437. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong A,
  1438. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <B, H, S, D>
  1439. {
  1440. uint Opcode = 0x7E203800; // USQADD B0, B0
  1441. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1442. Opcode |= ((size & 3) << 22);
  1443. Bits Op = new Bits(Opcode);
  1444. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1445. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1446. Vector128<float> V1 = MakeVectorE0(A);
  1447. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1448. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1449. AArch64.V(1, new Bits(A));
  1450. Shared.FPSR = new Bits((uint)Fpsr);
  1451. SimdFp.Usqadd_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  1452. Assert.Multiple(() =>
  1453. {
  1454. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1455. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1456. });
  1457. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1458. }
  1459. [Test, Description("USQADD <Vd>.<T>, <Vn>.<T>")]
  1460. public void Usqadd_V_8B_4H_2S([Values(0u)] uint Rd,
  1461. [Values(1u, 0u)] uint Rn,
  1462. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1463. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1464. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  1465. {
  1466. uint Opcode = 0x2E203800; // USQADD V0.8B, V0.8B
  1467. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1468. Opcode |= ((size & 3) << 22);
  1469. Bits Op = new Bits(Opcode);
  1470. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1471. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1472. Vector128<float> V1 = MakeVectorE0(A);
  1473. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1474. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1475. AArch64.V(1, new Bits(A));
  1476. Shared.FPSR = new Bits((uint)Fpsr);
  1477. SimdFp.Usqadd_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1478. Assert.Multiple(() =>
  1479. {
  1480. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1481. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1482. });
  1483. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1484. }
  1485. [Test, Description("USQADD <Vd>.<T>, <Vn>.<T>")]
  1486. public void Usqadd_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  1487. [Values(1u, 0u)] uint Rn,
  1488. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  1489. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  1490. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  1491. {
  1492. uint Opcode = 0x6E203800; // USQADD V0.16B, V0.16B
  1493. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1494. Opcode |= ((size & 3) << 22);
  1495. Bits Op = new Bits(Opcode);
  1496. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1497. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1498. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1499. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1500. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1501. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1502. Shared.FPSR = new Bits((uint)Fpsr);
  1503. SimdFp.Usqadd_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1504. Assert.Multiple(() =>
  1505. {
  1506. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1507. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1508. });
  1509. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1510. }
  1511. [Test, Description("XTN{2} <Vd>.<Tb>, <Vn>.<Ta>")]
  1512. public void Xtn_V_8H8B_4S4H_2D2S([Values(0u)] uint Rd,
  1513. [Values(1u, 0u)] uint Rn,
  1514. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  1515. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1516. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H8B, 4S4H, 2D2S>
  1517. {
  1518. uint Opcode = 0x0E212800; // XTN V0.8B, V0.8H
  1519. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1520. Opcode |= ((size & 3) << 22);
  1521. Bits Op = new Bits(Opcode);
  1522. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1523. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1524. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  1525. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1526. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1527. SimdFp.Xtn_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1528. Assert.Multiple(() =>
  1529. {
  1530. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1531. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1532. });
  1533. }
  1534. [Test, Description("XTN{2} <Vd>.<Tb>, <Vn>.<Ta>")]
  1535. public void Xtn_V_8H16B_4S8H_2D4S([Values(0u)] uint Rd,
  1536. [Values(1u, 0u)] uint Rn,
  1537. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  1538. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1539. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H16B, 4S8H, 2D4S>
  1540. {
  1541. uint Opcode = 0x4E212800; // XTN2 V0.16B, V0.8H
  1542. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1543. Opcode |= ((size & 3) << 22);
  1544. Bits Op = new Bits(Opcode);
  1545. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1546. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1547. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  1548. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1549. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1550. SimdFp.Xtn_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1551. Assert.Multiple(() =>
  1552. {
  1553. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1554. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1555. });
  1556. }
  1557. #endif
  1558. }
  1559. }