CpuTestSimd.cs 77 KB

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