CpuTestSimdReg.cs 163 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115
  1. #define SimdReg
  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("SimdReg")/*, Ignore("Tested: second half of 2018.")*/]
  10. public sealed class CpuTestSimdReg : CpuTest
  11. {
  12. #if SimdReg
  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[] _4H2S1D_()
  35. {
  36. return new ulong[] { 0x0000000000000000ul, 0x7FFF7FFF7FFF7FFFul,
  37. 0x8000800080008000ul, 0x7FFFFFFF7FFFFFFFul,
  38. 0x8000000080000000ul, 0x7FFFFFFFFFFFFFFFul,
  39. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul };
  40. }
  41. private static ulong[] _8B_()
  42. {
  43. return new ulong[] { 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful,
  44. 0x8080808080808080ul, 0xFFFFFFFFFFFFFFFFul };
  45. }
  46. private static ulong[] _8B4H2S_()
  47. {
  48. return new ulong[] { 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful,
  49. 0x8080808080808080ul, 0x7FFF7FFF7FFF7FFFul,
  50. 0x8000800080008000ul, 0x7FFFFFFF7FFFFFFFul,
  51. 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul };
  52. }
  53. private static ulong[] _8B4H2S1D_()
  54. {
  55. return new ulong[] { 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful,
  56. 0x8080808080808080ul, 0x7FFF7FFF7FFF7FFFul,
  57. 0x8000800080008000ul, 0x7FFFFFFF7FFFFFFFul,
  58. 0x8000000080000000ul, 0x7FFFFFFFFFFFFFFFul,
  59. 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul };
  60. }
  61. #endregion
  62. private const int RndCnt = 4;
  63. [Test, Pairwise, Description("ADD <V><d>, <V><n>, <V><m>")]
  64. public void Add_S_D([Values(0u)] uint Rd,
  65. [Values(1u, 0u)] uint Rn,
  66. [Values(2u, 0u)] uint Rm,
  67. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  68. [ValueSource("_1D_")] [Random(RndCnt)] ulong A,
  69. [ValueSource("_1D_")] [Random(RndCnt)] ulong B)
  70. {
  71. uint Opcode = 0x5EE08400; // ADD D0, D0, D0
  72. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  73. Bits Op = new Bits(Opcode);
  74. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  75. Vector128<float> V1 = MakeVectorE0(A);
  76. Vector128<float> V2 = MakeVectorE0(B);
  77. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  78. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  79. AArch64.V(1, new Bits(A));
  80. AArch64.V(2, new Bits(B));
  81. SimdFp.Add_S(Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  82. Assert.Multiple(() =>
  83. {
  84. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  85. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  86. });
  87. }
  88. [Test, Pairwise, Description("ADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  89. public void Add_V_8B_4H_2S([Values(0u)] uint Rd,
  90. [Values(1u, 0u)] uint Rn,
  91. [Values(2u, 0u)] uint Rm,
  92. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  93. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  94. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  95. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  96. {
  97. uint Opcode = 0x0E208400; // ADD V0.8B, V0.8B, V0.8B
  98. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  99. Opcode |= ((size & 3) << 22);
  100. Bits Op = new Bits(Opcode);
  101. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  102. Vector128<float> V1 = MakeVectorE0(A);
  103. Vector128<float> V2 = MakeVectorE0(B);
  104. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  105. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  106. AArch64.V(1, new Bits(A));
  107. AArch64.V(2, new Bits(B));
  108. SimdFp.Add_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  109. Assert.Multiple(() =>
  110. {
  111. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  112. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  113. });
  114. }
  115. [Test, Pairwise, Description("ADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  116. public void Add_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  117. [Values(1u, 0u)] uint Rn,
  118. [Values(2u, 0u)] uint Rm,
  119. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  120. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  121. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  122. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  123. {
  124. uint Opcode = 0x4E208400; // ADD V0.16B, V0.16B, V0.16B
  125. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  126. Opcode |= ((size & 3) << 22);
  127. Bits Op = new Bits(Opcode);
  128. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  129. Vector128<float> V1 = MakeVectorE0E1(A, A);
  130. Vector128<float> V2 = MakeVectorE0E1(B, B);
  131. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  132. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  133. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  134. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  135. SimdFp.Add_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  136. Assert.Multiple(() =>
  137. {
  138. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  139. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  140. });
  141. }
  142. [Test, Pairwise, Description("ADDHN{2} <Vd>.<Tb>, <Vn>.<Ta>, <Vm>.<Ta>")]
  143. public void Addhn_V_8H8B_4S4H_2D2S([Values(0u)] uint Rd,
  144. [Values(1u, 0u)] uint Rn,
  145. [Values(2u, 0u)] uint Rm,
  146. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  147. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  148. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong B,
  149. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H8B, 4S4H, 2D2S>
  150. {
  151. uint Opcode = 0x0E204000; // ADDHN V0.8B, V0.8H, V0.8H
  152. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  153. Opcode |= ((size & 3) << 22);
  154. Bits Op = new Bits(Opcode);
  155. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  156. Vector128<float> V1 = MakeVectorE0E1(A, A);
  157. Vector128<float> V2 = MakeVectorE0E1(B, B);
  158. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  159. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  160. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  161. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  162. SimdFp.Addhn_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  163. Assert.Multiple(() =>
  164. {
  165. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  166. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  167. });
  168. }
  169. [Test, Pairwise, Description("ADDHN{2} <Vd>.<Tb>, <Vn>.<Ta>, <Vm>.<Ta>")]
  170. public void Addhn_V_8H16B_4S8H_2D4S([Values(0u)] uint Rd,
  171. [Values(1u, 0u)] uint Rn,
  172. [Values(2u, 0u)] uint Rm,
  173. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  174. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  175. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong B,
  176. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H16B, 4S8H, 2D4S>
  177. {
  178. uint Opcode = 0x4E204000; // ADDHN2 V0.16B, V0.8H, V0.8H
  179. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  180. Opcode |= ((size & 3) << 22);
  181. Bits Op = new Bits(Opcode);
  182. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  183. Vector128<float> V1 = MakeVectorE0E1(A, A);
  184. Vector128<float> V2 = MakeVectorE0E1(B, B);
  185. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  186. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  187. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  188. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  189. SimdFp.Addhn_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  190. Assert.Multiple(() =>
  191. {
  192. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  193. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  194. });
  195. }
  196. [Test, Pairwise, Description("ADDP <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  197. public void Addp_V_8B_4H_2S([Values(0u)] uint Rd,
  198. [Values(1u, 0u)] uint Rn,
  199. [Values(2u, 0u)] uint Rm,
  200. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  201. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  202. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  203. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  204. {
  205. uint Opcode = 0x0E20BC00; // ADDP V0.8B, V0.8B, V0.8B
  206. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  207. Opcode |= ((size & 3) << 22);
  208. Bits Op = new Bits(Opcode);
  209. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  210. Vector128<float> V1 = MakeVectorE0(A);
  211. Vector128<float> V2 = MakeVectorE0(B);
  212. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  213. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  214. AArch64.V(1, new Bits(A));
  215. AArch64.V(2, new Bits(B));
  216. SimdFp.Addp_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  217. Assert.Multiple(() =>
  218. {
  219. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  220. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  221. });
  222. }
  223. [Test, Pairwise, Description("ADDP <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  224. public void Addp_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  225. [Values(1u, 0u)] uint Rn,
  226. [Values(2u, 0u)] uint Rm,
  227. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  228. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  229. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  230. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  231. {
  232. uint Opcode = 0x4E20BC00; // ADDP V0.16B, V0.16B, V0.16B
  233. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  234. Opcode |= ((size & 3) << 22);
  235. Bits Op = new Bits(Opcode);
  236. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  237. Vector128<float> V1 = MakeVectorE0E1(A, A);
  238. Vector128<float> V2 = MakeVectorE0E1(B, B);
  239. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  240. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  241. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  242. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  243. SimdFp.Addp_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  244. Assert.Multiple(() =>
  245. {
  246. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  247. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  248. });
  249. }
  250. [Test, Pairwise, Description("AND <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  251. public void And_V_8B([Values(0u)] uint Rd,
  252. [Values(1u, 0u)] uint Rn,
  253. [Values(2u, 0u)] uint Rm,
  254. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  255. [ValueSource("_8B_")] [Random(RndCnt)] ulong A,
  256. [ValueSource("_8B_")] [Random(RndCnt)] ulong B)
  257. {
  258. uint Opcode = 0x0E201C00; // AND V0.8B, V0.8B, V0.8B
  259. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  260. Bits Op = new Bits(Opcode);
  261. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  262. Vector128<float> V1 = MakeVectorE0(A);
  263. Vector128<float> V2 = MakeVectorE0(B);
  264. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  265. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  266. AArch64.V(1, new Bits(A));
  267. AArch64.V(2, new Bits(B));
  268. SimdFp.And_V(Op[30], Op[20, 16], Op[9, 5], Op[4, 0]);
  269. Assert.Multiple(() =>
  270. {
  271. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  272. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  273. });
  274. }
  275. [Test, Pairwise, Description("AND <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  276. public void And_V_16B([Values(0u)] uint Rd,
  277. [Values(1u, 0u)] uint Rn,
  278. [Values(2u, 0u)] uint Rm,
  279. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  280. [ValueSource("_8B_")] [Random(RndCnt)] ulong A,
  281. [ValueSource("_8B_")] [Random(RndCnt)] ulong B)
  282. {
  283. uint Opcode = 0x4E201C00; // AND V0.16B, V0.16B, V0.16B
  284. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  285. Bits Op = new Bits(Opcode);
  286. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  287. Vector128<float> V1 = MakeVectorE0E1(A, A);
  288. Vector128<float> V2 = MakeVectorE0E1(B, B);
  289. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  290. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  291. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  292. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  293. SimdFp.And_V(Op[30], Op[20, 16], Op[9, 5], Op[4, 0]);
  294. Assert.Multiple(() =>
  295. {
  296. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  297. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  298. });
  299. }
  300. [Test, Pairwise, Description("BIC <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  301. public void Bic_V_8B([Values(0u)] uint Rd,
  302. [Values(1u, 0u)] uint Rn,
  303. [Values(2u, 0u)] uint Rm,
  304. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  305. [ValueSource("_8B_")] [Random(RndCnt)] ulong A,
  306. [ValueSource("_8B_")] [Random(RndCnt)] ulong B)
  307. {
  308. uint Opcode = 0x0E601C00; // BIC V0.8B, V0.8B, V0.8B
  309. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  310. Bits Op = new Bits(Opcode);
  311. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  312. Vector128<float> V1 = MakeVectorE0(A);
  313. Vector128<float> V2 = MakeVectorE0(B);
  314. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  315. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  316. AArch64.V(1, new Bits(A));
  317. AArch64.V(2, new Bits(B));
  318. SimdFp.Bic_V(Op[30], Op[20, 16], Op[9, 5], Op[4, 0]);
  319. Assert.Multiple(() =>
  320. {
  321. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  322. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  323. });
  324. }
  325. [Test, Pairwise, Description("BIC <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  326. public void Bic_V_16B([Values(0u)] uint Rd,
  327. [Values(1u, 0u)] uint Rn,
  328. [Values(2u, 0u)] uint Rm,
  329. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  330. [ValueSource("_8B_")] [Random(RndCnt)] ulong A,
  331. [ValueSource("_8B_")] [Random(RndCnt)] ulong B)
  332. {
  333. uint Opcode = 0x4E601C00; // BIC V0.16B, V0.16B, V0.16B
  334. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  335. Bits Op = new Bits(Opcode);
  336. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  337. Vector128<float> V1 = MakeVectorE0E1(A, A);
  338. Vector128<float> V2 = MakeVectorE0E1(B, B);
  339. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  340. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  341. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  342. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  343. SimdFp.Bic_V(Op[30], Op[20, 16], Op[9, 5], Op[4, 0]);
  344. Assert.Multiple(() =>
  345. {
  346. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  347. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  348. });
  349. }
  350. [Test, Pairwise, Description("BIF <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  351. public void Bif_V_8B([Values(0u)] uint Rd,
  352. [Values(1u, 0u)] uint Rn,
  353. [Values(2u, 0u)] uint Rm,
  354. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  355. [ValueSource("_8B_")] [Random(RndCnt)] ulong A,
  356. [ValueSource("_8B_")] [Random(RndCnt)] ulong B)
  357. {
  358. uint Opcode = 0x2EE01C00; // BIF V0.8B, V0.8B, V0.8B
  359. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  360. Bits Op = new Bits(Opcode);
  361. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  362. Vector128<float> V1 = MakeVectorE0(A);
  363. Vector128<float> V2 = MakeVectorE0(B);
  364. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  365. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  366. AArch64.V(1, new Bits(A));
  367. AArch64.V(2, new Bits(B));
  368. SimdFp.Bif_V(Op[30], Op[20, 16], Op[9, 5], Op[4, 0]);
  369. Assert.Multiple(() =>
  370. {
  371. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  372. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  373. });
  374. }
  375. [Test, Pairwise, Description("BIF <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  376. public void Bif_V_16B([Values(0u)] uint Rd,
  377. [Values(1u, 0u)] uint Rn,
  378. [Values(2u, 0u)] uint Rm,
  379. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  380. [ValueSource("_8B_")] [Random(RndCnt)] ulong A,
  381. [ValueSource("_8B_")] [Random(RndCnt)] ulong B)
  382. {
  383. uint Opcode = 0x6EE01C00; // BIF V0.16B, V0.16B, V0.16B
  384. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  385. Bits Op = new Bits(Opcode);
  386. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  387. Vector128<float> V1 = MakeVectorE0E1(A, A);
  388. Vector128<float> V2 = MakeVectorE0E1(B, B);
  389. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  390. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  391. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  392. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  393. SimdFp.Bif_V(Op[30], Op[20, 16], Op[9, 5], Op[4, 0]);
  394. Assert.Multiple(() =>
  395. {
  396. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  397. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  398. });
  399. }
  400. [Test, Pairwise, Description("BIT <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  401. public void Bit_V_8B([Values(0u)] uint Rd,
  402. [Values(1u, 0u)] uint Rn,
  403. [Values(2u, 0u)] uint Rm,
  404. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  405. [ValueSource("_8B_")] [Random(RndCnt)] ulong A,
  406. [ValueSource("_8B_")] [Random(RndCnt)] ulong B)
  407. {
  408. uint Opcode = 0x2EA01C00; // BIT V0.8B, V0.8B, V0.8B
  409. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  410. Bits Op = new Bits(Opcode);
  411. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  412. Vector128<float> V1 = MakeVectorE0(A);
  413. Vector128<float> V2 = MakeVectorE0(B);
  414. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  415. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  416. AArch64.V(1, new Bits(A));
  417. AArch64.V(2, new Bits(B));
  418. SimdFp.Bit_V(Op[30], Op[20, 16], Op[9, 5], Op[4, 0]);
  419. Assert.Multiple(() =>
  420. {
  421. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  422. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  423. });
  424. }
  425. [Test, Pairwise, Description("BIT <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  426. public void Bit_V_16B([Values(0u)] uint Rd,
  427. [Values(1u, 0u)] uint Rn,
  428. [Values(2u, 0u)] uint Rm,
  429. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  430. [ValueSource("_8B_")] [Random(RndCnt)] ulong A,
  431. [ValueSource("_8B_")] [Random(RndCnt)] ulong B)
  432. {
  433. uint Opcode = 0x6EA01C00; // BIT V0.16B, V0.16B, V0.16B
  434. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  435. Bits Op = new Bits(Opcode);
  436. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  437. Vector128<float> V1 = MakeVectorE0E1(A, A);
  438. Vector128<float> V2 = MakeVectorE0E1(B, B);
  439. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  440. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  441. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  442. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  443. SimdFp.Bit_V(Op[30], Op[20, 16], Op[9, 5], Op[4, 0]);
  444. Assert.Multiple(() =>
  445. {
  446. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  447. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  448. });
  449. }
  450. [Test, Pairwise, Description("BSL <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  451. public void Bsl_V_8B([Values(0u)] uint Rd,
  452. [Values(1u, 0u)] uint Rn,
  453. [Values(2u, 0u)] uint Rm,
  454. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  455. [ValueSource("_8B_")] [Random(RndCnt)] ulong A,
  456. [ValueSource("_8B_")] [Random(RndCnt)] ulong B)
  457. {
  458. uint Opcode = 0x2E601C00; // BSL V0.8B, V0.8B, V0.8B
  459. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  460. Bits Op = new Bits(Opcode);
  461. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  462. Vector128<float> V1 = MakeVectorE0(A);
  463. Vector128<float> V2 = MakeVectorE0(B);
  464. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  465. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  466. AArch64.V(1, new Bits(A));
  467. AArch64.V(2, new Bits(B));
  468. SimdFp.Bsl_V(Op[30], Op[20, 16], Op[9, 5], Op[4, 0]);
  469. Assert.Multiple(() =>
  470. {
  471. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  472. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  473. });
  474. }
  475. [Test, Pairwise, Description("BSL <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  476. public void Bsl_V_16B([Values(0u)] uint Rd,
  477. [Values(1u, 0u)] uint Rn,
  478. [Values(2u, 0u)] uint Rm,
  479. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  480. [ValueSource("_8B_")] [Random(RndCnt)] ulong A,
  481. [ValueSource("_8B_")] [Random(RndCnt)] ulong B)
  482. {
  483. uint Opcode = 0x6E601C00; // BSL V0.16B, V0.16B, V0.16B
  484. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  485. Bits Op = new Bits(Opcode);
  486. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  487. Vector128<float> V1 = MakeVectorE0E1(A, A);
  488. Vector128<float> V2 = MakeVectorE0E1(B, B);
  489. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  490. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  491. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  492. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  493. SimdFp.Bsl_V(Op[30], Op[20, 16], Op[9, 5], Op[4, 0]);
  494. Assert.Multiple(() =>
  495. {
  496. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  497. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  498. });
  499. }
  500. [Test, Pairwise, Description("CMEQ <V><d>, <V><n>, <V><m>")]
  501. public void Cmeq_S_D([Values(0u)] uint Rd,
  502. [Values(1u, 0u)] uint Rn,
  503. [Values(2u, 0u)] uint Rm,
  504. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  505. [ValueSource("_1D_")] [Random(RndCnt)] ulong A,
  506. [ValueSource("_1D_")] [Random(RndCnt)] ulong B)
  507. {
  508. uint Opcode = 0x7EE08C00; // CMEQ D0, D0, D0
  509. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  510. Bits Op = new Bits(Opcode);
  511. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  512. Vector128<float> V1 = MakeVectorE0(A);
  513. Vector128<float> V2 = MakeVectorE0(B);
  514. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  515. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  516. AArch64.V(1, new Bits(A));
  517. AArch64.V(2, new Bits(B));
  518. SimdFp.Cmeq_Reg_S(Op[23, 22], Op[20, 16], 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, Pairwise, Description("CMEQ <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  526. public void Cmeq_V_8B_4H_2S([Values(0u)] uint Rd,
  527. [Values(1u, 0u)] uint Rn,
  528. [Values(2u, 0u)] uint Rm,
  529. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  530. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  531. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  532. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  533. {
  534. uint Opcode = 0x2E208C00; // CMEQ V0.8B, V0.8B, V0.8B
  535. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  536. Opcode |= ((size & 3) << 22);
  537. Bits Op = new Bits(Opcode);
  538. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  539. Vector128<float> V1 = MakeVectorE0(A);
  540. Vector128<float> V2 = MakeVectorE0(B);
  541. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  542. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  543. AArch64.V(1, new Bits(A));
  544. AArch64.V(2, new Bits(B));
  545. SimdFp.Cmeq_Reg_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  546. Assert.Multiple(() =>
  547. {
  548. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  549. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  550. });
  551. }
  552. [Test, Pairwise, Description("CMEQ <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  553. public void Cmeq_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  554. [Values(1u, 0u)] uint Rn,
  555. [Values(2u, 0u)] uint Rm,
  556. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  557. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  558. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  559. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  560. {
  561. uint Opcode = 0x6E208C00; // CMEQ V0.16B, V0.16B, V0.16B
  562. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  563. Opcode |= ((size & 3) << 22);
  564. Bits Op = new Bits(Opcode);
  565. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  566. Vector128<float> V1 = MakeVectorE0E1(A, A);
  567. Vector128<float> V2 = MakeVectorE0E1(B, B);
  568. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  569. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  570. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  571. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  572. SimdFp.Cmeq_Reg_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  573. Assert.Multiple(() =>
  574. {
  575. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  576. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  577. });
  578. }
  579. [Test, Pairwise, Description("CMGE <V><d>, <V><n>, <V><m>")]
  580. public void Cmge_S_D([Values(0u)] uint Rd,
  581. [Values(1u, 0u)] uint Rn,
  582. [Values(2u, 0u)] uint Rm,
  583. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  584. [ValueSource("_1D_")] [Random(RndCnt)] ulong A,
  585. [ValueSource("_1D_")] [Random(RndCnt)] ulong B)
  586. {
  587. uint Opcode = 0x5EE03C00; // CMGE D0, D0, D0
  588. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  589. Bits Op = new Bits(Opcode);
  590. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  591. Vector128<float> V1 = MakeVectorE0(A);
  592. Vector128<float> V2 = MakeVectorE0(B);
  593. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  594. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  595. AArch64.V(1, new Bits(A));
  596. AArch64.V(2, new Bits(B));
  597. SimdFp.Cmge_Reg_S(Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  598. Assert.Multiple(() =>
  599. {
  600. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  601. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  602. });
  603. }
  604. [Test, Pairwise, Description("CMGE <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  605. public void Cmge_V_8B_4H_2S([Values(0u)] uint Rd,
  606. [Values(1u, 0u)] uint Rn,
  607. [Values(2u, 0u)] uint Rm,
  608. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  609. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  610. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  611. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  612. {
  613. uint Opcode = 0x0E203C00; // CMGE V0.8B, V0.8B, V0.8B
  614. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  615. Opcode |= ((size & 3) << 22);
  616. Bits Op = new Bits(Opcode);
  617. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  618. Vector128<float> V1 = MakeVectorE0(A);
  619. Vector128<float> V2 = MakeVectorE0(B);
  620. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  621. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  622. AArch64.V(1, new Bits(A));
  623. AArch64.V(2, new Bits(B));
  624. SimdFp.Cmge_Reg_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  625. Assert.Multiple(() =>
  626. {
  627. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  628. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  629. });
  630. }
  631. [Test, Pairwise, Description("CMGE <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  632. public void Cmge_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  633. [Values(1u, 0u)] uint Rn,
  634. [Values(2u, 0u)] uint Rm,
  635. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  636. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  637. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  638. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  639. {
  640. uint Opcode = 0x4E203C00; // CMGE V0.16B, V0.16B, V0.16B
  641. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  642. Opcode |= ((size & 3) << 22);
  643. Bits Op = new Bits(Opcode);
  644. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  645. Vector128<float> V1 = MakeVectorE0E1(A, A);
  646. Vector128<float> V2 = MakeVectorE0E1(B, B);
  647. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  648. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  649. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  650. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  651. SimdFp.Cmge_Reg_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  652. Assert.Multiple(() =>
  653. {
  654. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  655. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  656. });
  657. }
  658. [Test, Pairwise, Description("CMGT <V><d>, <V><n>, <V><m>")]
  659. public void Cmgt_S_D([Values(0u)] uint Rd,
  660. [Values(1u, 0u)] uint Rn,
  661. [Values(2u, 0u)] uint Rm,
  662. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  663. [ValueSource("_1D_")] [Random(RndCnt)] ulong A,
  664. [ValueSource("_1D_")] [Random(RndCnt)] ulong B)
  665. {
  666. uint Opcode = 0x5EE03400; // CMGT D0, D0, D0
  667. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  668. Bits Op = new Bits(Opcode);
  669. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  670. Vector128<float> V1 = MakeVectorE0(A);
  671. Vector128<float> V2 = MakeVectorE0(B);
  672. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  673. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  674. AArch64.V(1, new Bits(A));
  675. AArch64.V(2, new Bits(B));
  676. SimdFp.Cmgt_Reg_S(Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  677. Assert.Multiple(() =>
  678. {
  679. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  680. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  681. });
  682. }
  683. [Test, Pairwise, Description("CMGT <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  684. public void Cmgt_V_8B_4H_2S([Values(0u)] uint Rd,
  685. [Values(1u, 0u)] uint Rn,
  686. [Values(2u, 0u)] uint Rm,
  687. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  688. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  689. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  690. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  691. {
  692. uint Opcode = 0x0E203400; // CMGT V0.8B, V0.8B, V0.8B
  693. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  694. Opcode |= ((size & 3) << 22);
  695. Bits Op = new Bits(Opcode);
  696. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  697. Vector128<float> V1 = MakeVectorE0(A);
  698. Vector128<float> V2 = MakeVectorE0(B);
  699. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  700. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  701. AArch64.V(1, new Bits(A));
  702. AArch64.V(2, new Bits(B));
  703. SimdFp.Cmgt_Reg_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  704. Assert.Multiple(() =>
  705. {
  706. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  707. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  708. });
  709. }
  710. [Test, Pairwise, Description("CMGT <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  711. public void Cmgt_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  712. [Values(1u, 0u)] uint Rn,
  713. [Values(2u, 0u)] uint Rm,
  714. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  715. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  716. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  717. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  718. {
  719. uint Opcode = 0x4E203400; // CMGT V0.16B, V0.16B, V0.16B
  720. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  721. Opcode |= ((size & 3) << 22);
  722. Bits Op = new Bits(Opcode);
  723. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  724. Vector128<float> V1 = MakeVectorE0E1(A, A);
  725. Vector128<float> V2 = MakeVectorE0E1(B, B);
  726. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  727. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  728. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  729. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  730. SimdFp.Cmgt_Reg_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  731. Assert.Multiple(() =>
  732. {
  733. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  734. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  735. });
  736. }
  737. [Test, Pairwise, Description("CMHI <V><d>, <V><n>, <V><m>")]
  738. public void Cmhi_S_D([Values(0u)] uint Rd,
  739. [Values(1u, 0u)] uint Rn,
  740. [Values(2u, 0u)] uint Rm,
  741. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  742. [ValueSource("_1D_")] [Random(RndCnt)] ulong A,
  743. [ValueSource("_1D_")] [Random(RndCnt)] ulong B)
  744. {
  745. uint Opcode = 0x7EE03400; // CMHI D0, D0, D0
  746. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  747. Bits Op = new Bits(Opcode);
  748. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  749. Vector128<float> V1 = MakeVectorE0(A);
  750. Vector128<float> V2 = MakeVectorE0(B);
  751. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  752. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  753. AArch64.V(1, new Bits(A));
  754. AArch64.V(2, new Bits(B));
  755. SimdFp.Cmhi_S(Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  756. Assert.Multiple(() =>
  757. {
  758. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  759. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  760. });
  761. }
  762. [Test, Pairwise, Description("CMHI <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  763. public void Cmhi_V_8B_4H_2S([Values(0u)] uint Rd,
  764. [Values(1u, 0u)] uint Rn,
  765. [Values(2u, 0u)] uint Rm,
  766. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  767. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  768. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  769. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  770. {
  771. uint Opcode = 0x2E203400; // CMHI V0.8B, V0.8B, V0.8B
  772. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  773. Opcode |= ((size & 3) << 22);
  774. Bits Op = new Bits(Opcode);
  775. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  776. Vector128<float> V1 = MakeVectorE0(A);
  777. Vector128<float> V2 = MakeVectorE0(B);
  778. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  779. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  780. AArch64.V(1, new Bits(A));
  781. AArch64.V(2, new Bits(B));
  782. SimdFp.Cmhi_V(Op[30], Op[23, 22], Op[20, 16], 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, Pairwise, Description("CMHI <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  790. public void Cmhi_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  791. [Values(1u, 0u)] uint Rn,
  792. [Values(2u, 0u)] uint Rm,
  793. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  794. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  795. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  796. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  797. {
  798. uint Opcode = 0x6E203400; // CMHI V0.16B, V0.16B, V0.16B
  799. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  800. Opcode |= ((size & 3) << 22);
  801. Bits Op = new Bits(Opcode);
  802. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  803. Vector128<float> V1 = MakeVectorE0E1(A, A);
  804. Vector128<float> V2 = MakeVectorE0E1(B, B);
  805. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  806. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  807. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  808. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  809. SimdFp.Cmhi_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  810. Assert.Multiple(() =>
  811. {
  812. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  813. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  814. });
  815. }
  816. [Test, Pairwise, Description("CMHS <V><d>, <V><n>, <V><m>")]
  817. public void Cmhs_S_D([Values(0u)] uint Rd,
  818. [Values(1u, 0u)] uint Rn,
  819. [Values(2u, 0u)] uint Rm,
  820. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  821. [ValueSource("_1D_")] [Random(RndCnt)] ulong A,
  822. [ValueSource("_1D_")] [Random(RndCnt)] ulong B)
  823. {
  824. uint Opcode = 0x7EE03C00; // CMHS D0, D0, D0
  825. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  826. Bits Op = new Bits(Opcode);
  827. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  828. Vector128<float> V1 = MakeVectorE0(A);
  829. Vector128<float> V2 = MakeVectorE0(B);
  830. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  831. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  832. AArch64.V(1, new Bits(A));
  833. AArch64.V(2, new Bits(B));
  834. SimdFp.Cmhs_S(Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  835. Assert.Multiple(() =>
  836. {
  837. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  838. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  839. });
  840. }
  841. [Test, Pairwise, Description("CMHS <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  842. public void Cmhs_V_8B_4H_2S([Values(0u)] uint Rd,
  843. [Values(1u, 0u)] uint Rn,
  844. [Values(2u, 0u)] uint Rm,
  845. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  846. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  847. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  848. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  849. {
  850. uint Opcode = 0x2E203C00; // CMHS V0.8B, V0.8B, V0.8B
  851. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  852. Opcode |= ((size & 3) << 22);
  853. Bits Op = new Bits(Opcode);
  854. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  855. Vector128<float> V1 = MakeVectorE0(A);
  856. Vector128<float> V2 = MakeVectorE0(B);
  857. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  858. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  859. AArch64.V(1, new Bits(A));
  860. AArch64.V(2, new Bits(B));
  861. SimdFp.Cmhs_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  862. Assert.Multiple(() =>
  863. {
  864. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  865. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  866. });
  867. }
  868. [Test, Pairwise, Description("CMHS <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  869. public void Cmhs_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  870. [Values(1u, 0u)] uint Rn,
  871. [Values(2u, 0u)] uint Rm,
  872. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  873. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  874. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  875. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  876. {
  877. uint Opcode = 0x6E203C00; // CMHS V0.16B, V0.16B, V0.16B
  878. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  879. Opcode |= ((size & 3) << 22);
  880. Bits Op = new Bits(Opcode);
  881. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  882. Vector128<float> V1 = MakeVectorE0E1(A, A);
  883. Vector128<float> V2 = MakeVectorE0E1(B, B);
  884. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  885. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  886. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  887. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  888. SimdFp.Cmhs_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  889. Assert.Multiple(() =>
  890. {
  891. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  892. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  893. });
  894. }
  895. [Test, Pairwise, Description("CMTST <V><d>, <V><n>, <V><m>")]
  896. public void Cmtst_S_D([Values(0u)] uint Rd,
  897. [Values(1u, 0u)] uint Rn,
  898. [Values(2u, 0u)] uint Rm,
  899. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  900. [ValueSource("_1D_")] [Random(RndCnt)] ulong A,
  901. [ValueSource("_1D_")] [Random(RndCnt)] ulong B)
  902. {
  903. uint Opcode = 0x5EE08C00; // CMTST D0, D0, D0
  904. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  905. Bits Op = new Bits(Opcode);
  906. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  907. Vector128<float> V1 = MakeVectorE0(A);
  908. Vector128<float> V2 = MakeVectorE0(B);
  909. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  910. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  911. AArch64.V(1, new Bits(A));
  912. AArch64.V(2, new Bits(B));
  913. SimdFp.Cmtst_S(Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  914. Assert.Multiple(() =>
  915. {
  916. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  917. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  918. });
  919. }
  920. [Test, Pairwise, Description("CMTST <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  921. public void Cmtst_V_8B_4H_2S([Values(0u)] uint Rd,
  922. [Values(1u, 0u)] uint Rn,
  923. [Values(2u, 0u)] uint Rm,
  924. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  925. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  926. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  927. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  928. {
  929. uint Opcode = 0x0E208C00; // CMTST V0.8B, V0.8B, V0.8B
  930. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  931. Opcode |= ((size & 3) << 22);
  932. Bits Op = new Bits(Opcode);
  933. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  934. Vector128<float> V1 = MakeVectorE0(A);
  935. Vector128<float> V2 = MakeVectorE0(B);
  936. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  937. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  938. AArch64.V(1, new Bits(A));
  939. AArch64.V(2, new Bits(B));
  940. SimdFp.Cmtst_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  941. Assert.Multiple(() =>
  942. {
  943. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  944. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  945. });
  946. }
  947. [Test, Pairwise, Description("CMTST <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  948. public void Cmtst_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  949. [Values(1u, 0u)] uint Rn,
  950. [Values(2u, 0u)] uint Rm,
  951. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  952. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  953. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  954. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  955. {
  956. uint Opcode = 0x4E208C00; // CMTST V0.16B, V0.16B, V0.16B
  957. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  958. Opcode |= ((size & 3) << 22);
  959. Bits Op = new Bits(Opcode);
  960. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  961. Vector128<float> V1 = MakeVectorE0E1(A, A);
  962. Vector128<float> V2 = MakeVectorE0E1(B, B);
  963. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  964. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  965. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  966. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  967. SimdFp.Cmtst_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  968. Assert.Multiple(() =>
  969. {
  970. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  971. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  972. });
  973. }
  974. [Test, Pairwise, Description("EOR <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  975. public void Eor_V_8B([Values(0u)] uint Rd,
  976. [Values(1u, 0u)] uint Rn,
  977. [Values(2u, 0u)] uint Rm,
  978. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  979. [ValueSource("_8B_")] [Random(RndCnt)] ulong A,
  980. [ValueSource("_8B_")] [Random(RndCnt)] ulong B)
  981. {
  982. uint Opcode = 0x2E201C00; // EOR V0.8B, V0.8B, V0.8B
  983. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  984. Bits Op = new Bits(Opcode);
  985. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  986. Vector128<float> V1 = MakeVectorE0(A);
  987. Vector128<float> V2 = MakeVectorE0(B);
  988. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  989. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  990. AArch64.V(1, new Bits(A));
  991. AArch64.V(2, new Bits(B));
  992. SimdFp.Eor_V(Op[30], Op[20, 16], Op[9, 5], Op[4, 0]);
  993. Assert.Multiple(() =>
  994. {
  995. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  996. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  997. });
  998. }
  999. [Test, Pairwise, Description("EOR <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1000. public void Eor_V_16B([Values(0u)] uint Rd,
  1001. [Values(1u, 0u)] uint Rn,
  1002. [Values(2u, 0u)] uint Rm,
  1003. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  1004. [ValueSource("_8B_")] [Random(RndCnt)] ulong A,
  1005. [ValueSource("_8B_")] [Random(RndCnt)] ulong B)
  1006. {
  1007. uint Opcode = 0x6E201C00; // EOR V0.16B, V0.16B, V0.16B
  1008. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1009. Bits Op = new Bits(Opcode);
  1010. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1011. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1012. Vector128<float> V2 = MakeVectorE0E1(B, B);
  1013. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1014. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1015. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1016. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  1017. SimdFp.Eor_V(Op[30], Op[20, 16], Op[9, 5], Op[4, 0]);
  1018. Assert.Multiple(() =>
  1019. {
  1020. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1021. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1022. });
  1023. }
  1024. [Test, Pairwise, Description("ORN <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1025. public void Orn_V_8B([Values(0u)] uint Rd,
  1026. [Values(1u, 0u)] uint Rn,
  1027. [Values(2u, 0u)] uint Rm,
  1028. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  1029. [ValueSource("_8B_")] [Random(RndCnt)] ulong A,
  1030. [ValueSource("_8B_")] [Random(RndCnt)] ulong B)
  1031. {
  1032. uint Opcode = 0x0EE01C00; // ORN V0.8B, V0.8B, V0.8B
  1033. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1034. Bits Op = new Bits(Opcode);
  1035. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1036. Vector128<float> V1 = MakeVectorE0(A);
  1037. Vector128<float> V2 = MakeVectorE0(B);
  1038. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1039. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1040. AArch64.V(1, new Bits(A));
  1041. AArch64.V(2, new Bits(B));
  1042. SimdFp.Orn_V(Op[30], Op[20, 16], Op[9, 5], Op[4, 0]);
  1043. Assert.Multiple(() =>
  1044. {
  1045. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1046. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1047. });
  1048. }
  1049. [Test, Pairwise, Description("ORN <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1050. public void Orn_V_16B([Values(0u)] uint Rd,
  1051. [Values(1u, 0u)] uint Rn,
  1052. [Values(2u, 0u)] uint Rm,
  1053. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  1054. [ValueSource("_8B_")] [Random(RndCnt)] ulong A,
  1055. [ValueSource("_8B_")] [Random(RndCnt)] ulong B)
  1056. {
  1057. uint Opcode = 0x4EE01C00; // ORN V0.16B, V0.16B, V0.16B
  1058. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1059. Bits Op = new Bits(Opcode);
  1060. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1061. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1062. Vector128<float> V2 = MakeVectorE0E1(B, B);
  1063. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1064. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1065. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1066. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  1067. SimdFp.Orn_V(Op[30], Op[20, 16], Op[9, 5], Op[4, 0]);
  1068. Assert.Multiple(() =>
  1069. {
  1070. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1071. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1072. });
  1073. }
  1074. [Test, Pairwise, Description("ORR <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1075. public void Orr_V_8B([Values(0u)] uint Rd,
  1076. [Values(1u, 0u)] uint Rn,
  1077. [Values(2u, 0u)] uint Rm,
  1078. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  1079. [ValueSource("_8B_")] [Random(RndCnt)] ulong A,
  1080. [ValueSource("_8B_")] [Random(RndCnt)] ulong B)
  1081. {
  1082. uint Opcode = 0x0EA01C00; // ORR V0.8B, V0.8B, V0.8B
  1083. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1084. Bits Op = new Bits(Opcode);
  1085. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1086. Vector128<float> V1 = MakeVectorE0(A);
  1087. Vector128<float> V2 = MakeVectorE0(B);
  1088. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1089. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1090. AArch64.V(1, new Bits(A));
  1091. AArch64.V(2, new Bits(B));
  1092. SimdFp.Orr_V(Op[30], Op[20, 16], Op[9, 5], Op[4, 0]);
  1093. Assert.Multiple(() =>
  1094. {
  1095. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1096. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1097. });
  1098. }
  1099. [Test, Pairwise, Description("ORR <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1100. public void Orr_V_16B([Values(0u)] uint Rd,
  1101. [Values(1u, 0u)] uint Rn,
  1102. [Values(2u, 0u)] uint Rm,
  1103. [ValueSource("_8B_")] [Random(RndCnt)] ulong Z,
  1104. [ValueSource("_8B_")] [Random(RndCnt)] ulong A,
  1105. [ValueSource("_8B_")] [Random(RndCnt)] ulong B)
  1106. {
  1107. uint Opcode = 0x4EA01C00; // ORR V0.16B, V0.16B, V0.16B
  1108. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1109. Bits Op = new Bits(Opcode);
  1110. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1111. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1112. Vector128<float> V2 = MakeVectorE0E1(B, B);
  1113. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1114. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1115. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1116. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  1117. SimdFp.Orr_V(Op[30], Op[20, 16], Op[9, 5], Op[4, 0]);
  1118. Assert.Multiple(() =>
  1119. {
  1120. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1121. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1122. });
  1123. }
  1124. [Test, Pairwise, Description("RADDHN{2} <Vd>.<Tb>, <Vn>.<Ta>, <Vm>.<Ta>")]
  1125. public void Raddhn_V_8H8B_4S4H_2D2S([Values(0u)] uint Rd,
  1126. [Values(1u, 0u)] uint Rn,
  1127. [Values(2u, 0u)] uint Rm,
  1128. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  1129. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1130. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong B,
  1131. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H8B, 4S4H, 2D2S>
  1132. {
  1133. uint Opcode = 0x2E204000; // RADDHN V0.8B, V0.8H, V0.8H
  1134. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1135. Opcode |= ((size & 3) << 22);
  1136. Bits Op = new Bits(Opcode);
  1137. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1138. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1139. Vector128<float> V2 = MakeVectorE0E1(B, B);
  1140. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1141. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1142. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1143. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  1144. SimdFp.Raddhn_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1145. Assert.Multiple(() =>
  1146. {
  1147. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1148. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1149. });
  1150. }
  1151. [Test, Pairwise, Description("RADDHN{2} <Vd>.<Tb>, <Vn>.<Ta>, <Vm>.<Ta>")]
  1152. public void Raddhn_V_8H16B_4S8H_2D4S([Values(0u)] uint Rd,
  1153. [Values(1u, 0u)] uint Rn,
  1154. [Values(2u, 0u)] uint Rm,
  1155. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  1156. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1157. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong B,
  1158. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H16B, 4S8H, 2D4S>
  1159. {
  1160. uint Opcode = 0x6E204000; // RADDHN2 V0.16B, V0.8H, V0.8H
  1161. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1162. Opcode |= ((size & 3) << 22);
  1163. Bits Op = new Bits(Opcode);
  1164. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1165. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1166. Vector128<float> V2 = MakeVectorE0E1(B, B);
  1167. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1168. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1169. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1170. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  1171. SimdFp.Raddhn_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1172. Assert.Multiple(() =>
  1173. {
  1174. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1175. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1176. });
  1177. }
  1178. [Test, Pairwise, Description("RSUBHN{2} <Vd>.<Tb>, <Vn>.<Ta>, <Vm>.<Ta>")]
  1179. public void Rsubhn_V_8H8B_4S4H_2D2S([Values(0u)] uint Rd,
  1180. [Values(1u, 0u)] uint Rn,
  1181. [Values(2u, 0u)] uint Rm,
  1182. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  1183. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1184. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong B,
  1185. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H8B, 4S4H, 2D2S>
  1186. {
  1187. uint Opcode = 0x2E206000; // RSUBHN V0.8B, V0.8H, V0.8H
  1188. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1189. Opcode |= ((size & 3) << 22);
  1190. Bits Op = new Bits(Opcode);
  1191. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1192. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1193. Vector128<float> V2 = MakeVectorE0E1(B, B);
  1194. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1195. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1196. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1197. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  1198. SimdFp.Rsubhn_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1199. Assert.Multiple(() =>
  1200. {
  1201. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1202. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1203. });
  1204. }
  1205. [Test, Pairwise, Description("RSUBHN{2} <Vd>.<Tb>, <Vn>.<Ta>, <Vm>.<Ta>")]
  1206. public void Rsubhn_V_8H16B_4S8H_2D4S([Values(0u)] uint Rd,
  1207. [Values(1u, 0u)] uint Rn,
  1208. [Values(2u, 0u)] uint Rm,
  1209. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  1210. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1211. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong B,
  1212. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H16B, 4S8H, 2D4S>
  1213. {
  1214. uint Opcode = 0x6E206000; // RSUBHN2 V0.16B, V0.8H, V0.8H
  1215. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1216. Opcode |= ((size & 3) << 22);
  1217. Bits Op = new Bits(Opcode);
  1218. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1219. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1220. Vector128<float> V2 = MakeVectorE0E1(B, B);
  1221. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1222. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1223. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1224. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  1225. SimdFp.Rsubhn_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1226. Assert.Multiple(() =>
  1227. {
  1228. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1229. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1230. });
  1231. }
  1232. [Test, Pairwise, Description("SABA <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1233. public void Saba_V_8B_4H_2S([Values(0u)] uint Rd,
  1234. [Values(1u, 0u)] uint Rn,
  1235. [Values(2u, 0u)] uint Rm,
  1236. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1237. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1238. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  1239. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  1240. {
  1241. uint Opcode = 0x0E207C00; // SABA V0.8B, V0.8B, V0.8B
  1242. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1243. Opcode |= ((size & 3) << 22);
  1244. Bits Op = new Bits(Opcode);
  1245. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1246. Vector128<float> V1 = MakeVectorE0(A);
  1247. Vector128<float> V2 = MakeVectorE0(B);
  1248. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1249. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1250. AArch64.V(1, new Bits(A));
  1251. AArch64.V(2, new Bits(B));
  1252. SimdFp.Saba_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1253. Assert.Multiple(() =>
  1254. {
  1255. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1256. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1257. });
  1258. }
  1259. [Test, Pairwise, Description("SABA <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1260. public void Saba_V_16B_8H_4S([Values(0u)] uint Rd,
  1261. [Values(1u, 0u)] uint Rn,
  1262. [Values(2u, 0u)] uint Rm,
  1263. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1264. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1265. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  1266. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
  1267. {
  1268. uint Opcode = 0x4E207C00; // SABA V0.16B, V0.16B, V0.16B
  1269. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1270. Opcode |= ((size & 3) << 22);
  1271. Bits Op = new Bits(Opcode);
  1272. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1273. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1274. Vector128<float> V2 = MakeVectorE0E1(B, B);
  1275. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1276. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1277. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1278. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  1279. SimdFp.Saba_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1280. Assert.Multiple(() =>
  1281. {
  1282. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1283. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1284. });
  1285. }
  1286. [Test, Pairwise, Description("SABAL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
  1287. public void Sabal_V_8B8H_4H4S_2S2D([Values(0u)] uint Rd,
  1288. [Values(1u, 0u)] uint Rn,
  1289. [Values(2u, 0u)] uint Rm,
  1290. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1291. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1292. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  1293. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H, 4H4S, 2S2D>
  1294. {
  1295. uint Opcode = 0x0E205000; // SABAL V0.8H, V0.8B, V0.8B
  1296. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1297. Opcode |= ((size & 3) << 22);
  1298. Bits Op = new Bits(Opcode);
  1299. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1300. Vector128<float> V1 = MakeVectorE0(A);
  1301. Vector128<float> V2 = MakeVectorE0(B);
  1302. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1303. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1304. AArch64.Vpart(1, 0, new Bits(A));
  1305. AArch64.Vpart(2, 0, new Bits(B));
  1306. SimdFp.Sabal_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1307. Assert.Multiple(() =>
  1308. {
  1309. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1310. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1311. });
  1312. }
  1313. [Test, Pairwise, Description("SABAL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
  1314. public void Sabal_V_16B8H_8H4S_4S2D([Values(0u)] uint Rd,
  1315. [Values(1u, 0u)] uint Rn,
  1316. [Values(2u, 0u)] uint Rm,
  1317. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1318. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1319. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  1320. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H, 8H4S, 4S2D>
  1321. {
  1322. uint Opcode = 0x4E205000; // SABAL2 V0.8H, V0.16B, V0.16B
  1323. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1324. Opcode |= ((size & 3) << 22);
  1325. Bits Op = new Bits(Opcode);
  1326. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1327. Vector128<float> V1 = MakeVectorE1(A);
  1328. Vector128<float> V2 = MakeVectorE1(B);
  1329. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1330. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1331. AArch64.Vpart(1, 1, new Bits(A));
  1332. AArch64.Vpart(2, 1, new Bits(B));
  1333. SimdFp.Sabal_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1334. Assert.Multiple(() =>
  1335. {
  1336. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1337. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1338. });
  1339. }
  1340. [Test, Pairwise, Description("SABD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1341. public void Sabd_V_8B_4H_2S([Values(0u)] uint Rd,
  1342. [Values(1u, 0u)] uint Rn,
  1343. [Values(2u, 0u)] uint Rm,
  1344. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1345. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1346. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  1347. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  1348. {
  1349. uint Opcode = 0x0E207400; // SABD V0.8B, V0.8B, V0.8B
  1350. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1351. Opcode |= ((size & 3) << 22);
  1352. Bits Op = new Bits(Opcode);
  1353. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1354. Vector128<float> V1 = MakeVectorE0(A);
  1355. Vector128<float> V2 = MakeVectorE0(B);
  1356. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1357. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1358. AArch64.V(1, new Bits(A));
  1359. AArch64.V(2, new Bits(B));
  1360. SimdFp.Sabd_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1361. Assert.Multiple(() =>
  1362. {
  1363. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1364. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1365. });
  1366. }
  1367. [Test, Pairwise, Description("SABD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1368. public void Sabd_V_16B_8H_4S([Values(0u)] uint Rd,
  1369. [Values(1u, 0u)] uint Rn,
  1370. [Values(2u, 0u)] uint Rm,
  1371. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1372. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1373. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  1374. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
  1375. {
  1376. uint Opcode = 0x4E207400; // SABD V0.16B, V0.16B, V0.16B
  1377. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1378. Opcode |= ((size & 3) << 22);
  1379. Bits Op = new Bits(Opcode);
  1380. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1381. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1382. Vector128<float> V2 = MakeVectorE0E1(B, B);
  1383. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  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. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  1387. SimdFp.Sabd_V(Op[30], Op[23, 22], Op[20, 16], 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. }
  1394. [Test, Pairwise, Description("SABDL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
  1395. public void Sabdl_V_8B8H_4H4S_2S2D([Values(0u)] uint Rd,
  1396. [Values(1u, 0u)] uint Rn,
  1397. [Values(2u, 0u)] uint Rm,
  1398. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1399. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1400. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  1401. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H, 4H4S, 2S2D>
  1402. {
  1403. uint Opcode = 0x0E207000; // SABDL V0.8H, V0.8B, V0.8B
  1404. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1405. Opcode |= ((size & 3) << 22);
  1406. Bits Op = new Bits(Opcode);
  1407. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1408. Vector128<float> V1 = MakeVectorE0(A);
  1409. Vector128<float> V2 = MakeVectorE0(B);
  1410. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1411. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1412. AArch64.Vpart(1, 0, new Bits(A));
  1413. AArch64.Vpart(2, 0, new Bits(B));
  1414. SimdFp.Sabdl_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1415. Assert.Multiple(() =>
  1416. {
  1417. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1418. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1419. });
  1420. }
  1421. [Test, Pairwise, Description("SABDL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
  1422. public void Sabdl_V_16B8H_8H4S_4S2D([Values(0u)] uint Rd,
  1423. [Values(1u, 0u)] uint Rn,
  1424. [Values(2u, 0u)] uint Rm,
  1425. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1426. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1427. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  1428. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H, 8H4S, 4S2D>
  1429. {
  1430. uint Opcode = 0x4E207000; // SABDL2 V0.8H, V0.16B, V0.16B
  1431. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1432. Opcode |= ((size & 3) << 22);
  1433. Bits Op = new Bits(Opcode);
  1434. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1435. Vector128<float> V1 = MakeVectorE1(A);
  1436. Vector128<float> V2 = MakeVectorE1(B);
  1437. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1438. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1439. AArch64.Vpart(1, 1, new Bits(A));
  1440. AArch64.Vpart(2, 1, new Bits(B));
  1441. SimdFp.Sabdl_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1442. Assert.Multiple(() =>
  1443. {
  1444. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1445. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1446. });
  1447. }
  1448. [Test, Pairwise, Description("SADDW{2} <Vd>.<Ta>, <Vn>.<Ta>, <Vm>.<Tb>")]
  1449. public void Saddw_V_8B8H8H_4H4S4S_2S2D2D([Values(0u)] uint Rd,
  1450. [Values(1u, 0u)] uint Rn,
  1451. [Values(2u, 0u)] uint Rm,
  1452. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  1453. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1454. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  1455. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H8H, 4H4S4S, 2S2D2D>
  1456. {
  1457. uint Opcode = 0x0E201000; // SADDW V0.8H, V0.8H, V0.8B
  1458. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1459. Opcode |= ((size & 3) << 22);
  1460. Bits Op = new Bits(Opcode);
  1461. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1462. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1463. Vector128<float> V2 = MakeVectorE0(B);
  1464. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1465. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1466. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1467. AArch64.Vpart(2, 0, new Bits(B));
  1468. SimdFp.Saddw_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1469. Assert.Multiple(() =>
  1470. {
  1471. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1472. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1473. });
  1474. }
  1475. [Test, Pairwise, Description("SADDW{2} <Vd>.<Ta>, <Vn>.<Ta>, <Vm>.<Tb>")]
  1476. public void Saddw_V_16B8H8H_8H4S4S_4S2D2D([Values(0u)] uint Rd,
  1477. [Values(1u, 0u)] uint Rn,
  1478. [Values(2u, 0u)] uint Rm,
  1479. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  1480. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1481. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  1482. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H8H, 8H4S4S, 4S2D2D>
  1483. {
  1484. uint Opcode = 0x4E201000; // SADDW2 V0.8H, V0.8H, V0.16B
  1485. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1486. Opcode |= ((size & 3) << 22);
  1487. Bits Op = new Bits(Opcode);
  1488. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1489. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1490. Vector128<float> V2 = MakeVectorE1(B);
  1491. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1492. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1493. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1494. AArch64.Vpart(2, 1, new Bits(B));
  1495. SimdFp.Saddw_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1496. Assert.Multiple(() =>
  1497. {
  1498. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1499. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1500. });
  1501. }
  1502. [Test, Pairwise, Description("SQADD <V><d>, <V><n>, <V><m>")]
  1503. public void Sqadd_S_B_H_S_D([Values(0u)] uint Rd,
  1504. [Values(1u, 0u)] uint Rn,
  1505. [Values(2u, 0u)] uint Rm,
  1506. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong Z,
  1507. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong A,
  1508. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong B,
  1509. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <B, H, S, D>
  1510. {
  1511. uint Opcode = 0x5E200C00; // SQADD B0, B0, B0
  1512. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1513. Opcode |= ((size & 3) << 22);
  1514. Bits Op = new Bits(Opcode);
  1515. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1516. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1517. Vector128<float> V1 = MakeVectorE0(A);
  1518. Vector128<float> V2 = MakeVectorE0(B);
  1519. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  1520. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1521. AArch64.V(1, new Bits(A));
  1522. AArch64.V(2, new Bits(B));
  1523. Shared.FPSR = new Bits((uint)Fpsr);
  1524. SimdFp.Sqadd_S(Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1525. Assert.Multiple(() =>
  1526. {
  1527. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1528. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1529. });
  1530. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1531. }
  1532. [Test, Pairwise, Description("SQADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1533. public void Sqadd_V_8B_4H_2S([Values(0u)] uint Rd,
  1534. [Values(1u, 0u)] uint Rn,
  1535. [Values(2u, 0u)] uint Rm,
  1536. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1537. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1538. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  1539. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  1540. {
  1541. uint Opcode = 0x0E200C00; // SQADD V0.8B, V0.8B, V0.8B
  1542. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1543. Opcode |= ((size & 3) << 22);
  1544. Bits Op = new Bits(Opcode);
  1545. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1546. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1547. Vector128<float> V1 = MakeVectorE0(A);
  1548. Vector128<float> V2 = MakeVectorE0(B);
  1549. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  1550. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1551. AArch64.V(1, new Bits(A));
  1552. AArch64.V(2, new Bits(B));
  1553. Shared.FPSR = new Bits((uint)Fpsr);
  1554. SimdFp.Sqadd_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1555. Assert.Multiple(() =>
  1556. {
  1557. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1558. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1559. });
  1560. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1561. }
  1562. [Test, Pairwise, Description("SQADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1563. public void Sqadd_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  1564. [Values(1u, 0u)] uint Rn,
  1565. [Values(2u, 0u)] uint Rm,
  1566. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  1567. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  1568. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  1569. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  1570. {
  1571. uint Opcode = 0x4E200C00; // SQADD V0.16B, V0.16B, V0.16B
  1572. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1573. Opcode |= ((size & 3) << 22);
  1574. Bits Op = new Bits(Opcode);
  1575. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1576. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1577. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1578. Vector128<float> V2 = MakeVectorE0E1(B, B);
  1579. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  1580. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1581. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1582. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  1583. Shared.FPSR = new Bits((uint)Fpsr);
  1584. SimdFp.Sqadd_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1585. Assert.Multiple(() =>
  1586. {
  1587. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1588. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1589. });
  1590. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1591. }
  1592. [Test, Pairwise, Description("SQSUB <V><d>, <V><n>, <V><m>")]
  1593. public void Sqsub_S_B_H_S_D([Values(0u)] uint Rd,
  1594. [Values(1u, 0u)] uint Rn,
  1595. [Values(2u, 0u)] uint Rm,
  1596. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong Z,
  1597. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong A,
  1598. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong B,
  1599. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <B, H, S, D>
  1600. {
  1601. uint Opcode = 0x5E202C00; // SQSUB B0, B0, B0
  1602. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1603. Opcode |= ((size & 3) << 22);
  1604. Bits Op = new Bits(Opcode);
  1605. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1606. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1607. Vector128<float> V1 = MakeVectorE0(A);
  1608. Vector128<float> V2 = MakeVectorE0(B);
  1609. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  1610. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1611. AArch64.V(1, new Bits(A));
  1612. AArch64.V(2, new Bits(B));
  1613. Shared.FPSR = new Bits((uint)Fpsr);
  1614. SimdFp.Sqsub_S(Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1615. Assert.Multiple(() =>
  1616. {
  1617. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1618. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1619. });
  1620. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1621. }
  1622. [Test, Pairwise, Description("SQSUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1623. public void Sqsub_V_8B_4H_2S([Values(0u)] uint Rd,
  1624. [Values(1u, 0u)] uint Rn,
  1625. [Values(2u, 0u)] uint Rm,
  1626. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1627. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1628. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  1629. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  1630. {
  1631. uint Opcode = 0x0E202C00; // SQSUB V0.8B, V0.8B, V0.8B
  1632. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1633. Opcode |= ((size & 3) << 22);
  1634. Bits Op = new Bits(Opcode);
  1635. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1636. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1637. Vector128<float> V1 = MakeVectorE0(A);
  1638. Vector128<float> V2 = MakeVectorE0(B);
  1639. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  1640. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1641. AArch64.V(1, new Bits(A));
  1642. AArch64.V(2, new Bits(B));
  1643. Shared.FPSR = new Bits((uint)Fpsr);
  1644. SimdFp.Sqsub_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1645. Assert.Multiple(() =>
  1646. {
  1647. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1648. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1649. });
  1650. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1651. }
  1652. [Test, Pairwise, Description("SQSUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1653. public void Sqsub_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  1654. [Values(1u, 0u)] uint Rn,
  1655. [Values(2u, 0u)] uint Rm,
  1656. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  1657. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  1658. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  1659. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  1660. {
  1661. uint Opcode = 0x4E202C00; // SQSUB V0.16B, V0.16B, V0.16B
  1662. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1663. Opcode |= ((size & 3) << 22);
  1664. Bits Op = new Bits(Opcode);
  1665. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1666. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1667. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1668. Vector128<float> V2 = MakeVectorE0E1(B, B);
  1669. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  1670. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1671. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1672. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  1673. Shared.FPSR = new Bits((uint)Fpsr);
  1674. SimdFp.Sqsub_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1675. Assert.Multiple(() =>
  1676. {
  1677. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1678. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1679. });
  1680. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1681. }
  1682. [Test, Pairwise, Description("SSUBW{2} <Vd>.<Ta>, <Vn>.<Ta>, <Vm>.<Tb>")]
  1683. public void Ssubw_V_8B8H8H_4H4S4S_2S2D2D([Values(0u)] uint Rd,
  1684. [Values(1u, 0u)] uint Rn,
  1685. [Values(2u, 0u)] uint Rm,
  1686. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  1687. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1688. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  1689. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H8H, 4H4S4S, 2S2D2D>
  1690. {
  1691. uint Opcode = 0x0E203000; // SSUBW V0.8H, V0.8H, V0.8B
  1692. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1693. Opcode |= ((size & 3) << 22);
  1694. Bits Op = new Bits(Opcode);
  1695. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1696. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1697. Vector128<float> V2 = MakeVectorE0(B);
  1698. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1699. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1700. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1701. AArch64.Vpart(2, 0, new Bits(B));
  1702. SimdFp.Ssubw_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1703. Assert.Multiple(() =>
  1704. {
  1705. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1706. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1707. });
  1708. }
  1709. [Test, Pairwise, Description("SSUBW{2} <Vd>.<Ta>, <Vn>.<Ta>, <Vm>.<Tb>")]
  1710. public void Ssubw_V_16B8H8H_8H4S4S_4S2D2D([Values(0u)] uint Rd,
  1711. [Values(1u, 0u)] uint Rn,
  1712. [Values(2u, 0u)] uint Rm,
  1713. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  1714. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1715. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  1716. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H8H, 8H4S4S, 4S2D2D>
  1717. {
  1718. uint Opcode = 0x4E203000; // SSUBW2 V0.8H, V0.8H, V0.16B
  1719. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1720. Opcode |= ((size & 3) << 22);
  1721. Bits Op = new Bits(Opcode);
  1722. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1723. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1724. Vector128<float> V2 = MakeVectorE1(B);
  1725. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1726. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1727. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1728. AArch64.Vpart(2, 1, new Bits(B));
  1729. SimdFp.Ssubw_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1730. Assert.Multiple(() =>
  1731. {
  1732. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1733. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1734. });
  1735. }
  1736. [Test, Pairwise, Description("SUB <V><d>, <V><n>, <V><m>")]
  1737. public void Sub_S_D([Values(0u)] uint Rd,
  1738. [Values(1u, 0u)] uint Rn,
  1739. [Values(2u, 0u)] uint Rm,
  1740. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  1741. [ValueSource("_1D_")] [Random(RndCnt)] ulong A,
  1742. [ValueSource("_1D_")] [Random(RndCnt)] ulong B)
  1743. {
  1744. uint Opcode = 0x7EE08400; // SUB D0, D0, D0
  1745. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1746. Bits Op = new Bits(Opcode);
  1747. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1748. Vector128<float> V1 = MakeVectorE0(A);
  1749. Vector128<float> V2 = MakeVectorE0(B);
  1750. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1751. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1752. AArch64.V(1, new Bits(A));
  1753. AArch64.V(2, new Bits(B));
  1754. SimdFp.Sub_S(Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1755. Assert.Multiple(() =>
  1756. {
  1757. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1758. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1759. });
  1760. }
  1761. [Test, Pairwise, Description("SUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1762. public void Sub_V_8B_4H_2S([Values(0u)] uint Rd,
  1763. [Values(1u, 0u)] uint Rn,
  1764. [Values(2u, 0u)] uint Rm,
  1765. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1766. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1767. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  1768. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  1769. {
  1770. uint Opcode = 0x2E208400; // SUB V0.8B, V0.8B, V0.8B
  1771. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1772. Opcode |= ((size & 3) << 22);
  1773. Bits Op = new Bits(Opcode);
  1774. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1775. Vector128<float> V1 = MakeVectorE0(A);
  1776. Vector128<float> V2 = MakeVectorE0(B);
  1777. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1778. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1779. AArch64.V(1, new Bits(A));
  1780. AArch64.V(2, new Bits(B));
  1781. SimdFp.Sub_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1782. Assert.Multiple(() =>
  1783. {
  1784. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1785. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1786. });
  1787. }
  1788. [Test, Pairwise, Description("SUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1789. public void Sub_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  1790. [Values(1u, 0u)] uint Rn,
  1791. [Values(2u, 0u)] uint Rm,
  1792. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  1793. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  1794. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  1795. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  1796. {
  1797. uint Opcode = 0x6E208400; // SUB V0.16B, V0.16B, V0.16B
  1798. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1799. Opcode |= ((size & 3) << 22);
  1800. Bits Op = new Bits(Opcode);
  1801. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1802. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1803. Vector128<float> V2 = MakeVectorE0E1(B, B);
  1804. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1805. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1806. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1807. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  1808. SimdFp.Sub_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1809. Assert.Multiple(() =>
  1810. {
  1811. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1812. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1813. });
  1814. }
  1815. [Test, Pairwise, Description("SUBHN{2} <Vd>.<Tb>, <Vn>.<Ta>, <Vm>.<Ta>")]
  1816. public void Subhn_V_8H8B_4S4H_2D2S([Values(0u)] uint Rd,
  1817. [Values(1u, 0u)] uint Rn,
  1818. [Values(2u, 0u)] uint Rm,
  1819. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  1820. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1821. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong B,
  1822. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H8B, 4S4H, 2D2S>
  1823. {
  1824. uint Opcode = 0x0E206000; // SUBHN V0.8B, V0.8H, V0.8H
  1825. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1826. Opcode |= ((size & 3) << 22);
  1827. Bits Op = new Bits(Opcode);
  1828. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1829. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1830. Vector128<float> V2 = MakeVectorE0E1(B, B);
  1831. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1832. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1833. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1834. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  1835. SimdFp.Subhn_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1836. Assert.Multiple(() =>
  1837. {
  1838. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1839. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1840. });
  1841. }
  1842. [Test, Pairwise, Description("SUBHN{2} <Vd>.<Tb>, <Vn>.<Ta>, <Vm>.<Ta>")]
  1843. public void Subhn_V_8H16B_4S8H_2D4S([Values(0u)] uint Rd,
  1844. [Values(1u, 0u)] uint Rn,
  1845. [Values(2u, 0u)] uint Rm,
  1846. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  1847. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1848. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong B,
  1849. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H16B, 4S8H, 2D4S>
  1850. {
  1851. uint Opcode = 0x4E206000; // SUBHN2 V0.16B, V0.8H, V0.8H
  1852. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1853. Opcode |= ((size & 3) << 22);
  1854. Bits Op = new Bits(Opcode);
  1855. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1856. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1857. Vector128<float> V2 = MakeVectorE0E1(B, B);
  1858. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1859. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1860. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1861. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  1862. SimdFp.Subhn_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1863. Assert.Multiple(() =>
  1864. {
  1865. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1866. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1867. });
  1868. }
  1869. [Test, Pairwise, Description("TRN1 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1870. public void Trn1_V_8B_4H_2S([Values(0u)] uint Rd,
  1871. [Values(1u, 0u)] uint Rn,
  1872. [Values(2u, 0u)] uint Rm,
  1873. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1874. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1875. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  1876. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  1877. {
  1878. uint Opcode = 0x0E002800; // TRN1 V0.8B, V0.8B, V0.8B
  1879. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1880. Opcode |= ((size & 3) << 22);
  1881. Bits Op = new Bits(Opcode);
  1882. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1883. Vector128<float> V1 = MakeVectorE0(A);
  1884. Vector128<float> V2 = MakeVectorE0(B);
  1885. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1886. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1887. AArch64.V(1, new Bits(A));
  1888. AArch64.V(2, new Bits(B));
  1889. SimdFp.Trn1_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1890. Assert.Multiple(() =>
  1891. {
  1892. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1893. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1894. });
  1895. }
  1896. [Test, Pairwise, Description("TRN1 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1897. public void Trn1_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  1898. [Values(1u, 0u)] uint Rn,
  1899. [Values(2u, 0u)] uint Rm,
  1900. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  1901. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  1902. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  1903. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  1904. {
  1905. uint Opcode = 0x4E002800; // TRN1 V0.16B, V0.16B, V0.16B
  1906. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1907. Opcode |= ((size & 3) << 22);
  1908. Bits Op = new Bits(Opcode);
  1909. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1910. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1911. Vector128<float> V2 = MakeVectorE0E1(B, B);
  1912. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1913. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1914. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1915. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  1916. SimdFp.Trn1_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1917. Assert.Multiple(() =>
  1918. {
  1919. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1920. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1921. });
  1922. }
  1923. [Test, Pairwise, Description("TRN2 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1924. public void Trn2_V_8B_4H_2S([Values(0u)] uint Rd,
  1925. [Values(1u, 0u)] uint Rn,
  1926. [Values(2u, 0u)] uint Rm,
  1927. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1928. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1929. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  1930. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  1931. {
  1932. uint Opcode = 0x0E006800; // TRN2 V0.8B, V0.8B, V0.8B
  1933. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1934. Opcode |= ((size & 3) << 22);
  1935. Bits Op = new Bits(Opcode);
  1936. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1937. Vector128<float> V1 = MakeVectorE0(A);
  1938. Vector128<float> V2 = MakeVectorE0(B);
  1939. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1940. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1941. AArch64.V(1, new Bits(A));
  1942. AArch64.V(2, new Bits(B));
  1943. SimdFp.Trn2_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1944. Assert.Multiple(() =>
  1945. {
  1946. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1947. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1948. });
  1949. }
  1950. [Test, Pairwise, Description("TRN2 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1951. public void Trn2_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  1952. [Values(1u, 0u)] uint Rn,
  1953. [Values(2u, 0u)] uint Rm,
  1954. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  1955. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  1956. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  1957. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  1958. {
  1959. uint Opcode = 0x4E006800; // TRN2 V0.16B, V0.16B, V0.16B
  1960. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1961. Opcode |= ((size & 3) << 22);
  1962. Bits Op = new Bits(Opcode);
  1963. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1964. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1965. Vector128<float> V2 = MakeVectorE0E1(B, B);
  1966. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1967. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1968. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1969. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  1970. SimdFp.Trn2_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1971. Assert.Multiple(() =>
  1972. {
  1973. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1974. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1975. });
  1976. }
  1977. [Test, Pairwise, Description("UABA <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1978. public void Uaba_V_8B_4H_2S([Values(0u)] uint Rd,
  1979. [Values(1u, 0u)] uint Rn,
  1980. [Values(2u, 0u)] uint Rm,
  1981. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1982. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1983. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  1984. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  1985. {
  1986. uint Opcode = 0x2E207C00; // UABA V0.8B, V0.8B, V0.8B
  1987. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1988. Opcode |= ((size & 3) << 22);
  1989. Bits Op = new Bits(Opcode);
  1990. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1991. Vector128<float> V1 = MakeVectorE0(A);
  1992. Vector128<float> V2 = MakeVectorE0(B);
  1993. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1994. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1995. AArch64.V(1, new Bits(A));
  1996. AArch64.V(2, new Bits(B));
  1997. SimdFp.Uaba_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1998. Assert.Multiple(() =>
  1999. {
  2000. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2001. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2002. });
  2003. }
  2004. [Test, Pairwise, Description("UABA <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2005. public void Uaba_V_16B_8H_4S([Values(0u)] uint Rd,
  2006. [Values(1u, 0u)] uint Rn,
  2007. [Values(2u, 0u)] uint Rm,
  2008. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2009. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2010. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2011. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
  2012. {
  2013. uint Opcode = 0x6E207C00; // UABA V0.16B, V0.16B, V0.16B
  2014. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2015. Opcode |= ((size & 3) << 22);
  2016. Bits Op = new Bits(Opcode);
  2017. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2018. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2019. Vector128<float> V2 = MakeVectorE0E1(B, B);
  2020. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2021. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2022. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2023. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  2024. SimdFp.Uaba_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2025. Assert.Multiple(() =>
  2026. {
  2027. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2028. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2029. });
  2030. }
  2031. [Test, Pairwise, Description("UABAL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
  2032. public void Uabal_V_8B8H_4H4S_2S2D([Values(0u)] uint Rd,
  2033. [Values(1u, 0u)] uint Rn,
  2034. [Values(2u, 0u)] uint Rm,
  2035. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2036. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2037. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2038. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H, 4H4S, 2S2D>
  2039. {
  2040. uint Opcode = 0x2E205000; // UABAL V0.8H, V0.8B, V0.8B
  2041. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2042. Opcode |= ((size & 3) << 22);
  2043. Bits Op = new Bits(Opcode);
  2044. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2045. Vector128<float> V1 = MakeVectorE0(A);
  2046. Vector128<float> V2 = MakeVectorE0(B);
  2047. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2048. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2049. AArch64.Vpart(1, 0, new Bits(A));
  2050. AArch64.Vpart(2, 0, new Bits(B));
  2051. SimdFp.Uabal_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2052. Assert.Multiple(() =>
  2053. {
  2054. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2055. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2056. });
  2057. }
  2058. [Test, Pairwise, Description("UABAL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
  2059. public void Uabal_V_16B8H_8H4S_4S2D([Values(0u)] uint Rd,
  2060. [Values(1u, 0u)] uint Rn,
  2061. [Values(2u, 0u)] uint Rm,
  2062. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2063. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2064. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2065. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H, 8H4S, 4S2D>
  2066. {
  2067. uint Opcode = 0x6E205000; // UABAL2 V0.8H, V0.16B, V0.16B
  2068. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2069. Opcode |= ((size & 3) << 22);
  2070. Bits Op = new Bits(Opcode);
  2071. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2072. Vector128<float> V1 = MakeVectorE1(A);
  2073. Vector128<float> V2 = MakeVectorE1(B);
  2074. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2075. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2076. AArch64.Vpart(1, 1, new Bits(A));
  2077. AArch64.Vpart(2, 1, new Bits(B));
  2078. SimdFp.Uabal_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2079. Assert.Multiple(() =>
  2080. {
  2081. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2082. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2083. });
  2084. }
  2085. [Test, Pairwise, Description("UABD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2086. public void Uabd_V_8B_4H_2S([Values(0u)] uint Rd,
  2087. [Values(1u, 0u)] uint Rn,
  2088. [Values(2u, 0u)] uint Rm,
  2089. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2090. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2091. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2092. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  2093. {
  2094. uint Opcode = 0x2E207400; // UABD V0.8B, V0.8B, V0.8B
  2095. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2096. Opcode |= ((size & 3) << 22);
  2097. Bits Op = new Bits(Opcode);
  2098. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2099. Vector128<float> V1 = MakeVectorE0(A);
  2100. Vector128<float> V2 = MakeVectorE0(B);
  2101. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2102. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2103. AArch64.V(1, new Bits(A));
  2104. AArch64.V(2, new Bits(B));
  2105. SimdFp.Uabd_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2106. Assert.Multiple(() =>
  2107. {
  2108. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2109. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2110. });
  2111. }
  2112. [Test, Pairwise, Description("UABD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2113. public void Uabd_V_16B_8H_4S([Values(0u)] uint Rd,
  2114. [Values(1u, 0u)] uint Rn,
  2115. [Values(2u, 0u)] uint Rm,
  2116. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2117. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2118. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2119. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
  2120. {
  2121. uint Opcode = 0x6E207400; // UABD V0.16B, V0.16B, V0.16B
  2122. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2123. Opcode |= ((size & 3) << 22);
  2124. Bits Op = new Bits(Opcode);
  2125. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2126. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2127. Vector128<float> V2 = MakeVectorE0E1(B, B);
  2128. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2129. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2130. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2131. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  2132. SimdFp.Uabd_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2133. Assert.Multiple(() =>
  2134. {
  2135. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2136. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2137. });
  2138. }
  2139. [Test, Pairwise, Description("UABDL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
  2140. public void Uabdl_V_8B8H_4H4S_2S2D([Values(0u)] uint Rd,
  2141. [Values(1u, 0u)] uint Rn,
  2142. [Values(2u, 0u)] uint Rm,
  2143. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2144. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2145. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2146. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H, 4H4S, 2S2D>
  2147. {
  2148. uint Opcode = 0x2E207000; // UABDL V0.8H, V0.8B, V0.8B
  2149. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2150. Opcode |= ((size & 3) << 22);
  2151. Bits Op = new Bits(Opcode);
  2152. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2153. Vector128<float> V1 = MakeVectorE0(A);
  2154. Vector128<float> V2 = MakeVectorE0(B);
  2155. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2156. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2157. AArch64.Vpart(1, 0, new Bits(A));
  2158. AArch64.Vpart(2, 0, new Bits(B));
  2159. SimdFp.Uabdl_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2160. Assert.Multiple(() =>
  2161. {
  2162. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2163. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2164. });
  2165. }
  2166. [Test, Pairwise, Description("UABDL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
  2167. public void Uabdl_V_16B8H_8H4S_4S2D([Values(0u)] uint Rd,
  2168. [Values(1u, 0u)] uint Rn,
  2169. [Values(2u, 0u)] uint Rm,
  2170. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2171. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2172. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2173. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H, 8H4S, 4S2D>
  2174. {
  2175. uint Opcode = 0x6E207000; // UABDL2 V0.8H, V0.16B, V0.16B
  2176. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2177. Opcode |= ((size & 3) << 22);
  2178. Bits Op = new Bits(Opcode);
  2179. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2180. Vector128<float> V1 = MakeVectorE1(A);
  2181. Vector128<float> V2 = MakeVectorE1(B);
  2182. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2183. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2184. AArch64.Vpart(1, 1, new Bits(A));
  2185. AArch64.Vpart(2, 1, new Bits(B));
  2186. SimdFp.Uabdl_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2187. Assert.Multiple(() =>
  2188. {
  2189. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2190. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2191. });
  2192. }
  2193. [Test, Pairwise, Description("UADDW{2} <Vd>.<Ta>, <Vn>.<Ta>, <Vm>.<Tb>")]
  2194. public void Uaddw_V_8B8H8H_4H4S4S_2S2D2D([Values(0u)] uint Rd,
  2195. [Values(1u, 0u)] uint Rn,
  2196. [Values(2u, 0u)] uint Rm,
  2197. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2198. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  2199. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2200. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H8H, 4H4S4S, 2S2D2D>
  2201. {
  2202. uint Opcode = 0x2E201000; // UADDW V0.8H, V0.8H, V0.8B
  2203. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2204. Opcode |= ((size & 3) << 22);
  2205. Bits Op = new Bits(Opcode);
  2206. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2207. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2208. Vector128<float> V2 = MakeVectorE0(B);
  2209. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2210. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2211. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2212. AArch64.Vpart(2, 0, new Bits(B));
  2213. SimdFp.Uaddw_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2214. Assert.Multiple(() =>
  2215. {
  2216. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2217. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2218. });
  2219. }
  2220. [Test, Pairwise, Description("UADDW{2} <Vd>.<Ta>, <Vn>.<Ta>, <Vm>.<Tb>")]
  2221. public void Uaddw_V_16B8H8H_8H4S4S_4S2D2D([Values(0u)] uint Rd,
  2222. [Values(1u, 0u)] uint Rn,
  2223. [Values(2u, 0u)] uint Rm,
  2224. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2225. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  2226. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2227. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H8H, 8H4S4S, 4S2D2D>
  2228. {
  2229. uint Opcode = 0x6E201000; // UADDW2 V0.8H, V0.8H, V0.16B
  2230. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2231. Opcode |= ((size & 3) << 22);
  2232. Bits Op = new Bits(Opcode);
  2233. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2234. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2235. Vector128<float> V2 = MakeVectorE1(B);
  2236. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2237. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2238. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2239. AArch64.Vpart(2, 1, new Bits(B));
  2240. SimdFp.Uaddw_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2241. Assert.Multiple(() =>
  2242. {
  2243. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2244. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2245. });
  2246. }
  2247. [Test, Pairwise, Description("UQADD <V><d>, <V><n>, <V><m>")]
  2248. public void Uqadd_S_B_H_S_D([Values(0u)] uint Rd,
  2249. [Values(1u, 0u)] uint Rn,
  2250. [Values(2u, 0u)] uint Rm,
  2251. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong Z,
  2252. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong A,
  2253. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong B,
  2254. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <B, H, S, D>
  2255. {
  2256. uint Opcode = 0x7E200C00; // UQADD B0, B0, B0
  2257. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2258. Opcode |= ((size & 3) << 22);
  2259. Bits Op = new Bits(Opcode);
  2260. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  2261. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2262. Vector128<float> V1 = MakeVectorE0(A);
  2263. Vector128<float> V2 = MakeVectorE0(B);
  2264. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  2265. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2266. AArch64.V(1, new Bits(A));
  2267. AArch64.V(2, new Bits(B));
  2268. Shared.FPSR = new Bits((uint)Fpsr);
  2269. SimdFp.Uqadd_S(Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2270. Assert.Multiple(() =>
  2271. {
  2272. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2273. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2274. });
  2275. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  2276. }
  2277. [Test, Pairwise, Description("UQADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2278. public void Uqadd_V_8B_4H_2S([Values(0u)] uint Rd,
  2279. [Values(1u, 0u)] uint Rn,
  2280. [Values(2u, 0u)] uint Rm,
  2281. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2282. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2283. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2284. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  2285. {
  2286. uint Opcode = 0x2E200C00; // UQADD V0.8B, V0.8B, V0.8B
  2287. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2288. Opcode |= ((size & 3) << 22);
  2289. Bits Op = new Bits(Opcode);
  2290. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  2291. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2292. Vector128<float> V1 = MakeVectorE0(A);
  2293. Vector128<float> V2 = MakeVectorE0(B);
  2294. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  2295. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2296. AArch64.V(1, new Bits(A));
  2297. AArch64.V(2, new Bits(B));
  2298. Shared.FPSR = new Bits((uint)Fpsr);
  2299. SimdFp.Uqadd_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2300. Assert.Multiple(() =>
  2301. {
  2302. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2303. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2304. });
  2305. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  2306. }
  2307. [Test, Pairwise, Description("UQADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2308. public void Uqadd_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  2309. [Values(1u, 0u)] uint Rn,
  2310. [Values(2u, 0u)] uint Rm,
  2311. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2312. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  2313. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  2314. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  2315. {
  2316. uint Opcode = 0x6E200C00; // UQADD V0.16B, V0.16B, V0.16B
  2317. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2318. Opcode |= ((size & 3) << 22);
  2319. Bits Op = new Bits(Opcode);
  2320. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  2321. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2322. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2323. Vector128<float> V2 = MakeVectorE0E1(B, B);
  2324. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  2325. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2326. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2327. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  2328. Shared.FPSR = new Bits((uint)Fpsr);
  2329. SimdFp.Uqadd_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2330. Assert.Multiple(() =>
  2331. {
  2332. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2333. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2334. });
  2335. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  2336. }
  2337. [Test, Pairwise, Description("UQSUB <V><d>, <V><n>, <V><m>")]
  2338. public void Uqsub_S_B_H_S_D([Values(0u)] uint Rd,
  2339. [Values(1u, 0u)] uint Rn,
  2340. [Values(2u, 0u)] uint Rm,
  2341. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong Z,
  2342. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong A,
  2343. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong B,
  2344. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <B, H, S, D>
  2345. {
  2346. uint Opcode = 0x7E202C00; // UQSUB B0, B0, B0
  2347. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2348. Opcode |= ((size & 3) << 22);
  2349. Bits Op = new Bits(Opcode);
  2350. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  2351. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2352. Vector128<float> V1 = MakeVectorE0(A);
  2353. Vector128<float> V2 = MakeVectorE0(B);
  2354. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  2355. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2356. AArch64.V(1, new Bits(A));
  2357. AArch64.V(2, new Bits(B));
  2358. Shared.FPSR = new Bits((uint)Fpsr);
  2359. SimdFp.Uqsub_S(Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2360. Assert.Multiple(() =>
  2361. {
  2362. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2363. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2364. });
  2365. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  2366. }
  2367. [Test, Pairwise, Description("UQSUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2368. public void Uqsub_V_8B_4H_2S([Values(0u)] uint Rd,
  2369. [Values(1u, 0u)] uint Rn,
  2370. [Values(2u, 0u)] uint Rm,
  2371. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2372. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2373. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2374. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  2375. {
  2376. uint Opcode = 0x2E202C00; // UQSUB V0.8B, V0.8B, V0.8B
  2377. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2378. Opcode |= ((size & 3) << 22);
  2379. Bits Op = new Bits(Opcode);
  2380. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  2381. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2382. Vector128<float> V1 = MakeVectorE0(A);
  2383. Vector128<float> V2 = MakeVectorE0(B);
  2384. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  2385. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2386. AArch64.V(1, new Bits(A));
  2387. AArch64.V(2, new Bits(B));
  2388. Shared.FPSR = new Bits((uint)Fpsr);
  2389. SimdFp.Uqsub_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2390. Assert.Multiple(() =>
  2391. {
  2392. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2393. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2394. });
  2395. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  2396. }
  2397. [Test, Pairwise, Description("UQSUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2398. public void Uqsub_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  2399. [Values(1u, 0u)] uint Rn,
  2400. [Values(2u, 0u)] uint Rm,
  2401. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2402. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  2403. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  2404. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  2405. {
  2406. uint Opcode = 0x6E202C00; // UQSUB V0.16B, V0.16B, V0.16B
  2407. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2408. Opcode |= ((size & 3) << 22);
  2409. Bits Op = new Bits(Opcode);
  2410. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  2411. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2412. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2413. Vector128<float> V2 = MakeVectorE0E1(B, B);
  2414. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  2415. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2416. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2417. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  2418. Shared.FPSR = new Bits((uint)Fpsr);
  2419. SimdFp.Uqsub_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2420. Assert.Multiple(() =>
  2421. {
  2422. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2423. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2424. });
  2425. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  2426. }
  2427. [Test, Pairwise, Description("USUBW{2} <Vd>.<Ta>, <Vn>.<Ta>, <Vm>.<Tb>")]
  2428. public void Usubw_V_8B8H8H_4H4S4S_2S2D2D([Values(0u)] uint Rd,
  2429. [Values(1u, 0u)] uint Rn,
  2430. [Values(2u, 0u)] uint Rm,
  2431. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2432. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  2433. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2434. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H8H, 4H4S4S, 2S2D2D>
  2435. {
  2436. uint Opcode = 0x2E203000; // USUBW V0.8H, V0.8H, V0.8B
  2437. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2438. Opcode |= ((size & 3) << 22);
  2439. Bits Op = new Bits(Opcode);
  2440. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2441. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2442. Vector128<float> V2 = MakeVectorE0(B);
  2443. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2444. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2445. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2446. AArch64.Vpart(2, 0, new Bits(B));
  2447. SimdFp.Usubw_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2448. Assert.Multiple(() =>
  2449. {
  2450. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2451. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2452. });
  2453. }
  2454. [Test, Pairwise, Description("USUBW{2} <Vd>.<Ta>, <Vn>.<Ta>, <Vm>.<Tb>")]
  2455. public void Usubw_V_16B8H8H_8H4S4S_4S2D2D([Values(0u)] uint Rd,
  2456. [Values(1u, 0u)] uint Rn,
  2457. [Values(2u, 0u)] uint Rm,
  2458. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2459. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  2460. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2461. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H8H, 8H4S4S, 4S2D2D>
  2462. {
  2463. uint Opcode = 0x6E203000; // USUBW2 V0.8H, V0.8H, V0.16B
  2464. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2465. Opcode |= ((size & 3) << 22);
  2466. Bits Op = new Bits(Opcode);
  2467. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2468. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2469. Vector128<float> V2 = MakeVectorE1(B);
  2470. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2471. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2472. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2473. AArch64.Vpart(2, 1, new Bits(B));
  2474. SimdFp.Usubw_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2475. Assert.Multiple(() =>
  2476. {
  2477. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2478. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2479. });
  2480. }
  2481. [Test, Pairwise, Description("UZP1 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2482. public void Uzp1_V_8B_4H_2S([Values(0u)] uint Rd,
  2483. [Values(1u, 0u)] uint Rn,
  2484. [Values(2u, 0u)] uint Rm,
  2485. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2486. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2487. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2488. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  2489. {
  2490. uint Opcode = 0x0E001800; // UZP1 V0.8B, V0.8B, V0.8B
  2491. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2492. Opcode |= ((size & 3) << 22);
  2493. Bits Op = new Bits(Opcode);
  2494. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2495. Vector128<float> V1 = MakeVectorE0(A);
  2496. Vector128<float> V2 = MakeVectorE0(B);
  2497. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2498. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2499. AArch64.V(1, new Bits(A));
  2500. AArch64.V(2, new Bits(B));
  2501. SimdFp.Uzp1_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2502. Assert.Multiple(() =>
  2503. {
  2504. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2505. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2506. });
  2507. }
  2508. [Test, Pairwise, Description("UZP1 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2509. public void Uzp1_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  2510. [Values(1u, 0u)] uint Rn,
  2511. [Values(2u, 0u)] uint Rm,
  2512. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2513. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  2514. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  2515. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  2516. {
  2517. uint Opcode = 0x4E001800; // UZP1 V0.16B, V0.16B, V0.16B
  2518. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2519. Opcode |= ((size & 3) << 22);
  2520. Bits Op = new Bits(Opcode);
  2521. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2522. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2523. Vector128<float> V2 = MakeVectorE0E1(B, B);
  2524. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2525. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2526. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2527. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  2528. SimdFp.Uzp1_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2529. Assert.Multiple(() =>
  2530. {
  2531. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2532. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2533. });
  2534. }
  2535. [Test, Pairwise, Description("UZP2 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2536. public void Uzp2_V_8B_4H_2S([Values(0u)] uint Rd,
  2537. [Values(1u, 0u)] uint Rn,
  2538. [Values(2u, 0u)] uint Rm,
  2539. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2540. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2541. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2542. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  2543. {
  2544. uint Opcode = 0x0E005800; // UZP2 V0.8B, V0.8B, V0.8B
  2545. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2546. Opcode |= ((size & 3) << 22);
  2547. Bits Op = new Bits(Opcode);
  2548. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2549. Vector128<float> V1 = MakeVectorE0(A);
  2550. Vector128<float> V2 = MakeVectorE0(B);
  2551. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2552. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2553. AArch64.V(1, new Bits(A));
  2554. AArch64.V(2, new Bits(B));
  2555. SimdFp.Uzp2_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2556. Assert.Multiple(() =>
  2557. {
  2558. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2559. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2560. });
  2561. }
  2562. [Test, Pairwise, Description("UZP2 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2563. public void Uzp2_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  2564. [Values(1u, 0u)] uint Rn,
  2565. [Values(2u, 0u)] uint Rm,
  2566. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2567. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  2568. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  2569. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  2570. {
  2571. uint Opcode = 0x4E005800; // UZP2 V0.16B, V0.16B, V0.16B
  2572. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2573. Opcode |= ((size & 3) << 22);
  2574. Bits Op = new Bits(Opcode);
  2575. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2576. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2577. Vector128<float> V2 = MakeVectorE0E1(B, B);
  2578. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2579. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2580. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2581. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  2582. SimdFp.Uzp2_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2583. Assert.Multiple(() =>
  2584. {
  2585. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2586. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2587. });
  2588. }
  2589. [Test, Pairwise, Description("ZIP1 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2590. public void Zip1_V_8B_4H_2S([Values(0u)] uint Rd,
  2591. [Values(1u, 0u)] uint Rn,
  2592. [Values(2u, 0u)] uint Rm,
  2593. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2594. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2595. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2596. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  2597. {
  2598. uint Opcode = 0x0E003800; // ZIP1 V0.8B, V0.8B, V0.8B
  2599. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2600. Opcode |= ((size & 3) << 22);
  2601. Bits Op = new Bits(Opcode);
  2602. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2603. Vector128<float> V1 = MakeVectorE0(A);
  2604. Vector128<float> V2 = MakeVectorE0(B);
  2605. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2606. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2607. AArch64.V(1, new Bits(A));
  2608. AArch64.V(2, new Bits(B));
  2609. SimdFp.Zip1_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2610. Assert.Multiple(() =>
  2611. {
  2612. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2613. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2614. });
  2615. }
  2616. [Test, Pairwise, Description("ZIP1 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2617. public void Zip1_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  2618. [Values(1u, 0u)] uint Rn,
  2619. [Values(2u, 0u)] uint Rm,
  2620. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2621. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  2622. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  2623. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  2624. {
  2625. uint Opcode = 0x4E003800; // ZIP1 V0.16B, V0.16B, V0.16B
  2626. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2627. Opcode |= ((size & 3) << 22);
  2628. Bits Op = new Bits(Opcode);
  2629. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2630. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2631. Vector128<float> V2 = MakeVectorE0E1(B, B);
  2632. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2633. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2634. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2635. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  2636. SimdFp.Zip1_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2637. Assert.Multiple(() =>
  2638. {
  2639. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2640. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2641. });
  2642. }
  2643. [Test, Pairwise, Description("ZIP2 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2644. public void Zip2_V_8B_4H_2S([Values(0u)] uint Rd,
  2645. [Values(1u, 0u)] uint Rn,
  2646. [Values(2u, 0u)] uint Rm,
  2647. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2648. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2649. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2650. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  2651. {
  2652. uint Opcode = 0x0E007800; // ZIP2 V0.8B, V0.8B, V0.8B
  2653. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2654. Opcode |= ((size & 3) << 22);
  2655. Bits Op = new Bits(Opcode);
  2656. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2657. Vector128<float> V1 = MakeVectorE0(A);
  2658. Vector128<float> V2 = MakeVectorE0(B);
  2659. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2660. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2661. AArch64.V(1, new Bits(A));
  2662. AArch64.V(2, new Bits(B));
  2663. SimdFp.Zip2_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2664. Assert.Multiple(() =>
  2665. {
  2666. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2667. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2668. });
  2669. }
  2670. [Test, Pairwise, Description("ZIP2 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2671. public void Zip2_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  2672. [Values(1u, 0u)] uint Rn,
  2673. [Values(2u, 0u)] uint Rm,
  2674. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2675. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  2676. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  2677. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  2678. {
  2679. uint Opcode = 0x4E007800; // ZIP2 V0.16B, V0.16B, V0.16B
  2680. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2681. Opcode |= ((size & 3) << 22);
  2682. Bits Op = new Bits(Opcode);
  2683. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2684. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2685. Vector128<float> V2 = MakeVectorE0E1(B, B);
  2686. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2687. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2688. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2689. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  2690. SimdFp.Zip2_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2691. Assert.Multiple(() =>
  2692. {
  2693. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2694. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2695. });
  2696. }
  2697. #endif
  2698. }
  2699. }