CpuTestSimdReg.cs 201 KB

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