CpuTestSimdReg.cs 181 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451
  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, Explicit, Description("SHA256H <Qd>, <Qn>, <Vm>.4S")] // 2916 tests.
  1516. public void Sha256h_V([Values(0u)] uint Rd,
  1517. [Values(1u, 0u)] uint Rn,
  1518. [Values(2u, 0u)] uint Rm,
  1519. [Random(3)] ulong Z0, [Random(3)] ulong Z1,
  1520. [Random(3)] ulong A0, [Random(3)] ulong A1,
  1521. [Random(3)] ulong B0, [Random(3)] 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, Explicit, Description("SHA256H2 <Qd>, <Qn>, <Vm>.4S")] // 2916 tests.
  1548. public void Sha256h2_V([Values(0u)] uint Rd,
  1549. [Values(1u, 0u)] uint Rn,
  1550. [Values(2u, 0u)] uint Rm,
  1551. [Random(3)] ulong Z0, [Random(3)] ulong Z1,
  1552. [Random(3)] ulong A0, [Random(3)] ulong A1,
  1553. [Random(3)] ulong B0, [Random(3)] 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, Explicit, Description("SHA256SU1 <Vd>.4S, <Vn>.4S, <Vm>.4S")] // 2916 tests.
  1580. public void Sha256su1_V([Values(0u)] uint Rd,
  1581. [Values(1u, 0u)] uint Rn,
  1582. [Values(2u, 0u)] uint Rm,
  1583. [Random(3)] ulong Z0, [Random(3)] ulong Z1,
  1584. [Random(3)] ulong A0, [Random(3)] ulong A1,
  1585. [Random(3)] ulong B0, [Random(3)] 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("SQADD <V><d>, <V><n>, <V><m>")]
  1612. public void Sqadd_S_B_H_S_D([Values(0u)] uint Rd,
  1613. [Values(1u, 0u)] uint Rn,
  1614. [Values(2u, 0u)] uint Rm,
  1615. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong Z,
  1616. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong A,
  1617. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong B,
  1618. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <B, H, S, D>
  1619. {
  1620. uint Opcode = 0x5E200C00; // SQADD B0, B0, B0
  1621. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1622. Opcode |= ((size & 3) << 22);
  1623. Bits Op = new Bits(Opcode);
  1624. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1625. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1626. Vector128<float> V1 = MakeVectorE0(A);
  1627. Vector128<float> V2 = MakeVectorE0(B);
  1628. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  1629. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1630. AArch64.V(1, new Bits(A));
  1631. AArch64.V(2, new Bits(B));
  1632. Shared.FPSR = new Bits((uint)Fpsr);
  1633. SimdFp.Sqadd_S(Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1634. Assert.Multiple(() =>
  1635. {
  1636. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1637. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1638. });
  1639. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1640. }
  1641. [Test, Pairwise, Description("SQADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1642. public void Sqadd_V_8B_4H_2S([Values(0u)] uint Rd,
  1643. [Values(1u, 0u)] uint Rn,
  1644. [Values(2u, 0u)] uint Rm,
  1645. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1646. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1647. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  1648. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  1649. {
  1650. uint Opcode = 0x0E200C00; // SQADD V0.8B, V0.8B, V0.8B
  1651. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1652. Opcode |= ((size & 3) << 22);
  1653. Bits Op = new Bits(Opcode);
  1654. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1655. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1656. Vector128<float> V1 = MakeVectorE0(A);
  1657. Vector128<float> V2 = MakeVectorE0(B);
  1658. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  1659. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1660. AArch64.V(1, new Bits(A));
  1661. AArch64.V(2, new Bits(B));
  1662. Shared.FPSR = new Bits((uint)Fpsr);
  1663. SimdFp.Sqadd_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1664. Assert.Multiple(() =>
  1665. {
  1666. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1667. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1668. });
  1669. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1670. }
  1671. [Test, Pairwise, Description("SQADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1672. public void Sqadd_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  1673. [Values(1u, 0u)] uint Rn,
  1674. [Values(2u, 0u)] uint Rm,
  1675. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  1676. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  1677. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  1678. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  1679. {
  1680. uint Opcode = 0x4E200C00; // SQADD V0.16B, V0.16B, V0.16B
  1681. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1682. Opcode |= ((size & 3) << 22);
  1683. Bits Op = new Bits(Opcode);
  1684. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1685. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1686. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1687. Vector128<float> V2 = MakeVectorE0E1(B, B);
  1688. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  1689. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1690. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1691. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  1692. Shared.FPSR = new Bits((uint)Fpsr);
  1693. SimdFp.Sqadd_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1694. Assert.Multiple(() =>
  1695. {
  1696. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1697. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1698. });
  1699. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1700. }
  1701. [Test, Pairwise, Description("SQDMULH <V><d>, <V><n>, <V><m>")]
  1702. public void Sqdmulh_S_H_S([Values(0u)] uint Rd,
  1703. [Values(1u, 0u)] uint Rn,
  1704. [Values(2u, 0u)] uint Rm,
  1705. [ValueSource("_1H1S_")] [Random(RndCnt)] ulong Z,
  1706. [ValueSource("_1H1S_")] [Random(RndCnt)] ulong A,
  1707. [ValueSource("_1H1S_")] [Random(RndCnt)] ulong B,
  1708. [Values(0b01u, 0b10u)] uint size) // <H, S>
  1709. {
  1710. uint Opcode = 0x5E20B400; // SQDMULH B0, B0, B0 (RESERVED)
  1711. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1712. Opcode |= ((size & 3) << 22);
  1713. Bits Op = new Bits(Opcode);
  1714. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1715. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1716. Vector128<float> V1 = MakeVectorE0(A);
  1717. Vector128<float> V2 = MakeVectorE0(B);
  1718. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  1719. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1720. AArch64.V(1, new Bits(A));
  1721. AArch64.V(2, new Bits(B));
  1722. Shared.FPSR = new Bits((uint)Fpsr);
  1723. SimdFp.Sqdmulh_S(Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1724. Assert.Multiple(() =>
  1725. {
  1726. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1727. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1728. });
  1729. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1730. }
  1731. [Test, Pairwise, Description("SQDMULH <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1732. public void Sqdmulh_V_4H_2S([Values(0u)] uint Rd,
  1733. [Values(1u, 0u)] uint Rn,
  1734. [Values(2u, 0u)] uint Rm,
  1735. [ValueSource("_4H2S_")] [Random(RndCnt)] ulong Z,
  1736. [ValueSource("_4H2S_")] [Random(RndCnt)] ulong A,
  1737. [ValueSource("_4H2S_")] [Random(RndCnt)] ulong B,
  1738. [Values(0b01u, 0b10u)] uint size) // <4H, 2S>
  1739. {
  1740. uint Opcode = 0x0E20B400; // SQDMULH V0.8B, V0.8B, V0.8B (RESERVED)
  1741. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1742. Opcode |= ((size & 3) << 22);
  1743. Bits Op = new Bits(Opcode);
  1744. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1745. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1746. Vector128<float> V1 = MakeVectorE0(A);
  1747. Vector128<float> V2 = MakeVectorE0(B);
  1748. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  1749. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1750. AArch64.V(1, new Bits(A));
  1751. AArch64.V(2, new Bits(B));
  1752. Shared.FPSR = new Bits((uint)Fpsr);
  1753. SimdFp.Sqdmulh_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1754. Assert.Multiple(() =>
  1755. {
  1756. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1757. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1758. });
  1759. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1760. }
  1761. [Test, Pairwise, Description("SQDMULH <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1762. public void Sqdmulh_V_8H_4S([Values(0u)] uint Rd,
  1763. [Values(1u, 0u)] uint Rn,
  1764. [Values(2u, 0u)] uint Rm,
  1765. [ValueSource("_4H2S_")] [Random(RndCnt)] ulong Z,
  1766. [ValueSource("_4H2S_")] [Random(RndCnt)] ulong A,
  1767. [ValueSource("_4H2S_")] [Random(RndCnt)] ulong B,
  1768. [Values(0b01u, 0b10u)] uint size) // <8H, 4S>
  1769. {
  1770. uint Opcode = 0x4E20B400; // SQDMULH V0.16B, V0.16B, V0.16B (RESERVED)
  1771. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1772. Opcode |= ((size & 3) << 22);
  1773. Bits Op = new Bits(Opcode);
  1774. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1775. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1776. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1777. Vector128<float> V2 = MakeVectorE0E1(B, B);
  1778. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  1779. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1780. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1781. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  1782. Shared.FPSR = new Bits((uint)Fpsr);
  1783. SimdFp.Sqdmulh_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1784. Assert.Multiple(() =>
  1785. {
  1786. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1787. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1788. });
  1789. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1790. }
  1791. [Test, Pairwise, Description("SQRDMULH <V><d>, <V><n>, <V><m>")]
  1792. public void Sqrdmulh_S_H_S([Values(0u)] uint Rd,
  1793. [Values(1u, 0u)] uint Rn,
  1794. [Values(2u, 0u)] uint Rm,
  1795. [ValueSource("_1H1S_")] [Random(RndCnt)] ulong Z,
  1796. [ValueSource("_1H1S_")] [Random(RndCnt)] ulong A,
  1797. [ValueSource("_1H1S_")] [Random(RndCnt)] ulong B,
  1798. [Values(0b01u, 0b10u)] uint size) // <H, S>
  1799. {
  1800. uint Opcode = 0x7E20B400; // SQRDMULH B0, B0, B0 (RESERVED)
  1801. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1802. Opcode |= ((size & 3) << 22);
  1803. Bits Op = new Bits(Opcode);
  1804. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1805. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1806. Vector128<float> V1 = MakeVectorE0(A);
  1807. Vector128<float> V2 = MakeVectorE0(B);
  1808. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  1809. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1810. AArch64.V(1, new Bits(A));
  1811. AArch64.V(2, new Bits(B));
  1812. Shared.FPSR = new Bits((uint)Fpsr);
  1813. SimdFp.Sqrdmulh_S(Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1814. Assert.Multiple(() =>
  1815. {
  1816. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1817. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1818. });
  1819. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1820. }
  1821. [Test, Pairwise, Description("SQRDMULH <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1822. public void Sqrdmulh_V_4H_2S([Values(0u)] uint Rd,
  1823. [Values(1u, 0u)] uint Rn,
  1824. [Values(2u, 0u)] uint Rm,
  1825. [ValueSource("_4H2S_")] [Random(RndCnt)] ulong Z,
  1826. [ValueSource("_4H2S_")] [Random(RndCnt)] ulong A,
  1827. [ValueSource("_4H2S_")] [Random(RndCnt)] ulong B,
  1828. [Values(0b01u, 0b10u)] uint size) // <4H, 2S>
  1829. {
  1830. uint Opcode = 0x2E20B400; // SQRDMULH V0.8B, V0.8B, V0.8B (RESERVED)
  1831. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1832. Opcode |= ((size & 3) << 22);
  1833. Bits Op = new Bits(Opcode);
  1834. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1835. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1836. Vector128<float> V1 = MakeVectorE0(A);
  1837. Vector128<float> V2 = MakeVectorE0(B);
  1838. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  1839. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1840. AArch64.V(1, new Bits(A));
  1841. AArch64.V(2, new Bits(B));
  1842. Shared.FPSR = new Bits((uint)Fpsr);
  1843. SimdFp.Sqrdmulh_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1844. Assert.Multiple(() =>
  1845. {
  1846. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1847. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1848. });
  1849. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1850. }
  1851. [Test, Pairwise, Description("SQRDMULH <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1852. public void Sqrdmulh_V_8H_4S([Values(0u)] uint Rd,
  1853. [Values(1u, 0u)] uint Rn,
  1854. [Values(2u, 0u)] uint Rm,
  1855. [ValueSource("_4H2S_")] [Random(RndCnt)] ulong Z,
  1856. [ValueSource("_4H2S_")] [Random(RndCnt)] ulong A,
  1857. [ValueSource("_4H2S_")] [Random(RndCnt)] ulong B,
  1858. [Values(0b01u, 0b10u)] uint size) // <8H, 4S>
  1859. {
  1860. uint Opcode = 0x6E20B400; // SQRDMULH V0.16B, V0.16B, V0.16B (RESERVED)
  1861. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1862. Opcode |= ((size & 3) << 22);
  1863. Bits Op = new Bits(Opcode);
  1864. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1865. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1866. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1867. Vector128<float> V2 = MakeVectorE0E1(B, B);
  1868. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  1869. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1870. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1871. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  1872. Shared.FPSR = new Bits((uint)Fpsr);
  1873. SimdFp.Sqrdmulh_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1874. Assert.Multiple(() =>
  1875. {
  1876. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1877. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1878. });
  1879. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1880. }
  1881. [Test, Pairwise, Description("SQSUB <V><d>, <V><n>, <V><m>")]
  1882. public void Sqsub_S_B_H_S_D([Values(0u)] uint Rd,
  1883. [Values(1u, 0u)] uint Rn,
  1884. [Values(2u, 0u)] uint Rm,
  1885. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong Z,
  1886. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong A,
  1887. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong B,
  1888. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <B, H, S, D>
  1889. {
  1890. uint Opcode = 0x5E202C00; // SQSUB B0, B0, B0
  1891. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1892. Opcode |= ((size & 3) << 22);
  1893. Bits Op = new Bits(Opcode);
  1894. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1895. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1896. Vector128<float> V1 = MakeVectorE0(A);
  1897. Vector128<float> V2 = MakeVectorE0(B);
  1898. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  1899. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1900. AArch64.V(1, new Bits(A));
  1901. AArch64.V(2, new Bits(B));
  1902. Shared.FPSR = new Bits((uint)Fpsr);
  1903. SimdFp.Sqsub_S(Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1904. Assert.Multiple(() =>
  1905. {
  1906. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1907. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1908. });
  1909. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1910. }
  1911. [Test, Pairwise, Description("SQSUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1912. public void Sqsub_V_8B_4H_2S([Values(0u)] uint Rd,
  1913. [Values(1u, 0u)] uint Rn,
  1914. [Values(2u, 0u)] uint Rm,
  1915. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  1916. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  1917. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  1918. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  1919. {
  1920. uint Opcode = 0x0E202C00; // SQSUB V0.8B, V0.8B, V0.8B
  1921. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1922. Opcode |= ((size & 3) << 22);
  1923. Bits Op = new Bits(Opcode);
  1924. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1925. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1926. Vector128<float> V1 = MakeVectorE0(A);
  1927. Vector128<float> V2 = MakeVectorE0(B);
  1928. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  1929. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1930. AArch64.V(1, new Bits(A));
  1931. AArch64.V(2, new Bits(B));
  1932. Shared.FPSR = new Bits((uint)Fpsr);
  1933. SimdFp.Sqsub_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1934. Assert.Multiple(() =>
  1935. {
  1936. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1937. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1938. });
  1939. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1940. }
  1941. [Test, Pairwise, Description("SQSUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  1942. public void Sqsub_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  1943. [Values(1u, 0u)] uint Rn,
  1944. [Values(2u, 0u)] uint Rm,
  1945. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  1946. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  1947. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  1948. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  1949. {
  1950. uint Opcode = 0x4E202C00; // SQSUB V0.16B, V0.16B, V0.16B
  1951. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1952. Opcode |= ((size & 3) << 22);
  1953. Bits Op = new Bits(Opcode);
  1954. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  1955. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1956. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1957. Vector128<float> V2 = MakeVectorE0E1(B, B);
  1958. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  1959. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1960. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1961. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  1962. Shared.FPSR = new Bits((uint)Fpsr);
  1963. SimdFp.Sqsub_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1964. Assert.Multiple(() =>
  1965. {
  1966. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1967. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1968. });
  1969. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  1970. }
  1971. [Test, Pairwise, Description("SSUBW{2} <Vd>.<Ta>, <Vn>.<Ta>, <Vm>.<Tb>")]
  1972. public void Ssubw_V_8B8H8H_4H4S4S_2S2D2D([Values(0u)] uint Rd,
  1973. [Values(1u, 0u)] uint Rn,
  1974. [Values(2u, 0u)] uint Rm,
  1975. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  1976. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  1977. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  1978. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H8H, 4H4S4S, 2S2D2D>
  1979. {
  1980. uint Opcode = 0x0E203000; // SSUBW V0.8H, V0.8H, V0.8B
  1981. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  1982. Opcode |= ((size & 3) << 22);
  1983. Bits Op = new Bits(Opcode);
  1984. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  1985. Vector128<float> V1 = MakeVectorE0E1(A, A);
  1986. Vector128<float> V2 = MakeVectorE0(B);
  1987. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  1988. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  1989. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  1990. AArch64.Vpart(2, 0, new Bits(B));
  1991. SimdFp.Ssubw_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  1992. Assert.Multiple(() =>
  1993. {
  1994. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  1995. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  1996. });
  1997. }
  1998. [Test, Pairwise, Description("SSUBW{2} <Vd>.<Ta>, <Vn>.<Ta>, <Vm>.<Tb>")]
  1999. public void Ssubw_V_16B8H8H_8H4S4S_4S2D2D([Values(0u)] uint Rd,
  2000. [Values(1u, 0u)] uint Rn,
  2001. [Values(2u, 0u)] uint Rm,
  2002. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2003. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  2004. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2005. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H8H, 8H4S4S, 4S2D2D>
  2006. {
  2007. uint Opcode = 0x4E203000; // SSUBW2 V0.8H, V0.8H, V0.16B
  2008. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2009. Opcode |= ((size & 3) << 22);
  2010. Bits Op = new Bits(Opcode);
  2011. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2012. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2013. Vector128<float> V2 = MakeVectorE1(B);
  2014. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2015. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2016. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2017. AArch64.Vpart(2, 1, new Bits(B));
  2018. SimdFp.Ssubw_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2019. Assert.Multiple(() =>
  2020. {
  2021. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2022. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2023. });
  2024. }
  2025. [Test, Pairwise, Description("SUB <V><d>, <V><n>, <V><m>")]
  2026. public void Sub_S_D([Values(0u)] uint Rd,
  2027. [Values(1u, 0u)] uint Rn,
  2028. [Values(2u, 0u)] uint Rm,
  2029. [ValueSource("_1D_")] [Random(RndCnt)] ulong Z,
  2030. [ValueSource("_1D_")] [Random(RndCnt)] ulong A,
  2031. [ValueSource("_1D_")] [Random(RndCnt)] ulong B)
  2032. {
  2033. uint Opcode = 0x7EE08400; // SUB D0, D0, D0
  2034. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2035. Bits Op = new Bits(Opcode);
  2036. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2037. Vector128<float> V1 = MakeVectorE0(A);
  2038. Vector128<float> V2 = MakeVectorE0(B);
  2039. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2040. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2041. AArch64.V(1, new Bits(A));
  2042. AArch64.V(2, new Bits(B));
  2043. SimdFp.Sub_S(Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2044. Assert.Multiple(() =>
  2045. {
  2046. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2047. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2048. });
  2049. }
  2050. [Test, Pairwise, Description("SUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2051. public void Sub_V_8B_4H_2S([Values(0u)] uint Rd,
  2052. [Values(1u, 0u)] uint Rn,
  2053. [Values(2u, 0u)] uint Rm,
  2054. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2055. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2056. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2057. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  2058. {
  2059. uint Opcode = 0x2E208400; // SUB V0.8B, V0.8B, V0.8B
  2060. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2061. Opcode |= ((size & 3) << 22);
  2062. Bits Op = new Bits(Opcode);
  2063. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2064. Vector128<float> V1 = MakeVectorE0(A);
  2065. Vector128<float> V2 = MakeVectorE0(B);
  2066. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2067. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2068. AArch64.V(1, new Bits(A));
  2069. AArch64.V(2, new Bits(B));
  2070. SimdFp.Sub_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2071. Assert.Multiple(() =>
  2072. {
  2073. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2074. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2075. });
  2076. }
  2077. [Test, Pairwise, Description("SUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2078. public void Sub_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  2079. [Values(1u, 0u)] uint Rn,
  2080. [Values(2u, 0u)] uint Rm,
  2081. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2082. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  2083. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  2084. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  2085. {
  2086. uint Opcode = 0x6E208400; // SUB V0.16B, V0.16B, V0.16B
  2087. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2088. Opcode |= ((size & 3) << 22);
  2089. Bits Op = new Bits(Opcode);
  2090. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2091. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2092. Vector128<float> V2 = MakeVectorE0E1(B, B);
  2093. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2094. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2095. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2096. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  2097. SimdFp.Sub_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2098. Assert.Multiple(() =>
  2099. {
  2100. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2101. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2102. });
  2103. }
  2104. [Test, Pairwise, Description("SUBHN{2} <Vd>.<Tb>, <Vn>.<Ta>, <Vm>.<Ta>")]
  2105. public void Subhn_V_8H8B_4S4H_2D2S([Values(0u)] uint Rd,
  2106. [Values(1u, 0u)] uint Rn,
  2107. [Values(2u, 0u)] uint Rm,
  2108. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  2109. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  2110. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong B,
  2111. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H8B, 4S4H, 2D2S>
  2112. {
  2113. uint Opcode = 0x0E206000; // SUBHN V0.8B, V0.8H, V0.8H
  2114. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2115. Opcode |= ((size & 3) << 22);
  2116. Bits Op = new Bits(Opcode);
  2117. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2118. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2119. Vector128<float> V2 = MakeVectorE0E1(B, B);
  2120. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2121. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2122. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2123. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  2124. SimdFp.Subhn_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2125. Assert.Multiple(() =>
  2126. {
  2127. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2128. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2129. });
  2130. }
  2131. [Test, Pairwise, Description("SUBHN{2} <Vd>.<Tb>, <Vn>.<Ta>, <Vm>.<Ta>")]
  2132. public void Subhn_V_8H16B_4S8H_2D4S([Values(0u)] uint Rd,
  2133. [Values(1u, 0u)] uint Rn,
  2134. [Values(2u, 0u)] uint Rm,
  2135. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong Z,
  2136. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  2137. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong B,
  2138. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8H16B, 4S8H, 2D4S>
  2139. {
  2140. uint Opcode = 0x4E206000; // SUBHN2 V0.16B, V0.8H, V0.8H
  2141. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2142. Opcode |= ((size & 3) << 22);
  2143. Bits Op = new Bits(Opcode);
  2144. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2145. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2146. Vector128<float> V2 = MakeVectorE0E1(B, B);
  2147. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2148. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2149. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2150. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  2151. SimdFp.Subhn_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2152. Assert.Multiple(() =>
  2153. {
  2154. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2155. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2156. });
  2157. }
  2158. [Test, Pairwise, Description("TRN1 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2159. public void Trn1_V_8B_4H_2S([Values(0u)] uint Rd,
  2160. [Values(1u, 0u)] uint Rn,
  2161. [Values(2u, 0u)] uint Rm,
  2162. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2163. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2164. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2165. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  2166. {
  2167. uint Opcode = 0x0E002800; // TRN1 V0.8B, V0.8B, V0.8B
  2168. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2169. Opcode |= ((size & 3) << 22);
  2170. Bits Op = new Bits(Opcode);
  2171. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2172. Vector128<float> V1 = MakeVectorE0(A);
  2173. Vector128<float> V2 = MakeVectorE0(B);
  2174. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2175. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2176. AArch64.V(1, new Bits(A));
  2177. AArch64.V(2, new Bits(B));
  2178. SimdFp.Trn1_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2179. Assert.Multiple(() =>
  2180. {
  2181. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2182. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2183. });
  2184. }
  2185. [Test, Pairwise, Description("TRN1 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2186. public void Trn1_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  2187. [Values(1u, 0u)] uint Rn,
  2188. [Values(2u, 0u)] uint Rm,
  2189. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2190. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  2191. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  2192. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  2193. {
  2194. uint Opcode = 0x4E002800; // TRN1 V0.16B, V0.16B, V0.16B
  2195. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2196. Opcode |= ((size & 3) << 22);
  2197. Bits Op = new Bits(Opcode);
  2198. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2199. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2200. Vector128<float> V2 = MakeVectorE0E1(B, 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.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2204. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  2205. SimdFp.Trn1_V(Op[30], 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("TRN2 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2213. public void Trn2_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 = 0x0E006800; // TRN2 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.Trn2_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("TRN2 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2240. public void Trn2_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 = 0x4E006800; // TRN2 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.Trn2_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("UABA <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2267. public void Uaba_V_8B_4H_2S([Values(0u)] uint Rd,
  2268. [Values(1u, 0u)] uint Rn,
  2269. [Values(2u, 0u)] uint Rm,
  2270. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2271. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2272. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2273. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  2274. {
  2275. uint Opcode = 0x2E207C00; // UABA V0.8B, V0.8B, V0.8B
  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 = MakeVectorE0(A);
  2281. Vector128<float> V2 = MakeVectorE0(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.V(1, new Bits(A));
  2285. AArch64.V(2, new Bits(B));
  2286. SimdFp.Uaba_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("UABA <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2294. public void Uaba_V_16B_8H_4S([Values(0u)] uint Rd,
  2295. [Values(1u, 0u)] uint Rn,
  2296. [Values(2u, 0u)] uint Rm,
  2297. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2298. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2299. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2300. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
  2301. {
  2302. uint Opcode = 0x6E207C00; // UABA V0.16B, V0.16B, V0.16B
  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.Uaba_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("UABAL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
  2321. public void Uabal_V_8B8H_4H4S_2S2D([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) // <8B8H, 4H4S, 2S2D>
  2328. {
  2329. uint Opcode = 0x2E205000; // UABAL V0.8H, 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.Vpart(1, 0, new Bits(A));
  2339. AArch64.Vpart(2, 0, new Bits(B));
  2340. SimdFp.Uabal_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("UABAL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
  2348. public void Uabal_V_16B8H_8H4S_4S2D([Values(0u)] uint Rd,
  2349. [Values(1u, 0u)] uint Rn,
  2350. [Values(2u, 0u)] uint Rm,
  2351. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2352. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2353. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2354. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H, 8H4S, 4S2D>
  2355. {
  2356. uint Opcode = 0x6E205000; // UABAL2 V0.8H, 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 = MakeVectorE1(A);
  2362. Vector128<float> V2 = MakeVectorE1(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, 1, new Bits(A));
  2366. AArch64.Vpart(2, 1, new Bits(B));
  2367. SimdFp.Uabal_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("UABD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2375. public void Uabd_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 = 0x2E207400; // UABD 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.Uabd_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("UABD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2402. public void Uabd_V_16B_8H_4S([Values(0u)] uint Rd,
  2403. [Values(1u, 0u)] uint Rn,
  2404. [Values(2u, 0u)] uint Rm,
  2405. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2406. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2407. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2408. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B, 8H, 4S>
  2409. {
  2410. uint Opcode = 0x6E207400; // UABD 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.Uabd_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("UABDL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
  2429. public void Uabdl_V_8B8H_4H4S_2S2D([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) // <8B8H, 4H4S, 2S2D>
  2436. {
  2437. uint Opcode = 0x2E207000; // UABDL V0.8H, 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.Vpart(1, 0, new Bits(A));
  2447. AArch64.Vpart(2, 0, new Bits(B));
  2448. SimdFp.Uabdl_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("UABDL{2} <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Tb>")]
  2456. public void Uabdl_V_16B8H_8H4S_4S2D([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) // <16B8H, 8H4S, 4S2D>
  2463. {
  2464. uint Opcode = 0x6E207000; // UABDL2 V0.8H, 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 = MakeVectorE1(A);
  2470. Vector128<float> V2 = MakeVectorE1(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, 1, new Bits(A));
  2474. AArch64.Vpart(2, 1, new Bits(B));
  2475. SimdFp.Uabdl_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("UADDW{2} <Vd>.<Ta>, <Vn>.<Ta>, <Vm>.<Tb>")]
  2483. public void Uaddw_V_8B8H8H_4H4S4S_2S2D2D([Values(0u)] uint Rd,
  2484. [Values(1u, 0u)] uint Rn,
  2485. [Values(2u, 0u)] uint Rm,
  2486. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2487. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  2488. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2489. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H8H, 4H4S4S, 2S2D2D>
  2490. {
  2491. uint Opcode = 0x2E201000; // UADDW V0.8H, V0.8H, 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 = MakeVectorE0E1(A, 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)); AArch64.Vpart(1, 1, new Bits(A));
  2501. AArch64.Vpart(2, 0, new Bits(B));
  2502. SimdFp.Uaddw_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("UADDW{2} <Vd>.<Ta>, <Vn>.<Ta>, <Vm>.<Tb>")]
  2510. public void Uaddw_V_16B8H8H_8H4S4S_4S2D2D([Values(0u)] uint Rd,
  2511. [Values(1u, 0u)] uint Rn,
  2512. [Values(2u, 0u)] uint Rm,
  2513. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2514. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  2515. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2516. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H8H, 8H4S4S, 4S2D2D>
  2517. {
  2518. uint Opcode = 0x6E201000; // UADDW2 V0.8H, V0.8H, 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 = MakeVectorE0E1(A, 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, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2528. AArch64.Vpart(2, 1, new Bits(B));
  2529. SimdFp.Uaddw_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("UQADD <V><d>, <V><n>, <V><m>")]
  2537. public void Uqadd_S_B_H_S_D([Values(0u)] uint Rd,
  2538. [Values(1u, 0u)] uint Rn,
  2539. [Values(2u, 0u)] uint Rm,
  2540. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong Z,
  2541. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong A,
  2542. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong B,
  2543. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <B, H, S, D>
  2544. {
  2545. uint Opcode = 0x7E200C00; // UQADD B0, B0, B0
  2546. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2547. Opcode |= ((size & 3) << 22);
  2548. Bits Op = new Bits(Opcode);
  2549. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  2550. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2551. Vector128<float> V1 = MakeVectorE0(A);
  2552. Vector128<float> V2 = MakeVectorE0(B);
  2553. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  2554. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2555. AArch64.V(1, new Bits(A));
  2556. AArch64.V(2, new Bits(B));
  2557. Shared.FPSR = new Bits((uint)Fpsr);
  2558. SimdFp.Uqadd_S(Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2559. Assert.Multiple(() =>
  2560. {
  2561. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2562. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2563. });
  2564. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  2565. }
  2566. [Test, Pairwise, Description("UQADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2567. public void Uqadd_V_8B_4H_2S([Values(0u)] uint Rd,
  2568. [Values(1u, 0u)] uint Rn,
  2569. [Values(2u, 0u)] uint Rm,
  2570. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2571. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2572. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2573. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  2574. {
  2575. uint Opcode = 0x2E200C00; // UQADD V0.8B, V0.8B, V0.8B
  2576. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2577. Opcode |= ((size & 3) << 22);
  2578. Bits Op = new Bits(Opcode);
  2579. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  2580. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2581. Vector128<float> V1 = MakeVectorE0(A);
  2582. Vector128<float> V2 = MakeVectorE0(B);
  2583. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  2584. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2585. AArch64.V(1, new Bits(A));
  2586. AArch64.V(2, new Bits(B));
  2587. Shared.FPSR = new Bits((uint)Fpsr);
  2588. SimdFp.Uqadd_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2589. Assert.Multiple(() =>
  2590. {
  2591. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2592. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2593. });
  2594. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  2595. }
  2596. [Test, Pairwise, Description("UQADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2597. public void Uqadd_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  2598. [Values(1u, 0u)] uint Rn,
  2599. [Values(2u, 0u)] uint Rm,
  2600. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2601. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  2602. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  2603. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  2604. {
  2605. uint Opcode = 0x6E200C00; // UQADD V0.16B, V0.16B, V0.16B
  2606. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2607. Opcode |= ((size & 3) << 22);
  2608. Bits Op = new Bits(Opcode);
  2609. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  2610. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2611. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2612. Vector128<float> V2 = MakeVectorE0E1(B, B);
  2613. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  2614. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2615. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2616. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  2617. Shared.FPSR = new Bits((uint)Fpsr);
  2618. SimdFp.Uqadd_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2619. Assert.Multiple(() =>
  2620. {
  2621. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2622. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2623. });
  2624. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  2625. }
  2626. [Test, Pairwise, Description("UQSUB <V><d>, <V><n>, <V><m>")]
  2627. public void Uqsub_S_B_H_S_D([Values(0u)] uint Rd,
  2628. [Values(1u, 0u)] uint Rn,
  2629. [Values(2u, 0u)] uint Rm,
  2630. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong Z,
  2631. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong A,
  2632. [ValueSource("_1B1H1S1D_")] [Random(RndCnt)] ulong B,
  2633. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <B, H, S, D>
  2634. {
  2635. uint Opcode = 0x7E202C00; // UQSUB B0, B0, B0
  2636. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2637. Opcode |= ((size & 3) << 22);
  2638. Bits Op = new Bits(Opcode);
  2639. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  2640. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2641. Vector128<float> V1 = MakeVectorE0(A);
  2642. Vector128<float> V2 = MakeVectorE0(B);
  2643. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  2644. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2645. AArch64.V(1, new Bits(A));
  2646. AArch64.V(2, new Bits(B));
  2647. Shared.FPSR = new Bits((uint)Fpsr);
  2648. SimdFp.Uqsub_S(Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2649. Assert.Multiple(() =>
  2650. {
  2651. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2652. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2653. });
  2654. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  2655. }
  2656. [Test, Pairwise, Description("UQSUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2657. public void Uqsub_V_8B_4H_2S([Values(0u)] uint Rd,
  2658. [Values(1u, 0u)] uint Rn,
  2659. [Values(2u, 0u)] uint Rm,
  2660. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2661. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2662. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2663. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  2664. {
  2665. uint Opcode = 0x2E202C00; // UQSUB V0.8B, V0.8B, V0.8B
  2666. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2667. Opcode |= ((size & 3) << 22);
  2668. Bits Op = new Bits(Opcode);
  2669. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  2670. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2671. Vector128<float> V1 = MakeVectorE0(A);
  2672. Vector128<float> V2 = MakeVectorE0(B);
  2673. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  2674. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2675. AArch64.V(1, new Bits(A));
  2676. AArch64.V(2, new Bits(B));
  2677. Shared.FPSR = new Bits((uint)Fpsr);
  2678. SimdFp.Uqsub_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2679. Assert.Multiple(() =>
  2680. {
  2681. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2682. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2683. });
  2684. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  2685. }
  2686. [Test, Pairwise, Description("UQSUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2687. public void Uqsub_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  2688. [Values(1u, 0u)] uint Rn,
  2689. [Values(2u, 0u)] uint Rm,
  2690. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2691. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  2692. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  2693. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  2694. {
  2695. uint Opcode = 0x6E202C00; // UQSUB V0.16B, V0.16B, V0.16B
  2696. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2697. Opcode |= ((size & 3) << 22);
  2698. Bits Op = new Bits(Opcode);
  2699. int Fpsr = (int)TestContext.CurrentContext.Random.NextUInt();
  2700. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2701. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2702. Vector128<float> V2 = MakeVectorE0E1(B, B);
  2703. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2, Fpsr: Fpsr);
  2704. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2705. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2706. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  2707. Shared.FPSR = new Bits((uint)Fpsr);
  2708. SimdFp.Uqsub_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2709. Assert.Multiple(() =>
  2710. {
  2711. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2712. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2713. });
  2714. Assert.That(ThreadState.Fpsr, Is.EqualTo((int)Shared.FPSR.ToUInt32()));
  2715. }
  2716. [Test, Pairwise, Description("USUBW{2} <Vd>.<Ta>, <Vn>.<Ta>, <Vm>.<Tb>")]
  2717. public void Usubw_V_8B8H8H_4H4S4S_2S2D2D([Values(0u)] uint Rd,
  2718. [Values(1u, 0u)] uint Rn,
  2719. [Values(2u, 0u)] uint Rm,
  2720. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2721. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  2722. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2723. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B8H8H, 4H4S4S, 2S2D2D>
  2724. {
  2725. uint Opcode = 0x2E203000; // USUBW V0.8H, V0.8H, V0.8B
  2726. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2727. Opcode |= ((size & 3) << 22);
  2728. Bits Op = new Bits(Opcode);
  2729. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2730. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2731. Vector128<float> V2 = MakeVectorE0(B);
  2732. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2733. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2734. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2735. AArch64.Vpart(2, 0, new Bits(B));
  2736. SimdFp.Usubw_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2737. Assert.Multiple(() =>
  2738. {
  2739. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2740. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2741. });
  2742. }
  2743. [Test, Pairwise, Description("USUBW{2} <Vd>.<Ta>, <Vn>.<Ta>, <Vm>.<Tb>")]
  2744. public void Usubw_V_16B8H8H_8H4S4S_4S2D2D([Values(0u)] uint Rd,
  2745. [Values(1u, 0u)] uint Rn,
  2746. [Values(2u, 0u)] uint Rm,
  2747. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2748. [ValueSource("_4H2S1D_")] [Random(RndCnt)] ulong A,
  2749. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2750. [Values(0b00u, 0b01u, 0b10u)] uint size) // <16B8H8H, 8H4S4S, 4S2D2D>
  2751. {
  2752. uint Opcode = 0x6E203000; // USUBW2 V0.8H, V0.8H, V0.16B
  2753. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2754. Opcode |= ((size & 3) << 22);
  2755. Bits Op = new Bits(Opcode);
  2756. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2757. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2758. Vector128<float> V2 = MakeVectorE1(B);
  2759. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2760. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2761. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2762. AArch64.Vpart(2, 1, new Bits(B));
  2763. SimdFp.Usubw_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2764. Assert.Multiple(() =>
  2765. {
  2766. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2767. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2768. });
  2769. }
  2770. [Test, Pairwise, Description("UZP1 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2771. public void Uzp1_V_8B_4H_2S([Values(0u)] uint Rd,
  2772. [Values(1u, 0u)] uint Rn,
  2773. [Values(2u, 0u)] uint Rm,
  2774. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2775. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2776. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2777. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  2778. {
  2779. uint Opcode = 0x0E001800; // UZP1 V0.8B, V0.8B, V0.8B
  2780. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2781. Opcode |= ((size & 3) << 22);
  2782. Bits Op = new Bits(Opcode);
  2783. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2784. Vector128<float> V1 = MakeVectorE0(A);
  2785. Vector128<float> V2 = MakeVectorE0(B);
  2786. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2787. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2788. AArch64.V(1, new Bits(A));
  2789. AArch64.V(2, new Bits(B));
  2790. SimdFp.Uzp1_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2791. Assert.Multiple(() =>
  2792. {
  2793. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2794. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2795. });
  2796. }
  2797. [Test, Pairwise, Description("UZP1 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2798. public void Uzp1_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  2799. [Values(1u, 0u)] uint Rn,
  2800. [Values(2u, 0u)] uint Rm,
  2801. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2802. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  2803. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  2804. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  2805. {
  2806. uint Opcode = 0x4E001800; // UZP1 V0.16B, V0.16B, V0.16B
  2807. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2808. Opcode |= ((size & 3) << 22);
  2809. Bits Op = new Bits(Opcode);
  2810. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2811. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2812. Vector128<float> V2 = MakeVectorE0E1(B, B);
  2813. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2814. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2815. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2816. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  2817. SimdFp.Uzp1_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2818. Assert.Multiple(() =>
  2819. {
  2820. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2821. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2822. });
  2823. }
  2824. [Test, Pairwise, Description("UZP2 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2825. public void Uzp2_V_8B_4H_2S([Values(0u)] uint Rd,
  2826. [Values(1u, 0u)] uint Rn,
  2827. [Values(2u, 0u)] uint Rm,
  2828. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2829. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2830. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2831. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  2832. {
  2833. uint Opcode = 0x0E005800; // UZP2 V0.8B, V0.8B, V0.8B
  2834. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2835. Opcode |= ((size & 3) << 22);
  2836. Bits Op = new Bits(Opcode);
  2837. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2838. Vector128<float> V1 = MakeVectorE0(A);
  2839. Vector128<float> V2 = MakeVectorE0(B);
  2840. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2841. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2842. AArch64.V(1, new Bits(A));
  2843. AArch64.V(2, new Bits(B));
  2844. SimdFp.Uzp2_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2845. Assert.Multiple(() =>
  2846. {
  2847. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2848. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2849. });
  2850. }
  2851. [Test, Pairwise, Description("UZP2 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2852. public void Uzp2_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  2853. [Values(1u, 0u)] uint Rn,
  2854. [Values(2u, 0u)] uint Rm,
  2855. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2856. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  2857. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  2858. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  2859. {
  2860. uint Opcode = 0x4E005800; // UZP2 V0.16B, V0.16B, V0.16B
  2861. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2862. Opcode |= ((size & 3) << 22);
  2863. Bits Op = new Bits(Opcode);
  2864. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2865. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2866. Vector128<float> V2 = MakeVectorE0E1(B, B);
  2867. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2868. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2869. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2870. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  2871. SimdFp.Uzp2_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2872. Assert.Multiple(() =>
  2873. {
  2874. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2875. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2876. });
  2877. }
  2878. [Test, Pairwise, Description("ZIP1 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2879. public void Zip1_V_8B_4H_2S([Values(0u)] uint Rd,
  2880. [Values(1u, 0u)] uint Rn,
  2881. [Values(2u, 0u)] uint Rm,
  2882. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2883. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2884. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2885. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  2886. {
  2887. uint Opcode = 0x0E003800; // ZIP1 V0.8B, V0.8B, V0.8B
  2888. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2889. Opcode |= ((size & 3) << 22);
  2890. Bits Op = new Bits(Opcode);
  2891. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2892. Vector128<float> V1 = MakeVectorE0(A);
  2893. Vector128<float> V2 = MakeVectorE0(B);
  2894. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2895. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2896. AArch64.V(1, new Bits(A));
  2897. AArch64.V(2, new Bits(B));
  2898. SimdFp.Zip1_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2899. Assert.Multiple(() =>
  2900. {
  2901. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2902. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2903. });
  2904. }
  2905. [Test, Pairwise, Description("ZIP1 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2906. public void Zip1_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  2907. [Values(1u, 0u)] uint Rn,
  2908. [Values(2u, 0u)] uint Rm,
  2909. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2910. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  2911. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  2912. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  2913. {
  2914. uint Opcode = 0x4E003800; // ZIP1 V0.16B, V0.16B, V0.16B
  2915. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2916. Opcode |= ((size & 3) << 22);
  2917. Bits Op = new Bits(Opcode);
  2918. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2919. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2920. Vector128<float> V2 = MakeVectorE0E1(B, B);
  2921. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2922. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2923. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2924. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  2925. SimdFp.Zip1_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2926. Assert.Multiple(() =>
  2927. {
  2928. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2929. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2930. });
  2931. }
  2932. [Test, Pairwise, Description("ZIP2 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2933. public void Zip2_V_8B_4H_2S([Values(0u)] uint Rd,
  2934. [Values(1u, 0u)] uint Rn,
  2935. [Values(2u, 0u)] uint Rm,
  2936. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong Z,
  2937. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong A,
  2938. [ValueSource("_8B4H2S_")] [Random(RndCnt)] ulong B,
  2939. [Values(0b00u, 0b01u, 0b10u)] uint size) // <8B, 4H, 2S>
  2940. {
  2941. uint Opcode = 0x0E007800; // ZIP2 V0.8B, V0.8B, V0.8B
  2942. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2943. Opcode |= ((size & 3) << 22);
  2944. Bits Op = new Bits(Opcode);
  2945. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2946. Vector128<float> V1 = MakeVectorE0(A);
  2947. Vector128<float> V2 = MakeVectorE0(B);
  2948. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2949. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2950. AArch64.V(1, new Bits(A));
  2951. AArch64.V(2, new Bits(B));
  2952. SimdFp.Zip2_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2953. Assert.Multiple(() =>
  2954. {
  2955. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2956. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2957. });
  2958. }
  2959. [Test, Pairwise, Description("ZIP2 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>")]
  2960. public void Zip2_V_16B_8H_4S_2D([Values(0u)] uint Rd,
  2961. [Values(1u, 0u)] uint Rn,
  2962. [Values(2u, 0u)] uint Rm,
  2963. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong Z,
  2964. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong A,
  2965. [ValueSource("_8B4H2S1D_")] [Random(RndCnt)] ulong B,
  2966. [Values(0b00u, 0b01u, 0b10u, 0b11u)] uint size) // <16B, 8H, 4S, 2D>
  2967. {
  2968. uint Opcode = 0x4E007800; // ZIP2 V0.16B, V0.16B, V0.16B
  2969. Opcode |= ((Rm & 31) << 16) | ((Rn & 31) << 5) | ((Rd & 31) << 0);
  2970. Opcode |= ((size & 3) << 22);
  2971. Bits Op = new Bits(Opcode);
  2972. Vector128<float> V0 = MakeVectorE0E1(Z, Z);
  2973. Vector128<float> V1 = MakeVectorE0E1(A, A);
  2974. Vector128<float> V2 = MakeVectorE0E1(B, B);
  2975. AThreadState ThreadState = SingleOpcode(Opcode, V0: V0, V1: V1, V2: V2);
  2976. AArch64.Vpart(0, 0, new Bits(Z)); AArch64.Vpart(0, 1, new Bits(Z));
  2977. AArch64.Vpart(1, 0, new Bits(A)); AArch64.Vpart(1, 1, new Bits(A));
  2978. AArch64.Vpart(2, 0, new Bits(B)); AArch64.Vpart(2, 1, new Bits(B));
  2979. SimdFp.Zip2_V(Op[30], Op[23, 22], Op[20, 16], Op[9, 5], Op[4, 0]);
  2980. Assert.Multiple(() =>
  2981. {
  2982. Assert.That(GetVectorE0(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 0).ToUInt64()));
  2983. Assert.That(GetVectorE1(ThreadState.V0), Is.EqualTo(AArch64.Vpart(64, 0, 1).ToUInt64()));
  2984. });
  2985. }
  2986. #endif
  2987. }
  2988. }