CpuTestSimdReg.cs 175 KB

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