CpuTestSimd.cs 103 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164
  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. CompareAgainstUnicorn();
  98. }
  99. [Test, Description("ABS <Vd>.<T>, <Vn>.<T>")]
  100. public void Abs_V_8B_4H_2S([Values(0u)] uint Rd,
  101. [Values(1u, 0u)] uint Rn,
  102. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  103. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  104. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  105. {
  106. uint Opcode = 0x0E20B800; // ABS V0.8B, V0.8B
  107. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  108. Opcode |= ((size & 3) << 22);
  109. Bits Op = new Bits(Opcode);
  110. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  111. Vector128<float> V1 = MakeVectorE0(A);
  112. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  113. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  114. AArch64.V(1, new Bits(A));
  115. SimdFp.Abs_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  116. Assert.Multiple(() =>
  117. {
  118. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  119. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  120. });
  121. CompareAgainstUnicorn();
  122. }
  123. [Test, Description("ABS <Vd>.<T>, <Vn>.<T>")]
  124. public void Abs_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  125. [Values(1u, 0u)] uint Rn,
  126. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  127. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  128. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  129. {
  130. uint Opcode = 0x4E20B800; // ABS V0.16B, V0.16B
  131. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  132. Opcode |= ((size & 3) << 22);
  133. Bits Op = new Bits(Opcode);
  134. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  135. Vector128<float> V1 = MakeVectorE0E1(A, A);
  136. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  137. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  138. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  139. SimdFp.Abs_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  140. Assert.Multiple(() =>
  141. {
  142. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  143. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  144. });
  145. CompareAgainstUnicorn();
  146. }
  147. [Test, Description("ADDP <V><d>, <Vn>.<T>")]
  148. public void Addp_S_2DD([Values(0u)] uint Rd,
  149. [Values(1u, 0u)] uint Rn,
  150. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  151. [ValueSource("_1D_")] [Random(RndCnt)] ulong A)
  152. {
  153. uint Opcode = 0x5EF1B800; // ADDP D0, V0.2D
  154. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  155. Bits Op = new Bits(Opcode);
  156. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  157. Vector128<float> V1 = MakeVectorE0E1(A, A);
  158. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  159. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  160. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  161. SimdFp.Addp_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  162. Assert.Multiple(() =>
  163. {
  164. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  165. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  166. });
  167. CompareAgainstUnicorn();
  168. }
  169. [Test, Description("ADDV <V><d>, <Vn>.<T>")]
  170. public void Addv_V_8BB_4HH([Values(0u)] uint Rd,
  171. [Values(1u, 0u)] uint Rn,
  172. [ValueSource("_8B4H_")] [Random(RndCnt)] ulong Z,
  173. [ValueSource("_8B4H_")] [Random(RndCnt)] ulong A,
  174. [Values(0b00u, 0b01u)] uint size) // <8BB, 4HH>
  175. {
  176. uint Opcode = 0x0E31B800; // ADDV B0, V0.8B
  177. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  178. Opcode |= ((size & 3) << 22);
  179. Bits Op = new Bits(Opcode);
  180. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  181. Vector128<float> V1 = MakeVectorE0(A);
  182. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  183. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  184. AArch64.V(1, new Bits(A));
  185. SimdFp.Addv_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  186. Assert.Multiple(() =>
  187. {
  188. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  189. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  190. });
  191. CompareAgainstUnicorn();
  192. }
  193. [Test, Description("ADDV <V><d>, <Vn>.<T>")]
  194. public void Addv_V_16BB_8HH_4SS([Values(0u)] uint Rd,
  195. [Values(1u, 0u)] uint Rn,
  196. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  197. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  198. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16BB, 8HH, 4SS>
  199. {
  200. uint Opcode = 0x4E31B800; // ADDV B0, V0.16B
  201. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  202. Opcode |= ((size & 3) << 22);
  203. Bits Op = new Bits(Opcode);
  204. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  205. Vector128<float> V1 = MakeVectorE0E1(A, A);
  206. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  207. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  208. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  209. SimdFp.Addv_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  210. Assert.Multiple(() =>
  211. {
  212. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  213. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  214. });
  215. CompareAgainstUnicorn();
  216. }
  217. [Test, Description("CLS <Vd>.<T>, <Vn>.<T>")]
  218. public void Cls_V_8B_4H_2S([Values(0u)] uint Rd,
  219. [Values(1u, 0u)] uint Rn,
  220. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  221. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  222. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  223. {
  224. uint Opcode = 0x0E204800; // CLS V0.8B, V0.8B
  225. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  226. Opcode |= ((size & 3) << 22);
  227. Bits Op = new Bits(Opcode);
  228. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  229. Vector128<float> V1 = MakeVectorE0(A);
  230. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  231. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  232. AArch64.V(1, new Bits(A));
  233. SimdFp.Cls_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  234. Assert.Multiple(() =>
  235. {
  236. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  237. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  238. });
  239. CompareAgainstUnicorn();
  240. }
  241. [Test, Description("CLS <Vd>.<T>, <Vn>.<T>")]
  242. public void Cls_V_16B_8H_4S([Values(0u)] uint Rd,
  243. [Values(1u, 0u)] uint Rn,
  244. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  245. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  246. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
  247. {
  248. uint Opcode = 0x4E204800; // CLS V0.16B, V0.16B
  249. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  250. Opcode |= ((size & 3) << 22);
  251. Bits Op = new Bits(Opcode);
  252. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  253. Vector128<float> V1 = MakeVectorE0E1(A, A);
  254. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  255. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  256. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  257. SimdFp.Cls_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  258. Assert.Multiple(() =>
  259. {
  260. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  261. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  262. });
  263. CompareAgainstUnicorn();
  264. }
  265. [Test, Description("CLZ <Vd>.<T>, <Vn>.<T>")]
  266. public void Clz_V_8B_4H_2S([Values(0u)] uint Rd,
  267. [Values(1u, 0u)] uint Rn,
  268. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  269. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  270. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  271. {
  272. uint Opcode = 0x2E204800; // CLZ V0.8B, V0.8B
  273. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  274. Opcode |= ((size & 3) << 22);
  275. Bits Op = new Bits(Opcode);
  276. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  277. Vector128<float> V1 = MakeVectorE0(A);
  278. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  279. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  280. AArch64.V(1, new Bits(A));
  281. SimdFp.Clz_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  282. Assert.Multiple(() =>
  283. {
  284. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  285. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  286. });
  287. CompareAgainstUnicorn();
  288. }
  289. [Test, Description("CLZ <Vd>.<T>, <Vn>.<T>")]
  290. public void Clz_V_16B_8H_4S([Values(0u)] uint Rd,
  291. [Values(1u, 0u)] uint Rn,
  292. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  293. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  294. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
  295. {
  296. uint Opcode = 0x6E204800; // CLZ V0.16B, V0.16B
  297. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  298. Opcode |= ((size & 3) << 22);
  299. Bits Op = new Bits(Opcode);
  300. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  301. Vector128<float> V1 = MakeVectorE0E1(A, A);
  302. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  303. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  304. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  305. SimdFp.Clz_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  306. Assert.Multiple(() =>
  307. {
  308. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  309. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  310. });
  311. CompareAgainstUnicorn();
  312. }
  313. [Test, Description("CMEQ <V><d>, <V><n>, #0")]
  314. public void Cmeq_S_D([Values(0u)] uint Rd,
  315. [Values(1u, 0u)] uint Rn,
  316. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  317. [ValueSource("_1D_")] [Random(RndCnt)] ulong A)
  318. {
  319. uint Opcode = 0x5EE09800; // CMEQ D0, D0, #0
  320. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  321. Bits Op = new Bits(Opcode);
  322. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  323. Vector128<float> V1 = MakeVectorE0(A);
  324. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  325. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  326. AArch64.V(1, new Bits(A));
  327. SimdFp.Cmeq_Zero_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  328. Assert.Multiple(() =>
  329. {
  330. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  331. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  332. });
  333. CompareAgainstUnicorn();
  334. }
  335. [Test, Description("CMEQ <Vd>.<T>, <Vn>.<T>, #0")]
  336. public void Cmeq_V_8B_4H_2S([Values(0u)] uint Rd,
  337. [Values(1u, 0u)] uint Rn,
  338. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  339. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  340. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  341. {
  342. uint Opcode = 0x0E209800; // CMEQ V0.8B, V0.8B, #0
  343. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  344. Opcode |= ((size & 3) << 22);
  345. Bits Op = new Bits(Opcode);
  346. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  347. Vector128<float> V1 = MakeVectorE0(A);
  348. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  349. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  350. AArch64.V(1, new Bits(A));
  351. SimdFp.Cmeq_Zero_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  352. Assert.Multiple(() =>
  353. {
  354. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  355. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  356. });
  357. CompareAgainstUnicorn();
  358. }
  359. [Test, Description("CMEQ <Vd>.<T>, <Vn>.<T>, #0")]
  360. public void Cmeq_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  361. [Values(1u, 0u)] uint Rn,
  362. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  363. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  364. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  365. {
  366. uint Opcode = 0x4E209800; // CMEQ V0.16B, V0.16B, #0
  367. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  368. Opcode |= ((size & 3) << 22);
  369. Bits Op = new Bits(Opcode);
  370. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  371. Vector128<float> V1 = MakeVectorE0E1(A, A);
  372. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  373. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  374. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  375. SimdFp.Cmeq_Zero_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  376. Assert.Multiple(() =>
  377. {
  378. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  379. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  380. });
  381. CompareAgainstUnicorn();
  382. }
  383. [Test, Description("CMGE <V><d>, <V><n>, #0")]
  384. public void Cmge_S_D([Values(0u)] uint Rd,
  385. [Values(1u, 0u)] uint Rn,
  386. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  387. [ValueSource("_1D_")] [Random(RndCnt)] ulong A)
  388. {
  389. uint Opcode = 0x7EE08800; // CMGE D0, D0, #0
  390. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  391. Bits Op = new Bits(Opcode);
  392. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  393. Vector128<float> V1 = MakeVectorE0(A);
  394. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  395. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  396. AArch64.V(1, new Bits(A));
  397. SimdFp.Cmge_Zero_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  398. Assert.Multiple(() =>
  399. {
  400. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  401. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  402. });
  403. CompareAgainstUnicorn();
  404. }
  405. [Test, Description("CMGE <Vd>.<T>, <Vn>.<T>, #0")]
  406. public void Cmge_V_8B_4H_2S([Values(0u)] uint Rd,
  407. [Values(1u, 0u)] uint Rn,
  408. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  409. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  410. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  411. {
  412. uint Opcode = 0x2E208800; // CMGE V0.8B, V0.8B, #0
  413. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  414. Opcode |= ((size & 3) << 22);
  415. Bits Op = new Bits(Opcode);
  416. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  417. Vector128<float> V1 = MakeVectorE0(A);
  418. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  419. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  420. AArch64.V(1, new Bits(A));
  421. SimdFp.Cmge_Zero_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  422. Assert.Multiple(() =>
  423. {
  424. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  425. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  426. });
  427. CompareAgainstUnicorn();
  428. }
  429. [Test, Description("CMGE <Vd>.<T>, <Vn>.<T>, #0")]
  430. public void Cmge_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  431. [Values(1u, 0u)] uint Rn,
  432. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  433. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  434. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  435. {
  436. uint Opcode = 0x6E208800; // CMGE V0.16B, V0.16B, #0
  437. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  438. Opcode |= ((size & 3) << 22);
  439. Bits Op = new Bits(Opcode);
  440. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  441. Vector128<float> V1 = MakeVectorE0E1(A, A);
  442. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  443. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  444. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  445. SimdFp.Cmge_Zero_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  446. Assert.Multiple(() =>
  447. {
  448. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  449. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  450. });
  451. CompareAgainstUnicorn();
  452. }
  453. [Test, Description("CMGT <V><d>, <V><n>, #0")]
  454. public void Cmgt_S_D([Values(0u)] uint Rd,
  455. [Values(1u, 0u)] uint Rn,
  456. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  457. [ValueSource("_1D_")] [Random(RndCnt)] ulong A)
  458. {
  459. uint Opcode = 0x5EE08800; // CMGT D0, D0, #0
  460. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  461. Bits Op = new Bits(Opcode);
  462. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  463. Vector128<float> V1 = MakeVectorE0(A);
  464. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  465. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  466. AArch64.V(1, new Bits(A));
  467. SimdFp.Cmgt_Zero_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  468. Assert.Multiple(() =>
  469. {
  470. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  471. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  472. });
  473. CompareAgainstUnicorn();
  474. }
  475. [Test, Description("CMGT <Vd>.<T>, <Vn>.<T>, #0")]
  476. public void Cmgt_V_8B_4H_2S([Values(0u)] uint Rd,
  477. [Values(1u, 0u)] uint Rn,
  478. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  479. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  480. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  481. {
  482. uint Opcode = 0x0E208800; // CMGT V0.8B, V0.8B, #0
  483. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  484. Opcode |= ((size & 3) << 22);
  485. Bits Op = new Bits(Opcode);
  486. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  487. Vector128<float> V1 = MakeVectorE0(A);
  488. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  489. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  490. AArch64.V(1, new Bits(A));
  491. SimdFp.Cmgt_Zero_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  492. Assert.Multiple(() =>
  493. {
  494. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  495. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  496. });
  497. CompareAgainstUnicorn();
  498. }
  499. [Test, Description("CMGT <Vd>.<T>, <Vn>.<T>, #0")]
  500. public void Cmgt_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  501. [Values(1u, 0u)] uint Rn,
  502. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  503. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  504. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  505. {
  506. uint Opcode = 0x4E208800; // CMGT V0.16B, V0.16B, #0
  507. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  508. Opcode |= ((size & 3) << 22);
  509. Bits Op = new Bits(Opcode);
  510. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  511. Vector128<float> V1 = MakeVectorE0E1(A, A);
  512. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  513. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  514. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  515. SimdFp.Cmgt_Zero_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  516. Assert.Multiple(() =>
  517. {
  518. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  519. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  520. });
  521. CompareAgainstUnicorn();
  522. }
  523. [Test, Description("CMLE <V><d>, <V><n>, #0")]
  524. public void Cmle_S_D([Values(0u)] uint Rd,
  525. [Values(1u, 0u)] uint Rn,
  526. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  527. [ValueSource("_1D_")] [Random(RndCnt)] ulong A)
  528. {
  529. uint Opcode = 0x7EE09800; // CMLE D0, D0, #0
  530. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  531. Bits Op = new Bits(Opcode);
  532. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  533. Vector128<float> V1 = MakeVectorE0(A);
  534. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  535. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  536. AArch64.V(1, new Bits(A));
  537. SimdFp.Cmle_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  538. Assert.Multiple(() =>
  539. {
  540. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  541. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  542. });
  543. CompareAgainstUnicorn();
  544. }
  545. [Test, Description("CMLE <Vd>.<T>, <Vn>.<T>, #0")]
  546. public void Cmle_V_8B_4H_2S([Values(0u)] uint Rd,
  547. [Values(1u, 0u)] uint Rn,
  548. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  549. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  550. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  551. {
  552. uint Opcode = 0x2E209800; // CMLE V0.8B, V0.8B, #0
  553. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  554. Opcode |= ((size & 3) << 22);
  555. Bits Op = new Bits(Opcode);
  556. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  557. Vector128<float> V1 = MakeVectorE0(A);
  558. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  559. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  560. AArch64.V(1, new Bits(A));
  561. SimdFp.Cmle_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  562. Assert.Multiple(() =>
  563. {
  564. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  565. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  566. });
  567. CompareAgainstUnicorn();
  568. }
  569. [Test, Description("CMLE <Vd>.<T>, <Vn>.<T>, #0")]
  570. public void Cmle_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  571. [Values(1u, 0u)] uint Rn,
  572. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  573. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  574. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  575. {
  576. uint Opcode = 0x6E209800; // CMLE V0.16B, V0.16B, #0
  577. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  578. Opcode |= ((size & 3) << 22);
  579. Bits Op = new Bits(Opcode);
  580. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  581. Vector128<float> V1 = MakeVectorE0E1(A, 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.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  585. SimdFp.Cmle_V(Op[30], 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. CompareAgainstUnicorn();
  592. }
  593. [Test, Description("CMLT <V><d>, <V><n>, #0")]
  594. public void Cmlt_S_D([Values(0u)] uint Rd,
  595. [Values(1u, 0u)] uint Rn,
  596. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  597. [ValueSource("_1D_")] [Random(RndCnt)] ulong A)
  598. {
  599. uint Opcode = 0x5EE0A800; // CMLT D0, D0, #0
  600. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  601. Bits Op = new Bits(Opcode);
  602. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  603. Vector128<float> V1 = MakeVectorE0(A);
  604. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  605. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  606. AArch64.V(1, new Bits(A));
  607. SimdFp.Cmlt_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  608. Assert.Multiple(() =>
  609. {
  610. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  611. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  612. });
  613. CompareAgainstUnicorn();
  614. }
  615. [Test, Description("CMLT <Vd>.<T>, <Vn>.<T>, #0")]
  616. public void Cmlt_V_8B_4H_2S([Values(0u)] uint Rd,
  617. [Values(1u, 0u)] uint Rn,
  618. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  619. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  620. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  621. {
  622. uint Opcode = 0x0E20A800; // CMLT V0.8B, V0.8B, #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 = MakeVectorE0(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.V(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. CompareAgainstUnicorn();
  638. }
  639. [Test, Description("CMLT <Vd>.<T>, <Vn>.<T>, #0")]
  640. public void Cmlt_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  641. [Values(1u, 0u)] uint Rn,
  642. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  643. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  644. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  645. {
  646. uint Opcode = 0x4E20A800; // CMLT V0.16B, V0.16B, #0
  647. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  648. Opcode |= ((size & 3) << 22);
  649. Bits Op = new Bits(Opcode);
  650. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  651. Vector128<float> V1 = MakeVectorE0E1(A, A);
  652. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  653. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  654. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  655. SimdFp.Cmlt_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  656. Assert.Multiple(() =>
  657. {
  658. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  659. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  660. });
  661. CompareAgainstUnicorn();
  662. }
  663. [Test, Description("CNT <Vd>.<T>, <Vn>.<T>")]
  664. public void Cnt_V_8B([Values(0u)] uint Rd,
  665. [Values(1u, 0u)] uint Rn,
  666. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  667. [ValueSource("_8B_")] [Random(RndCnt)] ulong A)
  668. {
  669. uint Opcode = 0x0E205800; // CNT V0.8B, V0.8B
  670. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  671. Bits Op = new Bits(Opcode);
  672. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  673. Vector128<float> V1 = MakeVectorE0(A);
  674. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  675. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  676. AArch64.V(1, new Bits(A));
  677. SimdFp.Cnt_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  678. Assert.Multiple(() =>
  679. {
  680. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  681. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  682. });
  683. CompareAgainstUnicorn();
  684. }
  685. [Test, Description("CNT <Vd>.<T>, <Vn>.<T>")]
  686. public void Cnt_V_16B([Values(0u)] uint Rd,
  687. [Values(1u, 0u)] uint Rn,
  688. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  689. [ValueSource("_8B_")] [Random(RndCnt)] ulong A)
  690. {
  691. uint Opcode = 0x4E205800; // CNT V0.16B, V0.16B
  692. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  693. Bits Op = new Bits(Opcode);
  694. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  695. Vector128<float> V1 = MakeVectorE0E1(A, A);
  696. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  697. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  698. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  699. SimdFp.Cnt_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  700. Assert.Multiple(() =>
  701. {
  702. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  703. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  704. });
  705. CompareAgainstUnicorn();
  706. }
  707. [Test, Description("NEG <V><d>, <V><n>")]
  708. public void Neg_S_D([Values(0u)] uint Rd,
  709. [Values(1u, 0u)] uint Rn,
  710. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  711. [ValueSource("_1D_")] [Random(RndCnt)] ulong A)
  712. {
  713. uint Opcode = 0x7EE0B800; // NEG D0, D0
  714. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  715. Bits Op = new Bits(Opcode);
  716. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  717. Vector128<float> V1 = MakeVectorE0(A);
  718. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  719. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  720. AArch64.V(1, new Bits(A));
  721. SimdFp.Neg_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  722. Assert.Multiple(() =>
  723. {
  724. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  725. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  726. });
  727. CompareAgainstUnicorn();
  728. }
  729. [Test, Description("NEG <Vd>.<T>, <Vn>.<T>")]
  730. public void Neg_V_8B_4H_2S([Values(0u)] uint Rd,
  731. [Values(1u, 0u)] uint Rn,
  732. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  733. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  734. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  735. {
  736. uint Opcode = 0x2E20B800; // NEG V0.8B, V0.8B
  737. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  738. Opcode |= ((size & 3) << 22);
  739. Bits Op = new Bits(Opcode);
  740. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  741. Vector128<float> V1 = MakeVectorE0(A);
  742. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  743. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  744. AArch64.V(1, new Bits(A));
  745. SimdFp.Neg_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  746. Assert.Multiple(() =>
  747. {
  748. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  749. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  750. });
  751. CompareAgainstUnicorn();
  752. }
  753. [Test, Description("NEG <Vd>.<T>, <Vn>.<T>")]
  754. public void Neg_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  755. [Values(1u, 0u)] uint Rn,
  756. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  757. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  758. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  759. {
  760. uint Opcode = 0x6E20B800; // NEG V0.16B, V0.16B
  761. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  762. Opcode |= ((size & 3) << 22);
  763. Bits Op = new Bits(Opcode);
  764. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  765. Vector128<float> V1 = MakeVectorE0E1(A, A);
  766. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  767. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  768. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  769. SimdFp.Neg_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  770. Assert.Multiple(() =>
  771. {
  772. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  773. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  774. });
  775. CompareAgainstUnicorn();
  776. }
  777. [Test, Description("NOT <Vd>.<T>, <Vn>.<T>")]
  778. public void Not_V_8B([Values(0u)] uint Rd,
  779. [Values(1u, 0u)] uint Rn,
  780. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  781. [ValueSource("_8B_")] [Random(RndCnt)] ulong A)
  782. {
  783. uint Opcode = 0x2E205800; // NOT V0.8B, V0.8B
  784. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  785. Bits Op = new Bits(Opcode);
  786. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  787. Vector128<float> V1 = MakeVectorE0(A);
  788. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  789. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  790. AArch64.V(1, new Bits(A));
  791. SimdFp.Not_V(Op[30], Op[9, 5], Op[4, 0]);
  792. Assert.Multiple(() =>
  793. {
  794. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  795. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  796. });
  797. CompareAgainstUnicorn();
  798. }
  799. [Test, Description("NOT <Vd>.<T>, <Vn>.<T>")]
  800. public void Not_V_16B([Values(0u)] uint Rd,
  801. [Values(1u, 0u)] uint Rn,
  802. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  803. [ValueSource("_8B_")] [Random(RndCnt)] ulong A)
  804. {
  805. uint Opcode = 0x6E205800; // NOT V0.16B, V0.16B
  806. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  807. Bits Op = new Bits(Opcode);
  808. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  809. Vector128<float> V1 = MakeVectorE0E1(A, A);
  810. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  811. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  812. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  813. SimdFp.Not_V(Op[30], Op[9, 5], Op[4, 0]);
  814. Assert.Multiple(() =>
  815. {
  816. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  817. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  818. });
  819. CompareAgainstUnicorn();
  820. }
  821. [Test, Description("RBIT <Vd>.<T>, <Vn>.<T>")]
  822. public void Rbit_V_8B([Values(0u)] uint Rd,
  823. [Values(1u, 0u)] uint Rn,
  824. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  825. [ValueSource("_8B_")] [Random(RndCnt)] ulong A)
  826. {
  827. uint Opcode = 0x2E605800; // RBIT V0.8B, V0.8B
  828. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  829. Bits Op = new Bits(Opcode);
  830. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  831. Vector128<float> V1 = MakeVectorE0(A);
  832. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  833. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  834. AArch64.V(1, new Bits(A));
  835. SimdFp.Rbit_V(Op[30], Op[9, 5], Op[4, 0]);
  836. Assert.Multiple(() =>
  837. {
  838. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  839. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  840. });
  841. CompareAgainstUnicorn();
  842. }
  843. [Test, Description("RBIT <Vd>.<T>, <Vn>.<T>")]
  844. public void Rbit_V_16B([Values(0u)] uint Rd,
  845. [Values(1u, 0u)] uint Rn,
  846. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  847. [ValueSource("_8B_")] [Random(RndCnt)] ulong A)
  848. {
  849. uint Opcode = 0x6E605800; // RBIT V0.16B, V0.16B
  850. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  851. Bits Op = new Bits(Opcode);
  852. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  853. Vector128<float> V1 = MakeVectorE0E1(A, A);
  854. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  855. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  856. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  857. SimdFp.Rbit_V(Op[30], Op[9, 5], Op[4, 0]);
  858. Assert.Multiple(() =>
  859. {
  860. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  861. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  862. });
  863. CompareAgainstUnicorn();
  864. }
  865. [Test, Description("REV16 <Vd>.<T>, <Vn>.<T>")]
  866. public void Rev16_V_8B([Values(0u)] uint Rd,
  867. [Values(1u, 0u)] uint Rn,
  868. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  869. [ValueSource("_8B_")] [Random(RndCnt)] ulong A)
  870. {
  871. uint Opcode = 0x0E201800; // REV16 V0.8B, V0.8B
  872. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  873. Bits Op = new Bits(Opcode);
  874. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  875. Vector128<float> V1 = MakeVectorE0(A);
  876. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  877. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  878. AArch64.V(1, new Bits(A));
  879. SimdFp.Rev16_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  880. Assert.Multiple(() =>
  881. {
  882. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  883. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  884. });
  885. CompareAgainstUnicorn();
  886. }
  887. [Test, Description("REV16 <Vd>.<T>, <Vn>.<T>")]
  888. public void Rev16_V_16B([Values(0u)] uint Rd,
  889. [Values(1u, 0u)] uint Rn,
  890. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  891. [ValueSource("_8B_")] [Random(RndCnt)] ulong A)
  892. {
  893. uint Opcode = 0x4E201800; // REV16 V0.16B, V0.16B
  894. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  895. Bits Op = new Bits(Opcode);
  896. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  897. Vector128<float> V1 = MakeVectorE0E1(A, A);
  898. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  899. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  900. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  901. SimdFp.Rev16_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  902. Assert.Multiple(() =>
  903. {
  904. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  905. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  906. });
  907. CompareAgainstUnicorn();
  908. }
  909. [Test, Description("REV32 <Vd>.<T>, <Vn>.<T>")]
  910. public void Rev32_V_8B_4H([Values(0u)] uint Rd,
  911. [Values(1u, 0u)] uint Rn,
  912. [ValueSource("_8B4H_")] [Random(RndCnt)] ulong Z,
  913. [ValueSource("_8B4H_")] [Random(RndCnt)] ulong A,
  914. [Values(0b00u, 0b01u)] uint size) // <8B, 4H>
  915. {
  916. uint Opcode = 0x2E200800; // REV32 V0.8B, V0.8B
  917. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  918. Opcode |= ((size & 3) << 22);
  919. Bits Op = new Bits(Opcode);
  920. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  921. Vector128<float> V1 = MakeVectorE0(A);
  922. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  923. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  924. AArch64.V(1, new Bits(A));
  925. SimdFp.Rev32_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  926. Assert.Multiple(() =>
  927. {
  928. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  929. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  930. });
  931. CompareAgainstUnicorn();
  932. }
  933. [Test, Description("REV32 <Vd>.<T>, <Vn>.<T>")]
  934. public void Rev32_V_16B_8H([Values(0u)] uint Rd,
  935. [Values(1u, 0u)] uint Rn,
  936. [ValueSource("_8B4H_")] [Random(RndCnt)] ulong Z,
  937. [ValueSource("_8B4H_")] [Random(RndCnt)] ulong A,
  938. [Values(0b00u, 0b01u)] uint size) // <16B, 8H>
  939. {
  940. uint Opcode = 0x6E200800; // REV32 V0.16B, V0.16B
  941. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  942. Opcode |= ((size & 3) << 22);
  943. Bits Op = new Bits(Opcode);
  944. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  945. Vector128<float> V1 = MakeVectorE0E1(A, A);
  946. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  947. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  948. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  949. SimdFp.Rev32_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  950. Assert.Multiple(() =>
  951. {
  952. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  953. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  954. });
  955. CompareAgainstUnicorn();
  956. }
  957. [Test, Description("REV64 <Vd>.<T>, <Vn>.<T>")]
  958. public void Rev64_V_8B_4H_2S([Values(0u)] uint Rd,
  959. [Values(1u, 0u)] uint Rn,
  960. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  961. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  962. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  963. {
  964. uint Opcode = 0x0E200800; // REV64 V0.8B, V0.8B
  965. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  966. Opcode |= ((size & 3) << 22);
  967. Bits Op = new Bits(Opcode);
  968. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  969. Vector128<float> V1 = MakeVectorE0(A);
  970. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  971. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  972. AArch64.V(1, new Bits(A));
  973. SimdFp.Rev64_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  974. Assert.Multiple(() =>
  975. {
  976. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  977. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  978. });
  979. CompareAgainstUnicorn();
  980. }
  981. [Test, Description("REV64 <Vd>.<T>, <Vn>.<T>")]
  982. public void Rev64_V_16B_8H_4S([Values(0u)] uint Rd,
  983. [Values(1u, 0u)] uint Rn,
  984. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  985. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  986. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
  987. {
  988. uint Opcode = 0x4E200800; // REV64 V0.16B, V0.16B
  989. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  990. Opcode |= ((size & 3) << 22);
  991. Bits Op = new Bits(Opcode);
  992. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  993. Vector128<float> V1 = MakeVectorE0E1(A, A);
  994. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  995. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  996. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  997. SimdFp.Rev64_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  998. Assert.Multiple(() =>
  999. {
  1000. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1001. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1002. });
  1003. CompareAgainstUnicorn();
  1004. }
  1005. [Test, Description("SADALP <Vd>.<Ta>, <Vn>.<Tb>")]
  1006. public void Sadalp_V_8B4H_4H2S_2S1D([Values(0u)] uint Rd,
  1007. [Values(1u, 0u)] uint Rn,
  1008. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1009. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1010. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B4H, 4H2S, 2S1D>
  1011. {
  1012. uint Opcode = 0x0E206800; // SADALP V0.4H, V0.8B
  1013. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1014. Opcode |= ((size & 3) << 22);
  1015. Bits Op = new Bits(Opcode);
  1016. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1017. Vector128<float> V1 = MakeVectorE0(A);
  1018. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  1019. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1020. AArch64.V(1, new Bits(A));
  1021. SimdFp.Sadalp_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1022. Assert.Multiple(() =>
  1023. {
  1024. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1025. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1026. });
  1027. CompareAgainstUnicorn();
  1028. }
  1029. [Test, Description("SADALP <Vd>.<Ta>, <Vn>.<Tb>")]
  1030. public void Sadalp_V_16B8H_8H4S_4S2D([Values(0u)] uint Rd,
  1031. [Values(1u, 0u)] uint Rn,
  1032. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1033. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1034. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H, 8H4S, 4S2D>
  1035. {
  1036. uint Opcode = 0x4E206800; // SADALP V0.8H, V0.16B
  1037. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1038. Opcode |= ((size & 3) << 22);
  1039. Bits Op = new Bits(Opcode);
  1040. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1041. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1042. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  1043. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1044. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1045. SimdFp.Sadalp_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1046. Assert.Multiple(() =>
  1047. {
  1048. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1049. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1050. });
  1051. CompareAgainstUnicorn();
  1052. }
  1053. [Test, Description("SADDLP <Vd>.<Ta>, <Vn>.<Tb>")]
  1054. public void Saddlp_V_8B4H_4H2S_2S1D([Values(0u)] uint Rd,
  1055. [Values(1u, 0u)] uint Rn,
  1056. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1057. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1058. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B4H, 4H2S, 2S1D>
  1059. {
  1060. uint Opcode = 0x0E202800; // SADDLP V0.4H, V0.8B
  1061. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1062. Opcode |= ((size & 3) << 22);
  1063. Bits Op = new Bits(Opcode);
  1064. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1065. Vector128<float> V1 = MakeVectorE0(A);
  1066. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  1067. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1068. AArch64.V(1, new Bits(A));
  1069. SimdFp.Saddlp_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1070. Assert.Multiple(() =>
  1071. {
  1072. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1073. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1074. });
  1075. CompareAgainstUnicorn();
  1076. }
  1077. [Test, Description("SADDLP <Vd>.<Ta>, <Vn>.<Tb>")]
  1078. public void Saddlp_V_16B8H_8H4S_4S2D([Values(0u)] uint Rd,
  1079. [Values(1u, 0u)] uint Rn,
  1080. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1081. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1082. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H, 8H4S, 4S2D>
  1083. {
  1084. uint Opcode = 0x4E202800; // SADDLP V0.8H, V0.16B
  1085. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1086. Opcode |= ((size & 3) << 22);
  1087. Bits Op = new Bits(Opcode);
  1088. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1089. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1090. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  1091. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1092. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1093. SimdFp.Saddlp_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1094. Assert.Multiple(() =>
  1095. {
  1096. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1097. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1098. });
  1099. CompareAgainstUnicorn();
  1100. }
  1101. [Test, Pairwise, Description("SHA256SU0 <Vd>.4S, <Vn>.4S")]
  1102. public void Sha256su0_V([Values(0u)] uint Rd,
  1103. [Values(1u, 0u)] uint Rn,
  1104. [Random(RndCnt * 2)] ulong Z0, [Random(RndCnt * 2)] ulong Z1,
  1105. [Random(RndCnt * 2)] ulong A0, [Random(RndCnt * 2)] ulong A1)
  1106. {
  1107. uint Opcode = 0x5E282800; // SHA256SU0 V0.4S, V0.4S
  1108. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1109. Bits Op = new Bits(Opcode);
  1110. Vector128<float> V0 = MakeVectorE0E1(Z0, Z1);
  1111. Vector128<float> V1 = MakeVectorE0E1(A0, A1);
  1112. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  1113. AArch64.Vpart(0, 0, new Bits(Z0)); AArch64.Vpart(0, 1, new Bits(Z1));
  1114. AArch64.Vpart(1, 0, new Bits(A0)); AArch64.Vpart(1, 1, new Bits(A1));
  1115. SimdFp.Sha256su0_V(Op[9, 5], Op[4, 0]);
  1116. Assert.Multiple(() =>
  1117. {
  1118. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1119. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1120. });
  1121. Assert.Multiple(() =>
  1122. {
  1123. Assert.That(GetVectorE0(ThreadState.V1), Is.EqualTo(AArch64.Vpart(64, 1, 0).ToUInt64()));
  1124. Assert.That(GetVectorE1(ThreadState.V1), Is.EqualTo(AArch64.Vpart(64, 1, 1).ToUInt64()));
  1125. });
  1126. CompareAgainstUnicorn();
  1127. }
  1128. [Test, Description("SQABS <V><d>, <V><n>")]
  1129. public void Sqabs_S_B_H_S_D([Values(0u)] uint Rd,
  1130. [Values(1u, 0u)] uint Rn,
  1131. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong Z,
  1132. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong A,
  1133. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <B, H, S, D>
  1134. {
  1135. uint Opcode = 0x5E207800; // SQABS B0, B0
  1136. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1137. Opcode |= ((size & 3) << 22);
  1138. Bits Op = new Bits(Opcode);
  1139. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1140. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1141. Vector128<float> V1 = MakeVectorE0(A);
  1142. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1143. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1144. AArch64.V(1, new Bits(A));
  1145. Shared.FPSR = new Bits((uint)Fpsr);
  1146. SimdFp.Sqabs_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  1147. Assert.Multiple(() =>
  1148. {
  1149. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1150. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1151. });
  1152. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1153. CompareAgainstUnicorn();
  1154. }
  1155. [Test, Description("SQABS <Vd>.<T>, <Vn>.<T>")]
  1156. public void Sqabs_V_8B_4H_2S([Values(0u)] uint Rd,
  1157. [Values(1u, 0u)] uint Rn,
  1158. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1159. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1160. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  1161. {
  1162. uint Opcode = 0x0E207800; // SQABS V0.8B, V0.8B
  1163. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1164. Opcode |= ((size & 3) << 22);
  1165. Bits Op = new Bits(Opcode);
  1166. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1167. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1168. Vector128<float> V1 = MakeVectorE0(A);
  1169. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1170. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1171. AArch64.V(1, new Bits(A));
  1172. Shared.FPSR = new Bits((uint)Fpsr);
  1173. SimdFp.Sqabs_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1174. Assert.Multiple(() =>
  1175. {
  1176. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1177. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1178. });
  1179. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1180. CompareAgainstUnicorn();
  1181. }
  1182. [Test, Description("SQABS <Vd>.<T>, <Vn>.<T>")]
  1183. public void Sqabs_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  1184. [Values(1u, 0u)] uint Rn,
  1185. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  1186. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  1187. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  1188. {
  1189. uint Opcode = 0x4E207800; // SQABS V0.16B, V0.16B
  1190. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1191. Opcode |= ((size & 3) << 22);
  1192. Bits Op = new Bits(Opcode);
  1193. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1194. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1195. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1196. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1197. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1198. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1199. Shared.FPSR = new Bits((uint)Fpsr);
  1200. SimdFp.Sqabs_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1201. Assert.Multiple(() =>
  1202. {
  1203. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1204. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1205. });
  1206. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1207. CompareAgainstUnicorn();
  1208. }
  1209. [Test, Description("SQNEG <V><d>, <V><n>")]
  1210. public void Sqneg_S_B_H_S_D([Values(0u)] uint Rd,
  1211. [Values(1u, 0u)] uint Rn,
  1212. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong Z,
  1213. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong A,
  1214. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <B, H, S, D>
  1215. {
  1216. uint Opcode = 0x7E207800; // SQNEG B0, B0
  1217. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1218. Opcode |= ((size & 3) << 22);
  1219. Bits Op = new Bits(Opcode);
  1220. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1221. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1222. Vector128<float> V1 = MakeVectorE0(A);
  1223. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1224. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1225. AArch64.V(1, new Bits(A));
  1226. Shared.FPSR = new Bits((uint)Fpsr);
  1227. SimdFp.Sqneg_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  1228. Assert.Multiple(() =>
  1229. {
  1230. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1231. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1232. });
  1233. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1234. CompareAgainstUnicorn();
  1235. }
  1236. [Test, Description("SQNEG <Vd>.<T>, <Vn>.<T>")]
  1237. public void Sqneg_V_8B_4H_2S([Values(0u)] uint Rd,
  1238. [Values(1u, 0u)] uint Rn,
  1239. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1240. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1241. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  1242. {
  1243. uint Opcode = 0x2E207800; // SQNEG V0.8B, V0.8B
  1244. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1245. Opcode |= ((size & 3) << 22);
  1246. Bits Op = new Bits(Opcode);
  1247. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1248. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1249. Vector128<float> V1 = MakeVectorE0(A);
  1250. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1251. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1252. AArch64.V(1, new Bits(A));
  1253. Shared.FPSR = new Bits((uint)Fpsr);
  1254. SimdFp.Sqneg_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1255. Assert.Multiple(() =>
  1256. {
  1257. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1258. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1259. });
  1260. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1261. CompareAgainstUnicorn();
  1262. }
  1263. [Test, Description("SQNEG <Vd>.<T>, <Vn>.<T>")]
  1264. public void Sqneg_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  1265. [Values(1u, 0u)] uint Rn,
  1266. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  1267. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  1268. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  1269. {
  1270. uint Opcode = 0x6E207800; // SQNEG V0.16B, V0.16B
  1271. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1272. Opcode |= ((size & 3) << 22);
  1273. Bits Op = new Bits(Opcode);
  1274. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1275. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1276. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1277. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1278. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1279. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1280. Shared.FPSR = new Bits((uint)Fpsr);
  1281. SimdFp.Sqneg_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1282. Assert.Multiple(() =>
  1283. {
  1284. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1285. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1286. });
  1287. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1288. CompareAgainstUnicorn();
  1289. }
  1290. [Test, Description("SQXTN <Vb><d>, <Va><n>")]
  1291. public void Sqxtn_S_HB_SH_DS([Values(0u)] uint Rd,
  1292. [Values(1u, 0u)] uint Rn,
  1293. [ValueSource("_1H1S1D_")] [Random(RndCnt)] ulong Z,
  1294. [ValueSource("_1H1S1D_")] [Random(RndCnt)] ulong A,
  1295. [Values(0b00u, 0b01u, 0b10u)] uint size) // <HB, SH, DS>
  1296. {
  1297. uint Opcode = 0x5E214800; // SQXTN B0, H0
  1298. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1299. Opcode |= ((size & 3) << 22);
  1300. Bits Op = new Bits(Opcode);
  1301. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1302. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1303. Vector128<float> V1 = MakeVectorE0(A);
  1304. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1305. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1306. AArch64.V(1, new Bits(A));
  1307. Shared.FPSR = new Bits((uint)Fpsr);
  1308. SimdFp.Sqxtn_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  1309. Assert.Multiple(() =>
  1310. {
  1311. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1312. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1313. });
  1314. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1315. CompareAgainstUnicorn();
  1316. }
  1317. [Test, Description("SQXTN{2} <Vd>.<Tb>, <Vn>.<Ta>")]
  1318. public void Sqxtn_V_8H8B_4S4H_2D2S([Values(0u)] uint Rd,
  1319. [Values(1u, 0u)] uint Rn,
  1320. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  1321. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1322. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H8B, 4S4H, 2D2S>
  1323. {
  1324. uint Opcode = 0x0E214800; // SQXTN V0.8B, V0.8H
  1325. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1326. Opcode |= ((size & 3) << 22);
  1327. Bits Op = new Bits(Opcode);
  1328. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1329. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1330. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1331. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1332. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1333. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1334. Shared.FPSR = new Bits((uint)Fpsr);
  1335. SimdFp.Sqxtn_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1336. Assert.Multiple(() =>
  1337. {
  1338. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1339. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1340. });
  1341. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1342. CompareAgainstUnicorn();
  1343. }
  1344. [Test, Description("SQXTN{2} <Vd>.<Tb>, <Vn>.<Ta>")]
  1345. public void Sqxtn_V_8H16B_4S8H_2D4S([Values(0u)] uint Rd,
  1346. [Values(1u, 0u)] uint Rn,
  1347. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  1348. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1349. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H16B, 4S8H, 2D4S>
  1350. {
  1351. uint Opcode = 0x4E214800; // SQXTN2 V0.16B, V0.8H
  1352. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1353. Opcode |= ((size & 3) << 22);
  1354. Bits Op = new Bits(Opcode);
  1355. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1356. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1357. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1358. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1359. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1360. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1361. Shared.FPSR = new Bits((uint)Fpsr);
  1362. SimdFp.Sqxtn_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1363. Assert.Multiple(() =>
  1364. {
  1365. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1366. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1367. });
  1368. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1369. CompareAgainstUnicorn();
  1370. }
  1371. [Test, Description("SQXTUN <Vb><d>, <Va><n>")]
  1372. public void Sqxtun_S_HB_SH_DS([Values(0u)] uint Rd,
  1373. [Values(1u, 0u)] uint Rn,
  1374. [ValueSource("_1H1S1D_")] [Random(RndCnt)] ulong Z,
  1375. [ValueSource("_1H1S1D_")] [Random(RndCnt)] ulong A,
  1376. [Values(0b00u, 0b01u, 0b10u)] uint size) // <HB, SH, DS>
  1377. {
  1378. uint Opcode = 0x7E212800; // SQXTUN B0, H0
  1379. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1380. Opcode |= ((size & 3) << 22);
  1381. Bits Op = new Bits(Opcode);
  1382. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1383. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1384. Vector128<float> V1 = MakeVectorE0(A);
  1385. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1386. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1387. AArch64.V(1, new Bits(A));
  1388. Shared.FPSR = new Bits((uint)Fpsr);
  1389. SimdFp.Sqxtun_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  1390. Assert.Multiple(() =>
  1391. {
  1392. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1393. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1394. });
  1395. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1396. CompareAgainstUnicorn();
  1397. }
  1398. [Test, Description("SQXTUN{2} <Vd>.<Tb>, <Vn>.<Ta>")]
  1399. public void Sqxtun_V_8H8B_4S4H_2D2S([Values(0u)] uint Rd,
  1400. [Values(1u, 0u)] uint Rn,
  1401. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  1402. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1403. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H8B, 4S4H, 2D2S>
  1404. {
  1405. uint Opcode = 0x2E212800; // SQXTUN V0.8B, V0.8H
  1406. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1407. Opcode |= ((size & 3) << 22);
  1408. Bits Op = new Bits(Opcode);
  1409. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1410. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1411. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1412. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1413. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1414. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1415. Shared.FPSR = new Bits((uint)Fpsr);
  1416. SimdFp.Sqxtun_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1417. Assert.Multiple(() =>
  1418. {
  1419. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1420. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1421. });
  1422. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1423. CompareAgainstUnicorn();
  1424. }
  1425. [Test, Description("SQXTUN{2} <Vd>.<Tb>, <Vn>.<Ta>")]
  1426. public void Sqxtun_V_8H16B_4S8H_2D4S([Values(0u)] uint Rd,
  1427. [Values(1u, 0u)] uint Rn,
  1428. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  1429. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1430. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H16B, 4S8H, 2D4S>
  1431. {
  1432. uint Opcode = 0x6E212800; // SQXTUN2 V0.16B, V0.8H
  1433. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1434. Opcode |= ((size & 3) << 22);
  1435. Bits Op = new Bits(Opcode);
  1436. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1437. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1438. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1439. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1440. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1441. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1442. Shared.FPSR = new Bits((uint)Fpsr);
  1443. SimdFp.Sqxtun_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1444. Assert.Multiple(() =>
  1445. {
  1446. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1447. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1448. });
  1449. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1450. CompareAgainstUnicorn();
  1451. }
  1452. [Test, Description("SUQADD <V><d>, <V><n>")]
  1453. public void Suqadd_S_B_H_S_D([Values(0u)] uint Rd,
  1454. [Values(1u, 0u)] uint Rn,
  1455. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong Z,
  1456. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong A,
  1457. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <B, H, S, D>
  1458. {
  1459. uint Opcode = 0x5E203800; // SUQADD B0, B0
  1460. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1461. Opcode |= ((size & 3) << 22);
  1462. Bits Op = new Bits(Opcode);
  1463. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1464. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1465. Vector128<float> V1 = MakeVectorE0(A);
  1466. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1467. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1468. AArch64.V(1, new Bits(A));
  1469. Shared.FPSR = new Bits((uint)Fpsr);
  1470. SimdFp.Suqadd_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  1471. Assert.Multiple(() =>
  1472. {
  1473. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1474. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1475. });
  1476. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1477. CompareAgainstUnicorn();
  1478. }
  1479. [Test, Description("SUQADD <Vd>.<T>, <Vn>.<T>")]
  1480. public void Suqadd_V_8B_4H_2S([Values(0u)] uint Rd,
  1481. [Values(1u, 0u)] uint Rn,
  1482. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1483. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1484. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  1485. {
  1486. uint Opcode = 0x0E203800; // SUQADD V0.8B, V0.8B
  1487. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1488. Opcode |= ((size & 3) << 22);
  1489. Bits Op = new Bits(Opcode);
  1490. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1491. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1492. Vector128<float> V1 = MakeVectorE0(A);
  1493. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1494. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1495. AArch64.V(1, new Bits(A));
  1496. Shared.FPSR = new Bits((uint)Fpsr);
  1497. SimdFp.Suqadd_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1498. Assert.Multiple(() =>
  1499. {
  1500. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1501. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1502. });
  1503. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1504. CompareAgainstUnicorn();
  1505. }
  1506. [Test, Description("SUQADD <Vd>.<T>, <Vn>.<T>")]
  1507. public void Suqadd_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  1508. [Values(1u, 0u)] uint Rn,
  1509. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  1510. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  1511. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  1512. {
  1513. uint Opcode = 0x4E203800; // SUQADD V0.16B, V0.16B
  1514. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1515. Opcode |= ((size & 3) << 22);
  1516. Bits Op = new Bits(Opcode);
  1517. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1518. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1519. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1520. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1521. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1522. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1523. Shared.FPSR = new Bits((uint)Fpsr);
  1524. SimdFp.Suqadd_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1525. Assert.Multiple(() =>
  1526. {
  1527. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1528. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1529. });
  1530. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1531. CompareAgainstUnicorn();
  1532. }
  1533. [Test, Description("UADALP <Vd>.<Ta>, <Vn>.<Tb>")]
  1534. public void Uadalp_V_8B4H_4H2S_2S1D([Values(0u)] uint Rd,
  1535. [Values(1u, 0u)] uint Rn,
  1536. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1537. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1538. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B4H, 4H2S, 2S1D>
  1539. {
  1540. uint Opcode = 0x2E206800; // UADALP V0.4H, V0.8B
  1541. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1542. Opcode |= ((size & 3) << 22);
  1543. Bits Op = new Bits(Opcode);
  1544. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1545. Vector128<float> V1 = MakeVectorE0(A);
  1546. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  1547. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1548. AArch64.V(1, new Bits(A));
  1549. SimdFp.Uadalp_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1550. Assert.Multiple(() =>
  1551. {
  1552. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1553. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1554. });
  1555. CompareAgainstUnicorn();
  1556. }
  1557. [Test, Description("UADALP <Vd>.<Ta>, <Vn>.<Tb>")]
  1558. public void Uadalp_V_16B8H_8H4S_4S2D([Values(0u)] uint Rd,
  1559. [Values(1u, 0u)] uint Rn,
  1560. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1561. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1562. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H, 8H4S, 4S2D>
  1563. {
  1564. uint Opcode = 0x6E206800; // UADALP V0.8H, V0.16B
  1565. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1566. Opcode |= ((size & 3) << 22);
  1567. Bits Op = new Bits(Opcode);
  1568. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1569. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1570. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  1571. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1572. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1573. SimdFp.Uadalp_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1574. Assert.Multiple(() =>
  1575. {
  1576. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1577. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1578. });
  1579. CompareAgainstUnicorn();
  1580. }
  1581. [Test, Description("UADDLP <Vd>.<Ta>, <Vn>.<Tb>")]
  1582. public void Uaddlp_V_8B4H_4H2S_2S1D([Values(0u)] uint Rd,
  1583. [Values(1u, 0u)] uint Rn,
  1584. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1585. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1586. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B4H, 4H2S, 2S1D>
  1587. {
  1588. uint Opcode = 0x2E202800; // UADDLP V0.4H, V0.8B
  1589. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1590. Opcode |= ((size & 3) << 22);
  1591. Bits Op = new Bits(Opcode);
  1592. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1593. Vector128<float> V1 = MakeVectorE0(A);
  1594. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  1595. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1596. AArch64.V(1, new Bits(A));
  1597. SimdFp.Uaddlp_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1598. Assert.Multiple(() =>
  1599. {
  1600. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1601. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1602. });
  1603. CompareAgainstUnicorn();
  1604. }
  1605. [Test, Description("UADDLP <Vd>.<Ta>, <Vn>.<Tb>")]
  1606. public void Uaddlp_V_16B8H_8H4S_4S2D([Values(0u)] uint Rd,
  1607. [Values(1u, 0u)] uint Rn,
  1608. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1609. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1610. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H, 8H4S, 4S2D>
  1611. {
  1612. uint Opcode = 0x6E202800; // UADDLP V0.8H, V0.16B
  1613. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1614. Opcode |= ((size & 3) << 22);
  1615. Bits Op = new Bits(Opcode);
  1616. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1617. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1618. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  1619. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1620. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1621. SimdFp.Uaddlp_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1622. Assert.Multiple(() =>
  1623. {
  1624. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1625. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1626. });
  1627. CompareAgainstUnicorn();
  1628. }
  1629. [Test, Description("UQXTN <Vb><d>, <Va><n>")]
  1630. public void Uqxtn_S_HB_SH_DS([Values(0u)] uint Rd,
  1631. [Values(1u, 0u)] uint Rn,
  1632. [ValueSource("_1H1S1D_")] [Random(RndCnt)] ulong Z,
  1633. [ValueSource("_1H1S1D_")] [Random(RndCnt)] ulong A,
  1634. [Values(0b00u, 0b01u, 0b10u)] uint size) // <HB, SH, DS>
  1635. {
  1636. uint Opcode = 0x7E214800; // UQXTN B0, H0
  1637. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1638. Opcode |= ((size & 3) << 22);
  1639. Bits Op = new Bits(Opcode);
  1640. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1641. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1642. Vector128<float> V1 = MakeVectorE0(A);
  1643. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1644. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1645. AArch64.V(1, new Bits(A));
  1646. Shared.FPSR = new Bits((uint)Fpsr);
  1647. SimdFp.Uqxtn_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  1648. Assert.Multiple(() =>
  1649. {
  1650. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1651. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1652. });
  1653. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1654. CompareAgainstUnicorn();
  1655. }
  1656. [Test, Description("UQXTN{2} <Vd>.<Tb>, <Vn>.<Ta>")]
  1657. public void Uqxtn_V_8H8B_4S4H_2D2S([Values(0u)] uint Rd,
  1658. [Values(1u, 0u)] uint Rn,
  1659. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  1660. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1661. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H8B, 4S4H, 2D2S>
  1662. {
  1663. uint Opcode = 0x2E214800; // UQXTN V0.8B, V0.8H
  1664. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1665. Opcode |= ((size & 3) << 22);
  1666. Bits Op = new Bits(Opcode);
  1667. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1668. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1669. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1670. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1671. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1672. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1673. Shared.FPSR = new Bits((uint)Fpsr);
  1674. SimdFp.Uqxtn_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1675. Assert.Multiple(() =>
  1676. {
  1677. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1678. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1679. });
  1680. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1681. CompareAgainstUnicorn();
  1682. }
  1683. [Test, Description("UQXTN{2} <Vd>.<Tb>, <Vn>.<Ta>")]
  1684. public void Uqxtn_V_8H16B_4S8H_2D4S([Values(0u)] uint Rd,
  1685. [Values(1u, 0u)] uint Rn,
  1686. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  1687. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1688. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H16B, 4S8H, 2D4S>
  1689. {
  1690. uint Opcode = 0x6E214800; // UQXTN2 V0.16B, V0.8H
  1691. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1692. Opcode |= ((size & 3) << 22);
  1693. Bits Op = new Bits(Opcode);
  1694. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1695. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1696. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1697. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1698. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1699. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1700. Shared.FPSR = new Bits((uint)Fpsr);
  1701. SimdFp.Uqxtn_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1702. Assert.Multiple(() =>
  1703. {
  1704. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1705. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1706. });
  1707. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1708. CompareAgainstUnicorn();
  1709. }
  1710. [Test, Description("USQADD <V><d>, <V><n>")]
  1711. public void Usqadd_S_B_H_S_D([Values(0u)] uint Rd,
  1712. [Values(1u, 0u)] uint Rn,
  1713. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong Z,
  1714. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong A,
  1715. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <B, H, S, D>
  1716. {
  1717. uint Opcode = 0x7E203800; // USQADD B0, B0
  1718. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1719. Opcode |= ((size & 3) << 22);
  1720. Bits Op = new Bits(Opcode);
  1721. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1722. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1723. Vector128<float> V1 = MakeVectorE0(A);
  1724. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1725. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1726. AArch64.V(1, new Bits(A));
  1727. Shared.FPSR = new Bits((uint)Fpsr);
  1728. SimdFp.Usqadd_S(Op[23, 22], Op[9, 5], Op[4, 0]);
  1729. Assert.Multiple(() =>
  1730. {
  1731. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1732. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1733. });
  1734. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1735. CompareAgainstUnicorn();
  1736. }
  1737. [Test, Description("USQADD <Vd>.<T>, <Vn>.<T>")]
  1738. public void Usqadd_V_8B_4H_2S([Values(0u)] uint Rd,
  1739. [Values(1u, 0u)] uint Rn,
  1740. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1741. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1742. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  1743. {
  1744. uint Opcode = 0x2E203800; // USQADD V0.8B, V0.8B
  1745. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1746. Opcode |= ((size & 3) << 22);
  1747. Bits Op = new Bits(Opcode);
  1748. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1749. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1750. Vector128<float> V1 = MakeVectorE0(A);
  1751. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1752. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1753. AArch64.V(1, new Bits(A));
  1754. Shared.FPSR = new Bits((uint)Fpsr);
  1755. SimdFp.Usqadd_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1756. Assert.Multiple(() =>
  1757. {
  1758. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1759. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1760. });
  1761. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1762. CompareAgainstUnicorn();
  1763. }
  1764. [Test, Description("USQADD <Vd>.<T>, <Vn>.<T>")]
  1765. public void Usqadd_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  1766. [Values(1u, 0u)] uint Rn,
  1767. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  1768. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  1769. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  1770. {
  1771. uint Opcode = 0x6E203800; // USQADD V0.16B, V0.16B
  1772. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1773. Opcode |= ((size & 3) << 22);
  1774. Bits Op = new Bits(Opcode);
  1775. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1776. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1777. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1778. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, Fpsr: Fpsr);
  1779. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1780. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1781. Shared.FPSR = new Bits((uint)Fpsr);
  1782. SimdFp.Usqadd_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1783. Assert.Multiple(() =>
  1784. {
  1785. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1786. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1787. });
  1788. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1789. CompareAgainstUnicorn();
  1790. }
  1791. [Test, Description("XTN{2} <Vd>.<Tb>, <Vn>.<Ta>")]
  1792. public void Xtn_V_8H8B_4S4H_2D2S([Values(0u)] uint Rd,
  1793. [Values(1u, 0u)] uint Rn,
  1794. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  1795. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1796. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H8B, 4S4H, 2D2S>
  1797. {
  1798. uint Opcode = 0x0E212800; // XTN V0.8B, V0.8H
  1799. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1800. Opcode |= ((size & 3) << 22);
  1801. Bits Op = new Bits(Opcode);
  1802. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1803. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1804. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  1805. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1806. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1807. SimdFp.Xtn_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1808. Assert.Multiple(() =>
  1809. {
  1810. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1811. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1812. });
  1813. CompareAgainstUnicorn();
  1814. }
  1815. [Test, Description("XTN{2} <Vd>.<Tb>, <Vn>.<Ta>")]
  1816. public void Xtn_V_8H16B_4S8H_2D4S([Values(0u)] uint Rd,
  1817. [Values(1u, 0u)] uint Rn,
  1818. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  1819. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1820. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H16B, 4S8H, 2D4S>
  1821. {
  1822. uint Opcode = 0x4E212800; // XTN2 V0.16B, V0.8H
  1823. Opcode |= ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1824. Opcode |= ((size & 3) << 22);
  1825. Bits Op = new Bits(Opcode);
  1826. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1827. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1828. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1);
  1829. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1830. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1831. SimdFp.Xtn_V(Op[30], Op[23, 22], Op[9, 5], Op[4, 0]);
  1832. Assert.Multiple(() =>
  1833. {
  1834. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1835. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1836. });
  1837. CompareAgainstUnicorn();
  1838. }
  1839. #endif
  1840. }
  1841. }