CpuTestSimd.cs 101 KB

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