CpuTestSimdReg.cs 178 KB

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