instructions.go 3.3 MB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137201382013920140201412014220143201442014520146201472014820149201502015120152201532015420155201562015720158201592016020161201622016320164201652016620167201682016920170201712017220173201742017520176201772017820179201802018120182201832018420185201862018720188201892019020191201922019320194201952019620197201982019920200202012020220203202042020520206202072020820209202102021120212202132021420215202162021720218202192022020221202222022320224202252022620227202282022920230202312023220233202342023520236202372023820239202402024120242202432024420245202462024720248202492025020251202522025320254202552025620257202582025920260202612026220263202642026520266202672026820269202702027120272202732027420275202762027720278202792028020281202822028320284202852028620287202882028920290202912029220293202942029520296202972029820299203002030120302203032030420305203062030720308203092031020311203122031320314203152031620317203182031920320203212032220323203242032520326203272032820329203302033120332203332033420335203362033720338203392034020341203422034320344203452034620347203482034920350203512035220353203542035520356203572035820359203602036120362203632036420365203662036720368203692037020371203722037320374203752037620377203782037920380203812038220383203842038520386203872038820389203902039120392203932039420395203962039720398203992040020401204022040320404204052040620407204082040920410204112041220413204142041520416204172041820419204202042120422204232042420425204262042720428204292043020431204322043320434204352043620437204382043920440204412044220443204442044520446204472044820449204502045120452204532045420455204562045720458204592046020461204622046320464204652046620467204682046920470204712047220473204742047520476204772047820479204802048120482204832048420485204862048720488204892049020491204922049320494204952049620497204982049920500205012050220503205042050520506205072050820509205102051120512205132051420515205162051720518205192052020521205222052320524205252052620527205282052920530205312053220533205342053520536205372053820539205402054120542205432054420545205462054720548205492055020551205522055320554205552055620557205582055920560205612056220563205642056520566205672056820569205702057120572205732057420575205762057720578205792058020581205822058320584205852058620587205882058920590205912059220593205942059520596205972059820599206002060120602206032060420605206062060720608206092061020611206122061320614206152061620617206182061920620206212062220623206242062520626206272062820629206302063120632206332063420635206362063720638206392064020641206422064320644206452064620647206482064920650206512065220653206542065520656206572065820659206602066120662206632066420665206662066720668206692067020671206722067320674206752067620677206782067920680206812068220683206842068520686206872068820689206902069120692206932069420695206962069720698206992070020701207022070320704207052070620707207082070920710207112071220713207142071520716207172071820719207202072120722207232072420725207262072720728207292073020731207322073320734207352073620737207382073920740207412074220743207442074520746207472074820749207502075120752207532075420755207562075720758207592076020761207622076320764207652076620767207682076920770207712077220773207742077520776207772077820779207802078120782207832078420785207862078720788207892079020791207922079320794207952079620797207982079920800208012080220803208042080520806208072080820809208102081120812208132081420815208162081720818208192082020821208222082320824208252082620827208282082920830208312083220833208342083520836208372083820839208402084120842208432084420845208462084720848208492085020851208522085320854208552085620857208582085920860208612086220863208642086520866208672086820869208702087120872208732087420875208762087720878208792088020881208822088320884208852088620887208882088920890208912089220893208942089520896208972089820899209002090120902209032090420905209062090720908209092091020911209122091320914209152091620917209182091920920209212092220923209242092520926209272092820929209302093120932209332093420935209362093720938209392094020941209422094320944209452094620947209482094920950209512095220953209542095520956209572095820959209602096120962209632096420965209662096720968209692097020971209722097320974209752097620977209782097920980209812098220983209842098520986209872098820989209902099120992209932099420995209962099720998209992100021001210022100321004210052100621007210082100921010210112101221013210142101521016210172101821019210202102121022210232102421025210262102721028210292103021031210322103321034210352103621037210382103921040210412104221043210442104521046210472104821049210502105121052210532105421055210562105721058210592106021061210622106321064210652106621067210682106921070210712107221073210742107521076210772107821079210802108121082210832108421085210862108721088210892109021091210922109321094210952109621097210982109921100211012110221103211042110521106211072110821109211102111121112211132111421115211162111721118211192112021121211222112321124211252112621127211282112921130211312113221133211342113521136211372113821139211402114121142211432114421145211462114721148211492115021151211522115321154211552115621157211582115921160211612116221163211642116521166211672116821169211702117121172211732117421175211762117721178211792118021181211822118321184211852118621187211882118921190211912119221193211942119521196211972119821199212002120121202212032120421205212062120721208212092121021211212122121321214212152121621217212182121921220212212122221223212242122521226212272122821229212302123121232212332123421235212362123721238212392124021241212422124321244212452124621247212482124921250212512125221253212542125521256212572125821259212602126121262212632126421265212662126721268212692127021271212722127321274212752127621277212782127921280212812128221283212842128521286212872128821289212902129121292212932129421295212962129721298212992130021301213022130321304213052130621307213082130921310213112131221313213142131521316213172131821319213202132121322213232132421325213262132721328213292133021331213322133321334213352133621337213382133921340213412134221343213442134521346213472134821349213502135121352213532135421355213562135721358213592136021361213622136321364213652136621367213682136921370213712137221373213742137521376213772137821379213802138121382213832138421385213862138721388213892139021391213922139321394213952139621397213982139921400214012140221403214042140521406214072140821409214102141121412214132141421415214162141721418214192142021421214222142321424214252142621427214282142921430214312143221433214342143521436214372143821439214402144121442214432144421445214462144721448214492145021451214522145321454214552145621457214582145921460214612146221463214642146521466214672146821469214702147121472214732147421475214762147721478214792148021481214822148321484214852148621487214882148921490214912149221493214942149521496214972149821499215002150121502215032150421505215062150721508215092151021511215122151321514215152151621517215182151921520215212152221523215242152521526215272152821529215302153121532215332153421535215362153721538215392154021541215422154321544215452154621547215482154921550215512155221553215542155521556215572155821559215602156121562215632156421565215662156721568215692157021571215722157321574215752157621577215782157921580215812158221583215842158521586215872158821589215902159121592215932159421595215962159721598215992160021601216022160321604216052160621607216082160921610216112161221613216142161521616216172161821619216202162121622216232162421625216262162721628216292163021631216322163321634216352163621637216382163921640216412164221643216442164521646216472164821649216502165121652216532165421655216562165721658216592166021661216622166321664216652166621667216682166921670216712167221673216742167521676216772167821679216802168121682216832168421685216862168721688216892169021691216922169321694216952169621697216982169921700217012170221703217042170521706217072170821709217102171121712217132171421715217162171721718217192172021721217222172321724217252172621727217282172921730217312173221733217342173521736217372173821739217402174121742217432174421745217462174721748217492175021751217522175321754217552175621757217582175921760217612176221763217642176521766217672176821769217702177121772217732177421775217762177721778217792178021781217822178321784217852178621787217882178921790217912179221793217942179521796217972179821799218002180121802218032180421805218062180721808218092181021811218122181321814218152181621817218182181921820218212182221823218242182521826218272182821829218302183121832218332183421835218362183721838218392184021841218422184321844218452184621847218482184921850218512185221853218542185521856218572185821859218602186121862218632186421865218662186721868218692187021871218722187321874218752187621877218782187921880218812188221883218842188521886218872188821889218902189121892218932189421895218962189721898218992190021901219022190321904219052190621907219082190921910219112191221913219142191521916219172191821919219202192121922219232192421925219262192721928219292193021931219322193321934219352193621937219382193921940219412194221943219442194521946219472194821949219502195121952219532195421955219562195721958219592196021961219622196321964219652196621967219682196921970219712197221973219742197521976219772197821979219802198121982219832198421985219862198721988219892199021991219922199321994219952199621997219982199922000220012200222003220042200522006220072200822009220102201122012220132201422015220162201722018220192202022021220222202322024220252202622027220282202922030220312203222033220342203522036220372203822039220402204122042220432204422045220462204722048220492205022051220522205322054220552205622057220582205922060220612206222063220642206522066220672206822069220702207122072220732207422075220762207722078220792208022081220822208322084220852208622087220882208922090220912209222093220942209522096220972209822099221002210122102221032210422105221062210722108221092211022111221122211322114221152211622117221182211922120221212212222123221242212522126221272212822129221302213122132221332213422135221362213722138221392214022141221422214322144221452214622147221482214922150221512215222153221542215522156221572215822159221602216122162221632216422165221662216722168221692217022171221722217322174221752217622177221782217922180221812218222183221842218522186221872218822189221902219122192221932219422195221962219722198221992220022201222022220322204222052220622207222082220922210222112221222213222142221522216222172221822219222202222122222222232222422225222262222722228222292223022231222322223322234222352223622237222382223922240222412224222243222442224522246222472224822249222502225122252222532225422255222562225722258222592226022261222622226322264222652226622267222682226922270222712227222273222742227522276222772227822279222802228122282222832228422285222862228722288222892229022291222922229322294222952229622297222982229922300223012230222303223042230522306223072230822309223102231122312223132231422315223162231722318223192232022321223222232322324223252232622327223282232922330223312233222333223342233522336223372233822339223402234122342223432234422345223462234722348223492235022351223522235322354223552235622357223582235922360223612236222363223642236522366223672236822369223702237122372223732237422375223762237722378223792238022381223822238322384223852238622387223882238922390223912239222393223942239522396223972239822399224002240122402224032240422405224062240722408224092241022411224122241322414224152241622417224182241922420224212242222423224242242522426224272242822429224302243122432224332243422435224362243722438224392244022441224422244322444224452244622447224482244922450224512245222453224542245522456224572245822459224602246122462224632246422465224662246722468224692247022471224722247322474224752247622477224782247922480224812248222483224842248522486224872248822489224902249122492224932249422495224962249722498224992250022501225022250322504225052250622507225082250922510225112251222513225142251522516225172251822519225202252122522225232252422525225262252722528225292253022531225322253322534225352253622537225382253922540225412254222543225442254522546225472254822549225502255122552225532255422555225562255722558225592256022561225622256322564225652256622567225682256922570225712257222573225742257522576225772257822579225802258122582225832258422585225862258722588225892259022591225922259322594225952259622597225982259922600226012260222603226042260522606226072260822609226102261122612226132261422615226162261722618226192262022621226222262322624226252262622627226282262922630226312263222633226342263522636226372263822639226402264122642226432264422645226462264722648226492265022651226522265322654226552265622657226582265922660226612266222663226642266522666226672266822669226702267122672226732267422675226762267722678226792268022681226822268322684226852268622687226882268922690226912269222693226942269522696226972269822699227002270122702227032270422705227062270722708227092271022711227122271322714227152271622717227182271922720227212272222723227242272522726227272272822729227302273122732227332273422735227362273722738227392274022741227422274322744227452274622747227482274922750227512275222753227542275522756227572275822759227602276122762227632276422765227662276722768227692277022771227722277322774227752277622777227782277922780227812278222783227842278522786227872278822789227902279122792227932279422795227962279722798227992280022801228022280322804228052280622807228082280922810228112281222813228142281522816228172281822819228202282122822228232282422825228262282722828228292283022831228322283322834228352283622837228382283922840228412284222843228442284522846228472284822849228502285122852228532285422855228562285722858228592286022861228622286322864228652286622867228682286922870228712287222873228742287522876228772287822879228802288122882228832288422885228862288722888228892289022891228922289322894228952289622897228982289922900229012290222903229042290522906229072290822909229102291122912229132291422915229162291722918229192292022921229222292322924229252292622927229282292922930229312293222933229342293522936229372293822939229402294122942229432294422945229462294722948229492295022951229522295322954229552295622957229582295922960229612296222963229642296522966229672296822969229702297122972229732297422975229762297722978229792298022981229822298322984229852298622987229882298922990229912299222993229942299522996229972299822999230002300123002230032300423005230062300723008230092301023011230122301323014230152301623017230182301923020230212302223023230242302523026230272302823029230302303123032230332303423035230362303723038230392304023041230422304323044230452304623047230482304923050230512305223053230542305523056230572305823059230602306123062230632306423065230662306723068230692307023071230722307323074230752307623077230782307923080230812308223083230842308523086230872308823089230902309123092230932309423095230962309723098230992310023101231022310323104231052310623107231082310923110231112311223113231142311523116231172311823119231202312123122231232312423125231262312723128231292313023131231322313323134231352313623137231382313923140231412314223143231442314523146231472314823149231502315123152231532315423155231562315723158231592316023161231622316323164231652316623167231682316923170231712317223173231742317523176231772317823179231802318123182231832318423185231862318723188231892319023191231922319323194231952319623197231982319923200232012320223203232042320523206232072320823209232102321123212232132321423215232162321723218232192322023221232222322323224232252322623227232282322923230232312323223233232342323523236232372323823239232402324123242232432324423245232462324723248232492325023251232522325323254232552325623257232582325923260232612326223263232642326523266232672326823269232702327123272232732327423275232762327723278232792328023281232822328323284232852328623287232882328923290232912329223293232942329523296232972329823299233002330123302233032330423305233062330723308233092331023311233122331323314233152331623317233182331923320233212332223323233242332523326233272332823329233302333123332233332333423335233362333723338233392334023341233422334323344233452334623347233482334923350233512335223353233542335523356233572335823359233602336123362233632336423365233662336723368233692337023371233722337323374233752337623377233782337923380233812338223383233842338523386233872338823389233902339123392233932339423395233962339723398233992340023401234022340323404234052340623407234082340923410234112341223413234142341523416234172341823419234202342123422234232342423425234262342723428234292343023431234322343323434234352343623437234382343923440234412344223443234442344523446234472344823449234502345123452234532345423455234562345723458234592346023461234622346323464234652346623467234682346923470234712347223473234742347523476234772347823479234802348123482234832348423485234862348723488234892349023491234922349323494234952349623497234982349923500235012350223503235042350523506235072350823509235102351123512235132351423515235162351723518235192352023521235222352323524235252352623527235282352923530235312353223533235342353523536235372353823539235402354123542235432354423545235462354723548235492355023551235522355323554235552355623557235582355923560235612356223563235642356523566235672356823569235702357123572235732357423575235762357723578235792358023581235822358323584235852358623587235882358923590235912359223593235942359523596235972359823599236002360123602236032360423605236062360723608236092361023611236122361323614236152361623617236182361923620236212362223623236242362523626236272362823629236302363123632236332363423635236362363723638236392364023641236422364323644236452364623647236482364923650236512365223653236542365523656236572365823659236602366123662236632366423665236662366723668236692367023671236722367323674236752367623677236782367923680236812368223683236842368523686236872368823689236902369123692236932369423695236962369723698236992370023701237022370323704237052370623707237082370923710237112371223713237142371523716237172371823719237202372123722237232372423725237262372723728237292373023731237322373323734237352373623737237382373923740237412374223743237442374523746237472374823749237502375123752237532375423755237562375723758237592376023761237622376323764237652376623767237682376923770237712377223773237742377523776237772377823779237802378123782237832378423785237862378723788237892379023791237922379323794237952379623797237982379923800238012380223803238042380523806238072380823809238102381123812238132381423815238162381723818238192382023821238222382323824238252382623827238282382923830238312383223833238342383523836238372383823839238402384123842238432384423845238462384723848238492385023851238522385323854238552385623857238582385923860238612386223863238642386523866238672386823869238702387123872238732387423875238762387723878238792388023881238822388323884238852388623887238882388923890238912389223893238942389523896238972389823899239002390123902239032390423905239062390723908239092391023911239122391323914239152391623917239182391923920239212392223923239242392523926239272392823929239302393123932239332393423935239362393723938239392394023941239422394323944239452394623947239482394923950239512395223953239542395523956239572395823959239602396123962239632396423965239662396723968239692397023971239722397323974239752397623977239782397923980239812398223983239842398523986239872398823989239902399123992239932399423995239962399723998239992400024001240022400324004240052400624007240082400924010240112401224013240142401524016240172401824019240202402124022240232402424025240262402724028240292403024031240322403324034240352403624037240382403924040240412404224043240442404524046240472404824049240502405124052240532405424055240562405724058240592406024061240622406324064240652406624067240682406924070240712407224073240742407524076240772407824079240802408124082240832408424085240862408724088240892409024091240922409324094240952409624097240982409924100241012410224103241042410524106241072410824109241102411124112241132411424115241162411724118241192412024121241222412324124241252412624127241282412924130241312413224133241342413524136241372413824139241402414124142241432414424145241462414724148241492415024151241522415324154241552415624157241582415924160241612416224163241642416524166241672416824169241702417124172241732417424175241762417724178241792418024181241822418324184241852418624187241882418924190241912419224193241942419524196241972419824199242002420124202242032420424205242062420724208242092421024211242122421324214242152421624217242182421924220242212422224223242242422524226242272422824229242302423124232242332423424235242362423724238242392424024241242422424324244242452424624247242482424924250242512425224253242542425524256242572425824259242602426124262242632426424265242662426724268242692427024271242722427324274242752427624277242782427924280242812428224283242842428524286242872428824289242902429124292242932429424295242962429724298242992430024301243022430324304243052430624307243082430924310243112431224313243142431524316243172431824319243202432124322243232432424325243262432724328243292433024331243322433324334243352433624337243382433924340243412434224343243442434524346243472434824349243502435124352243532435424355243562435724358243592436024361243622436324364243652436624367243682436924370243712437224373243742437524376243772437824379243802438124382243832438424385243862438724388243892439024391243922439324394243952439624397243982439924400244012440224403244042440524406244072440824409244102441124412244132441424415244162441724418244192442024421244222442324424244252442624427244282442924430244312443224433244342443524436244372443824439244402444124442244432444424445244462444724448244492445024451244522445324454244552445624457244582445924460244612446224463244642446524466244672446824469244702447124472244732447424475244762447724478244792448024481244822448324484244852448624487244882448924490244912449224493244942449524496244972449824499245002450124502245032450424505245062450724508245092451024511245122451324514245152451624517245182451924520245212452224523245242452524526245272452824529245302453124532245332453424535245362453724538245392454024541245422454324544245452454624547245482454924550245512455224553245542455524556245572455824559245602456124562245632456424565245662456724568245692457024571245722457324574245752457624577245782457924580245812458224583245842458524586245872458824589245902459124592245932459424595245962459724598245992460024601246022460324604246052460624607246082460924610246112461224613246142461524616246172461824619246202462124622246232462424625246262462724628246292463024631246322463324634246352463624637246382463924640246412464224643246442464524646246472464824649246502465124652246532465424655246562465724658246592466024661246622466324664246652466624667246682466924670246712467224673246742467524676246772467824679246802468124682246832468424685246862468724688246892469024691246922469324694246952469624697246982469924700247012470224703247042470524706247072470824709247102471124712247132471424715247162471724718247192472024721247222472324724247252472624727247282472924730247312473224733247342473524736247372473824739247402474124742247432474424745247462474724748247492475024751247522475324754247552475624757247582475924760247612476224763247642476524766247672476824769247702477124772247732477424775247762477724778247792478024781247822478324784247852478624787247882478924790247912479224793247942479524796247972479824799248002480124802248032480424805248062480724808248092481024811248122481324814248152481624817248182481924820248212482224823248242482524826248272482824829248302483124832248332483424835248362483724838248392484024841248422484324844248452484624847248482484924850248512485224853248542485524856248572485824859248602486124862248632486424865248662486724868248692487024871248722487324874248752487624877248782487924880248812488224883248842488524886248872488824889248902489124892248932489424895248962489724898248992490024901249022490324904249052490624907249082490924910249112491224913249142491524916249172491824919249202492124922249232492424925249262492724928249292493024931249322493324934249352493624937249382493924940249412494224943249442494524946249472494824949249502495124952249532495424955249562495724958249592496024961249622496324964249652496624967249682496924970249712497224973249742497524976249772497824979249802498124982249832498424985249862498724988249892499024991249922499324994249952499624997249982499925000250012500225003250042500525006250072500825009250102501125012250132501425015250162501725018250192502025021250222502325024250252502625027250282502925030250312503225033250342503525036250372503825039250402504125042250432504425045250462504725048250492505025051250522505325054250552505625057250582505925060250612506225063250642506525066250672506825069250702507125072250732507425075250762507725078250792508025081250822508325084250852508625087250882508925090250912509225093250942509525096250972509825099251002510125102251032510425105251062510725108251092511025111251122511325114251152511625117251182511925120251212512225123251242512525126251272512825129251302513125132251332513425135251362513725138251392514025141251422514325144251452514625147251482514925150251512515225153251542515525156251572515825159251602516125162251632516425165251662516725168251692517025171251722517325174251752517625177251782517925180251812518225183251842518525186251872518825189251902519125192251932519425195251962519725198251992520025201252022520325204252052520625207252082520925210252112521225213252142521525216252172521825219252202522125222252232522425225252262522725228252292523025231252322523325234252352523625237252382523925240252412524225243252442524525246252472524825249252502525125252252532525425255252562525725258252592526025261252622526325264252652526625267252682526925270252712527225273252742527525276252772527825279252802528125282252832528425285252862528725288252892529025291252922529325294252952529625297252982529925300253012530225303253042530525306253072530825309253102531125312253132531425315253162531725318253192532025321253222532325324253252532625327253282532925330253312533225333253342533525336253372533825339253402534125342253432534425345253462534725348253492535025351253522535325354253552535625357253582535925360253612536225363253642536525366253672536825369253702537125372253732537425375253762537725378253792538025381253822538325384253852538625387253882538925390253912539225393253942539525396253972539825399254002540125402254032540425405254062540725408254092541025411254122541325414254152541625417254182541925420254212542225423254242542525426254272542825429254302543125432254332543425435254362543725438254392544025441254422544325444254452544625447254482544925450254512545225453254542545525456254572545825459254602546125462254632546425465254662546725468254692547025471254722547325474254752547625477254782547925480254812548225483254842548525486254872548825489254902549125492254932549425495254962549725498254992550025501255022550325504255052550625507255082550925510255112551225513255142551525516255172551825519255202552125522255232552425525255262552725528255292553025531255322553325534255352553625537255382553925540255412554225543255442554525546255472554825549255502555125552255532555425555255562555725558255592556025561255622556325564255652556625567255682556925570255712557225573255742557525576255772557825579255802558125582255832558425585255862558725588255892559025591255922559325594255952559625597255982559925600256012560225603256042560525606256072560825609256102561125612256132561425615256162561725618256192562025621256222562325624256252562625627256282562925630256312563225633256342563525636256372563825639256402564125642256432564425645256462564725648256492565025651256522565325654256552565625657256582565925660256612566225663256642566525666256672566825669256702567125672256732567425675256762567725678256792568025681256822568325684256852568625687256882568925690256912569225693256942569525696256972569825699257002570125702257032570425705257062570725708257092571025711257122571325714257152571625717257182571925720257212572225723257242572525726257272572825729257302573125732257332573425735257362573725738257392574025741257422574325744257452574625747257482574925750257512575225753257542575525756257572575825759257602576125762257632576425765257662576725768257692577025771257722577325774257752577625777257782577925780257812578225783257842578525786257872578825789257902579125792257932579425795257962579725798257992580025801258022580325804258052580625807258082580925810258112581225813258142581525816258172581825819258202582125822258232582425825258262582725828258292583025831258322583325834258352583625837258382583925840258412584225843258442584525846258472584825849258502585125852258532585425855258562585725858258592586025861258622586325864258652586625867258682586925870258712587225873258742587525876258772587825879258802588125882258832588425885258862588725888258892589025891258922589325894258952589625897258982589925900259012590225903259042590525906259072590825909259102591125912259132591425915259162591725918259192592025921259222592325924259252592625927259282592925930259312593225933259342593525936259372593825939259402594125942259432594425945259462594725948259492595025951259522595325954259552595625957259582595925960259612596225963259642596525966259672596825969259702597125972259732597425975259762597725978259792598025981259822598325984259852598625987259882598925990259912599225993259942599525996259972599825999260002600126002260032600426005260062600726008260092601026011260122601326014260152601626017260182601926020260212602226023260242602526026260272602826029260302603126032260332603426035260362603726038260392604026041260422604326044260452604626047260482604926050260512605226053260542605526056260572605826059260602606126062260632606426065260662606726068260692607026071260722607326074260752607626077260782607926080260812608226083260842608526086260872608826089260902609126092260932609426095260962609726098260992610026101261022610326104261052610626107261082610926110261112611226113261142611526116261172611826119261202612126122261232612426125261262612726128261292613026131261322613326134261352613626137261382613926140261412614226143261442614526146261472614826149261502615126152261532615426155261562615726158261592616026161261622616326164261652616626167261682616926170261712617226173261742617526176261772617826179261802618126182261832618426185261862618726188261892619026191261922619326194261952619626197261982619926200262012620226203262042620526206262072620826209262102621126212262132621426215262162621726218262192622026221262222622326224262252622626227262282622926230262312623226233262342623526236262372623826239262402624126242262432624426245262462624726248262492625026251262522625326254262552625626257262582625926260262612626226263262642626526266262672626826269262702627126272262732627426275262762627726278262792628026281262822628326284262852628626287262882628926290262912629226293262942629526296262972629826299263002630126302263032630426305263062630726308263092631026311263122631326314263152631626317263182631926320263212632226323263242632526326263272632826329263302633126332263332633426335263362633726338263392634026341263422634326344263452634626347263482634926350263512635226353263542635526356263572635826359263602636126362263632636426365263662636726368263692637026371263722637326374263752637626377263782637926380263812638226383263842638526386263872638826389263902639126392263932639426395263962639726398263992640026401264022640326404264052640626407264082640926410264112641226413264142641526416264172641826419264202642126422264232642426425264262642726428264292643026431264322643326434264352643626437264382643926440264412644226443264442644526446264472644826449264502645126452264532645426455264562645726458264592646026461264622646326464264652646626467264682646926470264712647226473264742647526476264772647826479264802648126482264832648426485264862648726488264892649026491264922649326494264952649626497264982649926500265012650226503265042650526506265072650826509265102651126512265132651426515265162651726518265192652026521265222652326524265252652626527265282652926530265312653226533265342653526536265372653826539265402654126542265432654426545265462654726548265492655026551265522655326554265552655626557265582655926560265612656226563265642656526566265672656826569265702657126572265732657426575265762657726578265792658026581265822658326584265852658626587265882658926590265912659226593265942659526596265972659826599266002660126602266032660426605266062660726608266092661026611266122661326614266152661626617266182661926620266212662226623266242662526626266272662826629266302663126632266332663426635266362663726638266392664026641266422664326644266452664626647266482664926650266512665226653266542665526656266572665826659266602666126662266632666426665266662666726668266692667026671266722667326674266752667626677266782667926680266812668226683266842668526686266872668826689266902669126692266932669426695266962669726698266992670026701267022670326704267052670626707267082670926710267112671226713267142671526716267172671826719267202672126722267232672426725267262672726728267292673026731267322673326734267352673626737267382673926740267412674226743267442674526746267472674826749267502675126752267532675426755267562675726758267592676026761267622676326764267652676626767267682676926770267712677226773267742677526776267772677826779267802678126782267832678426785267862678726788267892679026791267922679326794267952679626797267982679926800268012680226803268042680526806268072680826809268102681126812268132681426815268162681726818268192682026821268222682326824268252682626827268282682926830268312683226833268342683526836268372683826839268402684126842268432684426845268462684726848268492685026851268522685326854268552685626857268582685926860268612686226863268642686526866268672686826869268702687126872268732687426875268762687726878268792688026881268822688326884268852688626887268882688926890268912689226893268942689526896268972689826899269002690126902269032690426905269062690726908269092691026911269122691326914269152691626917269182691926920269212692226923269242692526926269272692826929269302693126932269332693426935269362693726938269392694026941269422694326944269452694626947269482694926950269512695226953269542695526956269572695826959269602696126962269632696426965269662696726968269692697026971269722697326974269752697626977269782697926980269812698226983269842698526986269872698826989269902699126992269932699426995269962699726998269992700027001270022700327004270052700627007270082700927010270112701227013270142701527016270172701827019270202702127022270232702427025270262702727028270292703027031270322703327034270352703627037270382703927040270412704227043270442704527046270472704827049270502705127052270532705427055270562705727058270592706027061270622706327064270652706627067270682706927070270712707227073270742707527076270772707827079270802708127082270832708427085270862708727088270892709027091270922709327094270952709627097270982709927100271012710227103271042710527106271072710827109271102711127112271132711427115271162711727118271192712027121271222712327124271252712627127271282712927130271312713227133271342713527136271372713827139271402714127142271432714427145271462714727148271492715027151271522715327154271552715627157271582715927160271612716227163271642716527166271672716827169271702717127172271732717427175271762717727178271792718027181271822718327184271852718627187271882718927190271912719227193271942719527196271972719827199272002720127202272032720427205272062720727208272092721027211272122721327214272152721627217272182721927220272212722227223272242722527226272272722827229272302723127232272332723427235272362723727238272392724027241272422724327244272452724627247272482724927250272512725227253272542725527256272572725827259272602726127262272632726427265272662726727268272692727027271272722727327274272752727627277272782727927280272812728227283272842728527286272872728827289272902729127292272932729427295272962729727298272992730027301273022730327304273052730627307273082730927310273112731227313273142731527316273172731827319273202732127322273232732427325273262732727328273292733027331273322733327334273352733627337273382733927340273412734227343273442734527346273472734827349273502735127352273532735427355273562735727358273592736027361273622736327364273652736627367273682736927370273712737227373273742737527376273772737827379273802738127382273832738427385273862738727388273892739027391273922739327394273952739627397273982739927400274012740227403274042740527406274072740827409274102741127412274132741427415274162741727418274192742027421274222742327424274252742627427274282742927430274312743227433274342743527436274372743827439274402744127442274432744427445274462744727448274492745027451274522745327454274552745627457274582745927460274612746227463274642746527466274672746827469274702747127472274732747427475274762747727478274792748027481274822748327484274852748627487274882748927490274912749227493274942749527496274972749827499275002750127502275032750427505275062750727508275092751027511275122751327514275152751627517275182751927520275212752227523275242752527526275272752827529275302753127532275332753427535275362753727538275392754027541275422754327544275452754627547275482754927550275512755227553275542755527556275572755827559275602756127562275632756427565275662756727568275692757027571275722757327574275752757627577275782757927580275812758227583275842758527586275872758827589275902759127592275932759427595275962759727598275992760027601276022760327604276052760627607276082760927610276112761227613276142761527616276172761827619276202762127622276232762427625276262762727628276292763027631276322763327634276352763627637276382763927640276412764227643276442764527646276472764827649276502765127652276532765427655276562765727658276592766027661276622766327664276652766627667276682766927670276712767227673276742767527676276772767827679276802768127682276832768427685276862768727688276892769027691276922769327694276952769627697276982769927700277012770227703277042770527706277072770827709277102771127712277132771427715277162771727718277192772027721277222772327724277252772627727277282772927730277312773227733277342773527736277372773827739277402774127742277432774427745277462774727748277492775027751277522775327754277552775627757277582775927760277612776227763277642776527766277672776827769277702777127772277732777427775277762777727778277792778027781277822778327784277852778627787277882778927790277912779227793277942779527796277972779827799278002780127802278032780427805278062780727808278092781027811278122781327814278152781627817278182781927820278212782227823278242782527826278272782827829278302783127832278332783427835278362783727838278392784027841278422784327844278452784627847278482784927850278512785227853278542785527856278572785827859278602786127862278632786427865278662786727868278692787027871278722787327874278752787627877278782787927880278812788227883278842788527886278872788827889278902789127892278932789427895278962789727898278992790027901279022790327904279052790627907279082790927910279112791227913279142791527916279172791827919279202792127922279232792427925279262792727928279292793027931279322793327934279352793627937279382793927940279412794227943279442794527946279472794827949279502795127952279532795427955279562795727958279592796027961279622796327964279652796627967279682796927970279712797227973279742797527976279772797827979279802798127982279832798427985279862798727988279892799027991279922799327994279952799627997279982799928000280012800228003280042800528006280072800828009280102801128012280132801428015280162801728018280192802028021280222802328024280252802628027280282802928030280312803228033280342803528036280372803828039280402804128042280432804428045280462804728048280492805028051280522805328054280552805628057280582805928060280612806228063280642806528066280672806828069280702807128072280732807428075280762807728078280792808028081280822808328084280852808628087280882808928090280912809228093280942809528096280972809828099281002810128102281032810428105281062810728108281092811028111281122811328114281152811628117281182811928120281212812228123281242812528126281272812828129281302813128132281332813428135281362813728138281392814028141281422814328144281452814628147281482814928150281512815228153281542815528156281572815828159281602816128162281632816428165281662816728168281692817028171281722817328174281752817628177281782817928180281812818228183281842818528186281872818828189281902819128192281932819428195281962819728198281992820028201282022820328204282052820628207282082820928210282112821228213282142821528216282172821828219282202822128222282232822428225282262822728228282292823028231282322823328234282352823628237282382823928240282412824228243282442824528246282472824828249282502825128252282532825428255282562825728258282592826028261282622826328264282652826628267282682826928270282712827228273282742827528276282772827828279282802828128282282832828428285282862828728288282892829028291282922829328294282952829628297282982829928300283012830228303283042830528306283072830828309283102831128312283132831428315283162831728318283192832028321283222832328324283252832628327283282832928330283312833228333283342833528336283372833828339283402834128342283432834428345283462834728348283492835028351283522835328354283552835628357283582835928360283612836228363283642836528366283672836828369283702837128372283732837428375283762837728378283792838028381283822838328384283852838628387283882838928390283912839228393283942839528396283972839828399284002840128402284032840428405284062840728408284092841028411284122841328414284152841628417284182841928420284212842228423284242842528426284272842828429284302843128432284332843428435284362843728438284392844028441284422844328444284452844628447284482844928450284512845228453284542845528456284572845828459284602846128462284632846428465284662846728468284692847028471284722847328474284752847628477284782847928480284812848228483284842848528486284872848828489284902849128492284932849428495284962849728498284992850028501285022850328504285052850628507285082850928510285112851228513285142851528516285172851828519285202852128522285232852428525285262852728528285292853028531285322853328534285352853628537285382853928540285412854228543285442854528546285472854828549285502855128552285532855428555285562855728558285592856028561285622856328564285652856628567285682856928570285712857228573285742857528576285772857828579285802858128582285832858428585285862858728588285892859028591285922859328594285952859628597285982859928600286012860228603286042860528606286072860828609286102861128612286132861428615286162861728618286192862028621286222862328624286252862628627286282862928630286312863228633286342863528636286372863828639286402864128642286432864428645286462864728648286492865028651286522865328654286552865628657286582865928660286612866228663286642866528666286672866828669286702867128672286732867428675286762867728678286792868028681286822868328684286852868628687286882868928690286912869228693286942869528696286972869828699287002870128702287032870428705287062870728708287092871028711287122871328714287152871628717287182871928720287212872228723287242872528726287272872828729287302873128732287332873428735287362873728738287392874028741287422874328744287452874628747287482874928750287512875228753287542875528756287572875828759287602876128762287632876428765287662876728768287692877028771287722877328774287752877628777287782877928780287812878228783287842878528786287872878828789287902879128792287932879428795287962879728798287992880028801288022880328804288052880628807288082880928810288112881228813288142881528816288172881828819288202882128822288232882428825288262882728828288292883028831288322883328834288352883628837288382883928840288412884228843288442884528846288472884828849288502885128852288532885428855288562885728858288592886028861288622886328864288652886628867288682886928870288712887228873288742887528876288772887828879288802888128882288832888428885288862888728888288892889028891288922889328894288952889628897288982889928900289012890228903289042890528906289072890828909289102891128912289132891428915289162891728918289192892028921289222892328924289252892628927289282892928930289312893228933289342893528936289372893828939289402894128942289432894428945289462894728948289492895028951289522895328954289552895628957289582895928960289612896228963289642896528966289672896828969289702897128972289732897428975289762897728978289792898028981289822898328984289852898628987289882898928990289912899228993289942899528996289972899828999290002900129002290032900429005290062900729008290092901029011290122901329014290152901629017290182901929020290212902229023290242902529026290272902829029290302903129032290332903429035290362903729038290392904029041290422904329044290452904629047290482904929050290512905229053290542905529056290572905829059290602906129062290632906429065290662906729068290692907029071290722907329074290752907629077290782907929080290812908229083290842908529086290872908829089290902909129092290932909429095290962909729098290992910029101291022910329104291052910629107291082910929110291112911229113291142911529116291172911829119291202912129122291232912429125291262912729128291292913029131291322913329134291352913629137291382913929140291412914229143291442914529146291472914829149291502915129152291532915429155291562915729158291592916029161291622916329164291652916629167291682916929170291712917229173291742917529176291772917829179291802918129182291832918429185291862918729188291892919029191291922919329194291952919629197291982919929200292012920229203292042920529206292072920829209292102921129212292132921429215292162921729218292192922029221292222922329224292252922629227292282922929230292312923229233292342923529236292372923829239292402924129242292432924429245292462924729248292492925029251292522925329254292552925629257292582925929260292612926229263292642926529266292672926829269292702927129272292732927429275292762927729278292792928029281292822928329284292852928629287292882928929290292912929229293292942929529296292972929829299293002930129302293032930429305293062930729308293092931029311293122931329314293152931629317293182931929320293212932229323293242932529326293272932829329293302933129332293332933429335293362933729338293392934029341293422934329344293452934629347293482934929350293512935229353293542935529356293572935829359293602936129362293632936429365293662936729368293692937029371293722937329374293752937629377293782937929380293812938229383293842938529386293872938829389293902939129392293932939429395293962939729398293992940029401294022940329404294052940629407294082940929410294112941229413294142941529416294172941829419294202942129422294232942429425294262942729428294292943029431294322943329434294352943629437294382943929440294412944229443294442944529446294472944829449294502945129452294532945429455294562945729458294592946029461294622946329464294652946629467294682946929470294712947229473294742947529476294772947829479294802948129482294832948429485294862948729488294892949029491294922949329494294952949629497294982949929500295012950229503295042950529506295072950829509295102951129512295132951429515295162951729518295192952029521295222952329524295252952629527295282952929530295312953229533295342953529536295372953829539295402954129542295432954429545295462954729548295492955029551295522955329554295552955629557295582955929560295612956229563295642956529566295672956829569295702957129572295732957429575295762957729578295792958029581295822958329584295852958629587295882958929590295912959229593295942959529596295972959829599296002960129602296032960429605296062960729608296092961029611296122961329614296152961629617296182961929620296212962229623296242962529626296272962829629296302963129632296332963429635296362963729638296392964029641296422964329644296452964629647296482964929650296512965229653296542965529656296572965829659296602966129662296632966429665296662966729668296692967029671296722967329674296752967629677296782967929680296812968229683296842968529686296872968829689296902969129692296932969429695296962969729698296992970029701297022970329704297052970629707297082970929710297112971229713297142971529716297172971829719297202972129722297232972429725297262972729728297292973029731297322973329734297352973629737297382973929740297412974229743297442974529746297472974829749297502975129752297532975429755297562975729758297592976029761297622976329764297652976629767297682976929770297712977229773297742977529776297772977829779297802978129782297832978429785297862978729788297892979029791297922979329794297952979629797297982979929800298012980229803298042980529806298072980829809298102981129812298132981429815298162981729818298192982029821298222982329824298252982629827298282982929830298312983229833298342983529836298372983829839298402984129842298432984429845298462984729848298492985029851298522985329854298552985629857298582985929860298612986229863298642986529866298672986829869298702987129872298732987429875298762987729878298792988029881298822988329884298852988629887298882988929890298912989229893298942989529896298972989829899299002990129902299032990429905299062990729908299092991029911299122991329914299152991629917299182991929920299212992229923299242992529926299272992829929299302993129932299332993429935299362993729938299392994029941299422994329944299452994629947299482994929950299512995229953299542995529956299572995829959299602996129962299632996429965299662996729968299692997029971299722997329974299752997629977299782997929980299812998229983299842998529986299872998829989299902999129992299932999429995299962999729998299993000030001300023000330004300053000630007300083000930010300113001230013300143001530016300173001830019300203002130022300233002430025300263002730028300293003030031300323003330034300353003630037300383003930040300413004230043300443004530046300473004830049300503005130052300533005430055300563005730058300593006030061300623006330064300653006630067300683006930070300713007230073300743007530076300773007830079300803008130082300833008430085300863008730088300893009030091300923009330094300953009630097300983009930100301013010230103301043010530106301073010830109301103011130112301133011430115301163011730118301193012030121301223012330124301253012630127301283012930130301313013230133301343013530136301373013830139301403014130142301433014430145301463014730148301493015030151301523015330154301553015630157301583015930160301613016230163301643016530166301673016830169301703017130172301733017430175301763017730178301793018030181301823018330184301853018630187301883018930190301913019230193301943019530196301973019830199302003020130202302033020430205302063020730208302093021030211302123021330214302153021630217302183021930220302213022230223302243022530226302273022830229302303023130232302333023430235302363023730238302393024030241302423024330244302453024630247302483024930250302513025230253302543025530256302573025830259302603026130262302633026430265302663026730268302693027030271302723027330274302753027630277302783027930280302813028230283302843028530286302873028830289302903029130292302933029430295302963029730298302993030030301303023030330304303053030630307303083030930310303113031230313303143031530316303173031830319303203032130322303233032430325303263032730328303293033030331303323033330334303353033630337303383033930340303413034230343303443034530346303473034830349303503035130352303533035430355303563035730358303593036030361303623036330364303653036630367303683036930370303713037230373303743037530376303773037830379303803038130382303833038430385303863038730388303893039030391303923039330394303953039630397303983039930400304013040230403304043040530406304073040830409304103041130412304133041430415304163041730418304193042030421304223042330424304253042630427304283042930430304313043230433304343043530436304373043830439304403044130442304433044430445304463044730448304493045030451304523045330454304553045630457304583045930460304613046230463304643046530466304673046830469304703047130472304733047430475304763047730478304793048030481304823048330484304853048630487304883048930490304913049230493304943049530496304973049830499305003050130502305033050430505305063050730508305093051030511305123051330514305153051630517305183051930520305213052230523305243052530526305273052830529305303053130532305333053430535305363053730538305393054030541305423054330544305453054630547305483054930550305513055230553305543055530556305573055830559305603056130562305633056430565305663056730568305693057030571305723057330574305753057630577305783057930580305813058230583305843058530586305873058830589305903059130592305933059430595305963059730598305993060030601306023060330604306053060630607306083060930610306113061230613306143061530616306173061830619306203062130622306233062430625306263062730628306293063030631306323063330634306353063630637306383063930640306413064230643306443064530646306473064830649306503065130652306533065430655306563065730658306593066030661306623066330664306653066630667306683066930670306713067230673306743067530676306773067830679306803068130682306833068430685306863068730688306893069030691306923069330694306953069630697306983069930700307013070230703307043070530706307073070830709307103071130712307133071430715307163071730718307193072030721307223072330724307253072630727307283072930730307313073230733307343073530736307373073830739307403074130742307433074430745307463074730748307493075030751307523075330754307553075630757307583075930760307613076230763307643076530766307673076830769307703077130772307733077430775307763077730778307793078030781307823078330784307853078630787307883078930790307913079230793307943079530796307973079830799308003080130802308033080430805308063080730808308093081030811308123081330814308153081630817308183081930820308213082230823308243082530826308273082830829308303083130832308333083430835308363083730838308393084030841308423084330844308453084630847308483084930850308513085230853308543085530856308573085830859308603086130862308633086430865308663086730868308693087030871308723087330874308753087630877308783087930880308813088230883308843088530886308873088830889308903089130892308933089430895308963089730898308993090030901309023090330904309053090630907309083090930910309113091230913309143091530916309173091830919309203092130922309233092430925309263092730928309293093030931309323093330934309353093630937309383093930940309413094230943309443094530946309473094830949309503095130952309533095430955309563095730958309593096030961309623096330964309653096630967309683096930970309713097230973309743097530976309773097830979309803098130982309833098430985309863098730988309893099030991309923099330994309953099630997309983099931000310013100231003310043100531006310073100831009310103101131012310133101431015310163101731018310193102031021310223102331024310253102631027310283102931030310313103231033310343103531036310373103831039310403104131042310433104431045310463104731048310493105031051310523105331054310553105631057310583105931060310613106231063310643106531066310673106831069310703107131072310733107431075310763107731078310793108031081310823108331084310853108631087310883108931090310913109231093310943109531096310973109831099311003110131102311033110431105311063110731108311093111031111311123111331114311153111631117311183111931120311213112231123311243112531126311273112831129311303113131132311333113431135311363113731138311393114031141311423114331144311453114631147311483114931150311513115231153311543115531156311573115831159311603116131162311633116431165311663116731168311693117031171311723117331174311753117631177311783117931180311813118231183311843118531186311873118831189311903119131192311933119431195311963119731198311993120031201312023120331204312053120631207312083120931210312113121231213312143121531216312173121831219312203122131222312233122431225312263122731228312293123031231312323123331234312353123631237312383123931240312413124231243312443124531246312473124831249312503125131252312533125431255312563125731258312593126031261312623126331264312653126631267312683126931270312713127231273312743127531276312773127831279312803128131282312833128431285312863128731288312893129031291312923129331294312953129631297312983129931300313013130231303313043130531306313073130831309313103131131312313133131431315313163131731318313193132031321313223132331324313253132631327313283132931330313313133231333313343133531336313373133831339313403134131342313433134431345313463134731348313493135031351313523135331354313553135631357313583135931360313613136231363313643136531366313673136831369313703137131372313733137431375313763137731378313793138031381313823138331384313853138631387313883138931390313913139231393313943139531396313973139831399314003140131402314033140431405314063140731408314093141031411314123141331414314153141631417314183141931420314213142231423314243142531426314273142831429314303143131432314333143431435314363143731438314393144031441314423144331444314453144631447314483144931450314513145231453314543145531456314573145831459314603146131462314633146431465314663146731468314693147031471314723147331474314753147631477314783147931480314813148231483314843148531486314873148831489314903149131492314933149431495314963149731498314993150031501315023150331504315053150631507315083150931510315113151231513315143151531516315173151831519315203152131522315233152431525315263152731528315293153031531315323153331534315353153631537315383153931540315413154231543315443154531546315473154831549315503155131552315533155431555315563155731558315593156031561315623156331564315653156631567315683156931570315713157231573315743157531576315773157831579315803158131582315833158431585315863158731588315893159031591315923159331594315953159631597315983159931600316013160231603316043160531606316073160831609316103161131612316133161431615316163161731618316193162031621316223162331624316253162631627316283162931630316313163231633316343163531636316373163831639316403164131642316433164431645316463164731648316493165031651316523165331654316553165631657316583165931660316613166231663316643166531666316673166831669316703167131672316733167431675316763167731678316793168031681316823168331684316853168631687316883168931690316913169231693316943169531696316973169831699317003170131702317033170431705317063170731708317093171031711317123171331714317153171631717317183171931720317213172231723317243172531726317273172831729317303173131732317333173431735317363173731738317393174031741317423174331744317453174631747317483174931750317513175231753317543175531756317573175831759317603176131762317633176431765317663176731768317693177031771317723177331774317753177631777317783177931780317813178231783317843178531786317873178831789317903179131792317933179431795317963179731798317993180031801318023180331804318053180631807318083180931810318113181231813318143181531816318173181831819318203182131822318233182431825318263182731828318293183031831318323183331834318353183631837318383183931840318413184231843318443184531846318473184831849318503185131852318533185431855318563185731858318593186031861318623186331864318653186631867318683186931870318713187231873318743187531876318773187831879318803188131882318833188431885318863188731888318893189031891318923189331894318953189631897318983189931900319013190231903319043190531906319073190831909319103191131912319133191431915319163191731918319193192031921319223192331924319253192631927319283192931930319313193231933319343193531936319373193831939319403194131942319433194431945319463194731948319493195031951319523195331954319553195631957319583195931960319613196231963319643196531966319673196831969319703197131972319733197431975319763197731978319793198031981319823198331984319853198631987319883198931990319913199231993319943199531996319973199831999320003200132002320033200432005320063200732008320093201032011320123201332014320153201632017320183201932020320213202232023320243202532026320273202832029320303203132032320333203432035320363203732038320393204032041320423204332044320453204632047320483204932050320513205232053320543205532056320573205832059320603206132062320633206432065320663206732068320693207032071320723207332074320753207632077320783207932080320813208232083320843208532086320873208832089320903209132092320933209432095320963209732098320993210032101321023210332104321053210632107321083210932110321113211232113321143211532116321173211832119321203212132122321233212432125321263212732128321293213032131321323213332134321353213632137321383213932140321413214232143321443214532146321473214832149321503215132152321533215432155321563215732158321593216032161321623216332164321653216632167321683216932170321713217232173321743217532176321773217832179321803218132182321833218432185321863218732188321893219032191321923219332194321953219632197321983219932200322013220232203322043220532206322073220832209322103221132212322133221432215322163221732218322193222032221322223222332224322253222632227322283222932230322313223232233322343223532236322373223832239322403224132242322433224432245322463224732248322493225032251322523225332254322553225632257322583225932260322613226232263322643226532266322673226832269322703227132272322733227432275322763227732278322793228032281322823228332284322853228632287322883228932290322913229232293322943229532296322973229832299323003230132302323033230432305323063230732308323093231032311323123231332314323153231632317323183231932320323213232232323323243232532326323273232832329323303233132332323333233432335323363233732338323393234032341323423234332344323453234632347323483234932350323513235232353323543235532356323573235832359323603236132362323633236432365323663236732368323693237032371323723237332374323753237632377323783237932380323813238232383323843238532386323873238832389323903239132392323933239432395323963239732398323993240032401324023240332404324053240632407324083240932410324113241232413324143241532416324173241832419324203242132422324233242432425324263242732428324293243032431324323243332434324353243632437324383243932440324413244232443324443244532446324473244832449324503245132452324533245432455324563245732458324593246032461324623246332464324653246632467324683246932470324713247232473324743247532476324773247832479324803248132482324833248432485324863248732488324893249032491324923249332494324953249632497324983249932500325013250232503325043250532506325073250832509325103251132512325133251432515325163251732518325193252032521325223252332524325253252632527325283252932530325313253232533325343253532536325373253832539325403254132542325433254432545325463254732548325493255032551325523255332554325553255632557325583255932560325613256232563325643256532566325673256832569325703257132572325733257432575325763257732578325793258032581325823258332584325853258632587325883258932590325913259232593325943259532596325973259832599326003260132602326033260432605326063260732608326093261032611326123261332614326153261632617326183261932620326213262232623326243262532626326273262832629326303263132632326333263432635326363263732638326393264032641326423264332644326453264632647326483264932650326513265232653326543265532656326573265832659326603266132662326633266432665326663266732668326693267032671326723267332674326753267632677326783267932680326813268232683326843268532686326873268832689326903269132692326933269432695326963269732698326993270032701327023270332704327053270632707327083270932710327113271232713327143271532716327173271832719327203272132722327233272432725327263272732728327293273032731327323273332734327353273632737327383273932740327413274232743327443274532746327473274832749327503275132752327533275432755327563275732758327593276032761327623276332764327653276632767327683276932770327713277232773327743277532776327773277832779327803278132782327833278432785327863278732788327893279032791327923279332794327953279632797327983279932800328013280232803328043280532806328073280832809328103281132812328133281432815328163281732818328193282032821328223282332824328253282632827328283282932830328313283232833328343283532836328373283832839328403284132842328433284432845328463284732848328493285032851328523285332854328553285632857328583285932860328613286232863328643286532866328673286832869328703287132872328733287432875328763287732878328793288032881328823288332884328853288632887328883288932890328913289232893328943289532896328973289832899329003290132902329033290432905329063290732908329093291032911329123291332914329153291632917329183291932920329213292232923329243292532926329273292832929329303293132932329333293432935329363293732938329393294032941329423294332944329453294632947329483294932950329513295232953329543295532956329573295832959329603296132962329633296432965329663296732968329693297032971329723297332974329753297632977329783297932980329813298232983329843298532986329873298832989329903299132992329933299432995329963299732998329993300033001330023300333004330053300633007330083300933010330113301233013330143301533016330173301833019330203302133022330233302433025330263302733028330293303033031330323303333034330353303633037330383303933040330413304233043330443304533046330473304833049330503305133052330533305433055330563305733058330593306033061330623306333064330653306633067330683306933070330713307233073330743307533076330773307833079330803308133082330833308433085330863308733088330893309033091330923309333094330953309633097330983309933100331013310233103331043310533106331073310833109331103311133112331133311433115331163311733118331193312033121331223312333124331253312633127331283312933130331313313233133331343313533136331373313833139331403314133142331433314433145331463314733148331493315033151331523315333154331553315633157331583315933160331613316233163331643316533166331673316833169331703317133172331733317433175331763317733178331793318033181331823318333184331853318633187331883318933190331913319233193331943319533196331973319833199332003320133202332033320433205332063320733208332093321033211332123321333214332153321633217332183321933220332213322233223332243322533226332273322833229332303323133232332333323433235332363323733238332393324033241332423324333244332453324633247332483324933250332513325233253332543325533256332573325833259332603326133262332633326433265332663326733268332693327033271332723327333274332753327633277332783327933280332813328233283332843328533286332873328833289332903329133292332933329433295332963329733298332993330033301333023330333304333053330633307333083330933310333113331233313333143331533316333173331833319333203332133322333233332433325333263332733328333293333033331333323333333334333353333633337333383333933340333413334233343333443334533346333473334833349333503335133352333533335433355333563335733358333593336033361333623336333364333653336633367333683336933370333713337233373333743337533376333773337833379333803338133382333833338433385333863338733388333893339033391333923339333394333953339633397333983339933400334013340233403334043340533406334073340833409334103341133412334133341433415334163341733418334193342033421334223342333424334253342633427334283342933430334313343233433334343343533436334373343833439334403344133442334433344433445334463344733448334493345033451334523345333454334553345633457334583345933460334613346233463334643346533466334673346833469334703347133472334733347433475334763347733478334793348033481334823348333484334853348633487334883348933490334913349233493334943349533496334973349833499335003350133502335033350433505335063350733508335093351033511335123351333514335153351633517335183351933520335213352233523335243352533526335273352833529335303353133532335333353433535335363353733538335393354033541335423354333544335453354633547335483354933550335513355233553335543355533556335573355833559335603356133562335633356433565335663356733568335693357033571335723357333574335753357633577335783357933580335813358233583335843358533586335873358833589335903359133592335933359433595335963359733598335993360033601336023360333604336053360633607336083360933610336113361233613336143361533616336173361833619336203362133622336233362433625336263362733628336293363033631336323363333634336353363633637336383363933640336413364233643336443364533646336473364833649336503365133652336533365433655336563365733658336593366033661336623366333664336653366633667336683366933670336713367233673336743367533676336773367833679336803368133682336833368433685336863368733688336893369033691336923369333694336953369633697336983369933700337013370233703337043370533706337073370833709337103371133712337133371433715337163371733718337193372033721337223372333724337253372633727337283372933730337313373233733337343373533736337373373833739337403374133742337433374433745337463374733748337493375033751337523375333754337553375633757337583375933760337613376233763337643376533766337673376833769337703377133772337733377433775337763377733778337793378033781337823378333784337853378633787337883378933790337913379233793337943379533796337973379833799338003380133802338033380433805338063380733808338093381033811338123381333814338153381633817338183381933820338213382233823338243382533826338273382833829338303383133832338333383433835338363383733838338393384033841338423384333844338453384633847338483384933850338513385233853338543385533856338573385833859338603386133862338633386433865338663386733868338693387033871338723387333874338753387633877338783387933880338813388233883338843388533886338873388833889338903389133892338933389433895338963389733898338993390033901339023390333904339053390633907339083390933910339113391233913339143391533916339173391833919339203392133922339233392433925339263392733928339293393033931339323393333934339353393633937339383393933940339413394233943339443394533946339473394833949339503395133952339533395433955339563395733958339593396033961339623396333964339653396633967339683396933970339713397233973339743397533976339773397833979339803398133982339833398433985339863398733988339893399033991339923399333994339953399633997339983399934000340013400234003340043400534006340073400834009340103401134012340133401434015340163401734018340193402034021340223402334024340253402634027340283402934030340313403234033340343403534036340373403834039340403404134042340433404434045340463404734048340493405034051340523405334054340553405634057340583405934060340613406234063340643406534066340673406834069340703407134072340733407434075340763407734078340793408034081340823408334084340853408634087340883408934090340913409234093340943409534096340973409834099341003410134102341033410434105341063410734108341093411034111341123411334114341153411634117341183411934120341213412234123341243412534126341273412834129341303413134132341333413434135341363413734138341393414034141341423414334144341453414634147341483414934150341513415234153341543415534156341573415834159341603416134162341633416434165341663416734168341693417034171341723417334174341753417634177341783417934180341813418234183341843418534186341873418834189341903419134192341933419434195341963419734198341993420034201342023420334204342053420634207342083420934210342113421234213342143421534216342173421834219342203422134222342233422434225342263422734228342293423034231342323423334234342353423634237342383423934240342413424234243342443424534246342473424834249342503425134252342533425434255342563425734258342593426034261342623426334264342653426634267342683426934270342713427234273342743427534276342773427834279342803428134282342833428434285342863428734288342893429034291342923429334294342953429634297342983429934300343013430234303343043430534306343073430834309343103431134312343133431434315343163431734318343193432034321343223432334324343253432634327343283432934330343313433234333343343433534336343373433834339343403434134342343433434434345343463434734348343493435034351343523435334354343553435634357343583435934360343613436234363343643436534366343673436834369343703437134372343733437434375343763437734378343793438034381343823438334384343853438634387343883438934390343913439234393343943439534396343973439834399344003440134402344033440434405344063440734408344093441034411344123441334414344153441634417344183441934420344213442234423344243442534426344273442834429344303443134432344333443434435344363443734438344393444034441344423444334444344453444634447344483444934450344513445234453344543445534456344573445834459344603446134462344633446434465344663446734468344693447034471344723447334474344753447634477344783447934480344813448234483344843448534486344873448834489344903449134492344933449434495344963449734498344993450034501345023450334504345053450634507345083450934510345113451234513345143451534516345173451834519345203452134522345233452434525345263452734528345293453034531345323453334534345353453634537345383453934540345413454234543345443454534546345473454834549345503455134552345533455434555345563455734558345593456034561345623456334564345653456634567345683456934570345713457234573345743457534576345773457834579345803458134582345833458434585345863458734588345893459034591345923459334594345953459634597345983459934600346013460234603346043460534606346073460834609346103461134612346133461434615346163461734618346193462034621346223462334624346253462634627346283462934630346313463234633346343463534636346373463834639346403464134642346433464434645346463464734648346493465034651346523465334654346553465634657346583465934660346613466234663346643466534666346673466834669346703467134672346733467434675346763467734678346793468034681346823468334684346853468634687346883468934690346913469234693346943469534696346973469834699347003470134702347033470434705347063470734708347093471034711347123471334714347153471634717347183471934720347213472234723347243472534726347273472834729347303473134732347333473434735347363473734738347393474034741347423474334744347453474634747347483474934750347513475234753347543475534756347573475834759347603476134762347633476434765347663476734768347693477034771347723477334774347753477634777347783477934780347813478234783347843478534786347873478834789347903479134792347933479434795347963479734798347993480034801348023480334804348053480634807348083480934810348113481234813348143481534816348173481834819348203482134822348233482434825348263482734828348293483034831348323483334834348353483634837348383483934840348413484234843348443484534846348473484834849348503485134852348533485434855348563485734858348593486034861348623486334864348653486634867348683486934870348713487234873348743487534876348773487834879348803488134882348833488434885348863488734888348893489034891348923489334894348953489634897348983489934900349013490234903349043490534906349073490834909349103491134912349133491434915349163491734918349193492034921349223492334924349253492634927349283492934930349313493234933349343493534936349373493834939349403494134942349433494434945349463494734948349493495034951349523495334954349553495634957349583495934960349613496234963349643496534966349673496834969349703497134972349733497434975349763497734978349793498034981349823498334984349853498634987349883498934990349913499234993349943499534996349973499834999350003500135002350033500435005350063500735008350093501035011350123501335014350153501635017350183501935020350213502235023350243502535026350273502835029350303503135032350333503435035350363503735038350393504035041350423504335044350453504635047350483504935050350513505235053350543505535056350573505835059350603506135062350633506435065350663506735068350693507035071350723507335074350753507635077350783507935080350813508235083350843508535086350873508835089350903509135092350933509435095350963509735098350993510035101351023510335104351053510635107351083510935110351113511235113351143511535116351173511835119351203512135122351233512435125351263512735128351293513035131351323513335134351353513635137351383513935140351413514235143351443514535146351473514835149351503515135152351533515435155351563515735158351593516035161351623516335164351653516635167351683516935170351713517235173351743517535176351773517835179351803518135182351833518435185351863518735188351893519035191351923519335194351953519635197351983519935200352013520235203352043520535206352073520835209352103521135212352133521435215352163521735218352193522035221352223522335224352253522635227352283522935230352313523235233352343523535236352373523835239352403524135242352433524435245352463524735248352493525035251352523525335254352553525635257352583525935260352613526235263352643526535266352673526835269352703527135272352733527435275352763527735278352793528035281352823528335284352853528635287352883528935290352913529235293352943529535296352973529835299353003530135302353033530435305353063530735308353093531035311353123531335314353153531635317353183531935320353213532235323353243532535326353273532835329353303533135332353333533435335353363533735338353393534035341353423534335344353453534635347353483534935350353513535235353353543535535356353573535835359353603536135362353633536435365353663536735368353693537035371353723537335374353753537635377353783537935380353813538235383353843538535386353873538835389353903539135392353933539435395353963539735398353993540035401354023540335404354053540635407354083540935410354113541235413354143541535416354173541835419354203542135422354233542435425354263542735428354293543035431354323543335434354353543635437354383543935440354413544235443354443544535446354473544835449354503545135452354533545435455354563545735458354593546035461354623546335464354653546635467354683546935470354713547235473354743547535476354773547835479354803548135482354833548435485354863548735488354893549035491354923549335494354953549635497354983549935500355013550235503355043550535506355073550835509355103551135512355133551435515355163551735518355193552035521355223552335524355253552635527355283552935530355313553235533355343553535536355373553835539355403554135542355433554435545355463554735548355493555035551355523555335554355553555635557355583555935560355613556235563355643556535566355673556835569355703557135572355733557435575355763557735578355793558035581355823558335584355853558635587355883558935590355913559235593355943559535596355973559835599356003560135602356033560435605356063560735608356093561035611356123561335614356153561635617356183561935620356213562235623356243562535626356273562835629356303563135632356333563435635356363563735638356393564035641356423564335644356453564635647356483564935650356513565235653356543565535656356573565835659356603566135662356633566435665356663566735668356693567035671356723567335674356753567635677356783567935680356813568235683356843568535686356873568835689356903569135692356933569435695356963569735698356993570035701357023570335704357053570635707357083570935710357113571235713357143571535716357173571835719357203572135722357233572435725357263572735728357293573035731357323573335734357353573635737357383573935740357413574235743357443574535746357473574835749357503575135752357533575435755357563575735758357593576035761357623576335764357653576635767357683576935770357713577235773357743577535776357773577835779357803578135782357833578435785357863578735788357893579035791357923579335794357953579635797357983579935800358013580235803358043580535806358073580835809358103581135812358133581435815358163581735818358193582035821358223582335824358253582635827358283582935830358313583235833358343583535836358373583835839358403584135842358433584435845358463584735848358493585035851358523585335854358553585635857358583585935860358613586235863358643586535866358673586835869358703587135872358733587435875358763587735878358793588035881358823588335884358853588635887358883588935890358913589235893358943589535896358973589835899359003590135902359033590435905359063590735908359093591035911359123591335914359153591635917359183591935920359213592235923359243592535926359273592835929359303593135932359333593435935359363593735938359393594035941359423594335944359453594635947359483594935950359513595235953359543595535956359573595835959359603596135962359633596435965359663596735968359693597035971359723597335974359753597635977359783597935980359813598235983359843598535986359873598835989359903599135992359933599435995359963599735998359993600036001360023600336004360053600636007360083600936010360113601236013360143601536016360173601836019360203602136022360233602436025360263602736028360293603036031360323603336034360353603636037360383603936040360413604236043360443604536046360473604836049360503605136052360533605436055360563605736058360593606036061360623606336064360653606636067360683606936070360713607236073360743607536076360773607836079360803608136082360833608436085360863608736088360893609036091360923609336094360953609636097360983609936100361013610236103361043610536106361073610836109361103611136112361133611436115361163611736118361193612036121361223612336124361253612636127361283612936130361313613236133361343613536136361373613836139361403614136142361433614436145361463614736148361493615036151361523615336154361553615636157361583615936160361613616236163361643616536166361673616836169361703617136172361733617436175361763617736178361793618036181361823618336184361853618636187361883618936190361913619236193361943619536196361973619836199362003620136202362033620436205362063620736208362093621036211362123621336214362153621636217362183621936220362213622236223362243622536226362273622836229362303623136232362333623436235362363623736238362393624036241362423624336244362453624636247362483624936250362513625236253362543625536256362573625836259362603626136262362633626436265362663626736268362693627036271362723627336274362753627636277362783627936280362813628236283362843628536286362873628836289362903629136292362933629436295362963629736298362993630036301363023630336304363053630636307363083630936310363113631236313363143631536316363173631836319363203632136322363233632436325363263632736328363293633036331363323633336334363353633636337363383633936340363413634236343363443634536346363473634836349363503635136352363533635436355363563635736358363593636036361363623636336364363653636636367363683636936370363713637236373363743637536376363773637836379363803638136382363833638436385363863638736388363893639036391363923639336394363953639636397363983639936400364013640236403364043640536406364073640836409364103641136412364133641436415364163641736418364193642036421364223642336424364253642636427364283642936430364313643236433364343643536436364373643836439364403644136442364433644436445364463644736448364493645036451364523645336454364553645636457364583645936460364613646236463364643646536466364673646836469364703647136472364733647436475364763647736478364793648036481364823648336484364853648636487364883648936490364913649236493364943649536496364973649836499365003650136502365033650436505365063650736508365093651036511365123651336514365153651636517365183651936520365213652236523365243652536526365273652836529365303653136532365333653436535365363653736538365393654036541365423654336544365453654636547365483654936550365513655236553365543655536556365573655836559365603656136562365633656436565365663656736568365693657036571365723657336574365753657636577365783657936580365813658236583365843658536586365873658836589365903659136592365933659436595365963659736598365993660036601366023660336604366053660636607366083660936610366113661236613366143661536616366173661836619366203662136622366233662436625366263662736628366293663036631366323663336634366353663636637366383663936640366413664236643366443664536646366473664836649366503665136652366533665436655366563665736658366593666036661366623666336664366653666636667366683666936670366713667236673366743667536676366773667836679366803668136682366833668436685366863668736688366893669036691366923669336694366953669636697366983669936700367013670236703367043670536706367073670836709367103671136712367133671436715367163671736718367193672036721367223672336724367253672636727367283672936730367313673236733367343673536736367373673836739367403674136742367433674436745367463674736748367493675036751367523675336754367553675636757367583675936760367613676236763367643676536766367673676836769367703677136772367733677436775367763677736778367793678036781367823678336784367853678636787367883678936790367913679236793367943679536796367973679836799368003680136802368033680436805368063680736808368093681036811368123681336814368153681636817368183681936820368213682236823368243682536826368273682836829368303683136832368333683436835368363683736838368393684036841368423684336844368453684636847368483684936850368513685236853368543685536856368573685836859368603686136862368633686436865368663686736868368693687036871368723687336874368753687636877368783687936880368813688236883368843688536886368873688836889368903689136892368933689436895368963689736898368993690036901369023690336904369053690636907369083690936910369113691236913369143691536916369173691836919369203692136922369233692436925369263692736928369293693036931369323693336934369353693636937369383693936940369413694236943369443694536946369473694836949369503695136952369533695436955369563695736958369593696036961369623696336964369653696636967369683696936970369713697236973369743697536976369773697836979369803698136982369833698436985369863698736988369893699036991369923699336994369953699636997369983699937000370013700237003370043700537006370073700837009370103701137012370133701437015370163701737018370193702037021370223702337024370253702637027370283702937030370313703237033370343703537036370373703837039370403704137042370433704437045370463704737048370493705037051370523705337054370553705637057370583705937060370613706237063370643706537066370673706837069370703707137072370733707437075370763707737078370793708037081370823708337084370853708637087370883708937090370913709237093370943709537096370973709837099371003710137102371033710437105371063710737108371093711037111371123711337114371153711637117371183711937120371213712237123371243712537126371273712837129371303713137132371333713437135371363713737138371393714037141371423714337144371453714637147371483714937150371513715237153371543715537156371573715837159371603716137162371633716437165371663716737168371693717037171371723717337174371753717637177371783717937180371813718237183371843718537186371873718837189371903719137192371933719437195371963719737198371993720037201372023720337204372053720637207372083720937210372113721237213372143721537216372173721837219372203722137222372233722437225372263722737228372293723037231372323723337234372353723637237372383723937240372413724237243372443724537246372473724837249372503725137252372533725437255372563725737258372593726037261372623726337264372653726637267372683726937270372713727237273372743727537276372773727837279372803728137282372833728437285372863728737288372893729037291372923729337294372953729637297372983729937300373013730237303373043730537306373073730837309373103731137312373133731437315373163731737318373193732037321373223732337324373253732637327373283732937330373313733237333373343733537336373373733837339373403734137342373433734437345373463734737348373493735037351373523735337354373553735637357373583735937360373613736237363373643736537366373673736837369373703737137372373733737437375373763737737378373793738037381373823738337384373853738637387373883738937390373913739237393373943739537396373973739837399374003740137402374033740437405374063740737408374093741037411374123741337414374153741637417374183741937420374213742237423374243742537426374273742837429374303743137432374333743437435374363743737438374393744037441374423744337444374453744637447374483744937450374513745237453374543745537456374573745837459374603746137462374633746437465374663746737468374693747037471374723747337474374753747637477374783747937480374813748237483374843748537486374873748837489374903749137492374933749437495374963749737498374993750037501375023750337504375053750637507375083750937510375113751237513375143751537516375173751837519375203752137522375233752437525375263752737528375293753037531375323753337534375353753637537375383753937540375413754237543375443754537546375473754837549375503755137552375533755437555375563755737558375593756037561375623756337564375653756637567375683756937570375713757237573375743757537576375773757837579375803758137582375833758437585375863758737588375893759037591375923759337594375953759637597375983759937600376013760237603376043760537606376073760837609376103761137612376133761437615376163761737618376193762037621376223762337624376253762637627376283762937630376313763237633376343763537636376373763837639376403764137642376433764437645376463764737648376493765037651376523765337654376553765637657376583765937660376613766237663376643766537666376673766837669376703767137672376733767437675376763767737678376793768037681376823768337684376853768637687376883768937690376913769237693376943769537696376973769837699377003770137702377033770437705377063770737708377093771037711377123771337714377153771637717377183771937720377213772237723377243772537726377273772837729377303773137732377333773437735377363773737738377393774037741377423774337744377453774637747377483774937750377513775237753377543775537756377573775837759377603776137762377633776437765377663776737768377693777037771377723777337774377753777637777377783777937780377813778237783377843778537786377873778837789377903779137792377933779437795377963779737798377993780037801378023780337804378053780637807378083780937810378113781237813378143781537816378173781837819378203782137822378233782437825378263782737828378293783037831378323783337834378353783637837378383783937840378413784237843378443784537846378473784837849378503785137852378533785437855378563785737858378593786037861378623786337864378653786637867378683786937870378713787237873378743787537876378773787837879378803788137882378833788437885378863788737888378893789037891378923789337894378953789637897378983789937900379013790237903379043790537906379073790837909379103791137912379133791437915379163791737918379193792037921379223792337924379253792637927379283792937930379313793237933379343793537936379373793837939379403794137942379433794437945379463794737948379493795037951379523795337954379553795637957379583795937960379613796237963379643796537966379673796837969379703797137972379733797437975379763797737978379793798037981379823798337984379853798637987379883798937990379913799237993379943799537996379973799837999380003800138002380033800438005380063800738008380093801038011380123801338014380153801638017380183801938020380213802238023380243802538026380273802838029380303803138032380333803438035380363803738038380393804038041380423804338044380453804638047380483804938050380513805238053380543805538056380573805838059380603806138062380633806438065380663806738068380693807038071380723807338074380753807638077380783807938080380813808238083380843808538086380873808838089380903809138092380933809438095380963809738098380993810038101381023810338104381053810638107381083810938110381113811238113381143811538116381173811838119381203812138122381233812438125381263812738128381293813038131381323813338134381353813638137381383813938140381413814238143381443814538146381473814838149381503815138152381533815438155381563815738158381593816038161381623816338164381653816638167381683816938170381713817238173381743817538176381773817838179381803818138182381833818438185381863818738188381893819038191381923819338194381953819638197381983819938200382013820238203382043820538206382073820838209382103821138212382133821438215382163821738218382193822038221382223822338224382253822638227382283822938230382313823238233382343823538236382373823838239382403824138242382433824438245382463824738248382493825038251382523825338254382553825638257382583825938260382613826238263382643826538266382673826838269382703827138272382733827438275382763827738278382793828038281382823828338284382853828638287382883828938290382913829238293382943829538296382973829838299383003830138302383033830438305383063830738308383093831038311383123831338314383153831638317383183831938320383213832238323383243832538326383273832838329383303833138332383333833438335383363833738338383393834038341383423834338344383453834638347383483834938350383513835238353383543835538356383573835838359383603836138362383633836438365383663836738368383693837038371383723837338374383753837638377383783837938380383813838238383383843838538386383873838838389383903839138392383933839438395383963839738398383993840038401384023840338404384053840638407384083840938410384113841238413384143841538416384173841838419384203842138422384233842438425384263842738428384293843038431384323843338434384353843638437384383843938440384413844238443384443844538446384473844838449384503845138452384533845438455384563845738458384593846038461384623846338464384653846638467384683846938470384713847238473384743847538476384773847838479384803848138482384833848438485384863848738488384893849038491384923849338494384953849638497384983849938500385013850238503385043850538506385073850838509385103851138512385133851438515385163851738518385193852038521385223852338524385253852638527385283852938530385313853238533385343853538536385373853838539385403854138542385433854438545385463854738548385493855038551385523855338554385553855638557385583855938560385613856238563385643856538566385673856838569385703857138572385733857438575385763857738578385793858038581385823858338584385853858638587385883858938590385913859238593385943859538596385973859838599386003860138602386033860438605386063860738608386093861038611386123861338614386153861638617386183861938620386213862238623386243862538626386273862838629386303863138632386333863438635386363863738638386393864038641386423864338644386453864638647386483864938650386513865238653386543865538656386573865838659386603866138662386633866438665386663866738668386693867038671386723867338674386753867638677386783867938680386813868238683386843868538686386873868838689386903869138692386933869438695386963869738698386993870038701387023870338704387053870638707387083870938710387113871238713387143871538716387173871838719387203872138722387233872438725387263872738728387293873038731387323873338734387353873638737387383873938740387413874238743387443874538746387473874838749387503875138752387533875438755387563875738758387593876038761387623876338764387653876638767387683876938770387713877238773387743877538776387773877838779387803878138782387833878438785387863878738788387893879038791387923879338794387953879638797387983879938800388013880238803388043880538806388073880838809388103881138812388133881438815388163881738818388193882038821388223882338824388253882638827388283882938830388313883238833388343883538836388373883838839388403884138842388433884438845388463884738848388493885038851388523885338854388553885638857388583885938860388613886238863388643886538866388673886838869388703887138872388733887438875388763887738878388793888038881388823888338884388853888638887388883888938890388913889238893388943889538896388973889838899389003890138902389033890438905389063890738908389093891038911389123891338914389153891638917389183891938920389213892238923389243892538926389273892838929389303893138932389333893438935389363893738938389393894038941389423894338944389453894638947389483894938950389513895238953389543895538956389573895838959389603896138962389633896438965389663896738968389693897038971389723897338974389753897638977389783897938980389813898238983389843898538986389873898838989389903899138992389933899438995389963899738998389993900039001390023900339004390053900639007390083900939010390113901239013390143901539016390173901839019390203902139022390233902439025390263902739028390293903039031390323903339034390353903639037390383903939040390413904239043390443904539046390473904839049390503905139052390533905439055390563905739058390593906039061390623906339064390653906639067390683906939070390713907239073390743907539076390773907839079390803908139082390833908439085390863908739088390893909039091390923909339094390953909639097390983909939100391013910239103391043910539106391073910839109391103911139112391133911439115391163911739118391193912039121391223912339124391253912639127391283912939130391313913239133391343913539136391373913839139391403914139142391433914439145391463914739148391493915039151391523915339154391553915639157391583915939160391613916239163391643916539166391673916839169391703917139172391733917439175391763917739178391793918039181391823918339184391853918639187391883918939190391913919239193391943919539196391973919839199392003920139202392033920439205392063920739208392093921039211392123921339214392153921639217392183921939220392213922239223392243922539226392273922839229392303923139232392333923439235392363923739238392393924039241392423924339244392453924639247392483924939250392513925239253392543925539256392573925839259392603926139262392633926439265392663926739268392693927039271392723927339274392753927639277392783927939280392813928239283392843928539286392873928839289392903929139292392933929439295392963929739298392993930039301393023930339304393053930639307393083930939310393113931239313393143931539316393173931839319393203932139322393233932439325393263932739328393293933039331393323933339334393353933639337393383933939340393413934239343393443934539346393473934839349393503935139352393533935439355393563935739358393593936039361393623936339364393653936639367393683936939370393713937239373393743937539376393773937839379393803938139382393833938439385393863938739388393893939039391393923939339394393953939639397393983939939400394013940239403394043940539406394073940839409394103941139412394133941439415394163941739418394193942039421394223942339424394253942639427394283942939430394313943239433394343943539436394373943839439394403944139442394433944439445394463944739448394493945039451394523945339454394553945639457394583945939460394613946239463394643946539466394673946839469394703947139472394733947439475394763947739478394793948039481394823948339484394853948639487394883948939490394913949239493394943949539496394973949839499395003950139502395033950439505395063950739508395093951039511395123951339514395153951639517395183951939520395213952239523395243952539526395273952839529395303953139532395333953439535395363953739538395393954039541395423954339544395453954639547395483954939550395513955239553395543955539556395573955839559395603956139562395633956439565395663956739568395693957039571395723957339574395753957639577395783957939580395813958239583395843958539586395873958839589395903959139592395933959439595395963959739598395993960039601396023960339604396053960639607396083960939610396113961239613396143961539616396173961839619396203962139622396233962439625396263962739628396293963039631396323963339634396353963639637396383963939640396413964239643396443964539646396473964839649396503965139652396533965439655396563965739658396593966039661396623966339664396653966639667396683966939670396713967239673396743967539676396773967839679396803968139682396833968439685396863968739688396893969039691396923969339694396953969639697396983969939700397013970239703397043970539706397073970839709397103971139712397133971439715397163971739718397193972039721397223972339724397253972639727397283972939730397313973239733397343973539736397373973839739397403974139742397433974439745397463974739748397493975039751397523975339754397553975639757397583975939760397613976239763397643976539766397673976839769397703977139772397733977439775397763977739778397793978039781397823978339784397853978639787397883978939790397913979239793397943979539796397973979839799398003980139802398033980439805398063980739808398093981039811398123981339814398153981639817398183981939820398213982239823398243982539826398273982839829398303983139832398333983439835398363983739838398393984039841398423984339844398453984639847398483984939850398513985239853398543985539856398573985839859398603986139862398633986439865398663986739868398693987039871398723987339874398753987639877398783987939880398813988239883398843988539886398873988839889398903989139892398933989439895398963989739898398993990039901399023990339904399053990639907399083990939910399113991239913399143991539916399173991839919399203992139922399233992439925399263992739928399293993039931399323993339934399353993639937399383993939940399413994239943399443994539946399473994839949399503995139952399533995439955399563995739958399593996039961399623996339964399653996639967399683996939970399713997239973399743997539976399773997839979399803998139982399833998439985399863998739988399893999039991399923999339994399953999639997399983999940000400014000240003400044000540006400074000840009400104001140012400134001440015400164001740018400194002040021400224002340024400254002640027400284002940030400314003240033400344003540036400374003840039400404004140042400434004440045400464004740048400494005040051400524005340054400554005640057400584005940060400614006240063400644006540066400674006840069400704007140072400734007440075400764007740078400794008040081400824008340084400854008640087400884008940090400914009240093400944009540096400974009840099401004010140102401034010440105401064010740108401094011040111401124011340114401154011640117401184011940120401214012240123401244012540126401274012840129401304013140132401334013440135401364013740138401394014040141401424014340144401454014640147401484014940150401514015240153401544015540156401574015840159401604016140162401634016440165401664016740168401694017040171401724017340174401754017640177401784017940180401814018240183401844018540186401874018840189401904019140192401934019440195401964019740198401994020040201402024020340204402054020640207402084020940210402114021240213402144021540216402174021840219402204022140222402234022440225402264022740228402294023040231402324023340234402354023640237402384023940240402414024240243402444024540246402474024840249402504025140252402534025440255402564025740258402594026040261402624026340264402654026640267402684026940270402714027240273402744027540276402774027840279402804028140282402834028440285402864028740288402894029040291402924029340294402954029640297402984029940300403014030240303403044030540306403074030840309403104031140312403134031440315403164031740318403194032040321403224032340324403254032640327403284032940330403314033240333403344033540336403374033840339403404034140342403434034440345403464034740348403494035040351403524035340354403554035640357403584035940360403614036240363403644036540366403674036840369403704037140372403734037440375403764037740378403794038040381403824038340384403854038640387403884038940390403914039240393403944039540396403974039840399404004040140402404034040440405404064040740408404094041040411404124041340414404154041640417404184041940420404214042240423404244042540426404274042840429404304043140432404334043440435404364043740438404394044040441404424044340444404454044640447404484044940450404514045240453404544045540456404574045840459404604046140462404634046440465404664046740468404694047040471404724047340474404754047640477404784047940480404814048240483404844048540486404874048840489404904049140492404934049440495404964049740498404994050040501405024050340504405054050640507405084050940510405114051240513405144051540516405174051840519405204052140522405234052440525405264052740528405294053040531405324053340534405354053640537405384053940540405414054240543405444054540546405474054840549405504055140552405534055440555405564055740558405594056040561405624056340564405654056640567405684056940570405714057240573405744057540576405774057840579405804058140582405834058440585405864058740588405894059040591405924059340594405954059640597405984059940600406014060240603406044060540606406074060840609406104061140612406134061440615406164061740618406194062040621406224062340624406254062640627406284062940630406314063240633406344063540636406374063840639406404064140642406434064440645406464064740648406494065040651406524065340654406554065640657406584065940660406614066240663406644066540666406674066840669406704067140672406734067440675406764067740678406794068040681406824068340684406854068640687406884068940690406914069240693406944069540696406974069840699407004070140702407034070440705407064070740708407094071040711407124071340714407154071640717407184071940720407214072240723407244072540726407274072840729407304073140732407334073440735407364073740738407394074040741407424074340744407454074640747407484074940750407514075240753407544075540756407574075840759407604076140762407634076440765407664076740768407694077040771407724077340774407754077640777407784077940780407814078240783407844078540786407874078840789407904079140792407934079440795407964079740798407994080040801408024080340804408054080640807408084080940810408114081240813408144081540816408174081840819408204082140822408234082440825408264082740828408294083040831408324083340834408354083640837408384083940840408414084240843408444084540846408474084840849408504085140852408534085440855408564085740858408594086040861408624086340864408654086640867408684086940870408714087240873408744087540876408774087840879408804088140882408834088440885408864088740888408894089040891408924089340894408954089640897408984089940900409014090240903409044090540906409074090840909409104091140912409134091440915409164091740918409194092040921409224092340924409254092640927409284092940930409314093240933409344093540936409374093840939409404094140942409434094440945409464094740948409494095040951409524095340954409554095640957409584095940960409614096240963409644096540966409674096840969409704097140972409734097440975409764097740978409794098040981409824098340984409854098640987409884098940990409914099240993409944099540996409974099840999410004100141002410034100441005410064100741008410094101041011410124101341014410154101641017410184101941020410214102241023410244102541026410274102841029410304103141032410334103441035410364103741038410394104041041410424104341044410454104641047410484104941050410514105241053410544105541056410574105841059410604106141062410634106441065410664106741068410694107041071410724107341074410754107641077410784107941080410814108241083410844108541086410874108841089410904109141092410934109441095410964109741098410994110041101411024110341104411054110641107411084110941110411114111241113411144111541116411174111841119411204112141122411234112441125411264112741128411294113041131411324113341134411354113641137411384113941140411414114241143411444114541146411474114841149411504115141152411534115441155411564115741158411594116041161411624116341164411654116641167411684116941170411714117241173411744117541176411774117841179411804118141182411834118441185411864118741188411894119041191411924119341194411954119641197411984119941200412014120241203412044120541206412074120841209412104121141212412134121441215412164121741218412194122041221412224122341224412254122641227412284122941230412314123241233412344123541236412374123841239412404124141242412434124441245412464124741248412494125041251412524125341254412554125641257412584125941260412614126241263412644126541266412674126841269412704127141272412734127441275412764127741278412794128041281412824128341284412854128641287412884128941290412914129241293412944129541296412974129841299413004130141302413034130441305413064130741308413094131041311413124131341314413154131641317413184131941320413214132241323413244132541326413274132841329413304133141332413334133441335413364133741338413394134041341413424134341344413454134641347413484134941350413514135241353413544135541356413574135841359413604136141362413634136441365413664136741368413694137041371413724137341374413754137641377413784137941380413814138241383413844138541386413874138841389413904139141392413934139441395413964139741398413994140041401414024140341404414054140641407414084140941410414114141241413414144141541416414174141841419414204142141422414234142441425414264142741428414294143041431414324143341434414354143641437414384143941440414414144241443414444144541446414474144841449414504145141452414534145441455414564145741458414594146041461414624146341464414654146641467414684146941470414714147241473414744147541476414774147841479414804148141482414834148441485414864148741488414894149041491414924149341494414954149641497414984149941500415014150241503415044150541506415074150841509415104151141512415134151441515415164151741518415194152041521415224152341524415254152641527415284152941530415314153241533415344153541536415374153841539415404154141542415434154441545415464154741548415494155041551415524155341554415554155641557415584155941560415614156241563415644156541566415674156841569415704157141572415734157441575415764157741578415794158041581415824158341584415854158641587415884158941590415914159241593415944159541596415974159841599416004160141602416034160441605416064160741608416094161041611416124161341614416154161641617416184161941620416214162241623416244162541626416274162841629416304163141632416334163441635416364163741638416394164041641416424164341644416454164641647416484164941650416514165241653416544165541656416574165841659416604166141662416634166441665416664166741668416694167041671416724167341674416754167641677416784167941680416814168241683416844168541686416874168841689416904169141692416934169441695416964169741698416994170041701417024170341704417054170641707417084170941710417114171241713417144171541716417174171841719417204172141722417234172441725417264172741728417294173041731417324173341734417354173641737417384173941740417414174241743417444174541746417474174841749417504175141752417534175441755417564175741758417594176041761417624176341764417654176641767417684176941770417714177241773417744177541776417774177841779417804178141782417834178441785417864178741788417894179041791417924179341794417954179641797417984179941800418014180241803418044180541806418074180841809418104181141812418134181441815418164181741818418194182041821418224182341824418254182641827418284182941830418314183241833418344183541836418374183841839418404184141842418434184441845418464184741848418494185041851418524185341854418554185641857418584185941860418614186241863418644186541866418674186841869418704187141872418734187441875418764187741878418794188041881418824188341884418854188641887418884188941890418914189241893418944189541896418974189841899419004190141902419034190441905419064190741908419094191041911419124191341914419154191641917419184191941920419214192241923419244192541926419274192841929419304193141932419334193441935419364193741938419394194041941419424194341944419454194641947419484194941950419514195241953419544195541956419574195841959419604196141962419634196441965419664196741968419694197041971419724197341974419754197641977419784197941980419814198241983419844198541986419874198841989419904199141992419934199441995419964199741998419994200042001420024200342004420054200642007420084200942010420114201242013420144201542016420174201842019420204202142022420234202442025420264202742028420294203042031420324203342034420354203642037420384203942040420414204242043420444204542046420474204842049420504205142052420534205442055420564205742058420594206042061420624206342064420654206642067420684206942070420714207242073420744207542076420774207842079420804208142082420834208442085420864208742088420894209042091420924209342094420954209642097420984209942100421014210242103421044210542106421074210842109421104211142112421134211442115421164211742118421194212042121421224212342124421254212642127421284212942130421314213242133421344213542136421374213842139421404214142142421434214442145421464214742148421494215042151421524215342154421554215642157421584215942160421614216242163421644216542166421674216842169421704217142172421734217442175421764217742178421794218042181421824218342184421854218642187421884218942190421914219242193421944219542196421974219842199422004220142202422034220442205422064220742208422094221042211422124221342214422154221642217422184221942220422214222242223422244222542226422274222842229422304223142232422334223442235422364223742238422394224042241422424224342244422454224642247422484224942250422514225242253422544225542256422574225842259422604226142262422634226442265422664226742268422694227042271422724227342274422754227642277422784227942280422814228242283422844228542286422874228842289422904229142292422934229442295422964229742298422994230042301423024230342304423054230642307423084230942310423114231242313423144231542316423174231842319423204232142322423234232442325423264232742328423294233042331423324233342334423354233642337423384233942340423414234242343423444234542346423474234842349423504235142352423534235442355423564235742358423594236042361423624236342364423654236642367423684236942370423714237242373423744237542376423774237842379423804238142382423834238442385423864238742388423894239042391423924239342394423954239642397423984239942400424014240242403424044240542406424074240842409424104241142412424134241442415424164241742418424194242042421424224242342424424254242642427424284242942430424314243242433424344243542436424374243842439424404244142442424434244442445424464244742448424494245042451424524245342454424554245642457424584245942460424614246242463424644246542466424674246842469424704247142472424734247442475424764247742478424794248042481424824248342484424854248642487424884248942490424914249242493424944249542496424974249842499425004250142502425034250442505425064250742508425094251042511425124251342514425154251642517425184251942520425214252242523425244252542526425274252842529425304253142532425334253442535425364253742538425394254042541425424254342544425454254642547425484254942550425514255242553425544255542556425574255842559425604256142562425634256442565425664256742568425694257042571425724257342574425754257642577425784257942580425814258242583425844258542586425874258842589425904259142592425934259442595425964259742598425994260042601426024260342604426054260642607426084260942610426114261242613426144261542616426174261842619426204262142622426234262442625426264262742628426294263042631426324263342634426354263642637426384263942640426414264242643426444264542646426474264842649426504265142652426534265442655426564265742658426594266042661426624266342664426654266642667426684266942670426714267242673426744267542676426774267842679426804268142682426834268442685426864268742688426894269042691426924269342694426954269642697426984269942700427014270242703427044270542706427074270842709427104271142712427134271442715427164271742718427194272042721427224272342724427254272642727427284272942730427314273242733427344273542736427374273842739427404274142742427434274442745427464274742748427494275042751427524275342754427554275642757427584275942760427614276242763427644276542766427674276842769427704277142772427734277442775427764277742778427794278042781427824278342784427854278642787427884278942790427914279242793427944279542796427974279842799428004280142802428034280442805428064280742808428094281042811428124281342814428154281642817428184281942820428214282242823428244282542826428274282842829428304283142832428334283442835428364283742838428394284042841428424284342844428454284642847428484284942850428514285242853428544285542856428574285842859428604286142862428634286442865428664286742868428694287042871428724287342874428754287642877428784287942880428814288242883428844288542886428874288842889428904289142892428934289442895428964289742898428994290042901429024290342904429054290642907429084290942910429114291242913429144291542916429174291842919429204292142922429234292442925429264292742928429294293042931429324293342934429354293642937429384293942940429414294242943429444294542946429474294842949429504295142952429534295442955429564295742958429594296042961429624296342964429654296642967429684296942970429714297242973429744297542976429774297842979429804298142982429834298442985429864298742988429894299042991429924299342994429954299642997429984299943000430014300243003430044300543006430074300843009430104301143012430134301443015430164301743018430194302043021430224302343024430254302643027430284302943030430314303243033430344303543036430374303843039430404304143042430434304443045430464304743048430494305043051430524305343054430554305643057430584305943060430614306243063430644306543066430674306843069430704307143072430734307443075430764307743078430794308043081430824308343084430854308643087430884308943090430914309243093430944309543096430974309843099431004310143102431034310443105431064310743108431094311043111431124311343114431154311643117431184311943120431214312243123431244312543126431274312843129431304313143132431334313443135431364313743138431394314043141431424314343144431454314643147431484314943150431514315243153431544315543156431574315843159431604316143162431634316443165431664316743168431694317043171431724317343174431754317643177431784317943180431814318243183431844318543186431874318843189431904319143192431934319443195431964319743198431994320043201432024320343204432054320643207432084320943210432114321243213432144321543216432174321843219432204322143222432234322443225432264322743228432294323043231432324323343234432354323643237432384323943240432414324243243432444324543246432474324843249432504325143252432534325443255432564325743258432594326043261432624326343264432654326643267432684326943270432714327243273432744327543276432774327843279432804328143282432834328443285432864328743288432894329043291432924329343294432954329643297432984329943300433014330243303433044330543306433074330843309433104331143312433134331443315433164331743318433194332043321433224332343324433254332643327433284332943330433314333243333433344333543336433374333843339433404334143342433434334443345433464334743348433494335043351433524335343354433554335643357433584335943360433614336243363433644336543366433674336843369433704337143372433734337443375433764337743378433794338043381433824338343384433854338643387433884338943390433914339243393433944339543396433974339843399434004340143402434034340443405434064340743408434094341043411434124341343414434154341643417434184341943420434214342243423434244342543426434274342843429434304343143432434334343443435434364343743438434394344043441434424344343444434454344643447434484344943450434514345243453434544345543456434574345843459434604346143462434634346443465434664346743468434694347043471434724347343474434754347643477434784347943480434814348243483434844348543486434874348843489434904349143492434934349443495434964349743498434994350043501435024350343504435054350643507435084350943510435114351243513435144351543516435174351843519435204352143522435234352443525435264352743528435294353043531435324353343534435354353643537435384353943540435414354243543435444354543546435474354843549435504355143552435534355443555435564355743558435594356043561435624356343564435654356643567435684356943570435714357243573435744357543576435774357843579435804358143582435834358443585435864358743588435894359043591435924359343594435954359643597435984359943600436014360243603436044360543606436074360843609436104361143612436134361443615436164361743618436194362043621436224362343624436254362643627436284362943630436314363243633436344363543636436374363843639436404364143642436434364443645436464364743648436494365043651436524365343654436554365643657436584365943660436614366243663436644366543666436674366843669436704367143672436734367443675436764367743678436794368043681436824368343684436854368643687436884368943690436914369243693436944369543696436974369843699437004370143702437034370443705437064370743708437094371043711437124371343714437154371643717437184371943720437214372243723437244372543726437274372843729437304373143732437334373443735437364373743738437394374043741437424374343744437454374643747437484374943750437514375243753437544375543756437574375843759437604376143762437634376443765437664376743768437694377043771437724377343774437754377643777437784377943780437814378243783437844378543786437874378843789437904379143792437934379443795437964379743798437994380043801438024380343804438054380643807438084380943810438114381243813438144381543816438174381843819438204382143822438234382443825438264382743828438294383043831438324383343834438354383643837438384383943840438414384243843438444384543846438474384843849438504385143852438534385443855438564385743858438594386043861438624386343864438654386643867438684386943870438714387243873438744387543876438774387843879438804388143882438834388443885438864388743888438894389043891438924389343894438954389643897438984389943900439014390243903439044390543906439074390843909439104391143912439134391443915439164391743918439194392043921439224392343924439254392643927439284392943930439314393243933439344393543936439374393843939439404394143942439434394443945439464394743948439494395043951439524395343954439554395643957439584395943960439614396243963439644396543966439674396843969439704397143972439734397443975439764397743978439794398043981439824398343984439854398643987439884398943990439914399243993439944399543996439974399843999440004400144002440034400444005440064400744008440094401044011440124401344014440154401644017440184401944020440214402244023440244402544026440274402844029440304403144032440334403444035440364403744038440394404044041440424404344044440454404644047440484404944050440514405244053440544405544056440574405844059440604406144062440634406444065440664406744068440694407044071440724407344074440754407644077440784407944080440814408244083440844408544086440874408844089440904409144092440934409444095440964409744098440994410044101441024410344104441054410644107441084410944110441114411244113441144411544116441174411844119441204412144122441234412444125441264412744128441294413044131441324413344134441354413644137441384413944140441414414244143441444414544146441474414844149441504415144152441534415444155441564415744158441594416044161441624416344164441654416644167441684416944170441714417244173441744417544176441774417844179441804418144182441834418444185441864418744188441894419044191441924419344194441954419644197441984419944200442014420244203442044420544206442074420844209442104421144212442134421444215442164421744218442194422044221442224422344224442254422644227442284422944230442314423244233442344423544236442374423844239442404424144242442434424444245442464424744248442494425044251442524425344254442554425644257442584425944260442614426244263442644426544266442674426844269442704427144272442734427444275442764427744278442794428044281442824428344284442854428644287442884428944290442914429244293442944429544296442974429844299443004430144302443034430444305443064430744308443094431044311443124431344314443154431644317443184431944320443214432244323443244432544326443274432844329443304433144332443334433444335443364433744338443394434044341443424434344344443454434644347443484434944350443514435244353443544435544356443574435844359443604436144362443634436444365443664436744368443694437044371443724437344374443754437644377443784437944380443814438244383443844438544386443874438844389443904439144392443934439444395443964439744398443994440044401444024440344404444054440644407444084440944410444114441244413444144441544416444174441844419444204442144422444234442444425444264442744428444294443044431444324443344434444354443644437444384443944440444414444244443444444444544446444474444844449444504445144452444534445444455444564445744458444594446044461444624446344464444654446644467444684446944470444714447244473444744447544476444774447844479444804448144482444834448444485444864448744488444894449044491444924449344494444954449644497444984449944500445014450244503445044450544506445074450844509445104451144512445134451444515445164451744518445194452044521445224452344524445254452644527445284452944530445314453244533445344453544536445374453844539445404454144542445434454444545445464454744548445494455044551445524455344554445554455644557445584455944560445614456244563445644456544566445674456844569445704457144572445734457444575445764457744578445794458044581445824458344584445854458644587445884458944590445914459244593445944459544596445974459844599446004460144602446034460444605446064460744608446094461044611446124461344614446154461644617446184461944620446214462244623446244462544626446274462844629446304463144632446334463444635446364463744638446394464044641446424464344644446454464644647446484464944650446514465244653446544465544656446574465844659446604466144662446634466444665446664466744668446694467044671446724467344674446754467644677446784467944680446814468244683446844468544686446874468844689446904469144692446934469444695446964469744698446994470044701447024470344704447054470644707447084470944710447114471244713447144471544716447174471844719447204472144722447234472444725447264472744728447294473044731447324473344734447354473644737447384473944740447414474244743447444474544746447474474844749447504475144752447534475444755447564475744758447594476044761447624476344764447654476644767447684476944770447714477244773447744477544776447774477844779447804478144782447834478444785447864478744788447894479044791447924479344794447954479644797447984479944800448014480244803448044480544806448074480844809448104481144812448134481444815448164481744818448194482044821448224482344824448254482644827448284482944830448314483244833448344483544836448374483844839448404484144842448434484444845448464484744848448494485044851448524485344854448554485644857448584485944860448614486244863448644486544866448674486844869448704487144872448734487444875448764487744878448794488044881448824488344884448854488644887448884488944890448914489244893448944489544896448974489844899449004490144902449034490444905449064490744908449094491044911449124491344914449154491644917449184491944920449214492244923449244492544926449274492844929449304493144932449334493444935449364493744938449394494044941449424494344944449454494644947449484494944950449514495244953449544495544956449574495844959449604496144962449634496444965449664496744968449694497044971449724497344974449754497644977449784497944980449814498244983449844498544986449874498844989449904499144992449934499444995449964499744998449994500045001450024500345004450054500645007450084500945010450114501245013450144501545016450174501845019450204502145022450234502445025450264502745028450294503045031450324503345034450354503645037450384503945040450414504245043450444504545046450474504845049450504505145052450534505445055450564505745058450594506045061450624506345064450654506645067450684506945070450714507245073450744507545076450774507845079450804508145082450834508445085450864508745088450894509045091450924509345094450954509645097450984509945100451014510245103451044510545106451074510845109451104511145112451134511445115451164511745118451194512045121451224512345124451254512645127451284512945130451314513245133451344513545136451374513845139451404514145142451434514445145451464514745148451494515045151451524515345154451554515645157451584515945160451614516245163451644516545166451674516845169451704517145172451734517445175451764517745178451794518045181451824518345184451854518645187451884518945190451914519245193451944519545196451974519845199452004520145202452034520445205452064520745208452094521045211452124521345214452154521645217452184521945220452214522245223452244522545226452274522845229452304523145232452334523445235452364523745238452394524045241452424524345244452454524645247452484524945250452514525245253452544525545256452574525845259452604526145262452634526445265452664526745268452694527045271452724527345274452754527645277452784527945280452814528245283452844528545286452874528845289452904529145292452934529445295452964529745298452994530045301453024530345304453054530645307453084530945310453114531245313453144531545316453174531845319453204532145322453234532445325453264532745328453294533045331453324533345334453354533645337453384533945340453414534245343453444534545346453474534845349453504535145352453534535445355453564535745358453594536045361453624536345364453654536645367453684536945370453714537245373453744537545376453774537845379453804538145382453834538445385453864538745388453894539045391453924539345394453954539645397453984539945400454014540245403454044540545406454074540845409454104541145412454134541445415454164541745418454194542045421454224542345424454254542645427454284542945430454314543245433454344543545436454374543845439454404544145442454434544445445454464544745448454494545045451454524545345454454554545645457454584545945460454614546245463454644546545466454674546845469454704547145472454734547445475454764547745478454794548045481454824548345484454854548645487454884548945490454914549245493454944549545496454974549845499455004550145502455034550445505455064550745508455094551045511455124551345514455154551645517455184551945520455214552245523455244552545526455274552845529455304553145532455334553445535455364553745538455394554045541455424554345544455454554645547455484554945550455514555245553455544555545556455574555845559455604556145562455634556445565455664556745568455694557045571455724557345574455754557645577455784557945580455814558245583455844558545586455874558845589455904559145592455934559445595455964559745598455994560045601456024560345604456054560645607456084560945610456114561245613456144561545616456174561845619456204562145622456234562445625456264562745628456294563045631456324563345634456354563645637456384563945640456414564245643456444564545646456474564845649456504565145652456534565445655456564565745658456594566045661456624566345664456654566645667456684566945670456714567245673456744567545676456774567845679456804568145682456834568445685456864568745688456894569045691456924569345694456954569645697456984569945700457014570245703457044570545706457074570845709457104571145712457134571445715457164571745718457194572045721457224572345724457254572645727457284572945730457314573245733457344573545736457374573845739457404574145742457434574445745457464574745748457494575045751457524575345754457554575645757457584575945760457614576245763457644576545766457674576845769457704577145772457734577445775457764577745778457794578045781457824578345784457854578645787457884578945790457914579245793457944579545796457974579845799458004580145802458034580445805458064580745808458094581045811458124581345814458154581645817458184581945820458214582245823458244582545826458274582845829458304583145832458334583445835458364583745838458394584045841458424584345844458454584645847458484584945850458514585245853458544585545856458574585845859458604586145862458634586445865458664586745868458694587045871458724587345874458754587645877458784587945880458814588245883458844588545886458874588845889458904589145892458934589445895458964589745898458994590045901459024590345904459054590645907459084590945910459114591245913459144591545916459174591845919459204592145922459234592445925459264592745928459294593045931459324593345934459354593645937459384593945940459414594245943459444594545946459474594845949459504595145952459534595445955459564595745958459594596045961459624596345964459654596645967459684596945970459714597245973459744597545976459774597845979459804598145982459834598445985459864598745988459894599045991459924599345994459954599645997459984599946000460014600246003460044600546006460074600846009460104601146012460134601446015460164601746018460194602046021460224602346024460254602646027460284602946030460314603246033460344603546036460374603846039460404604146042460434604446045460464604746048460494605046051460524605346054460554605646057460584605946060460614606246063460644606546066460674606846069460704607146072460734607446075460764607746078460794608046081460824608346084460854608646087460884608946090460914609246093460944609546096460974609846099461004610146102461034610446105461064610746108461094611046111461124611346114461154611646117461184611946120461214612246123461244612546126461274612846129461304613146132461334613446135461364613746138461394614046141461424614346144461454614646147461484614946150461514615246153461544615546156461574615846159461604616146162461634616446165461664616746168461694617046171461724617346174461754617646177461784617946180461814618246183461844618546186461874618846189461904619146192461934619446195461964619746198461994620046201462024620346204462054620646207462084620946210462114621246213462144621546216462174621846219462204622146222462234622446225462264622746228462294623046231462324623346234462354623646237462384623946240462414624246243462444624546246462474624846249462504625146252462534625446255462564625746258462594626046261462624626346264462654626646267462684626946270462714627246273462744627546276462774627846279462804628146282462834628446285462864628746288462894629046291462924629346294462954629646297462984629946300463014630246303463044630546306463074630846309463104631146312463134631446315463164631746318463194632046321463224632346324463254632646327463284632946330463314633246333463344633546336463374633846339463404634146342463434634446345463464634746348463494635046351463524635346354463554635646357463584635946360463614636246363463644636546366463674636846369463704637146372463734637446375463764637746378463794638046381463824638346384463854638646387463884638946390463914639246393463944639546396463974639846399464004640146402464034640446405464064640746408464094641046411464124641346414464154641646417464184641946420464214642246423464244642546426464274642846429464304643146432464334643446435464364643746438464394644046441464424644346444464454644646447464484644946450464514645246453464544645546456464574645846459464604646146462464634646446465464664646746468464694647046471464724647346474464754647646477464784647946480464814648246483464844648546486464874648846489464904649146492464934649446495464964649746498464994650046501465024650346504465054650646507465084650946510465114651246513465144651546516465174651846519465204652146522465234652446525465264652746528465294653046531465324653346534465354653646537465384653946540465414654246543465444654546546465474654846549465504655146552465534655446555465564655746558465594656046561465624656346564465654656646567465684656946570465714657246573465744657546576465774657846579465804658146582465834658446585465864658746588465894659046591465924659346594465954659646597465984659946600466014660246603466044660546606466074660846609466104661146612466134661446615466164661746618466194662046621466224662346624466254662646627466284662946630466314663246633466344663546636466374663846639466404664146642466434664446645466464664746648466494665046651466524665346654466554665646657466584665946660466614666246663466644666546666466674666846669466704667146672466734667446675466764667746678466794668046681466824668346684466854668646687466884668946690466914669246693466944669546696466974669846699467004670146702467034670446705467064670746708467094671046711467124671346714467154671646717467184671946720467214672246723467244672546726467274672846729467304673146732467334673446735467364673746738467394674046741467424674346744467454674646747467484674946750467514675246753467544675546756467574675846759467604676146762467634676446765467664676746768467694677046771467724677346774467754677646777467784677946780467814678246783467844678546786467874678846789467904679146792467934679446795467964679746798467994680046801468024680346804468054680646807468084680946810468114681246813468144681546816468174681846819468204682146822468234682446825468264682746828468294683046831468324683346834468354683646837468384683946840468414684246843468444684546846468474684846849468504685146852468534685446855468564685746858468594686046861468624686346864468654686646867468684686946870468714687246873468744687546876468774687846879468804688146882468834688446885468864688746888468894689046891468924689346894468954689646897468984689946900469014690246903469044690546906469074690846909469104691146912469134691446915469164691746918469194692046921469224692346924469254692646927469284692946930469314693246933469344693546936469374693846939469404694146942469434694446945469464694746948469494695046951469524695346954469554695646957469584695946960469614696246963469644696546966469674696846969469704697146972469734697446975469764697746978469794698046981469824698346984469854698646987469884698946990469914699246993469944699546996469974699846999470004700147002470034700447005470064700747008470094701047011470124701347014470154701647017470184701947020470214702247023470244702547026470274702847029470304703147032470334703447035470364703747038470394704047041470424704347044470454704647047470484704947050470514705247053470544705547056470574705847059470604706147062470634706447065470664706747068470694707047071470724707347074470754707647077470784707947080470814708247083470844708547086470874708847089470904709147092470934709447095470964709747098470994710047101471024710347104471054710647107471084710947110471114711247113471144711547116471174711847119471204712147122471234712447125471264712747128471294713047131471324713347134471354713647137471384713947140471414714247143471444714547146471474714847149471504715147152471534715447155471564715747158471594716047161471624716347164471654716647167471684716947170471714717247173471744717547176471774717847179471804718147182471834718447185471864718747188471894719047191471924719347194471954719647197471984719947200472014720247203472044720547206472074720847209472104721147212472134721447215472164721747218472194722047221472224722347224472254722647227472284722947230472314723247233472344723547236472374723847239472404724147242472434724447245472464724747248472494725047251472524725347254472554725647257472584725947260472614726247263472644726547266472674726847269472704727147272472734727447275472764727747278472794728047281472824728347284472854728647287472884728947290472914729247293472944729547296472974729847299473004730147302473034730447305473064730747308473094731047311473124731347314473154731647317473184731947320473214732247323473244732547326473274732847329473304733147332473334733447335473364733747338473394734047341473424734347344473454734647347473484734947350473514735247353473544735547356473574735847359473604736147362473634736447365473664736747368473694737047371473724737347374473754737647377473784737947380473814738247383473844738547386473874738847389473904739147392473934739447395473964739747398473994740047401474024740347404474054740647407474084740947410474114741247413474144741547416474174741847419474204742147422474234742447425474264742747428474294743047431474324743347434474354743647437474384743947440474414744247443474444744547446474474744847449474504745147452474534745447455474564745747458474594746047461474624746347464474654746647467474684746947470474714747247473474744747547476474774747847479474804748147482474834748447485474864748747488474894749047491474924749347494474954749647497474984749947500475014750247503475044750547506475074750847509475104751147512475134751447515475164751747518475194752047521475224752347524475254752647527475284752947530475314753247533475344753547536475374753847539475404754147542475434754447545475464754747548475494755047551475524755347554475554755647557475584755947560475614756247563475644756547566475674756847569475704757147572475734757447575475764757747578475794758047581475824758347584475854758647587475884758947590475914759247593475944759547596475974759847599476004760147602476034760447605476064760747608476094761047611476124761347614476154761647617476184761947620476214762247623476244762547626476274762847629476304763147632476334763447635476364763747638476394764047641476424764347644476454764647647476484764947650476514765247653476544765547656476574765847659476604766147662476634766447665476664766747668476694767047671476724767347674476754767647677476784767947680476814768247683476844768547686476874768847689476904769147692476934769447695476964769747698476994770047701477024770347704477054770647707477084770947710477114771247713477144771547716477174771847719477204772147722477234772447725477264772747728477294773047731477324773347734477354773647737477384773947740477414774247743477444774547746477474774847749477504775147752477534775447755477564775747758477594776047761477624776347764477654776647767477684776947770477714777247773477744777547776477774777847779477804778147782477834778447785477864778747788477894779047791477924779347794477954779647797477984779947800478014780247803478044780547806478074780847809478104781147812478134781447815478164781747818478194782047821478224782347824478254782647827478284782947830478314783247833478344783547836478374783847839478404784147842478434784447845478464784747848478494785047851478524785347854478554785647857478584785947860478614786247863478644786547866478674786847869478704787147872478734787447875478764787747878478794788047881478824788347884478854788647887478884788947890478914789247893478944789547896478974789847899479004790147902479034790447905479064790747908479094791047911479124791347914479154791647917479184791947920479214792247923479244792547926479274792847929479304793147932479334793447935479364793747938479394794047941479424794347944479454794647947479484794947950479514795247953479544795547956479574795847959479604796147962479634796447965479664796747968479694797047971479724797347974479754797647977479784797947980479814798247983479844798547986479874798847989479904799147992479934799447995479964799747998479994800048001480024800348004480054800648007480084800948010480114801248013480144801548016480174801848019480204802148022480234802448025480264802748028480294803048031480324803348034480354803648037480384803948040480414804248043480444804548046480474804848049480504805148052480534805448055480564805748058480594806048061480624806348064480654806648067480684806948070480714807248073480744807548076480774807848079480804808148082480834808448085480864808748088480894809048091480924809348094480954809648097480984809948100481014810248103481044810548106481074810848109481104811148112481134811448115481164811748118481194812048121481224812348124481254812648127481284812948130481314813248133481344813548136481374813848139481404814148142481434814448145481464814748148481494815048151481524815348154481554815648157481584815948160481614816248163481644816548166481674816848169481704817148172481734817448175481764817748178481794818048181481824818348184481854818648187481884818948190481914819248193481944819548196481974819848199482004820148202482034820448205482064820748208482094821048211482124821348214482154821648217482184821948220482214822248223482244822548226482274822848229482304823148232482334823448235482364823748238482394824048241482424824348244482454824648247482484824948250482514825248253482544825548256482574825848259482604826148262482634826448265482664826748268482694827048271482724827348274482754827648277482784827948280482814828248283482844828548286482874828848289482904829148292482934829448295482964829748298482994830048301483024830348304483054830648307483084830948310483114831248313483144831548316483174831848319483204832148322483234832448325483264832748328483294833048331483324833348334483354833648337483384833948340483414834248343483444834548346483474834848349483504835148352483534835448355483564835748358483594836048361483624836348364483654836648367483684836948370483714837248373483744837548376483774837848379483804838148382483834838448385483864838748388483894839048391483924839348394483954839648397483984839948400484014840248403484044840548406484074840848409484104841148412484134841448415484164841748418484194842048421484224842348424484254842648427484284842948430484314843248433484344843548436484374843848439484404844148442484434844448445484464844748448484494845048451484524845348454484554845648457484584845948460484614846248463484644846548466484674846848469484704847148472484734847448475484764847748478484794848048481484824848348484484854848648487484884848948490484914849248493484944849548496484974849848499485004850148502485034850448505485064850748508485094851048511485124851348514485154851648517485184851948520485214852248523485244852548526485274852848529485304853148532485334853448535485364853748538485394854048541485424854348544485454854648547485484854948550485514855248553485544855548556485574855848559485604856148562485634856448565485664856748568485694857048571485724857348574485754857648577485784857948580485814858248583485844858548586485874858848589485904859148592485934859448595485964859748598485994860048601486024860348604486054860648607486084860948610486114861248613486144861548616486174861848619486204862148622486234862448625486264862748628486294863048631486324863348634486354863648637486384863948640486414864248643486444864548646486474864848649486504865148652486534865448655486564865748658486594866048661486624866348664486654866648667486684866948670486714867248673486744867548676486774867848679486804868148682486834868448685486864868748688486894869048691486924869348694486954869648697486984869948700487014870248703487044870548706487074870848709487104871148712487134871448715487164871748718487194872048721487224872348724487254872648727487284872948730487314873248733487344873548736487374873848739487404874148742487434874448745487464874748748487494875048751487524875348754487554875648757487584875948760487614876248763487644876548766487674876848769487704877148772487734877448775487764877748778487794878048781487824878348784487854878648787487884878948790487914879248793487944879548796487974879848799488004880148802488034880448805488064880748808488094881048811488124881348814488154881648817488184881948820488214882248823488244882548826488274882848829488304883148832488334883448835488364883748838488394884048841488424884348844488454884648847488484884948850488514885248853488544885548856488574885848859488604886148862488634886448865488664886748868488694887048871488724887348874488754887648877488784887948880488814888248883488844888548886488874888848889488904889148892488934889448895488964889748898488994890048901489024890348904489054890648907489084890948910489114891248913489144891548916489174891848919489204892148922489234892448925489264892748928489294893048931489324893348934489354893648937489384893948940489414894248943489444894548946489474894848949489504895148952489534895448955489564895748958489594896048961489624896348964489654896648967489684896948970489714897248973489744897548976489774897848979489804898148982489834898448985489864898748988489894899048991489924899348994489954899648997489984899949000490014900249003490044900549006490074900849009490104901149012490134901449015490164901749018490194902049021490224902349024490254902649027490284902949030490314903249033490344903549036490374903849039490404904149042490434904449045490464904749048490494905049051490524905349054490554905649057490584905949060490614906249063490644906549066490674906849069490704907149072490734907449075490764907749078490794908049081490824908349084490854908649087490884908949090490914909249093490944909549096490974909849099491004910149102491034910449105491064910749108491094911049111491124911349114491154911649117491184911949120491214912249123491244912549126491274912849129491304913149132491334913449135491364913749138491394914049141491424914349144491454914649147491484914949150491514915249153491544915549156491574915849159491604916149162491634916449165491664916749168491694917049171491724917349174491754917649177491784917949180491814918249183491844918549186491874918849189491904919149192491934919449195491964919749198491994920049201492024920349204492054920649207492084920949210492114921249213492144921549216492174921849219492204922149222492234922449225492264922749228492294923049231492324923349234492354923649237492384923949240492414924249243492444924549246492474924849249492504925149252492534925449255492564925749258492594926049261492624926349264492654926649267492684926949270492714927249273492744927549276492774927849279492804928149282492834928449285492864928749288492894929049291492924929349294492954929649297492984929949300493014930249303493044930549306493074930849309493104931149312493134931449315493164931749318493194932049321493224932349324493254932649327493284932949330493314933249333493344933549336493374933849339493404934149342493434934449345493464934749348493494935049351493524935349354493554935649357493584935949360493614936249363493644936549366493674936849369493704937149372493734937449375493764937749378493794938049381493824938349384493854938649387493884938949390493914939249393493944939549396493974939849399494004940149402494034940449405494064940749408494094941049411494124941349414494154941649417494184941949420494214942249423494244942549426494274942849429494304943149432494334943449435494364943749438494394944049441494424944349444494454944649447494484944949450494514945249453494544945549456494574945849459494604946149462494634946449465494664946749468494694947049471494724947349474494754947649477494784947949480494814948249483494844948549486494874948849489494904949149492494934949449495494964949749498494994950049501495024950349504495054950649507495084950949510495114951249513495144951549516495174951849519495204952149522495234952449525495264952749528495294953049531495324953349534495354953649537495384953949540495414954249543495444954549546495474954849549495504955149552495534955449555495564955749558495594956049561495624956349564495654956649567495684956949570495714957249573495744957549576495774957849579495804958149582495834958449585495864958749588495894959049591495924959349594495954959649597495984959949600496014960249603496044960549606496074960849609496104961149612496134961449615496164961749618496194962049621496224962349624496254962649627496284962949630496314963249633496344963549636496374963849639496404964149642496434964449645496464964749648496494965049651496524965349654496554965649657496584965949660496614966249663496644966549666496674966849669496704967149672496734967449675496764967749678496794968049681496824968349684496854968649687496884968949690496914969249693496944969549696496974969849699497004970149702497034970449705497064970749708497094971049711497124971349714497154971649717497184971949720497214972249723497244972549726497274972849729497304973149732497334973449735497364973749738497394974049741497424974349744497454974649747497484974949750497514975249753497544975549756497574975849759497604976149762497634976449765497664976749768497694977049771497724977349774497754977649777497784977949780497814978249783497844978549786497874978849789497904979149792497934979449795497964979749798497994980049801498024980349804498054980649807498084980949810498114981249813498144981549816498174981849819498204982149822498234982449825498264982749828498294983049831498324983349834498354983649837498384983949840498414984249843498444984549846498474984849849498504985149852498534985449855498564985749858498594986049861498624986349864498654986649867498684986949870498714987249873498744987549876498774987849879498804988149882498834988449885498864988749888498894989049891498924989349894498954989649897498984989949900499014990249903499044990549906499074990849909499104991149912499134991449915499164991749918499194992049921499224992349924499254992649927499284992949930499314993249933499344993549936499374993849939499404994149942499434994449945499464994749948499494995049951499524995349954499554995649957499584995949960499614996249963499644996549966499674996849969499704997149972499734997449975499764997749978499794998049981499824998349984499854998649987499884998949990499914999249993499944999549996499974999849999500005000150002500035000450005500065000750008500095001050011500125001350014500155001650017500185001950020500215002250023500245002550026500275002850029500305003150032500335003450035500365003750038500395004050041500425004350044500455004650047500485004950050500515005250053500545005550056500575005850059500605006150062500635006450065500665006750068500695007050071500725007350074500755007650077500785007950080500815008250083500845008550086500875008850089500905009150092500935009450095500965009750098500995010050101501025010350104501055010650107501085010950110501115011250113501145011550116501175011850119501205012150122501235012450125501265012750128501295013050131501325013350134501355013650137501385013950140501415014250143501445014550146501475014850149501505015150152501535015450155501565015750158501595016050161501625016350164501655016650167501685016950170501715017250173501745017550176501775017850179501805018150182501835018450185501865018750188501895019050191501925019350194501955019650197501985019950200502015020250203502045020550206502075020850209502105021150212502135021450215502165021750218502195022050221502225022350224502255022650227502285022950230502315023250233502345023550236502375023850239502405024150242502435024450245502465024750248502495025050251502525025350254502555025650257502585025950260502615026250263502645026550266502675026850269502705027150272502735027450275502765027750278502795028050281502825028350284502855028650287502885028950290502915029250293502945029550296502975029850299503005030150302503035030450305503065030750308503095031050311503125031350314503155031650317503185031950320503215032250323503245032550326503275032850329503305033150332503335033450335503365033750338503395034050341503425034350344503455034650347503485034950350503515035250353503545035550356503575035850359503605036150362503635036450365503665036750368503695037050371503725037350374503755037650377503785037950380503815038250383503845038550386503875038850389503905039150392503935039450395503965039750398503995040050401504025040350404504055040650407504085040950410504115041250413504145041550416504175041850419504205042150422504235042450425504265042750428504295043050431504325043350434504355043650437504385043950440504415044250443504445044550446504475044850449504505045150452504535045450455504565045750458504595046050461504625046350464504655046650467504685046950470504715047250473504745047550476504775047850479504805048150482504835048450485504865048750488504895049050491504925049350494504955049650497504985049950500505015050250503505045050550506505075050850509505105051150512505135051450515505165051750518505195052050521505225052350524505255052650527505285052950530505315053250533505345053550536505375053850539505405054150542505435054450545505465054750548505495055050551505525055350554505555055650557505585055950560505615056250563505645056550566505675056850569505705057150572505735057450575505765057750578505795058050581505825058350584505855058650587505885058950590505915059250593505945059550596505975059850599506005060150602506035060450605506065060750608506095061050611506125061350614506155061650617506185061950620506215062250623506245062550626506275062850629506305063150632506335063450635506365063750638506395064050641506425064350644506455064650647506485064950650506515065250653506545065550656506575065850659506605066150662506635066450665506665066750668506695067050671506725067350674506755067650677506785067950680506815068250683506845068550686506875068850689506905069150692506935069450695506965069750698506995070050701507025070350704507055070650707507085070950710507115071250713507145071550716507175071850719507205072150722507235072450725507265072750728507295073050731507325073350734507355073650737507385073950740507415074250743507445074550746507475074850749507505075150752507535075450755507565075750758507595076050761507625076350764507655076650767507685076950770507715077250773507745077550776507775077850779507805078150782507835078450785507865078750788507895079050791507925079350794507955079650797507985079950800508015080250803508045080550806508075080850809508105081150812508135081450815508165081750818508195082050821508225082350824508255082650827508285082950830508315083250833508345083550836508375083850839508405084150842508435084450845508465084750848508495085050851508525085350854508555085650857508585085950860508615086250863508645086550866508675086850869508705087150872508735087450875508765087750878508795088050881508825088350884508855088650887508885088950890508915089250893508945089550896508975089850899509005090150902509035090450905509065090750908509095091050911509125091350914509155091650917509185091950920509215092250923509245092550926509275092850929509305093150932509335093450935509365093750938509395094050941509425094350944509455094650947509485094950950509515095250953509545095550956509575095850959509605096150962509635096450965509665096750968509695097050971509725097350974509755097650977509785097950980509815098250983509845098550986509875098850989509905099150992509935099450995509965099750998509995100051001510025100351004510055100651007510085100951010510115101251013510145101551016510175101851019510205102151022510235102451025510265102751028510295103051031510325103351034510355103651037510385103951040510415104251043510445104551046510475104851049510505105151052510535105451055510565105751058510595106051061510625106351064510655106651067510685106951070510715107251073510745107551076510775107851079510805108151082510835108451085510865108751088510895109051091510925109351094510955109651097510985109951100511015110251103511045110551106511075110851109511105111151112511135111451115511165111751118511195112051121511225112351124511255112651127511285112951130511315113251133511345113551136511375113851139511405114151142511435114451145511465114751148511495115051151511525115351154511555115651157511585115951160511615116251163511645116551166511675116851169511705117151172511735117451175511765117751178511795118051181511825118351184511855118651187511885118951190511915119251193511945119551196511975119851199512005120151202512035120451205512065120751208512095121051211512125121351214512155121651217512185121951220512215122251223512245122551226512275122851229512305123151232512335123451235512365123751238512395124051241512425124351244512455124651247512485124951250512515125251253512545125551256512575125851259512605126151262512635126451265512665126751268512695127051271512725127351274512755127651277512785127951280512815128251283512845128551286512875128851289512905129151292512935129451295512965129751298512995130051301513025130351304513055130651307513085130951310513115131251313513145131551316513175131851319513205132151322513235132451325513265132751328513295133051331513325133351334513355133651337513385133951340513415134251343513445134551346513475134851349513505135151352513535135451355513565135751358513595136051361513625136351364513655136651367513685136951370513715137251373513745137551376513775137851379513805138151382513835138451385513865138751388513895139051391513925139351394513955139651397513985139951400514015140251403514045140551406514075140851409514105141151412514135141451415514165141751418514195142051421514225142351424514255142651427514285142951430514315143251433514345143551436514375143851439514405144151442514435144451445514465144751448514495145051451514525145351454514555145651457514585145951460514615146251463514645146551466514675146851469514705147151472514735147451475514765147751478514795148051481514825148351484514855148651487514885148951490514915149251493514945149551496514975149851499515005150151502515035150451505515065150751508515095151051511515125151351514515155151651517515185151951520515215152251523515245152551526515275152851529515305153151532515335153451535515365153751538515395154051541515425154351544515455154651547515485154951550515515155251553515545155551556515575155851559515605156151562515635156451565515665156751568515695157051571515725157351574515755157651577515785157951580515815158251583515845158551586515875158851589515905159151592515935159451595515965159751598515995160051601516025160351604516055160651607516085160951610516115161251613516145161551616516175161851619516205162151622516235162451625516265162751628516295163051631516325163351634516355163651637516385163951640516415164251643516445164551646516475164851649516505165151652516535165451655516565165751658516595166051661516625166351664516655166651667516685166951670516715167251673516745167551676516775167851679516805168151682516835168451685516865168751688516895169051691516925169351694516955169651697516985169951700517015170251703517045170551706517075170851709517105171151712517135171451715517165171751718517195172051721517225172351724517255172651727517285172951730517315173251733517345173551736517375173851739517405174151742517435174451745517465174751748517495175051751517525175351754517555175651757517585175951760517615176251763517645176551766517675176851769517705177151772517735177451775517765177751778517795178051781517825178351784517855178651787517885178951790517915179251793517945179551796517975179851799518005180151802518035180451805518065180751808518095181051811518125181351814518155181651817518185181951820518215182251823518245182551826518275182851829518305183151832518335183451835518365183751838518395184051841518425184351844518455184651847518485184951850518515185251853518545185551856518575185851859518605186151862518635186451865518665186751868518695187051871518725187351874518755187651877518785187951880518815188251883518845188551886518875188851889518905189151892518935189451895518965189751898518995190051901519025190351904519055190651907519085190951910519115191251913519145191551916519175191851919519205192151922519235192451925519265192751928519295193051931519325193351934519355193651937519385193951940519415194251943519445194551946519475194851949519505195151952519535195451955519565195751958519595196051961519625196351964519655196651967519685196951970519715197251973519745197551976519775197851979519805198151982519835198451985519865198751988519895199051991519925199351994519955199651997519985199952000520015200252003520045200552006520075200852009520105201152012520135201452015520165201752018520195202052021520225202352024520255202652027520285202952030520315203252033520345203552036520375203852039520405204152042520435204452045520465204752048520495205052051520525205352054520555205652057520585205952060520615206252063520645206552066520675206852069520705207152072520735207452075520765207752078520795208052081520825208352084520855208652087520885208952090520915209252093520945209552096520975209852099521005210152102521035210452105521065210752108521095211052111521125211352114521155211652117521185211952120521215212252123521245212552126521275212852129521305213152132521335213452135521365213752138521395214052141521425214352144521455214652147521485214952150521515215252153521545215552156521575215852159521605216152162521635216452165521665216752168521695217052171521725217352174521755217652177521785217952180521815218252183521845218552186521875218852189521905219152192521935219452195521965219752198521995220052201522025220352204522055220652207522085220952210522115221252213522145221552216522175221852219522205222152222522235222452225522265222752228522295223052231522325223352234522355223652237522385223952240522415224252243522445224552246522475224852249522505225152252522535225452255522565225752258522595226052261522625226352264522655226652267522685226952270522715227252273522745227552276522775227852279522805228152282522835228452285522865228752288522895229052291522925229352294522955229652297522985229952300523015230252303523045230552306523075230852309523105231152312523135231452315523165231752318523195232052321523225232352324523255232652327523285232952330523315233252333523345233552336523375233852339523405234152342523435234452345523465234752348523495235052351523525235352354523555235652357523585235952360523615236252363523645236552366523675236852369523705237152372523735237452375523765237752378523795238052381523825238352384523855238652387523885238952390523915239252393523945239552396523975239852399524005240152402524035240452405524065240752408524095241052411524125241352414524155241652417524185241952420524215242252423524245242552426524275242852429524305243152432524335243452435524365243752438524395244052441524425244352444524455244652447524485244952450524515245252453524545245552456524575245852459524605246152462524635246452465524665246752468524695247052471524725247352474524755247652477524785247952480524815248252483524845248552486524875248852489524905249152492524935249452495524965249752498524995250052501525025250352504525055250652507525085250952510525115251252513525145251552516525175251852519525205252152522525235252452525525265252752528525295253052531525325253352534525355253652537525385253952540525415254252543525445254552546525475254852549525505255152552525535255452555525565255752558525595256052561525625256352564525655256652567525685256952570525715257252573525745257552576525775257852579525805258152582525835258452585525865258752588525895259052591525925259352594525955259652597525985259952600526015260252603526045260552606526075260852609526105261152612526135261452615526165261752618526195262052621526225262352624526255262652627526285262952630526315263252633526345263552636526375263852639526405264152642526435264452645526465264752648526495265052651526525265352654526555265652657526585265952660526615266252663526645266552666526675266852669526705267152672526735267452675526765267752678526795268052681526825268352684526855268652687526885268952690526915269252693526945269552696526975269852699527005270152702527035270452705527065270752708527095271052711527125271352714527155271652717527185271952720527215272252723527245272552726527275272852729527305273152732527335273452735527365273752738527395274052741527425274352744527455274652747527485274952750527515275252753527545275552756527575275852759527605276152762527635276452765527665276752768527695277052771527725277352774527755277652777527785277952780527815278252783527845278552786527875278852789527905279152792527935279452795527965279752798527995280052801528025280352804528055280652807528085280952810528115281252813528145281552816528175281852819528205282152822528235282452825528265282752828528295283052831528325283352834528355283652837528385283952840528415284252843528445284552846528475284852849528505285152852528535285452855528565285752858528595286052861528625286352864528655286652867528685286952870528715287252873528745287552876528775287852879528805288152882528835288452885528865288752888528895289052891528925289352894528955289652897528985289952900529015290252903529045290552906529075290852909529105291152912529135291452915529165291752918529195292052921529225292352924529255292652927529285292952930529315293252933529345293552936529375293852939529405294152942529435294452945529465294752948529495295052951529525295352954529555295652957529585295952960529615296252963529645296552966529675296852969529705297152972529735297452975529765297752978529795298052981529825298352984529855298652987529885298952990529915299252993529945299552996529975299852999530005300153002530035300453005530065300753008530095301053011530125301353014530155301653017530185301953020530215302253023530245302553026530275302853029530305303153032530335303453035530365303753038530395304053041530425304353044530455304653047530485304953050530515305253053530545305553056530575305853059530605306153062530635306453065530665306753068530695307053071530725307353074530755307653077530785307953080530815308253083530845308553086530875308853089530905309153092530935309453095530965309753098530995310053101531025310353104531055310653107531085310953110531115311253113531145311553116531175311853119531205312153122531235312453125531265312753128531295313053131531325313353134531355313653137531385313953140531415314253143531445314553146531475314853149531505315153152531535315453155531565315753158531595316053161531625316353164531655316653167531685316953170531715317253173531745317553176531775317853179531805318153182531835318453185531865318753188531895319053191531925319353194531955319653197531985319953200532015320253203532045320553206532075320853209532105321153212532135321453215532165321753218532195322053221532225322353224532255322653227532285322953230532315323253233532345323553236532375323853239532405324153242532435324453245532465324753248532495325053251532525325353254532555325653257532585325953260532615326253263532645326553266532675326853269532705327153272532735327453275532765327753278532795328053281532825328353284532855328653287532885328953290532915329253293532945329553296532975329853299533005330153302533035330453305533065330753308533095331053311533125331353314533155331653317533185331953320533215332253323533245332553326533275332853329533305333153332533335333453335533365333753338533395334053341533425334353344533455334653347533485334953350533515335253353533545335553356533575335853359533605336153362533635336453365533665336753368533695337053371533725337353374533755337653377533785337953380533815338253383533845338553386533875338853389533905339153392533935339453395533965339753398533995340053401534025340353404534055340653407534085340953410534115341253413534145341553416534175341853419534205342153422534235342453425534265342753428534295343053431534325343353434534355343653437534385343953440534415344253443534445344553446534475344853449534505345153452534535345453455534565345753458534595346053461534625346353464534655346653467534685346953470534715347253473534745347553476534775347853479534805348153482534835348453485534865348753488534895349053491534925349353494534955349653497534985349953500535015350253503535045350553506535075350853509535105351153512535135351453515535165351753518535195352053521535225352353524535255352653527535285352953530535315353253533535345353553536535375353853539535405354153542535435354453545535465354753548535495355053551535525355353554535555355653557535585355953560535615356253563535645356553566535675356853569535705357153572535735357453575535765357753578535795358053581535825358353584535855358653587535885358953590535915359253593535945359553596535975359853599536005360153602536035360453605536065360753608536095361053611536125361353614536155361653617536185361953620536215362253623536245362553626536275362853629536305363153632536335363453635536365363753638536395364053641536425364353644536455364653647536485364953650536515365253653536545365553656536575365853659536605366153662536635366453665536665366753668536695367053671536725367353674536755367653677536785367953680536815368253683536845368553686536875368853689536905369153692536935369453695536965369753698536995370053701537025370353704537055370653707537085370953710537115371253713537145371553716537175371853719537205372153722537235372453725537265372753728537295373053731537325373353734537355373653737537385373953740537415374253743537445374553746537475374853749537505375153752537535375453755537565375753758537595376053761537625376353764537655376653767537685376953770537715377253773537745377553776537775377853779537805378153782537835378453785537865378753788537895379053791537925379353794537955379653797537985379953800538015380253803538045380553806538075380853809538105381153812538135381453815538165381753818538195382053821538225382353824538255382653827538285382953830538315383253833538345383553836538375383853839538405384153842538435384453845538465384753848538495385053851538525385353854538555385653857538585385953860538615386253863538645386553866538675386853869538705387153872538735387453875538765387753878538795388053881538825388353884538855388653887538885388953890538915389253893538945389553896538975389853899539005390153902539035390453905539065390753908539095391053911539125391353914539155391653917539185391953920539215392253923539245392553926539275392853929539305393153932539335393453935539365393753938539395394053941539425394353944539455394653947539485394953950539515395253953539545395553956539575395853959539605396153962539635396453965539665396753968539695397053971539725397353974539755397653977539785397953980539815398253983539845398553986539875398853989539905399153992539935399453995539965399753998539995400054001540025400354004540055400654007540085400954010540115401254013540145401554016540175401854019540205402154022540235402454025540265402754028540295403054031540325403354034540355403654037540385403954040540415404254043540445404554046540475404854049540505405154052540535405454055540565405754058540595406054061540625406354064540655406654067540685406954070540715407254073540745407554076540775407854079540805408154082540835408454085540865408754088540895409054091540925409354094540955409654097540985409954100541015410254103541045410554106541075410854109541105411154112541135411454115541165411754118541195412054121541225412354124541255412654127541285412954130541315413254133541345413554136541375413854139541405414154142541435414454145541465414754148541495415054151541525415354154541555415654157541585415954160541615416254163541645416554166541675416854169541705417154172541735417454175541765417754178541795418054181541825418354184541855418654187541885418954190541915419254193541945419554196541975419854199542005420154202542035420454205542065420754208542095421054211542125421354214542155421654217542185421954220542215422254223542245422554226542275422854229542305423154232542335423454235542365423754238542395424054241542425424354244542455424654247542485424954250542515425254253542545425554256542575425854259542605426154262542635426454265542665426754268542695427054271542725427354274542755427654277542785427954280542815428254283542845428554286542875428854289542905429154292542935429454295542965429754298542995430054301543025430354304543055430654307543085430954310543115431254313543145431554316543175431854319543205432154322543235432454325543265432754328543295433054331543325433354334543355433654337543385433954340543415434254343543445434554346543475434854349543505435154352543535435454355543565435754358543595436054361543625436354364543655436654367543685436954370543715437254373543745437554376543775437854379543805438154382543835438454385543865438754388543895439054391543925439354394543955439654397543985439954400544015440254403544045440554406544075440854409544105441154412544135441454415544165441754418544195442054421544225442354424544255442654427544285442954430544315443254433544345443554436544375443854439544405444154442544435444454445544465444754448544495445054451544525445354454544555445654457544585445954460544615446254463544645446554466544675446854469544705447154472544735447454475544765447754478544795448054481544825448354484544855448654487544885448954490544915449254493544945449554496544975449854499545005450154502545035450454505545065450754508545095451054511545125451354514545155451654517545185451954520545215452254523545245452554526545275452854529545305453154532545335453454535545365453754538545395454054541545425454354544545455454654547545485454954550545515455254553545545455554556545575455854559545605456154562545635456454565545665456754568545695457054571545725457354574545755457654577545785457954580545815458254583545845458554586545875458854589545905459154592545935459454595545965459754598545995460054601546025460354604546055460654607546085460954610546115461254613546145461554616546175461854619546205462154622546235462454625546265462754628546295463054631546325463354634546355463654637546385463954640546415464254643546445464554646546475464854649546505465154652546535465454655546565465754658546595466054661546625466354664546655466654667546685466954670546715467254673546745467554676546775467854679546805468154682546835468454685546865468754688546895469054691546925469354694546955469654697546985469954700547015470254703547045470554706547075470854709547105471154712547135471454715547165471754718547195472054721547225472354724547255472654727547285472954730547315473254733547345473554736547375473854739547405474154742547435474454745547465474754748547495475054751547525475354754547555475654757547585475954760547615476254763547645476554766547675476854769547705477154772547735477454775547765477754778547795478054781547825478354784547855478654787547885478954790547915479254793547945479554796547975479854799548005480154802548035480454805548065480754808548095481054811548125481354814548155481654817548185481954820548215482254823548245482554826548275482854829548305483154832548335483454835548365483754838548395484054841548425484354844548455484654847548485484954850548515485254853548545485554856548575485854859548605486154862548635486454865548665486754868548695487054871548725487354874548755487654877548785487954880548815488254883548845488554886548875488854889548905489154892548935489454895548965489754898548995490054901549025490354904549055490654907549085490954910549115491254913549145491554916549175491854919549205492154922549235492454925549265492754928549295493054931549325493354934549355493654937549385493954940549415494254943549445494554946549475494854949549505495154952549535495454955549565495754958549595496054961549625496354964549655496654967549685496954970549715497254973549745497554976549775497854979549805498154982549835498454985549865498754988549895499054991549925499354994549955499654997549985499955000550015500255003550045500555006550075500855009550105501155012550135501455015550165501755018550195502055021550225502355024550255502655027550285502955030550315503255033550345503555036550375503855039550405504155042550435504455045550465504755048550495505055051550525505355054550555505655057550585505955060550615506255063550645506555066550675506855069550705507155072550735507455075550765507755078550795508055081550825508355084550855508655087550885508955090550915509255093550945509555096550975509855099551005510155102551035510455105551065510755108551095511055111551125511355114551155511655117551185511955120551215512255123551245512555126551275512855129551305513155132551335513455135551365513755138551395514055141551425514355144551455514655147551485514955150551515515255153551545515555156551575515855159551605516155162551635516455165551665516755168551695517055171551725517355174551755517655177551785517955180551815518255183551845518555186551875518855189551905519155192551935519455195551965519755198551995520055201552025520355204552055520655207552085520955210552115521255213552145521555216552175521855219552205522155222552235522455225552265522755228552295523055231552325523355234552355523655237552385523955240552415524255243552445524555246552475524855249552505525155252552535525455255552565525755258552595526055261552625526355264552655526655267552685526955270552715527255273552745527555276552775527855279552805528155282552835528455285552865528755288552895529055291552925529355294552955529655297552985529955300553015530255303553045530555306553075530855309553105531155312553135531455315553165531755318553195532055321553225532355324553255532655327553285532955330553315533255333553345533555336553375533855339553405534155342553435534455345553465534755348553495535055351553525535355354553555535655357553585535955360553615536255363553645536555366553675536855369553705537155372553735537455375553765537755378553795538055381553825538355384553855538655387553885538955390553915539255393553945539555396553975539855399554005540155402554035540455405554065540755408554095541055411554125541355414554155541655417554185541955420554215542255423554245542555426554275542855429554305543155432554335543455435554365543755438554395544055441554425544355444554455544655447554485544955450554515545255453554545545555456554575545855459554605546155462554635546455465554665546755468554695547055471554725547355474554755547655477554785547955480554815548255483554845548555486554875548855489554905549155492554935549455495554965549755498554995550055501555025550355504555055550655507555085550955510555115551255513555145551555516555175551855519555205552155522555235552455525555265552755528555295553055531555325553355534555355553655537555385553955540555415554255543555445554555546555475554855549555505555155552555535555455555555565555755558555595556055561555625556355564555655556655567555685556955570555715557255573555745557555576555775557855579555805558155582555835558455585555865558755588555895559055591555925559355594555955559655597555985559955600556015560255603556045560555606556075560855609556105561155612556135561455615556165561755618556195562055621556225562355624556255562655627556285562955630556315563255633556345563555636556375563855639556405564155642556435564455645556465564755648556495565055651556525565355654556555565655657556585565955660556615566255663556645566555666556675566855669556705567155672556735567455675556765567755678556795568055681556825568355684556855568655687556885568955690556915569255693556945569555696556975569855699557005570155702557035570455705557065570755708557095571055711557125571355714557155571655717557185571955720557215572255723557245572555726557275572855729557305573155732557335573455735557365573755738557395574055741557425574355744557455574655747557485574955750557515575255753557545575555756557575575855759557605576155762557635576455765557665576755768557695577055771557725577355774557755577655777557785577955780557815578255783557845578555786557875578855789557905579155792557935579455795557965579755798557995580055801558025580355804558055580655807558085580955810558115581255813558145581555816558175581855819558205582155822558235582455825558265582755828558295583055831558325583355834558355583655837558385583955840558415584255843558445584555846558475584855849558505585155852558535585455855558565585755858558595586055861558625586355864558655586655867558685586955870558715587255873558745587555876558775587855879558805588155882558835588455885558865588755888558895589055891558925589355894558955589655897558985589955900559015590255903559045590555906559075590855909559105591155912559135591455915559165591755918559195592055921559225592355924559255592655927559285592955930559315593255933559345593555936559375593855939559405594155942559435594455945559465594755948559495595055951559525595355954559555595655957559585595955960559615596255963559645596555966559675596855969559705597155972559735597455975559765597755978559795598055981559825598355984559855598655987559885598955990559915599255993559945599555996559975599855999560005600156002560035600456005560065600756008560095601056011560125601356014560155601656017560185601956020560215602256023560245602556026560275602856029560305603156032560335603456035560365603756038560395604056041560425604356044560455604656047560485604956050560515605256053560545605556056560575605856059560605606156062560635606456065560665606756068560695607056071560725607356074560755607656077560785607956080560815608256083560845608556086560875608856089560905609156092560935609456095560965609756098560995610056101561025610356104561055610656107561085610956110561115611256113561145611556116561175611856119561205612156122561235612456125561265612756128561295613056131561325613356134561355613656137561385613956140561415614256143561445614556146561475614856149561505615156152561535615456155561565615756158561595616056161561625616356164561655616656167561685616956170561715617256173561745617556176561775617856179561805618156182561835618456185561865618756188561895619056191561925619356194561955619656197561985619956200562015620256203562045620556206562075620856209562105621156212562135621456215562165621756218562195622056221562225622356224562255622656227562285622956230562315623256233562345623556236562375623856239562405624156242562435624456245562465624756248562495625056251562525625356254562555625656257562585625956260562615626256263562645626556266562675626856269562705627156272562735627456275562765627756278562795628056281562825628356284562855628656287562885628956290562915629256293562945629556296562975629856299563005630156302563035630456305563065630756308563095631056311563125631356314563155631656317563185631956320563215632256323563245632556326563275632856329563305633156332563335633456335563365633756338563395634056341563425634356344563455634656347563485634956350563515635256353563545635556356563575635856359563605636156362563635636456365563665636756368563695637056371563725637356374563755637656377563785637956380563815638256383563845638556386563875638856389563905639156392563935639456395563965639756398563995640056401564025640356404564055640656407564085640956410564115641256413564145641556416564175641856419564205642156422564235642456425564265642756428564295643056431564325643356434564355643656437564385643956440564415644256443564445644556446564475644856449564505645156452564535645456455564565645756458564595646056461564625646356464564655646656467564685646956470564715647256473564745647556476564775647856479564805648156482564835648456485564865648756488564895649056491564925649356494564955649656497564985649956500565015650256503565045650556506565075650856509565105651156512565135651456515565165651756518565195652056521565225652356524565255652656527565285652956530565315653256533565345653556536565375653856539565405654156542565435654456545565465654756548565495655056551565525655356554565555655656557565585655956560565615656256563565645656556566565675656856569565705657156572565735657456575565765657756578565795658056581565825658356584565855658656587565885658956590565915659256593565945659556596565975659856599566005660156602566035660456605566065660756608566095661056611566125661356614566155661656617566185661956620566215662256623566245662556626566275662856629566305663156632566335663456635566365663756638566395664056641566425664356644566455664656647566485664956650566515665256653566545665556656566575665856659566605666156662566635666456665566665666756668566695667056671566725667356674566755667656677566785667956680566815668256683566845668556686566875668856689566905669156692566935669456695566965669756698566995670056701567025670356704567055670656707567085670956710567115671256713567145671556716567175671856719567205672156722567235672456725567265672756728567295673056731567325673356734567355673656737567385673956740567415674256743567445674556746567475674856749567505675156752567535675456755567565675756758567595676056761567625676356764567655676656767567685676956770567715677256773567745677556776567775677856779567805678156782567835678456785567865678756788567895679056791567925679356794567955679656797567985679956800568015680256803568045680556806568075680856809568105681156812568135681456815568165681756818568195682056821568225682356824568255682656827568285682956830568315683256833568345683556836568375683856839568405684156842568435684456845568465684756848568495685056851568525685356854568555685656857568585685956860568615686256863568645686556866568675686856869568705687156872568735687456875568765687756878568795688056881568825688356884568855688656887568885688956890568915689256893568945689556896568975689856899569005690156902569035690456905569065690756908569095691056911569125691356914569155691656917569185691956920569215692256923569245692556926569275692856929569305693156932569335693456935569365693756938569395694056941569425694356944569455694656947569485694956950569515695256953569545695556956569575695856959569605696156962569635696456965569665696756968569695697056971569725697356974569755697656977569785697956980569815698256983569845698556986569875698856989569905699156992569935699456995569965699756998569995700057001570025700357004570055700657007570085700957010570115701257013570145701557016570175701857019570205702157022570235702457025570265702757028570295703057031570325703357034570355703657037570385703957040570415704257043570445704557046570475704857049570505705157052570535705457055570565705757058570595706057061570625706357064570655706657067570685706957070570715707257073570745707557076570775707857079570805708157082570835708457085570865708757088570895709057091570925709357094570955709657097570985709957100571015710257103571045710557106571075710857109571105711157112571135711457115571165711757118571195712057121571225712357124571255712657127571285712957130571315713257133571345713557136571375713857139571405714157142571435714457145571465714757148571495715057151571525715357154571555715657157571585715957160571615716257163571645716557166571675716857169571705717157172571735717457175571765717757178571795718057181571825718357184571855718657187571885718957190571915719257193571945719557196571975719857199572005720157202572035720457205572065720757208572095721057211572125721357214572155721657217572185721957220572215722257223572245722557226572275722857229572305723157232572335723457235572365723757238572395724057241572425724357244572455724657247572485724957250572515725257253572545725557256572575725857259572605726157262572635726457265572665726757268572695727057271572725727357274572755727657277572785727957280572815728257283572845728557286572875728857289572905729157292572935729457295572965729757298572995730057301573025730357304573055730657307573085730957310573115731257313573145731557316573175731857319573205732157322573235732457325573265732757328573295733057331573325733357334573355733657337573385733957340573415734257343573445734557346573475734857349573505735157352573535735457355573565735757358573595736057361573625736357364573655736657367573685736957370573715737257373573745737557376573775737857379573805738157382573835738457385573865738757388573895739057391573925739357394573955739657397573985739957400574015740257403574045740557406574075740857409574105741157412574135741457415574165741757418574195742057421574225742357424574255742657427574285742957430574315743257433574345743557436574375743857439574405744157442574435744457445574465744757448574495745057451574525745357454574555745657457574585745957460574615746257463574645746557466574675746857469574705747157472574735747457475574765747757478574795748057481574825748357484574855748657487574885748957490574915749257493574945749557496574975749857499575005750157502575035750457505575065750757508575095751057511575125751357514575155751657517575185751957520575215752257523575245752557526575275752857529575305753157532575335753457535575365753757538575395754057541575425754357544575455754657547575485754957550575515755257553575545755557556575575755857559575605756157562575635756457565575665756757568575695757057571575725757357574575755757657577575785757957580575815758257583575845758557586575875758857589575905759157592575935759457595575965759757598575995760057601576025760357604576055760657607576085760957610576115761257613576145761557616576175761857619576205762157622576235762457625576265762757628576295763057631576325763357634576355763657637576385763957640576415764257643576445764557646576475764857649576505765157652576535765457655576565765757658576595766057661576625766357664576655766657667576685766957670576715767257673576745767557676576775767857679576805768157682576835768457685576865768757688576895769057691576925769357694576955769657697576985769957700577015770257703577045770557706577075770857709577105771157712577135771457715577165771757718577195772057721577225772357724577255772657727577285772957730577315773257733577345773557736577375773857739577405774157742577435774457745577465774757748577495775057751577525775357754577555775657757577585775957760577615776257763577645776557766577675776857769577705777157772577735777457775577765777757778577795778057781577825778357784577855778657787577885778957790577915779257793577945779557796577975779857799578005780157802578035780457805578065780757808578095781057811578125781357814578155781657817578185781957820578215782257823578245782557826578275782857829578305783157832578335783457835578365783757838578395784057841578425784357844578455784657847578485784957850578515785257853578545785557856578575785857859578605786157862578635786457865578665786757868578695787057871578725787357874578755787657877578785787957880578815788257883578845788557886578875788857889578905789157892578935789457895578965789757898578995790057901579025790357904579055790657907579085790957910579115791257913579145791557916579175791857919579205792157922579235792457925579265792757928579295793057931579325793357934579355793657937579385793957940579415794257943579445794557946579475794857949579505795157952579535795457955579565795757958579595796057961579625796357964579655796657967579685796957970579715797257973579745797557976579775797857979579805798157982579835798457985579865798757988579895799057991579925799357994579955799657997579985799958000580015800258003580045800558006580075800858009580105801158012580135801458015580165801758018580195802058021580225802358024580255802658027580285802958030580315803258033580345803558036580375803858039580405804158042580435804458045580465804758048580495805058051580525805358054580555805658057580585805958060580615806258063580645806558066580675806858069580705807158072580735807458075580765807758078580795808058081580825808358084580855808658087580885808958090580915809258093580945809558096580975809858099581005810158102581035810458105581065810758108581095811058111581125811358114581155811658117581185811958120581215812258123581245812558126581275812858129581305813158132581335813458135581365813758138581395814058141581425814358144581455814658147581485814958150581515815258153581545815558156581575815858159581605816158162581635816458165581665816758168581695817058171581725817358174581755817658177581785817958180581815818258183581845818558186581875818858189581905819158192581935819458195581965819758198581995820058201582025820358204582055820658207582085820958210582115821258213582145821558216582175821858219582205822158222582235822458225582265822758228582295823058231582325823358234582355823658237582385823958240582415824258243582445824558246582475824858249582505825158252582535825458255582565825758258582595826058261582625826358264582655826658267582685826958270582715827258273582745827558276582775827858279582805828158282582835828458285582865828758288582895829058291582925829358294582955829658297582985829958300583015830258303583045830558306583075830858309583105831158312583135831458315583165831758318583195832058321583225832358324583255832658327583285832958330583315833258333583345833558336583375833858339583405834158342583435834458345583465834758348583495835058351583525835358354583555835658357583585835958360583615836258363583645836558366583675836858369583705837158372583735837458375583765837758378583795838058381583825838358384583855838658387583885838958390583915839258393583945839558396583975839858399584005840158402584035840458405584065840758408584095841058411584125841358414584155841658417584185841958420584215842258423584245842558426584275842858429584305843158432584335843458435584365843758438584395844058441584425844358444584455844658447584485844958450584515845258453584545845558456584575845858459584605846158462584635846458465584665846758468584695847058471584725847358474584755847658477584785847958480584815848258483584845848558486584875848858489584905849158492584935849458495584965849758498584995850058501585025850358504585055850658507585085850958510585115851258513585145851558516585175851858519585205852158522585235852458525585265852758528585295853058531585325853358534585355853658537585385853958540585415854258543585445854558546585475854858549585505855158552585535855458555585565855758558585595856058561585625856358564585655856658567585685856958570585715857258573585745857558576585775857858579585805858158582585835858458585585865858758588585895859058591585925859358594585955859658597585985859958600586015860258603586045860558606586075860858609586105861158612586135861458615586165861758618586195862058621586225862358624586255862658627586285862958630586315863258633586345863558636586375863858639586405864158642586435864458645586465864758648586495865058651586525865358654586555865658657586585865958660586615866258663586645866558666586675866858669586705867158672586735867458675586765867758678586795868058681586825868358684586855868658687586885868958690586915869258693586945869558696586975869858699587005870158702587035870458705587065870758708587095871058711587125871358714587155871658717587185871958720587215872258723587245872558726587275872858729587305873158732587335873458735587365873758738587395874058741587425874358744587455874658747587485874958750587515875258753587545875558756587575875858759587605876158762587635876458765587665876758768587695877058771587725877358774587755877658777587785877958780587815878258783587845878558786587875878858789587905879158792587935879458795587965879758798587995880058801588025880358804588055880658807588085880958810588115881258813588145881558816588175881858819588205882158822588235882458825588265882758828588295883058831588325883358834588355883658837588385883958840588415884258843588445884558846588475884858849588505885158852588535885458855588565885758858588595886058861588625886358864588655886658867588685886958870588715887258873588745887558876588775887858879588805888158882588835888458885588865888758888588895889058891588925889358894588955889658897588985889958900589015890258903589045890558906589075890858909589105891158912589135891458915589165891758918589195892058921589225892358924589255892658927589285892958930589315893258933589345893558936589375893858939589405894158942589435894458945589465894758948589495895058951589525895358954589555895658957589585895958960589615896258963589645896558966589675896858969589705897158972589735897458975589765897758978589795898058981589825898358984589855898658987589885898958990589915899258993589945899558996589975899858999590005900159002590035900459005590065900759008590095901059011590125901359014590155901659017590185901959020590215902259023590245902559026590275902859029590305903159032590335903459035590365903759038590395904059041590425904359044590455904659047590485904959050590515905259053590545905559056590575905859059590605906159062590635906459065590665906759068590695907059071590725907359074590755907659077590785907959080590815908259083590845908559086590875908859089590905909159092590935909459095590965909759098590995910059101591025910359104591055910659107591085910959110591115911259113591145911559116591175911859119591205912159122591235912459125591265912759128591295913059131591325913359134591355913659137591385913959140591415914259143591445914559146591475914859149591505915159152591535915459155591565915759158591595916059161591625916359164591655916659167591685916959170591715917259173591745917559176591775917859179591805918159182591835918459185591865918759188591895919059191591925919359194591955919659197591985919959200592015920259203592045920559206592075920859209592105921159212592135921459215592165921759218592195922059221592225922359224592255922659227592285922959230592315923259233592345923559236592375923859239592405924159242592435924459245592465924759248592495925059251592525925359254592555925659257592585925959260592615926259263592645926559266592675926859269592705927159272592735927459275592765927759278592795928059281592825928359284592855928659287592885928959290592915929259293592945929559296592975929859299593005930159302593035930459305593065930759308593095931059311593125931359314593155931659317593185931959320593215932259323593245932559326593275932859329593305933159332593335933459335593365933759338593395934059341593425934359344593455934659347593485934959350593515935259353593545935559356593575935859359593605936159362593635936459365593665936759368593695937059371593725937359374593755937659377593785937959380593815938259383593845938559386593875938859389593905939159392593935939459395593965939759398593995940059401594025940359404594055940659407594085940959410594115941259413594145941559416594175941859419594205942159422594235942459425594265942759428594295943059431594325943359434594355943659437594385943959440594415944259443594445944559446594475944859449594505945159452594535945459455594565945759458594595946059461594625946359464594655946659467594685946959470594715947259473594745947559476594775947859479594805948159482594835948459485594865948759488594895949059491594925949359494594955949659497594985949959500595015950259503595045950559506595075950859509595105951159512595135951459515595165951759518595195952059521595225952359524595255952659527595285952959530595315953259533595345953559536595375953859539595405954159542595435954459545595465954759548595495955059551595525955359554595555955659557595585955959560595615956259563595645956559566595675956859569595705957159572595735957459575595765957759578595795958059581595825958359584595855958659587595885958959590595915959259593595945959559596595975959859599596005960159602596035960459605596065960759608596095961059611596125961359614596155961659617596185961959620596215962259623596245962559626596275962859629596305963159632596335963459635596365963759638596395964059641596425964359644596455964659647596485964959650596515965259653596545965559656596575965859659596605966159662596635966459665596665966759668596695967059671596725967359674596755967659677596785967959680596815968259683596845968559686596875968859689596905969159692596935969459695596965969759698596995970059701597025970359704597055970659707597085970959710597115971259713597145971559716597175971859719597205972159722597235972459725597265972759728597295973059731597325973359734597355973659737597385973959740597415974259743597445974559746597475974859749597505975159752597535975459755597565975759758597595976059761597625976359764597655976659767597685976959770597715977259773597745977559776597775977859779597805978159782597835978459785597865978759788597895979059791597925979359794597955979659797597985979959800598015980259803598045980559806598075980859809598105981159812598135981459815598165981759818598195982059821598225982359824598255982659827598285982959830598315983259833598345983559836598375983859839598405984159842598435984459845598465984759848598495985059851598525985359854598555985659857598585985959860598615986259863598645986559866598675986859869598705987159872598735987459875598765987759878598795988059881598825988359884598855988659887598885988959890598915989259893598945989559896598975989859899599005990159902599035990459905599065990759908599095991059911599125991359914599155991659917599185991959920599215992259923599245992559926599275992859929599305993159932599335993459935599365993759938599395994059941599425994359944599455994659947599485994959950599515995259953599545995559956599575995859959599605996159962599635996459965599665996759968599695997059971599725997359974599755997659977599785997959980599815998259983599845998559986599875998859989599905999159992599935999459995599965999759998599996000060001600026000360004600056000660007600086000960010600116001260013600146001560016600176001860019600206002160022600236002460025600266002760028600296003060031600326003360034600356003660037600386003960040600416004260043600446004560046600476004860049600506005160052600536005460055600566005760058600596006060061600626006360064600656006660067600686006960070600716007260073600746007560076600776007860079600806008160082600836008460085600866008760088600896009060091600926009360094600956009660097600986009960100601016010260103601046010560106601076010860109601106011160112601136011460115601166011760118601196012060121601226012360124601256012660127601286012960130601316013260133601346013560136601376013860139601406014160142601436014460145601466014760148601496015060151601526015360154601556015660157601586015960160601616016260163601646016560166601676016860169601706017160172601736017460175601766017760178601796018060181601826018360184601856018660187601886018960190601916019260193601946019560196601976019860199602006020160202602036020460205602066020760208602096021060211602126021360214602156021660217602186021960220602216022260223602246022560226602276022860229602306023160232602336023460235602366023760238602396024060241602426024360244602456024660247602486024960250602516025260253602546025560256602576025860259602606026160262602636026460265602666026760268602696027060271602726027360274602756027660277602786027960280602816028260283602846028560286602876028860289602906029160292602936029460295602966029760298602996030060301603026030360304603056030660307603086030960310603116031260313603146031560316603176031860319603206032160322603236032460325603266032760328603296033060331603326033360334603356033660337603386033960340603416034260343603446034560346603476034860349603506035160352603536035460355603566035760358603596036060361603626036360364603656036660367603686036960370603716037260373603746037560376603776037860379603806038160382603836038460385603866038760388603896039060391603926039360394603956039660397603986039960400604016040260403604046040560406604076040860409604106041160412604136041460415604166041760418604196042060421604226042360424604256042660427604286042960430604316043260433604346043560436604376043860439604406044160442604436044460445604466044760448604496045060451604526045360454604556045660457604586045960460604616046260463604646046560466604676046860469604706047160472604736047460475604766047760478604796048060481604826048360484604856048660487604886048960490604916049260493604946049560496604976049860499605006050160502605036050460505605066050760508605096051060511605126051360514605156051660517605186051960520605216052260523605246052560526605276052860529605306053160532605336053460535605366053760538605396054060541605426054360544605456054660547605486054960550605516055260553605546055560556605576055860559605606056160562605636056460565605666056760568605696057060571605726057360574605756057660577605786057960580605816058260583605846058560586605876058860589605906059160592605936059460595605966059760598605996060060601606026060360604606056060660607606086060960610606116061260613606146061560616606176061860619606206062160622606236062460625606266062760628606296063060631606326063360634606356063660637606386063960640606416064260643606446064560646606476064860649606506065160652606536065460655606566065760658606596066060661606626066360664606656066660667606686066960670606716067260673606746067560676606776067860679606806068160682606836068460685606866068760688606896069060691606926069360694606956069660697606986069960700607016070260703607046070560706607076070860709607106071160712607136071460715607166071760718607196072060721607226072360724607256072660727607286072960730607316073260733607346073560736607376073860739607406074160742607436074460745607466074760748607496075060751607526075360754607556075660757607586075960760607616076260763607646076560766607676076860769607706077160772607736077460775607766077760778607796078060781607826078360784607856078660787607886078960790607916079260793607946079560796607976079860799608006080160802608036080460805608066080760808608096081060811608126081360814608156081660817608186081960820608216082260823608246082560826608276082860829608306083160832608336083460835608366083760838608396084060841608426084360844608456084660847608486084960850608516085260853608546085560856608576085860859608606086160862608636086460865608666086760868608696087060871608726087360874608756087660877608786087960880608816088260883608846088560886608876088860889608906089160892608936089460895608966089760898608996090060901609026090360904609056090660907609086090960910609116091260913609146091560916609176091860919609206092160922609236092460925609266092760928609296093060931609326093360934609356093660937609386093960940609416094260943609446094560946609476094860949609506095160952609536095460955609566095760958609596096060961609626096360964609656096660967609686096960970609716097260973609746097560976609776097860979609806098160982609836098460985609866098760988609896099060991609926099360994609956099660997609986099961000610016100261003610046100561006610076100861009610106101161012610136101461015610166101761018610196102061021610226102361024610256102661027610286102961030610316103261033610346103561036610376103861039610406104161042610436104461045610466104761048610496105061051610526105361054610556105661057610586105961060610616106261063610646106561066610676106861069610706107161072610736107461075610766107761078610796108061081610826108361084610856108661087610886108961090610916109261093610946109561096610976109861099611006110161102611036110461105611066110761108611096111061111611126111361114611156111661117611186111961120611216112261123611246112561126611276112861129611306113161132611336113461135611366113761138611396114061141611426114361144611456114661147611486114961150611516115261153611546115561156611576115861159611606116161162611636116461165611666116761168611696117061171611726117361174611756117661177611786117961180611816118261183611846118561186611876118861189611906119161192611936119461195611966119761198611996120061201612026120361204612056120661207612086120961210612116121261213612146121561216612176121861219612206122161222612236122461225612266122761228612296123061231612326123361234612356123661237612386123961240612416124261243612446124561246612476124861249612506125161252612536125461255612566125761258612596126061261612626126361264612656126661267612686126961270612716127261273612746127561276612776127861279612806128161282612836128461285612866128761288612896129061291612926129361294612956129661297612986129961300613016130261303613046130561306613076130861309613106131161312613136131461315613166131761318613196132061321613226132361324613256132661327613286132961330613316133261333613346133561336613376133861339613406134161342613436134461345613466134761348613496135061351613526135361354613556135661357613586135961360613616136261363613646136561366613676136861369613706137161372613736137461375613766137761378613796138061381613826138361384613856138661387613886138961390613916139261393613946139561396613976139861399614006140161402614036140461405614066140761408614096141061411614126141361414614156141661417614186141961420614216142261423614246142561426614276142861429614306143161432614336143461435614366143761438614396144061441614426144361444614456144661447614486144961450614516145261453614546145561456614576145861459614606146161462614636146461465614666146761468614696147061471614726147361474614756147661477614786147961480614816148261483614846148561486614876148861489614906149161492614936149461495614966149761498614996150061501615026150361504615056150661507615086150961510615116151261513615146151561516615176151861519615206152161522615236152461525615266152761528615296153061531615326153361534615356153661537615386153961540615416154261543615446154561546615476154861549615506155161552615536155461555615566155761558615596156061561615626156361564615656156661567615686156961570615716157261573615746157561576615776157861579615806158161582615836158461585615866158761588615896159061591615926159361594615956159661597615986159961600616016160261603616046160561606616076160861609616106161161612616136161461615616166161761618616196162061621616226162361624616256162661627616286162961630616316163261633616346163561636616376163861639616406164161642616436164461645616466164761648616496165061651616526165361654616556165661657616586165961660616616166261663616646166561666616676166861669616706167161672616736167461675616766167761678616796168061681616826168361684616856168661687616886168961690616916169261693616946169561696616976169861699617006170161702617036170461705617066170761708617096171061711617126171361714617156171661717617186171961720617216172261723617246172561726617276172861729617306173161732617336173461735617366173761738617396174061741617426174361744617456174661747617486174961750617516175261753617546175561756617576175861759617606176161762617636176461765617666176761768617696177061771617726177361774617756177661777617786177961780617816178261783617846178561786617876178861789617906179161792617936179461795617966179761798617996180061801618026180361804618056180661807618086180961810618116181261813618146181561816618176181861819618206182161822618236182461825618266182761828618296183061831618326183361834618356183661837618386183961840618416184261843618446184561846618476184861849618506185161852618536185461855618566185761858618596186061861618626186361864618656186661867618686186961870618716187261873618746187561876618776187861879618806188161882618836188461885618866188761888618896189061891618926189361894618956189661897618986189961900619016190261903619046190561906619076190861909619106191161912619136191461915619166191761918619196192061921619226192361924619256192661927619286192961930619316193261933619346193561936619376193861939619406194161942619436194461945619466194761948619496195061951619526195361954619556195661957619586195961960619616196261963619646196561966619676196861969619706197161972619736197461975619766197761978619796198061981619826198361984619856198661987619886198961990619916199261993619946199561996619976199861999620006200162002620036200462005620066200762008620096201062011620126201362014620156201662017620186201962020620216202262023620246202562026620276202862029620306203162032620336203462035620366203762038620396204062041620426204362044620456204662047620486204962050620516205262053620546205562056620576205862059620606206162062620636206462065620666206762068620696207062071620726207362074620756207662077620786207962080620816208262083620846208562086620876208862089620906209162092620936209462095620966209762098620996210062101621026210362104621056210662107621086210962110621116211262113621146211562116621176211862119621206212162122621236212462125621266212762128621296213062131621326213362134621356213662137621386213962140621416214262143621446214562146621476214862149621506215162152621536215462155621566215762158621596216062161621626216362164621656216662167621686216962170621716217262173621746217562176621776217862179621806218162182621836218462185621866218762188621896219062191621926219362194621956219662197621986219962200622016220262203622046220562206622076220862209622106221162212622136221462215622166221762218622196222062221622226222362224622256222662227622286222962230622316223262233622346223562236622376223862239622406224162242622436224462245622466224762248622496225062251622526225362254622556225662257622586225962260622616226262263622646226562266622676226862269622706227162272622736227462275622766227762278622796228062281622826228362284622856228662287622886228962290622916229262293622946229562296622976229862299623006230162302623036230462305623066230762308623096231062311623126231362314623156231662317623186231962320623216232262323623246232562326623276232862329623306233162332623336233462335623366233762338623396234062341623426234362344623456234662347623486234962350623516235262353623546235562356623576235862359623606236162362623636236462365623666236762368623696237062371623726237362374623756237662377623786237962380623816238262383623846238562386623876238862389623906239162392623936239462395623966239762398623996240062401624026240362404624056240662407624086240962410624116241262413624146241562416624176241862419624206242162422624236242462425624266242762428624296243062431624326243362434624356243662437624386243962440624416244262443624446244562446624476244862449624506245162452624536245462455624566245762458624596246062461624626246362464624656246662467624686246962470624716247262473624746247562476624776247862479624806248162482624836248462485624866248762488624896249062491624926249362494624956249662497624986249962500625016250262503625046250562506625076250862509625106251162512625136251462515625166251762518625196252062521625226252362524625256252662527625286252962530625316253262533625346253562536625376253862539625406254162542625436254462545625466254762548625496255062551625526255362554625556255662557625586255962560625616256262563625646256562566625676256862569625706257162572625736257462575625766257762578625796258062581625826258362584625856258662587625886258962590625916259262593625946259562596625976259862599626006260162602626036260462605626066260762608626096261062611626126261362614626156261662617626186261962620626216262262623626246262562626626276262862629626306263162632626336263462635626366263762638626396264062641626426264362644626456264662647626486264962650626516265262653626546265562656626576265862659626606266162662626636266462665626666266762668626696267062671626726267362674626756267662677626786267962680626816268262683626846268562686626876268862689626906269162692626936269462695626966269762698626996270062701627026270362704627056270662707627086270962710627116271262713627146271562716627176271862719627206272162722627236272462725627266272762728627296273062731627326273362734627356273662737627386273962740627416274262743627446274562746627476274862749627506275162752627536275462755627566275762758627596276062761627626276362764627656276662767627686276962770627716277262773627746277562776627776277862779627806278162782627836278462785627866278762788627896279062791627926279362794627956279662797627986279962800628016280262803628046280562806628076280862809628106281162812628136281462815628166281762818628196282062821628226282362824628256282662827628286282962830628316283262833628346283562836628376283862839628406284162842628436284462845628466284762848628496285062851628526285362854628556285662857628586285962860628616286262863628646286562866628676286862869628706287162872628736287462875628766287762878628796288062881628826288362884628856288662887628886288962890628916289262893628946289562896628976289862899629006290162902629036290462905629066290762908629096291062911629126291362914629156291662917629186291962920629216292262923629246292562926629276292862929629306293162932629336293462935629366293762938629396294062941629426294362944629456294662947629486294962950629516295262953629546295562956629576295862959629606296162962629636296462965629666296762968629696297062971629726297362974629756297662977629786297962980629816298262983629846298562986629876298862989629906299162992629936299462995629966299762998629996300063001630026300363004630056300663007630086300963010630116301263013630146301563016630176301863019630206302163022630236302463025630266302763028630296303063031630326303363034630356303663037630386303963040630416304263043630446304563046630476304863049630506305163052630536305463055630566305763058630596306063061630626306363064630656306663067630686306963070630716307263073630746307563076630776307863079630806308163082630836308463085630866308763088630896309063091630926309363094630956309663097630986309963100631016310263103631046310563106631076310863109631106311163112631136311463115631166311763118631196312063121631226312363124631256312663127631286312963130631316313263133631346313563136631376313863139631406314163142631436314463145631466314763148631496315063151631526315363154631556315663157631586315963160631616316263163631646316563166631676316863169631706317163172631736317463175631766317763178631796318063181631826318363184631856318663187631886318963190631916319263193631946319563196631976319863199632006320163202632036320463205632066320763208632096321063211632126321363214632156321663217632186321963220632216322263223632246322563226632276322863229632306323163232632336323463235632366323763238632396324063241632426324363244632456324663247632486324963250632516325263253632546325563256632576325863259632606326163262632636326463265632666326763268632696327063271632726327363274632756327663277632786327963280632816328263283632846328563286632876328863289632906329163292632936329463295632966329763298632996330063301633026330363304633056330663307633086330963310633116331263313633146331563316633176331863319633206332163322633236332463325633266332763328633296333063331633326333363334633356333663337633386333963340633416334263343633446334563346633476334863349633506335163352633536335463355633566335763358633596336063361633626336363364633656336663367633686336963370633716337263373633746337563376633776337863379633806338163382633836338463385633866338763388633896339063391633926339363394633956339663397633986339963400634016340263403634046340563406634076340863409634106341163412634136341463415634166341763418634196342063421634226342363424634256342663427634286342963430634316343263433634346343563436634376343863439634406344163442634436344463445634466344763448634496345063451634526345363454634556345663457634586345963460634616346263463634646346563466634676346863469634706347163472634736347463475634766347763478634796348063481634826348363484634856348663487634886348963490634916349263493634946349563496634976349863499635006350163502635036350463505635066350763508635096351063511635126351363514635156351663517635186351963520635216352263523635246352563526635276352863529635306353163532635336353463535635366353763538635396354063541635426354363544635456354663547635486354963550635516355263553635546355563556635576355863559635606356163562635636356463565635666356763568635696357063571635726357363574635756357663577635786357963580635816358263583635846358563586635876358863589635906359163592635936359463595635966359763598635996360063601636026360363604636056360663607636086360963610636116361263613636146361563616636176361863619636206362163622636236362463625636266362763628636296363063631636326363363634636356363663637636386363963640636416364263643636446364563646636476364863649636506365163652636536365463655636566365763658636596366063661636626366363664636656366663667636686366963670636716367263673636746367563676636776367863679636806368163682636836368463685636866368763688636896369063691636926369363694636956369663697636986369963700637016370263703637046370563706637076370863709637106371163712637136371463715637166371763718637196372063721637226372363724637256372663727637286372963730637316373263733637346373563736637376373863739637406374163742637436374463745637466374763748637496375063751637526375363754637556375663757637586375963760637616376263763637646376563766637676376863769637706377163772637736377463775637766377763778637796378063781637826378363784637856378663787637886378963790637916379263793637946379563796637976379863799638006380163802638036380463805638066380763808638096381063811638126381363814638156381663817638186381963820638216382263823638246382563826638276382863829638306383163832638336383463835638366383763838638396384063841638426384363844638456384663847638486384963850638516385263853638546385563856638576385863859638606386163862638636386463865638666386763868638696387063871638726387363874638756387663877638786387963880638816388263883638846388563886638876388863889638906389163892638936389463895638966389763898638996390063901639026390363904639056390663907639086390963910639116391263913639146391563916639176391863919639206392163922639236392463925639266392763928639296393063931639326393363934639356393663937639386393963940639416394263943639446394563946639476394863949639506395163952639536395463955639566395763958639596396063961639626396363964639656396663967639686396963970639716397263973639746397563976639776397863979639806398163982639836398463985639866398763988639896399063991639926399363994639956399663997639986399964000640016400264003640046400564006640076400864009640106401164012640136401464015640166401764018640196402064021640226402364024640256402664027640286402964030640316403264033640346403564036640376403864039640406404164042640436404464045640466404764048640496405064051640526405364054640556405664057640586405964060640616406264063640646406564066640676406864069640706407164072640736407464075640766407764078640796408064081640826408364084640856408664087640886408964090640916409264093640946409564096640976409864099641006410164102641036410464105641066410764108641096411064111641126411364114641156411664117641186411964120641216412264123641246412564126641276412864129641306413164132641336413464135641366413764138641396414064141641426414364144641456414664147641486414964150641516415264153641546415564156641576415864159641606416164162641636416464165641666416764168641696417064171641726417364174641756417664177641786417964180641816418264183641846418564186641876418864189641906419164192641936419464195641966419764198641996420064201642026420364204642056420664207642086420964210642116421264213642146421564216642176421864219642206422164222642236422464225642266422764228642296423064231642326423364234642356423664237642386423964240642416424264243642446424564246642476424864249642506425164252642536425464255642566425764258642596426064261642626426364264642656426664267642686426964270642716427264273642746427564276642776427864279642806428164282642836428464285642866428764288642896429064291642926429364294642956429664297642986429964300643016430264303643046430564306643076430864309643106431164312643136431464315643166431764318643196432064321643226432364324643256432664327643286432964330643316433264333643346433564336643376433864339643406434164342643436434464345643466434764348643496435064351643526435364354643556435664357643586435964360643616436264363643646436564366643676436864369643706437164372643736437464375643766437764378643796438064381643826438364384643856438664387643886438964390643916439264393643946439564396643976439864399644006440164402644036440464405644066440764408644096441064411644126441364414644156441664417644186441964420644216442264423644246442564426644276442864429644306443164432644336443464435644366443764438644396444064441644426444364444644456444664447644486444964450644516445264453644546445564456644576445864459644606446164462644636446464465644666446764468644696447064471644726447364474644756447664477644786447964480644816448264483644846448564486644876448864489644906449164492644936449464495644966449764498644996450064501645026450364504645056450664507645086450964510645116451264513645146451564516645176451864519645206452164522645236452464525645266452764528645296453064531645326453364534645356453664537645386453964540645416454264543645446454564546645476454864549645506455164552645536455464555645566455764558645596456064561645626456364564645656456664567645686456964570645716457264573645746457564576645776457864579645806458164582645836458464585645866458764588645896459064591645926459364594645956459664597645986459964600646016460264603646046460564606646076460864609646106461164612646136461464615646166461764618646196462064621646226462364624646256462664627646286462964630646316463264633646346463564636646376463864639646406464164642646436464464645646466464764648646496465064651646526465364654646556465664657646586465964660646616466264663646646466564666646676466864669646706467164672646736467464675646766467764678646796468064681646826468364684646856468664687646886468964690646916469264693646946469564696646976469864699647006470164702647036470464705647066470764708647096471064711647126471364714647156471664717647186471964720647216472264723647246472564726647276472864729647306473164732647336473464735647366473764738647396474064741647426474364744647456474664747647486474964750647516475264753647546475564756647576475864759647606476164762647636476464765647666476764768647696477064771647726477364774647756477664777647786477964780647816478264783647846478564786647876478864789647906479164792647936479464795647966479764798647996480064801648026480364804648056480664807648086480964810648116481264813648146481564816648176481864819648206482164822648236482464825648266482764828648296483064831648326483364834648356483664837648386483964840648416484264843648446484564846648476484864849648506485164852648536485464855648566485764858648596486064861648626486364864648656486664867648686486964870648716487264873648746487564876648776487864879648806488164882648836488464885648866488764888648896489064891648926489364894648956489664897648986489964900649016490264903649046490564906649076490864909649106491164912649136491464915649166491764918649196492064921649226492364924649256492664927649286492964930649316493264933649346493564936649376493864939649406494164942649436494464945649466494764948649496495064951649526495364954649556495664957649586495964960649616496264963649646496564966649676496864969649706497164972649736497464975649766497764978649796498064981649826498364984649856498664987649886498964990649916499264993649946499564996649976499864999650006500165002650036500465005650066500765008650096501065011650126501365014650156501665017650186501965020650216502265023650246502565026650276502865029650306503165032650336503465035650366503765038650396504065041650426504365044650456504665047650486504965050650516505265053650546505565056650576505865059650606506165062650636506465065650666506765068650696507065071650726507365074650756507665077650786507965080650816508265083650846508565086650876508865089650906509165092650936509465095650966509765098650996510065101651026510365104651056510665107651086510965110651116511265113651146511565116651176511865119651206512165122651236512465125651266512765128651296513065131651326513365134651356513665137651386513965140651416514265143651446514565146651476514865149651506515165152651536515465155651566515765158651596516065161651626516365164651656516665167651686516965170651716517265173651746517565176651776517865179651806518165182651836518465185651866518765188651896519065191651926519365194651956519665197651986519965200652016520265203652046520565206652076520865209652106521165212652136521465215652166521765218652196522065221652226522365224652256522665227652286522965230652316523265233652346523565236652376523865239652406524165242652436524465245652466524765248652496525065251652526525365254652556525665257652586525965260652616526265263652646526565266652676526865269652706527165272652736527465275652766527765278652796528065281652826528365284652856528665287652886528965290652916529265293652946529565296652976529865299653006530165302653036530465305653066530765308653096531065311653126531365314653156531665317653186531965320653216532265323653246532565326653276532865329653306533165332653336533465335653366533765338653396534065341653426534365344653456534665347653486534965350653516535265353653546535565356653576535865359653606536165362653636536465365653666536765368653696537065371653726537365374653756537665377653786537965380653816538265383653846538565386653876538865389653906539165392653936539465395653966539765398653996540065401654026540365404654056540665407654086540965410654116541265413654146541565416654176541865419654206542165422654236542465425654266542765428654296543065431654326543365434654356543665437654386543965440654416544265443654446544565446654476544865449654506545165452654536545465455654566545765458654596546065461654626546365464654656546665467654686546965470654716547265473654746547565476654776547865479654806548165482654836548465485654866548765488654896549065491654926549365494654956549665497654986549965500655016550265503655046550565506655076550865509655106551165512655136551465515655166551765518655196552065521655226552365524655256552665527655286552965530655316553265533655346553565536655376553865539655406554165542655436554465545655466554765548655496555065551655526555365554655556555665557655586555965560655616556265563655646556565566655676556865569655706557165572655736557465575655766557765578655796558065581655826558365584655856558665587655886558965590655916559265593655946559565596655976559865599656006560165602656036560465605656066560765608656096561065611656126561365614656156561665617656186561965620656216562265623656246562565626656276562865629656306563165632656336563465635656366563765638656396564065641656426564365644656456564665647656486564965650656516565265653656546565565656656576565865659656606566165662656636566465665656666566765668656696567065671656726567365674656756567665677656786567965680656816568265683656846568565686656876568865689656906569165692656936569465695656966569765698656996570065701657026570365704657056570665707657086570965710657116571265713657146571565716657176571865719657206572165722657236572465725657266572765728657296573065731657326573365734657356573665737657386573965740657416574265743657446574565746657476574865749657506575165752657536575465755657566575765758657596576065761657626576365764657656576665767657686576965770657716577265773657746577565776657776577865779657806578165782657836578465785657866578765788657896579065791657926579365794657956579665797657986579965800658016580265803658046580565806658076580865809658106581165812658136581465815658166581765818658196582065821658226582365824658256582665827658286582965830658316583265833658346583565836658376583865839658406584165842658436584465845658466584765848658496585065851658526585365854658556585665857658586585965860658616586265863658646586565866658676586865869658706587165872658736587465875658766587765878658796588065881658826588365884658856588665887658886588965890658916589265893658946589565896658976589865899659006590165902659036590465905659066590765908659096591065911659126591365914659156591665917659186591965920659216592265923659246592565926659276592865929659306593165932659336593465935659366593765938659396594065941659426594365944659456594665947659486594965950659516595265953659546595565956659576595865959659606596165962659636596465965659666596765968659696597065971659726597365974659756597665977659786597965980659816598265983659846598565986659876598865989659906599165992659936599465995659966599765998659996600066001660026600366004660056600666007660086600966010660116601266013660146601566016660176601866019660206602166022660236602466025660266602766028660296603066031660326603366034660356603666037660386603966040660416604266043660446604566046660476604866049660506605166052660536605466055660566605766058660596606066061660626606366064660656606666067660686606966070660716607266073660746607566076660776607866079660806608166082660836608466085660866608766088660896609066091660926609366094660956609666097660986609966100661016610266103661046610566106661076610866109661106611166112661136611466115661166611766118661196612066121661226612366124661256612666127661286612966130661316613266133661346613566136661376613866139661406614166142661436614466145661466614766148661496615066151661526615366154661556615666157661586615966160661616616266163661646616566166661676616866169661706617166172661736617466175661766617766178661796618066181661826618366184661856618666187661886618966190661916619266193661946619566196661976619866199662006620166202662036620466205662066620766208662096621066211662126621366214662156621666217662186621966220662216622266223662246622566226662276622866229662306623166232662336623466235662366623766238662396624066241662426624366244662456624666247662486624966250662516625266253662546625566256662576625866259662606626166262662636626466265662666626766268662696627066271662726627366274662756627666277662786627966280662816628266283662846628566286662876628866289662906629166292662936629466295662966629766298662996630066301663026630366304663056630666307663086630966310663116631266313663146631566316663176631866319663206632166322663236632466325663266632766328663296633066331663326633366334663356633666337663386633966340663416634266343663446634566346663476634866349663506635166352663536635466355663566635766358663596636066361663626636366364663656636666367663686636966370663716637266373663746637566376663776637866379663806638166382663836638466385663866638766388663896639066391663926639366394663956639666397663986639966400664016640266403664046640566406664076640866409664106641166412664136641466415664166641766418664196642066421664226642366424664256642666427664286642966430664316643266433664346643566436664376643866439664406644166442664436644466445664466644766448664496645066451664526645366454664556645666457664586645966460664616646266463664646646566466664676646866469664706647166472664736647466475664766647766478664796648066481664826648366484664856648666487664886648966490664916649266493664946649566496664976649866499665006650166502665036650466505665066650766508665096651066511665126651366514665156651666517665186651966520665216652266523665246652566526665276652866529665306653166532665336653466535665366653766538665396654066541665426654366544665456654666547665486654966550665516655266553665546655566556665576655866559665606656166562665636656466565665666656766568665696657066571665726657366574665756657666577665786657966580665816658266583665846658566586665876658866589665906659166592665936659466595665966659766598665996660066601666026660366604666056660666607666086660966610666116661266613666146661566616666176661866619666206662166622666236662466625666266662766628666296663066631666326663366634666356663666637666386663966640666416664266643666446664566646666476664866649666506665166652666536665466655666566665766658666596666066661666626666366664666656666666667666686666966670666716667266673666746667566676666776667866679666806668166682666836668466685666866668766688666896669066691666926669366694666956669666697666986669966700667016670266703667046670566706667076670866709667106671166712667136671466715667166671766718667196672066721667226672366724667256672666727667286672966730667316673266733667346673566736667376673866739667406674166742667436674466745667466674766748667496675066751667526675366754667556675666757667586675966760667616676266763667646676566766667676676866769667706677166772667736677466775667766677766778667796678066781667826678366784667856678666787667886678966790667916679266793667946679566796667976679866799668006680166802668036680466805668066680766808668096681066811668126681366814668156681666817668186681966820668216682266823668246682566826668276682866829668306683166832668336683466835668366683766838668396684066841668426684366844668456684666847668486684966850668516685266853668546685566856668576685866859668606686166862668636686466865668666686766868668696687066871668726687366874668756687666877668786687966880668816688266883668846688566886668876688866889668906689166892668936689466895668966689766898668996690066901669026690366904669056690666907669086690966910669116691266913669146691566916669176691866919669206692166922669236692466925669266692766928669296693066931669326693366934669356693666937669386693966940669416694266943669446694566946669476694866949669506695166952669536695466955669566695766958669596696066961669626696366964669656696666967669686696966970669716697266973669746697566976669776697866979669806698166982669836698466985669866698766988669896699066991669926699366994669956699666997669986699967000670016700267003670046700567006670076700867009670106701167012670136701467015670166701767018670196702067021670226702367024670256702667027670286702967030670316703267033670346703567036670376703867039670406704167042670436704467045670466704767048670496705067051670526705367054670556705667057670586705967060670616706267063670646706567066670676706867069670706707167072670736707467075670766707767078670796708067081670826708367084670856708667087670886708967090670916709267093670946709567096670976709867099671006710167102671036710467105671066710767108671096711067111671126711367114671156711667117671186711967120671216712267123671246712567126671276712867129671306713167132671336713467135671366713767138671396714067141671426714367144671456714667147671486714967150671516715267153671546715567156671576715867159671606716167162671636716467165671666716767168671696717067171671726717367174671756717667177671786717967180671816718267183671846718567186671876718867189671906719167192671936719467195671966719767198671996720067201672026720367204672056720667207672086720967210672116721267213672146721567216672176721867219672206722167222672236722467225672266722767228672296723067231672326723367234672356723667237672386723967240672416724267243672446724567246672476724867249672506725167252672536725467255672566725767258672596726067261672626726367264672656726667267672686726967270672716727267273672746727567276672776727867279672806728167282672836728467285672866728767288672896729067291672926729367294672956729667297672986729967300673016730267303673046730567306673076730867309673106731167312673136731467315673166731767318673196732067321673226732367324673256732667327673286732967330673316733267333673346733567336673376733867339673406734167342673436734467345673466734767348673496735067351673526735367354673556735667357673586735967360673616736267363673646736567366673676736867369673706737167372673736737467375673766737767378673796738067381673826738367384673856738667387673886738967390673916739267393673946739567396673976739867399674006740167402674036740467405674066740767408674096741067411674126741367414674156741667417674186741967420674216742267423674246742567426674276742867429674306743167432674336743467435674366743767438674396744067441674426744367444674456744667447674486744967450674516745267453674546745567456674576745867459674606746167462674636746467465674666746767468674696747067471674726747367474674756747667477674786747967480674816748267483674846748567486674876748867489674906749167492674936749467495674966749767498674996750067501675026750367504675056750667507675086750967510675116751267513675146751567516675176751867519675206752167522675236752467525675266752767528675296753067531675326753367534675356753667537675386753967540675416754267543675446754567546675476754867549675506755167552675536755467555675566755767558675596756067561675626756367564675656756667567675686756967570675716757267573675746757567576675776757867579675806758167582675836758467585675866758767588675896759067591675926759367594675956759667597675986759967600676016760267603676046760567606676076760867609676106761167612676136761467615676166761767618676196762067621676226762367624676256762667627676286762967630676316763267633676346763567636676376763867639676406764167642676436764467645676466764767648676496765067651676526765367654676556765667657676586765967660676616766267663676646766567666676676766867669676706767167672676736767467675676766767767678676796768067681676826768367684676856768667687676886768967690676916769267693676946769567696676976769867699677006770167702677036770467705677066770767708677096771067711677126771367714677156771667717677186771967720677216772267723677246772567726677276772867729677306773167732677336773467735677366773767738677396774067741677426774367744677456774667747677486774967750677516775267753677546775567756677576775867759677606776167762677636776467765677666776767768677696777067771677726777367774677756777667777677786777967780677816778267783677846778567786677876778867789677906779167792677936779467795677966779767798677996780067801678026780367804678056780667807678086780967810678116781267813678146781567816678176781867819678206782167822678236782467825678266782767828678296783067831678326783367834678356783667837678386783967840678416784267843678446784567846678476784867849678506785167852678536785467855678566785767858678596786067861678626786367864678656786667867678686786967870678716787267873678746787567876678776787867879678806788167882678836788467885678866788767888678896789067891678926789367894678956789667897678986789967900679016790267903679046790567906679076790867909679106791167912679136791467915679166791767918679196792067921679226792367924679256792667927679286792967930679316793267933679346793567936679376793867939679406794167942679436794467945679466794767948679496795067951679526795367954679556795667957679586795967960679616796267963679646796567966679676796867969679706797167972679736797467975679766797767978679796798067981679826798367984679856798667987679886798967990679916799267993679946799567996679976799867999680006800168002680036800468005680066800768008680096801068011680126801368014680156801668017680186801968020680216802268023680246802568026680276802868029680306803168032680336803468035680366803768038680396804068041680426804368044680456804668047680486804968050680516805268053680546805568056680576805868059680606806168062680636806468065680666806768068680696807068071680726807368074680756807668077680786807968080680816808268083680846808568086680876808868089680906809168092680936809468095680966809768098680996810068101681026810368104681056810668107681086810968110681116811268113681146811568116681176811868119681206812168122681236812468125681266812768128681296813068131681326813368134681356813668137681386813968140681416814268143681446814568146681476814868149681506815168152681536815468155681566815768158681596816068161681626816368164681656816668167681686816968170681716817268173681746817568176681776817868179681806818168182681836818468185681866818768188681896819068191681926819368194681956819668197681986819968200682016820268203682046820568206682076820868209682106821168212682136821468215682166821768218682196822068221682226822368224682256822668227682286822968230682316823268233682346823568236682376823868239682406824168242682436824468245682466824768248682496825068251682526825368254682556825668257682586825968260682616826268263682646826568266682676826868269682706827168272682736827468275682766827768278682796828068281682826828368284682856828668287682886828968290682916829268293682946829568296682976829868299683006830168302683036830468305683066830768308683096831068311683126831368314683156831668317683186831968320683216832268323683246832568326683276832868329683306833168332683336833468335683366833768338683396834068341683426834368344683456834668347683486834968350683516835268353683546835568356683576835868359683606836168362683636836468365683666836768368683696837068371683726837368374683756837668377683786837968380683816838268383683846838568386683876838868389683906839168392683936839468395683966839768398683996840068401684026840368404684056840668407684086840968410684116841268413684146841568416684176841868419684206842168422684236842468425684266842768428684296843068431684326843368434684356843668437684386843968440684416844268443684446844568446684476844868449684506845168452684536845468455684566845768458684596846068461684626846368464684656846668467684686846968470684716847268473684746847568476684776847868479684806848168482684836848468485684866848768488684896849068491684926849368494684956849668497684986849968500685016850268503685046850568506685076850868509685106851168512685136851468515685166851768518685196852068521685226852368524685256852668527685286852968530685316853268533685346853568536685376853868539685406854168542685436854468545685466854768548685496855068551685526855368554685556855668557685586855968560685616856268563685646856568566685676856868569685706857168572685736857468575685766857768578685796858068581685826858368584685856858668587685886858968590685916859268593685946859568596685976859868599686006860168602686036860468605686066860768608686096861068611686126861368614686156861668617686186861968620686216862268623686246862568626686276862868629686306863168632686336863468635686366863768638686396864068641686426864368644686456864668647686486864968650686516865268653686546865568656686576865868659686606866168662686636866468665686666866768668686696867068671686726867368674686756867668677686786867968680686816868268683686846868568686686876868868689686906869168692686936869468695686966869768698686996870068701687026870368704687056870668707687086870968710687116871268713687146871568716687176871868719687206872168722687236872468725687266872768728687296873068731687326873368734687356873668737687386873968740687416874268743687446874568746687476874868749687506875168752687536875468755687566875768758687596876068761687626876368764687656876668767687686876968770687716877268773687746877568776687776877868779687806878168782687836878468785687866878768788687896879068791687926879368794687956879668797687986879968800688016880268803688046880568806688076880868809688106881168812688136881468815688166881768818688196882068821688226882368824688256882668827688286882968830688316883268833688346883568836688376883868839688406884168842688436884468845688466884768848688496885068851688526885368854688556885668857688586885968860688616886268863688646886568866688676886868869688706887168872688736887468875688766887768878688796888068881688826888368884688856888668887688886888968890688916889268893688946889568896688976889868899689006890168902689036890468905689066890768908689096891068911689126891368914689156891668917689186891968920689216892268923689246892568926689276892868929689306893168932689336893468935689366893768938689396894068941689426894368944689456894668947689486894968950689516895268953689546895568956689576895868959689606896168962689636896468965689666896768968689696897068971689726897368974689756897668977689786897968980689816898268983689846898568986689876898868989689906899168992689936899468995689966899768998689996900069001690026900369004690056900669007690086900969010690116901269013690146901569016690176901869019690206902169022690236902469025690266902769028690296903069031690326903369034690356903669037690386903969040690416904269043690446904569046690476904869049690506905169052690536905469055690566905769058690596906069061690626906369064690656906669067690686906969070690716907269073690746907569076690776907869079690806908169082690836908469085690866908769088690896909069091690926909369094690956909669097690986909969100691016910269103691046910569106691076910869109691106911169112691136911469115691166911769118691196912069121691226912369124691256912669127691286912969130691316913269133691346913569136691376913869139691406914169142691436914469145691466914769148691496915069151691526915369154691556915669157691586915969160691616916269163691646916569166691676916869169691706917169172691736917469175691766917769178691796918069181691826918369184691856918669187691886918969190691916919269193691946919569196691976919869199692006920169202692036920469205692066920769208692096921069211692126921369214692156921669217692186921969220692216922269223692246922569226692276922869229692306923169232692336923469235692366923769238692396924069241692426924369244692456924669247692486924969250692516925269253692546925569256692576925869259692606926169262692636926469265692666926769268692696927069271692726927369274692756927669277692786927969280692816928269283692846928569286692876928869289692906929169292692936929469295692966929769298692996930069301693026930369304693056930669307693086930969310693116931269313693146931569316693176931869319693206932169322693236932469325693266932769328693296933069331693326933369334693356933669337693386933969340693416934269343693446934569346693476934869349693506935169352693536935469355693566935769358693596936069361693626936369364693656936669367693686936969370693716937269373693746937569376693776937869379693806938169382693836938469385693866938769388693896939069391693926939369394693956939669397693986939969400694016940269403694046940569406694076940869409694106941169412694136941469415694166941769418694196942069421694226942369424694256942669427694286942969430694316943269433694346943569436694376943869439694406944169442694436944469445694466944769448694496945069451694526945369454694556945669457694586945969460694616946269463694646946569466694676946869469694706947169472694736947469475694766947769478694796948069481694826948369484694856948669487694886948969490694916949269493694946949569496694976949869499695006950169502695036950469505695066950769508695096951069511695126951369514695156951669517695186951969520695216952269523695246952569526695276952869529695306953169532695336953469535695366953769538695396954069541695426954369544695456954669547695486954969550695516955269553695546955569556695576955869559695606956169562695636956469565695666956769568695696957069571695726957369574695756957669577695786957969580695816958269583695846958569586695876958869589695906959169592695936959469595695966959769598695996960069601696026960369604696056960669607696086960969610696116961269613696146961569616696176961869619696206962169622696236962469625696266962769628696296963069631696326963369634696356963669637696386963969640696416964269643696446964569646696476964869649696506965169652696536965469655696566965769658696596966069661696626966369664696656966669667696686966969670696716967269673696746967569676696776967869679696806968169682696836968469685696866968769688696896969069691696926969369694696956969669697696986969969700697016970269703697046970569706697076970869709697106971169712697136971469715697166971769718697196972069721697226972369724697256972669727697286972969730697316973269733697346973569736697376973869739697406974169742697436974469745697466974769748697496975069751697526975369754697556975669757697586975969760697616976269763697646976569766697676976869769697706977169772697736977469775697766977769778697796978069781697826978369784697856978669787697886978969790697916979269793697946979569796697976979869799698006980169802698036980469805698066980769808698096981069811698126981369814698156981669817698186981969820698216982269823698246982569826698276982869829698306983169832698336983469835698366983769838698396984069841698426984369844698456984669847698486984969850698516985269853698546985569856698576985869859698606986169862698636986469865698666986769868698696987069871698726987369874698756987669877698786987969880698816988269883698846988569886698876988869889698906989169892698936989469895698966989769898698996990069901699026990369904699056990669907699086990969910699116991269913699146991569916699176991869919699206992169922699236992469925699266992769928699296993069931699326993369934699356993669937699386993969940699416994269943699446994569946699476994869949699506995169952699536995469955699566995769958699596996069961699626996369964699656996669967699686996969970699716997269973699746997569976699776997869979699806998169982699836998469985699866998769988699896999069991699926999369994699956999669997699986999970000700017000270003700047000570006700077000870009700107001170012700137001470015700167001770018700197002070021700227002370024700257002670027700287002970030700317003270033700347003570036700377003870039700407004170042700437004470045700467004770048700497005070051700527005370054700557005670057700587005970060700617006270063700647006570066700677006870069700707007170072700737007470075700767007770078700797008070081700827008370084700857008670087700887008970090700917009270093700947009570096700977009870099701007010170102701037010470105701067010770108701097011070111701127011370114701157011670117701187011970120701217012270123701247012570126701277012870129701307013170132701337013470135701367013770138701397014070141701427014370144701457014670147701487014970150701517015270153701547015570156701577015870159701607016170162701637016470165701667016770168701697017070171701727017370174701757017670177701787017970180701817018270183701847018570186701877018870189701907019170192701937019470195701967019770198701997020070201702027020370204702057020670207702087020970210702117021270213702147021570216702177021870219702207022170222702237022470225702267022770228702297023070231702327023370234702357023670237702387023970240702417024270243702447024570246702477024870249702507025170252702537025470255702567025770258702597026070261702627026370264702657026670267702687026970270702717027270273702747027570276702777027870279702807028170282702837028470285702867028770288702897029070291702927029370294702957029670297702987029970300703017030270303703047030570306703077030870309703107031170312703137031470315703167031770318703197032070321703227032370324703257032670327703287032970330703317033270333703347033570336703377033870339703407034170342703437034470345703467034770348703497035070351703527035370354703557035670357703587035970360703617036270363703647036570366703677036870369703707037170372703737037470375703767037770378703797038070381703827038370384703857038670387703887038970390703917039270393703947039570396703977039870399704007040170402704037040470405704067040770408704097041070411704127041370414704157041670417704187041970420704217042270423704247042570426704277042870429704307043170432704337043470435704367043770438704397044070441704427044370444704457044670447704487044970450704517045270453704547045570456704577045870459704607046170462704637046470465704667046770468704697047070471704727047370474704757047670477704787047970480704817048270483704847048570486704877048870489704907049170492704937049470495704967049770498704997050070501705027050370504705057050670507705087050970510705117051270513705147051570516705177051870519705207052170522705237052470525705267052770528705297053070531705327053370534705357053670537705387053970540705417054270543705447054570546705477054870549705507055170552705537055470555705567055770558705597056070561705627056370564705657056670567705687056970570705717057270573705747057570576705777057870579705807058170582705837058470585705867058770588705897059070591705927059370594705957059670597705987059970600706017060270603706047060570606706077060870609706107061170612706137061470615706167061770618706197062070621706227062370624706257062670627706287062970630706317063270633706347063570636706377063870639706407064170642706437064470645706467064770648706497065070651706527065370654706557065670657706587065970660706617066270663706647066570666706677066870669706707067170672706737067470675706767067770678706797068070681706827068370684706857068670687706887068970690706917069270693706947069570696706977069870699707007070170702707037070470705707067070770708707097071070711707127071370714707157071670717707187071970720707217072270723707247072570726707277072870729707307073170732707337073470735707367073770738707397074070741707427074370744707457074670747707487074970750707517075270753707547075570756707577075870759707607076170762707637076470765707667076770768707697077070771707727077370774707757077670777707787077970780707817078270783707847078570786707877078870789707907079170792707937079470795707967079770798707997080070801708027080370804708057080670807708087080970810708117081270813708147081570816708177081870819708207082170822708237082470825708267082770828708297083070831708327083370834708357083670837708387083970840708417084270843708447084570846708477084870849708507085170852708537085470855708567085770858708597086070861708627086370864708657086670867708687086970870708717087270873708747087570876708777087870879708807088170882708837088470885708867088770888708897089070891708927089370894708957089670897708987089970900709017090270903709047090570906709077090870909709107091170912709137091470915709167091770918709197092070921709227092370924709257092670927709287092970930709317093270933709347093570936709377093870939709407094170942709437094470945709467094770948709497095070951709527095370954709557095670957709587095970960709617096270963709647096570966709677096870969709707097170972709737097470975709767097770978709797098070981709827098370984709857098670987709887098970990709917099270993709947099570996709977099870999710007100171002710037100471005710067100771008710097101071011710127101371014710157101671017710187101971020710217102271023710247102571026710277102871029710307103171032710337103471035710367103771038710397104071041710427104371044710457104671047710487104971050710517105271053710547105571056710577105871059710607106171062710637106471065710667106771068710697107071071710727107371074710757107671077710787107971080710817108271083710847108571086710877108871089710907109171092710937109471095710967109771098710997110071101711027110371104711057110671107711087110971110711117111271113711147111571116711177111871119711207112171122711237112471125711267112771128711297113071131711327113371134711357113671137711387113971140711417114271143711447114571146711477114871149711507115171152711537115471155711567115771158711597116071161711627116371164711657116671167711687116971170711717117271173711747117571176711777117871179711807118171182711837118471185711867118771188711897119071191711927119371194711957119671197711987119971200712017120271203712047120571206712077120871209712107121171212712137121471215712167121771218712197122071221712227122371224712257122671227712287122971230712317123271233712347123571236712377123871239712407124171242712437124471245712467124771248712497125071251712527125371254712557125671257712587125971260712617126271263712647126571266712677126871269712707127171272712737127471275712767127771278712797128071281712827128371284712857128671287712887128971290712917129271293712947129571296712977129871299713007130171302713037130471305713067130771308713097131071311713127131371314713157131671317713187131971320713217132271323713247132571326713277132871329713307133171332713337133471335713367133771338713397134071341713427134371344713457134671347713487134971350713517135271353713547135571356713577135871359713607136171362713637136471365713667136771368713697137071371713727137371374713757137671377713787137971380713817138271383713847138571386713877138871389713907139171392713937139471395713967139771398713997140071401714027140371404714057140671407714087140971410714117141271413714147141571416714177141871419714207142171422714237142471425714267142771428714297143071431714327143371434714357143671437714387143971440714417144271443714447144571446714477144871449714507145171452714537145471455714567145771458714597146071461714627146371464714657146671467714687146971470714717147271473714747147571476714777147871479714807148171482714837148471485714867148771488714897149071491714927149371494714957149671497714987149971500715017150271503715047150571506715077150871509715107151171512715137151471515715167151771518715197152071521715227152371524715257152671527715287152971530715317153271533715347153571536715377153871539715407154171542715437154471545715467154771548715497155071551715527155371554715557155671557715587155971560715617156271563715647156571566715677156871569715707157171572715737157471575715767157771578715797158071581715827158371584715857158671587715887158971590715917159271593715947159571596715977159871599716007160171602716037160471605716067160771608716097161071611716127161371614716157161671617716187161971620716217162271623716247162571626716277162871629716307163171632716337163471635716367163771638716397164071641716427164371644716457164671647716487164971650716517165271653716547165571656716577165871659716607166171662716637166471665716667166771668716697167071671716727167371674716757167671677716787167971680716817168271683716847168571686716877168871689716907169171692716937169471695716967169771698716997170071701717027170371704717057170671707717087170971710717117171271713717147171571716717177171871719717207172171722717237172471725717267172771728717297173071731717327173371734717357173671737717387173971740717417174271743717447174571746717477174871749717507175171752717537175471755717567175771758717597176071761717627176371764717657176671767717687176971770717717177271773717747177571776717777177871779717807178171782717837178471785717867178771788717897179071791717927179371794717957179671797717987179971800718017180271803718047180571806718077180871809718107181171812718137181471815718167181771818718197182071821718227182371824718257182671827718287182971830718317183271833718347183571836718377183871839718407184171842718437184471845718467184771848718497185071851718527185371854718557185671857718587185971860718617186271863718647186571866718677186871869718707187171872718737187471875718767187771878718797188071881718827188371884718857188671887718887188971890718917189271893718947189571896718977189871899719007190171902719037190471905719067190771908719097191071911719127191371914719157191671917719187191971920719217192271923719247192571926719277192871929719307193171932719337193471935719367193771938719397194071941719427194371944719457194671947719487194971950719517195271953719547195571956719577195871959719607196171962719637196471965719667196771968719697197071971719727197371974719757197671977719787197971980719817198271983719847198571986719877198871989719907199171992719937199471995719967199771998719997200072001720027200372004720057200672007720087200972010720117201272013720147201572016720177201872019720207202172022720237202472025720267202772028720297203072031720327203372034720357203672037720387203972040720417204272043720447204572046720477204872049720507205172052720537205472055720567205772058720597206072061720627206372064720657206672067720687206972070720717207272073720747207572076720777207872079720807208172082720837208472085720867208772088720897209072091720927209372094720957209672097720987209972100721017210272103721047210572106721077210872109721107211172112721137211472115721167211772118721197212072121721227212372124721257212672127721287212972130721317213272133721347213572136721377213872139721407214172142721437214472145721467214772148721497215072151721527215372154721557215672157721587215972160721617216272163721647216572166721677216872169721707217172172721737217472175721767217772178721797218072181721827218372184721857218672187721887218972190721917219272193721947219572196721977219872199722007220172202722037220472205722067220772208722097221072211722127221372214722157221672217722187221972220722217222272223722247222572226722277222872229722307223172232722337223472235722367223772238722397224072241722427224372244722457224672247722487224972250722517225272253722547225572256722577225872259722607226172262722637226472265722667226772268722697227072271722727227372274722757227672277722787227972280722817228272283722847228572286722877228872289722907229172292722937229472295722967229772298722997230072301723027230372304723057230672307723087230972310723117231272313723147231572316723177231872319723207232172322723237232472325723267232772328723297233072331723327233372334723357233672337723387233972340723417234272343723447234572346723477234872349723507235172352723537235472355723567235772358723597236072361723627236372364723657236672367723687236972370723717237272373723747237572376723777237872379723807238172382723837238472385723867238772388723897239072391723927239372394723957239672397723987239972400724017240272403724047240572406724077240872409724107241172412724137241472415724167241772418724197242072421724227242372424724257242672427724287242972430724317243272433724347243572436724377243872439724407244172442724437244472445724467244772448724497245072451724527245372454724557245672457724587245972460724617246272463724647246572466724677246872469724707247172472724737247472475724767247772478724797248072481724827248372484724857248672487724887248972490724917249272493724947249572496724977249872499725007250172502725037250472505725067250772508725097251072511725127251372514725157251672517725187251972520725217252272523725247252572526725277252872529725307253172532725337253472535725367253772538725397254072541725427254372544725457254672547725487254972550725517255272553725547255572556725577255872559725607256172562725637256472565725667256772568725697257072571725727257372574725757257672577725787257972580725817258272583725847258572586725877258872589725907259172592725937259472595725967259772598725997260072601726027260372604726057260672607726087260972610726117261272613726147261572616726177261872619726207262172622726237262472625726267262772628726297263072631726327263372634726357263672637726387263972640726417264272643726447264572646726477264872649726507265172652726537265472655726567265772658726597266072661726627266372664726657266672667726687266972670726717267272673726747267572676726777267872679726807268172682726837268472685726867268772688726897269072691726927269372694726957269672697726987269972700727017270272703727047270572706727077270872709727107271172712727137271472715727167271772718727197272072721727227272372724727257272672727727287272972730727317273272733727347273572736727377273872739727407274172742727437274472745727467274772748727497275072751727527275372754727557275672757727587275972760727617276272763727647276572766727677276872769727707277172772727737277472775727767277772778727797278072781727827278372784727857278672787727887278972790727917279272793727947279572796727977279872799728007280172802728037280472805728067280772808728097281072811728127281372814728157281672817728187281972820728217282272823728247282572826728277282872829728307283172832728337283472835728367283772838728397284072841728427284372844728457284672847728487284972850728517285272853728547285572856728577285872859728607286172862728637286472865728667286772868728697287072871728727287372874728757287672877728787287972880728817288272883728847288572886728877288872889728907289172892728937289472895728967289772898728997290072901729027290372904729057290672907729087290972910729117291272913729147291572916729177291872919729207292172922729237292472925729267292772928729297293072931729327293372934729357293672937729387293972940729417294272943729447294572946729477294872949729507295172952729537295472955729567295772958729597296072961729627296372964729657296672967729687296972970729717297272973729747297572976729777297872979729807298172982729837298472985729867298772988729897299072991729927299372994729957299672997729987299973000730017300273003730047300573006730077300873009730107301173012730137301473015730167301773018730197302073021730227302373024730257302673027730287302973030730317303273033730347303573036730377303873039730407304173042730437304473045730467304773048730497305073051730527305373054730557305673057730587305973060730617306273063730647306573066730677306873069730707307173072730737307473075730767307773078730797308073081730827308373084730857308673087730887308973090730917309273093730947309573096730977309873099731007310173102731037310473105731067310773108731097311073111731127311373114731157311673117731187311973120731217312273123731247312573126731277312873129731307313173132731337313473135731367313773138731397314073141731427314373144731457314673147731487314973150731517315273153731547315573156731577315873159731607316173162731637316473165731667316773168731697317073171731727317373174731757317673177731787317973180731817318273183731847318573186731877318873189731907319173192731937319473195731967319773198731997320073201732027320373204732057320673207732087320973210732117321273213732147321573216732177321873219732207322173222732237322473225732267322773228732297323073231732327323373234732357323673237732387323973240732417324273243732447324573246732477324873249732507325173252732537325473255732567325773258732597326073261732627326373264732657326673267732687326973270732717327273273732747327573276732777327873279732807328173282732837328473285732867328773288732897329073291732927329373294732957329673297732987329973300733017330273303733047330573306733077330873309733107331173312733137331473315733167331773318733197332073321733227332373324733257332673327733287332973330733317333273333733347333573336733377333873339733407334173342733437334473345733467334773348733497335073351733527335373354733557335673357733587335973360733617336273363733647336573366733677336873369733707337173372733737337473375733767337773378733797338073381733827338373384733857338673387733887338973390733917339273393733947339573396733977339873399734007340173402734037340473405734067340773408734097341073411734127341373414734157341673417734187341973420734217342273423734247342573426734277342873429734307343173432734337343473435734367343773438734397344073441734427344373444734457344673447734487344973450734517345273453734547345573456734577345873459734607346173462734637346473465734667346773468734697347073471734727347373474734757347673477734787347973480734817348273483734847348573486734877348873489734907349173492734937349473495734967349773498734997350073501735027350373504735057350673507735087350973510735117351273513735147351573516735177351873519735207352173522735237352473525735267352773528735297353073531735327353373534735357353673537735387353973540735417354273543735447354573546735477354873549735507355173552735537355473555735567355773558735597356073561735627356373564735657356673567735687356973570735717357273573735747357573576735777357873579735807358173582735837358473585735867358773588735897359073591735927359373594735957359673597735987359973600736017360273603736047360573606736077360873609736107361173612736137361473615736167361773618736197362073621736227362373624736257362673627736287362973630736317363273633736347363573636736377363873639736407364173642736437364473645736467364773648736497365073651736527365373654736557365673657736587365973660736617366273663736647366573666736677366873669736707367173672736737367473675736767367773678736797368073681736827368373684736857368673687736887368973690736917369273693736947369573696736977369873699737007370173702737037370473705737067370773708737097371073711737127371373714737157371673717737187371973720737217372273723737247372573726737277372873729737307373173732737337373473735737367373773738737397374073741737427374373744737457374673747737487374973750737517375273753737547375573756737577375873759737607376173762737637376473765737667376773768737697377073771737727377373774737757377673777737787377973780737817378273783737847378573786737877378873789737907379173792737937379473795737967379773798737997380073801738027380373804738057380673807738087380973810738117381273813738147381573816738177381873819738207382173822738237382473825738267382773828738297383073831738327383373834738357383673837738387383973840738417384273843738447384573846738477384873849738507385173852738537385473855738567385773858738597386073861738627386373864738657386673867738687386973870738717387273873738747387573876738777387873879738807388173882738837388473885738867388773888738897389073891738927389373894738957389673897738987389973900739017390273903739047390573906739077390873909739107391173912739137391473915739167391773918739197392073921739227392373924739257392673927739287392973930739317393273933739347393573936739377393873939739407394173942739437394473945739467394773948739497395073951739527395373954739557395673957739587395973960739617396273963739647396573966739677396873969739707397173972739737397473975739767397773978739797398073981739827398373984739857398673987739887398973990739917399273993739947399573996739977399873999740007400174002740037400474005740067400774008740097401074011740127401374014740157401674017740187401974020740217402274023740247402574026740277402874029740307403174032740337403474035740367403774038740397404074041740427404374044740457404674047740487404974050740517405274053740547405574056740577405874059740607406174062740637406474065740667406774068740697407074071740727407374074740757407674077740787407974080740817408274083740847408574086740877408874089740907409174092740937409474095740967409774098740997410074101741027410374104741057410674107741087410974110741117411274113741147411574116741177411874119741207412174122741237412474125741267412774128741297413074131741327413374134741357413674137741387413974140741417414274143741447414574146741477414874149741507415174152741537415474155741567415774158741597416074161741627416374164741657416674167741687416974170741717417274173741747417574176741777417874179741807418174182741837418474185741867418774188741897419074191741927419374194741957419674197741987419974200742017420274203742047420574206742077420874209742107421174212742137421474215742167421774218742197422074221742227422374224742257422674227742287422974230742317423274233742347423574236742377423874239742407424174242742437424474245742467424774248742497425074251742527425374254742557425674257742587425974260742617426274263742647426574266742677426874269742707427174272742737427474275742767427774278742797428074281742827428374284742857428674287742887428974290742917429274293742947429574296742977429874299743007430174302743037430474305743067430774308743097431074311743127431374314743157431674317743187431974320743217432274323743247432574326743277432874329743307433174332743337433474335743367433774338743397434074341743427434374344743457434674347743487434974350743517435274353743547435574356743577435874359743607436174362743637436474365743667436774368743697437074371743727437374374743757437674377743787437974380743817438274383743847438574386743877438874389743907439174392743937439474395743967439774398743997440074401744027440374404744057440674407744087440974410744117441274413744147441574416744177441874419744207442174422744237442474425744267442774428744297443074431744327443374434744357443674437744387443974440744417444274443744447444574446744477444874449744507445174452744537445474455744567445774458744597446074461744627446374464744657446674467744687446974470744717447274473744747447574476744777447874479744807448174482744837448474485744867448774488744897449074491744927449374494744957449674497744987449974500745017450274503745047450574506745077450874509745107451174512745137451474515745167451774518745197452074521745227452374524745257452674527745287452974530745317453274533745347453574536745377453874539745407454174542745437454474545745467454774548745497455074551745527455374554745557455674557745587455974560745617456274563745647456574566745677456874569745707457174572745737457474575745767457774578745797458074581745827458374584745857458674587745887458974590745917459274593745947459574596745977459874599746007460174602746037460474605746067460774608746097461074611746127461374614746157461674617746187461974620746217462274623746247462574626746277462874629746307463174632746337463474635746367463774638746397464074641746427464374644746457464674647746487464974650746517465274653746547465574656746577465874659746607466174662746637466474665746667466774668746697467074671746727467374674746757467674677746787467974680746817468274683746847468574686746877468874689746907469174692746937469474695746967469774698746997470074701747027470374704747057470674707747087470974710747117471274713747147471574716747177471874719747207472174722747237472474725747267472774728747297473074731747327473374734747357473674737747387473974740747417474274743747447474574746747477474874749747507475174752747537475474755747567475774758747597476074761747627476374764747657476674767747687476974770747717477274773747747477574776747777477874779747807478174782747837478474785747867478774788747897479074791747927479374794747957479674797747987479974800748017480274803748047480574806748077480874809748107481174812748137481474815748167481774818748197482074821748227482374824748257482674827748287482974830748317483274833748347483574836748377483874839748407484174842748437484474845748467484774848748497485074851748527485374854748557485674857748587485974860748617486274863748647486574866748677486874869748707487174872748737487474875748767487774878748797488074881748827488374884748857488674887748887488974890748917489274893748947489574896748977489874899749007490174902749037490474905749067490774908749097491074911749127491374914749157491674917749187491974920749217492274923749247492574926749277492874929749307493174932749337493474935749367493774938749397494074941749427494374944749457494674947749487494974950749517495274953749547495574956749577495874959749607496174962749637496474965749667496774968749697497074971749727497374974749757497674977749787497974980749817498274983749847498574986749877498874989749907499174992749937499474995749967499774998749997500075001750027500375004750057500675007750087500975010750117501275013750147501575016750177501875019750207502175022750237502475025750267502775028750297503075031750327503375034750357503675037750387503975040750417504275043750447504575046750477504875049750507505175052750537505475055750567505775058750597506075061750627506375064750657506675067750687506975070750717507275073750747507575076750777507875079750807508175082750837508475085750867508775088750897509075091750927509375094750957509675097750987509975100751017510275103751047510575106751077510875109751107511175112751137511475115751167511775118751197512075121751227512375124751257512675127751287512975130751317513275133751347513575136751377513875139751407514175142751437514475145751467514775148751497515075151751527515375154751557515675157751587515975160751617516275163751647516575166751677516875169751707517175172751737517475175751767517775178751797518075181751827518375184751857518675187751887518975190751917519275193751947519575196751977519875199752007520175202752037520475205752067520775208752097521075211752127521375214752157521675217752187521975220752217522275223752247522575226752277522875229752307523175232752337523475235752367523775238752397524075241752427524375244752457524675247752487524975250752517525275253752547525575256752577525875259752607526175262752637526475265752667526775268752697527075271752727527375274752757527675277752787527975280752817528275283752847528575286752877528875289752907529175292752937529475295752967529775298752997530075301753027530375304753057530675307753087530975310753117531275313753147531575316753177531875319753207532175322753237532475325753267532775328753297533075331753327533375334753357533675337753387533975340753417534275343753447534575346753477534875349753507535175352753537535475355753567535775358753597536075361753627536375364753657536675367753687536975370753717537275373753747537575376753777537875379753807538175382753837538475385753867538775388753897539075391753927539375394753957539675397753987539975400754017540275403754047540575406754077540875409754107541175412754137541475415754167541775418754197542075421754227542375424754257542675427754287542975430754317543275433754347543575436754377543875439754407544175442754437544475445754467544775448754497545075451754527545375454754557545675457754587545975460754617546275463754647546575466754677546875469754707547175472754737547475475754767547775478754797548075481754827548375484754857548675487754887548975490754917549275493754947549575496754977549875499755007550175502755037550475505755067550775508755097551075511755127551375514755157551675517755187551975520755217552275523755247552575526755277552875529755307553175532755337553475535755367553775538755397554075541755427554375544755457554675547755487554975550755517555275553755547555575556755577555875559755607556175562755637556475565755667556775568755697557075571755727557375574755757557675577755787557975580755817558275583755847558575586755877558875589755907559175592755937559475595755967559775598755997560075601756027560375604756057560675607756087560975610756117561275613756147561575616756177561875619756207562175622756237562475625756267562775628756297563075631756327563375634756357563675637756387563975640756417564275643756447564575646756477564875649756507565175652756537565475655756567565775658756597566075661756627566375664756657566675667756687566975670756717567275673756747567575676756777567875679756807568175682756837568475685756867568775688756897569075691756927569375694756957569675697756987569975700757017570275703757047570575706757077570875709757107571175712757137571475715757167571775718757197572075721757227572375724757257572675727757287572975730757317573275733757347573575736757377573875739757407574175742757437574475745757467574775748757497575075751757527575375754757557575675757757587575975760757617576275763757647576575766757677576875769757707577175772757737577475775757767577775778757797578075781757827578375784757857578675787757887578975790757917579275793757947579575796757977579875799758007580175802758037580475805758067580775808758097581075811758127581375814758157581675817758187581975820758217582275823758247582575826758277582875829758307583175832758337583475835758367583775838758397584075841758427584375844758457584675847758487584975850758517585275853758547585575856758577585875859758607586175862758637586475865758667586775868758697587075871758727587375874758757587675877758787587975880758817588275883758847588575886758877588875889758907589175892758937589475895758967589775898758997590075901759027590375904759057590675907759087590975910759117591275913759147591575916759177591875919759207592175922759237592475925759267592775928759297593075931759327593375934759357593675937759387593975940759417594275943759447594575946759477594875949759507595175952759537595475955759567595775958759597596075961759627596375964759657596675967759687596975970759717597275973759747597575976759777597875979759807598175982759837598475985759867598775988759897599075991759927599375994759957599675997759987599976000760017600276003760047600576006760077600876009760107601176012760137601476015760167601776018760197602076021760227602376024760257602676027760287602976030760317603276033760347603576036760377603876039760407604176042760437604476045760467604776048760497605076051760527605376054760557605676057760587605976060760617606276063760647606576066760677606876069760707607176072760737607476075760767607776078760797608076081760827608376084760857608676087760887608976090760917609276093760947609576096760977609876099761007610176102761037610476105761067610776108761097611076111761127611376114761157611676117761187611976120761217612276123761247612576126761277612876129761307613176132761337613476135761367613776138761397614076141761427614376144761457614676147761487614976150761517615276153761547615576156761577615876159761607616176162761637616476165761667616776168761697617076171761727617376174761757617676177761787617976180761817618276183761847618576186761877618876189761907619176192761937619476195761967619776198761997620076201762027620376204762057620676207762087620976210762117621276213762147621576216762177621876219762207622176222762237622476225762267622776228762297623076231762327623376234762357623676237762387623976240762417624276243762447624576246762477624876249762507625176252762537625476255762567625776258762597626076261762627626376264762657626676267762687626976270762717627276273762747627576276762777627876279762807628176282762837628476285762867628776288762897629076291762927629376294762957629676297762987629976300763017630276303763047630576306763077630876309763107631176312763137631476315763167631776318763197632076321763227632376324763257632676327763287632976330763317633276333763347633576336763377633876339763407634176342763437634476345763467634776348763497635076351763527635376354763557635676357763587635976360763617636276363763647636576366763677636876369763707637176372763737637476375763767637776378763797638076381763827638376384763857638676387763887638976390763917639276393763947639576396763977639876399764007640176402764037640476405764067640776408764097641076411764127641376414764157641676417764187641976420764217642276423764247642576426764277642876429764307643176432764337643476435764367643776438764397644076441764427644376444764457644676447764487644976450764517645276453764547645576456764577645876459764607646176462764637646476465764667646776468764697647076471764727647376474764757647676477764787647976480764817648276483764847648576486764877648876489764907649176492764937649476495764967649776498764997650076501765027650376504765057650676507765087650976510765117651276513765147651576516765177651876519765207652176522765237652476525765267652776528765297653076531765327653376534765357653676537765387653976540765417654276543765447654576546765477654876549765507655176552765537655476555765567655776558765597656076561765627656376564765657656676567765687656976570765717657276573765747657576576765777657876579765807658176582765837658476585765867658776588765897659076591765927659376594765957659676597765987659976600766017660276603766047660576606766077660876609766107661176612766137661476615766167661776618766197662076621766227662376624766257662676627766287662976630766317663276633766347663576636766377663876639766407664176642766437664476645766467664776648766497665076651766527665376654766557665676657766587665976660766617666276663766647666576666766677666876669766707667176672766737667476675766767667776678766797668076681766827668376684766857668676687766887668976690766917669276693766947669576696766977669876699767007670176702767037670476705767067670776708767097671076711767127671376714767157671676717767187671976720767217672276723767247672576726767277672876729767307673176732767337673476735767367673776738767397674076741767427674376744767457674676747767487674976750767517675276753767547675576756767577675876759767607676176762767637676476765767667676776768767697677076771767727677376774767757677676777767787677976780767817678276783767847678576786767877678876789767907679176792767937679476795767967679776798767997680076801768027680376804768057680676807768087680976810768117681276813768147681576816768177681876819768207682176822768237682476825768267682776828768297683076831768327683376834768357683676837768387683976840768417684276843768447684576846768477684876849768507685176852768537685476855768567685776858768597686076861768627686376864768657686676867768687686976870768717687276873768747687576876768777687876879768807688176882768837688476885768867688776888768897689076891768927689376894768957689676897768987689976900769017690276903769047690576906769077690876909769107691176912769137691476915769167691776918769197692076921769227692376924769257692676927769287692976930769317693276933769347693576936769377693876939769407694176942769437694476945769467694776948769497695076951769527695376954769557695676957769587695976960769617696276963769647696576966769677696876969769707697176972769737697476975769767697776978769797698076981769827698376984769857698676987769887698976990769917699276993769947699576996769977699876999770007700177002770037700477005770067700777008770097701077011770127701377014770157701677017770187701977020770217702277023770247702577026770277702877029770307703177032770337703477035770367703777038770397704077041770427704377044770457704677047770487704977050770517705277053770547705577056770577705877059770607706177062770637706477065770667706777068770697707077071770727707377074770757707677077770787707977080770817708277083770847708577086770877708877089770907709177092770937709477095770967709777098770997710077101771027710377104771057710677107771087710977110771117711277113771147711577116771177711877119771207712177122771237712477125771267712777128771297713077131771327713377134771357713677137771387713977140771417714277143771447714577146771477714877149771507715177152771537715477155771567715777158771597716077161771627716377164771657716677167771687716977170771717717277173771747717577176771777717877179771807718177182771837718477185771867718777188771897719077191771927719377194771957719677197771987719977200772017720277203772047720577206772077720877209772107721177212772137721477215772167721777218772197722077221772227722377224772257722677227772287722977230772317723277233772347723577236772377723877239772407724177242772437724477245772467724777248772497725077251772527725377254772557725677257772587725977260772617726277263772647726577266772677726877269772707727177272772737727477275772767727777278772797728077281772827728377284772857728677287772887728977290772917729277293772947729577296772977729877299773007730177302773037730477305773067730777308773097731077311773127731377314773157731677317773187731977320773217732277323773247732577326773277732877329773307733177332773337733477335773367733777338773397734077341773427734377344773457734677347773487734977350773517735277353773547735577356773577735877359773607736177362773637736477365773667736777368773697737077371773727737377374773757737677377773787737977380773817738277383773847738577386773877738877389773907739177392773937739477395773967739777398773997740077401774027740377404774057740677407774087740977410774117741277413774147741577416774177741877419774207742177422774237742477425774267742777428774297743077431774327743377434774357743677437774387743977440774417744277443774447744577446774477744877449774507745177452774537745477455774567745777458774597746077461774627746377464774657746677467774687746977470774717747277473774747747577476774777747877479774807748177482774837748477485774867748777488774897749077491774927749377494774957749677497774987749977500775017750277503775047750577506775077750877509775107751177512775137751477515775167751777518775197752077521775227752377524775257752677527775287752977530775317753277533775347753577536775377753877539775407754177542775437754477545775467754777548775497755077551775527755377554775557755677557775587755977560775617756277563775647756577566775677756877569775707757177572775737757477575775767757777578775797758077581775827758377584775857758677587775887758977590775917759277593775947759577596775977759877599776007760177602776037760477605776067760777608776097761077611776127761377614776157761677617776187761977620776217762277623776247762577626776277762877629776307763177632776337763477635776367763777638776397764077641776427764377644776457764677647776487764977650776517765277653776547765577656776577765877659776607766177662776637766477665776667766777668776697767077671776727767377674776757767677677776787767977680776817768277683776847768577686776877768877689776907769177692776937769477695776967769777698776997770077701777027770377704777057770677707777087770977710777117771277713777147771577716777177771877719777207772177722777237772477725777267772777728777297773077731777327773377734777357773677737777387773977740777417774277743777447774577746777477774877749777507775177752777537775477755777567775777758777597776077761777627776377764777657776677767777687776977770777717777277773777747777577776777777777877779777807778177782777837778477785777867778777788777897779077791777927779377794777957779677797777987779977800778017780277803778047780577806778077780877809778107781177812778137781477815778167781777818778197782077821778227782377824778257782677827778287782977830778317783277833778347783577836778377783877839778407784177842778437784477845778467784777848778497785077851778527785377854778557785677857778587785977860778617786277863778647786577866778677786877869778707787177872778737787477875778767787777878778797788077881778827788377884778857788677887778887788977890778917789277893778947789577896778977789877899779007790177902779037790477905779067790777908779097791077911779127791377914779157791677917779187791977920779217792277923779247792577926779277792877929779307793177932779337793477935779367793777938779397794077941779427794377944779457794677947779487794977950779517795277953779547795577956779577795877959779607796177962779637796477965779667796777968779697797077971779727797377974779757797677977779787797977980779817798277983779847798577986779877798877989779907799177992779937799477995779967799777998779997800078001780027800378004780057800678007780087800978010780117801278013780147801578016780177801878019780207802178022780237802478025780267802778028780297803078031780327803378034780357803678037780387803978040780417804278043780447804578046780477804878049780507805178052780537805478055780567805778058780597806078061780627806378064780657806678067780687806978070780717807278073780747807578076780777807878079780807808178082780837808478085780867808778088780897809078091780927809378094780957809678097780987809978100781017810278103781047810578106781077810878109781107811178112781137811478115781167811778118781197812078121781227812378124781257812678127781287812978130781317813278133781347813578136781377813878139781407814178142781437814478145781467814778148781497815078151781527815378154781557815678157781587815978160781617816278163781647816578166781677816878169781707817178172781737817478175781767817778178781797818078181781827818378184781857818678187781887818978190781917819278193781947819578196781977819878199782007820178202782037820478205782067820778208782097821078211782127821378214782157821678217782187821978220782217822278223782247822578226782277822878229782307823178232782337823478235782367823778238782397824078241782427824378244782457824678247782487824978250782517825278253782547825578256782577825878259782607826178262782637826478265782667826778268782697827078271782727827378274782757827678277782787827978280782817828278283782847828578286782877828878289782907829178292782937829478295782967829778298782997830078301783027830378304783057830678307783087830978310783117831278313783147831578316783177831878319783207832178322783237832478325783267832778328783297833078331783327833378334783357833678337783387833978340783417834278343783447834578346783477834878349783507835178352783537835478355783567835778358783597836078361783627836378364783657836678367783687836978370783717837278373783747837578376783777837878379783807838178382783837838478385783867838778388783897839078391783927839378394783957839678397783987839978400784017840278403784047840578406784077840878409784107841178412784137841478415784167841778418784197842078421784227842378424784257842678427784287842978430784317843278433784347843578436784377843878439784407844178442784437844478445784467844778448784497845078451784527845378454784557845678457784587845978460784617846278463784647846578466784677846878469784707847178472784737847478475784767847778478784797848078481784827848378484784857848678487784887848978490784917849278493784947849578496784977849878499785007850178502785037850478505785067850778508785097851078511785127851378514785157851678517785187851978520785217852278523785247852578526785277852878529785307853178532785337853478535785367853778538785397854078541785427854378544785457854678547785487854978550785517855278553785547855578556785577855878559785607856178562785637856478565785667856778568785697857078571785727857378574785757857678577785787857978580785817858278583785847858578586785877858878589785907859178592785937859478595785967859778598785997860078601786027860378604786057860678607786087860978610786117861278613786147861578616786177861878619786207862178622786237862478625786267862778628786297863078631786327863378634786357863678637786387863978640786417864278643786447864578646786477864878649786507865178652786537865478655786567865778658786597866078661786627866378664786657866678667786687866978670786717867278673786747867578676786777867878679786807868178682786837868478685786867868778688786897869078691786927869378694786957869678697786987869978700787017870278703787047870578706787077870878709787107871178712787137871478715787167871778718787197872078721787227872378724787257872678727787287872978730787317873278733787347873578736787377873878739787407874178742787437874478745787467874778748787497875078751787527875378754787557875678757787587875978760787617876278763787647876578766787677876878769787707877178772787737877478775787767877778778787797878078781787827878378784787857878678787787887878978790787917879278793787947879578796787977879878799788007880178802788037880478805788067880778808788097881078811788127881378814788157881678817788187881978820788217882278823788247882578826788277882878829788307883178832788337883478835788367883778838788397884078841788427884378844788457884678847788487884978850788517885278853788547885578856788577885878859788607886178862788637886478865788667886778868788697887078871788727887378874788757887678877788787887978880788817888278883788847888578886788877888878889788907889178892788937889478895788967889778898788997890078901789027890378904789057890678907789087890978910789117891278913789147891578916789177891878919789207892178922789237892478925789267892778928789297893078931789327893378934789357893678937789387893978940789417894278943789447894578946789477894878949789507895178952789537895478955789567895778958789597896078961789627896378964789657896678967789687896978970789717897278973789747897578976789777897878979789807898178982789837898478985789867898778988789897899078991789927899378994789957899678997789987899979000790017900279003790047900579006790077900879009790107901179012790137901479015790167901779018790197902079021790227902379024790257902679027790287902979030790317903279033790347903579036790377903879039790407904179042790437904479045790467904779048790497905079051790527905379054790557905679057790587905979060790617906279063790647906579066790677906879069790707907179072790737907479075790767907779078790797908079081790827908379084790857908679087790887908979090790917909279093790947909579096790977909879099791007910179102791037910479105791067910779108791097911079111791127911379114791157911679117791187911979120791217912279123791247912579126791277912879129791307913179132791337913479135791367913779138791397914079141791427914379144791457914679147791487914979150791517915279153791547915579156791577915879159791607916179162791637916479165791667916779168791697917079171791727917379174791757917679177791787917979180791817918279183791847918579186791877918879189791907919179192791937919479195791967919779198791997920079201792027920379204792057920679207792087920979210792117921279213792147921579216792177921879219792207922179222792237922479225792267922779228792297923079231792327923379234792357923679237792387923979240792417924279243792447924579246792477924879249792507925179252792537925479255792567925779258792597926079261792627926379264792657926679267792687926979270792717927279273792747927579276792777927879279792807928179282792837928479285792867928779288792897929079291792927929379294792957929679297792987929979300793017930279303793047930579306793077930879309793107931179312793137931479315793167931779318793197932079321793227932379324793257932679327793287932979330793317933279333793347933579336793377933879339793407934179342793437934479345793467934779348793497935079351793527935379354793557935679357793587935979360793617936279363793647936579366793677936879369793707937179372793737937479375793767937779378793797938079381793827938379384793857938679387793887938979390793917939279393793947939579396793977939879399794007940179402794037940479405794067940779408794097941079411794127941379414794157941679417794187941979420794217942279423794247942579426794277942879429794307943179432794337943479435794367943779438794397944079441794427944379444794457944679447794487944979450794517945279453794547945579456794577945879459794607946179462794637946479465794667946779468794697947079471794727947379474794757947679477794787947979480794817948279483794847948579486794877948879489794907949179492794937949479495794967949779498794997950079501795027950379504795057950679507795087950979510795117951279513795147951579516795177951879519795207952179522795237952479525795267952779528795297953079531795327953379534795357953679537795387953979540795417954279543795447954579546795477954879549795507955179552795537955479555795567955779558795597956079561795627956379564795657956679567795687956979570795717957279573795747957579576795777957879579795807958179582795837958479585795867958779588795897959079591795927959379594795957959679597795987959979600796017960279603796047960579606796077960879609796107961179612796137961479615796167961779618796197962079621796227962379624796257962679627796287962979630796317963279633796347963579636796377963879639796407964179642796437964479645796467964779648796497965079651796527965379654796557965679657796587965979660796617966279663796647966579666796677966879669796707967179672796737967479675796767967779678796797968079681796827968379684796857968679687796887968979690796917969279693796947969579696796977969879699797007970179702797037970479705797067970779708797097971079711797127971379714797157971679717797187971979720797217972279723797247972579726797277972879729797307973179732797337973479735797367973779738797397974079741797427974379744797457974679747797487974979750797517975279753797547975579756797577975879759797607976179762797637976479765797667976779768797697977079771797727977379774797757977679777797787977979780797817978279783797847978579786797877978879789797907979179792797937979479795797967979779798797997980079801798027980379804798057980679807798087980979810798117981279813798147981579816798177981879819798207982179822798237982479825798267982779828798297983079831798327983379834798357983679837798387983979840798417984279843798447984579846798477984879849798507985179852798537985479855798567985779858798597986079861798627986379864798657986679867798687986979870798717987279873798747987579876798777987879879798807988179882798837988479885798867988779888798897989079891798927989379894798957989679897798987989979900799017990279903799047990579906799077990879909799107991179912799137991479915799167991779918799197992079921799227992379924799257992679927799287992979930799317993279933799347993579936799377993879939799407994179942799437994479945799467994779948799497995079951799527995379954799557995679957799587995979960799617996279963799647996579966799677996879969799707997179972799737997479975799767997779978799797998079981799827998379984799857998679987799887998979990799917999279993799947999579996799977999879999800008000180002800038000480005800068000780008800098001080011800128001380014800158001680017800188001980020800218002280023800248002580026800278002880029800308003180032800338003480035800368003780038800398004080041800428004380044800458004680047800488004980050800518005280053800548005580056800578005880059800608006180062800638006480065800668006780068800698007080071800728007380074800758007680077800788007980080800818008280083800848008580086800878008880089800908009180092800938009480095800968009780098800998010080101801028010380104801058010680107801088010980110801118011280113801148011580116801178011880119801208012180122801238012480125801268012780128801298013080131801328013380134801358013680137801388013980140801418014280143801448014580146801478014880149801508015180152801538015480155801568015780158801598016080161801628016380164801658016680167801688016980170801718017280173801748017580176801778017880179801808018180182801838018480185801868018780188801898019080191801928019380194801958019680197801988019980200802018020280203802048020580206802078020880209802108021180212802138021480215802168021780218802198022080221802228022380224802258022680227802288022980230802318023280233802348023580236802378023880239802408024180242802438024480245802468024780248802498025080251802528025380254802558025680257802588025980260802618026280263802648026580266802678026880269802708027180272802738027480275802768027780278802798028080281802828028380284802858028680287802888028980290802918029280293802948029580296802978029880299803008030180302803038030480305803068030780308803098031080311803128031380314803158031680317803188031980320803218032280323803248032580326803278032880329803308033180332803338033480335803368033780338803398034080341803428034380344803458034680347803488034980350803518035280353803548035580356803578035880359803608036180362803638036480365803668036780368803698037080371803728037380374803758037680377803788037980380803818038280383803848038580386803878038880389803908039180392803938039480395803968039780398803998040080401804028040380404804058040680407804088040980410804118041280413804148041580416804178041880419804208042180422804238042480425804268042780428804298043080431804328043380434804358043680437804388043980440804418044280443804448044580446804478044880449804508045180452804538045480455804568045780458804598046080461804628046380464804658046680467804688046980470804718047280473804748047580476804778047880479804808048180482804838048480485804868048780488804898049080491804928049380494804958049680497804988049980500805018050280503805048050580506805078050880509805108051180512805138051480515805168051780518805198052080521805228052380524805258052680527805288052980530805318053280533805348053580536805378053880539805408054180542805438054480545805468054780548805498055080551805528055380554805558055680557805588055980560805618056280563805648056580566805678056880569805708057180572805738057480575805768057780578805798058080581805828058380584805858058680587805888058980590805918059280593805948059580596805978059880599806008060180602806038060480605806068060780608806098061080611806128061380614806158061680617806188061980620806218062280623806248062580626806278062880629806308063180632806338063480635806368063780638806398064080641806428064380644806458064680647806488064980650806518065280653806548065580656806578065880659806608066180662806638066480665806668066780668806698067080671806728067380674806758067680677806788067980680806818068280683806848068580686806878068880689806908069180692806938069480695806968069780698806998070080701807028070380704807058070680707807088070980710807118071280713807148071580716807178071880719807208072180722807238072480725807268072780728807298073080731807328073380734807358073680737807388073980740807418074280743807448074580746807478074880749807508075180752807538075480755807568075780758807598076080761807628076380764807658076680767807688076980770807718077280773807748077580776807778077880779807808078180782807838078480785807868078780788807898079080791807928079380794807958079680797807988079980800808018080280803808048080580806808078080880809808108081180812808138081480815808168081780818808198082080821808228082380824808258082680827808288082980830808318083280833808348083580836808378083880839808408084180842808438084480845808468084780848808498085080851808528085380854808558085680857808588085980860808618086280863808648086580866808678086880869808708087180872808738087480875808768087780878808798088080881808828088380884808858088680887808888088980890808918089280893808948089580896808978089880899809008090180902809038090480905809068090780908809098091080911809128091380914809158091680917809188091980920809218092280923809248092580926809278092880929809308093180932809338093480935809368093780938809398094080941809428094380944809458094680947809488094980950809518095280953809548095580956809578095880959809608096180962809638096480965809668096780968809698097080971809728097380974809758097680977809788097980980809818098280983809848098580986809878098880989809908099180992809938099480995809968099780998809998100081001810028100381004810058100681007810088100981010810118101281013810148101581016810178101881019810208102181022810238102481025810268102781028810298103081031810328103381034810358103681037810388103981040810418104281043810448104581046810478104881049810508105181052810538105481055810568105781058810598106081061810628106381064810658106681067810688106981070810718107281073810748107581076810778107881079810808108181082810838108481085810868108781088810898109081091810928109381094810958109681097810988109981100811018110281103811048110581106811078110881109811108111181112811138111481115811168111781118811198112081121811228112381124811258112681127811288112981130811318113281133811348113581136811378113881139811408114181142811438114481145811468114781148811498115081151811528115381154811558115681157811588115981160811618116281163811648116581166811678116881169811708117181172811738117481175811768117781178811798118081181811828118381184811858118681187811888118981190811918119281193811948119581196811978119881199812008120181202812038120481205812068120781208812098121081211812128121381214812158121681217812188121981220812218122281223812248122581226812278122881229812308123181232812338123481235812368123781238812398124081241812428124381244812458124681247812488124981250812518125281253812548125581256812578125881259812608126181262812638126481265812668126781268812698127081271812728127381274812758127681277812788127981280812818128281283812848128581286812878128881289812908129181292812938129481295812968129781298812998130081301813028130381304813058130681307813088130981310813118131281313813148131581316813178131881319813208132181322813238132481325813268132781328813298133081331813328133381334813358133681337813388133981340813418134281343813448134581346813478134881349813508135181352813538135481355813568135781358813598136081361813628136381364813658136681367813688136981370813718137281373813748137581376813778137881379813808138181382813838138481385813868138781388813898139081391813928139381394813958139681397813988139981400814018140281403814048140581406814078140881409814108141181412814138141481415814168141781418814198142081421814228142381424814258142681427814288142981430814318143281433814348143581436814378143881439814408144181442814438144481445814468144781448814498145081451814528145381454814558145681457814588145981460814618146281463814648146581466814678146881469814708147181472814738147481475814768147781478814798148081481814828148381484814858148681487814888148981490814918149281493814948149581496814978149881499815008150181502815038150481505815068150781508815098151081511815128151381514815158151681517815188151981520815218152281523815248152581526815278152881529815308153181532815338153481535815368153781538815398154081541815428154381544815458154681547815488154981550815518155281553815548155581556815578155881559815608156181562815638156481565815668156781568815698157081571815728157381574815758157681577815788157981580815818158281583815848158581586815878158881589815908159181592815938159481595815968159781598815998160081601816028160381604816058160681607816088160981610816118161281613816148161581616816178161881619816208162181622816238162481625816268162781628816298163081631816328163381634816358163681637816388163981640816418164281643816448164581646816478164881649816508165181652816538165481655816568165781658816598166081661816628166381664816658166681667816688166981670816718167281673816748167581676816778167881679816808168181682816838168481685816868168781688816898169081691816928169381694816958169681697816988169981700817018170281703817048170581706817078170881709817108171181712817138171481715817168171781718817198172081721817228172381724817258172681727817288172981730817318173281733817348173581736817378173881739817408174181742817438174481745817468174781748817498175081751817528175381754817558175681757817588175981760817618176281763817648176581766817678176881769817708177181772817738177481775817768177781778817798178081781817828178381784817858178681787817888178981790817918179281793817948179581796817978179881799818008180181802818038180481805818068180781808818098181081811818128181381814818158181681817818188181981820818218182281823818248182581826818278182881829818308183181832818338183481835818368183781838818398184081841818428184381844818458184681847818488184981850818518185281853818548185581856818578185881859818608186181862818638186481865818668186781868818698187081871818728187381874818758187681877818788187981880818818188281883818848188581886818878188881889818908189181892818938189481895818968189781898818998190081901819028190381904819058190681907819088190981910819118191281913819148191581916819178191881919819208192181922819238192481925819268192781928819298193081931819328193381934819358193681937819388193981940819418194281943819448194581946819478194881949819508195181952819538195481955819568195781958819598196081961819628196381964819658196681967819688196981970819718197281973819748197581976819778197881979819808198181982819838198481985819868198781988819898199081991819928199381994819958199681997819988199982000820018200282003820048200582006820078200882009820108201182012820138201482015820168201782018820198202082021820228202382024820258202682027820288202982030820318203282033820348203582036820378203882039820408204182042820438204482045820468204782048820498205082051820528205382054820558205682057820588205982060820618206282063820648206582066820678206882069820708207182072820738207482075820768207782078820798208082081820828208382084820858208682087820888208982090820918209282093820948209582096820978209882099821008210182102821038210482105821068210782108821098211082111821128211382114821158211682117821188211982120821218212282123821248212582126821278212882129821308213182132821338213482135821368213782138821398214082141821428214382144821458214682147821488214982150821518215282153821548215582156821578215882159821608216182162821638216482165821668216782168821698217082171821728217382174821758217682177821788217982180821818218282183821848218582186821878218882189821908219182192821938219482195821968219782198821998220082201822028220382204822058220682207822088220982210822118221282213822148221582216822178221882219822208222182222822238222482225822268222782228822298223082231822328223382234822358223682237822388223982240822418224282243822448224582246822478224882249822508225182252822538225482255822568225782258822598226082261822628226382264822658226682267822688226982270822718227282273822748227582276822778227882279822808228182282822838228482285822868228782288822898229082291822928229382294822958229682297822988229982300823018230282303823048230582306823078230882309823108231182312823138231482315823168231782318823198232082321823228232382324823258232682327823288232982330823318233282333823348233582336823378233882339823408234182342823438234482345823468234782348823498235082351823528235382354823558235682357823588235982360823618236282363823648236582366823678236882369823708237182372823738237482375823768237782378823798238082381823828238382384823858238682387823888238982390823918239282393823948239582396823978239882399824008240182402824038240482405824068240782408824098241082411824128241382414824158241682417824188241982420824218242282423824248242582426824278242882429824308243182432824338243482435824368243782438824398244082441824428244382444824458244682447824488244982450824518245282453824548245582456824578245882459824608246182462824638246482465824668246782468824698247082471824728247382474824758247682477824788247982480824818248282483824848248582486824878248882489824908249182492824938249482495824968249782498824998250082501825028250382504825058250682507825088250982510825118251282513825148251582516825178251882519825208252182522825238252482525825268252782528825298253082531825328253382534825358253682537825388253982540825418254282543825448254582546825478254882549825508255182552825538255482555825568255782558825598256082561825628256382564825658256682567825688256982570825718257282573825748257582576825778257882579825808258182582825838258482585825868258782588825898259082591825928259382594825958259682597825988259982600826018260282603826048260582606826078260882609826108261182612826138261482615826168261782618826198262082621826228262382624826258262682627826288262982630826318263282633826348263582636826378263882639826408264182642826438264482645826468264782648826498265082651826528265382654826558265682657826588265982660826618266282663826648266582666826678266882669826708267182672826738267482675826768267782678826798268082681826828268382684826858268682687826888268982690826918269282693826948269582696826978269882699827008270182702827038270482705827068270782708827098271082711827128271382714827158271682717827188271982720827218272282723827248272582726827278272882729827308273182732827338273482735827368273782738827398274082741827428274382744827458274682747827488274982750827518275282753827548275582756827578275882759827608276182762827638276482765827668276782768827698277082771827728277382774827758277682777827788277982780827818278282783827848278582786827878278882789827908279182792827938279482795827968279782798827998280082801828028280382804828058280682807828088280982810828118281282813828148281582816828178281882819828208282182822828238282482825828268282782828828298283082831828328283382834828358283682837828388283982840828418284282843828448284582846828478284882849828508285182852828538285482855828568285782858828598286082861828628286382864828658286682867828688286982870828718287282873828748287582876828778287882879828808288182882828838288482885828868288782888828898289082891828928289382894828958289682897828988289982900829018290282903829048290582906829078290882909829108291182912829138291482915829168291782918829198292082921829228292382924829258292682927829288292982930829318293282933829348293582936829378293882939829408294182942829438294482945829468294782948829498295082951829528295382954829558295682957829588295982960829618296282963829648296582966829678296882969829708297182972829738297482975829768297782978829798298082981829828298382984829858298682987829888298982990829918299282993829948299582996829978299882999830008300183002830038300483005830068300783008830098301083011830128301383014830158301683017830188301983020830218302283023830248302583026830278302883029830308303183032830338303483035830368303783038830398304083041830428304383044830458304683047830488304983050830518305283053830548305583056830578305883059830608306183062830638306483065830668306783068830698307083071830728307383074830758307683077830788307983080830818308283083830848308583086830878308883089830908309183092830938309483095830968309783098830998310083101831028310383104831058310683107831088310983110831118311283113831148311583116831178311883119831208312183122831238312483125831268312783128831298313083131831328313383134831358313683137831388313983140831418314283143831448314583146831478314883149831508315183152831538315483155831568315783158831598316083161831628316383164831658316683167831688316983170831718317283173831748317583176831778317883179831808318183182831838318483185831868318783188831898319083191831928319383194831958319683197831988319983200832018320283203832048320583206832078320883209832108321183212832138321483215832168321783218832198322083221832228322383224832258322683227832288322983230832318323283233832348323583236832378323883239832408324183242832438324483245832468324783248832498325083251832528325383254832558325683257832588325983260832618326283263832648326583266832678326883269832708327183272832738327483275832768327783278832798328083281832828328383284832858328683287832888328983290832918329283293832948329583296832978329883299833008330183302833038330483305833068330783308833098331083311833128331383314833158331683317833188331983320833218332283323833248332583326833278332883329833308333183332833338333483335833368333783338833398334083341833428334383344833458334683347833488334983350833518335283353833548335583356833578335883359833608336183362833638336483365833668336783368833698337083371833728337383374833758337683377833788337983380833818338283383833848338583386833878338883389833908339183392833938339483395833968339783398833998340083401834028340383404834058340683407834088340983410834118341283413834148341583416834178341883419834208342183422834238342483425834268342783428834298343083431834328343383434834358343683437834388343983440834418344283443834448344583446834478344883449834508345183452834538345483455834568345783458834598346083461834628346383464834658346683467834688346983470834718347283473834748347583476834778347883479834808348183482834838348483485834868348783488834898349083491834928349383494834958349683497834988349983500835018350283503835048350583506835078350883509835108351183512835138351483515835168351783518835198352083521835228352383524835258352683527835288352983530835318353283533835348353583536835378353883539835408354183542835438354483545835468354783548835498355083551835528355383554835558355683557835588355983560835618356283563835648356583566835678356883569835708357183572835738357483575835768357783578835798358083581835828358383584835858358683587835888358983590835918359283593835948359583596835978359883599836008360183602836038360483605836068360783608836098361083611836128361383614836158361683617836188361983620836218362283623836248362583626836278362883629836308363183632836338363483635836368363783638836398364083641836428364383644836458364683647836488364983650836518365283653836548365583656836578365883659836608366183662836638366483665836668366783668836698367083671836728367383674836758367683677836788367983680836818368283683836848368583686836878368883689836908369183692836938369483695836968369783698836998370083701837028370383704837058370683707837088370983710837118371283713837148371583716837178371883719837208372183722837238372483725837268372783728837298373083731837328373383734837358373683737837388373983740837418374283743837448374583746837478374883749837508375183752837538375483755837568375783758837598376083761837628376383764837658376683767837688376983770837718377283773837748377583776837778377883779837808378183782837838378483785837868378783788837898379083791837928379383794837958379683797837988379983800838018380283803838048380583806838078380883809838108381183812838138381483815838168381783818838198382083821838228382383824838258382683827838288382983830838318383283833838348383583836838378383883839838408384183842838438384483845838468384783848838498385083851838528385383854838558385683857838588385983860838618386283863838648386583866838678386883869838708387183872838738387483875838768387783878838798388083881838828388383884838858388683887838888388983890838918389283893838948389583896838978389883899839008390183902839038390483905839068390783908839098391083911839128391383914839158391683917839188391983920839218392283923839248392583926839278392883929839308393183932839338393483935839368393783938839398394083941839428394383944839458394683947839488394983950839518395283953839548395583956839578395883959839608396183962839638396483965839668396783968839698397083971839728397383974839758397683977839788397983980839818398283983839848398583986839878398883989839908399183992839938399483995839968399783998839998400084001840028400384004840058400684007840088400984010840118401284013840148401584016840178401884019840208402184022840238402484025840268402784028840298403084031840328403384034840358403684037840388403984040840418404284043840448404584046840478404884049840508405184052840538405484055840568405784058840598406084061840628406384064840658406684067840688406984070840718407284073840748407584076840778407884079840808408184082840838408484085840868408784088840898409084091840928409384094840958409684097840988409984100841018410284103841048410584106841078410884109841108411184112841138411484115841168411784118841198412084121841228412384124841258412684127841288412984130841318413284133841348413584136841378413884139841408414184142841438414484145841468414784148841498415084151841528415384154841558415684157841588415984160841618416284163841648416584166841678416884169841708417184172841738417484175841768417784178841798418084181841828418384184841858418684187841888418984190841918419284193841948419584196841978419884199842008420184202842038420484205842068420784208842098421084211842128421384214842158421684217842188421984220842218422284223842248422584226842278422884229842308423184232842338423484235842368423784238842398424084241842428424384244842458424684247842488424984250842518425284253842548425584256842578425884259842608426184262842638426484265842668426784268842698427084271842728427384274842758427684277842788427984280842818428284283842848428584286842878428884289842908429184292842938429484295842968429784298842998430084301843028430384304843058430684307843088430984310843118431284313843148431584316843178431884319843208432184322843238432484325843268432784328843298433084331843328433384334843358433684337843388433984340843418434284343843448434584346843478434884349843508435184352843538435484355843568435784358843598436084361843628436384364843658436684367843688436984370843718437284373843748437584376843778437884379843808438184382843838438484385843868438784388843898439084391843928439384394843958439684397843988439984400844018440284403844048440584406844078440884409844108441184412844138441484415844168441784418844198442084421844228442384424844258442684427844288442984430844318443284433844348443584436844378443884439844408444184442844438444484445844468444784448844498445084451844528445384454844558445684457844588445984460844618446284463844648446584466844678446884469844708447184472844738447484475844768447784478844798448084481844828448384484844858448684487844888448984490844918449284493844948449584496844978449884499845008450184502845038450484505845068450784508845098451084511845128451384514845158451684517845188451984520845218452284523845248452584526845278452884529845308453184532845338453484535845368453784538845398454084541845428454384544845458454684547845488454984550845518455284553845548455584556845578455884559845608456184562845638456484565845668456784568845698457084571845728457384574845758457684577845788457984580845818458284583845848458584586845878458884589845908459184592845938459484595845968459784598845998460084601846028460384604846058460684607846088460984610846118461284613846148461584616846178461884619846208462184622846238462484625846268462784628846298463084631846328463384634846358463684637846388463984640846418464284643846448464584646846478464884649846508465184652846538465484655846568465784658846598466084661846628466384664846658466684667846688466984670846718467284673846748467584676846778467884679846808468184682846838468484685846868468784688846898469084691846928469384694846958469684697846988469984700847018470284703847048470584706847078470884709847108471184712847138471484715847168471784718847198472084721847228472384724847258472684727847288472984730847318473284733847348473584736847378473884739847408474184742847438474484745847468474784748847498475084751847528475384754847558475684757847588475984760847618476284763847648476584766847678476884769847708477184772847738477484775847768477784778847798478084781847828478384784847858478684787847888478984790847918479284793847948479584796847978479884799848008480184802848038480484805848068480784808848098481084811848128481384814848158481684817848188481984820848218482284823848248482584826848278482884829848308483184832848338483484835848368483784838848398484084841848428484384844848458484684847848488484984850848518485284853848548485584856848578485884859848608486184862848638486484865848668486784868848698487084871848728487384874848758487684877848788487984880848818488284883848848488584886848878488884889848908489184892848938489484895848968489784898848998490084901849028490384904849058490684907849088490984910849118491284913849148491584916849178491884919849208492184922849238492484925849268492784928849298493084931849328493384934849358493684937849388493984940849418494284943849448494584946849478494884949849508495184952849538495484955849568495784958849598496084961849628496384964849658496684967849688496984970849718497284973849748497584976849778497884979849808498184982849838498484985849868498784988849898499084991849928499384994849958499684997849988499985000850018500285003850048500585006850078500885009850108501185012850138501485015850168501785018850198502085021850228502385024850258502685027850288502985030850318503285033850348503585036850378503885039850408504185042850438504485045850468504785048850498505085051850528505385054850558505685057850588505985060850618506285063850648506585066850678506885069850708507185072850738507485075850768507785078850798508085081850828508385084850858508685087850888508985090850918509285093850948509585096850978509885099851008510185102851038510485105851068510785108851098511085111851128511385114851158511685117851188511985120851218512285123851248512585126851278512885129851308513185132851338513485135851368513785138851398514085141851428514385144851458514685147851488514985150851518515285153851548515585156851578515885159851608516185162851638516485165851668516785168851698517085171851728517385174851758517685177851788517985180851818518285183851848518585186851878518885189851908519185192851938519485195851968519785198851998520085201852028520385204852058520685207852088520985210852118521285213852148521585216852178521885219852208522185222852238522485225852268522785228852298523085231852328523385234852358523685237852388523985240852418524285243852448524585246852478524885249852508525185252852538525485255852568525785258852598526085261852628526385264852658526685267852688526985270852718527285273852748527585276852778527885279852808528185282852838528485285852868528785288852898529085291852928529385294852958529685297852988529985300853018530285303853048530585306853078530885309853108531185312853138531485315853168531785318853198532085321853228532385324853258532685327853288532985330853318533285333853348533585336853378533885339853408534185342853438534485345853468534785348853498535085351853528535385354853558535685357853588535985360853618536285363853648536585366853678536885369853708537185372853738537485375853768537785378853798538085381853828538385384853858538685387853888538985390853918539285393853948539585396853978539885399854008540185402854038540485405854068540785408854098541085411854128541385414854158541685417854188541985420854218542285423854248542585426854278542885429854308543185432854338543485435854368543785438854398544085441854428544385444854458544685447854488544985450854518545285453854548545585456854578545885459854608546185462854638546485465854668546785468854698547085471854728547385474854758547685477854788547985480854818548285483854848548585486854878548885489854908549185492854938549485495854968549785498854998550085501855028550385504855058550685507855088550985510855118551285513855148551585516855178551885519855208552185522855238552485525855268552785528855298553085531855328553385534855358553685537855388553985540855418554285543855448554585546855478554885549855508555185552855538555485555855568555785558855598556085561855628556385564855658556685567855688556985570855718557285573855748557585576855778557885579855808558185582855838558485585855868558785588855898559085591855928559385594855958559685597855988559985600856018560285603856048560585606856078560885609856108561185612856138561485615856168561785618856198562085621856228562385624856258562685627856288562985630856318563285633856348563585636856378563885639856408564185642856438564485645856468564785648856498565085651856528565385654856558565685657856588565985660856618566285663856648566585666856678566885669856708567185672856738567485675856768567785678856798568085681856828568385684856858568685687856888568985690856918569285693856948569585696856978569885699857008570185702857038570485705857068570785708857098571085711857128571385714857158571685717857188571985720857218572285723857248572585726857278572885729857308573185732857338573485735857368573785738857398574085741857428574385744857458574685747857488574985750857518575285753857548575585756857578575885759857608576185762857638576485765857668576785768857698577085771857728577385774857758577685777857788577985780857818578285783857848578585786857878578885789857908579185792857938579485795857968579785798857998580085801858028580385804858058580685807858088580985810858118581285813858148581585816858178581885819858208582185822858238582485825858268582785828858298583085831858328583385834858358583685837858388583985840858418584285843858448584585846858478584885849858508585185852858538585485855858568585785858858598586085861858628586385864858658586685867858688586985870858718587285873858748587585876858778587885879858808588185882858838588485885858868588785888858898589085891858928589385894858958589685897858988589985900859018590285903859048590585906859078590885909859108591185912859138591485915859168591785918859198592085921859228592385924859258592685927859288592985930859318593285933859348593585936859378593885939859408594185942859438594485945859468594785948859498595085951859528595385954859558595685957859588595985960859618596285963859648596585966859678596885969859708597185972859738597485975859768597785978859798598085981859828598385984859858598685987859888598985990859918599285993859948599585996859978599885999860008600186002860038600486005860068600786008860098601086011860128601386014860158601686017860188601986020860218602286023860248602586026860278602886029860308603186032860338603486035860368603786038860398604086041860428604386044860458604686047860488604986050860518605286053860548605586056860578605886059860608606186062860638606486065860668606786068860698607086071860728607386074860758607686077860788607986080860818608286083860848608586086860878608886089860908609186092860938609486095860968609786098860998610086101861028610386104861058610686107861088610986110861118611286113861148611586116861178611886119861208612186122861238612486125861268612786128861298613086131861328613386134861358613686137861388613986140861418614286143861448614586146861478614886149861508615186152861538615486155861568615786158861598616086161861628616386164861658616686167861688616986170861718617286173861748617586176861778617886179861808618186182861838618486185861868618786188861898619086191861928619386194861958619686197861988619986200862018620286203862048620586206862078620886209862108621186212862138621486215862168621786218862198622086221862228622386224862258622686227862288622986230862318623286233862348623586236862378623886239862408624186242862438624486245862468624786248862498625086251862528625386254862558625686257862588625986260862618626286263862648626586266862678626886269862708627186272862738627486275862768627786278862798628086281862828628386284862858628686287862888628986290862918629286293862948629586296862978629886299863008630186302863038630486305863068630786308863098631086311863128631386314863158631686317863188631986320863218632286323863248632586326863278632886329863308633186332863338633486335863368633786338863398634086341863428634386344863458634686347863488634986350863518635286353863548635586356863578635886359863608636186362863638636486365863668636786368863698637086371863728637386374863758637686377863788637986380863818638286383863848638586386863878638886389863908639186392863938639486395863968639786398863998640086401864028640386404864058640686407864088640986410864118641286413864148641586416864178641886419864208642186422864238642486425864268642786428864298643086431864328643386434864358643686437864388643986440864418644286443864448644586446864478644886449864508645186452864538645486455864568645786458864598646086461864628646386464864658646686467864688646986470864718647286473864748647586476864778647886479864808648186482864838648486485864868648786488864898649086491864928649386494864958649686497864988649986500865018650286503865048650586506865078650886509865108651186512865138651486515865168651786518865198652086521865228652386524865258652686527865288652986530865318653286533865348653586536865378653886539865408654186542865438654486545865468654786548865498655086551865528655386554865558655686557865588655986560865618656286563865648656586566865678656886569865708657186572865738657486575865768657786578865798658086581865828658386584865858658686587865888658986590865918659286593865948659586596865978659886599866008660186602866038660486605866068660786608866098661086611866128661386614866158661686617866188661986620866218662286623866248662586626866278662886629866308663186632866338663486635866368663786638866398664086641866428664386644866458664686647866488664986650866518665286653866548665586656866578665886659866608666186662866638666486665866668666786668866698667086671866728667386674866758667686677866788667986680866818668286683866848668586686866878668886689866908669186692866938669486695866968669786698866998670086701867028670386704867058670686707867088670986710867118671286713867148671586716867178671886719867208672186722867238672486725867268672786728867298673086731867328673386734867358673686737867388673986740867418674286743867448674586746867478674886749867508675186752867538675486755867568675786758867598676086761867628676386764867658676686767867688676986770867718677286773867748677586776867778677886779867808678186782867838678486785867868678786788867898679086791867928679386794867958679686797867988679986800868018680286803868048680586806868078680886809868108681186812868138681486815868168681786818868198682086821868228682386824868258682686827868288682986830868318683286833868348683586836868378683886839868408684186842868438684486845868468684786848868498685086851868528685386854868558685686857868588685986860868618686286863868648686586866868678686886869868708687186872868738687486875868768687786878868798688086881868828688386884868858688686887868888688986890868918689286893868948689586896868978689886899869008690186902869038690486905869068690786908869098691086911869128691386914869158691686917869188691986920869218692286923869248692586926869278692886929869308693186932869338693486935869368693786938869398694086941869428694386944869458694686947869488694986950869518695286953869548695586956869578695886959869608696186962869638696486965869668696786968869698697086971869728697386974869758697686977869788697986980869818698286983869848698586986869878698886989869908699186992869938699486995869968699786998869998700087001870028700387004870058700687007870088700987010870118701287013870148701587016870178701887019870208702187022870238702487025870268702787028870298703087031870328703387034870358703687037870388703987040870418704287043870448704587046870478704887049870508705187052870538705487055870568705787058870598706087061870628706387064870658706687067870688706987070870718707287073870748707587076870778707887079870808708187082870838708487085870868708787088870898709087091870928709387094870958709687097870988709987100871018710287103871048710587106871078710887109871108711187112871138711487115871168711787118871198712087121871228712387124871258712687127871288712987130871318713287133871348713587136871378713887139871408714187142871438714487145871468714787148871498715087151871528715387154871558715687157871588715987160871618716287163871648716587166871678716887169871708717187172871738717487175871768717787178871798718087181871828718387184871858718687187871888718987190871918719287193871948719587196871978719887199872008720187202872038720487205872068720787208872098721087211872128721387214872158721687217872188721987220872218722287223872248722587226872278722887229872308723187232872338723487235872368723787238872398724087241872428724387244872458724687247872488724987250872518725287253872548725587256872578725887259872608726187262872638726487265872668726787268872698727087271872728727387274872758727687277872788727987280872818728287283872848728587286872878728887289872908729187292872938729487295872968729787298872998730087301873028730387304873058730687307873088730987310873118731287313873148731587316873178731887319873208732187322873238732487325873268732787328873298733087331873328733387334873358733687337873388733987340873418734287343873448734587346873478734887349873508735187352873538735487355873568735787358873598736087361873628736387364873658736687367873688736987370873718737287373873748737587376873778737887379873808738187382873838738487385873868738787388873898739087391873928739387394873958739687397873988739987400874018740287403874048740587406874078740887409874108741187412874138741487415874168741787418874198742087421874228742387424874258742687427874288742987430874318743287433874348743587436874378743887439874408744187442874438744487445874468744787448874498745087451874528745387454874558745687457874588745987460874618746287463874648746587466874678746887469874708747187472874738747487475874768747787478874798748087481874828748387484874858748687487874888748987490874918749287493874948749587496874978749887499875008750187502875038750487505875068750787508875098751087511875128751387514875158751687517875188751987520875218752287523875248752587526875278752887529875308753187532875338753487535875368753787538875398754087541875428754387544875458754687547875488754987550875518755287553875548755587556875578755887559875608756187562875638756487565875668756787568875698757087571875728757387574875758757687577875788757987580875818758287583875848758587586875878758887589875908759187592875938759487595875968759787598875998760087601876028760387604876058760687607876088760987610876118761287613876148761587616876178761887619876208762187622876238762487625876268762787628876298763087631876328763387634876358763687637876388763987640876418764287643876448764587646876478764887649876508765187652876538765487655876568765787658876598766087661876628766387664876658766687667876688766987670876718767287673876748767587676876778767887679876808768187682876838768487685876868768787688876898769087691876928769387694876958769687697876988769987700877018770287703877048770587706877078770887709877108771187712877138771487715877168771787718877198772087721877228772387724877258772687727877288772987730877318773287733877348773587736877378773887739877408774187742877438774487745877468774787748877498775087751877528775387754877558775687757877588775987760877618776287763877648776587766877678776887769877708777187772877738777487775877768777787778877798778087781877828778387784877858778687787877888778987790877918779287793877948779587796877978779887799878008780187802878038780487805878068780787808878098781087811878128781387814878158781687817878188781987820878218782287823878248782587826878278782887829878308783187832878338783487835878368783787838878398784087841878428784387844878458784687847878488784987850878518785287853878548785587856878578785887859878608786187862878638786487865878668786787868878698787087871878728787387874878758787687877878788787987880878818788287883878848788587886878878788887889878908789187892878938789487895878968789787898878998790087901879028790387904879058790687907879088790987910879118791287913879148791587916879178791887919879208792187922879238792487925879268792787928879298793087931879328793387934879358793687937879388793987940879418794287943879448794587946879478794887949879508795187952879538795487955879568795787958879598796087961879628796387964879658796687967879688796987970879718797287973879748797587976879778797887979879808798187982879838798487985879868798787988879898799087991879928799387994879958799687997879988799988000880018800288003880048800588006880078800888009880108801188012880138801488015880168801788018880198802088021880228802388024880258802688027880288802988030880318803288033880348803588036880378803888039880408804188042880438804488045880468804788048880498805088051880528805388054880558805688057880588805988060880618806288063880648806588066880678806888069880708807188072880738807488075880768807788078880798808088081880828808388084880858808688087880888808988090880918809288093880948809588096880978809888099881008810188102881038810488105881068810788108881098811088111881128811388114881158811688117881188811988120881218812288123881248812588126881278812888129881308813188132881338813488135881368813788138881398814088141881428814388144881458814688147881488814988150881518815288153881548815588156881578815888159881608816188162881638816488165881668816788168881698817088171881728817388174881758817688177881788817988180881818818288183881848818588186881878818888189881908819188192881938819488195881968819788198881998820088201882028820388204882058820688207882088820988210882118821288213882148821588216882178821888219882208822188222882238822488225882268822788228882298823088231882328823388234882358823688237882388823988240882418824288243882448824588246882478824888249882508825188252882538825488255882568825788258882598826088261882628826388264882658826688267882688826988270882718827288273882748827588276882778827888279882808828188282882838828488285882868828788288882898829088291882928829388294882958829688297882988829988300883018830288303883048830588306883078830888309883108831188312883138831488315883168831788318883198832088321883228832388324883258832688327883288832988330883318833288333883348833588336883378833888339883408834188342883438834488345883468834788348883498835088351883528835388354883558835688357883588835988360883618836288363883648836588366883678836888369883708837188372883738837488375883768837788378883798838088381883828838388384883858838688387883888838988390883918839288393883948839588396883978839888399884008840188402884038840488405884068840788408884098841088411884128841388414884158841688417884188841988420884218842288423884248842588426884278842888429884308843188432884338843488435884368843788438884398844088441884428844388444884458844688447884488844988450884518845288453884548845588456884578845888459884608846188462884638846488465884668846788468884698847088471884728847388474884758847688477884788847988480884818848288483884848848588486884878848888489884908849188492884938849488495884968849788498884998850088501885028850388504885058850688507885088850988510885118851288513885148851588516885178851888519885208852188522885238852488525885268852788528885298853088531885328853388534885358853688537885388853988540885418854288543885448854588546885478854888549885508855188552885538855488555885568855788558885598856088561885628856388564885658856688567885688856988570885718857288573885748857588576885778857888579885808858188582885838858488585885868858788588885898859088591885928859388594885958859688597885988859988600886018860288603886048860588606886078860888609886108861188612886138861488615886168861788618886198862088621886228862388624886258862688627886288862988630886318863288633886348863588636886378863888639886408864188642886438864488645886468864788648886498865088651886528865388654886558865688657886588865988660886618866288663886648866588666886678866888669886708867188672886738867488675886768867788678886798868088681886828868388684886858868688687886888868988690886918869288693886948869588696886978869888699887008870188702887038870488705887068870788708887098871088711887128871388714887158871688717887188871988720887218872288723887248872588726887278872888729887308873188732887338873488735887368873788738887398874088741887428874388744887458874688747887488874988750887518875288753887548875588756887578875888759887608876188762887638876488765887668876788768887698877088771887728877388774887758877688777887788877988780887818878288783887848878588786887878878888789887908879188792887938879488795887968879788798887998880088801888028880388804888058880688807888088880988810888118881288813888148881588816888178881888819888208882188822888238882488825888268882788828888298883088831888328883388834888358883688837888388883988840888418884288843888448884588846888478884888849888508885188852888538885488855888568885788858888598886088861888628886388864888658886688867888688886988870888718887288873888748887588876888778887888879888808888188882888838888488885888868888788888888898889088891888928889388894888958889688897888988889988900889018890288903889048890588906889078890888909889108891188912889138891488915889168891788918889198892088921889228892388924889258892688927889288892988930889318893288933889348893588936889378893888939889408894188942889438894488945889468894788948889498895088951889528895388954889558895688957889588895988960889618896288963889648896588966889678896888969889708897188972889738897488975889768897788978889798898088981889828898388984889858898688987889888898988990889918899288993889948899588996889978899888999890008900189002890038900489005890068900789008890098901089011890128901389014890158901689017890188901989020890218902289023890248902589026890278902889029890308903189032890338903489035890368903789038890398904089041890428904389044890458904689047890488904989050890518905289053890548905589056890578905889059890608906189062890638906489065890668906789068890698907089071890728907389074890758907689077890788907989080890818908289083890848908589086890878908889089890908909189092890938909489095890968909789098890998910089101891028910389104891058910689107891088910989110891118911289113891148911589116891178911889119891208912189122891238912489125891268912789128891298913089131891328913389134891358913689137891388913989140891418914289143891448914589146891478914889149891508915189152891538915489155891568915789158891598916089161891628916389164891658916689167891688916989170891718917289173891748917589176891778917889179891808918189182891838918489185891868918789188891898919089191891928919389194891958919689197891988919989200892018920289203892048920589206892078920889209892108921189212892138921489215892168921789218892198922089221892228922389224892258922689227892288922989230892318923289233892348923589236892378923889239892408924189242892438924489245892468924789248892498925089251892528925389254892558925689257892588925989260892618926289263892648926589266892678926889269892708927189272892738927489275892768927789278892798928089281892828928389284892858928689287892888928989290892918929289293892948929589296892978929889299893008930189302893038930489305893068930789308893098931089311893128931389314893158931689317893188931989320893218932289323893248932589326893278932889329893308933189332893338933489335893368933789338893398934089341893428934389344893458934689347893488934989350893518935289353893548935589356893578935889359893608936189362893638936489365893668936789368893698937089371893728937389374893758937689377893788937989380893818938289383893848938589386893878938889389893908939189392893938939489395893968939789398893998940089401894028940389404894058940689407894088940989410894118941289413894148941589416894178941889419894208942189422894238942489425894268942789428894298943089431894328943389434894358943689437894388943989440894418944289443894448944589446894478944889449894508945189452894538945489455894568945789458894598946089461894628946389464894658946689467894688946989470894718947289473894748947589476894778947889479894808948189482894838948489485894868948789488894898949089491894928949389494894958949689497894988949989500895018950289503895048950589506895078950889509895108951189512895138951489515895168951789518895198952089521895228952389524895258952689527895288952989530895318953289533895348953589536895378953889539895408954189542895438954489545895468954789548895498955089551895528955389554895558955689557895588955989560895618956289563895648956589566895678956889569895708957189572895738957489575895768957789578895798958089581895828958389584895858958689587895888958989590895918959289593895948959589596895978959889599896008960189602896038960489605896068960789608896098961089611896128961389614896158961689617896188961989620896218962289623896248962589626896278962889629896308963189632896338963489635896368963789638896398964089641896428964389644896458964689647896488964989650896518965289653896548965589656896578965889659896608966189662896638966489665896668966789668896698967089671896728967389674896758967689677896788967989680896818968289683896848968589686896878968889689896908969189692896938969489695896968969789698896998970089701897028970389704897058970689707897088970989710897118971289713897148971589716897178971889719897208972189722897238972489725897268972789728897298973089731897328973389734897358973689737897388973989740897418974289743897448974589746897478974889749897508975189752897538975489755897568975789758897598976089761897628976389764897658976689767897688976989770897718977289773897748977589776897778977889779897808978189782897838978489785897868978789788897898979089791897928979389794897958979689797897988979989800898018980289803898048980589806898078980889809898108981189812898138981489815898168981789818898198982089821898228982389824898258982689827898288982989830898318983289833898348983589836898378983889839898408984189842898438984489845898468984789848898498985089851898528985389854898558985689857898588985989860898618986289863898648986589866898678986889869898708987189872898738987489875898768987789878898798988089881898828988389884898858988689887898888988989890898918989289893898948989589896898978989889899899008990189902899038990489905899068990789908899098991089911899128991389914899158991689917899188991989920899218992289923899248992589926899278992889929899308993189932899338993489935899368993789938899398994089941899428994389944899458994689947899488994989950899518995289953899548995589956899578995889959899608996189962899638996489965899668996789968899698997089971899728997389974899758997689977899788997989980899818998289983899848998589986899878998889989899908999189992899938999489995899968999789998899999000090001900029000390004900059000690007900089000990010900119001290013900149001590016900179001890019900209002190022900239002490025900269002790028900299003090031900329003390034900359003690037900389003990040900419004290043900449004590046900479004890049900509005190052900539005490055900569005790058900599006090061900629006390064900659006690067900689006990070900719007290073900749007590076900779007890079900809008190082900839008490085900869008790088900899009090091900929009390094900959009690097900989009990100901019010290103901049010590106901079010890109901109011190112901139011490115901169011790118901199012090121901229012390124901259012690127901289012990130901319013290133901349013590136901379013890139901409014190142901439014490145901469014790148901499015090151901529015390154901559015690157901589015990160901619016290163901649016590166901679016890169901709017190172901739017490175901769017790178901799018090181901829018390184901859018690187901889018990190901919019290193901949019590196901979019890199902009020190202902039020490205902069020790208902099021090211902129021390214902159021690217902189021990220902219022290223902249022590226902279022890229902309023190232902339023490235902369023790238902399024090241902429024390244902459024690247902489024990250902519025290253902549025590256902579025890259902609026190262902639026490265902669026790268902699027090271902729027390274902759027690277902789027990280902819028290283902849028590286902879028890289902909029190292902939029490295902969029790298902999030090301903029030390304903059030690307903089030990310903119031290313903149031590316903179031890319903209032190322903239032490325903269032790328903299033090331903329033390334903359033690337903389033990340903419034290343903449034590346903479034890349903509035190352903539035490355903569035790358903599036090361903629036390364903659036690367903689036990370903719037290373903749037590376903779037890379903809038190382903839038490385903869038790388903899039090391903929039390394903959039690397903989039990400904019040290403904049040590406904079040890409904109041190412904139041490415904169041790418904199042090421904229042390424904259042690427904289042990430904319043290433904349043590436904379043890439904409044190442904439044490445904469044790448904499045090451904529045390454904559045690457904589045990460904619046290463904649046590466904679046890469904709047190472904739047490475904769047790478904799048090481904829048390484904859048690487904889048990490904919049290493904949049590496904979049890499905009050190502905039050490505905069050790508905099051090511905129051390514905159051690517905189051990520905219052290523905249052590526905279052890529905309053190532905339053490535905369053790538905399054090541905429054390544905459054690547905489054990550905519055290553905549055590556905579055890559905609056190562905639056490565905669056790568905699057090571905729057390574905759057690577905789057990580905819058290583905849058590586905879058890589905909059190592905939059490595905969059790598905999060090601906029060390604906059060690607906089060990610906119061290613906149061590616906179061890619906209062190622906239062490625906269062790628906299063090631906329063390634906359063690637906389063990640906419064290643906449064590646906479064890649906509065190652906539065490655906569065790658906599066090661906629066390664906659066690667906689066990670906719067290673906749067590676906779067890679906809068190682906839068490685906869068790688906899069090691906929069390694906959069690697906989069990700907019070290703907049070590706907079070890709907109071190712907139071490715907169071790718907199072090721907229072390724907259072690727907289072990730907319073290733907349073590736907379073890739907409074190742907439074490745907469074790748907499075090751907529075390754907559075690757907589075990760907619076290763907649076590766907679076890769907709077190772907739077490775907769077790778907799078090781907829078390784907859078690787907889078990790907919079290793907949079590796907979079890799908009080190802908039080490805908069080790808908099081090811908129081390814908159081690817908189081990820908219082290823908249082590826908279082890829908309083190832908339083490835908369083790838908399084090841908429084390844908459084690847908489084990850908519085290853908549085590856908579085890859908609086190862908639086490865908669086790868908699087090871908729087390874908759087690877908789087990880908819088290883908849088590886908879088890889908909089190892908939089490895908969089790898908999090090901909029090390904909059090690907909089090990910909119091290913909149091590916909179091890919909209092190922909239092490925909269092790928909299093090931909329093390934909359093690937909389093990940909419094290943909449094590946909479094890949909509095190952909539095490955909569095790958909599096090961909629096390964909659096690967909689096990970909719097290973909749097590976909779097890979909809098190982909839098490985909869098790988909899099090991909929099390994909959099690997909989099991000910019100291003910049100591006910079100891009910109101191012910139101491015910169101791018910199102091021910229102391024910259102691027910289102991030910319103291033910349103591036910379103891039910409104191042910439104491045910469104791048910499105091051910529105391054910559105691057910589105991060910619106291063910649106591066910679106891069910709107191072910739107491075910769107791078910799108091081910829108391084910859108691087910889108991090910919109291093910949109591096910979109891099911009110191102911039110491105911069110791108911099111091111911129111391114911159111691117911189111991120911219112291123911249112591126911279112891129911309113191132911339113491135911369113791138911399114091141911429114391144911459114691147911489114991150911519115291153911549115591156911579115891159911609116191162911639116491165911669116791168911699117091171911729117391174911759117691177911789117991180911819118291183911849118591186911879118891189911909119191192911939119491195911969119791198911999120091201912029120391204912059120691207912089120991210912119121291213912149121591216912179121891219912209122191222912239122491225912269122791228912299123091231912329123391234912359123691237912389123991240912419124291243912449124591246912479124891249912509125191252912539125491255912569125791258912599126091261912629126391264912659126691267912689126991270912719127291273912749127591276912779127891279912809128191282912839128491285912869128791288912899129091291912929129391294912959129691297912989129991300913019130291303913049130591306913079130891309913109131191312913139131491315913169131791318913199132091321913229132391324913259132691327913289132991330913319133291333913349133591336913379133891339913409134191342913439134491345913469134791348913499135091351913529135391354913559135691357913589135991360913619136291363913649136591366913679136891369913709137191372913739137491375913769137791378913799138091381913829138391384913859138691387913889138991390913919139291393913949139591396913979139891399914009140191402914039140491405914069140791408914099141091411914129141391414914159141691417914189141991420914219142291423914249142591426914279142891429914309143191432914339143491435914369143791438914399144091441914429144391444914459144691447914489144991450914519145291453914549145591456914579145891459914609146191462914639146491465914669146791468914699147091471914729147391474914759147691477914789147991480914819148291483914849148591486914879148891489914909149191492914939149491495914969149791498914999150091501915029150391504915059150691507915089150991510915119151291513915149151591516915179151891519915209152191522915239152491525915269152791528915299153091531915329153391534915359153691537915389153991540915419154291543915449154591546915479154891549915509155191552915539155491555915569155791558915599156091561915629156391564915659156691567915689156991570915719157291573915749157591576915779157891579915809158191582915839158491585915869158791588915899159091591915929159391594915959159691597915989159991600916019160291603916049160591606916079160891609916109161191612916139161491615916169161791618916199162091621916229162391624916259162691627916289162991630916319163291633916349163591636916379163891639916409164191642916439164491645916469164791648916499165091651916529165391654916559165691657916589165991660916619166291663916649166591666916679166891669916709167191672916739167491675916769167791678916799168091681916829168391684916859168691687916889168991690916919169291693916949169591696916979169891699917009170191702917039170491705917069170791708917099171091711917129171391714917159171691717917189171991720917219172291723917249172591726917279172891729917309173191732917339173491735917369173791738917399174091741917429174391744917459174691747917489174991750917519175291753917549175591756917579175891759917609176191762917639176491765917669176791768917699177091771917729177391774917759177691777917789177991780917819178291783917849178591786917879178891789917909179191792917939179491795917969179791798917999180091801918029180391804918059180691807918089180991810918119181291813918149181591816918179181891819918209182191822918239182491825918269182791828918299183091831918329183391834918359183691837918389183991840918419184291843918449184591846918479184891849918509185191852918539185491855918569185791858918599186091861918629186391864918659186691867918689186991870918719187291873918749187591876918779187891879918809188191882918839188491885918869188791888918899189091891918929189391894918959189691897918989189991900919019190291903919049190591906919079190891909919109191191912919139191491915919169191791918919199192091921919229192391924919259192691927919289192991930919319193291933919349193591936919379193891939919409194191942919439194491945919469194791948919499195091951919529195391954919559195691957919589195991960919619196291963919649196591966919679196891969919709197191972919739197491975919769197791978919799198091981919829198391984919859198691987919889198991990919919199291993919949199591996919979199891999920009200192002920039200492005920069200792008920099201092011920129201392014920159201692017920189201992020920219202292023920249202592026920279202892029920309203192032920339203492035920369203792038920399204092041920429204392044920459204692047920489204992050920519205292053920549205592056920579205892059920609206192062920639206492065920669206792068920699207092071920729207392074920759207692077920789207992080920819208292083920849208592086920879208892089920909209192092920939209492095920969209792098920999210092101921029210392104921059210692107921089210992110921119211292113921149211592116921179211892119921209212192122921239212492125921269212792128921299213092131921329213392134921359213692137921389213992140921419214292143921449214592146921479214892149921509215192152921539215492155921569215792158921599216092161921629216392164921659216692167921689216992170921719217292173921749217592176921779217892179921809218192182921839218492185921869218792188921899219092191921929219392194921959219692197921989219992200922019220292203922049220592206922079220892209922109221192212922139221492215922169221792218922199222092221922229222392224922259222692227922289222992230922319223292233922349223592236922379223892239922409224192242922439224492245922469224792248922499225092251922529225392254922559225692257922589225992260922619226292263922649226592266922679226892269922709227192272922739227492275922769227792278922799228092281922829228392284922859228692287922889228992290922919229292293922949229592296922979229892299923009230192302923039230492305923069230792308923099231092311923129231392314923159231692317923189231992320923219232292323923249232592326923279232892329923309233192332923339233492335923369233792338923399234092341923429234392344923459234692347923489234992350923519235292353923549235592356923579235892359923609236192362923639236492365923669236792368923699237092371923729237392374923759237692377923789237992380923819238292383923849238592386923879238892389923909239192392923939239492395923969239792398923999240092401924029240392404924059240692407924089240992410924119241292413924149241592416924179241892419924209242192422924239242492425924269242792428924299243092431924329243392434924359243692437924389243992440924419244292443924449244592446924479244892449924509245192452924539245492455924569245792458924599246092461924629246392464924659246692467924689246992470924719247292473924749247592476924779247892479924809248192482924839248492485924869248792488924899249092491924929249392494924959249692497924989249992500925019250292503925049250592506925079250892509925109251192512925139251492515925169251792518925199252092521925229252392524925259252692527925289252992530925319253292533925349253592536925379253892539925409254192542925439254492545925469254792548925499255092551925529255392554925559255692557925589255992560925619256292563925649256592566925679256892569925709257192572925739257492575925769257792578925799258092581925829258392584925859258692587925889258992590925919259292593925949259592596925979259892599926009260192602926039260492605926069260792608926099261092611926129261392614926159261692617926189261992620926219262292623926249262592626926279262892629926309263192632926339263492635926369263792638926399264092641926429264392644926459264692647926489264992650926519265292653926549265592656926579265892659926609266192662926639266492665926669266792668926699267092671926729267392674926759267692677926789267992680926819268292683926849268592686926879268892689926909269192692926939269492695926969269792698926999270092701927029270392704927059270692707927089270992710927119271292713927149271592716927179271892719927209272192722927239272492725927269272792728927299273092731927329273392734927359273692737927389273992740927419274292743927449274592746927479274892749927509275192752927539275492755927569275792758927599276092761927629276392764927659276692767927689276992770927719277292773927749277592776927779277892779927809278192782927839278492785927869278792788927899279092791927929279392794927959279692797927989279992800928019280292803928049280592806928079280892809928109281192812928139281492815928169281792818928199282092821928229282392824928259282692827928289282992830928319283292833928349283592836928379283892839928409284192842928439284492845928469284792848928499285092851928529285392854928559285692857928589285992860928619286292863928649286592866928679286892869928709287192872928739287492875928769287792878928799288092881928829288392884928859288692887928889288992890928919289292893928949289592896928979289892899929009290192902929039290492905929069290792908929099291092911929129291392914929159291692917929189291992920929219292292923929249292592926929279292892929929309293192932929339293492935929369293792938929399294092941929429294392944929459294692947929489294992950929519295292953929549295592956929579295892959929609296192962929639296492965929669296792968929699297092971929729297392974929759297692977929789297992980929819298292983929849298592986929879298892989929909299192992929939299492995929969299792998929999300093001930029300393004930059300693007930089300993010930119301293013930149301593016930179301893019930209302193022930239302493025930269302793028930299303093031930329303393034930359303693037930389303993040930419304293043930449304593046930479304893049930509305193052930539305493055930569305793058930599306093061930629306393064930659306693067930689306993070930719307293073930749307593076930779307893079930809308193082930839308493085930869308793088930899309093091930929309393094930959309693097930989309993100931019310293103931049310593106931079310893109931109311193112931139311493115931169311793118931199312093121931229312393124931259312693127931289312993130931319313293133931349313593136931379313893139931409314193142931439314493145931469314793148931499315093151931529315393154931559315693157931589315993160931619316293163931649316593166931679316893169931709317193172931739317493175931769317793178931799318093181931829318393184931859318693187931889318993190931919319293193931949319593196931979319893199932009320193202932039320493205932069320793208932099321093211932129321393214932159321693217932189321993220932219322293223932249322593226932279322893229932309323193232932339323493235932369323793238932399324093241932429324393244932459324693247932489324993250932519325293253932549325593256932579325893259932609326193262932639326493265932669326793268932699327093271932729327393274932759327693277932789327993280932819328293283932849328593286932879328893289932909329193292932939329493295932969329793298932999330093301933029330393304933059330693307933089330993310933119331293313933149331593316933179331893319933209332193322933239332493325933269332793328933299333093331933329333393334933359333693337933389333993340933419334293343933449334593346933479334893349933509335193352933539335493355933569335793358933599336093361933629336393364933659336693367933689336993370933719337293373933749337593376933779337893379933809338193382933839338493385933869338793388933899339093391933929339393394933959339693397933989339993400934019340293403934049340593406934079340893409934109341193412934139341493415934169341793418934199342093421934229342393424934259342693427934289342993430934319343293433934349343593436934379343893439934409344193442934439344493445934469344793448934499345093451934529345393454934559345693457934589345993460934619346293463934649346593466934679346893469934709347193472934739347493475934769347793478934799348093481934829348393484934859348693487934889348993490934919349293493934949349593496934979349893499935009350193502935039350493505935069350793508935099351093511935129351393514935159351693517935189351993520935219352293523935249352593526935279352893529935309353193532935339353493535935369353793538935399354093541935429354393544935459354693547935489354993550935519355293553935549355593556935579355893559935609356193562935639356493565935669356793568935699357093571935729357393574935759357693577935789357993580935819358293583935849358593586935879358893589935909359193592935939359493595935969359793598935999360093601936029360393604936059360693607936089360993610936119361293613936149361593616936179361893619936209362193622936239362493625936269362793628936299363093631936329363393634936359363693637936389363993640936419364293643936449364593646936479364893649936509365193652936539365493655936569365793658936599366093661936629366393664936659366693667936689366993670936719367293673936749367593676936779367893679936809368193682936839368493685936869368793688936899369093691936929369393694936959369693697936989369993700937019370293703937049370593706937079370893709937109371193712937139371493715937169371793718937199372093721937229372393724937259372693727937289372993730937319373293733937349373593736937379373893739937409374193742937439374493745937469374793748937499375093751937529375393754937559375693757937589375993760937619376293763937649376593766937679376893769937709377193772937739377493775937769377793778937799378093781937829378393784937859378693787937889378993790937919379293793937949379593796937979379893799938009380193802938039380493805938069380793808938099381093811938129381393814938159381693817938189381993820938219382293823938249382593826938279382893829938309383193832938339383493835938369383793838938399384093841938429384393844938459384693847938489384993850938519385293853938549385593856938579385893859938609386193862938639386493865938669386793868938699387093871938729387393874938759387693877938789387993880938819388293883938849388593886938879388893889938909389193892938939389493895938969389793898938999390093901939029390393904939059390693907939089390993910939119391293913939149391593916939179391893919939209392193922939239392493925939269392793928939299393093931939329393393934939359393693937939389393993940939419394293943939449394593946939479394893949939509395193952939539395493955939569395793958939599396093961939629396393964939659396693967939689396993970939719397293973939749397593976939779397893979939809398193982939839398493985939869398793988939899399093991939929399393994939959399693997939989399994000940019400294003940049400594006940079400894009940109401194012940139401494015940169401794018940199402094021940229402394024940259402694027940289402994030940319403294033940349403594036940379403894039940409404194042940439404494045940469404794048940499405094051940529405394054940559405694057940589405994060940619406294063940649406594066940679406894069940709407194072940739407494075940769407794078940799408094081940829408394084940859408694087940889408994090940919409294093940949409594096940979409894099941009410194102941039410494105941069410794108941099411094111941129411394114941159411694117941189411994120941219412294123941249412594126941279412894129941309413194132941339413494135941369413794138941399414094141941429414394144941459414694147941489414994150941519415294153941549415594156941579415894159941609416194162941639416494165941669416794168941699417094171941729417394174941759417694177941789417994180941819418294183941849418594186941879418894189941909419194192941939419494195941969419794198941999420094201942029420394204942059420694207942089420994210942119421294213942149421594216942179421894219942209422194222942239422494225942269422794228942299423094231942329423394234942359423694237942389423994240942419424294243942449424594246942479424894249942509425194252942539425494255942569425794258942599426094261942629426394264942659426694267942689426994270942719427294273942749427594276942779427894279942809428194282942839428494285942869428794288942899429094291942929429394294942959429694297942989429994300943019430294303943049430594306943079430894309943109431194312943139431494315943169431794318943199432094321943229432394324943259432694327943289432994330943319433294333943349433594336943379433894339943409434194342943439434494345943469434794348943499435094351943529435394354943559435694357943589435994360943619436294363943649436594366943679436894369943709437194372943739437494375943769437794378943799438094381943829438394384943859438694387943889438994390943919439294393943949439594396943979439894399944009440194402944039440494405944069440794408944099441094411944129441394414944159441694417944189441994420944219442294423944249442594426944279442894429944309443194432944339443494435944369443794438944399444094441944429444394444944459444694447944489444994450944519445294453944549445594456944579445894459944609446194462944639446494465944669446794468944699447094471944729447394474944759447694477944789447994480944819448294483944849448594486944879448894489944909449194492944939449494495944969449794498944999450094501945029450394504945059450694507945089450994510945119451294513945149451594516945179451894519945209452194522945239452494525945269452794528945299453094531945329453394534945359453694537945389453994540945419454294543945449454594546945479454894549945509455194552945539455494555945569455794558945599456094561945629456394564945659456694567945689456994570945719457294573945749457594576945779457894579945809458194582945839458494585945869458794588945899459094591945929459394594945959459694597945989459994600946019460294603946049460594606946079460894609946109461194612946139461494615946169461794618946199462094621946229462394624946259462694627946289462994630946319463294633946349463594636946379463894639946409464194642946439464494645946469464794648946499465094651946529465394654946559465694657946589465994660946619466294663946649466594666946679466894669946709467194672946739467494675946769467794678946799468094681946829468394684946859468694687946889468994690946919469294693946949469594696946979469894699947009470194702947039470494705947069470794708947099471094711947129471394714947159471694717947189471994720947219472294723947249472594726947279472894729947309473194732947339473494735947369473794738947399474094741947429474394744947459474694747947489474994750947519475294753947549475594756947579475894759947609476194762947639476494765947669476794768947699477094771947729477394774947759477694777947789477994780947819478294783947849478594786947879478894789947909479194792947939479494795947969479794798947999480094801948029480394804948059480694807948089480994810948119481294813948149481594816948179481894819948209482194822948239482494825948269482794828948299483094831948329483394834948359483694837948389483994840948419484294843948449484594846948479484894849948509485194852948539485494855948569485794858948599486094861948629486394864948659486694867948689486994870948719487294873948749487594876948779487894879948809488194882948839488494885948869488794888948899489094891948929489394894948959489694897948989489994900949019490294903949049490594906949079490894909949109491194912949139491494915949169491794918949199492094921949229492394924949259492694927949289492994930949319493294933949349493594936949379493894939949409494194942949439494494945949469494794948949499495094951949529495394954949559495694957949589495994960949619496294963949649496594966949679496894969949709497194972949739497494975949769497794978949799498094981949829498394984949859498694987949889498994990949919499294993949949499594996949979499894999950009500195002950039500495005950069500795008950099501095011950129501395014950159501695017950189501995020950219502295023950249502595026950279502895029950309503195032950339503495035950369503795038950399504095041950429504395044950459504695047950489504995050950519505295053950549505595056950579505895059950609506195062950639506495065950669506795068950699507095071950729507395074950759507695077950789507995080950819508295083950849508595086950879508895089950909509195092950939509495095950969509795098950999510095101951029510395104951059510695107951089510995110951119511295113951149511595116951179511895119951209512195122951239512495125951269512795128951299513095131951329513395134951359513695137951389513995140951419514295143951449514595146951479514895149951509515195152951539515495155951569515795158951599516095161951629516395164951659516695167951689516995170951719517295173951749517595176951779517895179951809518195182951839518495185951869518795188951899519095191951929519395194951959519695197951989519995200952019520295203952049520595206952079520895209952109521195212952139521495215952169521795218952199522095221952229522395224952259522695227952289522995230952319523295233952349523595236952379523895239952409524195242952439524495245952469524795248952499525095251952529525395254952559525695257952589525995260952619526295263952649526595266952679526895269952709527195272952739527495275952769527795278952799528095281952829528395284952859528695287952889528995290952919529295293952949529595296952979529895299953009530195302953039530495305953069530795308953099531095311953129531395314953159531695317953189531995320953219532295323953249532595326953279532895329953309533195332953339533495335953369533795338953399534095341953429534395344953459534695347953489534995350953519535295353953549535595356953579535895359953609536195362953639536495365953669536795368953699537095371953729537395374953759537695377953789537995380953819538295383953849538595386953879538895389953909539195392953939539495395953969539795398953999540095401954029540395404954059540695407954089540995410954119541295413954149541595416954179541895419954209542195422954239542495425954269542795428954299543095431954329543395434954359543695437954389543995440954419544295443954449544595446954479544895449954509545195452954539545495455954569545795458954599546095461954629546395464954659546695467954689546995470954719547295473954749547595476954779547895479954809548195482954839548495485954869548795488954899549095491954929549395494954959549695497954989549995500955019550295503955049550595506955079550895509955109551195512955139551495515955169551795518955199552095521955229552395524955259552695527955289552995530955319553295533955349553595536955379553895539955409554195542955439554495545955469554795548955499555095551955529555395554955559555695557955589555995560955619556295563955649556595566955679556895569955709557195572955739557495575955769557795578955799558095581955829558395584955859558695587955889558995590955919559295593955949559595596955979559895599956009560195602956039560495605956069560795608956099561095611956129561395614956159561695617956189561995620956219562295623956249562595626956279562895629956309563195632956339563495635956369563795638956399564095641956429564395644956459564695647956489564995650956519565295653956549565595656956579565895659956609566195662956639566495665956669566795668956699567095671956729567395674956759567695677956789567995680956819568295683956849568595686956879568895689956909569195692956939569495695956969569795698956999570095701957029570395704957059570695707957089570995710957119571295713957149571595716957179571895719957209572195722957239572495725957269572795728957299573095731957329573395734957359573695737957389573995740957419574295743957449574595746957479574895749957509575195752957539575495755957569575795758957599576095761957629576395764957659576695767957689576995770957719577295773957749577595776957779577895779957809578195782957839578495785957869578795788957899579095791957929579395794957959579695797957989579995800958019580295803958049580595806958079580895809958109581195812958139581495815958169581795818958199582095821958229582395824958259582695827958289582995830958319583295833958349583595836958379583895839958409584195842958439584495845958469584795848958499585095851958529585395854958559585695857958589585995860958619586295863958649586595866958679586895869958709587195872958739587495875958769587795878958799588095881958829588395884958859588695887958889588995890958919589295893958949589595896958979589895899959009590195902959039590495905959069590795908959099591095911959129591395914959159591695917959189591995920959219592295923959249592595926959279592895929959309593195932959339593495935959369593795938959399594095941959429594395944959459594695947959489594995950959519595295953959549595595956959579595895959959609596195962959639596495965959669596795968959699597095971959729597395974959759597695977959789597995980959819598295983959849598595986959879598895989959909599195992959939599495995959969599795998959999600096001960029600396004960059600696007960089600996010960119601296013960149601596016960179601896019960209602196022960239602496025960269602796028960299603096031960329603396034960359603696037960389603996040960419604296043960449604596046960479604896049960509605196052960539605496055960569605796058960599606096061960629606396064960659606696067960689606996070960719607296073960749607596076960779607896079960809608196082960839608496085960869608796088960899609096091960929609396094960959609696097960989609996100961019610296103961049610596106961079610896109961109611196112961139611496115961169611796118961199612096121961229612396124961259612696127961289612996130961319613296133961349613596136961379613896139961409614196142961439614496145961469614796148961499615096151961529615396154961559615696157961589615996160961619616296163961649616596166961679616896169961709617196172961739617496175961769617796178961799618096181961829618396184961859618696187961889618996190961919619296193961949619596196961979619896199962009620196202962039620496205962069620796208962099621096211962129621396214962159621696217962189621996220962219622296223962249622596226962279622896229962309623196232962339623496235962369623796238962399624096241962429624396244962459624696247962489624996250962519625296253962549625596256962579625896259962609626196262962639626496265962669626796268962699627096271962729627396274962759627696277962789627996280962819628296283962849628596286962879628896289962909629196292962939629496295962969629796298962999630096301963029630396304963059630696307963089630996310963119631296313963149631596316963179631896319963209632196322963239632496325963269632796328963299633096331963329633396334963359633696337963389633996340963419634296343963449634596346963479634896349963509635196352963539635496355963569635796358963599636096361963629636396364963659636696367963689636996370963719637296373963749637596376963779637896379963809638196382963839638496385963869638796388963899639096391963929639396394963959639696397963989639996400964019640296403964049640596406964079640896409964109641196412964139641496415964169641796418964199642096421964229642396424964259642696427964289642996430964319643296433964349643596436964379643896439964409644196442964439644496445964469644796448964499645096451964529645396454964559645696457964589645996460964619646296463964649646596466964679646896469964709647196472964739647496475964769647796478964799648096481964829648396484964859648696487964889648996490964919649296493964949649596496964979649896499965009650196502965039650496505965069650796508965099651096511965129651396514965159651696517965189651996520965219652296523965249652596526965279652896529965309653196532965339653496535965369653796538965399654096541965429654396544965459654696547965489654996550965519655296553965549655596556965579655896559965609656196562965639656496565965669656796568965699657096571965729657396574965759657696577965789657996580965819658296583965849658596586965879658896589965909659196592965939659496595965969659796598965999660096601966029660396604966059660696607966089660996610966119661296613966149661596616966179661896619966209662196622966239662496625966269662796628966299663096631966329663396634966359663696637966389663996640966419664296643966449664596646966479664896649966509665196652966539665496655966569665796658966599666096661966629666396664966659666696667966689666996670966719667296673966749667596676966779667896679966809668196682966839668496685966869668796688966899669096691966929669396694966959669696697966989669996700967019670296703967049670596706967079670896709967109671196712967139671496715967169671796718967199672096721967229672396724967259672696727967289672996730967319673296733967349673596736967379673896739967409674196742967439674496745967469674796748967499675096751967529675396754967559675696757967589675996760967619676296763967649676596766967679676896769967709677196772967739677496775967769677796778967799678096781967829678396784967859678696787967889678996790967919679296793967949679596796967979679896799968009680196802968039680496805968069680796808968099681096811968129681396814968159681696817968189681996820968219682296823968249682596826968279682896829968309683196832968339683496835968369683796838968399684096841968429684396844968459684696847968489684996850968519685296853968549685596856968579685896859968609686196862968639686496865968669686796868968699687096871968729687396874968759687696877968789687996880968819688296883968849688596886968879688896889968909689196892968939689496895968969689796898968999690096901969029690396904969059690696907969089690996910969119691296913969149691596916969179691896919969209692196922969239692496925969269692796928969299693096931969329693396934969359693696937969389693996940969419694296943969449694596946969479694896949969509695196952969539695496955969569695796958969599696096961969629696396964969659696696967969689696996970969719697296973969749697596976969779697896979969809698196982969839698496985969869698796988969899699096991969929699396994969959699696997969989699997000970019700297003970049700597006970079700897009970109701197012970139701497015970169701797018970199702097021970229702397024970259702697027970289702997030970319703297033970349703597036970379703897039970409704197042970439704497045970469704797048970499705097051970529705397054970559705697057970589705997060970619706297063970649706597066970679706897069970709707197072970739707497075970769707797078970799708097081970829708397084970859708697087970889708997090970919709297093970949709597096970979709897099971009710197102971039710497105971069710797108971099711097111971129711397114971159711697117971189711997120971219712297123971249712597126971279712897129971309713197132971339713497135971369713797138971399714097141971429714397144971459714697147971489714997150971519715297153971549715597156971579715897159971609716197162971639716497165971669716797168971699717097171971729717397174971759717697177971789717997180971819718297183971849718597186971879718897189971909719197192971939719497195971969719797198971999720097201972029720397204972059720697207972089720997210
  1. //
  2. // Copyright 2024 CloudWeGo Authors
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. //
  8. // http://www.apache.org/licenses/LICENSE-2.0
  9. //
  10. // Unless required by applicable law or agreed to in writing, software
  11. // distributed under the License is distributed on an "AS IS" BASIS,
  12. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. // See the License for the specific language governing permissions and
  14. // limitations under the License.
  15. //
  16. // Code generated by "mkasm_amd64.py", DO NOT EDIT.
  17. package x86_64
  18. // ADCB performs "Add with Carry".
  19. //
  20. // Mnemonic : ADC
  21. // Supported forms : (6 forms)
  22. //
  23. // * ADCB imm8, al
  24. // * ADCB imm8, r8
  25. // * ADCB r8, r8
  26. // * ADCB m8, r8
  27. // * ADCB imm8, m8
  28. // * ADCB r8, m8
  29. //
  30. func (self *Program) ADCB(v0 interface{}, v1 interface{}) *Instruction {
  31. p := self.alloc("ADCB", 2, Operands { v0, v1 })
  32. // ADCB imm8, al
  33. if isImm8(v0) && v1 == AL {
  34. p.domain = DomainGeneric
  35. p.add(0, func(m *_Encoding, v []interface{}) {
  36. m.emit(0x14)
  37. m.imm1(toImmAny(v[0]))
  38. })
  39. }
  40. // ADCB imm8, r8
  41. if isImm8(v0) && isReg8(v1) {
  42. p.domain = DomainGeneric
  43. p.add(0, func(m *_Encoding, v []interface{}) {
  44. m.rexo(0, v[1], isReg8REX(v[1]))
  45. m.emit(0x80)
  46. m.emit(0xd0 | lcode(v[1]))
  47. m.imm1(toImmAny(v[0]))
  48. })
  49. }
  50. // ADCB r8, r8
  51. if isReg8(v0) && isReg8(v1) {
  52. p.domain = DomainGeneric
  53. p.add(0, func(m *_Encoding, v []interface{}) {
  54. m.rexo(hcode(v[0]), v[1], isReg8REX(v[0]) || isReg8REX(v[1]))
  55. m.emit(0x10)
  56. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  57. })
  58. p.add(0, func(m *_Encoding, v []interface{}) {
  59. m.rexo(hcode(v[1]), v[0], isReg8REX(v[0]) || isReg8REX(v[1]))
  60. m.emit(0x12)
  61. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  62. })
  63. }
  64. // ADCB m8, r8
  65. if isM8(v0) && isReg8(v1) {
  66. p.domain = DomainGeneric
  67. p.add(0, func(m *_Encoding, v []interface{}) {
  68. m.rexo(hcode(v[1]), addr(v[0]), isReg8REX(v[1]))
  69. m.emit(0x12)
  70. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  71. })
  72. }
  73. // ADCB imm8, m8
  74. if isImm8(v0) && isM8(v1) {
  75. p.domain = DomainGeneric
  76. p.add(0, func(m *_Encoding, v []interface{}) {
  77. m.rexo(0, addr(v[1]), false)
  78. m.emit(0x80)
  79. m.mrsd(2, addr(v[1]), 1)
  80. m.imm1(toImmAny(v[0]))
  81. })
  82. }
  83. // ADCB r8, m8
  84. if isReg8(v0) && isM8(v1) {
  85. p.domain = DomainGeneric
  86. p.add(0, func(m *_Encoding, v []interface{}) {
  87. m.rexo(hcode(v[0]), addr(v[1]), isReg8REX(v[0]))
  88. m.emit(0x10)
  89. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  90. })
  91. }
  92. if p.len == 0 {
  93. panic("invalid operands for ADCB")
  94. }
  95. return p
  96. }
  97. // ADCL performs "Add with Carry".
  98. //
  99. // Mnemonic : ADC
  100. // Supported forms : (8 forms)
  101. //
  102. // * ADCL imm32, eax
  103. // * ADCL imm8, r32
  104. // * ADCL imm32, r32
  105. // * ADCL r32, r32
  106. // * ADCL m32, r32
  107. // * ADCL imm8, m32
  108. // * ADCL imm32, m32
  109. // * ADCL r32, m32
  110. //
  111. func (self *Program) ADCL(v0 interface{}, v1 interface{}) *Instruction {
  112. p := self.alloc("ADCL", 2, Operands { v0, v1 })
  113. // ADCL imm32, eax
  114. if isImm32(v0) && v1 == EAX {
  115. p.domain = DomainGeneric
  116. p.add(0, func(m *_Encoding, v []interface{}) {
  117. m.emit(0x15)
  118. m.imm4(toImmAny(v[0]))
  119. })
  120. }
  121. // ADCL imm8, r32
  122. if isImm8Ext(v0, 4) && isReg32(v1) {
  123. p.domain = DomainGeneric
  124. p.add(0, func(m *_Encoding, v []interface{}) {
  125. m.rexo(0, v[1], false)
  126. m.emit(0x83)
  127. m.emit(0xd0 | lcode(v[1]))
  128. m.imm1(toImmAny(v[0]))
  129. })
  130. }
  131. // ADCL imm32, r32
  132. if isImm32(v0) && isReg32(v1) {
  133. p.domain = DomainGeneric
  134. p.add(0, func(m *_Encoding, v []interface{}) {
  135. m.rexo(0, v[1], false)
  136. m.emit(0x81)
  137. m.emit(0xd0 | lcode(v[1]))
  138. m.imm4(toImmAny(v[0]))
  139. })
  140. }
  141. // ADCL r32, r32
  142. if isReg32(v0) && isReg32(v1) {
  143. p.domain = DomainGeneric
  144. p.add(0, func(m *_Encoding, v []interface{}) {
  145. m.rexo(hcode(v[0]), v[1], false)
  146. m.emit(0x11)
  147. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  148. })
  149. p.add(0, func(m *_Encoding, v []interface{}) {
  150. m.rexo(hcode(v[1]), v[0], false)
  151. m.emit(0x13)
  152. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  153. })
  154. }
  155. // ADCL m32, r32
  156. if isM32(v0) && isReg32(v1) {
  157. p.domain = DomainGeneric
  158. p.add(0, func(m *_Encoding, v []interface{}) {
  159. m.rexo(hcode(v[1]), addr(v[0]), false)
  160. m.emit(0x13)
  161. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  162. })
  163. }
  164. // ADCL imm8, m32
  165. if isImm8Ext(v0, 4) && isM32(v1) {
  166. p.domain = DomainGeneric
  167. p.add(0, func(m *_Encoding, v []interface{}) {
  168. m.rexo(0, addr(v[1]), false)
  169. m.emit(0x83)
  170. m.mrsd(2, addr(v[1]), 1)
  171. m.imm1(toImmAny(v[0]))
  172. })
  173. }
  174. // ADCL imm32, m32
  175. if isImm32(v0) && isM32(v1) {
  176. p.domain = DomainGeneric
  177. p.add(0, func(m *_Encoding, v []interface{}) {
  178. m.rexo(0, addr(v[1]), false)
  179. m.emit(0x81)
  180. m.mrsd(2, addr(v[1]), 1)
  181. m.imm4(toImmAny(v[0]))
  182. })
  183. }
  184. // ADCL r32, m32
  185. if isReg32(v0) && isM32(v1) {
  186. p.domain = DomainGeneric
  187. p.add(0, func(m *_Encoding, v []interface{}) {
  188. m.rexo(hcode(v[0]), addr(v[1]), false)
  189. m.emit(0x11)
  190. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  191. })
  192. }
  193. if p.len == 0 {
  194. panic("invalid operands for ADCL")
  195. }
  196. return p
  197. }
  198. // ADCQ performs "Add with Carry".
  199. //
  200. // Mnemonic : ADC
  201. // Supported forms : (8 forms)
  202. //
  203. // * ADCQ imm32, rax
  204. // * ADCQ imm8, r64
  205. // * ADCQ imm32, r64
  206. // * ADCQ r64, r64
  207. // * ADCQ m64, r64
  208. // * ADCQ imm8, m64
  209. // * ADCQ imm32, m64
  210. // * ADCQ r64, m64
  211. //
  212. func (self *Program) ADCQ(v0 interface{}, v1 interface{}) *Instruction {
  213. p := self.alloc("ADCQ", 2, Operands { v0, v1 })
  214. // ADCQ imm32, rax
  215. if isImm32(v0) && v1 == RAX {
  216. p.domain = DomainGeneric
  217. p.add(0, func(m *_Encoding, v []interface{}) {
  218. m.emit(0x48)
  219. m.emit(0x15)
  220. m.imm4(toImmAny(v[0]))
  221. })
  222. }
  223. // ADCQ imm8, r64
  224. if isImm8Ext(v0, 8) && isReg64(v1) {
  225. p.domain = DomainGeneric
  226. p.add(0, func(m *_Encoding, v []interface{}) {
  227. m.emit(0x48 | hcode(v[1]))
  228. m.emit(0x83)
  229. m.emit(0xd0 | lcode(v[1]))
  230. m.imm1(toImmAny(v[0]))
  231. })
  232. }
  233. // ADCQ imm32, r64
  234. if isImm32Ext(v0, 8) && isReg64(v1) {
  235. p.domain = DomainGeneric
  236. p.add(0, func(m *_Encoding, v []interface{}) {
  237. m.emit(0x48 | hcode(v[1]))
  238. m.emit(0x81)
  239. m.emit(0xd0 | lcode(v[1]))
  240. m.imm4(toImmAny(v[0]))
  241. })
  242. }
  243. // ADCQ r64, r64
  244. if isReg64(v0) && isReg64(v1) {
  245. p.domain = DomainGeneric
  246. p.add(0, func(m *_Encoding, v []interface{}) {
  247. m.emit(0x48 | hcode(v[0]) << 2 | hcode(v[1]))
  248. m.emit(0x11)
  249. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  250. })
  251. p.add(0, func(m *_Encoding, v []interface{}) {
  252. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  253. m.emit(0x13)
  254. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  255. })
  256. }
  257. // ADCQ m64, r64
  258. if isM64(v0) && isReg64(v1) {
  259. p.domain = DomainGeneric
  260. p.add(0, func(m *_Encoding, v []interface{}) {
  261. m.rexm(1, hcode(v[1]), addr(v[0]))
  262. m.emit(0x13)
  263. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  264. })
  265. }
  266. // ADCQ imm8, m64
  267. if isImm8Ext(v0, 8) && isM64(v1) {
  268. p.domain = DomainGeneric
  269. p.add(0, func(m *_Encoding, v []interface{}) {
  270. m.rexm(1, 0, addr(v[1]))
  271. m.emit(0x83)
  272. m.mrsd(2, addr(v[1]), 1)
  273. m.imm1(toImmAny(v[0]))
  274. })
  275. }
  276. // ADCQ imm32, m64
  277. if isImm32Ext(v0, 8) && isM64(v1) {
  278. p.domain = DomainGeneric
  279. p.add(0, func(m *_Encoding, v []interface{}) {
  280. m.rexm(1, 0, addr(v[1]))
  281. m.emit(0x81)
  282. m.mrsd(2, addr(v[1]), 1)
  283. m.imm4(toImmAny(v[0]))
  284. })
  285. }
  286. // ADCQ r64, m64
  287. if isReg64(v0) && isM64(v1) {
  288. p.domain = DomainGeneric
  289. p.add(0, func(m *_Encoding, v []interface{}) {
  290. m.rexm(1, hcode(v[0]), addr(v[1]))
  291. m.emit(0x11)
  292. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  293. })
  294. }
  295. if p.len == 0 {
  296. panic("invalid operands for ADCQ")
  297. }
  298. return p
  299. }
  300. // ADCW performs "Add with Carry".
  301. //
  302. // Mnemonic : ADC
  303. // Supported forms : (8 forms)
  304. //
  305. // * ADCW imm16, ax
  306. // * ADCW imm8, r16
  307. // * ADCW imm16, r16
  308. // * ADCW r16, r16
  309. // * ADCW m16, r16
  310. // * ADCW imm8, m16
  311. // * ADCW imm16, m16
  312. // * ADCW r16, m16
  313. //
  314. func (self *Program) ADCW(v0 interface{}, v1 interface{}) *Instruction {
  315. p := self.alloc("ADCW", 2, Operands { v0, v1 })
  316. // ADCW imm16, ax
  317. if isImm16(v0) && v1 == AX {
  318. p.domain = DomainGeneric
  319. p.add(0, func(m *_Encoding, v []interface{}) {
  320. m.emit(0x66)
  321. m.emit(0x15)
  322. m.imm2(toImmAny(v[0]))
  323. })
  324. }
  325. // ADCW imm8, r16
  326. if isImm8Ext(v0, 2) && isReg16(v1) {
  327. p.domain = DomainGeneric
  328. p.add(0, func(m *_Encoding, v []interface{}) {
  329. m.emit(0x66)
  330. m.rexo(0, v[1], false)
  331. m.emit(0x83)
  332. m.emit(0xd0 | lcode(v[1]))
  333. m.imm1(toImmAny(v[0]))
  334. })
  335. }
  336. // ADCW imm16, r16
  337. if isImm16(v0) && isReg16(v1) {
  338. p.domain = DomainGeneric
  339. p.add(0, func(m *_Encoding, v []interface{}) {
  340. m.emit(0x66)
  341. m.rexo(0, v[1], false)
  342. m.emit(0x81)
  343. m.emit(0xd0 | lcode(v[1]))
  344. m.imm2(toImmAny(v[0]))
  345. })
  346. }
  347. // ADCW r16, r16
  348. if isReg16(v0) && isReg16(v1) {
  349. p.domain = DomainGeneric
  350. p.add(0, func(m *_Encoding, v []interface{}) {
  351. m.emit(0x66)
  352. m.rexo(hcode(v[0]), v[1], false)
  353. m.emit(0x11)
  354. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  355. })
  356. p.add(0, func(m *_Encoding, v []interface{}) {
  357. m.emit(0x66)
  358. m.rexo(hcode(v[1]), v[0], false)
  359. m.emit(0x13)
  360. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  361. })
  362. }
  363. // ADCW m16, r16
  364. if isM16(v0) && isReg16(v1) {
  365. p.domain = DomainGeneric
  366. p.add(0, func(m *_Encoding, v []interface{}) {
  367. m.emit(0x66)
  368. m.rexo(hcode(v[1]), addr(v[0]), false)
  369. m.emit(0x13)
  370. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  371. })
  372. }
  373. // ADCW imm8, m16
  374. if isImm8Ext(v0, 2) && isM16(v1) {
  375. p.domain = DomainGeneric
  376. p.add(0, func(m *_Encoding, v []interface{}) {
  377. m.emit(0x66)
  378. m.rexo(0, addr(v[1]), false)
  379. m.emit(0x83)
  380. m.mrsd(2, addr(v[1]), 1)
  381. m.imm1(toImmAny(v[0]))
  382. })
  383. }
  384. // ADCW imm16, m16
  385. if isImm16(v0) && isM16(v1) {
  386. p.domain = DomainGeneric
  387. p.add(0, func(m *_Encoding, v []interface{}) {
  388. m.emit(0x66)
  389. m.rexo(0, addr(v[1]), false)
  390. m.emit(0x81)
  391. m.mrsd(2, addr(v[1]), 1)
  392. m.imm2(toImmAny(v[0]))
  393. })
  394. }
  395. // ADCW r16, m16
  396. if isReg16(v0) && isM16(v1) {
  397. p.domain = DomainGeneric
  398. p.add(0, func(m *_Encoding, v []interface{}) {
  399. m.emit(0x66)
  400. m.rexo(hcode(v[0]), addr(v[1]), false)
  401. m.emit(0x11)
  402. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  403. })
  404. }
  405. if p.len == 0 {
  406. panic("invalid operands for ADCW")
  407. }
  408. return p
  409. }
  410. // ADCXL performs "Unsigned Integer Addition of Two Operands with Carry Flag".
  411. //
  412. // Mnemonic : ADCX
  413. // Supported forms : (2 forms)
  414. //
  415. // * ADCXL r32, r32 [ADX]
  416. // * ADCXL m32, r32 [ADX]
  417. //
  418. func (self *Program) ADCXL(v0 interface{}, v1 interface{}) *Instruction {
  419. p := self.alloc("ADCXL", 2, Operands { v0, v1 })
  420. // ADCXL r32, r32
  421. if isReg32(v0) && isReg32(v1) {
  422. self.require(ISA_ADX)
  423. p.domain = DomainGeneric
  424. p.add(0, func(m *_Encoding, v []interface{}) {
  425. m.emit(0x66)
  426. m.rexo(hcode(v[1]), v[0], false)
  427. m.emit(0x0f)
  428. m.emit(0x38)
  429. m.emit(0xf6)
  430. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  431. })
  432. }
  433. // ADCXL m32, r32
  434. if isM32(v0) && isReg32(v1) {
  435. self.require(ISA_ADX)
  436. p.domain = DomainGeneric
  437. p.add(0, func(m *_Encoding, v []interface{}) {
  438. m.emit(0x66)
  439. m.rexo(hcode(v[1]), addr(v[0]), false)
  440. m.emit(0x0f)
  441. m.emit(0x38)
  442. m.emit(0xf6)
  443. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  444. })
  445. }
  446. if p.len == 0 {
  447. panic("invalid operands for ADCXL")
  448. }
  449. return p
  450. }
  451. // ADCXQ performs "Unsigned Integer Addition of Two Operands with Carry Flag".
  452. //
  453. // Mnemonic : ADCX
  454. // Supported forms : (2 forms)
  455. //
  456. // * ADCXQ r64, r64 [ADX]
  457. // * ADCXQ m64, r64 [ADX]
  458. //
  459. func (self *Program) ADCXQ(v0 interface{}, v1 interface{}) *Instruction {
  460. p := self.alloc("ADCXQ", 2, Operands { v0, v1 })
  461. // ADCXQ r64, r64
  462. if isReg64(v0) && isReg64(v1) {
  463. self.require(ISA_ADX)
  464. p.domain = DomainGeneric
  465. p.add(0, func(m *_Encoding, v []interface{}) {
  466. m.emit(0x66)
  467. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  468. m.emit(0x0f)
  469. m.emit(0x38)
  470. m.emit(0xf6)
  471. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  472. })
  473. }
  474. // ADCXQ m64, r64
  475. if isM64(v0) && isReg64(v1) {
  476. self.require(ISA_ADX)
  477. p.domain = DomainGeneric
  478. p.add(0, func(m *_Encoding, v []interface{}) {
  479. m.emit(0x66)
  480. m.rexm(1, hcode(v[1]), addr(v[0]))
  481. m.emit(0x0f)
  482. m.emit(0x38)
  483. m.emit(0xf6)
  484. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  485. })
  486. }
  487. if p.len == 0 {
  488. panic("invalid operands for ADCXQ")
  489. }
  490. return p
  491. }
  492. // ADDB performs "Add".
  493. //
  494. // Mnemonic : ADD
  495. // Supported forms : (6 forms)
  496. //
  497. // * ADDB imm8, al
  498. // * ADDB imm8, r8
  499. // * ADDB r8, r8
  500. // * ADDB m8, r8
  501. // * ADDB imm8, m8
  502. // * ADDB r8, m8
  503. //
  504. func (self *Program) ADDB(v0 interface{}, v1 interface{}) *Instruction {
  505. p := self.alloc("ADDB", 2, Operands { v0, v1 })
  506. // ADDB imm8, al
  507. if isImm8(v0) && v1 == AL {
  508. p.domain = DomainGeneric
  509. p.add(0, func(m *_Encoding, v []interface{}) {
  510. m.emit(0x04)
  511. m.imm1(toImmAny(v[0]))
  512. })
  513. }
  514. // ADDB imm8, r8
  515. if isImm8(v0) && isReg8(v1) {
  516. p.domain = DomainGeneric
  517. p.add(0, func(m *_Encoding, v []interface{}) {
  518. m.rexo(0, v[1], isReg8REX(v[1]))
  519. m.emit(0x80)
  520. m.emit(0xc0 | lcode(v[1]))
  521. m.imm1(toImmAny(v[0]))
  522. })
  523. }
  524. // ADDB r8, r8
  525. if isReg8(v0) && isReg8(v1) {
  526. p.domain = DomainGeneric
  527. p.add(0, func(m *_Encoding, v []interface{}) {
  528. m.rexo(hcode(v[0]), v[1], isReg8REX(v[0]) || isReg8REX(v[1]))
  529. m.emit(0x00)
  530. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  531. })
  532. p.add(0, func(m *_Encoding, v []interface{}) {
  533. m.rexo(hcode(v[1]), v[0], isReg8REX(v[0]) || isReg8REX(v[1]))
  534. m.emit(0x02)
  535. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  536. })
  537. }
  538. // ADDB m8, r8
  539. if isM8(v0) && isReg8(v1) {
  540. p.domain = DomainGeneric
  541. p.add(0, func(m *_Encoding, v []interface{}) {
  542. m.rexo(hcode(v[1]), addr(v[0]), isReg8REX(v[1]))
  543. m.emit(0x02)
  544. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  545. })
  546. }
  547. // ADDB imm8, m8
  548. if isImm8(v0) && isM8(v1) {
  549. p.domain = DomainGeneric
  550. p.add(0, func(m *_Encoding, v []interface{}) {
  551. m.rexo(0, addr(v[1]), false)
  552. m.emit(0x80)
  553. m.mrsd(0, addr(v[1]), 1)
  554. m.imm1(toImmAny(v[0]))
  555. })
  556. }
  557. // ADDB r8, m8
  558. if isReg8(v0) && isM8(v1) {
  559. p.domain = DomainGeneric
  560. p.add(0, func(m *_Encoding, v []interface{}) {
  561. m.rexo(hcode(v[0]), addr(v[1]), isReg8REX(v[0]))
  562. m.emit(0x00)
  563. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  564. })
  565. }
  566. if p.len == 0 {
  567. panic("invalid operands for ADDB")
  568. }
  569. return p
  570. }
  571. // ADDL performs "Add".
  572. //
  573. // Mnemonic : ADD
  574. // Supported forms : (8 forms)
  575. //
  576. // * ADDL imm32, eax
  577. // * ADDL imm8, r32
  578. // * ADDL imm32, r32
  579. // * ADDL r32, r32
  580. // * ADDL m32, r32
  581. // * ADDL imm8, m32
  582. // * ADDL imm32, m32
  583. // * ADDL r32, m32
  584. //
  585. func (self *Program) ADDL(v0 interface{}, v1 interface{}) *Instruction {
  586. p := self.alloc("ADDL", 2, Operands { v0, v1 })
  587. // ADDL imm32, eax
  588. if isImm32(v0) && v1 == EAX {
  589. p.domain = DomainGeneric
  590. p.add(0, func(m *_Encoding, v []interface{}) {
  591. m.emit(0x05)
  592. m.imm4(toImmAny(v[0]))
  593. })
  594. }
  595. // ADDL imm8, r32
  596. if isImm8Ext(v0, 4) && isReg32(v1) {
  597. p.domain = DomainGeneric
  598. p.add(0, func(m *_Encoding, v []interface{}) {
  599. m.rexo(0, v[1], false)
  600. m.emit(0x83)
  601. m.emit(0xc0 | lcode(v[1]))
  602. m.imm1(toImmAny(v[0]))
  603. })
  604. }
  605. // ADDL imm32, r32
  606. if isImm32(v0) && isReg32(v1) {
  607. p.domain = DomainGeneric
  608. p.add(0, func(m *_Encoding, v []interface{}) {
  609. m.rexo(0, v[1], false)
  610. m.emit(0x81)
  611. m.emit(0xc0 | lcode(v[1]))
  612. m.imm4(toImmAny(v[0]))
  613. })
  614. }
  615. // ADDL r32, r32
  616. if isReg32(v0) && isReg32(v1) {
  617. p.domain = DomainGeneric
  618. p.add(0, func(m *_Encoding, v []interface{}) {
  619. m.rexo(hcode(v[0]), v[1], false)
  620. m.emit(0x01)
  621. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  622. })
  623. p.add(0, func(m *_Encoding, v []interface{}) {
  624. m.rexo(hcode(v[1]), v[0], false)
  625. m.emit(0x03)
  626. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  627. })
  628. }
  629. // ADDL m32, r32
  630. if isM32(v0) && isReg32(v1) {
  631. p.domain = DomainGeneric
  632. p.add(0, func(m *_Encoding, v []interface{}) {
  633. m.rexo(hcode(v[1]), addr(v[0]), false)
  634. m.emit(0x03)
  635. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  636. })
  637. }
  638. // ADDL imm8, m32
  639. if isImm8Ext(v0, 4) && isM32(v1) {
  640. p.domain = DomainGeneric
  641. p.add(0, func(m *_Encoding, v []interface{}) {
  642. m.rexo(0, addr(v[1]), false)
  643. m.emit(0x83)
  644. m.mrsd(0, addr(v[1]), 1)
  645. m.imm1(toImmAny(v[0]))
  646. })
  647. }
  648. // ADDL imm32, m32
  649. if isImm32(v0) && isM32(v1) {
  650. p.domain = DomainGeneric
  651. p.add(0, func(m *_Encoding, v []interface{}) {
  652. m.rexo(0, addr(v[1]), false)
  653. m.emit(0x81)
  654. m.mrsd(0, addr(v[1]), 1)
  655. m.imm4(toImmAny(v[0]))
  656. })
  657. }
  658. // ADDL r32, m32
  659. if isReg32(v0) && isM32(v1) {
  660. p.domain = DomainGeneric
  661. p.add(0, func(m *_Encoding, v []interface{}) {
  662. m.rexo(hcode(v[0]), addr(v[1]), false)
  663. m.emit(0x01)
  664. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  665. })
  666. }
  667. if p.len == 0 {
  668. panic("invalid operands for ADDL")
  669. }
  670. return p
  671. }
  672. // ADDPD performs "Add Packed Double-Precision Floating-Point Values".
  673. //
  674. // Mnemonic : ADDPD
  675. // Supported forms : (2 forms)
  676. //
  677. // * ADDPD xmm, xmm [SSE2]
  678. // * ADDPD m128, xmm [SSE2]
  679. //
  680. func (self *Program) ADDPD(v0 interface{}, v1 interface{}) *Instruction {
  681. p := self.alloc("ADDPD", 2, Operands { v0, v1 })
  682. // ADDPD xmm, xmm
  683. if isXMM(v0) && isXMM(v1) {
  684. self.require(ISA_SSE2)
  685. p.domain = DomainMMXSSE
  686. p.add(0, func(m *_Encoding, v []interface{}) {
  687. m.emit(0x66)
  688. m.rexo(hcode(v[1]), v[0], false)
  689. m.emit(0x0f)
  690. m.emit(0x58)
  691. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  692. })
  693. }
  694. // ADDPD m128, xmm
  695. if isM128(v0) && isXMM(v1) {
  696. self.require(ISA_SSE2)
  697. p.domain = DomainMMXSSE
  698. p.add(0, func(m *_Encoding, v []interface{}) {
  699. m.emit(0x66)
  700. m.rexo(hcode(v[1]), addr(v[0]), false)
  701. m.emit(0x0f)
  702. m.emit(0x58)
  703. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  704. })
  705. }
  706. if p.len == 0 {
  707. panic("invalid operands for ADDPD")
  708. }
  709. return p
  710. }
  711. // ADDPS performs "Add Packed Single-Precision Floating-Point Values".
  712. //
  713. // Mnemonic : ADDPS
  714. // Supported forms : (2 forms)
  715. //
  716. // * ADDPS xmm, xmm [SSE]
  717. // * ADDPS m128, xmm [SSE]
  718. //
  719. func (self *Program) ADDPS(v0 interface{}, v1 interface{}) *Instruction {
  720. p := self.alloc("ADDPS", 2, Operands { v0, v1 })
  721. // ADDPS xmm, xmm
  722. if isXMM(v0) && isXMM(v1) {
  723. self.require(ISA_SSE)
  724. p.domain = DomainMMXSSE
  725. p.add(0, func(m *_Encoding, v []interface{}) {
  726. m.rexo(hcode(v[1]), v[0], false)
  727. m.emit(0x0f)
  728. m.emit(0x58)
  729. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  730. })
  731. }
  732. // ADDPS m128, xmm
  733. if isM128(v0) && isXMM(v1) {
  734. self.require(ISA_SSE)
  735. p.domain = DomainMMXSSE
  736. p.add(0, func(m *_Encoding, v []interface{}) {
  737. m.rexo(hcode(v[1]), addr(v[0]), false)
  738. m.emit(0x0f)
  739. m.emit(0x58)
  740. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  741. })
  742. }
  743. if p.len == 0 {
  744. panic("invalid operands for ADDPS")
  745. }
  746. return p
  747. }
  748. // ADDQ performs "Add".
  749. //
  750. // Mnemonic : ADD
  751. // Supported forms : (8 forms)
  752. //
  753. // * ADDQ imm32, rax
  754. // * ADDQ imm8, r64
  755. // * ADDQ imm32, r64
  756. // * ADDQ r64, r64
  757. // * ADDQ m64, r64
  758. // * ADDQ imm8, m64
  759. // * ADDQ imm32, m64
  760. // * ADDQ r64, m64
  761. //
  762. func (self *Program) ADDQ(v0 interface{}, v1 interface{}) *Instruction {
  763. p := self.alloc("ADDQ", 2, Operands { v0, v1 })
  764. // ADDQ imm32, rax
  765. if isImm32(v0) && v1 == RAX {
  766. p.domain = DomainGeneric
  767. p.add(0, func(m *_Encoding, v []interface{}) {
  768. m.emit(0x48)
  769. m.emit(0x05)
  770. m.imm4(toImmAny(v[0]))
  771. })
  772. }
  773. // ADDQ imm8, r64
  774. if isImm8Ext(v0, 8) && isReg64(v1) {
  775. p.domain = DomainGeneric
  776. p.add(0, func(m *_Encoding, v []interface{}) {
  777. m.emit(0x48 | hcode(v[1]))
  778. m.emit(0x83)
  779. m.emit(0xc0 | lcode(v[1]))
  780. m.imm1(toImmAny(v[0]))
  781. })
  782. }
  783. // ADDQ imm32, r64
  784. if isImm32Ext(v0, 8) && isReg64(v1) {
  785. p.domain = DomainGeneric
  786. p.add(0, func(m *_Encoding, v []interface{}) {
  787. m.emit(0x48 | hcode(v[1]))
  788. m.emit(0x81)
  789. m.emit(0xc0 | lcode(v[1]))
  790. m.imm4(toImmAny(v[0]))
  791. })
  792. }
  793. // ADDQ r64, r64
  794. if isReg64(v0) && isReg64(v1) {
  795. p.domain = DomainGeneric
  796. p.add(0, func(m *_Encoding, v []interface{}) {
  797. m.emit(0x48 | hcode(v[0]) << 2 | hcode(v[1]))
  798. m.emit(0x01)
  799. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  800. })
  801. p.add(0, func(m *_Encoding, v []interface{}) {
  802. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  803. m.emit(0x03)
  804. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  805. })
  806. }
  807. // ADDQ m64, r64
  808. if isM64(v0) && isReg64(v1) {
  809. p.domain = DomainGeneric
  810. p.add(0, func(m *_Encoding, v []interface{}) {
  811. m.rexm(1, hcode(v[1]), addr(v[0]))
  812. m.emit(0x03)
  813. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  814. })
  815. }
  816. // ADDQ imm8, m64
  817. if isImm8Ext(v0, 8) && isM64(v1) {
  818. p.domain = DomainGeneric
  819. p.add(0, func(m *_Encoding, v []interface{}) {
  820. m.rexm(1, 0, addr(v[1]))
  821. m.emit(0x83)
  822. m.mrsd(0, addr(v[1]), 1)
  823. m.imm1(toImmAny(v[0]))
  824. })
  825. }
  826. // ADDQ imm32, m64
  827. if isImm32Ext(v0, 8) && isM64(v1) {
  828. p.domain = DomainGeneric
  829. p.add(0, func(m *_Encoding, v []interface{}) {
  830. m.rexm(1, 0, addr(v[1]))
  831. m.emit(0x81)
  832. m.mrsd(0, addr(v[1]), 1)
  833. m.imm4(toImmAny(v[0]))
  834. })
  835. }
  836. // ADDQ r64, m64
  837. if isReg64(v0) && isM64(v1) {
  838. p.domain = DomainGeneric
  839. p.add(0, func(m *_Encoding, v []interface{}) {
  840. m.rexm(1, hcode(v[0]), addr(v[1]))
  841. m.emit(0x01)
  842. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  843. })
  844. }
  845. if p.len == 0 {
  846. panic("invalid operands for ADDQ")
  847. }
  848. return p
  849. }
  850. // ADDSD performs "Add Scalar Double-Precision Floating-Point Values".
  851. //
  852. // Mnemonic : ADDSD
  853. // Supported forms : (2 forms)
  854. //
  855. // * ADDSD xmm, xmm [SSE2]
  856. // * ADDSD m64, xmm [SSE2]
  857. //
  858. func (self *Program) ADDSD(v0 interface{}, v1 interface{}) *Instruction {
  859. p := self.alloc("ADDSD", 2, Operands { v0, v1 })
  860. // ADDSD xmm, xmm
  861. if isXMM(v0) && isXMM(v1) {
  862. self.require(ISA_SSE2)
  863. p.domain = DomainMMXSSE
  864. p.add(0, func(m *_Encoding, v []interface{}) {
  865. m.emit(0xf2)
  866. m.rexo(hcode(v[1]), v[0], false)
  867. m.emit(0x0f)
  868. m.emit(0x58)
  869. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  870. })
  871. }
  872. // ADDSD m64, xmm
  873. if isM64(v0) && isXMM(v1) {
  874. self.require(ISA_SSE2)
  875. p.domain = DomainMMXSSE
  876. p.add(0, func(m *_Encoding, v []interface{}) {
  877. m.emit(0xf2)
  878. m.rexo(hcode(v[1]), addr(v[0]), false)
  879. m.emit(0x0f)
  880. m.emit(0x58)
  881. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  882. })
  883. }
  884. if p.len == 0 {
  885. panic("invalid operands for ADDSD")
  886. }
  887. return p
  888. }
  889. // ADDSS performs "Add Scalar Single-Precision Floating-Point Values".
  890. //
  891. // Mnemonic : ADDSS
  892. // Supported forms : (2 forms)
  893. //
  894. // * ADDSS xmm, xmm [SSE]
  895. // * ADDSS m32, xmm [SSE]
  896. //
  897. func (self *Program) ADDSS(v0 interface{}, v1 interface{}) *Instruction {
  898. p := self.alloc("ADDSS", 2, Operands { v0, v1 })
  899. // ADDSS xmm, xmm
  900. if isXMM(v0) && isXMM(v1) {
  901. self.require(ISA_SSE)
  902. p.domain = DomainMMXSSE
  903. p.add(0, func(m *_Encoding, v []interface{}) {
  904. m.emit(0xf3)
  905. m.rexo(hcode(v[1]), v[0], false)
  906. m.emit(0x0f)
  907. m.emit(0x58)
  908. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  909. })
  910. }
  911. // ADDSS m32, xmm
  912. if isM32(v0) && isXMM(v1) {
  913. self.require(ISA_SSE)
  914. p.domain = DomainMMXSSE
  915. p.add(0, func(m *_Encoding, v []interface{}) {
  916. m.emit(0xf3)
  917. m.rexo(hcode(v[1]), addr(v[0]), false)
  918. m.emit(0x0f)
  919. m.emit(0x58)
  920. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  921. })
  922. }
  923. if p.len == 0 {
  924. panic("invalid operands for ADDSS")
  925. }
  926. return p
  927. }
  928. // ADDSUBPD performs "Packed Double-FP Add/Subtract".
  929. //
  930. // Mnemonic : ADDSUBPD
  931. // Supported forms : (2 forms)
  932. //
  933. // * ADDSUBPD xmm, xmm [SSE3]
  934. // * ADDSUBPD m128, xmm [SSE3]
  935. //
  936. func (self *Program) ADDSUBPD(v0 interface{}, v1 interface{}) *Instruction {
  937. p := self.alloc("ADDSUBPD", 2, Operands { v0, v1 })
  938. // ADDSUBPD xmm, xmm
  939. if isXMM(v0) && isXMM(v1) {
  940. self.require(ISA_SSE3)
  941. p.domain = DomainMMXSSE
  942. p.add(0, func(m *_Encoding, v []interface{}) {
  943. m.emit(0x66)
  944. m.rexo(hcode(v[1]), v[0], false)
  945. m.emit(0x0f)
  946. m.emit(0xd0)
  947. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  948. })
  949. }
  950. // ADDSUBPD m128, xmm
  951. if isM128(v0) && isXMM(v1) {
  952. self.require(ISA_SSE3)
  953. p.domain = DomainMMXSSE
  954. p.add(0, func(m *_Encoding, v []interface{}) {
  955. m.emit(0x66)
  956. m.rexo(hcode(v[1]), addr(v[0]), false)
  957. m.emit(0x0f)
  958. m.emit(0xd0)
  959. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  960. })
  961. }
  962. if p.len == 0 {
  963. panic("invalid operands for ADDSUBPD")
  964. }
  965. return p
  966. }
  967. // ADDSUBPS performs "Packed Single-FP Add/Subtract".
  968. //
  969. // Mnemonic : ADDSUBPS
  970. // Supported forms : (2 forms)
  971. //
  972. // * ADDSUBPS xmm, xmm [SSE3]
  973. // * ADDSUBPS m128, xmm [SSE3]
  974. //
  975. func (self *Program) ADDSUBPS(v0 interface{}, v1 interface{}) *Instruction {
  976. p := self.alloc("ADDSUBPS", 2, Operands { v0, v1 })
  977. // ADDSUBPS xmm, xmm
  978. if isXMM(v0) && isXMM(v1) {
  979. self.require(ISA_SSE3)
  980. p.domain = DomainMMXSSE
  981. p.add(0, func(m *_Encoding, v []interface{}) {
  982. m.emit(0xf2)
  983. m.rexo(hcode(v[1]), v[0], false)
  984. m.emit(0x0f)
  985. m.emit(0xd0)
  986. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  987. })
  988. }
  989. // ADDSUBPS m128, xmm
  990. if isM128(v0) && isXMM(v1) {
  991. self.require(ISA_SSE3)
  992. p.domain = DomainMMXSSE
  993. p.add(0, func(m *_Encoding, v []interface{}) {
  994. m.emit(0xf2)
  995. m.rexo(hcode(v[1]), addr(v[0]), false)
  996. m.emit(0x0f)
  997. m.emit(0xd0)
  998. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  999. })
  1000. }
  1001. if p.len == 0 {
  1002. panic("invalid operands for ADDSUBPS")
  1003. }
  1004. return p
  1005. }
  1006. // ADDW performs "Add".
  1007. //
  1008. // Mnemonic : ADD
  1009. // Supported forms : (8 forms)
  1010. //
  1011. // * ADDW imm16, ax
  1012. // * ADDW imm8, r16
  1013. // * ADDW imm16, r16
  1014. // * ADDW r16, r16
  1015. // * ADDW m16, r16
  1016. // * ADDW imm8, m16
  1017. // * ADDW imm16, m16
  1018. // * ADDW r16, m16
  1019. //
  1020. func (self *Program) ADDW(v0 interface{}, v1 interface{}) *Instruction {
  1021. p := self.alloc("ADDW", 2, Operands { v0, v1 })
  1022. // ADDW imm16, ax
  1023. if isImm16(v0) && v1 == AX {
  1024. p.domain = DomainGeneric
  1025. p.add(0, func(m *_Encoding, v []interface{}) {
  1026. m.emit(0x66)
  1027. m.emit(0x05)
  1028. m.imm2(toImmAny(v[0]))
  1029. })
  1030. }
  1031. // ADDW imm8, r16
  1032. if isImm8Ext(v0, 2) && isReg16(v1) {
  1033. p.domain = DomainGeneric
  1034. p.add(0, func(m *_Encoding, v []interface{}) {
  1035. m.emit(0x66)
  1036. m.rexo(0, v[1], false)
  1037. m.emit(0x83)
  1038. m.emit(0xc0 | lcode(v[1]))
  1039. m.imm1(toImmAny(v[0]))
  1040. })
  1041. }
  1042. // ADDW imm16, r16
  1043. if isImm16(v0) && isReg16(v1) {
  1044. p.domain = DomainGeneric
  1045. p.add(0, func(m *_Encoding, v []interface{}) {
  1046. m.emit(0x66)
  1047. m.rexo(0, v[1], false)
  1048. m.emit(0x81)
  1049. m.emit(0xc0 | lcode(v[1]))
  1050. m.imm2(toImmAny(v[0]))
  1051. })
  1052. }
  1053. // ADDW r16, r16
  1054. if isReg16(v0) && isReg16(v1) {
  1055. p.domain = DomainGeneric
  1056. p.add(0, func(m *_Encoding, v []interface{}) {
  1057. m.emit(0x66)
  1058. m.rexo(hcode(v[0]), v[1], false)
  1059. m.emit(0x01)
  1060. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  1061. })
  1062. p.add(0, func(m *_Encoding, v []interface{}) {
  1063. m.emit(0x66)
  1064. m.rexo(hcode(v[1]), v[0], false)
  1065. m.emit(0x03)
  1066. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  1067. })
  1068. }
  1069. // ADDW m16, r16
  1070. if isM16(v0) && isReg16(v1) {
  1071. p.domain = DomainGeneric
  1072. p.add(0, func(m *_Encoding, v []interface{}) {
  1073. m.emit(0x66)
  1074. m.rexo(hcode(v[1]), addr(v[0]), false)
  1075. m.emit(0x03)
  1076. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  1077. })
  1078. }
  1079. // ADDW imm8, m16
  1080. if isImm8Ext(v0, 2) && isM16(v1) {
  1081. p.domain = DomainGeneric
  1082. p.add(0, func(m *_Encoding, v []interface{}) {
  1083. m.emit(0x66)
  1084. m.rexo(0, addr(v[1]), false)
  1085. m.emit(0x83)
  1086. m.mrsd(0, addr(v[1]), 1)
  1087. m.imm1(toImmAny(v[0]))
  1088. })
  1089. }
  1090. // ADDW imm16, m16
  1091. if isImm16(v0) && isM16(v1) {
  1092. p.domain = DomainGeneric
  1093. p.add(0, func(m *_Encoding, v []interface{}) {
  1094. m.emit(0x66)
  1095. m.rexo(0, addr(v[1]), false)
  1096. m.emit(0x81)
  1097. m.mrsd(0, addr(v[1]), 1)
  1098. m.imm2(toImmAny(v[0]))
  1099. })
  1100. }
  1101. // ADDW r16, m16
  1102. if isReg16(v0) && isM16(v1) {
  1103. p.domain = DomainGeneric
  1104. p.add(0, func(m *_Encoding, v []interface{}) {
  1105. m.emit(0x66)
  1106. m.rexo(hcode(v[0]), addr(v[1]), false)
  1107. m.emit(0x01)
  1108. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  1109. })
  1110. }
  1111. if p.len == 0 {
  1112. panic("invalid operands for ADDW")
  1113. }
  1114. return p
  1115. }
  1116. // ADOXL performs "Unsigned Integer Addition of Two Operands with Overflow Flag".
  1117. //
  1118. // Mnemonic : ADOX
  1119. // Supported forms : (2 forms)
  1120. //
  1121. // * ADOXL r32, r32 [ADX]
  1122. // * ADOXL m32, r32 [ADX]
  1123. //
  1124. func (self *Program) ADOXL(v0 interface{}, v1 interface{}) *Instruction {
  1125. p := self.alloc("ADOXL", 2, Operands { v0, v1 })
  1126. // ADOXL r32, r32
  1127. if isReg32(v0) && isReg32(v1) {
  1128. self.require(ISA_ADX)
  1129. p.domain = DomainGeneric
  1130. p.add(0, func(m *_Encoding, v []interface{}) {
  1131. m.emit(0xf3)
  1132. m.rexo(hcode(v[1]), v[0], false)
  1133. m.emit(0x0f)
  1134. m.emit(0x38)
  1135. m.emit(0xf6)
  1136. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  1137. })
  1138. }
  1139. // ADOXL m32, r32
  1140. if isM32(v0) && isReg32(v1) {
  1141. self.require(ISA_ADX)
  1142. p.domain = DomainGeneric
  1143. p.add(0, func(m *_Encoding, v []interface{}) {
  1144. m.emit(0xf3)
  1145. m.rexo(hcode(v[1]), addr(v[0]), false)
  1146. m.emit(0x0f)
  1147. m.emit(0x38)
  1148. m.emit(0xf6)
  1149. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  1150. })
  1151. }
  1152. if p.len == 0 {
  1153. panic("invalid operands for ADOXL")
  1154. }
  1155. return p
  1156. }
  1157. // ADOXQ performs "Unsigned Integer Addition of Two Operands with Overflow Flag".
  1158. //
  1159. // Mnemonic : ADOX
  1160. // Supported forms : (2 forms)
  1161. //
  1162. // * ADOXQ r64, r64 [ADX]
  1163. // * ADOXQ m64, r64 [ADX]
  1164. //
  1165. func (self *Program) ADOXQ(v0 interface{}, v1 interface{}) *Instruction {
  1166. p := self.alloc("ADOXQ", 2, Operands { v0, v1 })
  1167. // ADOXQ r64, r64
  1168. if isReg64(v0) && isReg64(v1) {
  1169. self.require(ISA_ADX)
  1170. p.domain = DomainGeneric
  1171. p.add(0, func(m *_Encoding, v []interface{}) {
  1172. m.emit(0xf3)
  1173. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  1174. m.emit(0x0f)
  1175. m.emit(0x38)
  1176. m.emit(0xf6)
  1177. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  1178. })
  1179. }
  1180. // ADOXQ m64, r64
  1181. if isM64(v0) && isReg64(v1) {
  1182. self.require(ISA_ADX)
  1183. p.domain = DomainGeneric
  1184. p.add(0, func(m *_Encoding, v []interface{}) {
  1185. m.emit(0xf3)
  1186. m.rexm(1, hcode(v[1]), addr(v[0]))
  1187. m.emit(0x0f)
  1188. m.emit(0x38)
  1189. m.emit(0xf6)
  1190. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  1191. })
  1192. }
  1193. if p.len == 0 {
  1194. panic("invalid operands for ADOXQ")
  1195. }
  1196. return p
  1197. }
  1198. // AESDEC performs "Perform One Round of an AES Decryption Flow".
  1199. //
  1200. // Mnemonic : AESDEC
  1201. // Supported forms : (2 forms)
  1202. //
  1203. // * AESDEC xmm, xmm [AES]
  1204. // * AESDEC m128, xmm [AES]
  1205. //
  1206. func (self *Program) AESDEC(v0 interface{}, v1 interface{}) *Instruction {
  1207. p := self.alloc("AESDEC", 2, Operands { v0, v1 })
  1208. // AESDEC xmm, xmm
  1209. if isXMM(v0) && isXMM(v1) {
  1210. self.require(ISA_AES)
  1211. p.domain = DomainCrypto
  1212. p.add(0, func(m *_Encoding, v []interface{}) {
  1213. m.emit(0x66)
  1214. m.rexo(hcode(v[1]), v[0], false)
  1215. m.emit(0x0f)
  1216. m.emit(0x38)
  1217. m.emit(0xde)
  1218. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  1219. })
  1220. }
  1221. // AESDEC m128, xmm
  1222. if isM128(v0) && isXMM(v1) {
  1223. self.require(ISA_AES)
  1224. p.domain = DomainCrypto
  1225. p.add(0, func(m *_Encoding, v []interface{}) {
  1226. m.emit(0x66)
  1227. m.rexo(hcode(v[1]), addr(v[0]), false)
  1228. m.emit(0x0f)
  1229. m.emit(0x38)
  1230. m.emit(0xde)
  1231. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  1232. })
  1233. }
  1234. if p.len == 0 {
  1235. panic("invalid operands for AESDEC")
  1236. }
  1237. return p
  1238. }
  1239. // AESDECLAST performs "Perform Last Round of an AES Decryption Flow".
  1240. //
  1241. // Mnemonic : AESDECLAST
  1242. // Supported forms : (2 forms)
  1243. //
  1244. // * AESDECLAST xmm, xmm [AES]
  1245. // * AESDECLAST m128, xmm [AES]
  1246. //
  1247. func (self *Program) AESDECLAST(v0 interface{}, v1 interface{}) *Instruction {
  1248. p := self.alloc("AESDECLAST", 2, Operands { v0, v1 })
  1249. // AESDECLAST xmm, xmm
  1250. if isXMM(v0) && isXMM(v1) {
  1251. self.require(ISA_AES)
  1252. p.domain = DomainCrypto
  1253. p.add(0, func(m *_Encoding, v []interface{}) {
  1254. m.emit(0x66)
  1255. m.rexo(hcode(v[1]), v[0], false)
  1256. m.emit(0x0f)
  1257. m.emit(0x38)
  1258. m.emit(0xdf)
  1259. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  1260. })
  1261. }
  1262. // AESDECLAST m128, xmm
  1263. if isM128(v0) && isXMM(v1) {
  1264. self.require(ISA_AES)
  1265. p.domain = DomainCrypto
  1266. p.add(0, func(m *_Encoding, v []interface{}) {
  1267. m.emit(0x66)
  1268. m.rexo(hcode(v[1]), addr(v[0]), false)
  1269. m.emit(0x0f)
  1270. m.emit(0x38)
  1271. m.emit(0xdf)
  1272. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  1273. })
  1274. }
  1275. if p.len == 0 {
  1276. panic("invalid operands for AESDECLAST")
  1277. }
  1278. return p
  1279. }
  1280. // AESENC performs "Perform One Round of an AES Encryption Flow".
  1281. //
  1282. // Mnemonic : AESENC
  1283. // Supported forms : (2 forms)
  1284. //
  1285. // * AESENC xmm, xmm [AES]
  1286. // * AESENC m128, xmm [AES]
  1287. //
  1288. func (self *Program) AESENC(v0 interface{}, v1 interface{}) *Instruction {
  1289. p := self.alloc("AESENC", 2, Operands { v0, v1 })
  1290. // AESENC xmm, xmm
  1291. if isXMM(v0) && isXMM(v1) {
  1292. self.require(ISA_AES)
  1293. p.domain = DomainCrypto
  1294. p.add(0, func(m *_Encoding, v []interface{}) {
  1295. m.emit(0x66)
  1296. m.rexo(hcode(v[1]), v[0], false)
  1297. m.emit(0x0f)
  1298. m.emit(0x38)
  1299. m.emit(0xdc)
  1300. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  1301. })
  1302. }
  1303. // AESENC m128, xmm
  1304. if isM128(v0) && isXMM(v1) {
  1305. self.require(ISA_AES)
  1306. p.domain = DomainCrypto
  1307. p.add(0, func(m *_Encoding, v []interface{}) {
  1308. m.emit(0x66)
  1309. m.rexo(hcode(v[1]), addr(v[0]), false)
  1310. m.emit(0x0f)
  1311. m.emit(0x38)
  1312. m.emit(0xdc)
  1313. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  1314. })
  1315. }
  1316. if p.len == 0 {
  1317. panic("invalid operands for AESENC")
  1318. }
  1319. return p
  1320. }
  1321. // AESENCLAST performs "Perform Last Round of an AES Encryption Flow".
  1322. //
  1323. // Mnemonic : AESENCLAST
  1324. // Supported forms : (2 forms)
  1325. //
  1326. // * AESENCLAST xmm, xmm [AES]
  1327. // * AESENCLAST m128, xmm [AES]
  1328. //
  1329. func (self *Program) AESENCLAST(v0 interface{}, v1 interface{}) *Instruction {
  1330. p := self.alloc("AESENCLAST", 2, Operands { v0, v1 })
  1331. // AESENCLAST xmm, xmm
  1332. if isXMM(v0) && isXMM(v1) {
  1333. self.require(ISA_AES)
  1334. p.domain = DomainCrypto
  1335. p.add(0, func(m *_Encoding, v []interface{}) {
  1336. m.emit(0x66)
  1337. m.rexo(hcode(v[1]), v[0], false)
  1338. m.emit(0x0f)
  1339. m.emit(0x38)
  1340. m.emit(0xdd)
  1341. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  1342. })
  1343. }
  1344. // AESENCLAST m128, xmm
  1345. if isM128(v0) && isXMM(v1) {
  1346. self.require(ISA_AES)
  1347. p.domain = DomainCrypto
  1348. p.add(0, func(m *_Encoding, v []interface{}) {
  1349. m.emit(0x66)
  1350. m.rexo(hcode(v[1]), addr(v[0]), false)
  1351. m.emit(0x0f)
  1352. m.emit(0x38)
  1353. m.emit(0xdd)
  1354. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  1355. })
  1356. }
  1357. if p.len == 0 {
  1358. panic("invalid operands for AESENCLAST")
  1359. }
  1360. return p
  1361. }
  1362. // AESIMC performs "Perform the AES InvMixColumn Transformation".
  1363. //
  1364. // Mnemonic : AESIMC
  1365. // Supported forms : (2 forms)
  1366. //
  1367. // * AESIMC xmm, xmm [AES]
  1368. // * AESIMC m128, xmm [AES]
  1369. //
  1370. func (self *Program) AESIMC(v0 interface{}, v1 interface{}) *Instruction {
  1371. p := self.alloc("AESIMC", 2, Operands { v0, v1 })
  1372. // AESIMC xmm, xmm
  1373. if isXMM(v0) && isXMM(v1) {
  1374. self.require(ISA_AES)
  1375. p.domain = DomainCrypto
  1376. p.add(0, func(m *_Encoding, v []interface{}) {
  1377. m.emit(0x66)
  1378. m.rexo(hcode(v[1]), v[0], false)
  1379. m.emit(0x0f)
  1380. m.emit(0x38)
  1381. m.emit(0xdb)
  1382. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  1383. })
  1384. }
  1385. // AESIMC m128, xmm
  1386. if isM128(v0) && isXMM(v1) {
  1387. self.require(ISA_AES)
  1388. p.domain = DomainCrypto
  1389. p.add(0, func(m *_Encoding, v []interface{}) {
  1390. m.emit(0x66)
  1391. m.rexo(hcode(v[1]), addr(v[0]), false)
  1392. m.emit(0x0f)
  1393. m.emit(0x38)
  1394. m.emit(0xdb)
  1395. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  1396. })
  1397. }
  1398. if p.len == 0 {
  1399. panic("invalid operands for AESIMC")
  1400. }
  1401. return p
  1402. }
  1403. // AESKEYGENASSIST performs "AES Round Key Generation Assist".
  1404. //
  1405. // Mnemonic : AESKEYGENASSIST
  1406. // Supported forms : (2 forms)
  1407. //
  1408. // * AESKEYGENASSIST imm8, xmm, xmm [AES]
  1409. // * AESKEYGENASSIST imm8, m128, xmm [AES]
  1410. //
  1411. func (self *Program) AESKEYGENASSIST(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  1412. p := self.alloc("AESKEYGENASSIST", 3, Operands { v0, v1, v2 })
  1413. // AESKEYGENASSIST imm8, xmm, xmm
  1414. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  1415. self.require(ISA_AES)
  1416. p.domain = DomainCrypto
  1417. p.add(0, func(m *_Encoding, v []interface{}) {
  1418. m.emit(0x66)
  1419. m.rexo(hcode(v[2]), v[1], false)
  1420. m.emit(0x0f)
  1421. m.emit(0x3a)
  1422. m.emit(0xdf)
  1423. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  1424. m.imm1(toImmAny(v[0]))
  1425. })
  1426. }
  1427. // AESKEYGENASSIST imm8, m128, xmm
  1428. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  1429. self.require(ISA_AES)
  1430. p.domain = DomainCrypto
  1431. p.add(0, func(m *_Encoding, v []interface{}) {
  1432. m.emit(0x66)
  1433. m.rexo(hcode(v[2]), addr(v[1]), false)
  1434. m.emit(0x0f)
  1435. m.emit(0x3a)
  1436. m.emit(0xdf)
  1437. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  1438. m.imm1(toImmAny(v[0]))
  1439. })
  1440. }
  1441. if p.len == 0 {
  1442. panic("invalid operands for AESKEYGENASSIST")
  1443. }
  1444. return p
  1445. }
  1446. // ANDB performs "Logical AND".
  1447. //
  1448. // Mnemonic : AND
  1449. // Supported forms : (6 forms)
  1450. //
  1451. // * ANDB imm8, al
  1452. // * ANDB imm8, r8
  1453. // * ANDB r8, r8
  1454. // * ANDB m8, r8
  1455. // * ANDB imm8, m8
  1456. // * ANDB r8, m8
  1457. //
  1458. func (self *Program) ANDB(v0 interface{}, v1 interface{}) *Instruction {
  1459. p := self.alloc("ANDB", 2, Operands { v0, v1 })
  1460. // ANDB imm8, al
  1461. if isImm8(v0) && v1 == AL {
  1462. p.domain = DomainGeneric
  1463. p.add(0, func(m *_Encoding, v []interface{}) {
  1464. m.emit(0x24)
  1465. m.imm1(toImmAny(v[0]))
  1466. })
  1467. }
  1468. // ANDB imm8, r8
  1469. if isImm8(v0) && isReg8(v1) {
  1470. p.domain = DomainGeneric
  1471. p.add(0, func(m *_Encoding, v []interface{}) {
  1472. m.rexo(0, v[1], isReg8REX(v[1]))
  1473. m.emit(0x80)
  1474. m.emit(0xe0 | lcode(v[1]))
  1475. m.imm1(toImmAny(v[0]))
  1476. })
  1477. }
  1478. // ANDB r8, r8
  1479. if isReg8(v0) && isReg8(v1) {
  1480. p.domain = DomainGeneric
  1481. p.add(0, func(m *_Encoding, v []interface{}) {
  1482. m.rexo(hcode(v[0]), v[1], isReg8REX(v[0]) || isReg8REX(v[1]))
  1483. m.emit(0x20)
  1484. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  1485. })
  1486. p.add(0, func(m *_Encoding, v []interface{}) {
  1487. m.rexo(hcode(v[1]), v[0], isReg8REX(v[0]) || isReg8REX(v[1]))
  1488. m.emit(0x22)
  1489. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  1490. })
  1491. }
  1492. // ANDB m8, r8
  1493. if isM8(v0) && isReg8(v1) {
  1494. p.domain = DomainGeneric
  1495. p.add(0, func(m *_Encoding, v []interface{}) {
  1496. m.rexo(hcode(v[1]), addr(v[0]), isReg8REX(v[1]))
  1497. m.emit(0x22)
  1498. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  1499. })
  1500. }
  1501. // ANDB imm8, m8
  1502. if isImm8(v0) && isM8(v1) {
  1503. p.domain = DomainGeneric
  1504. p.add(0, func(m *_Encoding, v []interface{}) {
  1505. m.rexo(0, addr(v[1]), false)
  1506. m.emit(0x80)
  1507. m.mrsd(4, addr(v[1]), 1)
  1508. m.imm1(toImmAny(v[0]))
  1509. })
  1510. }
  1511. // ANDB r8, m8
  1512. if isReg8(v0) && isM8(v1) {
  1513. p.domain = DomainGeneric
  1514. p.add(0, func(m *_Encoding, v []interface{}) {
  1515. m.rexo(hcode(v[0]), addr(v[1]), isReg8REX(v[0]))
  1516. m.emit(0x20)
  1517. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  1518. })
  1519. }
  1520. if p.len == 0 {
  1521. panic("invalid operands for ANDB")
  1522. }
  1523. return p
  1524. }
  1525. // ANDL performs "Logical AND".
  1526. //
  1527. // Mnemonic : AND
  1528. // Supported forms : (8 forms)
  1529. //
  1530. // * ANDL imm32, eax
  1531. // * ANDL imm8, r32
  1532. // * ANDL imm32, r32
  1533. // * ANDL r32, r32
  1534. // * ANDL m32, r32
  1535. // * ANDL imm8, m32
  1536. // * ANDL imm32, m32
  1537. // * ANDL r32, m32
  1538. //
  1539. func (self *Program) ANDL(v0 interface{}, v1 interface{}) *Instruction {
  1540. p := self.alloc("ANDL", 2, Operands { v0, v1 })
  1541. // ANDL imm32, eax
  1542. if isImm32(v0) && v1 == EAX {
  1543. p.domain = DomainGeneric
  1544. p.add(0, func(m *_Encoding, v []interface{}) {
  1545. m.emit(0x25)
  1546. m.imm4(toImmAny(v[0]))
  1547. })
  1548. }
  1549. // ANDL imm8, r32
  1550. if isImm8Ext(v0, 4) && isReg32(v1) {
  1551. p.domain = DomainGeneric
  1552. p.add(0, func(m *_Encoding, v []interface{}) {
  1553. m.rexo(0, v[1], false)
  1554. m.emit(0x83)
  1555. m.emit(0xe0 | lcode(v[1]))
  1556. m.imm1(toImmAny(v[0]))
  1557. })
  1558. }
  1559. // ANDL imm32, r32
  1560. if isImm32(v0) && isReg32(v1) {
  1561. p.domain = DomainGeneric
  1562. p.add(0, func(m *_Encoding, v []interface{}) {
  1563. m.rexo(0, v[1], false)
  1564. m.emit(0x81)
  1565. m.emit(0xe0 | lcode(v[1]))
  1566. m.imm4(toImmAny(v[0]))
  1567. })
  1568. }
  1569. // ANDL r32, r32
  1570. if isReg32(v0) && isReg32(v1) {
  1571. p.domain = DomainGeneric
  1572. p.add(0, func(m *_Encoding, v []interface{}) {
  1573. m.rexo(hcode(v[0]), v[1], false)
  1574. m.emit(0x21)
  1575. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  1576. })
  1577. p.add(0, func(m *_Encoding, v []interface{}) {
  1578. m.rexo(hcode(v[1]), v[0], false)
  1579. m.emit(0x23)
  1580. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  1581. })
  1582. }
  1583. // ANDL m32, r32
  1584. if isM32(v0) && isReg32(v1) {
  1585. p.domain = DomainGeneric
  1586. p.add(0, func(m *_Encoding, v []interface{}) {
  1587. m.rexo(hcode(v[1]), addr(v[0]), false)
  1588. m.emit(0x23)
  1589. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  1590. })
  1591. }
  1592. // ANDL imm8, m32
  1593. if isImm8Ext(v0, 4) && isM32(v1) {
  1594. p.domain = DomainGeneric
  1595. p.add(0, func(m *_Encoding, v []interface{}) {
  1596. m.rexo(0, addr(v[1]), false)
  1597. m.emit(0x83)
  1598. m.mrsd(4, addr(v[1]), 1)
  1599. m.imm1(toImmAny(v[0]))
  1600. })
  1601. }
  1602. // ANDL imm32, m32
  1603. if isImm32(v0) && isM32(v1) {
  1604. p.domain = DomainGeneric
  1605. p.add(0, func(m *_Encoding, v []interface{}) {
  1606. m.rexo(0, addr(v[1]), false)
  1607. m.emit(0x81)
  1608. m.mrsd(4, addr(v[1]), 1)
  1609. m.imm4(toImmAny(v[0]))
  1610. })
  1611. }
  1612. // ANDL r32, m32
  1613. if isReg32(v0) && isM32(v1) {
  1614. p.domain = DomainGeneric
  1615. p.add(0, func(m *_Encoding, v []interface{}) {
  1616. m.rexo(hcode(v[0]), addr(v[1]), false)
  1617. m.emit(0x21)
  1618. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  1619. })
  1620. }
  1621. if p.len == 0 {
  1622. panic("invalid operands for ANDL")
  1623. }
  1624. return p
  1625. }
  1626. // ANDNL performs "Logical AND NOT".
  1627. //
  1628. // Mnemonic : ANDN
  1629. // Supported forms : (2 forms)
  1630. //
  1631. // * ANDNL r32, r32, r32 [BMI]
  1632. // * ANDNL m32, r32, r32 [BMI]
  1633. //
  1634. func (self *Program) ANDNL(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  1635. p := self.alloc("ANDNL", 3, Operands { v0, v1, v2 })
  1636. // ANDNL r32, r32, r32
  1637. if isReg32(v0) && isReg32(v1) && isReg32(v2) {
  1638. self.require(ISA_BMI)
  1639. p.domain = DomainGeneric
  1640. p.add(0, func(m *_Encoding, v []interface{}) {
  1641. m.emit(0xc4)
  1642. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  1643. m.emit(0x78 ^ (hlcode(v[1]) << 3))
  1644. m.emit(0xf2)
  1645. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  1646. })
  1647. }
  1648. // ANDNL m32, r32, r32
  1649. if isM32(v0) && isReg32(v1) && isReg32(v2) {
  1650. self.require(ISA_BMI)
  1651. p.domain = DomainGeneric
  1652. p.add(0, func(m *_Encoding, v []interface{}) {
  1653. m.vex3(0xc4, 0b10, 0x00, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  1654. m.emit(0xf2)
  1655. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  1656. })
  1657. }
  1658. if p.len == 0 {
  1659. panic("invalid operands for ANDNL")
  1660. }
  1661. return p
  1662. }
  1663. // ANDNPD performs "Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values".
  1664. //
  1665. // Mnemonic : ANDNPD
  1666. // Supported forms : (2 forms)
  1667. //
  1668. // * ANDNPD xmm, xmm [SSE2]
  1669. // * ANDNPD m128, xmm [SSE2]
  1670. //
  1671. func (self *Program) ANDNPD(v0 interface{}, v1 interface{}) *Instruction {
  1672. p := self.alloc("ANDNPD", 2, Operands { v0, v1 })
  1673. // ANDNPD xmm, xmm
  1674. if isXMM(v0) && isXMM(v1) {
  1675. self.require(ISA_SSE2)
  1676. p.domain = DomainMMXSSE
  1677. p.add(0, func(m *_Encoding, v []interface{}) {
  1678. m.emit(0x66)
  1679. m.rexo(hcode(v[1]), v[0], false)
  1680. m.emit(0x0f)
  1681. m.emit(0x55)
  1682. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  1683. })
  1684. }
  1685. // ANDNPD m128, xmm
  1686. if isM128(v0) && isXMM(v1) {
  1687. self.require(ISA_SSE2)
  1688. p.domain = DomainMMXSSE
  1689. p.add(0, func(m *_Encoding, v []interface{}) {
  1690. m.emit(0x66)
  1691. m.rexo(hcode(v[1]), addr(v[0]), false)
  1692. m.emit(0x0f)
  1693. m.emit(0x55)
  1694. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  1695. })
  1696. }
  1697. if p.len == 0 {
  1698. panic("invalid operands for ANDNPD")
  1699. }
  1700. return p
  1701. }
  1702. // ANDNPS performs "Bitwise Logical AND NOT of Packed Single-Precision Floating-Point Values".
  1703. //
  1704. // Mnemonic : ANDNPS
  1705. // Supported forms : (2 forms)
  1706. //
  1707. // * ANDNPS xmm, xmm [SSE]
  1708. // * ANDNPS m128, xmm [SSE]
  1709. //
  1710. func (self *Program) ANDNPS(v0 interface{}, v1 interface{}) *Instruction {
  1711. p := self.alloc("ANDNPS", 2, Operands { v0, v1 })
  1712. // ANDNPS xmm, xmm
  1713. if isXMM(v0) && isXMM(v1) {
  1714. self.require(ISA_SSE)
  1715. p.domain = DomainMMXSSE
  1716. p.add(0, func(m *_Encoding, v []interface{}) {
  1717. m.rexo(hcode(v[1]), v[0], false)
  1718. m.emit(0x0f)
  1719. m.emit(0x55)
  1720. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  1721. })
  1722. }
  1723. // ANDNPS m128, xmm
  1724. if isM128(v0) && isXMM(v1) {
  1725. self.require(ISA_SSE)
  1726. p.domain = DomainMMXSSE
  1727. p.add(0, func(m *_Encoding, v []interface{}) {
  1728. m.rexo(hcode(v[1]), addr(v[0]), false)
  1729. m.emit(0x0f)
  1730. m.emit(0x55)
  1731. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  1732. })
  1733. }
  1734. if p.len == 0 {
  1735. panic("invalid operands for ANDNPS")
  1736. }
  1737. return p
  1738. }
  1739. // ANDNQ performs "Logical AND NOT".
  1740. //
  1741. // Mnemonic : ANDN
  1742. // Supported forms : (2 forms)
  1743. //
  1744. // * ANDNQ r64, r64, r64 [BMI]
  1745. // * ANDNQ m64, r64, r64 [BMI]
  1746. //
  1747. func (self *Program) ANDNQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  1748. p := self.alloc("ANDNQ", 3, Operands { v0, v1, v2 })
  1749. // ANDNQ r64, r64, r64
  1750. if isReg64(v0) && isReg64(v1) && isReg64(v2) {
  1751. self.require(ISA_BMI)
  1752. p.domain = DomainGeneric
  1753. p.add(0, func(m *_Encoding, v []interface{}) {
  1754. m.emit(0xc4)
  1755. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  1756. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  1757. m.emit(0xf2)
  1758. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  1759. })
  1760. }
  1761. // ANDNQ m64, r64, r64
  1762. if isM64(v0) && isReg64(v1) && isReg64(v2) {
  1763. self.require(ISA_BMI)
  1764. p.domain = DomainGeneric
  1765. p.add(0, func(m *_Encoding, v []interface{}) {
  1766. m.vex3(0xc4, 0b10, 0x80, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  1767. m.emit(0xf2)
  1768. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  1769. })
  1770. }
  1771. if p.len == 0 {
  1772. panic("invalid operands for ANDNQ")
  1773. }
  1774. return p
  1775. }
  1776. // ANDPD performs "Bitwise Logical AND of Packed Double-Precision Floating-Point Values".
  1777. //
  1778. // Mnemonic : ANDPD
  1779. // Supported forms : (2 forms)
  1780. //
  1781. // * ANDPD xmm, xmm [SSE2]
  1782. // * ANDPD m128, xmm [SSE2]
  1783. //
  1784. func (self *Program) ANDPD(v0 interface{}, v1 interface{}) *Instruction {
  1785. p := self.alloc("ANDPD", 2, Operands { v0, v1 })
  1786. // ANDPD xmm, xmm
  1787. if isXMM(v0) && isXMM(v1) {
  1788. self.require(ISA_SSE2)
  1789. p.domain = DomainMMXSSE
  1790. p.add(0, func(m *_Encoding, v []interface{}) {
  1791. m.emit(0x66)
  1792. m.rexo(hcode(v[1]), v[0], false)
  1793. m.emit(0x0f)
  1794. m.emit(0x54)
  1795. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  1796. })
  1797. }
  1798. // ANDPD m128, xmm
  1799. if isM128(v0) && isXMM(v1) {
  1800. self.require(ISA_SSE2)
  1801. p.domain = DomainMMXSSE
  1802. p.add(0, func(m *_Encoding, v []interface{}) {
  1803. m.emit(0x66)
  1804. m.rexo(hcode(v[1]), addr(v[0]), false)
  1805. m.emit(0x0f)
  1806. m.emit(0x54)
  1807. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  1808. })
  1809. }
  1810. if p.len == 0 {
  1811. panic("invalid operands for ANDPD")
  1812. }
  1813. return p
  1814. }
  1815. // ANDPS performs "Bitwise Logical AND of Packed Single-Precision Floating-Point Values".
  1816. //
  1817. // Mnemonic : ANDPS
  1818. // Supported forms : (2 forms)
  1819. //
  1820. // * ANDPS xmm, xmm [SSE]
  1821. // * ANDPS m128, xmm [SSE]
  1822. //
  1823. func (self *Program) ANDPS(v0 interface{}, v1 interface{}) *Instruction {
  1824. p := self.alloc("ANDPS", 2, Operands { v0, v1 })
  1825. // ANDPS xmm, xmm
  1826. if isXMM(v0) && isXMM(v1) {
  1827. self.require(ISA_SSE)
  1828. p.domain = DomainMMXSSE
  1829. p.add(0, func(m *_Encoding, v []interface{}) {
  1830. m.rexo(hcode(v[1]), v[0], false)
  1831. m.emit(0x0f)
  1832. m.emit(0x54)
  1833. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  1834. })
  1835. }
  1836. // ANDPS m128, xmm
  1837. if isM128(v0) && isXMM(v1) {
  1838. self.require(ISA_SSE)
  1839. p.domain = DomainMMXSSE
  1840. p.add(0, func(m *_Encoding, v []interface{}) {
  1841. m.rexo(hcode(v[1]), addr(v[0]), false)
  1842. m.emit(0x0f)
  1843. m.emit(0x54)
  1844. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  1845. })
  1846. }
  1847. if p.len == 0 {
  1848. panic("invalid operands for ANDPS")
  1849. }
  1850. return p
  1851. }
  1852. // ANDQ performs "Logical AND".
  1853. //
  1854. // Mnemonic : AND
  1855. // Supported forms : (8 forms)
  1856. //
  1857. // * ANDQ imm32, rax
  1858. // * ANDQ imm8, r64
  1859. // * ANDQ imm32, r64
  1860. // * ANDQ r64, r64
  1861. // * ANDQ m64, r64
  1862. // * ANDQ imm8, m64
  1863. // * ANDQ imm32, m64
  1864. // * ANDQ r64, m64
  1865. //
  1866. func (self *Program) ANDQ(v0 interface{}, v1 interface{}) *Instruction {
  1867. p := self.alloc("ANDQ", 2, Operands { v0, v1 })
  1868. // ANDQ imm32, rax
  1869. if isImm32(v0) && v1 == RAX {
  1870. p.domain = DomainGeneric
  1871. p.add(0, func(m *_Encoding, v []interface{}) {
  1872. m.emit(0x48)
  1873. m.emit(0x25)
  1874. m.imm4(toImmAny(v[0]))
  1875. })
  1876. }
  1877. // ANDQ imm8, r64
  1878. if isImm8Ext(v0, 8) && isReg64(v1) {
  1879. p.domain = DomainGeneric
  1880. p.add(0, func(m *_Encoding, v []interface{}) {
  1881. m.emit(0x48 | hcode(v[1]))
  1882. m.emit(0x83)
  1883. m.emit(0xe0 | lcode(v[1]))
  1884. m.imm1(toImmAny(v[0]))
  1885. })
  1886. }
  1887. // ANDQ imm32, r64
  1888. if isImm32Ext(v0, 8) && isReg64(v1) {
  1889. p.domain = DomainGeneric
  1890. p.add(0, func(m *_Encoding, v []interface{}) {
  1891. m.emit(0x48 | hcode(v[1]))
  1892. m.emit(0x81)
  1893. m.emit(0xe0 | lcode(v[1]))
  1894. m.imm4(toImmAny(v[0]))
  1895. })
  1896. }
  1897. // ANDQ r64, r64
  1898. if isReg64(v0) && isReg64(v1) {
  1899. p.domain = DomainGeneric
  1900. p.add(0, func(m *_Encoding, v []interface{}) {
  1901. m.emit(0x48 | hcode(v[0]) << 2 | hcode(v[1]))
  1902. m.emit(0x21)
  1903. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  1904. })
  1905. p.add(0, func(m *_Encoding, v []interface{}) {
  1906. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  1907. m.emit(0x23)
  1908. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  1909. })
  1910. }
  1911. // ANDQ m64, r64
  1912. if isM64(v0) && isReg64(v1) {
  1913. p.domain = DomainGeneric
  1914. p.add(0, func(m *_Encoding, v []interface{}) {
  1915. m.rexm(1, hcode(v[1]), addr(v[0]))
  1916. m.emit(0x23)
  1917. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  1918. })
  1919. }
  1920. // ANDQ imm8, m64
  1921. if isImm8Ext(v0, 8) && isM64(v1) {
  1922. p.domain = DomainGeneric
  1923. p.add(0, func(m *_Encoding, v []interface{}) {
  1924. m.rexm(1, 0, addr(v[1]))
  1925. m.emit(0x83)
  1926. m.mrsd(4, addr(v[1]), 1)
  1927. m.imm1(toImmAny(v[0]))
  1928. })
  1929. }
  1930. // ANDQ imm32, m64
  1931. if isImm32Ext(v0, 8) && isM64(v1) {
  1932. p.domain = DomainGeneric
  1933. p.add(0, func(m *_Encoding, v []interface{}) {
  1934. m.rexm(1, 0, addr(v[1]))
  1935. m.emit(0x81)
  1936. m.mrsd(4, addr(v[1]), 1)
  1937. m.imm4(toImmAny(v[0]))
  1938. })
  1939. }
  1940. // ANDQ r64, m64
  1941. if isReg64(v0) && isM64(v1) {
  1942. p.domain = DomainGeneric
  1943. p.add(0, func(m *_Encoding, v []interface{}) {
  1944. m.rexm(1, hcode(v[0]), addr(v[1]))
  1945. m.emit(0x21)
  1946. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  1947. })
  1948. }
  1949. if p.len == 0 {
  1950. panic("invalid operands for ANDQ")
  1951. }
  1952. return p
  1953. }
  1954. // ANDW performs "Logical AND".
  1955. //
  1956. // Mnemonic : AND
  1957. // Supported forms : (8 forms)
  1958. //
  1959. // * ANDW imm16, ax
  1960. // * ANDW imm8, r16
  1961. // * ANDW imm16, r16
  1962. // * ANDW r16, r16
  1963. // * ANDW m16, r16
  1964. // * ANDW imm8, m16
  1965. // * ANDW imm16, m16
  1966. // * ANDW r16, m16
  1967. //
  1968. func (self *Program) ANDW(v0 interface{}, v1 interface{}) *Instruction {
  1969. p := self.alloc("ANDW", 2, Operands { v0, v1 })
  1970. // ANDW imm16, ax
  1971. if isImm16(v0) && v1 == AX {
  1972. p.domain = DomainGeneric
  1973. p.add(0, func(m *_Encoding, v []interface{}) {
  1974. m.emit(0x66)
  1975. m.emit(0x25)
  1976. m.imm2(toImmAny(v[0]))
  1977. })
  1978. }
  1979. // ANDW imm8, r16
  1980. if isImm8Ext(v0, 2) && isReg16(v1) {
  1981. p.domain = DomainGeneric
  1982. p.add(0, func(m *_Encoding, v []interface{}) {
  1983. m.emit(0x66)
  1984. m.rexo(0, v[1], false)
  1985. m.emit(0x83)
  1986. m.emit(0xe0 | lcode(v[1]))
  1987. m.imm1(toImmAny(v[0]))
  1988. })
  1989. }
  1990. // ANDW imm16, r16
  1991. if isImm16(v0) && isReg16(v1) {
  1992. p.domain = DomainGeneric
  1993. p.add(0, func(m *_Encoding, v []interface{}) {
  1994. m.emit(0x66)
  1995. m.rexo(0, v[1], false)
  1996. m.emit(0x81)
  1997. m.emit(0xe0 | lcode(v[1]))
  1998. m.imm2(toImmAny(v[0]))
  1999. })
  2000. }
  2001. // ANDW r16, r16
  2002. if isReg16(v0) && isReg16(v1) {
  2003. p.domain = DomainGeneric
  2004. p.add(0, func(m *_Encoding, v []interface{}) {
  2005. m.emit(0x66)
  2006. m.rexo(hcode(v[0]), v[1], false)
  2007. m.emit(0x21)
  2008. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  2009. })
  2010. p.add(0, func(m *_Encoding, v []interface{}) {
  2011. m.emit(0x66)
  2012. m.rexo(hcode(v[1]), v[0], false)
  2013. m.emit(0x23)
  2014. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  2015. })
  2016. }
  2017. // ANDW m16, r16
  2018. if isM16(v0) && isReg16(v1) {
  2019. p.domain = DomainGeneric
  2020. p.add(0, func(m *_Encoding, v []interface{}) {
  2021. m.emit(0x66)
  2022. m.rexo(hcode(v[1]), addr(v[0]), false)
  2023. m.emit(0x23)
  2024. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  2025. })
  2026. }
  2027. // ANDW imm8, m16
  2028. if isImm8Ext(v0, 2) && isM16(v1) {
  2029. p.domain = DomainGeneric
  2030. p.add(0, func(m *_Encoding, v []interface{}) {
  2031. m.emit(0x66)
  2032. m.rexo(0, addr(v[1]), false)
  2033. m.emit(0x83)
  2034. m.mrsd(4, addr(v[1]), 1)
  2035. m.imm1(toImmAny(v[0]))
  2036. })
  2037. }
  2038. // ANDW imm16, m16
  2039. if isImm16(v0) && isM16(v1) {
  2040. p.domain = DomainGeneric
  2041. p.add(0, func(m *_Encoding, v []interface{}) {
  2042. m.emit(0x66)
  2043. m.rexo(0, addr(v[1]), false)
  2044. m.emit(0x81)
  2045. m.mrsd(4, addr(v[1]), 1)
  2046. m.imm2(toImmAny(v[0]))
  2047. })
  2048. }
  2049. // ANDW r16, m16
  2050. if isReg16(v0) && isM16(v1) {
  2051. p.domain = DomainGeneric
  2052. p.add(0, func(m *_Encoding, v []interface{}) {
  2053. m.emit(0x66)
  2054. m.rexo(hcode(v[0]), addr(v[1]), false)
  2055. m.emit(0x21)
  2056. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  2057. })
  2058. }
  2059. if p.len == 0 {
  2060. panic("invalid operands for ANDW")
  2061. }
  2062. return p
  2063. }
  2064. // BEXTR performs "Bit Field Extract".
  2065. //
  2066. // Mnemonic : BEXTR
  2067. // Supported forms : (8 forms)
  2068. //
  2069. // * BEXTR imm32, r32, r32 [TBM]
  2070. // * BEXTR imm32, m32, r32 [TBM]
  2071. // * BEXTR imm32, r64, r64 [TBM]
  2072. // * BEXTR imm32, m64, r64 [TBM]
  2073. // * BEXTR r32, r32, r32 [BMI]
  2074. // * BEXTR r32, m32, r32 [BMI]
  2075. // * BEXTR r64, r64, r64 [BMI]
  2076. // * BEXTR r64, m64, r64 [BMI]
  2077. //
  2078. func (self *Program) BEXTR(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  2079. p := self.alloc("BEXTR", 3, Operands { v0, v1, v2 })
  2080. // BEXTR imm32, r32, r32
  2081. if isImm32(v0) && isReg32(v1) && isReg32(v2) {
  2082. self.require(ISA_TBM)
  2083. p.domain = DomainGeneric
  2084. p.add(0, func(m *_Encoding, v []interface{}) {
  2085. m.emit(0x8f)
  2086. m.emit(0xea ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  2087. m.emit(0x78)
  2088. m.emit(0x10)
  2089. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  2090. m.imm4(toImmAny(v[0]))
  2091. })
  2092. }
  2093. // BEXTR imm32, m32, r32
  2094. if isImm32(v0) && isM32(v1) && isReg32(v2) {
  2095. self.require(ISA_TBM)
  2096. p.domain = DomainGeneric
  2097. p.add(0, func(m *_Encoding, v []interface{}) {
  2098. m.vex3(0x8f, 0b1010, 0x00, hcode(v[2]), addr(v[1]), 0)
  2099. m.emit(0x10)
  2100. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  2101. m.imm4(toImmAny(v[0]))
  2102. })
  2103. }
  2104. // BEXTR imm32, r64, r64
  2105. if isImm32(v0) && isReg64(v1) && isReg64(v2) {
  2106. self.require(ISA_TBM)
  2107. p.domain = DomainGeneric
  2108. p.add(0, func(m *_Encoding, v []interface{}) {
  2109. m.emit(0x8f)
  2110. m.emit(0xea ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  2111. m.emit(0xf8)
  2112. m.emit(0x10)
  2113. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  2114. m.imm4(toImmAny(v[0]))
  2115. })
  2116. }
  2117. // BEXTR imm32, m64, r64
  2118. if isImm32(v0) && isM64(v1) && isReg64(v2) {
  2119. self.require(ISA_TBM)
  2120. p.domain = DomainGeneric
  2121. p.add(0, func(m *_Encoding, v []interface{}) {
  2122. m.vex3(0x8f, 0b1010, 0x80, hcode(v[2]), addr(v[1]), 0)
  2123. m.emit(0x10)
  2124. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  2125. m.imm4(toImmAny(v[0]))
  2126. })
  2127. }
  2128. // BEXTR r32, r32, r32
  2129. if isReg32(v0) && isReg32(v1) && isReg32(v2) {
  2130. self.require(ISA_BMI)
  2131. p.domain = DomainGeneric
  2132. p.add(0, func(m *_Encoding, v []interface{}) {
  2133. m.emit(0xc4)
  2134. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  2135. m.emit(0x78 ^ (hlcode(v[0]) << 3))
  2136. m.emit(0xf7)
  2137. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  2138. })
  2139. }
  2140. // BEXTR r32, m32, r32
  2141. if isReg32(v0) && isM32(v1) && isReg32(v2) {
  2142. self.require(ISA_BMI)
  2143. p.domain = DomainGeneric
  2144. p.add(0, func(m *_Encoding, v []interface{}) {
  2145. m.vex3(0xc4, 0b10, 0x00, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  2146. m.emit(0xf7)
  2147. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  2148. })
  2149. }
  2150. // BEXTR r64, r64, r64
  2151. if isReg64(v0) && isReg64(v1) && isReg64(v2) {
  2152. self.require(ISA_BMI)
  2153. p.domain = DomainGeneric
  2154. p.add(0, func(m *_Encoding, v []interface{}) {
  2155. m.emit(0xc4)
  2156. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  2157. m.emit(0xf8 ^ (hlcode(v[0]) << 3))
  2158. m.emit(0xf7)
  2159. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  2160. })
  2161. }
  2162. // BEXTR r64, m64, r64
  2163. if isReg64(v0) && isM64(v1) && isReg64(v2) {
  2164. self.require(ISA_BMI)
  2165. p.domain = DomainGeneric
  2166. p.add(0, func(m *_Encoding, v []interface{}) {
  2167. m.vex3(0xc4, 0b10, 0x80, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  2168. m.emit(0xf7)
  2169. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  2170. })
  2171. }
  2172. if p.len == 0 {
  2173. panic("invalid operands for BEXTR")
  2174. }
  2175. return p
  2176. }
  2177. // BLCFILL performs "Fill From Lowest Clear Bit".
  2178. //
  2179. // Mnemonic : BLCFILL
  2180. // Supported forms : (4 forms)
  2181. //
  2182. // * BLCFILL r32, r32 [TBM]
  2183. // * BLCFILL m32, r32 [TBM]
  2184. // * BLCFILL r64, r64 [TBM]
  2185. // * BLCFILL m64, r64 [TBM]
  2186. //
  2187. func (self *Program) BLCFILL(v0 interface{}, v1 interface{}) *Instruction {
  2188. p := self.alloc("BLCFILL", 2, Operands { v0, v1 })
  2189. // BLCFILL r32, r32
  2190. if isReg32(v0) && isReg32(v1) {
  2191. self.require(ISA_TBM)
  2192. p.domain = DomainGeneric
  2193. p.add(0, func(m *_Encoding, v []interface{}) {
  2194. m.emit(0x8f)
  2195. m.emit(0xe9 ^ (hcode(v[0]) << 5))
  2196. m.emit(0x78 ^ (hlcode(v[1]) << 3))
  2197. m.emit(0x01)
  2198. m.emit(0xc8 | lcode(v[0]))
  2199. })
  2200. }
  2201. // BLCFILL m32, r32
  2202. if isM32(v0) && isReg32(v1) {
  2203. self.require(ISA_TBM)
  2204. p.domain = DomainGeneric
  2205. p.add(0, func(m *_Encoding, v []interface{}) {
  2206. m.vex3(0x8f, 0b1001, 0x00, 0, addr(v[0]), hlcode(v[1]))
  2207. m.emit(0x01)
  2208. m.mrsd(1, addr(v[0]), 1)
  2209. })
  2210. }
  2211. // BLCFILL r64, r64
  2212. if isReg64(v0) && isReg64(v1) {
  2213. self.require(ISA_TBM)
  2214. p.domain = DomainGeneric
  2215. p.add(0, func(m *_Encoding, v []interface{}) {
  2216. m.emit(0x8f)
  2217. m.emit(0xe9 ^ (hcode(v[0]) << 5))
  2218. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  2219. m.emit(0x01)
  2220. m.emit(0xc8 | lcode(v[0]))
  2221. })
  2222. }
  2223. // BLCFILL m64, r64
  2224. if isM64(v0) && isReg64(v1) {
  2225. self.require(ISA_TBM)
  2226. p.domain = DomainGeneric
  2227. p.add(0, func(m *_Encoding, v []interface{}) {
  2228. m.vex3(0x8f, 0b1001, 0x80, 0, addr(v[0]), hlcode(v[1]))
  2229. m.emit(0x01)
  2230. m.mrsd(1, addr(v[0]), 1)
  2231. })
  2232. }
  2233. if p.len == 0 {
  2234. panic("invalid operands for BLCFILL")
  2235. }
  2236. return p
  2237. }
  2238. // BLCI performs "Isolate Lowest Clear Bit".
  2239. //
  2240. // Mnemonic : BLCI
  2241. // Supported forms : (4 forms)
  2242. //
  2243. // * BLCI r32, r32 [TBM]
  2244. // * BLCI m32, r32 [TBM]
  2245. // * BLCI r64, r64 [TBM]
  2246. // * BLCI m64, r64 [TBM]
  2247. //
  2248. func (self *Program) BLCI(v0 interface{}, v1 interface{}) *Instruction {
  2249. p := self.alloc("BLCI", 2, Operands { v0, v1 })
  2250. // BLCI r32, r32
  2251. if isReg32(v0) && isReg32(v1) {
  2252. self.require(ISA_TBM)
  2253. p.domain = DomainGeneric
  2254. p.add(0, func(m *_Encoding, v []interface{}) {
  2255. m.emit(0x8f)
  2256. m.emit(0xe9 ^ (hcode(v[0]) << 5))
  2257. m.emit(0x78 ^ (hlcode(v[1]) << 3))
  2258. m.emit(0x02)
  2259. m.emit(0xf0 | lcode(v[0]))
  2260. })
  2261. }
  2262. // BLCI m32, r32
  2263. if isM32(v0) && isReg32(v1) {
  2264. self.require(ISA_TBM)
  2265. p.domain = DomainGeneric
  2266. p.add(0, func(m *_Encoding, v []interface{}) {
  2267. m.vex3(0x8f, 0b1001, 0x00, 0, addr(v[0]), hlcode(v[1]))
  2268. m.emit(0x02)
  2269. m.mrsd(6, addr(v[0]), 1)
  2270. })
  2271. }
  2272. // BLCI r64, r64
  2273. if isReg64(v0) && isReg64(v1) {
  2274. self.require(ISA_TBM)
  2275. p.domain = DomainGeneric
  2276. p.add(0, func(m *_Encoding, v []interface{}) {
  2277. m.emit(0x8f)
  2278. m.emit(0xe9 ^ (hcode(v[0]) << 5))
  2279. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  2280. m.emit(0x02)
  2281. m.emit(0xf0 | lcode(v[0]))
  2282. })
  2283. }
  2284. // BLCI m64, r64
  2285. if isM64(v0) && isReg64(v1) {
  2286. self.require(ISA_TBM)
  2287. p.domain = DomainGeneric
  2288. p.add(0, func(m *_Encoding, v []interface{}) {
  2289. m.vex3(0x8f, 0b1001, 0x80, 0, addr(v[0]), hlcode(v[1]))
  2290. m.emit(0x02)
  2291. m.mrsd(6, addr(v[0]), 1)
  2292. })
  2293. }
  2294. if p.len == 0 {
  2295. panic("invalid operands for BLCI")
  2296. }
  2297. return p
  2298. }
  2299. // BLCIC performs "Isolate Lowest Set Bit and Complement".
  2300. //
  2301. // Mnemonic : BLCIC
  2302. // Supported forms : (4 forms)
  2303. //
  2304. // * BLCIC r32, r32 [TBM]
  2305. // * BLCIC m32, r32 [TBM]
  2306. // * BLCIC r64, r64 [TBM]
  2307. // * BLCIC m64, r64 [TBM]
  2308. //
  2309. func (self *Program) BLCIC(v0 interface{}, v1 interface{}) *Instruction {
  2310. p := self.alloc("BLCIC", 2, Operands { v0, v1 })
  2311. // BLCIC r32, r32
  2312. if isReg32(v0) && isReg32(v1) {
  2313. self.require(ISA_TBM)
  2314. p.domain = DomainGeneric
  2315. p.add(0, func(m *_Encoding, v []interface{}) {
  2316. m.emit(0x8f)
  2317. m.emit(0xe9 ^ (hcode(v[0]) << 5))
  2318. m.emit(0x78 ^ (hlcode(v[1]) << 3))
  2319. m.emit(0x01)
  2320. m.emit(0xe8 | lcode(v[0]))
  2321. })
  2322. }
  2323. // BLCIC m32, r32
  2324. if isM32(v0) && isReg32(v1) {
  2325. self.require(ISA_TBM)
  2326. p.domain = DomainGeneric
  2327. p.add(0, func(m *_Encoding, v []interface{}) {
  2328. m.vex3(0x8f, 0b1001, 0x00, 0, addr(v[0]), hlcode(v[1]))
  2329. m.emit(0x01)
  2330. m.mrsd(5, addr(v[0]), 1)
  2331. })
  2332. }
  2333. // BLCIC r64, r64
  2334. if isReg64(v0) && isReg64(v1) {
  2335. self.require(ISA_TBM)
  2336. p.domain = DomainGeneric
  2337. p.add(0, func(m *_Encoding, v []interface{}) {
  2338. m.emit(0x8f)
  2339. m.emit(0xe9 ^ (hcode(v[0]) << 5))
  2340. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  2341. m.emit(0x01)
  2342. m.emit(0xe8 | lcode(v[0]))
  2343. })
  2344. }
  2345. // BLCIC m64, r64
  2346. if isM64(v0) && isReg64(v1) {
  2347. self.require(ISA_TBM)
  2348. p.domain = DomainGeneric
  2349. p.add(0, func(m *_Encoding, v []interface{}) {
  2350. m.vex3(0x8f, 0b1001, 0x80, 0, addr(v[0]), hlcode(v[1]))
  2351. m.emit(0x01)
  2352. m.mrsd(5, addr(v[0]), 1)
  2353. })
  2354. }
  2355. if p.len == 0 {
  2356. panic("invalid operands for BLCIC")
  2357. }
  2358. return p
  2359. }
  2360. // BLCMSK performs "Mask From Lowest Clear Bit".
  2361. //
  2362. // Mnemonic : BLCMSK
  2363. // Supported forms : (4 forms)
  2364. //
  2365. // * BLCMSK r32, r32 [TBM]
  2366. // * BLCMSK m32, r32 [TBM]
  2367. // * BLCMSK r64, r64 [TBM]
  2368. // * BLCMSK m64, r64 [TBM]
  2369. //
  2370. func (self *Program) BLCMSK(v0 interface{}, v1 interface{}) *Instruction {
  2371. p := self.alloc("BLCMSK", 2, Operands { v0, v1 })
  2372. // BLCMSK r32, r32
  2373. if isReg32(v0) && isReg32(v1) {
  2374. self.require(ISA_TBM)
  2375. p.domain = DomainGeneric
  2376. p.add(0, func(m *_Encoding, v []interface{}) {
  2377. m.emit(0x8f)
  2378. m.emit(0xe9 ^ (hcode(v[0]) << 5))
  2379. m.emit(0x78 ^ (hlcode(v[1]) << 3))
  2380. m.emit(0x02)
  2381. m.emit(0xc8 | lcode(v[0]))
  2382. })
  2383. }
  2384. // BLCMSK m32, r32
  2385. if isM32(v0) && isReg32(v1) {
  2386. self.require(ISA_TBM)
  2387. p.domain = DomainGeneric
  2388. p.add(0, func(m *_Encoding, v []interface{}) {
  2389. m.vex3(0x8f, 0b1001, 0x00, 0, addr(v[0]), hlcode(v[1]))
  2390. m.emit(0x02)
  2391. m.mrsd(1, addr(v[0]), 1)
  2392. })
  2393. }
  2394. // BLCMSK r64, r64
  2395. if isReg64(v0) && isReg64(v1) {
  2396. self.require(ISA_TBM)
  2397. p.domain = DomainGeneric
  2398. p.add(0, func(m *_Encoding, v []interface{}) {
  2399. m.emit(0x8f)
  2400. m.emit(0xe9 ^ (hcode(v[0]) << 5))
  2401. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  2402. m.emit(0x02)
  2403. m.emit(0xc8 | lcode(v[0]))
  2404. })
  2405. }
  2406. // BLCMSK m64, r64
  2407. if isM64(v0) && isReg64(v1) {
  2408. self.require(ISA_TBM)
  2409. p.domain = DomainGeneric
  2410. p.add(0, func(m *_Encoding, v []interface{}) {
  2411. m.vex3(0x8f, 0b1001, 0x80, 0, addr(v[0]), hlcode(v[1]))
  2412. m.emit(0x02)
  2413. m.mrsd(1, addr(v[0]), 1)
  2414. })
  2415. }
  2416. if p.len == 0 {
  2417. panic("invalid operands for BLCMSK")
  2418. }
  2419. return p
  2420. }
  2421. // BLCS performs "Set Lowest Clear Bit".
  2422. //
  2423. // Mnemonic : BLCS
  2424. // Supported forms : (4 forms)
  2425. //
  2426. // * BLCS r32, r32 [TBM]
  2427. // * BLCS m32, r32 [TBM]
  2428. // * BLCS r64, r64 [TBM]
  2429. // * BLCS m64, r64 [TBM]
  2430. //
  2431. func (self *Program) BLCS(v0 interface{}, v1 interface{}) *Instruction {
  2432. p := self.alloc("BLCS", 2, Operands { v0, v1 })
  2433. // BLCS r32, r32
  2434. if isReg32(v0) && isReg32(v1) {
  2435. self.require(ISA_TBM)
  2436. p.domain = DomainGeneric
  2437. p.add(0, func(m *_Encoding, v []interface{}) {
  2438. m.emit(0x8f)
  2439. m.emit(0xe9 ^ (hcode(v[0]) << 5))
  2440. m.emit(0x78 ^ (hlcode(v[1]) << 3))
  2441. m.emit(0x01)
  2442. m.emit(0xd8 | lcode(v[0]))
  2443. })
  2444. }
  2445. // BLCS m32, r32
  2446. if isM32(v0) && isReg32(v1) {
  2447. self.require(ISA_TBM)
  2448. p.domain = DomainGeneric
  2449. p.add(0, func(m *_Encoding, v []interface{}) {
  2450. m.vex3(0x8f, 0b1001, 0x00, 0, addr(v[0]), hlcode(v[1]))
  2451. m.emit(0x01)
  2452. m.mrsd(3, addr(v[0]), 1)
  2453. })
  2454. }
  2455. // BLCS r64, r64
  2456. if isReg64(v0) && isReg64(v1) {
  2457. self.require(ISA_TBM)
  2458. p.domain = DomainGeneric
  2459. p.add(0, func(m *_Encoding, v []interface{}) {
  2460. m.emit(0x8f)
  2461. m.emit(0xe9 ^ (hcode(v[0]) << 5))
  2462. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  2463. m.emit(0x01)
  2464. m.emit(0xd8 | lcode(v[0]))
  2465. })
  2466. }
  2467. // BLCS m64, r64
  2468. if isM64(v0) && isReg64(v1) {
  2469. self.require(ISA_TBM)
  2470. p.domain = DomainGeneric
  2471. p.add(0, func(m *_Encoding, v []interface{}) {
  2472. m.vex3(0x8f, 0b1001, 0x80, 0, addr(v[0]), hlcode(v[1]))
  2473. m.emit(0x01)
  2474. m.mrsd(3, addr(v[0]), 1)
  2475. })
  2476. }
  2477. if p.len == 0 {
  2478. panic("invalid operands for BLCS")
  2479. }
  2480. return p
  2481. }
  2482. // BLENDPD performs "Blend Packed Double Precision Floating-Point Values".
  2483. //
  2484. // Mnemonic : BLENDPD
  2485. // Supported forms : (2 forms)
  2486. //
  2487. // * BLENDPD imm8, xmm, xmm [SSE4.1]
  2488. // * BLENDPD imm8, m128, xmm [SSE4.1]
  2489. //
  2490. func (self *Program) BLENDPD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  2491. p := self.alloc("BLENDPD", 3, Operands { v0, v1, v2 })
  2492. // BLENDPD imm8, xmm, xmm
  2493. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  2494. self.require(ISA_SSE4_1)
  2495. p.domain = DomainMMXSSE
  2496. p.add(0, func(m *_Encoding, v []interface{}) {
  2497. m.emit(0x66)
  2498. m.rexo(hcode(v[2]), v[1], false)
  2499. m.emit(0x0f)
  2500. m.emit(0x3a)
  2501. m.emit(0x0d)
  2502. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  2503. m.imm1(toImmAny(v[0]))
  2504. })
  2505. }
  2506. // BLENDPD imm8, m128, xmm
  2507. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  2508. self.require(ISA_SSE4_1)
  2509. p.domain = DomainMMXSSE
  2510. p.add(0, func(m *_Encoding, v []interface{}) {
  2511. m.emit(0x66)
  2512. m.rexo(hcode(v[2]), addr(v[1]), false)
  2513. m.emit(0x0f)
  2514. m.emit(0x3a)
  2515. m.emit(0x0d)
  2516. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  2517. m.imm1(toImmAny(v[0]))
  2518. })
  2519. }
  2520. if p.len == 0 {
  2521. panic("invalid operands for BLENDPD")
  2522. }
  2523. return p
  2524. }
  2525. // BLENDPS performs " Blend Packed Single Precision Floating-Point Values".
  2526. //
  2527. // Mnemonic : BLENDPS
  2528. // Supported forms : (2 forms)
  2529. //
  2530. // * BLENDPS imm8, xmm, xmm [SSE4.1]
  2531. // * BLENDPS imm8, m128, xmm [SSE4.1]
  2532. //
  2533. func (self *Program) BLENDPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  2534. p := self.alloc("BLENDPS", 3, Operands { v0, v1, v2 })
  2535. // BLENDPS imm8, xmm, xmm
  2536. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  2537. self.require(ISA_SSE4_1)
  2538. p.domain = DomainMMXSSE
  2539. p.add(0, func(m *_Encoding, v []interface{}) {
  2540. m.emit(0x66)
  2541. m.rexo(hcode(v[2]), v[1], false)
  2542. m.emit(0x0f)
  2543. m.emit(0x3a)
  2544. m.emit(0x0c)
  2545. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  2546. m.imm1(toImmAny(v[0]))
  2547. })
  2548. }
  2549. // BLENDPS imm8, m128, xmm
  2550. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  2551. self.require(ISA_SSE4_1)
  2552. p.domain = DomainMMXSSE
  2553. p.add(0, func(m *_Encoding, v []interface{}) {
  2554. m.emit(0x66)
  2555. m.rexo(hcode(v[2]), addr(v[1]), false)
  2556. m.emit(0x0f)
  2557. m.emit(0x3a)
  2558. m.emit(0x0c)
  2559. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  2560. m.imm1(toImmAny(v[0]))
  2561. })
  2562. }
  2563. if p.len == 0 {
  2564. panic("invalid operands for BLENDPS")
  2565. }
  2566. return p
  2567. }
  2568. // BLENDVPD performs " Variable Blend Packed Double Precision Floating-Point Values".
  2569. //
  2570. // Mnemonic : BLENDVPD
  2571. // Supported forms : (2 forms)
  2572. //
  2573. // * BLENDVPD xmm0, xmm, xmm [SSE4.1]
  2574. // * BLENDVPD xmm0, m128, xmm [SSE4.1]
  2575. //
  2576. func (self *Program) BLENDVPD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  2577. p := self.alloc("BLENDVPD", 3, Operands { v0, v1, v2 })
  2578. // BLENDVPD xmm0, xmm, xmm
  2579. if v0 == XMM0 && isXMM(v1) && isXMM(v2) {
  2580. self.require(ISA_SSE4_1)
  2581. p.domain = DomainMMXSSE
  2582. p.add(0, func(m *_Encoding, v []interface{}) {
  2583. m.emit(0x66)
  2584. m.rexo(hcode(v[2]), v[1], false)
  2585. m.emit(0x0f)
  2586. m.emit(0x38)
  2587. m.emit(0x15)
  2588. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  2589. })
  2590. }
  2591. // BLENDVPD xmm0, m128, xmm
  2592. if v0 == XMM0 && isM128(v1) && isXMM(v2) {
  2593. self.require(ISA_SSE4_1)
  2594. p.domain = DomainMMXSSE
  2595. p.add(0, func(m *_Encoding, v []interface{}) {
  2596. m.emit(0x66)
  2597. m.rexo(hcode(v[2]), addr(v[1]), false)
  2598. m.emit(0x0f)
  2599. m.emit(0x38)
  2600. m.emit(0x15)
  2601. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  2602. })
  2603. }
  2604. if p.len == 0 {
  2605. panic("invalid operands for BLENDVPD")
  2606. }
  2607. return p
  2608. }
  2609. // BLENDVPS performs " Variable Blend Packed Single Precision Floating-Point Values".
  2610. //
  2611. // Mnemonic : BLENDVPS
  2612. // Supported forms : (2 forms)
  2613. //
  2614. // * BLENDVPS xmm0, xmm, xmm [SSE4.1]
  2615. // * BLENDVPS xmm0, m128, xmm [SSE4.1]
  2616. //
  2617. func (self *Program) BLENDVPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  2618. p := self.alloc("BLENDVPS", 3, Operands { v0, v1, v2 })
  2619. // BLENDVPS xmm0, xmm, xmm
  2620. if v0 == XMM0 && isXMM(v1) && isXMM(v2) {
  2621. self.require(ISA_SSE4_1)
  2622. p.domain = DomainMMXSSE
  2623. p.add(0, func(m *_Encoding, v []interface{}) {
  2624. m.emit(0x66)
  2625. m.rexo(hcode(v[2]), v[1], false)
  2626. m.emit(0x0f)
  2627. m.emit(0x38)
  2628. m.emit(0x14)
  2629. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  2630. })
  2631. }
  2632. // BLENDVPS xmm0, m128, xmm
  2633. if v0 == XMM0 && isM128(v1) && isXMM(v2) {
  2634. self.require(ISA_SSE4_1)
  2635. p.domain = DomainMMXSSE
  2636. p.add(0, func(m *_Encoding, v []interface{}) {
  2637. m.emit(0x66)
  2638. m.rexo(hcode(v[2]), addr(v[1]), false)
  2639. m.emit(0x0f)
  2640. m.emit(0x38)
  2641. m.emit(0x14)
  2642. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  2643. })
  2644. }
  2645. if p.len == 0 {
  2646. panic("invalid operands for BLENDVPS")
  2647. }
  2648. return p
  2649. }
  2650. // BLSFILL performs "Fill From Lowest Set Bit".
  2651. //
  2652. // Mnemonic : BLSFILL
  2653. // Supported forms : (4 forms)
  2654. //
  2655. // * BLSFILL r32, r32 [TBM]
  2656. // * BLSFILL m32, r32 [TBM]
  2657. // * BLSFILL r64, r64 [TBM]
  2658. // * BLSFILL m64, r64 [TBM]
  2659. //
  2660. func (self *Program) BLSFILL(v0 interface{}, v1 interface{}) *Instruction {
  2661. p := self.alloc("BLSFILL", 2, Operands { v0, v1 })
  2662. // BLSFILL r32, r32
  2663. if isReg32(v0) && isReg32(v1) {
  2664. self.require(ISA_TBM)
  2665. p.domain = DomainGeneric
  2666. p.add(0, func(m *_Encoding, v []interface{}) {
  2667. m.emit(0x8f)
  2668. m.emit(0xe9 ^ (hcode(v[0]) << 5))
  2669. m.emit(0x78 ^ (hlcode(v[1]) << 3))
  2670. m.emit(0x01)
  2671. m.emit(0xd0 | lcode(v[0]))
  2672. })
  2673. }
  2674. // BLSFILL m32, r32
  2675. if isM32(v0) && isReg32(v1) {
  2676. self.require(ISA_TBM)
  2677. p.domain = DomainGeneric
  2678. p.add(0, func(m *_Encoding, v []interface{}) {
  2679. m.vex3(0x8f, 0b1001, 0x00, 0, addr(v[0]), hlcode(v[1]))
  2680. m.emit(0x01)
  2681. m.mrsd(2, addr(v[0]), 1)
  2682. })
  2683. }
  2684. // BLSFILL r64, r64
  2685. if isReg64(v0) && isReg64(v1) {
  2686. self.require(ISA_TBM)
  2687. p.domain = DomainGeneric
  2688. p.add(0, func(m *_Encoding, v []interface{}) {
  2689. m.emit(0x8f)
  2690. m.emit(0xe9 ^ (hcode(v[0]) << 5))
  2691. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  2692. m.emit(0x01)
  2693. m.emit(0xd0 | lcode(v[0]))
  2694. })
  2695. }
  2696. // BLSFILL m64, r64
  2697. if isM64(v0) && isReg64(v1) {
  2698. self.require(ISA_TBM)
  2699. p.domain = DomainGeneric
  2700. p.add(0, func(m *_Encoding, v []interface{}) {
  2701. m.vex3(0x8f, 0b1001, 0x80, 0, addr(v[0]), hlcode(v[1]))
  2702. m.emit(0x01)
  2703. m.mrsd(2, addr(v[0]), 1)
  2704. })
  2705. }
  2706. if p.len == 0 {
  2707. panic("invalid operands for BLSFILL")
  2708. }
  2709. return p
  2710. }
  2711. // BLSI performs "Isolate Lowest Set Bit".
  2712. //
  2713. // Mnemonic : BLSI
  2714. // Supported forms : (4 forms)
  2715. //
  2716. // * BLSI r32, r32 [BMI]
  2717. // * BLSI m32, r32 [BMI]
  2718. // * BLSI r64, r64 [BMI]
  2719. // * BLSI m64, r64 [BMI]
  2720. //
  2721. func (self *Program) BLSI(v0 interface{}, v1 interface{}) *Instruction {
  2722. p := self.alloc("BLSI", 2, Operands { v0, v1 })
  2723. // BLSI r32, r32
  2724. if isReg32(v0) && isReg32(v1) {
  2725. self.require(ISA_BMI)
  2726. p.domain = DomainGeneric
  2727. p.add(0, func(m *_Encoding, v []interface{}) {
  2728. m.emit(0xc4)
  2729. m.emit(0xe2 ^ (hcode(v[0]) << 5))
  2730. m.emit(0x78 ^ (hlcode(v[1]) << 3))
  2731. m.emit(0xf3)
  2732. m.emit(0xd8 | lcode(v[0]))
  2733. })
  2734. }
  2735. // BLSI m32, r32
  2736. if isM32(v0) && isReg32(v1) {
  2737. self.require(ISA_BMI)
  2738. p.domain = DomainGeneric
  2739. p.add(0, func(m *_Encoding, v []interface{}) {
  2740. m.vex3(0xc4, 0b10, 0x00, 0, addr(v[0]), hlcode(v[1]))
  2741. m.emit(0xf3)
  2742. m.mrsd(3, addr(v[0]), 1)
  2743. })
  2744. }
  2745. // BLSI r64, r64
  2746. if isReg64(v0) && isReg64(v1) {
  2747. self.require(ISA_BMI)
  2748. p.domain = DomainGeneric
  2749. p.add(0, func(m *_Encoding, v []interface{}) {
  2750. m.emit(0xc4)
  2751. m.emit(0xe2 ^ (hcode(v[0]) << 5))
  2752. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  2753. m.emit(0xf3)
  2754. m.emit(0xd8 | lcode(v[0]))
  2755. })
  2756. }
  2757. // BLSI m64, r64
  2758. if isM64(v0) && isReg64(v1) {
  2759. self.require(ISA_BMI)
  2760. p.domain = DomainGeneric
  2761. p.add(0, func(m *_Encoding, v []interface{}) {
  2762. m.vex3(0xc4, 0b10, 0x80, 0, addr(v[0]), hlcode(v[1]))
  2763. m.emit(0xf3)
  2764. m.mrsd(3, addr(v[0]), 1)
  2765. })
  2766. }
  2767. if p.len == 0 {
  2768. panic("invalid operands for BLSI")
  2769. }
  2770. return p
  2771. }
  2772. // BLSIC performs "Isolate Lowest Set Bit and Complement".
  2773. //
  2774. // Mnemonic : BLSIC
  2775. // Supported forms : (4 forms)
  2776. //
  2777. // * BLSIC r32, r32 [TBM]
  2778. // * BLSIC m32, r32 [TBM]
  2779. // * BLSIC r64, r64 [TBM]
  2780. // * BLSIC m64, r64 [TBM]
  2781. //
  2782. func (self *Program) BLSIC(v0 interface{}, v1 interface{}) *Instruction {
  2783. p := self.alloc("BLSIC", 2, Operands { v0, v1 })
  2784. // BLSIC r32, r32
  2785. if isReg32(v0) && isReg32(v1) {
  2786. self.require(ISA_TBM)
  2787. p.domain = DomainGeneric
  2788. p.add(0, func(m *_Encoding, v []interface{}) {
  2789. m.emit(0x8f)
  2790. m.emit(0xe9 ^ (hcode(v[0]) << 5))
  2791. m.emit(0x78 ^ (hlcode(v[1]) << 3))
  2792. m.emit(0x01)
  2793. m.emit(0xf0 | lcode(v[0]))
  2794. })
  2795. }
  2796. // BLSIC m32, r32
  2797. if isM32(v0) && isReg32(v1) {
  2798. self.require(ISA_TBM)
  2799. p.domain = DomainGeneric
  2800. p.add(0, func(m *_Encoding, v []interface{}) {
  2801. m.vex3(0x8f, 0b1001, 0x00, 0, addr(v[0]), hlcode(v[1]))
  2802. m.emit(0x01)
  2803. m.mrsd(6, addr(v[0]), 1)
  2804. })
  2805. }
  2806. // BLSIC r64, r64
  2807. if isReg64(v0) && isReg64(v1) {
  2808. self.require(ISA_TBM)
  2809. p.domain = DomainGeneric
  2810. p.add(0, func(m *_Encoding, v []interface{}) {
  2811. m.emit(0x8f)
  2812. m.emit(0xe9 ^ (hcode(v[0]) << 5))
  2813. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  2814. m.emit(0x01)
  2815. m.emit(0xf0 | lcode(v[0]))
  2816. })
  2817. }
  2818. // BLSIC m64, r64
  2819. if isM64(v0) && isReg64(v1) {
  2820. self.require(ISA_TBM)
  2821. p.domain = DomainGeneric
  2822. p.add(0, func(m *_Encoding, v []interface{}) {
  2823. m.vex3(0x8f, 0b1001, 0x80, 0, addr(v[0]), hlcode(v[1]))
  2824. m.emit(0x01)
  2825. m.mrsd(6, addr(v[0]), 1)
  2826. })
  2827. }
  2828. if p.len == 0 {
  2829. panic("invalid operands for BLSIC")
  2830. }
  2831. return p
  2832. }
  2833. // BLSMSK performs "Mask From Lowest Set Bit".
  2834. //
  2835. // Mnemonic : BLSMSK
  2836. // Supported forms : (4 forms)
  2837. //
  2838. // * BLSMSK r32, r32 [BMI]
  2839. // * BLSMSK m32, r32 [BMI]
  2840. // * BLSMSK r64, r64 [BMI]
  2841. // * BLSMSK m64, r64 [BMI]
  2842. //
  2843. func (self *Program) BLSMSK(v0 interface{}, v1 interface{}) *Instruction {
  2844. p := self.alloc("BLSMSK", 2, Operands { v0, v1 })
  2845. // BLSMSK r32, r32
  2846. if isReg32(v0) && isReg32(v1) {
  2847. self.require(ISA_BMI)
  2848. p.domain = DomainGeneric
  2849. p.add(0, func(m *_Encoding, v []interface{}) {
  2850. m.emit(0xc4)
  2851. m.emit(0xe2 ^ (hcode(v[0]) << 5))
  2852. m.emit(0x78 ^ (hlcode(v[1]) << 3))
  2853. m.emit(0xf3)
  2854. m.emit(0xd0 | lcode(v[0]))
  2855. })
  2856. }
  2857. // BLSMSK m32, r32
  2858. if isM32(v0) && isReg32(v1) {
  2859. self.require(ISA_BMI)
  2860. p.domain = DomainGeneric
  2861. p.add(0, func(m *_Encoding, v []interface{}) {
  2862. m.vex3(0xc4, 0b10, 0x00, 0, addr(v[0]), hlcode(v[1]))
  2863. m.emit(0xf3)
  2864. m.mrsd(2, addr(v[0]), 1)
  2865. })
  2866. }
  2867. // BLSMSK r64, r64
  2868. if isReg64(v0) && isReg64(v1) {
  2869. self.require(ISA_BMI)
  2870. p.domain = DomainGeneric
  2871. p.add(0, func(m *_Encoding, v []interface{}) {
  2872. m.emit(0xc4)
  2873. m.emit(0xe2 ^ (hcode(v[0]) << 5))
  2874. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  2875. m.emit(0xf3)
  2876. m.emit(0xd0 | lcode(v[0]))
  2877. })
  2878. }
  2879. // BLSMSK m64, r64
  2880. if isM64(v0) && isReg64(v1) {
  2881. self.require(ISA_BMI)
  2882. p.domain = DomainGeneric
  2883. p.add(0, func(m *_Encoding, v []interface{}) {
  2884. m.vex3(0xc4, 0b10, 0x80, 0, addr(v[0]), hlcode(v[1]))
  2885. m.emit(0xf3)
  2886. m.mrsd(2, addr(v[0]), 1)
  2887. })
  2888. }
  2889. if p.len == 0 {
  2890. panic("invalid operands for BLSMSK")
  2891. }
  2892. return p
  2893. }
  2894. // BLSR performs "Reset Lowest Set Bit".
  2895. //
  2896. // Mnemonic : BLSR
  2897. // Supported forms : (4 forms)
  2898. //
  2899. // * BLSR r32, r32 [BMI]
  2900. // * BLSR m32, r32 [BMI]
  2901. // * BLSR r64, r64 [BMI]
  2902. // * BLSR m64, r64 [BMI]
  2903. //
  2904. func (self *Program) BLSR(v0 interface{}, v1 interface{}) *Instruction {
  2905. p := self.alloc("BLSR", 2, Operands { v0, v1 })
  2906. // BLSR r32, r32
  2907. if isReg32(v0) && isReg32(v1) {
  2908. self.require(ISA_BMI)
  2909. p.domain = DomainGeneric
  2910. p.add(0, func(m *_Encoding, v []interface{}) {
  2911. m.emit(0xc4)
  2912. m.emit(0xe2 ^ (hcode(v[0]) << 5))
  2913. m.emit(0x78 ^ (hlcode(v[1]) << 3))
  2914. m.emit(0xf3)
  2915. m.emit(0xc8 | lcode(v[0]))
  2916. })
  2917. }
  2918. // BLSR m32, r32
  2919. if isM32(v0) && isReg32(v1) {
  2920. self.require(ISA_BMI)
  2921. p.domain = DomainGeneric
  2922. p.add(0, func(m *_Encoding, v []interface{}) {
  2923. m.vex3(0xc4, 0b10, 0x00, 0, addr(v[0]), hlcode(v[1]))
  2924. m.emit(0xf3)
  2925. m.mrsd(1, addr(v[0]), 1)
  2926. })
  2927. }
  2928. // BLSR r64, r64
  2929. if isReg64(v0) && isReg64(v1) {
  2930. self.require(ISA_BMI)
  2931. p.domain = DomainGeneric
  2932. p.add(0, func(m *_Encoding, v []interface{}) {
  2933. m.emit(0xc4)
  2934. m.emit(0xe2 ^ (hcode(v[0]) << 5))
  2935. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  2936. m.emit(0xf3)
  2937. m.emit(0xc8 | lcode(v[0]))
  2938. })
  2939. }
  2940. // BLSR m64, r64
  2941. if isM64(v0) && isReg64(v1) {
  2942. self.require(ISA_BMI)
  2943. p.domain = DomainGeneric
  2944. p.add(0, func(m *_Encoding, v []interface{}) {
  2945. m.vex3(0xc4, 0b10, 0x80, 0, addr(v[0]), hlcode(v[1]))
  2946. m.emit(0xf3)
  2947. m.mrsd(1, addr(v[0]), 1)
  2948. })
  2949. }
  2950. if p.len == 0 {
  2951. panic("invalid operands for BLSR")
  2952. }
  2953. return p
  2954. }
  2955. // BSFL performs "Bit Scan Forward".
  2956. //
  2957. // Mnemonic : BSF
  2958. // Supported forms : (2 forms)
  2959. //
  2960. // * BSFL r32, r32
  2961. // * BSFL m32, r32
  2962. //
  2963. func (self *Program) BSFL(v0 interface{}, v1 interface{}) *Instruction {
  2964. p := self.alloc("BSFL", 2, Operands { v0, v1 })
  2965. // BSFL r32, r32
  2966. if isReg32(v0) && isReg32(v1) {
  2967. p.domain = DomainGeneric
  2968. p.add(0, func(m *_Encoding, v []interface{}) {
  2969. m.rexo(hcode(v[1]), v[0], false)
  2970. m.emit(0x0f)
  2971. m.emit(0xbc)
  2972. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  2973. })
  2974. }
  2975. // BSFL m32, r32
  2976. if isM32(v0) && isReg32(v1) {
  2977. p.domain = DomainGeneric
  2978. p.add(0, func(m *_Encoding, v []interface{}) {
  2979. m.rexo(hcode(v[1]), addr(v[0]), false)
  2980. m.emit(0x0f)
  2981. m.emit(0xbc)
  2982. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  2983. })
  2984. }
  2985. if p.len == 0 {
  2986. panic("invalid operands for BSFL")
  2987. }
  2988. return p
  2989. }
  2990. // BSFQ performs "Bit Scan Forward".
  2991. //
  2992. // Mnemonic : BSF
  2993. // Supported forms : (2 forms)
  2994. //
  2995. // * BSFQ r64, r64
  2996. // * BSFQ m64, r64
  2997. //
  2998. func (self *Program) BSFQ(v0 interface{}, v1 interface{}) *Instruction {
  2999. p := self.alloc("BSFQ", 2, Operands { v0, v1 })
  3000. // BSFQ r64, r64
  3001. if isReg64(v0) && isReg64(v1) {
  3002. p.domain = DomainGeneric
  3003. p.add(0, func(m *_Encoding, v []interface{}) {
  3004. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  3005. m.emit(0x0f)
  3006. m.emit(0xbc)
  3007. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  3008. })
  3009. }
  3010. // BSFQ m64, r64
  3011. if isM64(v0) && isReg64(v1) {
  3012. p.domain = DomainGeneric
  3013. p.add(0, func(m *_Encoding, v []interface{}) {
  3014. m.rexm(1, hcode(v[1]), addr(v[0]))
  3015. m.emit(0x0f)
  3016. m.emit(0xbc)
  3017. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  3018. })
  3019. }
  3020. if p.len == 0 {
  3021. panic("invalid operands for BSFQ")
  3022. }
  3023. return p
  3024. }
  3025. // BSFW performs "Bit Scan Forward".
  3026. //
  3027. // Mnemonic : BSF
  3028. // Supported forms : (2 forms)
  3029. //
  3030. // * BSFW r16, r16
  3031. // * BSFW m16, r16
  3032. //
  3033. func (self *Program) BSFW(v0 interface{}, v1 interface{}) *Instruction {
  3034. p := self.alloc("BSFW", 2, Operands { v0, v1 })
  3035. // BSFW r16, r16
  3036. if isReg16(v0) && isReg16(v1) {
  3037. p.domain = DomainGeneric
  3038. p.add(0, func(m *_Encoding, v []interface{}) {
  3039. m.emit(0x66)
  3040. m.rexo(hcode(v[1]), v[0], false)
  3041. m.emit(0x0f)
  3042. m.emit(0xbc)
  3043. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  3044. })
  3045. }
  3046. // BSFW m16, r16
  3047. if isM16(v0) && isReg16(v1) {
  3048. p.domain = DomainGeneric
  3049. p.add(0, func(m *_Encoding, v []interface{}) {
  3050. m.emit(0x66)
  3051. m.rexo(hcode(v[1]), addr(v[0]), false)
  3052. m.emit(0x0f)
  3053. m.emit(0xbc)
  3054. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  3055. })
  3056. }
  3057. if p.len == 0 {
  3058. panic("invalid operands for BSFW")
  3059. }
  3060. return p
  3061. }
  3062. // BSRL performs "Bit Scan Reverse".
  3063. //
  3064. // Mnemonic : BSR
  3065. // Supported forms : (2 forms)
  3066. //
  3067. // * BSRL r32, r32
  3068. // * BSRL m32, r32
  3069. //
  3070. func (self *Program) BSRL(v0 interface{}, v1 interface{}) *Instruction {
  3071. p := self.alloc("BSRL", 2, Operands { v0, v1 })
  3072. // BSRL r32, r32
  3073. if isReg32(v0) && isReg32(v1) {
  3074. p.domain = DomainGeneric
  3075. p.add(0, func(m *_Encoding, v []interface{}) {
  3076. m.rexo(hcode(v[1]), v[0], false)
  3077. m.emit(0x0f)
  3078. m.emit(0xbd)
  3079. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  3080. })
  3081. }
  3082. // BSRL m32, r32
  3083. if isM32(v0) && isReg32(v1) {
  3084. p.domain = DomainGeneric
  3085. p.add(0, func(m *_Encoding, v []interface{}) {
  3086. m.rexo(hcode(v[1]), addr(v[0]), false)
  3087. m.emit(0x0f)
  3088. m.emit(0xbd)
  3089. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  3090. })
  3091. }
  3092. if p.len == 0 {
  3093. panic("invalid operands for BSRL")
  3094. }
  3095. return p
  3096. }
  3097. // BSRQ performs "Bit Scan Reverse".
  3098. //
  3099. // Mnemonic : BSR
  3100. // Supported forms : (2 forms)
  3101. //
  3102. // * BSRQ r64, r64
  3103. // * BSRQ m64, r64
  3104. //
  3105. func (self *Program) BSRQ(v0 interface{}, v1 interface{}) *Instruction {
  3106. p := self.alloc("BSRQ", 2, Operands { v0, v1 })
  3107. // BSRQ r64, r64
  3108. if isReg64(v0) && isReg64(v1) {
  3109. p.domain = DomainGeneric
  3110. p.add(0, func(m *_Encoding, v []interface{}) {
  3111. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  3112. m.emit(0x0f)
  3113. m.emit(0xbd)
  3114. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  3115. })
  3116. }
  3117. // BSRQ m64, r64
  3118. if isM64(v0) && isReg64(v1) {
  3119. p.domain = DomainGeneric
  3120. p.add(0, func(m *_Encoding, v []interface{}) {
  3121. m.rexm(1, hcode(v[1]), addr(v[0]))
  3122. m.emit(0x0f)
  3123. m.emit(0xbd)
  3124. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  3125. })
  3126. }
  3127. if p.len == 0 {
  3128. panic("invalid operands for BSRQ")
  3129. }
  3130. return p
  3131. }
  3132. // BSRW performs "Bit Scan Reverse".
  3133. //
  3134. // Mnemonic : BSR
  3135. // Supported forms : (2 forms)
  3136. //
  3137. // * BSRW r16, r16
  3138. // * BSRW m16, r16
  3139. //
  3140. func (self *Program) BSRW(v0 interface{}, v1 interface{}) *Instruction {
  3141. p := self.alloc("BSRW", 2, Operands { v0, v1 })
  3142. // BSRW r16, r16
  3143. if isReg16(v0) && isReg16(v1) {
  3144. p.domain = DomainGeneric
  3145. p.add(0, func(m *_Encoding, v []interface{}) {
  3146. m.emit(0x66)
  3147. m.rexo(hcode(v[1]), v[0], false)
  3148. m.emit(0x0f)
  3149. m.emit(0xbd)
  3150. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  3151. })
  3152. }
  3153. // BSRW m16, r16
  3154. if isM16(v0) && isReg16(v1) {
  3155. p.domain = DomainGeneric
  3156. p.add(0, func(m *_Encoding, v []interface{}) {
  3157. m.emit(0x66)
  3158. m.rexo(hcode(v[1]), addr(v[0]), false)
  3159. m.emit(0x0f)
  3160. m.emit(0xbd)
  3161. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  3162. })
  3163. }
  3164. if p.len == 0 {
  3165. panic("invalid operands for BSRW")
  3166. }
  3167. return p
  3168. }
  3169. // BSWAPL performs "Byte Swap".
  3170. //
  3171. // Mnemonic : BSWAP
  3172. // Supported forms : (1 form)
  3173. //
  3174. // * BSWAPL r32
  3175. //
  3176. func (self *Program) BSWAPL(v0 interface{}) *Instruction {
  3177. p := self.alloc("BSWAPL", 1, Operands { v0 })
  3178. // BSWAPL r32
  3179. if isReg32(v0) {
  3180. p.domain = DomainGeneric
  3181. p.add(0, func(m *_Encoding, v []interface{}) {
  3182. m.rexo(0, v[0], false)
  3183. m.emit(0x0f)
  3184. m.emit(0xc8 | lcode(v[0]))
  3185. })
  3186. }
  3187. if p.len == 0 {
  3188. panic("invalid operands for BSWAPL")
  3189. }
  3190. return p
  3191. }
  3192. // BSWAPQ performs "Byte Swap".
  3193. //
  3194. // Mnemonic : BSWAP
  3195. // Supported forms : (1 form)
  3196. //
  3197. // * BSWAPQ r64
  3198. //
  3199. func (self *Program) BSWAPQ(v0 interface{}) *Instruction {
  3200. p := self.alloc("BSWAPQ", 1, Operands { v0 })
  3201. // BSWAPQ r64
  3202. if isReg64(v0) {
  3203. p.domain = DomainGeneric
  3204. p.add(0, func(m *_Encoding, v []interface{}) {
  3205. m.emit(0x48 | hcode(v[0]))
  3206. m.emit(0x0f)
  3207. m.emit(0xc8 | lcode(v[0]))
  3208. })
  3209. }
  3210. if p.len == 0 {
  3211. panic("invalid operands for BSWAPQ")
  3212. }
  3213. return p
  3214. }
  3215. // BTCL performs "Bit Test and Complement".
  3216. //
  3217. // Mnemonic : BTC
  3218. // Supported forms : (4 forms)
  3219. //
  3220. // * BTCL imm8, r32
  3221. // * BTCL r32, r32
  3222. // * BTCL imm8, m32
  3223. // * BTCL r32, m32
  3224. //
  3225. func (self *Program) BTCL(v0 interface{}, v1 interface{}) *Instruction {
  3226. p := self.alloc("BTCL", 2, Operands { v0, v1 })
  3227. // BTCL imm8, r32
  3228. if isImm8(v0) && isReg32(v1) {
  3229. p.domain = DomainGeneric
  3230. p.add(0, func(m *_Encoding, v []interface{}) {
  3231. m.rexo(0, v[1], false)
  3232. m.emit(0x0f)
  3233. m.emit(0xba)
  3234. m.emit(0xf8 | lcode(v[1]))
  3235. m.imm1(toImmAny(v[0]))
  3236. })
  3237. }
  3238. // BTCL r32, r32
  3239. if isReg32(v0) && isReg32(v1) {
  3240. p.domain = DomainGeneric
  3241. p.add(0, func(m *_Encoding, v []interface{}) {
  3242. m.rexo(hcode(v[0]), v[1], false)
  3243. m.emit(0x0f)
  3244. m.emit(0xbb)
  3245. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  3246. })
  3247. }
  3248. // BTCL imm8, m32
  3249. if isImm8(v0) && isM32(v1) {
  3250. p.domain = DomainGeneric
  3251. p.add(0, func(m *_Encoding, v []interface{}) {
  3252. m.rexo(0, addr(v[1]), false)
  3253. m.emit(0x0f)
  3254. m.emit(0xba)
  3255. m.mrsd(7, addr(v[1]), 1)
  3256. m.imm1(toImmAny(v[0]))
  3257. })
  3258. }
  3259. // BTCL r32, m32
  3260. if isReg32(v0) && isM32(v1) {
  3261. p.domain = DomainGeneric
  3262. p.add(0, func(m *_Encoding, v []interface{}) {
  3263. m.rexo(hcode(v[0]), addr(v[1]), false)
  3264. m.emit(0x0f)
  3265. m.emit(0xbb)
  3266. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  3267. })
  3268. }
  3269. if p.len == 0 {
  3270. panic("invalid operands for BTCL")
  3271. }
  3272. return p
  3273. }
  3274. // BTCQ performs "Bit Test and Complement".
  3275. //
  3276. // Mnemonic : BTC
  3277. // Supported forms : (4 forms)
  3278. //
  3279. // * BTCQ imm8, r64
  3280. // * BTCQ r64, r64
  3281. // * BTCQ imm8, m64
  3282. // * BTCQ r64, m64
  3283. //
  3284. func (self *Program) BTCQ(v0 interface{}, v1 interface{}) *Instruction {
  3285. p := self.alloc("BTCQ", 2, Operands { v0, v1 })
  3286. // BTCQ imm8, r64
  3287. if isImm8(v0) && isReg64(v1) {
  3288. p.domain = DomainGeneric
  3289. p.add(0, func(m *_Encoding, v []interface{}) {
  3290. m.emit(0x48 | hcode(v[1]))
  3291. m.emit(0x0f)
  3292. m.emit(0xba)
  3293. m.emit(0xf8 | lcode(v[1]))
  3294. m.imm1(toImmAny(v[0]))
  3295. })
  3296. }
  3297. // BTCQ r64, r64
  3298. if isReg64(v0) && isReg64(v1) {
  3299. p.domain = DomainGeneric
  3300. p.add(0, func(m *_Encoding, v []interface{}) {
  3301. m.emit(0x48 | hcode(v[0]) << 2 | hcode(v[1]))
  3302. m.emit(0x0f)
  3303. m.emit(0xbb)
  3304. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  3305. })
  3306. }
  3307. // BTCQ imm8, m64
  3308. if isImm8(v0) && isM64(v1) {
  3309. p.domain = DomainGeneric
  3310. p.add(0, func(m *_Encoding, v []interface{}) {
  3311. m.rexm(1, 0, addr(v[1]))
  3312. m.emit(0x0f)
  3313. m.emit(0xba)
  3314. m.mrsd(7, addr(v[1]), 1)
  3315. m.imm1(toImmAny(v[0]))
  3316. })
  3317. }
  3318. // BTCQ r64, m64
  3319. if isReg64(v0) && isM64(v1) {
  3320. p.domain = DomainGeneric
  3321. p.add(0, func(m *_Encoding, v []interface{}) {
  3322. m.rexm(1, hcode(v[0]), addr(v[1]))
  3323. m.emit(0x0f)
  3324. m.emit(0xbb)
  3325. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  3326. })
  3327. }
  3328. if p.len == 0 {
  3329. panic("invalid operands for BTCQ")
  3330. }
  3331. return p
  3332. }
  3333. // BTCW performs "Bit Test and Complement".
  3334. //
  3335. // Mnemonic : BTC
  3336. // Supported forms : (4 forms)
  3337. //
  3338. // * BTCW imm8, r16
  3339. // * BTCW r16, r16
  3340. // * BTCW imm8, m16
  3341. // * BTCW r16, m16
  3342. //
  3343. func (self *Program) BTCW(v0 interface{}, v1 interface{}) *Instruction {
  3344. p := self.alloc("BTCW", 2, Operands { v0, v1 })
  3345. // BTCW imm8, r16
  3346. if isImm8(v0) && isReg16(v1) {
  3347. p.domain = DomainGeneric
  3348. p.add(0, func(m *_Encoding, v []interface{}) {
  3349. m.emit(0x66)
  3350. m.rexo(0, v[1], false)
  3351. m.emit(0x0f)
  3352. m.emit(0xba)
  3353. m.emit(0xf8 | lcode(v[1]))
  3354. m.imm1(toImmAny(v[0]))
  3355. })
  3356. }
  3357. // BTCW r16, r16
  3358. if isReg16(v0) && isReg16(v1) {
  3359. p.domain = DomainGeneric
  3360. p.add(0, func(m *_Encoding, v []interface{}) {
  3361. m.emit(0x66)
  3362. m.rexo(hcode(v[0]), v[1], false)
  3363. m.emit(0x0f)
  3364. m.emit(0xbb)
  3365. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  3366. })
  3367. }
  3368. // BTCW imm8, m16
  3369. if isImm8(v0) && isM16(v1) {
  3370. p.domain = DomainGeneric
  3371. p.add(0, func(m *_Encoding, v []interface{}) {
  3372. m.emit(0x66)
  3373. m.rexo(0, addr(v[1]), false)
  3374. m.emit(0x0f)
  3375. m.emit(0xba)
  3376. m.mrsd(7, addr(v[1]), 1)
  3377. m.imm1(toImmAny(v[0]))
  3378. })
  3379. }
  3380. // BTCW r16, m16
  3381. if isReg16(v0) && isM16(v1) {
  3382. p.domain = DomainGeneric
  3383. p.add(0, func(m *_Encoding, v []interface{}) {
  3384. m.emit(0x66)
  3385. m.rexo(hcode(v[0]), addr(v[1]), false)
  3386. m.emit(0x0f)
  3387. m.emit(0xbb)
  3388. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  3389. })
  3390. }
  3391. if p.len == 0 {
  3392. panic("invalid operands for BTCW")
  3393. }
  3394. return p
  3395. }
  3396. // BTL performs "Bit Test".
  3397. //
  3398. // Mnemonic : BT
  3399. // Supported forms : (4 forms)
  3400. //
  3401. // * BTL imm8, r32
  3402. // * BTL r32, r32
  3403. // * BTL imm8, m32
  3404. // * BTL r32, m32
  3405. //
  3406. func (self *Program) BTL(v0 interface{}, v1 interface{}) *Instruction {
  3407. p := self.alloc("BTL", 2, Operands { v0, v1 })
  3408. // BTL imm8, r32
  3409. if isImm8(v0) && isReg32(v1) {
  3410. p.domain = DomainGeneric
  3411. p.add(0, func(m *_Encoding, v []interface{}) {
  3412. m.rexo(0, v[1], false)
  3413. m.emit(0x0f)
  3414. m.emit(0xba)
  3415. m.emit(0xe0 | lcode(v[1]))
  3416. m.imm1(toImmAny(v[0]))
  3417. })
  3418. }
  3419. // BTL r32, r32
  3420. if isReg32(v0) && isReg32(v1) {
  3421. p.domain = DomainGeneric
  3422. p.add(0, func(m *_Encoding, v []interface{}) {
  3423. m.rexo(hcode(v[0]), v[1], false)
  3424. m.emit(0x0f)
  3425. m.emit(0xa3)
  3426. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  3427. })
  3428. }
  3429. // BTL imm8, m32
  3430. if isImm8(v0) && isM32(v1) {
  3431. p.domain = DomainGeneric
  3432. p.add(0, func(m *_Encoding, v []interface{}) {
  3433. m.rexo(0, addr(v[1]), false)
  3434. m.emit(0x0f)
  3435. m.emit(0xba)
  3436. m.mrsd(4, addr(v[1]), 1)
  3437. m.imm1(toImmAny(v[0]))
  3438. })
  3439. }
  3440. // BTL r32, m32
  3441. if isReg32(v0) && isM32(v1) {
  3442. p.domain = DomainGeneric
  3443. p.add(0, func(m *_Encoding, v []interface{}) {
  3444. m.rexo(hcode(v[0]), addr(v[1]), false)
  3445. m.emit(0x0f)
  3446. m.emit(0xa3)
  3447. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  3448. })
  3449. }
  3450. if p.len == 0 {
  3451. panic("invalid operands for BTL")
  3452. }
  3453. return p
  3454. }
  3455. // BTQ performs "Bit Test".
  3456. //
  3457. // Mnemonic : BT
  3458. // Supported forms : (4 forms)
  3459. //
  3460. // * BTQ imm8, r64
  3461. // * BTQ r64, r64
  3462. // * BTQ imm8, m64
  3463. // * BTQ r64, m64
  3464. //
  3465. func (self *Program) BTQ(v0 interface{}, v1 interface{}) *Instruction {
  3466. p := self.alloc("BTQ", 2, Operands { v0, v1 })
  3467. // BTQ imm8, r64
  3468. if isImm8(v0) && isReg64(v1) {
  3469. p.domain = DomainGeneric
  3470. p.add(0, func(m *_Encoding, v []interface{}) {
  3471. m.emit(0x48 | hcode(v[1]))
  3472. m.emit(0x0f)
  3473. m.emit(0xba)
  3474. m.emit(0xe0 | lcode(v[1]))
  3475. m.imm1(toImmAny(v[0]))
  3476. })
  3477. }
  3478. // BTQ r64, r64
  3479. if isReg64(v0) && isReg64(v1) {
  3480. p.domain = DomainGeneric
  3481. p.add(0, func(m *_Encoding, v []interface{}) {
  3482. m.emit(0x48 | hcode(v[0]) << 2 | hcode(v[1]))
  3483. m.emit(0x0f)
  3484. m.emit(0xa3)
  3485. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  3486. })
  3487. }
  3488. // BTQ imm8, m64
  3489. if isImm8(v0) && isM64(v1) {
  3490. p.domain = DomainGeneric
  3491. p.add(0, func(m *_Encoding, v []interface{}) {
  3492. m.rexm(1, 0, addr(v[1]))
  3493. m.emit(0x0f)
  3494. m.emit(0xba)
  3495. m.mrsd(4, addr(v[1]), 1)
  3496. m.imm1(toImmAny(v[0]))
  3497. })
  3498. }
  3499. // BTQ r64, m64
  3500. if isReg64(v0) && isM64(v1) {
  3501. p.domain = DomainGeneric
  3502. p.add(0, func(m *_Encoding, v []interface{}) {
  3503. m.rexm(1, hcode(v[0]), addr(v[1]))
  3504. m.emit(0x0f)
  3505. m.emit(0xa3)
  3506. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  3507. })
  3508. }
  3509. if p.len == 0 {
  3510. panic("invalid operands for BTQ")
  3511. }
  3512. return p
  3513. }
  3514. // BTRL performs "Bit Test and Reset".
  3515. //
  3516. // Mnemonic : BTR
  3517. // Supported forms : (4 forms)
  3518. //
  3519. // * BTRL imm8, r32
  3520. // * BTRL r32, r32
  3521. // * BTRL imm8, m32
  3522. // * BTRL r32, m32
  3523. //
  3524. func (self *Program) BTRL(v0 interface{}, v1 interface{}) *Instruction {
  3525. p := self.alloc("BTRL", 2, Operands { v0, v1 })
  3526. // BTRL imm8, r32
  3527. if isImm8(v0) && isReg32(v1) {
  3528. p.domain = DomainGeneric
  3529. p.add(0, func(m *_Encoding, v []interface{}) {
  3530. m.rexo(0, v[1], false)
  3531. m.emit(0x0f)
  3532. m.emit(0xba)
  3533. m.emit(0xf0 | lcode(v[1]))
  3534. m.imm1(toImmAny(v[0]))
  3535. })
  3536. }
  3537. // BTRL r32, r32
  3538. if isReg32(v0) && isReg32(v1) {
  3539. p.domain = DomainGeneric
  3540. p.add(0, func(m *_Encoding, v []interface{}) {
  3541. m.rexo(hcode(v[0]), v[1], false)
  3542. m.emit(0x0f)
  3543. m.emit(0xb3)
  3544. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  3545. })
  3546. }
  3547. // BTRL imm8, m32
  3548. if isImm8(v0) && isM32(v1) {
  3549. p.domain = DomainGeneric
  3550. p.add(0, func(m *_Encoding, v []interface{}) {
  3551. m.rexo(0, addr(v[1]), false)
  3552. m.emit(0x0f)
  3553. m.emit(0xba)
  3554. m.mrsd(6, addr(v[1]), 1)
  3555. m.imm1(toImmAny(v[0]))
  3556. })
  3557. }
  3558. // BTRL r32, m32
  3559. if isReg32(v0) && isM32(v1) {
  3560. p.domain = DomainGeneric
  3561. p.add(0, func(m *_Encoding, v []interface{}) {
  3562. m.rexo(hcode(v[0]), addr(v[1]), false)
  3563. m.emit(0x0f)
  3564. m.emit(0xb3)
  3565. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  3566. })
  3567. }
  3568. if p.len == 0 {
  3569. panic("invalid operands for BTRL")
  3570. }
  3571. return p
  3572. }
  3573. // BTRQ performs "Bit Test and Reset".
  3574. //
  3575. // Mnemonic : BTR
  3576. // Supported forms : (4 forms)
  3577. //
  3578. // * BTRQ imm8, r64
  3579. // * BTRQ r64, r64
  3580. // * BTRQ imm8, m64
  3581. // * BTRQ r64, m64
  3582. //
  3583. func (self *Program) BTRQ(v0 interface{}, v1 interface{}) *Instruction {
  3584. p := self.alloc("BTRQ", 2, Operands { v0, v1 })
  3585. // BTRQ imm8, r64
  3586. if isImm8(v0) && isReg64(v1) {
  3587. p.domain = DomainGeneric
  3588. p.add(0, func(m *_Encoding, v []interface{}) {
  3589. m.emit(0x48 | hcode(v[1]))
  3590. m.emit(0x0f)
  3591. m.emit(0xba)
  3592. m.emit(0xf0 | lcode(v[1]))
  3593. m.imm1(toImmAny(v[0]))
  3594. })
  3595. }
  3596. // BTRQ r64, r64
  3597. if isReg64(v0) && isReg64(v1) {
  3598. p.domain = DomainGeneric
  3599. p.add(0, func(m *_Encoding, v []interface{}) {
  3600. m.emit(0x48 | hcode(v[0]) << 2 | hcode(v[1]))
  3601. m.emit(0x0f)
  3602. m.emit(0xb3)
  3603. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  3604. })
  3605. }
  3606. // BTRQ imm8, m64
  3607. if isImm8(v0) && isM64(v1) {
  3608. p.domain = DomainGeneric
  3609. p.add(0, func(m *_Encoding, v []interface{}) {
  3610. m.rexm(1, 0, addr(v[1]))
  3611. m.emit(0x0f)
  3612. m.emit(0xba)
  3613. m.mrsd(6, addr(v[1]), 1)
  3614. m.imm1(toImmAny(v[0]))
  3615. })
  3616. }
  3617. // BTRQ r64, m64
  3618. if isReg64(v0) && isM64(v1) {
  3619. p.domain = DomainGeneric
  3620. p.add(0, func(m *_Encoding, v []interface{}) {
  3621. m.rexm(1, hcode(v[0]), addr(v[1]))
  3622. m.emit(0x0f)
  3623. m.emit(0xb3)
  3624. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  3625. })
  3626. }
  3627. if p.len == 0 {
  3628. panic("invalid operands for BTRQ")
  3629. }
  3630. return p
  3631. }
  3632. // BTRW performs "Bit Test and Reset".
  3633. //
  3634. // Mnemonic : BTR
  3635. // Supported forms : (4 forms)
  3636. //
  3637. // * BTRW imm8, r16
  3638. // * BTRW r16, r16
  3639. // * BTRW imm8, m16
  3640. // * BTRW r16, m16
  3641. //
  3642. func (self *Program) BTRW(v0 interface{}, v1 interface{}) *Instruction {
  3643. p := self.alloc("BTRW", 2, Operands { v0, v1 })
  3644. // BTRW imm8, r16
  3645. if isImm8(v0) && isReg16(v1) {
  3646. p.domain = DomainGeneric
  3647. p.add(0, func(m *_Encoding, v []interface{}) {
  3648. m.emit(0x66)
  3649. m.rexo(0, v[1], false)
  3650. m.emit(0x0f)
  3651. m.emit(0xba)
  3652. m.emit(0xf0 | lcode(v[1]))
  3653. m.imm1(toImmAny(v[0]))
  3654. })
  3655. }
  3656. // BTRW r16, r16
  3657. if isReg16(v0) && isReg16(v1) {
  3658. p.domain = DomainGeneric
  3659. p.add(0, func(m *_Encoding, v []interface{}) {
  3660. m.emit(0x66)
  3661. m.rexo(hcode(v[0]), v[1], false)
  3662. m.emit(0x0f)
  3663. m.emit(0xb3)
  3664. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  3665. })
  3666. }
  3667. // BTRW imm8, m16
  3668. if isImm8(v0) && isM16(v1) {
  3669. p.domain = DomainGeneric
  3670. p.add(0, func(m *_Encoding, v []interface{}) {
  3671. m.emit(0x66)
  3672. m.rexo(0, addr(v[1]), false)
  3673. m.emit(0x0f)
  3674. m.emit(0xba)
  3675. m.mrsd(6, addr(v[1]), 1)
  3676. m.imm1(toImmAny(v[0]))
  3677. })
  3678. }
  3679. // BTRW r16, m16
  3680. if isReg16(v0) && isM16(v1) {
  3681. p.domain = DomainGeneric
  3682. p.add(0, func(m *_Encoding, v []interface{}) {
  3683. m.emit(0x66)
  3684. m.rexo(hcode(v[0]), addr(v[1]), false)
  3685. m.emit(0x0f)
  3686. m.emit(0xb3)
  3687. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  3688. })
  3689. }
  3690. if p.len == 0 {
  3691. panic("invalid operands for BTRW")
  3692. }
  3693. return p
  3694. }
  3695. // BTSL performs "Bit Test and Set".
  3696. //
  3697. // Mnemonic : BTS
  3698. // Supported forms : (4 forms)
  3699. //
  3700. // * BTSL imm8, r32
  3701. // * BTSL r32, r32
  3702. // * BTSL imm8, m32
  3703. // * BTSL r32, m32
  3704. //
  3705. func (self *Program) BTSL(v0 interface{}, v1 interface{}) *Instruction {
  3706. p := self.alloc("BTSL", 2, Operands { v0, v1 })
  3707. // BTSL imm8, r32
  3708. if isImm8(v0) && isReg32(v1) {
  3709. p.domain = DomainGeneric
  3710. p.add(0, func(m *_Encoding, v []interface{}) {
  3711. m.rexo(0, v[1], false)
  3712. m.emit(0x0f)
  3713. m.emit(0xba)
  3714. m.emit(0xe8 | lcode(v[1]))
  3715. m.imm1(toImmAny(v[0]))
  3716. })
  3717. }
  3718. // BTSL r32, r32
  3719. if isReg32(v0) && isReg32(v1) {
  3720. p.domain = DomainGeneric
  3721. p.add(0, func(m *_Encoding, v []interface{}) {
  3722. m.rexo(hcode(v[0]), v[1], false)
  3723. m.emit(0x0f)
  3724. m.emit(0xab)
  3725. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  3726. })
  3727. }
  3728. // BTSL imm8, m32
  3729. if isImm8(v0) && isM32(v1) {
  3730. p.domain = DomainGeneric
  3731. p.add(0, func(m *_Encoding, v []interface{}) {
  3732. m.rexo(0, addr(v[1]), false)
  3733. m.emit(0x0f)
  3734. m.emit(0xba)
  3735. m.mrsd(5, addr(v[1]), 1)
  3736. m.imm1(toImmAny(v[0]))
  3737. })
  3738. }
  3739. // BTSL r32, m32
  3740. if isReg32(v0) && isM32(v1) {
  3741. p.domain = DomainGeneric
  3742. p.add(0, func(m *_Encoding, v []interface{}) {
  3743. m.rexo(hcode(v[0]), addr(v[1]), false)
  3744. m.emit(0x0f)
  3745. m.emit(0xab)
  3746. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  3747. })
  3748. }
  3749. if p.len == 0 {
  3750. panic("invalid operands for BTSL")
  3751. }
  3752. return p
  3753. }
  3754. // BTSQ performs "Bit Test and Set".
  3755. //
  3756. // Mnemonic : BTS
  3757. // Supported forms : (4 forms)
  3758. //
  3759. // * BTSQ imm8, r64
  3760. // * BTSQ r64, r64
  3761. // * BTSQ imm8, m64
  3762. // * BTSQ r64, m64
  3763. //
  3764. func (self *Program) BTSQ(v0 interface{}, v1 interface{}) *Instruction {
  3765. p := self.alloc("BTSQ", 2, Operands { v0, v1 })
  3766. // BTSQ imm8, r64
  3767. if isImm8(v0) && isReg64(v1) {
  3768. p.domain = DomainGeneric
  3769. p.add(0, func(m *_Encoding, v []interface{}) {
  3770. m.emit(0x48 | hcode(v[1]))
  3771. m.emit(0x0f)
  3772. m.emit(0xba)
  3773. m.emit(0xe8 | lcode(v[1]))
  3774. m.imm1(toImmAny(v[0]))
  3775. })
  3776. }
  3777. // BTSQ r64, r64
  3778. if isReg64(v0) && isReg64(v1) {
  3779. p.domain = DomainGeneric
  3780. p.add(0, func(m *_Encoding, v []interface{}) {
  3781. m.emit(0x48 | hcode(v[0]) << 2 | hcode(v[1]))
  3782. m.emit(0x0f)
  3783. m.emit(0xab)
  3784. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  3785. })
  3786. }
  3787. // BTSQ imm8, m64
  3788. if isImm8(v0) && isM64(v1) {
  3789. p.domain = DomainGeneric
  3790. p.add(0, func(m *_Encoding, v []interface{}) {
  3791. m.rexm(1, 0, addr(v[1]))
  3792. m.emit(0x0f)
  3793. m.emit(0xba)
  3794. m.mrsd(5, addr(v[1]), 1)
  3795. m.imm1(toImmAny(v[0]))
  3796. })
  3797. }
  3798. // BTSQ r64, m64
  3799. if isReg64(v0) && isM64(v1) {
  3800. p.domain = DomainGeneric
  3801. p.add(0, func(m *_Encoding, v []interface{}) {
  3802. m.rexm(1, hcode(v[0]), addr(v[1]))
  3803. m.emit(0x0f)
  3804. m.emit(0xab)
  3805. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  3806. })
  3807. }
  3808. if p.len == 0 {
  3809. panic("invalid operands for BTSQ")
  3810. }
  3811. return p
  3812. }
  3813. // BTSW performs "Bit Test and Set".
  3814. //
  3815. // Mnemonic : BTS
  3816. // Supported forms : (4 forms)
  3817. //
  3818. // * BTSW imm8, r16
  3819. // * BTSW r16, r16
  3820. // * BTSW imm8, m16
  3821. // * BTSW r16, m16
  3822. //
  3823. func (self *Program) BTSW(v0 interface{}, v1 interface{}) *Instruction {
  3824. p := self.alloc("BTSW", 2, Operands { v0, v1 })
  3825. // BTSW imm8, r16
  3826. if isImm8(v0) && isReg16(v1) {
  3827. p.domain = DomainGeneric
  3828. p.add(0, func(m *_Encoding, v []interface{}) {
  3829. m.emit(0x66)
  3830. m.rexo(0, v[1], false)
  3831. m.emit(0x0f)
  3832. m.emit(0xba)
  3833. m.emit(0xe8 | lcode(v[1]))
  3834. m.imm1(toImmAny(v[0]))
  3835. })
  3836. }
  3837. // BTSW r16, r16
  3838. if isReg16(v0) && isReg16(v1) {
  3839. p.domain = DomainGeneric
  3840. p.add(0, func(m *_Encoding, v []interface{}) {
  3841. m.emit(0x66)
  3842. m.rexo(hcode(v[0]), v[1], false)
  3843. m.emit(0x0f)
  3844. m.emit(0xab)
  3845. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  3846. })
  3847. }
  3848. // BTSW imm8, m16
  3849. if isImm8(v0) && isM16(v1) {
  3850. p.domain = DomainGeneric
  3851. p.add(0, func(m *_Encoding, v []interface{}) {
  3852. m.emit(0x66)
  3853. m.rexo(0, addr(v[1]), false)
  3854. m.emit(0x0f)
  3855. m.emit(0xba)
  3856. m.mrsd(5, addr(v[1]), 1)
  3857. m.imm1(toImmAny(v[0]))
  3858. })
  3859. }
  3860. // BTSW r16, m16
  3861. if isReg16(v0) && isM16(v1) {
  3862. p.domain = DomainGeneric
  3863. p.add(0, func(m *_Encoding, v []interface{}) {
  3864. m.emit(0x66)
  3865. m.rexo(hcode(v[0]), addr(v[1]), false)
  3866. m.emit(0x0f)
  3867. m.emit(0xab)
  3868. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  3869. })
  3870. }
  3871. if p.len == 0 {
  3872. panic("invalid operands for BTSW")
  3873. }
  3874. return p
  3875. }
  3876. // BTW performs "Bit Test".
  3877. //
  3878. // Mnemonic : BT
  3879. // Supported forms : (4 forms)
  3880. //
  3881. // * BTW imm8, r16
  3882. // * BTW r16, r16
  3883. // * BTW imm8, m16
  3884. // * BTW r16, m16
  3885. //
  3886. func (self *Program) BTW(v0 interface{}, v1 interface{}) *Instruction {
  3887. p := self.alloc("BTW", 2, Operands { v0, v1 })
  3888. // BTW imm8, r16
  3889. if isImm8(v0) && isReg16(v1) {
  3890. p.domain = DomainGeneric
  3891. p.add(0, func(m *_Encoding, v []interface{}) {
  3892. m.emit(0x66)
  3893. m.rexo(0, v[1], false)
  3894. m.emit(0x0f)
  3895. m.emit(0xba)
  3896. m.emit(0xe0 | lcode(v[1]))
  3897. m.imm1(toImmAny(v[0]))
  3898. })
  3899. }
  3900. // BTW r16, r16
  3901. if isReg16(v0) && isReg16(v1) {
  3902. p.domain = DomainGeneric
  3903. p.add(0, func(m *_Encoding, v []interface{}) {
  3904. m.emit(0x66)
  3905. m.rexo(hcode(v[0]), v[1], false)
  3906. m.emit(0x0f)
  3907. m.emit(0xa3)
  3908. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  3909. })
  3910. }
  3911. // BTW imm8, m16
  3912. if isImm8(v0) && isM16(v1) {
  3913. p.domain = DomainGeneric
  3914. p.add(0, func(m *_Encoding, v []interface{}) {
  3915. m.emit(0x66)
  3916. m.rexo(0, addr(v[1]), false)
  3917. m.emit(0x0f)
  3918. m.emit(0xba)
  3919. m.mrsd(4, addr(v[1]), 1)
  3920. m.imm1(toImmAny(v[0]))
  3921. })
  3922. }
  3923. // BTW r16, m16
  3924. if isReg16(v0) && isM16(v1) {
  3925. p.domain = DomainGeneric
  3926. p.add(0, func(m *_Encoding, v []interface{}) {
  3927. m.emit(0x66)
  3928. m.rexo(hcode(v[0]), addr(v[1]), false)
  3929. m.emit(0x0f)
  3930. m.emit(0xa3)
  3931. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  3932. })
  3933. }
  3934. if p.len == 0 {
  3935. panic("invalid operands for BTW")
  3936. }
  3937. return p
  3938. }
  3939. // BZHI performs "Zero High Bits Starting with Specified Bit Position".
  3940. //
  3941. // Mnemonic : BZHI
  3942. // Supported forms : (4 forms)
  3943. //
  3944. // * BZHI r32, r32, r32 [BMI2]
  3945. // * BZHI r32, m32, r32 [BMI2]
  3946. // * BZHI r64, r64, r64 [BMI2]
  3947. // * BZHI r64, m64, r64 [BMI2]
  3948. //
  3949. func (self *Program) BZHI(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  3950. p := self.alloc("BZHI", 3, Operands { v0, v1, v2 })
  3951. // BZHI r32, r32, r32
  3952. if isReg32(v0) && isReg32(v1) && isReg32(v2) {
  3953. self.require(ISA_BMI2)
  3954. p.domain = DomainGeneric
  3955. p.add(0, func(m *_Encoding, v []interface{}) {
  3956. m.emit(0xc4)
  3957. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  3958. m.emit(0x78 ^ (hlcode(v[0]) << 3))
  3959. m.emit(0xf5)
  3960. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  3961. })
  3962. }
  3963. // BZHI r32, m32, r32
  3964. if isReg32(v0) && isM32(v1) && isReg32(v2) {
  3965. self.require(ISA_BMI2)
  3966. p.domain = DomainGeneric
  3967. p.add(0, func(m *_Encoding, v []interface{}) {
  3968. m.vex3(0xc4, 0b10, 0x00, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  3969. m.emit(0xf5)
  3970. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  3971. })
  3972. }
  3973. // BZHI r64, r64, r64
  3974. if isReg64(v0) && isReg64(v1) && isReg64(v2) {
  3975. self.require(ISA_BMI2)
  3976. p.domain = DomainGeneric
  3977. p.add(0, func(m *_Encoding, v []interface{}) {
  3978. m.emit(0xc4)
  3979. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  3980. m.emit(0xf8 ^ (hlcode(v[0]) << 3))
  3981. m.emit(0xf5)
  3982. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  3983. })
  3984. }
  3985. // BZHI r64, m64, r64
  3986. if isReg64(v0) && isM64(v1) && isReg64(v2) {
  3987. self.require(ISA_BMI2)
  3988. p.domain = DomainGeneric
  3989. p.add(0, func(m *_Encoding, v []interface{}) {
  3990. m.vex3(0xc4, 0b10, 0x80, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  3991. m.emit(0xf5)
  3992. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  3993. })
  3994. }
  3995. if p.len == 0 {
  3996. panic("invalid operands for BZHI")
  3997. }
  3998. return p
  3999. }
  4000. // CALL performs "Call Procedure".
  4001. //
  4002. // Mnemonic : CALL
  4003. // Supported forms : (1 form)
  4004. //
  4005. // * CALL rel32
  4006. //
  4007. func (self *Program) CALL(v0 interface{}) *Instruction {
  4008. p := self.alloc("CALL", 1, Operands { v0 })
  4009. // CALL rel32
  4010. if isRel32(v0) {
  4011. p.domain = DomainGeneric
  4012. p.add(0, func(m *_Encoding, v []interface{}) {
  4013. m.emit(0xe8)
  4014. m.imm4(relv(v[0]))
  4015. })
  4016. }
  4017. // CALL label
  4018. if isLabel(v0) {
  4019. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  4020. m.emit(0xe8)
  4021. m.imm4(relv(v[0]))
  4022. })
  4023. }
  4024. if p.len == 0 {
  4025. panic("invalid operands for CALL")
  4026. }
  4027. return p
  4028. }
  4029. // CALLQ performs "Call Procedure".
  4030. //
  4031. // Mnemonic : CALL
  4032. // Supported forms : (2 forms)
  4033. //
  4034. // * CALLQ r64
  4035. // * CALLQ m64
  4036. //
  4037. func (self *Program) CALLQ(v0 interface{}) *Instruction {
  4038. p := self.alloc("CALLQ", 1, Operands { v0 })
  4039. // CALLQ r64
  4040. if isReg64(v0) {
  4041. p.domain = DomainGeneric
  4042. p.add(0, func(m *_Encoding, v []interface{}) {
  4043. m.rexo(0, v[0], false)
  4044. m.emit(0xff)
  4045. m.emit(0xd0 | lcode(v[0]))
  4046. })
  4047. }
  4048. // CALLQ m64
  4049. if isM64(v0) {
  4050. p.domain = DomainGeneric
  4051. p.add(0, func(m *_Encoding, v []interface{}) {
  4052. m.rexo(0, addr(v[0]), false)
  4053. m.emit(0xff)
  4054. m.mrsd(2, addr(v[0]), 1)
  4055. })
  4056. }
  4057. if p.len == 0 {
  4058. panic("invalid operands for CALLQ")
  4059. }
  4060. return p
  4061. }
  4062. // CBTW performs "Convert Byte to Word".
  4063. //
  4064. // Mnemonic : CBW
  4065. // Supported forms : (1 form)
  4066. //
  4067. // * CBTW
  4068. //
  4069. func (self *Program) CBTW() *Instruction {
  4070. p := self.alloc("CBTW", 0, Operands { })
  4071. // CBTW
  4072. p.domain = DomainGeneric
  4073. p.add(0, func(m *_Encoding, v []interface{}) {
  4074. m.emit(0x66)
  4075. m.emit(0x98)
  4076. })
  4077. return p
  4078. }
  4079. // CLC performs "Clear Carry Flag".
  4080. //
  4081. // Mnemonic : CLC
  4082. // Supported forms : (1 form)
  4083. //
  4084. // * CLC
  4085. //
  4086. func (self *Program) CLC() *Instruction {
  4087. p := self.alloc("CLC", 0, Operands { })
  4088. // CLC
  4089. p.domain = DomainGeneric
  4090. p.add(0, func(m *_Encoding, v []interface{}) {
  4091. m.emit(0xf8)
  4092. })
  4093. return p
  4094. }
  4095. // CLD performs "Clear Direction Flag".
  4096. //
  4097. // Mnemonic : CLD
  4098. // Supported forms : (1 form)
  4099. //
  4100. // * CLD
  4101. //
  4102. func (self *Program) CLD() *Instruction {
  4103. p := self.alloc("CLD", 0, Operands { })
  4104. // CLD
  4105. p.domain = DomainGeneric
  4106. p.add(0, func(m *_Encoding, v []interface{}) {
  4107. m.emit(0xfc)
  4108. })
  4109. return p
  4110. }
  4111. // CLFLUSH performs "Flush Cache Line".
  4112. //
  4113. // Mnemonic : CLFLUSH
  4114. // Supported forms : (1 form)
  4115. //
  4116. // * CLFLUSH m8 [CLFLUSH]
  4117. //
  4118. func (self *Program) CLFLUSH(v0 interface{}) *Instruction {
  4119. p := self.alloc("CLFLUSH", 1, Operands { v0 })
  4120. // CLFLUSH m8
  4121. if isM8(v0) {
  4122. self.require(ISA_CLFLUSH)
  4123. p.domain = DomainGeneric
  4124. p.add(0, func(m *_Encoding, v []interface{}) {
  4125. m.rexo(0, addr(v[0]), false)
  4126. m.emit(0x0f)
  4127. m.emit(0xae)
  4128. m.mrsd(7, addr(v[0]), 1)
  4129. })
  4130. }
  4131. if p.len == 0 {
  4132. panic("invalid operands for CLFLUSH")
  4133. }
  4134. return p
  4135. }
  4136. // CLFLUSHOPT performs "Flush Cache Line Optimized".
  4137. //
  4138. // Mnemonic : CLFLUSHOPT
  4139. // Supported forms : (1 form)
  4140. //
  4141. // * CLFLUSHOPT m8 [CLFLUSHOPT]
  4142. //
  4143. func (self *Program) CLFLUSHOPT(v0 interface{}) *Instruction {
  4144. p := self.alloc("CLFLUSHOPT", 1, Operands { v0 })
  4145. // CLFLUSHOPT m8
  4146. if isM8(v0) {
  4147. self.require(ISA_CLFLUSHOPT)
  4148. p.domain = DomainGeneric
  4149. p.add(0, func(m *_Encoding, v []interface{}) {
  4150. m.emit(0x66)
  4151. m.rexo(0, addr(v[0]), false)
  4152. m.emit(0x0f)
  4153. m.emit(0xae)
  4154. m.mrsd(7, addr(v[0]), 1)
  4155. })
  4156. }
  4157. if p.len == 0 {
  4158. panic("invalid operands for CLFLUSHOPT")
  4159. }
  4160. return p
  4161. }
  4162. // CLTD performs "Convert Doubleword to Quadword".
  4163. //
  4164. // Mnemonic : CDQ
  4165. // Supported forms : (1 form)
  4166. //
  4167. // * CLTD
  4168. //
  4169. func (self *Program) CLTD() *Instruction {
  4170. p := self.alloc("CLTD", 0, Operands { })
  4171. // CLTD
  4172. p.domain = DomainGeneric
  4173. p.add(0, func(m *_Encoding, v []interface{}) {
  4174. m.emit(0x99)
  4175. })
  4176. return p
  4177. }
  4178. // CLTQ performs "Convert Doubleword to Quadword".
  4179. //
  4180. // Mnemonic : CDQE
  4181. // Supported forms : (1 form)
  4182. //
  4183. // * CLTQ
  4184. //
  4185. func (self *Program) CLTQ() *Instruction {
  4186. p := self.alloc("CLTQ", 0, Operands { })
  4187. // CLTQ
  4188. p.domain = DomainGeneric
  4189. p.add(0, func(m *_Encoding, v []interface{}) {
  4190. m.emit(0x48)
  4191. m.emit(0x98)
  4192. })
  4193. return p
  4194. }
  4195. // CLWB performs "Cache Line Write Back".
  4196. //
  4197. // Mnemonic : CLWB
  4198. // Supported forms : (1 form)
  4199. //
  4200. // * CLWB m8 [CLWB]
  4201. //
  4202. func (self *Program) CLWB(v0 interface{}) *Instruction {
  4203. p := self.alloc("CLWB", 1, Operands { v0 })
  4204. // CLWB m8
  4205. if isM8(v0) {
  4206. self.require(ISA_CLWB)
  4207. p.domain = DomainGeneric
  4208. p.add(0, func(m *_Encoding, v []interface{}) {
  4209. m.emit(0x66)
  4210. m.rexo(0, addr(v[0]), false)
  4211. m.emit(0x0f)
  4212. m.emit(0xae)
  4213. m.mrsd(6, addr(v[0]), 1)
  4214. })
  4215. }
  4216. if p.len == 0 {
  4217. panic("invalid operands for CLWB")
  4218. }
  4219. return p
  4220. }
  4221. // CLZERO performs "Zero-out 64-bit Cache Line".
  4222. //
  4223. // Mnemonic : CLZERO
  4224. // Supported forms : (1 form)
  4225. //
  4226. // * CLZERO [CLZERO]
  4227. //
  4228. func (self *Program) CLZERO() *Instruction {
  4229. p := self.alloc("CLZERO", 0, Operands { })
  4230. // CLZERO
  4231. self.require(ISA_CLZERO)
  4232. p.domain = DomainGeneric
  4233. p.add(0, func(m *_Encoding, v []interface{}) {
  4234. m.emit(0x0f)
  4235. m.emit(0x01)
  4236. m.emit(0xfc)
  4237. })
  4238. return p
  4239. }
  4240. // CMC performs "Complement Carry Flag".
  4241. //
  4242. // Mnemonic : CMC
  4243. // Supported forms : (1 form)
  4244. //
  4245. // * CMC
  4246. //
  4247. func (self *Program) CMC() *Instruction {
  4248. p := self.alloc("CMC", 0, Operands { })
  4249. // CMC
  4250. p.domain = DomainGeneric
  4251. p.add(0, func(m *_Encoding, v []interface{}) {
  4252. m.emit(0xf5)
  4253. })
  4254. return p
  4255. }
  4256. // CMOVA performs "Move if above (CF == 0 and ZF == 0)".
  4257. //
  4258. // Mnemonic : CMOVA
  4259. // Supported forms : (6 forms)
  4260. //
  4261. // * CMOVA r16, r16 [CMOV]
  4262. // * CMOVA m16, r16 [CMOV]
  4263. // * CMOVA r32, r32 [CMOV]
  4264. // * CMOVA m32, r32 [CMOV]
  4265. // * CMOVA r64, r64 [CMOV]
  4266. // * CMOVA m64, r64 [CMOV]
  4267. //
  4268. func (self *Program) CMOVA(v0 interface{}, v1 interface{}) *Instruction {
  4269. p := self.alloc("CMOVA", 2, Operands { v0, v1 })
  4270. // CMOVA r16, r16
  4271. if isReg16(v0) && isReg16(v1) {
  4272. self.require(ISA_CMOV)
  4273. p.domain = DomainGeneric
  4274. p.add(0, func(m *_Encoding, v []interface{}) {
  4275. m.emit(0x66)
  4276. m.rexo(hcode(v[1]), v[0], false)
  4277. m.emit(0x0f)
  4278. m.emit(0x47)
  4279. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4280. })
  4281. }
  4282. // CMOVA m16, r16
  4283. if isM16(v0) && isReg16(v1) {
  4284. self.require(ISA_CMOV)
  4285. p.domain = DomainGeneric
  4286. p.add(0, func(m *_Encoding, v []interface{}) {
  4287. m.emit(0x66)
  4288. m.rexo(hcode(v[1]), addr(v[0]), false)
  4289. m.emit(0x0f)
  4290. m.emit(0x47)
  4291. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4292. })
  4293. }
  4294. // CMOVA r32, r32
  4295. if isReg32(v0) && isReg32(v1) {
  4296. self.require(ISA_CMOV)
  4297. p.domain = DomainGeneric
  4298. p.add(0, func(m *_Encoding, v []interface{}) {
  4299. m.rexo(hcode(v[1]), v[0], false)
  4300. m.emit(0x0f)
  4301. m.emit(0x47)
  4302. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4303. })
  4304. }
  4305. // CMOVA m32, r32
  4306. if isM32(v0) && isReg32(v1) {
  4307. self.require(ISA_CMOV)
  4308. p.domain = DomainGeneric
  4309. p.add(0, func(m *_Encoding, v []interface{}) {
  4310. m.rexo(hcode(v[1]), addr(v[0]), false)
  4311. m.emit(0x0f)
  4312. m.emit(0x47)
  4313. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4314. })
  4315. }
  4316. // CMOVA r64, r64
  4317. if isReg64(v0) && isReg64(v1) {
  4318. self.require(ISA_CMOV)
  4319. p.domain = DomainGeneric
  4320. p.add(0, func(m *_Encoding, v []interface{}) {
  4321. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  4322. m.emit(0x0f)
  4323. m.emit(0x47)
  4324. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4325. })
  4326. }
  4327. // CMOVA m64, r64
  4328. if isM64(v0) && isReg64(v1) {
  4329. self.require(ISA_CMOV)
  4330. p.domain = DomainGeneric
  4331. p.add(0, func(m *_Encoding, v []interface{}) {
  4332. m.rexm(1, hcode(v[1]), addr(v[0]))
  4333. m.emit(0x0f)
  4334. m.emit(0x47)
  4335. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4336. })
  4337. }
  4338. if p.len == 0 {
  4339. panic("invalid operands for CMOVA")
  4340. }
  4341. return p
  4342. }
  4343. // CMOVAE performs "Move if above or equal (CF == 0)".
  4344. //
  4345. // Mnemonic : CMOVAE
  4346. // Supported forms : (6 forms)
  4347. //
  4348. // * CMOVAE r16, r16 [CMOV]
  4349. // * CMOVAE m16, r16 [CMOV]
  4350. // * CMOVAE r32, r32 [CMOV]
  4351. // * CMOVAE m32, r32 [CMOV]
  4352. // * CMOVAE r64, r64 [CMOV]
  4353. // * CMOVAE m64, r64 [CMOV]
  4354. //
  4355. func (self *Program) CMOVAE(v0 interface{}, v1 interface{}) *Instruction {
  4356. p := self.alloc("CMOVAE", 2, Operands { v0, v1 })
  4357. // CMOVAE r16, r16
  4358. if isReg16(v0) && isReg16(v1) {
  4359. self.require(ISA_CMOV)
  4360. p.domain = DomainGeneric
  4361. p.add(0, func(m *_Encoding, v []interface{}) {
  4362. m.emit(0x66)
  4363. m.rexo(hcode(v[1]), v[0], false)
  4364. m.emit(0x0f)
  4365. m.emit(0x43)
  4366. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4367. })
  4368. }
  4369. // CMOVAE m16, r16
  4370. if isM16(v0) && isReg16(v1) {
  4371. self.require(ISA_CMOV)
  4372. p.domain = DomainGeneric
  4373. p.add(0, func(m *_Encoding, v []interface{}) {
  4374. m.emit(0x66)
  4375. m.rexo(hcode(v[1]), addr(v[0]), false)
  4376. m.emit(0x0f)
  4377. m.emit(0x43)
  4378. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4379. })
  4380. }
  4381. // CMOVAE r32, r32
  4382. if isReg32(v0) && isReg32(v1) {
  4383. self.require(ISA_CMOV)
  4384. p.domain = DomainGeneric
  4385. p.add(0, func(m *_Encoding, v []interface{}) {
  4386. m.rexo(hcode(v[1]), v[0], false)
  4387. m.emit(0x0f)
  4388. m.emit(0x43)
  4389. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4390. })
  4391. }
  4392. // CMOVAE m32, r32
  4393. if isM32(v0) && isReg32(v1) {
  4394. self.require(ISA_CMOV)
  4395. p.domain = DomainGeneric
  4396. p.add(0, func(m *_Encoding, v []interface{}) {
  4397. m.rexo(hcode(v[1]), addr(v[0]), false)
  4398. m.emit(0x0f)
  4399. m.emit(0x43)
  4400. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4401. })
  4402. }
  4403. // CMOVAE r64, r64
  4404. if isReg64(v0) && isReg64(v1) {
  4405. self.require(ISA_CMOV)
  4406. p.domain = DomainGeneric
  4407. p.add(0, func(m *_Encoding, v []interface{}) {
  4408. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  4409. m.emit(0x0f)
  4410. m.emit(0x43)
  4411. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4412. })
  4413. }
  4414. // CMOVAE m64, r64
  4415. if isM64(v0) && isReg64(v1) {
  4416. self.require(ISA_CMOV)
  4417. p.domain = DomainGeneric
  4418. p.add(0, func(m *_Encoding, v []interface{}) {
  4419. m.rexm(1, hcode(v[1]), addr(v[0]))
  4420. m.emit(0x0f)
  4421. m.emit(0x43)
  4422. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4423. })
  4424. }
  4425. if p.len == 0 {
  4426. panic("invalid operands for CMOVAE")
  4427. }
  4428. return p
  4429. }
  4430. // CMOVB performs "Move if below (CF == 1)".
  4431. //
  4432. // Mnemonic : CMOVB
  4433. // Supported forms : (6 forms)
  4434. //
  4435. // * CMOVB r16, r16 [CMOV]
  4436. // * CMOVB m16, r16 [CMOV]
  4437. // * CMOVB r32, r32 [CMOV]
  4438. // * CMOVB m32, r32 [CMOV]
  4439. // * CMOVB r64, r64 [CMOV]
  4440. // * CMOVB m64, r64 [CMOV]
  4441. //
  4442. func (self *Program) CMOVB(v0 interface{}, v1 interface{}) *Instruction {
  4443. p := self.alloc("CMOVB", 2, Operands { v0, v1 })
  4444. // CMOVB r16, r16
  4445. if isReg16(v0) && isReg16(v1) {
  4446. self.require(ISA_CMOV)
  4447. p.domain = DomainGeneric
  4448. p.add(0, func(m *_Encoding, v []interface{}) {
  4449. m.emit(0x66)
  4450. m.rexo(hcode(v[1]), v[0], false)
  4451. m.emit(0x0f)
  4452. m.emit(0x42)
  4453. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4454. })
  4455. }
  4456. // CMOVB m16, r16
  4457. if isM16(v0) && isReg16(v1) {
  4458. self.require(ISA_CMOV)
  4459. p.domain = DomainGeneric
  4460. p.add(0, func(m *_Encoding, v []interface{}) {
  4461. m.emit(0x66)
  4462. m.rexo(hcode(v[1]), addr(v[0]), false)
  4463. m.emit(0x0f)
  4464. m.emit(0x42)
  4465. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4466. })
  4467. }
  4468. // CMOVB r32, r32
  4469. if isReg32(v0) && isReg32(v1) {
  4470. self.require(ISA_CMOV)
  4471. p.domain = DomainGeneric
  4472. p.add(0, func(m *_Encoding, v []interface{}) {
  4473. m.rexo(hcode(v[1]), v[0], false)
  4474. m.emit(0x0f)
  4475. m.emit(0x42)
  4476. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4477. })
  4478. }
  4479. // CMOVB m32, r32
  4480. if isM32(v0) && isReg32(v1) {
  4481. self.require(ISA_CMOV)
  4482. p.domain = DomainGeneric
  4483. p.add(0, func(m *_Encoding, v []interface{}) {
  4484. m.rexo(hcode(v[1]), addr(v[0]), false)
  4485. m.emit(0x0f)
  4486. m.emit(0x42)
  4487. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4488. })
  4489. }
  4490. // CMOVB r64, r64
  4491. if isReg64(v0) && isReg64(v1) {
  4492. self.require(ISA_CMOV)
  4493. p.domain = DomainGeneric
  4494. p.add(0, func(m *_Encoding, v []interface{}) {
  4495. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  4496. m.emit(0x0f)
  4497. m.emit(0x42)
  4498. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4499. })
  4500. }
  4501. // CMOVB m64, r64
  4502. if isM64(v0) && isReg64(v1) {
  4503. self.require(ISA_CMOV)
  4504. p.domain = DomainGeneric
  4505. p.add(0, func(m *_Encoding, v []interface{}) {
  4506. m.rexm(1, hcode(v[1]), addr(v[0]))
  4507. m.emit(0x0f)
  4508. m.emit(0x42)
  4509. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4510. })
  4511. }
  4512. if p.len == 0 {
  4513. panic("invalid operands for CMOVB")
  4514. }
  4515. return p
  4516. }
  4517. // CMOVBE performs "Move if below or equal (CF == 1 or ZF == 1)".
  4518. //
  4519. // Mnemonic : CMOVBE
  4520. // Supported forms : (6 forms)
  4521. //
  4522. // * CMOVBE r16, r16 [CMOV]
  4523. // * CMOVBE m16, r16 [CMOV]
  4524. // * CMOVBE r32, r32 [CMOV]
  4525. // * CMOVBE m32, r32 [CMOV]
  4526. // * CMOVBE r64, r64 [CMOV]
  4527. // * CMOVBE m64, r64 [CMOV]
  4528. //
  4529. func (self *Program) CMOVBE(v0 interface{}, v1 interface{}) *Instruction {
  4530. p := self.alloc("CMOVBE", 2, Operands { v0, v1 })
  4531. // CMOVBE r16, r16
  4532. if isReg16(v0) && isReg16(v1) {
  4533. self.require(ISA_CMOV)
  4534. p.domain = DomainGeneric
  4535. p.add(0, func(m *_Encoding, v []interface{}) {
  4536. m.emit(0x66)
  4537. m.rexo(hcode(v[1]), v[0], false)
  4538. m.emit(0x0f)
  4539. m.emit(0x46)
  4540. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4541. })
  4542. }
  4543. // CMOVBE m16, r16
  4544. if isM16(v0) && isReg16(v1) {
  4545. self.require(ISA_CMOV)
  4546. p.domain = DomainGeneric
  4547. p.add(0, func(m *_Encoding, v []interface{}) {
  4548. m.emit(0x66)
  4549. m.rexo(hcode(v[1]), addr(v[0]), false)
  4550. m.emit(0x0f)
  4551. m.emit(0x46)
  4552. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4553. })
  4554. }
  4555. // CMOVBE r32, r32
  4556. if isReg32(v0) && isReg32(v1) {
  4557. self.require(ISA_CMOV)
  4558. p.domain = DomainGeneric
  4559. p.add(0, func(m *_Encoding, v []interface{}) {
  4560. m.rexo(hcode(v[1]), v[0], false)
  4561. m.emit(0x0f)
  4562. m.emit(0x46)
  4563. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4564. })
  4565. }
  4566. // CMOVBE m32, r32
  4567. if isM32(v0) && isReg32(v1) {
  4568. self.require(ISA_CMOV)
  4569. p.domain = DomainGeneric
  4570. p.add(0, func(m *_Encoding, v []interface{}) {
  4571. m.rexo(hcode(v[1]), addr(v[0]), false)
  4572. m.emit(0x0f)
  4573. m.emit(0x46)
  4574. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4575. })
  4576. }
  4577. // CMOVBE r64, r64
  4578. if isReg64(v0) && isReg64(v1) {
  4579. self.require(ISA_CMOV)
  4580. p.domain = DomainGeneric
  4581. p.add(0, func(m *_Encoding, v []interface{}) {
  4582. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  4583. m.emit(0x0f)
  4584. m.emit(0x46)
  4585. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4586. })
  4587. }
  4588. // CMOVBE m64, r64
  4589. if isM64(v0) && isReg64(v1) {
  4590. self.require(ISA_CMOV)
  4591. p.domain = DomainGeneric
  4592. p.add(0, func(m *_Encoding, v []interface{}) {
  4593. m.rexm(1, hcode(v[1]), addr(v[0]))
  4594. m.emit(0x0f)
  4595. m.emit(0x46)
  4596. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4597. })
  4598. }
  4599. if p.len == 0 {
  4600. panic("invalid operands for CMOVBE")
  4601. }
  4602. return p
  4603. }
  4604. // CMOVC performs "Move if carry (CF == 1)".
  4605. //
  4606. // Mnemonic : CMOVC
  4607. // Supported forms : (6 forms)
  4608. //
  4609. // * CMOVC r16, r16 [CMOV]
  4610. // * CMOVC m16, r16 [CMOV]
  4611. // * CMOVC r32, r32 [CMOV]
  4612. // * CMOVC m32, r32 [CMOV]
  4613. // * CMOVC r64, r64 [CMOV]
  4614. // * CMOVC m64, r64 [CMOV]
  4615. //
  4616. func (self *Program) CMOVC(v0 interface{}, v1 interface{}) *Instruction {
  4617. p := self.alloc("CMOVC", 2, Operands { v0, v1 })
  4618. // CMOVC r16, r16
  4619. if isReg16(v0) && isReg16(v1) {
  4620. self.require(ISA_CMOV)
  4621. p.domain = DomainGeneric
  4622. p.add(0, func(m *_Encoding, v []interface{}) {
  4623. m.emit(0x66)
  4624. m.rexo(hcode(v[1]), v[0], false)
  4625. m.emit(0x0f)
  4626. m.emit(0x42)
  4627. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4628. })
  4629. }
  4630. // CMOVC m16, r16
  4631. if isM16(v0) && isReg16(v1) {
  4632. self.require(ISA_CMOV)
  4633. p.domain = DomainGeneric
  4634. p.add(0, func(m *_Encoding, v []interface{}) {
  4635. m.emit(0x66)
  4636. m.rexo(hcode(v[1]), addr(v[0]), false)
  4637. m.emit(0x0f)
  4638. m.emit(0x42)
  4639. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4640. })
  4641. }
  4642. // CMOVC r32, r32
  4643. if isReg32(v0) && isReg32(v1) {
  4644. self.require(ISA_CMOV)
  4645. p.domain = DomainGeneric
  4646. p.add(0, func(m *_Encoding, v []interface{}) {
  4647. m.rexo(hcode(v[1]), v[0], false)
  4648. m.emit(0x0f)
  4649. m.emit(0x42)
  4650. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4651. })
  4652. }
  4653. // CMOVC m32, r32
  4654. if isM32(v0) && isReg32(v1) {
  4655. self.require(ISA_CMOV)
  4656. p.domain = DomainGeneric
  4657. p.add(0, func(m *_Encoding, v []interface{}) {
  4658. m.rexo(hcode(v[1]), addr(v[0]), false)
  4659. m.emit(0x0f)
  4660. m.emit(0x42)
  4661. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4662. })
  4663. }
  4664. // CMOVC r64, r64
  4665. if isReg64(v0) && isReg64(v1) {
  4666. self.require(ISA_CMOV)
  4667. p.domain = DomainGeneric
  4668. p.add(0, func(m *_Encoding, v []interface{}) {
  4669. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  4670. m.emit(0x0f)
  4671. m.emit(0x42)
  4672. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4673. })
  4674. }
  4675. // CMOVC m64, r64
  4676. if isM64(v0) && isReg64(v1) {
  4677. self.require(ISA_CMOV)
  4678. p.domain = DomainGeneric
  4679. p.add(0, func(m *_Encoding, v []interface{}) {
  4680. m.rexm(1, hcode(v[1]), addr(v[0]))
  4681. m.emit(0x0f)
  4682. m.emit(0x42)
  4683. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4684. })
  4685. }
  4686. if p.len == 0 {
  4687. panic("invalid operands for CMOVC")
  4688. }
  4689. return p
  4690. }
  4691. // CMOVE performs "Move if equal (ZF == 1)".
  4692. //
  4693. // Mnemonic : CMOVE
  4694. // Supported forms : (6 forms)
  4695. //
  4696. // * CMOVE r16, r16 [CMOV]
  4697. // * CMOVE m16, r16 [CMOV]
  4698. // * CMOVE r32, r32 [CMOV]
  4699. // * CMOVE m32, r32 [CMOV]
  4700. // * CMOVE r64, r64 [CMOV]
  4701. // * CMOVE m64, r64 [CMOV]
  4702. //
  4703. func (self *Program) CMOVE(v0 interface{}, v1 interface{}) *Instruction {
  4704. p := self.alloc("CMOVE", 2, Operands { v0, v1 })
  4705. // CMOVE r16, r16
  4706. if isReg16(v0) && isReg16(v1) {
  4707. self.require(ISA_CMOV)
  4708. p.domain = DomainGeneric
  4709. p.add(0, func(m *_Encoding, v []interface{}) {
  4710. m.emit(0x66)
  4711. m.rexo(hcode(v[1]), v[0], false)
  4712. m.emit(0x0f)
  4713. m.emit(0x44)
  4714. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4715. })
  4716. }
  4717. // CMOVE m16, r16
  4718. if isM16(v0) && isReg16(v1) {
  4719. self.require(ISA_CMOV)
  4720. p.domain = DomainGeneric
  4721. p.add(0, func(m *_Encoding, v []interface{}) {
  4722. m.emit(0x66)
  4723. m.rexo(hcode(v[1]), addr(v[0]), false)
  4724. m.emit(0x0f)
  4725. m.emit(0x44)
  4726. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4727. })
  4728. }
  4729. // CMOVE r32, r32
  4730. if isReg32(v0) && isReg32(v1) {
  4731. self.require(ISA_CMOV)
  4732. p.domain = DomainGeneric
  4733. p.add(0, func(m *_Encoding, v []interface{}) {
  4734. m.rexo(hcode(v[1]), v[0], false)
  4735. m.emit(0x0f)
  4736. m.emit(0x44)
  4737. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4738. })
  4739. }
  4740. // CMOVE m32, r32
  4741. if isM32(v0) && isReg32(v1) {
  4742. self.require(ISA_CMOV)
  4743. p.domain = DomainGeneric
  4744. p.add(0, func(m *_Encoding, v []interface{}) {
  4745. m.rexo(hcode(v[1]), addr(v[0]), false)
  4746. m.emit(0x0f)
  4747. m.emit(0x44)
  4748. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4749. })
  4750. }
  4751. // CMOVE r64, r64
  4752. if isReg64(v0) && isReg64(v1) {
  4753. self.require(ISA_CMOV)
  4754. p.domain = DomainGeneric
  4755. p.add(0, func(m *_Encoding, v []interface{}) {
  4756. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  4757. m.emit(0x0f)
  4758. m.emit(0x44)
  4759. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4760. })
  4761. }
  4762. // CMOVE m64, r64
  4763. if isM64(v0) && isReg64(v1) {
  4764. self.require(ISA_CMOV)
  4765. p.domain = DomainGeneric
  4766. p.add(0, func(m *_Encoding, v []interface{}) {
  4767. m.rexm(1, hcode(v[1]), addr(v[0]))
  4768. m.emit(0x0f)
  4769. m.emit(0x44)
  4770. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4771. })
  4772. }
  4773. if p.len == 0 {
  4774. panic("invalid operands for CMOVE")
  4775. }
  4776. return p
  4777. }
  4778. // CMOVG performs "Move if greater (ZF == 0 and SF == OF)".
  4779. //
  4780. // Mnemonic : CMOVG
  4781. // Supported forms : (6 forms)
  4782. //
  4783. // * CMOVG r16, r16 [CMOV]
  4784. // * CMOVG m16, r16 [CMOV]
  4785. // * CMOVG r32, r32 [CMOV]
  4786. // * CMOVG m32, r32 [CMOV]
  4787. // * CMOVG r64, r64 [CMOV]
  4788. // * CMOVG m64, r64 [CMOV]
  4789. //
  4790. func (self *Program) CMOVG(v0 interface{}, v1 interface{}) *Instruction {
  4791. p := self.alloc("CMOVG", 2, Operands { v0, v1 })
  4792. // CMOVG r16, r16
  4793. if isReg16(v0) && isReg16(v1) {
  4794. self.require(ISA_CMOV)
  4795. p.domain = DomainGeneric
  4796. p.add(0, func(m *_Encoding, v []interface{}) {
  4797. m.emit(0x66)
  4798. m.rexo(hcode(v[1]), v[0], false)
  4799. m.emit(0x0f)
  4800. m.emit(0x4f)
  4801. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4802. })
  4803. }
  4804. // CMOVG m16, r16
  4805. if isM16(v0) && isReg16(v1) {
  4806. self.require(ISA_CMOV)
  4807. p.domain = DomainGeneric
  4808. p.add(0, func(m *_Encoding, v []interface{}) {
  4809. m.emit(0x66)
  4810. m.rexo(hcode(v[1]), addr(v[0]), false)
  4811. m.emit(0x0f)
  4812. m.emit(0x4f)
  4813. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4814. })
  4815. }
  4816. // CMOVG r32, r32
  4817. if isReg32(v0) && isReg32(v1) {
  4818. self.require(ISA_CMOV)
  4819. p.domain = DomainGeneric
  4820. p.add(0, func(m *_Encoding, v []interface{}) {
  4821. m.rexo(hcode(v[1]), v[0], false)
  4822. m.emit(0x0f)
  4823. m.emit(0x4f)
  4824. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4825. })
  4826. }
  4827. // CMOVG m32, r32
  4828. if isM32(v0) && isReg32(v1) {
  4829. self.require(ISA_CMOV)
  4830. p.domain = DomainGeneric
  4831. p.add(0, func(m *_Encoding, v []interface{}) {
  4832. m.rexo(hcode(v[1]), addr(v[0]), false)
  4833. m.emit(0x0f)
  4834. m.emit(0x4f)
  4835. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4836. })
  4837. }
  4838. // CMOVG r64, r64
  4839. if isReg64(v0) && isReg64(v1) {
  4840. self.require(ISA_CMOV)
  4841. p.domain = DomainGeneric
  4842. p.add(0, func(m *_Encoding, v []interface{}) {
  4843. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  4844. m.emit(0x0f)
  4845. m.emit(0x4f)
  4846. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4847. })
  4848. }
  4849. // CMOVG m64, r64
  4850. if isM64(v0) && isReg64(v1) {
  4851. self.require(ISA_CMOV)
  4852. p.domain = DomainGeneric
  4853. p.add(0, func(m *_Encoding, v []interface{}) {
  4854. m.rexm(1, hcode(v[1]), addr(v[0]))
  4855. m.emit(0x0f)
  4856. m.emit(0x4f)
  4857. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4858. })
  4859. }
  4860. if p.len == 0 {
  4861. panic("invalid operands for CMOVG")
  4862. }
  4863. return p
  4864. }
  4865. // CMOVGE performs "Move if greater or equal (SF == OF)".
  4866. //
  4867. // Mnemonic : CMOVGE
  4868. // Supported forms : (6 forms)
  4869. //
  4870. // * CMOVGE r16, r16 [CMOV]
  4871. // * CMOVGE m16, r16 [CMOV]
  4872. // * CMOVGE r32, r32 [CMOV]
  4873. // * CMOVGE m32, r32 [CMOV]
  4874. // * CMOVGE r64, r64 [CMOV]
  4875. // * CMOVGE m64, r64 [CMOV]
  4876. //
  4877. func (self *Program) CMOVGE(v0 interface{}, v1 interface{}) *Instruction {
  4878. p := self.alloc("CMOVGE", 2, Operands { v0, v1 })
  4879. // CMOVGE r16, r16
  4880. if isReg16(v0) && isReg16(v1) {
  4881. self.require(ISA_CMOV)
  4882. p.domain = DomainGeneric
  4883. p.add(0, func(m *_Encoding, v []interface{}) {
  4884. m.emit(0x66)
  4885. m.rexo(hcode(v[1]), v[0], false)
  4886. m.emit(0x0f)
  4887. m.emit(0x4d)
  4888. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4889. })
  4890. }
  4891. // CMOVGE m16, r16
  4892. if isM16(v0) && isReg16(v1) {
  4893. self.require(ISA_CMOV)
  4894. p.domain = DomainGeneric
  4895. p.add(0, func(m *_Encoding, v []interface{}) {
  4896. m.emit(0x66)
  4897. m.rexo(hcode(v[1]), addr(v[0]), false)
  4898. m.emit(0x0f)
  4899. m.emit(0x4d)
  4900. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4901. })
  4902. }
  4903. // CMOVGE r32, r32
  4904. if isReg32(v0) && isReg32(v1) {
  4905. self.require(ISA_CMOV)
  4906. p.domain = DomainGeneric
  4907. p.add(0, func(m *_Encoding, v []interface{}) {
  4908. m.rexo(hcode(v[1]), v[0], false)
  4909. m.emit(0x0f)
  4910. m.emit(0x4d)
  4911. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4912. })
  4913. }
  4914. // CMOVGE m32, r32
  4915. if isM32(v0) && isReg32(v1) {
  4916. self.require(ISA_CMOV)
  4917. p.domain = DomainGeneric
  4918. p.add(0, func(m *_Encoding, v []interface{}) {
  4919. m.rexo(hcode(v[1]), addr(v[0]), false)
  4920. m.emit(0x0f)
  4921. m.emit(0x4d)
  4922. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4923. })
  4924. }
  4925. // CMOVGE r64, r64
  4926. if isReg64(v0) && isReg64(v1) {
  4927. self.require(ISA_CMOV)
  4928. p.domain = DomainGeneric
  4929. p.add(0, func(m *_Encoding, v []interface{}) {
  4930. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  4931. m.emit(0x0f)
  4932. m.emit(0x4d)
  4933. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4934. })
  4935. }
  4936. // CMOVGE m64, r64
  4937. if isM64(v0) && isReg64(v1) {
  4938. self.require(ISA_CMOV)
  4939. p.domain = DomainGeneric
  4940. p.add(0, func(m *_Encoding, v []interface{}) {
  4941. m.rexm(1, hcode(v[1]), addr(v[0]))
  4942. m.emit(0x0f)
  4943. m.emit(0x4d)
  4944. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4945. })
  4946. }
  4947. if p.len == 0 {
  4948. panic("invalid operands for CMOVGE")
  4949. }
  4950. return p
  4951. }
  4952. // CMOVL performs "Move if less (SF != OF)".
  4953. //
  4954. // Mnemonic : CMOVL
  4955. // Supported forms : (6 forms)
  4956. //
  4957. // * CMOVL r16, r16 [CMOV]
  4958. // * CMOVL m16, r16 [CMOV]
  4959. // * CMOVL r32, r32 [CMOV]
  4960. // * CMOVL m32, r32 [CMOV]
  4961. // * CMOVL r64, r64 [CMOV]
  4962. // * CMOVL m64, r64 [CMOV]
  4963. //
  4964. func (self *Program) CMOVL(v0 interface{}, v1 interface{}) *Instruction {
  4965. p := self.alloc("CMOVL", 2, Operands { v0, v1 })
  4966. // CMOVL r16, r16
  4967. if isReg16(v0) && isReg16(v1) {
  4968. self.require(ISA_CMOV)
  4969. p.domain = DomainGeneric
  4970. p.add(0, func(m *_Encoding, v []interface{}) {
  4971. m.emit(0x66)
  4972. m.rexo(hcode(v[1]), v[0], false)
  4973. m.emit(0x0f)
  4974. m.emit(0x4c)
  4975. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4976. })
  4977. }
  4978. // CMOVL m16, r16
  4979. if isM16(v0) && isReg16(v1) {
  4980. self.require(ISA_CMOV)
  4981. p.domain = DomainGeneric
  4982. p.add(0, func(m *_Encoding, v []interface{}) {
  4983. m.emit(0x66)
  4984. m.rexo(hcode(v[1]), addr(v[0]), false)
  4985. m.emit(0x0f)
  4986. m.emit(0x4c)
  4987. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  4988. })
  4989. }
  4990. // CMOVL r32, r32
  4991. if isReg32(v0) && isReg32(v1) {
  4992. self.require(ISA_CMOV)
  4993. p.domain = DomainGeneric
  4994. p.add(0, func(m *_Encoding, v []interface{}) {
  4995. m.rexo(hcode(v[1]), v[0], false)
  4996. m.emit(0x0f)
  4997. m.emit(0x4c)
  4998. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  4999. })
  5000. }
  5001. // CMOVL m32, r32
  5002. if isM32(v0) && isReg32(v1) {
  5003. self.require(ISA_CMOV)
  5004. p.domain = DomainGeneric
  5005. p.add(0, func(m *_Encoding, v []interface{}) {
  5006. m.rexo(hcode(v[1]), addr(v[0]), false)
  5007. m.emit(0x0f)
  5008. m.emit(0x4c)
  5009. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5010. })
  5011. }
  5012. // CMOVL r64, r64
  5013. if isReg64(v0) && isReg64(v1) {
  5014. self.require(ISA_CMOV)
  5015. p.domain = DomainGeneric
  5016. p.add(0, func(m *_Encoding, v []interface{}) {
  5017. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  5018. m.emit(0x0f)
  5019. m.emit(0x4c)
  5020. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5021. })
  5022. }
  5023. // CMOVL m64, r64
  5024. if isM64(v0) && isReg64(v1) {
  5025. self.require(ISA_CMOV)
  5026. p.domain = DomainGeneric
  5027. p.add(0, func(m *_Encoding, v []interface{}) {
  5028. m.rexm(1, hcode(v[1]), addr(v[0]))
  5029. m.emit(0x0f)
  5030. m.emit(0x4c)
  5031. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5032. })
  5033. }
  5034. if p.len == 0 {
  5035. panic("invalid operands for CMOVL")
  5036. }
  5037. return p
  5038. }
  5039. // CMOVLE performs "Move if less or equal (ZF == 1 or SF != OF)".
  5040. //
  5041. // Mnemonic : CMOVLE
  5042. // Supported forms : (6 forms)
  5043. //
  5044. // * CMOVLE r16, r16 [CMOV]
  5045. // * CMOVLE m16, r16 [CMOV]
  5046. // * CMOVLE r32, r32 [CMOV]
  5047. // * CMOVLE m32, r32 [CMOV]
  5048. // * CMOVLE r64, r64 [CMOV]
  5049. // * CMOVLE m64, r64 [CMOV]
  5050. //
  5051. func (self *Program) CMOVLE(v0 interface{}, v1 interface{}) *Instruction {
  5052. p := self.alloc("CMOVLE", 2, Operands { v0, v1 })
  5053. // CMOVLE r16, r16
  5054. if isReg16(v0) && isReg16(v1) {
  5055. self.require(ISA_CMOV)
  5056. p.domain = DomainGeneric
  5057. p.add(0, func(m *_Encoding, v []interface{}) {
  5058. m.emit(0x66)
  5059. m.rexo(hcode(v[1]), v[0], false)
  5060. m.emit(0x0f)
  5061. m.emit(0x4e)
  5062. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5063. })
  5064. }
  5065. // CMOVLE m16, r16
  5066. if isM16(v0) && isReg16(v1) {
  5067. self.require(ISA_CMOV)
  5068. p.domain = DomainGeneric
  5069. p.add(0, func(m *_Encoding, v []interface{}) {
  5070. m.emit(0x66)
  5071. m.rexo(hcode(v[1]), addr(v[0]), false)
  5072. m.emit(0x0f)
  5073. m.emit(0x4e)
  5074. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5075. })
  5076. }
  5077. // CMOVLE r32, r32
  5078. if isReg32(v0) && isReg32(v1) {
  5079. self.require(ISA_CMOV)
  5080. p.domain = DomainGeneric
  5081. p.add(0, func(m *_Encoding, v []interface{}) {
  5082. m.rexo(hcode(v[1]), v[0], false)
  5083. m.emit(0x0f)
  5084. m.emit(0x4e)
  5085. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5086. })
  5087. }
  5088. // CMOVLE m32, r32
  5089. if isM32(v0) && isReg32(v1) {
  5090. self.require(ISA_CMOV)
  5091. p.domain = DomainGeneric
  5092. p.add(0, func(m *_Encoding, v []interface{}) {
  5093. m.rexo(hcode(v[1]), addr(v[0]), false)
  5094. m.emit(0x0f)
  5095. m.emit(0x4e)
  5096. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5097. })
  5098. }
  5099. // CMOVLE r64, r64
  5100. if isReg64(v0) && isReg64(v1) {
  5101. self.require(ISA_CMOV)
  5102. p.domain = DomainGeneric
  5103. p.add(0, func(m *_Encoding, v []interface{}) {
  5104. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  5105. m.emit(0x0f)
  5106. m.emit(0x4e)
  5107. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5108. })
  5109. }
  5110. // CMOVLE m64, r64
  5111. if isM64(v0) && isReg64(v1) {
  5112. self.require(ISA_CMOV)
  5113. p.domain = DomainGeneric
  5114. p.add(0, func(m *_Encoding, v []interface{}) {
  5115. m.rexm(1, hcode(v[1]), addr(v[0]))
  5116. m.emit(0x0f)
  5117. m.emit(0x4e)
  5118. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5119. })
  5120. }
  5121. if p.len == 0 {
  5122. panic("invalid operands for CMOVLE")
  5123. }
  5124. return p
  5125. }
  5126. // CMOVNA performs "Move if not above (CF == 1 or ZF == 1)".
  5127. //
  5128. // Mnemonic : CMOVNA
  5129. // Supported forms : (6 forms)
  5130. //
  5131. // * CMOVNA r16, r16 [CMOV]
  5132. // * CMOVNA m16, r16 [CMOV]
  5133. // * CMOVNA r32, r32 [CMOV]
  5134. // * CMOVNA m32, r32 [CMOV]
  5135. // * CMOVNA r64, r64 [CMOV]
  5136. // * CMOVNA m64, r64 [CMOV]
  5137. //
  5138. func (self *Program) CMOVNA(v0 interface{}, v1 interface{}) *Instruction {
  5139. p := self.alloc("CMOVNA", 2, Operands { v0, v1 })
  5140. // CMOVNA r16, r16
  5141. if isReg16(v0) && isReg16(v1) {
  5142. self.require(ISA_CMOV)
  5143. p.domain = DomainGeneric
  5144. p.add(0, func(m *_Encoding, v []interface{}) {
  5145. m.emit(0x66)
  5146. m.rexo(hcode(v[1]), v[0], false)
  5147. m.emit(0x0f)
  5148. m.emit(0x46)
  5149. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5150. })
  5151. }
  5152. // CMOVNA m16, r16
  5153. if isM16(v0) && isReg16(v1) {
  5154. self.require(ISA_CMOV)
  5155. p.domain = DomainGeneric
  5156. p.add(0, func(m *_Encoding, v []interface{}) {
  5157. m.emit(0x66)
  5158. m.rexo(hcode(v[1]), addr(v[0]), false)
  5159. m.emit(0x0f)
  5160. m.emit(0x46)
  5161. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5162. })
  5163. }
  5164. // CMOVNA r32, r32
  5165. if isReg32(v0) && isReg32(v1) {
  5166. self.require(ISA_CMOV)
  5167. p.domain = DomainGeneric
  5168. p.add(0, func(m *_Encoding, v []interface{}) {
  5169. m.rexo(hcode(v[1]), v[0], false)
  5170. m.emit(0x0f)
  5171. m.emit(0x46)
  5172. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5173. })
  5174. }
  5175. // CMOVNA m32, r32
  5176. if isM32(v0) && isReg32(v1) {
  5177. self.require(ISA_CMOV)
  5178. p.domain = DomainGeneric
  5179. p.add(0, func(m *_Encoding, v []interface{}) {
  5180. m.rexo(hcode(v[1]), addr(v[0]), false)
  5181. m.emit(0x0f)
  5182. m.emit(0x46)
  5183. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5184. })
  5185. }
  5186. // CMOVNA r64, r64
  5187. if isReg64(v0) && isReg64(v1) {
  5188. self.require(ISA_CMOV)
  5189. p.domain = DomainGeneric
  5190. p.add(0, func(m *_Encoding, v []interface{}) {
  5191. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  5192. m.emit(0x0f)
  5193. m.emit(0x46)
  5194. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5195. })
  5196. }
  5197. // CMOVNA m64, r64
  5198. if isM64(v0) && isReg64(v1) {
  5199. self.require(ISA_CMOV)
  5200. p.domain = DomainGeneric
  5201. p.add(0, func(m *_Encoding, v []interface{}) {
  5202. m.rexm(1, hcode(v[1]), addr(v[0]))
  5203. m.emit(0x0f)
  5204. m.emit(0x46)
  5205. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5206. })
  5207. }
  5208. if p.len == 0 {
  5209. panic("invalid operands for CMOVNA")
  5210. }
  5211. return p
  5212. }
  5213. // CMOVNAE performs "Move if not above or equal (CF == 1)".
  5214. //
  5215. // Mnemonic : CMOVNAE
  5216. // Supported forms : (6 forms)
  5217. //
  5218. // * CMOVNAE r16, r16 [CMOV]
  5219. // * CMOVNAE m16, r16 [CMOV]
  5220. // * CMOVNAE r32, r32 [CMOV]
  5221. // * CMOVNAE m32, r32 [CMOV]
  5222. // * CMOVNAE r64, r64 [CMOV]
  5223. // * CMOVNAE m64, r64 [CMOV]
  5224. //
  5225. func (self *Program) CMOVNAE(v0 interface{}, v1 interface{}) *Instruction {
  5226. p := self.alloc("CMOVNAE", 2, Operands { v0, v1 })
  5227. // CMOVNAE r16, r16
  5228. if isReg16(v0) && isReg16(v1) {
  5229. self.require(ISA_CMOV)
  5230. p.domain = DomainGeneric
  5231. p.add(0, func(m *_Encoding, v []interface{}) {
  5232. m.emit(0x66)
  5233. m.rexo(hcode(v[1]), v[0], false)
  5234. m.emit(0x0f)
  5235. m.emit(0x42)
  5236. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5237. })
  5238. }
  5239. // CMOVNAE m16, r16
  5240. if isM16(v0) && isReg16(v1) {
  5241. self.require(ISA_CMOV)
  5242. p.domain = DomainGeneric
  5243. p.add(0, func(m *_Encoding, v []interface{}) {
  5244. m.emit(0x66)
  5245. m.rexo(hcode(v[1]), addr(v[0]), false)
  5246. m.emit(0x0f)
  5247. m.emit(0x42)
  5248. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5249. })
  5250. }
  5251. // CMOVNAE r32, r32
  5252. if isReg32(v0) && isReg32(v1) {
  5253. self.require(ISA_CMOV)
  5254. p.domain = DomainGeneric
  5255. p.add(0, func(m *_Encoding, v []interface{}) {
  5256. m.rexo(hcode(v[1]), v[0], false)
  5257. m.emit(0x0f)
  5258. m.emit(0x42)
  5259. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5260. })
  5261. }
  5262. // CMOVNAE m32, r32
  5263. if isM32(v0) && isReg32(v1) {
  5264. self.require(ISA_CMOV)
  5265. p.domain = DomainGeneric
  5266. p.add(0, func(m *_Encoding, v []interface{}) {
  5267. m.rexo(hcode(v[1]), addr(v[0]), false)
  5268. m.emit(0x0f)
  5269. m.emit(0x42)
  5270. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5271. })
  5272. }
  5273. // CMOVNAE r64, r64
  5274. if isReg64(v0) && isReg64(v1) {
  5275. self.require(ISA_CMOV)
  5276. p.domain = DomainGeneric
  5277. p.add(0, func(m *_Encoding, v []interface{}) {
  5278. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  5279. m.emit(0x0f)
  5280. m.emit(0x42)
  5281. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5282. })
  5283. }
  5284. // CMOVNAE m64, r64
  5285. if isM64(v0) && isReg64(v1) {
  5286. self.require(ISA_CMOV)
  5287. p.domain = DomainGeneric
  5288. p.add(0, func(m *_Encoding, v []interface{}) {
  5289. m.rexm(1, hcode(v[1]), addr(v[0]))
  5290. m.emit(0x0f)
  5291. m.emit(0x42)
  5292. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5293. })
  5294. }
  5295. if p.len == 0 {
  5296. panic("invalid operands for CMOVNAE")
  5297. }
  5298. return p
  5299. }
  5300. // CMOVNB performs "Move if not below (CF == 0)".
  5301. //
  5302. // Mnemonic : CMOVNB
  5303. // Supported forms : (6 forms)
  5304. //
  5305. // * CMOVNB r16, r16 [CMOV]
  5306. // * CMOVNB m16, r16 [CMOV]
  5307. // * CMOVNB r32, r32 [CMOV]
  5308. // * CMOVNB m32, r32 [CMOV]
  5309. // * CMOVNB r64, r64 [CMOV]
  5310. // * CMOVNB m64, r64 [CMOV]
  5311. //
  5312. func (self *Program) CMOVNB(v0 interface{}, v1 interface{}) *Instruction {
  5313. p := self.alloc("CMOVNB", 2, Operands { v0, v1 })
  5314. // CMOVNB r16, r16
  5315. if isReg16(v0) && isReg16(v1) {
  5316. self.require(ISA_CMOV)
  5317. p.domain = DomainGeneric
  5318. p.add(0, func(m *_Encoding, v []interface{}) {
  5319. m.emit(0x66)
  5320. m.rexo(hcode(v[1]), v[0], false)
  5321. m.emit(0x0f)
  5322. m.emit(0x43)
  5323. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5324. })
  5325. }
  5326. // CMOVNB m16, r16
  5327. if isM16(v0) && isReg16(v1) {
  5328. self.require(ISA_CMOV)
  5329. p.domain = DomainGeneric
  5330. p.add(0, func(m *_Encoding, v []interface{}) {
  5331. m.emit(0x66)
  5332. m.rexo(hcode(v[1]), addr(v[0]), false)
  5333. m.emit(0x0f)
  5334. m.emit(0x43)
  5335. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5336. })
  5337. }
  5338. // CMOVNB r32, r32
  5339. if isReg32(v0) && isReg32(v1) {
  5340. self.require(ISA_CMOV)
  5341. p.domain = DomainGeneric
  5342. p.add(0, func(m *_Encoding, v []interface{}) {
  5343. m.rexo(hcode(v[1]), v[0], false)
  5344. m.emit(0x0f)
  5345. m.emit(0x43)
  5346. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5347. })
  5348. }
  5349. // CMOVNB m32, r32
  5350. if isM32(v0) && isReg32(v1) {
  5351. self.require(ISA_CMOV)
  5352. p.domain = DomainGeneric
  5353. p.add(0, func(m *_Encoding, v []interface{}) {
  5354. m.rexo(hcode(v[1]), addr(v[0]), false)
  5355. m.emit(0x0f)
  5356. m.emit(0x43)
  5357. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5358. })
  5359. }
  5360. // CMOVNB r64, r64
  5361. if isReg64(v0) && isReg64(v1) {
  5362. self.require(ISA_CMOV)
  5363. p.domain = DomainGeneric
  5364. p.add(0, func(m *_Encoding, v []interface{}) {
  5365. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  5366. m.emit(0x0f)
  5367. m.emit(0x43)
  5368. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5369. })
  5370. }
  5371. // CMOVNB m64, r64
  5372. if isM64(v0) && isReg64(v1) {
  5373. self.require(ISA_CMOV)
  5374. p.domain = DomainGeneric
  5375. p.add(0, func(m *_Encoding, v []interface{}) {
  5376. m.rexm(1, hcode(v[1]), addr(v[0]))
  5377. m.emit(0x0f)
  5378. m.emit(0x43)
  5379. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5380. })
  5381. }
  5382. if p.len == 0 {
  5383. panic("invalid operands for CMOVNB")
  5384. }
  5385. return p
  5386. }
  5387. // CMOVNBE performs "Move if not below or equal (CF == 0 and ZF == 0)".
  5388. //
  5389. // Mnemonic : CMOVNBE
  5390. // Supported forms : (6 forms)
  5391. //
  5392. // * CMOVNBE r16, r16 [CMOV]
  5393. // * CMOVNBE m16, r16 [CMOV]
  5394. // * CMOVNBE r32, r32 [CMOV]
  5395. // * CMOVNBE m32, r32 [CMOV]
  5396. // * CMOVNBE r64, r64 [CMOV]
  5397. // * CMOVNBE m64, r64 [CMOV]
  5398. //
  5399. func (self *Program) CMOVNBE(v0 interface{}, v1 interface{}) *Instruction {
  5400. p := self.alloc("CMOVNBE", 2, Operands { v0, v1 })
  5401. // CMOVNBE r16, r16
  5402. if isReg16(v0) && isReg16(v1) {
  5403. self.require(ISA_CMOV)
  5404. p.domain = DomainGeneric
  5405. p.add(0, func(m *_Encoding, v []interface{}) {
  5406. m.emit(0x66)
  5407. m.rexo(hcode(v[1]), v[0], false)
  5408. m.emit(0x0f)
  5409. m.emit(0x47)
  5410. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5411. })
  5412. }
  5413. // CMOVNBE m16, r16
  5414. if isM16(v0) && isReg16(v1) {
  5415. self.require(ISA_CMOV)
  5416. p.domain = DomainGeneric
  5417. p.add(0, func(m *_Encoding, v []interface{}) {
  5418. m.emit(0x66)
  5419. m.rexo(hcode(v[1]), addr(v[0]), false)
  5420. m.emit(0x0f)
  5421. m.emit(0x47)
  5422. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5423. })
  5424. }
  5425. // CMOVNBE r32, r32
  5426. if isReg32(v0) && isReg32(v1) {
  5427. self.require(ISA_CMOV)
  5428. p.domain = DomainGeneric
  5429. p.add(0, func(m *_Encoding, v []interface{}) {
  5430. m.rexo(hcode(v[1]), v[0], false)
  5431. m.emit(0x0f)
  5432. m.emit(0x47)
  5433. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5434. })
  5435. }
  5436. // CMOVNBE m32, r32
  5437. if isM32(v0) && isReg32(v1) {
  5438. self.require(ISA_CMOV)
  5439. p.domain = DomainGeneric
  5440. p.add(0, func(m *_Encoding, v []interface{}) {
  5441. m.rexo(hcode(v[1]), addr(v[0]), false)
  5442. m.emit(0x0f)
  5443. m.emit(0x47)
  5444. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5445. })
  5446. }
  5447. // CMOVNBE r64, r64
  5448. if isReg64(v0) && isReg64(v1) {
  5449. self.require(ISA_CMOV)
  5450. p.domain = DomainGeneric
  5451. p.add(0, func(m *_Encoding, v []interface{}) {
  5452. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  5453. m.emit(0x0f)
  5454. m.emit(0x47)
  5455. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5456. })
  5457. }
  5458. // CMOVNBE m64, r64
  5459. if isM64(v0) && isReg64(v1) {
  5460. self.require(ISA_CMOV)
  5461. p.domain = DomainGeneric
  5462. p.add(0, func(m *_Encoding, v []interface{}) {
  5463. m.rexm(1, hcode(v[1]), addr(v[0]))
  5464. m.emit(0x0f)
  5465. m.emit(0x47)
  5466. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5467. })
  5468. }
  5469. if p.len == 0 {
  5470. panic("invalid operands for CMOVNBE")
  5471. }
  5472. return p
  5473. }
  5474. // CMOVNC performs "Move if not carry (CF == 0)".
  5475. //
  5476. // Mnemonic : CMOVNC
  5477. // Supported forms : (6 forms)
  5478. //
  5479. // * CMOVNC r16, r16 [CMOV]
  5480. // * CMOVNC m16, r16 [CMOV]
  5481. // * CMOVNC r32, r32 [CMOV]
  5482. // * CMOVNC m32, r32 [CMOV]
  5483. // * CMOVNC r64, r64 [CMOV]
  5484. // * CMOVNC m64, r64 [CMOV]
  5485. //
  5486. func (self *Program) CMOVNC(v0 interface{}, v1 interface{}) *Instruction {
  5487. p := self.alloc("CMOVNC", 2, Operands { v0, v1 })
  5488. // CMOVNC r16, r16
  5489. if isReg16(v0) && isReg16(v1) {
  5490. self.require(ISA_CMOV)
  5491. p.domain = DomainGeneric
  5492. p.add(0, func(m *_Encoding, v []interface{}) {
  5493. m.emit(0x66)
  5494. m.rexo(hcode(v[1]), v[0], false)
  5495. m.emit(0x0f)
  5496. m.emit(0x43)
  5497. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5498. })
  5499. }
  5500. // CMOVNC m16, r16
  5501. if isM16(v0) && isReg16(v1) {
  5502. self.require(ISA_CMOV)
  5503. p.domain = DomainGeneric
  5504. p.add(0, func(m *_Encoding, v []interface{}) {
  5505. m.emit(0x66)
  5506. m.rexo(hcode(v[1]), addr(v[0]), false)
  5507. m.emit(0x0f)
  5508. m.emit(0x43)
  5509. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5510. })
  5511. }
  5512. // CMOVNC r32, r32
  5513. if isReg32(v0) && isReg32(v1) {
  5514. self.require(ISA_CMOV)
  5515. p.domain = DomainGeneric
  5516. p.add(0, func(m *_Encoding, v []interface{}) {
  5517. m.rexo(hcode(v[1]), v[0], false)
  5518. m.emit(0x0f)
  5519. m.emit(0x43)
  5520. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5521. })
  5522. }
  5523. // CMOVNC m32, r32
  5524. if isM32(v0) && isReg32(v1) {
  5525. self.require(ISA_CMOV)
  5526. p.domain = DomainGeneric
  5527. p.add(0, func(m *_Encoding, v []interface{}) {
  5528. m.rexo(hcode(v[1]), addr(v[0]), false)
  5529. m.emit(0x0f)
  5530. m.emit(0x43)
  5531. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5532. })
  5533. }
  5534. // CMOVNC r64, r64
  5535. if isReg64(v0) && isReg64(v1) {
  5536. self.require(ISA_CMOV)
  5537. p.domain = DomainGeneric
  5538. p.add(0, func(m *_Encoding, v []interface{}) {
  5539. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  5540. m.emit(0x0f)
  5541. m.emit(0x43)
  5542. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5543. })
  5544. }
  5545. // CMOVNC m64, r64
  5546. if isM64(v0) && isReg64(v1) {
  5547. self.require(ISA_CMOV)
  5548. p.domain = DomainGeneric
  5549. p.add(0, func(m *_Encoding, v []interface{}) {
  5550. m.rexm(1, hcode(v[1]), addr(v[0]))
  5551. m.emit(0x0f)
  5552. m.emit(0x43)
  5553. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5554. })
  5555. }
  5556. if p.len == 0 {
  5557. panic("invalid operands for CMOVNC")
  5558. }
  5559. return p
  5560. }
  5561. // CMOVNE performs "Move if not equal (ZF == 0)".
  5562. //
  5563. // Mnemonic : CMOVNE
  5564. // Supported forms : (6 forms)
  5565. //
  5566. // * CMOVNE r16, r16 [CMOV]
  5567. // * CMOVNE m16, r16 [CMOV]
  5568. // * CMOVNE r32, r32 [CMOV]
  5569. // * CMOVNE m32, r32 [CMOV]
  5570. // * CMOVNE r64, r64 [CMOV]
  5571. // * CMOVNE m64, r64 [CMOV]
  5572. //
  5573. func (self *Program) CMOVNE(v0 interface{}, v1 interface{}) *Instruction {
  5574. p := self.alloc("CMOVNE", 2, Operands { v0, v1 })
  5575. // CMOVNE r16, r16
  5576. if isReg16(v0) && isReg16(v1) {
  5577. self.require(ISA_CMOV)
  5578. p.domain = DomainGeneric
  5579. p.add(0, func(m *_Encoding, v []interface{}) {
  5580. m.emit(0x66)
  5581. m.rexo(hcode(v[1]), v[0], false)
  5582. m.emit(0x0f)
  5583. m.emit(0x45)
  5584. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5585. })
  5586. }
  5587. // CMOVNE m16, r16
  5588. if isM16(v0) && isReg16(v1) {
  5589. self.require(ISA_CMOV)
  5590. p.domain = DomainGeneric
  5591. p.add(0, func(m *_Encoding, v []interface{}) {
  5592. m.emit(0x66)
  5593. m.rexo(hcode(v[1]), addr(v[0]), false)
  5594. m.emit(0x0f)
  5595. m.emit(0x45)
  5596. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5597. })
  5598. }
  5599. // CMOVNE r32, r32
  5600. if isReg32(v0) && isReg32(v1) {
  5601. self.require(ISA_CMOV)
  5602. p.domain = DomainGeneric
  5603. p.add(0, func(m *_Encoding, v []interface{}) {
  5604. m.rexo(hcode(v[1]), v[0], false)
  5605. m.emit(0x0f)
  5606. m.emit(0x45)
  5607. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5608. })
  5609. }
  5610. // CMOVNE m32, r32
  5611. if isM32(v0) && isReg32(v1) {
  5612. self.require(ISA_CMOV)
  5613. p.domain = DomainGeneric
  5614. p.add(0, func(m *_Encoding, v []interface{}) {
  5615. m.rexo(hcode(v[1]), addr(v[0]), false)
  5616. m.emit(0x0f)
  5617. m.emit(0x45)
  5618. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5619. })
  5620. }
  5621. // CMOVNE r64, r64
  5622. if isReg64(v0) && isReg64(v1) {
  5623. self.require(ISA_CMOV)
  5624. p.domain = DomainGeneric
  5625. p.add(0, func(m *_Encoding, v []interface{}) {
  5626. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  5627. m.emit(0x0f)
  5628. m.emit(0x45)
  5629. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5630. })
  5631. }
  5632. // CMOVNE m64, r64
  5633. if isM64(v0) && isReg64(v1) {
  5634. self.require(ISA_CMOV)
  5635. p.domain = DomainGeneric
  5636. p.add(0, func(m *_Encoding, v []interface{}) {
  5637. m.rexm(1, hcode(v[1]), addr(v[0]))
  5638. m.emit(0x0f)
  5639. m.emit(0x45)
  5640. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5641. })
  5642. }
  5643. if p.len == 0 {
  5644. panic("invalid operands for CMOVNE")
  5645. }
  5646. return p
  5647. }
  5648. // CMOVNG performs "Move if not greater (ZF == 1 or SF != OF)".
  5649. //
  5650. // Mnemonic : CMOVNG
  5651. // Supported forms : (6 forms)
  5652. //
  5653. // * CMOVNG r16, r16 [CMOV]
  5654. // * CMOVNG m16, r16 [CMOV]
  5655. // * CMOVNG r32, r32 [CMOV]
  5656. // * CMOVNG m32, r32 [CMOV]
  5657. // * CMOVNG r64, r64 [CMOV]
  5658. // * CMOVNG m64, r64 [CMOV]
  5659. //
  5660. func (self *Program) CMOVNG(v0 interface{}, v1 interface{}) *Instruction {
  5661. p := self.alloc("CMOVNG", 2, Operands { v0, v1 })
  5662. // CMOVNG r16, r16
  5663. if isReg16(v0) && isReg16(v1) {
  5664. self.require(ISA_CMOV)
  5665. p.domain = DomainGeneric
  5666. p.add(0, func(m *_Encoding, v []interface{}) {
  5667. m.emit(0x66)
  5668. m.rexo(hcode(v[1]), v[0], false)
  5669. m.emit(0x0f)
  5670. m.emit(0x4e)
  5671. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5672. })
  5673. }
  5674. // CMOVNG m16, r16
  5675. if isM16(v0) && isReg16(v1) {
  5676. self.require(ISA_CMOV)
  5677. p.domain = DomainGeneric
  5678. p.add(0, func(m *_Encoding, v []interface{}) {
  5679. m.emit(0x66)
  5680. m.rexo(hcode(v[1]), addr(v[0]), false)
  5681. m.emit(0x0f)
  5682. m.emit(0x4e)
  5683. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5684. })
  5685. }
  5686. // CMOVNG r32, r32
  5687. if isReg32(v0) && isReg32(v1) {
  5688. self.require(ISA_CMOV)
  5689. p.domain = DomainGeneric
  5690. p.add(0, func(m *_Encoding, v []interface{}) {
  5691. m.rexo(hcode(v[1]), v[0], false)
  5692. m.emit(0x0f)
  5693. m.emit(0x4e)
  5694. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5695. })
  5696. }
  5697. // CMOVNG m32, r32
  5698. if isM32(v0) && isReg32(v1) {
  5699. self.require(ISA_CMOV)
  5700. p.domain = DomainGeneric
  5701. p.add(0, func(m *_Encoding, v []interface{}) {
  5702. m.rexo(hcode(v[1]), addr(v[0]), false)
  5703. m.emit(0x0f)
  5704. m.emit(0x4e)
  5705. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5706. })
  5707. }
  5708. // CMOVNG r64, r64
  5709. if isReg64(v0) && isReg64(v1) {
  5710. self.require(ISA_CMOV)
  5711. p.domain = DomainGeneric
  5712. p.add(0, func(m *_Encoding, v []interface{}) {
  5713. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  5714. m.emit(0x0f)
  5715. m.emit(0x4e)
  5716. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5717. })
  5718. }
  5719. // CMOVNG m64, r64
  5720. if isM64(v0) && isReg64(v1) {
  5721. self.require(ISA_CMOV)
  5722. p.domain = DomainGeneric
  5723. p.add(0, func(m *_Encoding, v []interface{}) {
  5724. m.rexm(1, hcode(v[1]), addr(v[0]))
  5725. m.emit(0x0f)
  5726. m.emit(0x4e)
  5727. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5728. })
  5729. }
  5730. if p.len == 0 {
  5731. panic("invalid operands for CMOVNG")
  5732. }
  5733. return p
  5734. }
  5735. // CMOVNGE performs "Move if not greater or equal (SF != OF)".
  5736. //
  5737. // Mnemonic : CMOVNGE
  5738. // Supported forms : (6 forms)
  5739. //
  5740. // * CMOVNGE r16, r16 [CMOV]
  5741. // * CMOVNGE m16, r16 [CMOV]
  5742. // * CMOVNGE r32, r32 [CMOV]
  5743. // * CMOVNGE m32, r32 [CMOV]
  5744. // * CMOVNGE r64, r64 [CMOV]
  5745. // * CMOVNGE m64, r64 [CMOV]
  5746. //
  5747. func (self *Program) CMOVNGE(v0 interface{}, v1 interface{}) *Instruction {
  5748. p := self.alloc("CMOVNGE", 2, Operands { v0, v1 })
  5749. // CMOVNGE r16, r16
  5750. if isReg16(v0) && isReg16(v1) {
  5751. self.require(ISA_CMOV)
  5752. p.domain = DomainGeneric
  5753. p.add(0, func(m *_Encoding, v []interface{}) {
  5754. m.emit(0x66)
  5755. m.rexo(hcode(v[1]), v[0], false)
  5756. m.emit(0x0f)
  5757. m.emit(0x4c)
  5758. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5759. })
  5760. }
  5761. // CMOVNGE m16, r16
  5762. if isM16(v0) && isReg16(v1) {
  5763. self.require(ISA_CMOV)
  5764. p.domain = DomainGeneric
  5765. p.add(0, func(m *_Encoding, v []interface{}) {
  5766. m.emit(0x66)
  5767. m.rexo(hcode(v[1]), addr(v[0]), false)
  5768. m.emit(0x0f)
  5769. m.emit(0x4c)
  5770. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5771. })
  5772. }
  5773. // CMOVNGE r32, r32
  5774. if isReg32(v0) && isReg32(v1) {
  5775. self.require(ISA_CMOV)
  5776. p.domain = DomainGeneric
  5777. p.add(0, func(m *_Encoding, v []interface{}) {
  5778. m.rexo(hcode(v[1]), v[0], false)
  5779. m.emit(0x0f)
  5780. m.emit(0x4c)
  5781. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5782. })
  5783. }
  5784. // CMOVNGE m32, r32
  5785. if isM32(v0) && isReg32(v1) {
  5786. self.require(ISA_CMOV)
  5787. p.domain = DomainGeneric
  5788. p.add(0, func(m *_Encoding, v []interface{}) {
  5789. m.rexo(hcode(v[1]), addr(v[0]), false)
  5790. m.emit(0x0f)
  5791. m.emit(0x4c)
  5792. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5793. })
  5794. }
  5795. // CMOVNGE r64, r64
  5796. if isReg64(v0) && isReg64(v1) {
  5797. self.require(ISA_CMOV)
  5798. p.domain = DomainGeneric
  5799. p.add(0, func(m *_Encoding, v []interface{}) {
  5800. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  5801. m.emit(0x0f)
  5802. m.emit(0x4c)
  5803. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5804. })
  5805. }
  5806. // CMOVNGE m64, r64
  5807. if isM64(v0) && isReg64(v1) {
  5808. self.require(ISA_CMOV)
  5809. p.domain = DomainGeneric
  5810. p.add(0, func(m *_Encoding, v []interface{}) {
  5811. m.rexm(1, hcode(v[1]), addr(v[0]))
  5812. m.emit(0x0f)
  5813. m.emit(0x4c)
  5814. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5815. })
  5816. }
  5817. if p.len == 0 {
  5818. panic("invalid operands for CMOVNGE")
  5819. }
  5820. return p
  5821. }
  5822. // CMOVNL performs "Move if not less (SF == OF)".
  5823. //
  5824. // Mnemonic : CMOVNL
  5825. // Supported forms : (6 forms)
  5826. //
  5827. // * CMOVNL r16, r16 [CMOV]
  5828. // * CMOVNL m16, r16 [CMOV]
  5829. // * CMOVNL r32, r32 [CMOV]
  5830. // * CMOVNL m32, r32 [CMOV]
  5831. // * CMOVNL r64, r64 [CMOV]
  5832. // * CMOVNL m64, r64 [CMOV]
  5833. //
  5834. func (self *Program) CMOVNL(v0 interface{}, v1 interface{}) *Instruction {
  5835. p := self.alloc("CMOVNL", 2, Operands { v0, v1 })
  5836. // CMOVNL r16, r16
  5837. if isReg16(v0) && isReg16(v1) {
  5838. self.require(ISA_CMOV)
  5839. p.domain = DomainGeneric
  5840. p.add(0, func(m *_Encoding, v []interface{}) {
  5841. m.emit(0x66)
  5842. m.rexo(hcode(v[1]), v[0], false)
  5843. m.emit(0x0f)
  5844. m.emit(0x4d)
  5845. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5846. })
  5847. }
  5848. // CMOVNL m16, r16
  5849. if isM16(v0) && isReg16(v1) {
  5850. self.require(ISA_CMOV)
  5851. p.domain = DomainGeneric
  5852. p.add(0, func(m *_Encoding, v []interface{}) {
  5853. m.emit(0x66)
  5854. m.rexo(hcode(v[1]), addr(v[0]), false)
  5855. m.emit(0x0f)
  5856. m.emit(0x4d)
  5857. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5858. })
  5859. }
  5860. // CMOVNL r32, r32
  5861. if isReg32(v0) && isReg32(v1) {
  5862. self.require(ISA_CMOV)
  5863. p.domain = DomainGeneric
  5864. p.add(0, func(m *_Encoding, v []interface{}) {
  5865. m.rexo(hcode(v[1]), v[0], false)
  5866. m.emit(0x0f)
  5867. m.emit(0x4d)
  5868. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5869. })
  5870. }
  5871. // CMOVNL m32, r32
  5872. if isM32(v0) && isReg32(v1) {
  5873. self.require(ISA_CMOV)
  5874. p.domain = DomainGeneric
  5875. p.add(0, func(m *_Encoding, v []interface{}) {
  5876. m.rexo(hcode(v[1]), addr(v[0]), false)
  5877. m.emit(0x0f)
  5878. m.emit(0x4d)
  5879. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5880. })
  5881. }
  5882. // CMOVNL r64, r64
  5883. if isReg64(v0) && isReg64(v1) {
  5884. self.require(ISA_CMOV)
  5885. p.domain = DomainGeneric
  5886. p.add(0, func(m *_Encoding, v []interface{}) {
  5887. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  5888. m.emit(0x0f)
  5889. m.emit(0x4d)
  5890. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5891. })
  5892. }
  5893. // CMOVNL m64, r64
  5894. if isM64(v0) && isReg64(v1) {
  5895. self.require(ISA_CMOV)
  5896. p.domain = DomainGeneric
  5897. p.add(0, func(m *_Encoding, v []interface{}) {
  5898. m.rexm(1, hcode(v[1]), addr(v[0]))
  5899. m.emit(0x0f)
  5900. m.emit(0x4d)
  5901. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5902. })
  5903. }
  5904. if p.len == 0 {
  5905. panic("invalid operands for CMOVNL")
  5906. }
  5907. return p
  5908. }
  5909. // CMOVNLE performs "Move if not less or equal (ZF == 0 and SF == OF)".
  5910. //
  5911. // Mnemonic : CMOVNLE
  5912. // Supported forms : (6 forms)
  5913. //
  5914. // * CMOVNLE r16, r16 [CMOV]
  5915. // * CMOVNLE m16, r16 [CMOV]
  5916. // * CMOVNLE r32, r32 [CMOV]
  5917. // * CMOVNLE m32, r32 [CMOV]
  5918. // * CMOVNLE r64, r64 [CMOV]
  5919. // * CMOVNLE m64, r64 [CMOV]
  5920. //
  5921. func (self *Program) CMOVNLE(v0 interface{}, v1 interface{}) *Instruction {
  5922. p := self.alloc("CMOVNLE", 2, Operands { v0, v1 })
  5923. // CMOVNLE r16, r16
  5924. if isReg16(v0) && isReg16(v1) {
  5925. self.require(ISA_CMOV)
  5926. p.domain = DomainGeneric
  5927. p.add(0, func(m *_Encoding, v []interface{}) {
  5928. m.emit(0x66)
  5929. m.rexo(hcode(v[1]), v[0], false)
  5930. m.emit(0x0f)
  5931. m.emit(0x4f)
  5932. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5933. })
  5934. }
  5935. // CMOVNLE m16, r16
  5936. if isM16(v0) && isReg16(v1) {
  5937. self.require(ISA_CMOV)
  5938. p.domain = DomainGeneric
  5939. p.add(0, func(m *_Encoding, v []interface{}) {
  5940. m.emit(0x66)
  5941. m.rexo(hcode(v[1]), addr(v[0]), false)
  5942. m.emit(0x0f)
  5943. m.emit(0x4f)
  5944. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5945. })
  5946. }
  5947. // CMOVNLE r32, r32
  5948. if isReg32(v0) && isReg32(v1) {
  5949. self.require(ISA_CMOV)
  5950. p.domain = DomainGeneric
  5951. p.add(0, func(m *_Encoding, v []interface{}) {
  5952. m.rexo(hcode(v[1]), v[0], false)
  5953. m.emit(0x0f)
  5954. m.emit(0x4f)
  5955. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5956. })
  5957. }
  5958. // CMOVNLE m32, r32
  5959. if isM32(v0) && isReg32(v1) {
  5960. self.require(ISA_CMOV)
  5961. p.domain = DomainGeneric
  5962. p.add(0, func(m *_Encoding, v []interface{}) {
  5963. m.rexo(hcode(v[1]), addr(v[0]), false)
  5964. m.emit(0x0f)
  5965. m.emit(0x4f)
  5966. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5967. })
  5968. }
  5969. // CMOVNLE r64, r64
  5970. if isReg64(v0) && isReg64(v1) {
  5971. self.require(ISA_CMOV)
  5972. p.domain = DomainGeneric
  5973. p.add(0, func(m *_Encoding, v []interface{}) {
  5974. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  5975. m.emit(0x0f)
  5976. m.emit(0x4f)
  5977. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  5978. })
  5979. }
  5980. // CMOVNLE m64, r64
  5981. if isM64(v0) && isReg64(v1) {
  5982. self.require(ISA_CMOV)
  5983. p.domain = DomainGeneric
  5984. p.add(0, func(m *_Encoding, v []interface{}) {
  5985. m.rexm(1, hcode(v[1]), addr(v[0]))
  5986. m.emit(0x0f)
  5987. m.emit(0x4f)
  5988. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  5989. })
  5990. }
  5991. if p.len == 0 {
  5992. panic("invalid operands for CMOVNLE")
  5993. }
  5994. return p
  5995. }
  5996. // CMOVNO performs "Move if not overflow (OF == 0)".
  5997. //
  5998. // Mnemonic : CMOVNO
  5999. // Supported forms : (6 forms)
  6000. //
  6001. // * CMOVNO r16, r16 [CMOV]
  6002. // * CMOVNO m16, r16 [CMOV]
  6003. // * CMOVNO r32, r32 [CMOV]
  6004. // * CMOVNO m32, r32 [CMOV]
  6005. // * CMOVNO r64, r64 [CMOV]
  6006. // * CMOVNO m64, r64 [CMOV]
  6007. //
  6008. func (self *Program) CMOVNO(v0 interface{}, v1 interface{}) *Instruction {
  6009. p := self.alloc("CMOVNO", 2, Operands { v0, v1 })
  6010. // CMOVNO r16, r16
  6011. if isReg16(v0) && isReg16(v1) {
  6012. self.require(ISA_CMOV)
  6013. p.domain = DomainGeneric
  6014. p.add(0, func(m *_Encoding, v []interface{}) {
  6015. m.emit(0x66)
  6016. m.rexo(hcode(v[1]), v[0], false)
  6017. m.emit(0x0f)
  6018. m.emit(0x41)
  6019. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6020. })
  6021. }
  6022. // CMOVNO m16, r16
  6023. if isM16(v0) && isReg16(v1) {
  6024. self.require(ISA_CMOV)
  6025. p.domain = DomainGeneric
  6026. p.add(0, func(m *_Encoding, v []interface{}) {
  6027. m.emit(0x66)
  6028. m.rexo(hcode(v[1]), addr(v[0]), false)
  6029. m.emit(0x0f)
  6030. m.emit(0x41)
  6031. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6032. })
  6033. }
  6034. // CMOVNO r32, r32
  6035. if isReg32(v0) && isReg32(v1) {
  6036. self.require(ISA_CMOV)
  6037. p.domain = DomainGeneric
  6038. p.add(0, func(m *_Encoding, v []interface{}) {
  6039. m.rexo(hcode(v[1]), v[0], false)
  6040. m.emit(0x0f)
  6041. m.emit(0x41)
  6042. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6043. })
  6044. }
  6045. // CMOVNO m32, r32
  6046. if isM32(v0) && isReg32(v1) {
  6047. self.require(ISA_CMOV)
  6048. p.domain = DomainGeneric
  6049. p.add(0, func(m *_Encoding, v []interface{}) {
  6050. m.rexo(hcode(v[1]), addr(v[0]), false)
  6051. m.emit(0x0f)
  6052. m.emit(0x41)
  6053. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6054. })
  6055. }
  6056. // CMOVNO r64, r64
  6057. if isReg64(v0) && isReg64(v1) {
  6058. self.require(ISA_CMOV)
  6059. p.domain = DomainGeneric
  6060. p.add(0, func(m *_Encoding, v []interface{}) {
  6061. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  6062. m.emit(0x0f)
  6063. m.emit(0x41)
  6064. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6065. })
  6066. }
  6067. // CMOVNO m64, r64
  6068. if isM64(v0) && isReg64(v1) {
  6069. self.require(ISA_CMOV)
  6070. p.domain = DomainGeneric
  6071. p.add(0, func(m *_Encoding, v []interface{}) {
  6072. m.rexm(1, hcode(v[1]), addr(v[0]))
  6073. m.emit(0x0f)
  6074. m.emit(0x41)
  6075. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6076. })
  6077. }
  6078. if p.len == 0 {
  6079. panic("invalid operands for CMOVNO")
  6080. }
  6081. return p
  6082. }
  6083. // CMOVNP performs "Move if not parity (PF == 0)".
  6084. //
  6085. // Mnemonic : CMOVNP
  6086. // Supported forms : (6 forms)
  6087. //
  6088. // * CMOVNP r16, r16 [CMOV]
  6089. // * CMOVNP m16, r16 [CMOV]
  6090. // * CMOVNP r32, r32 [CMOV]
  6091. // * CMOVNP m32, r32 [CMOV]
  6092. // * CMOVNP r64, r64 [CMOV]
  6093. // * CMOVNP m64, r64 [CMOV]
  6094. //
  6095. func (self *Program) CMOVNP(v0 interface{}, v1 interface{}) *Instruction {
  6096. p := self.alloc("CMOVNP", 2, Operands { v0, v1 })
  6097. // CMOVNP r16, r16
  6098. if isReg16(v0) && isReg16(v1) {
  6099. self.require(ISA_CMOV)
  6100. p.domain = DomainGeneric
  6101. p.add(0, func(m *_Encoding, v []interface{}) {
  6102. m.emit(0x66)
  6103. m.rexo(hcode(v[1]), v[0], false)
  6104. m.emit(0x0f)
  6105. m.emit(0x4b)
  6106. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6107. })
  6108. }
  6109. // CMOVNP m16, r16
  6110. if isM16(v0) && isReg16(v1) {
  6111. self.require(ISA_CMOV)
  6112. p.domain = DomainGeneric
  6113. p.add(0, func(m *_Encoding, v []interface{}) {
  6114. m.emit(0x66)
  6115. m.rexo(hcode(v[1]), addr(v[0]), false)
  6116. m.emit(0x0f)
  6117. m.emit(0x4b)
  6118. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6119. })
  6120. }
  6121. // CMOVNP r32, r32
  6122. if isReg32(v0) && isReg32(v1) {
  6123. self.require(ISA_CMOV)
  6124. p.domain = DomainGeneric
  6125. p.add(0, func(m *_Encoding, v []interface{}) {
  6126. m.rexo(hcode(v[1]), v[0], false)
  6127. m.emit(0x0f)
  6128. m.emit(0x4b)
  6129. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6130. })
  6131. }
  6132. // CMOVNP m32, r32
  6133. if isM32(v0) && isReg32(v1) {
  6134. self.require(ISA_CMOV)
  6135. p.domain = DomainGeneric
  6136. p.add(0, func(m *_Encoding, v []interface{}) {
  6137. m.rexo(hcode(v[1]), addr(v[0]), false)
  6138. m.emit(0x0f)
  6139. m.emit(0x4b)
  6140. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6141. })
  6142. }
  6143. // CMOVNP r64, r64
  6144. if isReg64(v0) && isReg64(v1) {
  6145. self.require(ISA_CMOV)
  6146. p.domain = DomainGeneric
  6147. p.add(0, func(m *_Encoding, v []interface{}) {
  6148. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  6149. m.emit(0x0f)
  6150. m.emit(0x4b)
  6151. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6152. })
  6153. }
  6154. // CMOVNP m64, r64
  6155. if isM64(v0) && isReg64(v1) {
  6156. self.require(ISA_CMOV)
  6157. p.domain = DomainGeneric
  6158. p.add(0, func(m *_Encoding, v []interface{}) {
  6159. m.rexm(1, hcode(v[1]), addr(v[0]))
  6160. m.emit(0x0f)
  6161. m.emit(0x4b)
  6162. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6163. })
  6164. }
  6165. if p.len == 0 {
  6166. panic("invalid operands for CMOVNP")
  6167. }
  6168. return p
  6169. }
  6170. // CMOVNS performs "Move if not sign (SF == 0)".
  6171. //
  6172. // Mnemonic : CMOVNS
  6173. // Supported forms : (6 forms)
  6174. //
  6175. // * CMOVNS r16, r16 [CMOV]
  6176. // * CMOVNS m16, r16 [CMOV]
  6177. // * CMOVNS r32, r32 [CMOV]
  6178. // * CMOVNS m32, r32 [CMOV]
  6179. // * CMOVNS r64, r64 [CMOV]
  6180. // * CMOVNS m64, r64 [CMOV]
  6181. //
  6182. func (self *Program) CMOVNS(v0 interface{}, v1 interface{}) *Instruction {
  6183. p := self.alloc("CMOVNS", 2, Operands { v0, v1 })
  6184. // CMOVNS r16, r16
  6185. if isReg16(v0) && isReg16(v1) {
  6186. self.require(ISA_CMOV)
  6187. p.domain = DomainGeneric
  6188. p.add(0, func(m *_Encoding, v []interface{}) {
  6189. m.emit(0x66)
  6190. m.rexo(hcode(v[1]), v[0], false)
  6191. m.emit(0x0f)
  6192. m.emit(0x49)
  6193. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6194. })
  6195. }
  6196. // CMOVNS m16, r16
  6197. if isM16(v0) && isReg16(v1) {
  6198. self.require(ISA_CMOV)
  6199. p.domain = DomainGeneric
  6200. p.add(0, func(m *_Encoding, v []interface{}) {
  6201. m.emit(0x66)
  6202. m.rexo(hcode(v[1]), addr(v[0]), false)
  6203. m.emit(0x0f)
  6204. m.emit(0x49)
  6205. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6206. })
  6207. }
  6208. // CMOVNS r32, r32
  6209. if isReg32(v0) && isReg32(v1) {
  6210. self.require(ISA_CMOV)
  6211. p.domain = DomainGeneric
  6212. p.add(0, func(m *_Encoding, v []interface{}) {
  6213. m.rexo(hcode(v[1]), v[0], false)
  6214. m.emit(0x0f)
  6215. m.emit(0x49)
  6216. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6217. })
  6218. }
  6219. // CMOVNS m32, r32
  6220. if isM32(v0) && isReg32(v1) {
  6221. self.require(ISA_CMOV)
  6222. p.domain = DomainGeneric
  6223. p.add(0, func(m *_Encoding, v []interface{}) {
  6224. m.rexo(hcode(v[1]), addr(v[0]), false)
  6225. m.emit(0x0f)
  6226. m.emit(0x49)
  6227. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6228. })
  6229. }
  6230. // CMOVNS r64, r64
  6231. if isReg64(v0) && isReg64(v1) {
  6232. self.require(ISA_CMOV)
  6233. p.domain = DomainGeneric
  6234. p.add(0, func(m *_Encoding, v []interface{}) {
  6235. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  6236. m.emit(0x0f)
  6237. m.emit(0x49)
  6238. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6239. })
  6240. }
  6241. // CMOVNS m64, r64
  6242. if isM64(v0) && isReg64(v1) {
  6243. self.require(ISA_CMOV)
  6244. p.domain = DomainGeneric
  6245. p.add(0, func(m *_Encoding, v []interface{}) {
  6246. m.rexm(1, hcode(v[1]), addr(v[0]))
  6247. m.emit(0x0f)
  6248. m.emit(0x49)
  6249. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6250. })
  6251. }
  6252. if p.len == 0 {
  6253. panic("invalid operands for CMOVNS")
  6254. }
  6255. return p
  6256. }
  6257. // CMOVNZ performs "Move if not zero (ZF == 0)".
  6258. //
  6259. // Mnemonic : CMOVNZ
  6260. // Supported forms : (6 forms)
  6261. //
  6262. // * CMOVNZ r16, r16 [CMOV]
  6263. // * CMOVNZ m16, r16 [CMOV]
  6264. // * CMOVNZ r32, r32 [CMOV]
  6265. // * CMOVNZ m32, r32 [CMOV]
  6266. // * CMOVNZ r64, r64 [CMOV]
  6267. // * CMOVNZ m64, r64 [CMOV]
  6268. //
  6269. func (self *Program) CMOVNZ(v0 interface{}, v1 interface{}) *Instruction {
  6270. p := self.alloc("CMOVNZ", 2, Operands { v0, v1 })
  6271. // CMOVNZ r16, r16
  6272. if isReg16(v0) && isReg16(v1) {
  6273. self.require(ISA_CMOV)
  6274. p.domain = DomainGeneric
  6275. p.add(0, func(m *_Encoding, v []interface{}) {
  6276. m.emit(0x66)
  6277. m.rexo(hcode(v[1]), v[0], false)
  6278. m.emit(0x0f)
  6279. m.emit(0x45)
  6280. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6281. })
  6282. }
  6283. // CMOVNZ m16, r16
  6284. if isM16(v0) && isReg16(v1) {
  6285. self.require(ISA_CMOV)
  6286. p.domain = DomainGeneric
  6287. p.add(0, func(m *_Encoding, v []interface{}) {
  6288. m.emit(0x66)
  6289. m.rexo(hcode(v[1]), addr(v[0]), false)
  6290. m.emit(0x0f)
  6291. m.emit(0x45)
  6292. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6293. })
  6294. }
  6295. // CMOVNZ r32, r32
  6296. if isReg32(v0) && isReg32(v1) {
  6297. self.require(ISA_CMOV)
  6298. p.domain = DomainGeneric
  6299. p.add(0, func(m *_Encoding, v []interface{}) {
  6300. m.rexo(hcode(v[1]), v[0], false)
  6301. m.emit(0x0f)
  6302. m.emit(0x45)
  6303. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6304. })
  6305. }
  6306. // CMOVNZ m32, r32
  6307. if isM32(v0) && isReg32(v1) {
  6308. self.require(ISA_CMOV)
  6309. p.domain = DomainGeneric
  6310. p.add(0, func(m *_Encoding, v []interface{}) {
  6311. m.rexo(hcode(v[1]), addr(v[0]), false)
  6312. m.emit(0x0f)
  6313. m.emit(0x45)
  6314. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6315. })
  6316. }
  6317. // CMOVNZ r64, r64
  6318. if isReg64(v0) && isReg64(v1) {
  6319. self.require(ISA_CMOV)
  6320. p.domain = DomainGeneric
  6321. p.add(0, func(m *_Encoding, v []interface{}) {
  6322. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  6323. m.emit(0x0f)
  6324. m.emit(0x45)
  6325. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6326. })
  6327. }
  6328. // CMOVNZ m64, r64
  6329. if isM64(v0) && isReg64(v1) {
  6330. self.require(ISA_CMOV)
  6331. p.domain = DomainGeneric
  6332. p.add(0, func(m *_Encoding, v []interface{}) {
  6333. m.rexm(1, hcode(v[1]), addr(v[0]))
  6334. m.emit(0x0f)
  6335. m.emit(0x45)
  6336. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6337. })
  6338. }
  6339. if p.len == 0 {
  6340. panic("invalid operands for CMOVNZ")
  6341. }
  6342. return p
  6343. }
  6344. // CMOVO performs "Move if overflow (OF == 1)".
  6345. //
  6346. // Mnemonic : CMOVO
  6347. // Supported forms : (6 forms)
  6348. //
  6349. // * CMOVO r16, r16 [CMOV]
  6350. // * CMOVO m16, r16 [CMOV]
  6351. // * CMOVO r32, r32 [CMOV]
  6352. // * CMOVO m32, r32 [CMOV]
  6353. // * CMOVO r64, r64 [CMOV]
  6354. // * CMOVO m64, r64 [CMOV]
  6355. //
  6356. func (self *Program) CMOVO(v0 interface{}, v1 interface{}) *Instruction {
  6357. p := self.alloc("CMOVO", 2, Operands { v0, v1 })
  6358. // CMOVO r16, r16
  6359. if isReg16(v0) && isReg16(v1) {
  6360. self.require(ISA_CMOV)
  6361. p.domain = DomainGeneric
  6362. p.add(0, func(m *_Encoding, v []interface{}) {
  6363. m.emit(0x66)
  6364. m.rexo(hcode(v[1]), v[0], false)
  6365. m.emit(0x0f)
  6366. m.emit(0x40)
  6367. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6368. })
  6369. }
  6370. // CMOVO m16, r16
  6371. if isM16(v0) && isReg16(v1) {
  6372. self.require(ISA_CMOV)
  6373. p.domain = DomainGeneric
  6374. p.add(0, func(m *_Encoding, v []interface{}) {
  6375. m.emit(0x66)
  6376. m.rexo(hcode(v[1]), addr(v[0]), false)
  6377. m.emit(0x0f)
  6378. m.emit(0x40)
  6379. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6380. })
  6381. }
  6382. // CMOVO r32, r32
  6383. if isReg32(v0) && isReg32(v1) {
  6384. self.require(ISA_CMOV)
  6385. p.domain = DomainGeneric
  6386. p.add(0, func(m *_Encoding, v []interface{}) {
  6387. m.rexo(hcode(v[1]), v[0], false)
  6388. m.emit(0x0f)
  6389. m.emit(0x40)
  6390. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6391. })
  6392. }
  6393. // CMOVO m32, r32
  6394. if isM32(v0) && isReg32(v1) {
  6395. self.require(ISA_CMOV)
  6396. p.domain = DomainGeneric
  6397. p.add(0, func(m *_Encoding, v []interface{}) {
  6398. m.rexo(hcode(v[1]), addr(v[0]), false)
  6399. m.emit(0x0f)
  6400. m.emit(0x40)
  6401. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6402. })
  6403. }
  6404. // CMOVO r64, r64
  6405. if isReg64(v0) && isReg64(v1) {
  6406. self.require(ISA_CMOV)
  6407. p.domain = DomainGeneric
  6408. p.add(0, func(m *_Encoding, v []interface{}) {
  6409. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  6410. m.emit(0x0f)
  6411. m.emit(0x40)
  6412. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6413. })
  6414. }
  6415. // CMOVO m64, r64
  6416. if isM64(v0) && isReg64(v1) {
  6417. self.require(ISA_CMOV)
  6418. p.domain = DomainGeneric
  6419. p.add(0, func(m *_Encoding, v []interface{}) {
  6420. m.rexm(1, hcode(v[1]), addr(v[0]))
  6421. m.emit(0x0f)
  6422. m.emit(0x40)
  6423. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6424. })
  6425. }
  6426. if p.len == 0 {
  6427. panic("invalid operands for CMOVO")
  6428. }
  6429. return p
  6430. }
  6431. // CMOVP performs "Move if parity (PF == 1)".
  6432. //
  6433. // Mnemonic : CMOVP
  6434. // Supported forms : (6 forms)
  6435. //
  6436. // * CMOVP r16, r16 [CMOV]
  6437. // * CMOVP m16, r16 [CMOV]
  6438. // * CMOVP r32, r32 [CMOV]
  6439. // * CMOVP m32, r32 [CMOV]
  6440. // * CMOVP r64, r64 [CMOV]
  6441. // * CMOVP m64, r64 [CMOV]
  6442. //
  6443. func (self *Program) CMOVP(v0 interface{}, v1 interface{}) *Instruction {
  6444. p := self.alloc("CMOVP", 2, Operands { v0, v1 })
  6445. // CMOVP r16, r16
  6446. if isReg16(v0) && isReg16(v1) {
  6447. self.require(ISA_CMOV)
  6448. p.domain = DomainGeneric
  6449. p.add(0, func(m *_Encoding, v []interface{}) {
  6450. m.emit(0x66)
  6451. m.rexo(hcode(v[1]), v[0], false)
  6452. m.emit(0x0f)
  6453. m.emit(0x4a)
  6454. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6455. })
  6456. }
  6457. // CMOVP m16, r16
  6458. if isM16(v0) && isReg16(v1) {
  6459. self.require(ISA_CMOV)
  6460. p.domain = DomainGeneric
  6461. p.add(0, func(m *_Encoding, v []interface{}) {
  6462. m.emit(0x66)
  6463. m.rexo(hcode(v[1]), addr(v[0]), false)
  6464. m.emit(0x0f)
  6465. m.emit(0x4a)
  6466. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6467. })
  6468. }
  6469. // CMOVP r32, r32
  6470. if isReg32(v0) && isReg32(v1) {
  6471. self.require(ISA_CMOV)
  6472. p.domain = DomainGeneric
  6473. p.add(0, func(m *_Encoding, v []interface{}) {
  6474. m.rexo(hcode(v[1]), v[0], false)
  6475. m.emit(0x0f)
  6476. m.emit(0x4a)
  6477. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6478. })
  6479. }
  6480. // CMOVP m32, r32
  6481. if isM32(v0) && isReg32(v1) {
  6482. self.require(ISA_CMOV)
  6483. p.domain = DomainGeneric
  6484. p.add(0, func(m *_Encoding, v []interface{}) {
  6485. m.rexo(hcode(v[1]), addr(v[0]), false)
  6486. m.emit(0x0f)
  6487. m.emit(0x4a)
  6488. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6489. })
  6490. }
  6491. // CMOVP r64, r64
  6492. if isReg64(v0) && isReg64(v1) {
  6493. self.require(ISA_CMOV)
  6494. p.domain = DomainGeneric
  6495. p.add(0, func(m *_Encoding, v []interface{}) {
  6496. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  6497. m.emit(0x0f)
  6498. m.emit(0x4a)
  6499. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6500. })
  6501. }
  6502. // CMOVP m64, r64
  6503. if isM64(v0) && isReg64(v1) {
  6504. self.require(ISA_CMOV)
  6505. p.domain = DomainGeneric
  6506. p.add(0, func(m *_Encoding, v []interface{}) {
  6507. m.rexm(1, hcode(v[1]), addr(v[0]))
  6508. m.emit(0x0f)
  6509. m.emit(0x4a)
  6510. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6511. })
  6512. }
  6513. if p.len == 0 {
  6514. panic("invalid operands for CMOVP")
  6515. }
  6516. return p
  6517. }
  6518. // CMOVPE performs "Move if parity even (PF == 1)".
  6519. //
  6520. // Mnemonic : CMOVPE
  6521. // Supported forms : (6 forms)
  6522. //
  6523. // * CMOVPE r16, r16 [CMOV]
  6524. // * CMOVPE m16, r16 [CMOV]
  6525. // * CMOVPE r32, r32 [CMOV]
  6526. // * CMOVPE m32, r32 [CMOV]
  6527. // * CMOVPE r64, r64 [CMOV]
  6528. // * CMOVPE m64, r64 [CMOV]
  6529. //
  6530. func (self *Program) CMOVPE(v0 interface{}, v1 interface{}) *Instruction {
  6531. p := self.alloc("CMOVPE", 2, Operands { v0, v1 })
  6532. // CMOVPE r16, r16
  6533. if isReg16(v0) && isReg16(v1) {
  6534. self.require(ISA_CMOV)
  6535. p.domain = DomainGeneric
  6536. p.add(0, func(m *_Encoding, v []interface{}) {
  6537. m.emit(0x66)
  6538. m.rexo(hcode(v[1]), v[0], false)
  6539. m.emit(0x0f)
  6540. m.emit(0x4a)
  6541. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6542. })
  6543. }
  6544. // CMOVPE m16, r16
  6545. if isM16(v0) && isReg16(v1) {
  6546. self.require(ISA_CMOV)
  6547. p.domain = DomainGeneric
  6548. p.add(0, func(m *_Encoding, v []interface{}) {
  6549. m.emit(0x66)
  6550. m.rexo(hcode(v[1]), addr(v[0]), false)
  6551. m.emit(0x0f)
  6552. m.emit(0x4a)
  6553. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6554. })
  6555. }
  6556. // CMOVPE r32, r32
  6557. if isReg32(v0) && isReg32(v1) {
  6558. self.require(ISA_CMOV)
  6559. p.domain = DomainGeneric
  6560. p.add(0, func(m *_Encoding, v []interface{}) {
  6561. m.rexo(hcode(v[1]), v[0], false)
  6562. m.emit(0x0f)
  6563. m.emit(0x4a)
  6564. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6565. })
  6566. }
  6567. // CMOVPE m32, r32
  6568. if isM32(v0) && isReg32(v1) {
  6569. self.require(ISA_CMOV)
  6570. p.domain = DomainGeneric
  6571. p.add(0, func(m *_Encoding, v []interface{}) {
  6572. m.rexo(hcode(v[1]), addr(v[0]), false)
  6573. m.emit(0x0f)
  6574. m.emit(0x4a)
  6575. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6576. })
  6577. }
  6578. // CMOVPE r64, r64
  6579. if isReg64(v0) && isReg64(v1) {
  6580. self.require(ISA_CMOV)
  6581. p.domain = DomainGeneric
  6582. p.add(0, func(m *_Encoding, v []interface{}) {
  6583. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  6584. m.emit(0x0f)
  6585. m.emit(0x4a)
  6586. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6587. })
  6588. }
  6589. // CMOVPE m64, r64
  6590. if isM64(v0) && isReg64(v1) {
  6591. self.require(ISA_CMOV)
  6592. p.domain = DomainGeneric
  6593. p.add(0, func(m *_Encoding, v []interface{}) {
  6594. m.rexm(1, hcode(v[1]), addr(v[0]))
  6595. m.emit(0x0f)
  6596. m.emit(0x4a)
  6597. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6598. })
  6599. }
  6600. if p.len == 0 {
  6601. panic("invalid operands for CMOVPE")
  6602. }
  6603. return p
  6604. }
  6605. // CMOVPO performs "Move if parity odd (PF == 0)".
  6606. //
  6607. // Mnemonic : CMOVPO
  6608. // Supported forms : (6 forms)
  6609. //
  6610. // * CMOVPO r16, r16 [CMOV]
  6611. // * CMOVPO m16, r16 [CMOV]
  6612. // * CMOVPO r32, r32 [CMOV]
  6613. // * CMOVPO m32, r32 [CMOV]
  6614. // * CMOVPO r64, r64 [CMOV]
  6615. // * CMOVPO m64, r64 [CMOV]
  6616. //
  6617. func (self *Program) CMOVPO(v0 interface{}, v1 interface{}) *Instruction {
  6618. p := self.alloc("CMOVPO", 2, Operands { v0, v1 })
  6619. // CMOVPO r16, r16
  6620. if isReg16(v0) && isReg16(v1) {
  6621. self.require(ISA_CMOV)
  6622. p.domain = DomainGeneric
  6623. p.add(0, func(m *_Encoding, v []interface{}) {
  6624. m.emit(0x66)
  6625. m.rexo(hcode(v[1]), v[0], false)
  6626. m.emit(0x0f)
  6627. m.emit(0x4b)
  6628. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6629. })
  6630. }
  6631. // CMOVPO m16, r16
  6632. if isM16(v0) && isReg16(v1) {
  6633. self.require(ISA_CMOV)
  6634. p.domain = DomainGeneric
  6635. p.add(0, func(m *_Encoding, v []interface{}) {
  6636. m.emit(0x66)
  6637. m.rexo(hcode(v[1]), addr(v[0]), false)
  6638. m.emit(0x0f)
  6639. m.emit(0x4b)
  6640. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6641. })
  6642. }
  6643. // CMOVPO r32, r32
  6644. if isReg32(v0) && isReg32(v1) {
  6645. self.require(ISA_CMOV)
  6646. p.domain = DomainGeneric
  6647. p.add(0, func(m *_Encoding, v []interface{}) {
  6648. m.rexo(hcode(v[1]), v[0], false)
  6649. m.emit(0x0f)
  6650. m.emit(0x4b)
  6651. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6652. })
  6653. }
  6654. // CMOVPO m32, r32
  6655. if isM32(v0) && isReg32(v1) {
  6656. self.require(ISA_CMOV)
  6657. p.domain = DomainGeneric
  6658. p.add(0, func(m *_Encoding, v []interface{}) {
  6659. m.rexo(hcode(v[1]), addr(v[0]), false)
  6660. m.emit(0x0f)
  6661. m.emit(0x4b)
  6662. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6663. })
  6664. }
  6665. // CMOVPO r64, r64
  6666. if isReg64(v0) && isReg64(v1) {
  6667. self.require(ISA_CMOV)
  6668. p.domain = DomainGeneric
  6669. p.add(0, func(m *_Encoding, v []interface{}) {
  6670. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  6671. m.emit(0x0f)
  6672. m.emit(0x4b)
  6673. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6674. })
  6675. }
  6676. // CMOVPO m64, r64
  6677. if isM64(v0) && isReg64(v1) {
  6678. self.require(ISA_CMOV)
  6679. p.domain = DomainGeneric
  6680. p.add(0, func(m *_Encoding, v []interface{}) {
  6681. m.rexm(1, hcode(v[1]), addr(v[0]))
  6682. m.emit(0x0f)
  6683. m.emit(0x4b)
  6684. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6685. })
  6686. }
  6687. if p.len == 0 {
  6688. panic("invalid operands for CMOVPO")
  6689. }
  6690. return p
  6691. }
  6692. // CMOVS performs "Move if sign (SF == 1)".
  6693. //
  6694. // Mnemonic : CMOVS
  6695. // Supported forms : (6 forms)
  6696. //
  6697. // * CMOVS r16, r16 [CMOV]
  6698. // * CMOVS m16, r16 [CMOV]
  6699. // * CMOVS r32, r32 [CMOV]
  6700. // * CMOVS m32, r32 [CMOV]
  6701. // * CMOVS r64, r64 [CMOV]
  6702. // * CMOVS m64, r64 [CMOV]
  6703. //
  6704. func (self *Program) CMOVS(v0 interface{}, v1 interface{}) *Instruction {
  6705. p := self.alloc("CMOVS", 2, Operands { v0, v1 })
  6706. // CMOVS r16, r16
  6707. if isReg16(v0) && isReg16(v1) {
  6708. self.require(ISA_CMOV)
  6709. p.domain = DomainGeneric
  6710. p.add(0, func(m *_Encoding, v []interface{}) {
  6711. m.emit(0x66)
  6712. m.rexo(hcode(v[1]), v[0], false)
  6713. m.emit(0x0f)
  6714. m.emit(0x48)
  6715. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6716. })
  6717. }
  6718. // CMOVS m16, r16
  6719. if isM16(v0) && isReg16(v1) {
  6720. self.require(ISA_CMOV)
  6721. p.domain = DomainGeneric
  6722. p.add(0, func(m *_Encoding, v []interface{}) {
  6723. m.emit(0x66)
  6724. m.rexo(hcode(v[1]), addr(v[0]), false)
  6725. m.emit(0x0f)
  6726. m.emit(0x48)
  6727. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6728. })
  6729. }
  6730. // CMOVS r32, r32
  6731. if isReg32(v0) && isReg32(v1) {
  6732. self.require(ISA_CMOV)
  6733. p.domain = DomainGeneric
  6734. p.add(0, func(m *_Encoding, v []interface{}) {
  6735. m.rexo(hcode(v[1]), v[0], false)
  6736. m.emit(0x0f)
  6737. m.emit(0x48)
  6738. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6739. })
  6740. }
  6741. // CMOVS m32, r32
  6742. if isM32(v0) && isReg32(v1) {
  6743. self.require(ISA_CMOV)
  6744. p.domain = DomainGeneric
  6745. p.add(0, func(m *_Encoding, v []interface{}) {
  6746. m.rexo(hcode(v[1]), addr(v[0]), false)
  6747. m.emit(0x0f)
  6748. m.emit(0x48)
  6749. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6750. })
  6751. }
  6752. // CMOVS r64, r64
  6753. if isReg64(v0) && isReg64(v1) {
  6754. self.require(ISA_CMOV)
  6755. p.domain = DomainGeneric
  6756. p.add(0, func(m *_Encoding, v []interface{}) {
  6757. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  6758. m.emit(0x0f)
  6759. m.emit(0x48)
  6760. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6761. })
  6762. }
  6763. // CMOVS m64, r64
  6764. if isM64(v0) && isReg64(v1) {
  6765. self.require(ISA_CMOV)
  6766. p.domain = DomainGeneric
  6767. p.add(0, func(m *_Encoding, v []interface{}) {
  6768. m.rexm(1, hcode(v[1]), addr(v[0]))
  6769. m.emit(0x0f)
  6770. m.emit(0x48)
  6771. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6772. })
  6773. }
  6774. if p.len == 0 {
  6775. panic("invalid operands for CMOVS")
  6776. }
  6777. return p
  6778. }
  6779. // CMOVZ performs "Move if zero (ZF == 1)".
  6780. //
  6781. // Mnemonic : CMOVZ
  6782. // Supported forms : (6 forms)
  6783. //
  6784. // * CMOVZ r16, r16 [CMOV]
  6785. // * CMOVZ m16, r16 [CMOV]
  6786. // * CMOVZ r32, r32 [CMOV]
  6787. // * CMOVZ m32, r32 [CMOV]
  6788. // * CMOVZ r64, r64 [CMOV]
  6789. // * CMOVZ m64, r64 [CMOV]
  6790. //
  6791. func (self *Program) CMOVZ(v0 interface{}, v1 interface{}) *Instruction {
  6792. p := self.alloc("CMOVZ", 2, Operands { v0, v1 })
  6793. // CMOVZ r16, r16
  6794. if isReg16(v0) && isReg16(v1) {
  6795. self.require(ISA_CMOV)
  6796. p.domain = DomainGeneric
  6797. p.add(0, func(m *_Encoding, v []interface{}) {
  6798. m.emit(0x66)
  6799. m.rexo(hcode(v[1]), v[0], false)
  6800. m.emit(0x0f)
  6801. m.emit(0x44)
  6802. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6803. })
  6804. }
  6805. // CMOVZ m16, r16
  6806. if isM16(v0) && isReg16(v1) {
  6807. self.require(ISA_CMOV)
  6808. p.domain = DomainGeneric
  6809. p.add(0, func(m *_Encoding, v []interface{}) {
  6810. m.emit(0x66)
  6811. m.rexo(hcode(v[1]), addr(v[0]), false)
  6812. m.emit(0x0f)
  6813. m.emit(0x44)
  6814. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6815. })
  6816. }
  6817. // CMOVZ r32, r32
  6818. if isReg32(v0) && isReg32(v1) {
  6819. self.require(ISA_CMOV)
  6820. p.domain = DomainGeneric
  6821. p.add(0, func(m *_Encoding, v []interface{}) {
  6822. m.rexo(hcode(v[1]), v[0], false)
  6823. m.emit(0x0f)
  6824. m.emit(0x44)
  6825. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6826. })
  6827. }
  6828. // CMOVZ m32, r32
  6829. if isM32(v0) && isReg32(v1) {
  6830. self.require(ISA_CMOV)
  6831. p.domain = DomainGeneric
  6832. p.add(0, func(m *_Encoding, v []interface{}) {
  6833. m.rexo(hcode(v[1]), addr(v[0]), false)
  6834. m.emit(0x0f)
  6835. m.emit(0x44)
  6836. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6837. })
  6838. }
  6839. // CMOVZ r64, r64
  6840. if isReg64(v0) && isReg64(v1) {
  6841. self.require(ISA_CMOV)
  6842. p.domain = DomainGeneric
  6843. p.add(0, func(m *_Encoding, v []interface{}) {
  6844. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  6845. m.emit(0x0f)
  6846. m.emit(0x44)
  6847. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6848. })
  6849. }
  6850. // CMOVZ m64, r64
  6851. if isM64(v0) && isReg64(v1) {
  6852. self.require(ISA_CMOV)
  6853. p.domain = DomainGeneric
  6854. p.add(0, func(m *_Encoding, v []interface{}) {
  6855. m.rexm(1, hcode(v[1]), addr(v[0]))
  6856. m.emit(0x0f)
  6857. m.emit(0x44)
  6858. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6859. })
  6860. }
  6861. if p.len == 0 {
  6862. panic("invalid operands for CMOVZ")
  6863. }
  6864. return p
  6865. }
  6866. // CMPB performs "Compare Two Operands".
  6867. //
  6868. // Mnemonic : CMP
  6869. // Supported forms : (6 forms)
  6870. //
  6871. // * CMPB imm8, al
  6872. // * CMPB imm8, r8
  6873. // * CMPB r8, r8
  6874. // * CMPB m8, r8
  6875. // * CMPB imm8, m8
  6876. // * CMPB r8, m8
  6877. //
  6878. func (self *Program) CMPB(v0 interface{}, v1 interface{}) *Instruction {
  6879. p := self.alloc("CMPB", 2, Operands { v0, v1 })
  6880. // CMPB imm8, al
  6881. if isImm8(v0) && v1 == AL {
  6882. p.domain = DomainGeneric
  6883. p.add(0, func(m *_Encoding, v []interface{}) {
  6884. m.emit(0x3c)
  6885. m.imm1(toImmAny(v[0]))
  6886. })
  6887. }
  6888. // CMPB imm8, r8
  6889. if isImm8(v0) && isReg8(v1) {
  6890. p.domain = DomainGeneric
  6891. p.add(0, func(m *_Encoding, v []interface{}) {
  6892. m.rexo(0, v[1], isReg8REX(v[1]))
  6893. m.emit(0x80)
  6894. m.emit(0xf8 | lcode(v[1]))
  6895. m.imm1(toImmAny(v[0]))
  6896. })
  6897. }
  6898. // CMPB r8, r8
  6899. if isReg8(v0) && isReg8(v1) {
  6900. p.domain = DomainGeneric
  6901. p.add(0, func(m *_Encoding, v []interface{}) {
  6902. m.rexo(hcode(v[0]), v[1], isReg8REX(v[0]) || isReg8REX(v[1]))
  6903. m.emit(0x38)
  6904. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  6905. })
  6906. p.add(0, func(m *_Encoding, v []interface{}) {
  6907. m.rexo(hcode(v[1]), v[0], isReg8REX(v[0]) || isReg8REX(v[1]))
  6908. m.emit(0x3a)
  6909. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  6910. })
  6911. }
  6912. // CMPB m8, r8
  6913. if isM8(v0) && isReg8(v1) {
  6914. p.domain = DomainGeneric
  6915. p.add(0, func(m *_Encoding, v []interface{}) {
  6916. m.rexo(hcode(v[1]), addr(v[0]), isReg8REX(v[1]))
  6917. m.emit(0x3a)
  6918. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  6919. })
  6920. }
  6921. // CMPB imm8, m8
  6922. if isImm8(v0) && isM8(v1) {
  6923. p.domain = DomainGeneric
  6924. p.add(0, func(m *_Encoding, v []interface{}) {
  6925. m.rexo(0, addr(v[1]), false)
  6926. m.emit(0x80)
  6927. m.mrsd(7, addr(v[1]), 1)
  6928. m.imm1(toImmAny(v[0]))
  6929. })
  6930. }
  6931. // CMPB r8, m8
  6932. if isReg8(v0) && isM8(v1) {
  6933. p.domain = DomainGeneric
  6934. p.add(0, func(m *_Encoding, v []interface{}) {
  6935. m.rexo(hcode(v[0]), addr(v[1]), isReg8REX(v[0]))
  6936. m.emit(0x38)
  6937. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  6938. })
  6939. }
  6940. if p.len == 0 {
  6941. panic("invalid operands for CMPB")
  6942. }
  6943. return p
  6944. }
  6945. // CMPL performs "Compare Two Operands".
  6946. //
  6947. // Mnemonic : CMP
  6948. // Supported forms : (8 forms)
  6949. //
  6950. // * CMPL imm32, eax
  6951. // * CMPL imm8, r32
  6952. // * CMPL imm32, r32
  6953. // * CMPL r32, r32
  6954. // * CMPL m32, r32
  6955. // * CMPL imm8, m32
  6956. // * CMPL imm32, m32
  6957. // * CMPL r32, m32
  6958. //
  6959. func (self *Program) CMPL(v0 interface{}, v1 interface{}) *Instruction {
  6960. p := self.alloc("CMPL", 2, Operands { v0, v1 })
  6961. // CMPL imm32, eax
  6962. if isImm32(v0) && v1 == EAX {
  6963. p.domain = DomainGeneric
  6964. p.add(0, func(m *_Encoding, v []interface{}) {
  6965. m.emit(0x3d)
  6966. m.imm4(toImmAny(v[0]))
  6967. })
  6968. }
  6969. // CMPL imm8, r32
  6970. if isImm8Ext(v0, 4) && isReg32(v1) {
  6971. p.domain = DomainGeneric
  6972. p.add(0, func(m *_Encoding, v []interface{}) {
  6973. m.rexo(0, v[1], false)
  6974. m.emit(0x83)
  6975. m.emit(0xf8 | lcode(v[1]))
  6976. m.imm1(toImmAny(v[0]))
  6977. })
  6978. }
  6979. // CMPL imm32, r32
  6980. if isImm32(v0) && isReg32(v1) {
  6981. p.domain = DomainGeneric
  6982. p.add(0, func(m *_Encoding, v []interface{}) {
  6983. m.rexo(0, v[1], false)
  6984. m.emit(0x81)
  6985. m.emit(0xf8 | lcode(v[1]))
  6986. m.imm4(toImmAny(v[0]))
  6987. })
  6988. }
  6989. // CMPL r32, r32
  6990. if isReg32(v0) && isReg32(v1) {
  6991. p.domain = DomainGeneric
  6992. p.add(0, func(m *_Encoding, v []interface{}) {
  6993. m.rexo(hcode(v[0]), v[1], false)
  6994. m.emit(0x39)
  6995. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  6996. })
  6997. p.add(0, func(m *_Encoding, v []interface{}) {
  6998. m.rexo(hcode(v[1]), v[0], false)
  6999. m.emit(0x3b)
  7000. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  7001. })
  7002. }
  7003. // CMPL m32, r32
  7004. if isM32(v0) && isReg32(v1) {
  7005. p.domain = DomainGeneric
  7006. p.add(0, func(m *_Encoding, v []interface{}) {
  7007. m.rexo(hcode(v[1]), addr(v[0]), false)
  7008. m.emit(0x3b)
  7009. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  7010. })
  7011. }
  7012. // CMPL imm8, m32
  7013. if isImm8Ext(v0, 4) && isM32(v1) {
  7014. p.domain = DomainGeneric
  7015. p.add(0, func(m *_Encoding, v []interface{}) {
  7016. m.rexo(0, addr(v[1]), false)
  7017. m.emit(0x83)
  7018. m.mrsd(7, addr(v[1]), 1)
  7019. m.imm1(toImmAny(v[0]))
  7020. })
  7021. }
  7022. // CMPL imm32, m32
  7023. if isImm32(v0) && isM32(v1) {
  7024. p.domain = DomainGeneric
  7025. p.add(0, func(m *_Encoding, v []interface{}) {
  7026. m.rexo(0, addr(v[1]), false)
  7027. m.emit(0x81)
  7028. m.mrsd(7, addr(v[1]), 1)
  7029. m.imm4(toImmAny(v[0]))
  7030. })
  7031. }
  7032. // CMPL r32, m32
  7033. if isReg32(v0) && isM32(v1) {
  7034. p.domain = DomainGeneric
  7035. p.add(0, func(m *_Encoding, v []interface{}) {
  7036. m.rexo(hcode(v[0]), addr(v[1]), false)
  7037. m.emit(0x39)
  7038. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  7039. })
  7040. }
  7041. if p.len == 0 {
  7042. panic("invalid operands for CMPL")
  7043. }
  7044. return p
  7045. }
  7046. // CMPPD performs "Compare Packed Double-Precision Floating-Point Values".
  7047. //
  7048. // Mnemonic : CMPPD
  7049. // Supported forms : (2 forms)
  7050. //
  7051. // * CMPPD imm8, xmm, xmm [SSE2]
  7052. // * CMPPD imm8, m128, xmm [SSE2]
  7053. //
  7054. func (self *Program) CMPPD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  7055. p := self.alloc("CMPPD", 3, Operands { v0, v1, v2 })
  7056. // CMPPD imm8, xmm, xmm
  7057. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  7058. self.require(ISA_SSE2)
  7059. p.domain = DomainMMXSSE
  7060. p.add(0, func(m *_Encoding, v []interface{}) {
  7061. m.emit(0x66)
  7062. m.rexo(hcode(v[2]), v[1], false)
  7063. m.emit(0x0f)
  7064. m.emit(0xc2)
  7065. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  7066. m.imm1(toImmAny(v[0]))
  7067. })
  7068. }
  7069. // CMPPD imm8, m128, xmm
  7070. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  7071. self.require(ISA_SSE2)
  7072. p.domain = DomainMMXSSE
  7073. p.add(0, func(m *_Encoding, v []interface{}) {
  7074. m.emit(0x66)
  7075. m.rexo(hcode(v[2]), addr(v[1]), false)
  7076. m.emit(0x0f)
  7077. m.emit(0xc2)
  7078. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  7079. m.imm1(toImmAny(v[0]))
  7080. })
  7081. }
  7082. if p.len == 0 {
  7083. panic("invalid operands for CMPPD")
  7084. }
  7085. return p
  7086. }
  7087. // CMPPS performs "Compare Packed Single-Precision Floating-Point Values".
  7088. //
  7089. // Mnemonic : CMPPS
  7090. // Supported forms : (2 forms)
  7091. //
  7092. // * CMPPS imm8, xmm, xmm [SSE]
  7093. // * CMPPS imm8, m128, xmm [SSE]
  7094. //
  7095. func (self *Program) CMPPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  7096. p := self.alloc("CMPPS", 3, Operands { v0, v1, v2 })
  7097. // CMPPS imm8, xmm, xmm
  7098. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  7099. self.require(ISA_SSE)
  7100. p.domain = DomainMMXSSE
  7101. p.add(0, func(m *_Encoding, v []interface{}) {
  7102. m.rexo(hcode(v[2]), v[1], false)
  7103. m.emit(0x0f)
  7104. m.emit(0xc2)
  7105. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  7106. m.imm1(toImmAny(v[0]))
  7107. })
  7108. }
  7109. // CMPPS imm8, m128, xmm
  7110. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  7111. self.require(ISA_SSE)
  7112. p.domain = DomainMMXSSE
  7113. p.add(0, func(m *_Encoding, v []interface{}) {
  7114. m.rexo(hcode(v[2]), addr(v[1]), false)
  7115. m.emit(0x0f)
  7116. m.emit(0xc2)
  7117. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  7118. m.imm1(toImmAny(v[0]))
  7119. })
  7120. }
  7121. if p.len == 0 {
  7122. panic("invalid operands for CMPPS")
  7123. }
  7124. return p
  7125. }
  7126. // CMPQ performs "Compare Two Operands".
  7127. //
  7128. // Mnemonic : CMP
  7129. // Supported forms : (8 forms)
  7130. //
  7131. // * CMPQ imm32, rax
  7132. // * CMPQ imm8, r64
  7133. // * CMPQ imm32, r64
  7134. // * CMPQ r64, r64
  7135. // * CMPQ m64, r64
  7136. // * CMPQ imm8, m64
  7137. // * CMPQ imm32, m64
  7138. // * CMPQ r64, m64
  7139. //
  7140. func (self *Program) CMPQ(v0 interface{}, v1 interface{}) *Instruction {
  7141. p := self.alloc("CMPQ", 2, Operands { v0, v1 })
  7142. // CMPQ imm32, rax
  7143. if isImm32(v0) && v1 == RAX {
  7144. p.domain = DomainGeneric
  7145. p.add(0, func(m *_Encoding, v []interface{}) {
  7146. m.emit(0x48)
  7147. m.emit(0x3d)
  7148. m.imm4(toImmAny(v[0]))
  7149. })
  7150. }
  7151. // CMPQ imm8, r64
  7152. if isImm8Ext(v0, 8) && isReg64(v1) {
  7153. p.domain = DomainGeneric
  7154. p.add(0, func(m *_Encoding, v []interface{}) {
  7155. m.emit(0x48 | hcode(v[1]))
  7156. m.emit(0x83)
  7157. m.emit(0xf8 | lcode(v[1]))
  7158. m.imm1(toImmAny(v[0]))
  7159. })
  7160. }
  7161. // CMPQ imm32, r64
  7162. if isImm32Ext(v0, 8) && isReg64(v1) {
  7163. p.domain = DomainGeneric
  7164. p.add(0, func(m *_Encoding, v []interface{}) {
  7165. m.emit(0x48 | hcode(v[1]))
  7166. m.emit(0x81)
  7167. m.emit(0xf8 | lcode(v[1]))
  7168. m.imm4(toImmAny(v[0]))
  7169. })
  7170. }
  7171. // CMPQ r64, r64
  7172. if isReg64(v0) && isReg64(v1) {
  7173. p.domain = DomainGeneric
  7174. p.add(0, func(m *_Encoding, v []interface{}) {
  7175. m.emit(0x48 | hcode(v[0]) << 2 | hcode(v[1]))
  7176. m.emit(0x39)
  7177. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  7178. })
  7179. p.add(0, func(m *_Encoding, v []interface{}) {
  7180. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  7181. m.emit(0x3b)
  7182. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  7183. })
  7184. }
  7185. // CMPQ m64, r64
  7186. if isM64(v0) && isReg64(v1) {
  7187. p.domain = DomainGeneric
  7188. p.add(0, func(m *_Encoding, v []interface{}) {
  7189. m.rexm(1, hcode(v[1]), addr(v[0]))
  7190. m.emit(0x3b)
  7191. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  7192. })
  7193. }
  7194. // CMPQ imm8, m64
  7195. if isImm8Ext(v0, 8) && isM64(v1) {
  7196. p.domain = DomainGeneric
  7197. p.add(0, func(m *_Encoding, v []interface{}) {
  7198. m.rexm(1, 0, addr(v[1]))
  7199. m.emit(0x83)
  7200. m.mrsd(7, addr(v[1]), 1)
  7201. m.imm1(toImmAny(v[0]))
  7202. })
  7203. }
  7204. // CMPQ imm32, m64
  7205. if isImm32Ext(v0, 8) && isM64(v1) {
  7206. p.domain = DomainGeneric
  7207. p.add(0, func(m *_Encoding, v []interface{}) {
  7208. m.rexm(1, 0, addr(v[1]))
  7209. m.emit(0x81)
  7210. m.mrsd(7, addr(v[1]), 1)
  7211. m.imm4(toImmAny(v[0]))
  7212. })
  7213. }
  7214. // CMPQ r64, m64
  7215. if isReg64(v0) && isM64(v1) {
  7216. p.domain = DomainGeneric
  7217. p.add(0, func(m *_Encoding, v []interface{}) {
  7218. m.rexm(1, hcode(v[0]), addr(v[1]))
  7219. m.emit(0x39)
  7220. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  7221. })
  7222. }
  7223. if p.len == 0 {
  7224. panic("invalid operands for CMPQ")
  7225. }
  7226. return p
  7227. }
  7228. // CMPSD performs "Compare Scalar Double-Precision Floating-Point Values".
  7229. //
  7230. // Mnemonic : CMPSD
  7231. // Supported forms : (2 forms)
  7232. //
  7233. // * CMPSD imm8, xmm, xmm [SSE2]
  7234. // * CMPSD imm8, m64, xmm [SSE2]
  7235. //
  7236. func (self *Program) CMPSD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  7237. p := self.alloc("CMPSD", 3, Operands { v0, v1, v2 })
  7238. // CMPSD imm8, xmm, xmm
  7239. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  7240. self.require(ISA_SSE2)
  7241. p.domain = DomainMMXSSE
  7242. p.add(0, func(m *_Encoding, v []interface{}) {
  7243. m.emit(0xf2)
  7244. m.rexo(hcode(v[2]), v[1], false)
  7245. m.emit(0x0f)
  7246. m.emit(0xc2)
  7247. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  7248. m.imm1(toImmAny(v[0]))
  7249. })
  7250. }
  7251. // CMPSD imm8, m64, xmm
  7252. if isImm8(v0) && isM64(v1) && isXMM(v2) {
  7253. self.require(ISA_SSE2)
  7254. p.domain = DomainMMXSSE
  7255. p.add(0, func(m *_Encoding, v []interface{}) {
  7256. m.emit(0xf2)
  7257. m.rexo(hcode(v[2]), addr(v[1]), false)
  7258. m.emit(0x0f)
  7259. m.emit(0xc2)
  7260. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  7261. m.imm1(toImmAny(v[0]))
  7262. })
  7263. }
  7264. if p.len == 0 {
  7265. panic("invalid operands for CMPSD")
  7266. }
  7267. return p
  7268. }
  7269. // CMPSS performs "Compare Scalar Single-Precision Floating-Point Values".
  7270. //
  7271. // Mnemonic : CMPSS
  7272. // Supported forms : (2 forms)
  7273. //
  7274. // * CMPSS imm8, xmm, xmm [SSE]
  7275. // * CMPSS imm8, m32, xmm [SSE]
  7276. //
  7277. func (self *Program) CMPSS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  7278. p := self.alloc("CMPSS", 3, Operands { v0, v1, v2 })
  7279. // CMPSS imm8, xmm, xmm
  7280. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  7281. self.require(ISA_SSE)
  7282. p.domain = DomainMMXSSE
  7283. p.add(0, func(m *_Encoding, v []interface{}) {
  7284. m.emit(0xf3)
  7285. m.rexo(hcode(v[2]), v[1], false)
  7286. m.emit(0x0f)
  7287. m.emit(0xc2)
  7288. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  7289. m.imm1(toImmAny(v[0]))
  7290. })
  7291. }
  7292. // CMPSS imm8, m32, xmm
  7293. if isImm8(v0) && isM32(v1) && isXMM(v2) {
  7294. self.require(ISA_SSE)
  7295. p.domain = DomainMMXSSE
  7296. p.add(0, func(m *_Encoding, v []interface{}) {
  7297. m.emit(0xf3)
  7298. m.rexo(hcode(v[2]), addr(v[1]), false)
  7299. m.emit(0x0f)
  7300. m.emit(0xc2)
  7301. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  7302. m.imm1(toImmAny(v[0]))
  7303. })
  7304. }
  7305. if p.len == 0 {
  7306. panic("invalid operands for CMPSS")
  7307. }
  7308. return p
  7309. }
  7310. // CMPW performs "Compare Two Operands".
  7311. //
  7312. // Mnemonic : CMP
  7313. // Supported forms : (8 forms)
  7314. //
  7315. // * CMPW imm16, ax
  7316. // * CMPW imm8, r16
  7317. // * CMPW imm16, r16
  7318. // * CMPW r16, r16
  7319. // * CMPW m16, r16
  7320. // * CMPW imm8, m16
  7321. // * CMPW imm16, m16
  7322. // * CMPW r16, m16
  7323. //
  7324. func (self *Program) CMPW(v0 interface{}, v1 interface{}) *Instruction {
  7325. p := self.alloc("CMPW", 2, Operands { v0, v1 })
  7326. // CMPW imm16, ax
  7327. if isImm16(v0) && v1 == AX {
  7328. p.domain = DomainGeneric
  7329. p.add(0, func(m *_Encoding, v []interface{}) {
  7330. m.emit(0x66)
  7331. m.emit(0x3d)
  7332. m.imm2(toImmAny(v[0]))
  7333. })
  7334. }
  7335. // CMPW imm8, r16
  7336. if isImm8Ext(v0, 2) && isReg16(v1) {
  7337. p.domain = DomainGeneric
  7338. p.add(0, func(m *_Encoding, v []interface{}) {
  7339. m.emit(0x66)
  7340. m.rexo(0, v[1], false)
  7341. m.emit(0x83)
  7342. m.emit(0xf8 | lcode(v[1]))
  7343. m.imm1(toImmAny(v[0]))
  7344. })
  7345. }
  7346. // CMPW imm16, r16
  7347. if isImm16(v0) && isReg16(v1) {
  7348. p.domain = DomainGeneric
  7349. p.add(0, func(m *_Encoding, v []interface{}) {
  7350. m.emit(0x66)
  7351. m.rexo(0, v[1], false)
  7352. m.emit(0x81)
  7353. m.emit(0xf8 | lcode(v[1]))
  7354. m.imm2(toImmAny(v[0]))
  7355. })
  7356. }
  7357. // CMPW r16, r16
  7358. if isReg16(v0) && isReg16(v1) {
  7359. p.domain = DomainGeneric
  7360. p.add(0, func(m *_Encoding, v []interface{}) {
  7361. m.emit(0x66)
  7362. m.rexo(hcode(v[0]), v[1], false)
  7363. m.emit(0x39)
  7364. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  7365. })
  7366. p.add(0, func(m *_Encoding, v []interface{}) {
  7367. m.emit(0x66)
  7368. m.rexo(hcode(v[1]), v[0], false)
  7369. m.emit(0x3b)
  7370. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  7371. })
  7372. }
  7373. // CMPW m16, r16
  7374. if isM16(v0) && isReg16(v1) {
  7375. p.domain = DomainGeneric
  7376. p.add(0, func(m *_Encoding, v []interface{}) {
  7377. m.emit(0x66)
  7378. m.rexo(hcode(v[1]), addr(v[0]), false)
  7379. m.emit(0x3b)
  7380. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  7381. })
  7382. }
  7383. // CMPW imm8, m16
  7384. if isImm8Ext(v0, 2) && isM16(v1) {
  7385. p.domain = DomainGeneric
  7386. p.add(0, func(m *_Encoding, v []interface{}) {
  7387. m.emit(0x66)
  7388. m.rexo(0, addr(v[1]), false)
  7389. m.emit(0x83)
  7390. m.mrsd(7, addr(v[1]), 1)
  7391. m.imm1(toImmAny(v[0]))
  7392. })
  7393. }
  7394. // CMPW imm16, m16
  7395. if isImm16(v0) && isM16(v1) {
  7396. p.domain = DomainGeneric
  7397. p.add(0, func(m *_Encoding, v []interface{}) {
  7398. m.emit(0x66)
  7399. m.rexo(0, addr(v[1]), false)
  7400. m.emit(0x81)
  7401. m.mrsd(7, addr(v[1]), 1)
  7402. m.imm2(toImmAny(v[0]))
  7403. })
  7404. }
  7405. // CMPW r16, m16
  7406. if isReg16(v0) && isM16(v1) {
  7407. p.domain = DomainGeneric
  7408. p.add(0, func(m *_Encoding, v []interface{}) {
  7409. m.emit(0x66)
  7410. m.rexo(hcode(v[0]), addr(v[1]), false)
  7411. m.emit(0x39)
  7412. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  7413. })
  7414. }
  7415. if p.len == 0 {
  7416. panic("invalid operands for CMPW")
  7417. }
  7418. return p
  7419. }
  7420. // CMPXCHG16B performs "Compare and Exchange 16 Bytes".
  7421. //
  7422. // Mnemonic : CMPXCHG16B
  7423. // Supported forms : (1 form)
  7424. //
  7425. // * CMPXCHG16B m128
  7426. //
  7427. func (self *Program) CMPXCHG16B(v0 interface{}) *Instruction {
  7428. p := self.alloc("CMPXCHG16B", 1, Operands { v0 })
  7429. // CMPXCHG16B m128
  7430. if isM128(v0) {
  7431. p.domain = DomainGeneric
  7432. p.add(0, func(m *_Encoding, v []interface{}) {
  7433. m.rexm(1, 0, addr(v[0]))
  7434. m.emit(0x0f)
  7435. m.emit(0xc7)
  7436. m.mrsd(1, addr(v[0]), 1)
  7437. })
  7438. }
  7439. if p.len == 0 {
  7440. panic("invalid operands for CMPXCHG16B")
  7441. }
  7442. return p
  7443. }
  7444. // CMPXCHG8B performs "Compare and Exchange 8 Bytes".
  7445. //
  7446. // Mnemonic : CMPXCHG8B
  7447. // Supported forms : (1 form)
  7448. //
  7449. // * CMPXCHG8B m64
  7450. //
  7451. func (self *Program) CMPXCHG8B(v0 interface{}) *Instruction {
  7452. p := self.alloc("CMPXCHG8B", 1, Operands { v0 })
  7453. // CMPXCHG8B m64
  7454. if isM64(v0) {
  7455. p.domain = DomainGeneric
  7456. p.add(0, func(m *_Encoding, v []interface{}) {
  7457. m.rexo(0, addr(v[0]), false)
  7458. m.emit(0x0f)
  7459. m.emit(0xc7)
  7460. m.mrsd(1, addr(v[0]), 1)
  7461. })
  7462. }
  7463. if p.len == 0 {
  7464. panic("invalid operands for CMPXCHG8B")
  7465. }
  7466. return p
  7467. }
  7468. // CMPXCHGB performs "Compare and Exchange".
  7469. //
  7470. // Mnemonic : CMPXCHG
  7471. // Supported forms : (2 forms)
  7472. //
  7473. // * CMPXCHGB r8, r8
  7474. // * CMPXCHGB r8, m8
  7475. //
  7476. func (self *Program) CMPXCHGB(v0 interface{}, v1 interface{}) *Instruction {
  7477. p := self.alloc("CMPXCHGB", 2, Operands { v0, v1 })
  7478. // CMPXCHGB r8, r8
  7479. if isReg8(v0) && isReg8(v1) {
  7480. p.domain = DomainGeneric
  7481. p.add(0, func(m *_Encoding, v []interface{}) {
  7482. m.rexo(hcode(v[0]), v[1], isReg8REX(v[0]) || isReg8REX(v[1]))
  7483. m.emit(0x0f)
  7484. m.emit(0xb0)
  7485. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  7486. })
  7487. }
  7488. // CMPXCHGB r8, m8
  7489. if isReg8(v0) && isM8(v1) {
  7490. p.domain = DomainGeneric
  7491. p.add(0, func(m *_Encoding, v []interface{}) {
  7492. m.rexo(hcode(v[0]), addr(v[1]), isReg8REX(v[0]))
  7493. m.emit(0x0f)
  7494. m.emit(0xb0)
  7495. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  7496. })
  7497. }
  7498. if p.len == 0 {
  7499. panic("invalid operands for CMPXCHGB")
  7500. }
  7501. return p
  7502. }
  7503. // CMPXCHGL performs "Compare and Exchange".
  7504. //
  7505. // Mnemonic : CMPXCHG
  7506. // Supported forms : (2 forms)
  7507. //
  7508. // * CMPXCHGL r32, r32
  7509. // * CMPXCHGL r32, m32
  7510. //
  7511. func (self *Program) CMPXCHGL(v0 interface{}, v1 interface{}) *Instruction {
  7512. p := self.alloc("CMPXCHGL", 2, Operands { v0, v1 })
  7513. // CMPXCHGL r32, r32
  7514. if isReg32(v0) && isReg32(v1) {
  7515. p.domain = DomainGeneric
  7516. p.add(0, func(m *_Encoding, v []interface{}) {
  7517. m.rexo(hcode(v[0]), v[1], false)
  7518. m.emit(0x0f)
  7519. m.emit(0xb1)
  7520. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  7521. })
  7522. }
  7523. // CMPXCHGL r32, m32
  7524. if isReg32(v0) && isM32(v1) {
  7525. p.domain = DomainGeneric
  7526. p.add(0, func(m *_Encoding, v []interface{}) {
  7527. m.rexo(hcode(v[0]), addr(v[1]), false)
  7528. m.emit(0x0f)
  7529. m.emit(0xb1)
  7530. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  7531. })
  7532. }
  7533. if p.len == 0 {
  7534. panic("invalid operands for CMPXCHGL")
  7535. }
  7536. return p
  7537. }
  7538. // CMPXCHGQ performs "Compare and Exchange".
  7539. //
  7540. // Mnemonic : CMPXCHG
  7541. // Supported forms : (2 forms)
  7542. //
  7543. // * CMPXCHGQ r64, r64
  7544. // * CMPXCHGQ r64, m64
  7545. //
  7546. func (self *Program) CMPXCHGQ(v0 interface{}, v1 interface{}) *Instruction {
  7547. p := self.alloc("CMPXCHGQ", 2, Operands { v0, v1 })
  7548. // CMPXCHGQ r64, r64
  7549. if isReg64(v0) && isReg64(v1) {
  7550. p.domain = DomainGeneric
  7551. p.add(0, func(m *_Encoding, v []interface{}) {
  7552. m.emit(0x48 | hcode(v[0]) << 2 | hcode(v[1]))
  7553. m.emit(0x0f)
  7554. m.emit(0xb1)
  7555. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  7556. })
  7557. }
  7558. // CMPXCHGQ r64, m64
  7559. if isReg64(v0) && isM64(v1) {
  7560. p.domain = DomainGeneric
  7561. p.add(0, func(m *_Encoding, v []interface{}) {
  7562. m.rexm(1, hcode(v[0]), addr(v[1]))
  7563. m.emit(0x0f)
  7564. m.emit(0xb1)
  7565. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  7566. })
  7567. }
  7568. if p.len == 0 {
  7569. panic("invalid operands for CMPXCHGQ")
  7570. }
  7571. return p
  7572. }
  7573. // CMPXCHGW performs "Compare and Exchange".
  7574. //
  7575. // Mnemonic : CMPXCHG
  7576. // Supported forms : (2 forms)
  7577. //
  7578. // * CMPXCHGW r16, r16
  7579. // * CMPXCHGW r16, m16
  7580. //
  7581. func (self *Program) CMPXCHGW(v0 interface{}, v1 interface{}) *Instruction {
  7582. p := self.alloc("CMPXCHGW", 2, Operands { v0, v1 })
  7583. // CMPXCHGW r16, r16
  7584. if isReg16(v0) && isReg16(v1) {
  7585. p.domain = DomainGeneric
  7586. p.add(0, func(m *_Encoding, v []interface{}) {
  7587. m.emit(0x66)
  7588. m.rexo(hcode(v[0]), v[1], false)
  7589. m.emit(0x0f)
  7590. m.emit(0xb1)
  7591. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  7592. })
  7593. }
  7594. // CMPXCHGW r16, m16
  7595. if isReg16(v0) && isM16(v1) {
  7596. p.domain = DomainGeneric
  7597. p.add(0, func(m *_Encoding, v []interface{}) {
  7598. m.emit(0x66)
  7599. m.rexo(hcode(v[0]), addr(v[1]), false)
  7600. m.emit(0x0f)
  7601. m.emit(0xb1)
  7602. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  7603. })
  7604. }
  7605. if p.len == 0 {
  7606. panic("invalid operands for CMPXCHGW")
  7607. }
  7608. return p
  7609. }
  7610. // COMISD performs "Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS".
  7611. //
  7612. // Mnemonic : COMISD
  7613. // Supported forms : (2 forms)
  7614. //
  7615. // * COMISD xmm, xmm [SSE2]
  7616. // * COMISD m64, xmm [SSE2]
  7617. //
  7618. func (self *Program) COMISD(v0 interface{}, v1 interface{}) *Instruction {
  7619. p := self.alloc("COMISD", 2, Operands { v0, v1 })
  7620. // COMISD xmm, xmm
  7621. if isXMM(v0) && isXMM(v1) {
  7622. self.require(ISA_SSE2)
  7623. p.domain = DomainMMXSSE
  7624. p.add(0, func(m *_Encoding, v []interface{}) {
  7625. m.emit(0x66)
  7626. m.rexo(hcode(v[1]), v[0], false)
  7627. m.emit(0x0f)
  7628. m.emit(0x2f)
  7629. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  7630. })
  7631. }
  7632. // COMISD m64, xmm
  7633. if isM64(v0) && isXMM(v1) {
  7634. self.require(ISA_SSE2)
  7635. p.domain = DomainMMXSSE
  7636. p.add(0, func(m *_Encoding, v []interface{}) {
  7637. m.emit(0x66)
  7638. m.rexo(hcode(v[1]), addr(v[0]), false)
  7639. m.emit(0x0f)
  7640. m.emit(0x2f)
  7641. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  7642. })
  7643. }
  7644. if p.len == 0 {
  7645. panic("invalid operands for COMISD")
  7646. }
  7647. return p
  7648. }
  7649. // COMISS performs "Compare Scalar Ordered Single-Precision Floating-Point Values and Set EFLAGS".
  7650. //
  7651. // Mnemonic : COMISS
  7652. // Supported forms : (2 forms)
  7653. //
  7654. // * COMISS xmm, xmm [SSE]
  7655. // * COMISS m32, xmm [SSE]
  7656. //
  7657. func (self *Program) COMISS(v0 interface{}, v1 interface{}) *Instruction {
  7658. p := self.alloc("COMISS", 2, Operands { v0, v1 })
  7659. // COMISS xmm, xmm
  7660. if isXMM(v0) && isXMM(v1) {
  7661. self.require(ISA_SSE)
  7662. p.domain = DomainMMXSSE
  7663. p.add(0, func(m *_Encoding, v []interface{}) {
  7664. m.rexo(hcode(v[1]), v[0], false)
  7665. m.emit(0x0f)
  7666. m.emit(0x2f)
  7667. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  7668. })
  7669. }
  7670. // COMISS m32, xmm
  7671. if isM32(v0) && isXMM(v1) {
  7672. self.require(ISA_SSE)
  7673. p.domain = DomainMMXSSE
  7674. p.add(0, func(m *_Encoding, v []interface{}) {
  7675. m.rexo(hcode(v[1]), addr(v[0]), false)
  7676. m.emit(0x0f)
  7677. m.emit(0x2f)
  7678. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  7679. })
  7680. }
  7681. if p.len == 0 {
  7682. panic("invalid operands for COMISS")
  7683. }
  7684. return p
  7685. }
  7686. // CPUID performs "CPU Identification".
  7687. //
  7688. // Mnemonic : CPUID
  7689. // Supported forms : (1 form)
  7690. //
  7691. // * CPUID [CPUID]
  7692. //
  7693. func (self *Program) CPUID() *Instruction {
  7694. p := self.alloc("CPUID", 0, Operands { })
  7695. // CPUID
  7696. self.require(ISA_CPUID)
  7697. p.domain = DomainGeneric
  7698. p.add(0, func(m *_Encoding, v []interface{}) {
  7699. m.emit(0x0f)
  7700. m.emit(0xa2)
  7701. })
  7702. return p
  7703. }
  7704. // CQTO performs "Convert Quadword to Octaword".
  7705. //
  7706. // Mnemonic : CQO
  7707. // Supported forms : (1 form)
  7708. //
  7709. // * CQTO
  7710. //
  7711. func (self *Program) CQTO() *Instruction {
  7712. p := self.alloc("CQTO", 0, Operands { })
  7713. // CQTO
  7714. p.domain = DomainGeneric
  7715. p.add(0, func(m *_Encoding, v []interface{}) {
  7716. m.emit(0x48)
  7717. m.emit(0x99)
  7718. })
  7719. return p
  7720. }
  7721. // CRC32B performs "Accumulate CRC32 Value".
  7722. //
  7723. // Mnemonic : CRC32
  7724. // Supported forms : (4 forms)
  7725. //
  7726. // * CRC32B r8, r32 [SSE4.2]
  7727. // * CRC32B m8, r32 [SSE4.2]
  7728. // * CRC32B r8, r64 [SSE4.2]
  7729. // * CRC32B m8, r64 [SSE4.2]
  7730. //
  7731. func (self *Program) CRC32B(v0 interface{}, v1 interface{}) *Instruction {
  7732. p := self.alloc("CRC32B", 2, Operands { v0, v1 })
  7733. // CRC32B r8, r32
  7734. if isReg8(v0) && isReg32(v1) {
  7735. self.require(ISA_SSE4_2)
  7736. p.domain = DomainGeneric
  7737. p.add(0, func(m *_Encoding, v []interface{}) {
  7738. m.emit(0xf2)
  7739. m.rexo(hcode(v[1]), v[0], isReg8REX(v[0]))
  7740. m.emit(0x0f)
  7741. m.emit(0x38)
  7742. m.emit(0xf0)
  7743. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  7744. })
  7745. }
  7746. // CRC32B m8, r32
  7747. if isM8(v0) && isReg32(v1) {
  7748. self.require(ISA_SSE4_2)
  7749. p.domain = DomainGeneric
  7750. p.add(0, func(m *_Encoding, v []interface{}) {
  7751. m.emit(0xf2)
  7752. m.rexo(hcode(v[1]), addr(v[0]), false)
  7753. m.emit(0x0f)
  7754. m.emit(0x38)
  7755. m.emit(0xf0)
  7756. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  7757. })
  7758. }
  7759. // CRC32B r8, r64
  7760. if isReg8(v0) && isReg64(v1) {
  7761. self.require(ISA_SSE4_2)
  7762. p.domain = DomainGeneric
  7763. p.add(0, func(m *_Encoding, v []interface{}) {
  7764. m.emit(0xf2)
  7765. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  7766. m.emit(0x0f)
  7767. m.emit(0x38)
  7768. m.emit(0xf0)
  7769. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  7770. })
  7771. }
  7772. // CRC32B m8, r64
  7773. if isM8(v0) && isReg64(v1) {
  7774. self.require(ISA_SSE4_2)
  7775. p.domain = DomainGeneric
  7776. p.add(0, func(m *_Encoding, v []interface{}) {
  7777. m.emit(0xf2)
  7778. m.rexm(1, hcode(v[1]), addr(v[0]))
  7779. m.emit(0x0f)
  7780. m.emit(0x38)
  7781. m.emit(0xf0)
  7782. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  7783. })
  7784. }
  7785. if p.len == 0 {
  7786. panic("invalid operands for CRC32B")
  7787. }
  7788. return p
  7789. }
  7790. // CRC32L performs "Accumulate CRC32 Value".
  7791. //
  7792. // Mnemonic : CRC32
  7793. // Supported forms : (2 forms)
  7794. //
  7795. // * CRC32L r32, r32 [SSE4.2]
  7796. // * CRC32L m32, r32 [SSE4.2]
  7797. //
  7798. func (self *Program) CRC32L(v0 interface{}, v1 interface{}) *Instruction {
  7799. p := self.alloc("CRC32L", 2, Operands { v0, v1 })
  7800. // CRC32L r32, r32
  7801. if isReg32(v0) && isReg32(v1) {
  7802. self.require(ISA_SSE4_2)
  7803. p.domain = DomainGeneric
  7804. p.add(0, func(m *_Encoding, v []interface{}) {
  7805. m.emit(0xf2)
  7806. m.rexo(hcode(v[1]), v[0], false)
  7807. m.emit(0x0f)
  7808. m.emit(0x38)
  7809. m.emit(0xf1)
  7810. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  7811. })
  7812. }
  7813. // CRC32L m32, r32
  7814. if isM32(v0) && isReg32(v1) {
  7815. self.require(ISA_SSE4_2)
  7816. p.domain = DomainGeneric
  7817. p.add(0, func(m *_Encoding, v []interface{}) {
  7818. m.emit(0xf2)
  7819. m.rexo(hcode(v[1]), addr(v[0]), false)
  7820. m.emit(0x0f)
  7821. m.emit(0x38)
  7822. m.emit(0xf1)
  7823. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  7824. })
  7825. }
  7826. if p.len == 0 {
  7827. panic("invalid operands for CRC32L")
  7828. }
  7829. return p
  7830. }
  7831. // CRC32Q performs "Accumulate CRC32 Value".
  7832. //
  7833. // Mnemonic : CRC32
  7834. // Supported forms : (2 forms)
  7835. //
  7836. // * CRC32Q r64, r64 [SSE4.2]
  7837. // * CRC32Q m64, r64 [SSE4.2]
  7838. //
  7839. func (self *Program) CRC32Q(v0 interface{}, v1 interface{}) *Instruction {
  7840. p := self.alloc("CRC32Q", 2, Operands { v0, v1 })
  7841. // CRC32Q r64, r64
  7842. if isReg64(v0) && isReg64(v1) {
  7843. self.require(ISA_SSE4_2)
  7844. p.domain = DomainGeneric
  7845. p.add(0, func(m *_Encoding, v []interface{}) {
  7846. m.emit(0xf2)
  7847. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  7848. m.emit(0x0f)
  7849. m.emit(0x38)
  7850. m.emit(0xf1)
  7851. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  7852. })
  7853. }
  7854. // CRC32Q m64, r64
  7855. if isM64(v0) && isReg64(v1) {
  7856. self.require(ISA_SSE4_2)
  7857. p.domain = DomainGeneric
  7858. p.add(0, func(m *_Encoding, v []interface{}) {
  7859. m.emit(0xf2)
  7860. m.rexm(1, hcode(v[1]), addr(v[0]))
  7861. m.emit(0x0f)
  7862. m.emit(0x38)
  7863. m.emit(0xf1)
  7864. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  7865. })
  7866. }
  7867. if p.len == 0 {
  7868. panic("invalid operands for CRC32Q")
  7869. }
  7870. return p
  7871. }
  7872. // CRC32W performs "Accumulate CRC32 Value".
  7873. //
  7874. // Mnemonic : CRC32
  7875. // Supported forms : (2 forms)
  7876. //
  7877. // * CRC32W r16, r32 [SSE4.2]
  7878. // * CRC32W m16, r32 [SSE4.2]
  7879. //
  7880. func (self *Program) CRC32W(v0 interface{}, v1 interface{}) *Instruction {
  7881. p := self.alloc("CRC32W", 2, Operands { v0, v1 })
  7882. // CRC32W r16, r32
  7883. if isReg16(v0) && isReg32(v1) {
  7884. self.require(ISA_SSE4_2)
  7885. p.domain = DomainGeneric
  7886. p.add(0, func(m *_Encoding, v []interface{}) {
  7887. m.emit(0x66)
  7888. m.emit(0xf2)
  7889. m.rexo(hcode(v[1]), v[0], false)
  7890. m.emit(0x0f)
  7891. m.emit(0x38)
  7892. m.emit(0xf1)
  7893. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  7894. })
  7895. }
  7896. // CRC32W m16, r32
  7897. if isM16(v0) && isReg32(v1) {
  7898. self.require(ISA_SSE4_2)
  7899. p.domain = DomainGeneric
  7900. p.add(0, func(m *_Encoding, v []interface{}) {
  7901. m.emit(0x66)
  7902. m.emit(0xf2)
  7903. m.rexo(hcode(v[1]), addr(v[0]), false)
  7904. m.emit(0x0f)
  7905. m.emit(0x38)
  7906. m.emit(0xf1)
  7907. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  7908. })
  7909. }
  7910. if p.len == 0 {
  7911. panic("invalid operands for CRC32W")
  7912. }
  7913. return p
  7914. }
  7915. // CVTDQ2PD performs "Convert Packed Dword Integers to Packed Double-Precision FP Values".
  7916. //
  7917. // Mnemonic : CVTDQ2PD
  7918. // Supported forms : (2 forms)
  7919. //
  7920. // * CVTDQ2PD xmm, xmm [SSE2]
  7921. // * CVTDQ2PD m64, xmm [SSE2]
  7922. //
  7923. func (self *Program) CVTDQ2PD(v0 interface{}, v1 interface{}) *Instruction {
  7924. p := self.alloc("CVTDQ2PD", 2, Operands { v0, v1 })
  7925. // CVTDQ2PD xmm, xmm
  7926. if isXMM(v0) && isXMM(v1) {
  7927. self.require(ISA_SSE2)
  7928. p.domain = DomainMMXSSE
  7929. p.add(0, func(m *_Encoding, v []interface{}) {
  7930. m.emit(0xf3)
  7931. m.rexo(hcode(v[1]), v[0], false)
  7932. m.emit(0x0f)
  7933. m.emit(0xe6)
  7934. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  7935. })
  7936. }
  7937. // CVTDQ2PD m64, xmm
  7938. if isM64(v0) && isXMM(v1) {
  7939. self.require(ISA_SSE2)
  7940. p.domain = DomainMMXSSE
  7941. p.add(0, func(m *_Encoding, v []interface{}) {
  7942. m.emit(0xf3)
  7943. m.rexo(hcode(v[1]), addr(v[0]), false)
  7944. m.emit(0x0f)
  7945. m.emit(0xe6)
  7946. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  7947. })
  7948. }
  7949. if p.len == 0 {
  7950. panic("invalid operands for CVTDQ2PD")
  7951. }
  7952. return p
  7953. }
  7954. // CVTDQ2PS performs "Convert Packed Dword Integers to Packed Single-Precision FP Values".
  7955. //
  7956. // Mnemonic : CVTDQ2PS
  7957. // Supported forms : (2 forms)
  7958. //
  7959. // * CVTDQ2PS xmm, xmm [SSE2]
  7960. // * CVTDQ2PS m128, xmm [SSE2]
  7961. //
  7962. func (self *Program) CVTDQ2PS(v0 interface{}, v1 interface{}) *Instruction {
  7963. p := self.alloc("CVTDQ2PS", 2, Operands { v0, v1 })
  7964. // CVTDQ2PS xmm, xmm
  7965. if isXMM(v0) && isXMM(v1) {
  7966. self.require(ISA_SSE2)
  7967. p.domain = DomainMMXSSE
  7968. p.add(0, func(m *_Encoding, v []interface{}) {
  7969. m.rexo(hcode(v[1]), v[0], false)
  7970. m.emit(0x0f)
  7971. m.emit(0x5b)
  7972. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  7973. })
  7974. }
  7975. // CVTDQ2PS m128, xmm
  7976. if isM128(v0) && isXMM(v1) {
  7977. self.require(ISA_SSE2)
  7978. p.domain = DomainMMXSSE
  7979. p.add(0, func(m *_Encoding, v []interface{}) {
  7980. m.rexo(hcode(v[1]), addr(v[0]), false)
  7981. m.emit(0x0f)
  7982. m.emit(0x5b)
  7983. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  7984. })
  7985. }
  7986. if p.len == 0 {
  7987. panic("invalid operands for CVTDQ2PS")
  7988. }
  7989. return p
  7990. }
  7991. // CVTPD2DQ performs "Convert Packed Double-Precision FP Values to Packed Dword Integers".
  7992. //
  7993. // Mnemonic : CVTPD2DQ
  7994. // Supported forms : (2 forms)
  7995. //
  7996. // * CVTPD2DQ xmm, xmm [SSE2]
  7997. // * CVTPD2DQ m128, xmm [SSE2]
  7998. //
  7999. func (self *Program) CVTPD2DQ(v0 interface{}, v1 interface{}) *Instruction {
  8000. p := self.alloc("CVTPD2DQ", 2, Operands { v0, v1 })
  8001. // CVTPD2DQ xmm, xmm
  8002. if isXMM(v0) && isXMM(v1) {
  8003. self.require(ISA_SSE2)
  8004. p.domain = DomainMMXSSE
  8005. p.add(0, func(m *_Encoding, v []interface{}) {
  8006. m.emit(0xf2)
  8007. m.rexo(hcode(v[1]), v[0], false)
  8008. m.emit(0x0f)
  8009. m.emit(0xe6)
  8010. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8011. })
  8012. }
  8013. // CVTPD2DQ m128, xmm
  8014. if isM128(v0) && isXMM(v1) {
  8015. self.require(ISA_SSE2)
  8016. p.domain = DomainMMXSSE
  8017. p.add(0, func(m *_Encoding, v []interface{}) {
  8018. m.emit(0xf2)
  8019. m.rexo(hcode(v[1]), addr(v[0]), false)
  8020. m.emit(0x0f)
  8021. m.emit(0xe6)
  8022. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8023. })
  8024. }
  8025. if p.len == 0 {
  8026. panic("invalid operands for CVTPD2DQ")
  8027. }
  8028. return p
  8029. }
  8030. // CVTPD2PI performs "Convert Packed Double-Precision FP Values to Packed Dword Integers".
  8031. //
  8032. // Mnemonic : CVTPD2PI
  8033. // Supported forms : (2 forms)
  8034. //
  8035. // * CVTPD2PI xmm, mm [SSE]
  8036. // * CVTPD2PI m128, mm [SSE]
  8037. //
  8038. func (self *Program) CVTPD2PI(v0 interface{}, v1 interface{}) *Instruction {
  8039. p := self.alloc("CVTPD2PI", 2, Operands { v0, v1 })
  8040. // CVTPD2PI xmm, mm
  8041. if isXMM(v0) && isMM(v1) {
  8042. self.require(ISA_SSE)
  8043. p.domain = DomainMMXSSE
  8044. p.add(0, func(m *_Encoding, v []interface{}) {
  8045. m.emit(0x66)
  8046. m.rexo(hcode(v[1]), v[0], false)
  8047. m.emit(0x0f)
  8048. m.emit(0x2d)
  8049. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8050. })
  8051. }
  8052. // CVTPD2PI m128, mm
  8053. if isM128(v0) && isMM(v1) {
  8054. self.require(ISA_SSE)
  8055. p.domain = DomainMMXSSE
  8056. p.add(0, func(m *_Encoding, v []interface{}) {
  8057. m.emit(0x66)
  8058. m.rexo(hcode(v[1]), addr(v[0]), false)
  8059. m.emit(0x0f)
  8060. m.emit(0x2d)
  8061. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8062. })
  8063. }
  8064. if p.len == 0 {
  8065. panic("invalid operands for CVTPD2PI")
  8066. }
  8067. return p
  8068. }
  8069. // CVTPD2PS performs "Convert Packed Double-Precision FP Values to Packed Single-Precision FP Values".
  8070. //
  8071. // Mnemonic : CVTPD2PS
  8072. // Supported forms : (2 forms)
  8073. //
  8074. // * CVTPD2PS xmm, xmm [SSE2]
  8075. // * CVTPD2PS m128, xmm [SSE2]
  8076. //
  8077. func (self *Program) CVTPD2PS(v0 interface{}, v1 interface{}) *Instruction {
  8078. p := self.alloc("CVTPD2PS", 2, Operands { v0, v1 })
  8079. // CVTPD2PS xmm, xmm
  8080. if isXMM(v0) && isXMM(v1) {
  8081. self.require(ISA_SSE2)
  8082. p.domain = DomainMMXSSE
  8083. p.add(0, func(m *_Encoding, v []interface{}) {
  8084. m.emit(0x66)
  8085. m.rexo(hcode(v[1]), v[0], false)
  8086. m.emit(0x0f)
  8087. m.emit(0x5a)
  8088. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8089. })
  8090. }
  8091. // CVTPD2PS m128, xmm
  8092. if isM128(v0) && isXMM(v1) {
  8093. self.require(ISA_SSE2)
  8094. p.domain = DomainMMXSSE
  8095. p.add(0, func(m *_Encoding, v []interface{}) {
  8096. m.emit(0x66)
  8097. m.rexo(hcode(v[1]), addr(v[0]), false)
  8098. m.emit(0x0f)
  8099. m.emit(0x5a)
  8100. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8101. })
  8102. }
  8103. if p.len == 0 {
  8104. panic("invalid operands for CVTPD2PS")
  8105. }
  8106. return p
  8107. }
  8108. // CVTPI2PD performs "Convert Packed Dword Integers to Packed Double-Precision FP Values".
  8109. //
  8110. // Mnemonic : CVTPI2PD
  8111. // Supported forms : (2 forms)
  8112. //
  8113. // * CVTPI2PD mm, xmm [SSE2]
  8114. // * CVTPI2PD m64, xmm [SSE2]
  8115. //
  8116. func (self *Program) CVTPI2PD(v0 interface{}, v1 interface{}) *Instruction {
  8117. p := self.alloc("CVTPI2PD", 2, Operands { v0, v1 })
  8118. // CVTPI2PD mm, xmm
  8119. if isMM(v0) && isXMM(v1) {
  8120. self.require(ISA_SSE2)
  8121. p.domain = DomainMMXSSE
  8122. p.add(0, func(m *_Encoding, v []interface{}) {
  8123. m.emit(0x66)
  8124. m.rexo(hcode(v[1]), v[0], false)
  8125. m.emit(0x0f)
  8126. m.emit(0x2a)
  8127. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8128. })
  8129. }
  8130. // CVTPI2PD m64, xmm
  8131. if isM64(v0) && isXMM(v1) {
  8132. self.require(ISA_SSE2)
  8133. p.domain = DomainMMXSSE
  8134. p.add(0, func(m *_Encoding, v []interface{}) {
  8135. m.emit(0x66)
  8136. m.rexo(hcode(v[1]), addr(v[0]), false)
  8137. m.emit(0x0f)
  8138. m.emit(0x2a)
  8139. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8140. })
  8141. }
  8142. if p.len == 0 {
  8143. panic("invalid operands for CVTPI2PD")
  8144. }
  8145. return p
  8146. }
  8147. // CVTPI2PS performs "Convert Packed Dword Integers to Packed Single-Precision FP Values".
  8148. //
  8149. // Mnemonic : CVTPI2PS
  8150. // Supported forms : (2 forms)
  8151. //
  8152. // * CVTPI2PS mm, xmm [SSE]
  8153. // * CVTPI2PS m64, xmm [SSE]
  8154. //
  8155. func (self *Program) CVTPI2PS(v0 interface{}, v1 interface{}) *Instruction {
  8156. p := self.alloc("CVTPI2PS", 2, Operands { v0, v1 })
  8157. // CVTPI2PS mm, xmm
  8158. if isMM(v0) && isXMM(v1) {
  8159. self.require(ISA_SSE)
  8160. p.domain = DomainMMXSSE
  8161. p.add(0, func(m *_Encoding, v []interface{}) {
  8162. m.rexo(hcode(v[1]), v[0], false)
  8163. m.emit(0x0f)
  8164. m.emit(0x2a)
  8165. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8166. })
  8167. }
  8168. // CVTPI2PS m64, xmm
  8169. if isM64(v0) && isXMM(v1) {
  8170. self.require(ISA_SSE)
  8171. p.domain = DomainMMXSSE
  8172. p.add(0, func(m *_Encoding, v []interface{}) {
  8173. m.rexo(hcode(v[1]), addr(v[0]), false)
  8174. m.emit(0x0f)
  8175. m.emit(0x2a)
  8176. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8177. })
  8178. }
  8179. if p.len == 0 {
  8180. panic("invalid operands for CVTPI2PS")
  8181. }
  8182. return p
  8183. }
  8184. // CVTPS2DQ performs "Convert Packed Single-Precision FP Values to Packed Dword Integers".
  8185. //
  8186. // Mnemonic : CVTPS2DQ
  8187. // Supported forms : (2 forms)
  8188. //
  8189. // * CVTPS2DQ xmm, xmm [SSE2]
  8190. // * CVTPS2DQ m128, xmm [SSE2]
  8191. //
  8192. func (self *Program) CVTPS2DQ(v0 interface{}, v1 interface{}) *Instruction {
  8193. p := self.alloc("CVTPS2DQ", 2, Operands { v0, v1 })
  8194. // CVTPS2DQ xmm, xmm
  8195. if isXMM(v0) && isXMM(v1) {
  8196. self.require(ISA_SSE2)
  8197. p.domain = DomainMMXSSE
  8198. p.add(0, func(m *_Encoding, v []interface{}) {
  8199. m.emit(0x66)
  8200. m.rexo(hcode(v[1]), v[0], false)
  8201. m.emit(0x0f)
  8202. m.emit(0x5b)
  8203. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8204. })
  8205. }
  8206. // CVTPS2DQ m128, xmm
  8207. if isM128(v0) && isXMM(v1) {
  8208. self.require(ISA_SSE2)
  8209. p.domain = DomainMMXSSE
  8210. p.add(0, func(m *_Encoding, v []interface{}) {
  8211. m.emit(0x66)
  8212. m.rexo(hcode(v[1]), addr(v[0]), false)
  8213. m.emit(0x0f)
  8214. m.emit(0x5b)
  8215. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8216. })
  8217. }
  8218. if p.len == 0 {
  8219. panic("invalid operands for CVTPS2DQ")
  8220. }
  8221. return p
  8222. }
  8223. // CVTPS2PD performs "Convert Packed Single-Precision FP Values to Packed Double-Precision FP Values".
  8224. //
  8225. // Mnemonic : CVTPS2PD
  8226. // Supported forms : (2 forms)
  8227. //
  8228. // * CVTPS2PD xmm, xmm [SSE2]
  8229. // * CVTPS2PD m64, xmm [SSE2]
  8230. //
  8231. func (self *Program) CVTPS2PD(v0 interface{}, v1 interface{}) *Instruction {
  8232. p := self.alloc("CVTPS2PD", 2, Operands { v0, v1 })
  8233. // CVTPS2PD xmm, xmm
  8234. if isXMM(v0) && isXMM(v1) {
  8235. self.require(ISA_SSE2)
  8236. p.domain = DomainMMXSSE
  8237. p.add(0, func(m *_Encoding, v []interface{}) {
  8238. m.rexo(hcode(v[1]), v[0], false)
  8239. m.emit(0x0f)
  8240. m.emit(0x5a)
  8241. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8242. })
  8243. }
  8244. // CVTPS2PD m64, xmm
  8245. if isM64(v0) && isXMM(v1) {
  8246. self.require(ISA_SSE2)
  8247. p.domain = DomainMMXSSE
  8248. p.add(0, func(m *_Encoding, v []interface{}) {
  8249. m.rexo(hcode(v[1]), addr(v[0]), false)
  8250. m.emit(0x0f)
  8251. m.emit(0x5a)
  8252. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8253. })
  8254. }
  8255. if p.len == 0 {
  8256. panic("invalid operands for CVTPS2PD")
  8257. }
  8258. return p
  8259. }
  8260. // CVTPS2PI performs "Convert Packed Single-Precision FP Values to Packed Dword Integers".
  8261. //
  8262. // Mnemonic : CVTPS2PI
  8263. // Supported forms : (2 forms)
  8264. //
  8265. // * CVTPS2PI xmm, mm [SSE]
  8266. // * CVTPS2PI m64, mm [SSE]
  8267. //
  8268. func (self *Program) CVTPS2PI(v0 interface{}, v1 interface{}) *Instruction {
  8269. p := self.alloc("CVTPS2PI", 2, Operands { v0, v1 })
  8270. // CVTPS2PI xmm, mm
  8271. if isXMM(v0) && isMM(v1) {
  8272. self.require(ISA_SSE)
  8273. p.domain = DomainMMXSSE
  8274. p.add(0, func(m *_Encoding, v []interface{}) {
  8275. m.rexo(hcode(v[1]), v[0], false)
  8276. m.emit(0x0f)
  8277. m.emit(0x2d)
  8278. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8279. })
  8280. }
  8281. // CVTPS2PI m64, mm
  8282. if isM64(v0) && isMM(v1) {
  8283. self.require(ISA_SSE)
  8284. p.domain = DomainMMXSSE
  8285. p.add(0, func(m *_Encoding, v []interface{}) {
  8286. m.rexo(hcode(v[1]), addr(v[0]), false)
  8287. m.emit(0x0f)
  8288. m.emit(0x2d)
  8289. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8290. })
  8291. }
  8292. if p.len == 0 {
  8293. panic("invalid operands for CVTPS2PI")
  8294. }
  8295. return p
  8296. }
  8297. // CVTSD2SI performs "Convert Scalar Double-Precision FP Value to Integer".
  8298. //
  8299. // Mnemonic : CVTSD2SI
  8300. // Supported forms : (4 forms)
  8301. //
  8302. // * CVTSD2SI xmm, r32 [SSE2]
  8303. // * CVTSD2SI m64, r32 [SSE2]
  8304. // * CVTSD2SI xmm, r64 [SSE2]
  8305. // * CVTSD2SI m64, r64 [SSE2]
  8306. //
  8307. func (self *Program) CVTSD2SI(v0 interface{}, v1 interface{}) *Instruction {
  8308. p := self.alloc("CVTSD2SI", 2, Operands { v0, v1 })
  8309. // CVTSD2SI xmm, r32
  8310. if isXMM(v0) && isReg32(v1) {
  8311. self.require(ISA_SSE2)
  8312. p.domain = DomainMMXSSE
  8313. p.add(0, func(m *_Encoding, v []interface{}) {
  8314. m.emit(0xf2)
  8315. m.rexo(hcode(v[1]), v[0], false)
  8316. m.emit(0x0f)
  8317. m.emit(0x2d)
  8318. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8319. })
  8320. }
  8321. // CVTSD2SI m64, r32
  8322. if isM64(v0) && isReg32(v1) {
  8323. self.require(ISA_SSE2)
  8324. p.domain = DomainMMXSSE
  8325. p.add(0, func(m *_Encoding, v []interface{}) {
  8326. m.emit(0xf2)
  8327. m.rexo(hcode(v[1]), addr(v[0]), false)
  8328. m.emit(0x0f)
  8329. m.emit(0x2d)
  8330. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8331. })
  8332. }
  8333. // CVTSD2SI xmm, r64
  8334. if isXMM(v0) && isReg64(v1) {
  8335. self.require(ISA_SSE2)
  8336. p.domain = DomainMMXSSE
  8337. p.add(0, func(m *_Encoding, v []interface{}) {
  8338. m.emit(0xf2)
  8339. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  8340. m.emit(0x0f)
  8341. m.emit(0x2d)
  8342. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8343. })
  8344. }
  8345. // CVTSD2SI m64, r64
  8346. if isM64(v0) && isReg64(v1) {
  8347. self.require(ISA_SSE2)
  8348. p.domain = DomainMMXSSE
  8349. p.add(0, func(m *_Encoding, v []interface{}) {
  8350. m.emit(0xf2)
  8351. m.rexm(1, hcode(v[1]), addr(v[0]))
  8352. m.emit(0x0f)
  8353. m.emit(0x2d)
  8354. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8355. })
  8356. }
  8357. if p.len == 0 {
  8358. panic("invalid operands for CVTSD2SI")
  8359. }
  8360. return p
  8361. }
  8362. // CVTSD2SS performs "Convert Scalar Double-Precision FP Value to Scalar Single-Precision FP Value".
  8363. //
  8364. // Mnemonic : CVTSD2SS
  8365. // Supported forms : (2 forms)
  8366. //
  8367. // * CVTSD2SS xmm, xmm [SSE2]
  8368. // * CVTSD2SS m64, xmm [SSE2]
  8369. //
  8370. func (self *Program) CVTSD2SS(v0 interface{}, v1 interface{}) *Instruction {
  8371. p := self.alloc("CVTSD2SS", 2, Operands { v0, v1 })
  8372. // CVTSD2SS xmm, xmm
  8373. if isXMM(v0) && isXMM(v1) {
  8374. self.require(ISA_SSE2)
  8375. p.domain = DomainMMXSSE
  8376. p.add(0, func(m *_Encoding, v []interface{}) {
  8377. m.emit(0xf2)
  8378. m.rexo(hcode(v[1]), v[0], false)
  8379. m.emit(0x0f)
  8380. m.emit(0x5a)
  8381. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8382. })
  8383. }
  8384. // CVTSD2SS m64, xmm
  8385. if isM64(v0) && isXMM(v1) {
  8386. self.require(ISA_SSE2)
  8387. p.domain = DomainMMXSSE
  8388. p.add(0, func(m *_Encoding, v []interface{}) {
  8389. m.emit(0xf2)
  8390. m.rexo(hcode(v[1]), addr(v[0]), false)
  8391. m.emit(0x0f)
  8392. m.emit(0x5a)
  8393. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8394. })
  8395. }
  8396. if p.len == 0 {
  8397. panic("invalid operands for CVTSD2SS")
  8398. }
  8399. return p
  8400. }
  8401. // CVTSI2SD performs "Convert Dword Integer to Scalar Double-Precision FP Value".
  8402. //
  8403. // Mnemonic : CVTSI2SD
  8404. // Supported forms : (4 forms)
  8405. //
  8406. // * CVTSI2SD r32, xmm [SSE2]
  8407. // * CVTSI2SD r64, xmm [SSE2]
  8408. // * CVTSI2SD m32, xmm [SSE2]
  8409. // * CVTSI2SD m64, xmm [SSE2]
  8410. //
  8411. func (self *Program) CVTSI2SD(v0 interface{}, v1 interface{}) *Instruction {
  8412. p := self.alloc("CVTSI2SD", 2, Operands { v0, v1 })
  8413. // CVTSI2SD r32, xmm
  8414. if isReg32(v0) && isXMM(v1) {
  8415. self.require(ISA_SSE2)
  8416. p.domain = DomainMMXSSE
  8417. p.add(0, func(m *_Encoding, v []interface{}) {
  8418. m.emit(0xf2)
  8419. m.rexo(hcode(v[1]), v[0], false)
  8420. m.emit(0x0f)
  8421. m.emit(0x2a)
  8422. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8423. })
  8424. }
  8425. // CVTSI2SD r64, xmm
  8426. if isReg64(v0) && isXMM(v1) {
  8427. self.require(ISA_SSE2)
  8428. p.domain = DomainMMXSSE
  8429. p.add(0, func(m *_Encoding, v []interface{}) {
  8430. m.emit(0xf2)
  8431. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  8432. m.emit(0x0f)
  8433. m.emit(0x2a)
  8434. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8435. })
  8436. }
  8437. // CVTSI2SD m32, xmm
  8438. if isM32(v0) && isXMM(v1) {
  8439. self.require(ISA_SSE2)
  8440. p.domain = DomainMMXSSE
  8441. p.add(0, func(m *_Encoding, v []interface{}) {
  8442. m.emit(0xf2)
  8443. m.rexo(hcode(v[1]), addr(v[0]), false)
  8444. m.emit(0x0f)
  8445. m.emit(0x2a)
  8446. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8447. })
  8448. }
  8449. // CVTSI2SD m64, xmm
  8450. if isM64(v0) && isXMM(v1) {
  8451. self.require(ISA_SSE2)
  8452. p.domain = DomainMMXSSE
  8453. p.add(0, func(m *_Encoding, v []interface{}) {
  8454. m.emit(0xf2)
  8455. m.rexm(1, hcode(v[1]), addr(v[0]))
  8456. m.emit(0x0f)
  8457. m.emit(0x2a)
  8458. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8459. })
  8460. }
  8461. if p.len == 0 {
  8462. panic("invalid operands for CVTSI2SD")
  8463. }
  8464. return p
  8465. }
  8466. // CVTSI2SS performs "Convert Dword Integer to Scalar Single-Precision FP Value".
  8467. //
  8468. // Mnemonic : CVTSI2SS
  8469. // Supported forms : (4 forms)
  8470. //
  8471. // * CVTSI2SS r32, xmm [SSE]
  8472. // * CVTSI2SS r64, xmm [SSE]
  8473. // * CVTSI2SS m32, xmm [SSE]
  8474. // * CVTSI2SS m64, xmm [SSE]
  8475. //
  8476. func (self *Program) CVTSI2SS(v0 interface{}, v1 interface{}) *Instruction {
  8477. p := self.alloc("CVTSI2SS", 2, Operands { v0, v1 })
  8478. // CVTSI2SS r32, xmm
  8479. if isReg32(v0) && isXMM(v1) {
  8480. self.require(ISA_SSE)
  8481. p.domain = DomainMMXSSE
  8482. p.add(0, func(m *_Encoding, v []interface{}) {
  8483. m.emit(0xf3)
  8484. m.rexo(hcode(v[1]), v[0], false)
  8485. m.emit(0x0f)
  8486. m.emit(0x2a)
  8487. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8488. })
  8489. }
  8490. // CVTSI2SS r64, xmm
  8491. if isReg64(v0) && isXMM(v1) {
  8492. self.require(ISA_SSE)
  8493. p.domain = DomainMMXSSE
  8494. p.add(0, func(m *_Encoding, v []interface{}) {
  8495. m.emit(0xf3)
  8496. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  8497. m.emit(0x0f)
  8498. m.emit(0x2a)
  8499. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8500. })
  8501. }
  8502. // CVTSI2SS m32, xmm
  8503. if isM32(v0) && isXMM(v1) {
  8504. self.require(ISA_SSE)
  8505. p.domain = DomainMMXSSE
  8506. p.add(0, func(m *_Encoding, v []interface{}) {
  8507. m.emit(0xf3)
  8508. m.rexo(hcode(v[1]), addr(v[0]), false)
  8509. m.emit(0x0f)
  8510. m.emit(0x2a)
  8511. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8512. })
  8513. }
  8514. // CVTSI2SS m64, xmm
  8515. if isM64(v0) && isXMM(v1) {
  8516. self.require(ISA_SSE)
  8517. p.domain = DomainMMXSSE
  8518. p.add(0, func(m *_Encoding, v []interface{}) {
  8519. m.emit(0xf3)
  8520. m.rexm(1, hcode(v[1]), addr(v[0]))
  8521. m.emit(0x0f)
  8522. m.emit(0x2a)
  8523. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8524. })
  8525. }
  8526. if p.len == 0 {
  8527. panic("invalid operands for CVTSI2SS")
  8528. }
  8529. return p
  8530. }
  8531. // CVTSS2SD performs "Convert Scalar Single-Precision FP Value to Scalar Double-Precision FP Value".
  8532. //
  8533. // Mnemonic : CVTSS2SD
  8534. // Supported forms : (2 forms)
  8535. //
  8536. // * CVTSS2SD xmm, xmm [SSE2]
  8537. // * CVTSS2SD m32, xmm [SSE2]
  8538. //
  8539. func (self *Program) CVTSS2SD(v0 interface{}, v1 interface{}) *Instruction {
  8540. p := self.alloc("CVTSS2SD", 2, Operands { v0, v1 })
  8541. // CVTSS2SD xmm, xmm
  8542. if isXMM(v0) && isXMM(v1) {
  8543. self.require(ISA_SSE2)
  8544. p.domain = DomainMMXSSE
  8545. p.add(0, func(m *_Encoding, v []interface{}) {
  8546. m.emit(0xf3)
  8547. m.rexo(hcode(v[1]), v[0], false)
  8548. m.emit(0x0f)
  8549. m.emit(0x5a)
  8550. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8551. })
  8552. }
  8553. // CVTSS2SD m32, xmm
  8554. if isM32(v0) && isXMM(v1) {
  8555. self.require(ISA_SSE2)
  8556. p.domain = DomainMMXSSE
  8557. p.add(0, func(m *_Encoding, v []interface{}) {
  8558. m.emit(0xf3)
  8559. m.rexo(hcode(v[1]), addr(v[0]), false)
  8560. m.emit(0x0f)
  8561. m.emit(0x5a)
  8562. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8563. })
  8564. }
  8565. if p.len == 0 {
  8566. panic("invalid operands for CVTSS2SD")
  8567. }
  8568. return p
  8569. }
  8570. // CVTSS2SI performs "Convert Scalar Single-Precision FP Value to Dword Integer".
  8571. //
  8572. // Mnemonic : CVTSS2SI
  8573. // Supported forms : (4 forms)
  8574. //
  8575. // * CVTSS2SI xmm, r32 [SSE]
  8576. // * CVTSS2SI m32, r32 [SSE]
  8577. // * CVTSS2SI xmm, r64 [SSE]
  8578. // * CVTSS2SI m32, r64 [SSE]
  8579. //
  8580. func (self *Program) CVTSS2SI(v0 interface{}, v1 interface{}) *Instruction {
  8581. p := self.alloc("CVTSS2SI", 2, Operands { v0, v1 })
  8582. // CVTSS2SI xmm, r32
  8583. if isXMM(v0) && isReg32(v1) {
  8584. self.require(ISA_SSE)
  8585. p.domain = DomainMMXSSE
  8586. p.add(0, func(m *_Encoding, v []interface{}) {
  8587. m.emit(0xf3)
  8588. m.rexo(hcode(v[1]), v[0], false)
  8589. m.emit(0x0f)
  8590. m.emit(0x2d)
  8591. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8592. })
  8593. }
  8594. // CVTSS2SI m32, r32
  8595. if isM32(v0) && isReg32(v1) {
  8596. self.require(ISA_SSE)
  8597. p.domain = DomainMMXSSE
  8598. p.add(0, func(m *_Encoding, v []interface{}) {
  8599. m.emit(0xf3)
  8600. m.rexo(hcode(v[1]), addr(v[0]), false)
  8601. m.emit(0x0f)
  8602. m.emit(0x2d)
  8603. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8604. })
  8605. }
  8606. // CVTSS2SI xmm, r64
  8607. if isXMM(v0) && isReg64(v1) {
  8608. self.require(ISA_SSE)
  8609. p.domain = DomainMMXSSE
  8610. p.add(0, func(m *_Encoding, v []interface{}) {
  8611. m.emit(0xf3)
  8612. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  8613. m.emit(0x0f)
  8614. m.emit(0x2d)
  8615. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8616. })
  8617. }
  8618. // CVTSS2SI m32, r64
  8619. if isM32(v0) && isReg64(v1) {
  8620. self.require(ISA_SSE)
  8621. p.domain = DomainMMXSSE
  8622. p.add(0, func(m *_Encoding, v []interface{}) {
  8623. m.emit(0xf3)
  8624. m.rexm(1, hcode(v[1]), addr(v[0]))
  8625. m.emit(0x0f)
  8626. m.emit(0x2d)
  8627. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8628. })
  8629. }
  8630. if p.len == 0 {
  8631. panic("invalid operands for CVTSS2SI")
  8632. }
  8633. return p
  8634. }
  8635. // CVTTPD2DQ performs "Convert with Truncation Packed Double-Precision FP Values to Packed Dword Integers".
  8636. //
  8637. // Mnemonic : CVTTPD2DQ
  8638. // Supported forms : (2 forms)
  8639. //
  8640. // * CVTTPD2DQ xmm, xmm [SSE2]
  8641. // * CVTTPD2DQ m128, xmm [SSE2]
  8642. //
  8643. func (self *Program) CVTTPD2DQ(v0 interface{}, v1 interface{}) *Instruction {
  8644. p := self.alloc("CVTTPD2DQ", 2, Operands { v0, v1 })
  8645. // CVTTPD2DQ xmm, xmm
  8646. if isXMM(v0) && isXMM(v1) {
  8647. self.require(ISA_SSE2)
  8648. p.domain = DomainMMXSSE
  8649. p.add(0, func(m *_Encoding, v []interface{}) {
  8650. m.emit(0x66)
  8651. m.rexo(hcode(v[1]), v[0], false)
  8652. m.emit(0x0f)
  8653. m.emit(0xe6)
  8654. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8655. })
  8656. }
  8657. // CVTTPD2DQ m128, xmm
  8658. if isM128(v0) && isXMM(v1) {
  8659. self.require(ISA_SSE2)
  8660. p.domain = DomainMMXSSE
  8661. p.add(0, func(m *_Encoding, v []interface{}) {
  8662. m.emit(0x66)
  8663. m.rexo(hcode(v[1]), addr(v[0]), false)
  8664. m.emit(0x0f)
  8665. m.emit(0xe6)
  8666. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8667. })
  8668. }
  8669. if p.len == 0 {
  8670. panic("invalid operands for CVTTPD2DQ")
  8671. }
  8672. return p
  8673. }
  8674. // CVTTPD2PI performs "Convert with Truncation Packed Double-Precision FP Values to Packed Dword Integers".
  8675. //
  8676. // Mnemonic : CVTTPD2PI
  8677. // Supported forms : (2 forms)
  8678. //
  8679. // * CVTTPD2PI xmm, mm [SSE2]
  8680. // * CVTTPD2PI m128, mm [SSE2]
  8681. //
  8682. func (self *Program) CVTTPD2PI(v0 interface{}, v1 interface{}) *Instruction {
  8683. p := self.alloc("CVTTPD2PI", 2, Operands { v0, v1 })
  8684. // CVTTPD2PI xmm, mm
  8685. if isXMM(v0) && isMM(v1) {
  8686. self.require(ISA_SSE2)
  8687. p.domain = DomainMMXSSE
  8688. p.add(0, func(m *_Encoding, v []interface{}) {
  8689. m.emit(0x66)
  8690. m.rexo(hcode(v[1]), v[0], false)
  8691. m.emit(0x0f)
  8692. m.emit(0x2c)
  8693. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8694. })
  8695. }
  8696. // CVTTPD2PI m128, mm
  8697. if isM128(v0) && isMM(v1) {
  8698. self.require(ISA_SSE2)
  8699. p.domain = DomainMMXSSE
  8700. p.add(0, func(m *_Encoding, v []interface{}) {
  8701. m.emit(0x66)
  8702. m.rexo(hcode(v[1]), addr(v[0]), false)
  8703. m.emit(0x0f)
  8704. m.emit(0x2c)
  8705. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8706. })
  8707. }
  8708. if p.len == 0 {
  8709. panic("invalid operands for CVTTPD2PI")
  8710. }
  8711. return p
  8712. }
  8713. // CVTTPS2DQ performs "Convert with Truncation Packed Single-Precision FP Values to Packed Dword Integers".
  8714. //
  8715. // Mnemonic : CVTTPS2DQ
  8716. // Supported forms : (2 forms)
  8717. //
  8718. // * CVTTPS2DQ xmm, xmm [SSE2]
  8719. // * CVTTPS2DQ m128, xmm [SSE2]
  8720. //
  8721. func (self *Program) CVTTPS2DQ(v0 interface{}, v1 interface{}) *Instruction {
  8722. p := self.alloc("CVTTPS2DQ", 2, Operands { v0, v1 })
  8723. // CVTTPS2DQ xmm, xmm
  8724. if isXMM(v0) && isXMM(v1) {
  8725. self.require(ISA_SSE2)
  8726. p.domain = DomainMMXSSE
  8727. p.add(0, func(m *_Encoding, v []interface{}) {
  8728. m.emit(0xf3)
  8729. m.rexo(hcode(v[1]), v[0], false)
  8730. m.emit(0x0f)
  8731. m.emit(0x5b)
  8732. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8733. })
  8734. }
  8735. // CVTTPS2DQ m128, xmm
  8736. if isM128(v0) && isXMM(v1) {
  8737. self.require(ISA_SSE2)
  8738. p.domain = DomainMMXSSE
  8739. p.add(0, func(m *_Encoding, v []interface{}) {
  8740. m.emit(0xf3)
  8741. m.rexo(hcode(v[1]), addr(v[0]), false)
  8742. m.emit(0x0f)
  8743. m.emit(0x5b)
  8744. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8745. })
  8746. }
  8747. if p.len == 0 {
  8748. panic("invalid operands for CVTTPS2DQ")
  8749. }
  8750. return p
  8751. }
  8752. // CVTTPS2PI performs "Convert with Truncation Packed Single-Precision FP Values to Packed Dword Integers".
  8753. //
  8754. // Mnemonic : CVTTPS2PI
  8755. // Supported forms : (2 forms)
  8756. //
  8757. // * CVTTPS2PI xmm, mm [SSE]
  8758. // * CVTTPS2PI m64, mm [SSE]
  8759. //
  8760. func (self *Program) CVTTPS2PI(v0 interface{}, v1 interface{}) *Instruction {
  8761. p := self.alloc("CVTTPS2PI", 2, Operands { v0, v1 })
  8762. // CVTTPS2PI xmm, mm
  8763. if isXMM(v0) && isMM(v1) {
  8764. self.require(ISA_SSE)
  8765. p.domain = DomainMMXSSE
  8766. p.add(0, func(m *_Encoding, v []interface{}) {
  8767. m.rexo(hcode(v[1]), v[0], false)
  8768. m.emit(0x0f)
  8769. m.emit(0x2c)
  8770. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8771. })
  8772. }
  8773. // CVTTPS2PI m64, mm
  8774. if isM64(v0) && isMM(v1) {
  8775. self.require(ISA_SSE)
  8776. p.domain = DomainMMXSSE
  8777. p.add(0, func(m *_Encoding, v []interface{}) {
  8778. m.rexo(hcode(v[1]), addr(v[0]), false)
  8779. m.emit(0x0f)
  8780. m.emit(0x2c)
  8781. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8782. })
  8783. }
  8784. if p.len == 0 {
  8785. panic("invalid operands for CVTTPS2PI")
  8786. }
  8787. return p
  8788. }
  8789. // CVTTSD2SI performs "Convert with Truncation Scalar Double-Precision FP Value to Signed Integer".
  8790. //
  8791. // Mnemonic : CVTTSD2SI
  8792. // Supported forms : (4 forms)
  8793. //
  8794. // * CVTTSD2SI xmm, r32 [SSE2]
  8795. // * CVTTSD2SI m64, r32 [SSE2]
  8796. // * CVTTSD2SI xmm, r64 [SSE2]
  8797. // * CVTTSD2SI m64, r64 [SSE2]
  8798. //
  8799. func (self *Program) CVTTSD2SI(v0 interface{}, v1 interface{}) *Instruction {
  8800. p := self.alloc("CVTTSD2SI", 2, Operands { v0, v1 })
  8801. // CVTTSD2SI xmm, r32
  8802. if isXMM(v0) && isReg32(v1) {
  8803. self.require(ISA_SSE2)
  8804. p.domain = DomainMMXSSE
  8805. p.add(0, func(m *_Encoding, v []interface{}) {
  8806. m.emit(0xf2)
  8807. m.rexo(hcode(v[1]), v[0], false)
  8808. m.emit(0x0f)
  8809. m.emit(0x2c)
  8810. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8811. })
  8812. }
  8813. // CVTTSD2SI m64, r32
  8814. if isM64(v0) && isReg32(v1) {
  8815. self.require(ISA_SSE2)
  8816. p.domain = DomainMMXSSE
  8817. p.add(0, func(m *_Encoding, v []interface{}) {
  8818. m.emit(0xf2)
  8819. m.rexo(hcode(v[1]), addr(v[0]), false)
  8820. m.emit(0x0f)
  8821. m.emit(0x2c)
  8822. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8823. })
  8824. }
  8825. // CVTTSD2SI xmm, r64
  8826. if isXMM(v0) && isReg64(v1) {
  8827. self.require(ISA_SSE2)
  8828. p.domain = DomainMMXSSE
  8829. p.add(0, func(m *_Encoding, v []interface{}) {
  8830. m.emit(0xf2)
  8831. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  8832. m.emit(0x0f)
  8833. m.emit(0x2c)
  8834. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8835. })
  8836. }
  8837. // CVTTSD2SI m64, r64
  8838. if isM64(v0) && isReg64(v1) {
  8839. self.require(ISA_SSE2)
  8840. p.domain = DomainMMXSSE
  8841. p.add(0, func(m *_Encoding, v []interface{}) {
  8842. m.emit(0xf2)
  8843. m.rexm(1, hcode(v[1]), addr(v[0]))
  8844. m.emit(0x0f)
  8845. m.emit(0x2c)
  8846. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8847. })
  8848. }
  8849. if p.len == 0 {
  8850. panic("invalid operands for CVTTSD2SI")
  8851. }
  8852. return p
  8853. }
  8854. // CVTTSS2SI performs "Convert with Truncation Scalar Single-Precision FP Value to Dword Integer".
  8855. //
  8856. // Mnemonic : CVTTSS2SI
  8857. // Supported forms : (4 forms)
  8858. //
  8859. // * CVTTSS2SI xmm, r32 [SSE]
  8860. // * CVTTSS2SI m32, r32 [SSE]
  8861. // * CVTTSS2SI xmm, r64 [SSE]
  8862. // * CVTTSS2SI m32, r64 [SSE]
  8863. //
  8864. func (self *Program) CVTTSS2SI(v0 interface{}, v1 interface{}) *Instruction {
  8865. p := self.alloc("CVTTSS2SI", 2, Operands { v0, v1 })
  8866. // CVTTSS2SI xmm, r32
  8867. if isXMM(v0) && isReg32(v1) {
  8868. self.require(ISA_SSE)
  8869. p.domain = DomainMMXSSE
  8870. p.add(0, func(m *_Encoding, v []interface{}) {
  8871. m.emit(0xf3)
  8872. m.rexo(hcode(v[1]), v[0], false)
  8873. m.emit(0x0f)
  8874. m.emit(0x2c)
  8875. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8876. })
  8877. }
  8878. // CVTTSS2SI m32, r32
  8879. if isM32(v0) && isReg32(v1) {
  8880. self.require(ISA_SSE)
  8881. p.domain = DomainMMXSSE
  8882. p.add(0, func(m *_Encoding, v []interface{}) {
  8883. m.emit(0xf3)
  8884. m.rexo(hcode(v[1]), addr(v[0]), false)
  8885. m.emit(0x0f)
  8886. m.emit(0x2c)
  8887. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8888. })
  8889. }
  8890. // CVTTSS2SI xmm, r64
  8891. if isXMM(v0) && isReg64(v1) {
  8892. self.require(ISA_SSE)
  8893. p.domain = DomainMMXSSE
  8894. p.add(0, func(m *_Encoding, v []interface{}) {
  8895. m.emit(0xf3)
  8896. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  8897. m.emit(0x0f)
  8898. m.emit(0x2c)
  8899. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  8900. })
  8901. }
  8902. // CVTTSS2SI m32, r64
  8903. if isM32(v0) && isReg64(v1) {
  8904. self.require(ISA_SSE)
  8905. p.domain = DomainMMXSSE
  8906. p.add(0, func(m *_Encoding, v []interface{}) {
  8907. m.emit(0xf3)
  8908. m.rexm(1, hcode(v[1]), addr(v[0]))
  8909. m.emit(0x0f)
  8910. m.emit(0x2c)
  8911. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  8912. })
  8913. }
  8914. if p.len == 0 {
  8915. panic("invalid operands for CVTTSS2SI")
  8916. }
  8917. return p
  8918. }
  8919. // CWTD performs "Convert Word to Doubleword".
  8920. //
  8921. // Mnemonic : CWD
  8922. // Supported forms : (1 form)
  8923. //
  8924. // * CWTD
  8925. //
  8926. func (self *Program) CWTD() *Instruction {
  8927. p := self.alloc("CWTD", 0, Operands { })
  8928. // CWTD
  8929. p.domain = DomainGeneric
  8930. p.add(0, func(m *_Encoding, v []interface{}) {
  8931. m.emit(0x66)
  8932. m.emit(0x99)
  8933. })
  8934. return p
  8935. }
  8936. // CWTL performs "Convert Word to Doubleword".
  8937. //
  8938. // Mnemonic : CWDE
  8939. // Supported forms : (1 form)
  8940. //
  8941. // * CWTL
  8942. //
  8943. func (self *Program) CWTL() *Instruction {
  8944. p := self.alloc("CWTL", 0, Operands { })
  8945. // CWTL
  8946. p.domain = DomainGeneric
  8947. p.add(0, func(m *_Encoding, v []interface{}) {
  8948. m.emit(0x98)
  8949. })
  8950. return p
  8951. }
  8952. // DECB performs "Decrement by 1".
  8953. //
  8954. // Mnemonic : DEC
  8955. // Supported forms : (2 forms)
  8956. //
  8957. // * DECB r8
  8958. // * DECB m8
  8959. //
  8960. func (self *Program) DECB(v0 interface{}) *Instruction {
  8961. p := self.alloc("DECB", 1, Operands { v0 })
  8962. // DECB r8
  8963. if isReg8(v0) {
  8964. p.domain = DomainGeneric
  8965. p.add(0, func(m *_Encoding, v []interface{}) {
  8966. m.rexo(0, v[0], isReg8REX(v[0]))
  8967. m.emit(0xfe)
  8968. m.emit(0xc8 | lcode(v[0]))
  8969. })
  8970. }
  8971. // DECB m8
  8972. if isM8(v0) {
  8973. p.domain = DomainGeneric
  8974. p.add(0, func(m *_Encoding, v []interface{}) {
  8975. m.rexo(0, addr(v[0]), false)
  8976. m.emit(0xfe)
  8977. m.mrsd(1, addr(v[0]), 1)
  8978. })
  8979. }
  8980. if p.len == 0 {
  8981. panic("invalid operands for DECB")
  8982. }
  8983. return p
  8984. }
  8985. // DECL performs "Decrement by 1".
  8986. //
  8987. // Mnemonic : DEC
  8988. // Supported forms : (2 forms)
  8989. //
  8990. // * DECL r32
  8991. // * DECL m32
  8992. //
  8993. func (self *Program) DECL(v0 interface{}) *Instruction {
  8994. p := self.alloc("DECL", 1, Operands { v0 })
  8995. // DECL r32
  8996. if isReg32(v0) {
  8997. p.domain = DomainGeneric
  8998. p.add(0, func(m *_Encoding, v []interface{}) {
  8999. m.rexo(0, v[0], false)
  9000. m.emit(0xff)
  9001. m.emit(0xc8 | lcode(v[0]))
  9002. })
  9003. }
  9004. // DECL m32
  9005. if isM32(v0) {
  9006. p.domain = DomainGeneric
  9007. p.add(0, func(m *_Encoding, v []interface{}) {
  9008. m.rexo(0, addr(v[0]), false)
  9009. m.emit(0xff)
  9010. m.mrsd(1, addr(v[0]), 1)
  9011. })
  9012. }
  9013. if p.len == 0 {
  9014. panic("invalid operands for DECL")
  9015. }
  9016. return p
  9017. }
  9018. // DECQ performs "Decrement by 1".
  9019. //
  9020. // Mnemonic : DEC
  9021. // Supported forms : (2 forms)
  9022. //
  9023. // * DECQ r64
  9024. // * DECQ m64
  9025. //
  9026. func (self *Program) DECQ(v0 interface{}) *Instruction {
  9027. p := self.alloc("DECQ", 1, Operands { v0 })
  9028. // DECQ r64
  9029. if isReg64(v0) {
  9030. p.domain = DomainGeneric
  9031. p.add(0, func(m *_Encoding, v []interface{}) {
  9032. m.emit(0x48 | hcode(v[0]))
  9033. m.emit(0xff)
  9034. m.emit(0xc8 | lcode(v[0]))
  9035. })
  9036. }
  9037. // DECQ m64
  9038. if isM64(v0) {
  9039. p.domain = DomainGeneric
  9040. p.add(0, func(m *_Encoding, v []interface{}) {
  9041. m.rexm(1, 0, addr(v[0]))
  9042. m.emit(0xff)
  9043. m.mrsd(1, addr(v[0]), 1)
  9044. })
  9045. }
  9046. if p.len == 0 {
  9047. panic("invalid operands for DECQ")
  9048. }
  9049. return p
  9050. }
  9051. // DECW performs "Decrement by 1".
  9052. //
  9053. // Mnemonic : DEC
  9054. // Supported forms : (2 forms)
  9055. //
  9056. // * DECW r16
  9057. // * DECW m16
  9058. //
  9059. func (self *Program) DECW(v0 interface{}) *Instruction {
  9060. p := self.alloc("DECW", 1, Operands { v0 })
  9061. // DECW r16
  9062. if isReg16(v0) {
  9063. p.domain = DomainGeneric
  9064. p.add(0, func(m *_Encoding, v []interface{}) {
  9065. m.emit(0x66)
  9066. m.rexo(0, v[0], false)
  9067. m.emit(0xff)
  9068. m.emit(0xc8 | lcode(v[0]))
  9069. })
  9070. }
  9071. // DECW m16
  9072. if isM16(v0) {
  9073. p.domain = DomainGeneric
  9074. p.add(0, func(m *_Encoding, v []interface{}) {
  9075. m.emit(0x66)
  9076. m.rexo(0, addr(v[0]), false)
  9077. m.emit(0xff)
  9078. m.mrsd(1, addr(v[0]), 1)
  9079. })
  9080. }
  9081. if p.len == 0 {
  9082. panic("invalid operands for DECW")
  9083. }
  9084. return p
  9085. }
  9086. // DIVB performs "Unsigned Divide".
  9087. //
  9088. // Mnemonic : DIV
  9089. // Supported forms : (2 forms)
  9090. //
  9091. // * DIVB r8
  9092. // * DIVB m8
  9093. //
  9094. func (self *Program) DIVB(v0 interface{}) *Instruction {
  9095. p := self.alloc("DIVB", 1, Operands { v0 })
  9096. // DIVB r8
  9097. if isReg8(v0) {
  9098. p.domain = DomainGeneric
  9099. p.add(0, func(m *_Encoding, v []interface{}) {
  9100. m.rexo(0, v[0], isReg8REX(v[0]))
  9101. m.emit(0xf6)
  9102. m.emit(0xf0 | lcode(v[0]))
  9103. })
  9104. }
  9105. // DIVB m8
  9106. if isM8(v0) {
  9107. p.domain = DomainGeneric
  9108. p.add(0, func(m *_Encoding, v []interface{}) {
  9109. m.rexo(0, addr(v[0]), false)
  9110. m.emit(0xf6)
  9111. m.mrsd(6, addr(v[0]), 1)
  9112. })
  9113. }
  9114. if p.len == 0 {
  9115. panic("invalid operands for DIVB")
  9116. }
  9117. return p
  9118. }
  9119. // DIVL performs "Unsigned Divide".
  9120. //
  9121. // Mnemonic : DIV
  9122. // Supported forms : (2 forms)
  9123. //
  9124. // * DIVL r32
  9125. // * DIVL m32
  9126. //
  9127. func (self *Program) DIVL(v0 interface{}) *Instruction {
  9128. p := self.alloc("DIVL", 1, Operands { v0 })
  9129. // DIVL r32
  9130. if isReg32(v0) {
  9131. p.domain = DomainGeneric
  9132. p.add(0, func(m *_Encoding, v []interface{}) {
  9133. m.rexo(0, v[0], false)
  9134. m.emit(0xf7)
  9135. m.emit(0xf0 | lcode(v[0]))
  9136. })
  9137. }
  9138. // DIVL m32
  9139. if isM32(v0) {
  9140. p.domain = DomainGeneric
  9141. p.add(0, func(m *_Encoding, v []interface{}) {
  9142. m.rexo(0, addr(v[0]), false)
  9143. m.emit(0xf7)
  9144. m.mrsd(6, addr(v[0]), 1)
  9145. })
  9146. }
  9147. if p.len == 0 {
  9148. panic("invalid operands for DIVL")
  9149. }
  9150. return p
  9151. }
  9152. // DIVPD performs "Divide Packed Double-Precision Floating-Point Values".
  9153. //
  9154. // Mnemonic : DIVPD
  9155. // Supported forms : (2 forms)
  9156. //
  9157. // * DIVPD xmm, xmm [SSE2]
  9158. // * DIVPD m128, xmm [SSE2]
  9159. //
  9160. func (self *Program) DIVPD(v0 interface{}, v1 interface{}) *Instruction {
  9161. p := self.alloc("DIVPD", 2, Operands { v0, v1 })
  9162. // DIVPD xmm, xmm
  9163. if isXMM(v0) && isXMM(v1) {
  9164. self.require(ISA_SSE2)
  9165. p.domain = DomainMMXSSE
  9166. p.add(0, func(m *_Encoding, v []interface{}) {
  9167. m.emit(0x66)
  9168. m.rexo(hcode(v[1]), v[0], false)
  9169. m.emit(0x0f)
  9170. m.emit(0x5e)
  9171. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  9172. })
  9173. }
  9174. // DIVPD m128, xmm
  9175. if isM128(v0) && isXMM(v1) {
  9176. self.require(ISA_SSE2)
  9177. p.domain = DomainMMXSSE
  9178. p.add(0, func(m *_Encoding, v []interface{}) {
  9179. m.emit(0x66)
  9180. m.rexo(hcode(v[1]), addr(v[0]), false)
  9181. m.emit(0x0f)
  9182. m.emit(0x5e)
  9183. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  9184. })
  9185. }
  9186. if p.len == 0 {
  9187. panic("invalid operands for DIVPD")
  9188. }
  9189. return p
  9190. }
  9191. // DIVPS performs "Divide Packed Single-Precision Floating-Point Values".
  9192. //
  9193. // Mnemonic : DIVPS
  9194. // Supported forms : (2 forms)
  9195. //
  9196. // * DIVPS xmm, xmm [SSE]
  9197. // * DIVPS m128, xmm [SSE]
  9198. //
  9199. func (self *Program) DIVPS(v0 interface{}, v1 interface{}) *Instruction {
  9200. p := self.alloc("DIVPS", 2, Operands { v0, v1 })
  9201. // DIVPS xmm, xmm
  9202. if isXMM(v0) && isXMM(v1) {
  9203. self.require(ISA_SSE)
  9204. p.domain = DomainMMXSSE
  9205. p.add(0, func(m *_Encoding, v []interface{}) {
  9206. m.rexo(hcode(v[1]), v[0], false)
  9207. m.emit(0x0f)
  9208. m.emit(0x5e)
  9209. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  9210. })
  9211. }
  9212. // DIVPS m128, xmm
  9213. if isM128(v0) && isXMM(v1) {
  9214. self.require(ISA_SSE)
  9215. p.domain = DomainMMXSSE
  9216. p.add(0, func(m *_Encoding, v []interface{}) {
  9217. m.rexo(hcode(v[1]), addr(v[0]), false)
  9218. m.emit(0x0f)
  9219. m.emit(0x5e)
  9220. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  9221. })
  9222. }
  9223. if p.len == 0 {
  9224. panic("invalid operands for DIVPS")
  9225. }
  9226. return p
  9227. }
  9228. // DIVQ performs "Unsigned Divide".
  9229. //
  9230. // Mnemonic : DIV
  9231. // Supported forms : (2 forms)
  9232. //
  9233. // * DIVQ r64
  9234. // * DIVQ m64
  9235. //
  9236. func (self *Program) DIVQ(v0 interface{}) *Instruction {
  9237. p := self.alloc("DIVQ", 1, Operands { v0 })
  9238. // DIVQ r64
  9239. if isReg64(v0) {
  9240. p.domain = DomainGeneric
  9241. p.add(0, func(m *_Encoding, v []interface{}) {
  9242. m.emit(0x48 | hcode(v[0]))
  9243. m.emit(0xf7)
  9244. m.emit(0xf0 | lcode(v[0]))
  9245. })
  9246. }
  9247. // DIVQ m64
  9248. if isM64(v0) {
  9249. p.domain = DomainGeneric
  9250. p.add(0, func(m *_Encoding, v []interface{}) {
  9251. m.rexm(1, 0, addr(v[0]))
  9252. m.emit(0xf7)
  9253. m.mrsd(6, addr(v[0]), 1)
  9254. })
  9255. }
  9256. if p.len == 0 {
  9257. panic("invalid operands for DIVQ")
  9258. }
  9259. return p
  9260. }
  9261. // DIVSD performs "Divide Scalar Double-Precision Floating-Point Values".
  9262. //
  9263. // Mnemonic : DIVSD
  9264. // Supported forms : (2 forms)
  9265. //
  9266. // * DIVSD xmm, xmm [SSE2]
  9267. // * DIVSD m64, xmm [SSE2]
  9268. //
  9269. func (self *Program) DIVSD(v0 interface{}, v1 interface{}) *Instruction {
  9270. p := self.alloc("DIVSD", 2, Operands { v0, v1 })
  9271. // DIVSD xmm, xmm
  9272. if isXMM(v0) && isXMM(v1) {
  9273. self.require(ISA_SSE2)
  9274. p.domain = DomainMMXSSE
  9275. p.add(0, func(m *_Encoding, v []interface{}) {
  9276. m.emit(0xf2)
  9277. m.rexo(hcode(v[1]), v[0], false)
  9278. m.emit(0x0f)
  9279. m.emit(0x5e)
  9280. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  9281. })
  9282. }
  9283. // DIVSD m64, xmm
  9284. if isM64(v0) && isXMM(v1) {
  9285. self.require(ISA_SSE2)
  9286. p.domain = DomainMMXSSE
  9287. p.add(0, func(m *_Encoding, v []interface{}) {
  9288. m.emit(0xf2)
  9289. m.rexo(hcode(v[1]), addr(v[0]), false)
  9290. m.emit(0x0f)
  9291. m.emit(0x5e)
  9292. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  9293. })
  9294. }
  9295. if p.len == 0 {
  9296. panic("invalid operands for DIVSD")
  9297. }
  9298. return p
  9299. }
  9300. // DIVSS performs "Divide Scalar Single-Precision Floating-Point Values".
  9301. //
  9302. // Mnemonic : DIVSS
  9303. // Supported forms : (2 forms)
  9304. //
  9305. // * DIVSS xmm, xmm [SSE]
  9306. // * DIVSS m32, xmm [SSE]
  9307. //
  9308. func (self *Program) DIVSS(v0 interface{}, v1 interface{}) *Instruction {
  9309. p := self.alloc("DIVSS", 2, Operands { v0, v1 })
  9310. // DIVSS xmm, xmm
  9311. if isXMM(v0) && isXMM(v1) {
  9312. self.require(ISA_SSE)
  9313. p.domain = DomainMMXSSE
  9314. p.add(0, func(m *_Encoding, v []interface{}) {
  9315. m.emit(0xf3)
  9316. m.rexo(hcode(v[1]), v[0], false)
  9317. m.emit(0x0f)
  9318. m.emit(0x5e)
  9319. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  9320. })
  9321. }
  9322. // DIVSS m32, xmm
  9323. if isM32(v0) && isXMM(v1) {
  9324. self.require(ISA_SSE)
  9325. p.domain = DomainMMXSSE
  9326. p.add(0, func(m *_Encoding, v []interface{}) {
  9327. m.emit(0xf3)
  9328. m.rexo(hcode(v[1]), addr(v[0]), false)
  9329. m.emit(0x0f)
  9330. m.emit(0x5e)
  9331. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  9332. })
  9333. }
  9334. if p.len == 0 {
  9335. panic("invalid operands for DIVSS")
  9336. }
  9337. return p
  9338. }
  9339. // DIVW performs "Unsigned Divide".
  9340. //
  9341. // Mnemonic : DIV
  9342. // Supported forms : (2 forms)
  9343. //
  9344. // * DIVW r16
  9345. // * DIVW m16
  9346. //
  9347. func (self *Program) DIVW(v0 interface{}) *Instruction {
  9348. p := self.alloc("DIVW", 1, Operands { v0 })
  9349. // DIVW r16
  9350. if isReg16(v0) {
  9351. p.domain = DomainGeneric
  9352. p.add(0, func(m *_Encoding, v []interface{}) {
  9353. m.emit(0x66)
  9354. m.rexo(0, v[0], false)
  9355. m.emit(0xf7)
  9356. m.emit(0xf0 | lcode(v[0]))
  9357. })
  9358. }
  9359. // DIVW m16
  9360. if isM16(v0) {
  9361. p.domain = DomainGeneric
  9362. p.add(0, func(m *_Encoding, v []interface{}) {
  9363. m.emit(0x66)
  9364. m.rexo(0, addr(v[0]), false)
  9365. m.emit(0xf7)
  9366. m.mrsd(6, addr(v[0]), 1)
  9367. })
  9368. }
  9369. if p.len == 0 {
  9370. panic("invalid operands for DIVW")
  9371. }
  9372. return p
  9373. }
  9374. // DPPD performs "Dot Product of Packed Double Precision Floating-Point Values".
  9375. //
  9376. // Mnemonic : DPPD
  9377. // Supported forms : (2 forms)
  9378. //
  9379. // * DPPD imm8, xmm, xmm [SSE4.1]
  9380. // * DPPD imm8, m128, xmm [SSE4.1]
  9381. //
  9382. func (self *Program) DPPD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  9383. p := self.alloc("DPPD", 3, Operands { v0, v1, v2 })
  9384. // DPPD imm8, xmm, xmm
  9385. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  9386. self.require(ISA_SSE4_1)
  9387. p.domain = DomainMMXSSE
  9388. p.add(0, func(m *_Encoding, v []interface{}) {
  9389. m.emit(0x66)
  9390. m.rexo(hcode(v[2]), v[1], false)
  9391. m.emit(0x0f)
  9392. m.emit(0x3a)
  9393. m.emit(0x41)
  9394. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  9395. m.imm1(toImmAny(v[0]))
  9396. })
  9397. }
  9398. // DPPD imm8, m128, xmm
  9399. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  9400. self.require(ISA_SSE4_1)
  9401. p.domain = DomainMMXSSE
  9402. p.add(0, func(m *_Encoding, v []interface{}) {
  9403. m.emit(0x66)
  9404. m.rexo(hcode(v[2]), addr(v[1]), false)
  9405. m.emit(0x0f)
  9406. m.emit(0x3a)
  9407. m.emit(0x41)
  9408. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  9409. m.imm1(toImmAny(v[0]))
  9410. })
  9411. }
  9412. if p.len == 0 {
  9413. panic("invalid operands for DPPD")
  9414. }
  9415. return p
  9416. }
  9417. // DPPS performs "Dot Product of Packed Single Precision Floating-Point Values".
  9418. //
  9419. // Mnemonic : DPPS
  9420. // Supported forms : (2 forms)
  9421. //
  9422. // * DPPS imm8, xmm, xmm [SSE4.1]
  9423. // * DPPS imm8, m128, xmm [SSE4.1]
  9424. //
  9425. func (self *Program) DPPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  9426. p := self.alloc("DPPS", 3, Operands { v0, v1, v2 })
  9427. // DPPS imm8, xmm, xmm
  9428. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  9429. self.require(ISA_SSE4_1)
  9430. p.domain = DomainMMXSSE
  9431. p.add(0, func(m *_Encoding, v []interface{}) {
  9432. m.emit(0x66)
  9433. m.rexo(hcode(v[2]), v[1], false)
  9434. m.emit(0x0f)
  9435. m.emit(0x3a)
  9436. m.emit(0x40)
  9437. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  9438. m.imm1(toImmAny(v[0]))
  9439. })
  9440. }
  9441. // DPPS imm8, m128, xmm
  9442. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  9443. self.require(ISA_SSE4_1)
  9444. p.domain = DomainMMXSSE
  9445. p.add(0, func(m *_Encoding, v []interface{}) {
  9446. m.emit(0x66)
  9447. m.rexo(hcode(v[2]), addr(v[1]), false)
  9448. m.emit(0x0f)
  9449. m.emit(0x3a)
  9450. m.emit(0x40)
  9451. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  9452. m.imm1(toImmAny(v[0]))
  9453. })
  9454. }
  9455. if p.len == 0 {
  9456. panic("invalid operands for DPPS")
  9457. }
  9458. return p
  9459. }
  9460. // EMMS performs "Exit MMX State".
  9461. //
  9462. // Mnemonic : EMMS
  9463. // Supported forms : (1 form)
  9464. //
  9465. // * EMMS [MMX]
  9466. //
  9467. func (self *Program) EMMS() *Instruction {
  9468. p := self.alloc("EMMS", 0, Operands { })
  9469. // EMMS
  9470. self.require(ISA_MMX)
  9471. p.domain = DomainMMXSSE
  9472. p.add(0, func(m *_Encoding, v []interface{}) {
  9473. m.emit(0x0f)
  9474. m.emit(0x77)
  9475. })
  9476. return p
  9477. }
  9478. // EXTRACTPS performs "Extract Packed Single Precision Floating-Point Value".
  9479. //
  9480. // Mnemonic : EXTRACTPS
  9481. // Supported forms : (2 forms)
  9482. //
  9483. // * EXTRACTPS imm8, xmm, r32 [SSE4.1]
  9484. // * EXTRACTPS imm8, xmm, m32 [SSE4.1]
  9485. //
  9486. func (self *Program) EXTRACTPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  9487. p := self.alloc("EXTRACTPS", 3, Operands { v0, v1, v2 })
  9488. // EXTRACTPS imm8, xmm, r32
  9489. if isImm8(v0) && isXMM(v1) && isReg32(v2) {
  9490. self.require(ISA_SSE4_1)
  9491. p.domain = DomainMMXSSE
  9492. p.add(0, func(m *_Encoding, v []interface{}) {
  9493. m.emit(0x66)
  9494. m.rexo(hcode(v[1]), v[2], false)
  9495. m.emit(0x0f)
  9496. m.emit(0x3a)
  9497. m.emit(0x17)
  9498. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  9499. m.imm1(toImmAny(v[0]))
  9500. })
  9501. }
  9502. // EXTRACTPS imm8, xmm, m32
  9503. if isImm8(v0) && isXMM(v1) && isM32(v2) {
  9504. self.require(ISA_SSE4_1)
  9505. p.domain = DomainMMXSSE
  9506. p.add(0, func(m *_Encoding, v []interface{}) {
  9507. m.emit(0x66)
  9508. m.rexo(hcode(v[1]), addr(v[2]), false)
  9509. m.emit(0x0f)
  9510. m.emit(0x3a)
  9511. m.emit(0x17)
  9512. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  9513. m.imm1(toImmAny(v[0]))
  9514. })
  9515. }
  9516. if p.len == 0 {
  9517. panic("invalid operands for EXTRACTPS")
  9518. }
  9519. return p
  9520. }
  9521. // EXTRQ performs "Extract Field".
  9522. //
  9523. // Mnemonic : EXTRQ
  9524. // Supported forms : (2 forms)
  9525. //
  9526. // * EXTRQ xmm, xmm [SSE4A]
  9527. // * EXTRQ imm8, imm8, xmm [SSE4A]
  9528. //
  9529. func (self *Program) EXTRQ(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  9530. var p *Instruction
  9531. switch len(vv) {
  9532. case 0 : p = self.alloc("EXTRQ", 2, Operands { v0, v1 })
  9533. case 1 : p = self.alloc("EXTRQ", 3, Operands { v0, v1, vv[0] })
  9534. default : panic("instruction EXTRQ takes 2 or 3 operands")
  9535. }
  9536. // EXTRQ xmm, xmm
  9537. if len(vv) == 0 && isXMM(v0) && isXMM(v1) {
  9538. self.require(ISA_SSE4A)
  9539. p.domain = DomainAMDSpecific
  9540. p.add(0, func(m *_Encoding, v []interface{}) {
  9541. m.emit(0x66)
  9542. m.rexo(hcode(v[1]), v[0], false)
  9543. m.emit(0x0f)
  9544. m.emit(0x79)
  9545. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  9546. })
  9547. }
  9548. // EXTRQ imm8, imm8, xmm
  9549. if len(vv) == 1 && isImm8(v0) && isImm8(v1) && isXMM(vv[0]) {
  9550. self.require(ISA_SSE4A)
  9551. p.domain = DomainAMDSpecific
  9552. p.add(0, func(m *_Encoding, v []interface{}) {
  9553. m.emit(0x66)
  9554. m.rexo(0, v[2], false)
  9555. m.emit(0x0f)
  9556. m.emit(0x78)
  9557. m.emit(0xc0 | lcode(v[2]))
  9558. m.imm1(toImmAny(v[1]))
  9559. m.imm1(toImmAny(v[0]))
  9560. })
  9561. }
  9562. if p.len == 0 {
  9563. panic("invalid operands for EXTRQ")
  9564. }
  9565. return p
  9566. }
  9567. // FEMMS performs "Fast Exit Multimedia State".
  9568. //
  9569. // Mnemonic : FEMMS
  9570. // Supported forms : (1 form)
  9571. //
  9572. // * FEMMS [FEMMS]
  9573. //
  9574. func (self *Program) FEMMS() *Instruction {
  9575. p := self.alloc("FEMMS", 0, Operands { })
  9576. // FEMMS
  9577. self.require(ISA_FEMMS)
  9578. p.domain = DomainAMDSpecific
  9579. p.add(0, func(m *_Encoding, v []interface{}) {
  9580. m.emit(0x0f)
  9581. m.emit(0x0e)
  9582. })
  9583. return p
  9584. }
  9585. // HADDPD performs "Packed Double-FP Horizontal Add".
  9586. //
  9587. // Mnemonic : HADDPD
  9588. // Supported forms : (2 forms)
  9589. //
  9590. // * HADDPD xmm, xmm [SSE3]
  9591. // * HADDPD m128, xmm [SSE3]
  9592. //
  9593. func (self *Program) HADDPD(v0 interface{}, v1 interface{}) *Instruction {
  9594. p := self.alloc("HADDPD", 2, Operands { v0, v1 })
  9595. // HADDPD xmm, xmm
  9596. if isXMM(v0) && isXMM(v1) {
  9597. self.require(ISA_SSE3)
  9598. p.domain = DomainMMXSSE
  9599. p.add(0, func(m *_Encoding, v []interface{}) {
  9600. m.emit(0x66)
  9601. m.rexo(hcode(v[1]), v[0], false)
  9602. m.emit(0x0f)
  9603. m.emit(0x7c)
  9604. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  9605. })
  9606. }
  9607. // HADDPD m128, xmm
  9608. if isM128(v0) && isXMM(v1) {
  9609. self.require(ISA_SSE3)
  9610. p.domain = DomainMMXSSE
  9611. p.add(0, func(m *_Encoding, v []interface{}) {
  9612. m.emit(0x66)
  9613. m.rexo(hcode(v[1]), addr(v[0]), false)
  9614. m.emit(0x0f)
  9615. m.emit(0x7c)
  9616. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  9617. })
  9618. }
  9619. if p.len == 0 {
  9620. panic("invalid operands for HADDPD")
  9621. }
  9622. return p
  9623. }
  9624. // HADDPS performs "Packed Single-FP Horizontal Add".
  9625. //
  9626. // Mnemonic : HADDPS
  9627. // Supported forms : (2 forms)
  9628. //
  9629. // * HADDPS xmm, xmm [SSE3]
  9630. // * HADDPS m128, xmm [SSE3]
  9631. //
  9632. func (self *Program) HADDPS(v0 interface{}, v1 interface{}) *Instruction {
  9633. p := self.alloc("HADDPS", 2, Operands { v0, v1 })
  9634. // HADDPS xmm, xmm
  9635. if isXMM(v0) && isXMM(v1) {
  9636. self.require(ISA_SSE3)
  9637. p.domain = DomainMMXSSE
  9638. p.add(0, func(m *_Encoding, v []interface{}) {
  9639. m.emit(0xf2)
  9640. m.rexo(hcode(v[1]), v[0], false)
  9641. m.emit(0x0f)
  9642. m.emit(0x7c)
  9643. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  9644. })
  9645. }
  9646. // HADDPS m128, xmm
  9647. if isM128(v0) && isXMM(v1) {
  9648. self.require(ISA_SSE3)
  9649. p.domain = DomainMMXSSE
  9650. p.add(0, func(m *_Encoding, v []interface{}) {
  9651. m.emit(0xf2)
  9652. m.rexo(hcode(v[1]), addr(v[0]), false)
  9653. m.emit(0x0f)
  9654. m.emit(0x7c)
  9655. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  9656. })
  9657. }
  9658. if p.len == 0 {
  9659. panic("invalid operands for HADDPS")
  9660. }
  9661. return p
  9662. }
  9663. // HSUBPD performs "Packed Double-FP Horizontal Subtract".
  9664. //
  9665. // Mnemonic : HSUBPD
  9666. // Supported forms : (2 forms)
  9667. //
  9668. // * HSUBPD xmm, xmm [SSE3]
  9669. // * HSUBPD m128, xmm [SSE3]
  9670. //
  9671. func (self *Program) HSUBPD(v0 interface{}, v1 interface{}) *Instruction {
  9672. p := self.alloc("HSUBPD", 2, Operands { v0, v1 })
  9673. // HSUBPD xmm, xmm
  9674. if isXMM(v0) && isXMM(v1) {
  9675. self.require(ISA_SSE3)
  9676. p.domain = DomainMMXSSE
  9677. p.add(0, func(m *_Encoding, v []interface{}) {
  9678. m.emit(0x66)
  9679. m.rexo(hcode(v[1]), v[0], false)
  9680. m.emit(0x0f)
  9681. m.emit(0x7d)
  9682. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  9683. })
  9684. }
  9685. // HSUBPD m128, xmm
  9686. if isM128(v0) && isXMM(v1) {
  9687. self.require(ISA_SSE3)
  9688. p.domain = DomainMMXSSE
  9689. p.add(0, func(m *_Encoding, v []interface{}) {
  9690. m.emit(0x66)
  9691. m.rexo(hcode(v[1]), addr(v[0]), false)
  9692. m.emit(0x0f)
  9693. m.emit(0x7d)
  9694. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  9695. })
  9696. }
  9697. if p.len == 0 {
  9698. panic("invalid operands for HSUBPD")
  9699. }
  9700. return p
  9701. }
  9702. // HSUBPS performs "Packed Single-FP Horizontal Subtract".
  9703. //
  9704. // Mnemonic : HSUBPS
  9705. // Supported forms : (2 forms)
  9706. //
  9707. // * HSUBPS xmm, xmm [SSE3]
  9708. // * HSUBPS m128, xmm [SSE3]
  9709. //
  9710. func (self *Program) HSUBPS(v0 interface{}, v1 interface{}) *Instruction {
  9711. p := self.alloc("HSUBPS", 2, Operands { v0, v1 })
  9712. // HSUBPS xmm, xmm
  9713. if isXMM(v0) && isXMM(v1) {
  9714. self.require(ISA_SSE3)
  9715. p.domain = DomainMMXSSE
  9716. p.add(0, func(m *_Encoding, v []interface{}) {
  9717. m.emit(0xf2)
  9718. m.rexo(hcode(v[1]), v[0], false)
  9719. m.emit(0x0f)
  9720. m.emit(0x7d)
  9721. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  9722. })
  9723. }
  9724. // HSUBPS m128, xmm
  9725. if isM128(v0) && isXMM(v1) {
  9726. self.require(ISA_SSE3)
  9727. p.domain = DomainMMXSSE
  9728. p.add(0, func(m *_Encoding, v []interface{}) {
  9729. m.emit(0xf2)
  9730. m.rexo(hcode(v[1]), addr(v[0]), false)
  9731. m.emit(0x0f)
  9732. m.emit(0x7d)
  9733. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  9734. })
  9735. }
  9736. if p.len == 0 {
  9737. panic("invalid operands for HSUBPS")
  9738. }
  9739. return p
  9740. }
  9741. // IDIVB performs "Signed Divide".
  9742. //
  9743. // Mnemonic : IDIV
  9744. // Supported forms : (2 forms)
  9745. //
  9746. // * IDIVB r8
  9747. // * IDIVB m8
  9748. //
  9749. func (self *Program) IDIVB(v0 interface{}) *Instruction {
  9750. p := self.alloc("IDIVB", 1, Operands { v0 })
  9751. // IDIVB r8
  9752. if isReg8(v0) {
  9753. p.domain = DomainGeneric
  9754. p.add(0, func(m *_Encoding, v []interface{}) {
  9755. m.rexo(0, v[0], isReg8REX(v[0]))
  9756. m.emit(0xf6)
  9757. m.emit(0xf8 | lcode(v[0]))
  9758. })
  9759. }
  9760. // IDIVB m8
  9761. if isM8(v0) {
  9762. p.domain = DomainGeneric
  9763. p.add(0, func(m *_Encoding, v []interface{}) {
  9764. m.rexo(0, addr(v[0]), false)
  9765. m.emit(0xf6)
  9766. m.mrsd(7, addr(v[0]), 1)
  9767. })
  9768. }
  9769. if p.len == 0 {
  9770. panic("invalid operands for IDIVB")
  9771. }
  9772. return p
  9773. }
  9774. // IDIVL performs "Signed Divide".
  9775. //
  9776. // Mnemonic : IDIV
  9777. // Supported forms : (2 forms)
  9778. //
  9779. // * IDIVL r32
  9780. // * IDIVL m32
  9781. //
  9782. func (self *Program) IDIVL(v0 interface{}) *Instruction {
  9783. p := self.alloc("IDIVL", 1, Operands { v0 })
  9784. // IDIVL r32
  9785. if isReg32(v0) {
  9786. p.domain = DomainGeneric
  9787. p.add(0, func(m *_Encoding, v []interface{}) {
  9788. m.rexo(0, v[0], false)
  9789. m.emit(0xf7)
  9790. m.emit(0xf8 | lcode(v[0]))
  9791. })
  9792. }
  9793. // IDIVL m32
  9794. if isM32(v0) {
  9795. p.domain = DomainGeneric
  9796. p.add(0, func(m *_Encoding, v []interface{}) {
  9797. m.rexo(0, addr(v[0]), false)
  9798. m.emit(0xf7)
  9799. m.mrsd(7, addr(v[0]), 1)
  9800. })
  9801. }
  9802. if p.len == 0 {
  9803. panic("invalid operands for IDIVL")
  9804. }
  9805. return p
  9806. }
  9807. // IDIVQ performs "Signed Divide".
  9808. //
  9809. // Mnemonic : IDIV
  9810. // Supported forms : (2 forms)
  9811. //
  9812. // * IDIVQ r64
  9813. // * IDIVQ m64
  9814. //
  9815. func (self *Program) IDIVQ(v0 interface{}) *Instruction {
  9816. p := self.alloc("IDIVQ", 1, Operands { v0 })
  9817. // IDIVQ r64
  9818. if isReg64(v0) {
  9819. p.domain = DomainGeneric
  9820. p.add(0, func(m *_Encoding, v []interface{}) {
  9821. m.emit(0x48 | hcode(v[0]))
  9822. m.emit(0xf7)
  9823. m.emit(0xf8 | lcode(v[0]))
  9824. })
  9825. }
  9826. // IDIVQ m64
  9827. if isM64(v0) {
  9828. p.domain = DomainGeneric
  9829. p.add(0, func(m *_Encoding, v []interface{}) {
  9830. m.rexm(1, 0, addr(v[0]))
  9831. m.emit(0xf7)
  9832. m.mrsd(7, addr(v[0]), 1)
  9833. })
  9834. }
  9835. if p.len == 0 {
  9836. panic("invalid operands for IDIVQ")
  9837. }
  9838. return p
  9839. }
  9840. // IDIVW performs "Signed Divide".
  9841. //
  9842. // Mnemonic : IDIV
  9843. // Supported forms : (2 forms)
  9844. //
  9845. // * IDIVW r16
  9846. // * IDIVW m16
  9847. //
  9848. func (self *Program) IDIVW(v0 interface{}) *Instruction {
  9849. p := self.alloc("IDIVW", 1, Operands { v0 })
  9850. // IDIVW r16
  9851. if isReg16(v0) {
  9852. p.domain = DomainGeneric
  9853. p.add(0, func(m *_Encoding, v []interface{}) {
  9854. m.emit(0x66)
  9855. m.rexo(0, v[0], false)
  9856. m.emit(0xf7)
  9857. m.emit(0xf8 | lcode(v[0]))
  9858. })
  9859. }
  9860. // IDIVW m16
  9861. if isM16(v0) {
  9862. p.domain = DomainGeneric
  9863. p.add(0, func(m *_Encoding, v []interface{}) {
  9864. m.emit(0x66)
  9865. m.rexo(0, addr(v[0]), false)
  9866. m.emit(0xf7)
  9867. m.mrsd(7, addr(v[0]), 1)
  9868. })
  9869. }
  9870. if p.len == 0 {
  9871. panic("invalid operands for IDIVW")
  9872. }
  9873. return p
  9874. }
  9875. // IMULB performs "Signed Multiply".
  9876. //
  9877. // Mnemonic : IMUL
  9878. // Supported forms : (2 forms)
  9879. //
  9880. // * IMULB r8
  9881. // * IMULB m8
  9882. //
  9883. func (self *Program) IMULB(v0 interface{}) *Instruction {
  9884. p := self.alloc("IMULB", 1, Operands { v0 })
  9885. // IMULB r8
  9886. if isReg8(v0) {
  9887. p.domain = DomainGeneric
  9888. p.add(0, func(m *_Encoding, v []interface{}) {
  9889. m.rexo(0, v[0], isReg8REX(v[0]))
  9890. m.emit(0xf6)
  9891. m.emit(0xe8 | lcode(v[0]))
  9892. })
  9893. }
  9894. // IMULB m8
  9895. if isM8(v0) {
  9896. p.domain = DomainGeneric
  9897. p.add(0, func(m *_Encoding, v []interface{}) {
  9898. m.rexo(0, addr(v[0]), false)
  9899. m.emit(0xf6)
  9900. m.mrsd(5, addr(v[0]), 1)
  9901. })
  9902. }
  9903. if p.len == 0 {
  9904. panic("invalid operands for IMULB")
  9905. }
  9906. return p
  9907. }
  9908. // IMULL performs "Signed Multiply".
  9909. //
  9910. // Mnemonic : IMUL
  9911. // Supported forms : (8 forms)
  9912. //
  9913. // * IMULL r32
  9914. // * IMULL m32
  9915. // * IMULL r32, r32
  9916. // * IMULL m32, r32
  9917. // * IMULL imm8, r32, r32
  9918. // * IMULL imm32, r32, r32
  9919. // * IMULL imm8, m32, r32
  9920. // * IMULL imm32, m32, r32
  9921. //
  9922. func (self *Program) IMULL(v0 interface{}, vv ...interface{}) *Instruction {
  9923. var p *Instruction
  9924. switch len(vv) {
  9925. case 0 : p = self.alloc("IMULL", 1, Operands { v0 })
  9926. case 1 : p = self.alloc("IMULL", 2, Operands { v0, vv[0] })
  9927. case 2 : p = self.alloc("IMULL", 3, Operands { v0, vv[0], vv[1] })
  9928. default : panic("instruction IMULL takes 1 or 2 or 3 operands")
  9929. }
  9930. // IMULL r32
  9931. if len(vv) == 0 && isReg32(v0) {
  9932. p.domain = DomainGeneric
  9933. p.add(0, func(m *_Encoding, v []interface{}) {
  9934. m.rexo(0, v[0], false)
  9935. m.emit(0xf7)
  9936. m.emit(0xe8 | lcode(v[0]))
  9937. })
  9938. }
  9939. // IMULL m32
  9940. if len(vv) == 0 && isM32(v0) {
  9941. p.domain = DomainGeneric
  9942. p.add(0, func(m *_Encoding, v []interface{}) {
  9943. m.rexo(0, addr(v[0]), false)
  9944. m.emit(0xf7)
  9945. m.mrsd(5, addr(v[0]), 1)
  9946. })
  9947. }
  9948. // IMULL r32, r32
  9949. if len(vv) == 1 && isReg32(v0) && isReg32(vv[0]) {
  9950. p.domain = DomainGeneric
  9951. p.add(0, func(m *_Encoding, v []interface{}) {
  9952. m.rexo(hcode(v[1]), v[0], false)
  9953. m.emit(0x0f)
  9954. m.emit(0xaf)
  9955. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  9956. })
  9957. }
  9958. // IMULL m32, r32
  9959. if len(vv) == 1 && isM32(v0) && isReg32(vv[0]) {
  9960. p.domain = DomainGeneric
  9961. p.add(0, func(m *_Encoding, v []interface{}) {
  9962. m.rexo(hcode(v[1]), addr(v[0]), false)
  9963. m.emit(0x0f)
  9964. m.emit(0xaf)
  9965. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  9966. })
  9967. }
  9968. // IMULL imm8, r32, r32
  9969. if len(vv) == 2 && isImm8(v0) && isReg32(vv[0]) && isReg32(vv[1]) {
  9970. p.domain = DomainGeneric
  9971. p.add(0, func(m *_Encoding, v []interface{}) {
  9972. m.rexo(hcode(v[2]), v[1], false)
  9973. m.emit(0x6b)
  9974. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  9975. m.imm1(toImmAny(v[0]))
  9976. })
  9977. }
  9978. // IMULL imm32, r32, r32
  9979. if len(vv) == 2 && isImm32(v0) && isReg32(vv[0]) && isReg32(vv[1]) {
  9980. p.domain = DomainGeneric
  9981. p.add(0, func(m *_Encoding, v []interface{}) {
  9982. m.rexo(hcode(v[2]), v[1], false)
  9983. m.emit(0x69)
  9984. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  9985. m.imm4(toImmAny(v[0]))
  9986. })
  9987. }
  9988. // IMULL imm8, m32, r32
  9989. if len(vv) == 2 && isImm8(v0) && isM32(vv[0]) && isReg32(vv[1]) {
  9990. p.domain = DomainGeneric
  9991. p.add(0, func(m *_Encoding, v []interface{}) {
  9992. m.rexo(hcode(v[2]), addr(v[1]), false)
  9993. m.emit(0x6b)
  9994. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  9995. m.imm1(toImmAny(v[0]))
  9996. })
  9997. }
  9998. // IMULL imm32, m32, r32
  9999. if len(vv) == 2 && isImm32(v0) && isM32(vv[0]) && isReg32(vv[1]) {
  10000. p.domain = DomainGeneric
  10001. p.add(0, func(m *_Encoding, v []interface{}) {
  10002. m.rexo(hcode(v[2]), addr(v[1]), false)
  10003. m.emit(0x69)
  10004. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  10005. m.imm4(toImmAny(v[0]))
  10006. })
  10007. }
  10008. if p.len == 0 {
  10009. panic("invalid operands for IMULL")
  10010. }
  10011. return p
  10012. }
  10013. // IMULQ performs "Signed Multiply".
  10014. //
  10015. // Mnemonic : IMUL
  10016. // Supported forms : (8 forms)
  10017. //
  10018. // * IMULQ r64
  10019. // * IMULQ m64
  10020. // * IMULQ r64, r64
  10021. // * IMULQ m64, r64
  10022. // * IMULQ imm8, r64, r64
  10023. // * IMULQ imm32, r64, r64
  10024. // * IMULQ imm8, m64, r64
  10025. // * IMULQ imm32, m64, r64
  10026. //
  10027. func (self *Program) IMULQ(v0 interface{}, vv ...interface{}) *Instruction {
  10028. var p *Instruction
  10029. switch len(vv) {
  10030. case 0 : p = self.alloc("IMULQ", 1, Operands { v0 })
  10031. case 1 : p = self.alloc("IMULQ", 2, Operands { v0, vv[0] })
  10032. case 2 : p = self.alloc("IMULQ", 3, Operands { v0, vv[0], vv[1] })
  10033. default : panic("instruction IMULQ takes 1 or 2 or 3 operands")
  10034. }
  10035. // IMULQ r64
  10036. if len(vv) == 0 && isReg64(v0) {
  10037. p.domain = DomainGeneric
  10038. p.add(0, func(m *_Encoding, v []interface{}) {
  10039. m.emit(0x48 | hcode(v[0]))
  10040. m.emit(0xf7)
  10041. m.emit(0xe8 | lcode(v[0]))
  10042. })
  10043. }
  10044. // IMULQ m64
  10045. if len(vv) == 0 && isM64(v0) {
  10046. p.domain = DomainGeneric
  10047. p.add(0, func(m *_Encoding, v []interface{}) {
  10048. m.rexm(1, 0, addr(v[0]))
  10049. m.emit(0xf7)
  10050. m.mrsd(5, addr(v[0]), 1)
  10051. })
  10052. }
  10053. // IMULQ r64, r64
  10054. if len(vv) == 1 && isReg64(v0) && isReg64(vv[0]) {
  10055. p.domain = DomainGeneric
  10056. p.add(0, func(m *_Encoding, v []interface{}) {
  10057. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  10058. m.emit(0x0f)
  10059. m.emit(0xaf)
  10060. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  10061. })
  10062. }
  10063. // IMULQ m64, r64
  10064. if len(vv) == 1 && isM64(v0) && isReg64(vv[0]) {
  10065. p.domain = DomainGeneric
  10066. p.add(0, func(m *_Encoding, v []interface{}) {
  10067. m.rexm(1, hcode(v[1]), addr(v[0]))
  10068. m.emit(0x0f)
  10069. m.emit(0xaf)
  10070. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  10071. })
  10072. }
  10073. // IMULQ imm8, r64, r64
  10074. if len(vv) == 2 && isImm8(v0) && isReg64(vv[0]) && isReg64(vv[1]) {
  10075. p.domain = DomainGeneric
  10076. p.add(0, func(m *_Encoding, v []interface{}) {
  10077. m.emit(0x48 | hcode(v[2]) << 2 | hcode(v[1]))
  10078. m.emit(0x6b)
  10079. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  10080. m.imm1(toImmAny(v[0]))
  10081. })
  10082. }
  10083. // IMULQ imm32, r64, r64
  10084. if len(vv) == 2 && isImm32(v0) && isReg64(vv[0]) && isReg64(vv[1]) {
  10085. p.domain = DomainGeneric
  10086. p.add(0, func(m *_Encoding, v []interface{}) {
  10087. m.emit(0x48 | hcode(v[2]) << 2 | hcode(v[1]))
  10088. m.emit(0x69)
  10089. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  10090. m.imm4(toImmAny(v[0]))
  10091. })
  10092. }
  10093. // IMULQ imm8, m64, r64
  10094. if len(vv) == 2 && isImm8(v0) && isM64(vv[0]) && isReg64(vv[1]) {
  10095. p.domain = DomainGeneric
  10096. p.add(0, func(m *_Encoding, v []interface{}) {
  10097. m.rexm(1, hcode(v[2]), addr(v[1]))
  10098. m.emit(0x6b)
  10099. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  10100. m.imm1(toImmAny(v[0]))
  10101. })
  10102. }
  10103. // IMULQ imm32, m64, r64
  10104. if len(vv) == 2 && isImm32(v0) && isM64(vv[0]) && isReg64(vv[1]) {
  10105. p.domain = DomainGeneric
  10106. p.add(0, func(m *_Encoding, v []interface{}) {
  10107. m.rexm(1, hcode(v[2]), addr(v[1]))
  10108. m.emit(0x69)
  10109. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  10110. m.imm4(toImmAny(v[0]))
  10111. })
  10112. }
  10113. if p.len == 0 {
  10114. panic("invalid operands for IMULQ")
  10115. }
  10116. return p
  10117. }
  10118. // IMULW performs "Signed Multiply".
  10119. //
  10120. // Mnemonic : IMUL
  10121. // Supported forms : (8 forms)
  10122. //
  10123. // * IMULW r16
  10124. // * IMULW m16
  10125. // * IMULW r16, r16
  10126. // * IMULW m16, r16
  10127. // * IMULW imm8, r16, r16
  10128. // * IMULW imm16, r16, r16
  10129. // * IMULW imm8, m16, r16
  10130. // * IMULW imm16, m16, r16
  10131. //
  10132. func (self *Program) IMULW(v0 interface{}, vv ...interface{}) *Instruction {
  10133. var p *Instruction
  10134. switch len(vv) {
  10135. case 0 : p = self.alloc("IMULW", 1, Operands { v0 })
  10136. case 1 : p = self.alloc("IMULW", 2, Operands { v0, vv[0] })
  10137. case 2 : p = self.alloc("IMULW", 3, Operands { v0, vv[0], vv[1] })
  10138. default : panic("instruction IMULW takes 1 or 2 or 3 operands")
  10139. }
  10140. // IMULW r16
  10141. if len(vv) == 0 && isReg16(v0) {
  10142. p.domain = DomainGeneric
  10143. p.add(0, func(m *_Encoding, v []interface{}) {
  10144. m.emit(0x66)
  10145. m.rexo(0, v[0], false)
  10146. m.emit(0xf7)
  10147. m.emit(0xe8 | lcode(v[0]))
  10148. })
  10149. }
  10150. // IMULW m16
  10151. if len(vv) == 0 && isM16(v0) {
  10152. p.domain = DomainGeneric
  10153. p.add(0, func(m *_Encoding, v []interface{}) {
  10154. m.emit(0x66)
  10155. m.rexo(0, addr(v[0]), false)
  10156. m.emit(0xf7)
  10157. m.mrsd(5, addr(v[0]), 1)
  10158. })
  10159. }
  10160. // IMULW r16, r16
  10161. if len(vv) == 1 && isReg16(v0) && isReg16(vv[0]) {
  10162. p.domain = DomainGeneric
  10163. p.add(0, func(m *_Encoding, v []interface{}) {
  10164. m.emit(0x66)
  10165. m.rexo(hcode(v[1]), v[0], false)
  10166. m.emit(0x0f)
  10167. m.emit(0xaf)
  10168. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  10169. })
  10170. }
  10171. // IMULW m16, r16
  10172. if len(vv) == 1 && isM16(v0) && isReg16(vv[0]) {
  10173. p.domain = DomainGeneric
  10174. p.add(0, func(m *_Encoding, v []interface{}) {
  10175. m.emit(0x66)
  10176. m.rexo(hcode(v[1]), addr(v[0]), false)
  10177. m.emit(0x0f)
  10178. m.emit(0xaf)
  10179. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  10180. })
  10181. }
  10182. // IMULW imm8, r16, r16
  10183. if len(vv) == 2 && isImm8(v0) && isReg16(vv[0]) && isReg16(vv[1]) {
  10184. p.domain = DomainGeneric
  10185. p.add(0, func(m *_Encoding, v []interface{}) {
  10186. m.emit(0x66)
  10187. m.rexo(hcode(v[2]), v[1], false)
  10188. m.emit(0x6b)
  10189. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  10190. m.imm1(toImmAny(v[0]))
  10191. })
  10192. }
  10193. // IMULW imm16, r16, r16
  10194. if len(vv) == 2 && isImm16(v0) && isReg16(vv[0]) && isReg16(vv[1]) {
  10195. p.domain = DomainGeneric
  10196. p.add(0, func(m *_Encoding, v []interface{}) {
  10197. m.emit(0x66)
  10198. m.rexo(hcode(v[2]), v[1], false)
  10199. m.emit(0x69)
  10200. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  10201. m.imm2(toImmAny(v[0]))
  10202. })
  10203. }
  10204. // IMULW imm8, m16, r16
  10205. if len(vv) == 2 && isImm8(v0) && isM16(vv[0]) && isReg16(vv[1]) {
  10206. p.domain = DomainGeneric
  10207. p.add(0, func(m *_Encoding, v []interface{}) {
  10208. m.emit(0x66)
  10209. m.rexo(hcode(v[2]), addr(v[1]), false)
  10210. m.emit(0x6b)
  10211. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  10212. m.imm1(toImmAny(v[0]))
  10213. })
  10214. }
  10215. // IMULW imm16, m16, r16
  10216. if len(vv) == 2 && isImm16(v0) && isM16(vv[0]) && isReg16(vv[1]) {
  10217. p.domain = DomainGeneric
  10218. p.add(0, func(m *_Encoding, v []interface{}) {
  10219. m.emit(0x66)
  10220. m.rexo(hcode(v[2]), addr(v[1]), false)
  10221. m.emit(0x69)
  10222. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  10223. m.imm2(toImmAny(v[0]))
  10224. })
  10225. }
  10226. if p.len == 0 {
  10227. panic("invalid operands for IMULW")
  10228. }
  10229. return p
  10230. }
  10231. // INCB performs "Increment by 1".
  10232. //
  10233. // Mnemonic : INC
  10234. // Supported forms : (2 forms)
  10235. //
  10236. // * INCB r8
  10237. // * INCB m8
  10238. //
  10239. func (self *Program) INCB(v0 interface{}) *Instruction {
  10240. p := self.alloc("INCB", 1, Operands { v0 })
  10241. // INCB r8
  10242. if isReg8(v0) {
  10243. p.domain = DomainGeneric
  10244. p.add(0, func(m *_Encoding, v []interface{}) {
  10245. m.rexo(0, v[0], isReg8REX(v[0]))
  10246. m.emit(0xfe)
  10247. m.emit(0xc0 | lcode(v[0]))
  10248. })
  10249. }
  10250. // INCB m8
  10251. if isM8(v0) {
  10252. p.domain = DomainGeneric
  10253. p.add(0, func(m *_Encoding, v []interface{}) {
  10254. m.rexo(0, addr(v[0]), false)
  10255. m.emit(0xfe)
  10256. m.mrsd(0, addr(v[0]), 1)
  10257. })
  10258. }
  10259. if p.len == 0 {
  10260. panic("invalid operands for INCB")
  10261. }
  10262. return p
  10263. }
  10264. // INCL performs "Increment by 1".
  10265. //
  10266. // Mnemonic : INC
  10267. // Supported forms : (2 forms)
  10268. //
  10269. // * INCL r32
  10270. // * INCL m32
  10271. //
  10272. func (self *Program) INCL(v0 interface{}) *Instruction {
  10273. p := self.alloc("INCL", 1, Operands { v0 })
  10274. // INCL r32
  10275. if isReg32(v0) {
  10276. p.domain = DomainGeneric
  10277. p.add(0, func(m *_Encoding, v []interface{}) {
  10278. m.rexo(0, v[0], false)
  10279. m.emit(0xff)
  10280. m.emit(0xc0 | lcode(v[0]))
  10281. })
  10282. }
  10283. // INCL m32
  10284. if isM32(v0) {
  10285. p.domain = DomainGeneric
  10286. p.add(0, func(m *_Encoding, v []interface{}) {
  10287. m.rexo(0, addr(v[0]), false)
  10288. m.emit(0xff)
  10289. m.mrsd(0, addr(v[0]), 1)
  10290. })
  10291. }
  10292. if p.len == 0 {
  10293. panic("invalid operands for INCL")
  10294. }
  10295. return p
  10296. }
  10297. // INCQ performs "Increment by 1".
  10298. //
  10299. // Mnemonic : INC
  10300. // Supported forms : (2 forms)
  10301. //
  10302. // * INCQ r64
  10303. // * INCQ m64
  10304. //
  10305. func (self *Program) INCQ(v0 interface{}) *Instruction {
  10306. p := self.alloc("INCQ", 1, Operands { v0 })
  10307. // INCQ r64
  10308. if isReg64(v0) {
  10309. p.domain = DomainGeneric
  10310. p.add(0, func(m *_Encoding, v []interface{}) {
  10311. m.emit(0x48 | hcode(v[0]))
  10312. m.emit(0xff)
  10313. m.emit(0xc0 | lcode(v[0]))
  10314. })
  10315. }
  10316. // INCQ m64
  10317. if isM64(v0) {
  10318. p.domain = DomainGeneric
  10319. p.add(0, func(m *_Encoding, v []interface{}) {
  10320. m.rexm(1, 0, addr(v[0]))
  10321. m.emit(0xff)
  10322. m.mrsd(0, addr(v[0]), 1)
  10323. })
  10324. }
  10325. if p.len == 0 {
  10326. panic("invalid operands for INCQ")
  10327. }
  10328. return p
  10329. }
  10330. // INCW performs "Increment by 1".
  10331. //
  10332. // Mnemonic : INC
  10333. // Supported forms : (2 forms)
  10334. //
  10335. // * INCW r16
  10336. // * INCW m16
  10337. //
  10338. func (self *Program) INCW(v0 interface{}) *Instruction {
  10339. p := self.alloc("INCW", 1, Operands { v0 })
  10340. // INCW r16
  10341. if isReg16(v0) {
  10342. p.domain = DomainGeneric
  10343. p.add(0, func(m *_Encoding, v []interface{}) {
  10344. m.emit(0x66)
  10345. m.rexo(0, v[0], false)
  10346. m.emit(0xff)
  10347. m.emit(0xc0 | lcode(v[0]))
  10348. })
  10349. }
  10350. // INCW m16
  10351. if isM16(v0) {
  10352. p.domain = DomainGeneric
  10353. p.add(0, func(m *_Encoding, v []interface{}) {
  10354. m.emit(0x66)
  10355. m.rexo(0, addr(v[0]), false)
  10356. m.emit(0xff)
  10357. m.mrsd(0, addr(v[0]), 1)
  10358. })
  10359. }
  10360. if p.len == 0 {
  10361. panic("invalid operands for INCW")
  10362. }
  10363. return p
  10364. }
  10365. // INSERTPS performs "Insert Packed Single Precision Floating-Point Value".
  10366. //
  10367. // Mnemonic : INSERTPS
  10368. // Supported forms : (2 forms)
  10369. //
  10370. // * INSERTPS imm8, xmm, xmm [SSE4.1]
  10371. // * INSERTPS imm8, m32, xmm [SSE4.1]
  10372. //
  10373. func (self *Program) INSERTPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  10374. p := self.alloc("INSERTPS", 3, Operands { v0, v1, v2 })
  10375. // INSERTPS imm8, xmm, xmm
  10376. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  10377. self.require(ISA_SSE4_1)
  10378. p.domain = DomainMMXSSE
  10379. p.add(0, func(m *_Encoding, v []interface{}) {
  10380. m.emit(0x66)
  10381. m.rexo(hcode(v[2]), v[1], false)
  10382. m.emit(0x0f)
  10383. m.emit(0x3a)
  10384. m.emit(0x21)
  10385. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  10386. m.imm1(toImmAny(v[0]))
  10387. })
  10388. }
  10389. // INSERTPS imm8, m32, xmm
  10390. if isImm8(v0) && isM32(v1) && isXMM(v2) {
  10391. self.require(ISA_SSE4_1)
  10392. p.domain = DomainMMXSSE
  10393. p.add(0, func(m *_Encoding, v []interface{}) {
  10394. m.emit(0x66)
  10395. m.rexo(hcode(v[2]), addr(v[1]), false)
  10396. m.emit(0x0f)
  10397. m.emit(0x3a)
  10398. m.emit(0x21)
  10399. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  10400. m.imm1(toImmAny(v[0]))
  10401. })
  10402. }
  10403. if p.len == 0 {
  10404. panic("invalid operands for INSERTPS")
  10405. }
  10406. return p
  10407. }
  10408. // INSERTQ performs "Insert Field".
  10409. //
  10410. // Mnemonic : INSERTQ
  10411. // Supported forms : (2 forms)
  10412. //
  10413. // * INSERTQ xmm, xmm [SSE4A]
  10414. // * INSERTQ imm8, imm8, xmm, xmm [SSE4A]
  10415. //
  10416. func (self *Program) INSERTQ(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  10417. var p *Instruction
  10418. switch len(vv) {
  10419. case 0 : p = self.alloc("INSERTQ", 2, Operands { v0, v1 })
  10420. case 2 : p = self.alloc("INSERTQ", 4, Operands { v0, v1, vv[0], vv[1] })
  10421. default : panic("instruction INSERTQ takes 2 or 4 operands")
  10422. }
  10423. // INSERTQ xmm, xmm
  10424. if len(vv) == 0 && isXMM(v0) && isXMM(v1) {
  10425. self.require(ISA_SSE4A)
  10426. p.domain = DomainAMDSpecific
  10427. p.add(0, func(m *_Encoding, v []interface{}) {
  10428. m.emit(0xf2)
  10429. m.rexo(hcode(v[1]), v[0], false)
  10430. m.emit(0x0f)
  10431. m.emit(0x79)
  10432. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  10433. })
  10434. }
  10435. // INSERTQ imm8, imm8, xmm, xmm
  10436. if len(vv) == 2 && isImm8(v0) && isImm8(v1) && isXMM(vv[0]) && isXMM(vv[1]) {
  10437. self.require(ISA_SSE4A)
  10438. p.domain = DomainAMDSpecific
  10439. p.add(0, func(m *_Encoding, v []interface{}) {
  10440. m.emit(0xf2)
  10441. m.rexo(hcode(v[3]), v[2], false)
  10442. m.emit(0x0f)
  10443. m.emit(0x78)
  10444. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[2]))
  10445. m.imm1(toImmAny(v[1]))
  10446. m.imm1(toImmAny(v[0]))
  10447. })
  10448. }
  10449. if p.len == 0 {
  10450. panic("invalid operands for INSERTQ")
  10451. }
  10452. return p
  10453. }
  10454. // INT performs "Call to Interrupt Procedure".
  10455. //
  10456. // Mnemonic : INT
  10457. // Supported forms : (2 forms)
  10458. //
  10459. // * INT 3
  10460. // * INT imm8
  10461. //
  10462. func (self *Program) INT(v0 interface{}) *Instruction {
  10463. p := self.alloc("INT", 1, Operands { v0 })
  10464. // INT 3
  10465. if isConst3(v0) {
  10466. p.domain = DomainGeneric
  10467. p.add(0, func(m *_Encoding, v []interface{}) {
  10468. m.emit(0xcc)
  10469. })
  10470. }
  10471. // INT imm8
  10472. if isImm8(v0) {
  10473. p.domain = DomainGeneric
  10474. p.add(0, func(m *_Encoding, v []interface{}) {
  10475. m.emit(0xcd)
  10476. m.imm1(toImmAny(v[0]))
  10477. })
  10478. }
  10479. if p.len == 0 {
  10480. panic("invalid operands for INT")
  10481. }
  10482. return p
  10483. }
  10484. // JA performs "Jump if above (CF == 0 and ZF == 0)".
  10485. //
  10486. // Mnemonic : JA
  10487. // Supported forms : (2 forms)
  10488. //
  10489. // * JA rel8
  10490. // * JA rel32
  10491. //
  10492. func (self *Program) JA(v0 interface{}) *Instruction {
  10493. p := self.alloc("JA", 1, Operands { v0 })
  10494. p.branch = _B_conditional
  10495. // JA rel8
  10496. if isRel8(v0) {
  10497. p.domain = DomainGeneric
  10498. p.add(0, func(m *_Encoding, v []interface{}) {
  10499. m.emit(0x77)
  10500. m.imm1(relv(v[0]))
  10501. })
  10502. }
  10503. // JA rel32
  10504. if isRel32(v0) {
  10505. p.domain = DomainGeneric
  10506. p.add(0, func(m *_Encoding, v []interface{}) {
  10507. m.emit(0x0f)
  10508. m.emit(0x87)
  10509. m.imm4(relv(v[0]))
  10510. })
  10511. }
  10512. // JA label
  10513. if isLabel(v0) {
  10514. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  10515. m.emit(0x77)
  10516. m.imm1(relv(v[0]))
  10517. })
  10518. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  10519. m.emit(0x0f)
  10520. m.emit(0x87)
  10521. m.imm4(relv(v[0]))
  10522. })
  10523. }
  10524. if p.len == 0 {
  10525. panic("invalid operands for JA")
  10526. }
  10527. return p
  10528. }
  10529. // JAE performs "Jump if above or equal (CF == 0)".
  10530. //
  10531. // Mnemonic : JAE
  10532. // Supported forms : (2 forms)
  10533. //
  10534. // * JAE rel8
  10535. // * JAE rel32
  10536. //
  10537. func (self *Program) JAE(v0 interface{}) *Instruction {
  10538. p := self.alloc("JAE", 1, Operands { v0 })
  10539. p.branch = _B_conditional
  10540. // JAE rel8
  10541. if isRel8(v0) {
  10542. p.domain = DomainGeneric
  10543. p.add(0, func(m *_Encoding, v []interface{}) {
  10544. m.emit(0x73)
  10545. m.imm1(relv(v[0]))
  10546. })
  10547. }
  10548. // JAE rel32
  10549. if isRel32(v0) {
  10550. p.domain = DomainGeneric
  10551. p.add(0, func(m *_Encoding, v []interface{}) {
  10552. m.emit(0x0f)
  10553. m.emit(0x83)
  10554. m.imm4(relv(v[0]))
  10555. })
  10556. }
  10557. // JAE label
  10558. if isLabel(v0) {
  10559. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  10560. m.emit(0x73)
  10561. m.imm1(relv(v[0]))
  10562. })
  10563. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  10564. m.emit(0x0f)
  10565. m.emit(0x83)
  10566. m.imm4(relv(v[0]))
  10567. })
  10568. }
  10569. if p.len == 0 {
  10570. panic("invalid operands for JAE")
  10571. }
  10572. return p
  10573. }
  10574. // JB performs "Jump if below (CF == 1)".
  10575. //
  10576. // Mnemonic : JB
  10577. // Supported forms : (2 forms)
  10578. //
  10579. // * JB rel8
  10580. // * JB rel32
  10581. //
  10582. func (self *Program) JB(v0 interface{}) *Instruction {
  10583. p := self.alloc("JB", 1, Operands { v0 })
  10584. p.branch = _B_conditional
  10585. // JB rel8
  10586. if isRel8(v0) {
  10587. p.domain = DomainGeneric
  10588. p.add(0, func(m *_Encoding, v []interface{}) {
  10589. m.emit(0x72)
  10590. m.imm1(relv(v[0]))
  10591. })
  10592. }
  10593. // JB rel32
  10594. if isRel32(v0) {
  10595. p.domain = DomainGeneric
  10596. p.add(0, func(m *_Encoding, v []interface{}) {
  10597. m.emit(0x0f)
  10598. m.emit(0x82)
  10599. m.imm4(relv(v[0]))
  10600. })
  10601. }
  10602. // JB label
  10603. if isLabel(v0) {
  10604. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  10605. m.emit(0x72)
  10606. m.imm1(relv(v[0]))
  10607. })
  10608. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  10609. m.emit(0x0f)
  10610. m.emit(0x82)
  10611. m.imm4(relv(v[0]))
  10612. })
  10613. }
  10614. if p.len == 0 {
  10615. panic("invalid operands for JB")
  10616. }
  10617. return p
  10618. }
  10619. // JBE performs "Jump if below or equal (CF == 1 or ZF == 1)".
  10620. //
  10621. // Mnemonic : JBE
  10622. // Supported forms : (2 forms)
  10623. //
  10624. // * JBE rel8
  10625. // * JBE rel32
  10626. //
  10627. func (self *Program) JBE(v0 interface{}) *Instruction {
  10628. p := self.alloc("JBE", 1, Operands { v0 })
  10629. p.branch = _B_conditional
  10630. // JBE rel8
  10631. if isRel8(v0) {
  10632. p.domain = DomainGeneric
  10633. p.add(0, func(m *_Encoding, v []interface{}) {
  10634. m.emit(0x76)
  10635. m.imm1(relv(v[0]))
  10636. })
  10637. }
  10638. // JBE rel32
  10639. if isRel32(v0) {
  10640. p.domain = DomainGeneric
  10641. p.add(0, func(m *_Encoding, v []interface{}) {
  10642. m.emit(0x0f)
  10643. m.emit(0x86)
  10644. m.imm4(relv(v[0]))
  10645. })
  10646. }
  10647. // JBE label
  10648. if isLabel(v0) {
  10649. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  10650. m.emit(0x76)
  10651. m.imm1(relv(v[0]))
  10652. })
  10653. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  10654. m.emit(0x0f)
  10655. m.emit(0x86)
  10656. m.imm4(relv(v[0]))
  10657. })
  10658. }
  10659. if p.len == 0 {
  10660. panic("invalid operands for JBE")
  10661. }
  10662. return p
  10663. }
  10664. // JC performs "Jump if carry (CF == 1)".
  10665. //
  10666. // Mnemonic : JC
  10667. // Supported forms : (2 forms)
  10668. //
  10669. // * JC rel8
  10670. // * JC rel32
  10671. //
  10672. func (self *Program) JC(v0 interface{}) *Instruction {
  10673. p := self.alloc("JC", 1, Operands { v0 })
  10674. p.branch = _B_conditional
  10675. // JC rel8
  10676. if isRel8(v0) {
  10677. p.domain = DomainGeneric
  10678. p.add(0, func(m *_Encoding, v []interface{}) {
  10679. m.emit(0x72)
  10680. m.imm1(relv(v[0]))
  10681. })
  10682. }
  10683. // JC rel32
  10684. if isRel32(v0) {
  10685. p.domain = DomainGeneric
  10686. p.add(0, func(m *_Encoding, v []interface{}) {
  10687. m.emit(0x0f)
  10688. m.emit(0x82)
  10689. m.imm4(relv(v[0]))
  10690. })
  10691. }
  10692. // JC label
  10693. if isLabel(v0) {
  10694. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  10695. m.emit(0x72)
  10696. m.imm1(relv(v[0]))
  10697. })
  10698. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  10699. m.emit(0x0f)
  10700. m.emit(0x82)
  10701. m.imm4(relv(v[0]))
  10702. })
  10703. }
  10704. if p.len == 0 {
  10705. panic("invalid operands for JC")
  10706. }
  10707. return p
  10708. }
  10709. // JE performs "Jump if equal (ZF == 1)".
  10710. //
  10711. // Mnemonic : JE
  10712. // Supported forms : (2 forms)
  10713. //
  10714. // * JE rel8
  10715. // * JE rel32
  10716. //
  10717. func (self *Program) JE(v0 interface{}) *Instruction {
  10718. p := self.alloc("JE", 1, Operands { v0 })
  10719. p.branch = _B_conditional
  10720. // JE rel8
  10721. if isRel8(v0) {
  10722. p.domain = DomainGeneric
  10723. p.add(0, func(m *_Encoding, v []interface{}) {
  10724. m.emit(0x74)
  10725. m.imm1(relv(v[0]))
  10726. })
  10727. }
  10728. // JE rel32
  10729. if isRel32(v0) {
  10730. p.domain = DomainGeneric
  10731. p.add(0, func(m *_Encoding, v []interface{}) {
  10732. m.emit(0x0f)
  10733. m.emit(0x84)
  10734. m.imm4(relv(v[0]))
  10735. })
  10736. }
  10737. // JE label
  10738. if isLabel(v0) {
  10739. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  10740. m.emit(0x74)
  10741. m.imm1(relv(v[0]))
  10742. })
  10743. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  10744. m.emit(0x0f)
  10745. m.emit(0x84)
  10746. m.imm4(relv(v[0]))
  10747. })
  10748. }
  10749. if p.len == 0 {
  10750. panic("invalid operands for JE")
  10751. }
  10752. return p
  10753. }
  10754. // JECXZ performs "Jump if ECX register is 0".
  10755. //
  10756. // Mnemonic : JECXZ
  10757. // Supported forms : (1 form)
  10758. //
  10759. // * JECXZ rel8
  10760. //
  10761. func (self *Program) JECXZ(v0 interface{}) *Instruction {
  10762. p := self.alloc("JECXZ", 1, Operands { v0 })
  10763. p.branch = _B_conditional
  10764. // JECXZ rel8
  10765. if isRel8(v0) {
  10766. p.domain = DomainGeneric
  10767. p.add(0, func(m *_Encoding, v []interface{}) {
  10768. m.emit(0xe3)
  10769. m.imm1(relv(v[0]))
  10770. })
  10771. }
  10772. // JECXZ label
  10773. if isLabel(v0) {
  10774. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  10775. m.emit(0xe3)
  10776. m.imm1(relv(v[0]))
  10777. })
  10778. }
  10779. if p.len == 0 {
  10780. panic("invalid operands for JECXZ")
  10781. }
  10782. return p
  10783. }
  10784. // JG performs "Jump if greater (ZF == 0 and SF == OF)".
  10785. //
  10786. // Mnemonic : JG
  10787. // Supported forms : (2 forms)
  10788. //
  10789. // * JG rel8
  10790. // * JG rel32
  10791. //
  10792. func (self *Program) JG(v0 interface{}) *Instruction {
  10793. p := self.alloc("JG", 1, Operands { v0 })
  10794. p.branch = _B_conditional
  10795. // JG rel8
  10796. if isRel8(v0) {
  10797. p.domain = DomainGeneric
  10798. p.add(0, func(m *_Encoding, v []interface{}) {
  10799. m.emit(0x7f)
  10800. m.imm1(relv(v[0]))
  10801. })
  10802. }
  10803. // JG rel32
  10804. if isRel32(v0) {
  10805. p.domain = DomainGeneric
  10806. p.add(0, func(m *_Encoding, v []interface{}) {
  10807. m.emit(0x0f)
  10808. m.emit(0x8f)
  10809. m.imm4(relv(v[0]))
  10810. })
  10811. }
  10812. // JG label
  10813. if isLabel(v0) {
  10814. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  10815. m.emit(0x7f)
  10816. m.imm1(relv(v[0]))
  10817. })
  10818. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  10819. m.emit(0x0f)
  10820. m.emit(0x8f)
  10821. m.imm4(relv(v[0]))
  10822. })
  10823. }
  10824. if p.len == 0 {
  10825. panic("invalid operands for JG")
  10826. }
  10827. return p
  10828. }
  10829. // JGE performs "Jump if greater or equal (SF == OF)".
  10830. //
  10831. // Mnemonic : JGE
  10832. // Supported forms : (2 forms)
  10833. //
  10834. // * JGE rel8
  10835. // * JGE rel32
  10836. //
  10837. func (self *Program) JGE(v0 interface{}) *Instruction {
  10838. p := self.alloc("JGE", 1, Operands { v0 })
  10839. p.branch = _B_conditional
  10840. // JGE rel8
  10841. if isRel8(v0) {
  10842. p.domain = DomainGeneric
  10843. p.add(0, func(m *_Encoding, v []interface{}) {
  10844. m.emit(0x7d)
  10845. m.imm1(relv(v[0]))
  10846. })
  10847. }
  10848. // JGE rel32
  10849. if isRel32(v0) {
  10850. p.domain = DomainGeneric
  10851. p.add(0, func(m *_Encoding, v []interface{}) {
  10852. m.emit(0x0f)
  10853. m.emit(0x8d)
  10854. m.imm4(relv(v[0]))
  10855. })
  10856. }
  10857. // JGE label
  10858. if isLabel(v0) {
  10859. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  10860. m.emit(0x7d)
  10861. m.imm1(relv(v[0]))
  10862. })
  10863. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  10864. m.emit(0x0f)
  10865. m.emit(0x8d)
  10866. m.imm4(relv(v[0]))
  10867. })
  10868. }
  10869. if p.len == 0 {
  10870. panic("invalid operands for JGE")
  10871. }
  10872. return p
  10873. }
  10874. // JL performs "Jump if less (SF != OF)".
  10875. //
  10876. // Mnemonic : JL
  10877. // Supported forms : (2 forms)
  10878. //
  10879. // * JL rel8
  10880. // * JL rel32
  10881. //
  10882. func (self *Program) JL(v0 interface{}) *Instruction {
  10883. p := self.alloc("JL", 1, Operands { v0 })
  10884. p.branch = _B_conditional
  10885. // JL rel8
  10886. if isRel8(v0) {
  10887. p.domain = DomainGeneric
  10888. p.add(0, func(m *_Encoding, v []interface{}) {
  10889. m.emit(0x7c)
  10890. m.imm1(relv(v[0]))
  10891. })
  10892. }
  10893. // JL rel32
  10894. if isRel32(v0) {
  10895. p.domain = DomainGeneric
  10896. p.add(0, func(m *_Encoding, v []interface{}) {
  10897. m.emit(0x0f)
  10898. m.emit(0x8c)
  10899. m.imm4(relv(v[0]))
  10900. })
  10901. }
  10902. // JL label
  10903. if isLabel(v0) {
  10904. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  10905. m.emit(0x7c)
  10906. m.imm1(relv(v[0]))
  10907. })
  10908. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  10909. m.emit(0x0f)
  10910. m.emit(0x8c)
  10911. m.imm4(relv(v[0]))
  10912. })
  10913. }
  10914. if p.len == 0 {
  10915. panic("invalid operands for JL")
  10916. }
  10917. return p
  10918. }
  10919. // JLE performs "Jump if less or equal (ZF == 1 or SF != OF)".
  10920. //
  10921. // Mnemonic : JLE
  10922. // Supported forms : (2 forms)
  10923. //
  10924. // * JLE rel8
  10925. // * JLE rel32
  10926. //
  10927. func (self *Program) JLE(v0 interface{}) *Instruction {
  10928. p := self.alloc("JLE", 1, Operands { v0 })
  10929. p.branch = _B_conditional
  10930. // JLE rel8
  10931. if isRel8(v0) {
  10932. p.domain = DomainGeneric
  10933. p.add(0, func(m *_Encoding, v []interface{}) {
  10934. m.emit(0x7e)
  10935. m.imm1(relv(v[0]))
  10936. })
  10937. }
  10938. // JLE rel32
  10939. if isRel32(v0) {
  10940. p.domain = DomainGeneric
  10941. p.add(0, func(m *_Encoding, v []interface{}) {
  10942. m.emit(0x0f)
  10943. m.emit(0x8e)
  10944. m.imm4(relv(v[0]))
  10945. })
  10946. }
  10947. // JLE label
  10948. if isLabel(v0) {
  10949. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  10950. m.emit(0x7e)
  10951. m.imm1(relv(v[0]))
  10952. })
  10953. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  10954. m.emit(0x0f)
  10955. m.emit(0x8e)
  10956. m.imm4(relv(v[0]))
  10957. })
  10958. }
  10959. if p.len == 0 {
  10960. panic("invalid operands for JLE")
  10961. }
  10962. return p
  10963. }
  10964. // JMP performs "Jump Unconditionally".
  10965. //
  10966. // Mnemonic : JMP
  10967. // Supported forms : (2 forms)
  10968. //
  10969. // * JMP rel8
  10970. // * JMP rel32
  10971. //
  10972. func (self *Program) JMP(v0 interface{}) *Instruction {
  10973. p := self.alloc("JMP", 1, Operands { v0 })
  10974. p.branch = _B_unconditional
  10975. // JMP rel8
  10976. if isRel8(v0) {
  10977. p.domain = DomainGeneric
  10978. p.add(0, func(m *_Encoding, v []interface{}) {
  10979. m.emit(0xeb)
  10980. m.imm1(relv(v[0]))
  10981. })
  10982. }
  10983. // JMP rel32
  10984. if isRel32(v0) {
  10985. p.domain = DomainGeneric
  10986. p.add(0, func(m *_Encoding, v []interface{}) {
  10987. m.emit(0xe9)
  10988. m.imm4(relv(v[0]))
  10989. })
  10990. }
  10991. // JMP label
  10992. if isLabel(v0) {
  10993. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  10994. m.emit(0xeb)
  10995. m.imm1(relv(v[0]))
  10996. })
  10997. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  10998. m.emit(0xe9)
  10999. m.imm4(relv(v[0]))
  11000. })
  11001. }
  11002. if p.len == 0 {
  11003. panic("invalid operands for JMP")
  11004. }
  11005. return p
  11006. }
  11007. // JMPQ performs "Jump Unconditionally".
  11008. //
  11009. // Mnemonic : JMP
  11010. // Supported forms : (2 forms)
  11011. //
  11012. // * JMPQ r64
  11013. // * JMPQ m64
  11014. //
  11015. func (self *Program) JMPQ(v0 interface{}) *Instruction {
  11016. p := self.alloc("JMPQ", 1, Operands { v0 })
  11017. // JMPQ r64
  11018. if isReg64(v0) {
  11019. p.domain = DomainGeneric
  11020. p.add(0, func(m *_Encoding, v []interface{}) {
  11021. m.rexo(0, v[0], false)
  11022. m.emit(0xff)
  11023. m.emit(0xe0 | lcode(v[0]))
  11024. })
  11025. }
  11026. // JMPQ m64
  11027. if isM64(v0) {
  11028. p.domain = DomainGeneric
  11029. p.add(0, func(m *_Encoding, v []interface{}) {
  11030. m.rexo(0, addr(v[0]), false)
  11031. m.emit(0xff)
  11032. m.mrsd(4, addr(v[0]), 1)
  11033. })
  11034. }
  11035. if p.len == 0 {
  11036. panic("invalid operands for JMPQ")
  11037. }
  11038. return p
  11039. }
  11040. // JNA performs "Jump if not above (CF == 1 or ZF == 1)".
  11041. //
  11042. // Mnemonic : JNA
  11043. // Supported forms : (2 forms)
  11044. //
  11045. // * JNA rel8
  11046. // * JNA rel32
  11047. //
  11048. func (self *Program) JNA(v0 interface{}) *Instruction {
  11049. p := self.alloc("JNA", 1, Operands { v0 })
  11050. p.branch = _B_conditional
  11051. // JNA rel8
  11052. if isRel8(v0) {
  11053. p.domain = DomainGeneric
  11054. p.add(0, func(m *_Encoding, v []interface{}) {
  11055. m.emit(0x76)
  11056. m.imm1(relv(v[0]))
  11057. })
  11058. }
  11059. // JNA rel32
  11060. if isRel32(v0) {
  11061. p.domain = DomainGeneric
  11062. p.add(0, func(m *_Encoding, v []interface{}) {
  11063. m.emit(0x0f)
  11064. m.emit(0x86)
  11065. m.imm4(relv(v[0]))
  11066. })
  11067. }
  11068. // JNA label
  11069. if isLabel(v0) {
  11070. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  11071. m.emit(0x76)
  11072. m.imm1(relv(v[0]))
  11073. })
  11074. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  11075. m.emit(0x0f)
  11076. m.emit(0x86)
  11077. m.imm4(relv(v[0]))
  11078. })
  11079. }
  11080. if p.len == 0 {
  11081. panic("invalid operands for JNA")
  11082. }
  11083. return p
  11084. }
  11085. // JNAE performs "Jump if not above or equal (CF == 1)".
  11086. //
  11087. // Mnemonic : JNAE
  11088. // Supported forms : (2 forms)
  11089. //
  11090. // * JNAE rel8
  11091. // * JNAE rel32
  11092. //
  11093. func (self *Program) JNAE(v0 interface{}) *Instruction {
  11094. p := self.alloc("JNAE", 1, Operands { v0 })
  11095. p.branch = _B_conditional
  11096. // JNAE rel8
  11097. if isRel8(v0) {
  11098. p.domain = DomainGeneric
  11099. p.add(0, func(m *_Encoding, v []interface{}) {
  11100. m.emit(0x72)
  11101. m.imm1(relv(v[0]))
  11102. })
  11103. }
  11104. // JNAE rel32
  11105. if isRel32(v0) {
  11106. p.domain = DomainGeneric
  11107. p.add(0, func(m *_Encoding, v []interface{}) {
  11108. m.emit(0x0f)
  11109. m.emit(0x82)
  11110. m.imm4(relv(v[0]))
  11111. })
  11112. }
  11113. // JNAE label
  11114. if isLabel(v0) {
  11115. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  11116. m.emit(0x72)
  11117. m.imm1(relv(v[0]))
  11118. })
  11119. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  11120. m.emit(0x0f)
  11121. m.emit(0x82)
  11122. m.imm4(relv(v[0]))
  11123. })
  11124. }
  11125. if p.len == 0 {
  11126. panic("invalid operands for JNAE")
  11127. }
  11128. return p
  11129. }
  11130. // JNB performs "Jump if not below (CF == 0)".
  11131. //
  11132. // Mnemonic : JNB
  11133. // Supported forms : (2 forms)
  11134. //
  11135. // * JNB rel8
  11136. // * JNB rel32
  11137. //
  11138. func (self *Program) JNB(v0 interface{}) *Instruction {
  11139. p := self.alloc("JNB", 1, Operands { v0 })
  11140. p.branch = _B_conditional
  11141. // JNB rel8
  11142. if isRel8(v0) {
  11143. p.domain = DomainGeneric
  11144. p.add(0, func(m *_Encoding, v []interface{}) {
  11145. m.emit(0x73)
  11146. m.imm1(relv(v[0]))
  11147. })
  11148. }
  11149. // JNB rel32
  11150. if isRel32(v0) {
  11151. p.domain = DomainGeneric
  11152. p.add(0, func(m *_Encoding, v []interface{}) {
  11153. m.emit(0x0f)
  11154. m.emit(0x83)
  11155. m.imm4(relv(v[0]))
  11156. })
  11157. }
  11158. // JNB label
  11159. if isLabel(v0) {
  11160. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  11161. m.emit(0x73)
  11162. m.imm1(relv(v[0]))
  11163. })
  11164. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  11165. m.emit(0x0f)
  11166. m.emit(0x83)
  11167. m.imm4(relv(v[0]))
  11168. })
  11169. }
  11170. if p.len == 0 {
  11171. panic("invalid operands for JNB")
  11172. }
  11173. return p
  11174. }
  11175. // JNBE performs "Jump if not below or equal (CF == 0 and ZF == 0)".
  11176. //
  11177. // Mnemonic : JNBE
  11178. // Supported forms : (2 forms)
  11179. //
  11180. // * JNBE rel8
  11181. // * JNBE rel32
  11182. //
  11183. func (self *Program) JNBE(v0 interface{}) *Instruction {
  11184. p := self.alloc("JNBE", 1, Operands { v0 })
  11185. p.branch = _B_conditional
  11186. // JNBE rel8
  11187. if isRel8(v0) {
  11188. p.domain = DomainGeneric
  11189. p.add(0, func(m *_Encoding, v []interface{}) {
  11190. m.emit(0x77)
  11191. m.imm1(relv(v[0]))
  11192. })
  11193. }
  11194. // JNBE rel32
  11195. if isRel32(v0) {
  11196. p.domain = DomainGeneric
  11197. p.add(0, func(m *_Encoding, v []interface{}) {
  11198. m.emit(0x0f)
  11199. m.emit(0x87)
  11200. m.imm4(relv(v[0]))
  11201. })
  11202. }
  11203. // JNBE label
  11204. if isLabel(v0) {
  11205. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  11206. m.emit(0x77)
  11207. m.imm1(relv(v[0]))
  11208. })
  11209. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  11210. m.emit(0x0f)
  11211. m.emit(0x87)
  11212. m.imm4(relv(v[0]))
  11213. })
  11214. }
  11215. if p.len == 0 {
  11216. panic("invalid operands for JNBE")
  11217. }
  11218. return p
  11219. }
  11220. // JNC performs "Jump if not carry (CF == 0)".
  11221. //
  11222. // Mnemonic : JNC
  11223. // Supported forms : (2 forms)
  11224. //
  11225. // * JNC rel8
  11226. // * JNC rel32
  11227. //
  11228. func (self *Program) JNC(v0 interface{}) *Instruction {
  11229. p := self.alloc("JNC", 1, Operands { v0 })
  11230. p.branch = _B_conditional
  11231. // JNC rel8
  11232. if isRel8(v0) {
  11233. p.domain = DomainGeneric
  11234. p.add(0, func(m *_Encoding, v []interface{}) {
  11235. m.emit(0x73)
  11236. m.imm1(relv(v[0]))
  11237. })
  11238. }
  11239. // JNC rel32
  11240. if isRel32(v0) {
  11241. p.domain = DomainGeneric
  11242. p.add(0, func(m *_Encoding, v []interface{}) {
  11243. m.emit(0x0f)
  11244. m.emit(0x83)
  11245. m.imm4(relv(v[0]))
  11246. })
  11247. }
  11248. // JNC label
  11249. if isLabel(v0) {
  11250. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  11251. m.emit(0x73)
  11252. m.imm1(relv(v[0]))
  11253. })
  11254. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  11255. m.emit(0x0f)
  11256. m.emit(0x83)
  11257. m.imm4(relv(v[0]))
  11258. })
  11259. }
  11260. if p.len == 0 {
  11261. panic("invalid operands for JNC")
  11262. }
  11263. return p
  11264. }
  11265. // JNE performs "Jump if not equal (ZF == 0)".
  11266. //
  11267. // Mnemonic : JNE
  11268. // Supported forms : (2 forms)
  11269. //
  11270. // * JNE rel8
  11271. // * JNE rel32
  11272. //
  11273. func (self *Program) JNE(v0 interface{}) *Instruction {
  11274. p := self.alloc("JNE", 1, Operands { v0 })
  11275. p.branch = _B_conditional
  11276. // JNE rel8
  11277. if isRel8(v0) {
  11278. p.domain = DomainGeneric
  11279. p.add(0, func(m *_Encoding, v []interface{}) {
  11280. m.emit(0x75)
  11281. m.imm1(relv(v[0]))
  11282. })
  11283. }
  11284. // JNE rel32
  11285. if isRel32(v0) {
  11286. p.domain = DomainGeneric
  11287. p.add(0, func(m *_Encoding, v []interface{}) {
  11288. m.emit(0x0f)
  11289. m.emit(0x85)
  11290. m.imm4(relv(v[0]))
  11291. })
  11292. }
  11293. // JNE label
  11294. if isLabel(v0) {
  11295. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  11296. m.emit(0x75)
  11297. m.imm1(relv(v[0]))
  11298. })
  11299. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  11300. m.emit(0x0f)
  11301. m.emit(0x85)
  11302. m.imm4(relv(v[0]))
  11303. })
  11304. }
  11305. if p.len == 0 {
  11306. panic("invalid operands for JNE")
  11307. }
  11308. return p
  11309. }
  11310. // JNG performs "Jump if not greater (ZF == 1 or SF != OF)".
  11311. //
  11312. // Mnemonic : JNG
  11313. // Supported forms : (2 forms)
  11314. //
  11315. // * JNG rel8
  11316. // * JNG rel32
  11317. //
  11318. func (self *Program) JNG(v0 interface{}) *Instruction {
  11319. p := self.alloc("JNG", 1, Operands { v0 })
  11320. p.branch = _B_conditional
  11321. // JNG rel8
  11322. if isRel8(v0) {
  11323. p.domain = DomainGeneric
  11324. p.add(0, func(m *_Encoding, v []interface{}) {
  11325. m.emit(0x7e)
  11326. m.imm1(relv(v[0]))
  11327. })
  11328. }
  11329. // JNG rel32
  11330. if isRel32(v0) {
  11331. p.domain = DomainGeneric
  11332. p.add(0, func(m *_Encoding, v []interface{}) {
  11333. m.emit(0x0f)
  11334. m.emit(0x8e)
  11335. m.imm4(relv(v[0]))
  11336. })
  11337. }
  11338. // JNG label
  11339. if isLabel(v0) {
  11340. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  11341. m.emit(0x7e)
  11342. m.imm1(relv(v[0]))
  11343. })
  11344. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  11345. m.emit(0x0f)
  11346. m.emit(0x8e)
  11347. m.imm4(relv(v[0]))
  11348. })
  11349. }
  11350. if p.len == 0 {
  11351. panic("invalid operands for JNG")
  11352. }
  11353. return p
  11354. }
  11355. // JNGE performs "Jump if not greater or equal (SF != OF)".
  11356. //
  11357. // Mnemonic : JNGE
  11358. // Supported forms : (2 forms)
  11359. //
  11360. // * JNGE rel8
  11361. // * JNGE rel32
  11362. //
  11363. func (self *Program) JNGE(v0 interface{}) *Instruction {
  11364. p := self.alloc("JNGE", 1, Operands { v0 })
  11365. p.branch = _B_conditional
  11366. // JNGE rel8
  11367. if isRel8(v0) {
  11368. p.domain = DomainGeneric
  11369. p.add(0, func(m *_Encoding, v []interface{}) {
  11370. m.emit(0x7c)
  11371. m.imm1(relv(v[0]))
  11372. })
  11373. }
  11374. // JNGE rel32
  11375. if isRel32(v0) {
  11376. p.domain = DomainGeneric
  11377. p.add(0, func(m *_Encoding, v []interface{}) {
  11378. m.emit(0x0f)
  11379. m.emit(0x8c)
  11380. m.imm4(relv(v[0]))
  11381. })
  11382. }
  11383. // JNGE label
  11384. if isLabel(v0) {
  11385. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  11386. m.emit(0x7c)
  11387. m.imm1(relv(v[0]))
  11388. })
  11389. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  11390. m.emit(0x0f)
  11391. m.emit(0x8c)
  11392. m.imm4(relv(v[0]))
  11393. })
  11394. }
  11395. if p.len == 0 {
  11396. panic("invalid operands for JNGE")
  11397. }
  11398. return p
  11399. }
  11400. // JNL performs "Jump if not less (SF == OF)".
  11401. //
  11402. // Mnemonic : JNL
  11403. // Supported forms : (2 forms)
  11404. //
  11405. // * JNL rel8
  11406. // * JNL rel32
  11407. //
  11408. func (self *Program) JNL(v0 interface{}) *Instruction {
  11409. p := self.alloc("JNL", 1, Operands { v0 })
  11410. p.branch = _B_conditional
  11411. // JNL rel8
  11412. if isRel8(v0) {
  11413. p.domain = DomainGeneric
  11414. p.add(0, func(m *_Encoding, v []interface{}) {
  11415. m.emit(0x7d)
  11416. m.imm1(relv(v[0]))
  11417. })
  11418. }
  11419. // JNL rel32
  11420. if isRel32(v0) {
  11421. p.domain = DomainGeneric
  11422. p.add(0, func(m *_Encoding, v []interface{}) {
  11423. m.emit(0x0f)
  11424. m.emit(0x8d)
  11425. m.imm4(relv(v[0]))
  11426. })
  11427. }
  11428. // JNL label
  11429. if isLabel(v0) {
  11430. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  11431. m.emit(0x7d)
  11432. m.imm1(relv(v[0]))
  11433. })
  11434. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  11435. m.emit(0x0f)
  11436. m.emit(0x8d)
  11437. m.imm4(relv(v[0]))
  11438. })
  11439. }
  11440. if p.len == 0 {
  11441. panic("invalid operands for JNL")
  11442. }
  11443. return p
  11444. }
  11445. // JNLE performs "Jump if not less or equal (ZF == 0 and SF == OF)".
  11446. //
  11447. // Mnemonic : JNLE
  11448. // Supported forms : (2 forms)
  11449. //
  11450. // * JNLE rel8
  11451. // * JNLE rel32
  11452. //
  11453. func (self *Program) JNLE(v0 interface{}) *Instruction {
  11454. p := self.alloc("JNLE", 1, Operands { v0 })
  11455. p.branch = _B_conditional
  11456. // JNLE rel8
  11457. if isRel8(v0) {
  11458. p.domain = DomainGeneric
  11459. p.add(0, func(m *_Encoding, v []interface{}) {
  11460. m.emit(0x7f)
  11461. m.imm1(relv(v[0]))
  11462. })
  11463. }
  11464. // JNLE rel32
  11465. if isRel32(v0) {
  11466. p.domain = DomainGeneric
  11467. p.add(0, func(m *_Encoding, v []interface{}) {
  11468. m.emit(0x0f)
  11469. m.emit(0x8f)
  11470. m.imm4(relv(v[0]))
  11471. })
  11472. }
  11473. // JNLE label
  11474. if isLabel(v0) {
  11475. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  11476. m.emit(0x7f)
  11477. m.imm1(relv(v[0]))
  11478. })
  11479. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  11480. m.emit(0x0f)
  11481. m.emit(0x8f)
  11482. m.imm4(relv(v[0]))
  11483. })
  11484. }
  11485. if p.len == 0 {
  11486. panic("invalid operands for JNLE")
  11487. }
  11488. return p
  11489. }
  11490. // JNO performs "Jump if not overflow (OF == 0)".
  11491. //
  11492. // Mnemonic : JNO
  11493. // Supported forms : (2 forms)
  11494. //
  11495. // * JNO rel8
  11496. // * JNO rel32
  11497. //
  11498. func (self *Program) JNO(v0 interface{}) *Instruction {
  11499. p := self.alloc("JNO", 1, Operands { v0 })
  11500. p.branch = _B_conditional
  11501. // JNO rel8
  11502. if isRel8(v0) {
  11503. p.domain = DomainGeneric
  11504. p.add(0, func(m *_Encoding, v []interface{}) {
  11505. m.emit(0x71)
  11506. m.imm1(relv(v[0]))
  11507. })
  11508. }
  11509. // JNO rel32
  11510. if isRel32(v0) {
  11511. p.domain = DomainGeneric
  11512. p.add(0, func(m *_Encoding, v []interface{}) {
  11513. m.emit(0x0f)
  11514. m.emit(0x81)
  11515. m.imm4(relv(v[0]))
  11516. })
  11517. }
  11518. // JNO label
  11519. if isLabel(v0) {
  11520. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  11521. m.emit(0x71)
  11522. m.imm1(relv(v[0]))
  11523. })
  11524. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  11525. m.emit(0x0f)
  11526. m.emit(0x81)
  11527. m.imm4(relv(v[0]))
  11528. })
  11529. }
  11530. if p.len == 0 {
  11531. panic("invalid operands for JNO")
  11532. }
  11533. return p
  11534. }
  11535. // JNP performs "Jump if not parity (PF == 0)".
  11536. //
  11537. // Mnemonic : JNP
  11538. // Supported forms : (2 forms)
  11539. //
  11540. // * JNP rel8
  11541. // * JNP rel32
  11542. //
  11543. func (self *Program) JNP(v0 interface{}) *Instruction {
  11544. p := self.alloc("JNP", 1, Operands { v0 })
  11545. p.branch = _B_conditional
  11546. // JNP rel8
  11547. if isRel8(v0) {
  11548. p.domain = DomainGeneric
  11549. p.add(0, func(m *_Encoding, v []interface{}) {
  11550. m.emit(0x7b)
  11551. m.imm1(relv(v[0]))
  11552. })
  11553. }
  11554. // JNP rel32
  11555. if isRel32(v0) {
  11556. p.domain = DomainGeneric
  11557. p.add(0, func(m *_Encoding, v []interface{}) {
  11558. m.emit(0x0f)
  11559. m.emit(0x8b)
  11560. m.imm4(relv(v[0]))
  11561. })
  11562. }
  11563. // JNP label
  11564. if isLabel(v0) {
  11565. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  11566. m.emit(0x7b)
  11567. m.imm1(relv(v[0]))
  11568. })
  11569. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  11570. m.emit(0x0f)
  11571. m.emit(0x8b)
  11572. m.imm4(relv(v[0]))
  11573. })
  11574. }
  11575. if p.len == 0 {
  11576. panic("invalid operands for JNP")
  11577. }
  11578. return p
  11579. }
  11580. // JNS performs "Jump if not sign (SF == 0)".
  11581. //
  11582. // Mnemonic : JNS
  11583. // Supported forms : (2 forms)
  11584. //
  11585. // * JNS rel8
  11586. // * JNS rel32
  11587. //
  11588. func (self *Program) JNS(v0 interface{}) *Instruction {
  11589. p := self.alloc("JNS", 1, Operands { v0 })
  11590. p.branch = _B_conditional
  11591. // JNS rel8
  11592. if isRel8(v0) {
  11593. p.domain = DomainGeneric
  11594. p.add(0, func(m *_Encoding, v []interface{}) {
  11595. m.emit(0x79)
  11596. m.imm1(relv(v[0]))
  11597. })
  11598. }
  11599. // JNS rel32
  11600. if isRel32(v0) {
  11601. p.domain = DomainGeneric
  11602. p.add(0, func(m *_Encoding, v []interface{}) {
  11603. m.emit(0x0f)
  11604. m.emit(0x89)
  11605. m.imm4(relv(v[0]))
  11606. })
  11607. }
  11608. // JNS label
  11609. if isLabel(v0) {
  11610. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  11611. m.emit(0x79)
  11612. m.imm1(relv(v[0]))
  11613. })
  11614. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  11615. m.emit(0x0f)
  11616. m.emit(0x89)
  11617. m.imm4(relv(v[0]))
  11618. })
  11619. }
  11620. if p.len == 0 {
  11621. panic("invalid operands for JNS")
  11622. }
  11623. return p
  11624. }
  11625. // JNZ performs "Jump if not zero (ZF == 0)".
  11626. //
  11627. // Mnemonic : JNZ
  11628. // Supported forms : (2 forms)
  11629. //
  11630. // * JNZ rel8
  11631. // * JNZ rel32
  11632. //
  11633. func (self *Program) JNZ(v0 interface{}) *Instruction {
  11634. p := self.alloc("JNZ", 1, Operands { v0 })
  11635. p.branch = _B_conditional
  11636. // JNZ rel8
  11637. if isRel8(v0) {
  11638. p.domain = DomainGeneric
  11639. p.add(0, func(m *_Encoding, v []interface{}) {
  11640. m.emit(0x75)
  11641. m.imm1(relv(v[0]))
  11642. })
  11643. }
  11644. // JNZ rel32
  11645. if isRel32(v0) {
  11646. p.domain = DomainGeneric
  11647. p.add(0, func(m *_Encoding, v []interface{}) {
  11648. m.emit(0x0f)
  11649. m.emit(0x85)
  11650. m.imm4(relv(v[0]))
  11651. })
  11652. }
  11653. // JNZ label
  11654. if isLabel(v0) {
  11655. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  11656. m.emit(0x75)
  11657. m.imm1(relv(v[0]))
  11658. })
  11659. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  11660. m.emit(0x0f)
  11661. m.emit(0x85)
  11662. m.imm4(relv(v[0]))
  11663. })
  11664. }
  11665. if p.len == 0 {
  11666. panic("invalid operands for JNZ")
  11667. }
  11668. return p
  11669. }
  11670. // JO performs "Jump if overflow (OF == 1)".
  11671. //
  11672. // Mnemonic : JO
  11673. // Supported forms : (2 forms)
  11674. //
  11675. // * JO rel8
  11676. // * JO rel32
  11677. //
  11678. func (self *Program) JO(v0 interface{}) *Instruction {
  11679. p := self.alloc("JO", 1, Operands { v0 })
  11680. p.branch = _B_conditional
  11681. // JO rel8
  11682. if isRel8(v0) {
  11683. p.domain = DomainGeneric
  11684. p.add(0, func(m *_Encoding, v []interface{}) {
  11685. m.emit(0x70)
  11686. m.imm1(relv(v[0]))
  11687. })
  11688. }
  11689. // JO rel32
  11690. if isRel32(v0) {
  11691. p.domain = DomainGeneric
  11692. p.add(0, func(m *_Encoding, v []interface{}) {
  11693. m.emit(0x0f)
  11694. m.emit(0x80)
  11695. m.imm4(relv(v[0]))
  11696. })
  11697. }
  11698. // JO label
  11699. if isLabel(v0) {
  11700. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  11701. m.emit(0x70)
  11702. m.imm1(relv(v[0]))
  11703. })
  11704. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  11705. m.emit(0x0f)
  11706. m.emit(0x80)
  11707. m.imm4(relv(v[0]))
  11708. })
  11709. }
  11710. if p.len == 0 {
  11711. panic("invalid operands for JO")
  11712. }
  11713. return p
  11714. }
  11715. // JP performs "Jump if parity (PF == 1)".
  11716. //
  11717. // Mnemonic : JP
  11718. // Supported forms : (2 forms)
  11719. //
  11720. // * JP rel8
  11721. // * JP rel32
  11722. //
  11723. func (self *Program) JP(v0 interface{}) *Instruction {
  11724. p := self.alloc("JP", 1, Operands { v0 })
  11725. p.branch = _B_conditional
  11726. // JP rel8
  11727. if isRel8(v0) {
  11728. p.domain = DomainGeneric
  11729. p.add(0, func(m *_Encoding, v []interface{}) {
  11730. m.emit(0x7a)
  11731. m.imm1(relv(v[0]))
  11732. })
  11733. }
  11734. // JP rel32
  11735. if isRel32(v0) {
  11736. p.domain = DomainGeneric
  11737. p.add(0, func(m *_Encoding, v []interface{}) {
  11738. m.emit(0x0f)
  11739. m.emit(0x8a)
  11740. m.imm4(relv(v[0]))
  11741. })
  11742. }
  11743. // JP label
  11744. if isLabel(v0) {
  11745. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  11746. m.emit(0x7a)
  11747. m.imm1(relv(v[0]))
  11748. })
  11749. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  11750. m.emit(0x0f)
  11751. m.emit(0x8a)
  11752. m.imm4(relv(v[0]))
  11753. })
  11754. }
  11755. if p.len == 0 {
  11756. panic("invalid operands for JP")
  11757. }
  11758. return p
  11759. }
  11760. // JPE performs "Jump if parity even (PF == 1)".
  11761. //
  11762. // Mnemonic : JPE
  11763. // Supported forms : (2 forms)
  11764. //
  11765. // * JPE rel8
  11766. // * JPE rel32
  11767. //
  11768. func (self *Program) JPE(v0 interface{}) *Instruction {
  11769. p := self.alloc("JPE", 1, Operands { v0 })
  11770. p.branch = _B_conditional
  11771. // JPE rel8
  11772. if isRel8(v0) {
  11773. p.domain = DomainGeneric
  11774. p.add(0, func(m *_Encoding, v []interface{}) {
  11775. m.emit(0x7a)
  11776. m.imm1(relv(v[0]))
  11777. })
  11778. }
  11779. // JPE rel32
  11780. if isRel32(v0) {
  11781. p.domain = DomainGeneric
  11782. p.add(0, func(m *_Encoding, v []interface{}) {
  11783. m.emit(0x0f)
  11784. m.emit(0x8a)
  11785. m.imm4(relv(v[0]))
  11786. })
  11787. }
  11788. // JPE label
  11789. if isLabel(v0) {
  11790. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  11791. m.emit(0x7a)
  11792. m.imm1(relv(v[0]))
  11793. })
  11794. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  11795. m.emit(0x0f)
  11796. m.emit(0x8a)
  11797. m.imm4(relv(v[0]))
  11798. })
  11799. }
  11800. if p.len == 0 {
  11801. panic("invalid operands for JPE")
  11802. }
  11803. return p
  11804. }
  11805. // JPO performs "Jump if parity odd (PF == 0)".
  11806. //
  11807. // Mnemonic : JPO
  11808. // Supported forms : (2 forms)
  11809. //
  11810. // * JPO rel8
  11811. // * JPO rel32
  11812. //
  11813. func (self *Program) JPO(v0 interface{}) *Instruction {
  11814. p := self.alloc("JPO", 1, Operands { v0 })
  11815. p.branch = _B_conditional
  11816. // JPO rel8
  11817. if isRel8(v0) {
  11818. p.domain = DomainGeneric
  11819. p.add(0, func(m *_Encoding, v []interface{}) {
  11820. m.emit(0x7b)
  11821. m.imm1(relv(v[0]))
  11822. })
  11823. }
  11824. // JPO rel32
  11825. if isRel32(v0) {
  11826. p.domain = DomainGeneric
  11827. p.add(0, func(m *_Encoding, v []interface{}) {
  11828. m.emit(0x0f)
  11829. m.emit(0x8b)
  11830. m.imm4(relv(v[0]))
  11831. })
  11832. }
  11833. // JPO label
  11834. if isLabel(v0) {
  11835. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  11836. m.emit(0x7b)
  11837. m.imm1(relv(v[0]))
  11838. })
  11839. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  11840. m.emit(0x0f)
  11841. m.emit(0x8b)
  11842. m.imm4(relv(v[0]))
  11843. })
  11844. }
  11845. if p.len == 0 {
  11846. panic("invalid operands for JPO")
  11847. }
  11848. return p
  11849. }
  11850. // JRCXZ performs "Jump if RCX register is 0".
  11851. //
  11852. // Mnemonic : JRCXZ
  11853. // Supported forms : (1 form)
  11854. //
  11855. // * JRCXZ rel8
  11856. //
  11857. func (self *Program) JRCXZ(v0 interface{}) *Instruction {
  11858. p := self.alloc("JRCXZ", 1, Operands { v0 })
  11859. p.branch = _B_conditional
  11860. // JRCXZ rel8
  11861. if isRel8(v0) {
  11862. p.domain = DomainGeneric
  11863. p.add(0, func(m *_Encoding, v []interface{}) {
  11864. m.emit(0xe3)
  11865. m.imm1(relv(v[0]))
  11866. })
  11867. }
  11868. // JRCXZ label
  11869. if isLabel(v0) {
  11870. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  11871. m.emit(0xe3)
  11872. m.imm1(relv(v[0]))
  11873. })
  11874. }
  11875. if p.len == 0 {
  11876. panic("invalid operands for JRCXZ")
  11877. }
  11878. return p
  11879. }
  11880. // JS performs "Jump if sign (SF == 1)".
  11881. //
  11882. // Mnemonic : JS
  11883. // Supported forms : (2 forms)
  11884. //
  11885. // * JS rel8
  11886. // * JS rel32
  11887. //
  11888. func (self *Program) JS(v0 interface{}) *Instruction {
  11889. p := self.alloc("JS", 1, Operands { v0 })
  11890. p.branch = _B_conditional
  11891. // JS rel8
  11892. if isRel8(v0) {
  11893. p.domain = DomainGeneric
  11894. p.add(0, func(m *_Encoding, v []interface{}) {
  11895. m.emit(0x78)
  11896. m.imm1(relv(v[0]))
  11897. })
  11898. }
  11899. // JS rel32
  11900. if isRel32(v0) {
  11901. p.domain = DomainGeneric
  11902. p.add(0, func(m *_Encoding, v []interface{}) {
  11903. m.emit(0x0f)
  11904. m.emit(0x88)
  11905. m.imm4(relv(v[0]))
  11906. })
  11907. }
  11908. // JS label
  11909. if isLabel(v0) {
  11910. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  11911. m.emit(0x78)
  11912. m.imm1(relv(v[0]))
  11913. })
  11914. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  11915. m.emit(0x0f)
  11916. m.emit(0x88)
  11917. m.imm4(relv(v[0]))
  11918. })
  11919. }
  11920. if p.len == 0 {
  11921. panic("invalid operands for JS")
  11922. }
  11923. return p
  11924. }
  11925. // JZ performs "Jump if zero (ZF == 1)".
  11926. //
  11927. // Mnemonic : JZ
  11928. // Supported forms : (2 forms)
  11929. //
  11930. // * JZ rel8
  11931. // * JZ rel32
  11932. //
  11933. func (self *Program) JZ(v0 interface{}) *Instruction {
  11934. p := self.alloc("JZ", 1, Operands { v0 })
  11935. p.branch = _B_conditional
  11936. // JZ rel8
  11937. if isRel8(v0) {
  11938. p.domain = DomainGeneric
  11939. p.add(0, func(m *_Encoding, v []interface{}) {
  11940. m.emit(0x74)
  11941. m.imm1(relv(v[0]))
  11942. })
  11943. }
  11944. // JZ rel32
  11945. if isRel32(v0) {
  11946. p.domain = DomainGeneric
  11947. p.add(0, func(m *_Encoding, v []interface{}) {
  11948. m.emit(0x0f)
  11949. m.emit(0x84)
  11950. m.imm4(relv(v[0]))
  11951. })
  11952. }
  11953. // JZ label
  11954. if isLabel(v0) {
  11955. p.add(_F_rel1, func(m *_Encoding, v []interface{}) {
  11956. m.emit(0x74)
  11957. m.imm1(relv(v[0]))
  11958. })
  11959. p.add(_F_rel4, func(m *_Encoding, v []interface{}) {
  11960. m.emit(0x0f)
  11961. m.emit(0x84)
  11962. m.imm4(relv(v[0]))
  11963. })
  11964. }
  11965. if p.len == 0 {
  11966. panic("invalid operands for JZ")
  11967. }
  11968. return p
  11969. }
  11970. // KADDB performs "ADD Two 8-bit Masks".
  11971. //
  11972. // Mnemonic : KADDB
  11973. // Supported forms : (1 form)
  11974. //
  11975. // * KADDB k, k, k [AVX512DQ]
  11976. //
  11977. func (self *Program) KADDB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  11978. p := self.alloc("KADDB", 3, Operands { v0, v1, v2 })
  11979. // KADDB k, k, k
  11980. if isK(v0) && isK(v1) && isK(v2) {
  11981. self.require(ISA_AVX512DQ)
  11982. p.domain = DomainMask
  11983. p.add(0, func(m *_Encoding, v []interface{}) {
  11984. m.vex2(5, 0, nil, hlcode(v[1]))
  11985. m.emit(0x4a)
  11986. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  11987. })
  11988. }
  11989. if p.len == 0 {
  11990. panic("invalid operands for KADDB")
  11991. }
  11992. return p
  11993. }
  11994. // KADDD performs "ADD Two 32-bit Masks".
  11995. //
  11996. // Mnemonic : KADDD
  11997. // Supported forms : (1 form)
  11998. //
  11999. // * KADDD k, k, k [AVX512BW]
  12000. //
  12001. func (self *Program) KADDD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  12002. p := self.alloc("KADDD", 3, Operands { v0, v1, v2 })
  12003. // KADDD k, k, k
  12004. if isK(v0) && isK(v1) && isK(v2) {
  12005. self.require(ISA_AVX512BW)
  12006. p.domain = DomainMask
  12007. p.add(0, func(m *_Encoding, v []interface{}) {
  12008. m.emit(0xc4)
  12009. m.emit(0xe1)
  12010. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  12011. m.emit(0x4a)
  12012. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  12013. })
  12014. }
  12015. if p.len == 0 {
  12016. panic("invalid operands for KADDD")
  12017. }
  12018. return p
  12019. }
  12020. // KADDQ performs "ADD Two 64-bit Masks".
  12021. //
  12022. // Mnemonic : KADDQ
  12023. // Supported forms : (1 form)
  12024. //
  12025. // * KADDQ k, k, k [AVX512BW]
  12026. //
  12027. func (self *Program) KADDQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  12028. p := self.alloc("KADDQ", 3, Operands { v0, v1, v2 })
  12029. // KADDQ k, k, k
  12030. if isK(v0) && isK(v1) && isK(v2) {
  12031. self.require(ISA_AVX512BW)
  12032. p.domain = DomainMask
  12033. p.add(0, func(m *_Encoding, v []interface{}) {
  12034. m.emit(0xc4)
  12035. m.emit(0xe1)
  12036. m.emit(0xfc ^ (hlcode(v[1]) << 3))
  12037. m.emit(0x4a)
  12038. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  12039. })
  12040. }
  12041. if p.len == 0 {
  12042. panic("invalid operands for KADDQ")
  12043. }
  12044. return p
  12045. }
  12046. // KADDW performs "ADD Two 16-bit Masks".
  12047. //
  12048. // Mnemonic : KADDW
  12049. // Supported forms : (1 form)
  12050. //
  12051. // * KADDW k, k, k [AVX512DQ]
  12052. //
  12053. func (self *Program) KADDW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  12054. p := self.alloc("KADDW", 3, Operands { v0, v1, v2 })
  12055. // KADDW k, k, k
  12056. if isK(v0) && isK(v1) && isK(v2) {
  12057. self.require(ISA_AVX512DQ)
  12058. p.domain = DomainMask
  12059. p.add(0, func(m *_Encoding, v []interface{}) {
  12060. m.vex2(4, 0, nil, hlcode(v[1]))
  12061. m.emit(0x4a)
  12062. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  12063. })
  12064. }
  12065. if p.len == 0 {
  12066. panic("invalid operands for KADDW")
  12067. }
  12068. return p
  12069. }
  12070. // KANDB performs "Bitwise Logical AND 8-bit Masks".
  12071. //
  12072. // Mnemonic : KANDB
  12073. // Supported forms : (1 form)
  12074. //
  12075. // * KANDB k, k, k [AVX512DQ]
  12076. //
  12077. func (self *Program) KANDB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  12078. p := self.alloc("KANDB", 3, Operands { v0, v1, v2 })
  12079. // KANDB k, k, k
  12080. if isK(v0) && isK(v1) && isK(v2) {
  12081. self.require(ISA_AVX512DQ)
  12082. p.domain = DomainMask
  12083. p.add(0, func(m *_Encoding, v []interface{}) {
  12084. m.vex2(5, 0, nil, hlcode(v[1]))
  12085. m.emit(0x41)
  12086. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  12087. })
  12088. }
  12089. if p.len == 0 {
  12090. panic("invalid operands for KANDB")
  12091. }
  12092. return p
  12093. }
  12094. // KANDD performs "Bitwise Logical AND 32-bit Masks".
  12095. //
  12096. // Mnemonic : KANDD
  12097. // Supported forms : (1 form)
  12098. //
  12099. // * KANDD k, k, k [AVX512BW]
  12100. //
  12101. func (self *Program) KANDD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  12102. p := self.alloc("KANDD", 3, Operands { v0, v1, v2 })
  12103. // KANDD k, k, k
  12104. if isK(v0) && isK(v1) && isK(v2) {
  12105. self.require(ISA_AVX512BW)
  12106. p.domain = DomainMask
  12107. p.add(0, func(m *_Encoding, v []interface{}) {
  12108. m.emit(0xc4)
  12109. m.emit(0xe1)
  12110. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  12111. m.emit(0x41)
  12112. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  12113. })
  12114. }
  12115. if p.len == 0 {
  12116. panic("invalid operands for KANDD")
  12117. }
  12118. return p
  12119. }
  12120. // KANDNB performs "Bitwise Logical AND NOT 8-bit Masks".
  12121. //
  12122. // Mnemonic : KANDNB
  12123. // Supported forms : (1 form)
  12124. //
  12125. // * KANDNB k, k, k [AVX512DQ]
  12126. //
  12127. func (self *Program) KANDNB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  12128. p := self.alloc("KANDNB", 3, Operands { v0, v1, v2 })
  12129. // KANDNB k, k, k
  12130. if isK(v0) && isK(v1) && isK(v2) {
  12131. self.require(ISA_AVX512DQ)
  12132. p.domain = DomainMask
  12133. p.add(0, func(m *_Encoding, v []interface{}) {
  12134. m.vex2(5, 0, nil, hlcode(v[1]))
  12135. m.emit(0x42)
  12136. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  12137. })
  12138. }
  12139. if p.len == 0 {
  12140. panic("invalid operands for KANDNB")
  12141. }
  12142. return p
  12143. }
  12144. // KANDND performs "Bitwise Logical AND NOT 32-bit Masks".
  12145. //
  12146. // Mnemonic : KANDND
  12147. // Supported forms : (1 form)
  12148. //
  12149. // * KANDND k, k, k [AVX512BW]
  12150. //
  12151. func (self *Program) KANDND(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  12152. p := self.alloc("KANDND", 3, Operands { v0, v1, v2 })
  12153. // KANDND k, k, k
  12154. if isK(v0) && isK(v1) && isK(v2) {
  12155. self.require(ISA_AVX512BW)
  12156. p.domain = DomainMask
  12157. p.add(0, func(m *_Encoding, v []interface{}) {
  12158. m.emit(0xc4)
  12159. m.emit(0xe1)
  12160. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  12161. m.emit(0x42)
  12162. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  12163. })
  12164. }
  12165. if p.len == 0 {
  12166. panic("invalid operands for KANDND")
  12167. }
  12168. return p
  12169. }
  12170. // KANDNQ performs "Bitwise Logical AND NOT 64-bit Masks".
  12171. //
  12172. // Mnemonic : KANDNQ
  12173. // Supported forms : (1 form)
  12174. //
  12175. // * KANDNQ k, k, k [AVX512BW]
  12176. //
  12177. func (self *Program) KANDNQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  12178. p := self.alloc("KANDNQ", 3, Operands { v0, v1, v2 })
  12179. // KANDNQ k, k, k
  12180. if isK(v0) && isK(v1) && isK(v2) {
  12181. self.require(ISA_AVX512BW)
  12182. p.domain = DomainMask
  12183. p.add(0, func(m *_Encoding, v []interface{}) {
  12184. m.emit(0xc4)
  12185. m.emit(0xe1)
  12186. m.emit(0xfc ^ (hlcode(v[1]) << 3))
  12187. m.emit(0x42)
  12188. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  12189. })
  12190. }
  12191. if p.len == 0 {
  12192. panic("invalid operands for KANDNQ")
  12193. }
  12194. return p
  12195. }
  12196. // KANDNW performs "Bitwise Logical AND NOT 16-bit Masks".
  12197. //
  12198. // Mnemonic : KANDNW
  12199. // Supported forms : (1 form)
  12200. //
  12201. // * KANDNW k, k, k [AVX512F]
  12202. //
  12203. func (self *Program) KANDNW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  12204. p := self.alloc("KANDNW", 3, Operands { v0, v1, v2 })
  12205. // KANDNW k, k, k
  12206. if isK(v0) && isK(v1) && isK(v2) {
  12207. self.require(ISA_AVX512F)
  12208. p.domain = DomainMask
  12209. p.add(0, func(m *_Encoding, v []interface{}) {
  12210. m.vex2(4, 0, nil, hlcode(v[1]))
  12211. m.emit(0x42)
  12212. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  12213. })
  12214. }
  12215. if p.len == 0 {
  12216. panic("invalid operands for KANDNW")
  12217. }
  12218. return p
  12219. }
  12220. // KANDQ performs "Bitwise Logical AND 64-bit Masks".
  12221. //
  12222. // Mnemonic : KANDQ
  12223. // Supported forms : (1 form)
  12224. //
  12225. // * KANDQ k, k, k [AVX512BW]
  12226. //
  12227. func (self *Program) KANDQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  12228. p := self.alloc("KANDQ", 3, Operands { v0, v1, v2 })
  12229. // KANDQ k, k, k
  12230. if isK(v0) && isK(v1) && isK(v2) {
  12231. self.require(ISA_AVX512BW)
  12232. p.domain = DomainMask
  12233. p.add(0, func(m *_Encoding, v []interface{}) {
  12234. m.emit(0xc4)
  12235. m.emit(0xe1)
  12236. m.emit(0xfc ^ (hlcode(v[1]) << 3))
  12237. m.emit(0x41)
  12238. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  12239. })
  12240. }
  12241. if p.len == 0 {
  12242. panic("invalid operands for KANDQ")
  12243. }
  12244. return p
  12245. }
  12246. // KANDW performs "Bitwise Logical AND 16-bit Masks".
  12247. //
  12248. // Mnemonic : KANDW
  12249. // Supported forms : (1 form)
  12250. //
  12251. // * KANDW k, k, k [AVX512F]
  12252. //
  12253. func (self *Program) KANDW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  12254. p := self.alloc("KANDW", 3, Operands { v0, v1, v2 })
  12255. // KANDW k, k, k
  12256. if isK(v0) && isK(v1) && isK(v2) {
  12257. self.require(ISA_AVX512F)
  12258. p.domain = DomainMask
  12259. p.add(0, func(m *_Encoding, v []interface{}) {
  12260. m.vex2(4, 0, nil, hlcode(v[1]))
  12261. m.emit(0x41)
  12262. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  12263. })
  12264. }
  12265. if p.len == 0 {
  12266. panic("invalid operands for KANDW")
  12267. }
  12268. return p
  12269. }
  12270. // KMOVB performs "Move 8-bit Mask".
  12271. //
  12272. // Mnemonic : KMOVB
  12273. // Supported forms : (5 forms)
  12274. //
  12275. // * KMOVB k, k [AVX512DQ]
  12276. // * KMOVB r32, k [AVX512DQ]
  12277. // * KMOVB m8, k [AVX512DQ]
  12278. // * KMOVB k, r32 [AVX512DQ]
  12279. // * KMOVB k, m8 [AVX512DQ]
  12280. //
  12281. func (self *Program) KMOVB(v0 interface{}, v1 interface{}) *Instruction {
  12282. p := self.alloc("KMOVB", 2, Operands { v0, v1 })
  12283. // KMOVB k, k
  12284. if isK(v0) && isK(v1) {
  12285. self.require(ISA_AVX512DQ)
  12286. p.domain = DomainMask
  12287. p.add(0, func(m *_Encoding, v []interface{}) {
  12288. m.vex2(1, 0, nil, 0)
  12289. m.emit(0x90)
  12290. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  12291. })
  12292. }
  12293. // KMOVB r32, k
  12294. if isReg32(v0) && isK(v1) {
  12295. self.require(ISA_AVX512DQ)
  12296. p.domain = DomainMask
  12297. p.add(0, func(m *_Encoding, v []interface{}) {
  12298. m.vex2(1, 0, v[0], 0)
  12299. m.emit(0x92)
  12300. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  12301. })
  12302. }
  12303. // KMOVB m8, k
  12304. if isM8(v0) && isK(v1) {
  12305. self.require(ISA_AVX512DQ)
  12306. p.domain = DomainMask
  12307. p.add(0, func(m *_Encoding, v []interface{}) {
  12308. m.vex2(1, 0, addr(v[0]), 0)
  12309. m.emit(0x90)
  12310. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  12311. })
  12312. }
  12313. // KMOVB k, r32
  12314. if isK(v0) && isReg32(v1) {
  12315. self.require(ISA_AVX512DQ)
  12316. p.domain = DomainMask
  12317. p.add(0, func(m *_Encoding, v []interface{}) {
  12318. m.vex2(1, hcode(v[1]), nil, 0)
  12319. m.emit(0x93)
  12320. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  12321. })
  12322. }
  12323. // KMOVB k, m8
  12324. if isK(v0) && isM8(v1) {
  12325. self.require(ISA_AVX512DQ)
  12326. p.domain = DomainMask
  12327. p.add(0, func(m *_Encoding, v []interface{}) {
  12328. m.vex2(1, 0, addr(v[1]), 0)
  12329. m.emit(0x91)
  12330. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  12331. })
  12332. }
  12333. if p.len == 0 {
  12334. panic("invalid operands for KMOVB")
  12335. }
  12336. return p
  12337. }
  12338. // KMOVD performs "Move 32-bit Mask".
  12339. //
  12340. // Mnemonic : KMOVD
  12341. // Supported forms : (5 forms)
  12342. //
  12343. // * KMOVD k, k [AVX512BW]
  12344. // * KMOVD r32, k [AVX512BW]
  12345. // * KMOVD m32, k [AVX512BW]
  12346. // * KMOVD k, r32 [AVX512BW]
  12347. // * KMOVD k, m32 [AVX512BW]
  12348. //
  12349. func (self *Program) KMOVD(v0 interface{}, v1 interface{}) *Instruction {
  12350. p := self.alloc("KMOVD", 2, Operands { v0, v1 })
  12351. // KMOVD k, k
  12352. if isK(v0) && isK(v1) {
  12353. self.require(ISA_AVX512BW)
  12354. p.domain = DomainMask
  12355. p.add(0, func(m *_Encoding, v []interface{}) {
  12356. m.emit(0xc4)
  12357. m.emit(0xe1)
  12358. m.emit(0xf9)
  12359. m.emit(0x90)
  12360. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  12361. })
  12362. }
  12363. // KMOVD r32, k
  12364. if isReg32(v0) && isK(v1) {
  12365. self.require(ISA_AVX512BW)
  12366. p.domain = DomainMask
  12367. p.add(0, func(m *_Encoding, v []interface{}) {
  12368. m.vex2(3, 0, v[0], 0)
  12369. m.emit(0x92)
  12370. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  12371. })
  12372. }
  12373. // KMOVD m32, k
  12374. if isM32(v0) && isK(v1) {
  12375. self.require(ISA_AVX512BW)
  12376. p.domain = DomainMask
  12377. p.add(0, func(m *_Encoding, v []interface{}) {
  12378. m.vex3(0xc4, 0b1, 0x81, 0, addr(v[0]), 0)
  12379. m.emit(0x90)
  12380. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  12381. })
  12382. }
  12383. // KMOVD k, r32
  12384. if isK(v0) && isReg32(v1) {
  12385. self.require(ISA_AVX512BW)
  12386. p.domain = DomainMask
  12387. p.add(0, func(m *_Encoding, v []interface{}) {
  12388. m.vex2(3, hcode(v[1]), nil, 0)
  12389. m.emit(0x93)
  12390. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  12391. })
  12392. }
  12393. // KMOVD k, m32
  12394. if isK(v0) && isM32(v1) {
  12395. self.require(ISA_AVX512BW)
  12396. p.domain = DomainMask
  12397. p.add(0, func(m *_Encoding, v []interface{}) {
  12398. m.vex3(0xc4, 0b1, 0x81, 0, addr(v[1]), 0)
  12399. m.emit(0x91)
  12400. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  12401. })
  12402. }
  12403. if p.len == 0 {
  12404. panic("invalid operands for KMOVD")
  12405. }
  12406. return p
  12407. }
  12408. // KMOVQ performs "Move 64-bit Mask".
  12409. //
  12410. // Mnemonic : KMOVQ
  12411. // Supported forms : (5 forms)
  12412. //
  12413. // * KMOVQ k, k [AVX512BW]
  12414. // * KMOVQ r64, k [AVX512BW]
  12415. // * KMOVQ m64, k [AVX512BW]
  12416. // * KMOVQ k, r64 [AVX512BW]
  12417. // * KMOVQ k, m64 [AVX512BW]
  12418. //
  12419. func (self *Program) KMOVQ(v0 interface{}, v1 interface{}) *Instruction {
  12420. p := self.alloc("KMOVQ", 2, Operands { v0, v1 })
  12421. // KMOVQ k, k
  12422. if isK(v0) && isK(v1) {
  12423. self.require(ISA_AVX512BW)
  12424. p.domain = DomainMask
  12425. p.add(0, func(m *_Encoding, v []interface{}) {
  12426. m.emit(0xc4)
  12427. m.emit(0xe1)
  12428. m.emit(0xf8)
  12429. m.emit(0x90)
  12430. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  12431. })
  12432. }
  12433. // KMOVQ r64, k
  12434. if isReg64(v0) && isK(v1) {
  12435. self.require(ISA_AVX512BW)
  12436. p.domain = DomainMask
  12437. p.add(0, func(m *_Encoding, v []interface{}) {
  12438. m.emit(0xc4)
  12439. m.emit(0xe1 ^ (hcode(v[0]) << 5))
  12440. m.emit(0xfb)
  12441. m.emit(0x92)
  12442. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  12443. })
  12444. }
  12445. // KMOVQ m64, k
  12446. if isM64(v0) && isK(v1) {
  12447. self.require(ISA_AVX512BW)
  12448. p.domain = DomainMask
  12449. p.add(0, func(m *_Encoding, v []interface{}) {
  12450. m.vex3(0xc4, 0b1, 0x80, 0, addr(v[0]), 0)
  12451. m.emit(0x90)
  12452. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  12453. })
  12454. }
  12455. // KMOVQ k, r64
  12456. if isK(v0) && isReg64(v1) {
  12457. self.require(ISA_AVX512BW)
  12458. p.domain = DomainMask
  12459. p.add(0, func(m *_Encoding, v []interface{}) {
  12460. m.emit(0xc4)
  12461. m.emit(0xe1 ^ (hcode(v[1]) << 7))
  12462. m.emit(0xfb)
  12463. m.emit(0x93)
  12464. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  12465. })
  12466. }
  12467. // KMOVQ k, m64
  12468. if isK(v0) && isM64(v1) {
  12469. self.require(ISA_AVX512BW)
  12470. p.domain = DomainMask
  12471. p.add(0, func(m *_Encoding, v []interface{}) {
  12472. m.vex3(0xc4, 0b1, 0x80, 0, addr(v[1]), 0)
  12473. m.emit(0x91)
  12474. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  12475. })
  12476. }
  12477. if p.len == 0 {
  12478. panic("invalid operands for KMOVQ")
  12479. }
  12480. return p
  12481. }
  12482. // KMOVW performs "Move 16-bit Mask".
  12483. //
  12484. // Mnemonic : KMOVW
  12485. // Supported forms : (5 forms)
  12486. //
  12487. // * KMOVW k, k [AVX512F]
  12488. // * KMOVW r32, k [AVX512F]
  12489. // * KMOVW m16, k [AVX512F]
  12490. // * KMOVW k, r32 [AVX512F]
  12491. // * KMOVW k, m16 [AVX512F]
  12492. //
  12493. func (self *Program) KMOVW(v0 interface{}, v1 interface{}) *Instruction {
  12494. p := self.alloc("KMOVW", 2, Operands { v0, v1 })
  12495. // KMOVW k, k
  12496. if isK(v0) && isK(v1) {
  12497. self.require(ISA_AVX512F)
  12498. p.domain = DomainMask
  12499. p.add(0, func(m *_Encoding, v []interface{}) {
  12500. m.vex2(0, 0, nil, 0)
  12501. m.emit(0x90)
  12502. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  12503. })
  12504. }
  12505. // KMOVW r32, k
  12506. if isReg32(v0) && isK(v1) {
  12507. self.require(ISA_AVX512F)
  12508. p.domain = DomainMask
  12509. p.add(0, func(m *_Encoding, v []interface{}) {
  12510. m.vex2(0, 0, v[0], 0)
  12511. m.emit(0x92)
  12512. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  12513. })
  12514. }
  12515. // KMOVW m16, k
  12516. if isM16(v0) && isK(v1) {
  12517. self.require(ISA_AVX512F)
  12518. p.domain = DomainMask
  12519. p.add(0, func(m *_Encoding, v []interface{}) {
  12520. m.vex2(0, 0, addr(v[0]), 0)
  12521. m.emit(0x90)
  12522. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  12523. })
  12524. }
  12525. // KMOVW k, r32
  12526. if isK(v0) && isReg32(v1) {
  12527. self.require(ISA_AVX512F)
  12528. p.domain = DomainMask
  12529. p.add(0, func(m *_Encoding, v []interface{}) {
  12530. m.vex2(0, hcode(v[1]), nil, 0)
  12531. m.emit(0x93)
  12532. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  12533. })
  12534. }
  12535. // KMOVW k, m16
  12536. if isK(v0) && isM16(v1) {
  12537. self.require(ISA_AVX512F)
  12538. p.domain = DomainMask
  12539. p.add(0, func(m *_Encoding, v []interface{}) {
  12540. m.vex2(0, 0, addr(v[1]), 0)
  12541. m.emit(0x91)
  12542. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  12543. })
  12544. }
  12545. if p.len == 0 {
  12546. panic("invalid operands for KMOVW")
  12547. }
  12548. return p
  12549. }
  12550. // KNOTB performs "NOT 8-bit Mask Register".
  12551. //
  12552. // Mnemonic : KNOTB
  12553. // Supported forms : (1 form)
  12554. //
  12555. // * KNOTB k, k [AVX512DQ]
  12556. //
  12557. func (self *Program) KNOTB(v0 interface{}, v1 interface{}) *Instruction {
  12558. p := self.alloc("KNOTB", 2, Operands { v0, v1 })
  12559. // KNOTB k, k
  12560. if isK(v0) && isK(v1) {
  12561. self.require(ISA_AVX512DQ)
  12562. p.domain = DomainMask
  12563. p.add(0, func(m *_Encoding, v []interface{}) {
  12564. m.vex2(1, 0, nil, 0)
  12565. m.emit(0x44)
  12566. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  12567. })
  12568. }
  12569. if p.len == 0 {
  12570. panic("invalid operands for KNOTB")
  12571. }
  12572. return p
  12573. }
  12574. // KNOTD performs "NOT 32-bit Mask Register".
  12575. //
  12576. // Mnemonic : KNOTD
  12577. // Supported forms : (1 form)
  12578. //
  12579. // * KNOTD k, k [AVX512BW]
  12580. //
  12581. func (self *Program) KNOTD(v0 interface{}, v1 interface{}) *Instruction {
  12582. p := self.alloc("KNOTD", 2, Operands { v0, v1 })
  12583. // KNOTD k, k
  12584. if isK(v0) && isK(v1) {
  12585. self.require(ISA_AVX512BW)
  12586. p.domain = DomainMask
  12587. p.add(0, func(m *_Encoding, v []interface{}) {
  12588. m.emit(0xc4)
  12589. m.emit(0xe1)
  12590. m.emit(0xf9)
  12591. m.emit(0x44)
  12592. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  12593. })
  12594. }
  12595. if p.len == 0 {
  12596. panic("invalid operands for KNOTD")
  12597. }
  12598. return p
  12599. }
  12600. // KNOTQ performs "NOT 64-bit Mask Register".
  12601. //
  12602. // Mnemonic : KNOTQ
  12603. // Supported forms : (1 form)
  12604. //
  12605. // * KNOTQ k, k [AVX512BW]
  12606. //
  12607. func (self *Program) KNOTQ(v0 interface{}, v1 interface{}) *Instruction {
  12608. p := self.alloc("KNOTQ", 2, Operands { v0, v1 })
  12609. // KNOTQ k, k
  12610. if isK(v0) && isK(v1) {
  12611. self.require(ISA_AVX512BW)
  12612. p.domain = DomainMask
  12613. p.add(0, func(m *_Encoding, v []interface{}) {
  12614. m.emit(0xc4)
  12615. m.emit(0xe1)
  12616. m.emit(0xf8)
  12617. m.emit(0x44)
  12618. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  12619. })
  12620. }
  12621. if p.len == 0 {
  12622. panic("invalid operands for KNOTQ")
  12623. }
  12624. return p
  12625. }
  12626. // KNOTW performs "NOT 16-bit Mask Register".
  12627. //
  12628. // Mnemonic : KNOTW
  12629. // Supported forms : (1 form)
  12630. //
  12631. // * KNOTW k, k [AVX512F]
  12632. //
  12633. func (self *Program) KNOTW(v0 interface{}, v1 interface{}) *Instruction {
  12634. p := self.alloc("KNOTW", 2, Operands { v0, v1 })
  12635. // KNOTW k, k
  12636. if isK(v0) && isK(v1) {
  12637. self.require(ISA_AVX512F)
  12638. p.domain = DomainMask
  12639. p.add(0, func(m *_Encoding, v []interface{}) {
  12640. m.vex2(0, 0, nil, 0)
  12641. m.emit(0x44)
  12642. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  12643. })
  12644. }
  12645. if p.len == 0 {
  12646. panic("invalid operands for KNOTW")
  12647. }
  12648. return p
  12649. }
  12650. // KORB performs "Bitwise Logical OR 8-bit Masks".
  12651. //
  12652. // Mnemonic : KORB
  12653. // Supported forms : (1 form)
  12654. //
  12655. // * KORB k, k, k [AVX512DQ]
  12656. //
  12657. func (self *Program) KORB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  12658. p := self.alloc("KORB", 3, Operands { v0, v1, v2 })
  12659. // KORB k, k, k
  12660. if isK(v0) && isK(v1) && isK(v2) {
  12661. self.require(ISA_AVX512DQ)
  12662. p.domain = DomainMask
  12663. p.add(0, func(m *_Encoding, v []interface{}) {
  12664. m.vex2(5, 0, nil, hlcode(v[1]))
  12665. m.emit(0x45)
  12666. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  12667. })
  12668. }
  12669. if p.len == 0 {
  12670. panic("invalid operands for KORB")
  12671. }
  12672. return p
  12673. }
  12674. // KORD performs "Bitwise Logical OR 32-bit Masks".
  12675. //
  12676. // Mnemonic : KORD
  12677. // Supported forms : (1 form)
  12678. //
  12679. // * KORD k, k, k [AVX512BW]
  12680. //
  12681. func (self *Program) KORD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  12682. p := self.alloc("KORD", 3, Operands { v0, v1, v2 })
  12683. // KORD k, k, k
  12684. if isK(v0) && isK(v1) && isK(v2) {
  12685. self.require(ISA_AVX512BW)
  12686. p.domain = DomainMask
  12687. p.add(0, func(m *_Encoding, v []interface{}) {
  12688. m.emit(0xc4)
  12689. m.emit(0xe1)
  12690. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  12691. m.emit(0x45)
  12692. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  12693. })
  12694. }
  12695. if p.len == 0 {
  12696. panic("invalid operands for KORD")
  12697. }
  12698. return p
  12699. }
  12700. // KORQ performs "Bitwise Logical OR 64-bit Masks".
  12701. //
  12702. // Mnemonic : KORQ
  12703. // Supported forms : (1 form)
  12704. //
  12705. // * KORQ k, k, k [AVX512BW]
  12706. //
  12707. func (self *Program) KORQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  12708. p := self.alloc("KORQ", 3, Operands { v0, v1, v2 })
  12709. // KORQ k, k, k
  12710. if isK(v0) && isK(v1) && isK(v2) {
  12711. self.require(ISA_AVX512BW)
  12712. p.domain = DomainMask
  12713. p.add(0, func(m *_Encoding, v []interface{}) {
  12714. m.emit(0xc4)
  12715. m.emit(0xe1)
  12716. m.emit(0xfc ^ (hlcode(v[1]) << 3))
  12717. m.emit(0x45)
  12718. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  12719. })
  12720. }
  12721. if p.len == 0 {
  12722. panic("invalid operands for KORQ")
  12723. }
  12724. return p
  12725. }
  12726. // KORTESTB performs "OR 8-bit Masks and Set Flags".
  12727. //
  12728. // Mnemonic : KORTESTB
  12729. // Supported forms : (1 form)
  12730. //
  12731. // * KORTESTB k, k [AVX512DQ]
  12732. //
  12733. func (self *Program) KORTESTB(v0 interface{}, v1 interface{}) *Instruction {
  12734. p := self.alloc("KORTESTB", 2, Operands { v0, v1 })
  12735. // KORTESTB k, k
  12736. if isK(v0) && isK(v1) {
  12737. self.require(ISA_AVX512DQ)
  12738. p.domain = DomainMask
  12739. p.add(0, func(m *_Encoding, v []interface{}) {
  12740. m.vex2(1, 0, nil, 0)
  12741. m.emit(0x98)
  12742. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  12743. })
  12744. }
  12745. if p.len == 0 {
  12746. panic("invalid operands for KORTESTB")
  12747. }
  12748. return p
  12749. }
  12750. // KORTESTD performs "OR 32-bit Masks and Set Flags".
  12751. //
  12752. // Mnemonic : KORTESTD
  12753. // Supported forms : (1 form)
  12754. //
  12755. // * KORTESTD k, k [AVX512BW]
  12756. //
  12757. func (self *Program) KORTESTD(v0 interface{}, v1 interface{}) *Instruction {
  12758. p := self.alloc("KORTESTD", 2, Operands { v0, v1 })
  12759. // KORTESTD k, k
  12760. if isK(v0) && isK(v1) {
  12761. self.require(ISA_AVX512BW)
  12762. p.domain = DomainMask
  12763. p.add(0, func(m *_Encoding, v []interface{}) {
  12764. m.emit(0xc4)
  12765. m.emit(0xe1)
  12766. m.emit(0xf9)
  12767. m.emit(0x98)
  12768. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  12769. })
  12770. }
  12771. if p.len == 0 {
  12772. panic("invalid operands for KORTESTD")
  12773. }
  12774. return p
  12775. }
  12776. // KORTESTQ performs "OR 64-bit Masks and Set Flags".
  12777. //
  12778. // Mnemonic : KORTESTQ
  12779. // Supported forms : (1 form)
  12780. //
  12781. // * KORTESTQ k, k [AVX512BW]
  12782. //
  12783. func (self *Program) KORTESTQ(v0 interface{}, v1 interface{}) *Instruction {
  12784. p := self.alloc("KORTESTQ", 2, Operands { v0, v1 })
  12785. // KORTESTQ k, k
  12786. if isK(v0) && isK(v1) {
  12787. self.require(ISA_AVX512BW)
  12788. p.domain = DomainMask
  12789. p.add(0, func(m *_Encoding, v []interface{}) {
  12790. m.emit(0xc4)
  12791. m.emit(0xe1)
  12792. m.emit(0xf8)
  12793. m.emit(0x98)
  12794. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  12795. })
  12796. }
  12797. if p.len == 0 {
  12798. panic("invalid operands for KORTESTQ")
  12799. }
  12800. return p
  12801. }
  12802. // KORTESTW performs "OR 16-bit Masks and Set Flags".
  12803. //
  12804. // Mnemonic : KORTESTW
  12805. // Supported forms : (1 form)
  12806. //
  12807. // * KORTESTW k, k [AVX512F]
  12808. //
  12809. func (self *Program) KORTESTW(v0 interface{}, v1 interface{}) *Instruction {
  12810. p := self.alloc("KORTESTW", 2, Operands { v0, v1 })
  12811. // KORTESTW k, k
  12812. if isK(v0) && isK(v1) {
  12813. self.require(ISA_AVX512F)
  12814. p.domain = DomainMask
  12815. p.add(0, func(m *_Encoding, v []interface{}) {
  12816. m.vex2(0, 0, nil, 0)
  12817. m.emit(0x98)
  12818. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  12819. })
  12820. }
  12821. if p.len == 0 {
  12822. panic("invalid operands for KORTESTW")
  12823. }
  12824. return p
  12825. }
  12826. // KORW performs "Bitwise Logical OR 16-bit Masks".
  12827. //
  12828. // Mnemonic : KORW
  12829. // Supported forms : (1 form)
  12830. //
  12831. // * KORW k, k, k [AVX512F]
  12832. //
  12833. func (self *Program) KORW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  12834. p := self.alloc("KORW", 3, Operands { v0, v1, v2 })
  12835. // KORW k, k, k
  12836. if isK(v0) && isK(v1) && isK(v2) {
  12837. self.require(ISA_AVX512F)
  12838. p.domain = DomainMask
  12839. p.add(0, func(m *_Encoding, v []interface{}) {
  12840. m.vex2(4, 0, nil, hlcode(v[1]))
  12841. m.emit(0x45)
  12842. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  12843. })
  12844. }
  12845. if p.len == 0 {
  12846. panic("invalid operands for KORW")
  12847. }
  12848. return p
  12849. }
  12850. // KSHIFTLB performs "Shift Left 8-bit Masks".
  12851. //
  12852. // Mnemonic : KSHIFTLB
  12853. // Supported forms : (1 form)
  12854. //
  12855. // * KSHIFTLB imm8, k, k [AVX512DQ]
  12856. //
  12857. func (self *Program) KSHIFTLB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  12858. p := self.alloc("KSHIFTLB", 3, Operands { v0, v1, v2 })
  12859. // KSHIFTLB imm8, k, k
  12860. if isImm8(v0) && isK(v1) && isK(v2) {
  12861. self.require(ISA_AVX512DQ)
  12862. p.domain = DomainMask
  12863. p.add(0, func(m *_Encoding, v []interface{}) {
  12864. m.emit(0xc4)
  12865. m.emit(0xe3)
  12866. m.emit(0x79)
  12867. m.emit(0x32)
  12868. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  12869. m.imm1(toImmAny(v[0]))
  12870. })
  12871. }
  12872. if p.len == 0 {
  12873. panic("invalid operands for KSHIFTLB")
  12874. }
  12875. return p
  12876. }
  12877. // KSHIFTLD performs "Shift Left 32-bit Masks".
  12878. //
  12879. // Mnemonic : KSHIFTLD
  12880. // Supported forms : (1 form)
  12881. //
  12882. // * KSHIFTLD imm8, k, k [AVX512BW]
  12883. //
  12884. func (self *Program) KSHIFTLD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  12885. p := self.alloc("KSHIFTLD", 3, Operands { v0, v1, v2 })
  12886. // KSHIFTLD imm8, k, k
  12887. if isImm8(v0) && isK(v1) && isK(v2) {
  12888. self.require(ISA_AVX512BW)
  12889. p.domain = DomainMask
  12890. p.add(0, func(m *_Encoding, v []interface{}) {
  12891. m.emit(0xc4)
  12892. m.emit(0xe3)
  12893. m.emit(0x79)
  12894. m.emit(0x33)
  12895. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  12896. m.imm1(toImmAny(v[0]))
  12897. })
  12898. }
  12899. if p.len == 0 {
  12900. panic("invalid operands for KSHIFTLD")
  12901. }
  12902. return p
  12903. }
  12904. // KSHIFTLQ performs "Shift Left 64-bit Masks".
  12905. //
  12906. // Mnemonic : KSHIFTLQ
  12907. // Supported forms : (1 form)
  12908. //
  12909. // * KSHIFTLQ imm8, k, k [AVX512BW]
  12910. //
  12911. func (self *Program) KSHIFTLQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  12912. p := self.alloc("KSHIFTLQ", 3, Operands { v0, v1, v2 })
  12913. // KSHIFTLQ imm8, k, k
  12914. if isImm8(v0) && isK(v1) && isK(v2) {
  12915. self.require(ISA_AVX512BW)
  12916. p.domain = DomainMask
  12917. p.add(0, func(m *_Encoding, v []interface{}) {
  12918. m.emit(0xc4)
  12919. m.emit(0xe3)
  12920. m.emit(0xf9)
  12921. m.emit(0x33)
  12922. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  12923. m.imm1(toImmAny(v[0]))
  12924. })
  12925. }
  12926. if p.len == 0 {
  12927. panic("invalid operands for KSHIFTLQ")
  12928. }
  12929. return p
  12930. }
  12931. // KSHIFTLW performs "Shift Left 16-bit Masks".
  12932. //
  12933. // Mnemonic : KSHIFTLW
  12934. // Supported forms : (1 form)
  12935. //
  12936. // * KSHIFTLW imm8, k, k [AVX512F]
  12937. //
  12938. func (self *Program) KSHIFTLW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  12939. p := self.alloc("KSHIFTLW", 3, Operands { v0, v1, v2 })
  12940. // KSHIFTLW imm8, k, k
  12941. if isImm8(v0) && isK(v1) && isK(v2) {
  12942. self.require(ISA_AVX512F)
  12943. p.domain = DomainMask
  12944. p.add(0, func(m *_Encoding, v []interface{}) {
  12945. m.emit(0xc4)
  12946. m.emit(0xe3)
  12947. m.emit(0xf9)
  12948. m.emit(0x32)
  12949. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  12950. m.imm1(toImmAny(v[0]))
  12951. })
  12952. }
  12953. if p.len == 0 {
  12954. panic("invalid operands for KSHIFTLW")
  12955. }
  12956. return p
  12957. }
  12958. // KSHIFTRB performs "Shift Right 8-bit Masks".
  12959. //
  12960. // Mnemonic : KSHIFTRB
  12961. // Supported forms : (1 form)
  12962. //
  12963. // * KSHIFTRB imm8, k, k [AVX512DQ]
  12964. //
  12965. func (self *Program) KSHIFTRB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  12966. p := self.alloc("KSHIFTRB", 3, Operands { v0, v1, v2 })
  12967. // KSHIFTRB imm8, k, k
  12968. if isImm8(v0) && isK(v1) && isK(v2) {
  12969. self.require(ISA_AVX512DQ)
  12970. p.domain = DomainMask
  12971. p.add(0, func(m *_Encoding, v []interface{}) {
  12972. m.emit(0xc4)
  12973. m.emit(0xe3)
  12974. m.emit(0x79)
  12975. m.emit(0x30)
  12976. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  12977. m.imm1(toImmAny(v[0]))
  12978. })
  12979. }
  12980. if p.len == 0 {
  12981. panic("invalid operands for KSHIFTRB")
  12982. }
  12983. return p
  12984. }
  12985. // KSHIFTRD performs "Shift Right 32-bit Masks".
  12986. //
  12987. // Mnemonic : KSHIFTRD
  12988. // Supported forms : (1 form)
  12989. //
  12990. // * KSHIFTRD imm8, k, k [AVX512BW]
  12991. //
  12992. func (self *Program) KSHIFTRD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  12993. p := self.alloc("KSHIFTRD", 3, Operands { v0, v1, v2 })
  12994. // KSHIFTRD imm8, k, k
  12995. if isImm8(v0) && isK(v1) && isK(v2) {
  12996. self.require(ISA_AVX512BW)
  12997. p.domain = DomainMask
  12998. p.add(0, func(m *_Encoding, v []interface{}) {
  12999. m.emit(0xc4)
  13000. m.emit(0xe3)
  13001. m.emit(0x79)
  13002. m.emit(0x31)
  13003. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  13004. m.imm1(toImmAny(v[0]))
  13005. })
  13006. }
  13007. if p.len == 0 {
  13008. panic("invalid operands for KSHIFTRD")
  13009. }
  13010. return p
  13011. }
  13012. // KSHIFTRQ performs "Shift Right 64-bit Masks".
  13013. //
  13014. // Mnemonic : KSHIFTRQ
  13015. // Supported forms : (1 form)
  13016. //
  13017. // * KSHIFTRQ imm8, k, k [AVX512BW]
  13018. //
  13019. func (self *Program) KSHIFTRQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  13020. p := self.alloc("KSHIFTRQ", 3, Operands { v0, v1, v2 })
  13021. // KSHIFTRQ imm8, k, k
  13022. if isImm8(v0) && isK(v1) && isK(v2) {
  13023. self.require(ISA_AVX512BW)
  13024. p.domain = DomainMask
  13025. p.add(0, func(m *_Encoding, v []interface{}) {
  13026. m.emit(0xc4)
  13027. m.emit(0xe3)
  13028. m.emit(0xf9)
  13029. m.emit(0x31)
  13030. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  13031. m.imm1(toImmAny(v[0]))
  13032. })
  13033. }
  13034. if p.len == 0 {
  13035. panic("invalid operands for KSHIFTRQ")
  13036. }
  13037. return p
  13038. }
  13039. // KSHIFTRW performs "Shift Right 16-bit Masks".
  13040. //
  13041. // Mnemonic : KSHIFTRW
  13042. // Supported forms : (1 form)
  13043. //
  13044. // * KSHIFTRW imm8, k, k [AVX512F]
  13045. //
  13046. func (self *Program) KSHIFTRW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  13047. p := self.alloc("KSHIFTRW", 3, Operands { v0, v1, v2 })
  13048. // KSHIFTRW imm8, k, k
  13049. if isImm8(v0) && isK(v1) && isK(v2) {
  13050. self.require(ISA_AVX512F)
  13051. p.domain = DomainMask
  13052. p.add(0, func(m *_Encoding, v []interface{}) {
  13053. m.emit(0xc4)
  13054. m.emit(0xe3)
  13055. m.emit(0xf9)
  13056. m.emit(0x30)
  13057. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  13058. m.imm1(toImmAny(v[0]))
  13059. })
  13060. }
  13061. if p.len == 0 {
  13062. panic("invalid operands for KSHIFTRW")
  13063. }
  13064. return p
  13065. }
  13066. // KTESTB performs "Bit Test 8-bit Masks and Set Flags".
  13067. //
  13068. // Mnemonic : KTESTB
  13069. // Supported forms : (1 form)
  13070. //
  13071. // * KTESTB k, k [AVX512DQ]
  13072. //
  13073. func (self *Program) KTESTB(v0 interface{}, v1 interface{}) *Instruction {
  13074. p := self.alloc("KTESTB", 2, Operands { v0, v1 })
  13075. // KTESTB k, k
  13076. if isK(v0) && isK(v1) {
  13077. self.require(ISA_AVX512DQ)
  13078. p.domain = DomainMask
  13079. p.add(0, func(m *_Encoding, v []interface{}) {
  13080. m.vex2(1, 0, nil, 0)
  13081. m.emit(0x99)
  13082. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  13083. })
  13084. }
  13085. if p.len == 0 {
  13086. panic("invalid operands for KTESTB")
  13087. }
  13088. return p
  13089. }
  13090. // KTESTD performs "Bit Test 32-bit Masks and Set Flags".
  13091. //
  13092. // Mnemonic : KTESTD
  13093. // Supported forms : (1 form)
  13094. //
  13095. // * KTESTD k, k [AVX512BW]
  13096. //
  13097. func (self *Program) KTESTD(v0 interface{}, v1 interface{}) *Instruction {
  13098. p := self.alloc("KTESTD", 2, Operands { v0, v1 })
  13099. // KTESTD k, k
  13100. if isK(v0) && isK(v1) {
  13101. self.require(ISA_AVX512BW)
  13102. p.domain = DomainMask
  13103. p.add(0, func(m *_Encoding, v []interface{}) {
  13104. m.emit(0xc4)
  13105. m.emit(0xe1)
  13106. m.emit(0xf9)
  13107. m.emit(0x99)
  13108. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  13109. })
  13110. }
  13111. if p.len == 0 {
  13112. panic("invalid operands for KTESTD")
  13113. }
  13114. return p
  13115. }
  13116. // KTESTQ performs "Bit Test 64-bit Masks and Set Flags".
  13117. //
  13118. // Mnemonic : KTESTQ
  13119. // Supported forms : (1 form)
  13120. //
  13121. // * KTESTQ k, k [AVX512BW]
  13122. //
  13123. func (self *Program) KTESTQ(v0 interface{}, v1 interface{}) *Instruction {
  13124. p := self.alloc("KTESTQ", 2, Operands { v0, v1 })
  13125. // KTESTQ k, k
  13126. if isK(v0) && isK(v1) {
  13127. self.require(ISA_AVX512BW)
  13128. p.domain = DomainMask
  13129. p.add(0, func(m *_Encoding, v []interface{}) {
  13130. m.emit(0xc4)
  13131. m.emit(0xe1)
  13132. m.emit(0xf8)
  13133. m.emit(0x99)
  13134. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  13135. })
  13136. }
  13137. if p.len == 0 {
  13138. panic("invalid operands for KTESTQ")
  13139. }
  13140. return p
  13141. }
  13142. // KTESTW performs "Bit Test 16-bit Masks and Set Flags".
  13143. //
  13144. // Mnemonic : KTESTW
  13145. // Supported forms : (1 form)
  13146. //
  13147. // * KTESTW k, k [AVX512DQ]
  13148. //
  13149. func (self *Program) KTESTW(v0 interface{}, v1 interface{}) *Instruction {
  13150. p := self.alloc("KTESTW", 2, Operands { v0, v1 })
  13151. // KTESTW k, k
  13152. if isK(v0) && isK(v1) {
  13153. self.require(ISA_AVX512DQ)
  13154. p.domain = DomainMask
  13155. p.add(0, func(m *_Encoding, v []interface{}) {
  13156. m.vex2(0, 0, nil, 0)
  13157. m.emit(0x99)
  13158. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  13159. })
  13160. }
  13161. if p.len == 0 {
  13162. panic("invalid operands for KTESTW")
  13163. }
  13164. return p
  13165. }
  13166. // KUNPCKBW performs "Unpack and Interleave 8-bit Masks".
  13167. //
  13168. // Mnemonic : KUNPCKBW
  13169. // Supported forms : (1 form)
  13170. //
  13171. // * KUNPCKBW k, k, k [AVX512F]
  13172. //
  13173. func (self *Program) KUNPCKBW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  13174. p := self.alloc("KUNPCKBW", 3, Operands { v0, v1, v2 })
  13175. // KUNPCKBW k, k, k
  13176. if isK(v0) && isK(v1) && isK(v2) {
  13177. self.require(ISA_AVX512F)
  13178. p.domain = DomainMask
  13179. p.add(0, func(m *_Encoding, v []interface{}) {
  13180. m.vex2(5, 0, nil, hlcode(v[1]))
  13181. m.emit(0x4b)
  13182. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  13183. })
  13184. }
  13185. if p.len == 0 {
  13186. panic("invalid operands for KUNPCKBW")
  13187. }
  13188. return p
  13189. }
  13190. // KUNPCKDQ performs "Unpack and Interleave 32-bit Masks".
  13191. //
  13192. // Mnemonic : KUNPCKDQ
  13193. // Supported forms : (1 form)
  13194. //
  13195. // * KUNPCKDQ k, k, k [AVX512BW]
  13196. //
  13197. func (self *Program) KUNPCKDQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  13198. p := self.alloc("KUNPCKDQ", 3, Operands { v0, v1, v2 })
  13199. // KUNPCKDQ k, k, k
  13200. if isK(v0) && isK(v1) && isK(v2) {
  13201. self.require(ISA_AVX512BW)
  13202. p.domain = DomainMask
  13203. p.add(0, func(m *_Encoding, v []interface{}) {
  13204. m.emit(0xc4)
  13205. m.emit(0xe1)
  13206. m.emit(0xfc ^ (hlcode(v[1]) << 3))
  13207. m.emit(0x4b)
  13208. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  13209. })
  13210. }
  13211. if p.len == 0 {
  13212. panic("invalid operands for KUNPCKDQ")
  13213. }
  13214. return p
  13215. }
  13216. // KUNPCKWD performs "Unpack and Interleave 16-bit Masks".
  13217. //
  13218. // Mnemonic : KUNPCKWD
  13219. // Supported forms : (1 form)
  13220. //
  13221. // * KUNPCKWD k, k, k [AVX512BW]
  13222. //
  13223. func (self *Program) KUNPCKWD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  13224. p := self.alloc("KUNPCKWD", 3, Operands { v0, v1, v2 })
  13225. // KUNPCKWD k, k, k
  13226. if isK(v0) && isK(v1) && isK(v2) {
  13227. self.require(ISA_AVX512BW)
  13228. p.domain = DomainMask
  13229. p.add(0, func(m *_Encoding, v []interface{}) {
  13230. m.vex2(4, 0, nil, hlcode(v[1]))
  13231. m.emit(0x4b)
  13232. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  13233. })
  13234. }
  13235. if p.len == 0 {
  13236. panic("invalid operands for KUNPCKWD")
  13237. }
  13238. return p
  13239. }
  13240. // KXNORB performs "Bitwise Logical XNOR 8-bit Masks".
  13241. //
  13242. // Mnemonic : KXNORB
  13243. // Supported forms : (1 form)
  13244. //
  13245. // * KXNORB k, k, k [AVX512DQ]
  13246. //
  13247. func (self *Program) KXNORB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  13248. p := self.alloc("KXNORB", 3, Operands { v0, v1, v2 })
  13249. // KXNORB k, k, k
  13250. if isK(v0) && isK(v1) && isK(v2) {
  13251. self.require(ISA_AVX512DQ)
  13252. p.domain = DomainMask
  13253. p.add(0, func(m *_Encoding, v []interface{}) {
  13254. m.vex2(5, 0, nil, hlcode(v[1]))
  13255. m.emit(0x46)
  13256. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  13257. })
  13258. }
  13259. if p.len == 0 {
  13260. panic("invalid operands for KXNORB")
  13261. }
  13262. return p
  13263. }
  13264. // KXNORD performs "Bitwise Logical XNOR 32-bit Masks".
  13265. //
  13266. // Mnemonic : KXNORD
  13267. // Supported forms : (1 form)
  13268. //
  13269. // * KXNORD k, k, k [AVX512BW]
  13270. //
  13271. func (self *Program) KXNORD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  13272. p := self.alloc("KXNORD", 3, Operands { v0, v1, v2 })
  13273. // KXNORD k, k, k
  13274. if isK(v0) && isK(v1) && isK(v2) {
  13275. self.require(ISA_AVX512BW)
  13276. p.domain = DomainMask
  13277. p.add(0, func(m *_Encoding, v []interface{}) {
  13278. m.emit(0xc4)
  13279. m.emit(0xe1)
  13280. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  13281. m.emit(0x46)
  13282. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  13283. })
  13284. }
  13285. if p.len == 0 {
  13286. panic("invalid operands for KXNORD")
  13287. }
  13288. return p
  13289. }
  13290. // KXNORQ performs "Bitwise Logical XNOR 64-bit Masks".
  13291. //
  13292. // Mnemonic : KXNORQ
  13293. // Supported forms : (1 form)
  13294. //
  13295. // * KXNORQ k, k, k [AVX512BW]
  13296. //
  13297. func (self *Program) KXNORQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  13298. p := self.alloc("KXNORQ", 3, Operands { v0, v1, v2 })
  13299. // KXNORQ k, k, k
  13300. if isK(v0) && isK(v1) && isK(v2) {
  13301. self.require(ISA_AVX512BW)
  13302. p.domain = DomainMask
  13303. p.add(0, func(m *_Encoding, v []interface{}) {
  13304. m.emit(0xc4)
  13305. m.emit(0xe1)
  13306. m.emit(0xfc ^ (hlcode(v[1]) << 3))
  13307. m.emit(0x46)
  13308. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  13309. })
  13310. }
  13311. if p.len == 0 {
  13312. panic("invalid operands for KXNORQ")
  13313. }
  13314. return p
  13315. }
  13316. // KXNORW performs "Bitwise Logical XNOR 16-bit Masks".
  13317. //
  13318. // Mnemonic : KXNORW
  13319. // Supported forms : (1 form)
  13320. //
  13321. // * KXNORW k, k, k [AVX512F]
  13322. //
  13323. func (self *Program) KXNORW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  13324. p := self.alloc("KXNORW", 3, Operands { v0, v1, v2 })
  13325. // KXNORW k, k, k
  13326. if isK(v0) && isK(v1) && isK(v2) {
  13327. self.require(ISA_AVX512F)
  13328. p.domain = DomainMask
  13329. p.add(0, func(m *_Encoding, v []interface{}) {
  13330. m.vex2(4, 0, nil, hlcode(v[1]))
  13331. m.emit(0x46)
  13332. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  13333. })
  13334. }
  13335. if p.len == 0 {
  13336. panic("invalid operands for KXNORW")
  13337. }
  13338. return p
  13339. }
  13340. // KXORB performs "Bitwise Logical XOR 8-bit Masks".
  13341. //
  13342. // Mnemonic : KXORB
  13343. // Supported forms : (1 form)
  13344. //
  13345. // * KXORB k, k, k [AVX512DQ]
  13346. //
  13347. func (self *Program) KXORB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  13348. p := self.alloc("KXORB", 3, Operands { v0, v1, v2 })
  13349. // KXORB k, k, k
  13350. if isK(v0) && isK(v1) && isK(v2) {
  13351. self.require(ISA_AVX512DQ)
  13352. p.domain = DomainMask
  13353. p.add(0, func(m *_Encoding, v []interface{}) {
  13354. m.vex2(5, 0, nil, hlcode(v[1]))
  13355. m.emit(0x47)
  13356. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  13357. })
  13358. }
  13359. if p.len == 0 {
  13360. panic("invalid operands for KXORB")
  13361. }
  13362. return p
  13363. }
  13364. // KXORD performs "Bitwise Logical XOR 32-bit Masks".
  13365. //
  13366. // Mnemonic : KXORD
  13367. // Supported forms : (1 form)
  13368. //
  13369. // * KXORD k, k, k [AVX512BW]
  13370. //
  13371. func (self *Program) KXORD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  13372. p := self.alloc("KXORD", 3, Operands { v0, v1, v2 })
  13373. // KXORD k, k, k
  13374. if isK(v0) && isK(v1) && isK(v2) {
  13375. self.require(ISA_AVX512BW)
  13376. p.domain = DomainMask
  13377. p.add(0, func(m *_Encoding, v []interface{}) {
  13378. m.emit(0xc4)
  13379. m.emit(0xe1)
  13380. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  13381. m.emit(0x47)
  13382. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  13383. })
  13384. }
  13385. if p.len == 0 {
  13386. panic("invalid operands for KXORD")
  13387. }
  13388. return p
  13389. }
  13390. // KXORQ performs "Bitwise Logical XOR 64-bit Masks".
  13391. //
  13392. // Mnemonic : KXORQ
  13393. // Supported forms : (1 form)
  13394. //
  13395. // * KXORQ k, k, k [AVX512BW]
  13396. //
  13397. func (self *Program) KXORQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  13398. p := self.alloc("KXORQ", 3, Operands { v0, v1, v2 })
  13399. // KXORQ k, k, k
  13400. if isK(v0) && isK(v1) && isK(v2) {
  13401. self.require(ISA_AVX512BW)
  13402. p.domain = DomainMask
  13403. p.add(0, func(m *_Encoding, v []interface{}) {
  13404. m.emit(0xc4)
  13405. m.emit(0xe1)
  13406. m.emit(0xfc ^ (hlcode(v[1]) << 3))
  13407. m.emit(0x47)
  13408. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  13409. })
  13410. }
  13411. if p.len == 0 {
  13412. panic("invalid operands for KXORQ")
  13413. }
  13414. return p
  13415. }
  13416. // KXORW performs "Bitwise Logical XOR 16-bit Masks".
  13417. //
  13418. // Mnemonic : KXORW
  13419. // Supported forms : (1 form)
  13420. //
  13421. // * KXORW k, k, k [AVX512F]
  13422. //
  13423. func (self *Program) KXORW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  13424. p := self.alloc("KXORW", 3, Operands { v0, v1, v2 })
  13425. // KXORW k, k, k
  13426. if isK(v0) && isK(v1) && isK(v2) {
  13427. self.require(ISA_AVX512F)
  13428. p.domain = DomainMask
  13429. p.add(0, func(m *_Encoding, v []interface{}) {
  13430. m.vex2(4, 0, nil, hlcode(v[1]))
  13431. m.emit(0x47)
  13432. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  13433. })
  13434. }
  13435. if p.len == 0 {
  13436. panic("invalid operands for KXORW")
  13437. }
  13438. return p
  13439. }
  13440. // LDDQU performs "Load Unaligned Integer 128 Bits".
  13441. //
  13442. // Mnemonic : LDDQU
  13443. // Supported forms : (1 form)
  13444. //
  13445. // * LDDQU m128, xmm [SSE3]
  13446. //
  13447. func (self *Program) LDDQU(v0 interface{}, v1 interface{}) *Instruction {
  13448. p := self.alloc("LDDQU", 2, Operands { v0, v1 })
  13449. // LDDQU m128, xmm
  13450. if isM128(v0) && isXMM(v1) {
  13451. self.require(ISA_SSE3)
  13452. p.domain = DomainMMXSSE
  13453. p.add(0, func(m *_Encoding, v []interface{}) {
  13454. m.emit(0xf2)
  13455. m.rexo(hcode(v[1]), addr(v[0]), false)
  13456. m.emit(0x0f)
  13457. m.emit(0xf0)
  13458. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  13459. })
  13460. }
  13461. if p.len == 0 {
  13462. panic("invalid operands for LDDQU")
  13463. }
  13464. return p
  13465. }
  13466. // LDMXCSR performs "Load MXCSR Register".
  13467. //
  13468. // Mnemonic : LDMXCSR
  13469. // Supported forms : (1 form)
  13470. //
  13471. // * LDMXCSR m32 [SSE]
  13472. //
  13473. func (self *Program) LDMXCSR(v0 interface{}) *Instruction {
  13474. p := self.alloc("LDMXCSR", 1, Operands { v0 })
  13475. // LDMXCSR m32
  13476. if isM32(v0) {
  13477. self.require(ISA_SSE)
  13478. p.domain = DomainMMXSSE
  13479. p.add(0, func(m *_Encoding, v []interface{}) {
  13480. m.rexo(0, addr(v[0]), false)
  13481. m.emit(0x0f)
  13482. m.emit(0xae)
  13483. m.mrsd(2, addr(v[0]), 1)
  13484. })
  13485. }
  13486. if p.len == 0 {
  13487. panic("invalid operands for LDMXCSR")
  13488. }
  13489. return p
  13490. }
  13491. // LEAL performs "Load Effective Address".
  13492. //
  13493. // Mnemonic : LEA
  13494. // Supported forms : (1 form)
  13495. //
  13496. // * LEAL m, r32
  13497. //
  13498. func (self *Program) LEAL(v0 interface{}, v1 interface{}) *Instruction {
  13499. p := self.alloc("LEAL", 2, Operands { v0, v1 })
  13500. // LEAL m, r32
  13501. if isM(v0) && isReg32(v1) {
  13502. p.domain = DomainGeneric
  13503. p.add(0, func(m *_Encoding, v []interface{}) {
  13504. m.rexo(hcode(v[1]), addr(v[0]), false)
  13505. m.emit(0x8d)
  13506. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  13507. })
  13508. }
  13509. if p.len == 0 {
  13510. panic("invalid operands for LEAL")
  13511. }
  13512. return p
  13513. }
  13514. // LEAQ performs "Load Effective Address".
  13515. //
  13516. // Mnemonic : LEA
  13517. // Supported forms : (1 form)
  13518. //
  13519. // * LEAQ m, r64
  13520. //
  13521. func (self *Program) LEAQ(v0 interface{}, v1 interface{}) *Instruction {
  13522. p := self.alloc("LEAQ", 2, Operands { v0, v1 })
  13523. // LEAQ m, r64
  13524. if isM(v0) && isReg64(v1) {
  13525. p.domain = DomainGeneric
  13526. p.add(0, func(m *_Encoding, v []interface{}) {
  13527. m.rexm(1, hcode(v[1]), addr(v[0]))
  13528. m.emit(0x8d)
  13529. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  13530. })
  13531. }
  13532. if p.len == 0 {
  13533. panic("invalid operands for LEAQ")
  13534. }
  13535. return p
  13536. }
  13537. // LEAW performs "Load Effective Address".
  13538. //
  13539. // Mnemonic : LEA
  13540. // Supported forms : (1 form)
  13541. //
  13542. // * LEAW m, r16
  13543. //
  13544. func (self *Program) LEAW(v0 interface{}, v1 interface{}) *Instruction {
  13545. p := self.alloc("LEAW", 2, Operands { v0, v1 })
  13546. // LEAW m, r16
  13547. if isM(v0) && isReg16(v1) {
  13548. p.domain = DomainGeneric
  13549. p.add(0, func(m *_Encoding, v []interface{}) {
  13550. m.emit(0x66)
  13551. m.rexo(hcode(v[1]), addr(v[0]), false)
  13552. m.emit(0x8d)
  13553. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  13554. })
  13555. }
  13556. if p.len == 0 {
  13557. panic("invalid operands for LEAW")
  13558. }
  13559. return p
  13560. }
  13561. // LFENCE performs "Load Fence".
  13562. //
  13563. // Mnemonic : LFENCE
  13564. // Supported forms : (1 form)
  13565. //
  13566. // * LFENCE [SSE2]
  13567. //
  13568. func (self *Program) LFENCE() *Instruction {
  13569. p := self.alloc("LFENCE", 0, Operands { })
  13570. // LFENCE
  13571. self.require(ISA_SSE2)
  13572. p.domain = DomainGeneric
  13573. p.add(0, func(m *_Encoding, v []interface{}) {
  13574. m.emit(0x0f)
  13575. m.emit(0xae)
  13576. m.emit(0xe8)
  13577. })
  13578. return p
  13579. }
  13580. // LZCNTL performs "Count the Number of Leading Zero Bits".
  13581. //
  13582. // Mnemonic : LZCNT
  13583. // Supported forms : (2 forms)
  13584. //
  13585. // * LZCNTL r32, r32 [LZCNT]
  13586. // * LZCNTL m32, r32 [LZCNT]
  13587. //
  13588. func (self *Program) LZCNTL(v0 interface{}, v1 interface{}) *Instruction {
  13589. p := self.alloc("LZCNTL", 2, Operands { v0, v1 })
  13590. // LZCNTL r32, r32
  13591. if isReg32(v0) && isReg32(v1) {
  13592. self.require(ISA_LZCNT)
  13593. p.domain = DomainGeneric
  13594. p.add(0, func(m *_Encoding, v []interface{}) {
  13595. m.emit(0xf3)
  13596. m.rexo(hcode(v[1]), v[0], false)
  13597. m.emit(0x0f)
  13598. m.emit(0xbd)
  13599. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  13600. })
  13601. }
  13602. // LZCNTL m32, r32
  13603. if isM32(v0) && isReg32(v1) {
  13604. self.require(ISA_LZCNT)
  13605. p.domain = DomainGeneric
  13606. p.add(0, func(m *_Encoding, v []interface{}) {
  13607. m.emit(0xf3)
  13608. m.rexo(hcode(v[1]), addr(v[0]), false)
  13609. m.emit(0x0f)
  13610. m.emit(0xbd)
  13611. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  13612. })
  13613. }
  13614. if p.len == 0 {
  13615. panic("invalid operands for LZCNTL")
  13616. }
  13617. return p
  13618. }
  13619. // LZCNTQ performs "Count the Number of Leading Zero Bits".
  13620. //
  13621. // Mnemonic : LZCNT
  13622. // Supported forms : (2 forms)
  13623. //
  13624. // * LZCNTQ r64, r64 [LZCNT]
  13625. // * LZCNTQ m64, r64 [LZCNT]
  13626. //
  13627. func (self *Program) LZCNTQ(v0 interface{}, v1 interface{}) *Instruction {
  13628. p := self.alloc("LZCNTQ", 2, Operands { v0, v1 })
  13629. // LZCNTQ r64, r64
  13630. if isReg64(v0) && isReg64(v1) {
  13631. self.require(ISA_LZCNT)
  13632. p.domain = DomainGeneric
  13633. p.add(0, func(m *_Encoding, v []interface{}) {
  13634. m.emit(0xf3)
  13635. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  13636. m.emit(0x0f)
  13637. m.emit(0xbd)
  13638. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  13639. })
  13640. }
  13641. // LZCNTQ m64, r64
  13642. if isM64(v0) && isReg64(v1) {
  13643. self.require(ISA_LZCNT)
  13644. p.domain = DomainGeneric
  13645. p.add(0, func(m *_Encoding, v []interface{}) {
  13646. m.emit(0xf3)
  13647. m.rexm(1, hcode(v[1]), addr(v[0]))
  13648. m.emit(0x0f)
  13649. m.emit(0xbd)
  13650. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  13651. })
  13652. }
  13653. if p.len == 0 {
  13654. panic("invalid operands for LZCNTQ")
  13655. }
  13656. return p
  13657. }
  13658. // LZCNTW performs "Count the Number of Leading Zero Bits".
  13659. //
  13660. // Mnemonic : LZCNT
  13661. // Supported forms : (2 forms)
  13662. //
  13663. // * LZCNTW r16, r16 [LZCNT]
  13664. // * LZCNTW m16, r16 [LZCNT]
  13665. //
  13666. func (self *Program) LZCNTW(v0 interface{}, v1 interface{}) *Instruction {
  13667. p := self.alloc("LZCNTW", 2, Operands { v0, v1 })
  13668. // LZCNTW r16, r16
  13669. if isReg16(v0) && isReg16(v1) {
  13670. self.require(ISA_LZCNT)
  13671. p.domain = DomainGeneric
  13672. p.add(0, func(m *_Encoding, v []interface{}) {
  13673. m.emit(0x66)
  13674. m.emit(0xf3)
  13675. m.rexo(hcode(v[1]), v[0], false)
  13676. m.emit(0x0f)
  13677. m.emit(0xbd)
  13678. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  13679. })
  13680. }
  13681. // LZCNTW m16, r16
  13682. if isM16(v0) && isReg16(v1) {
  13683. self.require(ISA_LZCNT)
  13684. p.domain = DomainGeneric
  13685. p.add(0, func(m *_Encoding, v []interface{}) {
  13686. m.emit(0x66)
  13687. m.emit(0xf3)
  13688. m.rexo(hcode(v[1]), addr(v[0]), false)
  13689. m.emit(0x0f)
  13690. m.emit(0xbd)
  13691. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  13692. })
  13693. }
  13694. if p.len == 0 {
  13695. panic("invalid operands for LZCNTW")
  13696. }
  13697. return p
  13698. }
  13699. // MASKMOVDQU performs "Store Selected Bytes of Double Quadword".
  13700. //
  13701. // Mnemonic : MASKMOVDQU
  13702. // Supported forms : (1 form)
  13703. //
  13704. // * MASKMOVDQU xmm, xmm [SSE2]
  13705. //
  13706. func (self *Program) MASKMOVDQU(v0 interface{}, v1 interface{}) *Instruction {
  13707. p := self.alloc("MASKMOVDQU", 2, Operands { v0, v1 })
  13708. // MASKMOVDQU xmm, xmm
  13709. if isXMM(v0) && isXMM(v1) {
  13710. self.require(ISA_SSE2)
  13711. p.domain = DomainMMXSSE
  13712. p.add(0, func(m *_Encoding, v []interface{}) {
  13713. m.emit(0x66)
  13714. m.rexo(hcode(v[1]), v[0], false)
  13715. m.emit(0x0f)
  13716. m.emit(0xf7)
  13717. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  13718. })
  13719. }
  13720. if p.len == 0 {
  13721. panic("invalid operands for MASKMOVDQU")
  13722. }
  13723. return p
  13724. }
  13725. // MASKMOVQ performs "Store Selected Bytes of Quadword".
  13726. //
  13727. // Mnemonic : MASKMOVQ
  13728. // Supported forms : (1 form)
  13729. //
  13730. // * MASKMOVQ mm, mm [MMX+]
  13731. //
  13732. func (self *Program) MASKMOVQ(v0 interface{}, v1 interface{}) *Instruction {
  13733. p := self.alloc("MASKMOVQ", 2, Operands { v0, v1 })
  13734. // MASKMOVQ mm, mm
  13735. if isMM(v0) && isMM(v1) {
  13736. self.require(ISA_MMX_PLUS)
  13737. p.domain = DomainMMXSSE
  13738. p.add(0, func(m *_Encoding, v []interface{}) {
  13739. m.rexo(hcode(v[1]), v[0], false)
  13740. m.emit(0x0f)
  13741. m.emit(0xf7)
  13742. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  13743. })
  13744. }
  13745. if p.len == 0 {
  13746. panic("invalid operands for MASKMOVQ")
  13747. }
  13748. return p
  13749. }
  13750. // MAXPD performs "Return Maximum Packed Double-Precision Floating-Point Values".
  13751. //
  13752. // Mnemonic : MAXPD
  13753. // Supported forms : (2 forms)
  13754. //
  13755. // * MAXPD xmm, xmm [SSE2]
  13756. // * MAXPD m128, xmm [SSE2]
  13757. //
  13758. func (self *Program) MAXPD(v0 interface{}, v1 interface{}) *Instruction {
  13759. p := self.alloc("MAXPD", 2, Operands { v0, v1 })
  13760. // MAXPD xmm, xmm
  13761. if isXMM(v0) && isXMM(v1) {
  13762. self.require(ISA_SSE2)
  13763. p.domain = DomainMMXSSE
  13764. p.add(0, func(m *_Encoding, v []interface{}) {
  13765. m.emit(0x66)
  13766. m.rexo(hcode(v[1]), v[0], false)
  13767. m.emit(0x0f)
  13768. m.emit(0x5f)
  13769. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  13770. })
  13771. }
  13772. // MAXPD m128, xmm
  13773. if isM128(v0) && isXMM(v1) {
  13774. self.require(ISA_SSE2)
  13775. p.domain = DomainMMXSSE
  13776. p.add(0, func(m *_Encoding, v []interface{}) {
  13777. m.emit(0x66)
  13778. m.rexo(hcode(v[1]), addr(v[0]), false)
  13779. m.emit(0x0f)
  13780. m.emit(0x5f)
  13781. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  13782. })
  13783. }
  13784. if p.len == 0 {
  13785. panic("invalid operands for MAXPD")
  13786. }
  13787. return p
  13788. }
  13789. // MAXPS performs "Return Maximum Packed Single-Precision Floating-Point Values".
  13790. //
  13791. // Mnemonic : MAXPS
  13792. // Supported forms : (2 forms)
  13793. //
  13794. // * MAXPS xmm, xmm [SSE]
  13795. // * MAXPS m128, xmm [SSE]
  13796. //
  13797. func (self *Program) MAXPS(v0 interface{}, v1 interface{}) *Instruction {
  13798. p := self.alloc("MAXPS", 2, Operands { v0, v1 })
  13799. // MAXPS xmm, xmm
  13800. if isXMM(v0) && isXMM(v1) {
  13801. self.require(ISA_SSE)
  13802. p.domain = DomainMMXSSE
  13803. p.add(0, func(m *_Encoding, v []interface{}) {
  13804. m.rexo(hcode(v[1]), v[0], false)
  13805. m.emit(0x0f)
  13806. m.emit(0x5f)
  13807. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  13808. })
  13809. }
  13810. // MAXPS m128, xmm
  13811. if isM128(v0) && isXMM(v1) {
  13812. self.require(ISA_SSE)
  13813. p.domain = DomainMMXSSE
  13814. p.add(0, func(m *_Encoding, v []interface{}) {
  13815. m.rexo(hcode(v[1]), addr(v[0]), false)
  13816. m.emit(0x0f)
  13817. m.emit(0x5f)
  13818. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  13819. })
  13820. }
  13821. if p.len == 0 {
  13822. panic("invalid operands for MAXPS")
  13823. }
  13824. return p
  13825. }
  13826. // MAXSD performs "Return Maximum Scalar Double-Precision Floating-Point Value".
  13827. //
  13828. // Mnemonic : MAXSD
  13829. // Supported forms : (2 forms)
  13830. //
  13831. // * MAXSD xmm, xmm [SSE2]
  13832. // * MAXSD m64, xmm [SSE2]
  13833. //
  13834. func (self *Program) MAXSD(v0 interface{}, v1 interface{}) *Instruction {
  13835. p := self.alloc("MAXSD", 2, Operands { v0, v1 })
  13836. // MAXSD xmm, xmm
  13837. if isXMM(v0) && isXMM(v1) {
  13838. self.require(ISA_SSE2)
  13839. p.domain = DomainMMXSSE
  13840. p.add(0, func(m *_Encoding, v []interface{}) {
  13841. m.emit(0xf2)
  13842. m.rexo(hcode(v[1]), v[0], false)
  13843. m.emit(0x0f)
  13844. m.emit(0x5f)
  13845. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  13846. })
  13847. }
  13848. // MAXSD m64, xmm
  13849. if isM64(v0) && isXMM(v1) {
  13850. self.require(ISA_SSE2)
  13851. p.domain = DomainMMXSSE
  13852. p.add(0, func(m *_Encoding, v []interface{}) {
  13853. m.emit(0xf2)
  13854. m.rexo(hcode(v[1]), addr(v[0]), false)
  13855. m.emit(0x0f)
  13856. m.emit(0x5f)
  13857. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  13858. })
  13859. }
  13860. if p.len == 0 {
  13861. panic("invalid operands for MAXSD")
  13862. }
  13863. return p
  13864. }
  13865. // MAXSS performs "Return Maximum Scalar Single-Precision Floating-Point Value".
  13866. //
  13867. // Mnemonic : MAXSS
  13868. // Supported forms : (2 forms)
  13869. //
  13870. // * MAXSS xmm, xmm [SSE]
  13871. // * MAXSS m32, xmm [SSE]
  13872. //
  13873. func (self *Program) MAXSS(v0 interface{}, v1 interface{}) *Instruction {
  13874. p := self.alloc("MAXSS", 2, Operands { v0, v1 })
  13875. // MAXSS xmm, xmm
  13876. if isXMM(v0) && isXMM(v1) {
  13877. self.require(ISA_SSE)
  13878. p.domain = DomainMMXSSE
  13879. p.add(0, func(m *_Encoding, v []interface{}) {
  13880. m.emit(0xf3)
  13881. m.rexo(hcode(v[1]), v[0], false)
  13882. m.emit(0x0f)
  13883. m.emit(0x5f)
  13884. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  13885. })
  13886. }
  13887. // MAXSS m32, xmm
  13888. if isM32(v0) && isXMM(v1) {
  13889. self.require(ISA_SSE)
  13890. p.domain = DomainMMXSSE
  13891. p.add(0, func(m *_Encoding, v []interface{}) {
  13892. m.emit(0xf3)
  13893. m.rexo(hcode(v[1]), addr(v[0]), false)
  13894. m.emit(0x0f)
  13895. m.emit(0x5f)
  13896. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  13897. })
  13898. }
  13899. if p.len == 0 {
  13900. panic("invalid operands for MAXSS")
  13901. }
  13902. return p
  13903. }
  13904. // MFENCE performs "Memory Fence".
  13905. //
  13906. // Mnemonic : MFENCE
  13907. // Supported forms : (1 form)
  13908. //
  13909. // * MFENCE [SSE2]
  13910. //
  13911. func (self *Program) MFENCE() *Instruction {
  13912. p := self.alloc("MFENCE", 0, Operands { })
  13913. // MFENCE
  13914. self.require(ISA_SSE2)
  13915. p.domain = DomainGeneric
  13916. p.add(0, func(m *_Encoding, v []interface{}) {
  13917. m.emit(0x0f)
  13918. m.emit(0xae)
  13919. m.emit(0xf0)
  13920. })
  13921. return p
  13922. }
  13923. // MINPD performs "Return Minimum Packed Double-Precision Floating-Point Values".
  13924. //
  13925. // Mnemonic : MINPD
  13926. // Supported forms : (2 forms)
  13927. //
  13928. // * MINPD xmm, xmm [SSE2]
  13929. // * MINPD m128, xmm [SSE2]
  13930. //
  13931. func (self *Program) MINPD(v0 interface{}, v1 interface{}) *Instruction {
  13932. p := self.alloc("MINPD", 2, Operands { v0, v1 })
  13933. // MINPD xmm, xmm
  13934. if isXMM(v0) && isXMM(v1) {
  13935. self.require(ISA_SSE2)
  13936. p.domain = DomainMMXSSE
  13937. p.add(0, func(m *_Encoding, v []interface{}) {
  13938. m.emit(0x66)
  13939. m.rexo(hcode(v[1]), v[0], false)
  13940. m.emit(0x0f)
  13941. m.emit(0x5d)
  13942. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  13943. })
  13944. }
  13945. // MINPD m128, xmm
  13946. if isM128(v0) && isXMM(v1) {
  13947. self.require(ISA_SSE2)
  13948. p.domain = DomainMMXSSE
  13949. p.add(0, func(m *_Encoding, v []interface{}) {
  13950. m.emit(0x66)
  13951. m.rexo(hcode(v[1]), addr(v[0]), false)
  13952. m.emit(0x0f)
  13953. m.emit(0x5d)
  13954. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  13955. })
  13956. }
  13957. if p.len == 0 {
  13958. panic("invalid operands for MINPD")
  13959. }
  13960. return p
  13961. }
  13962. // MINPS performs "Return Minimum Packed Single-Precision Floating-Point Values".
  13963. //
  13964. // Mnemonic : MINPS
  13965. // Supported forms : (2 forms)
  13966. //
  13967. // * MINPS xmm, xmm [SSE]
  13968. // * MINPS m128, xmm [SSE]
  13969. //
  13970. func (self *Program) MINPS(v0 interface{}, v1 interface{}) *Instruction {
  13971. p := self.alloc("MINPS", 2, Operands { v0, v1 })
  13972. // MINPS xmm, xmm
  13973. if isXMM(v0) && isXMM(v1) {
  13974. self.require(ISA_SSE)
  13975. p.domain = DomainMMXSSE
  13976. p.add(0, func(m *_Encoding, v []interface{}) {
  13977. m.rexo(hcode(v[1]), v[0], false)
  13978. m.emit(0x0f)
  13979. m.emit(0x5d)
  13980. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  13981. })
  13982. }
  13983. // MINPS m128, xmm
  13984. if isM128(v0) && isXMM(v1) {
  13985. self.require(ISA_SSE)
  13986. p.domain = DomainMMXSSE
  13987. p.add(0, func(m *_Encoding, v []interface{}) {
  13988. m.rexo(hcode(v[1]), addr(v[0]), false)
  13989. m.emit(0x0f)
  13990. m.emit(0x5d)
  13991. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  13992. })
  13993. }
  13994. if p.len == 0 {
  13995. panic("invalid operands for MINPS")
  13996. }
  13997. return p
  13998. }
  13999. // MINSD performs "Return Minimum Scalar Double-Precision Floating-Point Value".
  14000. //
  14001. // Mnemonic : MINSD
  14002. // Supported forms : (2 forms)
  14003. //
  14004. // * MINSD xmm, xmm [SSE2]
  14005. // * MINSD m64, xmm [SSE2]
  14006. //
  14007. func (self *Program) MINSD(v0 interface{}, v1 interface{}) *Instruction {
  14008. p := self.alloc("MINSD", 2, Operands { v0, v1 })
  14009. // MINSD xmm, xmm
  14010. if isXMM(v0) && isXMM(v1) {
  14011. self.require(ISA_SSE2)
  14012. p.domain = DomainMMXSSE
  14013. p.add(0, func(m *_Encoding, v []interface{}) {
  14014. m.emit(0xf2)
  14015. m.rexo(hcode(v[1]), v[0], false)
  14016. m.emit(0x0f)
  14017. m.emit(0x5d)
  14018. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  14019. })
  14020. }
  14021. // MINSD m64, xmm
  14022. if isM64(v0) && isXMM(v1) {
  14023. self.require(ISA_SSE2)
  14024. p.domain = DomainMMXSSE
  14025. p.add(0, func(m *_Encoding, v []interface{}) {
  14026. m.emit(0xf2)
  14027. m.rexo(hcode(v[1]), addr(v[0]), false)
  14028. m.emit(0x0f)
  14029. m.emit(0x5d)
  14030. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  14031. })
  14032. }
  14033. if p.len == 0 {
  14034. panic("invalid operands for MINSD")
  14035. }
  14036. return p
  14037. }
  14038. // MINSS performs "Return Minimum Scalar Single-Precision Floating-Point Value".
  14039. //
  14040. // Mnemonic : MINSS
  14041. // Supported forms : (2 forms)
  14042. //
  14043. // * MINSS xmm, xmm [SSE]
  14044. // * MINSS m32, xmm [SSE]
  14045. //
  14046. func (self *Program) MINSS(v0 interface{}, v1 interface{}) *Instruction {
  14047. p := self.alloc("MINSS", 2, Operands { v0, v1 })
  14048. // MINSS xmm, xmm
  14049. if isXMM(v0) && isXMM(v1) {
  14050. self.require(ISA_SSE)
  14051. p.domain = DomainMMXSSE
  14052. p.add(0, func(m *_Encoding, v []interface{}) {
  14053. m.emit(0xf3)
  14054. m.rexo(hcode(v[1]), v[0], false)
  14055. m.emit(0x0f)
  14056. m.emit(0x5d)
  14057. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  14058. })
  14059. }
  14060. // MINSS m32, xmm
  14061. if isM32(v0) && isXMM(v1) {
  14062. self.require(ISA_SSE)
  14063. p.domain = DomainMMXSSE
  14064. p.add(0, func(m *_Encoding, v []interface{}) {
  14065. m.emit(0xf3)
  14066. m.rexo(hcode(v[1]), addr(v[0]), false)
  14067. m.emit(0x0f)
  14068. m.emit(0x5d)
  14069. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  14070. })
  14071. }
  14072. if p.len == 0 {
  14073. panic("invalid operands for MINSS")
  14074. }
  14075. return p
  14076. }
  14077. // MONITOR performs "Monitor a Linear Address Range".
  14078. //
  14079. // Mnemonic : MONITOR
  14080. // Supported forms : (1 form)
  14081. //
  14082. // * MONITOR [MONITOR]
  14083. //
  14084. func (self *Program) MONITOR() *Instruction {
  14085. p := self.alloc("MONITOR", 0, Operands { })
  14086. // MONITOR
  14087. self.require(ISA_MONITOR)
  14088. p.domain = DomainMisc
  14089. p.add(0, func(m *_Encoding, v []interface{}) {
  14090. m.emit(0x0f)
  14091. m.emit(0x01)
  14092. m.emit(0xc8)
  14093. })
  14094. return p
  14095. }
  14096. // MONITORX performs "Monitor a Linear Address Range with Timeout".
  14097. //
  14098. // Mnemonic : MONITORX
  14099. // Supported forms : (1 form)
  14100. //
  14101. // * MONITORX [MONITORX]
  14102. //
  14103. func (self *Program) MONITORX() *Instruction {
  14104. p := self.alloc("MONITORX", 0, Operands { })
  14105. // MONITORX
  14106. self.require(ISA_MONITORX)
  14107. p.domain = DomainMisc
  14108. p.add(0, func(m *_Encoding, v []interface{}) {
  14109. m.emit(0x0f)
  14110. m.emit(0x01)
  14111. m.emit(0xfa)
  14112. })
  14113. return p
  14114. }
  14115. // MOVAPD performs "Move Aligned Packed Double-Precision Floating-Point Values".
  14116. //
  14117. // Mnemonic : MOVAPD
  14118. // Supported forms : (3 forms)
  14119. //
  14120. // * MOVAPD xmm, xmm [SSE2]
  14121. // * MOVAPD m128, xmm [SSE2]
  14122. // * MOVAPD xmm, m128 [SSE2]
  14123. //
  14124. func (self *Program) MOVAPD(v0 interface{}, v1 interface{}) *Instruction {
  14125. p := self.alloc("MOVAPD", 2, Operands { v0, v1 })
  14126. // MOVAPD xmm, xmm
  14127. if isXMM(v0) && isXMM(v1) {
  14128. self.require(ISA_SSE2)
  14129. p.domain = DomainMMXSSE
  14130. p.add(0, func(m *_Encoding, v []interface{}) {
  14131. m.emit(0x66)
  14132. m.rexo(hcode(v[1]), v[0], false)
  14133. m.emit(0x0f)
  14134. m.emit(0x28)
  14135. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  14136. })
  14137. p.add(0, func(m *_Encoding, v []interface{}) {
  14138. m.emit(0x66)
  14139. m.rexo(hcode(v[0]), v[1], false)
  14140. m.emit(0x0f)
  14141. m.emit(0x29)
  14142. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  14143. })
  14144. }
  14145. // MOVAPD m128, xmm
  14146. if isM128(v0) && isXMM(v1) {
  14147. self.require(ISA_SSE2)
  14148. p.domain = DomainMMXSSE
  14149. p.add(0, func(m *_Encoding, v []interface{}) {
  14150. m.emit(0x66)
  14151. m.rexo(hcode(v[1]), addr(v[0]), false)
  14152. m.emit(0x0f)
  14153. m.emit(0x28)
  14154. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  14155. })
  14156. }
  14157. // MOVAPD xmm, m128
  14158. if isXMM(v0) && isM128(v1) {
  14159. self.require(ISA_SSE2)
  14160. p.domain = DomainMMXSSE
  14161. p.add(0, func(m *_Encoding, v []interface{}) {
  14162. m.emit(0x66)
  14163. m.rexo(hcode(v[0]), addr(v[1]), false)
  14164. m.emit(0x0f)
  14165. m.emit(0x29)
  14166. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  14167. })
  14168. }
  14169. if p.len == 0 {
  14170. panic("invalid operands for MOVAPD")
  14171. }
  14172. return p
  14173. }
  14174. // MOVAPS performs "Move Aligned Packed Single-Precision Floating-Point Values".
  14175. //
  14176. // Mnemonic : MOVAPS
  14177. // Supported forms : (3 forms)
  14178. //
  14179. // * MOVAPS xmm, xmm [SSE]
  14180. // * MOVAPS m128, xmm [SSE]
  14181. // * MOVAPS xmm, m128 [SSE]
  14182. //
  14183. func (self *Program) MOVAPS(v0 interface{}, v1 interface{}) *Instruction {
  14184. p := self.alloc("MOVAPS", 2, Operands { v0, v1 })
  14185. // MOVAPS xmm, xmm
  14186. if isXMM(v0) && isXMM(v1) {
  14187. self.require(ISA_SSE)
  14188. p.domain = DomainMMXSSE
  14189. p.add(0, func(m *_Encoding, v []interface{}) {
  14190. m.rexo(hcode(v[1]), v[0], false)
  14191. m.emit(0x0f)
  14192. m.emit(0x28)
  14193. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  14194. })
  14195. p.add(0, func(m *_Encoding, v []interface{}) {
  14196. m.rexo(hcode(v[0]), v[1], false)
  14197. m.emit(0x0f)
  14198. m.emit(0x29)
  14199. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  14200. })
  14201. }
  14202. // MOVAPS m128, xmm
  14203. if isM128(v0) && isXMM(v1) {
  14204. self.require(ISA_SSE)
  14205. p.domain = DomainMMXSSE
  14206. p.add(0, func(m *_Encoding, v []interface{}) {
  14207. m.rexo(hcode(v[1]), addr(v[0]), false)
  14208. m.emit(0x0f)
  14209. m.emit(0x28)
  14210. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  14211. })
  14212. }
  14213. // MOVAPS xmm, m128
  14214. if isXMM(v0) && isM128(v1) {
  14215. self.require(ISA_SSE)
  14216. p.domain = DomainMMXSSE
  14217. p.add(0, func(m *_Encoding, v []interface{}) {
  14218. m.rexo(hcode(v[0]), addr(v[1]), false)
  14219. m.emit(0x0f)
  14220. m.emit(0x29)
  14221. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  14222. })
  14223. }
  14224. if p.len == 0 {
  14225. panic("invalid operands for MOVAPS")
  14226. }
  14227. return p
  14228. }
  14229. // MOVB performs "Move".
  14230. //
  14231. // Mnemonic : MOV
  14232. // Supported forms : (5 forms)
  14233. //
  14234. // * MOVB imm8, r8
  14235. // * MOVB r8, r8
  14236. // * MOVB m8, r8
  14237. // * MOVB imm8, m8
  14238. // * MOVB r8, m8
  14239. //
  14240. func (self *Program) MOVB(v0 interface{}, v1 interface{}) *Instruction {
  14241. p := self.alloc("MOVB", 2, Operands { v0, v1 })
  14242. // MOVB imm8, r8
  14243. if isImm8(v0) && isReg8(v1) {
  14244. p.domain = DomainGeneric
  14245. p.add(0, func(m *_Encoding, v []interface{}) {
  14246. m.rexo(0, v[1], isReg8REX(v[1]))
  14247. m.emit(0xc6)
  14248. m.emit(0xc0 | lcode(v[1]))
  14249. m.imm1(toImmAny(v[0]))
  14250. })
  14251. p.add(0, func(m *_Encoding, v []interface{}) {
  14252. m.rexo(0, v[1], isReg8REX(v[1]))
  14253. m.emit(0xb0 | lcode(v[1]))
  14254. m.imm1(toImmAny(v[0]))
  14255. })
  14256. }
  14257. // MOVB r8, r8
  14258. if isReg8(v0) && isReg8(v1) {
  14259. p.domain = DomainGeneric
  14260. p.add(0, func(m *_Encoding, v []interface{}) {
  14261. m.rexo(hcode(v[0]), v[1], isReg8REX(v[0]) || isReg8REX(v[1]))
  14262. m.emit(0x88)
  14263. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  14264. })
  14265. p.add(0, func(m *_Encoding, v []interface{}) {
  14266. m.rexo(hcode(v[1]), v[0], isReg8REX(v[0]) || isReg8REX(v[1]))
  14267. m.emit(0x8a)
  14268. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  14269. })
  14270. }
  14271. // MOVB m8, r8
  14272. if isM8(v0) && isReg8(v1) {
  14273. p.domain = DomainGeneric
  14274. p.add(0, func(m *_Encoding, v []interface{}) {
  14275. m.rexo(hcode(v[1]), addr(v[0]), isReg8REX(v[1]))
  14276. m.emit(0x8a)
  14277. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  14278. })
  14279. }
  14280. // MOVB imm8, m8
  14281. if isImm8(v0) && isM8(v1) {
  14282. p.domain = DomainGeneric
  14283. p.add(0, func(m *_Encoding, v []interface{}) {
  14284. m.rexo(0, addr(v[1]), false)
  14285. m.emit(0xc6)
  14286. m.mrsd(0, addr(v[1]), 1)
  14287. m.imm1(toImmAny(v[0]))
  14288. })
  14289. }
  14290. // MOVB r8, m8
  14291. if isReg8(v0) && isM8(v1) {
  14292. p.domain = DomainGeneric
  14293. p.add(0, func(m *_Encoding, v []interface{}) {
  14294. m.rexo(hcode(v[0]), addr(v[1]), isReg8REX(v[0]))
  14295. m.emit(0x88)
  14296. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  14297. })
  14298. }
  14299. if p.len == 0 {
  14300. panic("invalid operands for MOVB")
  14301. }
  14302. return p
  14303. }
  14304. // MOVBEL performs "Move Data After Swapping Bytes".
  14305. //
  14306. // Mnemonic : MOVBE
  14307. // Supported forms : (2 forms)
  14308. //
  14309. // * MOVBEL m32, r32 [MOVBE]
  14310. // * MOVBEL r32, m32 [MOVBE]
  14311. //
  14312. func (self *Program) MOVBEL(v0 interface{}, v1 interface{}) *Instruction {
  14313. p := self.alloc("MOVBEL", 2, Operands { v0, v1 })
  14314. // MOVBEL m32, r32
  14315. if isM32(v0) && isReg32(v1) {
  14316. self.require(ISA_MOVBE)
  14317. p.domain = DomainGeneric
  14318. p.add(0, func(m *_Encoding, v []interface{}) {
  14319. m.rexo(hcode(v[1]), addr(v[0]), false)
  14320. m.emit(0x0f)
  14321. m.emit(0x38)
  14322. m.emit(0xf0)
  14323. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  14324. })
  14325. }
  14326. // MOVBEL r32, m32
  14327. if isReg32(v0) && isM32(v1) {
  14328. self.require(ISA_MOVBE)
  14329. p.domain = DomainGeneric
  14330. p.add(0, func(m *_Encoding, v []interface{}) {
  14331. m.rexo(hcode(v[0]), addr(v[1]), false)
  14332. m.emit(0x0f)
  14333. m.emit(0x38)
  14334. m.emit(0xf1)
  14335. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  14336. })
  14337. }
  14338. if p.len == 0 {
  14339. panic("invalid operands for MOVBEL")
  14340. }
  14341. return p
  14342. }
  14343. // MOVBEQ performs "Move Data After Swapping Bytes".
  14344. //
  14345. // Mnemonic : MOVBE
  14346. // Supported forms : (2 forms)
  14347. //
  14348. // * MOVBEQ m64, r64 [MOVBE]
  14349. // * MOVBEQ r64, m64 [MOVBE]
  14350. //
  14351. func (self *Program) MOVBEQ(v0 interface{}, v1 interface{}) *Instruction {
  14352. p := self.alloc("MOVBEQ", 2, Operands { v0, v1 })
  14353. // MOVBEQ m64, r64
  14354. if isM64(v0) && isReg64(v1) {
  14355. self.require(ISA_MOVBE)
  14356. p.domain = DomainGeneric
  14357. p.add(0, func(m *_Encoding, v []interface{}) {
  14358. m.rexm(1, hcode(v[1]), addr(v[0]))
  14359. m.emit(0x0f)
  14360. m.emit(0x38)
  14361. m.emit(0xf0)
  14362. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  14363. })
  14364. }
  14365. // MOVBEQ r64, m64
  14366. if isReg64(v0) && isM64(v1) {
  14367. self.require(ISA_MOVBE)
  14368. p.domain = DomainGeneric
  14369. p.add(0, func(m *_Encoding, v []interface{}) {
  14370. m.rexm(1, hcode(v[0]), addr(v[1]))
  14371. m.emit(0x0f)
  14372. m.emit(0x38)
  14373. m.emit(0xf1)
  14374. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  14375. })
  14376. }
  14377. if p.len == 0 {
  14378. panic("invalid operands for MOVBEQ")
  14379. }
  14380. return p
  14381. }
  14382. // MOVBEW performs "Move Data After Swapping Bytes".
  14383. //
  14384. // Mnemonic : MOVBE
  14385. // Supported forms : (2 forms)
  14386. //
  14387. // * MOVBEW m16, r16 [MOVBE]
  14388. // * MOVBEW r16, m16 [MOVBE]
  14389. //
  14390. func (self *Program) MOVBEW(v0 interface{}, v1 interface{}) *Instruction {
  14391. p := self.alloc("MOVBEW", 2, Operands { v0, v1 })
  14392. // MOVBEW m16, r16
  14393. if isM16(v0) && isReg16(v1) {
  14394. self.require(ISA_MOVBE)
  14395. p.domain = DomainGeneric
  14396. p.add(0, func(m *_Encoding, v []interface{}) {
  14397. m.emit(0x66)
  14398. m.rexo(hcode(v[1]), addr(v[0]), false)
  14399. m.emit(0x0f)
  14400. m.emit(0x38)
  14401. m.emit(0xf0)
  14402. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  14403. })
  14404. }
  14405. // MOVBEW r16, m16
  14406. if isReg16(v0) && isM16(v1) {
  14407. self.require(ISA_MOVBE)
  14408. p.domain = DomainGeneric
  14409. p.add(0, func(m *_Encoding, v []interface{}) {
  14410. m.emit(0x66)
  14411. m.rexo(hcode(v[0]), addr(v[1]), false)
  14412. m.emit(0x0f)
  14413. m.emit(0x38)
  14414. m.emit(0xf1)
  14415. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  14416. })
  14417. }
  14418. if p.len == 0 {
  14419. panic("invalid operands for MOVBEW")
  14420. }
  14421. return p
  14422. }
  14423. // MOVD performs "Move Doubleword".
  14424. //
  14425. // Mnemonic : MOVD
  14426. // Supported forms : (8 forms)
  14427. //
  14428. // * MOVD mm, r32 [MMX]
  14429. // * MOVD r32, mm [MMX]
  14430. // * MOVD m32, mm [MMX]
  14431. // * MOVD mm, m32 [MMX]
  14432. // * MOVD xmm, r32 [SSE2]
  14433. // * MOVD r32, xmm [SSE2]
  14434. // * MOVD m32, xmm [SSE2]
  14435. // * MOVD xmm, m32 [SSE2]
  14436. //
  14437. func (self *Program) MOVD(v0 interface{}, v1 interface{}) *Instruction {
  14438. p := self.alloc("MOVD", 2, Operands { v0, v1 })
  14439. // MOVD mm, r32
  14440. if isMM(v0) && isReg32(v1) {
  14441. self.require(ISA_MMX)
  14442. p.domain = DomainMMXSSE
  14443. p.add(0, func(m *_Encoding, v []interface{}) {
  14444. m.rexo(hcode(v[0]), v[1], false)
  14445. m.emit(0x0f)
  14446. m.emit(0x7e)
  14447. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  14448. })
  14449. }
  14450. // MOVD r32, mm
  14451. if isReg32(v0) && isMM(v1) {
  14452. self.require(ISA_MMX)
  14453. p.domain = DomainMMXSSE
  14454. p.add(0, func(m *_Encoding, v []interface{}) {
  14455. m.rexo(hcode(v[1]), v[0], false)
  14456. m.emit(0x0f)
  14457. m.emit(0x6e)
  14458. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  14459. })
  14460. }
  14461. // MOVD m32, mm
  14462. if isM32(v0) && isMM(v1) {
  14463. self.require(ISA_MMX)
  14464. p.domain = DomainMMXSSE
  14465. p.add(0, func(m *_Encoding, v []interface{}) {
  14466. m.rexo(hcode(v[1]), addr(v[0]), false)
  14467. m.emit(0x0f)
  14468. m.emit(0x6e)
  14469. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  14470. })
  14471. }
  14472. // MOVD mm, m32
  14473. if isMM(v0) && isM32(v1) {
  14474. self.require(ISA_MMX)
  14475. p.domain = DomainMMXSSE
  14476. p.add(0, func(m *_Encoding, v []interface{}) {
  14477. m.rexo(hcode(v[0]), addr(v[1]), false)
  14478. m.emit(0x0f)
  14479. m.emit(0x7e)
  14480. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  14481. })
  14482. }
  14483. // MOVD xmm, r32
  14484. if isXMM(v0) && isReg32(v1) {
  14485. self.require(ISA_SSE2)
  14486. p.domain = DomainMMXSSE
  14487. p.add(0, func(m *_Encoding, v []interface{}) {
  14488. m.emit(0x66)
  14489. m.rexo(hcode(v[0]), v[1], false)
  14490. m.emit(0x0f)
  14491. m.emit(0x7e)
  14492. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  14493. })
  14494. }
  14495. // MOVD r32, xmm
  14496. if isReg32(v0) && isXMM(v1) {
  14497. self.require(ISA_SSE2)
  14498. p.domain = DomainMMXSSE
  14499. p.add(0, func(m *_Encoding, v []interface{}) {
  14500. m.emit(0x66)
  14501. m.rexo(hcode(v[1]), v[0], false)
  14502. m.emit(0x0f)
  14503. m.emit(0x6e)
  14504. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  14505. })
  14506. }
  14507. // MOVD m32, xmm
  14508. if isM32(v0) && isXMM(v1) {
  14509. self.require(ISA_SSE2)
  14510. p.domain = DomainMMXSSE
  14511. p.add(0, func(m *_Encoding, v []interface{}) {
  14512. m.emit(0x66)
  14513. m.rexo(hcode(v[1]), addr(v[0]), false)
  14514. m.emit(0x0f)
  14515. m.emit(0x6e)
  14516. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  14517. })
  14518. }
  14519. // MOVD xmm, m32
  14520. if isXMM(v0) && isM32(v1) {
  14521. self.require(ISA_SSE2)
  14522. p.domain = DomainMMXSSE
  14523. p.add(0, func(m *_Encoding, v []interface{}) {
  14524. m.emit(0x66)
  14525. m.rexo(hcode(v[0]), addr(v[1]), false)
  14526. m.emit(0x0f)
  14527. m.emit(0x7e)
  14528. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  14529. })
  14530. }
  14531. if p.len == 0 {
  14532. panic("invalid operands for MOVD")
  14533. }
  14534. return p
  14535. }
  14536. // MOVDDUP performs "Move One Double-FP and Duplicate".
  14537. //
  14538. // Mnemonic : MOVDDUP
  14539. // Supported forms : (2 forms)
  14540. //
  14541. // * MOVDDUP xmm, xmm [SSE3]
  14542. // * MOVDDUP m64, xmm [SSE3]
  14543. //
  14544. func (self *Program) MOVDDUP(v0 interface{}, v1 interface{}) *Instruction {
  14545. p := self.alloc("MOVDDUP", 2, Operands { v0, v1 })
  14546. // MOVDDUP xmm, xmm
  14547. if isXMM(v0) && isXMM(v1) {
  14548. self.require(ISA_SSE3)
  14549. p.domain = DomainMMXSSE
  14550. p.add(0, func(m *_Encoding, v []interface{}) {
  14551. m.emit(0xf2)
  14552. m.rexo(hcode(v[1]), v[0], false)
  14553. m.emit(0x0f)
  14554. m.emit(0x12)
  14555. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  14556. })
  14557. }
  14558. // MOVDDUP m64, xmm
  14559. if isM64(v0) && isXMM(v1) {
  14560. self.require(ISA_SSE3)
  14561. p.domain = DomainMMXSSE
  14562. p.add(0, func(m *_Encoding, v []interface{}) {
  14563. m.emit(0xf2)
  14564. m.rexo(hcode(v[1]), addr(v[0]), false)
  14565. m.emit(0x0f)
  14566. m.emit(0x12)
  14567. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  14568. })
  14569. }
  14570. if p.len == 0 {
  14571. panic("invalid operands for MOVDDUP")
  14572. }
  14573. return p
  14574. }
  14575. // MOVDQ2Q performs "Move Quadword from XMM to MMX Technology Register".
  14576. //
  14577. // Mnemonic : MOVDQ2Q
  14578. // Supported forms : (1 form)
  14579. //
  14580. // * MOVDQ2Q xmm, mm [SSE2]
  14581. //
  14582. func (self *Program) MOVDQ2Q(v0 interface{}, v1 interface{}) *Instruction {
  14583. p := self.alloc("MOVDQ2Q", 2, Operands { v0, v1 })
  14584. // MOVDQ2Q xmm, mm
  14585. if isXMM(v0) && isMM(v1) {
  14586. self.require(ISA_SSE2)
  14587. p.domain = DomainMMXSSE
  14588. p.add(0, func(m *_Encoding, v []interface{}) {
  14589. m.emit(0xf2)
  14590. m.rexo(hcode(v[1]), v[0], false)
  14591. m.emit(0x0f)
  14592. m.emit(0xd6)
  14593. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  14594. })
  14595. }
  14596. if p.len == 0 {
  14597. panic("invalid operands for MOVDQ2Q")
  14598. }
  14599. return p
  14600. }
  14601. // MOVDQA performs "Move Aligned Double Quadword".
  14602. //
  14603. // Mnemonic : MOVDQA
  14604. // Supported forms : (3 forms)
  14605. //
  14606. // * MOVDQA xmm, xmm [SSE2]
  14607. // * MOVDQA m128, xmm [SSE2]
  14608. // * MOVDQA xmm, m128 [SSE2]
  14609. //
  14610. func (self *Program) MOVDQA(v0 interface{}, v1 interface{}) *Instruction {
  14611. p := self.alloc("MOVDQA", 2, Operands { v0, v1 })
  14612. // MOVDQA xmm, xmm
  14613. if isXMM(v0) && isXMM(v1) {
  14614. self.require(ISA_SSE2)
  14615. p.domain = DomainMMXSSE
  14616. p.add(0, func(m *_Encoding, v []interface{}) {
  14617. m.emit(0x66)
  14618. m.rexo(hcode(v[1]), v[0], false)
  14619. m.emit(0x0f)
  14620. m.emit(0x6f)
  14621. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  14622. })
  14623. p.add(0, func(m *_Encoding, v []interface{}) {
  14624. m.emit(0x66)
  14625. m.rexo(hcode(v[0]), v[1], false)
  14626. m.emit(0x0f)
  14627. m.emit(0x7f)
  14628. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  14629. })
  14630. }
  14631. // MOVDQA m128, xmm
  14632. if isM128(v0) && isXMM(v1) {
  14633. self.require(ISA_SSE2)
  14634. p.domain = DomainMMXSSE
  14635. p.add(0, func(m *_Encoding, v []interface{}) {
  14636. m.emit(0x66)
  14637. m.rexo(hcode(v[1]), addr(v[0]), false)
  14638. m.emit(0x0f)
  14639. m.emit(0x6f)
  14640. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  14641. })
  14642. }
  14643. // MOVDQA xmm, m128
  14644. if isXMM(v0) && isM128(v1) {
  14645. self.require(ISA_SSE2)
  14646. p.domain = DomainMMXSSE
  14647. p.add(0, func(m *_Encoding, v []interface{}) {
  14648. m.emit(0x66)
  14649. m.rexo(hcode(v[0]), addr(v[1]), false)
  14650. m.emit(0x0f)
  14651. m.emit(0x7f)
  14652. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  14653. })
  14654. }
  14655. if p.len == 0 {
  14656. panic("invalid operands for MOVDQA")
  14657. }
  14658. return p
  14659. }
  14660. // MOVDQU performs "Move Unaligned Double Quadword".
  14661. //
  14662. // Mnemonic : MOVDQU
  14663. // Supported forms : (3 forms)
  14664. //
  14665. // * MOVDQU xmm, xmm [SSE2]
  14666. // * MOVDQU m128, xmm [SSE2]
  14667. // * MOVDQU xmm, m128 [SSE2]
  14668. //
  14669. func (self *Program) MOVDQU(v0 interface{}, v1 interface{}) *Instruction {
  14670. p := self.alloc("MOVDQU", 2, Operands { v0, v1 })
  14671. // MOVDQU xmm, xmm
  14672. if isXMM(v0) && isXMM(v1) {
  14673. self.require(ISA_SSE2)
  14674. p.domain = DomainMMXSSE
  14675. p.add(0, func(m *_Encoding, v []interface{}) {
  14676. m.emit(0xf3)
  14677. m.rexo(hcode(v[1]), v[0], false)
  14678. m.emit(0x0f)
  14679. m.emit(0x6f)
  14680. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  14681. })
  14682. p.add(0, func(m *_Encoding, v []interface{}) {
  14683. m.emit(0xf3)
  14684. m.rexo(hcode(v[0]), v[1], false)
  14685. m.emit(0x0f)
  14686. m.emit(0x7f)
  14687. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  14688. })
  14689. }
  14690. // MOVDQU m128, xmm
  14691. if isM128(v0) && isXMM(v1) {
  14692. self.require(ISA_SSE2)
  14693. p.domain = DomainMMXSSE
  14694. p.add(0, func(m *_Encoding, v []interface{}) {
  14695. m.emit(0xf3)
  14696. m.rexo(hcode(v[1]), addr(v[0]), false)
  14697. m.emit(0x0f)
  14698. m.emit(0x6f)
  14699. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  14700. })
  14701. }
  14702. // MOVDQU xmm, m128
  14703. if isXMM(v0) && isM128(v1) {
  14704. self.require(ISA_SSE2)
  14705. p.domain = DomainMMXSSE
  14706. p.add(0, func(m *_Encoding, v []interface{}) {
  14707. m.emit(0xf3)
  14708. m.rexo(hcode(v[0]), addr(v[1]), false)
  14709. m.emit(0x0f)
  14710. m.emit(0x7f)
  14711. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  14712. })
  14713. }
  14714. if p.len == 0 {
  14715. panic("invalid operands for MOVDQU")
  14716. }
  14717. return p
  14718. }
  14719. // MOVHLPS performs "Move Packed Single-Precision Floating-Point Values High to Low".
  14720. //
  14721. // Mnemonic : MOVHLPS
  14722. // Supported forms : (1 form)
  14723. //
  14724. // * MOVHLPS xmm, xmm [SSE]
  14725. //
  14726. func (self *Program) MOVHLPS(v0 interface{}, v1 interface{}) *Instruction {
  14727. p := self.alloc("MOVHLPS", 2, Operands { v0, v1 })
  14728. // MOVHLPS xmm, xmm
  14729. if isXMM(v0) && isXMM(v1) {
  14730. self.require(ISA_SSE)
  14731. p.domain = DomainMMXSSE
  14732. p.add(0, func(m *_Encoding, v []interface{}) {
  14733. m.rexo(hcode(v[1]), v[0], false)
  14734. m.emit(0x0f)
  14735. m.emit(0x12)
  14736. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  14737. })
  14738. }
  14739. if p.len == 0 {
  14740. panic("invalid operands for MOVHLPS")
  14741. }
  14742. return p
  14743. }
  14744. // MOVHPD performs "Move High Packed Double-Precision Floating-Point Value".
  14745. //
  14746. // Mnemonic : MOVHPD
  14747. // Supported forms : (2 forms)
  14748. //
  14749. // * MOVHPD m64, xmm [SSE2]
  14750. // * MOVHPD xmm, m64 [SSE2]
  14751. //
  14752. func (self *Program) MOVHPD(v0 interface{}, v1 interface{}) *Instruction {
  14753. p := self.alloc("MOVHPD", 2, Operands { v0, v1 })
  14754. // MOVHPD m64, xmm
  14755. if isM64(v0) && isXMM(v1) {
  14756. self.require(ISA_SSE2)
  14757. p.domain = DomainMMXSSE
  14758. p.add(0, func(m *_Encoding, v []interface{}) {
  14759. m.emit(0x66)
  14760. m.rexo(hcode(v[1]), addr(v[0]), false)
  14761. m.emit(0x0f)
  14762. m.emit(0x16)
  14763. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  14764. })
  14765. }
  14766. // MOVHPD xmm, m64
  14767. if isXMM(v0) && isM64(v1) {
  14768. self.require(ISA_SSE2)
  14769. p.domain = DomainMMXSSE
  14770. p.add(0, func(m *_Encoding, v []interface{}) {
  14771. m.emit(0x66)
  14772. m.rexo(hcode(v[0]), addr(v[1]), false)
  14773. m.emit(0x0f)
  14774. m.emit(0x17)
  14775. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  14776. })
  14777. }
  14778. if p.len == 0 {
  14779. panic("invalid operands for MOVHPD")
  14780. }
  14781. return p
  14782. }
  14783. // MOVHPS performs "Move High Packed Single-Precision Floating-Point Values".
  14784. //
  14785. // Mnemonic : MOVHPS
  14786. // Supported forms : (2 forms)
  14787. //
  14788. // * MOVHPS m64, xmm [SSE]
  14789. // * MOVHPS xmm, m64 [SSE]
  14790. //
  14791. func (self *Program) MOVHPS(v0 interface{}, v1 interface{}) *Instruction {
  14792. p := self.alloc("MOVHPS", 2, Operands { v0, v1 })
  14793. // MOVHPS m64, xmm
  14794. if isM64(v0) && isXMM(v1) {
  14795. self.require(ISA_SSE)
  14796. p.domain = DomainMMXSSE
  14797. p.add(0, func(m *_Encoding, v []interface{}) {
  14798. m.rexo(hcode(v[1]), addr(v[0]), false)
  14799. m.emit(0x0f)
  14800. m.emit(0x16)
  14801. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  14802. })
  14803. }
  14804. // MOVHPS xmm, m64
  14805. if isXMM(v0) && isM64(v1) {
  14806. self.require(ISA_SSE)
  14807. p.domain = DomainMMXSSE
  14808. p.add(0, func(m *_Encoding, v []interface{}) {
  14809. m.rexo(hcode(v[0]), addr(v[1]), false)
  14810. m.emit(0x0f)
  14811. m.emit(0x17)
  14812. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  14813. })
  14814. }
  14815. if p.len == 0 {
  14816. panic("invalid operands for MOVHPS")
  14817. }
  14818. return p
  14819. }
  14820. // MOVL performs "Move".
  14821. //
  14822. // Mnemonic : MOV
  14823. // Supported forms : (5 forms)
  14824. //
  14825. // * MOVL imm32, r32
  14826. // * MOVL r32, r32
  14827. // * MOVL m32, r32
  14828. // * MOVL imm32, m32
  14829. // * MOVL r32, m32
  14830. //
  14831. func (self *Program) MOVL(v0 interface{}, v1 interface{}) *Instruction {
  14832. p := self.alloc("MOVL", 2, Operands { v0, v1 })
  14833. // MOVL imm32, r32
  14834. if isImm32(v0) && isReg32(v1) {
  14835. p.domain = DomainGeneric
  14836. p.add(0, func(m *_Encoding, v []interface{}) {
  14837. m.rexo(0, v[1], false)
  14838. m.emit(0xc7)
  14839. m.emit(0xc0 | lcode(v[1]))
  14840. m.imm4(toImmAny(v[0]))
  14841. })
  14842. p.add(0, func(m *_Encoding, v []interface{}) {
  14843. m.rexo(0, v[1], false)
  14844. m.emit(0xb8 | lcode(v[1]))
  14845. m.imm4(toImmAny(v[0]))
  14846. })
  14847. }
  14848. // MOVL r32, r32
  14849. if isReg32(v0) && isReg32(v1) {
  14850. p.domain = DomainGeneric
  14851. p.add(0, func(m *_Encoding, v []interface{}) {
  14852. m.rexo(hcode(v[0]), v[1], false)
  14853. m.emit(0x89)
  14854. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  14855. })
  14856. p.add(0, func(m *_Encoding, v []interface{}) {
  14857. m.rexo(hcode(v[1]), v[0], false)
  14858. m.emit(0x8b)
  14859. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  14860. })
  14861. }
  14862. // MOVL m32, r32
  14863. if isM32(v0) && isReg32(v1) {
  14864. p.domain = DomainGeneric
  14865. p.add(0, func(m *_Encoding, v []interface{}) {
  14866. m.rexo(hcode(v[1]), addr(v[0]), false)
  14867. m.emit(0x8b)
  14868. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  14869. })
  14870. }
  14871. // MOVL imm32, m32
  14872. if isImm32(v0) && isM32(v1) {
  14873. p.domain = DomainGeneric
  14874. p.add(0, func(m *_Encoding, v []interface{}) {
  14875. m.rexo(0, addr(v[1]), false)
  14876. m.emit(0xc7)
  14877. m.mrsd(0, addr(v[1]), 1)
  14878. m.imm4(toImmAny(v[0]))
  14879. })
  14880. }
  14881. // MOVL r32, m32
  14882. if isReg32(v0) && isM32(v1) {
  14883. p.domain = DomainGeneric
  14884. p.add(0, func(m *_Encoding, v []interface{}) {
  14885. m.rexo(hcode(v[0]), addr(v[1]), false)
  14886. m.emit(0x89)
  14887. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  14888. })
  14889. }
  14890. if p.len == 0 {
  14891. panic("invalid operands for MOVL")
  14892. }
  14893. return p
  14894. }
  14895. // MOVLHPS performs "Move Packed Single-Precision Floating-Point Values Low to High".
  14896. //
  14897. // Mnemonic : MOVLHPS
  14898. // Supported forms : (1 form)
  14899. //
  14900. // * MOVLHPS xmm, xmm [SSE]
  14901. //
  14902. func (self *Program) MOVLHPS(v0 interface{}, v1 interface{}) *Instruction {
  14903. p := self.alloc("MOVLHPS", 2, Operands { v0, v1 })
  14904. // MOVLHPS xmm, xmm
  14905. if isXMM(v0) && isXMM(v1) {
  14906. self.require(ISA_SSE)
  14907. p.domain = DomainMMXSSE
  14908. p.add(0, func(m *_Encoding, v []interface{}) {
  14909. m.rexo(hcode(v[1]), v[0], false)
  14910. m.emit(0x0f)
  14911. m.emit(0x16)
  14912. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  14913. })
  14914. }
  14915. if p.len == 0 {
  14916. panic("invalid operands for MOVLHPS")
  14917. }
  14918. return p
  14919. }
  14920. // MOVLPD performs "Move Low Packed Double-Precision Floating-Point Value".
  14921. //
  14922. // Mnemonic : MOVLPD
  14923. // Supported forms : (2 forms)
  14924. //
  14925. // * MOVLPD m64, xmm [SSE2]
  14926. // * MOVLPD xmm, m64 [SSE2]
  14927. //
  14928. func (self *Program) MOVLPD(v0 interface{}, v1 interface{}) *Instruction {
  14929. p := self.alloc("MOVLPD", 2, Operands { v0, v1 })
  14930. // MOVLPD m64, xmm
  14931. if isM64(v0) && isXMM(v1) {
  14932. self.require(ISA_SSE2)
  14933. p.domain = DomainMMXSSE
  14934. p.add(0, func(m *_Encoding, v []interface{}) {
  14935. m.emit(0x66)
  14936. m.rexo(hcode(v[1]), addr(v[0]), false)
  14937. m.emit(0x0f)
  14938. m.emit(0x12)
  14939. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  14940. })
  14941. }
  14942. // MOVLPD xmm, m64
  14943. if isXMM(v0) && isM64(v1) {
  14944. self.require(ISA_SSE2)
  14945. p.domain = DomainMMXSSE
  14946. p.add(0, func(m *_Encoding, v []interface{}) {
  14947. m.emit(0x66)
  14948. m.rexo(hcode(v[0]), addr(v[1]), false)
  14949. m.emit(0x0f)
  14950. m.emit(0x13)
  14951. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  14952. })
  14953. }
  14954. if p.len == 0 {
  14955. panic("invalid operands for MOVLPD")
  14956. }
  14957. return p
  14958. }
  14959. // MOVLPS performs "Move Low Packed Single-Precision Floating-Point Values".
  14960. //
  14961. // Mnemonic : MOVLPS
  14962. // Supported forms : (2 forms)
  14963. //
  14964. // * MOVLPS m64, xmm [SSE]
  14965. // * MOVLPS xmm, m64 [SSE]
  14966. //
  14967. func (self *Program) MOVLPS(v0 interface{}, v1 interface{}) *Instruction {
  14968. p := self.alloc("MOVLPS", 2, Operands { v0, v1 })
  14969. // MOVLPS m64, xmm
  14970. if isM64(v0) && isXMM(v1) {
  14971. self.require(ISA_SSE)
  14972. p.domain = DomainMMXSSE
  14973. p.add(0, func(m *_Encoding, v []interface{}) {
  14974. m.rexo(hcode(v[1]), addr(v[0]), false)
  14975. m.emit(0x0f)
  14976. m.emit(0x12)
  14977. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  14978. })
  14979. }
  14980. // MOVLPS xmm, m64
  14981. if isXMM(v0) && isM64(v1) {
  14982. self.require(ISA_SSE)
  14983. p.domain = DomainMMXSSE
  14984. p.add(0, func(m *_Encoding, v []interface{}) {
  14985. m.rexo(hcode(v[0]), addr(v[1]), false)
  14986. m.emit(0x0f)
  14987. m.emit(0x13)
  14988. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  14989. })
  14990. }
  14991. if p.len == 0 {
  14992. panic("invalid operands for MOVLPS")
  14993. }
  14994. return p
  14995. }
  14996. // MOVMSKPD performs "Extract Packed Double-Precision Floating-Point Sign Mask".
  14997. //
  14998. // Mnemonic : MOVMSKPD
  14999. // Supported forms : (1 form)
  15000. //
  15001. // * MOVMSKPD xmm, r32 [SSE2]
  15002. //
  15003. func (self *Program) MOVMSKPD(v0 interface{}, v1 interface{}) *Instruction {
  15004. p := self.alloc("MOVMSKPD", 2, Operands { v0, v1 })
  15005. // MOVMSKPD xmm, r32
  15006. if isXMM(v0) && isReg32(v1) {
  15007. self.require(ISA_SSE2)
  15008. p.domain = DomainMMXSSE
  15009. p.add(0, func(m *_Encoding, v []interface{}) {
  15010. m.emit(0x66)
  15011. m.rexo(hcode(v[1]), v[0], false)
  15012. m.emit(0x0f)
  15013. m.emit(0x50)
  15014. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  15015. })
  15016. }
  15017. if p.len == 0 {
  15018. panic("invalid operands for MOVMSKPD")
  15019. }
  15020. return p
  15021. }
  15022. // MOVMSKPS performs "Extract Packed Single-Precision Floating-Point Sign Mask".
  15023. //
  15024. // Mnemonic : MOVMSKPS
  15025. // Supported forms : (1 form)
  15026. //
  15027. // * MOVMSKPS xmm, r32 [SSE]
  15028. //
  15029. func (self *Program) MOVMSKPS(v0 interface{}, v1 interface{}) *Instruction {
  15030. p := self.alloc("MOVMSKPS", 2, Operands { v0, v1 })
  15031. // MOVMSKPS xmm, r32
  15032. if isXMM(v0) && isReg32(v1) {
  15033. self.require(ISA_SSE)
  15034. p.domain = DomainMMXSSE
  15035. p.add(0, func(m *_Encoding, v []interface{}) {
  15036. m.rexo(hcode(v[1]), v[0], false)
  15037. m.emit(0x0f)
  15038. m.emit(0x50)
  15039. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  15040. })
  15041. }
  15042. if p.len == 0 {
  15043. panic("invalid operands for MOVMSKPS")
  15044. }
  15045. return p
  15046. }
  15047. // MOVNTDQ performs "Store Double Quadword Using Non-Temporal Hint".
  15048. //
  15049. // Mnemonic : MOVNTDQ
  15050. // Supported forms : (1 form)
  15051. //
  15052. // * MOVNTDQ xmm, m128 [SSE2]
  15053. //
  15054. func (self *Program) MOVNTDQ(v0 interface{}, v1 interface{}) *Instruction {
  15055. p := self.alloc("MOVNTDQ", 2, Operands { v0, v1 })
  15056. // MOVNTDQ xmm, m128
  15057. if isXMM(v0) && isM128(v1) {
  15058. self.require(ISA_SSE2)
  15059. p.domain = DomainMMXSSE
  15060. p.add(0, func(m *_Encoding, v []interface{}) {
  15061. m.emit(0x66)
  15062. m.rexo(hcode(v[0]), addr(v[1]), false)
  15063. m.emit(0x0f)
  15064. m.emit(0xe7)
  15065. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  15066. })
  15067. }
  15068. if p.len == 0 {
  15069. panic("invalid operands for MOVNTDQ")
  15070. }
  15071. return p
  15072. }
  15073. // MOVNTDQA performs "Load Double Quadword Non-Temporal Aligned Hint".
  15074. //
  15075. // Mnemonic : MOVNTDQA
  15076. // Supported forms : (1 form)
  15077. //
  15078. // * MOVNTDQA m128, xmm [SSE4.1]
  15079. //
  15080. func (self *Program) MOVNTDQA(v0 interface{}, v1 interface{}) *Instruction {
  15081. p := self.alloc("MOVNTDQA", 2, Operands { v0, v1 })
  15082. // MOVNTDQA m128, xmm
  15083. if isM128(v0) && isXMM(v1) {
  15084. self.require(ISA_SSE4_1)
  15085. p.domain = DomainMMXSSE
  15086. p.add(0, func(m *_Encoding, v []interface{}) {
  15087. m.emit(0x66)
  15088. m.rexo(hcode(v[1]), addr(v[0]), false)
  15089. m.emit(0x0f)
  15090. m.emit(0x38)
  15091. m.emit(0x2a)
  15092. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  15093. })
  15094. }
  15095. if p.len == 0 {
  15096. panic("invalid operands for MOVNTDQA")
  15097. }
  15098. return p
  15099. }
  15100. // MOVNTIL performs "Store Doubleword Using Non-Temporal Hint".
  15101. //
  15102. // Mnemonic : MOVNTI
  15103. // Supported forms : (1 form)
  15104. //
  15105. // * MOVNTIL r32, m32 [SSE2]
  15106. //
  15107. func (self *Program) MOVNTIL(v0 interface{}, v1 interface{}) *Instruction {
  15108. p := self.alloc("MOVNTIL", 2, Operands { v0, v1 })
  15109. // MOVNTIL r32, m32
  15110. if isReg32(v0) && isM32(v1) {
  15111. self.require(ISA_SSE2)
  15112. p.domain = DomainGeneric
  15113. p.add(0, func(m *_Encoding, v []interface{}) {
  15114. m.rexo(hcode(v[0]), addr(v[1]), false)
  15115. m.emit(0x0f)
  15116. m.emit(0xc3)
  15117. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  15118. })
  15119. }
  15120. if p.len == 0 {
  15121. panic("invalid operands for MOVNTIL")
  15122. }
  15123. return p
  15124. }
  15125. // MOVNTIQ performs "Store Doubleword Using Non-Temporal Hint".
  15126. //
  15127. // Mnemonic : MOVNTI
  15128. // Supported forms : (1 form)
  15129. //
  15130. // * MOVNTIQ r64, m64 [SSE2]
  15131. //
  15132. func (self *Program) MOVNTIQ(v0 interface{}, v1 interface{}) *Instruction {
  15133. p := self.alloc("MOVNTIQ", 2, Operands { v0, v1 })
  15134. // MOVNTIQ r64, m64
  15135. if isReg64(v0) && isM64(v1) {
  15136. self.require(ISA_SSE2)
  15137. p.domain = DomainGeneric
  15138. p.add(0, func(m *_Encoding, v []interface{}) {
  15139. m.rexm(1, hcode(v[0]), addr(v[1]))
  15140. m.emit(0x0f)
  15141. m.emit(0xc3)
  15142. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  15143. })
  15144. }
  15145. if p.len == 0 {
  15146. panic("invalid operands for MOVNTIQ")
  15147. }
  15148. return p
  15149. }
  15150. // MOVNTPD performs "Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint".
  15151. //
  15152. // Mnemonic : MOVNTPD
  15153. // Supported forms : (1 form)
  15154. //
  15155. // * MOVNTPD xmm, m128 [SSE2]
  15156. //
  15157. func (self *Program) MOVNTPD(v0 interface{}, v1 interface{}) *Instruction {
  15158. p := self.alloc("MOVNTPD", 2, Operands { v0, v1 })
  15159. // MOVNTPD xmm, m128
  15160. if isXMM(v0) && isM128(v1) {
  15161. self.require(ISA_SSE2)
  15162. p.domain = DomainMMXSSE
  15163. p.add(0, func(m *_Encoding, v []interface{}) {
  15164. m.emit(0x66)
  15165. m.rexo(hcode(v[0]), addr(v[1]), false)
  15166. m.emit(0x0f)
  15167. m.emit(0x2b)
  15168. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  15169. })
  15170. }
  15171. if p.len == 0 {
  15172. panic("invalid operands for MOVNTPD")
  15173. }
  15174. return p
  15175. }
  15176. // MOVNTPS performs "Store Packed Single-Precision Floating-Point Values Using Non-Temporal Hint".
  15177. //
  15178. // Mnemonic : MOVNTPS
  15179. // Supported forms : (1 form)
  15180. //
  15181. // * MOVNTPS xmm, m128 [SSE]
  15182. //
  15183. func (self *Program) MOVNTPS(v0 interface{}, v1 interface{}) *Instruction {
  15184. p := self.alloc("MOVNTPS", 2, Operands { v0, v1 })
  15185. // MOVNTPS xmm, m128
  15186. if isXMM(v0) && isM128(v1) {
  15187. self.require(ISA_SSE)
  15188. p.domain = DomainMMXSSE
  15189. p.add(0, func(m *_Encoding, v []interface{}) {
  15190. m.rexo(hcode(v[0]), addr(v[1]), false)
  15191. m.emit(0x0f)
  15192. m.emit(0x2b)
  15193. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  15194. })
  15195. }
  15196. if p.len == 0 {
  15197. panic("invalid operands for MOVNTPS")
  15198. }
  15199. return p
  15200. }
  15201. // MOVNTQ performs "Store of Quadword Using Non-Temporal Hint".
  15202. //
  15203. // Mnemonic : MOVNTQ
  15204. // Supported forms : (1 form)
  15205. //
  15206. // * MOVNTQ mm, m64 [MMX+]
  15207. //
  15208. func (self *Program) MOVNTQ(v0 interface{}, v1 interface{}) *Instruction {
  15209. p := self.alloc("MOVNTQ", 2, Operands { v0, v1 })
  15210. // MOVNTQ mm, m64
  15211. if isMM(v0) && isM64(v1) {
  15212. self.require(ISA_MMX_PLUS)
  15213. p.domain = DomainMMXSSE
  15214. p.add(0, func(m *_Encoding, v []interface{}) {
  15215. m.rexo(hcode(v[0]), addr(v[1]), false)
  15216. m.emit(0x0f)
  15217. m.emit(0xe7)
  15218. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  15219. })
  15220. }
  15221. if p.len == 0 {
  15222. panic("invalid operands for MOVNTQ")
  15223. }
  15224. return p
  15225. }
  15226. // MOVNTSD performs "Store Scalar Double-Precision Floating-Point Values Using Non-Temporal Hint".
  15227. //
  15228. // Mnemonic : MOVNTSD
  15229. // Supported forms : (1 form)
  15230. //
  15231. // * MOVNTSD xmm, m64 [SSE4A]
  15232. //
  15233. func (self *Program) MOVNTSD(v0 interface{}, v1 interface{}) *Instruction {
  15234. p := self.alloc("MOVNTSD", 2, Operands { v0, v1 })
  15235. // MOVNTSD xmm, m64
  15236. if isXMM(v0) && isM64(v1) {
  15237. self.require(ISA_SSE4A)
  15238. p.domain = DomainAMDSpecific
  15239. p.add(0, func(m *_Encoding, v []interface{}) {
  15240. m.emit(0xf2)
  15241. m.rexo(hcode(v[0]), addr(v[1]), false)
  15242. m.emit(0x0f)
  15243. m.emit(0x2b)
  15244. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  15245. })
  15246. }
  15247. if p.len == 0 {
  15248. panic("invalid operands for MOVNTSD")
  15249. }
  15250. return p
  15251. }
  15252. // MOVNTSS performs "Store Scalar Single-Precision Floating-Point Values Using Non-Temporal Hint".
  15253. //
  15254. // Mnemonic : MOVNTSS
  15255. // Supported forms : (1 form)
  15256. //
  15257. // * MOVNTSS xmm, m32 [SSE4A]
  15258. //
  15259. func (self *Program) MOVNTSS(v0 interface{}, v1 interface{}) *Instruction {
  15260. p := self.alloc("MOVNTSS", 2, Operands { v0, v1 })
  15261. // MOVNTSS xmm, m32
  15262. if isXMM(v0) && isM32(v1) {
  15263. self.require(ISA_SSE4A)
  15264. p.domain = DomainAMDSpecific
  15265. p.add(0, func(m *_Encoding, v []interface{}) {
  15266. m.emit(0xf3)
  15267. m.rexo(hcode(v[0]), addr(v[1]), false)
  15268. m.emit(0x0f)
  15269. m.emit(0x2b)
  15270. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  15271. })
  15272. }
  15273. if p.len == 0 {
  15274. panic("invalid operands for MOVNTSS")
  15275. }
  15276. return p
  15277. }
  15278. // MOVQ performs "Move".
  15279. //
  15280. // Mnemonic : MOV
  15281. // Supported forms : (16 forms)
  15282. //
  15283. // * MOVQ imm32, r64
  15284. // * MOVQ imm64, r64
  15285. // * MOVQ r64, r64
  15286. // * MOVQ m64, r64
  15287. // * MOVQ imm32, m64
  15288. // * MOVQ r64, m64
  15289. // * MOVQ mm, r64 [MMX]
  15290. // * MOVQ r64, mm [MMX]
  15291. // * MOVQ mm, mm [MMX]
  15292. // * MOVQ m64, mm [MMX]
  15293. // * MOVQ mm, m64 [MMX]
  15294. // * MOVQ xmm, r64 [SSE2]
  15295. // * MOVQ r64, xmm [SSE2]
  15296. // * MOVQ xmm, xmm [SSE2]
  15297. // * MOVQ m64, xmm [SSE2]
  15298. // * MOVQ xmm, m64 [SSE2]
  15299. //
  15300. func (self *Program) MOVQ(v0 interface{}, v1 interface{}) *Instruction {
  15301. p := self.alloc("MOVQ", 2, Operands { v0, v1 })
  15302. // MOVQ imm32, r64
  15303. if isImm32Ext(v0, 8) && isReg64(v1) {
  15304. p.domain = DomainGeneric
  15305. p.add(0, func(m *_Encoding, v []interface{}) {
  15306. m.emit(0x48 | hcode(v[1]))
  15307. m.emit(0xc7)
  15308. m.emit(0xc0 | lcode(v[1]))
  15309. m.imm4(toImmAny(v[0]))
  15310. })
  15311. }
  15312. // MOVQ imm64, r64
  15313. if isImm64(v0) && isReg64(v1) {
  15314. p.domain = DomainGeneric
  15315. p.add(0, func(m *_Encoding, v []interface{}) {
  15316. m.emit(0x48 | hcode(v[1]))
  15317. m.emit(0xb8 | lcode(v[1]))
  15318. m.imm8(toImmAny(v[0]))
  15319. })
  15320. }
  15321. // MOVQ r64, r64
  15322. if isReg64(v0) && isReg64(v1) {
  15323. p.domain = DomainGeneric
  15324. p.add(0, func(m *_Encoding, v []interface{}) {
  15325. m.emit(0x48 | hcode(v[0]) << 2 | hcode(v[1]))
  15326. m.emit(0x89)
  15327. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  15328. })
  15329. p.add(0, func(m *_Encoding, v []interface{}) {
  15330. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  15331. m.emit(0x8b)
  15332. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  15333. })
  15334. }
  15335. // MOVQ m64, r64
  15336. if isM64(v0) && isReg64(v1) {
  15337. p.domain = DomainGeneric
  15338. p.add(0, func(m *_Encoding, v []interface{}) {
  15339. m.rexm(1, hcode(v[1]), addr(v[0]))
  15340. m.emit(0x8b)
  15341. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  15342. })
  15343. }
  15344. // MOVQ imm32, m64
  15345. if isImm32Ext(v0, 8) && isM64(v1) {
  15346. p.domain = DomainGeneric
  15347. p.add(0, func(m *_Encoding, v []interface{}) {
  15348. m.rexm(1, 0, addr(v[1]))
  15349. m.emit(0xc7)
  15350. m.mrsd(0, addr(v[1]), 1)
  15351. m.imm4(toImmAny(v[0]))
  15352. })
  15353. }
  15354. // MOVQ r64, m64
  15355. if isReg64(v0) && isM64(v1) {
  15356. p.domain = DomainGeneric
  15357. p.add(0, func(m *_Encoding, v []interface{}) {
  15358. m.rexm(1, hcode(v[0]), addr(v[1]))
  15359. m.emit(0x89)
  15360. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  15361. })
  15362. }
  15363. // MOVQ mm, r64
  15364. if isMM(v0) && isReg64(v1) {
  15365. self.require(ISA_MMX)
  15366. p.domain = DomainMMXSSE
  15367. p.add(0, func(m *_Encoding, v []interface{}) {
  15368. m.emit(0x48 | hcode(v[0]) << 2 | hcode(v[1]))
  15369. m.emit(0x0f)
  15370. m.emit(0x7e)
  15371. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  15372. })
  15373. }
  15374. // MOVQ r64, mm
  15375. if isReg64(v0) && isMM(v1) {
  15376. self.require(ISA_MMX)
  15377. p.domain = DomainMMXSSE
  15378. p.add(0, func(m *_Encoding, v []interface{}) {
  15379. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  15380. m.emit(0x0f)
  15381. m.emit(0x6e)
  15382. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  15383. })
  15384. }
  15385. // MOVQ mm, mm
  15386. if isMM(v0) && isMM(v1) {
  15387. self.require(ISA_MMX)
  15388. p.domain = DomainMMXSSE
  15389. p.add(0, func(m *_Encoding, v []interface{}) {
  15390. m.rexo(hcode(v[1]), v[0], false)
  15391. m.emit(0x0f)
  15392. m.emit(0x6f)
  15393. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  15394. })
  15395. p.add(0, func(m *_Encoding, v []interface{}) {
  15396. m.rexo(hcode(v[0]), v[1], false)
  15397. m.emit(0x0f)
  15398. m.emit(0x7f)
  15399. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  15400. })
  15401. }
  15402. // MOVQ m64, mm
  15403. if isM64(v0) && isMM(v1) {
  15404. self.require(ISA_MMX)
  15405. p.domain = DomainMMXSSE
  15406. p.add(0, func(m *_Encoding, v []interface{}) {
  15407. m.rexo(hcode(v[1]), addr(v[0]), false)
  15408. m.emit(0x0f)
  15409. m.emit(0x6f)
  15410. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  15411. })
  15412. p.add(0, func(m *_Encoding, v []interface{}) {
  15413. m.rexm(1, hcode(v[1]), addr(v[0]))
  15414. m.emit(0x0f)
  15415. m.emit(0x6e)
  15416. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  15417. })
  15418. }
  15419. // MOVQ mm, m64
  15420. if isMM(v0) && isM64(v1) {
  15421. self.require(ISA_MMX)
  15422. p.domain = DomainMMXSSE
  15423. p.add(0, func(m *_Encoding, v []interface{}) {
  15424. m.rexo(hcode(v[0]), addr(v[1]), false)
  15425. m.emit(0x0f)
  15426. m.emit(0x7f)
  15427. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  15428. })
  15429. p.add(0, func(m *_Encoding, v []interface{}) {
  15430. m.rexm(1, hcode(v[0]), addr(v[1]))
  15431. m.emit(0x0f)
  15432. m.emit(0x7e)
  15433. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  15434. })
  15435. }
  15436. // MOVQ xmm, r64
  15437. if isXMM(v0) && isReg64(v1) {
  15438. self.require(ISA_SSE2)
  15439. p.domain = DomainMMXSSE
  15440. p.add(0, func(m *_Encoding, v []interface{}) {
  15441. m.emit(0x66)
  15442. m.emit(0x48 | hcode(v[0]) << 2 | hcode(v[1]))
  15443. m.emit(0x0f)
  15444. m.emit(0x7e)
  15445. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  15446. })
  15447. }
  15448. // MOVQ r64, xmm
  15449. if isReg64(v0) && isXMM(v1) {
  15450. self.require(ISA_SSE2)
  15451. p.domain = DomainMMXSSE
  15452. p.add(0, func(m *_Encoding, v []interface{}) {
  15453. m.emit(0x66)
  15454. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  15455. m.emit(0x0f)
  15456. m.emit(0x6e)
  15457. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  15458. })
  15459. }
  15460. // MOVQ xmm, xmm
  15461. if isXMM(v0) && isXMM(v1) {
  15462. self.require(ISA_SSE2)
  15463. p.domain = DomainMMXSSE
  15464. p.add(0, func(m *_Encoding, v []interface{}) {
  15465. m.emit(0xf3)
  15466. m.rexo(hcode(v[1]), v[0], false)
  15467. m.emit(0x0f)
  15468. m.emit(0x7e)
  15469. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  15470. })
  15471. p.add(0, func(m *_Encoding, v []interface{}) {
  15472. m.emit(0x66)
  15473. m.rexo(hcode(v[0]), v[1], false)
  15474. m.emit(0x0f)
  15475. m.emit(0xd6)
  15476. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  15477. })
  15478. }
  15479. // MOVQ m64, xmm
  15480. if isM64(v0) && isXMM(v1) {
  15481. self.require(ISA_SSE2)
  15482. p.domain = DomainMMXSSE
  15483. p.add(0, func(m *_Encoding, v []interface{}) {
  15484. m.emit(0xf3)
  15485. m.rexo(hcode(v[1]), addr(v[0]), false)
  15486. m.emit(0x0f)
  15487. m.emit(0x7e)
  15488. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  15489. })
  15490. p.add(0, func(m *_Encoding, v []interface{}) {
  15491. m.emit(0x66)
  15492. m.rexm(1, hcode(v[1]), addr(v[0]))
  15493. m.emit(0x0f)
  15494. m.emit(0x6e)
  15495. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  15496. })
  15497. }
  15498. // MOVQ xmm, m64
  15499. if isXMM(v0) && isM64(v1) {
  15500. self.require(ISA_SSE2)
  15501. p.domain = DomainMMXSSE
  15502. p.add(0, func(m *_Encoding, v []interface{}) {
  15503. m.emit(0x66)
  15504. m.rexo(hcode(v[0]), addr(v[1]), false)
  15505. m.emit(0x0f)
  15506. m.emit(0xd6)
  15507. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  15508. })
  15509. p.add(0, func(m *_Encoding, v []interface{}) {
  15510. m.emit(0x66)
  15511. m.rexm(1, hcode(v[0]), addr(v[1]))
  15512. m.emit(0x0f)
  15513. m.emit(0x7e)
  15514. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  15515. })
  15516. }
  15517. if p.len == 0 {
  15518. panic("invalid operands for MOVQ")
  15519. }
  15520. return p
  15521. }
  15522. // MOVQ2DQ performs "Move Quadword from MMX Technology to XMM Register".
  15523. //
  15524. // Mnemonic : MOVQ2DQ
  15525. // Supported forms : (1 form)
  15526. //
  15527. // * MOVQ2DQ mm, xmm [SSE2]
  15528. //
  15529. func (self *Program) MOVQ2DQ(v0 interface{}, v1 interface{}) *Instruction {
  15530. p := self.alloc("MOVQ2DQ", 2, Operands { v0, v1 })
  15531. // MOVQ2DQ mm, xmm
  15532. if isMM(v0) && isXMM(v1) {
  15533. self.require(ISA_SSE2)
  15534. p.domain = DomainMMXSSE
  15535. p.add(0, func(m *_Encoding, v []interface{}) {
  15536. m.emit(0xf3)
  15537. m.rexo(hcode(v[1]), v[0], false)
  15538. m.emit(0x0f)
  15539. m.emit(0xd6)
  15540. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  15541. })
  15542. }
  15543. if p.len == 0 {
  15544. panic("invalid operands for MOVQ2DQ")
  15545. }
  15546. return p
  15547. }
  15548. // MOVSBL performs "Move with Sign-Extension".
  15549. //
  15550. // Mnemonic : MOVSX
  15551. // Supported forms : (2 forms)
  15552. //
  15553. // * MOVSBL r8, r32
  15554. // * MOVSBL m8, r32
  15555. //
  15556. func (self *Program) MOVSBL(v0 interface{}, v1 interface{}) *Instruction {
  15557. p := self.alloc("MOVSBL", 2, Operands { v0, v1 })
  15558. // MOVSBL r8, r32
  15559. if isReg8(v0) && isReg32(v1) {
  15560. p.domain = DomainGeneric
  15561. p.add(0, func(m *_Encoding, v []interface{}) {
  15562. m.rexo(hcode(v[1]), v[0], isReg8REX(v[0]))
  15563. m.emit(0x0f)
  15564. m.emit(0xbe)
  15565. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  15566. })
  15567. }
  15568. // MOVSBL m8, r32
  15569. if isM8(v0) && isReg32(v1) {
  15570. p.domain = DomainGeneric
  15571. p.add(0, func(m *_Encoding, v []interface{}) {
  15572. m.rexo(hcode(v[1]), addr(v[0]), false)
  15573. m.emit(0x0f)
  15574. m.emit(0xbe)
  15575. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  15576. })
  15577. }
  15578. if p.len == 0 {
  15579. panic("invalid operands for MOVSBL")
  15580. }
  15581. return p
  15582. }
  15583. // MOVSBQ performs "Move with Sign-Extension".
  15584. //
  15585. // Mnemonic : MOVSX
  15586. // Supported forms : (2 forms)
  15587. //
  15588. // * MOVSBQ r8, r64
  15589. // * MOVSBQ m8, r64
  15590. //
  15591. func (self *Program) MOVSBQ(v0 interface{}, v1 interface{}) *Instruction {
  15592. p := self.alloc("MOVSBQ", 2, Operands { v0, v1 })
  15593. // MOVSBQ r8, r64
  15594. if isReg8(v0) && isReg64(v1) {
  15595. p.domain = DomainGeneric
  15596. p.add(0, func(m *_Encoding, v []interface{}) {
  15597. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  15598. m.emit(0x0f)
  15599. m.emit(0xbe)
  15600. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  15601. })
  15602. }
  15603. // MOVSBQ m8, r64
  15604. if isM8(v0) && isReg64(v1) {
  15605. p.domain = DomainGeneric
  15606. p.add(0, func(m *_Encoding, v []interface{}) {
  15607. m.rexm(1, hcode(v[1]), addr(v[0]))
  15608. m.emit(0x0f)
  15609. m.emit(0xbe)
  15610. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  15611. })
  15612. }
  15613. if p.len == 0 {
  15614. panic("invalid operands for MOVSBQ")
  15615. }
  15616. return p
  15617. }
  15618. // MOVSBW performs "Move with Sign-Extension".
  15619. //
  15620. // Mnemonic : MOVSX
  15621. // Supported forms : (2 forms)
  15622. //
  15623. // * MOVSBW r8, r16
  15624. // * MOVSBW m8, r16
  15625. //
  15626. func (self *Program) MOVSBW(v0 interface{}, v1 interface{}) *Instruction {
  15627. p := self.alloc("MOVSBW", 2, Operands { v0, v1 })
  15628. // MOVSBW r8, r16
  15629. if isReg8(v0) && isReg16(v1) {
  15630. p.domain = DomainGeneric
  15631. p.add(0, func(m *_Encoding, v []interface{}) {
  15632. m.emit(0x66)
  15633. m.rexo(hcode(v[1]), v[0], isReg8REX(v[0]))
  15634. m.emit(0x0f)
  15635. m.emit(0xbe)
  15636. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  15637. })
  15638. }
  15639. // MOVSBW m8, r16
  15640. if isM8(v0) && isReg16(v1) {
  15641. p.domain = DomainGeneric
  15642. p.add(0, func(m *_Encoding, v []interface{}) {
  15643. m.emit(0x66)
  15644. m.rexo(hcode(v[1]), addr(v[0]), false)
  15645. m.emit(0x0f)
  15646. m.emit(0xbe)
  15647. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  15648. })
  15649. }
  15650. if p.len == 0 {
  15651. panic("invalid operands for MOVSBW")
  15652. }
  15653. return p
  15654. }
  15655. // MOVSD performs "Move Scalar Double-Precision Floating-Point Value".
  15656. //
  15657. // Mnemonic : MOVSD
  15658. // Supported forms : (3 forms)
  15659. //
  15660. // * MOVSD xmm, xmm [SSE2]
  15661. // * MOVSD m64, xmm [SSE2]
  15662. // * MOVSD xmm, m64 [SSE2]
  15663. //
  15664. func (self *Program) MOVSD(v0 interface{}, v1 interface{}) *Instruction {
  15665. p := self.alloc("MOVSD", 2, Operands { v0, v1 })
  15666. // MOVSD xmm, xmm
  15667. if isXMM(v0) && isXMM(v1) {
  15668. self.require(ISA_SSE2)
  15669. p.domain = DomainMMXSSE
  15670. p.add(0, func(m *_Encoding, v []interface{}) {
  15671. m.emit(0xf2)
  15672. m.rexo(hcode(v[1]), v[0], false)
  15673. m.emit(0x0f)
  15674. m.emit(0x10)
  15675. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  15676. })
  15677. p.add(0, func(m *_Encoding, v []interface{}) {
  15678. m.emit(0xf2)
  15679. m.rexo(hcode(v[0]), v[1], false)
  15680. m.emit(0x0f)
  15681. m.emit(0x11)
  15682. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  15683. })
  15684. }
  15685. // MOVSD m64, xmm
  15686. if isM64(v0) && isXMM(v1) {
  15687. self.require(ISA_SSE2)
  15688. p.domain = DomainMMXSSE
  15689. p.add(0, func(m *_Encoding, v []interface{}) {
  15690. m.emit(0xf2)
  15691. m.rexo(hcode(v[1]), addr(v[0]), false)
  15692. m.emit(0x0f)
  15693. m.emit(0x10)
  15694. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  15695. })
  15696. }
  15697. // MOVSD xmm, m64
  15698. if isXMM(v0) && isM64(v1) {
  15699. self.require(ISA_SSE2)
  15700. p.domain = DomainMMXSSE
  15701. p.add(0, func(m *_Encoding, v []interface{}) {
  15702. m.emit(0xf2)
  15703. m.rexo(hcode(v[0]), addr(v[1]), false)
  15704. m.emit(0x0f)
  15705. m.emit(0x11)
  15706. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  15707. })
  15708. }
  15709. if p.len == 0 {
  15710. panic("invalid operands for MOVSD")
  15711. }
  15712. return p
  15713. }
  15714. // MOVSHDUP performs "Move Packed Single-FP High and Duplicate".
  15715. //
  15716. // Mnemonic : MOVSHDUP
  15717. // Supported forms : (2 forms)
  15718. //
  15719. // * MOVSHDUP xmm, xmm [SSE3]
  15720. // * MOVSHDUP m128, xmm [SSE3]
  15721. //
  15722. func (self *Program) MOVSHDUP(v0 interface{}, v1 interface{}) *Instruction {
  15723. p := self.alloc("MOVSHDUP", 2, Operands { v0, v1 })
  15724. // MOVSHDUP xmm, xmm
  15725. if isXMM(v0) && isXMM(v1) {
  15726. self.require(ISA_SSE3)
  15727. p.domain = DomainMMXSSE
  15728. p.add(0, func(m *_Encoding, v []interface{}) {
  15729. m.emit(0xf3)
  15730. m.rexo(hcode(v[1]), v[0], false)
  15731. m.emit(0x0f)
  15732. m.emit(0x16)
  15733. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  15734. })
  15735. }
  15736. // MOVSHDUP m128, xmm
  15737. if isM128(v0) && isXMM(v1) {
  15738. self.require(ISA_SSE3)
  15739. p.domain = DomainMMXSSE
  15740. p.add(0, func(m *_Encoding, v []interface{}) {
  15741. m.emit(0xf3)
  15742. m.rexo(hcode(v[1]), addr(v[0]), false)
  15743. m.emit(0x0f)
  15744. m.emit(0x16)
  15745. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  15746. })
  15747. }
  15748. if p.len == 0 {
  15749. panic("invalid operands for MOVSHDUP")
  15750. }
  15751. return p
  15752. }
  15753. // MOVSLDUP performs "Move Packed Single-FP Low and Duplicate".
  15754. //
  15755. // Mnemonic : MOVSLDUP
  15756. // Supported forms : (2 forms)
  15757. //
  15758. // * MOVSLDUP xmm, xmm [SSE3]
  15759. // * MOVSLDUP m128, xmm [SSE3]
  15760. //
  15761. func (self *Program) MOVSLDUP(v0 interface{}, v1 interface{}) *Instruction {
  15762. p := self.alloc("MOVSLDUP", 2, Operands { v0, v1 })
  15763. // MOVSLDUP xmm, xmm
  15764. if isXMM(v0) && isXMM(v1) {
  15765. self.require(ISA_SSE3)
  15766. p.domain = DomainMMXSSE
  15767. p.add(0, func(m *_Encoding, v []interface{}) {
  15768. m.emit(0xf3)
  15769. m.rexo(hcode(v[1]), v[0], false)
  15770. m.emit(0x0f)
  15771. m.emit(0x12)
  15772. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  15773. })
  15774. }
  15775. // MOVSLDUP m128, xmm
  15776. if isM128(v0) && isXMM(v1) {
  15777. self.require(ISA_SSE3)
  15778. p.domain = DomainMMXSSE
  15779. p.add(0, func(m *_Encoding, v []interface{}) {
  15780. m.emit(0xf3)
  15781. m.rexo(hcode(v[1]), addr(v[0]), false)
  15782. m.emit(0x0f)
  15783. m.emit(0x12)
  15784. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  15785. })
  15786. }
  15787. if p.len == 0 {
  15788. panic("invalid operands for MOVSLDUP")
  15789. }
  15790. return p
  15791. }
  15792. // MOVSLQ performs "Move Doubleword to Quadword with Sign-Extension".
  15793. //
  15794. // Mnemonic : MOVSXD
  15795. // Supported forms : (2 forms)
  15796. //
  15797. // * MOVSLQ r32, r64
  15798. // * MOVSLQ m32, r64
  15799. //
  15800. func (self *Program) MOVSLQ(v0 interface{}, v1 interface{}) *Instruction {
  15801. p := self.alloc("MOVSLQ", 2, Operands { v0, v1 })
  15802. // MOVSLQ r32, r64
  15803. if isReg32(v0) && isReg64(v1) {
  15804. p.domain = DomainGeneric
  15805. p.add(0, func(m *_Encoding, v []interface{}) {
  15806. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  15807. m.emit(0x63)
  15808. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  15809. })
  15810. }
  15811. // MOVSLQ m32, r64
  15812. if isM32(v0) && isReg64(v1) {
  15813. p.domain = DomainGeneric
  15814. p.add(0, func(m *_Encoding, v []interface{}) {
  15815. m.rexm(1, hcode(v[1]), addr(v[0]))
  15816. m.emit(0x63)
  15817. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  15818. })
  15819. }
  15820. if p.len == 0 {
  15821. panic("invalid operands for MOVSLQ")
  15822. }
  15823. return p
  15824. }
  15825. // MOVSS performs "Move Scalar Single-Precision Floating-Point Values".
  15826. //
  15827. // Mnemonic : MOVSS
  15828. // Supported forms : (3 forms)
  15829. //
  15830. // * MOVSS xmm, xmm [SSE]
  15831. // * MOVSS m32, xmm [SSE]
  15832. // * MOVSS xmm, m32 [SSE]
  15833. //
  15834. func (self *Program) MOVSS(v0 interface{}, v1 interface{}) *Instruction {
  15835. p := self.alloc("MOVSS", 2, Operands { v0, v1 })
  15836. // MOVSS xmm, xmm
  15837. if isXMM(v0) && isXMM(v1) {
  15838. self.require(ISA_SSE)
  15839. p.domain = DomainMMXSSE
  15840. p.add(0, func(m *_Encoding, v []interface{}) {
  15841. m.emit(0xf3)
  15842. m.rexo(hcode(v[1]), v[0], false)
  15843. m.emit(0x0f)
  15844. m.emit(0x10)
  15845. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  15846. })
  15847. p.add(0, func(m *_Encoding, v []interface{}) {
  15848. m.emit(0xf3)
  15849. m.rexo(hcode(v[0]), v[1], false)
  15850. m.emit(0x0f)
  15851. m.emit(0x11)
  15852. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  15853. })
  15854. }
  15855. // MOVSS m32, xmm
  15856. if isM32(v0) && isXMM(v1) {
  15857. self.require(ISA_SSE)
  15858. p.domain = DomainMMXSSE
  15859. p.add(0, func(m *_Encoding, v []interface{}) {
  15860. m.emit(0xf3)
  15861. m.rexo(hcode(v[1]), addr(v[0]), false)
  15862. m.emit(0x0f)
  15863. m.emit(0x10)
  15864. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  15865. })
  15866. }
  15867. // MOVSS xmm, m32
  15868. if isXMM(v0) && isM32(v1) {
  15869. self.require(ISA_SSE)
  15870. p.domain = DomainMMXSSE
  15871. p.add(0, func(m *_Encoding, v []interface{}) {
  15872. m.emit(0xf3)
  15873. m.rexo(hcode(v[0]), addr(v[1]), false)
  15874. m.emit(0x0f)
  15875. m.emit(0x11)
  15876. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  15877. })
  15878. }
  15879. if p.len == 0 {
  15880. panic("invalid operands for MOVSS")
  15881. }
  15882. return p
  15883. }
  15884. // MOVSWL performs "Move with Sign-Extension".
  15885. //
  15886. // Mnemonic : MOVSX
  15887. // Supported forms : (2 forms)
  15888. //
  15889. // * MOVSWL r16, r32
  15890. // * MOVSWL m16, r32
  15891. //
  15892. func (self *Program) MOVSWL(v0 interface{}, v1 interface{}) *Instruction {
  15893. p := self.alloc("MOVSWL", 2, Operands { v0, v1 })
  15894. // MOVSWL r16, r32
  15895. if isReg16(v0) && isReg32(v1) {
  15896. p.domain = DomainGeneric
  15897. p.add(0, func(m *_Encoding, v []interface{}) {
  15898. m.rexo(hcode(v[1]), v[0], false)
  15899. m.emit(0x0f)
  15900. m.emit(0xbf)
  15901. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  15902. })
  15903. }
  15904. // MOVSWL m16, r32
  15905. if isM16(v0) && isReg32(v1) {
  15906. p.domain = DomainGeneric
  15907. p.add(0, func(m *_Encoding, v []interface{}) {
  15908. m.rexo(hcode(v[1]), addr(v[0]), false)
  15909. m.emit(0x0f)
  15910. m.emit(0xbf)
  15911. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  15912. })
  15913. }
  15914. if p.len == 0 {
  15915. panic("invalid operands for MOVSWL")
  15916. }
  15917. return p
  15918. }
  15919. // MOVSWQ performs "Move with Sign-Extension".
  15920. //
  15921. // Mnemonic : MOVSX
  15922. // Supported forms : (2 forms)
  15923. //
  15924. // * MOVSWQ r16, r64
  15925. // * MOVSWQ m16, r64
  15926. //
  15927. func (self *Program) MOVSWQ(v0 interface{}, v1 interface{}) *Instruction {
  15928. p := self.alloc("MOVSWQ", 2, Operands { v0, v1 })
  15929. // MOVSWQ r16, r64
  15930. if isReg16(v0) && isReg64(v1) {
  15931. p.domain = DomainGeneric
  15932. p.add(0, func(m *_Encoding, v []interface{}) {
  15933. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  15934. m.emit(0x0f)
  15935. m.emit(0xbf)
  15936. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  15937. })
  15938. }
  15939. // MOVSWQ m16, r64
  15940. if isM16(v0) && isReg64(v1) {
  15941. p.domain = DomainGeneric
  15942. p.add(0, func(m *_Encoding, v []interface{}) {
  15943. m.rexm(1, hcode(v[1]), addr(v[0]))
  15944. m.emit(0x0f)
  15945. m.emit(0xbf)
  15946. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  15947. })
  15948. }
  15949. if p.len == 0 {
  15950. panic("invalid operands for MOVSWQ")
  15951. }
  15952. return p
  15953. }
  15954. // MOVUPD performs "Move Unaligned Packed Double-Precision Floating-Point Values".
  15955. //
  15956. // Mnemonic : MOVUPD
  15957. // Supported forms : (3 forms)
  15958. //
  15959. // * MOVUPD xmm, xmm [SSE2]
  15960. // * MOVUPD m128, xmm [SSE2]
  15961. // * MOVUPD xmm, m128 [SSE2]
  15962. //
  15963. func (self *Program) MOVUPD(v0 interface{}, v1 interface{}) *Instruction {
  15964. p := self.alloc("MOVUPD", 2, Operands { v0, v1 })
  15965. // MOVUPD xmm, xmm
  15966. if isXMM(v0) && isXMM(v1) {
  15967. self.require(ISA_SSE2)
  15968. p.domain = DomainMMXSSE
  15969. p.add(0, func(m *_Encoding, v []interface{}) {
  15970. m.emit(0x66)
  15971. m.rexo(hcode(v[1]), v[0], false)
  15972. m.emit(0x0f)
  15973. m.emit(0x10)
  15974. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  15975. })
  15976. p.add(0, func(m *_Encoding, v []interface{}) {
  15977. m.emit(0x66)
  15978. m.rexo(hcode(v[0]), v[1], false)
  15979. m.emit(0x0f)
  15980. m.emit(0x11)
  15981. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  15982. })
  15983. }
  15984. // MOVUPD m128, xmm
  15985. if isM128(v0) && isXMM(v1) {
  15986. self.require(ISA_SSE2)
  15987. p.domain = DomainMMXSSE
  15988. p.add(0, func(m *_Encoding, v []interface{}) {
  15989. m.emit(0x66)
  15990. m.rexo(hcode(v[1]), addr(v[0]), false)
  15991. m.emit(0x0f)
  15992. m.emit(0x10)
  15993. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  15994. })
  15995. }
  15996. // MOVUPD xmm, m128
  15997. if isXMM(v0) && isM128(v1) {
  15998. self.require(ISA_SSE2)
  15999. p.domain = DomainMMXSSE
  16000. p.add(0, func(m *_Encoding, v []interface{}) {
  16001. m.emit(0x66)
  16002. m.rexo(hcode(v[0]), addr(v[1]), false)
  16003. m.emit(0x0f)
  16004. m.emit(0x11)
  16005. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  16006. })
  16007. }
  16008. if p.len == 0 {
  16009. panic("invalid operands for MOVUPD")
  16010. }
  16011. return p
  16012. }
  16013. // MOVUPS performs "Move Unaligned Packed Single-Precision Floating-Point Values".
  16014. //
  16015. // Mnemonic : MOVUPS
  16016. // Supported forms : (3 forms)
  16017. //
  16018. // * MOVUPS xmm, xmm [SSE]
  16019. // * MOVUPS m128, xmm [SSE]
  16020. // * MOVUPS xmm, m128 [SSE]
  16021. //
  16022. func (self *Program) MOVUPS(v0 interface{}, v1 interface{}) *Instruction {
  16023. p := self.alloc("MOVUPS", 2, Operands { v0, v1 })
  16024. // MOVUPS xmm, xmm
  16025. if isXMM(v0) && isXMM(v1) {
  16026. self.require(ISA_SSE)
  16027. p.domain = DomainMMXSSE
  16028. p.add(0, func(m *_Encoding, v []interface{}) {
  16029. m.rexo(hcode(v[1]), v[0], false)
  16030. m.emit(0x0f)
  16031. m.emit(0x10)
  16032. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  16033. })
  16034. p.add(0, func(m *_Encoding, v []interface{}) {
  16035. m.rexo(hcode(v[0]), v[1], false)
  16036. m.emit(0x0f)
  16037. m.emit(0x11)
  16038. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  16039. })
  16040. }
  16041. // MOVUPS m128, xmm
  16042. if isM128(v0) && isXMM(v1) {
  16043. self.require(ISA_SSE)
  16044. p.domain = DomainMMXSSE
  16045. p.add(0, func(m *_Encoding, v []interface{}) {
  16046. m.rexo(hcode(v[1]), addr(v[0]), false)
  16047. m.emit(0x0f)
  16048. m.emit(0x10)
  16049. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  16050. })
  16051. }
  16052. // MOVUPS xmm, m128
  16053. if isXMM(v0) && isM128(v1) {
  16054. self.require(ISA_SSE)
  16055. p.domain = DomainMMXSSE
  16056. p.add(0, func(m *_Encoding, v []interface{}) {
  16057. m.rexo(hcode(v[0]), addr(v[1]), false)
  16058. m.emit(0x0f)
  16059. m.emit(0x11)
  16060. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  16061. })
  16062. }
  16063. if p.len == 0 {
  16064. panic("invalid operands for MOVUPS")
  16065. }
  16066. return p
  16067. }
  16068. // MOVW performs "Move".
  16069. //
  16070. // Mnemonic : MOV
  16071. // Supported forms : (5 forms)
  16072. //
  16073. // * MOVW imm16, r16
  16074. // * MOVW r16, r16
  16075. // * MOVW m16, r16
  16076. // * MOVW imm16, m16
  16077. // * MOVW r16, m16
  16078. //
  16079. func (self *Program) MOVW(v0 interface{}, v1 interface{}) *Instruction {
  16080. p := self.alloc("MOVW", 2, Operands { v0, v1 })
  16081. // MOVW imm16, r16
  16082. if isImm16(v0) && isReg16(v1) {
  16083. p.domain = DomainGeneric
  16084. p.add(0, func(m *_Encoding, v []interface{}) {
  16085. m.emit(0x66)
  16086. m.rexo(0, v[1], false)
  16087. m.emit(0xc7)
  16088. m.emit(0xc0 | lcode(v[1]))
  16089. m.imm2(toImmAny(v[0]))
  16090. })
  16091. p.add(0, func(m *_Encoding, v []interface{}) {
  16092. m.emit(0x66)
  16093. m.rexo(0, v[1], false)
  16094. m.emit(0xb8 | lcode(v[1]))
  16095. m.imm2(toImmAny(v[0]))
  16096. })
  16097. }
  16098. // MOVW r16, r16
  16099. if isReg16(v0) && isReg16(v1) {
  16100. p.domain = DomainGeneric
  16101. p.add(0, func(m *_Encoding, v []interface{}) {
  16102. m.emit(0x66)
  16103. m.rexo(hcode(v[0]), v[1], false)
  16104. m.emit(0x89)
  16105. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  16106. })
  16107. p.add(0, func(m *_Encoding, v []interface{}) {
  16108. m.emit(0x66)
  16109. m.rexo(hcode(v[1]), v[0], false)
  16110. m.emit(0x8b)
  16111. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  16112. })
  16113. }
  16114. // MOVW m16, r16
  16115. if isM16(v0) && isReg16(v1) {
  16116. p.domain = DomainGeneric
  16117. p.add(0, func(m *_Encoding, v []interface{}) {
  16118. m.emit(0x66)
  16119. m.rexo(hcode(v[1]), addr(v[0]), false)
  16120. m.emit(0x8b)
  16121. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  16122. })
  16123. }
  16124. // MOVW imm16, m16
  16125. if isImm16(v0) && isM16(v1) {
  16126. p.domain = DomainGeneric
  16127. p.add(0, func(m *_Encoding, v []interface{}) {
  16128. m.emit(0x66)
  16129. m.rexo(0, addr(v[1]), false)
  16130. m.emit(0xc7)
  16131. m.mrsd(0, addr(v[1]), 1)
  16132. m.imm2(toImmAny(v[0]))
  16133. })
  16134. }
  16135. // MOVW r16, m16
  16136. if isReg16(v0) && isM16(v1) {
  16137. p.domain = DomainGeneric
  16138. p.add(0, func(m *_Encoding, v []interface{}) {
  16139. m.emit(0x66)
  16140. m.rexo(hcode(v[0]), addr(v[1]), false)
  16141. m.emit(0x89)
  16142. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  16143. })
  16144. }
  16145. if p.len == 0 {
  16146. panic("invalid operands for MOVW")
  16147. }
  16148. return p
  16149. }
  16150. // MOVZBL performs "Move with Zero-Extend".
  16151. //
  16152. // Mnemonic : MOVZX
  16153. // Supported forms : (2 forms)
  16154. //
  16155. // * MOVZBL r8, r32
  16156. // * MOVZBL m8, r32
  16157. //
  16158. func (self *Program) MOVZBL(v0 interface{}, v1 interface{}) *Instruction {
  16159. p := self.alloc("MOVZBL", 2, Operands { v0, v1 })
  16160. // MOVZBL r8, r32
  16161. if isReg8(v0) && isReg32(v1) {
  16162. p.domain = DomainGeneric
  16163. p.add(0, func(m *_Encoding, v []interface{}) {
  16164. m.rexo(hcode(v[1]), v[0], isReg8REX(v[0]))
  16165. m.emit(0x0f)
  16166. m.emit(0xb6)
  16167. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  16168. })
  16169. }
  16170. // MOVZBL m8, r32
  16171. if isM8(v0) && isReg32(v1) {
  16172. p.domain = DomainGeneric
  16173. p.add(0, func(m *_Encoding, v []interface{}) {
  16174. m.rexo(hcode(v[1]), addr(v[0]), false)
  16175. m.emit(0x0f)
  16176. m.emit(0xb6)
  16177. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  16178. })
  16179. }
  16180. if p.len == 0 {
  16181. panic("invalid operands for MOVZBL")
  16182. }
  16183. return p
  16184. }
  16185. // MOVZBQ performs "Move with Zero-Extend".
  16186. //
  16187. // Mnemonic : MOVZX
  16188. // Supported forms : (2 forms)
  16189. //
  16190. // * MOVZBQ r8, r64
  16191. // * MOVZBQ m8, r64
  16192. //
  16193. func (self *Program) MOVZBQ(v0 interface{}, v1 interface{}) *Instruction {
  16194. p := self.alloc("MOVZBQ", 2, Operands { v0, v1 })
  16195. // MOVZBQ r8, r64
  16196. if isReg8(v0) && isReg64(v1) {
  16197. p.domain = DomainGeneric
  16198. p.add(0, func(m *_Encoding, v []interface{}) {
  16199. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  16200. m.emit(0x0f)
  16201. m.emit(0xb6)
  16202. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  16203. })
  16204. }
  16205. // MOVZBQ m8, r64
  16206. if isM8(v0) && isReg64(v1) {
  16207. p.domain = DomainGeneric
  16208. p.add(0, func(m *_Encoding, v []interface{}) {
  16209. m.rexm(1, hcode(v[1]), addr(v[0]))
  16210. m.emit(0x0f)
  16211. m.emit(0xb6)
  16212. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  16213. })
  16214. }
  16215. if p.len == 0 {
  16216. panic("invalid operands for MOVZBQ")
  16217. }
  16218. return p
  16219. }
  16220. // MOVZBW performs "Move with Zero-Extend".
  16221. //
  16222. // Mnemonic : MOVZX
  16223. // Supported forms : (2 forms)
  16224. //
  16225. // * MOVZBW r8, r16
  16226. // * MOVZBW m8, r16
  16227. //
  16228. func (self *Program) MOVZBW(v0 interface{}, v1 interface{}) *Instruction {
  16229. p := self.alloc("MOVZBW", 2, Operands { v0, v1 })
  16230. // MOVZBW r8, r16
  16231. if isReg8(v0) && isReg16(v1) {
  16232. p.domain = DomainGeneric
  16233. p.add(0, func(m *_Encoding, v []interface{}) {
  16234. m.emit(0x66)
  16235. m.rexo(hcode(v[1]), v[0], isReg8REX(v[0]))
  16236. m.emit(0x0f)
  16237. m.emit(0xb6)
  16238. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  16239. })
  16240. }
  16241. // MOVZBW m8, r16
  16242. if isM8(v0) && isReg16(v1) {
  16243. p.domain = DomainGeneric
  16244. p.add(0, func(m *_Encoding, v []interface{}) {
  16245. m.emit(0x66)
  16246. m.rexo(hcode(v[1]), addr(v[0]), false)
  16247. m.emit(0x0f)
  16248. m.emit(0xb6)
  16249. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  16250. })
  16251. }
  16252. if p.len == 0 {
  16253. panic("invalid operands for MOVZBW")
  16254. }
  16255. return p
  16256. }
  16257. // MOVZWL performs "Move with Zero-Extend".
  16258. //
  16259. // Mnemonic : MOVZX
  16260. // Supported forms : (2 forms)
  16261. //
  16262. // * MOVZWL r16, r32
  16263. // * MOVZWL m16, r32
  16264. //
  16265. func (self *Program) MOVZWL(v0 interface{}, v1 interface{}) *Instruction {
  16266. p := self.alloc("MOVZWL", 2, Operands { v0, v1 })
  16267. // MOVZWL r16, r32
  16268. if isReg16(v0) && isReg32(v1) {
  16269. p.domain = DomainGeneric
  16270. p.add(0, func(m *_Encoding, v []interface{}) {
  16271. m.rexo(hcode(v[1]), v[0], false)
  16272. m.emit(0x0f)
  16273. m.emit(0xb7)
  16274. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  16275. })
  16276. }
  16277. // MOVZWL m16, r32
  16278. if isM16(v0) && isReg32(v1) {
  16279. p.domain = DomainGeneric
  16280. p.add(0, func(m *_Encoding, v []interface{}) {
  16281. m.rexo(hcode(v[1]), addr(v[0]), false)
  16282. m.emit(0x0f)
  16283. m.emit(0xb7)
  16284. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  16285. })
  16286. }
  16287. if p.len == 0 {
  16288. panic("invalid operands for MOVZWL")
  16289. }
  16290. return p
  16291. }
  16292. // MOVZWQ performs "Move with Zero-Extend".
  16293. //
  16294. // Mnemonic : MOVZX
  16295. // Supported forms : (2 forms)
  16296. //
  16297. // * MOVZWQ r16, r64
  16298. // * MOVZWQ m16, r64
  16299. //
  16300. func (self *Program) MOVZWQ(v0 interface{}, v1 interface{}) *Instruction {
  16301. p := self.alloc("MOVZWQ", 2, Operands { v0, v1 })
  16302. // MOVZWQ r16, r64
  16303. if isReg16(v0) && isReg64(v1) {
  16304. p.domain = DomainGeneric
  16305. p.add(0, func(m *_Encoding, v []interface{}) {
  16306. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  16307. m.emit(0x0f)
  16308. m.emit(0xb7)
  16309. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  16310. })
  16311. }
  16312. // MOVZWQ m16, r64
  16313. if isM16(v0) && isReg64(v1) {
  16314. p.domain = DomainGeneric
  16315. p.add(0, func(m *_Encoding, v []interface{}) {
  16316. m.rexm(1, hcode(v[1]), addr(v[0]))
  16317. m.emit(0x0f)
  16318. m.emit(0xb7)
  16319. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  16320. })
  16321. }
  16322. if p.len == 0 {
  16323. panic("invalid operands for MOVZWQ")
  16324. }
  16325. return p
  16326. }
  16327. // MPSADBW performs "Compute Multiple Packed Sums of Absolute Difference".
  16328. //
  16329. // Mnemonic : MPSADBW
  16330. // Supported forms : (2 forms)
  16331. //
  16332. // * MPSADBW imm8, xmm, xmm [SSE4.1]
  16333. // * MPSADBW imm8, m128, xmm [SSE4.1]
  16334. //
  16335. func (self *Program) MPSADBW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  16336. p := self.alloc("MPSADBW", 3, Operands { v0, v1, v2 })
  16337. // MPSADBW imm8, xmm, xmm
  16338. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  16339. self.require(ISA_SSE4_1)
  16340. p.domain = DomainMMXSSE
  16341. p.add(0, func(m *_Encoding, v []interface{}) {
  16342. m.emit(0x66)
  16343. m.rexo(hcode(v[2]), v[1], false)
  16344. m.emit(0x0f)
  16345. m.emit(0x3a)
  16346. m.emit(0x42)
  16347. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  16348. m.imm1(toImmAny(v[0]))
  16349. })
  16350. }
  16351. // MPSADBW imm8, m128, xmm
  16352. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  16353. self.require(ISA_SSE4_1)
  16354. p.domain = DomainMMXSSE
  16355. p.add(0, func(m *_Encoding, v []interface{}) {
  16356. m.emit(0x66)
  16357. m.rexo(hcode(v[2]), addr(v[1]), false)
  16358. m.emit(0x0f)
  16359. m.emit(0x3a)
  16360. m.emit(0x42)
  16361. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  16362. m.imm1(toImmAny(v[0]))
  16363. })
  16364. }
  16365. if p.len == 0 {
  16366. panic("invalid operands for MPSADBW")
  16367. }
  16368. return p
  16369. }
  16370. // MULB performs "Unsigned Multiply".
  16371. //
  16372. // Mnemonic : MUL
  16373. // Supported forms : (2 forms)
  16374. //
  16375. // * MULB r8
  16376. // * MULB m8
  16377. //
  16378. func (self *Program) MULB(v0 interface{}) *Instruction {
  16379. p := self.alloc("MULB", 1, Operands { v0 })
  16380. // MULB r8
  16381. if isReg8(v0) {
  16382. p.domain = DomainGeneric
  16383. p.add(0, func(m *_Encoding, v []interface{}) {
  16384. m.rexo(0, v[0], isReg8REX(v[0]))
  16385. m.emit(0xf6)
  16386. m.emit(0xe0 | lcode(v[0]))
  16387. })
  16388. }
  16389. // MULB m8
  16390. if isM8(v0) {
  16391. p.domain = DomainGeneric
  16392. p.add(0, func(m *_Encoding, v []interface{}) {
  16393. m.rexo(0, addr(v[0]), false)
  16394. m.emit(0xf6)
  16395. m.mrsd(4, addr(v[0]), 1)
  16396. })
  16397. }
  16398. if p.len == 0 {
  16399. panic("invalid operands for MULB")
  16400. }
  16401. return p
  16402. }
  16403. // MULL performs "Unsigned Multiply".
  16404. //
  16405. // Mnemonic : MUL
  16406. // Supported forms : (2 forms)
  16407. //
  16408. // * MULL r32
  16409. // * MULL m32
  16410. //
  16411. func (self *Program) MULL(v0 interface{}) *Instruction {
  16412. p := self.alloc("MULL", 1, Operands { v0 })
  16413. // MULL r32
  16414. if isReg32(v0) {
  16415. p.domain = DomainGeneric
  16416. p.add(0, func(m *_Encoding, v []interface{}) {
  16417. m.rexo(0, v[0], false)
  16418. m.emit(0xf7)
  16419. m.emit(0xe0 | lcode(v[0]))
  16420. })
  16421. }
  16422. // MULL m32
  16423. if isM32(v0) {
  16424. p.domain = DomainGeneric
  16425. p.add(0, func(m *_Encoding, v []interface{}) {
  16426. m.rexo(0, addr(v[0]), false)
  16427. m.emit(0xf7)
  16428. m.mrsd(4, addr(v[0]), 1)
  16429. })
  16430. }
  16431. if p.len == 0 {
  16432. panic("invalid operands for MULL")
  16433. }
  16434. return p
  16435. }
  16436. // MULPD performs "Multiply Packed Double-Precision Floating-Point Values".
  16437. //
  16438. // Mnemonic : MULPD
  16439. // Supported forms : (2 forms)
  16440. //
  16441. // * MULPD xmm, xmm [SSE2]
  16442. // * MULPD m128, xmm [SSE2]
  16443. //
  16444. func (self *Program) MULPD(v0 interface{}, v1 interface{}) *Instruction {
  16445. p := self.alloc("MULPD", 2, Operands { v0, v1 })
  16446. // MULPD xmm, xmm
  16447. if isXMM(v0) && isXMM(v1) {
  16448. self.require(ISA_SSE2)
  16449. p.domain = DomainMMXSSE
  16450. p.add(0, func(m *_Encoding, v []interface{}) {
  16451. m.emit(0x66)
  16452. m.rexo(hcode(v[1]), v[0], false)
  16453. m.emit(0x0f)
  16454. m.emit(0x59)
  16455. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  16456. })
  16457. }
  16458. // MULPD m128, xmm
  16459. if isM128(v0) && isXMM(v1) {
  16460. self.require(ISA_SSE2)
  16461. p.domain = DomainMMXSSE
  16462. p.add(0, func(m *_Encoding, v []interface{}) {
  16463. m.emit(0x66)
  16464. m.rexo(hcode(v[1]), addr(v[0]), false)
  16465. m.emit(0x0f)
  16466. m.emit(0x59)
  16467. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  16468. })
  16469. }
  16470. if p.len == 0 {
  16471. panic("invalid operands for MULPD")
  16472. }
  16473. return p
  16474. }
  16475. // MULPS performs "Multiply Packed Single-Precision Floating-Point Values".
  16476. //
  16477. // Mnemonic : MULPS
  16478. // Supported forms : (2 forms)
  16479. //
  16480. // * MULPS xmm, xmm [SSE]
  16481. // * MULPS m128, xmm [SSE]
  16482. //
  16483. func (self *Program) MULPS(v0 interface{}, v1 interface{}) *Instruction {
  16484. p := self.alloc("MULPS", 2, Operands { v0, v1 })
  16485. // MULPS xmm, xmm
  16486. if isXMM(v0) && isXMM(v1) {
  16487. self.require(ISA_SSE)
  16488. p.domain = DomainMMXSSE
  16489. p.add(0, func(m *_Encoding, v []interface{}) {
  16490. m.rexo(hcode(v[1]), v[0], false)
  16491. m.emit(0x0f)
  16492. m.emit(0x59)
  16493. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  16494. })
  16495. }
  16496. // MULPS m128, xmm
  16497. if isM128(v0) && isXMM(v1) {
  16498. self.require(ISA_SSE)
  16499. p.domain = DomainMMXSSE
  16500. p.add(0, func(m *_Encoding, v []interface{}) {
  16501. m.rexo(hcode(v[1]), addr(v[0]), false)
  16502. m.emit(0x0f)
  16503. m.emit(0x59)
  16504. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  16505. })
  16506. }
  16507. if p.len == 0 {
  16508. panic("invalid operands for MULPS")
  16509. }
  16510. return p
  16511. }
  16512. // MULQ performs "Unsigned Multiply".
  16513. //
  16514. // Mnemonic : MUL
  16515. // Supported forms : (2 forms)
  16516. //
  16517. // * MULQ r64
  16518. // * MULQ m64
  16519. //
  16520. func (self *Program) MULQ(v0 interface{}) *Instruction {
  16521. p := self.alloc("MULQ", 1, Operands { v0 })
  16522. // MULQ r64
  16523. if isReg64(v0) {
  16524. p.domain = DomainGeneric
  16525. p.add(0, func(m *_Encoding, v []interface{}) {
  16526. m.emit(0x48 | hcode(v[0]))
  16527. m.emit(0xf7)
  16528. m.emit(0xe0 | lcode(v[0]))
  16529. })
  16530. }
  16531. // MULQ m64
  16532. if isM64(v0) {
  16533. p.domain = DomainGeneric
  16534. p.add(0, func(m *_Encoding, v []interface{}) {
  16535. m.rexm(1, 0, addr(v[0]))
  16536. m.emit(0xf7)
  16537. m.mrsd(4, addr(v[0]), 1)
  16538. })
  16539. }
  16540. if p.len == 0 {
  16541. panic("invalid operands for MULQ")
  16542. }
  16543. return p
  16544. }
  16545. // MULSD performs "Multiply Scalar Double-Precision Floating-Point Values".
  16546. //
  16547. // Mnemonic : MULSD
  16548. // Supported forms : (2 forms)
  16549. //
  16550. // * MULSD xmm, xmm [SSE2]
  16551. // * MULSD m64, xmm [SSE2]
  16552. //
  16553. func (self *Program) MULSD(v0 interface{}, v1 interface{}) *Instruction {
  16554. p := self.alloc("MULSD", 2, Operands { v0, v1 })
  16555. // MULSD xmm, xmm
  16556. if isXMM(v0) && isXMM(v1) {
  16557. self.require(ISA_SSE2)
  16558. p.domain = DomainMMXSSE
  16559. p.add(0, func(m *_Encoding, v []interface{}) {
  16560. m.emit(0xf2)
  16561. m.rexo(hcode(v[1]), v[0], false)
  16562. m.emit(0x0f)
  16563. m.emit(0x59)
  16564. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  16565. })
  16566. }
  16567. // MULSD m64, xmm
  16568. if isM64(v0) && isXMM(v1) {
  16569. self.require(ISA_SSE2)
  16570. p.domain = DomainMMXSSE
  16571. p.add(0, func(m *_Encoding, v []interface{}) {
  16572. m.emit(0xf2)
  16573. m.rexo(hcode(v[1]), addr(v[0]), false)
  16574. m.emit(0x0f)
  16575. m.emit(0x59)
  16576. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  16577. })
  16578. }
  16579. if p.len == 0 {
  16580. panic("invalid operands for MULSD")
  16581. }
  16582. return p
  16583. }
  16584. // MULSS performs "Multiply Scalar Single-Precision Floating-Point Values".
  16585. //
  16586. // Mnemonic : MULSS
  16587. // Supported forms : (2 forms)
  16588. //
  16589. // * MULSS xmm, xmm [SSE]
  16590. // * MULSS m32, xmm [SSE]
  16591. //
  16592. func (self *Program) MULSS(v0 interface{}, v1 interface{}) *Instruction {
  16593. p := self.alloc("MULSS", 2, Operands { v0, v1 })
  16594. // MULSS xmm, xmm
  16595. if isXMM(v0) && isXMM(v1) {
  16596. self.require(ISA_SSE)
  16597. p.domain = DomainMMXSSE
  16598. p.add(0, func(m *_Encoding, v []interface{}) {
  16599. m.emit(0xf3)
  16600. m.rexo(hcode(v[1]), v[0], false)
  16601. m.emit(0x0f)
  16602. m.emit(0x59)
  16603. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  16604. })
  16605. }
  16606. // MULSS m32, xmm
  16607. if isM32(v0) && isXMM(v1) {
  16608. self.require(ISA_SSE)
  16609. p.domain = DomainMMXSSE
  16610. p.add(0, func(m *_Encoding, v []interface{}) {
  16611. m.emit(0xf3)
  16612. m.rexo(hcode(v[1]), addr(v[0]), false)
  16613. m.emit(0x0f)
  16614. m.emit(0x59)
  16615. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  16616. })
  16617. }
  16618. if p.len == 0 {
  16619. panic("invalid operands for MULSS")
  16620. }
  16621. return p
  16622. }
  16623. // MULW performs "Unsigned Multiply".
  16624. //
  16625. // Mnemonic : MUL
  16626. // Supported forms : (2 forms)
  16627. //
  16628. // * MULW r16
  16629. // * MULW m16
  16630. //
  16631. func (self *Program) MULW(v0 interface{}) *Instruction {
  16632. p := self.alloc("MULW", 1, Operands { v0 })
  16633. // MULW r16
  16634. if isReg16(v0) {
  16635. p.domain = DomainGeneric
  16636. p.add(0, func(m *_Encoding, v []interface{}) {
  16637. m.emit(0x66)
  16638. m.rexo(0, v[0], false)
  16639. m.emit(0xf7)
  16640. m.emit(0xe0 | lcode(v[0]))
  16641. })
  16642. }
  16643. // MULW m16
  16644. if isM16(v0) {
  16645. p.domain = DomainGeneric
  16646. p.add(0, func(m *_Encoding, v []interface{}) {
  16647. m.emit(0x66)
  16648. m.rexo(0, addr(v[0]), false)
  16649. m.emit(0xf7)
  16650. m.mrsd(4, addr(v[0]), 1)
  16651. })
  16652. }
  16653. if p.len == 0 {
  16654. panic("invalid operands for MULW")
  16655. }
  16656. return p
  16657. }
  16658. // MULXL performs "Unsigned Multiply Without Affecting Flags".
  16659. //
  16660. // Mnemonic : MULX
  16661. // Supported forms : (2 forms)
  16662. //
  16663. // * MULXL r32, r32, r32 [BMI2]
  16664. // * MULXL m32, r32, r32 [BMI2]
  16665. //
  16666. func (self *Program) MULXL(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  16667. p := self.alloc("MULXL", 3, Operands { v0, v1, v2 })
  16668. // MULXL r32, r32, r32
  16669. if isReg32(v0) && isReg32(v1) && isReg32(v2) {
  16670. self.require(ISA_BMI2)
  16671. p.domain = DomainGeneric
  16672. p.add(0, func(m *_Encoding, v []interface{}) {
  16673. m.emit(0xc4)
  16674. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  16675. m.emit(0x7b ^ (hlcode(v[1]) << 3))
  16676. m.emit(0xf6)
  16677. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  16678. })
  16679. }
  16680. // MULXL m32, r32, r32
  16681. if isM32(v0) && isReg32(v1) && isReg32(v2) {
  16682. self.require(ISA_BMI2)
  16683. p.domain = DomainGeneric
  16684. p.add(0, func(m *_Encoding, v []interface{}) {
  16685. m.vex3(0xc4, 0b10, 0x03, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  16686. m.emit(0xf6)
  16687. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  16688. })
  16689. }
  16690. if p.len == 0 {
  16691. panic("invalid operands for MULXL")
  16692. }
  16693. return p
  16694. }
  16695. // MULXQ performs "Unsigned Multiply Without Affecting Flags".
  16696. //
  16697. // Mnemonic : MULX
  16698. // Supported forms : (2 forms)
  16699. //
  16700. // * MULXQ r64, r64, r64 [BMI2]
  16701. // * MULXQ m64, r64, r64 [BMI2]
  16702. //
  16703. func (self *Program) MULXQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  16704. p := self.alloc("MULXQ", 3, Operands { v0, v1, v2 })
  16705. // MULXQ r64, r64, r64
  16706. if isReg64(v0) && isReg64(v1) && isReg64(v2) {
  16707. self.require(ISA_BMI2)
  16708. p.domain = DomainGeneric
  16709. p.add(0, func(m *_Encoding, v []interface{}) {
  16710. m.emit(0xc4)
  16711. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  16712. m.emit(0xfb ^ (hlcode(v[1]) << 3))
  16713. m.emit(0xf6)
  16714. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  16715. })
  16716. }
  16717. // MULXQ m64, r64, r64
  16718. if isM64(v0) && isReg64(v1) && isReg64(v2) {
  16719. self.require(ISA_BMI2)
  16720. p.domain = DomainGeneric
  16721. p.add(0, func(m *_Encoding, v []interface{}) {
  16722. m.vex3(0xc4, 0b10, 0x83, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  16723. m.emit(0xf6)
  16724. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  16725. })
  16726. }
  16727. if p.len == 0 {
  16728. panic("invalid operands for MULXQ")
  16729. }
  16730. return p
  16731. }
  16732. // MWAIT performs "Monitor Wait".
  16733. //
  16734. // Mnemonic : MWAIT
  16735. // Supported forms : (1 form)
  16736. //
  16737. // * MWAIT [MONITOR]
  16738. //
  16739. func (self *Program) MWAIT() *Instruction {
  16740. p := self.alloc("MWAIT", 0, Operands { })
  16741. // MWAIT
  16742. self.require(ISA_MONITOR)
  16743. p.domain = DomainMisc
  16744. p.add(0, func(m *_Encoding, v []interface{}) {
  16745. m.emit(0x0f)
  16746. m.emit(0x01)
  16747. m.emit(0xc9)
  16748. })
  16749. return p
  16750. }
  16751. // MWAITX performs "Monitor Wait with Timeout".
  16752. //
  16753. // Mnemonic : MWAITX
  16754. // Supported forms : (1 form)
  16755. //
  16756. // * MWAITX [MONITORX]
  16757. //
  16758. func (self *Program) MWAITX() *Instruction {
  16759. p := self.alloc("MWAITX", 0, Operands { })
  16760. // MWAITX
  16761. self.require(ISA_MONITORX)
  16762. p.domain = DomainMisc
  16763. p.add(0, func(m *_Encoding, v []interface{}) {
  16764. m.emit(0x0f)
  16765. m.emit(0x01)
  16766. m.emit(0xfb)
  16767. })
  16768. return p
  16769. }
  16770. // NEGB performs "Two's Complement Negation".
  16771. //
  16772. // Mnemonic : NEG
  16773. // Supported forms : (2 forms)
  16774. //
  16775. // * NEGB r8
  16776. // * NEGB m8
  16777. //
  16778. func (self *Program) NEGB(v0 interface{}) *Instruction {
  16779. p := self.alloc("NEGB", 1, Operands { v0 })
  16780. // NEGB r8
  16781. if isReg8(v0) {
  16782. p.domain = DomainGeneric
  16783. p.add(0, func(m *_Encoding, v []interface{}) {
  16784. m.rexo(0, v[0], isReg8REX(v[0]))
  16785. m.emit(0xf6)
  16786. m.emit(0xd8 | lcode(v[0]))
  16787. })
  16788. }
  16789. // NEGB m8
  16790. if isM8(v0) {
  16791. p.domain = DomainGeneric
  16792. p.add(0, func(m *_Encoding, v []interface{}) {
  16793. m.rexo(0, addr(v[0]), false)
  16794. m.emit(0xf6)
  16795. m.mrsd(3, addr(v[0]), 1)
  16796. })
  16797. }
  16798. if p.len == 0 {
  16799. panic("invalid operands for NEGB")
  16800. }
  16801. return p
  16802. }
  16803. // NEGL performs "Two's Complement Negation".
  16804. //
  16805. // Mnemonic : NEG
  16806. // Supported forms : (2 forms)
  16807. //
  16808. // * NEGL r32
  16809. // * NEGL m32
  16810. //
  16811. func (self *Program) NEGL(v0 interface{}) *Instruction {
  16812. p := self.alloc("NEGL", 1, Operands { v0 })
  16813. // NEGL r32
  16814. if isReg32(v0) {
  16815. p.domain = DomainGeneric
  16816. p.add(0, func(m *_Encoding, v []interface{}) {
  16817. m.rexo(0, v[0], false)
  16818. m.emit(0xf7)
  16819. m.emit(0xd8 | lcode(v[0]))
  16820. })
  16821. }
  16822. // NEGL m32
  16823. if isM32(v0) {
  16824. p.domain = DomainGeneric
  16825. p.add(0, func(m *_Encoding, v []interface{}) {
  16826. m.rexo(0, addr(v[0]), false)
  16827. m.emit(0xf7)
  16828. m.mrsd(3, addr(v[0]), 1)
  16829. })
  16830. }
  16831. if p.len == 0 {
  16832. panic("invalid operands for NEGL")
  16833. }
  16834. return p
  16835. }
  16836. // NEGQ performs "Two's Complement Negation".
  16837. //
  16838. // Mnemonic : NEG
  16839. // Supported forms : (2 forms)
  16840. //
  16841. // * NEGQ r64
  16842. // * NEGQ m64
  16843. //
  16844. func (self *Program) NEGQ(v0 interface{}) *Instruction {
  16845. p := self.alloc("NEGQ", 1, Operands { v0 })
  16846. // NEGQ r64
  16847. if isReg64(v0) {
  16848. p.domain = DomainGeneric
  16849. p.add(0, func(m *_Encoding, v []interface{}) {
  16850. m.emit(0x48 | hcode(v[0]))
  16851. m.emit(0xf7)
  16852. m.emit(0xd8 | lcode(v[0]))
  16853. })
  16854. }
  16855. // NEGQ m64
  16856. if isM64(v0) {
  16857. p.domain = DomainGeneric
  16858. p.add(0, func(m *_Encoding, v []interface{}) {
  16859. m.rexm(1, 0, addr(v[0]))
  16860. m.emit(0xf7)
  16861. m.mrsd(3, addr(v[0]), 1)
  16862. })
  16863. }
  16864. if p.len == 0 {
  16865. panic("invalid operands for NEGQ")
  16866. }
  16867. return p
  16868. }
  16869. // NEGW performs "Two's Complement Negation".
  16870. //
  16871. // Mnemonic : NEG
  16872. // Supported forms : (2 forms)
  16873. //
  16874. // * NEGW r16
  16875. // * NEGW m16
  16876. //
  16877. func (self *Program) NEGW(v0 interface{}) *Instruction {
  16878. p := self.alloc("NEGW", 1, Operands { v0 })
  16879. // NEGW r16
  16880. if isReg16(v0) {
  16881. p.domain = DomainGeneric
  16882. p.add(0, func(m *_Encoding, v []interface{}) {
  16883. m.emit(0x66)
  16884. m.rexo(0, v[0], false)
  16885. m.emit(0xf7)
  16886. m.emit(0xd8 | lcode(v[0]))
  16887. })
  16888. }
  16889. // NEGW m16
  16890. if isM16(v0) {
  16891. p.domain = DomainGeneric
  16892. p.add(0, func(m *_Encoding, v []interface{}) {
  16893. m.emit(0x66)
  16894. m.rexo(0, addr(v[0]), false)
  16895. m.emit(0xf7)
  16896. m.mrsd(3, addr(v[0]), 1)
  16897. })
  16898. }
  16899. if p.len == 0 {
  16900. panic("invalid operands for NEGW")
  16901. }
  16902. return p
  16903. }
  16904. // NOP performs "No Operation".
  16905. //
  16906. // Mnemonic : NOP
  16907. // Supported forms : (1 form)
  16908. //
  16909. // * NOP
  16910. //
  16911. func (self *Program) NOP() *Instruction {
  16912. p := self.alloc("NOP", 0, Operands { })
  16913. // NOP
  16914. p.domain = DomainGeneric
  16915. p.add(0, func(m *_Encoding, v []interface{}) {
  16916. m.emit(0x90)
  16917. })
  16918. return p
  16919. }
  16920. // NOTB performs "One's Complement Negation".
  16921. //
  16922. // Mnemonic : NOT
  16923. // Supported forms : (2 forms)
  16924. //
  16925. // * NOTB r8
  16926. // * NOTB m8
  16927. //
  16928. func (self *Program) NOTB(v0 interface{}) *Instruction {
  16929. p := self.alloc("NOTB", 1, Operands { v0 })
  16930. // NOTB r8
  16931. if isReg8(v0) {
  16932. p.domain = DomainGeneric
  16933. p.add(0, func(m *_Encoding, v []interface{}) {
  16934. m.rexo(0, v[0], isReg8REX(v[0]))
  16935. m.emit(0xf6)
  16936. m.emit(0xd0 | lcode(v[0]))
  16937. })
  16938. }
  16939. // NOTB m8
  16940. if isM8(v0) {
  16941. p.domain = DomainGeneric
  16942. p.add(0, func(m *_Encoding, v []interface{}) {
  16943. m.rexo(0, addr(v[0]), false)
  16944. m.emit(0xf6)
  16945. m.mrsd(2, addr(v[0]), 1)
  16946. })
  16947. }
  16948. if p.len == 0 {
  16949. panic("invalid operands for NOTB")
  16950. }
  16951. return p
  16952. }
  16953. // NOTL performs "One's Complement Negation".
  16954. //
  16955. // Mnemonic : NOT
  16956. // Supported forms : (2 forms)
  16957. //
  16958. // * NOTL r32
  16959. // * NOTL m32
  16960. //
  16961. func (self *Program) NOTL(v0 interface{}) *Instruction {
  16962. p := self.alloc("NOTL", 1, Operands { v0 })
  16963. // NOTL r32
  16964. if isReg32(v0) {
  16965. p.domain = DomainGeneric
  16966. p.add(0, func(m *_Encoding, v []interface{}) {
  16967. m.rexo(0, v[0], false)
  16968. m.emit(0xf7)
  16969. m.emit(0xd0 | lcode(v[0]))
  16970. })
  16971. }
  16972. // NOTL m32
  16973. if isM32(v0) {
  16974. p.domain = DomainGeneric
  16975. p.add(0, func(m *_Encoding, v []interface{}) {
  16976. m.rexo(0, addr(v[0]), false)
  16977. m.emit(0xf7)
  16978. m.mrsd(2, addr(v[0]), 1)
  16979. })
  16980. }
  16981. if p.len == 0 {
  16982. panic("invalid operands for NOTL")
  16983. }
  16984. return p
  16985. }
  16986. // NOTQ performs "One's Complement Negation".
  16987. //
  16988. // Mnemonic : NOT
  16989. // Supported forms : (2 forms)
  16990. //
  16991. // * NOTQ r64
  16992. // * NOTQ m64
  16993. //
  16994. func (self *Program) NOTQ(v0 interface{}) *Instruction {
  16995. p := self.alloc("NOTQ", 1, Operands { v0 })
  16996. // NOTQ r64
  16997. if isReg64(v0) {
  16998. p.domain = DomainGeneric
  16999. p.add(0, func(m *_Encoding, v []interface{}) {
  17000. m.emit(0x48 | hcode(v[0]))
  17001. m.emit(0xf7)
  17002. m.emit(0xd0 | lcode(v[0]))
  17003. })
  17004. }
  17005. // NOTQ m64
  17006. if isM64(v0) {
  17007. p.domain = DomainGeneric
  17008. p.add(0, func(m *_Encoding, v []interface{}) {
  17009. m.rexm(1, 0, addr(v[0]))
  17010. m.emit(0xf7)
  17011. m.mrsd(2, addr(v[0]), 1)
  17012. })
  17013. }
  17014. if p.len == 0 {
  17015. panic("invalid operands for NOTQ")
  17016. }
  17017. return p
  17018. }
  17019. // NOTW performs "One's Complement Negation".
  17020. //
  17021. // Mnemonic : NOT
  17022. // Supported forms : (2 forms)
  17023. //
  17024. // * NOTW r16
  17025. // * NOTW m16
  17026. //
  17027. func (self *Program) NOTW(v0 interface{}) *Instruction {
  17028. p := self.alloc("NOTW", 1, Operands { v0 })
  17029. // NOTW r16
  17030. if isReg16(v0) {
  17031. p.domain = DomainGeneric
  17032. p.add(0, func(m *_Encoding, v []interface{}) {
  17033. m.emit(0x66)
  17034. m.rexo(0, v[0], false)
  17035. m.emit(0xf7)
  17036. m.emit(0xd0 | lcode(v[0]))
  17037. })
  17038. }
  17039. // NOTW m16
  17040. if isM16(v0) {
  17041. p.domain = DomainGeneric
  17042. p.add(0, func(m *_Encoding, v []interface{}) {
  17043. m.emit(0x66)
  17044. m.rexo(0, addr(v[0]), false)
  17045. m.emit(0xf7)
  17046. m.mrsd(2, addr(v[0]), 1)
  17047. })
  17048. }
  17049. if p.len == 0 {
  17050. panic("invalid operands for NOTW")
  17051. }
  17052. return p
  17053. }
  17054. // ORB performs "Logical Inclusive OR".
  17055. //
  17056. // Mnemonic : OR
  17057. // Supported forms : (6 forms)
  17058. //
  17059. // * ORB imm8, al
  17060. // * ORB imm8, r8
  17061. // * ORB r8, r8
  17062. // * ORB m8, r8
  17063. // * ORB imm8, m8
  17064. // * ORB r8, m8
  17065. //
  17066. func (self *Program) ORB(v0 interface{}, v1 interface{}) *Instruction {
  17067. p := self.alloc("ORB", 2, Operands { v0, v1 })
  17068. // ORB imm8, al
  17069. if isImm8(v0) && v1 == AL {
  17070. p.domain = DomainGeneric
  17071. p.add(0, func(m *_Encoding, v []interface{}) {
  17072. m.emit(0x0c)
  17073. m.imm1(toImmAny(v[0]))
  17074. })
  17075. }
  17076. // ORB imm8, r8
  17077. if isImm8(v0) && isReg8(v1) {
  17078. p.domain = DomainGeneric
  17079. p.add(0, func(m *_Encoding, v []interface{}) {
  17080. m.rexo(0, v[1], isReg8REX(v[1]))
  17081. m.emit(0x80)
  17082. m.emit(0xc8 | lcode(v[1]))
  17083. m.imm1(toImmAny(v[0]))
  17084. })
  17085. }
  17086. // ORB r8, r8
  17087. if isReg8(v0) && isReg8(v1) {
  17088. p.domain = DomainGeneric
  17089. p.add(0, func(m *_Encoding, v []interface{}) {
  17090. m.rexo(hcode(v[0]), v[1], isReg8REX(v[0]) || isReg8REX(v[1]))
  17091. m.emit(0x08)
  17092. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  17093. })
  17094. p.add(0, func(m *_Encoding, v []interface{}) {
  17095. m.rexo(hcode(v[1]), v[0], isReg8REX(v[0]) || isReg8REX(v[1]))
  17096. m.emit(0x0a)
  17097. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  17098. })
  17099. }
  17100. // ORB m8, r8
  17101. if isM8(v0) && isReg8(v1) {
  17102. p.domain = DomainGeneric
  17103. p.add(0, func(m *_Encoding, v []interface{}) {
  17104. m.rexo(hcode(v[1]), addr(v[0]), isReg8REX(v[1]))
  17105. m.emit(0x0a)
  17106. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  17107. })
  17108. }
  17109. // ORB imm8, m8
  17110. if isImm8(v0) && isM8(v1) {
  17111. p.domain = DomainGeneric
  17112. p.add(0, func(m *_Encoding, v []interface{}) {
  17113. m.rexo(0, addr(v[1]), false)
  17114. m.emit(0x80)
  17115. m.mrsd(1, addr(v[1]), 1)
  17116. m.imm1(toImmAny(v[0]))
  17117. })
  17118. }
  17119. // ORB r8, m8
  17120. if isReg8(v0) && isM8(v1) {
  17121. p.domain = DomainGeneric
  17122. p.add(0, func(m *_Encoding, v []interface{}) {
  17123. m.rexo(hcode(v[0]), addr(v[1]), isReg8REX(v[0]))
  17124. m.emit(0x08)
  17125. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  17126. })
  17127. }
  17128. if p.len == 0 {
  17129. panic("invalid operands for ORB")
  17130. }
  17131. return p
  17132. }
  17133. // ORL performs "Logical Inclusive OR".
  17134. //
  17135. // Mnemonic : OR
  17136. // Supported forms : (8 forms)
  17137. //
  17138. // * ORL imm32, eax
  17139. // * ORL imm8, r32
  17140. // * ORL imm32, r32
  17141. // * ORL r32, r32
  17142. // * ORL m32, r32
  17143. // * ORL imm8, m32
  17144. // * ORL imm32, m32
  17145. // * ORL r32, m32
  17146. //
  17147. func (self *Program) ORL(v0 interface{}, v1 interface{}) *Instruction {
  17148. p := self.alloc("ORL", 2, Operands { v0, v1 })
  17149. // ORL imm32, eax
  17150. if isImm32(v0) && v1 == EAX {
  17151. p.domain = DomainGeneric
  17152. p.add(0, func(m *_Encoding, v []interface{}) {
  17153. m.emit(0x0d)
  17154. m.imm4(toImmAny(v[0]))
  17155. })
  17156. }
  17157. // ORL imm8, r32
  17158. if isImm8Ext(v0, 4) && isReg32(v1) {
  17159. p.domain = DomainGeneric
  17160. p.add(0, func(m *_Encoding, v []interface{}) {
  17161. m.rexo(0, v[1], false)
  17162. m.emit(0x83)
  17163. m.emit(0xc8 | lcode(v[1]))
  17164. m.imm1(toImmAny(v[0]))
  17165. })
  17166. }
  17167. // ORL imm32, r32
  17168. if isImm32(v0) && isReg32(v1) {
  17169. p.domain = DomainGeneric
  17170. p.add(0, func(m *_Encoding, v []interface{}) {
  17171. m.rexo(0, v[1], false)
  17172. m.emit(0x81)
  17173. m.emit(0xc8 | lcode(v[1]))
  17174. m.imm4(toImmAny(v[0]))
  17175. })
  17176. }
  17177. // ORL r32, r32
  17178. if isReg32(v0) && isReg32(v1) {
  17179. p.domain = DomainGeneric
  17180. p.add(0, func(m *_Encoding, v []interface{}) {
  17181. m.rexo(hcode(v[0]), v[1], false)
  17182. m.emit(0x09)
  17183. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  17184. })
  17185. p.add(0, func(m *_Encoding, v []interface{}) {
  17186. m.rexo(hcode(v[1]), v[0], false)
  17187. m.emit(0x0b)
  17188. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  17189. })
  17190. }
  17191. // ORL m32, r32
  17192. if isM32(v0) && isReg32(v1) {
  17193. p.domain = DomainGeneric
  17194. p.add(0, func(m *_Encoding, v []interface{}) {
  17195. m.rexo(hcode(v[1]), addr(v[0]), false)
  17196. m.emit(0x0b)
  17197. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  17198. })
  17199. }
  17200. // ORL imm8, m32
  17201. if isImm8Ext(v0, 4) && isM32(v1) {
  17202. p.domain = DomainGeneric
  17203. p.add(0, func(m *_Encoding, v []interface{}) {
  17204. m.rexo(0, addr(v[1]), false)
  17205. m.emit(0x83)
  17206. m.mrsd(1, addr(v[1]), 1)
  17207. m.imm1(toImmAny(v[0]))
  17208. })
  17209. }
  17210. // ORL imm32, m32
  17211. if isImm32(v0) && isM32(v1) {
  17212. p.domain = DomainGeneric
  17213. p.add(0, func(m *_Encoding, v []interface{}) {
  17214. m.rexo(0, addr(v[1]), false)
  17215. m.emit(0x81)
  17216. m.mrsd(1, addr(v[1]), 1)
  17217. m.imm4(toImmAny(v[0]))
  17218. })
  17219. }
  17220. // ORL r32, m32
  17221. if isReg32(v0) && isM32(v1) {
  17222. p.domain = DomainGeneric
  17223. p.add(0, func(m *_Encoding, v []interface{}) {
  17224. m.rexo(hcode(v[0]), addr(v[1]), false)
  17225. m.emit(0x09)
  17226. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  17227. })
  17228. }
  17229. if p.len == 0 {
  17230. panic("invalid operands for ORL")
  17231. }
  17232. return p
  17233. }
  17234. // ORPD performs "Bitwise Logical OR of Double-Precision Floating-Point Values".
  17235. //
  17236. // Mnemonic : ORPD
  17237. // Supported forms : (2 forms)
  17238. //
  17239. // * ORPD xmm, xmm [SSE2]
  17240. // * ORPD m128, xmm [SSE2]
  17241. //
  17242. func (self *Program) ORPD(v0 interface{}, v1 interface{}) *Instruction {
  17243. p := self.alloc("ORPD", 2, Operands { v0, v1 })
  17244. // ORPD xmm, xmm
  17245. if isXMM(v0) && isXMM(v1) {
  17246. self.require(ISA_SSE2)
  17247. p.domain = DomainMMXSSE
  17248. p.add(0, func(m *_Encoding, v []interface{}) {
  17249. m.emit(0x66)
  17250. m.rexo(hcode(v[1]), v[0], false)
  17251. m.emit(0x0f)
  17252. m.emit(0x56)
  17253. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  17254. })
  17255. }
  17256. // ORPD m128, xmm
  17257. if isM128(v0) && isXMM(v1) {
  17258. self.require(ISA_SSE2)
  17259. p.domain = DomainMMXSSE
  17260. p.add(0, func(m *_Encoding, v []interface{}) {
  17261. m.emit(0x66)
  17262. m.rexo(hcode(v[1]), addr(v[0]), false)
  17263. m.emit(0x0f)
  17264. m.emit(0x56)
  17265. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  17266. })
  17267. }
  17268. if p.len == 0 {
  17269. panic("invalid operands for ORPD")
  17270. }
  17271. return p
  17272. }
  17273. // ORPS performs "Bitwise Logical OR of Single-Precision Floating-Point Values".
  17274. //
  17275. // Mnemonic : ORPS
  17276. // Supported forms : (2 forms)
  17277. //
  17278. // * ORPS xmm, xmm [SSE]
  17279. // * ORPS m128, xmm [SSE]
  17280. //
  17281. func (self *Program) ORPS(v0 interface{}, v1 interface{}) *Instruction {
  17282. p := self.alloc("ORPS", 2, Operands { v0, v1 })
  17283. // ORPS xmm, xmm
  17284. if isXMM(v0) && isXMM(v1) {
  17285. self.require(ISA_SSE)
  17286. p.domain = DomainMMXSSE
  17287. p.add(0, func(m *_Encoding, v []interface{}) {
  17288. m.rexo(hcode(v[1]), v[0], false)
  17289. m.emit(0x0f)
  17290. m.emit(0x56)
  17291. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  17292. })
  17293. }
  17294. // ORPS m128, xmm
  17295. if isM128(v0) && isXMM(v1) {
  17296. self.require(ISA_SSE)
  17297. p.domain = DomainMMXSSE
  17298. p.add(0, func(m *_Encoding, v []interface{}) {
  17299. m.rexo(hcode(v[1]), addr(v[0]), false)
  17300. m.emit(0x0f)
  17301. m.emit(0x56)
  17302. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  17303. })
  17304. }
  17305. if p.len == 0 {
  17306. panic("invalid operands for ORPS")
  17307. }
  17308. return p
  17309. }
  17310. // ORQ performs "Logical Inclusive OR".
  17311. //
  17312. // Mnemonic : OR
  17313. // Supported forms : (8 forms)
  17314. //
  17315. // * ORQ imm32, rax
  17316. // * ORQ imm8, r64
  17317. // * ORQ imm32, r64
  17318. // * ORQ r64, r64
  17319. // * ORQ m64, r64
  17320. // * ORQ imm8, m64
  17321. // * ORQ imm32, m64
  17322. // * ORQ r64, m64
  17323. //
  17324. func (self *Program) ORQ(v0 interface{}, v1 interface{}) *Instruction {
  17325. p := self.alloc("ORQ", 2, Operands { v0, v1 })
  17326. // ORQ imm32, rax
  17327. if isImm32(v0) && v1 == RAX {
  17328. p.domain = DomainGeneric
  17329. p.add(0, func(m *_Encoding, v []interface{}) {
  17330. m.emit(0x48)
  17331. m.emit(0x0d)
  17332. m.imm4(toImmAny(v[0]))
  17333. })
  17334. }
  17335. // ORQ imm8, r64
  17336. if isImm8Ext(v0, 8) && isReg64(v1) {
  17337. p.domain = DomainGeneric
  17338. p.add(0, func(m *_Encoding, v []interface{}) {
  17339. m.emit(0x48 | hcode(v[1]))
  17340. m.emit(0x83)
  17341. m.emit(0xc8 | lcode(v[1]))
  17342. m.imm1(toImmAny(v[0]))
  17343. })
  17344. }
  17345. // ORQ imm32, r64
  17346. if isImm32Ext(v0, 8) && isReg64(v1) {
  17347. p.domain = DomainGeneric
  17348. p.add(0, func(m *_Encoding, v []interface{}) {
  17349. m.emit(0x48 | hcode(v[1]))
  17350. m.emit(0x81)
  17351. m.emit(0xc8 | lcode(v[1]))
  17352. m.imm4(toImmAny(v[0]))
  17353. })
  17354. }
  17355. // ORQ r64, r64
  17356. if isReg64(v0) && isReg64(v1) {
  17357. p.domain = DomainGeneric
  17358. p.add(0, func(m *_Encoding, v []interface{}) {
  17359. m.emit(0x48 | hcode(v[0]) << 2 | hcode(v[1]))
  17360. m.emit(0x09)
  17361. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  17362. })
  17363. p.add(0, func(m *_Encoding, v []interface{}) {
  17364. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  17365. m.emit(0x0b)
  17366. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  17367. })
  17368. }
  17369. // ORQ m64, r64
  17370. if isM64(v0) && isReg64(v1) {
  17371. p.domain = DomainGeneric
  17372. p.add(0, func(m *_Encoding, v []interface{}) {
  17373. m.rexm(1, hcode(v[1]), addr(v[0]))
  17374. m.emit(0x0b)
  17375. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  17376. })
  17377. }
  17378. // ORQ imm8, m64
  17379. if isImm8Ext(v0, 8) && isM64(v1) {
  17380. p.domain = DomainGeneric
  17381. p.add(0, func(m *_Encoding, v []interface{}) {
  17382. m.rexm(1, 0, addr(v[1]))
  17383. m.emit(0x83)
  17384. m.mrsd(1, addr(v[1]), 1)
  17385. m.imm1(toImmAny(v[0]))
  17386. })
  17387. }
  17388. // ORQ imm32, m64
  17389. if isImm32Ext(v0, 8) && isM64(v1) {
  17390. p.domain = DomainGeneric
  17391. p.add(0, func(m *_Encoding, v []interface{}) {
  17392. m.rexm(1, 0, addr(v[1]))
  17393. m.emit(0x81)
  17394. m.mrsd(1, addr(v[1]), 1)
  17395. m.imm4(toImmAny(v[0]))
  17396. })
  17397. }
  17398. // ORQ r64, m64
  17399. if isReg64(v0) && isM64(v1) {
  17400. p.domain = DomainGeneric
  17401. p.add(0, func(m *_Encoding, v []interface{}) {
  17402. m.rexm(1, hcode(v[0]), addr(v[1]))
  17403. m.emit(0x09)
  17404. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  17405. })
  17406. }
  17407. if p.len == 0 {
  17408. panic("invalid operands for ORQ")
  17409. }
  17410. return p
  17411. }
  17412. // ORW performs "Logical Inclusive OR".
  17413. //
  17414. // Mnemonic : OR
  17415. // Supported forms : (8 forms)
  17416. //
  17417. // * ORW imm16, ax
  17418. // * ORW imm8, r16
  17419. // * ORW imm16, r16
  17420. // * ORW r16, r16
  17421. // * ORW m16, r16
  17422. // * ORW imm8, m16
  17423. // * ORW imm16, m16
  17424. // * ORW r16, m16
  17425. //
  17426. func (self *Program) ORW(v0 interface{}, v1 interface{}) *Instruction {
  17427. p := self.alloc("ORW", 2, Operands { v0, v1 })
  17428. // ORW imm16, ax
  17429. if isImm16(v0) && v1 == AX {
  17430. p.domain = DomainGeneric
  17431. p.add(0, func(m *_Encoding, v []interface{}) {
  17432. m.emit(0x66)
  17433. m.emit(0x0d)
  17434. m.imm2(toImmAny(v[0]))
  17435. })
  17436. }
  17437. // ORW imm8, r16
  17438. if isImm8Ext(v0, 2) && isReg16(v1) {
  17439. p.domain = DomainGeneric
  17440. p.add(0, func(m *_Encoding, v []interface{}) {
  17441. m.emit(0x66)
  17442. m.rexo(0, v[1], false)
  17443. m.emit(0x83)
  17444. m.emit(0xc8 | lcode(v[1]))
  17445. m.imm1(toImmAny(v[0]))
  17446. })
  17447. }
  17448. // ORW imm16, r16
  17449. if isImm16(v0) && isReg16(v1) {
  17450. p.domain = DomainGeneric
  17451. p.add(0, func(m *_Encoding, v []interface{}) {
  17452. m.emit(0x66)
  17453. m.rexo(0, v[1], false)
  17454. m.emit(0x81)
  17455. m.emit(0xc8 | lcode(v[1]))
  17456. m.imm2(toImmAny(v[0]))
  17457. })
  17458. }
  17459. // ORW r16, r16
  17460. if isReg16(v0) && isReg16(v1) {
  17461. p.domain = DomainGeneric
  17462. p.add(0, func(m *_Encoding, v []interface{}) {
  17463. m.emit(0x66)
  17464. m.rexo(hcode(v[0]), v[1], false)
  17465. m.emit(0x09)
  17466. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  17467. })
  17468. p.add(0, func(m *_Encoding, v []interface{}) {
  17469. m.emit(0x66)
  17470. m.rexo(hcode(v[1]), v[0], false)
  17471. m.emit(0x0b)
  17472. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  17473. })
  17474. }
  17475. // ORW m16, r16
  17476. if isM16(v0) && isReg16(v1) {
  17477. p.domain = DomainGeneric
  17478. p.add(0, func(m *_Encoding, v []interface{}) {
  17479. m.emit(0x66)
  17480. m.rexo(hcode(v[1]), addr(v[0]), false)
  17481. m.emit(0x0b)
  17482. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  17483. })
  17484. }
  17485. // ORW imm8, m16
  17486. if isImm8Ext(v0, 2) && isM16(v1) {
  17487. p.domain = DomainGeneric
  17488. p.add(0, func(m *_Encoding, v []interface{}) {
  17489. m.emit(0x66)
  17490. m.rexo(0, addr(v[1]), false)
  17491. m.emit(0x83)
  17492. m.mrsd(1, addr(v[1]), 1)
  17493. m.imm1(toImmAny(v[0]))
  17494. })
  17495. }
  17496. // ORW imm16, m16
  17497. if isImm16(v0) && isM16(v1) {
  17498. p.domain = DomainGeneric
  17499. p.add(0, func(m *_Encoding, v []interface{}) {
  17500. m.emit(0x66)
  17501. m.rexo(0, addr(v[1]), false)
  17502. m.emit(0x81)
  17503. m.mrsd(1, addr(v[1]), 1)
  17504. m.imm2(toImmAny(v[0]))
  17505. })
  17506. }
  17507. // ORW r16, m16
  17508. if isReg16(v0) && isM16(v1) {
  17509. p.domain = DomainGeneric
  17510. p.add(0, func(m *_Encoding, v []interface{}) {
  17511. m.emit(0x66)
  17512. m.rexo(hcode(v[0]), addr(v[1]), false)
  17513. m.emit(0x09)
  17514. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  17515. })
  17516. }
  17517. if p.len == 0 {
  17518. panic("invalid operands for ORW")
  17519. }
  17520. return p
  17521. }
  17522. // PABSB performs "Packed Absolute Value of Byte Integers".
  17523. //
  17524. // Mnemonic : PABSB
  17525. // Supported forms : (4 forms)
  17526. //
  17527. // * PABSB mm, mm [SSSE3]
  17528. // * PABSB m64, mm [SSSE3]
  17529. // * PABSB xmm, xmm [SSSE3]
  17530. // * PABSB m128, xmm [SSSE3]
  17531. //
  17532. func (self *Program) PABSB(v0 interface{}, v1 interface{}) *Instruction {
  17533. p := self.alloc("PABSB", 2, Operands { v0, v1 })
  17534. // PABSB mm, mm
  17535. if isMM(v0) && isMM(v1) {
  17536. self.require(ISA_SSSE3)
  17537. p.domain = DomainMMXSSE
  17538. p.add(0, func(m *_Encoding, v []interface{}) {
  17539. m.rexo(hcode(v[1]), v[0], false)
  17540. m.emit(0x0f)
  17541. m.emit(0x38)
  17542. m.emit(0x1c)
  17543. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  17544. })
  17545. }
  17546. // PABSB m64, mm
  17547. if isM64(v0) && isMM(v1) {
  17548. self.require(ISA_SSSE3)
  17549. p.domain = DomainMMXSSE
  17550. p.add(0, func(m *_Encoding, v []interface{}) {
  17551. m.rexo(hcode(v[1]), addr(v[0]), false)
  17552. m.emit(0x0f)
  17553. m.emit(0x38)
  17554. m.emit(0x1c)
  17555. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  17556. })
  17557. }
  17558. // PABSB xmm, xmm
  17559. if isXMM(v0) && isXMM(v1) {
  17560. self.require(ISA_SSSE3)
  17561. p.domain = DomainMMXSSE
  17562. p.add(0, func(m *_Encoding, v []interface{}) {
  17563. m.emit(0x66)
  17564. m.rexo(hcode(v[1]), v[0], false)
  17565. m.emit(0x0f)
  17566. m.emit(0x38)
  17567. m.emit(0x1c)
  17568. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  17569. })
  17570. }
  17571. // PABSB m128, xmm
  17572. if isM128(v0) && isXMM(v1) {
  17573. self.require(ISA_SSSE3)
  17574. p.domain = DomainMMXSSE
  17575. p.add(0, func(m *_Encoding, v []interface{}) {
  17576. m.emit(0x66)
  17577. m.rexo(hcode(v[1]), addr(v[0]), false)
  17578. m.emit(0x0f)
  17579. m.emit(0x38)
  17580. m.emit(0x1c)
  17581. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  17582. })
  17583. }
  17584. if p.len == 0 {
  17585. panic("invalid operands for PABSB")
  17586. }
  17587. return p
  17588. }
  17589. // PABSD performs "Packed Absolute Value of Doubleword Integers".
  17590. //
  17591. // Mnemonic : PABSD
  17592. // Supported forms : (4 forms)
  17593. //
  17594. // * PABSD mm, mm [SSSE3]
  17595. // * PABSD m64, mm [SSSE3]
  17596. // * PABSD xmm, xmm [SSSE3]
  17597. // * PABSD m128, xmm [SSSE3]
  17598. //
  17599. func (self *Program) PABSD(v0 interface{}, v1 interface{}) *Instruction {
  17600. p := self.alloc("PABSD", 2, Operands { v0, v1 })
  17601. // PABSD mm, mm
  17602. if isMM(v0) && isMM(v1) {
  17603. self.require(ISA_SSSE3)
  17604. p.domain = DomainMMXSSE
  17605. p.add(0, func(m *_Encoding, v []interface{}) {
  17606. m.rexo(hcode(v[1]), v[0], false)
  17607. m.emit(0x0f)
  17608. m.emit(0x38)
  17609. m.emit(0x1e)
  17610. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  17611. })
  17612. }
  17613. // PABSD m64, mm
  17614. if isM64(v0) && isMM(v1) {
  17615. self.require(ISA_SSSE3)
  17616. p.domain = DomainMMXSSE
  17617. p.add(0, func(m *_Encoding, v []interface{}) {
  17618. m.rexo(hcode(v[1]), addr(v[0]), false)
  17619. m.emit(0x0f)
  17620. m.emit(0x38)
  17621. m.emit(0x1e)
  17622. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  17623. })
  17624. }
  17625. // PABSD xmm, xmm
  17626. if isXMM(v0) && isXMM(v1) {
  17627. self.require(ISA_SSSE3)
  17628. p.domain = DomainMMXSSE
  17629. p.add(0, func(m *_Encoding, v []interface{}) {
  17630. m.emit(0x66)
  17631. m.rexo(hcode(v[1]), v[0], false)
  17632. m.emit(0x0f)
  17633. m.emit(0x38)
  17634. m.emit(0x1e)
  17635. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  17636. })
  17637. }
  17638. // PABSD m128, xmm
  17639. if isM128(v0) && isXMM(v1) {
  17640. self.require(ISA_SSSE3)
  17641. p.domain = DomainMMXSSE
  17642. p.add(0, func(m *_Encoding, v []interface{}) {
  17643. m.emit(0x66)
  17644. m.rexo(hcode(v[1]), addr(v[0]), false)
  17645. m.emit(0x0f)
  17646. m.emit(0x38)
  17647. m.emit(0x1e)
  17648. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  17649. })
  17650. }
  17651. if p.len == 0 {
  17652. panic("invalid operands for PABSD")
  17653. }
  17654. return p
  17655. }
  17656. // PABSW performs "Packed Absolute Value of Word Integers".
  17657. //
  17658. // Mnemonic : PABSW
  17659. // Supported forms : (4 forms)
  17660. //
  17661. // * PABSW mm, mm [SSSE3]
  17662. // * PABSW m64, mm [SSSE3]
  17663. // * PABSW xmm, xmm [SSSE3]
  17664. // * PABSW m128, xmm [SSSE3]
  17665. //
  17666. func (self *Program) PABSW(v0 interface{}, v1 interface{}) *Instruction {
  17667. p := self.alloc("PABSW", 2, Operands { v0, v1 })
  17668. // PABSW mm, mm
  17669. if isMM(v0) && isMM(v1) {
  17670. self.require(ISA_SSSE3)
  17671. p.domain = DomainMMXSSE
  17672. p.add(0, func(m *_Encoding, v []interface{}) {
  17673. m.rexo(hcode(v[1]), v[0], false)
  17674. m.emit(0x0f)
  17675. m.emit(0x38)
  17676. m.emit(0x1d)
  17677. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  17678. })
  17679. }
  17680. // PABSW m64, mm
  17681. if isM64(v0) && isMM(v1) {
  17682. self.require(ISA_SSSE3)
  17683. p.domain = DomainMMXSSE
  17684. p.add(0, func(m *_Encoding, v []interface{}) {
  17685. m.rexo(hcode(v[1]), addr(v[0]), false)
  17686. m.emit(0x0f)
  17687. m.emit(0x38)
  17688. m.emit(0x1d)
  17689. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  17690. })
  17691. }
  17692. // PABSW xmm, xmm
  17693. if isXMM(v0) && isXMM(v1) {
  17694. self.require(ISA_SSSE3)
  17695. p.domain = DomainMMXSSE
  17696. p.add(0, func(m *_Encoding, v []interface{}) {
  17697. m.emit(0x66)
  17698. m.rexo(hcode(v[1]), v[0], false)
  17699. m.emit(0x0f)
  17700. m.emit(0x38)
  17701. m.emit(0x1d)
  17702. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  17703. })
  17704. }
  17705. // PABSW m128, xmm
  17706. if isM128(v0) && isXMM(v1) {
  17707. self.require(ISA_SSSE3)
  17708. p.domain = DomainMMXSSE
  17709. p.add(0, func(m *_Encoding, v []interface{}) {
  17710. m.emit(0x66)
  17711. m.rexo(hcode(v[1]), addr(v[0]), false)
  17712. m.emit(0x0f)
  17713. m.emit(0x38)
  17714. m.emit(0x1d)
  17715. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  17716. })
  17717. }
  17718. if p.len == 0 {
  17719. panic("invalid operands for PABSW")
  17720. }
  17721. return p
  17722. }
  17723. // PACKSSDW performs "Pack Doublewords into Words with Signed Saturation".
  17724. //
  17725. // Mnemonic : PACKSSDW
  17726. // Supported forms : (4 forms)
  17727. //
  17728. // * PACKSSDW mm, mm [MMX]
  17729. // * PACKSSDW m64, mm [MMX]
  17730. // * PACKSSDW xmm, xmm [SSE2]
  17731. // * PACKSSDW m128, xmm [SSE2]
  17732. //
  17733. func (self *Program) PACKSSDW(v0 interface{}, v1 interface{}) *Instruction {
  17734. p := self.alloc("PACKSSDW", 2, Operands { v0, v1 })
  17735. // PACKSSDW mm, mm
  17736. if isMM(v0) && isMM(v1) {
  17737. self.require(ISA_MMX)
  17738. p.domain = DomainMMXSSE
  17739. p.add(0, func(m *_Encoding, v []interface{}) {
  17740. m.rexo(hcode(v[1]), v[0], false)
  17741. m.emit(0x0f)
  17742. m.emit(0x6b)
  17743. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  17744. })
  17745. }
  17746. // PACKSSDW m64, mm
  17747. if isM64(v0) && isMM(v1) {
  17748. self.require(ISA_MMX)
  17749. p.domain = DomainMMXSSE
  17750. p.add(0, func(m *_Encoding, v []interface{}) {
  17751. m.rexo(hcode(v[1]), addr(v[0]), false)
  17752. m.emit(0x0f)
  17753. m.emit(0x6b)
  17754. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  17755. })
  17756. }
  17757. // PACKSSDW xmm, xmm
  17758. if isXMM(v0) && isXMM(v1) {
  17759. self.require(ISA_SSE2)
  17760. p.domain = DomainMMXSSE
  17761. p.add(0, func(m *_Encoding, v []interface{}) {
  17762. m.emit(0x66)
  17763. m.rexo(hcode(v[1]), v[0], false)
  17764. m.emit(0x0f)
  17765. m.emit(0x6b)
  17766. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  17767. })
  17768. }
  17769. // PACKSSDW m128, xmm
  17770. if isM128(v0) && isXMM(v1) {
  17771. self.require(ISA_SSE2)
  17772. p.domain = DomainMMXSSE
  17773. p.add(0, func(m *_Encoding, v []interface{}) {
  17774. m.emit(0x66)
  17775. m.rexo(hcode(v[1]), addr(v[0]), false)
  17776. m.emit(0x0f)
  17777. m.emit(0x6b)
  17778. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  17779. })
  17780. }
  17781. if p.len == 0 {
  17782. panic("invalid operands for PACKSSDW")
  17783. }
  17784. return p
  17785. }
  17786. // PACKSSWB performs "Pack Words into Bytes with Signed Saturation".
  17787. //
  17788. // Mnemonic : PACKSSWB
  17789. // Supported forms : (4 forms)
  17790. //
  17791. // * PACKSSWB mm, mm [MMX]
  17792. // * PACKSSWB m64, mm [MMX]
  17793. // * PACKSSWB xmm, xmm [SSE2]
  17794. // * PACKSSWB m128, xmm [SSE2]
  17795. //
  17796. func (self *Program) PACKSSWB(v0 interface{}, v1 interface{}) *Instruction {
  17797. p := self.alloc("PACKSSWB", 2, Operands { v0, v1 })
  17798. // PACKSSWB mm, mm
  17799. if isMM(v0) && isMM(v1) {
  17800. self.require(ISA_MMX)
  17801. p.domain = DomainMMXSSE
  17802. p.add(0, func(m *_Encoding, v []interface{}) {
  17803. m.rexo(hcode(v[1]), v[0], false)
  17804. m.emit(0x0f)
  17805. m.emit(0x63)
  17806. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  17807. })
  17808. }
  17809. // PACKSSWB m64, mm
  17810. if isM64(v0) && isMM(v1) {
  17811. self.require(ISA_MMX)
  17812. p.domain = DomainMMXSSE
  17813. p.add(0, func(m *_Encoding, v []interface{}) {
  17814. m.rexo(hcode(v[1]), addr(v[0]), false)
  17815. m.emit(0x0f)
  17816. m.emit(0x63)
  17817. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  17818. })
  17819. }
  17820. // PACKSSWB xmm, xmm
  17821. if isXMM(v0) && isXMM(v1) {
  17822. self.require(ISA_SSE2)
  17823. p.domain = DomainMMXSSE
  17824. p.add(0, func(m *_Encoding, v []interface{}) {
  17825. m.emit(0x66)
  17826. m.rexo(hcode(v[1]), v[0], false)
  17827. m.emit(0x0f)
  17828. m.emit(0x63)
  17829. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  17830. })
  17831. }
  17832. // PACKSSWB m128, xmm
  17833. if isM128(v0) && isXMM(v1) {
  17834. self.require(ISA_SSE2)
  17835. p.domain = DomainMMXSSE
  17836. p.add(0, func(m *_Encoding, v []interface{}) {
  17837. m.emit(0x66)
  17838. m.rexo(hcode(v[1]), addr(v[0]), false)
  17839. m.emit(0x0f)
  17840. m.emit(0x63)
  17841. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  17842. })
  17843. }
  17844. if p.len == 0 {
  17845. panic("invalid operands for PACKSSWB")
  17846. }
  17847. return p
  17848. }
  17849. // PACKUSDW performs "Pack Doublewords into Words with Unsigned Saturation".
  17850. //
  17851. // Mnemonic : PACKUSDW
  17852. // Supported forms : (2 forms)
  17853. //
  17854. // * PACKUSDW xmm, xmm [SSE4.1]
  17855. // * PACKUSDW m128, xmm [SSE4.1]
  17856. //
  17857. func (self *Program) PACKUSDW(v0 interface{}, v1 interface{}) *Instruction {
  17858. p := self.alloc("PACKUSDW", 2, Operands { v0, v1 })
  17859. // PACKUSDW xmm, xmm
  17860. if isXMM(v0) && isXMM(v1) {
  17861. self.require(ISA_SSE4_1)
  17862. p.domain = DomainMMXSSE
  17863. p.add(0, func(m *_Encoding, v []interface{}) {
  17864. m.emit(0x66)
  17865. m.rexo(hcode(v[1]), v[0], false)
  17866. m.emit(0x0f)
  17867. m.emit(0x38)
  17868. m.emit(0x2b)
  17869. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  17870. })
  17871. }
  17872. // PACKUSDW m128, xmm
  17873. if isM128(v0) && isXMM(v1) {
  17874. self.require(ISA_SSE4_1)
  17875. p.domain = DomainMMXSSE
  17876. p.add(0, func(m *_Encoding, v []interface{}) {
  17877. m.emit(0x66)
  17878. m.rexo(hcode(v[1]), addr(v[0]), false)
  17879. m.emit(0x0f)
  17880. m.emit(0x38)
  17881. m.emit(0x2b)
  17882. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  17883. })
  17884. }
  17885. if p.len == 0 {
  17886. panic("invalid operands for PACKUSDW")
  17887. }
  17888. return p
  17889. }
  17890. // PACKUSWB performs "Pack Words into Bytes with Unsigned Saturation".
  17891. //
  17892. // Mnemonic : PACKUSWB
  17893. // Supported forms : (4 forms)
  17894. //
  17895. // * PACKUSWB mm, mm [MMX]
  17896. // * PACKUSWB m64, mm [MMX]
  17897. // * PACKUSWB xmm, xmm [SSE2]
  17898. // * PACKUSWB m128, xmm [SSE2]
  17899. //
  17900. func (self *Program) PACKUSWB(v0 interface{}, v1 interface{}) *Instruction {
  17901. p := self.alloc("PACKUSWB", 2, Operands { v0, v1 })
  17902. // PACKUSWB mm, mm
  17903. if isMM(v0) && isMM(v1) {
  17904. self.require(ISA_MMX)
  17905. p.domain = DomainMMXSSE
  17906. p.add(0, func(m *_Encoding, v []interface{}) {
  17907. m.rexo(hcode(v[1]), v[0], false)
  17908. m.emit(0x0f)
  17909. m.emit(0x67)
  17910. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  17911. })
  17912. }
  17913. // PACKUSWB m64, mm
  17914. if isM64(v0) && isMM(v1) {
  17915. self.require(ISA_MMX)
  17916. p.domain = DomainMMXSSE
  17917. p.add(0, func(m *_Encoding, v []interface{}) {
  17918. m.rexo(hcode(v[1]), addr(v[0]), false)
  17919. m.emit(0x0f)
  17920. m.emit(0x67)
  17921. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  17922. })
  17923. }
  17924. // PACKUSWB xmm, xmm
  17925. if isXMM(v0) && isXMM(v1) {
  17926. self.require(ISA_SSE2)
  17927. p.domain = DomainMMXSSE
  17928. p.add(0, func(m *_Encoding, v []interface{}) {
  17929. m.emit(0x66)
  17930. m.rexo(hcode(v[1]), v[0], false)
  17931. m.emit(0x0f)
  17932. m.emit(0x67)
  17933. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  17934. })
  17935. }
  17936. // PACKUSWB m128, xmm
  17937. if isM128(v0) && isXMM(v1) {
  17938. self.require(ISA_SSE2)
  17939. p.domain = DomainMMXSSE
  17940. p.add(0, func(m *_Encoding, v []interface{}) {
  17941. m.emit(0x66)
  17942. m.rexo(hcode(v[1]), addr(v[0]), false)
  17943. m.emit(0x0f)
  17944. m.emit(0x67)
  17945. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  17946. })
  17947. }
  17948. if p.len == 0 {
  17949. panic("invalid operands for PACKUSWB")
  17950. }
  17951. return p
  17952. }
  17953. // PADDB performs "Add Packed Byte Integers".
  17954. //
  17955. // Mnemonic : PADDB
  17956. // Supported forms : (4 forms)
  17957. //
  17958. // * PADDB mm, mm [MMX]
  17959. // * PADDB m64, mm [MMX]
  17960. // * PADDB xmm, xmm [SSE2]
  17961. // * PADDB m128, xmm [SSE2]
  17962. //
  17963. func (self *Program) PADDB(v0 interface{}, v1 interface{}) *Instruction {
  17964. p := self.alloc("PADDB", 2, Operands { v0, v1 })
  17965. // PADDB mm, mm
  17966. if isMM(v0) && isMM(v1) {
  17967. self.require(ISA_MMX)
  17968. p.domain = DomainMMXSSE
  17969. p.add(0, func(m *_Encoding, v []interface{}) {
  17970. m.rexo(hcode(v[1]), v[0], false)
  17971. m.emit(0x0f)
  17972. m.emit(0xfc)
  17973. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  17974. })
  17975. }
  17976. // PADDB m64, mm
  17977. if isM64(v0) && isMM(v1) {
  17978. self.require(ISA_MMX)
  17979. p.domain = DomainMMXSSE
  17980. p.add(0, func(m *_Encoding, v []interface{}) {
  17981. m.rexo(hcode(v[1]), addr(v[0]), false)
  17982. m.emit(0x0f)
  17983. m.emit(0xfc)
  17984. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  17985. })
  17986. }
  17987. // PADDB xmm, xmm
  17988. if isXMM(v0) && isXMM(v1) {
  17989. self.require(ISA_SSE2)
  17990. p.domain = DomainMMXSSE
  17991. p.add(0, func(m *_Encoding, v []interface{}) {
  17992. m.emit(0x66)
  17993. m.rexo(hcode(v[1]), v[0], false)
  17994. m.emit(0x0f)
  17995. m.emit(0xfc)
  17996. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  17997. })
  17998. }
  17999. // PADDB m128, xmm
  18000. if isM128(v0) && isXMM(v1) {
  18001. self.require(ISA_SSE2)
  18002. p.domain = DomainMMXSSE
  18003. p.add(0, func(m *_Encoding, v []interface{}) {
  18004. m.emit(0x66)
  18005. m.rexo(hcode(v[1]), addr(v[0]), false)
  18006. m.emit(0x0f)
  18007. m.emit(0xfc)
  18008. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18009. })
  18010. }
  18011. if p.len == 0 {
  18012. panic("invalid operands for PADDB")
  18013. }
  18014. return p
  18015. }
  18016. // PADDD performs "Add Packed Doubleword Integers".
  18017. //
  18018. // Mnemonic : PADDD
  18019. // Supported forms : (4 forms)
  18020. //
  18021. // * PADDD mm, mm [MMX]
  18022. // * PADDD m64, mm [MMX]
  18023. // * PADDD xmm, xmm [SSE2]
  18024. // * PADDD m128, xmm [SSE2]
  18025. //
  18026. func (self *Program) PADDD(v0 interface{}, v1 interface{}) *Instruction {
  18027. p := self.alloc("PADDD", 2, Operands { v0, v1 })
  18028. // PADDD mm, mm
  18029. if isMM(v0) && isMM(v1) {
  18030. self.require(ISA_MMX)
  18031. p.domain = DomainMMXSSE
  18032. p.add(0, func(m *_Encoding, v []interface{}) {
  18033. m.rexo(hcode(v[1]), v[0], false)
  18034. m.emit(0x0f)
  18035. m.emit(0xfe)
  18036. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18037. })
  18038. }
  18039. // PADDD m64, mm
  18040. if isM64(v0) && isMM(v1) {
  18041. self.require(ISA_MMX)
  18042. p.domain = DomainMMXSSE
  18043. p.add(0, func(m *_Encoding, v []interface{}) {
  18044. m.rexo(hcode(v[1]), addr(v[0]), false)
  18045. m.emit(0x0f)
  18046. m.emit(0xfe)
  18047. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18048. })
  18049. }
  18050. // PADDD xmm, xmm
  18051. if isXMM(v0) && isXMM(v1) {
  18052. self.require(ISA_SSE2)
  18053. p.domain = DomainMMXSSE
  18054. p.add(0, func(m *_Encoding, v []interface{}) {
  18055. m.emit(0x66)
  18056. m.rexo(hcode(v[1]), v[0], false)
  18057. m.emit(0x0f)
  18058. m.emit(0xfe)
  18059. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18060. })
  18061. }
  18062. // PADDD m128, xmm
  18063. if isM128(v0) && isXMM(v1) {
  18064. self.require(ISA_SSE2)
  18065. p.domain = DomainMMXSSE
  18066. p.add(0, func(m *_Encoding, v []interface{}) {
  18067. m.emit(0x66)
  18068. m.rexo(hcode(v[1]), addr(v[0]), false)
  18069. m.emit(0x0f)
  18070. m.emit(0xfe)
  18071. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18072. })
  18073. }
  18074. if p.len == 0 {
  18075. panic("invalid operands for PADDD")
  18076. }
  18077. return p
  18078. }
  18079. // PADDQ performs "Add Packed Quadword Integers".
  18080. //
  18081. // Mnemonic : PADDQ
  18082. // Supported forms : (4 forms)
  18083. //
  18084. // * PADDQ mm, mm [SSE2]
  18085. // * PADDQ m64, mm [SSE2]
  18086. // * PADDQ xmm, xmm [SSE2]
  18087. // * PADDQ m128, xmm [SSE2]
  18088. //
  18089. func (self *Program) PADDQ(v0 interface{}, v1 interface{}) *Instruction {
  18090. p := self.alloc("PADDQ", 2, Operands { v0, v1 })
  18091. // PADDQ mm, mm
  18092. if isMM(v0) && isMM(v1) {
  18093. self.require(ISA_SSE2)
  18094. p.domain = DomainMMXSSE
  18095. p.add(0, func(m *_Encoding, v []interface{}) {
  18096. m.rexo(hcode(v[1]), v[0], false)
  18097. m.emit(0x0f)
  18098. m.emit(0xd4)
  18099. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18100. })
  18101. }
  18102. // PADDQ m64, mm
  18103. if isM64(v0) && isMM(v1) {
  18104. self.require(ISA_SSE2)
  18105. p.domain = DomainMMXSSE
  18106. p.add(0, func(m *_Encoding, v []interface{}) {
  18107. m.rexo(hcode(v[1]), addr(v[0]), false)
  18108. m.emit(0x0f)
  18109. m.emit(0xd4)
  18110. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18111. })
  18112. }
  18113. // PADDQ xmm, xmm
  18114. if isXMM(v0) && isXMM(v1) {
  18115. self.require(ISA_SSE2)
  18116. p.domain = DomainMMXSSE
  18117. p.add(0, func(m *_Encoding, v []interface{}) {
  18118. m.emit(0x66)
  18119. m.rexo(hcode(v[1]), v[0], false)
  18120. m.emit(0x0f)
  18121. m.emit(0xd4)
  18122. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18123. })
  18124. }
  18125. // PADDQ m128, xmm
  18126. if isM128(v0) && isXMM(v1) {
  18127. self.require(ISA_SSE2)
  18128. p.domain = DomainMMXSSE
  18129. p.add(0, func(m *_Encoding, v []interface{}) {
  18130. m.emit(0x66)
  18131. m.rexo(hcode(v[1]), addr(v[0]), false)
  18132. m.emit(0x0f)
  18133. m.emit(0xd4)
  18134. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18135. })
  18136. }
  18137. if p.len == 0 {
  18138. panic("invalid operands for PADDQ")
  18139. }
  18140. return p
  18141. }
  18142. // PADDSB performs "Add Packed Signed Byte Integers with Signed Saturation".
  18143. //
  18144. // Mnemonic : PADDSB
  18145. // Supported forms : (4 forms)
  18146. //
  18147. // * PADDSB mm, mm [MMX]
  18148. // * PADDSB m64, mm [MMX]
  18149. // * PADDSB xmm, xmm [SSE2]
  18150. // * PADDSB m128, xmm [SSE2]
  18151. //
  18152. func (self *Program) PADDSB(v0 interface{}, v1 interface{}) *Instruction {
  18153. p := self.alloc("PADDSB", 2, Operands { v0, v1 })
  18154. // PADDSB mm, mm
  18155. if isMM(v0) && isMM(v1) {
  18156. self.require(ISA_MMX)
  18157. p.domain = DomainMMXSSE
  18158. p.add(0, func(m *_Encoding, v []interface{}) {
  18159. m.rexo(hcode(v[1]), v[0], false)
  18160. m.emit(0x0f)
  18161. m.emit(0xec)
  18162. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18163. })
  18164. }
  18165. // PADDSB m64, mm
  18166. if isM64(v0) && isMM(v1) {
  18167. self.require(ISA_MMX)
  18168. p.domain = DomainMMXSSE
  18169. p.add(0, func(m *_Encoding, v []interface{}) {
  18170. m.rexo(hcode(v[1]), addr(v[0]), false)
  18171. m.emit(0x0f)
  18172. m.emit(0xec)
  18173. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18174. })
  18175. }
  18176. // PADDSB xmm, xmm
  18177. if isXMM(v0) && isXMM(v1) {
  18178. self.require(ISA_SSE2)
  18179. p.domain = DomainMMXSSE
  18180. p.add(0, func(m *_Encoding, v []interface{}) {
  18181. m.emit(0x66)
  18182. m.rexo(hcode(v[1]), v[0], false)
  18183. m.emit(0x0f)
  18184. m.emit(0xec)
  18185. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18186. })
  18187. }
  18188. // PADDSB m128, xmm
  18189. if isM128(v0) && isXMM(v1) {
  18190. self.require(ISA_SSE2)
  18191. p.domain = DomainMMXSSE
  18192. p.add(0, func(m *_Encoding, v []interface{}) {
  18193. m.emit(0x66)
  18194. m.rexo(hcode(v[1]), addr(v[0]), false)
  18195. m.emit(0x0f)
  18196. m.emit(0xec)
  18197. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18198. })
  18199. }
  18200. if p.len == 0 {
  18201. panic("invalid operands for PADDSB")
  18202. }
  18203. return p
  18204. }
  18205. // PADDSW performs "Add Packed Signed Word Integers with Signed Saturation".
  18206. //
  18207. // Mnemonic : PADDSW
  18208. // Supported forms : (4 forms)
  18209. //
  18210. // * PADDSW mm, mm [MMX]
  18211. // * PADDSW m64, mm [MMX]
  18212. // * PADDSW xmm, xmm [SSE2]
  18213. // * PADDSW m128, xmm [SSE2]
  18214. //
  18215. func (self *Program) PADDSW(v0 interface{}, v1 interface{}) *Instruction {
  18216. p := self.alloc("PADDSW", 2, Operands { v0, v1 })
  18217. // PADDSW mm, mm
  18218. if isMM(v0) && isMM(v1) {
  18219. self.require(ISA_MMX)
  18220. p.domain = DomainMMXSSE
  18221. p.add(0, func(m *_Encoding, v []interface{}) {
  18222. m.rexo(hcode(v[1]), v[0], false)
  18223. m.emit(0x0f)
  18224. m.emit(0xed)
  18225. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18226. })
  18227. }
  18228. // PADDSW m64, mm
  18229. if isM64(v0) && isMM(v1) {
  18230. self.require(ISA_MMX)
  18231. p.domain = DomainMMXSSE
  18232. p.add(0, func(m *_Encoding, v []interface{}) {
  18233. m.rexo(hcode(v[1]), addr(v[0]), false)
  18234. m.emit(0x0f)
  18235. m.emit(0xed)
  18236. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18237. })
  18238. }
  18239. // PADDSW xmm, xmm
  18240. if isXMM(v0) && isXMM(v1) {
  18241. self.require(ISA_SSE2)
  18242. p.domain = DomainMMXSSE
  18243. p.add(0, func(m *_Encoding, v []interface{}) {
  18244. m.emit(0x66)
  18245. m.rexo(hcode(v[1]), v[0], false)
  18246. m.emit(0x0f)
  18247. m.emit(0xed)
  18248. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18249. })
  18250. }
  18251. // PADDSW m128, xmm
  18252. if isM128(v0) && isXMM(v1) {
  18253. self.require(ISA_SSE2)
  18254. p.domain = DomainMMXSSE
  18255. p.add(0, func(m *_Encoding, v []interface{}) {
  18256. m.emit(0x66)
  18257. m.rexo(hcode(v[1]), addr(v[0]), false)
  18258. m.emit(0x0f)
  18259. m.emit(0xed)
  18260. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18261. })
  18262. }
  18263. if p.len == 0 {
  18264. panic("invalid operands for PADDSW")
  18265. }
  18266. return p
  18267. }
  18268. // PADDUSB performs "Add Packed Unsigned Byte Integers with Unsigned Saturation".
  18269. //
  18270. // Mnemonic : PADDUSB
  18271. // Supported forms : (4 forms)
  18272. //
  18273. // * PADDUSB mm, mm [MMX]
  18274. // * PADDUSB m64, mm [MMX]
  18275. // * PADDUSB xmm, xmm [SSE2]
  18276. // * PADDUSB m128, xmm [SSE2]
  18277. //
  18278. func (self *Program) PADDUSB(v0 interface{}, v1 interface{}) *Instruction {
  18279. p := self.alloc("PADDUSB", 2, Operands { v0, v1 })
  18280. // PADDUSB mm, mm
  18281. if isMM(v0) && isMM(v1) {
  18282. self.require(ISA_MMX)
  18283. p.domain = DomainMMXSSE
  18284. p.add(0, func(m *_Encoding, v []interface{}) {
  18285. m.rexo(hcode(v[1]), v[0], false)
  18286. m.emit(0x0f)
  18287. m.emit(0xdc)
  18288. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18289. })
  18290. }
  18291. // PADDUSB m64, mm
  18292. if isM64(v0) && isMM(v1) {
  18293. self.require(ISA_MMX)
  18294. p.domain = DomainMMXSSE
  18295. p.add(0, func(m *_Encoding, v []interface{}) {
  18296. m.rexo(hcode(v[1]), addr(v[0]), false)
  18297. m.emit(0x0f)
  18298. m.emit(0xdc)
  18299. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18300. })
  18301. }
  18302. // PADDUSB xmm, xmm
  18303. if isXMM(v0) && isXMM(v1) {
  18304. self.require(ISA_SSE2)
  18305. p.domain = DomainMMXSSE
  18306. p.add(0, func(m *_Encoding, v []interface{}) {
  18307. m.emit(0x66)
  18308. m.rexo(hcode(v[1]), v[0], false)
  18309. m.emit(0x0f)
  18310. m.emit(0xdc)
  18311. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18312. })
  18313. }
  18314. // PADDUSB m128, xmm
  18315. if isM128(v0) && isXMM(v1) {
  18316. self.require(ISA_SSE2)
  18317. p.domain = DomainMMXSSE
  18318. p.add(0, func(m *_Encoding, v []interface{}) {
  18319. m.emit(0x66)
  18320. m.rexo(hcode(v[1]), addr(v[0]), false)
  18321. m.emit(0x0f)
  18322. m.emit(0xdc)
  18323. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18324. })
  18325. }
  18326. if p.len == 0 {
  18327. panic("invalid operands for PADDUSB")
  18328. }
  18329. return p
  18330. }
  18331. // PADDUSW performs "Add Packed Unsigned Word Integers with Unsigned Saturation".
  18332. //
  18333. // Mnemonic : PADDUSW
  18334. // Supported forms : (4 forms)
  18335. //
  18336. // * PADDUSW mm, mm [MMX]
  18337. // * PADDUSW m64, mm [MMX]
  18338. // * PADDUSW xmm, xmm [SSE2]
  18339. // * PADDUSW m128, xmm [SSE2]
  18340. //
  18341. func (self *Program) PADDUSW(v0 interface{}, v1 interface{}) *Instruction {
  18342. p := self.alloc("PADDUSW", 2, Operands { v0, v1 })
  18343. // PADDUSW mm, mm
  18344. if isMM(v0) && isMM(v1) {
  18345. self.require(ISA_MMX)
  18346. p.domain = DomainMMXSSE
  18347. p.add(0, func(m *_Encoding, v []interface{}) {
  18348. m.rexo(hcode(v[1]), v[0], false)
  18349. m.emit(0x0f)
  18350. m.emit(0xdd)
  18351. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18352. })
  18353. }
  18354. // PADDUSW m64, mm
  18355. if isM64(v0) && isMM(v1) {
  18356. self.require(ISA_MMX)
  18357. p.domain = DomainMMXSSE
  18358. p.add(0, func(m *_Encoding, v []interface{}) {
  18359. m.rexo(hcode(v[1]), addr(v[0]), false)
  18360. m.emit(0x0f)
  18361. m.emit(0xdd)
  18362. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18363. })
  18364. }
  18365. // PADDUSW xmm, xmm
  18366. if isXMM(v0) && isXMM(v1) {
  18367. self.require(ISA_SSE2)
  18368. p.domain = DomainMMXSSE
  18369. p.add(0, func(m *_Encoding, v []interface{}) {
  18370. m.emit(0x66)
  18371. m.rexo(hcode(v[1]), v[0], false)
  18372. m.emit(0x0f)
  18373. m.emit(0xdd)
  18374. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18375. })
  18376. }
  18377. // PADDUSW m128, xmm
  18378. if isM128(v0) && isXMM(v1) {
  18379. self.require(ISA_SSE2)
  18380. p.domain = DomainMMXSSE
  18381. p.add(0, func(m *_Encoding, v []interface{}) {
  18382. m.emit(0x66)
  18383. m.rexo(hcode(v[1]), addr(v[0]), false)
  18384. m.emit(0x0f)
  18385. m.emit(0xdd)
  18386. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18387. })
  18388. }
  18389. if p.len == 0 {
  18390. panic("invalid operands for PADDUSW")
  18391. }
  18392. return p
  18393. }
  18394. // PADDW performs "Add Packed Word Integers".
  18395. //
  18396. // Mnemonic : PADDW
  18397. // Supported forms : (4 forms)
  18398. //
  18399. // * PADDW mm, mm [MMX]
  18400. // * PADDW m64, mm [MMX]
  18401. // * PADDW xmm, xmm [SSE2]
  18402. // * PADDW m128, xmm [SSE2]
  18403. //
  18404. func (self *Program) PADDW(v0 interface{}, v1 interface{}) *Instruction {
  18405. p := self.alloc("PADDW", 2, Operands { v0, v1 })
  18406. // PADDW mm, mm
  18407. if isMM(v0) && isMM(v1) {
  18408. self.require(ISA_MMX)
  18409. p.domain = DomainMMXSSE
  18410. p.add(0, func(m *_Encoding, v []interface{}) {
  18411. m.rexo(hcode(v[1]), v[0], false)
  18412. m.emit(0x0f)
  18413. m.emit(0xfd)
  18414. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18415. })
  18416. }
  18417. // PADDW m64, mm
  18418. if isM64(v0) && isMM(v1) {
  18419. self.require(ISA_MMX)
  18420. p.domain = DomainMMXSSE
  18421. p.add(0, func(m *_Encoding, v []interface{}) {
  18422. m.rexo(hcode(v[1]), addr(v[0]), false)
  18423. m.emit(0x0f)
  18424. m.emit(0xfd)
  18425. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18426. })
  18427. }
  18428. // PADDW xmm, xmm
  18429. if isXMM(v0) && isXMM(v1) {
  18430. self.require(ISA_SSE2)
  18431. p.domain = DomainMMXSSE
  18432. p.add(0, func(m *_Encoding, v []interface{}) {
  18433. m.emit(0x66)
  18434. m.rexo(hcode(v[1]), v[0], false)
  18435. m.emit(0x0f)
  18436. m.emit(0xfd)
  18437. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18438. })
  18439. }
  18440. // PADDW m128, xmm
  18441. if isM128(v0) && isXMM(v1) {
  18442. self.require(ISA_SSE2)
  18443. p.domain = DomainMMXSSE
  18444. p.add(0, func(m *_Encoding, v []interface{}) {
  18445. m.emit(0x66)
  18446. m.rexo(hcode(v[1]), addr(v[0]), false)
  18447. m.emit(0x0f)
  18448. m.emit(0xfd)
  18449. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18450. })
  18451. }
  18452. if p.len == 0 {
  18453. panic("invalid operands for PADDW")
  18454. }
  18455. return p
  18456. }
  18457. // PALIGNR performs "Packed Align Right".
  18458. //
  18459. // Mnemonic : PALIGNR
  18460. // Supported forms : (4 forms)
  18461. //
  18462. // * PALIGNR imm8, mm, mm [SSSE3]
  18463. // * PALIGNR imm8, m64, mm [SSSE3]
  18464. // * PALIGNR imm8, xmm, xmm [SSSE3]
  18465. // * PALIGNR imm8, m128, xmm [SSSE3]
  18466. //
  18467. func (self *Program) PALIGNR(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  18468. p := self.alloc("PALIGNR", 3, Operands { v0, v1, v2 })
  18469. // PALIGNR imm8, mm, mm
  18470. if isImm8(v0) && isMM(v1) && isMM(v2) {
  18471. self.require(ISA_SSSE3)
  18472. p.domain = DomainMMXSSE
  18473. p.add(0, func(m *_Encoding, v []interface{}) {
  18474. m.rexo(hcode(v[2]), v[1], false)
  18475. m.emit(0x0f)
  18476. m.emit(0x3a)
  18477. m.emit(0x0f)
  18478. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  18479. m.imm1(toImmAny(v[0]))
  18480. })
  18481. }
  18482. // PALIGNR imm8, m64, mm
  18483. if isImm8(v0) && isM64(v1) && isMM(v2) {
  18484. self.require(ISA_SSSE3)
  18485. p.domain = DomainMMXSSE
  18486. p.add(0, func(m *_Encoding, v []interface{}) {
  18487. m.rexo(hcode(v[2]), addr(v[1]), false)
  18488. m.emit(0x0f)
  18489. m.emit(0x3a)
  18490. m.emit(0x0f)
  18491. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  18492. m.imm1(toImmAny(v[0]))
  18493. })
  18494. }
  18495. // PALIGNR imm8, xmm, xmm
  18496. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  18497. self.require(ISA_SSSE3)
  18498. p.domain = DomainMMXSSE
  18499. p.add(0, func(m *_Encoding, v []interface{}) {
  18500. m.emit(0x66)
  18501. m.rexo(hcode(v[2]), v[1], false)
  18502. m.emit(0x0f)
  18503. m.emit(0x3a)
  18504. m.emit(0x0f)
  18505. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  18506. m.imm1(toImmAny(v[0]))
  18507. })
  18508. }
  18509. // PALIGNR imm8, m128, xmm
  18510. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  18511. self.require(ISA_SSSE3)
  18512. p.domain = DomainMMXSSE
  18513. p.add(0, func(m *_Encoding, v []interface{}) {
  18514. m.emit(0x66)
  18515. m.rexo(hcode(v[2]), addr(v[1]), false)
  18516. m.emit(0x0f)
  18517. m.emit(0x3a)
  18518. m.emit(0x0f)
  18519. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  18520. m.imm1(toImmAny(v[0]))
  18521. })
  18522. }
  18523. if p.len == 0 {
  18524. panic("invalid operands for PALIGNR")
  18525. }
  18526. return p
  18527. }
  18528. // PAND performs "Packed Bitwise Logical AND".
  18529. //
  18530. // Mnemonic : PAND
  18531. // Supported forms : (4 forms)
  18532. //
  18533. // * PAND mm, mm [MMX]
  18534. // * PAND m64, mm [MMX]
  18535. // * PAND xmm, xmm [SSE2]
  18536. // * PAND m128, xmm [SSE2]
  18537. //
  18538. func (self *Program) PAND(v0 interface{}, v1 interface{}) *Instruction {
  18539. p := self.alloc("PAND", 2, Operands { v0, v1 })
  18540. // PAND mm, mm
  18541. if isMM(v0) && isMM(v1) {
  18542. self.require(ISA_MMX)
  18543. p.domain = DomainMMXSSE
  18544. p.add(0, func(m *_Encoding, v []interface{}) {
  18545. m.rexo(hcode(v[1]), v[0], false)
  18546. m.emit(0x0f)
  18547. m.emit(0xdb)
  18548. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18549. })
  18550. }
  18551. // PAND m64, mm
  18552. if isM64(v0) && isMM(v1) {
  18553. self.require(ISA_MMX)
  18554. p.domain = DomainMMXSSE
  18555. p.add(0, func(m *_Encoding, v []interface{}) {
  18556. m.rexo(hcode(v[1]), addr(v[0]), false)
  18557. m.emit(0x0f)
  18558. m.emit(0xdb)
  18559. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18560. })
  18561. }
  18562. // PAND xmm, xmm
  18563. if isXMM(v0) && isXMM(v1) {
  18564. self.require(ISA_SSE2)
  18565. p.domain = DomainMMXSSE
  18566. p.add(0, func(m *_Encoding, v []interface{}) {
  18567. m.emit(0x66)
  18568. m.rexo(hcode(v[1]), v[0], false)
  18569. m.emit(0x0f)
  18570. m.emit(0xdb)
  18571. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18572. })
  18573. }
  18574. // PAND m128, xmm
  18575. if isM128(v0) && isXMM(v1) {
  18576. self.require(ISA_SSE2)
  18577. p.domain = DomainMMXSSE
  18578. p.add(0, func(m *_Encoding, v []interface{}) {
  18579. m.emit(0x66)
  18580. m.rexo(hcode(v[1]), addr(v[0]), false)
  18581. m.emit(0x0f)
  18582. m.emit(0xdb)
  18583. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18584. })
  18585. }
  18586. if p.len == 0 {
  18587. panic("invalid operands for PAND")
  18588. }
  18589. return p
  18590. }
  18591. // PANDN performs "Packed Bitwise Logical AND NOT".
  18592. //
  18593. // Mnemonic : PANDN
  18594. // Supported forms : (4 forms)
  18595. //
  18596. // * PANDN mm, mm [MMX]
  18597. // * PANDN m64, mm [MMX]
  18598. // * PANDN xmm, xmm [SSE2]
  18599. // * PANDN m128, xmm [SSE2]
  18600. //
  18601. func (self *Program) PANDN(v0 interface{}, v1 interface{}) *Instruction {
  18602. p := self.alloc("PANDN", 2, Operands { v0, v1 })
  18603. // PANDN mm, mm
  18604. if isMM(v0) && isMM(v1) {
  18605. self.require(ISA_MMX)
  18606. p.domain = DomainMMXSSE
  18607. p.add(0, func(m *_Encoding, v []interface{}) {
  18608. m.rexo(hcode(v[1]), v[0], false)
  18609. m.emit(0x0f)
  18610. m.emit(0xdf)
  18611. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18612. })
  18613. }
  18614. // PANDN m64, mm
  18615. if isM64(v0) && isMM(v1) {
  18616. self.require(ISA_MMX)
  18617. p.domain = DomainMMXSSE
  18618. p.add(0, func(m *_Encoding, v []interface{}) {
  18619. m.rexo(hcode(v[1]), addr(v[0]), false)
  18620. m.emit(0x0f)
  18621. m.emit(0xdf)
  18622. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18623. })
  18624. }
  18625. // PANDN xmm, xmm
  18626. if isXMM(v0) && isXMM(v1) {
  18627. self.require(ISA_SSE2)
  18628. p.domain = DomainMMXSSE
  18629. p.add(0, func(m *_Encoding, v []interface{}) {
  18630. m.emit(0x66)
  18631. m.rexo(hcode(v[1]), v[0], false)
  18632. m.emit(0x0f)
  18633. m.emit(0xdf)
  18634. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18635. })
  18636. }
  18637. // PANDN m128, xmm
  18638. if isM128(v0) && isXMM(v1) {
  18639. self.require(ISA_SSE2)
  18640. p.domain = DomainMMXSSE
  18641. p.add(0, func(m *_Encoding, v []interface{}) {
  18642. m.emit(0x66)
  18643. m.rexo(hcode(v[1]), addr(v[0]), false)
  18644. m.emit(0x0f)
  18645. m.emit(0xdf)
  18646. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18647. })
  18648. }
  18649. if p.len == 0 {
  18650. panic("invalid operands for PANDN")
  18651. }
  18652. return p
  18653. }
  18654. // PAUSE performs "Spin Loop Hint".
  18655. //
  18656. // Mnemonic : PAUSE
  18657. // Supported forms : (1 form)
  18658. //
  18659. // * PAUSE
  18660. //
  18661. func (self *Program) PAUSE() *Instruction {
  18662. p := self.alloc("PAUSE", 0, Operands { })
  18663. // PAUSE
  18664. p.domain = DomainGeneric
  18665. p.add(0, func(m *_Encoding, v []interface{}) {
  18666. m.emit(0xf3)
  18667. m.emit(0x90)
  18668. })
  18669. return p
  18670. }
  18671. // PAVGB performs "Average Packed Byte Integers".
  18672. //
  18673. // Mnemonic : PAVGB
  18674. // Supported forms : (4 forms)
  18675. //
  18676. // * PAVGB mm, mm [MMX+]
  18677. // * PAVGB m64, mm [MMX+]
  18678. // * PAVGB xmm, xmm [SSE2]
  18679. // * PAVGB m128, xmm [SSE2]
  18680. //
  18681. func (self *Program) PAVGB(v0 interface{}, v1 interface{}) *Instruction {
  18682. p := self.alloc("PAVGB", 2, Operands { v0, v1 })
  18683. // PAVGB mm, mm
  18684. if isMM(v0) && isMM(v1) {
  18685. self.require(ISA_MMX_PLUS)
  18686. p.domain = DomainMMXSSE
  18687. p.add(0, func(m *_Encoding, v []interface{}) {
  18688. m.rexo(hcode(v[1]), v[0], false)
  18689. m.emit(0x0f)
  18690. m.emit(0xe0)
  18691. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18692. })
  18693. }
  18694. // PAVGB m64, mm
  18695. if isM64(v0) && isMM(v1) {
  18696. self.require(ISA_MMX_PLUS)
  18697. p.domain = DomainMMXSSE
  18698. p.add(0, func(m *_Encoding, v []interface{}) {
  18699. m.rexo(hcode(v[1]), addr(v[0]), false)
  18700. m.emit(0x0f)
  18701. m.emit(0xe0)
  18702. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18703. })
  18704. }
  18705. // PAVGB xmm, xmm
  18706. if isXMM(v0) && isXMM(v1) {
  18707. self.require(ISA_SSE2)
  18708. p.domain = DomainMMXSSE
  18709. p.add(0, func(m *_Encoding, v []interface{}) {
  18710. m.emit(0x66)
  18711. m.rexo(hcode(v[1]), v[0], false)
  18712. m.emit(0x0f)
  18713. m.emit(0xe0)
  18714. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18715. })
  18716. }
  18717. // PAVGB m128, xmm
  18718. if isM128(v0) && isXMM(v1) {
  18719. self.require(ISA_SSE2)
  18720. p.domain = DomainMMXSSE
  18721. p.add(0, func(m *_Encoding, v []interface{}) {
  18722. m.emit(0x66)
  18723. m.rexo(hcode(v[1]), addr(v[0]), false)
  18724. m.emit(0x0f)
  18725. m.emit(0xe0)
  18726. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18727. })
  18728. }
  18729. if p.len == 0 {
  18730. panic("invalid operands for PAVGB")
  18731. }
  18732. return p
  18733. }
  18734. // PAVGUSB performs "Average Packed Byte Integers".
  18735. //
  18736. // Mnemonic : PAVGUSB
  18737. // Supported forms : (2 forms)
  18738. //
  18739. // * PAVGUSB mm, mm [3dnow!]
  18740. // * PAVGUSB m64, mm [3dnow!]
  18741. //
  18742. func (self *Program) PAVGUSB(v0 interface{}, v1 interface{}) *Instruction {
  18743. p := self.alloc("PAVGUSB", 2, Operands { v0, v1 })
  18744. // PAVGUSB mm, mm
  18745. if isMM(v0) && isMM(v1) {
  18746. self.require(ISA_3DNOW)
  18747. p.domain = DomainAMDSpecific
  18748. p.add(0, func(m *_Encoding, v []interface{}) {
  18749. m.rexo(hcode(v[1]), v[0], false)
  18750. m.emit(0x0f)
  18751. m.emit(0x0f)
  18752. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18753. m.emit(0xbf)
  18754. })
  18755. }
  18756. // PAVGUSB m64, mm
  18757. if isM64(v0) && isMM(v1) {
  18758. self.require(ISA_3DNOW)
  18759. p.domain = DomainAMDSpecific
  18760. p.add(0, func(m *_Encoding, v []interface{}) {
  18761. m.rexo(hcode(v[1]), addr(v[0]), false)
  18762. m.emit(0x0f)
  18763. m.emit(0x0f)
  18764. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18765. m.emit(0xbf)
  18766. })
  18767. }
  18768. if p.len == 0 {
  18769. panic("invalid operands for PAVGUSB")
  18770. }
  18771. return p
  18772. }
  18773. // PAVGW performs "Average Packed Word Integers".
  18774. //
  18775. // Mnemonic : PAVGW
  18776. // Supported forms : (4 forms)
  18777. //
  18778. // * PAVGW mm, mm [MMX+]
  18779. // * PAVGW m64, mm [MMX+]
  18780. // * PAVGW xmm, xmm [SSE2]
  18781. // * PAVGW m128, xmm [SSE2]
  18782. //
  18783. func (self *Program) PAVGW(v0 interface{}, v1 interface{}) *Instruction {
  18784. p := self.alloc("PAVGW", 2, Operands { v0, v1 })
  18785. // PAVGW mm, mm
  18786. if isMM(v0) && isMM(v1) {
  18787. self.require(ISA_MMX_PLUS)
  18788. p.domain = DomainMMXSSE
  18789. p.add(0, func(m *_Encoding, v []interface{}) {
  18790. m.rexo(hcode(v[1]), v[0], false)
  18791. m.emit(0x0f)
  18792. m.emit(0xe3)
  18793. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18794. })
  18795. }
  18796. // PAVGW m64, mm
  18797. if isM64(v0) && isMM(v1) {
  18798. self.require(ISA_MMX_PLUS)
  18799. p.domain = DomainMMXSSE
  18800. p.add(0, func(m *_Encoding, v []interface{}) {
  18801. m.rexo(hcode(v[1]), addr(v[0]), false)
  18802. m.emit(0x0f)
  18803. m.emit(0xe3)
  18804. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18805. })
  18806. }
  18807. // PAVGW xmm, xmm
  18808. if isXMM(v0) && isXMM(v1) {
  18809. self.require(ISA_SSE2)
  18810. p.domain = DomainMMXSSE
  18811. p.add(0, func(m *_Encoding, v []interface{}) {
  18812. m.emit(0x66)
  18813. m.rexo(hcode(v[1]), v[0], false)
  18814. m.emit(0x0f)
  18815. m.emit(0xe3)
  18816. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18817. })
  18818. }
  18819. // PAVGW m128, xmm
  18820. if isM128(v0) && isXMM(v1) {
  18821. self.require(ISA_SSE2)
  18822. p.domain = DomainMMXSSE
  18823. p.add(0, func(m *_Encoding, v []interface{}) {
  18824. m.emit(0x66)
  18825. m.rexo(hcode(v[1]), addr(v[0]), false)
  18826. m.emit(0x0f)
  18827. m.emit(0xe3)
  18828. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18829. })
  18830. }
  18831. if p.len == 0 {
  18832. panic("invalid operands for PAVGW")
  18833. }
  18834. return p
  18835. }
  18836. // PBLENDVB performs "Variable Blend Packed Bytes".
  18837. //
  18838. // Mnemonic : PBLENDVB
  18839. // Supported forms : (2 forms)
  18840. //
  18841. // * PBLENDVB xmm0, xmm, xmm [SSE4.1]
  18842. // * PBLENDVB xmm0, m128, xmm [SSE4.1]
  18843. //
  18844. func (self *Program) PBLENDVB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  18845. p := self.alloc("PBLENDVB", 3, Operands { v0, v1, v2 })
  18846. // PBLENDVB xmm0, xmm, xmm
  18847. if v0 == XMM0 && isXMM(v1) && isXMM(v2) {
  18848. self.require(ISA_SSE4_1)
  18849. p.domain = DomainMMXSSE
  18850. p.add(0, func(m *_Encoding, v []interface{}) {
  18851. m.emit(0x66)
  18852. m.rexo(hcode(v[2]), v[1], false)
  18853. m.emit(0x0f)
  18854. m.emit(0x38)
  18855. m.emit(0x10)
  18856. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  18857. })
  18858. }
  18859. // PBLENDVB xmm0, m128, xmm
  18860. if v0 == XMM0 && isM128(v1) && isXMM(v2) {
  18861. self.require(ISA_SSE4_1)
  18862. p.domain = DomainMMXSSE
  18863. p.add(0, func(m *_Encoding, v []interface{}) {
  18864. m.emit(0x66)
  18865. m.rexo(hcode(v[2]), addr(v[1]), false)
  18866. m.emit(0x0f)
  18867. m.emit(0x38)
  18868. m.emit(0x10)
  18869. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  18870. })
  18871. }
  18872. if p.len == 0 {
  18873. panic("invalid operands for PBLENDVB")
  18874. }
  18875. return p
  18876. }
  18877. // PBLENDW performs "Blend Packed Words".
  18878. //
  18879. // Mnemonic : PBLENDW
  18880. // Supported forms : (2 forms)
  18881. //
  18882. // * PBLENDW imm8, xmm, xmm [SSE4.1]
  18883. // * PBLENDW imm8, m128, xmm [SSE4.1]
  18884. //
  18885. func (self *Program) PBLENDW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  18886. p := self.alloc("PBLENDW", 3, Operands { v0, v1, v2 })
  18887. // PBLENDW imm8, xmm, xmm
  18888. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  18889. self.require(ISA_SSE4_1)
  18890. p.domain = DomainMMXSSE
  18891. p.add(0, func(m *_Encoding, v []interface{}) {
  18892. m.emit(0x66)
  18893. m.rexo(hcode(v[2]), v[1], false)
  18894. m.emit(0x0f)
  18895. m.emit(0x3a)
  18896. m.emit(0x0e)
  18897. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  18898. m.imm1(toImmAny(v[0]))
  18899. })
  18900. }
  18901. // PBLENDW imm8, m128, xmm
  18902. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  18903. self.require(ISA_SSE4_1)
  18904. p.domain = DomainMMXSSE
  18905. p.add(0, func(m *_Encoding, v []interface{}) {
  18906. m.emit(0x66)
  18907. m.rexo(hcode(v[2]), addr(v[1]), false)
  18908. m.emit(0x0f)
  18909. m.emit(0x3a)
  18910. m.emit(0x0e)
  18911. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  18912. m.imm1(toImmAny(v[0]))
  18913. })
  18914. }
  18915. if p.len == 0 {
  18916. panic("invalid operands for PBLENDW")
  18917. }
  18918. return p
  18919. }
  18920. // PCLMULQDQ performs "Carry-Less Quadword Multiplication".
  18921. //
  18922. // Mnemonic : PCLMULQDQ
  18923. // Supported forms : (2 forms)
  18924. //
  18925. // * PCLMULQDQ imm8, xmm, xmm [PCLMULQDQ]
  18926. // * PCLMULQDQ imm8, m128, xmm [PCLMULQDQ]
  18927. //
  18928. func (self *Program) PCLMULQDQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  18929. p := self.alloc("PCLMULQDQ", 3, Operands { v0, v1, v2 })
  18930. // PCLMULQDQ imm8, xmm, xmm
  18931. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  18932. self.require(ISA_PCLMULQDQ)
  18933. p.domain = DomainCrypto
  18934. p.add(0, func(m *_Encoding, v []interface{}) {
  18935. m.emit(0x66)
  18936. m.rexo(hcode(v[2]), v[1], false)
  18937. m.emit(0x0f)
  18938. m.emit(0x3a)
  18939. m.emit(0x44)
  18940. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  18941. m.imm1(toImmAny(v[0]))
  18942. })
  18943. }
  18944. // PCLMULQDQ imm8, m128, xmm
  18945. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  18946. self.require(ISA_PCLMULQDQ)
  18947. p.domain = DomainCrypto
  18948. p.add(0, func(m *_Encoding, v []interface{}) {
  18949. m.emit(0x66)
  18950. m.rexo(hcode(v[2]), addr(v[1]), false)
  18951. m.emit(0x0f)
  18952. m.emit(0x3a)
  18953. m.emit(0x44)
  18954. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  18955. m.imm1(toImmAny(v[0]))
  18956. })
  18957. }
  18958. if p.len == 0 {
  18959. panic("invalid operands for PCLMULQDQ")
  18960. }
  18961. return p
  18962. }
  18963. // PCMPEQB performs "Compare Packed Byte Data for Equality".
  18964. //
  18965. // Mnemonic : PCMPEQB
  18966. // Supported forms : (4 forms)
  18967. //
  18968. // * PCMPEQB mm, mm [MMX]
  18969. // * PCMPEQB m64, mm [MMX]
  18970. // * PCMPEQB xmm, xmm [SSE2]
  18971. // * PCMPEQB m128, xmm [SSE2]
  18972. //
  18973. func (self *Program) PCMPEQB(v0 interface{}, v1 interface{}) *Instruction {
  18974. p := self.alloc("PCMPEQB", 2, Operands { v0, v1 })
  18975. // PCMPEQB mm, mm
  18976. if isMM(v0) && isMM(v1) {
  18977. self.require(ISA_MMX)
  18978. p.domain = DomainMMXSSE
  18979. p.add(0, func(m *_Encoding, v []interface{}) {
  18980. m.rexo(hcode(v[1]), v[0], false)
  18981. m.emit(0x0f)
  18982. m.emit(0x74)
  18983. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  18984. })
  18985. }
  18986. // PCMPEQB m64, mm
  18987. if isM64(v0) && isMM(v1) {
  18988. self.require(ISA_MMX)
  18989. p.domain = DomainMMXSSE
  18990. p.add(0, func(m *_Encoding, v []interface{}) {
  18991. m.rexo(hcode(v[1]), addr(v[0]), false)
  18992. m.emit(0x0f)
  18993. m.emit(0x74)
  18994. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  18995. })
  18996. }
  18997. // PCMPEQB xmm, xmm
  18998. if isXMM(v0) && isXMM(v1) {
  18999. self.require(ISA_SSE2)
  19000. p.domain = DomainMMXSSE
  19001. p.add(0, func(m *_Encoding, v []interface{}) {
  19002. m.emit(0x66)
  19003. m.rexo(hcode(v[1]), v[0], false)
  19004. m.emit(0x0f)
  19005. m.emit(0x74)
  19006. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  19007. })
  19008. }
  19009. // PCMPEQB m128, xmm
  19010. if isM128(v0) && isXMM(v1) {
  19011. self.require(ISA_SSE2)
  19012. p.domain = DomainMMXSSE
  19013. p.add(0, func(m *_Encoding, v []interface{}) {
  19014. m.emit(0x66)
  19015. m.rexo(hcode(v[1]), addr(v[0]), false)
  19016. m.emit(0x0f)
  19017. m.emit(0x74)
  19018. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  19019. })
  19020. }
  19021. if p.len == 0 {
  19022. panic("invalid operands for PCMPEQB")
  19023. }
  19024. return p
  19025. }
  19026. // PCMPEQD performs "Compare Packed Doubleword Data for Equality".
  19027. //
  19028. // Mnemonic : PCMPEQD
  19029. // Supported forms : (4 forms)
  19030. //
  19031. // * PCMPEQD mm, mm [MMX]
  19032. // * PCMPEQD m64, mm [MMX]
  19033. // * PCMPEQD xmm, xmm [SSE2]
  19034. // * PCMPEQD m128, xmm [SSE2]
  19035. //
  19036. func (self *Program) PCMPEQD(v0 interface{}, v1 interface{}) *Instruction {
  19037. p := self.alloc("PCMPEQD", 2, Operands { v0, v1 })
  19038. // PCMPEQD mm, mm
  19039. if isMM(v0) && isMM(v1) {
  19040. self.require(ISA_MMX)
  19041. p.domain = DomainMMXSSE
  19042. p.add(0, func(m *_Encoding, v []interface{}) {
  19043. m.rexo(hcode(v[1]), v[0], false)
  19044. m.emit(0x0f)
  19045. m.emit(0x76)
  19046. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  19047. })
  19048. }
  19049. // PCMPEQD m64, mm
  19050. if isM64(v0) && isMM(v1) {
  19051. self.require(ISA_MMX)
  19052. p.domain = DomainMMXSSE
  19053. p.add(0, func(m *_Encoding, v []interface{}) {
  19054. m.rexo(hcode(v[1]), addr(v[0]), false)
  19055. m.emit(0x0f)
  19056. m.emit(0x76)
  19057. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  19058. })
  19059. }
  19060. // PCMPEQD xmm, xmm
  19061. if isXMM(v0) && isXMM(v1) {
  19062. self.require(ISA_SSE2)
  19063. p.domain = DomainMMXSSE
  19064. p.add(0, func(m *_Encoding, v []interface{}) {
  19065. m.emit(0x66)
  19066. m.rexo(hcode(v[1]), v[0], false)
  19067. m.emit(0x0f)
  19068. m.emit(0x76)
  19069. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  19070. })
  19071. }
  19072. // PCMPEQD m128, xmm
  19073. if isM128(v0) && isXMM(v1) {
  19074. self.require(ISA_SSE2)
  19075. p.domain = DomainMMXSSE
  19076. p.add(0, func(m *_Encoding, v []interface{}) {
  19077. m.emit(0x66)
  19078. m.rexo(hcode(v[1]), addr(v[0]), false)
  19079. m.emit(0x0f)
  19080. m.emit(0x76)
  19081. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  19082. })
  19083. }
  19084. if p.len == 0 {
  19085. panic("invalid operands for PCMPEQD")
  19086. }
  19087. return p
  19088. }
  19089. // PCMPEQQ performs "Compare Packed Quadword Data for Equality".
  19090. //
  19091. // Mnemonic : PCMPEQQ
  19092. // Supported forms : (2 forms)
  19093. //
  19094. // * PCMPEQQ xmm, xmm [SSE4.1]
  19095. // * PCMPEQQ m128, xmm [SSE4.1]
  19096. //
  19097. func (self *Program) PCMPEQQ(v0 interface{}, v1 interface{}) *Instruction {
  19098. p := self.alloc("PCMPEQQ", 2, Operands { v0, v1 })
  19099. // PCMPEQQ xmm, xmm
  19100. if isXMM(v0) && isXMM(v1) {
  19101. self.require(ISA_SSE4_1)
  19102. p.domain = DomainMMXSSE
  19103. p.add(0, func(m *_Encoding, v []interface{}) {
  19104. m.emit(0x66)
  19105. m.rexo(hcode(v[1]), v[0], false)
  19106. m.emit(0x0f)
  19107. m.emit(0x38)
  19108. m.emit(0x29)
  19109. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  19110. })
  19111. }
  19112. // PCMPEQQ m128, xmm
  19113. if isM128(v0) && isXMM(v1) {
  19114. self.require(ISA_SSE4_1)
  19115. p.domain = DomainMMXSSE
  19116. p.add(0, func(m *_Encoding, v []interface{}) {
  19117. m.emit(0x66)
  19118. m.rexo(hcode(v[1]), addr(v[0]), false)
  19119. m.emit(0x0f)
  19120. m.emit(0x38)
  19121. m.emit(0x29)
  19122. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  19123. })
  19124. }
  19125. if p.len == 0 {
  19126. panic("invalid operands for PCMPEQQ")
  19127. }
  19128. return p
  19129. }
  19130. // PCMPEQW performs "Compare Packed Word Data for Equality".
  19131. //
  19132. // Mnemonic : PCMPEQW
  19133. // Supported forms : (4 forms)
  19134. //
  19135. // * PCMPEQW mm, mm [MMX]
  19136. // * PCMPEQW m64, mm [MMX]
  19137. // * PCMPEQW xmm, xmm [SSE2]
  19138. // * PCMPEQW m128, xmm [SSE2]
  19139. //
  19140. func (self *Program) PCMPEQW(v0 interface{}, v1 interface{}) *Instruction {
  19141. p := self.alloc("PCMPEQW", 2, Operands { v0, v1 })
  19142. // PCMPEQW mm, mm
  19143. if isMM(v0) && isMM(v1) {
  19144. self.require(ISA_MMX)
  19145. p.domain = DomainMMXSSE
  19146. p.add(0, func(m *_Encoding, v []interface{}) {
  19147. m.rexo(hcode(v[1]), v[0], false)
  19148. m.emit(0x0f)
  19149. m.emit(0x75)
  19150. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  19151. })
  19152. }
  19153. // PCMPEQW m64, mm
  19154. if isM64(v0) && isMM(v1) {
  19155. self.require(ISA_MMX)
  19156. p.domain = DomainMMXSSE
  19157. p.add(0, func(m *_Encoding, v []interface{}) {
  19158. m.rexo(hcode(v[1]), addr(v[0]), false)
  19159. m.emit(0x0f)
  19160. m.emit(0x75)
  19161. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  19162. })
  19163. }
  19164. // PCMPEQW xmm, xmm
  19165. if isXMM(v0) && isXMM(v1) {
  19166. self.require(ISA_SSE2)
  19167. p.domain = DomainMMXSSE
  19168. p.add(0, func(m *_Encoding, v []interface{}) {
  19169. m.emit(0x66)
  19170. m.rexo(hcode(v[1]), v[0], false)
  19171. m.emit(0x0f)
  19172. m.emit(0x75)
  19173. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  19174. })
  19175. }
  19176. // PCMPEQW m128, xmm
  19177. if isM128(v0) && isXMM(v1) {
  19178. self.require(ISA_SSE2)
  19179. p.domain = DomainMMXSSE
  19180. p.add(0, func(m *_Encoding, v []interface{}) {
  19181. m.emit(0x66)
  19182. m.rexo(hcode(v[1]), addr(v[0]), false)
  19183. m.emit(0x0f)
  19184. m.emit(0x75)
  19185. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  19186. })
  19187. }
  19188. if p.len == 0 {
  19189. panic("invalid operands for PCMPEQW")
  19190. }
  19191. return p
  19192. }
  19193. // PCMPESTRI performs "Packed Compare Explicit Length Strings, Return Index".
  19194. //
  19195. // Mnemonic : PCMPESTRI
  19196. // Supported forms : (2 forms)
  19197. //
  19198. // * PCMPESTRI imm8, xmm, xmm [SSE4.2]
  19199. // * PCMPESTRI imm8, m128, xmm [SSE4.2]
  19200. //
  19201. func (self *Program) PCMPESTRI(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  19202. p := self.alloc("PCMPESTRI", 3, Operands { v0, v1, v2 })
  19203. // PCMPESTRI imm8, xmm, xmm
  19204. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  19205. self.require(ISA_SSE4_2)
  19206. p.domain = DomainMMXSSE
  19207. p.add(0, func(m *_Encoding, v []interface{}) {
  19208. m.emit(0x66)
  19209. m.rexo(hcode(v[2]), v[1], false)
  19210. m.emit(0x0f)
  19211. m.emit(0x3a)
  19212. m.emit(0x61)
  19213. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  19214. m.imm1(toImmAny(v[0]))
  19215. })
  19216. }
  19217. // PCMPESTRI imm8, m128, xmm
  19218. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  19219. self.require(ISA_SSE4_2)
  19220. p.domain = DomainMMXSSE
  19221. p.add(0, func(m *_Encoding, v []interface{}) {
  19222. m.emit(0x66)
  19223. m.rexo(hcode(v[2]), addr(v[1]), false)
  19224. m.emit(0x0f)
  19225. m.emit(0x3a)
  19226. m.emit(0x61)
  19227. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  19228. m.imm1(toImmAny(v[0]))
  19229. })
  19230. }
  19231. if p.len == 0 {
  19232. panic("invalid operands for PCMPESTRI")
  19233. }
  19234. return p
  19235. }
  19236. // PCMPESTRM performs "Packed Compare Explicit Length Strings, Return Mask".
  19237. //
  19238. // Mnemonic : PCMPESTRM
  19239. // Supported forms : (2 forms)
  19240. //
  19241. // * PCMPESTRM imm8, xmm, xmm [SSE4.2]
  19242. // * PCMPESTRM imm8, m128, xmm [SSE4.2]
  19243. //
  19244. func (self *Program) PCMPESTRM(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  19245. p := self.alloc("PCMPESTRM", 3, Operands { v0, v1, v2 })
  19246. // PCMPESTRM imm8, xmm, xmm
  19247. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  19248. self.require(ISA_SSE4_2)
  19249. p.domain = DomainMMXSSE
  19250. p.add(0, func(m *_Encoding, v []interface{}) {
  19251. m.emit(0x66)
  19252. m.rexo(hcode(v[2]), v[1], false)
  19253. m.emit(0x0f)
  19254. m.emit(0x3a)
  19255. m.emit(0x60)
  19256. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  19257. m.imm1(toImmAny(v[0]))
  19258. })
  19259. }
  19260. // PCMPESTRM imm8, m128, xmm
  19261. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  19262. self.require(ISA_SSE4_2)
  19263. p.domain = DomainMMXSSE
  19264. p.add(0, func(m *_Encoding, v []interface{}) {
  19265. m.emit(0x66)
  19266. m.rexo(hcode(v[2]), addr(v[1]), false)
  19267. m.emit(0x0f)
  19268. m.emit(0x3a)
  19269. m.emit(0x60)
  19270. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  19271. m.imm1(toImmAny(v[0]))
  19272. })
  19273. }
  19274. if p.len == 0 {
  19275. panic("invalid operands for PCMPESTRM")
  19276. }
  19277. return p
  19278. }
  19279. // PCMPGTB performs "Compare Packed Signed Byte Integers for Greater Than".
  19280. //
  19281. // Mnemonic : PCMPGTB
  19282. // Supported forms : (4 forms)
  19283. //
  19284. // * PCMPGTB mm, mm [MMX]
  19285. // * PCMPGTB m64, mm [MMX]
  19286. // * PCMPGTB xmm, xmm [SSE2]
  19287. // * PCMPGTB m128, xmm [SSE2]
  19288. //
  19289. func (self *Program) PCMPGTB(v0 interface{}, v1 interface{}) *Instruction {
  19290. p := self.alloc("PCMPGTB", 2, Operands { v0, v1 })
  19291. // PCMPGTB mm, mm
  19292. if isMM(v0) && isMM(v1) {
  19293. self.require(ISA_MMX)
  19294. p.domain = DomainMMXSSE
  19295. p.add(0, func(m *_Encoding, v []interface{}) {
  19296. m.rexo(hcode(v[1]), v[0], false)
  19297. m.emit(0x0f)
  19298. m.emit(0x64)
  19299. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  19300. })
  19301. }
  19302. // PCMPGTB m64, mm
  19303. if isM64(v0) && isMM(v1) {
  19304. self.require(ISA_MMX)
  19305. p.domain = DomainMMXSSE
  19306. p.add(0, func(m *_Encoding, v []interface{}) {
  19307. m.rexo(hcode(v[1]), addr(v[0]), false)
  19308. m.emit(0x0f)
  19309. m.emit(0x64)
  19310. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  19311. })
  19312. }
  19313. // PCMPGTB xmm, xmm
  19314. if isXMM(v0) && isXMM(v1) {
  19315. self.require(ISA_SSE2)
  19316. p.domain = DomainMMXSSE
  19317. p.add(0, func(m *_Encoding, v []interface{}) {
  19318. m.emit(0x66)
  19319. m.rexo(hcode(v[1]), v[0], false)
  19320. m.emit(0x0f)
  19321. m.emit(0x64)
  19322. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  19323. })
  19324. }
  19325. // PCMPGTB m128, xmm
  19326. if isM128(v0) && isXMM(v1) {
  19327. self.require(ISA_SSE2)
  19328. p.domain = DomainMMXSSE
  19329. p.add(0, func(m *_Encoding, v []interface{}) {
  19330. m.emit(0x66)
  19331. m.rexo(hcode(v[1]), addr(v[0]), false)
  19332. m.emit(0x0f)
  19333. m.emit(0x64)
  19334. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  19335. })
  19336. }
  19337. if p.len == 0 {
  19338. panic("invalid operands for PCMPGTB")
  19339. }
  19340. return p
  19341. }
  19342. // PCMPGTD performs "Compare Packed Signed Doubleword Integers for Greater Than".
  19343. //
  19344. // Mnemonic : PCMPGTD
  19345. // Supported forms : (4 forms)
  19346. //
  19347. // * PCMPGTD mm, mm [MMX]
  19348. // * PCMPGTD m64, mm [MMX]
  19349. // * PCMPGTD xmm, xmm [SSE2]
  19350. // * PCMPGTD m128, xmm [SSE2]
  19351. //
  19352. func (self *Program) PCMPGTD(v0 interface{}, v1 interface{}) *Instruction {
  19353. p := self.alloc("PCMPGTD", 2, Operands { v0, v1 })
  19354. // PCMPGTD mm, mm
  19355. if isMM(v0) && isMM(v1) {
  19356. self.require(ISA_MMX)
  19357. p.domain = DomainMMXSSE
  19358. p.add(0, func(m *_Encoding, v []interface{}) {
  19359. m.rexo(hcode(v[1]), v[0], false)
  19360. m.emit(0x0f)
  19361. m.emit(0x66)
  19362. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  19363. })
  19364. }
  19365. // PCMPGTD m64, mm
  19366. if isM64(v0) && isMM(v1) {
  19367. self.require(ISA_MMX)
  19368. p.domain = DomainMMXSSE
  19369. p.add(0, func(m *_Encoding, v []interface{}) {
  19370. m.rexo(hcode(v[1]), addr(v[0]), false)
  19371. m.emit(0x0f)
  19372. m.emit(0x66)
  19373. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  19374. })
  19375. }
  19376. // PCMPGTD xmm, xmm
  19377. if isXMM(v0) && isXMM(v1) {
  19378. self.require(ISA_SSE2)
  19379. p.domain = DomainMMXSSE
  19380. p.add(0, func(m *_Encoding, v []interface{}) {
  19381. m.emit(0x66)
  19382. m.rexo(hcode(v[1]), v[0], false)
  19383. m.emit(0x0f)
  19384. m.emit(0x66)
  19385. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  19386. })
  19387. }
  19388. // PCMPGTD m128, xmm
  19389. if isM128(v0) && isXMM(v1) {
  19390. self.require(ISA_SSE2)
  19391. p.domain = DomainMMXSSE
  19392. p.add(0, func(m *_Encoding, v []interface{}) {
  19393. m.emit(0x66)
  19394. m.rexo(hcode(v[1]), addr(v[0]), false)
  19395. m.emit(0x0f)
  19396. m.emit(0x66)
  19397. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  19398. })
  19399. }
  19400. if p.len == 0 {
  19401. panic("invalid operands for PCMPGTD")
  19402. }
  19403. return p
  19404. }
  19405. // PCMPGTQ performs "Compare Packed Data for Greater Than".
  19406. //
  19407. // Mnemonic : PCMPGTQ
  19408. // Supported forms : (2 forms)
  19409. //
  19410. // * PCMPGTQ xmm, xmm [SSE4.2]
  19411. // * PCMPGTQ m128, xmm [SSE4.2]
  19412. //
  19413. func (self *Program) PCMPGTQ(v0 interface{}, v1 interface{}) *Instruction {
  19414. p := self.alloc("PCMPGTQ", 2, Operands { v0, v1 })
  19415. // PCMPGTQ xmm, xmm
  19416. if isXMM(v0) && isXMM(v1) {
  19417. self.require(ISA_SSE4_2)
  19418. p.domain = DomainMMXSSE
  19419. p.add(0, func(m *_Encoding, v []interface{}) {
  19420. m.emit(0x66)
  19421. m.rexo(hcode(v[1]), v[0], false)
  19422. m.emit(0x0f)
  19423. m.emit(0x38)
  19424. m.emit(0x37)
  19425. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  19426. })
  19427. }
  19428. // PCMPGTQ m128, xmm
  19429. if isM128(v0) && isXMM(v1) {
  19430. self.require(ISA_SSE4_2)
  19431. p.domain = DomainMMXSSE
  19432. p.add(0, func(m *_Encoding, v []interface{}) {
  19433. m.emit(0x66)
  19434. m.rexo(hcode(v[1]), addr(v[0]), false)
  19435. m.emit(0x0f)
  19436. m.emit(0x38)
  19437. m.emit(0x37)
  19438. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  19439. })
  19440. }
  19441. if p.len == 0 {
  19442. panic("invalid operands for PCMPGTQ")
  19443. }
  19444. return p
  19445. }
  19446. // PCMPGTW performs "Compare Packed Signed Word Integers for Greater Than".
  19447. //
  19448. // Mnemonic : PCMPGTW
  19449. // Supported forms : (4 forms)
  19450. //
  19451. // * PCMPGTW mm, mm [MMX]
  19452. // * PCMPGTW m64, mm [MMX]
  19453. // * PCMPGTW xmm, xmm [SSE2]
  19454. // * PCMPGTW m128, xmm [SSE2]
  19455. //
  19456. func (self *Program) PCMPGTW(v0 interface{}, v1 interface{}) *Instruction {
  19457. p := self.alloc("PCMPGTW", 2, Operands { v0, v1 })
  19458. // PCMPGTW mm, mm
  19459. if isMM(v0) && isMM(v1) {
  19460. self.require(ISA_MMX)
  19461. p.domain = DomainMMXSSE
  19462. p.add(0, func(m *_Encoding, v []interface{}) {
  19463. m.rexo(hcode(v[1]), v[0], false)
  19464. m.emit(0x0f)
  19465. m.emit(0x65)
  19466. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  19467. })
  19468. }
  19469. // PCMPGTW m64, mm
  19470. if isM64(v0) && isMM(v1) {
  19471. self.require(ISA_MMX)
  19472. p.domain = DomainMMXSSE
  19473. p.add(0, func(m *_Encoding, v []interface{}) {
  19474. m.rexo(hcode(v[1]), addr(v[0]), false)
  19475. m.emit(0x0f)
  19476. m.emit(0x65)
  19477. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  19478. })
  19479. }
  19480. // PCMPGTW xmm, xmm
  19481. if isXMM(v0) && isXMM(v1) {
  19482. self.require(ISA_SSE2)
  19483. p.domain = DomainMMXSSE
  19484. p.add(0, func(m *_Encoding, v []interface{}) {
  19485. m.emit(0x66)
  19486. m.rexo(hcode(v[1]), v[0], false)
  19487. m.emit(0x0f)
  19488. m.emit(0x65)
  19489. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  19490. })
  19491. }
  19492. // PCMPGTW m128, xmm
  19493. if isM128(v0) && isXMM(v1) {
  19494. self.require(ISA_SSE2)
  19495. p.domain = DomainMMXSSE
  19496. p.add(0, func(m *_Encoding, v []interface{}) {
  19497. m.emit(0x66)
  19498. m.rexo(hcode(v[1]), addr(v[0]), false)
  19499. m.emit(0x0f)
  19500. m.emit(0x65)
  19501. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  19502. })
  19503. }
  19504. if p.len == 0 {
  19505. panic("invalid operands for PCMPGTW")
  19506. }
  19507. return p
  19508. }
  19509. // PCMPISTRI performs "Packed Compare Implicit Length Strings, Return Index".
  19510. //
  19511. // Mnemonic : PCMPISTRI
  19512. // Supported forms : (2 forms)
  19513. //
  19514. // * PCMPISTRI imm8, xmm, xmm [SSE4.2]
  19515. // * PCMPISTRI imm8, m128, xmm [SSE4.2]
  19516. //
  19517. func (self *Program) PCMPISTRI(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  19518. p := self.alloc("PCMPISTRI", 3, Operands { v0, v1, v2 })
  19519. // PCMPISTRI imm8, xmm, xmm
  19520. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  19521. self.require(ISA_SSE4_2)
  19522. p.domain = DomainMMXSSE
  19523. p.add(0, func(m *_Encoding, v []interface{}) {
  19524. m.emit(0x66)
  19525. m.rexo(hcode(v[2]), v[1], false)
  19526. m.emit(0x0f)
  19527. m.emit(0x3a)
  19528. m.emit(0x63)
  19529. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  19530. m.imm1(toImmAny(v[0]))
  19531. })
  19532. }
  19533. // PCMPISTRI imm8, m128, xmm
  19534. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  19535. self.require(ISA_SSE4_2)
  19536. p.domain = DomainMMXSSE
  19537. p.add(0, func(m *_Encoding, v []interface{}) {
  19538. m.emit(0x66)
  19539. m.rexo(hcode(v[2]), addr(v[1]), false)
  19540. m.emit(0x0f)
  19541. m.emit(0x3a)
  19542. m.emit(0x63)
  19543. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  19544. m.imm1(toImmAny(v[0]))
  19545. })
  19546. }
  19547. if p.len == 0 {
  19548. panic("invalid operands for PCMPISTRI")
  19549. }
  19550. return p
  19551. }
  19552. // PCMPISTRM performs "Packed Compare Implicit Length Strings, Return Mask".
  19553. //
  19554. // Mnemonic : PCMPISTRM
  19555. // Supported forms : (2 forms)
  19556. //
  19557. // * PCMPISTRM imm8, xmm, xmm [SSE4.2]
  19558. // * PCMPISTRM imm8, m128, xmm [SSE4.2]
  19559. //
  19560. func (self *Program) PCMPISTRM(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  19561. p := self.alloc("PCMPISTRM", 3, Operands { v0, v1, v2 })
  19562. // PCMPISTRM imm8, xmm, xmm
  19563. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  19564. self.require(ISA_SSE4_2)
  19565. p.domain = DomainMMXSSE
  19566. p.add(0, func(m *_Encoding, v []interface{}) {
  19567. m.emit(0x66)
  19568. m.rexo(hcode(v[2]), v[1], false)
  19569. m.emit(0x0f)
  19570. m.emit(0x3a)
  19571. m.emit(0x62)
  19572. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  19573. m.imm1(toImmAny(v[0]))
  19574. })
  19575. }
  19576. // PCMPISTRM imm8, m128, xmm
  19577. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  19578. self.require(ISA_SSE4_2)
  19579. p.domain = DomainMMXSSE
  19580. p.add(0, func(m *_Encoding, v []interface{}) {
  19581. m.emit(0x66)
  19582. m.rexo(hcode(v[2]), addr(v[1]), false)
  19583. m.emit(0x0f)
  19584. m.emit(0x3a)
  19585. m.emit(0x62)
  19586. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  19587. m.imm1(toImmAny(v[0]))
  19588. })
  19589. }
  19590. if p.len == 0 {
  19591. panic("invalid operands for PCMPISTRM")
  19592. }
  19593. return p
  19594. }
  19595. // PDEP performs "Parallel Bits Deposit".
  19596. //
  19597. // Mnemonic : PDEP
  19598. // Supported forms : (4 forms)
  19599. //
  19600. // * PDEP r32, r32, r32 [BMI2]
  19601. // * PDEP m32, r32, r32 [BMI2]
  19602. // * PDEP r64, r64, r64 [BMI2]
  19603. // * PDEP m64, r64, r64 [BMI2]
  19604. //
  19605. func (self *Program) PDEP(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  19606. p := self.alloc("PDEP", 3, Operands { v0, v1, v2 })
  19607. // PDEP r32, r32, r32
  19608. if isReg32(v0) && isReg32(v1) && isReg32(v2) {
  19609. self.require(ISA_BMI2)
  19610. p.domain = DomainGeneric
  19611. p.add(0, func(m *_Encoding, v []interface{}) {
  19612. m.emit(0xc4)
  19613. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  19614. m.emit(0x7b ^ (hlcode(v[1]) << 3))
  19615. m.emit(0xf5)
  19616. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  19617. })
  19618. }
  19619. // PDEP m32, r32, r32
  19620. if isM32(v0) && isReg32(v1) && isReg32(v2) {
  19621. self.require(ISA_BMI2)
  19622. p.domain = DomainGeneric
  19623. p.add(0, func(m *_Encoding, v []interface{}) {
  19624. m.vex3(0xc4, 0b10, 0x03, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  19625. m.emit(0xf5)
  19626. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  19627. })
  19628. }
  19629. // PDEP r64, r64, r64
  19630. if isReg64(v0) && isReg64(v1) && isReg64(v2) {
  19631. self.require(ISA_BMI2)
  19632. p.domain = DomainGeneric
  19633. p.add(0, func(m *_Encoding, v []interface{}) {
  19634. m.emit(0xc4)
  19635. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  19636. m.emit(0xfb ^ (hlcode(v[1]) << 3))
  19637. m.emit(0xf5)
  19638. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  19639. })
  19640. }
  19641. // PDEP m64, r64, r64
  19642. if isM64(v0) && isReg64(v1) && isReg64(v2) {
  19643. self.require(ISA_BMI2)
  19644. p.domain = DomainGeneric
  19645. p.add(0, func(m *_Encoding, v []interface{}) {
  19646. m.vex3(0xc4, 0b10, 0x83, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  19647. m.emit(0xf5)
  19648. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  19649. })
  19650. }
  19651. if p.len == 0 {
  19652. panic("invalid operands for PDEP")
  19653. }
  19654. return p
  19655. }
  19656. // PEXT performs "Parallel Bits Extract".
  19657. //
  19658. // Mnemonic : PEXT
  19659. // Supported forms : (4 forms)
  19660. //
  19661. // * PEXT r32, r32, r32 [BMI2]
  19662. // * PEXT m32, r32, r32 [BMI2]
  19663. // * PEXT r64, r64, r64 [BMI2]
  19664. // * PEXT m64, r64, r64 [BMI2]
  19665. //
  19666. func (self *Program) PEXT(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  19667. p := self.alloc("PEXT", 3, Operands { v0, v1, v2 })
  19668. // PEXT r32, r32, r32
  19669. if isReg32(v0) && isReg32(v1) && isReg32(v2) {
  19670. self.require(ISA_BMI2)
  19671. p.domain = DomainGeneric
  19672. p.add(0, func(m *_Encoding, v []interface{}) {
  19673. m.emit(0xc4)
  19674. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  19675. m.emit(0x7a ^ (hlcode(v[1]) << 3))
  19676. m.emit(0xf5)
  19677. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  19678. })
  19679. }
  19680. // PEXT m32, r32, r32
  19681. if isM32(v0) && isReg32(v1) && isReg32(v2) {
  19682. self.require(ISA_BMI2)
  19683. p.domain = DomainGeneric
  19684. p.add(0, func(m *_Encoding, v []interface{}) {
  19685. m.vex3(0xc4, 0b10, 0x02, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  19686. m.emit(0xf5)
  19687. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  19688. })
  19689. }
  19690. // PEXT r64, r64, r64
  19691. if isReg64(v0) && isReg64(v1) && isReg64(v2) {
  19692. self.require(ISA_BMI2)
  19693. p.domain = DomainGeneric
  19694. p.add(0, func(m *_Encoding, v []interface{}) {
  19695. m.emit(0xc4)
  19696. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  19697. m.emit(0xfa ^ (hlcode(v[1]) << 3))
  19698. m.emit(0xf5)
  19699. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  19700. })
  19701. }
  19702. // PEXT m64, r64, r64
  19703. if isM64(v0) && isReg64(v1) && isReg64(v2) {
  19704. self.require(ISA_BMI2)
  19705. p.domain = DomainGeneric
  19706. p.add(0, func(m *_Encoding, v []interface{}) {
  19707. m.vex3(0xc4, 0b10, 0x82, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  19708. m.emit(0xf5)
  19709. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  19710. })
  19711. }
  19712. if p.len == 0 {
  19713. panic("invalid operands for PEXT")
  19714. }
  19715. return p
  19716. }
  19717. // PEXTRB performs "Extract Byte".
  19718. //
  19719. // Mnemonic : PEXTRB
  19720. // Supported forms : (2 forms)
  19721. //
  19722. // * PEXTRB imm8, xmm, r32 [SSE4.1]
  19723. // * PEXTRB imm8, xmm, m8 [SSE4.1]
  19724. //
  19725. func (self *Program) PEXTRB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  19726. p := self.alloc("PEXTRB", 3, Operands { v0, v1, v2 })
  19727. // PEXTRB imm8, xmm, r32
  19728. if isImm8(v0) && isXMM(v1) && isReg32(v2) {
  19729. self.require(ISA_SSE4_1)
  19730. p.domain = DomainMMXSSE
  19731. p.add(0, func(m *_Encoding, v []interface{}) {
  19732. m.emit(0x66)
  19733. m.rexo(hcode(v[1]), v[2], false)
  19734. m.emit(0x0f)
  19735. m.emit(0x3a)
  19736. m.emit(0x14)
  19737. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  19738. m.imm1(toImmAny(v[0]))
  19739. })
  19740. }
  19741. // PEXTRB imm8, xmm, m8
  19742. if isImm8(v0) && isXMM(v1) && isM8(v2) {
  19743. self.require(ISA_SSE4_1)
  19744. p.domain = DomainMMXSSE
  19745. p.add(0, func(m *_Encoding, v []interface{}) {
  19746. m.emit(0x66)
  19747. m.rexo(hcode(v[1]), addr(v[2]), false)
  19748. m.emit(0x0f)
  19749. m.emit(0x3a)
  19750. m.emit(0x14)
  19751. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  19752. m.imm1(toImmAny(v[0]))
  19753. })
  19754. }
  19755. if p.len == 0 {
  19756. panic("invalid operands for PEXTRB")
  19757. }
  19758. return p
  19759. }
  19760. // PEXTRD performs "Extract Doubleword".
  19761. //
  19762. // Mnemonic : PEXTRD
  19763. // Supported forms : (2 forms)
  19764. //
  19765. // * PEXTRD imm8, xmm, r32 [SSE4.1]
  19766. // * PEXTRD imm8, xmm, m32 [SSE4.1]
  19767. //
  19768. func (self *Program) PEXTRD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  19769. p := self.alloc("PEXTRD", 3, Operands { v0, v1, v2 })
  19770. // PEXTRD imm8, xmm, r32
  19771. if isImm8(v0) && isXMM(v1) && isReg32(v2) {
  19772. self.require(ISA_SSE4_1)
  19773. p.domain = DomainMMXSSE
  19774. p.add(0, func(m *_Encoding, v []interface{}) {
  19775. m.emit(0x66)
  19776. m.rexo(hcode(v[1]), v[2], false)
  19777. m.emit(0x0f)
  19778. m.emit(0x3a)
  19779. m.emit(0x16)
  19780. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  19781. m.imm1(toImmAny(v[0]))
  19782. })
  19783. }
  19784. // PEXTRD imm8, xmm, m32
  19785. if isImm8(v0) && isXMM(v1) && isM32(v2) {
  19786. self.require(ISA_SSE4_1)
  19787. p.domain = DomainMMXSSE
  19788. p.add(0, func(m *_Encoding, v []interface{}) {
  19789. m.emit(0x66)
  19790. m.rexo(hcode(v[1]), addr(v[2]), false)
  19791. m.emit(0x0f)
  19792. m.emit(0x3a)
  19793. m.emit(0x16)
  19794. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  19795. m.imm1(toImmAny(v[0]))
  19796. })
  19797. }
  19798. if p.len == 0 {
  19799. panic("invalid operands for PEXTRD")
  19800. }
  19801. return p
  19802. }
  19803. // PEXTRQ performs "Extract Quadword".
  19804. //
  19805. // Mnemonic : PEXTRQ
  19806. // Supported forms : (2 forms)
  19807. //
  19808. // * PEXTRQ imm8, xmm, r64 [SSE4.1]
  19809. // * PEXTRQ imm8, xmm, m64 [SSE4.1]
  19810. //
  19811. func (self *Program) PEXTRQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  19812. p := self.alloc("PEXTRQ", 3, Operands { v0, v1, v2 })
  19813. // PEXTRQ imm8, xmm, r64
  19814. if isImm8(v0) && isXMM(v1) && isReg64(v2) {
  19815. self.require(ISA_SSE4_1)
  19816. p.domain = DomainMMXSSE
  19817. p.add(0, func(m *_Encoding, v []interface{}) {
  19818. m.emit(0x66)
  19819. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[2]))
  19820. m.emit(0x0f)
  19821. m.emit(0x3a)
  19822. m.emit(0x16)
  19823. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  19824. m.imm1(toImmAny(v[0]))
  19825. })
  19826. }
  19827. // PEXTRQ imm8, xmm, m64
  19828. if isImm8(v0) && isXMM(v1) && isM64(v2) {
  19829. self.require(ISA_SSE4_1)
  19830. p.domain = DomainMMXSSE
  19831. p.add(0, func(m *_Encoding, v []interface{}) {
  19832. m.emit(0x66)
  19833. m.rexm(1, hcode(v[1]), addr(v[2]))
  19834. m.emit(0x0f)
  19835. m.emit(0x3a)
  19836. m.emit(0x16)
  19837. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  19838. m.imm1(toImmAny(v[0]))
  19839. })
  19840. }
  19841. if p.len == 0 {
  19842. panic("invalid operands for PEXTRQ")
  19843. }
  19844. return p
  19845. }
  19846. // PEXTRW performs "Extract Word".
  19847. //
  19848. // Mnemonic : PEXTRW
  19849. // Supported forms : (3 forms)
  19850. //
  19851. // * PEXTRW imm8, mm, r32 [MMX+]
  19852. // * PEXTRW imm8, xmm, r32 [SSE4.1]
  19853. // * PEXTRW imm8, xmm, m16 [SSE4.1]
  19854. //
  19855. func (self *Program) PEXTRW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  19856. p := self.alloc("PEXTRW", 3, Operands { v0, v1, v2 })
  19857. // PEXTRW imm8, mm, r32
  19858. if isImm8(v0) && isMM(v1) && isReg32(v2) {
  19859. self.require(ISA_MMX_PLUS)
  19860. p.domain = DomainMMXSSE
  19861. p.add(0, func(m *_Encoding, v []interface{}) {
  19862. m.rexo(hcode(v[2]), v[1], false)
  19863. m.emit(0x0f)
  19864. m.emit(0xc5)
  19865. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  19866. m.imm1(toImmAny(v[0]))
  19867. })
  19868. }
  19869. // PEXTRW imm8, xmm, r32
  19870. if isImm8(v0) && isXMM(v1) && isReg32(v2) {
  19871. self.require(ISA_SSE4_1)
  19872. p.domain = DomainMMXSSE
  19873. p.add(0, func(m *_Encoding, v []interface{}) {
  19874. m.emit(0x66)
  19875. m.rexo(hcode(v[1]), v[2], false)
  19876. m.emit(0x0f)
  19877. m.emit(0x3a)
  19878. m.emit(0x15)
  19879. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  19880. m.imm1(toImmAny(v[0]))
  19881. })
  19882. p.add(0, func(m *_Encoding, v []interface{}) {
  19883. m.emit(0x66)
  19884. m.rexo(hcode(v[2]), v[1], false)
  19885. m.emit(0x0f)
  19886. m.emit(0xc5)
  19887. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  19888. m.imm1(toImmAny(v[0]))
  19889. })
  19890. }
  19891. // PEXTRW imm8, xmm, m16
  19892. if isImm8(v0) && isXMM(v1) && isM16(v2) {
  19893. self.require(ISA_SSE4_1)
  19894. p.domain = DomainMMXSSE
  19895. p.add(0, func(m *_Encoding, v []interface{}) {
  19896. m.emit(0x66)
  19897. m.rexo(hcode(v[1]), addr(v[2]), false)
  19898. m.emit(0x0f)
  19899. m.emit(0x3a)
  19900. m.emit(0x15)
  19901. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  19902. m.imm1(toImmAny(v[0]))
  19903. })
  19904. }
  19905. if p.len == 0 {
  19906. panic("invalid operands for PEXTRW")
  19907. }
  19908. return p
  19909. }
  19910. // PF2ID performs "Packed Floating-Point to Integer Doubleword Converson".
  19911. //
  19912. // Mnemonic : PF2ID
  19913. // Supported forms : (2 forms)
  19914. //
  19915. // * PF2ID mm, mm [3dnow!]
  19916. // * PF2ID m64, mm [3dnow!]
  19917. //
  19918. func (self *Program) PF2ID(v0 interface{}, v1 interface{}) *Instruction {
  19919. p := self.alloc("PF2ID", 2, Operands { v0, v1 })
  19920. // PF2ID mm, mm
  19921. if isMM(v0) && isMM(v1) {
  19922. self.require(ISA_3DNOW)
  19923. p.domain = DomainAMDSpecific
  19924. p.add(0, func(m *_Encoding, v []interface{}) {
  19925. m.rexo(hcode(v[1]), v[0], false)
  19926. m.emit(0x0f)
  19927. m.emit(0x0f)
  19928. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  19929. m.emit(0x1d)
  19930. })
  19931. }
  19932. // PF2ID m64, mm
  19933. if isM64(v0) && isMM(v1) {
  19934. self.require(ISA_3DNOW)
  19935. p.domain = DomainAMDSpecific
  19936. p.add(0, func(m *_Encoding, v []interface{}) {
  19937. m.rexo(hcode(v[1]), addr(v[0]), false)
  19938. m.emit(0x0f)
  19939. m.emit(0x0f)
  19940. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  19941. m.emit(0x1d)
  19942. })
  19943. }
  19944. if p.len == 0 {
  19945. panic("invalid operands for PF2ID")
  19946. }
  19947. return p
  19948. }
  19949. // PF2IW performs "Packed Floating-Point to Integer Word Conversion".
  19950. //
  19951. // Mnemonic : PF2IW
  19952. // Supported forms : (2 forms)
  19953. //
  19954. // * PF2IW mm, mm [3dnow!+]
  19955. // * PF2IW m64, mm [3dnow!+]
  19956. //
  19957. func (self *Program) PF2IW(v0 interface{}, v1 interface{}) *Instruction {
  19958. p := self.alloc("PF2IW", 2, Operands { v0, v1 })
  19959. // PF2IW mm, mm
  19960. if isMM(v0) && isMM(v1) {
  19961. self.require(ISA_3DNOW_PLUS)
  19962. p.domain = DomainAMDSpecific
  19963. p.add(0, func(m *_Encoding, v []interface{}) {
  19964. m.rexo(hcode(v[1]), v[0], false)
  19965. m.emit(0x0f)
  19966. m.emit(0x0f)
  19967. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  19968. m.emit(0x1c)
  19969. })
  19970. }
  19971. // PF2IW m64, mm
  19972. if isM64(v0) && isMM(v1) {
  19973. self.require(ISA_3DNOW_PLUS)
  19974. p.domain = DomainAMDSpecific
  19975. p.add(0, func(m *_Encoding, v []interface{}) {
  19976. m.rexo(hcode(v[1]), addr(v[0]), false)
  19977. m.emit(0x0f)
  19978. m.emit(0x0f)
  19979. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  19980. m.emit(0x1c)
  19981. })
  19982. }
  19983. if p.len == 0 {
  19984. panic("invalid operands for PF2IW")
  19985. }
  19986. return p
  19987. }
  19988. // PFACC performs "Packed Floating-Point Accumulate".
  19989. //
  19990. // Mnemonic : PFACC
  19991. // Supported forms : (2 forms)
  19992. //
  19993. // * PFACC mm, mm [3dnow!]
  19994. // * PFACC m64, mm [3dnow!]
  19995. //
  19996. func (self *Program) PFACC(v0 interface{}, v1 interface{}) *Instruction {
  19997. p := self.alloc("PFACC", 2, Operands { v0, v1 })
  19998. // PFACC mm, mm
  19999. if isMM(v0) && isMM(v1) {
  20000. self.require(ISA_3DNOW)
  20001. p.domain = DomainAMDSpecific
  20002. p.add(0, func(m *_Encoding, v []interface{}) {
  20003. m.rexo(hcode(v[1]), v[0], false)
  20004. m.emit(0x0f)
  20005. m.emit(0x0f)
  20006. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20007. m.emit(0xae)
  20008. })
  20009. }
  20010. // PFACC m64, mm
  20011. if isM64(v0) && isMM(v1) {
  20012. self.require(ISA_3DNOW)
  20013. p.domain = DomainAMDSpecific
  20014. p.add(0, func(m *_Encoding, v []interface{}) {
  20015. m.rexo(hcode(v[1]), addr(v[0]), false)
  20016. m.emit(0x0f)
  20017. m.emit(0x0f)
  20018. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20019. m.emit(0xae)
  20020. })
  20021. }
  20022. if p.len == 0 {
  20023. panic("invalid operands for PFACC")
  20024. }
  20025. return p
  20026. }
  20027. // PFADD performs "Packed Floating-Point Add".
  20028. //
  20029. // Mnemonic : PFADD
  20030. // Supported forms : (2 forms)
  20031. //
  20032. // * PFADD mm, mm [3dnow!]
  20033. // * PFADD m64, mm [3dnow!]
  20034. //
  20035. func (self *Program) PFADD(v0 interface{}, v1 interface{}) *Instruction {
  20036. p := self.alloc("PFADD", 2, Operands { v0, v1 })
  20037. // PFADD mm, mm
  20038. if isMM(v0) && isMM(v1) {
  20039. self.require(ISA_3DNOW)
  20040. p.domain = DomainAMDSpecific
  20041. p.add(0, func(m *_Encoding, v []interface{}) {
  20042. m.rexo(hcode(v[1]), v[0], false)
  20043. m.emit(0x0f)
  20044. m.emit(0x0f)
  20045. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20046. m.emit(0x9e)
  20047. })
  20048. }
  20049. // PFADD m64, mm
  20050. if isM64(v0) && isMM(v1) {
  20051. self.require(ISA_3DNOW)
  20052. p.domain = DomainAMDSpecific
  20053. p.add(0, func(m *_Encoding, v []interface{}) {
  20054. m.rexo(hcode(v[1]), addr(v[0]), false)
  20055. m.emit(0x0f)
  20056. m.emit(0x0f)
  20057. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20058. m.emit(0x9e)
  20059. })
  20060. }
  20061. if p.len == 0 {
  20062. panic("invalid operands for PFADD")
  20063. }
  20064. return p
  20065. }
  20066. // PFCMPEQ performs "Packed Floating-Point Compare for Equal".
  20067. //
  20068. // Mnemonic : PFCMPEQ
  20069. // Supported forms : (2 forms)
  20070. //
  20071. // * PFCMPEQ mm, mm [3dnow!]
  20072. // * PFCMPEQ m64, mm [3dnow!]
  20073. //
  20074. func (self *Program) PFCMPEQ(v0 interface{}, v1 interface{}) *Instruction {
  20075. p := self.alloc("PFCMPEQ", 2, Operands { v0, v1 })
  20076. // PFCMPEQ mm, mm
  20077. if isMM(v0) && isMM(v1) {
  20078. self.require(ISA_3DNOW)
  20079. p.domain = DomainAMDSpecific
  20080. p.add(0, func(m *_Encoding, v []interface{}) {
  20081. m.rexo(hcode(v[1]), v[0], false)
  20082. m.emit(0x0f)
  20083. m.emit(0x0f)
  20084. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20085. m.emit(0xb0)
  20086. })
  20087. }
  20088. // PFCMPEQ m64, mm
  20089. if isM64(v0) && isMM(v1) {
  20090. self.require(ISA_3DNOW)
  20091. p.domain = DomainAMDSpecific
  20092. p.add(0, func(m *_Encoding, v []interface{}) {
  20093. m.rexo(hcode(v[1]), addr(v[0]), false)
  20094. m.emit(0x0f)
  20095. m.emit(0x0f)
  20096. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20097. m.emit(0xb0)
  20098. })
  20099. }
  20100. if p.len == 0 {
  20101. panic("invalid operands for PFCMPEQ")
  20102. }
  20103. return p
  20104. }
  20105. // PFCMPGE performs "Packed Floating-Point Compare for Greater or Equal".
  20106. //
  20107. // Mnemonic : PFCMPGE
  20108. // Supported forms : (2 forms)
  20109. //
  20110. // * PFCMPGE mm, mm [3dnow!]
  20111. // * PFCMPGE m64, mm [3dnow!]
  20112. //
  20113. func (self *Program) PFCMPGE(v0 interface{}, v1 interface{}) *Instruction {
  20114. p := self.alloc("PFCMPGE", 2, Operands { v0, v1 })
  20115. // PFCMPGE mm, mm
  20116. if isMM(v0) && isMM(v1) {
  20117. self.require(ISA_3DNOW)
  20118. p.domain = DomainAMDSpecific
  20119. p.add(0, func(m *_Encoding, v []interface{}) {
  20120. m.rexo(hcode(v[1]), v[0], false)
  20121. m.emit(0x0f)
  20122. m.emit(0x0f)
  20123. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20124. m.emit(0x90)
  20125. })
  20126. }
  20127. // PFCMPGE m64, mm
  20128. if isM64(v0) && isMM(v1) {
  20129. self.require(ISA_3DNOW)
  20130. p.domain = DomainAMDSpecific
  20131. p.add(0, func(m *_Encoding, v []interface{}) {
  20132. m.rexo(hcode(v[1]), addr(v[0]), false)
  20133. m.emit(0x0f)
  20134. m.emit(0x0f)
  20135. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20136. m.emit(0x90)
  20137. })
  20138. }
  20139. if p.len == 0 {
  20140. panic("invalid operands for PFCMPGE")
  20141. }
  20142. return p
  20143. }
  20144. // PFCMPGT performs "Packed Floating-Point Compare for Greater Than".
  20145. //
  20146. // Mnemonic : PFCMPGT
  20147. // Supported forms : (2 forms)
  20148. //
  20149. // * PFCMPGT mm, mm [3dnow!]
  20150. // * PFCMPGT m64, mm [3dnow!]
  20151. //
  20152. func (self *Program) PFCMPGT(v0 interface{}, v1 interface{}) *Instruction {
  20153. p := self.alloc("PFCMPGT", 2, Operands { v0, v1 })
  20154. // PFCMPGT mm, mm
  20155. if isMM(v0) && isMM(v1) {
  20156. self.require(ISA_3DNOW)
  20157. p.domain = DomainAMDSpecific
  20158. p.add(0, func(m *_Encoding, v []interface{}) {
  20159. m.rexo(hcode(v[1]), v[0], false)
  20160. m.emit(0x0f)
  20161. m.emit(0x0f)
  20162. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20163. m.emit(0xa0)
  20164. })
  20165. }
  20166. // PFCMPGT m64, mm
  20167. if isM64(v0) && isMM(v1) {
  20168. self.require(ISA_3DNOW)
  20169. p.domain = DomainAMDSpecific
  20170. p.add(0, func(m *_Encoding, v []interface{}) {
  20171. m.rexo(hcode(v[1]), addr(v[0]), false)
  20172. m.emit(0x0f)
  20173. m.emit(0x0f)
  20174. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20175. m.emit(0xa0)
  20176. })
  20177. }
  20178. if p.len == 0 {
  20179. panic("invalid operands for PFCMPGT")
  20180. }
  20181. return p
  20182. }
  20183. // PFMAX performs "Packed Floating-Point Maximum".
  20184. //
  20185. // Mnemonic : PFMAX
  20186. // Supported forms : (2 forms)
  20187. //
  20188. // * PFMAX mm, mm [3dnow!]
  20189. // * PFMAX m64, mm [3dnow!]
  20190. //
  20191. func (self *Program) PFMAX(v0 interface{}, v1 interface{}) *Instruction {
  20192. p := self.alloc("PFMAX", 2, Operands { v0, v1 })
  20193. // PFMAX mm, mm
  20194. if isMM(v0) && isMM(v1) {
  20195. self.require(ISA_3DNOW)
  20196. p.domain = DomainAMDSpecific
  20197. p.add(0, func(m *_Encoding, v []interface{}) {
  20198. m.rexo(hcode(v[1]), v[0], false)
  20199. m.emit(0x0f)
  20200. m.emit(0x0f)
  20201. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20202. m.emit(0xa4)
  20203. })
  20204. }
  20205. // PFMAX m64, mm
  20206. if isM64(v0) && isMM(v1) {
  20207. self.require(ISA_3DNOW)
  20208. p.domain = DomainAMDSpecific
  20209. p.add(0, func(m *_Encoding, v []interface{}) {
  20210. m.rexo(hcode(v[1]), addr(v[0]), false)
  20211. m.emit(0x0f)
  20212. m.emit(0x0f)
  20213. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20214. m.emit(0xa4)
  20215. })
  20216. }
  20217. if p.len == 0 {
  20218. panic("invalid operands for PFMAX")
  20219. }
  20220. return p
  20221. }
  20222. // PFMIN performs "Packed Floating-Point Minimum".
  20223. //
  20224. // Mnemonic : PFMIN
  20225. // Supported forms : (2 forms)
  20226. //
  20227. // * PFMIN mm, mm [3dnow!]
  20228. // * PFMIN m64, mm [3dnow!]
  20229. //
  20230. func (self *Program) PFMIN(v0 interface{}, v1 interface{}) *Instruction {
  20231. p := self.alloc("PFMIN", 2, Operands { v0, v1 })
  20232. // PFMIN mm, mm
  20233. if isMM(v0) && isMM(v1) {
  20234. self.require(ISA_3DNOW)
  20235. p.domain = DomainAMDSpecific
  20236. p.add(0, func(m *_Encoding, v []interface{}) {
  20237. m.rexo(hcode(v[1]), v[0], false)
  20238. m.emit(0x0f)
  20239. m.emit(0x0f)
  20240. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20241. m.emit(0x94)
  20242. })
  20243. }
  20244. // PFMIN m64, mm
  20245. if isM64(v0) && isMM(v1) {
  20246. self.require(ISA_3DNOW)
  20247. p.domain = DomainAMDSpecific
  20248. p.add(0, func(m *_Encoding, v []interface{}) {
  20249. m.rexo(hcode(v[1]), addr(v[0]), false)
  20250. m.emit(0x0f)
  20251. m.emit(0x0f)
  20252. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20253. m.emit(0x94)
  20254. })
  20255. }
  20256. if p.len == 0 {
  20257. panic("invalid operands for PFMIN")
  20258. }
  20259. return p
  20260. }
  20261. // PFMUL performs "Packed Floating-Point Multiply".
  20262. //
  20263. // Mnemonic : PFMUL
  20264. // Supported forms : (2 forms)
  20265. //
  20266. // * PFMUL mm, mm [3dnow!]
  20267. // * PFMUL m64, mm [3dnow!]
  20268. //
  20269. func (self *Program) PFMUL(v0 interface{}, v1 interface{}) *Instruction {
  20270. p := self.alloc("PFMUL", 2, Operands { v0, v1 })
  20271. // PFMUL mm, mm
  20272. if isMM(v0) && isMM(v1) {
  20273. self.require(ISA_3DNOW)
  20274. p.domain = DomainAMDSpecific
  20275. p.add(0, func(m *_Encoding, v []interface{}) {
  20276. m.rexo(hcode(v[1]), v[0], false)
  20277. m.emit(0x0f)
  20278. m.emit(0x0f)
  20279. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20280. m.emit(0xb4)
  20281. })
  20282. }
  20283. // PFMUL m64, mm
  20284. if isM64(v0) && isMM(v1) {
  20285. self.require(ISA_3DNOW)
  20286. p.domain = DomainAMDSpecific
  20287. p.add(0, func(m *_Encoding, v []interface{}) {
  20288. m.rexo(hcode(v[1]), addr(v[0]), false)
  20289. m.emit(0x0f)
  20290. m.emit(0x0f)
  20291. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20292. m.emit(0xb4)
  20293. })
  20294. }
  20295. if p.len == 0 {
  20296. panic("invalid operands for PFMUL")
  20297. }
  20298. return p
  20299. }
  20300. // PFNACC performs "Packed Floating-Point Negative Accumulate".
  20301. //
  20302. // Mnemonic : PFNACC
  20303. // Supported forms : (2 forms)
  20304. //
  20305. // * PFNACC mm, mm [3dnow!+]
  20306. // * PFNACC m64, mm [3dnow!+]
  20307. //
  20308. func (self *Program) PFNACC(v0 interface{}, v1 interface{}) *Instruction {
  20309. p := self.alloc("PFNACC", 2, Operands { v0, v1 })
  20310. // PFNACC mm, mm
  20311. if isMM(v0) && isMM(v1) {
  20312. self.require(ISA_3DNOW_PLUS)
  20313. p.domain = DomainAMDSpecific
  20314. p.add(0, func(m *_Encoding, v []interface{}) {
  20315. m.rexo(hcode(v[1]), v[0], false)
  20316. m.emit(0x0f)
  20317. m.emit(0x0f)
  20318. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20319. m.emit(0x8a)
  20320. })
  20321. }
  20322. // PFNACC m64, mm
  20323. if isM64(v0) && isMM(v1) {
  20324. self.require(ISA_3DNOW_PLUS)
  20325. p.domain = DomainAMDSpecific
  20326. p.add(0, func(m *_Encoding, v []interface{}) {
  20327. m.rexo(hcode(v[1]), addr(v[0]), false)
  20328. m.emit(0x0f)
  20329. m.emit(0x0f)
  20330. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20331. m.emit(0x8a)
  20332. })
  20333. }
  20334. if p.len == 0 {
  20335. panic("invalid operands for PFNACC")
  20336. }
  20337. return p
  20338. }
  20339. // PFPNACC performs "Packed Floating-Point Positive-Negative Accumulate".
  20340. //
  20341. // Mnemonic : PFPNACC
  20342. // Supported forms : (2 forms)
  20343. //
  20344. // * PFPNACC mm, mm [3dnow!+]
  20345. // * PFPNACC m64, mm [3dnow!+]
  20346. //
  20347. func (self *Program) PFPNACC(v0 interface{}, v1 interface{}) *Instruction {
  20348. p := self.alloc("PFPNACC", 2, Operands { v0, v1 })
  20349. // PFPNACC mm, mm
  20350. if isMM(v0) && isMM(v1) {
  20351. self.require(ISA_3DNOW_PLUS)
  20352. p.domain = DomainAMDSpecific
  20353. p.add(0, func(m *_Encoding, v []interface{}) {
  20354. m.rexo(hcode(v[1]), v[0], false)
  20355. m.emit(0x0f)
  20356. m.emit(0x0f)
  20357. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20358. m.emit(0x8e)
  20359. })
  20360. }
  20361. // PFPNACC m64, mm
  20362. if isM64(v0) && isMM(v1) {
  20363. self.require(ISA_3DNOW_PLUS)
  20364. p.domain = DomainAMDSpecific
  20365. p.add(0, func(m *_Encoding, v []interface{}) {
  20366. m.rexo(hcode(v[1]), addr(v[0]), false)
  20367. m.emit(0x0f)
  20368. m.emit(0x0f)
  20369. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20370. m.emit(0x8e)
  20371. })
  20372. }
  20373. if p.len == 0 {
  20374. panic("invalid operands for PFPNACC")
  20375. }
  20376. return p
  20377. }
  20378. // PFRCP performs "Packed Floating-Point Reciprocal Approximation".
  20379. //
  20380. // Mnemonic : PFRCP
  20381. // Supported forms : (2 forms)
  20382. //
  20383. // * PFRCP mm, mm [3dnow!]
  20384. // * PFRCP m64, mm [3dnow!]
  20385. //
  20386. func (self *Program) PFRCP(v0 interface{}, v1 interface{}) *Instruction {
  20387. p := self.alloc("PFRCP", 2, Operands { v0, v1 })
  20388. // PFRCP mm, mm
  20389. if isMM(v0) && isMM(v1) {
  20390. self.require(ISA_3DNOW)
  20391. p.domain = DomainAMDSpecific
  20392. p.add(0, func(m *_Encoding, v []interface{}) {
  20393. m.rexo(hcode(v[1]), v[0], false)
  20394. m.emit(0x0f)
  20395. m.emit(0x0f)
  20396. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20397. m.emit(0x96)
  20398. })
  20399. }
  20400. // PFRCP m64, mm
  20401. if isM64(v0) && isMM(v1) {
  20402. self.require(ISA_3DNOW)
  20403. p.domain = DomainAMDSpecific
  20404. p.add(0, func(m *_Encoding, v []interface{}) {
  20405. m.rexo(hcode(v[1]), addr(v[0]), false)
  20406. m.emit(0x0f)
  20407. m.emit(0x0f)
  20408. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20409. m.emit(0x96)
  20410. })
  20411. }
  20412. if p.len == 0 {
  20413. panic("invalid operands for PFRCP")
  20414. }
  20415. return p
  20416. }
  20417. // PFRCPIT1 performs "Packed Floating-Point Reciprocal Iteration 1".
  20418. //
  20419. // Mnemonic : PFRCPIT1
  20420. // Supported forms : (2 forms)
  20421. //
  20422. // * PFRCPIT1 mm, mm [3dnow!]
  20423. // * PFRCPIT1 m64, mm [3dnow!]
  20424. //
  20425. func (self *Program) PFRCPIT1(v0 interface{}, v1 interface{}) *Instruction {
  20426. p := self.alloc("PFRCPIT1", 2, Operands { v0, v1 })
  20427. // PFRCPIT1 mm, mm
  20428. if isMM(v0) && isMM(v1) {
  20429. self.require(ISA_3DNOW)
  20430. p.domain = DomainAMDSpecific
  20431. p.add(0, func(m *_Encoding, v []interface{}) {
  20432. m.rexo(hcode(v[1]), v[0], false)
  20433. m.emit(0x0f)
  20434. m.emit(0x0f)
  20435. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20436. m.emit(0xa6)
  20437. })
  20438. }
  20439. // PFRCPIT1 m64, mm
  20440. if isM64(v0) && isMM(v1) {
  20441. self.require(ISA_3DNOW)
  20442. p.domain = DomainAMDSpecific
  20443. p.add(0, func(m *_Encoding, v []interface{}) {
  20444. m.rexo(hcode(v[1]), addr(v[0]), false)
  20445. m.emit(0x0f)
  20446. m.emit(0x0f)
  20447. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20448. m.emit(0xa6)
  20449. })
  20450. }
  20451. if p.len == 0 {
  20452. panic("invalid operands for PFRCPIT1")
  20453. }
  20454. return p
  20455. }
  20456. // PFRCPIT2 performs "Packed Floating-Point Reciprocal Iteration 2".
  20457. //
  20458. // Mnemonic : PFRCPIT2
  20459. // Supported forms : (2 forms)
  20460. //
  20461. // * PFRCPIT2 mm, mm [3dnow!]
  20462. // * PFRCPIT2 m64, mm [3dnow!]
  20463. //
  20464. func (self *Program) PFRCPIT2(v0 interface{}, v1 interface{}) *Instruction {
  20465. p := self.alloc("PFRCPIT2", 2, Operands { v0, v1 })
  20466. // PFRCPIT2 mm, mm
  20467. if isMM(v0) && isMM(v1) {
  20468. self.require(ISA_3DNOW)
  20469. p.domain = DomainAMDSpecific
  20470. p.add(0, func(m *_Encoding, v []interface{}) {
  20471. m.rexo(hcode(v[1]), v[0], false)
  20472. m.emit(0x0f)
  20473. m.emit(0x0f)
  20474. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20475. m.emit(0xb6)
  20476. })
  20477. }
  20478. // PFRCPIT2 m64, mm
  20479. if isM64(v0) && isMM(v1) {
  20480. self.require(ISA_3DNOW)
  20481. p.domain = DomainAMDSpecific
  20482. p.add(0, func(m *_Encoding, v []interface{}) {
  20483. m.rexo(hcode(v[1]), addr(v[0]), false)
  20484. m.emit(0x0f)
  20485. m.emit(0x0f)
  20486. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20487. m.emit(0xb6)
  20488. })
  20489. }
  20490. if p.len == 0 {
  20491. panic("invalid operands for PFRCPIT2")
  20492. }
  20493. return p
  20494. }
  20495. // PFRSQIT1 performs "Packed Floating-Point Reciprocal Square Root Iteration 1".
  20496. //
  20497. // Mnemonic : PFRSQIT1
  20498. // Supported forms : (2 forms)
  20499. //
  20500. // * PFRSQIT1 mm, mm [3dnow!]
  20501. // * PFRSQIT1 m64, mm [3dnow!]
  20502. //
  20503. func (self *Program) PFRSQIT1(v0 interface{}, v1 interface{}) *Instruction {
  20504. p := self.alloc("PFRSQIT1", 2, Operands { v0, v1 })
  20505. // PFRSQIT1 mm, mm
  20506. if isMM(v0) && isMM(v1) {
  20507. self.require(ISA_3DNOW)
  20508. p.domain = DomainAMDSpecific
  20509. p.add(0, func(m *_Encoding, v []interface{}) {
  20510. m.rexo(hcode(v[1]), v[0], false)
  20511. m.emit(0x0f)
  20512. m.emit(0x0f)
  20513. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20514. m.emit(0xa7)
  20515. })
  20516. }
  20517. // PFRSQIT1 m64, mm
  20518. if isM64(v0) && isMM(v1) {
  20519. self.require(ISA_3DNOW)
  20520. p.domain = DomainAMDSpecific
  20521. p.add(0, func(m *_Encoding, v []interface{}) {
  20522. m.rexo(hcode(v[1]), addr(v[0]), false)
  20523. m.emit(0x0f)
  20524. m.emit(0x0f)
  20525. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20526. m.emit(0xa7)
  20527. })
  20528. }
  20529. if p.len == 0 {
  20530. panic("invalid operands for PFRSQIT1")
  20531. }
  20532. return p
  20533. }
  20534. // PFRSQRT performs "Packed Floating-Point Reciprocal Square Root Approximation".
  20535. //
  20536. // Mnemonic : PFRSQRT
  20537. // Supported forms : (2 forms)
  20538. //
  20539. // * PFRSQRT mm, mm [3dnow!]
  20540. // * PFRSQRT m64, mm [3dnow!]
  20541. //
  20542. func (self *Program) PFRSQRT(v0 interface{}, v1 interface{}) *Instruction {
  20543. p := self.alloc("PFRSQRT", 2, Operands { v0, v1 })
  20544. // PFRSQRT mm, mm
  20545. if isMM(v0) && isMM(v1) {
  20546. self.require(ISA_3DNOW)
  20547. p.domain = DomainAMDSpecific
  20548. p.add(0, func(m *_Encoding, v []interface{}) {
  20549. m.rexo(hcode(v[1]), v[0], false)
  20550. m.emit(0x0f)
  20551. m.emit(0x0f)
  20552. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20553. m.emit(0x97)
  20554. })
  20555. }
  20556. // PFRSQRT m64, mm
  20557. if isM64(v0) && isMM(v1) {
  20558. self.require(ISA_3DNOW)
  20559. p.domain = DomainAMDSpecific
  20560. p.add(0, func(m *_Encoding, v []interface{}) {
  20561. m.rexo(hcode(v[1]), addr(v[0]), false)
  20562. m.emit(0x0f)
  20563. m.emit(0x0f)
  20564. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20565. m.emit(0x97)
  20566. })
  20567. }
  20568. if p.len == 0 {
  20569. panic("invalid operands for PFRSQRT")
  20570. }
  20571. return p
  20572. }
  20573. // PFSUB performs "Packed Floating-Point Subtract".
  20574. //
  20575. // Mnemonic : PFSUB
  20576. // Supported forms : (2 forms)
  20577. //
  20578. // * PFSUB mm, mm [3dnow!]
  20579. // * PFSUB m64, mm [3dnow!]
  20580. //
  20581. func (self *Program) PFSUB(v0 interface{}, v1 interface{}) *Instruction {
  20582. p := self.alloc("PFSUB", 2, Operands { v0, v1 })
  20583. // PFSUB mm, mm
  20584. if isMM(v0) && isMM(v1) {
  20585. self.require(ISA_3DNOW)
  20586. p.domain = DomainAMDSpecific
  20587. p.add(0, func(m *_Encoding, v []interface{}) {
  20588. m.rexo(hcode(v[1]), v[0], false)
  20589. m.emit(0x0f)
  20590. m.emit(0x0f)
  20591. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20592. m.emit(0x9a)
  20593. })
  20594. }
  20595. // PFSUB m64, mm
  20596. if isM64(v0) && isMM(v1) {
  20597. self.require(ISA_3DNOW)
  20598. p.domain = DomainAMDSpecific
  20599. p.add(0, func(m *_Encoding, v []interface{}) {
  20600. m.rexo(hcode(v[1]), addr(v[0]), false)
  20601. m.emit(0x0f)
  20602. m.emit(0x0f)
  20603. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20604. m.emit(0x9a)
  20605. })
  20606. }
  20607. if p.len == 0 {
  20608. panic("invalid operands for PFSUB")
  20609. }
  20610. return p
  20611. }
  20612. // PFSUBR performs "Packed Floating-Point Subtract Reverse".
  20613. //
  20614. // Mnemonic : PFSUBR
  20615. // Supported forms : (2 forms)
  20616. //
  20617. // * PFSUBR mm, mm [3dnow!]
  20618. // * PFSUBR m64, mm [3dnow!]
  20619. //
  20620. func (self *Program) PFSUBR(v0 interface{}, v1 interface{}) *Instruction {
  20621. p := self.alloc("PFSUBR", 2, Operands { v0, v1 })
  20622. // PFSUBR mm, mm
  20623. if isMM(v0) && isMM(v1) {
  20624. self.require(ISA_3DNOW)
  20625. p.domain = DomainAMDSpecific
  20626. p.add(0, func(m *_Encoding, v []interface{}) {
  20627. m.rexo(hcode(v[1]), v[0], false)
  20628. m.emit(0x0f)
  20629. m.emit(0x0f)
  20630. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20631. m.emit(0xaa)
  20632. })
  20633. }
  20634. // PFSUBR m64, mm
  20635. if isM64(v0) && isMM(v1) {
  20636. self.require(ISA_3DNOW)
  20637. p.domain = DomainAMDSpecific
  20638. p.add(0, func(m *_Encoding, v []interface{}) {
  20639. m.rexo(hcode(v[1]), addr(v[0]), false)
  20640. m.emit(0x0f)
  20641. m.emit(0x0f)
  20642. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20643. m.emit(0xaa)
  20644. })
  20645. }
  20646. if p.len == 0 {
  20647. panic("invalid operands for PFSUBR")
  20648. }
  20649. return p
  20650. }
  20651. // PHADDD performs "Packed Horizontal Add Doubleword Integer".
  20652. //
  20653. // Mnemonic : PHADDD
  20654. // Supported forms : (4 forms)
  20655. //
  20656. // * PHADDD mm, mm [SSSE3]
  20657. // * PHADDD m64, mm [SSSE3]
  20658. // * PHADDD xmm, xmm [SSSE3]
  20659. // * PHADDD m128, xmm [SSSE3]
  20660. //
  20661. func (self *Program) PHADDD(v0 interface{}, v1 interface{}) *Instruction {
  20662. p := self.alloc("PHADDD", 2, Operands { v0, v1 })
  20663. // PHADDD mm, mm
  20664. if isMM(v0) && isMM(v1) {
  20665. self.require(ISA_SSSE3)
  20666. p.domain = DomainMMXSSE
  20667. p.add(0, func(m *_Encoding, v []interface{}) {
  20668. m.rexo(hcode(v[1]), v[0], false)
  20669. m.emit(0x0f)
  20670. m.emit(0x38)
  20671. m.emit(0x02)
  20672. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20673. })
  20674. }
  20675. // PHADDD m64, mm
  20676. if isM64(v0) && isMM(v1) {
  20677. self.require(ISA_SSSE3)
  20678. p.domain = DomainMMXSSE
  20679. p.add(0, func(m *_Encoding, v []interface{}) {
  20680. m.rexo(hcode(v[1]), addr(v[0]), false)
  20681. m.emit(0x0f)
  20682. m.emit(0x38)
  20683. m.emit(0x02)
  20684. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20685. })
  20686. }
  20687. // PHADDD xmm, xmm
  20688. if isXMM(v0) && isXMM(v1) {
  20689. self.require(ISA_SSSE3)
  20690. p.domain = DomainMMXSSE
  20691. p.add(0, func(m *_Encoding, v []interface{}) {
  20692. m.emit(0x66)
  20693. m.rexo(hcode(v[1]), v[0], false)
  20694. m.emit(0x0f)
  20695. m.emit(0x38)
  20696. m.emit(0x02)
  20697. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20698. })
  20699. }
  20700. // PHADDD m128, xmm
  20701. if isM128(v0) && isXMM(v1) {
  20702. self.require(ISA_SSSE3)
  20703. p.domain = DomainMMXSSE
  20704. p.add(0, func(m *_Encoding, v []interface{}) {
  20705. m.emit(0x66)
  20706. m.rexo(hcode(v[1]), addr(v[0]), false)
  20707. m.emit(0x0f)
  20708. m.emit(0x38)
  20709. m.emit(0x02)
  20710. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20711. })
  20712. }
  20713. if p.len == 0 {
  20714. panic("invalid operands for PHADDD")
  20715. }
  20716. return p
  20717. }
  20718. // PHADDSW performs "Packed Horizontal Add Signed Word Integers with Signed Saturation".
  20719. //
  20720. // Mnemonic : PHADDSW
  20721. // Supported forms : (4 forms)
  20722. //
  20723. // * PHADDSW mm, mm [SSSE3]
  20724. // * PHADDSW m64, mm [SSSE3]
  20725. // * PHADDSW xmm, xmm [SSSE3]
  20726. // * PHADDSW m128, xmm [SSSE3]
  20727. //
  20728. func (self *Program) PHADDSW(v0 interface{}, v1 interface{}) *Instruction {
  20729. p := self.alloc("PHADDSW", 2, Operands { v0, v1 })
  20730. // PHADDSW mm, mm
  20731. if isMM(v0) && isMM(v1) {
  20732. self.require(ISA_SSSE3)
  20733. p.domain = DomainMMXSSE
  20734. p.add(0, func(m *_Encoding, v []interface{}) {
  20735. m.rexo(hcode(v[1]), v[0], false)
  20736. m.emit(0x0f)
  20737. m.emit(0x38)
  20738. m.emit(0x03)
  20739. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20740. })
  20741. }
  20742. // PHADDSW m64, mm
  20743. if isM64(v0) && isMM(v1) {
  20744. self.require(ISA_SSSE3)
  20745. p.domain = DomainMMXSSE
  20746. p.add(0, func(m *_Encoding, v []interface{}) {
  20747. m.rexo(hcode(v[1]), addr(v[0]), false)
  20748. m.emit(0x0f)
  20749. m.emit(0x38)
  20750. m.emit(0x03)
  20751. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20752. })
  20753. }
  20754. // PHADDSW xmm, xmm
  20755. if isXMM(v0) && isXMM(v1) {
  20756. self.require(ISA_SSSE3)
  20757. p.domain = DomainMMXSSE
  20758. p.add(0, func(m *_Encoding, v []interface{}) {
  20759. m.emit(0x66)
  20760. m.rexo(hcode(v[1]), v[0], false)
  20761. m.emit(0x0f)
  20762. m.emit(0x38)
  20763. m.emit(0x03)
  20764. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20765. })
  20766. }
  20767. // PHADDSW m128, xmm
  20768. if isM128(v0) && isXMM(v1) {
  20769. self.require(ISA_SSSE3)
  20770. p.domain = DomainMMXSSE
  20771. p.add(0, func(m *_Encoding, v []interface{}) {
  20772. m.emit(0x66)
  20773. m.rexo(hcode(v[1]), addr(v[0]), false)
  20774. m.emit(0x0f)
  20775. m.emit(0x38)
  20776. m.emit(0x03)
  20777. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20778. })
  20779. }
  20780. if p.len == 0 {
  20781. panic("invalid operands for PHADDSW")
  20782. }
  20783. return p
  20784. }
  20785. // PHADDW performs "Packed Horizontal Add Word Integers".
  20786. //
  20787. // Mnemonic : PHADDW
  20788. // Supported forms : (4 forms)
  20789. //
  20790. // * PHADDW mm, mm [SSSE3]
  20791. // * PHADDW m64, mm [SSSE3]
  20792. // * PHADDW xmm, xmm [SSSE3]
  20793. // * PHADDW m128, xmm [SSSE3]
  20794. //
  20795. func (self *Program) PHADDW(v0 interface{}, v1 interface{}) *Instruction {
  20796. p := self.alloc("PHADDW", 2, Operands { v0, v1 })
  20797. // PHADDW mm, mm
  20798. if isMM(v0) && isMM(v1) {
  20799. self.require(ISA_SSSE3)
  20800. p.domain = DomainMMXSSE
  20801. p.add(0, func(m *_Encoding, v []interface{}) {
  20802. m.rexo(hcode(v[1]), v[0], false)
  20803. m.emit(0x0f)
  20804. m.emit(0x38)
  20805. m.emit(0x01)
  20806. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20807. })
  20808. }
  20809. // PHADDW m64, mm
  20810. if isM64(v0) && isMM(v1) {
  20811. self.require(ISA_SSSE3)
  20812. p.domain = DomainMMXSSE
  20813. p.add(0, func(m *_Encoding, v []interface{}) {
  20814. m.rexo(hcode(v[1]), addr(v[0]), false)
  20815. m.emit(0x0f)
  20816. m.emit(0x38)
  20817. m.emit(0x01)
  20818. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20819. })
  20820. }
  20821. // PHADDW xmm, xmm
  20822. if isXMM(v0) && isXMM(v1) {
  20823. self.require(ISA_SSSE3)
  20824. p.domain = DomainMMXSSE
  20825. p.add(0, func(m *_Encoding, v []interface{}) {
  20826. m.emit(0x66)
  20827. m.rexo(hcode(v[1]), v[0], false)
  20828. m.emit(0x0f)
  20829. m.emit(0x38)
  20830. m.emit(0x01)
  20831. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20832. })
  20833. }
  20834. // PHADDW m128, xmm
  20835. if isM128(v0) && isXMM(v1) {
  20836. self.require(ISA_SSSE3)
  20837. p.domain = DomainMMXSSE
  20838. p.add(0, func(m *_Encoding, v []interface{}) {
  20839. m.emit(0x66)
  20840. m.rexo(hcode(v[1]), addr(v[0]), false)
  20841. m.emit(0x0f)
  20842. m.emit(0x38)
  20843. m.emit(0x01)
  20844. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20845. })
  20846. }
  20847. if p.len == 0 {
  20848. panic("invalid operands for PHADDW")
  20849. }
  20850. return p
  20851. }
  20852. // PHMINPOSUW performs "Packed Horizontal Minimum of Unsigned Word Integers".
  20853. //
  20854. // Mnemonic : PHMINPOSUW
  20855. // Supported forms : (2 forms)
  20856. //
  20857. // * PHMINPOSUW xmm, xmm [SSE4.1]
  20858. // * PHMINPOSUW m128, xmm [SSE4.1]
  20859. //
  20860. func (self *Program) PHMINPOSUW(v0 interface{}, v1 interface{}) *Instruction {
  20861. p := self.alloc("PHMINPOSUW", 2, Operands { v0, v1 })
  20862. // PHMINPOSUW xmm, xmm
  20863. if isXMM(v0) && isXMM(v1) {
  20864. self.require(ISA_SSE4_1)
  20865. p.domain = DomainMMXSSE
  20866. p.add(0, func(m *_Encoding, v []interface{}) {
  20867. m.emit(0x66)
  20868. m.rexo(hcode(v[1]), v[0], false)
  20869. m.emit(0x0f)
  20870. m.emit(0x38)
  20871. m.emit(0x41)
  20872. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20873. })
  20874. }
  20875. // PHMINPOSUW m128, xmm
  20876. if isM128(v0) && isXMM(v1) {
  20877. self.require(ISA_SSE4_1)
  20878. p.domain = DomainMMXSSE
  20879. p.add(0, func(m *_Encoding, v []interface{}) {
  20880. m.emit(0x66)
  20881. m.rexo(hcode(v[1]), addr(v[0]), false)
  20882. m.emit(0x0f)
  20883. m.emit(0x38)
  20884. m.emit(0x41)
  20885. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20886. })
  20887. }
  20888. if p.len == 0 {
  20889. panic("invalid operands for PHMINPOSUW")
  20890. }
  20891. return p
  20892. }
  20893. // PHSUBD performs "Packed Horizontal Subtract Doubleword Integers".
  20894. //
  20895. // Mnemonic : PHSUBD
  20896. // Supported forms : (4 forms)
  20897. //
  20898. // * PHSUBD mm, mm [SSSE3]
  20899. // * PHSUBD m64, mm [SSSE3]
  20900. // * PHSUBD xmm, xmm [SSSE3]
  20901. // * PHSUBD m128, xmm [SSSE3]
  20902. //
  20903. func (self *Program) PHSUBD(v0 interface{}, v1 interface{}) *Instruction {
  20904. p := self.alloc("PHSUBD", 2, Operands { v0, v1 })
  20905. // PHSUBD mm, mm
  20906. if isMM(v0) && isMM(v1) {
  20907. self.require(ISA_SSSE3)
  20908. p.domain = DomainMMXSSE
  20909. p.add(0, func(m *_Encoding, v []interface{}) {
  20910. m.rexo(hcode(v[1]), v[0], false)
  20911. m.emit(0x0f)
  20912. m.emit(0x38)
  20913. m.emit(0x06)
  20914. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20915. })
  20916. }
  20917. // PHSUBD m64, mm
  20918. if isM64(v0) && isMM(v1) {
  20919. self.require(ISA_SSSE3)
  20920. p.domain = DomainMMXSSE
  20921. p.add(0, func(m *_Encoding, v []interface{}) {
  20922. m.rexo(hcode(v[1]), addr(v[0]), false)
  20923. m.emit(0x0f)
  20924. m.emit(0x38)
  20925. m.emit(0x06)
  20926. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20927. })
  20928. }
  20929. // PHSUBD xmm, xmm
  20930. if isXMM(v0) && isXMM(v1) {
  20931. self.require(ISA_SSSE3)
  20932. p.domain = DomainMMXSSE
  20933. p.add(0, func(m *_Encoding, v []interface{}) {
  20934. m.emit(0x66)
  20935. m.rexo(hcode(v[1]), v[0], false)
  20936. m.emit(0x0f)
  20937. m.emit(0x38)
  20938. m.emit(0x06)
  20939. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20940. })
  20941. }
  20942. // PHSUBD m128, xmm
  20943. if isM128(v0) && isXMM(v1) {
  20944. self.require(ISA_SSSE3)
  20945. p.domain = DomainMMXSSE
  20946. p.add(0, func(m *_Encoding, v []interface{}) {
  20947. m.emit(0x66)
  20948. m.rexo(hcode(v[1]), addr(v[0]), false)
  20949. m.emit(0x0f)
  20950. m.emit(0x38)
  20951. m.emit(0x06)
  20952. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20953. })
  20954. }
  20955. if p.len == 0 {
  20956. panic("invalid operands for PHSUBD")
  20957. }
  20958. return p
  20959. }
  20960. // PHSUBSW performs "Packed Horizontal Subtract Signed Word Integers with Signed Saturation".
  20961. //
  20962. // Mnemonic : PHSUBSW
  20963. // Supported forms : (4 forms)
  20964. //
  20965. // * PHSUBSW mm, mm [SSSE3]
  20966. // * PHSUBSW m64, mm [SSSE3]
  20967. // * PHSUBSW xmm, xmm [SSSE3]
  20968. // * PHSUBSW m128, xmm [SSSE3]
  20969. //
  20970. func (self *Program) PHSUBSW(v0 interface{}, v1 interface{}) *Instruction {
  20971. p := self.alloc("PHSUBSW", 2, Operands { v0, v1 })
  20972. // PHSUBSW mm, mm
  20973. if isMM(v0) && isMM(v1) {
  20974. self.require(ISA_SSSE3)
  20975. p.domain = DomainMMXSSE
  20976. p.add(0, func(m *_Encoding, v []interface{}) {
  20977. m.rexo(hcode(v[1]), v[0], false)
  20978. m.emit(0x0f)
  20979. m.emit(0x38)
  20980. m.emit(0x07)
  20981. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  20982. })
  20983. }
  20984. // PHSUBSW m64, mm
  20985. if isM64(v0) && isMM(v1) {
  20986. self.require(ISA_SSSE3)
  20987. p.domain = DomainMMXSSE
  20988. p.add(0, func(m *_Encoding, v []interface{}) {
  20989. m.rexo(hcode(v[1]), addr(v[0]), false)
  20990. m.emit(0x0f)
  20991. m.emit(0x38)
  20992. m.emit(0x07)
  20993. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  20994. })
  20995. }
  20996. // PHSUBSW xmm, xmm
  20997. if isXMM(v0) && isXMM(v1) {
  20998. self.require(ISA_SSSE3)
  20999. p.domain = DomainMMXSSE
  21000. p.add(0, func(m *_Encoding, v []interface{}) {
  21001. m.emit(0x66)
  21002. m.rexo(hcode(v[1]), v[0], false)
  21003. m.emit(0x0f)
  21004. m.emit(0x38)
  21005. m.emit(0x07)
  21006. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21007. })
  21008. }
  21009. // PHSUBSW m128, xmm
  21010. if isM128(v0) && isXMM(v1) {
  21011. self.require(ISA_SSSE3)
  21012. p.domain = DomainMMXSSE
  21013. p.add(0, func(m *_Encoding, v []interface{}) {
  21014. m.emit(0x66)
  21015. m.rexo(hcode(v[1]), addr(v[0]), false)
  21016. m.emit(0x0f)
  21017. m.emit(0x38)
  21018. m.emit(0x07)
  21019. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21020. })
  21021. }
  21022. if p.len == 0 {
  21023. panic("invalid operands for PHSUBSW")
  21024. }
  21025. return p
  21026. }
  21027. // PHSUBW performs "Packed Horizontal Subtract Word Integers".
  21028. //
  21029. // Mnemonic : PHSUBW
  21030. // Supported forms : (4 forms)
  21031. //
  21032. // * PHSUBW mm, mm [SSSE3]
  21033. // * PHSUBW m64, mm [SSSE3]
  21034. // * PHSUBW xmm, xmm [SSSE3]
  21035. // * PHSUBW m128, xmm [SSSE3]
  21036. //
  21037. func (self *Program) PHSUBW(v0 interface{}, v1 interface{}) *Instruction {
  21038. p := self.alloc("PHSUBW", 2, Operands { v0, v1 })
  21039. // PHSUBW mm, mm
  21040. if isMM(v0) && isMM(v1) {
  21041. self.require(ISA_SSSE3)
  21042. p.domain = DomainMMXSSE
  21043. p.add(0, func(m *_Encoding, v []interface{}) {
  21044. m.rexo(hcode(v[1]), v[0], false)
  21045. m.emit(0x0f)
  21046. m.emit(0x38)
  21047. m.emit(0x05)
  21048. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21049. })
  21050. }
  21051. // PHSUBW m64, mm
  21052. if isM64(v0) && isMM(v1) {
  21053. self.require(ISA_SSSE3)
  21054. p.domain = DomainMMXSSE
  21055. p.add(0, func(m *_Encoding, v []interface{}) {
  21056. m.rexo(hcode(v[1]), addr(v[0]), false)
  21057. m.emit(0x0f)
  21058. m.emit(0x38)
  21059. m.emit(0x05)
  21060. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21061. })
  21062. }
  21063. // PHSUBW xmm, xmm
  21064. if isXMM(v0) && isXMM(v1) {
  21065. self.require(ISA_SSSE3)
  21066. p.domain = DomainMMXSSE
  21067. p.add(0, func(m *_Encoding, v []interface{}) {
  21068. m.emit(0x66)
  21069. m.rexo(hcode(v[1]), v[0], false)
  21070. m.emit(0x0f)
  21071. m.emit(0x38)
  21072. m.emit(0x05)
  21073. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21074. })
  21075. }
  21076. // PHSUBW m128, xmm
  21077. if isM128(v0) && isXMM(v1) {
  21078. self.require(ISA_SSSE3)
  21079. p.domain = DomainMMXSSE
  21080. p.add(0, func(m *_Encoding, v []interface{}) {
  21081. m.emit(0x66)
  21082. m.rexo(hcode(v[1]), addr(v[0]), false)
  21083. m.emit(0x0f)
  21084. m.emit(0x38)
  21085. m.emit(0x05)
  21086. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21087. })
  21088. }
  21089. if p.len == 0 {
  21090. panic("invalid operands for PHSUBW")
  21091. }
  21092. return p
  21093. }
  21094. // PI2FD performs "Packed Integer to Floating-Point Doubleword Conversion".
  21095. //
  21096. // Mnemonic : PI2FD
  21097. // Supported forms : (2 forms)
  21098. //
  21099. // * PI2FD mm, mm [3dnow!]
  21100. // * PI2FD m64, mm [3dnow!]
  21101. //
  21102. func (self *Program) PI2FD(v0 interface{}, v1 interface{}) *Instruction {
  21103. p := self.alloc("PI2FD", 2, Operands { v0, v1 })
  21104. // PI2FD mm, mm
  21105. if isMM(v0) && isMM(v1) {
  21106. self.require(ISA_3DNOW)
  21107. p.domain = DomainAMDSpecific
  21108. p.add(0, func(m *_Encoding, v []interface{}) {
  21109. m.rexo(hcode(v[1]), v[0], false)
  21110. m.emit(0x0f)
  21111. m.emit(0x0f)
  21112. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21113. m.emit(0x0d)
  21114. })
  21115. }
  21116. // PI2FD m64, mm
  21117. if isM64(v0) && isMM(v1) {
  21118. self.require(ISA_3DNOW)
  21119. p.domain = DomainAMDSpecific
  21120. p.add(0, func(m *_Encoding, v []interface{}) {
  21121. m.rexo(hcode(v[1]), addr(v[0]), false)
  21122. m.emit(0x0f)
  21123. m.emit(0x0f)
  21124. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21125. m.emit(0x0d)
  21126. })
  21127. }
  21128. if p.len == 0 {
  21129. panic("invalid operands for PI2FD")
  21130. }
  21131. return p
  21132. }
  21133. // PI2FW performs "Packed Integer to Floating-Point Word Conversion".
  21134. //
  21135. // Mnemonic : PI2FW
  21136. // Supported forms : (2 forms)
  21137. //
  21138. // * PI2FW mm, mm [3dnow!+]
  21139. // * PI2FW m64, mm [3dnow!+]
  21140. //
  21141. func (self *Program) PI2FW(v0 interface{}, v1 interface{}) *Instruction {
  21142. p := self.alloc("PI2FW", 2, Operands { v0, v1 })
  21143. // PI2FW mm, mm
  21144. if isMM(v0) && isMM(v1) {
  21145. self.require(ISA_3DNOW_PLUS)
  21146. p.domain = DomainAMDSpecific
  21147. p.add(0, func(m *_Encoding, v []interface{}) {
  21148. m.rexo(hcode(v[1]), v[0], false)
  21149. m.emit(0x0f)
  21150. m.emit(0x0f)
  21151. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21152. m.emit(0x0c)
  21153. })
  21154. }
  21155. // PI2FW m64, mm
  21156. if isM64(v0) && isMM(v1) {
  21157. self.require(ISA_3DNOW_PLUS)
  21158. p.domain = DomainAMDSpecific
  21159. p.add(0, func(m *_Encoding, v []interface{}) {
  21160. m.rexo(hcode(v[1]), addr(v[0]), false)
  21161. m.emit(0x0f)
  21162. m.emit(0x0f)
  21163. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21164. m.emit(0x0c)
  21165. })
  21166. }
  21167. if p.len == 0 {
  21168. panic("invalid operands for PI2FW")
  21169. }
  21170. return p
  21171. }
  21172. // PINSRB performs "Insert Byte".
  21173. //
  21174. // Mnemonic : PINSRB
  21175. // Supported forms : (2 forms)
  21176. //
  21177. // * PINSRB imm8, r32, xmm [SSE4.1]
  21178. // * PINSRB imm8, m8, xmm [SSE4.1]
  21179. //
  21180. func (self *Program) PINSRB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  21181. p := self.alloc("PINSRB", 3, Operands { v0, v1, v2 })
  21182. // PINSRB imm8, r32, xmm
  21183. if isImm8(v0) && isReg32(v1) && isXMM(v2) {
  21184. self.require(ISA_SSE4_1)
  21185. p.domain = DomainMMXSSE
  21186. p.add(0, func(m *_Encoding, v []interface{}) {
  21187. m.emit(0x66)
  21188. m.rexo(hcode(v[2]), v[1], false)
  21189. m.emit(0x0f)
  21190. m.emit(0x3a)
  21191. m.emit(0x20)
  21192. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  21193. m.imm1(toImmAny(v[0]))
  21194. })
  21195. }
  21196. // PINSRB imm8, m8, xmm
  21197. if isImm8(v0) && isM8(v1) && isXMM(v2) {
  21198. self.require(ISA_SSE4_1)
  21199. p.domain = DomainMMXSSE
  21200. p.add(0, func(m *_Encoding, v []interface{}) {
  21201. m.emit(0x66)
  21202. m.rexo(hcode(v[2]), addr(v[1]), false)
  21203. m.emit(0x0f)
  21204. m.emit(0x3a)
  21205. m.emit(0x20)
  21206. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  21207. m.imm1(toImmAny(v[0]))
  21208. })
  21209. }
  21210. if p.len == 0 {
  21211. panic("invalid operands for PINSRB")
  21212. }
  21213. return p
  21214. }
  21215. // PINSRD performs "Insert Doubleword".
  21216. //
  21217. // Mnemonic : PINSRD
  21218. // Supported forms : (2 forms)
  21219. //
  21220. // * PINSRD imm8, r32, xmm [SSE4.1]
  21221. // * PINSRD imm8, m32, xmm [SSE4.1]
  21222. //
  21223. func (self *Program) PINSRD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  21224. p := self.alloc("PINSRD", 3, Operands { v0, v1, v2 })
  21225. // PINSRD imm8, r32, xmm
  21226. if isImm8(v0) && isReg32(v1) && isXMM(v2) {
  21227. self.require(ISA_SSE4_1)
  21228. p.domain = DomainMMXSSE
  21229. p.add(0, func(m *_Encoding, v []interface{}) {
  21230. m.emit(0x66)
  21231. m.rexo(hcode(v[2]), v[1], false)
  21232. m.emit(0x0f)
  21233. m.emit(0x3a)
  21234. m.emit(0x22)
  21235. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  21236. m.imm1(toImmAny(v[0]))
  21237. })
  21238. }
  21239. // PINSRD imm8, m32, xmm
  21240. if isImm8(v0) && isM32(v1) && isXMM(v2) {
  21241. self.require(ISA_SSE4_1)
  21242. p.domain = DomainMMXSSE
  21243. p.add(0, func(m *_Encoding, v []interface{}) {
  21244. m.emit(0x66)
  21245. m.rexo(hcode(v[2]), addr(v[1]), false)
  21246. m.emit(0x0f)
  21247. m.emit(0x3a)
  21248. m.emit(0x22)
  21249. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  21250. m.imm1(toImmAny(v[0]))
  21251. })
  21252. }
  21253. if p.len == 0 {
  21254. panic("invalid operands for PINSRD")
  21255. }
  21256. return p
  21257. }
  21258. // PINSRQ performs "Insert Quadword".
  21259. //
  21260. // Mnemonic : PINSRQ
  21261. // Supported forms : (2 forms)
  21262. //
  21263. // * PINSRQ imm8, r64, xmm [SSE4.1]
  21264. // * PINSRQ imm8, m64, xmm [SSE4.1]
  21265. //
  21266. func (self *Program) PINSRQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  21267. p := self.alloc("PINSRQ", 3, Operands { v0, v1, v2 })
  21268. // PINSRQ imm8, r64, xmm
  21269. if isImm8(v0) && isReg64(v1) && isXMM(v2) {
  21270. self.require(ISA_SSE4_1)
  21271. p.domain = DomainMMXSSE
  21272. p.add(0, func(m *_Encoding, v []interface{}) {
  21273. m.emit(0x66)
  21274. m.emit(0x48 | hcode(v[2]) << 2 | hcode(v[1]))
  21275. m.emit(0x0f)
  21276. m.emit(0x3a)
  21277. m.emit(0x22)
  21278. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  21279. m.imm1(toImmAny(v[0]))
  21280. })
  21281. }
  21282. // PINSRQ imm8, m64, xmm
  21283. if isImm8(v0) && isM64(v1) && isXMM(v2) {
  21284. self.require(ISA_SSE4_1)
  21285. p.domain = DomainMMXSSE
  21286. p.add(0, func(m *_Encoding, v []interface{}) {
  21287. m.emit(0x66)
  21288. m.rexm(1, hcode(v[2]), addr(v[1]))
  21289. m.emit(0x0f)
  21290. m.emit(0x3a)
  21291. m.emit(0x22)
  21292. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  21293. m.imm1(toImmAny(v[0]))
  21294. })
  21295. }
  21296. if p.len == 0 {
  21297. panic("invalid operands for PINSRQ")
  21298. }
  21299. return p
  21300. }
  21301. // PINSRW performs "Insert Word".
  21302. //
  21303. // Mnemonic : PINSRW
  21304. // Supported forms : (4 forms)
  21305. //
  21306. // * PINSRW imm8, r32, mm [MMX+]
  21307. // * PINSRW imm8, m16, mm [MMX+]
  21308. // * PINSRW imm8, r32, xmm [SSE2]
  21309. // * PINSRW imm8, m16, xmm [SSE2]
  21310. //
  21311. func (self *Program) PINSRW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  21312. p := self.alloc("PINSRW", 3, Operands { v0, v1, v2 })
  21313. // PINSRW imm8, r32, mm
  21314. if isImm8(v0) && isReg32(v1) && isMM(v2) {
  21315. self.require(ISA_MMX_PLUS)
  21316. p.domain = DomainMMXSSE
  21317. p.add(0, func(m *_Encoding, v []interface{}) {
  21318. m.rexo(hcode(v[2]), v[1], false)
  21319. m.emit(0x0f)
  21320. m.emit(0xc4)
  21321. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  21322. m.imm1(toImmAny(v[0]))
  21323. })
  21324. }
  21325. // PINSRW imm8, m16, mm
  21326. if isImm8(v0) && isM16(v1) && isMM(v2) {
  21327. self.require(ISA_MMX_PLUS)
  21328. p.domain = DomainMMXSSE
  21329. p.add(0, func(m *_Encoding, v []interface{}) {
  21330. m.rexo(hcode(v[2]), addr(v[1]), false)
  21331. m.emit(0x0f)
  21332. m.emit(0xc4)
  21333. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  21334. m.imm1(toImmAny(v[0]))
  21335. })
  21336. }
  21337. // PINSRW imm8, r32, xmm
  21338. if isImm8(v0) && isReg32(v1) && isXMM(v2) {
  21339. self.require(ISA_SSE2)
  21340. p.domain = DomainMMXSSE
  21341. p.add(0, func(m *_Encoding, v []interface{}) {
  21342. m.emit(0x66)
  21343. m.rexo(hcode(v[2]), v[1], false)
  21344. m.emit(0x0f)
  21345. m.emit(0xc4)
  21346. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  21347. m.imm1(toImmAny(v[0]))
  21348. })
  21349. }
  21350. // PINSRW imm8, m16, xmm
  21351. if isImm8(v0) && isM16(v1) && isXMM(v2) {
  21352. self.require(ISA_SSE2)
  21353. p.domain = DomainMMXSSE
  21354. p.add(0, func(m *_Encoding, v []interface{}) {
  21355. m.emit(0x66)
  21356. m.rexo(hcode(v[2]), addr(v[1]), false)
  21357. m.emit(0x0f)
  21358. m.emit(0xc4)
  21359. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  21360. m.imm1(toImmAny(v[0]))
  21361. })
  21362. }
  21363. if p.len == 0 {
  21364. panic("invalid operands for PINSRW")
  21365. }
  21366. return p
  21367. }
  21368. // PMADDUBSW performs "Multiply and Add Packed Signed and Unsigned Byte Integers".
  21369. //
  21370. // Mnemonic : PMADDUBSW
  21371. // Supported forms : (4 forms)
  21372. //
  21373. // * PMADDUBSW mm, mm [SSSE3]
  21374. // * PMADDUBSW m64, mm [SSSE3]
  21375. // * PMADDUBSW xmm, xmm [SSSE3]
  21376. // * PMADDUBSW m128, xmm [SSSE3]
  21377. //
  21378. func (self *Program) PMADDUBSW(v0 interface{}, v1 interface{}) *Instruction {
  21379. p := self.alloc("PMADDUBSW", 2, Operands { v0, v1 })
  21380. // PMADDUBSW mm, mm
  21381. if isMM(v0) && isMM(v1) {
  21382. self.require(ISA_SSSE3)
  21383. p.domain = DomainMMXSSE
  21384. p.add(0, func(m *_Encoding, v []interface{}) {
  21385. m.rexo(hcode(v[1]), v[0], false)
  21386. m.emit(0x0f)
  21387. m.emit(0x38)
  21388. m.emit(0x04)
  21389. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21390. })
  21391. }
  21392. // PMADDUBSW m64, mm
  21393. if isM64(v0) && isMM(v1) {
  21394. self.require(ISA_SSSE3)
  21395. p.domain = DomainMMXSSE
  21396. p.add(0, func(m *_Encoding, v []interface{}) {
  21397. m.rexo(hcode(v[1]), addr(v[0]), false)
  21398. m.emit(0x0f)
  21399. m.emit(0x38)
  21400. m.emit(0x04)
  21401. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21402. })
  21403. }
  21404. // PMADDUBSW xmm, xmm
  21405. if isXMM(v0) && isXMM(v1) {
  21406. self.require(ISA_SSSE3)
  21407. p.domain = DomainMMXSSE
  21408. p.add(0, func(m *_Encoding, v []interface{}) {
  21409. m.emit(0x66)
  21410. m.rexo(hcode(v[1]), v[0], false)
  21411. m.emit(0x0f)
  21412. m.emit(0x38)
  21413. m.emit(0x04)
  21414. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21415. })
  21416. }
  21417. // PMADDUBSW m128, xmm
  21418. if isM128(v0) && isXMM(v1) {
  21419. self.require(ISA_SSSE3)
  21420. p.domain = DomainMMXSSE
  21421. p.add(0, func(m *_Encoding, v []interface{}) {
  21422. m.emit(0x66)
  21423. m.rexo(hcode(v[1]), addr(v[0]), false)
  21424. m.emit(0x0f)
  21425. m.emit(0x38)
  21426. m.emit(0x04)
  21427. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21428. })
  21429. }
  21430. if p.len == 0 {
  21431. panic("invalid operands for PMADDUBSW")
  21432. }
  21433. return p
  21434. }
  21435. // PMADDWD performs "Multiply and Add Packed Signed Word Integers".
  21436. //
  21437. // Mnemonic : PMADDWD
  21438. // Supported forms : (4 forms)
  21439. //
  21440. // * PMADDWD mm, mm [MMX]
  21441. // * PMADDWD m64, mm [MMX]
  21442. // * PMADDWD xmm, xmm [SSE2]
  21443. // * PMADDWD m128, xmm [SSE2]
  21444. //
  21445. func (self *Program) PMADDWD(v0 interface{}, v1 interface{}) *Instruction {
  21446. p := self.alloc("PMADDWD", 2, Operands { v0, v1 })
  21447. // PMADDWD mm, mm
  21448. if isMM(v0) && isMM(v1) {
  21449. self.require(ISA_MMX)
  21450. p.domain = DomainMMXSSE
  21451. p.add(0, func(m *_Encoding, v []interface{}) {
  21452. m.rexo(hcode(v[1]), v[0], false)
  21453. m.emit(0x0f)
  21454. m.emit(0xf5)
  21455. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21456. })
  21457. }
  21458. // PMADDWD m64, mm
  21459. if isM64(v0) && isMM(v1) {
  21460. self.require(ISA_MMX)
  21461. p.domain = DomainMMXSSE
  21462. p.add(0, func(m *_Encoding, v []interface{}) {
  21463. m.rexo(hcode(v[1]), addr(v[0]), false)
  21464. m.emit(0x0f)
  21465. m.emit(0xf5)
  21466. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21467. })
  21468. }
  21469. // PMADDWD xmm, xmm
  21470. if isXMM(v0) && isXMM(v1) {
  21471. self.require(ISA_SSE2)
  21472. p.domain = DomainMMXSSE
  21473. p.add(0, func(m *_Encoding, v []interface{}) {
  21474. m.emit(0x66)
  21475. m.rexo(hcode(v[1]), v[0], false)
  21476. m.emit(0x0f)
  21477. m.emit(0xf5)
  21478. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21479. })
  21480. }
  21481. // PMADDWD m128, xmm
  21482. if isM128(v0) && isXMM(v1) {
  21483. self.require(ISA_SSE2)
  21484. p.domain = DomainMMXSSE
  21485. p.add(0, func(m *_Encoding, v []interface{}) {
  21486. m.emit(0x66)
  21487. m.rexo(hcode(v[1]), addr(v[0]), false)
  21488. m.emit(0x0f)
  21489. m.emit(0xf5)
  21490. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21491. })
  21492. }
  21493. if p.len == 0 {
  21494. panic("invalid operands for PMADDWD")
  21495. }
  21496. return p
  21497. }
  21498. // PMAXSB performs "Maximum of Packed Signed Byte Integers".
  21499. //
  21500. // Mnemonic : PMAXSB
  21501. // Supported forms : (2 forms)
  21502. //
  21503. // * PMAXSB xmm, xmm [SSE4.1]
  21504. // * PMAXSB m128, xmm [SSE4.1]
  21505. //
  21506. func (self *Program) PMAXSB(v0 interface{}, v1 interface{}) *Instruction {
  21507. p := self.alloc("PMAXSB", 2, Operands { v0, v1 })
  21508. // PMAXSB xmm, xmm
  21509. if isXMM(v0) && isXMM(v1) {
  21510. self.require(ISA_SSE4_1)
  21511. p.domain = DomainMMXSSE
  21512. p.add(0, func(m *_Encoding, v []interface{}) {
  21513. m.emit(0x66)
  21514. m.rexo(hcode(v[1]), v[0], false)
  21515. m.emit(0x0f)
  21516. m.emit(0x38)
  21517. m.emit(0x3c)
  21518. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21519. })
  21520. }
  21521. // PMAXSB m128, xmm
  21522. if isM128(v0) && isXMM(v1) {
  21523. self.require(ISA_SSE4_1)
  21524. p.domain = DomainMMXSSE
  21525. p.add(0, func(m *_Encoding, v []interface{}) {
  21526. m.emit(0x66)
  21527. m.rexo(hcode(v[1]), addr(v[0]), false)
  21528. m.emit(0x0f)
  21529. m.emit(0x38)
  21530. m.emit(0x3c)
  21531. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21532. })
  21533. }
  21534. if p.len == 0 {
  21535. panic("invalid operands for PMAXSB")
  21536. }
  21537. return p
  21538. }
  21539. // PMAXSD performs "Maximum of Packed Signed Doubleword Integers".
  21540. //
  21541. // Mnemonic : PMAXSD
  21542. // Supported forms : (2 forms)
  21543. //
  21544. // * PMAXSD xmm, xmm [SSE4.1]
  21545. // * PMAXSD m128, xmm [SSE4.1]
  21546. //
  21547. func (self *Program) PMAXSD(v0 interface{}, v1 interface{}) *Instruction {
  21548. p := self.alloc("PMAXSD", 2, Operands { v0, v1 })
  21549. // PMAXSD xmm, xmm
  21550. if isXMM(v0) && isXMM(v1) {
  21551. self.require(ISA_SSE4_1)
  21552. p.domain = DomainMMXSSE
  21553. p.add(0, func(m *_Encoding, v []interface{}) {
  21554. m.emit(0x66)
  21555. m.rexo(hcode(v[1]), v[0], false)
  21556. m.emit(0x0f)
  21557. m.emit(0x38)
  21558. m.emit(0x3d)
  21559. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21560. })
  21561. }
  21562. // PMAXSD m128, xmm
  21563. if isM128(v0) && isXMM(v1) {
  21564. self.require(ISA_SSE4_1)
  21565. p.domain = DomainMMXSSE
  21566. p.add(0, func(m *_Encoding, v []interface{}) {
  21567. m.emit(0x66)
  21568. m.rexo(hcode(v[1]), addr(v[0]), false)
  21569. m.emit(0x0f)
  21570. m.emit(0x38)
  21571. m.emit(0x3d)
  21572. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21573. })
  21574. }
  21575. if p.len == 0 {
  21576. panic("invalid operands for PMAXSD")
  21577. }
  21578. return p
  21579. }
  21580. // PMAXSW performs "Maximum of Packed Signed Word Integers".
  21581. //
  21582. // Mnemonic : PMAXSW
  21583. // Supported forms : (4 forms)
  21584. //
  21585. // * PMAXSW mm, mm [MMX+]
  21586. // * PMAXSW m64, mm [MMX+]
  21587. // * PMAXSW xmm, xmm [SSE2]
  21588. // * PMAXSW m128, xmm [SSE2]
  21589. //
  21590. func (self *Program) PMAXSW(v0 interface{}, v1 interface{}) *Instruction {
  21591. p := self.alloc("PMAXSW", 2, Operands { v0, v1 })
  21592. // PMAXSW mm, mm
  21593. if isMM(v0) && isMM(v1) {
  21594. self.require(ISA_MMX_PLUS)
  21595. p.domain = DomainMMXSSE
  21596. p.add(0, func(m *_Encoding, v []interface{}) {
  21597. m.rexo(hcode(v[1]), v[0], false)
  21598. m.emit(0x0f)
  21599. m.emit(0xee)
  21600. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21601. })
  21602. }
  21603. // PMAXSW m64, mm
  21604. if isM64(v0) && isMM(v1) {
  21605. self.require(ISA_MMX_PLUS)
  21606. p.domain = DomainMMXSSE
  21607. p.add(0, func(m *_Encoding, v []interface{}) {
  21608. m.rexo(hcode(v[1]), addr(v[0]), false)
  21609. m.emit(0x0f)
  21610. m.emit(0xee)
  21611. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21612. })
  21613. }
  21614. // PMAXSW xmm, xmm
  21615. if isXMM(v0) && isXMM(v1) {
  21616. self.require(ISA_SSE2)
  21617. p.domain = DomainMMXSSE
  21618. p.add(0, func(m *_Encoding, v []interface{}) {
  21619. m.emit(0x66)
  21620. m.rexo(hcode(v[1]), v[0], false)
  21621. m.emit(0x0f)
  21622. m.emit(0xee)
  21623. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21624. })
  21625. }
  21626. // PMAXSW m128, xmm
  21627. if isM128(v0) && isXMM(v1) {
  21628. self.require(ISA_SSE2)
  21629. p.domain = DomainMMXSSE
  21630. p.add(0, func(m *_Encoding, v []interface{}) {
  21631. m.emit(0x66)
  21632. m.rexo(hcode(v[1]), addr(v[0]), false)
  21633. m.emit(0x0f)
  21634. m.emit(0xee)
  21635. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21636. })
  21637. }
  21638. if p.len == 0 {
  21639. panic("invalid operands for PMAXSW")
  21640. }
  21641. return p
  21642. }
  21643. // PMAXUB performs "Maximum of Packed Unsigned Byte Integers".
  21644. //
  21645. // Mnemonic : PMAXUB
  21646. // Supported forms : (4 forms)
  21647. //
  21648. // * PMAXUB mm, mm [MMX+]
  21649. // * PMAXUB m64, mm [MMX+]
  21650. // * PMAXUB xmm, xmm [SSE2]
  21651. // * PMAXUB m128, xmm [SSE2]
  21652. //
  21653. func (self *Program) PMAXUB(v0 interface{}, v1 interface{}) *Instruction {
  21654. p := self.alloc("PMAXUB", 2, Operands { v0, v1 })
  21655. // PMAXUB mm, mm
  21656. if isMM(v0) && isMM(v1) {
  21657. self.require(ISA_MMX_PLUS)
  21658. p.domain = DomainMMXSSE
  21659. p.add(0, func(m *_Encoding, v []interface{}) {
  21660. m.rexo(hcode(v[1]), v[0], false)
  21661. m.emit(0x0f)
  21662. m.emit(0xde)
  21663. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21664. })
  21665. }
  21666. // PMAXUB m64, mm
  21667. if isM64(v0) && isMM(v1) {
  21668. self.require(ISA_MMX_PLUS)
  21669. p.domain = DomainMMXSSE
  21670. p.add(0, func(m *_Encoding, v []interface{}) {
  21671. m.rexo(hcode(v[1]), addr(v[0]), false)
  21672. m.emit(0x0f)
  21673. m.emit(0xde)
  21674. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21675. })
  21676. }
  21677. // PMAXUB xmm, xmm
  21678. if isXMM(v0) && isXMM(v1) {
  21679. self.require(ISA_SSE2)
  21680. p.domain = DomainMMXSSE
  21681. p.add(0, func(m *_Encoding, v []interface{}) {
  21682. m.emit(0x66)
  21683. m.rexo(hcode(v[1]), v[0], false)
  21684. m.emit(0x0f)
  21685. m.emit(0xde)
  21686. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21687. })
  21688. }
  21689. // PMAXUB m128, xmm
  21690. if isM128(v0) && isXMM(v1) {
  21691. self.require(ISA_SSE2)
  21692. p.domain = DomainMMXSSE
  21693. p.add(0, func(m *_Encoding, v []interface{}) {
  21694. m.emit(0x66)
  21695. m.rexo(hcode(v[1]), addr(v[0]), false)
  21696. m.emit(0x0f)
  21697. m.emit(0xde)
  21698. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21699. })
  21700. }
  21701. if p.len == 0 {
  21702. panic("invalid operands for PMAXUB")
  21703. }
  21704. return p
  21705. }
  21706. // PMAXUD performs "Maximum of Packed Unsigned Doubleword Integers".
  21707. //
  21708. // Mnemonic : PMAXUD
  21709. // Supported forms : (2 forms)
  21710. //
  21711. // * PMAXUD xmm, xmm [SSE4.1]
  21712. // * PMAXUD m128, xmm [SSE4.1]
  21713. //
  21714. func (self *Program) PMAXUD(v0 interface{}, v1 interface{}) *Instruction {
  21715. p := self.alloc("PMAXUD", 2, Operands { v0, v1 })
  21716. // PMAXUD xmm, xmm
  21717. if isXMM(v0) && isXMM(v1) {
  21718. self.require(ISA_SSE4_1)
  21719. p.domain = DomainMMXSSE
  21720. p.add(0, func(m *_Encoding, v []interface{}) {
  21721. m.emit(0x66)
  21722. m.rexo(hcode(v[1]), v[0], false)
  21723. m.emit(0x0f)
  21724. m.emit(0x38)
  21725. m.emit(0x3f)
  21726. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21727. })
  21728. }
  21729. // PMAXUD m128, xmm
  21730. if isM128(v0) && isXMM(v1) {
  21731. self.require(ISA_SSE4_1)
  21732. p.domain = DomainMMXSSE
  21733. p.add(0, func(m *_Encoding, v []interface{}) {
  21734. m.emit(0x66)
  21735. m.rexo(hcode(v[1]), addr(v[0]), false)
  21736. m.emit(0x0f)
  21737. m.emit(0x38)
  21738. m.emit(0x3f)
  21739. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21740. })
  21741. }
  21742. if p.len == 0 {
  21743. panic("invalid operands for PMAXUD")
  21744. }
  21745. return p
  21746. }
  21747. // PMAXUW performs "Maximum of Packed Unsigned Word Integers".
  21748. //
  21749. // Mnemonic : PMAXUW
  21750. // Supported forms : (2 forms)
  21751. //
  21752. // * PMAXUW xmm, xmm [SSE4.1]
  21753. // * PMAXUW m128, xmm [SSE4.1]
  21754. //
  21755. func (self *Program) PMAXUW(v0 interface{}, v1 interface{}) *Instruction {
  21756. p := self.alloc("PMAXUW", 2, Operands { v0, v1 })
  21757. // PMAXUW xmm, xmm
  21758. if isXMM(v0) && isXMM(v1) {
  21759. self.require(ISA_SSE4_1)
  21760. p.domain = DomainMMXSSE
  21761. p.add(0, func(m *_Encoding, v []interface{}) {
  21762. m.emit(0x66)
  21763. m.rexo(hcode(v[1]), v[0], false)
  21764. m.emit(0x0f)
  21765. m.emit(0x38)
  21766. m.emit(0x3e)
  21767. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21768. })
  21769. }
  21770. // PMAXUW m128, xmm
  21771. if isM128(v0) && isXMM(v1) {
  21772. self.require(ISA_SSE4_1)
  21773. p.domain = DomainMMXSSE
  21774. p.add(0, func(m *_Encoding, v []interface{}) {
  21775. m.emit(0x66)
  21776. m.rexo(hcode(v[1]), addr(v[0]), false)
  21777. m.emit(0x0f)
  21778. m.emit(0x38)
  21779. m.emit(0x3e)
  21780. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21781. })
  21782. }
  21783. if p.len == 0 {
  21784. panic("invalid operands for PMAXUW")
  21785. }
  21786. return p
  21787. }
  21788. // PMINSB performs "Minimum of Packed Signed Byte Integers".
  21789. //
  21790. // Mnemonic : PMINSB
  21791. // Supported forms : (2 forms)
  21792. //
  21793. // * PMINSB xmm, xmm [SSE4.1]
  21794. // * PMINSB m128, xmm [SSE4.1]
  21795. //
  21796. func (self *Program) PMINSB(v0 interface{}, v1 interface{}) *Instruction {
  21797. p := self.alloc("PMINSB", 2, Operands { v0, v1 })
  21798. // PMINSB xmm, xmm
  21799. if isXMM(v0) && isXMM(v1) {
  21800. self.require(ISA_SSE4_1)
  21801. p.domain = DomainMMXSSE
  21802. p.add(0, func(m *_Encoding, v []interface{}) {
  21803. m.emit(0x66)
  21804. m.rexo(hcode(v[1]), v[0], false)
  21805. m.emit(0x0f)
  21806. m.emit(0x38)
  21807. m.emit(0x38)
  21808. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21809. })
  21810. }
  21811. // PMINSB m128, xmm
  21812. if isM128(v0) && isXMM(v1) {
  21813. self.require(ISA_SSE4_1)
  21814. p.domain = DomainMMXSSE
  21815. p.add(0, func(m *_Encoding, v []interface{}) {
  21816. m.emit(0x66)
  21817. m.rexo(hcode(v[1]), addr(v[0]), false)
  21818. m.emit(0x0f)
  21819. m.emit(0x38)
  21820. m.emit(0x38)
  21821. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21822. })
  21823. }
  21824. if p.len == 0 {
  21825. panic("invalid operands for PMINSB")
  21826. }
  21827. return p
  21828. }
  21829. // PMINSD performs "Minimum of Packed Signed Doubleword Integers".
  21830. //
  21831. // Mnemonic : PMINSD
  21832. // Supported forms : (2 forms)
  21833. //
  21834. // * PMINSD xmm, xmm [SSE4.1]
  21835. // * PMINSD m128, xmm [SSE4.1]
  21836. //
  21837. func (self *Program) PMINSD(v0 interface{}, v1 interface{}) *Instruction {
  21838. p := self.alloc("PMINSD", 2, Operands { v0, v1 })
  21839. // PMINSD xmm, xmm
  21840. if isXMM(v0) && isXMM(v1) {
  21841. self.require(ISA_SSE4_1)
  21842. p.domain = DomainMMXSSE
  21843. p.add(0, func(m *_Encoding, v []interface{}) {
  21844. m.emit(0x66)
  21845. m.rexo(hcode(v[1]), v[0], false)
  21846. m.emit(0x0f)
  21847. m.emit(0x38)
  21848. m.emit(0x39)
  21849. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21850. })
  21851. }
  21852. // PMINSD m128, xmm
  21853. if isM128(v0) && isXMM(v1) {
  21854. self.require(ISA_SSE4_1)
  21855. p.domain = DomainMMXSSE
  21856. p.add(0, func(m *_Encoding, v []interface{}) {
  21857. m.emit(0x66)
  21858. m.rexo(hcode(v[1]), addr(v[0]), false)
  21859. m.emit(0x0f)
  21860. m.emit(0x38)
  21861. m.emit(0x39)
  21862. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21863. })
  21864. }
  21865. if p.len == 0 {
  21866. panic("invalid operands for PMINSD")
  21867. }
  21868. return p
  21869. }
  21870. // PMINSW performs "Minimum of Packed Signed Word Integers".
  21871. //
  21872. // Mnemonic : PMINSW
  21873. // Supported forms : (4 forms)
  21874. //
  21875. // * PMINSW mm, mm [MMX+]
  21876. // * PMINSW m64, mm [MMX+]
  21877. // * PMINSW xmm, xmm [SSE2]
  21878. // * PMINSW m128, xmm [SSE2]
  21879. //
  21880. func (self *Program) PMINSW(v0 interface{}, v1 interface{}) *Instruction {
  21881. p := self.alloc("PMINSW", 2, Operands { v0, v1 })
  21882. // PMINSW mm, mm
  21883. if isMM(v0) && isMM(v1) {
  21884. self.require(ISA_MMX_PLUS)
  21885. p.domain = DomainMMXSSE
  21886. p.add(0, func(m *_Encoding, v []interface{}) {
  21887. m.rexo(hcode(v[1]), v[0], false)
  21888. m.emit(0x0f)
  21889. m.emit(0xea)
  21890. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21891. })
  21892. }
  21893. // PMINSW m64, mm
  21894. if isM64(v0) && isMM(v1) {
  21895. self.require(ISA_MMX_PLUS)
  21896. p.domain = DomainMMXSSE
  21897. p.add(0, func(m *_Encoding, v []interface{}) {
  21898. m.rexo(hcode(v[1]), addr(v[0]), false)
  21899. m.emit(0x0f)
  21900. m.emit(0xea)
  21901. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21902. })
  21903. }
  21904. // PMINSW xmm, xmm
  21905. if isXMM(v0) && isXMM(v1) {
  21906. self.require(ISA_SSE2)
  21907. p.domain = DomainMMXSSE
  21908. p.add(0, func(m *_Encoding, v []interface{}) {
  21909. m.emit(0x66)
  21910. m.rexo(hcode(v[1]), v[0], false)
  21911. m.emit(0x0f)
  21912. m.emit(0xea)
  21913. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21914. })
  21915. }
  21916. // PMINSW m128, xmm
  21917. if isM128(v0) && isXMM(v1) {
  21918. self.require(ISA_SSE2)
  21919. p.domain = DomainMMXSSE
  21920. p.add(0, func(m *_Encoding, v []interface{}) {
  21921. m.emit(0x66)
  21922. m.rexo(hcode(v[1]), addr(v[0]), false)
  21923. m.emit(0x0f)
  21924. m.emit(0xea)
  21925. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21926. })
  21927. }
  21928. if p.len == 0 {
  21929. panic("invalid operands for PMINSW")
  21930. }
  21931. return p
  21932. }
  21933. // PMINUB performs "Minimum of Packed Unsigned Byte Integers".
  21934. //
  21935. // Mnemonic : PMINUB
  21936. // Supported forms : (4 forms)
  21937. //
  21938. // * PMINUB mm, mm [MMX+]
  21939. // * PMINUB m64, mm [MMX+]
  21940. // * PMINUB xmm, xmm [SSE2]
  21941. // * PMINUB m128, xmm [SSE2]
  21942. //
  21943. func (self *Program) PMINUB(v0 interface{}, v1 interface{}) *Instruction {
  21944. p := self.alloc("PMINUB", 2, Operands { v0, v1 })
  21945. // PMINUB mm, mm
  21946. if isMM(v0) && isMM(v1) {
  21947. self.require(ISA_MMX_PLUS)
  21948. p.domain = DomainMMXSSE
  21949. p.add(0, func(m *_Encoding, v []interface{}) {
  21950. m.rexo(hcode(v[1]), v[0], false)
  21951. m.emit(0x0f)
  21952. m.emit(0xda)
  21953. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21954. })
  21955. }
  21956. // PMINUB m64, mm
  21957. if isM64(v0) && isMM(v1) {
  21958. self.require(ISA_MMX_PLUS)
  21959. p.domain = DomainMMXSSE
  21960. p.add(0, func(m *_Encoding, v []interface{}) {
  21961. m.rexo(hcode(v[1]), addr(v[0]), false)
  21962. m.emit(0x0f)
  21963. m.emit(0xda)
  21964. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21965. })
  21966. }
  21967. // PMINUB xmm, xmm
  21968. if isXMM(v0) && isXMM(v1) {
  21969. self.require(ISA_SSE2)
  21970. p.domain = DomainMMXSSE
  21971. p.add(0, func(m *_Encoding, v []interface{}) {
  21972. m.emit(0x66)
  21973. m.rexo(hcode(v[1]), v[0], false)
  21974. m.emit(0x0f)
  21975. m.emit(0xda)
  21976. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  21977. })
  21978. }
  21979. // PMINUB m128, xmm
  21980. if isM128(v0) && isXMM(v1) {
  21981. self.require(ISA_SSE2)
  21982. p.domain = DomainMMXSSE
  21983. p.add(0, func(m *_Encoding, v []interface{}) {
  21984. m.emit(0x66)
  21985. m.rexo(hcode(v[1]), addr(v[0]), false)
  21986. m.emit(0x0f)
  21987. m.emit(0xda)
  21988. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  21989. })
  21990. }
  21991. if p.len == 0 {
  21992. panic("invalid operands for PMINUB")
  21993. }
  21994. return p
  21995. }
  21996. // PMINUD performs "Minimum of Packed Unsigned Doubleword Integers".
  21997. //
  21998. // Mnemonic : PMINUD
  21999. // Supported forms : (2 forms)
  22000. //
  22001. // * PMINUD xmm, xmm [SSE4.1]
  22002. // * PMINUD m128, xmm [SSE4.1]
  22003. //
  22004. func (self *Program) PMINUD(v0 interface{}, v1 interface{}) *Instruction {
  22005. p := self.alloc("PMINUD", 2, Operands { v0, v1 })
  22006. // PMINUD xmm, xmm
  22007. if isXMM(v0) && isXMM(v1) {
  22008. self.require(ISA_SSE4_1)
  22009. p.domain = DomainMMXSSE
  22010. p.add(0, func(m *_Encoding, v []interface{}) {
  22011. m.emit(0x66)
  22012. m.rexo(hcode(v[1]), v[0], false)
  22013. m.emit(0x0f)
  22014. m.emit(0x38)
  22015. m.emit(0x3b)
  22016. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22017. })
  22018. }
  22019. // PMINUD m128, xmm
  22020. if isM128(v0) && isXMM(v1) {
  22021. self.require(ISA_SSE4_1)
  22022. p.domain = DomainMMXSSE
  22023. p.add(0, func(m *_Encoding, v []interface{}) {
  22024. m.emit(0x66)
  22025. m.rexo(hcode(v[1]), addr(v[0]), false)
  22026. m.emit(0x0f)
  22027. m.emit(0x38)
  22028. m.emit(0x3b)
  22029. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22030. })
  22031. }
  22032. if p.len == 0 {
  22033. panic("invalid operands for PMINUD")
  22034. }
  22035. return p
  22036. }
  22037. // PMINUW performs "Minimum of Packed Unsigned Word Integers".
  22038. //
  22039. // Mnemonic : PMINUW
  22040. // Supported forms : (2 forms)
  22041. //
  22042. // * PMINUW xmm, xmm [SSE4.1]
  22043. // * PMINUW m128, xmm [SSE4.1]
  22044. //
  22045. func (self *Program) PMINUW(v0 interface{}, v1 interface{}) *Instruction {
  22046. p := self.alloc("PMINUW", 2, Operands { v0, v1 })
  22047. // PMINUW xmm, xmm
  22048. if isXMM(v0) && isXMM(v1) {
  22049. self.require(ISA_SSE4_1)
  22050. p.domain = DomainMMXSSE
  22051. p.add(0, func(m *_Encoding, v []interface{}) {
  22052. m.emit(0x66)
  22053. m.rexo(hcode(v[1]), v[0], false)
  22054. m.emit(0x0f)
  22055. m.emit(0x38)
  22056. m.emit(0x3a)
  22057. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22058. })
  22059. }
  22060. // PMINUW m128, xmm
  22061. if isM128(v0) && isXMM(v1) {
  22062. self.require(ISA_SSE4_1)
  22063. p.domain = DomainMMXSSE
  22064. p.add(0, func(m *_Encoding, v []interface{}) {
  22065. m.emit(0x66)
  22066. m.rexo(hcode(v[1]), addr(v[0]), false)
  22067. m.emit(0x0f)
  22068. m.emit(0x38)
  22069. m.emit(0x3a)
  22070. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22071. })
  22072. }
  22073. if p.len == 0 {
  22074. panic("invalid operands for PMINUW")
  22075. }
  22076. return p
  22077. }
  22078. // PMOVMSKB performs "Move Byte Mask".
  22079. //
  22080. // Mnemonic : PMOVMSKB
  22081. // Supported forms : (2 forms)
  22082. //
  22083. // * PMOVMSKB mm, r32 [MMX+]
  22084. // * PMOVMSKB xmm, r32 [SSE2]
  22085. //
  22086. func (self *Program) PMOVMSKB(v0 interface{}, v1 interface{}) *Instruction {
  22087. p := self.alloc("PMOVMSKB", 2, Operands { v0, v1 })
  22088. // PMOVMSKB mm, r32
  22089. if isMM(v0) && isReg32(v1) {
  22090. self.require(ISA_MMX_PLUS)
  22091. p.domain = DomainMMXSSE
  22092. p.add(0, func(m *_Encoding, v []interface{}) {
  22093. m.rexo(hcode(v[1]), v[0], false)
  22094. m.emit(0x0f)
  22095. m.emit(0xd7)
  22096. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22097. })
  22098. }
  22099. // PMOVMSKB xmm, r32
  22100. if isXMM(v0) && isReg32(v1) {
  22101. self.require(ISA_SSE2)
  22102. p.domain = DomainMMXSSE
  22103. p.add(0, func(m *_Encoding, v []interface{}) {
  22104. m.emit(0x66)
  22105. m.rexo(hcode(v[1]), v[0], false)
  22106. m.emit(0x0f)
  22107. m.emit(0xd7)
  22108. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22109. })
  22110. }
  22111. if p.len == 0 {
  22112. panic("invalid operands for PMOVMSKB")
  22113. }
  22114. return p
  22115. }
  22116. // PMOVSXBD performs "Move Packed Byte Integers to Doubleword Integers with Sign Extension".
  22117. //
  22118. // Mnemonic : PMOVSXBD
  22119. // Supported forms : (2 forms)
  22120. //
  22121. // * PMOVSXBD xmm, xmm [SSE4.1]
  22122. // * PMOVSXBD m32, xmm [SSE4.1]
  22123. //
  22124. func (self *Program) PMOVSXBD(v0 interface{}, v1 interface{}) *Instruction {
  22125. p := self.alloc("PMOVSXBD", 2, Operands { v0, v1 })
  22126. // PMOVSXBD xmm, xmm
  22127. if isXMM(v0) && isXMM(v1) {
  22128. self.require(ISA_SSE4_1)
  22129. p.domain = DomainMMXSSE
  22130. p.add(0, func(m *_Encoding, v []interface{}) {
  22131. m.emit(0x66)
  22132. m.rexo(hcode(v[1]), v[0], false)
  22133. m.emit(0x0f)
  22134. m.emit(0x38)
  22135. m.emit(0x21)
  22136. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22137. })
  22138. }
  22139. // PMOVSXBD m32, xmm
  22140. if isM32(v0) && isXMM(v1) {
  22141. self.require(ISA_SSE4_1)
  22142. p.domain = DomainMMXSSE
  22143. p.add(0, func(m *_Encoding, v []interface{}) {
  22144. m.emit(0x66)
  22145. m.rexo(hcode(v[1]), addr(v[0]), false)
  22146. m.emit(0x0f)
  22147. m.emit(0x38)
  22148. m.emit(0x21)
  22149. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22150. })
  22151. }
  22152. if p.len == 0 {
  22153. panic("invalid operands for PMOVSXBD")
  22154. }
  22155. return p
  22156. }
  22157. // PMOVSXBQ performs "Move Packed Byte Integers to Quadword Integers with Sign Extension".
  22158. //
  22159. // Mnemonic : PMOVSXBQ
  22160. // Supported forms : (2 forms)
  22161. //
  22162. // * PMOVSXBQ xmm, xmm [SSE4.1]
  22163. // * PMOVSXBQ m16, xmm [SSE4.1]
  22164. //
  22165. func (self *Program) PMOVSXBQ(v0 interface{}, v1 interface{}) *Instruction {
  22166. p := self.alloc("PMOVSXBQ", 2, Operands { v0, v1 })
  22167. // PMOVSXBQ xmm, xmm
  22168. if isXMM(v0) && isXMM(v1) {
  22169. self.require(ISA_SSE4_1)
  22170. p.domain = DomainMMXSSE
  22171. p.add(0, func(m *_Encoding, v []interface{}) {
  22172. m.emit(0x66)
  22173. m.rexo(hcode(v[1]), v[0], false)
  22174. m.emit(0x0f)
  22175. m.emit(0x38)
  22176. m.emit(0x22)
  22177. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22178. })
  22179. }
  22180. // PMOVSXBQ m16, xmm
  22181. if isM16(v0) && isXMM(v1) {
  22182. self.require(ISA_SSE4_1)
  22183. p.domain = DomainMMXSSE
  22184. p.add(0, func(m *_Encoding, v []interface{}) {
  22185. m.emit(0x66)
  22186. m.rexo(hcode(v[1]), addr(v[0]), false)
  22187. m.emit(0x0f)
  22188. m.emit(0x38)
  22189. m.emit(0x22)
  22190. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22191. })
  22192. }
  22193. if p.len == 0 {
  22194. panic("invalid operands for PMOVSXBQ")
  22195. }
  22196. return p
  22197. }
  22198. // PMOVSXBW performs "Move Packed Byte Integers to Word Integers with Sign Extension".
  22199. //
  22200. // Mnemonic : PMOVSXBW
  22201. // Supported forms : (2 forms)
  22202. //
  22203. // * PMOVSXBW xmm, xmm [SSE4.1]
  22204. // * PMOVSXBW m64, xmm [SSE4.1]
  22205. //
  22206. func (self *Program) PMOVSXBW(v0 interface{}, v1 interface{}) *Instruction {
  22207. p := self.alloc("PMOVSXBW", 2, Operands { v0, v1 })
  22208. // PMOVSXBW xmm, xmm
  22209. if isXMM(v0) && isXMM(v1) {
  22210. self.require(ISA_SSE4_1)
  22211. p.domain = DomainMMXSSE
  22212. p.add(0, func(m *_Encoding, v []interface{}) {
  22213. m.emit(0x66)
  22214. m.rexo(hcode(v[1]), v[0], false)
  22215. m.emit(0x0f)
  22216. m.emit(0x38)
  22217. m.emit(0x20)
  22218. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22219. })
  22220. }
  22221. // PMOVSXBW m64, xmm
  22222. if isM64(v0) && isXMM(v1) {
  22223. self.require(ISA_SSE4_1)
  22224. p.domain = DomainMMXSSE
  22225. p.add(0, func(m *_Encoding, v []interface{}) {
  22226. m.emit(0x66)
  22227. m.rexo(hcode(v[1]), addr(v[0]), false)
  22228. m.emit(0x0f)
  22229. m.emit(0x38)
  22230. m.emit(0x20)
  22231. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22232. })
  22233. }
  22234. if p.len == 0 {
  22235. panic("invalid operands for PMOVSXBW")
  22236. }
  22237. return p
  22238. }
  22239. // PMOVSXDQ performs "Move Packed Doubleword Integers to Quadword Integers with Sign Extension".
  22240. //
  22241. // Mnemonic : PMOVSXDQ
  22242. // Supported forms : (2 forms)
  22243. //
  22244. // * PMOVSXDQ xmm, xmm [SSE4.1]
  22245. // * PMOVSXDQ m64, xmm [SSE4.1]
  22246. //
  22247. func (self *Program) PMOVSXDQ(v0 interface{}, v1 interface{}) *Instruction {
  22248. p := self.alloc("PMOVSXDQ", 2, Operands { v0, v1 })
  22249. // PMOVSXDQ xmm, xmm
  22250. if isXMM(v0) && isXMM(v1) {
  22251. self.require(ISA_SSE4_1)
  22252. p.domain = DomainMMXSSE
  22253. p.add(0, func(m *_Encoding, v []interface{}) {
  22254. m.emit(0x66)
  22255. m.rexo(hcode(v[1]), v[0], false)
  22256. m.emit(0x0f)
  22257. m.emit(0x38)
  22258. m.emit(0x25)
  22259. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22260. })
  22261. }
  22262. // PMOVSXDQ m64, xmm
  22263. if isM64(v0) && isXMM(v1) {
  22264. self.require(ISA_SSE4_1)
  22265. p.domain = DomainMMXSSE
  22266. p.add(0, func(m *_Encoding, v []interface{}) {
  22267. m.emit(0x66)
  22268. m.rexo(hcode(v[1]), addr(v[0]), false)
  22269. m.emit(0x0f)
  22270. m.emit(0x38)
  22271. m.emit(0x25)
  22272. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22273. })
  22274. }
  22275. if p.len == 0 {
  22276. panic("invalid operands for PMOVSXDQ")
  22277. }
  22278. return p
  22279. }
  22280. // PMOVSXWD performs "Move Packed Word Integers to Doubleword Integers with Sign Extension".
  22281. //
  22282. // Mnemonic : PMOVSXWD
  22283. // Supported forms : (2 forms)
  22284. //
  22285. // * PMOVSXWD xmm, xmm [SSE4.1]
  22286. // * PMOVSXWD m64, xmm [SSE4.1]
  22287. //
  22288. func (self *Program) PMOVSXWD(v0 interface{}, v1 interface{}) *Instruction {
  22289. p := self.alloc("PMOVSXWD", 2, Operands { v0, v1 })
  22290. // PMOVSXWD xmm, xmm
  22291. if isXMM(v0) && isXMM(v1) {
  22292. self.require(ISA_SSE4_1)
  22293. p.domain = DomainMMXSSE
  22294. p.add(0, func(m *_Encoding, v []interface{}) {
  22295. m.emit(0x66)
  22296. m.rexo(hcode(v[1]), v[0], false)
  22297. m.emit(0x0f)
  22298. m.emit(0x38)
  22299. m.emit(0x23)
  22300. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22301. })
  22302. }
  22303. // PMOVSXWD m64, xmm
  22304. if isM64(v0) && isXMM(v1) {
  22305. self.require(ISA_SSE4_1)
  22306. p.domain = DomainMMXSSE
  22307. p.add(0, func(m *_Encoding, v []interface{}) {
  22308. m.emit(0x66)
  22309. m.rexo(hcode(v[1]), addr(v[0]), false)
  22310. m.emit(0x0f)
  22311. m.emit(0x38)
  22312. m.emit(0x23)
  22313. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22314. })
  22315. }
  22316. if p.len == 0 {
  22317. panic("invalid operands for PMOVSXWD")
  22318. }
  22319. return p
  22320. }
  22321. // PMOVSXWQ performs "Move Packed Word Integers to Quadword Integers with Sign Extension".
  22322. //
  22323. // Mnemonic : PMOVSXWQ
  22324. // Supported forms : (2 forms)
  22325. //
  22326. // * PMOVSXWQ xmm, xmm [SSE4.1]
  22327. // * PMOVSXWQ m32, xmm [SSE4.1]
  22328. //
  22329. func (self *Program) PMOVSXWQ(v0 interface{}, v1 interface{}) *Instruction {
  22330. p := self.alloc("PMOVSXWQ", 2, Operands { v0, v1 })
  22331. // PMOVSXWQ xmm, xmm
  22332. if isXMM(v0) && isXMM(v1) {
  22333. self.require(ISA_SSE4_1)
  22334. p.domain = DomainMMXSSE
  22335. p.add(0, func(m *_Encoding, v []interface{}) {
  22336. m.emit(0x66)
  22337. m.rexo(hcode(v[1]), v[0], false)
  22338. m.emit(0x0f)
  22339. m.emit(0x38)
  22340. m.emit(0x24)
  22341. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22342. })
  22343. }
  22344. // PMOVSXWQ m32, xmm
  22345. if isM32(v0) && isXMM(v1) {
  22346. self.require(ISA_SSE4_1)
  22347. p.domain = DomainMMXSSE
  22348. p.add(0, func(m *_Encoding, v []interface{}) {
  22349. m.emit(0x66)
  22350. m.rexo(hcode(v[1]), addr(v[0]), false)
  22351. m.emit(0x0f)
  22352. m.emit(0x38)
  22353. m.emit(0x24)
  22354. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22355. })
  22356. }
  22357. if p.len == 0 {
  22358. panic("invalid operands for PMOVSXWQ")
  22359. }
  22360. return p
  22361. }
  22362. // PMOVZXBD performs "Move Packed Byte Integers to Doubleword Integers with Zero Extension".
  22363. //
  22364. // Mnemonic : PMOVZXBD
  22365. // Supported forms : (2 forms)
  22366. //
  22367. // * PMOVZXBD xmm, xmm [SSE4.1]
  22368. // * PMOVZXBD m32, xmm [SSE4.1]
  22369. //
  22370. func (self *Program) PMOVZXBD(v0 interface{}, v1 interface{}) *Instruction {
  22371. p := self.alloc("PMOVZXBD", 2, Operands { v0, v1 })
  22372. // PMOVZXBD xmm, xmm
  22373. if isXMM(v0) && isXMM(v1) {
  22374. self.require(ISA_SSE4_1)
  22375. p.domain = DomainMMXSSE
  22376. p.add(0, func(m *_Encoding, v []interface{}) {
  22377. m.emit(0x66)
  22378. m.rexo(hcode(v[1]), v[0], false)
  22379. m.emit(0x0f)
  22380. m.emit(0x38)
  22381. m.emit(0x31)
  22382. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22383. })
  22384. }
  22385. // PMOVZXBD m32, xmm
  22386. if isM32(v0) && isXMM(v1) {
  22387. self.require(ISA_SSE4_1)
  22388. p.domain = DomainMMXSSE
  22389. p.add(0, func(m *_Encoding, v []interface{}) {
  22390. m.emit(0x66)
  22391. m.rexo(hcode(v[1]), addr(v[0]), false)
  22392. m.emit(0x0f)
  22393. m.emit(0x38)
  22394. m.emit(0x31)
  22395. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22396. })
  22397. }
  22398. if p.len == 0 {
  22399. panic("invalid operands for PMOVZXBD")
  22400. }
  22401. return p
  22402. }
  22403. // PMOVZXBQ performs "Move Packed Byte Integers to Quadword Integers with Zero Extension".
  22404. //
  22405. // Mnemonic : PMOVZXBQ
  22406. // Supported forms : (2 forms)
  22407. //
  22408. // * PMOVZXBQ xmm, xmm [SSE4.1]
  22409. // * PMOVZXBQ m16, xmm [SSE4.1]
  22410. //
  22411. func (self *Program) PMOVZXBQ(v0 interface{}, v1 interface{}) *Instruction {
  22412. p := self.alloc("PMOVZXBQ", 2, Operands { v0, v1 })
  22413. // PMOVZXBQ xmm, xmm
  22414. if isXMM(v0) && isXMM(v1) {
  22415. self.require(ISA_SSE4_1)
  22416. p.domain = DomainMMXSSE
  22417. p.add(0, func(m *_Encoding, v []interface{}) {
  22418. m.emit(0x66)
  22419. m.rexo(hcode(v[1]), v[0], false)
  22420. m.emit(0x0f)
  22421. m.emit(0x38)
  22422. m.emit(0x32)
  22423. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22424. })
  22425. }
  22426. // PMOVZXBQ m16, xmm
  22427. if isM16(v0) && isXMM(v1) {
  22428. self.require(ISA_SSE4_1)
  22429. p.domain = DomainMMXSSE
  22430. p.add(0, func(m *_Encoding, v []interface{}) {
  22431. m.emit(0x66)
  22432. m.rexo(hcode(v[1]), addr(v[0]), false)
  22433. m.emit(0x0f)
  22434. m.emit(0x38)
  22435. m.emit(0x32)
  22436. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22437. })
  22438. }
  22439. if p.len == 0 {
  22440. panic("invalid operands for PMOVZXBQ")
  22441. }
  22442. return p
  22443. }
  22444. // PMOVZXBW performs "Move Packed Byte Integers to Word Integers with Zero Extension".
  22445. //
  22446. // Mnemonic : PMOVZXBW
  22447. // Supported forms : (2 forms)
  22448. //
  22449. // * PMOVZXBW xmm, xmm [SSE4.1]
  22450. // * PMOVZXBW m64, xmm [SSE4.1]
  22451. //
  22452. func (self *Program) PMOVZXBW(v0 interface{}, v1 interface{}) *Instruction {
  22453. p := self.alloc("PMOVZXBW", 2, Operands { v0, v1 })
  22454. // PMOVZXBW xmm, xmm
  22455. if isXMM(v0) && isXMM(v1) {
  22456. self.require(ISA_SSE4_1)
  22457. p.domain = DomainMMXSSE
  22458. p.add(0, func(m *_Encoding, v []interface{}) {
  22459. m.emit(0x66)
  22460. m.rexo(hcode(v[1]), v[0], false)
  22461. m.emit(0x0f)
  22462. m.emit(0x38)
  22463. m.emit(0x30)
  22464. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22465. })
  22466. }
  22467. // PMOVZXBW m64, xmm
  22468. if isM64(v0) && isXMM(v1) {
  22469. self.require(ISA_SSE4_1)
  22470. p.domain = DomainMMXSSE
  22471. p.add(0, func(m *_Encoding, v []interface{}) {
  22472. m.emit(0x66)
  22473. m.rexo(hcode(v[1]), addr(v[0]), false)
  22474. m.emit(0x0f)
  22475. m.emit(0x38)
  22476. m.emit(0x30)
  22477. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22478. })
  22479. }
  22480. if p.len == 0 {
  22481. panic("invalid operands for PMOVZXBW")
  22482. }
  22483. return p
  22484. }
  22485. // PMOVZXDQ performs "Move Packed Doubleword Integers to Quadword Integers with Zero Extension".
  22486. //
  22487. // Mnemonic : PMOVZXDQ
  22488. // Supported forms : (2 forms)
  22489. //
  22490. // * PMOVZXDQ xmm, xmm [SSE4.1]
  22491. // * PMOVZXDQ m64, xmm [SSE4.1]
  22492. //
  22493. func (self *Program) PMOVZXDQ(v0 interface{}, v1 interface{}) *Instruction {
  22494. p := self.alloc("PMOVZXDQ", 2, Operands { v0, v1 })
  22495. // PMOVZXDQ xmm, xmm
  22496. if isXMM(v0) && isXMM(v1) {
  22497. self.require(ISA_SSE4_1)
  22498. p.domain = DomainMMXSSE
  22499. p.add(0, func(m *_Encoding, v []interface{}) {
  22500. m.emit(0x66)
  22501. m.rexo(hcode(v[1]), v[0], false)
  22502. m.emit(0x0f)
  22503. m.emit(0x38)
  22504. m.emit(0x35)
  22505. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22506. })
  22507. }
  22508. // PMOVZXDQ m64, xmm
  22509. if isM64(v0) && isXMM(v1) {
  22510. self.require(ISA_SSE4_1)
  22511. p.domain = DomainMMXSSE
  22512. p.add(0, func(m *_Encoding, v []interface{}) {
  22513. m.emit(0x66)
  22514. m.rexo(hcode(v[1]), addr(v[0]), false)
  22515. m.emit(0x0f)
  22516. m.emit(0x38)
  22517. m.emit(0x35)
  22518. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22519. })
  22520. }
  22521. if p.len == 0 {
  22522. panic("invalid operands for PMOVZXDQ")
  22523. }
  22524. return p
  22525. }
  22526. // PMOVZXWD performs "Move Packed Word Integers to Doubleword Integers with Zero Extension".
  22527. //
  22528. // Mnemonic : PMOVZXWD
  22529. // Supported forms : (2 forms)
  22530. //
  22531. // * PMOVZXWD xmm, xmm [SSE4.1]
  22532. // * PMOVZXWD m64, xmm [SSE4.1]
  22533. //
  22534. func (self *Program) PMOVZXWD(v0 interface{}, v1 interface{}) *Instruction {
  22535. p := self.alloc("PMOVZXWD", 2, Operands { v0, v1 })
  22536. // PMOVZXWD xmm, xmm
  22537. if isXMM(v0) && isXMM(v1) {
  22538. self.require(ISA_SSE4_1)
  22539. p.domain = DomainMMXSSE
  22540. p.add(0, func(m *_Encoding, v []interface{}) {
  22541. m.emit(0x66)
  22542. m.rexo(hcode(v[1]), v[0], false)
  22543. m.emit(0x0f)
  22544. m.emit(0x38)
  22545. m.emit(0x33)
  22546. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22547. })
  22548. }
  22549. // PMOVZXWD m64, xmm
  22550. if isM64(v0) && isXMM(v1) {
  22551. self.require(ISA_SSE4_1)
  22552. p.domain = DomainMMXSSE
  22553. p.add(0, func(m *_Encoding, v []interface{}) {
  22554. m.emit(0x66)
  22555. m.rexo(hcode(v[1]), addr(v[0]), false)
  22556. m.emit(0x0f)
  22557. m.emit(0x38)
  22558. m.emit(0x33)
  22559. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22560. })
  22561. }
  22562. if p.len == 0 {
  22563. panic("invalid operands for PMOVZXWD")
  22564. }
  22565. return p
  22566. }
  22567. // PMOVZXWQ performs "Move Packed Word Integers to Quadword Integers with Zero Extension".
  22568. //
  22569. // Mnemonic : PMOVZXWQ
  22570. // Supported forms : (2 forms)
  22571. //
  22572. // * PMOVZXWQ xmm, xmm [SSE4.1]
  22573. // * PMOVZXWQ m32, xmm [SSE4.1]
  22574. //
  22575. func (self *Program) PMOVZXWQ(v0 interface{}, v1 interface{}) *Instruction {
  22576. p := self.alloc("PMOVZXWQ", 2, Operands { v0, v1 })
  22577. // PMOVZXWQ xmm, xmm
  22578. if isXMM(v0) && isXMM(v1) {
  22579. self.require(ISA_SSE4_1)
  22580. p.domain = DomainMMXSSE
  22581. p.add(0, func(m *_Encoding, v []interface{}) {
  22582. m.emit(0x66)
  22583. m.rexo(hcode(v[1]), v[0], false)
  22584. m.emit(0x0f)
  22585. m.emit(0x38)
  22586. m.emit(0x34)
  22587. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22588. })
  22589. }
  22590. // PMOVZXWQ m32, xmm
  22591. if isM32(v0) && isXMM(v1) {
  22592. self.require(ISA_SSE4_1)
  22593. p.domain = DomainMMXSSE
  22594. p.add(0, func(m *_Encoding, v []interface{}) {
  22595. m.emit(0x66)
  22596. m.rexo(hcode(v[1]), addr(v[0]), false)
  22597. m.emit(0x0f)
  22598. m.emit(0x38)
  22599. m.emit(0x34)
  22600. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22601. })
  22602. }
  22603. if p.len == 0 {
  22604. panic("invalid operands for PMOVZXWQ")
  22605. }
  22606. return p
  22607. }
  22608. // PMULDQ performs "Multiply Packed Signed Doubleword Integers and Store Quadword Result".
  22609. //
  22610. // Mnemonic : PMULDQ
  22611. // Supported forms : (2 forms)
  22612. //
  22613. // * PMULDQ xmm, xmm [SSE4.1]
  22614. // * PMULDQ m128, xmm [SSE4.1]
  22615. //
  22616. func (self *Program) PMULDQ(v0 interface{}, v1 interface{}) *Instruction {
  22617. p := self.alloc("PMULDQ", 2, Operands { v0, v1 })
  22618. // PMULDQ xmm, xmm
  22619. if isXMM(v0) && isXMM(v1) {
  22620. self.require(ISA_SSE4_1)
  22621. p.domain = DomainMMXSSE
  22622. p.add(0, func(m *_Encoding, v []interface{}) {
  22623. m.emit(0x66)
  22624. m.rexo(hcode(v[1]), v[0], false)
  22625. m.emit(0x0f)
  22626. m.emit(0x38)
  22627. m.emit(0x28)
  22628. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22629. })
  22630. }
  22631. // PMULDQ m128, xmm
  22632. if isM128(v0) && isXMM(v1) {
  22633. self.require(ISA_SSE4_1)
  22634. p.domain = DomainMMXSSE
  22635. p.add(0, func(m *_Encoding, v []interface{}) {
  22636. m.emit(0x66)
  22637. m.rexo(hcode(v[1]), addr(v[0]), false)
  22638. m.emit(0x0f)
  22639. m.emit(0x38)
  22640. m.emit(0x28)
  22641. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22642. })
  22643. }
  22644. if p.len == 0 {
  22645. panic("invalid operands for PMULDQ")
  22646. }
  22647. return p
  22648. }
  22649. // PMULHRSW performs "Packed Multiply Signed Word Integers and Store High Result with Round and Scale".
  22650. //
  22651. // Mnemonic : PMULHRSW
  22652. // Supported forms : (4 forms)
  22653. //
  22654. // * PMULHRSW mm, mm [SSSE3]
  22655. // * PMULHRSW m64, mm [SSSE3]
  22656. // * PMULHRSW xmm, xmm [SSSE3]
  22657. // * PMULHRSW m128, xmm [SSSE3]
  22658. //
  22659. func (self *Program) PMULHRSW(v0 interface{}, v1 interface{}) *Instruction {
  22660. p := self.alloc("PMULHRSW", 2, Operands { v0, v1 })
  22661. // PMULHRSW mm, mm
  22662. if isMM(v0) && isMM(v1) {
  22663. self.require(ISA_SSSE3)
  22664. p.domain = DomainMMXSSE
  22665. p.add(0, func(m *_Encoding, v []interface{}) {
  22666. m.rexo(hcode(v[1]), v[0], false)
  22667. m.emit(0x0f)
  22668. m.emit(0x38)
  22669. m.emit(0x0b)
  22670. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22671. })
  22672. }
  22673. // PMULHRSW m64, mm
  22674. if isM64(v0) && isMM(v1) {
  22675. self.require(ISA_SSSE3)
  22676. p.domain = DomainMMXSSE
  22677. p.add(0, func(m *_Encoding, v []interface{}) {
  22678. m.rexo(hcode(v[1]), addr(v[0]), false)
  22679. m.emit(0x0f)
  22680. m.emit(0x38)
  22681. m.emit(0x0b)
  22682. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22683. })
  22684. }
  22685. // PMULHRSW xmm, xmm
  22686. if isXMM(v0) && isXMM(v1) {
  22687. self.require(ISA_SSSE3)
  22688. p.domain = DomainMMXSSE
  22689. p.add(0, func(m *_Encoding, v []interface{}) {
  22690. m.emit(0x66)
  22691. m.rexo(hcode(v[1]), v[0], false)
  22692. m.emit(0x0f)
  22693. m.emit(0x38)
  22694. m.emit(0x0b)
  22695. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22696. })
  22697. }
  22698. // PMULHRSW m128, xmm
  22699. if isM128(v0) && isXMM(v1) {
  22700. self.require(ISA_SSSE3)
  22701. p.domain = DomainMMXSSE
  22702. p.add(0, func(m *_Encoding, v []interface{}) {
  22703. m.emit(0x66)
  22704. m.rexo(hcode(v[1]), addr(v[0]), false)
  22705. m.emit(0x0f)
  22706. m.emit(0x38)
  22707. m.emit(0x0b)
  22708. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22709. })
  22710. }
  22711. if p.len == 0 {
  22712. panic("invalid operands for PMULHRSW")
  22713. }
  22714. return p
  22715. }
  22716. // PMULHRW performs "Packed Multiply High Rounded Word".
  22717. //
  22718. // Mnemonic : PMULHRW
  22719. // Supported forms : (2 forms)
  22720. //
  22721. // * PMULHRW mm, mm [3dnow!]
  22722. // * PMULHRW m64, mm [3dnow!]
  22723. //
  22724. func (self *Program) PMULHRW(v0 interface{}, v1 interface{}) *Instruction {
  22725. p := self.alloc("PMULHRW", 2, Operands { v0, v1 })
  22726. // PMULHRW mm, mm
  22727. if isMM(v0) && isMM(v1) {
  22728. self.require(ISA_3DNOW)
  22729. p.domain = DomainAMDSpecific
  22730. p.add(0, func(m *_Encoding, v []interface{}) {
  22731. m.rexo(hcode(v[1]), v[0], false)
  22732. m.emit(0x0f)
  22733. m.emit(0x0f)
  22734. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22735. m.emit(0xb7)
  22736. })
  22737. }
  22738. // PMULHRW m64, mm
  22739. if isM64(v0) && isMM(v1) {
  22740. self.require(ISA_3DNOW)
  22741. p.domain = DomainAMDSpecific
  22742. p.add(0, func(m *_Encoding, v []interface{}) {
  22743. m.rexo(hcode(v[1]), addr(v[0]), false)
  22744. m.emit(0x0f)
  22745. m.emit(0x0f)
  22746. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22747. m.emit(0xb7)
  22748. })
  22749. }
  22750. if p.len == 0 {
  22751. panic("invalid operands for PMULHRW")
  22752. }
  22753. return p
  22754. }
  22755. // PMULHUW performs "Multiply Packed Unsigned Word Integers and Store High Result".
  22756. //
  22757. // Mnemonic : PMULHUW
  22758. // Supported forms : (4 forms)
  22759. //
  22760. // * PMULHUW mm, mm [MMX+]
  22761. // * PMULHUW m64, mm [MMX+]
  22762. // * PMULHUW xmm, xmm [SSE2]
  22763. // * PMULHUW m128, xmm [SSE2]
  22764. //
  22765. func (self *Program) PMULHUW(v0 interface{}, v1 interface{}) *Instruction {
  22766. p := self.alloc("PMULHUW", 2, Operands { v0, v1 })
  22767. // PMULHUW mm, mm
  22768. if isMM(v0) && isMM(v1) {
  22769. self.require(ISA_MMX_PLUS)
  22770. p.domain = DomainMMXSSE
  22771. p.add(0, func(m *_Encoding, v []interface{}) {
  22772. m.rexo(hcode(v[1]), v[0], false)
  22773. m.emit(0x0f)
  22774. m.emit(0xe4)
  22775. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22776. })
  22777. }
  22778. // PMULHUW m64, mm
  22779. if isM64(v0) && isMM(v1) {
  22780. self.require(ISA_MMX_PLUS)
  22781. p.domain = DomainMMXSSE
  22782. p.add(0, func(m *_Encoding, v []interface{}) {
  22783. m.rexo(hcode(v[1]), addr(v[0]), false)
  22784. m.emit(0x0f)
  22785. m.emit(0xe4)
  22786. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22787. })
  22788. }
  22789. // PMULHUW xmm, xmm
  22790. if isXMM(v0) && isXMM(v1) {
  22791. self.require(ISA_SSE2)
  22792. p.domain = DomainMMXSSE
  22793. p.add(0, func(m *_Encoding, v []interface{}) {
  22794. m.emit(0x66)
  22795. m.rexo(hcode(v[1]), v[0], false)
  22796. m.emit(0x0f)
  22797. m.emit(0xe4)
  22798. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22799. })
  22800. }
  22801. // PMULHUW m128, xmm
  22802. if isM128(v0) && isXMM(v1) {
  22803. self.require(ISA_SSE2)
  22804. p.domain = DomainMMXSSE
  22805. p.add(0, func(m *_Encoding, v []interface{}) {
  22806. m.emit(0x66)
  22807. m.rexo(hcode(v[1]), addr(v[0]), false)
  22808. m.emit(0x0f)
  22809. m.emit(0xe4)
  22810. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22811. })
  22812. }
  22813. if p.len == 0 {
  22814. panic("invalid operands for PMULHUW")
  22815. }
  22816. return p
  22817. }
  22818. // PMULHW performs "Multiply Packed Signed Word Integers and Store High Result".
  22819. //
  22820. // Mnemonic : PMULHW
  22821. // Supported forms : (4 forms)
  22822. //
  22823. // * PMULHW mm, mm [MMX]
  22824. // * PMULHW m64, mm [MMX]
  22825. // * PMULHW xmm, xmm [SSE2]
  22826. // * PMULHW m128, xmm [SSE2]
  22827. //
  22828. func (self *Program) PMULHW(v0 interface{}, v1 interface{}) *Instruction {
  22829. p := self.alloc("PMULHW", 2, Operands { v0, v1 })
  22830. // PMULHW mm, mm
  22831. if isMM(v0) && isMM(v1) {
  22832. self.require(ISA_MMX)
  22833. p.domain = DomainMMXSSE
  22834. p.add(0, func(m *_Encoding, v []interface{}) {
  22835. m.rexo(hcode(v[1]), v[0], false)
  22836. m.emit(0x0f)
  22837. m.emit(0xe5)
  22838. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22839. })
  22840. }
  22841. // PMULHW m64, mm
  22842. if isM64(v0) && isMM(v1) {
  22843. self.require(ISA_MMX)
  22844. p.domain = DomainMMXSSE
  22845. p.add(0, func(m *_Encoding, v []interface{}) {
  22846. m.rexo(hcode(v[1]), addr(v[0]), false)
  22847. m.emit(0x0f)
  22848. m.emit(0xe5)
  22849. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22850. })
  22851. }
  22852. // PMULHW xmm, xmm
  22853. if isXMM(v0) && isXMM(v1) {
  22854. self.require(ISA_SSE2)
  22855. p.domain = DomainMMXSSE
  22856. p.add(0, func(m *_Encoding, v []interface{}) {
  22857. m.emit(0x66)
  22858. m.rexo(hcode(v[1]), v[0], false)
  22859. m.emit(0x0f)
  22860. m.emit(0xe5)
  22861. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22862. })
  22863. }
  22864. // PMULHW m128, xmm
  22865. if isM128(v0) && isXMM(v1) {
  22866. self.require(ISA_SSE2)
  22867. p.domain = DomainMMXSSE
  22868. p.add(0, func(m *_Encoding, v []interface{}) {
  22869. m.emit(0x66)
  22870. m.rexo(hcode(v[1]), addr(v[0]), false)
  22871. m.emit(0x0f)
  22872. m.emit(0xe5)
  22873. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22874. })
  22875. }
  22876. if p.len == 0 {
  22877. panic("invalid operands for PMULHW")
  22878. }
  22879. return p
  22880. }
  22881. // PMULLD performs "Multiply Packed Signed Doubleword Integers and Store Low Result".
  22882. //
  22883. // Mnemonic : PMULLD
  22884. // Supported forms : (2 forms)
  22885. //
  22886. // * PMULLD xmm, xmm [SSE4.1]
  22887. // * PMULLD m128, xmm [SSE4.1]
  22888. //
  22889. func (self *Program) PMULLD(v0 interface{}, v1 interface{}) *Instruction {
  22890. p := self.alloc("PMULLD", 2, Operands { v0, v1 })
  22891. // PMULLD xmm, xmm
  22892. if isXMM(v0) && isXMM(v1) {
  22893. self.require(ISA_SSE4_1)
  22894. p.domain = DomainMMXSSE
  22895. p.add(0, func(m *_Encoding, v []interface{}) {
  22896. m.emit(0x66)
  22897. m.rexo(hcode(v[1]), v[0], false)
  22898. m.emit(0x0f)
  22899. m.emit(0x38)
  22900. m.emit(0x40)
  22901. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22902. })
  22903. }
  22904. // PMULLD m128, xmm
  22905. if isM128(v0) && isXMM(v1) {
  22906. self.require(ISA_SSE4_1)
  22907. p.domain = DomainMMXSSE
  22908. p.add(0, func(m *_Encoding, v []interface{}) {
  22909. m.emit(0x66)
  22910. m.rexo(hcode(v[1]), addr(v[0]), false)
  22911. m.emit(0x0f)
  22912. m.emit(0x38)
  22913. m.emit(0x40)
  22914. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22915. })
  22916. }
  22917. if p.len == 0 {
  22918. panic("invalid operands for PMULLD")
  22919. }
  22920. return p
  22921. }
  22922. // PMULLW performs "Multiply Packed Signed Word Integers and Store Low Result".
  22923. //
  22924. // Mnemonic : PMULLW
  22925. // Supported forms : (4 forms)
  22926. //
  22927. // * PMULLW mm, mm [MMX]
  22928. // * PMULLW m64, mm [MMX]
  22929. // * PMULLW xmm, xmm [SSE2]
  22930. // * PMULLW m128, xmm [SSE2]
  22931. //
  22932. func (self *Program) PMULLW(v0 interface{}, v1 interface{}) *Instruction {
  22933. p := self.alloc("PMULLW", 2, Operands { v0, v1 })
  22934. // PMULLW mm, mm
  22935. if isMM(v0) && isMM(v1) {
  22936. self.require(ISA_MMX)
  22937. p.domain = DomainMMXSSE
  22938. p.add(0, func(m *_Encoding, v []interface{}) {
  22939. m.rexo(hcode(v[1]), v[0], false)
  22940. m.emit(0x0f)
  22941. m.emit(0xd5)
  22942. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22943. })
  22944. }
  22945. // PMULLW m64, mm
  22946. if isM64(v0) && isMM(v1) {
  22947. self.require(ISA_MMX)
  22948. p.domain = DomainMMXSSE
  22949. p.add(0, func(m *_Encoding, v []interface{}) {
  22950. m.rexo(hcode(v[1]), addr(v[0]), false)
  22951. m.emit(0x0f)
  22952. m.emit(0xd5)
  22953. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22954. })
  22955. }
  22956. // PMULLW xmm, xmm
  22957. if isXMM(v0) && isXMM(v1) {
  22958. self.require(ISA_SSE2)
  22959. p.domain = DomainMMXSSE
  22960. p.add(0, func(m *_Encoding, v []interface{}) {
  22961. m.emit(0x66)
  22962. m.rexo(hcode(v[1]), v[0], false)
  22963. m.emit(0x0f)
  22964. m.emit(0xd5)
  22965. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  22966. })
  22967. }
  22968. // PMULLW m128, xmm
  22969. if isM128(v0) && isXMM(v1) {
  22970. self.require(ISA_SSE2)
  22971. p.domain = DomainMMXSSE
  22972. p.add(0, func(m *_Encoding, v []interface{}) {
  22973. m.emit(0x66)
  22974. m.rexo(hcode(v[1]), addr(v[0]), false)
  22975. m.emit(0x0f)
  22976. m.emit(0xd5)
  22977. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  22978. })
  22979. }
  22980. if p.len == 0 {
  22981. panic("invalid operands for PMULLW")
  22982. }
  22983. return p
  22984. }
  22985. // PMULUDQ performs "Multiply Packed Unsigned Doubleword Integers".
  22986. //
  22987. // Mnemonic : PMULUDQ
  22988. // Supported forms : (4 forms)
  22989. //
  22990. // * PMULUDQ mm, mm [SSE2]
  22991. // * PMULUDQ m64, mm [SSE2]
  22992. // * PMULUDQ xmm, xmm [SSE2]
  22993. // * PMULUDQ m128, xmm [SSE2]
  22994. //
  22995. func (self *Program) PMULUDQ(v0 interface{}, v1 interface{}) *Instruction {
  22996. p := self.alloc("PMULUDQ", 2, Operands { v0, v1 })
  22997. // PMULUDQ mm, mm
  22998. if isMM(v0) && isMM(v1) {
  22999. self.require(ISA_SSE2)
  23000. p.domain = DomainMMXSSE
  23001. p.add(0, func(m *_Encoding, v []interface{}) {
  23002. m.rexo(hcode(v[1]), v[0], false)
  23003. m.emit(0x0f)
  23004. m.emit(0xf4)
  23005. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  23006. })
  23007. }
  23008. // PMULUDQ m64, mm
  23009. if isM64(v0) && isMM(v1) {
  23010. self.require(ISA_SSE2)
  23011. p.domain = DomainMMXSSE
  23012. p.add(0, func(m *_Encoding, v []interface{}) {
  23013. m.rexo(hcode(v[1]), addr(v[0]), false)
  23014. m.emit(0x0f)
  23015. m.emit(0xf4)
  23016. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  23017. })
  23018. }
  23019. // PMULUDQ xmm, xmm
  23020. if isXMM(v0) && isXMM(v1) {
  23021. self.require(ISA_SSE2)
  23022. p.domain = DomainMMXSSE
  23023. p.add(0, func(m *_Encoding, v []interface{}) {
  23024. m.emit(0x66)
  23025. m.rexo(hcode(v[1]), v[0], false)
  23026. m.emit(0x0f)
  23027. m.emit(0xf4)
  23028. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  23029. })
  23030. }
  23031. // PMULUDQ m128, xmm
  23032. if isM128(v0) && isXMM(v1) {
  23033. self.require(ISA_SSE2)
  23034. p.domain = DomainMMXSSE
  23035. p.add(0, func(m *_Encoding, v []interface{}) {
  23036. m.emit(0x66)
  23037. m.rexo(hcode(v[1]), addr(v[0]), false)
  23038. m.emit(0x0f)
  23039. m.emit(0xf4)
  23040. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  23041. })
  23042. }
  23043. if p.len == 0 {
  23044. panic("invalid operands for PMULUDQ")
  23045. }
  23046. return p
  23047. }
  23048. // POPCNTL performs "Count of Number of Bits Set to 1".
  23049. //
  23050. // Mnemonic : POPCNT
  23051. // Supported forms : (2 forms)
  23052. //
  23053. // * POPCNTL r32, r32 [POPCNT]
  23054. // * POPCNTL m32, r32 [POPCNT]
  23055. //
  23056. func (self *Program) POPCNTL(v0 interface{}, v1 interface{}) *Instruction {
  23057. p := self.alloc("POPCNTL", 2, Operands { v0, v1 })
  23058. // POPCNTL r32, r32
  23059. if isReg32(v0) && isReg32(v1) {
  23060. self.require(ISA_POPCNT)
  23061. p.domain = DomainGeneric
  23062. p.add(0, func(m *_Encoding, v []interface{}) {
  23063. m.emit(0xf3)
  23064. m.rexo(hcode(v[1]), v[0], false)
  23065. m.emit(0x0f)
  23066. m.emit(0xb8)
  23067. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  23068. })
  23069. }
  23070. // POPCNTL m32, r32
  23071. if isM32(v0) && isReg32(v1) {
  23072. self.require(ISA_POPCNT)
  23073. p.domain = DomainGeneric
  23074. p.add(0, func(m *_Encoding, v []interface{}) {
  23075. m.emit(0xf3)
  23076. m.rexo(hcode(v[1]), addr(v[0]), false)
  23077. m.emit(0x0f)
  23078. m.emit(0xb8)
  23079. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  23080. })
  23081. }
  23082. if p.len == 0 {
  23083. panic("invalid operands for POPCNTL")
  23084. }
  23085. return p
  23086. }
  23087. // POPCNTQ performs "Count of Number of Bits Set to 1".
  23088. //
  23089. // Mnemonic : POPCNT
  23090. // Supported forms : (2 forms)
  23091. //
  23092. // * POPCNTQ r64, r64 [POPCNT]
  23093. // * POPCNTQ m64, r64 [POPCNT]
  23094. //
  23095. func (self *Program) POPCNTQ(v0 interface{}, v1 interface{}) *Instruction {
  23096. p := self.alloc("POPCNTQ", 2, Operands { v0, v1 })
  23097. // POPCNTQ r64, r64
  23098. if isReg64(v0) && isReg64(v1) {
  23099. self.require(ISA_POPCNT)
  23100. p.domain = DomainGeneric
  23101. p.add(0, func(m *_Encoding, v []interface{}) {
  23102. m.emit(0xf3)
  23103. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  23104. m.emit(0x0f)
  23105. m.emit(0xb8)
  23106. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  23107. })
  23108. }
  23109. // POPCNTQ m64, r64
  23110. if isM64(v0) && isReg64(v1) {
  23111. self.require(ISA_POPCNT)
  23112. p.domain = DomainGeneric
  23113. p.add(0, func(m *_Encoding, v []interface{}) {
  23114. m.emit(0xf3)
  23115. m.rexm(1, hcode(v[1]), addr(v[0]))
  23116. m.emit(0x0f)
  23117. m.emit(0xb8)
  23118. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  23119. })
  23120. }
  23121. if p.len == 0 {
  23122. panic("invalid operands for POPCNTQ")
  23123. }
  23124. return p
  23125. }
  23126. // POPCNTW performs "Count of Number of Bits Set to 1".
  23127. //
  23128. // Mnemonic : POPCNT
  23129. // Supported forms : (2 forms)
  23130. //
  23131. // * POPCNTW r16, r16 [POPCNT]
  23132. // * POPCNTW m16, r16 [POPCNT]
  23133. //
  23134. func (self *Program) POPCNTW(v0 interface{}, v1 interface{}) *Instruction {
  23135. p := self.alloc("POPCNTW", 2, Operands { v0, v1 })
  23136. // POPCNTW r16, r16
  23137. if isReg16(v0) && isReg16(v1) {
  23138. self.require(ISA_POPCNT)
  23139. p.domain = DomainGeneric
  23140. p.add(0, func(m *_Encoding, v []interface{}) {
  23141. m.emit(0x66)
  23142. m.emit(0xf3)
  23143. m.rexo(hcode(v[1]), v[0], false)
  23144. m.emit(0x0f)
  23145. m.emit(0xb8)
  23146. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  23147. })
  23148. }
  23149. // POPCNTW m16, r16
  23150. if isM16(v0) && isReg16(v1) {
  23151. self.require(ISA_POPCNT)
  23152. p.domain = DomainGeneric
  23153. p.add(0, func(m *_Encoding, v []interface{}) {
  23154. m.emit(0x66)
  23155. m.emit(0xf3)
  23156. m.rexo(hcode(v[1]), addr(v[0]), false)
  23157. m.emit(0x0f)
  23158. m.emit(0xb8)
  23159. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  23160. })
  23161. }
  23162. if p.len == 0 {
  23163. panic("invalid operands for POPCNTW")
  23164. }
  23165. return p
  23166. }
  23167. // POPQ performs "Pop a Value from the Stack".
  23168. //
  23169. // Mnemonic : POP
  23170. // Supported forms : (2 forms)
  23171. //
  23172. // * POPQ r64
  23173. // * POPQ m64
  23174. //
  23175. func (self *Program) POPQ(v0 interface{}) *Instruction {
  23176. p := self.alloc("POPQ", 1, Operands { v0 })
  23177. // POPQ r64
  23178. if isReg64(v0) {
  23179. p.domain = DomainGeneric
  23180. p.add(0, func(m *_Encoding, v []interface{}) {
  23181. m.rexo(0, v[0], false)
  23182. m.emit(0x58 | lcode(v[0]))
  23183. })
  23184. p.add(0, func(m *_Encoding, v []interface{}) {
  23185. m.rexo(0, v[0], false)
  23186. m.emit(0x8f)
  23187. m.emit(0xc0 | lcode(v[0]))
  23188. })
  23189. }
  23190. // POPQ m64
  23191. if isM64(v0) {
  23192. p.domain = DomainGeneric
  23193. p.add(0, func(m *_Encoding, v []interface{}) {
  23194. m.rexo(0, addr(v[0]), false)
  23195. m.emit(0x8f)
  23196. m.mrsd(0, addr(v[0]), 1)
  23197. })
  23198. }
  23199. if p.len == 0 {
  23200. panic("invalid operands for POPQ")
  23201. }
  23202. return p
  23203. }
  23204. // POPW performs "Pop a Value from the Stack".
  23205. //
  23206. // Mnemonic : POP
  23207. // Supported forms : (2 forms)
  23208. //
  23209. // * POPW r16
  23210. // * POPW m16
  23211. //
  23212. func (self *Program) POPW(v0 interface{}) *Instruction {
  23213. p := self.alloc("POPW", 1, Operands { v0 })
  23214. // POPW r16
  23215. if isReg16(v0) {
  23216. p.domain = DomainGeneric
  23217. p.add(0, func(m *_Encoding, v []interface{}) {
  23218. m.emit(0x66)
  23219. m.rexo(0, v[0], false)
  23220. m.emit(0x58 | lcode(v[0]))
  23221. })
  23222. p.add(0, func(m *_Encoding, v []interface{}) {
  23223. m.emit(0x66)
  23224. m.rexo(0, v[0], false)
  23225. m.emit(0x8f)
  23226. m.emit(0xc0 | lcode(v[0]))
  23227. })
  23228. }
  23229. // POPW m16
  23230. if isM16(v0) {
  23231. p.domain = DomainGeneric
  23232. p.add(0, func(m *_Encoding, v []interface{}) {
  23233. m.emit(0x66)
  23234. m.rexo(0, addr(v[0]), false)
  23235. m.emit(0x8f)
  23236. m.mrsd(0, addr(v[0]), 1)
  23237. })
  23238. }
  23239. if p.len == 0 {
  23240. panic("invalid operands for POPW")
  23241. }
  23242. return p
  23243. }
  23244. // POR performs "Packed Bitwise Logical OR".
  23245. //
  23246. // Mnemonic : POR
  23247. // Supported forms : (4 forms)
  23248. //
  23249. // * POR mm, mm [MMX]
  23250. // * POR m64, mm [MMX]
  23251. // * POR xmm, xmm [SSE2]
  23252. // * POR m128, xmm [SSE2]
  23253. //
  23254. func (self *Program) POR(v0 interface{}, v1 interface{}) *Instruction {
  23255. p := self.alloc("POR", 2, Operands { v0, v1 })
  23256. // POR mm, mm
  23257. if isMM(v0) && isMM(v1) {
  23258. self.require(ISA_MMX)
  23259. p.domain = DomainMMXSSE
  23260. p.add(0, func(m *_Encoding, v []interface{}) {
  23261. m.rexo(hcode(v[1]), v[0], false)
  23262. m.emit(0x0f)
  23263. m.emit(0xeb)
  23264. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  23265. })
  23266. }
  23267. // POR m64, mm
  23268. if isM64(v0) && isMM(v1) {
  23269. self.require(ISA_MMX)
  23270. p.domain = DomainMMXSSE
  23271. p.add(0, func(m *_Encoding, v []interface{}) {
  23272. m.rexo(hcode(v[1]), addr(v[0]), false)
  23273. m.emit(0x0f)
  23274. m.emit(0xeb)
  23275. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  23276. })
  23277. }
  23278. // POR xmm, xmm
  23279. if isXMM(v0) && isXMM(v1) {
  23280. self.require(ISA_SSE2)
  23281. p.domain = DomainMMXSSE
  23282. p.add(0, func(m *_Encoding, v []interface{}) {
  23283. m.emit(0x66)
  23284. m.rexo(hcode(v[1]), v[0], false)
  23285. m.emit(0x0f)
  23286. m.emit(0xeb)
  23287. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  23288. })
  23289. }
  23290. // POR m128, xmm
  23291. if isM128(v0) && isXMM(v1) {
  23292. self.require(ISA_SSE2)
  23293. p.domain = DomainMMXSSE
  23294. p.add(0, func(m *_Encoding, v []interface{}) {
  23295. m.emit(0x66)
  23296. m.rexo(hcode(v[1]), addr(v[0]), false)
  23297. m.emit(0x0f)
  23298. m.emit(0xeb)
  23299. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  23300. })
  23301. }
  23302. if p.len == 0 {
  23303. panic("invalid operands for POR")
  23304. }
  23305. return p
  23306. }
  23307. // PREFETCH performs "Prefetch Data into Caches".
  23308. //
  23309. // Mnemonic : PREFETCH
  23310. // Supported forms : (1 form)
  23311. //
  23312. // * PREFETCH m8 [PREFETCH]
  23313. //
  23314. func (self *Program) PREFETCH(v0 interface{}) *Instruction {
  23315. p := self.alloc("PREFETCH", 1, Operands { v0 })
  23316. // PREFETCH m8
  23317. if isM8(v0) {
  23318. self.require(ISA_PREFETCH)
  23319. p.domain = DomainGeneric
  23320. p.add(0, func(m *_Encoding, v []interface{}) {
  23321. m.rexo(0, addr(v[0]), false)
  23322. m.emit(0x0f)
  23323. m.emit(0x0d)
  23324. m.mrsd(0, addr(v[0]), 1)
  23325. })
  23326. }
  23327. if p.len == 0 {
  23328. panic("invalid operands for PREFETCH")
  23329. }
  23330. return p
  23331. }
  23332. // PREFETCHNTA performs "Prefetch Data Into Caches using NTA Hint".
  23333. //
  23334. // Mnemonic : PREFETCHNTA
  23335. // Supported forms : (1 form)
  23336. //
  23337. // * PREFETCHNTA m8 [MMX+]
  23338. //
  23339. func (self *Program) PREFETCHNTA(v0 interface{}) *Instruction {
  23340. p := self.alloc("PREFETCHNTA", 1, Operands { v0 })
  23341. // PREFETCHNTA m8
  23342. if isM8(v0) {
  23343. self.require(ISA_MMX_PLUS)
  23344. p.domain = DomainGeneric
  23345. p.add(0, func(m *_Encoding, v []interface{}) {
  23346. m.rexo(0, addr(v[0]), false)
  23347. m.emit(0x0f)
  23348. m.emit(0x18)
  23349. m.mrsd(0, addr(v[0]), 1)
  23350. })
  23351. }
  23352. if p.len == 0 {
  23353. panic("invalid operands for PREFETCHNTA")
  23354. }
  23355. return p
  23356. }
  23357. // PREFETCHT0 performs "Prefetch Data Into Caches using T0 Hint".
  23358. //
  23359. // Mnemonic : PREFETCHT0
  23360. // Supported forms : (1 form)
  23361. //
  23362. // * PREFETCHT0 m8 [MMX+]
  23363. //
  23364. func (self *Program) PREFETCHT0(v0 interface{}) *Instruction {
  23365. p := self.alloc("PREFETCHT0", 1, Operands { v0 })
  23366. // PREFETCHT0 m8
  23367. if isM8(v0) {
  23368. self.require(ISA_MMX_PLUS)
  23369. p.domain = DomainGeneric
  23370. p.add(0, func(m *_Encoding, v []interface{}) {
  23371. m.rexo(0, addr(v[0]), false)
  23372. m.emit(0x0f)
  23373. m.emit(0x18)
  23374. m.mrsd(1, addr(v[0]), 1)
  23375. })
  23376. }
  23377. if p.len == 0 {
  23378. panic("invalid operands for PREFETCHT0")
  23379. }
  23380. return p
  23381. }
  23382. // PREFETCHT1 performs "Prefetch Data Into Caches using T1 Hint".
  23383. //
  23384. // Mnemonic : PREFETCHT1
  23385. // Supported forms : (1 form)
  23386. //
  23387. // * PREFETCHT1 m8 [MMX+]
  23388. //
  23389. func (self *Program) PREFETCHT1(v0 interface{}) *Instruction {
  23390. p := self.alloc("PREFETCHT1", 1, Operands { v0 })
  23391. // PREFETCHT1 m8
  23392. if isM8(v0) {
  23393. self.require(ISA_MMX_PLUS)
  23394. p.domain = DomainGeneric
  23395. p.add(0, func(m *_Encoding, v []interface{}) {
  23396. m.rexo(0, addr(v[0]), false)
  23397. m.emit(0x0f)
  23398. m.emit(0x18)
  23399. m.mrsd(2, addr(v[0]), 1)
  23400. })
  23401. }
  23402. if p.len == 0 {
  23403. panic("invalid operands for PREFETCHT1")
  23404. }
  23405. return p
  23406. }
  23407. // PREFETCHT2 performs "Prefetch Data Into Caches using T2 Hint".
  23408. //
  23409. // Mnemonic : PREFETCHT2
  23410. // Supported forms : (1 form)
  23411. //
  23412. // * PREFETCHT2 m8 [MMX+]
  23413. //
  23414. func (self *Program) PREFETCHT2(v0 interface{}) *Instruction {
  23415. p := self.alloc("PREFETCHT2", 1, Operands { v0 })
  23416. // PREFETCHT2 m8
  23417. if isM8(v0) {
  23418. self.require(ISA_MMX_PLUS)
  23419. p.domain = DomainGeneric
  23420. p.add(0, func(m *_Encoding, v []interface{}) {
  23421. m.rexo(0, addr(v[0]), false)
  23422. m.emit(0x0f)
  23423. m.emit(0x18)
  23424. m.mrsd(3, addr(v[0]), 1)
  23425. })
  23426. }
  23427. if p.len == 0 {
  23428. panic("invalid operands for PREFETCHT2")
  23429. }
  23430. return p
  23431. }
  23432. // PREFETCHW performs "Prefetch Data into Caches in Anticipation of a Write".
  23433. //
  23434. // Mnemonic : PREFETCHW
  23435. // Supported forms : (1 form)
  23436. //
  23437. // * PREFETCHW m8 [PREFETCHW]
  23438. //
  23439. func (self *Program) PREFETCHW(v0 interface{}) *Instruction {
  23440. p := self.alloc("PREFETCHW", 1, Operands { v0 })
  23441. // PREFETCHW m8
  23442. if isM8(v0) {
  23443. self.require(ISA_PREFETCHW)
  23444. p.domain = DomainGeneric
  23445. p.add(0, func(m *_Encoding, v []interface{}) {
  23446. m.rexo(0, addr(v[0]), false)
  23447. m.emit(0x0f)
  23448. m.emit(0x0d)
  23449. m.mrsd(1, addr(v[0]), 1)
  23450. })
  23451. }
  23452. if p.len == 0 {
  23453. panic("invalid operands for PREFETCHW")
  23454. }
  23455. return p
  23456. }
  23457. // PREFETCHWT1 performs "Prefetch Vector Data Into Caches with Intent to Write and T1 Hint".
  23458. //
  23459. // Mnemonic : PREFETCHWT1
  23460. // Supported forms : (1 form)
  23461. //
  23462. // * PREFETCHWT1 m8 [PREFETCHWT1]
  23463. //
  23464. func (self *Program) PREFETCHWT1(v0 interface{}) *Instruction {
  23465. p := self.alloc("PREFETCHWT1", 1, Operands { v0 })
  23466. // PREFETCHWT1 m8
  23467. if isM8(v0) {
  23468. self.require(ISA_PREFETCHWT1)
  23469. p.domain = DomainGeneric
  23470. p.add(0, func(m *_Encoding, v []interface{}) {
  23471. m.rexo(0, addr(v[0]), false)
  23472. m.emit(0x0f)
  23473. m.emit(0x0d)
  23474. m.mrsd(2, addr(v[0]), 1)
  23475. })
  23476. }
  23477. if p.len == 0 {
  23478. panic("invalid operands for PREFETCHWT1")
  23479. }
  23480. return p
  23481. }
  23482. // PSADBW performs "Compute Sum of Absolute Differences".
  23483. //
  23484. // Mnemonic : PSADBW
  23485. // Supported forms : (4 forms)
  23486. //
  23487. // * PSADBW mm, mm [MMX+]
  23488. // * PSADBW m64, mm [MMX+]
  23489. // * PSADBW xmm, xmm [SSE2]
  23490. // * PSADBW m128, xmm [SSE2]
  23491. //
  23492. func (self *Program) PSADBW(v0 interface{}, v1 interface{}) *Instruction {
  23493. p := self.alloc("PSADBW", 2, Operands { v0, v1 })
  23494. // PSADBW mm, mm
  23495. if isMM(v0) && isMM(v1) {
  23496. self.require(ISA_MMX_PLUS)
  23497. p.domain = DomainMMXSSE
  23498. p.add(0, func(m *_Encoding, v []interface{}) {
  23499. m.rexo(hcode(v[1]), v[0], false)
  23500. m.emit(0x0f)
  23501. m.emit(0xf6)
  23502. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  23503. })
  23504. }
  23505. // PSADBW m64, mm
  23506. if isM64(v0) && isMM(v1) {
  23507. self.require(ISA_MMX_PLUS)
  23508. p.domain = DomainMMXSSE
  23509. p.add(0, func(m *_Encoding, v []interface{}) {
  23510. m.rexo(hcode(v[1]), addr(v[0]), false)
  23511. m.emit(0x0f)
  23512. m.emit(0xf6)
  23513. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  23514. })
  23515. }
  23516. // PSADBW xmm, xmm
  23517. if isXMM(v0) && isXMM(v1) {
  23518. self.require(ISA_SSE2)
  23519. p.domain = DomainMMXSSE
  23520. p.add(0, func(m *_Encoding, v []interface{}) {
  23521. m.emit(0x66)
  23522. m.rexo(hcode(v[1]), v[0], false)
  23523. m.emit(0x0f)
  23524. m.emit(0xf6)
  23525. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  23526. })
  23527. }
  23528. // PSADBW m128, xmm
  23529. if isM128(v0) && isXMM(v1) {
  23530. self.require(ISA_SSE2)
  23531. p.domain = DomainMMXSSE
  23532. p.add(0, func(m *_Encoding, v []interface{}) {
  23533. m.emit(0x66)
  23534. m.rexo(hcode(v[1]), addr(v[0]), false)
  23535. m.emit(0x0f)
  23536. m.emit(0xf6)
  23537. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  23538. })
  23539. }
  23540. if p.len == 0 {
  23541. panic("invalid operands for PSADBW")
  23542. }
  23543. return p
  23544. }
  23545. // PSHUFB performs "Packed Shuffle Bytes".
  23546. //
  23547. // Mnemonic : PSHUFB
  23548. // Supported forms : (4 forms)
  23549. //
  23550. // * PSHUFB mm, mm [SSSE3]
  23551. // * PSHUFB m64, mm [SSSE3]
  23552. // * PSHUFB xmm, xmm [SSSE3]
  23553. // * PSHUFB m128, xmm [SSSE3]
  23554. //
  23555. func (self *Program) PSHUFB(v0 interface{}, v1 interface{}) *Instruction {
  23556. p := self.alloc("PSHUFB", 2, Operands { v0, v1 })
  23557. // PSHUFB mm, mm
  23558. if isMM(v0) && isMM(v1) {
  23559. self.require(ISA_SSSE3)
  23560. p.domain = DomainMMXSSE
  23561. p.add(0, func(m *_Encoding, v []interface{}) {
  23562. m.rexo(hcode(v[1]), v[0], false)
  23563. m.emit(0x0f)
  23564. m.emit(0x38)
  23565. m.emit(0x00)
  23566. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  23567. })
  23568. }
  23569. // PSHUFB m64, mm
  23570. if isM64(v0) && isMM(v1) {
  23571. self.require(ISA_SSSE3)
  23572. p.domain = DomainMMXSSE
  23573. p.add(0, func(m *_Encoding, v []interface{}) {
  23574. m.rexo(hcode(v[1]), addr(v[0]), false)
  23575. m.emit(0x0f)
  23576. m.emit(0x38)
  23577. m.emit(0x00)
  23578. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  23579. })
  23580. }
  23581. // PSHUFB xmm, xmm
  23582. if isXMM(v0) && isXMM(v1) {
  23583. self.require(ISA_SSSE3)
  23584. p.domain = DomainMMXSSE
  23585. p.add(0, func(m *_Encoding, v []interface{}) {
  23586. m.emit(0x66)
  23587. m.rexo(hcode(v[1]), v[0], false)
  23588. m.emit(0x0f)
  23589. m.emit(0x38)
  23590. m.emit(0x00)
  23591. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  23592. })
  23593. }
  23594. // PSHUFB m128, xmm
  23595. if isM128(v0) && isXMM(v1) {
  23596. self.require(ISA_SSSE3)
  23597. p.domain = DomainMMXSSE
  23598. p.add(0, func(m *_Encoding, v []interface{}) {
  23599. m.emit(0x66)
  23600. m.rexo(hcode(v[1]), addr(v[0]), false)
  23601. m.emit(0x0f)
  23602. m.emit(0x38)
  23603. m.emit(0x00)
  23604. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  23605. })
  23606. }
  23607. if p.len == 0 {
  23608. panic("invalid operands for PSHUFB")
  23609. }
  23610. return p
  23611. }
  23612. // PSHUFD performs "Shuffle Packed Doublewords".
  23613. //
  23614. // Mnemonic : PSHUFD
  23615. // Supported forms : (2 forms)
  23616. //
  23617. // * PSHUFD imm8, xmm, xmm [SSE2]
  23618. // * PSHUFD imm8, m128, xmm [SSE2]
  23619. //
  23620. func (self *Program) PSHUFD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  23621. p := self.alloc("PSHUFD", 3, Operands { v0, v1, v2 })
  23622. // PSHUFD imm8, xmm, xmm
  23623. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  23624. self.require(ISA_SSE2)
  23625. p.domain = DomainMMXSSE
  23626. p.add(0, func(m *_Encoding, v []interface{}) {
  23627. m.emit(0x66)
  23628. m.rexo(hcode(v[2]), v[1], false)
  23629. m.emit(0x0f)
  23630. m.emit(0x70)
  23631. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  23632. m.imm1(toImmAny(v[0]))
  23633. })
  23634. }
  23635. // PSHUFD imm8, m128, xmm
  23636. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  23637. self.require(ISA_SSE2)
  23638. p.domain = DomainMMXSSE
  23639. p.add(0, func(m *_Encoding, v []interface{}) {
  23640. m.emit(0x66)
  23641. m.rexo(hcode(v[2]), addr(v[1]), false)
  23642. m.emit(0x0f)
  23643. m.emit(0x70)
  23644. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  23645. m.imm1(toImmAny(v[0]))
  23646. })
  23647. }
  23648. if p.len == 0 {
  23649. panic("invalid operands for PSHUFD")
  23650. }
  23651. return p
  23652. }
  23653. // PSHUFHW performs "Shuffle Packed High Words".
  23654. //
  23655. // Mnemonic : PSHUFHW
  23656. // Supported forms : (2 forms)
  23657. //
  23658. // * PSHUFHW imm8, xmm, xmm [SSE2]
  23659. // * PSHUFHW imm8, m128, xmm [SSE2]
  23660. //
  23661. func (self *Program) PSHUFHW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  23662. p := self.alloc("PSHUFHW", 3, Operands { v0, v1, v2 })
  23663. // PSHUFHW imm8, xmm, xmm
  23664. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  23665. self.require(ISA_SSE2)
  23666. p.domain = DomainMMXSSE
  23667. p.add(0, func(m *_Encoding, v []interface{}) {
  23668. m.emit(0xf3)
  23669. m.rexo(hcode(v[2]), v[1], false)
  23670. m.emit(0x0f)
  23671. m.emit(0x70)
  23672. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  23673. m.imm1(toImmAny(v[0]))
  23674. })
  23675. }
  23676. // PSHUFHW imm8, m128, xmm
  23677. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  23678. self.require(ISA_SSE2)
  23679. p.domain = DomainMMXSSE
  23680. p.add(0, func(m *_Encoding, v []interface{}) {
  23681. m.emit(0xf3)
  23682. m.rexo(hcode(v[2]), addr(v[1]), false)
  23683. m.emit(0x0f)
  23684. m.emit(0x70)
  23685. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  23686. m.imm1(toImmAny(v[0]))
  23687. })
  23688. }
  23689. if p.len == 0 {
  23690. panic("invalid operands for PSHUFHW")
  23691. }
  23692. return p
  23693. }
  23694. // PSHUFLW performs "Shuffle Packed Low Words".
  23695. //
  23696. // Mnemonic : PSHUFLW
  23697. // Supported forms : (2 forms)
  23698. //
  23699. // * PSHUFLW imm8, xmm, xmm [SSE2]
  23700. // * PSHUFLW imm8, m128, xmm [SSE2]
  23701. //
  23702. func (self *Program) PSHUFLW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  23703. p := self.alloc("PSHUFLW", 3, Operands { v0, v1, v2 })
  23704. // PSHUFLW imm8, xmm, xmm
  23705. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  23706. self.require(ISA_SSE2)
  23707. p.domain = DomainMMXSSE
  23708. p.add(0, func(m *_Encoding, v []interface{}) {
  23709. m.emit(0xf2)
  23710. m.rexo(hcode(v[2]), v[1], false)
  23711. m.emit(0x0f)
  23712. m.emit(0x70)
  23713. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  23714. m.imm1(toImmAny(v[0]))
  23715. })
  23716. }
  23717. // PSHUFLW imm8, m128, xmm
  23718. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  23719. self.require(ISA_SSE2)
  23720. p.domain = DomainMMXSSE
  23721. p.add(0, func(m *_Encoding, v []interface{}) {
  23722. m.emit(0xf2)
  23723. m.rexo(hcode(v[2]), addr(v[1]), false)
  23724. m.emit(0x0f)
  23725. m.emit(0x70)
  23726. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  23727. m.imm1(toImmAny(v[0]))
  23728. })
  23729. }
  23730. if p.len == 0 {
  23731. panic("invalid operands for PSHUFLW")
  23732. }
  23733. return p
  23734. }
  23735. // PSHUFW performs "Shuffle Packed Words".
  23736. //
  23737. // Mnemonic : PSHUFW
  23738. // Supported forms : (2 forms)
  23739. //
  23740. // * PSHUFW imm8, mm, mm [MMX+]
  23741. // * PSHUFW imm8, m64, mm [MMX+]
  23742. //
  23743. func (self *Program) PSHUFW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  23744. p := self.alloc("PSHUFW", 3, Operands { v0, v1, v2 })
  23745. // PSHUFW imm8, mm, mm
  23746. if isImm8(v0) && isMM(v1) && isMM(v2) {
  23747. self.require(ISA_MMX_PLUS)
  23748. p.domain = DomainMMXSSE
  23749. p.add(0, func(m *_Encoding, v []interface{}) {
  23750. m.rexo(hcode(v[2]), v[1], false)
  23751. m.emit(0x0f)
  23752. m.emit(0x70)
  23753. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  23754. m.imm1(toImmAny(v[0]))
  23755. })
  23756. }
  23757. // PSHUFW imm8, m64, mm
  23758. if isImm8(v0) && isM64(v1) && isMM(v2) {
  23759. self.require(ISA_MMX_PLUS)
  23760. p.domain = DomainMMXSSE
  23761. p.add(0, func(m *_Encoding, v []interface{}) {
  23762. m.rexo(hcode(v[2]), addr(v[1]), false)
  23763. m.emit(0x0f)
  23764. m.emit(0x70)
  23765. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  23766. m.imm1(toImmAny(v[0]))
  23767. })
  23768. }
  23769. if p.len == 0 {
  23770. panic("invalid operands for PSHUFW")
  23771. }
  23772. return p
  23773. }
  23774. // PSIGNB performs "Packed Sign of Byte Integers".
  23775. //
  23776. // Mnemonic : PSIGNB
  23777. // Supported forms : (4 forms)
  23778. //
  23779. // * PSIGNB mm, mm [SSSE3]
  23780. // * PSIGNB m64, mm [SSSE3]
  23781. // * PSIGNB xmm, xmm [SSSE3]
  23782. // * PSIGNB m128, xmm [SSSE3]
  23783. //
  23784. func (self *Program) PSIGNB(v0 interface{}, v1 interface{}) *Instruction {
  23785. p := self.alloc("PSIGNB", 2, Operands { v0, v1 })
  23786. // PSIGNB mm, mm
  23787. if isMM(v0) && isMM(v1) {
  23788. self.require(ISA_SSSE3)
  23789. p.domain = DomainMMXSSE
  23790. p.add(0, func(m *_Encoding, v []interface{}) {
  23791. m.rexo(hcode(v[1]), v[0], false)
  23792. m.emit(0x0f)
  23793. m.emit(0x38)
  23794. m.emit(0x08)
  23795. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  23796. })
  23797. }
  23798. // PSIGNB m64, mm
  23799. if isM64(v0) && isMM(v1) {
  23800. self.require(ISA_SSSE3)
  23801. p.domain = DomainMMXSSE
  23802. p.add(0, func(m *_Encoding, v []interface{}) {
  23803. m.rexo(hcode(v[1]), addr(v[0]), false)
  23804. m.emit(0x0f)
  23805. m.emit(0x38)
  23806. m.emit(0x08)
  23807. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  23808. })
  23809. }
  23810. // PSIGNB xmm, xmm
  23811. if isXMM(v0) && isXMM(v1) {
  23812. self.require(ISA_SSSE3)
  23813. p.domain = DomainMMXSSE
  23814. p.add(0, func(m *_Encoding, v []interface{}) {
  23815. m.emit(0x66)
  23816. m.rexo(hcode(v[1]), v[0], false)
  23817. m.emit(0x0f)
  23818. m.emit(0x38)
  23819. m.emit(0x08)
  23820. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  23821. })
  23822. }
  23823. // PSIGNB m128, xmm
  23824. if isM128(v0) && isXMM(v1) {
  23825. self.require(ISA_SSSE3)
  23826. p.domain = DomainMMXSSE
  23827. p.add(0, func(m *_Encoding, v []interface{}) {
  23828. m.emit(0x66)
  23829. m.rexo(hcode(v[1]), addr(v[0]), false)
  23830. m.emit(0x0f)
  23831. m.emit(0x38)
  23832. m.emit(0x08)
  23833. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  23834. })
  23835. }
  23836. if p.len == 0 {
  23837. panic("invalid operands for PSIGNB")
  23838. }
  23839. return p
  23840. }
  23841. // PSIGND performs "Packed Sign of Doubleword Integers".
  23842. //
  23843. // Mnemonic : PSIGND
  23844. // Supported forms : (4 forms)
  23845. //
  23846. // * PSIGND mm, mm [SSSE3]
  23847. // * PSIGND m64, mm [SSSE3]
  23848. // * PSIGND xmm, xmm [SSSE3]
  23849. // * PSIGND m128, xmm [SSSE3]
  23850. //
  23851. func (self *Program) PSIGND(v0 interface{}, v1 interface{}) *Instruction {
  23852. p := self.alloc("PSIGND", 2, Operands { v0, v1 })
  23853. // PSIGND mm, mm
  23854. if isMM(v0) && isMM(v1) {
  23855. self.require(ISA_SSSE3)
  23856. p.domain = DomainMMXSSE
  23857. p.add(0, func(m *_Encoding, v []interface{}) {
  23858. m.rexo(hcode(v[1]), v[0], false)
  23859. m.emit(0x0f)
  23860. m.emit(0x38)
  23861. m.emit(0x0a)
  23862. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  23863. })
  23864. }
  23865. // PSIGND m64, mm
  23866. if isM64(v0) && isMM(v1) {
  23867. self.require(ISA_SSSE3)
  23868. p.domain = DomainMMXSSE
  23869. p.add(0, func(m *_Encoding, v []interface{}) {
  23870. m.rexo(hcode(v[1]), addr(v[0]), false)
  23871. m.emit(0x0f)
  23872. m.emit(0x38)
  23873. m.emit(0x0a)
  23874. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  23875. })
  23876. }
  23877. // PSIGND xmm, xmm
  23878. if isXMM(v0) && isXMM(v1) {
  23879. self.require(ISA_SSSE3)
  23880. p.domain = DomainMMXSSE
  23881. p.add(0, func(m *_Encoding, v []interface{}) {
  23882. m.emit(0x66)
  23883. m.rexo(hcode(v[1]), v[0], false)
  23884. m.emit(0x0f)
  23885. m.emit(0x38)
  23886. m.emit(0x0a)
  23887. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  23888. })
  23889. }
  23890. // PSIGND m128, xmm
  23891. if isM128(v0) && isXMM(v1) {
  23892. self.require(ISA_SSSE3)
  23893. p.domain = DomainMMXSSE
  23894. p.add(0, func(m *_Encoding, v []interface{}) {
  23895. m.emit(0x66)
  23896. m.rexo(hcode(v[1]), addr(v[0]), false)
  23897. m.emit(0x0f)
  23898. m.emit(0x38)
  23899. m.emit(0x0a)
  23900. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  23901. })
  23902. }
  23903. if p.len == 0 {
  23904. panic("invalid operands for PSIGND")
  23905. }
  23906. return p
  23907. }
  23908. // PSIGNW performs "Packed Sign of Word Integers".
  23909. //
  23910. // Mnemonic : PSIGNW
  23911. // Supported forms : (4 forms)
  23912. //
  23913. // * PSIGNW mm, mm [SSSE3]
  23914. // * PSIGNW m64, mm [SSSE3]
  23915. // * PSIGNW xmm, xmm [SSSE3]
  23916. // * PSIGNW m128, xmm [SSSE3]
  23917. //
  23918. func (self *Program) PSIGNW(v0 interface{}, v1 interface{}) *Instruction {
  23919. p := self.alloc("PSIGNW", 2, Operands { v0, v1 })
  23920. // PSIGNW mm, mm
  23921. if isMM(v0) && isMM(v1) {
  23922. self.require(ISA_SSSE3)
  23923. p.domain = DomainMMXSSE
  23924. p.add(0, func(m *_Encoding, v []interface{}) {
  23925. m.rexo(hcode(v[1]), v[0], false)
  23926. m.emit(0x0f)
  23927. m.emit(0x38)
  23928. m.emit(0x09)
  23929. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  23930. })
  23931. }
  23932. // PSIGNW m64, mm
  23933. if isM64(v0) && isMM(v1) {
  23934. self.require(ISA_SSSE3)
  23935. p.domain = DomainMMXSSE
  23936. p.add(0, func(m *_Encoding, v []interface{}) {
  23937. m.rexo(hcode(v[1]), addr(v[0]), false)
  23938. m.emit(0x0f)
  23939. m.emit(0x38)
  23940. m.emit(0x09)
  23941. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  23942. })
  23943. }
  23944. // PSIGNW xmm, xmm
  23945. if isXMM(v0) && isXMM(v1) {
  23946. self.require(ISA_SSSE3)
  23947. p.domain = DomainMMXSSE
  23948. p.add(0, func(m *_Encoding, v []interface{}) {
  23949. m.emit(0x66)
  23950. m.rexo(hcode(v[1]), v[0], false)
  23951. m.emit(0x0f)
  23952. m.emit(0x38)
  23953. m.emit(0x09)
  23954. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  23955. })
  23956. }
  23957. // PSIGNW m128, xmm
  23958. if isM128(v0) && isXMM(v1) {
  23959. self.require(ISA_SSSE3)
  23960. p.domain = DomainMMXSSE
  23961. p.add(0, func(m *_Encoding, v []interface{}) {
  23962. m.emit(0x66)
  23963. m.rexo(hcode(v[1]), addr(v[0]), false)
  23964. m.emit(0x0f)
  23965. m.emit(0x38)
  23966. m.emit(0x09)
  23967. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  23968. })
  23969. }
  23970. if p.len == 0 {
  23971. panic("invalid operands for PSIGNW")
  23972. }
  23973. return p
  23974. }
  23975. // PSLLD performs "Shift Packed Doubleword Data Left Logical".
  23976. //
  23977. // Mnemonic : PSLLD
  23978. // Supported forms : (6 forms)
  23979. //
  23980. // * PSLLD imm8, mm [MMX]
  23981. // * PSLLD mm, mm [MMX]
  23982. // * PSLLD m64, mm [MMX]
  23983. // * PSLLD imm8, xmm [SSE2]
  23984. // * PSLLD xmm, xmm [SSE2]
  23985. // * PSLLD m128, xmm [SSE2]
  23986. //
  23987. func (self *Program) PSLLD(v0 interface{}, v1 interface{}) *Instruction {
  23988. p := self.alloc("PSLLD", 2, Operands { v0, v1 })
  23989. // PSLLD imm8, mm
  23990. if isImm8(v0) && isMM(v1) {
  23991. self.require(ISA_MMX)
  23992. p.domain = DomainMMXSSE
  23993. p.add(0, func(m *_Encoding, v []interface{}) {
  23994. m.rexo(0, v[1], false)
  23995. m.emit(0x0f)
  23996. m.emit(0x72)
  23997. m.emit(0xf0 | lcode(v[1]))
  23998. m.imm1(toImmAny(v[0]))
  23999. })
  24000. }
  24001. // PSLLD mm, mm
  24002. if isMM(v0) && isMM(v1) {
  24003. self.require(ISA_MMX)
  24004. p.domain = DomainMMXSSE
  24005. p.add(0, func(m *_Encoding, v []interface{}) {
  24006. m.rexo(hcode(v[1]), v[0], false)
  24007. m.emit(0x0f)
  24008. m.emit(0xf2)
  24009. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24010. })
  24011. }
  24012. // PSLLD m64, mm
  24013. if isM64(v0) && isMM(v1) {
  24014. self.require(ISA_MMX)
  24015. p.domain = DomainMMXSSE
  24016. p.add(0, func(m *_Encoding, v []interface{}) {
  24017. m.rexo(hcode(v[1]), addr(v[0]), false)
  24018. m.emit(0x0f)
  24019. m.emit(0xf2)
  24020. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24021. })
  24022. }
  24023. // PSLLD imm8, xmm
  24024. if isImm8(v0) && isXMM(v1) {
  24025. self.require(ISA_SSE2)
  24026. p.domain = DomainMMXSSE
  24027. p.add(0, func(m *_Encoding, v []interface{}) {
  24028. m.emit(0x66)
  24029. m.rexo(0, v[1], false)
  24030. m.emit(0x0f)
  24031. m.emit(0x72)
  24032. m.emit(0xf0 | lcode(v[1]))
  24033. m.imm1(toImmAny(v[0]))
  24034. })
  24035. }
  24036. // PSLLD xmm, xmm
  24037. if isXMM(v0) && isXMM(v1) {
  24038. self.require(ISA_SSE2)
  24039. p.domain = DomainMMXSSE
  24040. p.add(0, func(m *_Encoding, v []interface{}) {
  24041. m.emit(0x66)
  24042. m.rexo(hcode(v[1]), v[0], false)
  24043. m.emit(0x0f)
  24044. m.emit(0xf2)
  24045. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24046. })
  24047. }
  24048. // PSLLD m128, xmm
  24049. if isM128(v0) && isXMM(v1) {
  24050. self.require(ISA_SSE2)
  24051. p.domain = DomainMMXSSE
  24052. p.add(0, func(m *_Encoding, v []interface{}) {
  24053. m.emit(0x66)
  24054. m.rexo(hcode(v[1]), addr(v[0]), false)
  24055. m.emit(0x0f)
  24056. m.emit(0xf2)
  24057. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24058. })
  24059. }
  24060. if p.len == 0 {
  24061. panic("invalid operands for PSLLD")
  24062. }
  24063. return p
  24064. }
  24065. // PSLLDQ performs "Shift Packed Double Quadword Left Logical".
  24066. //
  24067. // Mnemonic : PSLLDQ
  24068. // Supported forms : (1 form)
  24069. //
  24070. // * PSLLDQ imm8, xmm [SSE2]
  24071. //
  24072. func (self *Program) PSLLDQ(v0 interface{}, v1 interface{}) *Instruction {
  24073. p := self.alloc("PSLLDQ", 2, Operands { v0, v1 })
  24074. // PSLLDQ imm8, xmm
  24075. if isImm8(v0) && isXMM(v1) {
  24076. self.require(ISA_SSE2)
  24077. p.domain = DomainMMXSSE
  24078. p.add(0, func(m *_Encoding, v []interface{}) {
  24079. m.emit(0x66)
  24080. m.rexo(0, v[1], false)
  24081. m.emit(0x0f)
  24082. m.emit(0x73)
  24083. m.emit(0xf8 | lcode(v[1]))
  24084. m.imm1(toImmAny(v[0]))
  24085. })
  24086. }
  24087. if p.len == 0 {
  24088. panic("invalid operands for PSLLDQ")
  24089. }
  24090. return p
  24091. }
  24092. // PSLLQ performs "Shift Packed Quadword Data Left Logical".
  24093. //
  24094. // Mnemonic : PSLLQ
  24095. // Supported forms : (6 forms)
  24096. //
  24097. // * PSLLQ imm8, mm [MMX]
  24098. // * PSLLQ mm, mm [MMX]
  24099. // * PSLLQ m64, mm [MMX]
  24100. // * PSLLQ imm8, xmm [SSE2]
  24101. // * PSLLQ xmm, xmm [SSE2]
  24102. // * PSLLQ m128, xmm [SSE2]
  24103. //
  24104. func (self *Program) PSLLQ(v0 interface{}, v1 interface{}) *Instruction {
  24105. p := self.alloc("PSLLQ", 2, Operands { v0, v1 })
  24106. // PSLLQ imm8, mm
  24107. if isImm8(v0) && isMM(v1) {
  24108. self.require(ISA_MMX)
  24109. p.domain = DomainMMXSSE
  24110. p.add(0, func(m *_Encoding, v []interface{}) {
  24111. m.rexo(0, v[1], false)
  24112. m.emit(0x0f)
  24113. m.emit(0x73)
  24114. m.emit(0xf0 | lcode(v[1]))
  24115. m.imm1(toImmAny(v[0]))
  24116. })
  24117. }
  24118. // PSLLQ mm, mm
  24119. if isMM(v0) && isMM(v1) {
  24120. self.require(ISA_MMX)
  24121. p.domain = DomainMMXSSE
  24122. p.add(0, func(m *_Encoding, v []interface{}) {
  24123. m.rexo(hcode(v[1]), v[0], false)
  24124. m.emit(0x0f)
  24125. m.emit(0xf3)
  24126. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24127. })
  24128. }
  24129. // PSLLQ m64, mm
  24130. if isM64(v0) && isMM(v1) {
  24131. self.require(ISA_MMX)
  24132. p.domain = DomainMMXSSE
  24133. p.add(0, func(m *_Encoding, v []interface{}) {
  24134. m.rexo(hcode(v[1]), addr(v[0]), false)
  24135. m.emit(0x0f)
  24136. m.emit(0xf3)
  24137. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24138. })
  24139. }
  24140. // PSLLQ imm8, xmm
  24141. if isImm8(v0) && isXMM(v1) {
  24142. self.require(ISA_SSE2)
  24143. p.domain = DomainMMXSSE
  24144. p.add(0, func(m *_Encoding, v []interface{}) {
  24145. m.emit(0x66)
  24146. m.rexo(0, v[1], false)
  24147. m.emit(0x0f)
  24148. m.emit(0x73)
  24149. m.emit(0xf0 | lcode(v[1]))
  24150. m.imm1(toImmAny(v[0]))
  24151. })
  24152. }
  24153. // PSLLQ xmm, xmm
  24154. if isXMM(v0) && isXMM(v1) {
  24155. self.require(ISA_SSE2)
  24156. p.domain = DomainMMXSSE
  24157. p.add(0, func(m *_Encoding, v []interface{}) {
  24158. m.emit(0x66)
  24159. m.rexo(hcode(v[1]), v[0], false)
  24160. m.emit(0x0f)
  24161. m.emit(0xf3)
  24162. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24163. })
  24164. }
  24165. // PSLLQ m128, xmm
  24166. if isM128(v0) && isXMM(v1) {
  24167. self.require(ISA_SSE2)
  24168. p.domain = DomainMMXSSE
  24169. p.add(0, func(m *_Encoding, v []interface{}) {
  24170. m.emit(0x66)
  24171. m.rexo(hcode(v[1]), addr(v[0]), false)
  24172. m.emit(0x0f)
  24173. m.emit(0xf3)
  24174. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24175. })
  24176. }
  24177. if p.len == 0 {
  24178. panic("invalid operands for PSLLQ")
  24179. }
  24180. return p
  24181. }
  24182. // PSLLW performs "Shift Packed Word Data Left Logical".
  24183. //
  24184. // Mnemonic : PSLLW
  24185. // Supported forms : (6 forms)
  24186. //
  24187. // * PSLLW imm8, mm [MMX]
  24188. // * PSLLW mm, mm [MMX]
  24189. // * PSLLW m64, mm [MMX]
  24190. // * PSLLW imm8, xmm [SSE2]
  24191. // * PSLLW xmm, xmm [SSE2]
  24192. // * PSLLW m128, xmm [SSE2]
  24193. //
  24194. func (self *Program) PSLLW(v0 interface{}, v1 interface{}) *Instruction {
  24195. p := self.alloc("PSLLW", 2, Operands { v0, v1 })
  24196. // PSLLW imm8, mm
  24197. if isImm8(v0) && isMM(v1) {
  24198. self.require(ISA_MMX)
  24199. p.domain = DomainMMXSSE
  24200. p.add(0, func(m *_Encoding, v []interface{}) {
  24201. m.rexo(0, v[1], false)
  24202. m.emit(0x0f)
  24203. m.emit(0x71)
  24204. m.emit(0xf0 | lcode(v[1]))
  24205. m.imm1(toImmAny(v[0]))
  24206. })
  24207. }
  24208. // PSLLW mm, mm
  24209. if isMM(v0) && isMM(v1) {
  24210. self.require(ISA_MMX)
  24211. p.domain = DomainMMXSSE
  24212. p.add(0, func(m *_Encoding, v []interface{}) {
  24213. m.rexo(hcode(v[1]), v[0], false)
  24214. m.emit(0x0f)
  24215. m.emit(0xf1)
  24216. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24217. })
  24218. }
  24219. // PSLLW m64, mm
  24220. if isM64(v0) && isMM(v1) {
  24221. self.require(ISA_MMX)
  24222. p.domain = DomainMMXSSE
  24223. p.add(0, func(m *_Encoding, v []interface{}) {
  24224. m.rexo(hcode(v[1]), addr(v[0]), false)
  24225. m.emit(0x0f)
  24226. m.emit(0xf1)
  24227. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24228. })
  24229. }
  24230. // PSLLW imm8, xmm
  24231. if isImm8(v0) && isXMM(v1) {
  24232. self.require(ISA_SSE2)
  24233. p.domain = DomainMMXSSE
  24234. p.add(0, func(m *_Encoding, v []interface{}) {
  24235. m.emit(0x66)
  24236. m.rexo(0, v[1], false)
  24237. m.emit(0x0f)
  24238. m.emit(0x71)
  24239. m.emit(0xf0 | lcode(v[1]))
  24240. m.imm1(toImmAny(v[0]))
  24241. })
  24242. }
  24243. // PSLLW xmm, xmm
  24244. if isXMM(v0) && isXMM(v1) {
  24245. self.require(ISA_SSE2)
  24246. p.domain = DomainMMXSSE
  24247. p.add(0, func(m *_Encoding, v []interface{}) {
  24248. m.emit(0x66)
  24249. m.rexo(hcode(v[1]), v[0], false)
  24250. m.emit(0x0f)
  24251. m.emit(0xf1)
  24252. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24253. })
  24254. }
  24255. // PSLLW m128, xmm
  24256. if isM128(v0) && isXMM(v1) {
  24257. self.require(ISA_SSE2)
  24258. p.domain = DomainMMXSSE
  24259. p.add(0, func(m *_Encoding, v []interface{}) {
  24260. m.emit(0x66)
  24261. m.rexo(hcode(v[1]), addr(v[0]), false)
  24262. m.emit(0x0f)
  24263. m.emit(0xf1)
  24264. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24265. })
  24266. }
  24267. if p.len == 0 {
  24268. panic("invalid operands for PSLLW")
  24269. }
  24270. return p
  24271. }
  24272. // PSRAD performs "Shift Packed Doubleword Data Right Arithmetic".
  24273. //
  24274. // Mnemonic : PSRAD
  24275. // Supported forms : (6 forms)
  24276. //
  24277. // * PSRAD imm8, mm [MMX]
  24278. // * PSRAD mm, mm [MMX]
  24279. // * PSRAD m64, mm [MMX]
  24280. // * PSRAD imm8, xmm [SSE2]
  24281. // * PSRAD xmm, xmm [SSE2]
  24282. // * PSRAD m128, xmm [SSE2]
  24283. //
  24284. func (self *Program) PSRAD(v0 interface{}, v1 interface{}) *Instruction {
  24285. p := self.alloc("PSRAD", 2, Operands { v0, v1 })
  24286. // PSRAD imm8, mm
  24287. if isImm8(v0) && isMM(v1) {
  24288. self.require(ISA_MMX)
  24289. p.domain = DomainMMXSSE
  24290. p.add(0, func(m *_Encoding, v []interface{}) {
  24291. m.rexo(0, v[1], false)
  24292. m.emit(0x0f)
  24293. m.emit(0x72)
  24294. m.emit(0xe0 | lcode(v[1]))
  24295. m.imm1(toImmAny(v[0]))
  24296. })
  24297. }
  24298. // PSRAD mm, mm
  24299. if isMM(v0) && isMM(v1) {
  24300. self.require(ISA_MMX)
  24301. p.domain = DomainMMXSSE
  24302. p.add(0, func(m *_Encoding, v []interface{}) {
  24303. m.rexo(hcode(v[1]), v[0], false)
  24304. m.emit(0x0f)
  24305. m.emit(0xe2)
  24306. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24307. })
  24308. }
  24309. // PSRAD m64, mm
  24310. if isM64(v0) && isMM(v1) {
  24311. self.require(ISA_MMX)
  24312. p.domain = DomainMMXSSE
  24313. p.add(0, func(m *_Encoding, v []interface{}) {
  24314. m.rexo(hcode(v[1]), addr(v[0]), false)
  24315. m.emit(0x0f)
  24316. m.emit(0xe2)
  24317. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24318. })
  24319. }
  24320. // PSRAD imm8, xmm
  24321. if isImm8(v0) && isXMM(v1) {
  24322. self.require(ISA_SSE2)
  24323. p.domain = DomainMMXSSE
  24324. p.add(0, func(m *_Encoding, v []interface{}) {
  24325. m.emit(0x66)
  24326. m.rexo(0, v[1], false)
  24327. m.emit(0x0f)
  24328. m.emit(0x72)
  24329. m.emit(0xe0 | lcode(v[1]))
  24330. m.imm1(toImmAny(v[0]))
  24331. })
  24332. }
  24333. // PSRAD xmm, xmm
  24334. if isXMM(v0) && isXMM(v1) {
  24335. self.require(ISA_SSE2)
  24336. p.domain = DomainMMXSSE
  24337. p.add(0, func(m *_Encoding, v []interface{}) {
  24338. m.emit(0x66)
  24339. m.rexo(hcode(v[1]), v[0], false)
  24340. m.emit(0x0f)
  24341. m.emit(0xe2)
  24342. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24343. })
  24344. }
  24345. // PSRAD m128, xmm
  24346. if isM128(v0) && isXMM(v1) {
  24347. self.require(ISA_SSE2)
  24348. p.domain = DomainMMXSSE
  24349. p.add(0, func(m *_Encoding, v []interface{}) {
  24350. m.emit(0x66)
  24351. m.rexo(hcode(v[1]), addr(v[0]), false)
  24352. m.emit(0x0f)
  24353. m.emit(0xe2)
  24354. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24355. })
  24356. }
  24357. if p.len == 0 {
  24358. panic("invalid operands for PSRAD")
  24359. }
  24360. return p
  24361. }
  24362. // PSRAW performs "Shift Packed Word Data Right Arithmetic".
  24363. //
  24364. // Mnemonic : PSRAW
  24365. // Supported forms : (6 forms)
  24366. //
  24367. // * PSRAW imm8, mm [MMX]
  24368. // * PSRAW mm, mm [MMX]
  24369. // * PSRAW m64, mm [MMX]
  24370. // * PSRAW imm8, xmm [SSE2]
  24371. // * PSRAW xmm, xmm [SSE2]
  24372. // * PSRAW m128, xmm [SSE2]
  24373. //
  24374. func (self *Program) PSRAW(v0 interface{}, v1 interface{}) *Instruction {
  24375. p := self.alloc("PSRAW", 2, Operands { v0, v1 })
  24376. // PSRAW imm8, mm
  24377. if isImm8(v0) && isMM(v1) {
  24378. self.require(ISA_MMX)
  24379. p.domain = DomainMMXSSE
  24380. p.add(0, func(m *_Encoding, v []interface{}) {
  24381. m.rexo(0, v[1], false)
  24382. m.emit(0x0f)
  24383. m.emit(0x71)
  24384. m.emit(0xe0 | lcode(v[1]))
  24385. m.imm1(toImmAny(v[0]))
  24386. })
  24387. }
  24388. // PSRAW mm, mm
  24389. if isMM(v0) && isMM(v1) {
  24390. self.require(ISA_MMX)
  24391. p.domain = DomainMMXSSE
  24392. p.add(0, func(m *_Encoding, v []interface{}) {
  24393. m.rexo(hcode(v[1]), v[0], false)
  24394. m.emit(0x0f)
  24395. m.emit(0xe1)
  24396. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24397. })
  24398. }
  24399. // PSRAW m64, mm
  24400. if isM64(v0) && isMM(v1) {
  24401. self.require(ISA_MMX)
  24402. p.domain = DomainMMXSSE
  24403. p.add(0, func(m *_Encoding, v []interface{}) {
  24404. m.rexo(hcode(v[1]), addr(v[0]), false)
  24405. m.emit(0x0f)
  24406. m.emit(0xe1)
  24407. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24408. })
  24409. }
  24410. // PSRAW imm8, xmm
  24411. if isImm8(v0) && isXMM(v1) {
  24412. self.require(ISA_SSE2)
  24413. p.domain = DomainMMXSSE
  24414. p.add(0, func(m *_Encoding, v []interface{}) {
  24415. m.emit(0x66)
  24416. m.rexo(0, v[1], false)
  24417. m.emit(0x0f)
  24418. m.emit(0x71)
  24419. m.emit(0xe0 | lcode(v[1]))
  24420. m.imm1(toImmAny(v[0]))
  24421. })
  24422. }
  24423. // PSRAW xmm, xmm
  24424. if isXMM(v0) && isXMM(v1) {
  24425. self.require(ISA_SSE2)
  24426. p.domain = DomainMMXSSE
  24427. p.add(0, func(m *_Encoding, v []interface{}) {
  24428. m.emit(0x66)
  24429. m.rexo(hcode(v[1]), v[0], false)
  24430. m.emit(0x0f)
  24431. m.emit(0xe1)
  24432. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24433. })
  24434. }
  24435. // PSRAW m128, xmm
  24436. if isM128(v0) && isXMM(v1) {
  24437. self.require(ISA_SSE2)
  24438. p.domain = DomainMMXSSE
  24439. p.add(0, func(m *_Encoding, v []interface{}) {
  24440. m.emit(0x66)
  24441. m.rexo(hcode(v[1]), addr(v[0]), false)
  24442. m.emit(0x0f)
  24443. m.emit(0xe1)
  24444. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24445. })
  24446. }
  24447. if p.len == 0 {
  24448. panic("invalid operands for PSRAW")
  24449. }
  24450. return p
  24451. }
  24452. // PSRLD performs "Shift Packed Doubleword Data Right Logical".
  24453. //
  24454. // Mnemonic : PSRLD
  24455. // Supported forms : (6 forms)
  24456. //
  24457. // * PSRLD imm8, mm [MMX]
  24458. // * PSRLD mm, mm [MMX]
  24459. // * PSRLD m64, mm [MMX]
  24460. // * PSRLD imm8, xmm [SSE2]
  24461. // * PSRLD xmm, xmm [SSE2]
  24462. // * PSRLD m128, xmm [SSE2]
  24463. //
  24464. func (self *Program) PSRLD(v0 interface{}, v1 interface{}) *Instruction {
  24465. p := self.alloc("PSRLD", 2, Operands { v0, v1 })
  24466. // PSRLD imm8, mm
  24467. if isImm8(v0) && isMM(v1) {
  24468. self.require(ISA_MMX)
  24469. p.domain = DomainMMXSSE
  24470. p.add(0, func(m *_Encoding, v []interface{}) {
  24471. m.rexo(0, v[1], false)
  24472. m.emit(0x0f)
  24473. m.emit(0x72)
  24474. m.emit(0xd0 | lcode(v[1]))
  24475. m.imm1(toImmAny(v[0]))
  24476. })
  24477. }
  24478. // PSRLD mm, mm
  24479. if isMM(v0) && isMM(v1) {
  24480. self.require(ISA_MMX)
  24481. p.domain = DomainMMXSSE
  24482. p.add(0, func(m *_Encoding, v []interface{}) {
  24483. m.rexo(hcode(v[1]), v[0], false)
  24484. m.emit(0x0f)
  24485. m.emit(0xd2)
  24486. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24487. })
  24488. }
  24489. // PSRLD m64, mm
  24490. if isM64(v0) && isMM(v1) {
  24491. self.require(ISA_MMX)
  24492. p.domain = DomainMMXSSE
  24493. p.add(0, func(m *_Encoding, v []interface{}) {
  24494. m.rexo(hcode(v[1]), addr(v[0]), false)
  24495. m.emit(0x0f)
  24496. m.emit(0xd2)
  24497. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24498. })
  24499. }
  24500. // PSRLD imm8, xmm
  24501. if isImm8(v0) && isXMM(v1) {
  24502. self.require(ISA_SSE2)
  24503. p.domain = DomainMMXSSE
  24504. p.add(0, func(m *_Encoding, v []interface{}) {
  24505. m.emit(0x66)
  24506. m.rexo(0, v[1], false)
  24507. m.emit(0x0f)
  24508. m.emit(0x72)
  24509. m.emit(0xd0 | lcode(v[1]))
  24510. m.imm1(toImmAny(v[0]))
  24511. })
  24512. }
  24513. // PSRLD xmm, xmm
  24514. if isXMM(v0) && isXMM(v1) {
  24515. self.require(ISA_SSE2)
  24516. p.domain = DomainMMXSSE
  24517. p.add(0, func(m *_Encoding, v []interface{}) {
  24518. m.emit(0x66)
  24519. m.rexo(hcode(v[1]), v[0], false)
  24520. m.emit(0x0f)
  24521. m.emit(0xd2)
  24522. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24523. })
  24524. }
  24525. // PSRLD m128, xmm
  24526. if isM128(v0) && isXMM(v1) {
  24527. self.require(ISA_SSE2)
  24528. p.domain = DomainMMXSSE
  24529. p.add(0, func(m *_Encoding, v []interface{}) {
  24530. m.emit(0x66)
  24531. m.rexo(hcode(v[1]), addr(v[0]), false)
  24532. m.emit(0x0f)
  24533. m.emit(0xd2)
  24534. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24535. })
  24536. }
  24537. if p.len == 0 {
  24538. panic("invalid operands for PSRLD")
  24539. }
  24540. return p
  24541. }
  24542. // PSRLDQ performs "Shift Packed Double Quadword Right Logical".
  24543. //
  24544. // Mnemonic : PSRLDQ
  24545. // Supported forms : (1 form)
  24546. //
  24547. // * PSRLDQ imm8, xmm [SSE2]
  24548. //
  24549. func (self *Program) PSRLDQ(v0 interface{}, v1 interface{}) *Instruction {
  24550. p := self.alloc("PSRLDQ", 2, Operands { v0, v1 })
  24551. // PSRLDQ imm8, xmm
  24552. if isImm8(v0) && isXMM(v1) {
  24553. self.require(ISA_SSE2)
  24554. p.domain = DomainMMXSSE
  24555. p.add(0, func(m *_Encoding, v []interface{}) {
  24556. m.emit(0x66)
  24557. m.rexo(0, v[1], false)
  24558. m.emit(0x0f)
  24559. m.emit(0x73)
  24560. m.emit(0xd8 | lcode(v[1]))
  24561. m.imm1(toImmAny(v[0]))
  24562. })
  24563. }
  24564. if p.len == 0 {
  24565. panic("invalid operands for PSRLDQ")
  24566. }
  24567. return p
  24568. }
  24569. // PSRLQ performs "Shift Packed Quadword Data Right Logical".
  24570. //
  24571. // Mnemonic : PSRLQ
  24572. // Supported forms : (6 forms)
  24573. //
  24574. // * PSRLQ imm8, mm [MMX]
  24575. // * PSRLQ mm, mm [MMX]
  24576. // * PSRLQ m64, mm [MMX]
  24577. // * PSRLQ imm8, xmm [SSE2]
  24578. // * PSRLQ xmm, xmm [SSE2]
  24579. // * PSRLQ m128, xmm [SSE2]
  24580. //
  24581. func (self *Program) PSRLQ(v0 interface{}, v1 interface{}) *Instruction {
  24582. p := self.alloc("PSRLQ", 2, Operands { v0, v1 })
  24583. // PSRLQ imm8, mm
  24584. if isImm8(v0) && isMM(v1) {
  24585. self.require(ISA_MMX)
  24586. p.domain = DomainMMXSSE
  24587. p.add(0, func(m *_Encoding, v []interface{}) {
  24588. m.rexo(0, v[1], false)
  24589. m.emit(0x0f)
  24590. m.emit(0x73)
  24591. m.emit(0xd0 | lcode(v[1]))
  24592. m.imm1(toImmAny(v[0]))
  24593. })
  24594. }
  24595. // PSRLQ mm, mm
  24596. if isMM(v0) && isMM(v1) {
  24597. self.require(ISA_MMX)
  24598. p.domain = DomainMMXSSE
  24599. p.add(0, func(m *_Encoding, v []interface{}) {
  24600. m.rexo(hcode(v[1]), v[0], false)
  24601. m.emit(0x0f)
  24602. m.emit(0xd3)
  24603. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24604. })
  24605. }
  24606. // PSRLQ m64, mm
  24607. if isM64(v0) && isMM(v1) {
  24608. self.require(ISA_MMX)
  24609. p.domain = DomainMMXSSE
  24610. p.add(0, func(m *_Encoding, v []interface{}) {
  24611. m.rexo(hcode(v[1]), addr(v[0]), false)
  24612. m.emit(0x0f)
  24613. m.emit(0xd3)
  24614. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24615. })
  24616. }
  24617. // PSRLQ imm8, xmm
  24618. if isImm8(v0) && isXMM(v1) {
  24619. self.require(ISA_SSE2)
  24620. p.domain = DomainMMXSSE
  24621. p.add(0, func(m *_Encoding, v []interface{}) {
  24622. m.emit(0x66)
  24623. m.rexo(0, v[1], false)
  24624. m.emit(0x0f)
  24625. m.emit(0x73)
  24626. m.emit(0xd0 | lcode(v[1]))
  24627. m.imm1(toImmAny(v[0]))
  24628. })
  24629. }
  24630. // PSRLQ xmm, xmm
  24631. if isXMM(v0) && isXMM(v1) {
  24632. self.require(ISA_SSE2)
  24633. p.domain = DomainMMXSSE
  24634. p.add(0, func(m *_Encoding, v []interface{}) {
  24635. m.emit(0x66)
  24636. m.rexo(hcode(v[1]), v[0], false)
  24637. m.emit(0x0f)
  24638. m.emit(0xd3)
  24639. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24640. })
  24641. }
  24642. // PSRLQ m128, xmm
  24643. if isM128(v0) && isXMM(v1) {
  24644. self.require(ISA_SSE2)
  24645. p.domain = DomainMMXSSE
  24646. p.add(0, func(m *_Encoding, v []interface{}) {
  24647. m.emit(0x66)
  24648. m.rexo(hcode(v[1]), addr(v[0]), false)
  24649. m.emit(0x0f)
  24650. m.emit(0xd3)
  24651. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24652. })
  24653. }
  24654. if p.len == 0 {
  24655. panic("invalid operands for PSRLQ")
  24656. }
  24657. return p
  24658. }
  24659. // PSRLW performs "Shift Packed Word Data Right Logical".
  24660. //
  24661. // Mnemonic : PSRLW
  24662. // Supported forms : (6 forms)
  24663. //
  24664. // * PSRLW imm8, mm [MMX]
  24665. // * PSRLW mm, mm [MMX]
  24666. // * PSRLW m64, mm [MMX]
  24667. // * PSRLW imm8, xmm [SSE2]
  24668. // * PSRLW xmm, xmm [SSE2]
  24669. // * PSRLW m128, xmm [SSE2]
  24670. //
  24671. func (self *Program) PSRLW(v0 interface{}, v1 interface{}) *Instruction {
  24672. p := self.alloc("PSRLW", 2, Operands { v0, v1 })
  24673. // PSRLW imm8, mm
  24674. if isImm8(v0) && isMM(v1) {
  24675. self.require(ISA_MMX)
  24676. p.domain = DomainMMXSSE
  24677. p.add(0, func(m *_Encoding, v []interface{}) {
  24678. m.rexo(0, v[1], false)
  24679. m.emit(0x0f)
  24680. m.emit(0x71)
  24681. m.emit(0xd0 | lcode(v[1]))
  24682. m.imm1(toImmAny(v[0]))
  24683. })
  24684. }
  24685. // PSRLW mm, mm
  24686. if isMM(v0) && isMM(v1) {
  24687. self.require(ISA_MMX)
  24688. p.domain = DomainMMXSSE
  24689. p.add(0, func(m *_Encoding, v []interface{}) {
  24690. m.rexo(hcode(v[1]), v[0], false)
  24691. m.emit(0x0f)
  24692. m.emit(0xd1)
  24693. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24694. })
  24695. }
  24696. // PSRLW m64, mm
  24697. if isM64(v0) && isMM(v1) {
  24698. self.require(ISA_MMX)
  24699. p.domain = DomainMMXSSE
  24700. p.add(0, func(m *_Encoding, v []interface{}) {
  24701. m.rexo(hcode(v[1]), addr(v[0]), false)
  24702. m.emit(0x0f)
  24703. m.emit(0xd1)
  24704. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24705. })
  24706. }
  24707. // PSRLW imm8, xmm
  24708. if isImm8(v0) && isXMM(v1) {
  24709. self.require(ISA_SSE2)
  24710. p.domain = DomainMMXSSE
  24711. p.add(0, func(m *_Encoding, v []interface{}) {
  24712. m.emit(0x66)
  24713. m.rexo(0, v[1], false)
  24714. m.emit(0x0f)
  24715. m.emit(0x71)
  24716. m.emit(0xd0 | lcode(v[1]))
  24717. m.imm1(toImmAny(v[0]))
  24718. })
  24719. }
  24720. // PSRLW xmm, xmm
  24721. if isXMM(v0) && isXMM(v1) {
  24722. self.require(ISA_SSE2)
  24723. p.domain = DomainMMXSSE
  24724. p.add(0, func(m *_Encoding, v []interface{}) {
  24725. m.emit(0x66)
  24726. m.rexo(hcode(v[1]), v[0], false)
  24727. m.emit(0x0f)
  24728. m.emit(0xd1)
  24729. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24730. })
  24731. }
  24732. // PSRLW m128, xmm
  24733. if isM128(v0) && isXMM(v1) {
  24734. self.require(ISA_SSE2)
  24735. p.domain = DomainMMXSSE
  24736. p.add(0, func(m *_Encoding, v []interface{}) {
  24737. m.emit(0x66)
  24738. m.rexo(hcode(v[1]), addr(v[0]), false)
  24739. m.emit(0x0f)
  24740. m.emit(0xd1)
  24741. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24742. })
  24743. }
  24744. if p.len == 0 {
  24745. panic("invalid operands for PSRLW")
  24746. }
  24747. return p
  24748. }
  24749. // PSUBB performs "Subtract Packed Byte Integers".
  24750. //
  24751. // Mnemonic : PSUBB
  24752. // Supported forms : (4 forms)
  24753. //
  24754. // * PSUBB mm, mm [MMX]
  24755. // * PSUBB m64, mm [MMX]
  24756. // * PSUBB xmm, xmm [SSE2]
  24757. // * PSUBB m128, xmm [SSE2]
  24758. //
  24759. func (self *Program) PSUBB(v0 interface{}, v1 interface{}) *Instruction {
  24760. p := self.alloc("PSUBB", 2, Operands { v0, v1 })
  24761. // PSUBB mm, mm
  24762. if isMM(v0) && isMM(v1) {
  24763. self.require(ISA_MMX)
  24764. p.domain = DomainMMXSSE
  24765. p.add(0, func(m *_Encoding, v []interface{}) {
  24766. m.rexo(hcode(v[1]), v[0], false)
  24767. m.emit(0x0f)
  24768. m.emit(0xf8)
  24769. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24770. })
  24771. }
  24772. // PSUBB m64, mm
  24773. if isM64(v0) && isMM(v1) {
  24774. self.require(ISA_MMX)
  24775. p.domain = DomainMMXSSE
  24776. p.add(0, func(m *_Encoding, v []interface{}) {
  24777. m.rexo(hcode(v[1]), addr(v[0]), false)
  24778. m.emit(0x0f)
  24779. m.emit(0xf8)
  24780. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24781. })
  24782. }
  24783. // PSUBB xmm, xmm
  24784. if isXMM(v0) && isXMM(v1) {
  24785. self.require(ISA_SSE2)
  24786. p.domain = DomainMMXSSE
  24787. p.add(0, func(m *_Encoding, v []interface{}) {
  24788. m.emit(0x66)
  24789. m.rexo(hcode(v[1]), v[0], false)
  24790. m.emit(0x0f)
  24791. m.emit(0xf8)
  24792. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24793. })
  24794. }
  24795. // PSUBB m128, xmm
  24796. if isM128(v0) && isXMM(v1) {
  24797. self.require(ISA_SSE2)
  24798. p.domain = DomainMMXSSE
  24799. p.add(0, func(m *_Encoding, v []interface{}) {
  24800. m.emit(0x66)
  24801. m.rexo(hcode(v[1]), addr(v[0]), false)
  24802. m.emit(0x0f)
  24803. m.emit(0xf8)
  24804. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24805. })
  24806. }
  24807. if p.len == 0 {
  24808. panic("invalid operands for PSUBB")
  24809. }
  24810. return p
  24811. }
  24812. // PSUBD performs "Subtract Packed Doubleword Integers".
  24813. //
  24814. // Mnemonic : PSUBD
  24815. // Supported forms : (4 forms)
  24816. //
  24817. // * PSUBD mm, mm [MMX]
  24818. // * PSUBD m64, mm [MMX]
  24819. // * PSUBD xmm, xmm [SSE2]
  24820. // * PSUBD m128, xmm [SSE2]
  24821. //
  24822. func (self *Program) PSUBD(v0 interface{}, v1 interface{}) *Instruction {
  24823. p := self.alloc("PSUBD", 2, Operands { v0, v1 })
  24824. // PSUBD mm, mm
  24825. if isMM(v0) && isMM(v1) {
  24826. self.require(ISA_MMX)
  24827. p.domain = DomainMMXSSE
  24828. p.add(0, func(m *_Encoding, v []interface{}) {
  24829. m.rexo(hcode(v[1]), v[0], false)
  24830. m.emit(0x0f)
  24831. m.emit(0xfa)
  24832. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24833. })
  24834. }
  24835. // PSUBD m64, mm
  24836. if isM64(v0) && isMM(v1) {
  24837. self.require(ISA_MMX)
  24838. p.domain = DomainMMXSSE
  24839. p.add(0, func(m *_Encoding, v []interface{}) {
  24840. m.rexo(hcode(v[1]), addr(v[0]), false)
  24841. m.emit(0x0f)
  24842. m.emit(0xfa)
  24843. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24844. })
  24845. }
  24846. // PSUBD xmm, xmm
  24847. if isXMM(v0) && isXMM(v1) {
  24848. self.require(ISA_SSE2)
  24849. p.domain = DomainMMXSSE
  24850. p.add(0, func(m *_Encoding, v []interface{}) {
  24851. m.emit(0x66)
  24852. m.rexo(hcode(v[1]), v[0], false)
  24853. m.emit(0x0f)
  24854. m.emit(0xfa)
  24855. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24856. })
  24857. }
  24858. // PSUBD m128, xmm
  24859. if isM128(v0) && isXMM(v1) {
  24860. self.require(ISA_SSE2)
  24861. p.domain = DomainMMXSSE
  24862. p.add(0, func(m *_Encoding, v []interface{}) {
  24863. m.emit(0x66)
  24864. m.rexo(hcode(v[1]), addr(v[0]), false)
  24865. m.emit(0x0f)
  24866. m.emit(0xfa)
  24867. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24868. })
  24869. }
  24870. if p.len == 0 {
  24871. panic("invalid operands for PSUBD")
  24872. }
  24873. return p
  24874. }
  24875. // PSUBQ performs "Subtract Packed Quadword Integers".
  24876. //
  24877. // Mnemonic : PSUBQ
  24878. // Supported forms : (4 forms)
  24879. //
  24880. // * PSUBQ mm, mm [SSE2]
  24881. // * PSUBQ m64, mm [SSE2]
  24882. // * PSUBQ xmm, xmm [SSE2]
  24883. // * PSUBQ m128, xmm [SSE2]
  24884. //
  24885. func (self *Program) PSUBQ(v0 interface{}, v1 interface{}) *Instruction {
  24886. p := self.alloc("PSUBQ", 2, Operands { v0, v1 })
  24887. // PSUBQ mm, mm
  24888. if isMM(v0) && isMM(v1) {
  24889. self.require(ISA_SSE2)
  24890. p.domain = DomainMMXSSE
  24891. p.add(0, func(m *_Encoding, v []interface{}) {
  24892. m.rexo(hcode(v[1]), v[0], false)
  24893. m.emit(0x0f)
  24894. m.emit(0xfb)
  24895. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24896. })
  24897. }
  24898. // PSUBQ m64, mm
  24899. if isM64(v0) && isMM(v1) {
  24900. self.require(ISA_SSE2)
  24901. p.domain = DomainMMXSSE
  24902. p.add(0, func(m *_Encoding, v []interface{}) {
  24903. m.rexo(hcode(v[1]), addr(v[0]), false)
  24904. m.emit(0x0f)
  24905. m.emit(0xfb)
  24906. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24907. })
  24908. }
  24909. // PSUBQ xmm, xmm
  24910. if isXMM(v0) && isXMM(v1) {
  24911. self.require(ISA_SSE2)
  24912. p.domain = DomainMMXSSE
  24913. p.add(0, func(m *_Encoding, v []interface{}) {
  24914. m.emit(0x66)
  24915. m.rexo(hcode(v[1]), v[0], false)
  24916. m.emit(0x0f)
  24917. m.emit(0xfb)
  24918. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24919. })
  24920. }
  24921. // PSUBQ m128, xmm
  24922. if isM128(v0) && isXMM(v1) {
  24923. self.require(ISA_SSE2)
  24924. p.domain = DomainMMXSSE
  24925. p.add(0, func(m *_Encoding, v []interface{}) {
  24926. m.emit(0x66)
  24927. m.rexo(hcode(v[1]), addr(v[0]), false)
  24928. m.emit(0x0f)
  24929. m.emit(0xfb)
  24930. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24931. })
  24932. }
  24933. if p.len == 0 {
  24934. panic("invalid operands for PSUBQ")
  24935. }
  24936. return p
  24937. }
  24938. // PSUBSB performs "Subtract Packed Signed Byte Integers with Signed Saturation".
  24939. //
  24940. // Mnemonic : PSUBSB
  24941. // Supported forms : (4 forms)
  24942. //
  24943. // * PSUBSB mm, mm [MMX]
  24944. // * PSUBSB m64, mm [MMX]
  24945. // * PSUBSB xmm, xmm [SSE2]
  24946. // * PSUBSB m128, xmm [SSE2]
  24947. //
  24948. func (self *Program) PSUBSB(v0 interface{}, v1 interface{}) *Instruction {
  24949. p := self.alloc("PSUBSB", 2, Operands { v0, v1 })
  24950. // PSUBSB mm, mm
  24951. if isMM(v0) && isMM(v1) {
  24952. self.require(ISA_MMX)
  24953. p.domain = DomainMMXSSE
  24954. p.add(0, func(m *_Encoding, v []interface{}) {
  24955. m.rexo(hcode(v[1]), v[0], false)
  24956. m.emit(0x0f)
  24957. m.emit(0xe8)
  24958. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24959. })
  24960. }
  24961. // PSUBSB m64, mm
  24962. if isM64(v0) && isMM(v1) {
  24963. self.require(ISA_MMX)
  24964. p.domain = DomainMMXSSE
  24965. p.add(0, func(m *_Encoding, v []interface{}) {
  24966. m.rexo(hcode(v[1]), addr(v[0]), false)
  24967. m.emit(0x0f)
  24968. m.emit(0xe8)
  24969. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24970. })
  24971. }
  24972. // PSUBSB xmm, xmm
  24973. if isXMM(v0) && isXMM(v1) {
  24974. self.require(ISA_SSE2)
  24975. p.domain = DomainMMXSSE
  24976. p.add(0, func(m *_Encoding, v []interface{}) {
  24977. m.emit(0x66)
  24978. m.rexo(hcode(v[1]), v[0], false)
  24979. m.emit(0x0f)
  24980. m.emit(0xe8)
  24981. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  24982. })
  24983. }
  24984. // PSUBSB m128, xmm
  24985. if isM128(v0) && isXMM(v1) {
  24986. self.require(ISA_SSE2)
  24987. p.domain = DomainMMXSSE
  24988. p.add(0, func(m *_Encoding, v []interface{}) {
  24989. m.emit(0x66)
  24990. m.rexo(hcode(v[1]), addr(v[0]), false)
  24991. m.emit(0x0f)
  24992. m.emit(0xe8)
  24993. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  24994. })
  24995. }
  24996. if p.len == 0 {
  24997. panic("invalid operands for PSUBSB")
  24998. }
  24999. return p
  25000. }
  25001. // PSUBSW performs "Subtract Packed Signed Word Integers with Signed Saturation".
  25002. //
  25003. // Mnemonic : PSUBSW
  25004. // Supported forms : (4 forms)
  25005. //
  25006. // * PSUBSW mm, mm [MMX]
  25007. // * PSUBSW m64, mm [MMX]
  25008. // * PSUBSW xmm, xmm [SSE2]
  25009. // * PSUBSW m128, xmm [SSE2]
  25010. //
  25011. func (self *Program) PSUBSW(v0 interface{}, v1 interface{}) *Instruction {
  25012. p := self.alloc("PSUBSW", 2, Operands { v0, v1 })
  25013. // PSUBSW mm, mm
  25014. if isMM(v0) && isMM(v1) {
  25015. self.require(ISA_MMX)
  25016. p.domain = DomainMMXSSE
  25017. p.add(0, func(m *_Encoding, v []interface{}) {
  25018. m.rexo(hcode(v[1]), v[0], false)
  25019. m.emit(0x0f)
  25020. m.emit(0xe9)
  25021. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25022. })
  25023. }
  25024. // PSUBSW m64, mm
  25025. if isM64(v0) && isMM(v1) {
  25026. self.require(ISA_MMX)
  25027. p.domain = DomainMMXSSE
  25028. p.add(0, func(m *_Encoding, v []interface{}) {
  25029. m.rexo(hcode(v[1]), addr(v[0]), false)
  25030. m.emit(0x0f)
  25031. m.emit(0xe9)
  25032. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25033. })
  25034. }
  25035. // PSUBSW xmm, xmm
  25036. if isXMM(v0) && isXMM(v1) {
  25037. self.require(ISA_SSE2)
  25038. p.domain = DomainMMXSSE
  25039. p.add(0, func(m *_Encoding, v []interface{}) {
  25040. m.emit(0x66)
  25041. m.rexo(hcode(v[1]), v[0], false)
  25042. m.emit(0x0f)
  25043. m.emit(0xe9)
  25044. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25045. })
  25046. }
  25047. // PSUBSW m128, xmm
  25048. if isM128(v0) && isXMM(v1) {
  25049. self.require(ISA_SSE2)
  25050. p.domain = DomainMMXSSE
  25051. p.add(0, func(m *_Encoding, v []interface{}) {
  25052. m.emit(0x66)
  25053. m.rexo(hcode(v[1]), addr(v[0]), false)
  25054. m.emit(0x0f)
  25055. m.emit(0xe9)
  25056. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25057. })
  25058. }
  25059. if p.len == 0 {
  25060. panic("invalid operands for PSUBSW")
  25061. }
  25062. return p
  25063. }
  25064. // PSUBUSB performs "Subtract Packed Unsigned Byte Integers with Unsigned Saturation".
  25065. //
  25066. // Mnemonic : PSUBUSB
  25067. // Supported forms : (4 forms)
  25068. //
  25069. // * PSUBUSB mm, mm [MMX]
  25070. // * PSUBUSB m64, mm [MMX]
  25071. // * PSUBUSB xmm, xmm [SSE2]
  25072. // * PSUBUSB m128, xmm [SSE2]
  25073. //
  25074. func (self *Program) PSUBUSB(v0 interface{}, v1 interface{}) *Instruction {
  25075. p := self.alloc("PSUBUSB", 2, Operands { v0, v1 })
  25076. // PSUBUSB mm, mm
  25077. if isMM(v0) && isMM(v1) {
  25078. self.require(ISA_MMX)
  25079. p.domain = DomainMMXSSE
  25080. p.add(0, func(m *_Encoding, v []interface{}) {
  25081. m.rexo(hcode(v[1]), v[0], false)
  25082. m.emit(0x0f)
  25083. m.emit(0xd8)
  25084. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25085. })
  25086. }
  25087. // PSUBUSB m64, mm
  25088. if isM64(v0) && isMM(v1) {
  25089. self.require(ISA_MMX)
  25090. p.domain = DomainMMXSSE
  25091. p.add(0, func(m *_Encoding, v []interface{}) {
  25092. m.rexo(hcode(v[1]), addr(v[0]), false)
  25093. m.emit(0x0f)
  25094. m.emit(0xd8)
  25095. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25096. })
  25097. }
  25098. // PSUBUSB xmm, xmm
  25099. if isXMM(v0) && isXMM(v1) {
  25100. self.require(ISA_SSE2)
  25101. p.domain = DomainMMXSSE
  25102. p.add(0, func(m *_Encoding, v []interface{}) {
  25103. m.emit(0x66)
  25104. m.rexo(hcode(v[1]), v[0], false)
  25105. m.emit(0x0f)
  25106. m.emit(0xd8)
  25107. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25108. })
  25109. }
  25110. // PSUBUSB m128, xmm
  25111. if isM128(v0) && isXMM(v1) {
  25112. self.require(ISA_SSE2)
  25113. p.domain = DomainMMXSSE
  25114. p.add(0, func(m *_Encoding, v []interface{}) {
  25115. m.emit(0x66)
  25116. m.rexo(hcode(v[1]), addr(v[0]), false)
  25117. m.emit(0x0f)
  25118. m.emit(0xd8)
  25119. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25120. })
  25121. }
  25122. if p.len == 0 {
  25123. panic("invalid operands for PSUBUSB")
  25124. }
  25125. return p
  25126. }
  25127. // PSUBUSW performs "Subtract Packed Unsigned Word Integers with Unsigned Saturation".
  25128. //
  25129. // Mnemonic : PSUBUSW
  25130. // Supported forms : (4 forms)
  25131. //
  25132. // * PSUBUSW mm, mm [MMX]
  25133. // * PSUBUSW m64, mm [MMX]
  25134. // * PSUBUSW xmm, xmm [SSE2]
  25135. // * PSUBUSW m128, xmm [SSE2]
  25136. //
  25137. func (self *Program) PSUBUSW(v0 interface{}, v1 interface{}) *Instruction {
  25138. p := self.alloc("PSUBUSW", 2, Operands { v0, v1 })
  25139. // PSUBUSW mm, mm
  25140. if isMM(v0) && isMM(v1) {
  25141. self.require(ISA_MMX)
  25142. p.domain = DomainMMXSSE
  25143. p.add(0, func(m *_Encoding, v []interface{}) {
  25144. m.rexo(hcode(v[1]), v[0], false)
  25145. m.emit(0x0f)
  25146. m.emit(0xd9)
  25147. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25148. })
  25149. }
  25150. // PSUBUSW m64, mm
  25151. if isM64(v0) && isMM(v1) {
  25152. self.require(ISA_MMX)
  25153. p.domain = DomainMMXSSE
  25154. p.add(0, func(m *_Encoding, v []interface{}) {
  25155. m.rexo(hcode(v[1]), addr(v[0]), false)
  25156. m.emit(0x0f)
  25157. m.emit(0xd9)
  25158. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25159. })
  25160. }
  25161. // PSUBUSW xmm, xmm
  25162. if isXMM(v0) && isXMM(v1) {
  25163. self.require(ISA_SSE2)
  25164. p.domain = DomainMMXSSE
  25165. p.add(0, func(m *_Encoding, v []interface{}) {
  25166. m.emit(0x66)
  25167. m.rexo(hcode(v[1]), v[0], false)
  25168. m.emit(0x0f)
  25169. m.emit(0xd9)
  25170. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25171. })
  25172. }
  25173. // PSUBUSW m128, xmm
  25174. if isM128(v0) && isXMM(v1) {
  25175. self.require(ISA_SSE2)
  25176. p.domain = DomainMMXSSE
  25177. p.add(0, func(m *_Encoding, v []interface{}) {
  25178. m.emit(0x66)
  25179. m.rexo(hcode(v[1]), addr(v[0]), false)
  25180. m.emit(0x0f)
  25181. m.emit(0xd9)
  25182. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25183. })
  25184. }
  25185. if p.len == 0 {
  25186. panic("invalid operands for PSUBUSW")
  25187. }
  25188. return p
  25189. }
  25190. // PSUBW performs "Subtract Packed Word Integers".
  25191. //
  25192. // Mnemonic : PSUBW
  25193. // Supported forms : (4 forms)
  25194. //
  25195. // * PSUBW mm, mm [MMX]
  25196. // * PSUBW m64, mm [MMX]
  25197. // * PSUBW xmm, xmm [SSE2]
  25198. // * PSUBW m128, xmm [SSE2]
  25199. //
  25200. func (self *Program) PSUBW(v0 interface{}, v1 interface{}) *Instruction {
  25201. p := self.alloc("PSUBW", 2, Operands { v0, v1 })
  25202. // PSUBW mm, mm
  25203. if isMM(v0) && isMM(v1) {
  25204. self.require(ISA_MMX)
  25205. p.domain = DomainMMXSSE
  25206. p.add(0, func(m *_Encoding, v []interface{}) {
  25207. m.rexo(hcode(v[1]), v[0], false)
  25208. m.emit(0x0f)
  25209. m.emit(0xf9)
  25210. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25211. })
  25212. }
  25213. // PSUBW m64, mm
  25214. if isM64(v0) && isMM(v1) {
  25215. self.require(ISA_MMX)
  25216. p.domain = DomainMMXSSE
  25217. p.add(0, func(m *_Encoding, v []interface{}) {
  25218. m.rexo(hcode(v[1]), addr(v[0]), false)
  25219. m.emit(0x0f)
  25220. m.emit(0xf9)
  25221. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25222. })
  25223. }
  25224. // PSUBW xmm, xmm
  25225. if isXMM(v0) && isXMM(v1) {
  25226. self.require(ISA_SSE2)
  25227. p.domain = DomainMMXSSE
  25228. p.add(0, func(m *_Encoding, v []interface{}) {
  25229. m.emit(0x66)
  25230. m.rexo(hcode(v[1]), v[0], false)
  25231. m.emit(0x0f)
  25232. m.emit(0xf9)
  25233. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25234. })
  25235. }
  25236. // PSUBW m128, xmm
  25237. if isM128(v0) && isXMM(v1) {
  25238. self.require(ISA_SSE2)
  25239. p.domain = DomainMMXSSE
  25240. p.add(0, func(m *_Encoding, v []interface{}) {
  25241. m.emit(0x66)
  25242. m.rexo(hcode(v[1]), addr(v[0]), false)
  25243. m.emit(0x0f)
  25244. m.emit(0xf9)
  25245. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25246. })
  25247. }
  25248. if p.len == 0 {
  25249. panic("invalid operands for PSUBW")
  25250. }
  25251. return p
  25252. }
  25253. // PSWAPD performs "Packed Swap Doubleword".
  25254. //
  25255. // Mnemonic : PSWAPD
  25256. // Supported forms : (2 forms)
  25257. //
  25258. // * PSWAPD mm, mm [3dnow!+]
  25259. // * PSWAPD m64, mm [3dnow!+]
  25260. //
  25261. func (self *Program) PSWAPD(v0 interface{}, v1 interface{}) *Instruction {
  25262. p := self.alloc("PSWAPD", 2, Operands { v0, v1 })
  25263. // PSWAPD mm, mm
  25264. if isMM(v0) && isMM(v1) {
  25265. self.require(ISA_3DNOW_PLUS)
  25266. p.domain = DomainAMDSpecific
  25267. p.add(0, func(m *_Encoding, v []interface{}) {
  25268. m.rexo(hcode(v[1]), v[0], false)
  25269. m.emit(0x0f)
  25270. m.emit(0x0f)
  25271. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25272. m.emit(0xbb)
  25273. })
  25274. }
  25275. // PSWAPD m64, mm
  25276. if isM64(v0) && isMM(v1) {
  25277. self.require(ISA_3DNOW_PLUS)
  25278. p.domain = DomainAMDSpecific
  25279. p.add(0, func(m *_Encoding, v []interface{}) {
  25280. m.rexo(hcode(v[1]), addr(v[0]), false)
  25281. m.emit(0x0f)
  25282. m.emit(0x0f)
  25283. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25284. m.emit(0xbb)
  25285. })
  25286. }
  25287. if p.len == 0 {
  25288. panic("invalid operands for PSWAPD")
  25289. }
  25290. return p
  25291. }
  25292. // PTEST performs "Packed Logical Compare".
  25293. //
  25294. // Mnemonic : PTEST
  25295. // Supported forms : (2 forms)
  25296. //
  25297. // * PTEST xmm, xmm [SSE4.1]
  25298. // * PTEST m128, xmm [SSE4.1]
  25299. //
  25300. func (self *Program) PTEST(v0 interface{}, v1 interface{}) *Instruction {
  25301. p := self.alloc("PTEST", 2, Operands { v0, v1 })
  25302. // PTEST xmm, xmm
  25303. if isXMM(v0) && isXMM(v1) {
  25304. self.require(ISA_SSE4_1)
  25305. p.domain = DomainMMXSSE
  25306. p.add(0, func(m *_Encoding, v []interface{}) {
  25307. m.emit(0x66)
  25308. m.rexo(hcode(v[1]), v[0], false)
  25309. m.emit(0x0f)
  25310. m.emit(0x38)
  25311. m.emit(0x17)
  25312. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25313. })
  25314. }
  25315. // PTEST m128, xmm
  25316. if isM128(v0) && isXMM(v1) {
  25317. self.require(ISA_SSE4_1)
  25318. p.domain = DomainMMXSSE
  25319. p.add(0, func(m *_Encoding, v []interface{}) {
  25320. m.emit(0x66)
  25321. m.rexo(hcode(v[1]), addr(v[0]), false)
  25322. m.emit(0x0f)
  25323. m.emit(0x38)
  25324. m.emit(0x17)
  25325. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25326. })
  25327. }
  25328. if p.len == 0 {
  25329. panic("invalid operands for PTEST")
  25330. }
  25331. return p
  25332. }
  25333. // PUNPCKHBW performs "Unpack and Interleave High-Order Bytes into Words".
  25334. //
  25335. // Mnemonic : PUNPCKHBW
  25336. // Supported forms : (4 forms)
  25337. //
  25338. // * PUNPCKHBW mm, mm [MMX]
  25339. // * PUNPCKHBW m64, mm [MMX]
  25340. // * PUNPCKHBW xmm, xmm [SSE2]
  25341. // * PUNPCKHBW m128, xmm [SSE2]
  25342. //
  25343. func (self *Program) PUNPCKHBW(v0 interface{}, v1 interface{}) *Instruction {
  25344. p := self.alloc("PUNPCKHBW", 2, Operands { v0, v1 })
  25345. // PUNPCKHBW mm, mm
  25346. if isMM(v0) && isMM(v1) {
  25347. self.require(ISA_MMX)
  25348. p.domain = DomainMMXSSE
  25349. p.add(0, func(m *_Encoding, v []interface{}) {
  25350. m.rexo(hcode(v[1]), v[0], false)
  25351. m.emit(0x0f)
  25352. m.emit(0x68)
  25353. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25354. })
  25355. }
  25356. // PUNPCKHBW m64, mm
  25357. if isM64(v0) && isMM(v1) {
  25358. self.require(ISA_MMX)
  25359. p.domain = DomainMMXSSE
  25360. p.add(0, func(m *_Encoding, v []interface{}) {
  25361. m.rexo(hcode(v[1]), addr(v[0]), false)
  25362. m.emit(0x0f)
  25363. m.emit(0x68)
  25364. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25365. })
  25366. }
  25367. // PUNPCKHBW xmm, xmm
  25368. if isXMM(v0) && isXMM(v1) {
  25369. self.require(ISA_SSE2)
  25370. p.domain = DomainMMXSSE
  25371. p.add(0, func(m *_Encoding, v []interface{}) {
  25372. m.emit(0x66)
  25373. m.rexo(hcode(v[1]), v[0], false)
  25374. m.emit(0x0f)
  25375. m.emit(0x68)
  25376. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25377. })
  25378. }
  25379. // PUNPCKHBW m128, xmm
  25380. if isM128(v0) && isXMM(v1) {
  25381. self.require(ISA_SSE2)
  25382. p.domain = DomainMMXSSE
  25383. p.add(0, func(m *_Encoding, v []interface{}) {
  25384. m.emit(0x66)
  25385. m.rexo(hcode(v[1]), addr(v[0]), false)
  25386. m.emit(0x0f)
  25387. m.emit(0x68)
  25388. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25389. })
  25390. }
  25391. if p.len == 0 {
  25392. panic("invalid operands for PUNPCKHBW")
  25393. }
  25394. return p
  25395. }
  25396. // PUNPCKHDQ performs "Unpack and Interleave High-Order Doublewords into Quadwords".
  25397. //
  25398. // Mnemonic : PUNPCKHDQ
  25399. // Supported forms : (4 forms)
  25400. //
  25401. // * PUNPCKHDQ mm, mm [MMX]
  25402. // * PUNPCKHDQ m64, mm [MMX]
  25403. // * PUNPCKHDQ xmm, xmm [SSE2]
  25404. // * PUNPCKHDQ m128, xmm [SSE2]
  25405. //
  25406. func (self *Program) PUNPCKHDQ(v0 interface{}, v1 interface{}) *Instruction {
  25407. p := self.alloc("PUNPCKHDQ", 2, Operands { v0, v1 })
  25408. // PUNPCKHDQ mm, mm
  25409. if isMM(v0) && isMM(v1) {
  25410. self.require(ISA_MMX)
  25411. p.domain = DomainMMXSSE
  25412. p.add(0, func(m *_Encoding, v []interface{}) {
  25413. m.rexo(hcode(v[1]), v[0], false)
  25414. m.emit(0x0f)
  25415. m.emit(0x6a)
  25416. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25417. })
  25418. }
  25419. // PUNPCKHDQ m64, mm
  25420. if isM64(v0) && isMM(v1) {
  25421. self.require(ISA_MMX)
  25422. p.domain = DomainMMXSSE
  25423. p.add(0, func(m *_Encoding, v []interface{}) {
  25424. m.rexo(hcode(v[1]), addr(v[0]), false)
  25425. m.emit(0x0f)
  25426. m.emit(0x6a)
  25427. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25428. })
  25429. }
  25430. // PUNPCKHDQ xmm, xmm
  25431. if isXMM(v0) && isXMM(v1) {
  25432. self.require(ISA_SSE2)
  25433. p.domain = DomainMMXSSE
  25434. p.add(0, func(m *_Encoding, v []interface{}) {
  25435. m.emit(0x66)
  25436. m.rexo(hcode(v[1]), v[0], false)
  25437. m.emit(0x0f)
  25438. m.emit(0x6a)
  25439. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25440. })
  25441. }
  25442. // PUNPCKHDQ m128, xmm
  25443. if isM128(v0) && isXMM(v1) {
  25444. self.require(ISA_SSE2)
  25445. p.domain = DomainMMXSSE
  25446. p.add(0, func(m *_Encoding, v []interface{}) {
  25447. m.emit(0x66)
  25448. m.rexo(hcode(v[1]), addr(v[0]), false)
  25449. m.emit(0x0f)
  25450. m.emit(0x6a)
  25451. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25452. })
  25453. }
  25454. if p.len == 0 {
  25455. panic("invalid operands for PUNPCKHDQ")
  25456. }
  25457. return p
  25458. }
  25459. // PUNPCKHQDQ performs "Unpack and Interleave High-Order Quadwords into Double Quadwords".
  25460. //
  25461. // Mnemonic : PUNPCKHQDQ
  25462. // Supported forms : (2 forms)
  25463. //
  25464. // * PUNPCKHQDQ xmm, xmm [SSE2]
  25465. // * PUNPCKHQDQ m128, xmm [SSE2]
  25466. //
  25467. func (self *Program) PUNPCKHQDQ(v0 interface{}, v1 interface{}) *Instruction {
  25468. p := self.alloc("PUNPCKHQDQ", 2, Operands { v0, v1 })
  25469. // PUNPCKHQDQ xmm, xmm
  25470. if isXMM(v0) && isXMM(v1) {
  25471. self.require(ISA_SSE2)
  25472. p.domain = DomainMMXSSE
  25473. p.add(0, func(m *_Encoding, v []interface{}) {
  25474. m.emit(0x66)
  25475. m.rexo(hcode(v[1]), v[0], false)
  25476. m.emit(0x0f)
  25477. m.emit(0x6d)
  25478. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25479. })
  25480. }
  25481. // PUNPCKHQDQ m128, xmm
  25482. if isM128(v0) && isXMM(v1) {
  25483. self.require(ISA_SSE2)
  25484. p.domain = DomainMMXSSE
  25485. p.add(0, func(m *_Encoding, v []interface{}) {
  25486. m.emit(0x66)
  25487. m.rexo(hcode(v[1]), addr(v[0]), false)
  25488. m.emit(0x0f)
  25489. m.emit(0x6d)
  25490. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25491. })
  25492. }
  25493. if p.len == 0 {
  25494. panic("invalid operands for PUNPCKHQDQ")
  25495. }
  25496. return p
  25497. }
  25498. // PUNPCKHWD performs "Unpack and Interleave High-Order Words into Doublewords".
  25499. //
  25500. // Mnemonic : PUNPCKHWD
  25501. // Supported forms : (4 forms)
  25502. //
  25503. // * PUNPCKHWD mm, mm [MMX]
  25504. // * PUNPCKHWD m64, mm [MMX]
  25505. // * PUNPCKHWD xmm, xmm [SSE2]
  25506. // * PUNPCKHWD m128, xmm [SSE2]
  25507. //
  25508. func (self *Program) PUNPCKHWD(v0 interface{}, v1 interface{}) *Instruction {
  25509. p := self.alloc("PUNPCKHWD", 2, Operands { v0, v1 })
  25510. // PUNPCKHWD mm, mm
  25511. if isMM(v0) && isMM(v1) {
  25512. self.require(ISA_MMX)
  25513. p.domain = DomainMMXSSE
  25514. p.add(0, func(m *_Encoding, v []interface{}) {
  25515. m.rexo(hcode(v[1]), v[0], false)
  25516. m.emit(0x0f)
  25517. m.emit(0x69)
  25518. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25519. })
  25520. }
  25521. // PUNPCKHWD m64, mm
  25522. if isM64(v0) && isMM(v1) {
  25523. self.require(ISA_MMX)
  25524. p.domain = DomainMMXSSE
  25525. p.add(0, func(m *_Encoding, v []interface{}) {
  25526. m.rexo(hcode(v[1]), addr(v[0]), false)
  25527. m.emit(0x0f)
  25528. m.emit(0x69)
  25529. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25530. })
  25531. }
  25532. // PUNPCKHWD xmm, xmm
  25533. if isXMM(v0) && isXMM(v1) {
  25534. self.require(ISA_SSE2)
  25535. p.domain = DomainMMXSSE
  25536. p.add(0, func(m *_Encoding, v []interface{}) {
  25537. m.emit(0x66)
  25538. m.rexo(hcode(v[1]), v[0], false)
  25539. m.emit(0x0f)
  25540. m.emit(0x69)
  25541. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25542. })
  25543. }
  25544. // PUNPCKHWD m128, xmm
  25545. if isM128(v0) && isXMM(v1) {
  25546. self.require(ISA_SSE2)
  25547. p.domain = DomainMMXSSE
  25548. p.add(0, func(m *_Encoding, v []interface{}) {
  25549. m.emit(0x66)
  25550. m.rexo(hcode(v[1]), addr(v[0]), false)
  25551. m.emit(0x0f)
  25552. m.emit(0x69)
  25553. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25554. })
  25555. }
  25556. if p.len == 0 {
  25557. panic("invalid operands for PUNPCKHWD")
  25558. }
  25559. return p
  25560. }
  25561. // PUNPCKLBW performs "Unpack and Interleave Low-Order Bytes into Words".
  25562. //
  25563. // Mnemonic : PUNPCKLBW
  25564. // Supported forms : (4 forms)
  25565. //
  25566. // * PUNPCKLBW mm, mm [MMX]
  25567. // * PUNPCKLBW m32, mm [MMX]
  25568. // * PUNPCKLBW xmm, xmm [SSE2]
  25569. // * PUNPCKLBW m128, xmm [SSE2]
  25570. //
  25571. func (self *Program) PUNPCKLBW(v0 interface{}, v1 interface{}) *Instruction {
  25572. p := self.alloc("PUNPCKLBW", 2, Operands { v0, v1 })
  25573. // PUNPCKLBW mm, mm
  25574. if isMM(v0) && isMM(v1) {
  25575. self.require(ISA_MMX)
  25576. p.domain = DomainMMXSSE
  25577. p.add(0, func(m *_Encoding, v []interface{}) {
  25578. m.rexo(hcode(v[1]), v[0], false)
  25579. m.emit(0x0f)
  25580. m.emit(0x60)
  25581. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25582. })
  25583. }
  25584. // PUNPCKLBW m32, mm
  25585. if isM32(v0) && isMM(v1) {
  25586. self.require(ISA_MMX)
  25587. p.domain = DomainMMXSSE
  25588. p.add(0, func(m *_Encoding, v []interface{}) {
  25589. m.rexo(hcode(v[1]), addr(v[0]), false)
  25590. m.emit(0x0f)
  25591. m.emit(0x60)
  25592. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25593. })
  25594. }
  25595. // PUNPCKLBW xmm, xmm
  25596. if isXMM(v0) && isXMM(v1) {
  25597. self.require(ISA_SSE2)
  25598. p.domain = DomainMMXSSE
  25599. p.add(0, func(m *_Encoding, v []interface{}) {
  25600. m.emit(0x66)
  25601. m.rexo(hcode(v[1]), v[0], false)
  25602. m.emit(0x0f)
  25603. m.emit(0x60)
  25604. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25605. })
  25606. }
  25607. // PUNPCKLBW m128, xmm
  25608. if isM128(v0) && isXMM(v1) {
  25609. self.require(ISA_SSE2)
  25610. p.domain = DomainMMXSSE
  25611. p.add(0, func(m *_Encoding, v []interface{}) {
  25612. m.emit(0x66)
  25613. m.rexo(hcode(v[1]), addr(v[0]), false)
  25614. m.emit(0x0f)
  25615. m.emit(0x60)
  25616. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25617. })
  25618. }
  25619. if p.len == 0 {
  25620. panic("invalid operands for PUNPCKLBW")
  25621. }
  25622. return p
  25623. }
  25624. // PUNPCKLDQ performs "Unpack and Interleave Low-Order Doublewords into Quadwords".
  25625. //
  25626. // Mnemonic : PUNPCKLDQ
  25627. // Supported forms : (4 forms)
  25628. //
  25629. // * PUNPCKLDQ mm, mm [MMX]
  25630. // * PUNPCKLDQ m32, mm [MMX]
  25631. // * PUNPCKLDQ xmm, xmm [SSE2]
  25632. // * PUNPCKLDQ m128, xmm [SSE2]
  25633. //
  25634. func (self *Program) PUNPCKLDQ(v0 interface{}, v1 interface{}) *Instruction {
  25635. p := self.alloc("PUNPCKLDQ", 2, Operands { v0, v1 })
  25636. // PUNPCKLDQ mm, mm
  25637. if isMM(v0) && isMM(v1) {
  25638. self.require(ISA_MMX)
  25639. p.domain = DomainMMXSSE
  25640. p.add(0, func(m *_Encoding, v []interface{}) {
  25641. m.rexo(hcode(v[1]), v[0], false)
  25642. m.emit(0x0f)
  25643. m.emit(0x62)
  25644. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25645. })
  25646. }
  25647. // PUNPCKLDQ m32, mm
  25648. if isM32(v0) && isMM(v1) {
  25649. self.require(ISA_MMX)
  25650. p.domain = DomainMMXSSE
  25651. p.add(0, func(m *_Encoding, v []interface{}) {
  25652. m.rexo(hcode(v[1]), addr(v[0]), false)
  25653. m.emit(0x0f)
  25654. m.emit(0x62)
  25655. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25656. })
  25657. }
  25658. // PUNPCKLDQ xmm, xmm
  25659. if isXMM(v0) && isXMM(v1) {
  25660. self.require(ISA_SSE2)
  25661. p.domain = DomainMMXSSE
  25662. p.add(0, func(m *_Encoding, v []interface{}) {
  25663. m.emit(0x66)
  25664. m.rexo(hcode(v[1]), v[0], false)
  25665. m.emit(0x0f)
  25666. m.emit(0x62)
  25667. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25668. })
  25669. }
  25670. // PUNPCKLDQ m128, xmm
  25671. if isM128(v0) && isXMM(v1) {
  25672. self.require(ISA_SSE2)
  25673. p.domain = DomainMMXSSE
  25674. p.add(0, func(m *_Encoding, v []interface{}) {
  25675. m.emit(0x66)
  25676. m.rexo(hcode(v[1]), addr(v[0]), false)
  25677. m.emit(0x0f)
  25678. m.emit(0x62)
  25679. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25680. })
  25681. }
  25682. if p.len == 0 {
  25683. panic("invalid operands for PUNPCKLDQ")
  25684. }
  25685. return p
  25686. }
  25687. // PUNPCKLQDQ performs "Unpack and Interleave Low-Order Quadwords into Double Quadwords".
  25688. //
  25689. // Mnemonic : PUNPCKLQDQ
  25690. // Supported forms : (2 forms)
  25691. //
  25692. // * PUNPCKLQDQ xmm, xmm [SSE2]
  25693. // * PUNPCKLQDQ m128, xmm [SSE2]
  25694. //
  25695. func (self *Program) PUNPCKLQDQ(v0 interface{}, v1 interface{}) *Instruction {
  25696. p := self.alloc("PUNPCKLQDQ", 2, Operands { v0, v1 })
  25697. // PUNPCKLQDQ xmm, xmm
  25698. if isXMM(v0) && isXMM(v1) {
  25699. self.require(ISA_SSE2)
  25700. p.domain = DomainMMXSSE
  25701. p.add(0, func(m *_Encoding, v []interface{}) {
  25702. m.emit(0x66)
  25703. m.rexo(hcode(v[1]), v[0], false)
  25704. m.emit(0x0f)
  25705. m.emit(0x6c)
  25706. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25707. })
  25708. }
  25709. // PUNPCKLQDQ m128, xmm
  25710. if isM128(v0) && isXMM(v1) {
  25711. self.require(ISA_SSE2)
  25712. p.domain = DomainMMXSSE
  25713. p.add(0, func(m *_Encoding, v []interface{}) {
  25714. m.emit(0x66)
  25715. m.rexo(hcode(v[1]), addr(v[0]), false)
  25716. m.emit(0x0f)
  25717. m.emit(0x6c)
  25718. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25719. })
  25720. }
  25721. if p.len == 0 {
  25722. panic("invalid operands for PUNPCKLQDQ")
  25723. }
  25724. return p
  25725. }
  25726. // PUNPCKLWD performs "Unpack and Interleave Low-Order Words into Doublewords".
  25727. //
  25728. // Mnemonic : PUNPCKLWD
  25729. // Supported forms : (4 forms)
  25730. //
  25731. // * PUNPCKLWD mm, mm [MMX]
  25732. // * PUNPCKLWD m32, mm [MMX]
  25733. // * PUNPCKLWD xmm, xmm [SSE2]
  25734. // * PUNPCKLWD m128, xmm [SSE2]
  25735. //
  25736. func (self *Program) PUNPCKLWD(v0 interface{}, v1 interface{}) *Instruction {
  25737. p := self.alloc("PUNPCKLWD", 2, Operands { v0, v1 })
  25738. // PUNPCKLWD mm, mm
  25739. if isMM(v0) && isMM(v1) {
  25740. self.require(ISA_MMX)
  25741. p.domain = DomainMMXSSE
  25742. p.add(0, func(m *_Encoding, v []interface{}) {
  25743. m.rexo(hcode(v[1]), v[0], false)
  25744. m.emit(0x0f)
  25745. m.emit(0x61)
  25746. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25747. })
  25748. }
  25749. // PUNPCKLWD m32, mm
  25750. if isM32(v0) && isMM(v1) {
  25751. self.require(ISA_MMX)
  25752. p.domain = DomainMMXSSE
  25753. p.add(0, func(m *_Encoding, v []interface{}) {
  25754. m.rexo(hcode(v[1]), addr(v[0]), false)
  25755. m.emit(0x0f)
  25756. m.emit(0x61)
  25757. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25758. })
  25759. }
  25760. // PUNPCKLWD xmm, xmm
  25761. if isXMM(v0) && isXMM(v1) {
  25762. self.require(ISA_SSE2)
  25763. p.domain = DomainMMXSSE
  25764. p.add(0, func(m *_Encoding, v []interface{}) {
  25765. m.emit(0x66)
  25766. m.rexo(hcode(v[1]), v[0], false)
  25767. m.emit(0x0f)
  25768. m.emit(0x61)
  25769. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25770. })
  25771. }
  25772. // PUNPCKLWD m128, xmm
  25773. if isM128(v0) && isXMM(v1) {
  25774. self.require(ISA_SSE2)
  25775. p.domain = DomainMMXSSE
  25776. p.add(0, func(m *_Encoding, v []interface{}) {
  25777. m.emit(0x66)
  25778. m.rexo(hcode(v[1]), addr(v[0]), false)
  25779. m.emit(0x0f)
  25780. m.emit(0x61)
  25781. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25782. })
  25783. }
  25784. if p.len == 0 {
  25785. panic("invalid operands for PUNPCKLWD")
  25786. }
  25787. return p
  25788. }
  25789. // PUSHQ performs "Push Value Onto the Stack".
  25790. //
  25791. // Mnemonic : PUSH
  25792. // Supported forms : (4 forms)
  25793. //
  25794. // * PUSHQ imm8
  25795. // * PUSHQ imm32
  25796. // * PUSHQ r64
  25797. // * PUSHQ m64
  25798. //
  25799. func (self *Program) PUSHQ(v0 interface{}) *Instruction {
  25800. p := self.alloc("PUSHQ", 1, Operands { v0 })
  25801. // PUSHQ imm8
  25802. if isImm8Ext(v0, 8) {
  25803. p.domain = DomainGeneric
  25804. p.add(0, func(m *_Encoding, v []interface{}) {
  25805. m.emit(0x6a)
  25806. m.imm1(toImmAny(v[0]))
  25807. })
  25808. }
  25809. // PUSHQ imm32
  25810. if isImm32Ext(v0, 8) {
  25811. p.domain = DomainGeneric
  25812. p.add(0, func(m *_Encoding, v []interface{}) {
  25813. m.emit(0x68)
  25814. m.imm4(toImmAny(v[0]))
  25815. })
  25816. }
  25817. // PUSHQ r64
  25818. if isReg64(v0) {
  25819. p.domain = DomainGeneric
  25820. p.add(0, func(m *_Encoding, v []interface{}) {
  25821. m.rexo(0, v[0], false)
  25822. m.emit(0x50 | lcode(v[0]))
  25823. })
  25824. p.add(0, func(m *_Encoding, v []interface{}) {
  25825. m.rexo(0, v[0], false)
  25826. m.emit(0xff)
  25827. m.emit(0xf0 | lcode(v[0]))
  25828. })
  25829. }
  25830. // PUSHQ m64
  25831. if isM64(v0) {
  25832. p.domain = DomainGeneric
  25833. p.add(0, func(m *_Encoding, v []interface{}) {
  25834. m.rexo(0, addr(v[0]), false)
  25835. m.emit(0xff)
  25836. m.mrsd(6, addr(v[0]), 1)
  25837. })
  25838. }
  25839. if p.len == 0 {
  25840. panic("invalid operands for PUSHQ")
  25841. }
  25842. return p
  25843. }
  25844. // PUSHW performs "Push Value Onto the Stack".
  25845. //
  25846. // Mnemonic : PUSH
  25847. // Supported forms : (2 forms)
  25848. //
  25849. // * PUSHW r16
  25850. // * PUSHW m16
  25851. //
  25852. func (self *Program) PUSHW(v0 interface{}) *Instruction {
  25853. p := self.alloc("PUSHW", 1, Operands { v0 })
  25854. // PUSHW r16
  25855. if isReg16(v0) {
  25856. p.domain = DomainGeneric
  25857. p.add(0, func(m *_Encoding, v []interface{}) {
  25858. m.emit(0x66)
  25859. m.rexo(0, v[0], false)
  25860. m.emit(0x50 | lcode(v[0]))
  25861. })
  25862. p.add(0, func(m *_Encoding, v []interface{}) {
  25863. m.emit(0x66)
  25864. m.rexo(0, v[0], false)
  25865. m.emit(0xff)
  25866. m.emit(0xf0 | lcode(v[0]))
  25867. })
  25868. }
  25869. // PUSHW m16
  25870. if isM16(v0) {
  25871. p.domain = DomainGeneric
  25872. p.add(0, func(m *_Encoding, v []interface{}) {
  25873. m.emit(0x66)
  25874. m.rexo(0, addr(v[0]), false)
  25875. m.emit(0xff)
  25876. m.mrsd(6, addr(v[0]), 1)
  25877. })
  25878. }
  25879. if p.len == 0 {
  25880. panic("invalid operands for PUSHW")
  25881. }
  25882. return p
  25883. }
  25884. // PXOR performs "Packed Bitwise Logical Exclusive OR".
  25885. //
  25886. // Mnemonic : PXOR
  25887. // Supported forms : (4 forms)
  25888. //
  25889. // * PXOR mm, mm [MMX]
  25890. // * PXOR m64, mm [MMX]
  25891. // * PXOR xmm, xmm [SSE2]
  25892. // * PXOR m128, xmm [SSE2]
  25893. //
  25894. func (self *Program) PXOR(v0 interface{}, v1 interface{}) *Instruction {
  25895. p := self.alloc("PXOR", 2, Operands { v0, v1 })
  25896. // PXOR mm, mm
  25897. if isMM(v0) && isMM(v1) {
  25898. self.require(ISA_MMX)
  25899. p.domain = DomainMMXSSE
  25900. p.add(0, func(m *_Encoding, v []interface{}) {
  25901. m.rexo(hcode(v[1]), v[0], false)
  25902. m.emit(0x0f)
  25903. m.emit(0xef)
  25904. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25905. })
  25906. }
  25907. // PXOR m64, mm
  25908. if isM64(v0) && isMM(v1) {
  25909. self.require(ISA_MMX)
  25910. p.domain = DomainMMXSSE
  25911. p.add(0, func(m *_Encoding, v []interface{}) {
  25912. m.rexo(hcode(v[1]), addr(v[0]), false)
  25913. m.emit(0x0f)
  25914. m.emit(0xef)
  25915. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25916. })
  25917. }
  25918. // PXOR xmm, xmm
  25919. if isXMM(v0) && isXMM(v1) {
  25920. self.require(ISA_SSE2)
  25921. p.domain = DomainMMXSSE
  25922. p.add(0, func(m *_Encoding, v []interface{}) {
  25923. m.emit(0x66)
  25924. m.rexo(hcode(v[1]), v[0], false)
  25925. m.emit(0x0f)
  25926. m.emit(0xef)
  25927. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  25928. })
  25929. }
  25930. // PXOR m128, xmm
  25931. if isM128(v0) && isXMM(v1) {
  25932. self.require(ISA_SSE2)
  25933. p.domain = DomainMMXSSE
  25934. p.add(0, func(m *_Encoding, v []interface{}) {
  25935. m.emit(0x66)
  25936. m.rexo(hcode(v[1]), addr(v[0]), false)
  25937. m.emit(0x0f)
  25938. m.emit(0xef)
  25939. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  25940. })
  25941. }
  25942. if p.len == 0 {
  25943. panic("invalid operands for PXOR")
  25944. }
  25945. return p
  25946. }
  25947. // RCLB performs "Rotate Left through Carry Flag".
  25948. //
  25949. // Mnemonic : RCL
  25950. // Supported forms : (6 forms)
  25951. //
  25952. // * RCLB 1, r8
  25953. // * RCLB imm8, r8
  25954. // * RCLB cl, r8
  25955. // * RCLB 1, m8
  25956. // * RCLB imm8, m8
  25957. // * RCLB cl, m8
  25958. //
  25959. func (self *Program) RCLB(v0 interface{}, v1 interface{}) *Instruction {
  25960. p := self.alloc("RCLB", 2, Operands { v0, v1 })
  25961. // RCLB 1, r8
  25962. if isConst1(v0) && isReg8(v1) {
  25963. p.domain = DomainGeneric
  25964. p.add(0, func(m *_Encoding, v []interface{}) {
  25965. m.rexo(0, v[1], isReg8REX(v[1]))
  25966. m.emit(0xd0)
  25967. m.emit(0xd0 | lcode(v[1]))
  25968. })
  25969. }
  25970. // RCLB imm8, r8
  25971. if isImm8(v0) && isReg8(v1) {
  25972. p.domain = DomainGeneric
  25973. p.add(0, func(m *_Encoding, v []interface{}) {
  25974. m.rexo(0, v[1], isReg8REX(v[1]))
  25975. m.emit(0xc0)
  25976. m.emit(0xd0 | lcode(v[1]))
  25977. m.imm1(toImmAny(v[0]))
  25978. })
  25979. }
  25980. // RCLB cl, r8
  25981. if v0 == CL && isReg8(v1) {
  25982. p.domain = DomainGeneric
  25983. p.add(0, func(m *_Encoding, v []interface{}) {
  25984. m.rexo(0, v[1], isReg8REX(v[1]))
  25985. m.emit(0xd2)
  25986. m.emit(0xd0 | lcode(v[1]))
  25987. })
  25988. }
  25989. // RCLB 1, m8
  25990. if isConst1(v0) && isM8(v1) {
  25991. p.domain = DomainGeneric
  25992. p.add(0, func(m *_Encoding, v []interface{}) {
  25993. m.rexo(0, addr(v[1]), false)
  25994. m.emit(0xd0)
  25995. m.mrsd(2, addr(v[1]), 1)
  25996. })
  25997. }
  25998. // RCLB imm8, m8
  25999. if isImm8(v0) && isM8(v1) {
  26000. p.domain = DomainGeneric
  26001. p.add(0, func(m *_Encoding, v []interface{}) {
  26002. m.rexo(0, addr(v[1]), false)
  26003. m.emit(0xc0)
  26004. m.mrsd(2, addr(v[1]), 1)
  26005. m.imm1(toImmAny(v[0]))
  26006. })
  26007. }
  26008. // RCLB cl, m8
  26009. if v0 == CL && isM8(v1) {
  26010. p.domain = DomainGeneric
  26011. p.add(0, func(m *_Encoding, v []interface{}) {
  26012. m.rexo(0, addr(v[1]), false)
  26013. m.emit(0xd2)
  26014. m.mrsd(2, addr(v[1]), 1)
  26015. })
  26016. }
  26017. if p.len == 0 {
  26018. panic("invalid operands for RCLB")
  26019. }
  26020. return p
  26021. }
  26022. // RCLL performs "Rotate Left through Carry Flag".
  26023. //
  26024. // Mnemonic : RCL
  26025. // Supported forms : (6 forms)
  26026. //
  26027. // * RCLL 1, r32
  26028. // * RCLL imm8, r32
  26029. // * RCLL cl, r32
  26030. // * RCLL 1, m32
  26031. // * RCLL imm8, m32
  26032. // * RCLL cl, m32
  26033. //
  26034. func (self *Program) RCLL(v0 interface{}, v1 interface{}) *Instruction {
  26035. p := self.alloc("RCLL", 2, Operands { v0, v1 })
  26036. // RCLL 1, r32
  26037. if isConst1(v0) && isReg32(v1) {
  26038. p.domain = DomainGeneric
  26039. p.add(0, func(m *_Encoding, v []interface{}) {
  26040. m.rexo(0, v[1], false)
  26041. m.emit(0xd1)
  26042. m.emit(0xd0 | lcode(v[1]))
  26043. })
  26044. }
  26045. // RCLL imm8, r32
  26046. if isImm8(v0) && isReg32(v1) {
  26047. p.domain = DomainGeneric
  26048. p.add(0, func(m *_Encoding, v []interface{}) {
  26049. m.rexo(0, v[1], false)
  26050. m.emit(0xc1)
  26051. m.emit(0xd0 | lcode(v[1]))
  26052. m.imm1(toImmAny(v[0]))
  26053. })
  26054. }
  26055. // RCLL cl, r32
  26056. if v0 == CL && isReg32(v1) {
  26057. p.domain = DomainGeneric
  26058. p.add(0, func(m *_Encoding, v []interface{}) {
  26059. m.rexo(0, v[1], false)
  26060. m.emit(0xd3)
  26061. m.emit(0xd0 | lcode(v[1]))
  26062. })
  26063. }
  26064. // RCLL 1, m32
  26065. if isConst1(v0) && isM32(v1) {
  26066. p.domain = DomainGeneric
  26067. p.add(0, func(m *_Encoding, v []interface{}) {
  26068. m.rexo(0, addr(v[1]), false)
  26069. m.emit(0xd1)
  26070. m.mrsd(2, addr(v[1]), 1)
  26071. })
  26072. }
  26073. // RCLL imm8, m32
  26074. if isImm8(v0) && isM32(v1) {
  26075. p.domain = DomainGeneric
  26076. p.add(0, func(m *_Encoding, v []interface{}) {
  26077. m.rexo(0, addr(v[1]), false)
  26078. m.emit(0xc1)
  26079. m.mrsd(2, addr(v[1]), 1)
  26080. m.imm1(toImmAny(v[0]))
  26081. })
  26082. }
  26083. // RCLL cl, m32
  26084. if v0 == CL && isM32(v1) {
  26085. p.domain = DomainGeneric
  26086. p.add(0, func(m *_Encoding, v []interface{}) {
  26087. m.rexo(0, addr(v[1]), false)
  26088. m.emit(0xd3)
  26089. m.mrsd(2, addr(v[1]), 1)
  26090. })
  26091. }
  26092. if p.len == 0 {
  26093. panic("invalid operands for RCLL")
  26094. }
  26095. return p
  26096. }
  26097. // RCLQ performs "Rotate Left through Carry Flag".
  26098. //
  26099. // Mnemonic : RCL
  26100. // Supported forms : (6 forms)
  26101. //
  26102. // * RCLQ 1, r64
  26103. // * RCLQ imm8, r64
  26104. // * RCLQ cl, r64
  26105. // * RCLQ 1, m64
  26106. // * RCLQ imm8, m64
  26107. // * RCLQ cl, m64
  26108. //
  26109. func (self *Program) RCLQ(v0 interface{}, v1 interface{}) *Instruction {
  26110. p := self.alloc("RCLQ", 2, Operands { v0, v1 })
  26111. // RCLQ 1, r64
  26112. if isConst1(v0) && isReg64(v1) {
  26113. p.domain = DomainGeneric
  26114. p.add(0, func(m *_Encoding, v []interface{}) {
  26115. m.emit(0x48 | hcode(v[1]))
  26116. m.emit(0xd1)
  26117. m.emit(0xd0 | lcode(v[1]))
  26118. })
  26119. }
  26120. // RCLQ imm8, r64
  26121. if isImm8(v0) && isReg64(v1) {
  26122. p.domain = DomainGeneric
  26123. p.add(0, func(m *_Encoding, v []interface{}) {
  26124. m.emit(0x48 | hcode(v[1]))
  26125. m.emit(0xc1)
  26126. m.emit(0xd0 | lcode(v[1]))
  26127. m.imm1(toImmAny(v[0]))
  26128. })
  26129. }
  26130. // RCLQ cl, r64
  26131. if v0 == CL && isReg64(v1) {
  26132. p.domain = DomainGeneric
  26133. p.add(0, func(m *_Encoding, v []interface{}) {
  26134. m.emit(0x48 | hcode(v[1]))
  26135. m.emit(0xd3)
  26136. m.emit(0xd0 | lcode(v[1]))
  26137. })
  26138. }
  26139. // RCLQ 1, m64
  26140. if isConst1(v0) && isM64(v1) {
  26141. p.domain = DomainGeneric
  26142. p.add(0, func(m *_Encoding, v []interface{}) {
  26143. m.rexm(1, 0, addr(v[1]))
  26144. m.emit(0xd1)
  26145. m.mrsd(2, addr(v[1]), 1)
  26146. })
  26147. }
  26148. // RCLQ imm8, m64
  26149. if isImm8(v0) && isM64(v1) {
  26150. p.domain = DomainGeneric
  26151. p.add(0, func(m *_Encoding, v []interface{}) {
  26152. m.rexm(1, 0, addr(v[1]))
  26153. m.emit(0xc1)
  26154. m.mrsd(2, addr(v[1]), 1)
  26155. m.imm1(toImmAny(v[0]))
  26156. })
  26157. }
  26158. // RCLQ cl, m64
  26159. if v0 == CL && isM64(v1) {
  26160. p.domain = DomainGeneric
  26161. p.add(0, func(m *_Encoding, v []interface{}) {
  26162. m.rexm(1, 0, addr(v[1]))
  26163. m.emit(0xd3)
  26164. m.mrsd(2, addr(v[1]), 1)
  26165. })
  26166. }
  26167. if p.len == 0 {
  26168. panic("invalid operands for RCLQ")
  26169. }
  26170. return p
  26171. }
  26172. // RCLW performs "Rotate Left through Carry Flag".
  26173. //
  26174. // Mnemonic : RCL
  26175. // Supported forms : (6 forms)
  26176. //
  26177. // * RCLW 1, r16
  26178. // * RCLW imm8, r16
  26179. // * RCLW cl, r16
  26180. // * RCLW 1, m16
  26181. // * RCLW imm8, m16
  26182. // * RCLW cl, m16
  26183. //
  26184. func (self *Program) RCLW(v0 interface{}, v1 interface{}) *Instruction {
  26185. p := self.alloc("RCLW", 2, Operands { v0, v1 })
  26186. // RCLW 1, r16
  26187. if isConst1(v0) && isReg16(v1) {
  26188. p.domain = DomainGeneric
  26189. p.add(0, func(m *_Encoding, v []interface{}) {
  26190. m.emit(0x66)
  26191. m.rexo(0, v[1], false)
  26192. m.emit(0xd1)
  26193. m.emit(0xd0 | lcode(v[1]))
  26194. })
  26195. }
  26196. // RCLW imm8, r16
  26197. if isImm8(v0) && isReg16(v1) {
  26198. p.domain = DomainGeneric
  26199. p.add(0, func(m *_Encoding, v []interface{}) {
  26200. m.emit(0x66)
  26201. m.rexo(0, v[1], false)
  26202. m.emit(0xc1)
  26203. m.emit(0xd0 | lcode(v[1]))
  26204. m.imm1(toImmAny(v[0]))
  26205. })
  26206. }
  26207. // RCLW cl, r16
  26208. if v0 == CL && isReg16(v1) {
  26209. p.domain = DomainGeneric
  26210. p.add(0, func(m *_Encoding, v []interface{}) {
  26211. m.emit(0x66)
  26212. m.rexo(0, v[1], false)
  26213. m.emit(0xd3)
  26214. m.emit(0xd0 | lcode(v[1]))
  26215. })
  26216. }
  26217. // RCLW 1, m16
  26218. if isConst1(v0) && isM16(v1) {
  26219. p.domain = DomainGeneric
  26220. p.add(0, func(m *_Encoding, v []interface{}) {
  26221. m.emit(0x66)
  26222. m.rexo(0, addr(v[1]), false)
  26223. m.emit(0xd1)
  26224. m.mrsd(2, addr(v[1]), 1)
  26225. })
  26226. }
  26227. // RCLW imm8, m16
  26228. if isImm8(v0) && isM16(v1) {
  26229. p.domain = DomainGeneric
  26230. p.add(0, func(m *_Encoding, v []interface{}) {
  26231. m.emit(0x66)
  26232. m.rexo(0, addr(v[1]), false)
  26233. m.emit(0xc1)
  26234. m.mrsd(2, addr(v[1]), 1)
  26235. m.imm1(toImmAny(v[0]))
  26236. })
  26237. }
  26238. // RCLW cl, m16
  26239. if v0 == CL && isM16(v1) {
  26240. p.domain = DomainGeneric
  26241. p.add(0, func(m *_Encoding, v []interface{}) {
  26242. m.emit(0x66)
  26243. m.rexo(0, addr(v[1]), false)
  26244. m.emit(0xd3)
  26245. m.mrsd(2, addr(v[1]), 1)
  26246. })
  26247. }
  26248. if p.len == 0 {
  26249. panic("invalid operands for RCLW")
  26250. }
  26251. return p
  26252. }
  26253. // RCPPS performs "Compute Approximate Reciprocals of Packed Single-Precision Floating-Point Values".
  26254. //
  26255. // Mnemonic : RCPPS
  26256. // Supported forms : (2 forms)
  26257. //
  26258. // * RCPPS xmm, xmm [SSE]
  26259. // * RCPPS m128, xmm [SSE]
  26260. //
  26261. func (self *Program) RCPPS(v0 interface{}, v1 interface{}) *Instruction {
  26262. p := self.alloc("RCPPS", 2, Operands { v0, v1 })
  26263. // RCPPS xmm, xmm
  26264. if isXMM(v0) && isXMM(v1) {
  26265. self.require(ISA_SSE)
  26266. p.domain = DomainMMXSSE
  26267. p.add(0, func(m *_Encoding, v []interface{}) {
  26268. m.rexo(hcode(v[1]), v[0], false)
  26269. m.emit(0x0f)
  26270. m.emit(0x53)
  26271. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  26272. })
  26273. }
  26274. // RCPPS m128, xmm
  26275. if isM128(v0) && isXMM(v1) {
  26276. self.require(ISA_SSE)
  26277. p.domain = DomainMMXSSE
  26278. p.add(0, func(m *_Encoding, v []interface{}) {
  26279. m.rexo(hcode(v[1]), addr(v[0]), false)
  26280. m.emit(0x0f)
  26281. m.emit(0x53)
  26282. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  26283. })
  26284. }
  26285. if p.len == 0 {
  26286. panic("invalid operands for RCPPS")
  26287. }
  26288. return p
  26289. }
  26290. // RCPSS performs "Compute Approximate Reciprocal of Scalar Single-Precision Floating-Point Values".
  26291. //
  26292. // Mnemonic : RCPSS
  26293. // Supported forms : (2 forms)
  26294. //
  26295. // * RCPSS xmm, xmm [SSE]
  26296. // * RCPSS m32, xmm [SSE]
  26297. //
  26298. func (self *Program) RCPSS(v0 interface{}, v1 interface{}) *Instruction {
  26299. p := self.alloc("RCPSS", 2, Operands { v0, v1 })
  26300. // RCPSS xmm, xmm
  26301. if isXMM(v0) && isXMM(v1) {
  26302. self.require(ISA_SSE)
  26303. p.domain = DomainMMXSSE
  26304. p.add(0, func(m *_Encoding, v []interface{}) {
  26305. m.emit(0xf3)
  26306. m.rexo(hcode(v[1]), v[0], false)
  26307. m.emit(0x0f)
  26308. m.emit(0x53)
  26309. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  26310. })
  26311. }
  26312. // RCPSS m32, xmm
  26313. if isM32(v0) && isXMM(v1) {
  26314. self.require(ISA_SSE)
  26315. p.domain = DomainMMXSSE
  26316. p.add(0, func(m *_Encoding, v []interface{}) {
  26317. m.emit(0xf3)
  26318. m.rexo(hcode(v[1]), addr(v[0]), false)
  26319. m.emit(0x0f)
  26320. m.emit(0x53)
  26321. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  26322. })
  26323. }
  26324. if p.len == 0 {
  26325. panic("invalid operands for RCPSS")
  26326. }
  26327. return p
  26328. }
  26329. // RCRB performs "Rotate Right through Carry Flag".
  26330. //
  26331. // Mnemonic : RCR
  26332. // Supported forms : (6 forms)
  26333. //
  26334. // * RCRB 1, r8
  26335. // * RCRB imm8, r8
  26336. // * RCRB cl, r8
  26337. // * RCRB 1, m8
  26338. // * RCRB imm8, m8
  26339. // * RCRB cl, m8
  26340. //
  26341. func (self *Program) RCRB(v0 interface{}, v1 interface{}) *Instruction {
  26342. p := self.alloc("RCRB", 2, Operands { v0, v1 })
  26343. // RCRB 1, r8
  26344. if isConst1(v0) && isReg8(v1) {
  26345. p.domain = DomainGeneric
  26346. p.add(0, func(m *_Encoding, v []interface{}) {
  26347. m.rexo(0, v[1], isReg8REX(v[1]))
  26348. m.emit(0xd0)
  26349. m.emit(0xd8 | lcode(v[1]))
  26350. })
  26351. }
  26352. // RCRB imm8, r8
  26353. if isImm8(v0) && isReg8(v1) {
  26354. p.domain = DomainGeneric
  26355. p.add(0, func(m *_Encoding, v []interface{}) {
  26356. m.rexo(0, v[1], isReg8REX(v[1]))
  26357. m.emit(0xc0)
  26358. m.emit(0xd8 | lcode(v[1]))
  26359. m.imm1(toImmAny(v[0]))
  26360. })
  26361. }
  26362. // RCRB cl, r8
  26363. if v0 == CL && isReg8(v1) {
  26364. p.domain = DomainGeneric
  26365. p.add(0, func(m *_Encoding, v []interface{}) {
  26366. m.rexo(0, v[1], isReg8REX(v[1]))
  26367. m.emit(0xd2)
  26368. m.emit(0xd8 | lcode(v[1]))
  26369. })
  26370. }
  26371. // RCRB 1, m8
  26372. if isConst1(v0) && isM8(v1) {
  26373. p.domain = DomainGeneric
  26374. p.add(0, func(m *_Encoding, v []interface{}) {
  26375. m.rexo(0, addr(v[1]), false)
  26376. m.emit(0xd0)
  26377. m.mrsd(3, addr(v[1]), 1)
  26378. })
  26379. }
  26380. // RCRB imm8, m8
  26381. if isImm8(v0) && isM8(v1) {
  26382. p.domain = DomainGeneric
  26383. p.add(0, func(m *_Encoding, v []interface{}) {
  26384. m.rexo(0, addr(v[1]), false)
  26385. m.emit(0xc0)
  26386. m.mrsd(3, addr(v[1]), 1)
  26387. m.imm1(toImmAny(v[0]))
  26388. })
  26389. }
  26390. // RCRB cl, m8
  26391. if v0 == CL && isM8(v1) {
  26392. p.domain = DomainGeneric
  26393. p.add(0, func(m *_Encoding, v []interface{}) {
  26394. m.rexo(0, addr(v[1]), false)
  26395. m.emit(0xd2)
  26396. m.mrsd(3, addr(v[1]), 1)
  26397. })
  26398. }
  26399. if p.len == 0 {
  26400. panic("invalid operands for RCRB")
  26401. }
  26402. return p
  26403. }
  26404. // RCRL performs "Rotate Right through Carry Flag".
  26405. //
  26406. // Mnemonic : RCR
  26407. // Supported forms : (6 forms)
  26408. //
  26409. // * RCRL 1, r32
  26410. // * RCRL imm8, r32
  26411. // * RCRL cl, r32
  26412. // * RCRL 1, m32
  26413. // * RCRL imm8, m32
  26414. // * RCRL cl, m32
  26415. //
  26416. func (self *Program) RCRL(v0 interface{}, v1 interface{}) *Instruction {
  26417. p := self.alloc("RCRL", 2, Operands { v0, v1 })
  26418. // RCRL 1, r32
  26419. if isConst1(v0) && isReg32(v1) {
  26420. p.domain = DomainGeneric
  26421. p.add(0, func(m *_Encoding, v []interface{}) {
  26422. m.rexo(0, v[1], false)
  26423. m.emit(0xd1)
  26424. m.emit(0xd8 | lcode(v[1]))
  26425. })
  26426. }
  26427. // RCRL imm8, r32
  26428. if isImm8(v0) && isReg32(v1) {
  26429. p.domain = DomainGeneric
  26430. p.add(0, func(m *_Encoding, v []interface{}) {
  26431. m.rexo(0, v[1], false)
  26432. m.emit(0xc1)
  26433. m.emit(0xd8 | lcode(v[1]))
  26434. m.imm1(toImmAny(v[0]))
  26435. })
  26436. }
  26437. // RCRL cl, r32
  26438. if v0 == CL && isReg32(v1) {
  26439. p.domain = DomainGeneric
  26440. p.add(0, func(m *_Encoding, v []interface{}) {
  26441. m.rexo(0, v[1], false)
  26442. m.emit(0xd3)
  26443. m.emit(0xd8 | lcode(v[1]))
  26444. })
  26445. }
  26446. // RCRL 1, m32
  26447. if isConst1(v0) && isM32(v1) {
  26448. p.domain = DomainGeneric
  26449. p.add(0, func(m *_Encoding, v []interface{}) {
  26450. m.rexo(0, addr(v[1]), false)
  26451. m.emit(0xd1)
  26452. m.mrsd(3, addr(v[1]), 1)
  26453. })
  26454. }
  26455. // RCRL imm8, m32
  26456. if isImm8(v0) && isM32(v1) {
  26457. p.domain = DomainGeneric
  26458. p.add(0, func(m *_Encoding, v []interface{}) {
  26459. m.rexo(0, addr(v[1]), false)
  26460. m.emit(0xc1)
  26461. m.mrsd(3, addr(v[1]), 1)
  26462. m.imm1(toImmAny(v[0]))
  26463. })
  26464. }
  26465. // RCRL cl, m32
  26466. if v0 == CL && isM32(v1) {
  26467. p.domain = DomainGeneric
  26468. p.add(0, func(m *_Encoding, v []interface{}) {
  26469. m.rexo(0, addr(v[1]), false)
  26470. m.emit(0xd3)
  26471. m.mrsd(3, addr(v[1]), 1)
  26472. })
  26473. }
  26474. if p.len == 0 {
  26475. panic("invalid operands for RCRL")
  26476. }
  26477. return p
  26478. }
  26479. // RCRQ performs "Rotate Right through Carry Flag".
  26480. //
  26481. // Mnemonic : RCR
  26482. // Supported forms : (6 forms)
  26483. //
  26484. // * RCRQ 1, r64
  26485. // * RCRQ imm8, r64
  26486. // * RCRQ cl, r64
  26487. // * RCRQ 1, m64
  26488. // * RCRQ imm8, m64
  26489. // * RCRQ cl, m64
  26490. //
  26491. func (self *Program) RCRQ(v0 interface{}, v1 interface{}) *Instruction {
  26492. p := self.alloc("RCRQ", 2, Operands { v0, v1 })
  26493. // RCRQ 1, r64
  26494. if isConst1(v0) && isReg64(v1) {
  26495. p.domain = DomainGeneric
  26496. p.add(0, func(m *_Encoding, v []interface{}) {
  26497. m.emit(0x48 | hcode(v[1]))
  26498. m.emit(0xd1)
  26499. m.emit(0xd8 | lcode(v[1]))
  26500. })
  26501. }
  26502. // RCRQ imm8, r64
  26503. if isImm8(v0) && isReg64(v1) {
  26504. p.domain = DomainGeneric
  26505. p.add(0, func(m *_Encoding, v []interface{}) {
  26506. m.emit(0x48 | hcode(v[1]))
  26507. m.emit(0xc1)
  26508. m.emit(0xd8 | lcode(v[1]))
  26509. m.imm1(toImmAny(v[0]))
  26510. })
  26511. }
  26512. // RCRQ cl, r64
  26513. if v0 == CL && isReg64(v1) {
  26514. p.domain = DomainGeneric
  26515. p.add(0, func(m *_Encoding, v []interface{}) {
  26516. m.emit(0x48 | hcode(v[1]))
  26517. m.emit(0xd3)
  26518. m.emit(0xd8 | lcode(v[1]))
  26519. })
  26520. }
  26521. // RCRQ 1, m64
  26522. if isConst1(v0) && isM64(v1) {
  26523. p.domain = DomainGeneric
  26524. p.add(0, func(m *_Encoding, v []interface{}) {
  26525. m.rexm(1, 0, addr(v[1]))
  26526. m.emit(0xd1)
  26527. m.mrsd(3, addr(v[1]), 1)
  26528. })
  26529. }
  26530. // RCRQ imm8, m64
  26531. if isImm8(v0) && isM64(v1) {
  26532. p.domain = DomainGeneric
  26533. p.add(0, func(m *_Encoding, v []interface{}) {
  26534. m.rexm(1, 0, addr(v[1]))
  26535. m.emit(0xc1)
  26536. m.mrsd(3, addr(v[1]), 1)
  26537. m.imm1(toImmAny(v[0]))
  26538. })
  26539. }
  26540. // RCRQ cl, m64
  26541. if v0 == CL && isM64(v1) {
  26542. p.domain = DomainGeneric
  26543. p.add(0, func(m *_Encoding, v []interface{}) {
  26544. m.rexm(1, 0, addr(v[1]))
  26545. m.emit(0xd3)
  26546. m.mrsd(3, addr(v[1]), 1)
  26547. })
  26548. }
  26549. if p.len == 0 {
  26550. panic("invalid operands for RCRQ")
  26551. }
  26552. return p
  26553. }
  26554. // RCRW performs "Rotate Right through Carry Flag".
  26555. //
  26556. // Mnemonic : RCR
  26557. // Supported forms : (6 forms)
  26558. //
  26559. // * RCRW 1, r16
  26560. // * RCRW imm8, r16
  26561. // * RCRW cl, r16
  26562. // * RCRW 1, m16
  26563. // * RCRW imm8, m16
  26564. // * RCRW cl, m16
  26565. //
  26566. func (self *Program) RCRW(v0 interface{}, v1 interface{}) *Instruction {
  26567. p := self.alloc("RCRW", 2, Operands { v0, v1 })
  26568. // RCRW 1, r16
  26569. if isConst1(v0) && isReg16(v1) {
  26570. p.domain = DomainGeneric
  26571. p.add(0, func(m *_Encoding, v []interface{}) {
  26572. m.emit(0x66)
  26573. m.rexo(0, v[1], false)
  26574. m.emit(0xd1)
  26575. m.emit(0xd8 | lcode(v[1]))
  26576. })
  26577. }
  26578. // RCRW imm8, r16
  26579. if isImm8(v0) && isReg16(v1) {
  26580. p.domain = DomainGeneric
  26581. p.add(0, func(m *_Encoding, v []interface{}) {
  26582. m.emit(0x66)
  26583. m.rexo(0, v[1], false)
  26584. m.emit(0xc1)
  26585. m.emit(0xd8 | lcode(v[1]))
  26586. m.imm1(toImmAny(v[0]))
  26587. })
  26588. }
  26589. // RCRW cl, r16
  26590. if v0 == CL && isReg16(v1) {
  26591. p.domain = DomainGeneric
  26592. p.add(0, func(m *_Encoding, v []interface{}) {
  26593. m.emit(0x66)
  26594. m.rexo(0, v[1], false)
  26595. m.emit(0xd3)
  26596. m.emit(0xd8 | lcode(v[1]))
  26597. })
  26598. }
  26599. // RCRW 1, m16
  26600. if isConst1(v0) && isM16(v1) {
  26601. p.domain = DomainGeneric
  26602. p.add(0, func(m *_Encoding, v []interface{}) {
  26603. m.emit(0x66)
  26604. m.rexo(0, addr(v[1]), false)
  26605. m.emit(0xd1)
  26606. m.mrsd(3, addr(v[1]), 1)
  26607. })
  26608. }
  26609. // RCRW imm8, m16
  26610. if isImm8(v0) && isM16(v1) {
  26611. p.domain = DomainGeneric
  26612. p.add(0, func(m *_Encoding, v []interface{}) {
  26613. m.emit(0x66)
  26614. m.rexo(0, addr(v[1]), false)
  26615. m.emit(0xc1)
  26616. m.mrsd(3, addr(v[1]), 1)
  26617. m.imm1(toImmAny(v[0]))
  26618. })
  26619. }
  26620. // RCRW cl, m16
  26621. if v0 == CL && isM16(v1) {
  26622. p.domain = DomainGeneric
  26623. p.add(0, func(m *_Encoding, v []interface{}) {
  26624. m.emit(0x66)
  26625. m.rexo(0, addr(v[1]), false)
  26626. m.emit(0xd3)
  26627. m.mrsd(3, addr(v[1]), 1)
  26628. })
  26629. }
  26630. if p.len == 0 {
  26631. panic("invalid operands for RCRW")
  26632. }
  26633. return p
  26634. }
  26635. // RDRAND performs "Read Random Number".
  26636. //
  26637. // Mnemonic : RDRAND
  26638. // Supported forms : (3 forms)
  26639. //
  26640. // * RDRAND r16 [RDRAND]
  26641. // * RDRAND r32 [RDRAND]
  26642. // * RDRAND r64 [RDRAND]
  26643. //
  26644. func (self *Program) RDRAND(v0 interface{}) *Instruction {
  26645. p := self.alloc("RDRAND", 1, Operands { v0 })
  26646. // RDRAND r16
  26647. if isReg16(v0) {
  26648. self.require(ISA_RDRAND)
  26649. p.domain = DomainCrypto
  26650. p.add(0, func(m *_Encoding, v []interface{}) {
  26651. m.emit(0x66)
  26652. m.rexo(0, v[0], false)
  26653. m.emit(0x0f)
  26654. m.emit(0xc7)
  26655. m.emit(0xf0 | lcode(v[0]))
  26656. })
  26657. }
  26658. // RDRAND r32
  26659. if isReg32(v0) {
  26660. self.require(ISA_RDRAND)
  26661. p.domain = DomainCrypto
  26662. p.add(0, func(m *_Encoding, v []interface{}) {
  26663. m.rexo(0, v[0], false)
  26664. m.emit(0x0f)
  26665. m.emit(0xc7)
  26666. m.emit(0xf0 | lcode(v[0]))
  26667. })
  26668. }
  26669. // RDRAND r64
  26670. if isReg64(v0) {
  26671. self.require(ISA_RDRAND)
  26672. p.domain = DomainCrypto
  26673. p.add(0, func(m *_Encoding, v []interface{}) {
  26674. m.emit(0x48 | hcode(v[0]))
  26675. m.emit(0x0f)
  26676. m.emit(0xc7)
  26677. m.emit(0xf0 | lcode(v[0]))
  26678. })
  26679. }
  26680. if p.len == 0 {
  26681. panic("invalid operands for RDRAND")
  26682. }
  26683. return p
  26684. }
  26685. // RDSEED performs "Read Random SEED".
  26686. //
  26687. // Mnemonic : RDSEED
  26688. // Supported forms : (3 forms)
  26689. //
  26690. // * RDSEED r16 [RDSEED]
  26691. // * RDSEED r32 [RDSEED]
  26692. // * RDSEED r64 [RDSEED]
  26693. //
  26694. func (self *Program) RDSEED(v0 interface{}) *Instruction {
  26695. p := self.alloc("RDSEED", 1, Operands { v0 })
  26696. // RDSEED r16
  26697. if isReg16(v0) {
  26698. self.require(ISA_RDSEED)
  26699. p.domain = DomainCrypto
  26700. p.add(0, func(m *_Encoding, v []interface{}) {
  26701. m.emit(0x66)
  26702. m.rexo(0, v[0], false)
  26703. m.emit(0x0f)
  26704. m.emit(0xc7)
  26705. m.emit(0xf8 | lcode(v[0]))
  26706. })
  26707. }
  26708. // RDSEED r32
  26709. if isReg32(v0) {
  26710. self.require(ISA_RDSEED)
  26711. p.domain = DomainCrypto
  26712. p.add(0, func(m *_Encoding, v []interface{}) {
  26713. m.rexo(0, v[0], false)
  26714. m.emit(0x0f)
  26715. m.emit(0xc7)
  26716. m.emit(0xf8 | lcode(v[0]))
  26717. })
  26718. }
  26719. // RDSEED r64
  26720. if isReg64(v0) {
  26721. self.require(ISA_RDSEED)
  26722. p.domain = DomainCrypto
  26723. p.add(0, func(m *_Encoding, v []interface{}) {
  26724. m.emit(0x48 | hcode(v[0]))
  26725. m.emit(0x0f)
  26726. m.emit(0xc7)
  26727. m.emit(0xf8 | lcode(v[0]))
  26728. })
  26729. }
  26730. if p.len == 0 {
  26731. panic("invalid operands for RDSEED")
  26732. }
  26733. return p
  26734. }
  26735. // RDTSC performs "Read Time-Stamp Counter".
  26736. //
  26737. // Mnemonic : RDTSC
  26738. // Supported forms : (1 form)
  26739. //
  26740. // * RDTSC [RDTSC]
  26741. //
  26742. func (self *Program) RDTSC() *Instruction {
  26743. p := self.alloc("RDTSC", 0, Operands { })
  26744. // RDTSC
  26745. self.require(ISA_RDTSC)
  26746. p.domain = DomainGeneric
  26747. p.add(0, func(m *_Encoding, v []interface{}) {
  26748. m.emit(0x0f)
  26749. m.emit(0x31)
  26750. })
  26751. return p
  26752. }
  26753. // RDTSCP performs "Read Time-Stamp Counter and Processor ID".
  26754. //
  26755. // Mnemonic : RDTSCP
  26756. // Supported forms : (1 form)
  26757. //
  26758. // * RDTSCP [RDTSCP]
  26759. //
  26760. func (self *Program) RDTSCP() *Instruction {
  26761. p := self.alloc("RDTSCP", 0, Operands { })
  26762. // RDTSCP
  26763. self.require(ISA_RDTSCP)
  26764. p.domain = DomainGeneric
  26765. p.add(0, func(m *_Encoding, v []interface{}) {
  26766. m.emit(0x0f)
  26767. m.emit(0x01)
  26768. m.emit(0xf9)
  26769. })
  26770. return p
  26771. }
  26772. // RET performs "Return from Procedure".
  26773. //
  26774. // Mnemonic : RET
  26775. // Supported forms : (2 forms)
  26776. //
  26777. // * RET
  26778. // * RET imm16
  26779. //
  26780. func (self *Program) RET(vv ...interface{}) *Instruction {
  26781. var p *Instruction
  26782. switch len(vv) {
  26783. case 0 : p = self.alloc("RET", 0, Operands { })
  26784. case 1 : p = self.alloc("RET", 1, Operands { vv[0] })
  26785. default : panic("instruction RET takes 0 or 1 operands")
  26786. }
  26787. // RET
  26788. if len(vv) == 0 {
  26789. p.domain = DomainGeneric
  26790. p.add(0, func(m *_Encoding, v []interface{}) {
  26791. m.emit(0xc3)
  26792. })
  26793. }
  26794. // RET imm16
  26795. if len(vv) == 1 && isImm16(vv[0]) {
  26796. p.domain = DomainGeneric
  26797. p.add(0, func(m *_Encoding, v []interface{}) {
  26798. m.emit(0xc2)
  26799. m.imm2(toImmAny(v[0]))
  26800. })
  26801. }
  26802. if p.len == 0 {
  26803. panic("invalid operands for RET")
  26804. }
  26805. return p
  26806. }
  26807. // ROLB performs "Rotate Left".
  26808. //
  26809. // Mnemonic : ROL
  26810. // Supported forms : (6 forms)
  26811. //
  26812. // * ROLB 1, r8
  26813. // * ROLB imm8, r8
  26814. // * ROLB cl, r8
  26815. // * ROLB 1, m8
  26816. // * ROLB imm8, m8
  26817. // * ROLB cl, m8
  26818. //
  26819. func (self *Program) ROLB(v0 interface{}, v1 interface{}) *Instruction {
  26820. p := self.alloc("ROLB", 2, Operands { v0, v1 })
  26821. // ROLB 1, r8
  26822. if isConst1(v0) && isReg8(v1) {
  26823. p.domain = DomainGeneric
  26824. p.add(0, func(m *_Encoding, v []interface{}) {
  26825. m.rexo(0, v[1], isReg8REX(v[1]))
  26826. m.emit(0xd0)
  26827. m.emit(0xc0 | lcode(v[1]))
  26828. })
  26829. }
  26830. // ROLB imm8, r8
  26831. if isImm8(v0) && isReg8(v1) {
  26832. p.domain = DomainGeneric
  26833. p.add(0, func(m *_Encoding, v []interface{}) {
  26834. m.rexo(0, v[1], isReg8REX(v[1]))
  26835. m.emit(0xc0)
  26836. m.emit(0xc0 | lcode(v[1]))
  26837. m.imm1(toImmAny(v[0]))
  26838. })
  26839. }
  26840. // ROLB cl, r8
  26841. if v0 == CL && isReg8(v1) {
  26842. p.domain = DomainGeneric
  26843. p.add(0, func(m *_Encoding, v []interface{}) {
  26844. m.rexo(0, v[1], isReg8REX(v[1]))
  26845. m.emit(0xd2)
  26846. m.emit(0xc0 | lcode(v[1]))
  26847. })
  26848. }
  26849. // ROLB 1, m8
  26850. if isConst1(v0) && isM8(v1) {
  26851. p.domain = DomainGeneric
  26852. p.add(0, func(m *_Encoding, v []interface{}) {
  26853. m.rexo(0, addr(v[1]), false)
  26854. m.emit(0xd0)
  26855. m.mrsd(0, addr(v[1]), 1)
  26856. })
  26857. }
  26858. // ROLB imm8, m8
  26859. if isImm8(v0) && isM8(v1) {
  26860. p.domain = DomainGeneric
  26861. p.add(0, func(m *_Encoding, v []interface{}) {
  26862. m.rexo(0, addr(v[1]), false)
  26863. m.emit(0xc0)
  26864. m.mrsd(0, addr(v[1]), 1)
  26865. m.imm1(toImmAny(v[0]))
  26866. })
  26867. }
  26868. // ROLB cl, m8
  26869. if v0 == CL && isM8(v1) {
  26870. p.domain = DomainGeneric
  26871. p.add(0, func(m *_Encoding, v []interface{}) {
  26872. m.rexo(0, addr(v[1]), false)
  26873. m.emit(0xd2)
  26874. m.mrsd(0, addr(v[1]), 1)
  26875. })
  26876. }
  26877. if p.len == 0 {
  26878. panic("invalid operands for ROLB")
  26879. }
  26880. return p
  26881. }
  26882. // ROLL performs "Rotate Left".
  26883. //
  26884. // Mnemonic : ROL
  26885. // Supported forms : (6 forms)
  26886. //
  26887. // * ROLL 1, r32
  26888. // * ROLL imm8, r32
  26889. // * ROLL cl, r32
  26890. // * ROLL 1, m32
  26891. // * ROLL imm8, m32
  26892. // * ROLL cl, m32
  26893. //
  26894. func (self *Program) ROLL(v0 interface{}, v1 interface{}) *Instruction {
  26895. p := self.alloc("ROLL", 2, Operands { v0, v1 })
  26896. // ROLL 1, r32
  26897. if isConst1(v0) && isReg32(v1) {
  26898. p.domain = DomainGeneric
  26899. p.add(0, func(m *_Encoding, v []interface{}) {
  26900. m.rexo(0, v[1], false)
  26901. m.emit(0xd1)
  26902. m.emit(0xc0 | lcode(v[1]))
  26903. })
  26904. }
  26905. // ROLL imm8, r32
  26906. if isImm8(v0) && isReg32(v1) {
  26907. p.domain = DomainGeneric
  26908. p.add(0, func(m *_Encoding, v []interface{}) {
  26909. m.rexo(0, v[1], false)
  26910. m.emit(0xc1)
  26911. m.emit(0xc0 | lcode(v[1]))
  26912. m.imm1(toImmAny(v[0]))
  26913. })
  26914. }
  26915. // ROLL cl, r32
  26916. if v0 == CL && isReg32(v1) {
  26917. p.domain = DomainGeneric
  26918. p.add(0, func(m *_Encoding, v []interface{}) {
  26919. m.rexo(0, v[1], false)
  26920. m.emit(0xd3)
  26921. m.emit(0xc0 | lcode(v[1]))
  26922. })
  26923. }
  26924. // ROLL 1, m32
  26925. if isConst1(v0) && isM32(v1) {
  26926. p.domain = DomainGeneric
  26927. p.add(0, func(m *_Encoding, v []interface{}) {
  26928. m.rexo(0, addr(v[1]), false)
  26929. m.emit(0xd1)
  26930. m.mrsd(0, addr(v[1]), 1)
  26931. })
  26932. }
  26933. // ROLL imm8, m32
  26934. if isImm8(v0) && isM32(v1) {
  26935. p.domain = DomainGeneric
  26936. p.add(0, func(m *_Encoding, v []interface{}) {
  26937. m.rexo(0, addr(v[1]), false)
  26938. m.emit(0xc1)
  26939. m.mrsd(0, addr(v[1]), 1)
  26940. m.imm1(toImmAny(v[0]))
  26941. })
  26942. }
  26943. // ROLL cl, m32
  26944. if v0 == CL && isM32(v1) {
  26945. p.domain = DomainGeneric
  26946. p.add(0, func(m *_Encoding, v []interface{}) {
  26947. m.rexo(0, addr(v[1]), false)
  26948. m.emit(0xd3)
  26949. m.mrsd(0, addr(v[1]), 1)
  26950. })
  26951. }
  26952. if p.len == 0 {
  26953. panic("invalid operands for ROLL")
  26954. }
  26955. return p
  26956. }
  26957. // ROLQ performs "Rotate Left".
  26958. //
  26959. // Mnemonic : ROL
  26960. // Supported forms : (6 forms)
  26961. //
  26962. // * ROLQ 1, r64
  26963. // * ROLQ imm8, r64
  26964. // * ROLQ cl, r64
  26965. // * ROLQ 1, m64
  26966. // * ROLQ imm8, m64
  26967. // * ROLQ cl, m64
  26968. //
  26969. func (self *Program) ROLQ(v0 interface{}, v1 interface{}) *Instruction {
  26970. p := self.alloc("ROLQ", 2, Operands { v0, v1 })
  26971. // ROLQ 1, r64
  26972. if isConst1(v0) && isReg64(v1) {
  26973. p.domain = DomainGeneric
  26974. p.add(0, func(m *_Encoding, v []interface{}) {
  26975. m.emit(0x48 | hcode(v[1]))
  26976. m.emit(0xd1)
  26977. m.emit(0xc0 | lcode(v[1]))
  26978. })
  26979. }
  26980. // ROLQ imm8, r64
  26981. if isImm8(v0) && isReg64(v1) {
  26982. p.domain = DomainGeneric
  26983. p.add(0, func(m *_Encoding, v []interface{}) {
  26984. m.emit(0x48 | hcode(v[1]))
  26985. m.emit(0xc1)
  26986. m.emit(0xc0 | lcode(v[1]))
  26987. m.imm1(toImmAny(v[0]))
  26988. })
  26989. }
  26990. // ROLQ cl, r64
  26991. if v0 == CL && isReg64(v1) {
  26992. p.domain = DomainGeneric
  26993. p.add(0, func(m *_Encoding, v []interface{}) {
  26994. m.emit(0x48 | hcode(v[1]))
  26995. m.emit(0xd3)
  26996. m.emit(0xc0 | lcode(v[1]))
  26997. })
  26998. }
  26999. // ROLQ 1, m64
  27000. if isConst1(v0) && isM64(v1) {
  27001. p.domain = DomainGeneric
  27002. p.add(0, func(m *_Encoding, v []interface{}) {
  27003. m.rexm(1, 0, addr(v[1]))
  27004. m.emit(0xd1)
  27005. m.mrsd(0, addr(v[1]), 1)
  27006. })
  27007. }
  27008. // ROLQ imm8, m64
  27009. if isImm8(v0) && isM64(v1) {
  27010. p.domain = DomainGeneric
  27011. p.add(0, func(m *_Encoding, v []interface{}) {
  27012. m.rexm(1, 0, addr(v[1]))
  27013. m.emit(0xc1)
  27014. m.mrsd(0, addr(v[1]), 1)
  27015. m.imm1(toImmAny(v[0]))
  27016. })
  27017. }
  27018. // ROLQ cl, m64
  27019. if v0 == CL && isM64(v1) {
  27020. p.domain = DomainGeneric
  27021. p.add(0, func(m *_Encoding, v []interface{}) {
  27022. m.rexm(1, 0, addr(v[1]))
  27023. m.emit(0xd3)
  27024. m.mrsd(0, addr(v[1]), 1)
  27025. })
  27026. }
  27027. if p.len == 0 {
  27028. panic("invalid operands for ROLQ")
  27029. }
  27030. return p
  27031. }
  27032. // ROLW performs "Rotate Left".
  27033. //
  27034. // Mnemonic : ROL
  27035. // Supported forms : (6 forms)
  27036. //
  27037. // * ROLW 1, r16
  27038. // * ROLW imm8, r16
  27039. // * ROLW cl, r16
  27040. // * ROLW 1, m16
  27041. // * ROLW imm8, m16
  27042. // * ROLW cl, m16
  27043. //
  27044. func (self *Program) ROLW(v0 interface{}, v1 interface{}) *Instruction {
  27045. p := self.alloc("ROLW", 2, Operands { v0, v1 })
  27046. // ROLW 1, r16
  27047. if isConst1(v0) && isReg16(v1) {
  27048. p.domain = DomainGeneric
  27049. p.add(0, func(m *_Encoding, v []interface{}) {
  27050. m.emit(0x66)
  27051. m.rexo(0, v[1], false)
  27052. m.emit(0xd1)
  27053. m.emit(0xc0 | lcode(v[1]))
  27054. })
  27055. }
  27056. // ROLW imm8, r16
  27057. if isImm8(v0) && isReg16(v1) {
  27058. p.domain = DomainGeneric
  27059. p.add(0, func(m *_Encoding, v []interface{}) {
  27060. m.emit(0x66)
  27061. m.rexo(0, v[1], false)
  27062. m.emit(0xc1)
  27063. m.emit(0xc0 | lcode(v[1]))
  27064. m.imm1(toImmAny(v[0]))
  27065. })
  27066. }
  27067. // ROLW cl, r16
  27068. if v0 == CL && isReg16(v1) {
  27069. p.domain = DomainGeneric
  27070. p.add(0, func(m *_Encoding, v []interface{}) {
  27071. m.emit(0x66)
  27072. m.rexo(0, v[1], false)
  27073. m.emit(0xd3)
  27074. m.emit(0xc0 | lcode(v[1]))
  27075. })
  27076. }
  27077. // ROLW 1, m16
  27078. if isConst1(v0) && isM16(v1) {
  27079. p.domain = DomainGeneric
  27080. p.add(0, func(m *_Encoding, v []interface{}) {
  27081. m.emit(0x66)
  27082. m.rexo(0, addr(v[1]), false)
  27083. m.emit(0xd1)
  27084. m.mrsd(0, addr(v[1]), 1)
  27085. })
  27086. }
  27087. // ROLW imm8, m16
  27088. if isImm8(v0) && isM16(v1) {
  27089. p.domain = DomainGeneric
  27090. p.add(0, func(m *_Encoding, v []interface{}) {
  27091. m.emit(0x66)
  27092. m.rexo(0, addr(v[1]), false)
  27093. m.emit(0xc1)
  27094. m.mrsd(0, addr(v[1]), 1)
  27095. m.imm1(toImmAny(v[0]))
  27096. })
  27097. }
  27098. // ROLW cl, m16
  27099. if v0 == CL && isM16(v1) {
  27100. p.domain = DomainGeneric
  27101. p.add(0, func(m *_Encoding, v []interface{}) {
  27102. m.emit(0x66)
  27103. m.rexo(0, addr(v[1]), false)
  27104. m.emit(0xd3)
  27105. m.mrsd(0, addr(v[1]), 1)
  27106. })
  27107. }
  27108. if p.len == 0 {
  27109. panic("invalid operands for ROLW")
  27110. }
  27111. return p
  27112. }
  27113. // RORB performs "Rotate Right".
  27114. //
  27115. // Mnemonic : ROR
  27116. // Supported forms : (6 forms)
  27117. //
  27118. // * RORB 1, r8
  27119. // * RORB imm8, r8
  27120. // * RORB cl, r8
  27121. // * RORB 1, m8
  27122. // * RORB imm8, m8
  27123. // * RORB cl, m8
  27124. //
  27125. func (self *Program) RORB(v0 interface{}, v1 interface{}) *Instruction {
  27126. p := self.alloc("RORB", 2, Operands { v0, v1 })
  27127. // RORB 1, r8
  27128. if isConst1(v0) && isReg8(v1) {
  27129. p.domain = DomainGeneric
  27130. p.add(0, func(m *_Encoding, v []interface{}) {
  27131. m.rexo(0, v[1], isReg8REX(v[1]))
  27132. m.emit(0xd0)
  27133. m.emit(0xc8 | lcode(v[1]))
  27134. })
  27135. }
  27136. // RORB imm8, r8
  27137. if isImm8(v0) && isReg8(v1) {
  27138. p.domain = DomainGeneric
  27139. p.add(0, func(m *_Encoding, v []interface{}) {
  27140. m.rexo(0, v[1], isReg8REX(v[1]))
  27141. m.emit(0xc0)
  27142. m.emit(0xc8 | lcode(v[1]))
  27143. m.imm1(toImmAny(v[0]))
  27144. })
  27145. }
  27146. // RORB cl, r8
  27147. if v0 == CL && isReg8(v1) {
  27148. p.domain = DomainGeneric
  27149. p.add(0, func(m *_Encoding, v []interface{}) {
  27150. m.rexo(0, v[1], isReg8REX(v[1]))
  27151. m.emit(0xd2)
  27152. m.emit(0xc8 | lcode(v[1]))
  27153. })
  27154. }
  27155. // RORB 1, m8
  27156. if isConst1(v0) && isM8(v1) {
  27157. p.domain = DomainGeneric
  27158. p.add(0, func(m *_Encoding, v []interface{}) {
  27159. m.rexo(0, addr(v[1]), false)
  27160. m.emit(0xd0)
  27161. m.mrsd(1, addr(v[1]), 1)
  27162. })
  27163. }
  27164. // RORB imm8, m8
  27165. if isImm8(v0) && isM8(v1) {
  27166. p.domain = DomainGeneric
  27167. p.add(0, func(m *_Encoding, v []interface{}) {
  27168. m.rexo(0, addr(v[1]), false)
  27169. m.emit(0xc0)
  27170. m.mrsd(1, addr(v[1]), 1)
  27171. m.imm1(toImmAny(v[0]))
  27172. })
  27173. }
  27174. // RORB cl, m8
  27175. if v0 == CL && isM8(v1) {
  27176. p.domain = DomainGeneric
  27177. p.add(0, func(m *_Encoding, v []interface{}) {
  27178. m.rexo(0, addr(v[1]), false)
  27179. m.emit(0xd2)
  27180. m.mrsd(1, addr(v[1]), 1)
  27181. })
  27182. }
  27183. if p.len == 0 {
  27184. panic("invalid operands for RORB")
  27185. }
  27186. return p
  27187. }
  27188. // RORL performs "Rotate Right".
  27189. //
  27190. // Mnemonic : ROR
  27191. // Supported forms : (6 forms)
  27192. //
  27193. // * RORL 1, r32
  27194. // * RORL imm8, r32
  27195. // * RORL cl, r32
  27196. // * RORL 1, m32
  27197. // * RORL imm8, m32
  27198. // * RORL cl, m32
  27199. //
  27200. func (self *Program) RORL(v0 interface{}, v1 interface{}) *Instruction {
  27201. p := self.alloc("RORL", 2, Operands { v0, v1 })
  27202. // RORL 1, r32
  27203. if isConst1(v0) && isReg32(v1) {
  27204. p.domain = DomainGeneric
  27205. p.add(0, func(m *_Encoding, v []interface{}) {
  27206. m.rexo(0, v[1], false)
  27207. m.emit(0xd1)
  27208. m.emit(0xc8 | lcode(v[1]))
  27209. })
  27210. }
  27211. // RORL imm8, r32
  27212. if isImm8(v0) && isReg32(v1) {
  27213. p.domain = DomainGeneric
  27214. p.add(0, func(m *_Encoding, v []interface{}) {
  27215. m.rexo(0, v[1], false)
  27216. m.emit(0xc1)
  27217. m.emit(0xc8 | lcode(v[1]))
  27218. m.imm1(toImmAny(v[0]))
  27219. })
  27220. }
  27221. // RORL cl, r32
  27222. if v0 == CL && isReg32(v1) {
  27223. p.domain = DomainGeneric
  27224. p.add(0, func(m *_Encoding, v []interface{}) {
  27225. m.rexo(0, v[1], false)
  27226. m.emit(0xd3)
  27227. m.emit(0xc8 | lcode(v[1]))
  27228. })
  27229. }
  27230. // RORL 1, m32
  27231. if isConst1(v0) && isM32(v1) {
  27232. p.domain = DomainGeneric
  27233. p.add(0, func(m *_Encoding, v []interface{}) {
  27234. m.rexo(0, addr(v[1]), false)
  27235. m.emit(0xd1)
  27236. m.mrsd(1, addr(v[1]), 1)
  27237. })
  27238. }
  27239. // RORL imm8, m32
  27240. if isImm8(v0) && isM32(v1) {
  27241. p.domain = DomainGeneric
  27242. p.add(0, func(m *_Encoding, v []interface{}) {
  27243. m.rexo(0, addr(v[1]), false)
  27244. m.emit(0xc1)
  27245. m.mrsd(1, addr(v[1]), 1)
  27246. m.imm1(toImmAny(v[0]))
  27247. })
  27248. }
  27249. // RORL cl, m32
  27250. if v0 == CL && isM32(v1) {
  27251. p.domain = DomainGeneric
  27252. p.add(0, func(m *_Encoding, v []interface{}) {
  27253. m.rexo(0, addr(v[1]), false)
  27254. m.emit(0xd3)
  27255. m.mrsd(1, addr(v[1]), 1)
  27256. })
  27257. }
  27258. if p.len == 0 {
  27259. panic("invalid operands for RORL")
  27260. }
  27261. return p
  27262. }
  27263. // RORQ performs "Rotate Right".
  27264. //
  27265. // Mnemonic : ROR
  27266. // Supported forms : (6 forms)
  27267. //
  27268. // * RORQ 1, r64
  27269. // * RORQ imm8, r64
  27270. // * RORQ cl, r64
  27271. // * RORQ 1, m64
  27272. // * RORQ imm8, m64
  27273. // * RORQ cl, m64
  27274. //
  27275. func (self *Program) RORQ(v0 interface{}, v1 interface{}) *Instruction {
  27276. p := self.alloc("RORQ", 2, Operands { v0, v1 })
  27277. // RORQ 1, r64
  27278. if isConst1(v0) && isReg64(v1) {
  27279. p.domain = DomainGeneric
  27280. p.add(0, func(m *_Encoding, v []interface{}) {
  27281. m.emit(0x48 | hcode(v[1]))
  27282. m.emit(0xd1)
  27283. m.emit(0xc8 | lcode(v[1]))
  27284. })
  27285. }
  27286. // RORQ imm8, r64
  27287. if isImm8(v0) && isReg64(v1) {
  27288. p.domain = DomainGeneric
  27289. p.add(0, func(m *_Encoding, v []interface{}) {
  27290. m.emit(0x48 | hcode(v[1]))
  27291. m.emit(0xc1)
  27292. m.emit(0xc8 | lcode(v[1]))
  27293. m.imm1(toImmAny(v[0]))
  27294. })
  27295. }
  27296. // RORQ cl, r64
  27297. if v0 == CL && isReg64(v1) {
  27298. p.domain = DomainGeneric
  27299. p.add(0, func(m *_Encoding, v []interface{}) {
  27300. m.emit(0x48 | hcode(v[1]))
  27301. m.emit(0xd3)
  27302. m.emit(0xc8 | lcode(v[1]))
  27303. })
  27304. }
  27305. // RORQ 1, m64
  27306. if isConst1(v0) && isM64(v1) {
  27307. p.domain = DomainGeneric
  27308. p.add(0, func(m *_Encoding, v []interface{}) {
  27309. m.rexm(1, 0, addr(v[1]))
  27310. m.emit(0xd1)
  27311. m.mrsd(1, addr(v[1]), 1)
  27312. })
  27313. }
  27314. // RORQ imm8, m64
  27315. if isImm8(v0) && isM64(v1) {
  27316. p.domain = DomainGeneric
  27317. p.add(0, func(m *_Encoding, v []interface{}) {
  27318. m.rexm(1, 0, addr(v[1]))
  27319. m.emit(0xc1)
  27320. m.mrsd(1, addr(v[1]), 1)
  27321. m.imm1(toImmAny(v[0]))
  27322. })
  27323. }
  27324. // RORQ cl, m64
  27325. if v0 == CL && isM64(v1) {
  27326. p.domain = DomainGeneric
  27327. p.add(0, func(m *_Encoding, v []interface{}) {
  27328. m.rexm(1, 0, addr(v[1]))
  27329. m.emit(0xd3)
  27330. m.mrsd(1, addr(v[1]), 1)
  27331. })
  27332. }
  27333. if p.len == 0 {
  27334. panic("invalid operands for RORQ")
  27335. }
  27336. return p
  27337. }
  27338. // RORW performs "Rotate Right".
  27339. //
  27340. // Mnemonic : ROR
  27341. // Supported forms : (6 forms)
  27342. //
  27343. // * RORW 1, r16
  27344. // * RORW imm8, r16
  27345. // * RORW cl, r16
  27346. // * RORW 1, m16
  27347. // * RORW imm8, m16
  27348. // * RORW cl, m16
  27349. //
  27350. func (self *Program) RORW(v0 interface{}, v1 interface{}) *Instruction {
  27351. p := self.alloc("RORW", 2, Operands { v0, v1 })
  27352. // RORW 1, r16
  27353. if isConst1(v0) && isReg16(v1) {
  27354. p.domain = DomainGeneric
  27355. p.add(0, func(m *_Encoding, v []interface{}) {
  27356. m.emit(0x66)
  27357. m.rexo(0, v[1], false)
  27358. m.emit(0xd1)
  27359. m.emit(0xc8 | lcode(v[1]))
  27360. })
  27361. }
  27362. // RORW imm8, r16
  27363. if isImm8(v0) && isReg16(v1) {
  27364. p.domain = DomainGeneric
  27365. p.add(0, func(m *_Encoding, v []interface{}) {
  27366. m.emit(0x66)
  27367. m.rexo(0, v[1], false)
  27368. m.emit(0xc1)
  27369. m.emit(0xc8 | lcode(v[1]))
  27370. m.imm1(toImmAny(v[0]))
  27371. })
  27372. }
  27373. // RORW cl, r16
  27374. if v0 == CL && isReg16(v1) {
  27375. p.domain = DomainGeneric
  27376. p.add(0, func(m *_Encoding, v []interface{}) {
  27377. m.emit(0x66)
  27378. m.rexo(0, v[1], false)
  27379. m.emit(0xd3)
  27380. m.emit(0xc8 | lcode(v[1]))
  27381. })
  27382. }
  27383. // RORW 1, m16
  27384. if isConst1(v0) && isM16(v1) {
  27385. p.domain = DomainGeneric
  27386. p.add(0, func(m *_Encoding, v []interface{}) {
  27387. m.emit(0x66)
  27388. m.rexo(0, addr(v[1]), false)
  27389. m.emit(0xd1)
  27390. m.mrsd(1, addr(v[1]), 1)
  27391. })
  27392. }
  27393. // RORW imm8, m16
  27394. if isImm8(v0) && isM16(v1) {
  27395. p.domain = DomainGeneric
  27396. p.add(0, func(m *_Encoding, v []interface{}) {
  27397. m.emit(0x66)
  27398. m.rexo(0, addr(v[1]), false)
  27399. m.emit(0xc1)
  27400. m.mrsd(1, addr(v[1]), 1)
  27401. m.imm1(toImmAny(v[0]))
  27402. })
  27403. }
  27404. // RORW cl, m16
  27405. if v0 == CL && isM16(v1) {
  27406. p.domain = DomainGeneric
  27407. p.add(0, func(m *_Encoding, v []interface{}) {
  27408. m.emit(0x66)
  27409. m.rexo(0, addr(v[1]), false)
  27410. m.emit(0xd3)
  27411. m.mrsd(1, addr(v[1]), 1)
  27412. })
  27413. }
  27414. if p.len == 0 {
  27415. panic("invalid operands for RORW")
  27416. }
  27417. return p
  27418. }
  27419. // RORXL performs "Rotate Right Logical Without Affecting Flags".
  27420. //
  27421. // Mnemonic : RORX
  27422. // Supported forms : (2 forms)
  27423. //
  27424. // * RORXL imm8, r32, r32 [BMI2]
  27425. // * RORXL imm8, m32, r32 [BMI2]
  27426. //
  27427. func (self *Program) RORXL(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  27428. p := self.alloc("RORXL", 3, Operands { v0, v1, v2 })
  27429. // RORXL imm8, r32, r32
  27430. if isImm8(v0) && isReg32(v1) && isReg32(v2) {
  27431. self.require(ISA_BMI2)
  27432. p.domain = DomainGeneric
  27433. p.add(0, func(m *_Encoding, v []interface{}) {
  27434. m.emit(0xc4)
  27435. m.emit(0xe3 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  27436. m.emit(0x7b)
  27437. m.emit(0xf0)
  27438. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  27439. m.imm1(toImmAny(v[0]))
  27440. })
  27441. }
  27442. // RORXL imm8, m32, r32
  27443. if isImm8(v0) && isM32(v1) && isReg32(v2) {
  27444. self.require(ISA_BMI2)
  27445. p.domain = DomainGeneric
  27446. p.add(0, func(m *_Encoding, v []interface{}) {
  27447. m.vex3(0xc4, 0b11, 0x03, hcode(v[2]), addr(v[1]), 0)
  27448. m.emit(0xf0)
  27449. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  27450. m.imm1(toImmAny(v[0]))
  27451. })
  27452. }
  27453. if p.len == 0 {
  27454. panic("invalid operands for RORXL")
  27455. }
  27456. return p
  27457. }
  27458. // RORXQ performs "Rotate Right Logical Without Affecting Flags".
  27459. //
  27460. // Mnemonic : RORX
  27461. // Supported forms : (2 forms)
  27462. //
  27463. // * RORXQ imm8, r64, r64 [BMI2]
  27464. // * RORXQ imm8, m64, r64 [BMI2]
  27465. //
  27466. func (self *Program) RORXQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  27467. p := self.alloc("RORXQ", 3, Operands { v0, v1, v2 })
  27468. // RORXQ imm8, r64, r64
  27469. if isImm8(v0) && isReg64(v1) && isReg64(v2) {
  27470. self.require(ISA_BMI2)
  27471. p.domain = DomainGeneric
  27472. p.add(0, func(m *_Encoding, v []interface{}) {
  27473. m.emit(0xc4)
  27474. m.emit(0xe3 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  27475. m.emit(0xfb)
  27476. m.emit(0xf0)
  27477. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  27478. m.imm1(toImmAny(v[0]))
  27479. })
  27480. }
  27481. // RORXQ imm8, m64, r64
  27482. if isImm8(v0) && isM64(v1) && isReg64(v2) {
  27483. self.require(ISA_BMI2)
  27484. p.domain = DomainGeneric
  27485. p.add(0, func(m *_Encoding, v []interface{}) {
  27486. m.vex3(0xc4, 0b11, 0x83, hcode(v[2]), addr(v[1]), 0)
  27487. m.emit(0xf0)
  27488. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  27489. m.imm1(toImmAny(v[0]))
  27490. })
  27491. }
  27492. if p.len == 0 {
  27493. panic("invalid operands for RORXQ")
  27494. }
  27495. return p
  27496. }
  27497. // ROUNDPD performs "Round Packed Double Precision Floating-Point Values".
  27498. //
  27499. // Mnemonic : ROUNDPD
  27500. // Supported forms : (2 forms)
  27501. //
  27502. // * ROUNDPD imm8, xmm, xmm [SSE4.1]
  27503. // * ROUNDPD imm8, m128, xmm [SSE4.1]
  27504. //
  27505. func (self *Program) ROUNDPD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  27506. p := self.alloc("ROUNDPD", 3, Operands { v0, v1, v2 })
  27507. // ROUNDPD imm8, xmm, xmm
  27508. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  27509. self.require(ISA_SSE4_1)
  27510. p.domain = DomainMMXSSE
  27511. p.add(0, func(m *_Encoding, v []interface{}) {
  27512. m.emit(0x66)
  27513. m.rexo(hcode(v[2]), v[1], false)
  27514. m.emit(0x0f)
  27515. m.emit(0x3a)
  27516. m.emit(0x09)
  27517. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  27518. m.imm1(toImmAny(v[0]))
  27519. })
  27520. }
  27521. // ROUNDPD imm8, m128, xmm
  27522. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  27523. self.require(ISA_SSE4_1)
  27524. p.domain = DomainMMXSSE
  27525. p.add(0, func(m *_Encoding, v []interface{}) {
  27526. m.emit(0x66)
  27527. m.rexo(hcode(v[2]), addr(v[1]), false)
  27528. m.emit(0x0f)
  27529. m.emit(0x3a)
  27530. m.emit(0x09)
  27531. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  27532. m.imm1(toImmAny(v[0]))
  27533. })
  27534. }
  27535. if p.len == 0 {
  27536. panic("invalid operands for ROUNDPD")
  27537. }
  27538. return p
  27539. }
  27540. // ROUNDPS performs "Round Packed Single Precision Floating-Point Values".
  27541. //
  27542. // Mnemonic : ROUNDPS
  27543. // Supported forms : (2 forms)
  27544. //
  27545. // * ROUNDPS imm8, xmm, xmm [SSE4.1]
  27546. // * ROUNDPS imm8, m128, xmm [SSE4.1]
  27547. //
  27548. func (self *Program) ROUNDPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  27549. p := self.alloc("ROUNDPS", 3, Operands { v0, v1, v2 })
  27550. // ROUNDPS imm8, xmm, xmm
  27551. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  27552. self.require(ISA_SSE4_1)
  27553. p.domain = DomainMMXSSE
  27554. p.add(0, func(m *_Encoding, v []interface{}) {
  27555. m.emit(0x66)
  27556. m.rexo(hcode(v[2]), v[1], false)
  27557. m.emit(0x0f)
  27558. m.emit(0x3a)
  27559. m.emit(0x08)
  27560. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  27561. m.imm1(toImmAny(v[0]))
  27562. })
  27563. }
  27564. // ROUNDPS imm8, m128, xmm
  27565. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  27566. self.require(ISA_SSE4_1)
  27567. p.domain = DomainMMXSSE
  27568. p.add(0, func(m *_Encoding, v []interface{}) {
  27569. m.emit(0x66)
  27570. m.rexo(hcode(v[2]), addr(v[1]), false)
  27571. m.emit(0x0f)
  27572. m.emit(0x3a)
  27573. m.emit(0x08)
  27574. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  27575. m.imm1(toImmAny(v[0]))
  27576. })
  27577. }
  27578. if p.len == 0 {
  27579. panic("invalid operands for ROUNDPS")
  27580. }
  27581. return p
  27582. }
  27583. // ROUNDSD performs "Round Scalar Double Precision Floating-Point Values".
  27584. //
  27585. // Mnemonic : ROUNDSD
  27586. // Supported forms : (2 forms)
  27587. //
  27588. // * ROUNDSD imm8, xmm, xmm [SSE4.1]
  27589. // * ROUNDSD imm8, m64, xmm [SSE4.1]
  27590. //
  27591. func (self *Program) ROUNDSD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  27592. p := self.alloc("ROUNDSD", 3, Operands { v0, v1, v2 })
  27593. // ROUNDSD imm8, xmm, xmm
  27594. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  27595. self.require(ISA_SSE4_1)
  27596. p.domain = DomainMMXSSE
  27597. p.add(0, func(m *_Encoding, v []interface{}) {
  27598. m.emit(0x66)
  27599. m.rexo(hcode(v[2]), v[1], false)
  27600. m.emit(0x0f)
  27601. m.emit(0x3a)
  27602. m.emit(0x0b)
  27603. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  27604. m.imm1(toImmAny(v[0]))
  27605. })
  27606. }
  27607. // ROUNDSD imm8, m64, xmm
  27608. if isImm8(v0) && isM64(v1) && isXMM(v2) {
  27609. self.require(ISA_SSE4_1)
  27610. p.domain = DomainMMXSSE
  27611. p.add(0, func(m *_Encoding, v []interface{}) {
  27612. m.emit(0x66)
  27613. m.rexo(hcode(v[2]), addr(v[1]), false)
  27614. m.emit(0x0f)
  27615. m.emit(0x3a)
  27616. m.emit(0x0b)
  27617. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  27618. m.imm1(toImmAny(v[0]))
  27619. })
  27620. }
  27621. if p.len == 0 {
  27622. panic("invalid operands for ROUNDSD")
  27623. }
  27624. return p
  27625. }
  27626. // ROUNDSS performs "Round Scalar Single Precision Floating-Point Values".
  27627. //
  27628. // Mnemonic : ROUNDSS
  27629. // Supported forms : (2 forms)
  27630. //
  27631. // * ROUNDSS imm8, xmm, xmm [SSE4.1]
  27632. // * ROUNDSS imm8, m32, xmm [SSE4.1]
  27633. //
  27634. func (self *Program) ROUNDSS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  27635. p := self.alloc("ROUNDSS", 3, Operands { v0, v1, v2 })
  27636. // ROUNDSS imm8, xmm, xmm
  27637. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  27638. self.require(ISA_SSE4_1)
  27639. p.domain = DomainMMXSSE
  27640. p.add(0, func(m *_Encoding, v []interface{}) {
  27641. m.emit(0x66)
  27642. m.rexo(hcode(v[2]), v[1], false)
  27643. m.emit(0x0f)
  27644. m.emit(0x3a)
  27645. m.emit(0x0a)
  27646. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  27647. m.imm1(toImmAny(v[0]))
  27648. })
  27649. }
  27650. // ROUNDSS imm8, m32, xmm
  27651. if isImm8(v0) && isM32(v1) && isXMM(v2) {
  27652. self.require(ISA_SSE4_1)
  27653. p.domain = DomainMMXSSE
  27654. p.add(0, func(m *_Encoding, v []interface{}) {
  27655. m.emit(0x66)
  27656. m.rexo(hcode(v[2]), addr(v[1]), false)
  27657. m.emit(0x0f)
  27658. m.emit(0x3a)
  27659. m.emit(0x0a)
  27660. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  27661. m.imm1(toImmAny(v[0]))
  27662. })
  27663. }
  27664. if p.len == 0 {
  27665. panic("invalid operands for ROUNDSS")
  27666. }
  27667. return p
  27668. }
  27669. // RSQRTPS performs "Compute Reciprocals of Square Roots of Packed Single-Precision Floating-Point Values".
  27670. //
  27671. // Mnemonic : RSQRTPS
  27672. // Supported forms : (2 forms)
  27673. //
  27674. // * RSQRTPS xmm, xmm [SSE]
  27675. // * RSQRTPS m128, xmm [SSE]
  27676. //
  27677. func (self *Program) RSQRTPS(v0 interface{}, v1 interface{}) *Instruction {
  27678. p := self.alloc("RSQRTPS", 2, Operands { v0, v1 })
  27679. // RSQRTPS xmm, xmm
  27680. if isXMM(v0) && isXMM(v1) {
  27681. self.require(ISA_SSE)
  27682. p.domain = DomainMMXSSE
  27683. p.add(0, func(m *_Encoding, v []interface{}) {
  27684. m.rexo(hcode(v[1]), v[0], false)
  27685. m.emit(0x0f)
  27686. m.emit(0x52)
  27687. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  27688. })
  27689. }
  27690. // RSQRTPS m128, xmm
  27691. if isM128(v0) && isXMM(v1) {
  27692. self.require(ISA_SSE)
  27693. p.domain = DomainMMXSSE
  27694. p.add(0, func(m *_Encoding, v []interface{}) {
  27695. m.rexo(hcode(v[1]), addr(v[0]), false)
  27696. m.emit(0x0f)
  27697. m.emit(0x52)
  27698. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  27699. })
  27700. }
  27701. if p.len == 0 {
  27702. panic("invalid operands for RSQRTPS")
  27703. }
  27704. return p
  27705. }
  27706. // RSQRTSS performs "Compute Reciprocal of Square Root of Scalar Single-Precision Floating-Point Value".
  27707. //
  27708. // Mnemonic : RSQRTSS
  27709. // Supported forms : (2 forms)
  27710. //
  27711. // * RSQRTSS xmm, xmm [SSE]
  27712. // * RSQRTSS m32, xmm [SSE]
  27713. //
  27714. func (self *Program) RSQRTSS(v0 interface{}, v1 interface{}) *Instruction {
  27715. p := self.alloc("RSQRTSS", 2, Operands { v0, v1 })
  27716. // RSQRTSS xmm, xmm
  27717. if isXMM(v0) && isXMM(v1) {
  27718. self.require(ISA_SSE)
  27719. p.domain = DomainMMXSSE
  27720. p.add(0, func(m *_Encoding, v []interface{}) {
  27721. m.emit(0xf3)
  27722. m.rexo(hcode(v[1]), v[0], false)
  27723. m.emit(0x0f)
  27724. m.emit(0x52)
  27725. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  27726. })
  27727. }
  27728. // RSQRTSS m32, xmm
  27729. if isM32(v0) && isXMM(v1) {
  27730. self.require(ISA_SSE)
  27731. p.domain = DomainMMXSSE
  27732. p.add(0, func(m *_Encoding, v []interface{}) {
  27733. m.emit(0xf3)
  27734. m.rexo(hcode(v[1]), addr(v[0]), false)
  27735. m.emit(0x0f)
  27736. m.emit(0x52)
  27737. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  27738. })
  27739. }
  27740. if p.len == 0 {
  27741. panic("invalid operands for RSQRTSS")
  27742. }
  27743. return p
  27744. }
  27745. // SALB performs "Arithmetic Shift Left".
  27746. //
  27747. // Mnemonic : SAL
  27748. // Supported forms : (6 forms)
  27749. //
  27750. // * SALB 1, r8
  27751. // * SALB imm8, r8
  27752. // * SALB cl, r8
  27753. // * SALB 1, m8
  27754. // * SALB imm8, m8
  27755. // * SALB cl, m8
  27756. //
  27757. func (self *Program) SALB(v0 interface{}, v1 interface{}) *Instruction {
  27758. p := self.alloc("SALB", 2, Operands { v0, v1 })
  27759. // SALB 1, r8
  27760. if isConst1(v0) && isReg8(v1) {
  27761. p.domain = DomainGeneric
  27762. p.add(0, func(m *_Encoding, v []interface{}) {
  27763. m.rexo(0, v[1], isReg8REX(v[1]))
  27764. m.emit(0xd0)
  27765. m.emit(0xe0 | lcode(v[1]))
  27766. })
  27767. }
  27768. // SALB imm8, r8
  27769. if isImm8(v0) && isReg8(v1) {
  27770. p.domain = DomainGeneric
  27771. p.add(0, func(m *_Encoding, v []interface{}) {
  27772. m.rexo(0, v[1], isReg8REX(v[1]))
  27773. m.emit(0xc0)
  27774. m.emit(0xe0 | lcode(v[1]))
  27775. m.imm1(toImmAny(v[0]))
  27776. })
  27777. }
  27778. // SALB cl, r8
  27779. if v0 == CL && isReg8(v1) {
  27780. p.domain = DomainGeneric
  27781. p.add(0, func(m *_Encoding, v []interface{}) {
  27782. m.rexo(0, v[1], isReg8REX(v[1]))
  27783. m.emit(0xd2)
  27784. m.emit(0xe0 | lcode(v[1]))
  27785. })
  27786. }
  27787. // SALB 1, m8
  27788. if isConst1(v0) && isM8(v1) {
  27789. p.domain = DomainGeneric
  27790. p.add(0, func(m *_Encoding, v []interface{}) {
  27791. m.rexo(0, addr(v[1]), false)
  27792. m.emit(0xd0)
  27793. m.mrsd(4, addr(v[1]), 1)
  27794. })
  27795. }
  27796. // SALB imm8, m8
  27797. if isImm8(v0) && isM8(v1) {
  27798. p.domain = DomainGeneric
  27799. p.add(0, func(m *_Encoding, v []interface{}) {
  27800. m.rexo(0, addr(v[1]), false)
  27801. m.emit(0xc0)
  27802. m.mrsd(4, addr(v[1]), 1)
  27803. m.imm1(toImmAny(v[0]))
  27804. })
  27805. }
  27806. // SALB cl, m8
  27807. if v0 == CL && isM8(v1) {
  27808. p.domain = DomainGeneric
  27809. p.add(0, func(m *_Encoding, v []interface{}) {
  27810. m.rexo(0, addr(v[1]), false)
  27811. m.emit(0xd2)
  27812. m.mrsd(4, addr(v[1]), 1)
  27813. })
  27814. }
  27815. if p.len == 0 {
  27816. panic("invalid operands for SALB")
  27817. }
  27818. return p
  27819. }
  27820. // SALL performs "Arithmetic Shift Left".
  27821. //
  27822. // Mnemonic : SAL
  27823. // Supported forms : (6 forms)
  27824. //
  27825. // * SALL 1, r32
  27826. // * SALL imm8, r32
  27827. // * SALL cl, r32
  27828. // * SALL 1, m32
  27829. // * SALL imm8, m32
  27830. // * SALL cl, m32
  27831. //
  27832. func (self *Program) SALL(v0 interface{}, v1 interface{}) *Instruction {
  27833. p := self.alloc("SALL", 2, Operands { v0, v1 })
  27834. // SALL 1, r32
  27835. if isConst1(v0) && isReg32(v1) {
  27836. p.domain = DomainGeneric
  27837. p.add(0, func(m *_Encoding, v []interface{}) {
  27838. m.rexo(0, v[1], false)
  27839. m.emit(0xd1)
  27840. m.emit(0xe0 | lcode(v[1]))
  27841. })
  27842. }
  27843. // SALL imm8, r32
  27844. if isImm8(v0) && isReg32(v1) {
  27845. p.domain = DomainGeneric
  27846. p.add(0, func(m *_Encoding, v []interface{}) {
  27847. m.rexo(0, v[1], false)
  27848. m.emit(0xc1)
  27849. m.emit(0xe0 | lcode(v[1]))
  27850. m.imm1(toImmAny(v[0]))
  27851. })
  27852. }
  27853. // SALL cl, r32
  27854. if v0 == CL && isReg32(v1) {
  27855. p.domain = DomainGeneric
  27856. p.add(0, func(m *_Encoding, v []interface{}) {
  27857. m.rexo(0, v[1], false)
  27858. m.emit(0xd3)
  27859. m.emit(0xe0 | lcode(v[1]))
  27860. })
  27861. }
  27862. // SALL 1, m32
  27863. if isConst1(v0) && isM32(v1) {
  27864. p.domain = DomainGeneric
  27865. p.add(0, func(m *_Encoding, v []interface{}) {
  27866. m.rexo(0, addr(v[1]), false)
  27867. m.emit(0xd1)
  27868. m.mrsd(4, addr(v[1]), 1)
  27869. })
  27870. }
  27871. // SALL imm8, m32
  27872. if isImm8(v0) && isM32(v1) {
  27873. p.domain = DomainGeneric
  27874. p.add(0, func(m *_Encoding, v []interface{}) {
  27875. m.rexo(0, addr(v[1]), false)
  27876. m.emit(0xc1)
  27877. m.mrsd(4, addr(v[1]), 1)
  27878. m.imm1(toImmAny(v[0]))
  27879. })
  27880. }
  27881. // SALL cl, m32
  27882. if v0 == CL && isM32(v1) {
  27883. p.domain = DomainGeneric
  27884. p.add(0, func(m *_Encoding, v []interface{}) {
  27885. m.rexo(0, addr(v[1]), false)
  27886. m.emit(0xd3)
  27887. m.mrsd(4, addr(v[1]), 1)
  27888. })
  27889. }
  27890. if p.len == 0 {
  27891. panic("invalid operands for SALL")
  27892. }
  27893. return p
  27894. }
  27895. // SALQ performs "Arithmetic Shift Left".
  27896. //
  27897. // Mnemonic : SAL
  27898. // Supported forms : (6 forms)
  27899. //
  27900. // * SALQ 1, r64
  27901. // * SALQ imm8, r64
  27902. // * SALQ cl, r64
  27903. // * SALQ 1, m64
  27904. // * SALQ imm8, m64
  27905. // * SALQ cl, m64
  27906. //
  27907. func (self *Program) SALQ(v0 interface{}, v1 interface{}) *Instruction {
  27908. p := self.alloc("SALQ", 2, Operands { v0, v1 })
  27909. // SALQ 1, r64
  27910. if isConst1(v0) && isReg64(v1) {
  27911. p.domain = DomainGeneric
  27912. p.add(0, func(m *_Encoding, v []interface{}) {
  27913. m.emit(0x48 | hcode(v[1]))
  27914. m.emit(0xd1)
  27915. m.emit(0xe0 | lcode(v[1]))
  27916. })
  27917. }
  27918. // SALQ imm8, r64
  27919. if isImm8(v0) && isReg64(v1) {
  27920. p.domain = DomainGeneric
  27921. p.add(0, func(m *_Encoding, v []interface{}) {
  27922. m.emit(0x48 | hcode(v[1]))
  27923. m.emit(0xc1)
  27924. m.emit(0xe0 | lcode(v[1]))
  27925. m.imm1(toImmAny(v[0]))
  27926. })
  27927. }
  27928. // SALQ cl, r64
  27929. if v0 == CL && isReg64(v1) {
  27930. p.domain = DomainGeneric
  27931. p.add(0, func(m *_Encoding, v []interface{}) {
  27932. m.emit(0x48 | hcode(v[1]))
  27933. m.emit(0xd3)
  27934. m.emit(0xe0 | lcode(v[1]))
  27935. })
  27936. }
  27937. // SALQ 1, m64
  27938. if isConst1(v0) && isM64(v1) {
  27939. p.domain = DomainGeneric
  27940. p.add(0, func(m *_Encoding, v []interface{}) {
  27941. m.rexm(1, 0, addr(v[1]))
  27942. m.emit(0xd1)
  27943. m.mrsd(4, addr(v[1]), 1)
  27944. })
  27945. }
  27946. // SALQ imm8, m64
  27947. if isImm8(v0) && isM64(v1) {
  27948. p.domain = DomainGeneric
  27949. p.add(0, func(m *_Encoding, v []interface{}) {
  27950. m.rexm(1, 0, addr(v[1]))
  27951. m.emit(0xc1)
  27952. m.mrsd(4, addr(v[1]), 1)
  27953. m.imm1(toImmAny(v[0]))
  27954. })
  27955. }
  27956. // SALQ cl, m64
  27957. if v0 == CL && isM64(v1) {
  27958. p.domain = DomainGeneric
  27959. p.add(0, func(m *_Encoding, v []interface{}) {
  27960. m.rexm(1, 0, addr(v[1]))
  27961. m.emit(0xd3)
  27962. m.mrsd(4, addr(v[1]), 1)
  27963. })
  27964. }
  27965. if p.len == 0 {
  27966. panic("invalid operands for SALQ")
  27967. }
  27968. return p
  27969. }
  27970. // SALW performs "Arithmetic Shift Left".
  27971. //
  27972. // Mnemonic : SAL
  27973. // Supported forms : (6 forms)
  27974. //
  27975. // * SALW 1, r16
  27976. // * SALW imm8, r16
  27977. // * SALW cl, r16
  27978. // * SALW 1, m16
  27979. // * SALW imm8, m16
  27980. // * SALW cl, m16
  27981. //
  27982. func (self *Program) SALW(v0 interface{}, v1 interface{}) *Instruction {
  27983. p := self.alloc("SALW", 2, Operands { v0, v1 })
  27984. // SALW 1, r16
  27985. if isConst1(v0) && isReg16(v1) {
  27986. p.domain = DomainGeneric
  27987. p.add(0, func(m *_Encoding, v []interface{}) {
  27988. m.emit(0x66)
  27989. m.rexo(0, v[1], false)
  27990. m.emit(0xd1)
  27991. m.emit(0xe0 | lcode(v[1]))
  27992. })
  27993. }
  27994. // SALW imm8, r16
  27995. if isImm8(v0) && isReg16(v1) {
  27996. p.domain = DomainGeneric
  27997. p.add(0, func(m *_Encoding, v []interface{}) {
  27998. m.emit(0x66)
  27999. m.rexo(0, v[1], false)
  28000. m.emit(0xc1)
  28001. m.emit(0xe0 | lcode(v[1]))
  28002. m.imm1(toImmAny(v[0]))
  28003. })
  28004. }
  28005. // SALW cl, r16
  28006. if v0 == CL && isReg16(v1) {
  28007. p.domain = DomainGeneric
  28008. p.add(0, func(m *_Encoding, v []interface{}) {
  28009. m.emit(0x66)
  28010. m.rexo(0, v[1], false)
  28011. m.emit(0xd3)
  28012. m.emit(0xe0 | lcode(v[1]))
  28013. })
  28014. }
  28015. // SALW 1, m16
  28016. if isConst1(v0) && isM16(v1) {
  28017. p.domain = DomainGeneric
  28018. p.add(0, func(m *_Encoding, v []interface{}) {
  28019. m.emit(0x66)
  28020. m.rexo(0, addr(v[1]), false)
  28021. m.emit(0xd1)
  28022. m.mrsd(4, addr(v[1]), 1)
  28023. })
  28024. }
  28025. // SALW imm8, m16
  28026. if isImm8(v0) && isM16(v1) {
  28027. p.domain = DomainGeneric
  28028. p.add(0, func(m *_Encoding, v []interface{}) {
  28029. m.emit(0x66)
  28030. m.rexo(0, addr(v[1]), false)
  28031. m.emit(0xc1)
  28032. m.mrsd(4, addr(v[1]), 1)
  28033. m.imm1(toImmAny(v[0]))
  28034. })
  28035. }
  28036. // SALW cl, m16
  28037. if v0 == CL && isM16(v1) {
  28038. p.domain = DomainGeneric
  28039. p.add(0, func(m *_Encoding, v []interface{}) {
  28040. m.emit(0x66)
  28041. m.rexo(0, addr(v[1]), false)
  28042. m.emit(0xd3)
  28043. m.mrsd(4, addr(v[1]), 1)
  28044. })
  28045. }
  28046. if p.len == 0 {
  28047. panic("invalid operands for SALW")
  28048. }
  28049. return p
  28050. }
  28051. // SARB performs "Arithmetic Shift Right".
  28052. //
  28053. // Mnemonic : SAR
  28054. // Supported forms : (6 forms)
  28055. //
  28056. // * SARB 1, r8
  28057. // * SARB imm8, r8
  28058. // * SARB cl, r8
  28059. // * SARB 1, m8
  28060. // * SARB imm8, m8
  28061. // * SARB cl, m8
  28062. //
  28063. func (self *Program) SARB(v0 interface{}, v1 interface{}) *Instruction {
  28064. p := self.alloc("SARB", 2, Operands { v0, v1 })
  28065. // SARB 1, r8
  28066. if isConst1(v0) && isReg8(v1) {
  28067. p.domain = DomainGeneric
  28068. p.add(0, func(m *_Encoding, v []interface{}) {
  28069. m.rexo(0, v[1], isReg8REX(v[1]))
  28070. m.emit(0xd0)
  28071. m.emit(0xf8 | lcode(v[1]))
  28072. })
  28073. }
  28074. // SARB imm8, r8
  28075. if isImm8(v0) && isReg8(v1) {
  28076. p.domain = DomainGeneric
  28077. p.add(0, func(m *_Encoding, v []interface{}) {
  28078. m.rexo(0, v[1], isReg8REX(v[1]))
  28079. m.emit(0xc0)
  28080. m.emit(0xf8 | lcode(v[1]))
  28081. m.imm1(toImmAny(v[0]))
  28082. })
  28083. }
  28084. // SARB cl, r8
  28085. if v0 == CL && isReg8(v1) {
  28086. p.domain = DomainGeneric
  28087. p.add(0, func(m *_Encoding, v []interface{}) {
  28088. m.rexo(0, v[1], isReg8REX(v[1]))
  28089. m.emit(0xd2)
  28090. m.emit(0xf8 | lcode(v[1]))
  28091. })
  28092. }
  28093. // SARB 1, m8
  28094. if isConst1(v0) && isM8(v1) {
  28095. p.domain = DomainGeneric
  28096. p.add(0, func(m *_Encoding, v []interface{}) {
  28097. m.rexo(0, addr(v[1]), false)
  28098. m.emit(0xd0)
  28099. m.mrsd(7, addr(v[1]), 1)
  28100. })
  28101. }
  28102. // SARB imm8, m8
  28103. if isImm8(v0) && isM8(v1) {
  28104. p.domain = DomainGeneric
  28105. p.add(0, func(m *_Encoding, v []interface{}) {
  28106. m.rexo(0, addr(v[1]), false)
  28107. m.emit(0xc0)
  28108. m.mrsd(7, addr(v[1]), 1)
  28109. m.imm1(toImmAny(v[0]))
  28110. })
  28111. }
  28112. // SARB cl, m8
  28113. if v0 == CL && isM8(v1) {
  28114. p.domain = DomainGeneric
  28115. p.add(0, func(m *_Encoding, v []interface{}) {
  28116. m.rexo(0, addr(v[1]), false)
  28117. m.emit(0xd2)
  28118. m.mrsd(7, addr(v[1]), 1)
  28119. })
  28120. }
  28121. if p.len == 0 {
  28122. panic("invalid operands for SARB")
  28123. }
  28124. return p
  28125. }
  28126. // SARL performs "Arithmetic Shift Right".
  28127. //
  28128. // Mnemonic : SAR
  28129. // Supported forms : (6 forms)
  28130. //
  28131. // * SARL 1, r32
  28132. // * SARL imm8, r32
  28133. // * SARL cl, r32
  28134. // * SARL 1, m32
  28135. // * SARL imm8, m32
  28136. // * SARL cl, m32
  28137. //
  28138. func (self *Program) SARL(v0 interface{}, v1 interface{}) *Instruction {
  28139. p := self.alloc("SARL", 2, Operands { v0, v1 })
  28140. // SARL 1, r32
  28141. if isConst1(v0) && isReg32(v1) {
  28142. p.domain = DomainGeneric
  28143. p.add(0, func(m *_Encoding, v []interface{}) {
  28144. m.rexo(0, v[1], false)
  28145. m.emit(0xd1)
  28146. m.emit(0xf8 | lcode(v[1]))
  28147. })
  28148. }
  28149. // SARL imm8, r32
  28150. if isImm8(v0) && isReg32(v1) {
  28151. p.domain = DomainGeneric
  28152. p.add(0, func(m *_Encoding, v []interface{}) {
  28153. m.rexo(0, v[1], false)
  28154. m.emit(0xc1)
  28155. m.emit(0xf8 | lcode(v[1]))
  28156. m.imm1(toImmAny(v[0]))
  28157. })
  28158. }
  28159. // SARL cl, r32
  28160. if v0 == CL && isReg32(v1) {
  28161. p.domain = DomainGeneric
  28162. p.add(0, func(m *_Encoding, v []interface{}) {
  28163. m.rexo(0, v[1], false)
  28164. m.emit(0xd3)
  28165. m.emit(0xf8 | lcode(v[1]))
  28166. })
  28167. }
  28168. // SARL 1, m32
  28169. if isConst1(v0) && isM32(v1) {
  28170. p.domain = DomainGeneric
  28171. p.add(0, func(m *_Encoding, v []interface{}) {
  28172. m.rexo(0, addr(v[1]), false)
  28173. m.emit(0xd1)
  28174. m.mrsd(7, addr(v[1]), 1)
  28175. })
  28176. }
  28177. // SARL imm8, m32
  28178. if isImm8(v0) && isM32(v1) {
  28179. p.domain = DomainGeneric
  28180. p.add(0, func(m *_Encoding, v []interface{}) {
  28181. m.rexo(0, addr(v[1]), false)
  28182. m.emit(0xc1)
  28183. m.mrsd(7, addr(v[1]), 1)
  28184. m.imm1(toImmAny(v[0]))
  28185. })
  28186. }
  28187. // SARL cl, m32
  28188. if v0 == CL && isM32(v1) {
  28189. p.domain = DomainGeneric
  28190. p.add(0, func(m *_Encoding, v []interface{}) {
  28191. m.rexo(0, addr(v[1]), false)
  28192. m.emit(0xd3)
  28193. m.mrsd(7, addr(v[1]), 1)
  28194. })
  28195. }
  28196. if p.len == 0 {
  28197. panic("invalid operands for SARL")
  28198. }
  28199. return p
  28200. }
  28201. // SARQ performs "Arithmetic Shift Right".
  28202. //
  28203. // Mnemonic : SAR
  28204. // Supported forms : (6 forms)
  28205. //
  28206. // * SARQ 1, r64
  28207. // * SARQ imm8, r64
  28208. // * SARQ cl, r64
  28209. // * SARQ 1, m64
  28210. // * SARQ imm8, m64
  28211. // * SARQ cl, m64
  28212. //
  28213. func (self *Program) SARQ(v0 interface{}, v1 interface{}) *Instruction {
  28214. p := self.alloc("SARQ", 2, Operands { v0, v1 })
  28215. // SARQ 1, r64
  28216. if isConst1(v0) && isReg64(v1) {
  28217. p.domain = DomainGeneric
  28218. p.add(0, func(m *_Encoding, v []interface{}) {
  28219. m.emit(0x48 | hcode(v[1]))
  28220. m.emit(0xd1)
  28221. m.emit(0xf8 | lcode(v[1]))
  28222. })
  28223. }
  28224. // SARQ imm8, r64
  28225. if isImm8(v0) && isReg64(v1) {
  28226. p.domain = DomainGeneric
  28227. p.add(0, func(m *_Encoding, v []interface{}) {
  28228. m.emit(0x48 | hcode(v[1]))
  28229. m.emit(0xc1)
  28230. m.emit(0xf8 | lcode(v[1]))
  28231. m.imm1(toImmAny(v[0]))
  28232. })
  28233. }
  28234. // SARQ cl, r64
  28235. if v0 == CL && isReg64(v1) {
  28236. p.domain = DomainGeneric
  28237. p.add(0, func(m *_Encoding, v []interface{}) {
  28238. m.emit(0x48 | hcode(v[1]))
  28239. m.emit(0xd3)
  28240. m.emit(0xf8 | lcode(v[1]))
  28241. })
  28242. }
  28243. // SARQ 1, m64
  28244. if isConst1(v0) && isM64(v1) {
  28245. p.domain = DomainGeneric
  28246. p.add(0, func(m *_Encoding, v []interface{}) {
  28247. m.rexm(1, 0, addr(v[1]))
  28248. m.emit(0xd1)
  28249. m.mrsd(7, addr(v[1]), 1)
  28250. })
  28251. }
  28252. // SARQ imm8, m64
  28253. if isImm8(v0) && isM64(v1) {
  28254. p.domain = DomainGeneric
  28255. p.add(0, func(m *_Encoding, v []interface{}) {
  28256. m.rexm(1, 0, addr(v[1]))
  28257. m.emit(0xc1)
  28258. m.mrsd(7, addr(v[1]), 1)
  28259. m.imm1(toImmAny(v[0]))
  28260. })
  28261. }
  28262. // SARQ cl, m64
  28263. if v0 == CL && isM64(v1) {
  28264. p.domain = DomainGeneric
  28265. p.add(0, func(m *_Encoding, v []interface{}) {
  28266. m.rexm(1, 0, addr(v[1]))
  28267. m.emit(0xd3)
  28268. m.mrsd(7, addr(v[1]), 1)
  28269. })
  28270. }
  28271. if p.len == 0 {
  28272. panic("invalid operands for SARQ")
  28273. }
  28274. return p
  28275. }
  28276. // SARW performs "Arithmetic Shift Right".
  28277. //
  28278. // Mnemonic : SAR
  28279. // Supported forms : (6 forms)
  28280. //
  28281. // * SARW 1, r16
  28282. // * SARW imm8, r16
  28283. // * SARW cl, r16
  28284. // * SARW 1, m16
  28285. // * SARW imm8, m16
  28286. // * SARW cl, m16
  28287. //
  28288. func (self *Program) SARW(v0 interface{}, v1 interface{}) *Instruction {
  28289. p := self.alloc("SARW", 2, Operands { v0, v1 })
  28290. // SARW 1, r16
  28291. if isConst1(v0) && isReg16(v1) {
  28292. p.domain = DomainGeneric
  28293. p.add(0, func(m *_Encoding, v []interface{}) {
  28294. m.emit(0x66)
  28295. m.rexo(0, v[1], false)
  28296. m.emit(0xd1)
  28297. m.emit(0xf8 | lcode(v[1]))
  28298. })
  28299. }
  28300. // SARW imm8, r16
  28301. if isImm8(v0) && isReg16(v1) {
  28302. p.domain = DomainGeneric
  28303. p.add(0, func(m *_Encoding, v []interface{}) {
  28304. m.emit(0x66)
  28305. m.rexo(0, v[1], false)
  28306. m.emit(0xc1)
  28307. m.emit(0xf8 | lcode(v[1]))
  28308. m.imm1(toImmAny(v[0]))
  28309. })
  28310. }
  28311. // SARW cl, r16
  28312. if v0 == CL && isReg16(v1) {
  28313. p.domain = DomainGeneric
  28314. p.add(0, func(m *_Encoding, v []interface{}) {
  28315. m.emit(0x66)
  28316. m.rexo(0, v[1], false)
  28317. m.emit(0xd3)
  28318. m.emit(0xf8 | lcode(v[1]))
  28319. })
  28320. }
  28321. // SARW 1, m16
  28322. if isConst1(v0) && isM16(v1) {
  28323. p.domain = DomainGeneric
  28324. p.add(0, func(m *_Encoding, v []interface{}) {
  28325. m.emit(0x66)
  28326. m.rexo(0, addr(v[1]), false)
  28327. m.emit(0xd1)
  28328. m.mrsd(7, addr(v[1]), 1)
  28329. })
  28330. }
  28331. // SARW imm8, m16
  28332. if isImm8(v0) && isM16(v1) {
  28333. p.domain = DomainGeneric
  28334. p.add(0, func(m *_Encoding, v []interface{}) {
  28335. m.emit(0x66)
  28336. m.rexo(0, addr(v[1]), false)
  28337. m.emit(0xc1)
  28338. m.mrsd(7, addr(v[1]), 1)
  28339. m.imm1(toImmAny(v[0]))
  28340. })
  28341. }
  28342. // SARW cl, m16
  28343. if v0 == CL && isM16(v1) {
  28344. p.domain = DomainGeneric
  28345. p.add(0, func(m *_Encoding, v []interface{}) {
  28346. m.emit(0x66)
  28347. m.rexo(0, addr(v[1]), false)
  28348. m.emit(0xd3)
  28349. m.mrsd(7, addr(v[1]), 1)
  28350. })
  28351. }
  28352. if p.len == 0 {
  28353. panic("invalid operands for SARW")
  28354. }
  28355. return p
  28356. }
  28357. // SARXL performs "Arithmetic Shift Right Without Affecting Flags".
  28358. //
  28359. // Mnemonic : SARX
  28360. // Supported forms : (2 forms)
  28361. //
  28362. // * SARXL r32, r32, r32 [BMI2]
  28363. // * SARXL r32, m32, r32 [BMI2]
  28364. //
  28365. func (self *Program) SARXL(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  28366. p := self.alloc("SARXL", 3, Operands { v0, v1, v2 })
  28367. // SARXL r32, r32, r32
  28368. if isReg32(v0) && isReg32(v1) && isReg32(v2) {
  28369. self.require(ISA_BMI2)
  28370. p.domain = DomainGeneric
  28371. p.add(0, func(m *_Encoding, v []interface{}) {
  28372. m.emit(0xc4)
  28373. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  28374. m.emit(0x7a ^ (hlcode(v[0]) << 3))
  28375. m.emit(0xf7)
  28376. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  28377. })
  28378. }
  28379. // SARXL r32, m32, r32
  28380. if isReg32(v0) && isM32(v1) && isReg32(v2) {
  28381. self.require(ISA_BMI2)
  28382. p.domain = DomainGeneric
  28383. p.add(0, func(m *_Encoding, v []interface{}) {
  28384. m.vex3(0xc4, 0b10, 0x02, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  28385. m.emit(0xf7)
  28386. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  28387. })
  28388. }
  28389. if p.len == 0 {
  28390. panic("invalid operands for SARXL")
  28391. }
  28392. return p
  28393. }
  28394. // SARXQ performs "Arithmetic Shift Right Without Affecting Flags".
  28395. //
  28396. // Mnemonic : SARX
  28397. // Supported forms : (2 forms)
  28398. //
  28399. // * SARXQ r64, r64, r64 [BMI2]
  28400. // * SARXQ r64, m64, r64 [BMI2]
  28401. //
  28402. func (self *Program) SARXQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  28403. p := self.alloc("SARXQ", 3, Operands { v0, v1, v2 })
  28404. // SARXQ r64, r64, r64
  28405. if isReg64(v0) && isReg64(v1) && isReg64(v2) {
  28406. self.require(ISA_BMI2)
  28407. p.domain = DomainGeneric
  28408. p.add(0, func(m *_Encoding, v []interface{}) {
  28409. m.emit(0xc4)
  28410. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  28411. m.emit(0xfa ^ (hlcode(v[0]) << 3))
  28412. m.emit(0xf7)
  28413. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  28414. })
  28415. }
  28416. // SARXQ r64, m64, r64
  28417. if isReg64(v0) && isM64(v1) && isReg64(v2) {
  28418. self.require(ISA_BMI2)
  28419. p.domain = DomainGeneric
  28420. p.add(0, func(m *_Encoding, v []interface{}) {
  28421. m.vex3(0xc4, 0b10, 0x82, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  28422. m.emit(0xf7)
  28423. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  28424. })
  28425. }
  28426. if p.len == 0 {
  28427. panic("invalid operands for SARXQ")
  28428. }
  28429. return p
  28430. }
  28431. // SBBB performs "Subtract with Borrow".
  28432. //
  28433. // Mnemonic : SBB
  28434. // Supported forms : (6 forms)
  28435. //
  28436. // * SBBB imm8, al
  28437. // * SBBB imm8, r8
  28438. // * SBBB r8, r8
  28439. // * SBBB m8, r8
  28440. // * SBBB imm8, m8
  28441. // * SBBB r8, m8
  28442. //
  28443. func (self *Program) SBBB(v0 interface{}, v1 interface{}) *Instruction {
  28444. p := self.alloc("SBBB", 2, Operands { v0, v1 })
  28445. // SBBB imm8, al
  28446. if isImm8(v0) && v1 == AL {
  28447. p.domain = DomainGeneric
  28448. p.add(0, func(m *_Encoding, v []interface{}) {
  28449. m.emit(0x1c)
  28450. m.imm1(toImmAny(v[0]))
  28451. })
  28452. }
  28453. // SBBB imm8, r8
  28454. if isImm8(v0) && isReg8(v1) {
  28455. p.domain = DomainGeneric
  28456. p.add(0, func(m *_Encoding, v []interface{}) {
  28457. m.rexo(0, v[1], isReg8REX(v[1]))
  28458. m.emit(0x80)
  28459. m.emit(0xd8 | lcode(v[1]))
  28460. m.imm1(toImmAny(v[0]))
  28461. })
  28462. }
  28463. // SBBB r8, r8
  28464. if isReg8(v0) && isReg8(v1) {
  28465. p.domain = DomainGeneric
  28466. p.add(0, func(m *_Encoding, v []interface{}) {
  28467. m.rexo(hcode(v[0]), v[1], isReg8REX(v[0]) || isReg8REX(v[1]))
  28468. m.emit(0x18)
  28469. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  28470. })
  28471. p.add(0, func(m *_Encoding, v []interface{}) {
  28472. m.rexo(hcode(v[1]), v[0], isReg8REX(v[0]) || isReg8REX(v[1]))
  28473. m.emit(0x1a)
  28474. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  28475. })
  28476. }
  28477. // SBBB m8, r8
  28478. if isM8(v0) && isReg8(v1) {
  28479. p.domain = DomainGeneric
  28480. p.add(0, func(m *_Encoding, v []interface{}) {
  28481. m.rexo(hcode(v[1]), addr(v[0]), isReg8REX(v[1]))
  28482. m.emit(0x1a)
  28483. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  28484. })
  28485. }
  28486. // SBBB imm8, m8
  28487. if isImm8(v0) && isM8(v1) {
  28488. p.domain = DomainGeneric
  28489. p.add(0, func(m *_Encoding, v []interface{}) {
  28490. m.rexo(0, addr(v[1]), false)
  28491. m.emit(0x80)
  28492. m.mrsd(3, addr(v[1]), 1)
  28493. m.imm1(toImmAny(v[0]))
  28494. })
  28495. }
  28496. // SBBB r8, m8
  28497. if isReg8(v0) && isM8(v1) {
  28498. p.domain = DomainGeneric
  28499. p.add(0, func(m *_Encoding, v []interface{}) {
  28500. m.rexo(hcode(v[0]), addr(v[1]), isReg8REX(v[0]))
  28501. m.emit(0x18)
  28502. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  28503. })
  28504. }
  28505. if p.len == 0 {
  28506. panic("invalid operands for SBBB")
  28507. }
  28508. return p
  28509. }
  28510. // SBBL performs "Subtract with Borrow".
  28511. //
  28512. // Mnemonic : SBB
  28513. // Supported forms : (8 forms)
  28514. //
  28515. // * SBBL imm32, eax
  28516. // * SBBL imm8, r32
  28517. // * SBBL imm32, r32
  28518. // * SBBL r32, r32
  28519. // * SBBL m32, r32
  28520. // * SBBL imm8, m32
  28521. // * SBBL imm32, m32
  28522. // * SBBL r32, m32
  28523. //
  28524. func (self *Program) SBBL(v0 interface{}, v1 interface{}) *Instruction {
  28525. p := self.alloc("SBBL", 2, Operands { v0, v1 })
  28526. // SBBL imm32, eax
  28527. if isImm32(v0) && v1 == EAX {
  28528. p.domain = DomainGeneric
  28529. p.add(0, func(m *_Encoding, v []interface{}) {
  28530. m.emit(0x1d)
  28531. m.imm4(toImmAny(v[0]))
  28532. })
  28533. }
  28534. // SBBL imm8, r32
  28535. if isImm8Ext(v0, 4) && isReg32(v1) {
  28536. p.domain = DomainGeneric
  28537. p.add(0, func(m *_Encoding, v []interface{}) {
  28538. m.rexo(0, v[1], false)
  28539. m.emit(0x83)
  28540. m.emit(0xd8 | lcode(v[1]))
  28541. m.imm1(toImmAny(v[0]))
  28542. })
  28543. }
  28544. // SBBL imm32, r32
  28545. if isImm32(v0) && isReg32(v1) {
  28546. p.domain = DomainGeneric
  28547. p.add(0, func(m *_Encoding, v []interface{}) {
  28548. m.rexo(0, v[1], false)
  28549. m.emit(0x81)
  28550. m.emit(0xd8 | lcode(v[1]))
  28551. m.imm4(toImmAny(v[0]))
  28552. })
  28553. }
  28554. // SBBL r32, r32
  28555. if isReg32(v0) && isReg32(v1) {
  28556. p.domain = DomainGeneric
  28557. p.add(0, func(m *_Encoding, v []interface{}) {
  28558. m.rexo(hcode(v[0]), v[1], false)
  28559. m.emit(0x19)
  28560. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  28561. })
  28562. p.add(0, func(m *_Encoding, v []interface{}) {
  28563. m.rexo(hcode(v[1]), v[0], false)
  28564. m.emit(0x1b)
  28565. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  28566. })
  28567. }
  28568. // SBBL m32, r32
  28569. if isM32(v0) && isReg32(v1) {
  28570. p.domain = DomainGeneric
  28571. p.add(0, func(m *_Encoding, v []interface{}) {
  28572. m.rexo(hcode(v[1]), addr(v[0]), false)
  28573. m.emit(0x1b)
  28574. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  28575. })
  28576. }
  28577. // SBBL imm8, m32
  28578. if isImm8Ext(v0, 4) && isM32(v1) {
  28579. p.domain = DomainGeneric
  28580. p.add(0, func(m *_Encoding, v []interface{}) {
  28581. m.rexo(0, addr(v[1]), false)
  28582. m.emit(0x83)
  28583. m.mrsd(3, addr(v[1]), 1)
  28584. m.imm1(toImmAny(v[0]))
  28585. })
  28586. }
  28587. // SBBL imm32, m32
  28588. if isImm32(v0) && isM32(v1) {
  28589. p.domain = DomainGeneric
  28590. p.add(0, func(m *_Encoding, v []interface{}) {
  28591. m.rexo(0, addr(v[1]), false)
  28592. m.emit(0x81)
  28593. m.mrsd(3, addr(v[1]), 1)
  28594. m.imm4(toImmAny(v[0]))
  28595. })
  28596. }
  28597. // SBBL r32, m32
  28598. if isReg32(v0) && isM32(v1) {
  28599. p.domain = DomainGeneric
  28600. p.add(0, func(m *_Encoding, v []interface{}) {
  28601. m.rexo(hcode(v[0]), addr(v[1]), false)
  28602. m.emit(0x19)
  28603. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  28604. })
  28605. }
  28606. if p.len == 0 {
  28607. panic("invalid operands for SBBL")
  28608. }
  28609. return p
  28610. }
  28611. // SBBQ performs "Subtract with Borrow".
  28612. //
  28613. // Mnemonic : SBB
  28614. // Supported forms : (8 forms)
  28615. //
  28616. // * SBBQ imm32, rax
  28617. // * SBBQ imm8, r64
  28618. // * SBBQ imm32, r64
  28619. // * SBBQ r64, r64
  28620. // * SBBQ m64, r64
  28621. // * SBBQ imm8, m64
  28622. // * SBBQ imm32, m64
  28623. // * SBBQ r64, m64
  28624. //
  28625. func (self *Program) SBBQ(v0 interface{}, v1 interface{}) *Instruction {
  28626. p := self.alloc("SBBQ", 2, Operands { v0, v1 })
  28627. // SBBQ imm32, rax
  28628. if isImm32(v0) && v1 == RAX {
  28629. p.domain = DomainGeneric
  28630. p.add(0, func(m *_Encoding, v []interface{}) {
  28631. m.emit(0x48)
  28632. m.emit(0x1d)
  28633. m.imm4(toImmAny(v[0]))
  28634. })
  28635. }
  28636. // SBBQ imm8, r64
  28637. if isImm8Ext(v0, 8) && isReg64(v1) {
  28638. p.domain = DomainGeneric
  28639. p.add(0, func(m *_Encoding, v []interface{}) {
  28640. m.emit(0x48 | hcode(v[1]))
  28641. m.emit(0x83)
  28642. m.emit(0xd8 | lcode(v[1]))
  28643. m.imm1(toImmAny(v[0]))
  28644. })
  28645. }
  28646. // SBBQ imm32, r64
  28647. if isImm32Ext(v0, 8) && isReg64(v1) {
  28648. p.domain = DomainGeneric
  28649. p.add(0, func(m *_Encoding, v []interface{}) {
  28650. m.emit(0x48 | hcode(v[1]))
  28651. m.emit(0x81)
  28652. m.emit(0xd8 | lcode(v[1]))
  28653. m.imm4(toImmAny(v[0]))
  28654. })
  28655. }
  28656. // SBBQ r64, r64
  28657. if isReg64(v0) && isReg64(v1) {
  28658. p.domain = DomainGeneric
  28659. p.add(0, func(m *_Encoding, v []interface{}) {
  28660. m.emit(0x48 | hcode(v[0]) << 2 | hcode(v[1]))
  28661. m.emit(0x19)
  28662. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  28663. })
  28664. p.add(0, func(m *_Encoding, v []interface{}) {
  28665. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  28666. m.emit(0x1b)
  28667. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  28668. })
  28669. }
  28670. // SBBQ m64, r64
  28671. if isM64(v0) && isReg64(v1) {
  28672. p.domain = DomainGeneric
  28673. p.add(0, func(m *_Encoding, v []interface{}) {
  28674. m.rexm(1, hcode(v[1]), addr(v[0]))
  28675. m.emit(0x1b)
  28676. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  28677. })
  28678. }
  28679. // SBBQ imm8, m64
  28680. if isImm8Ext(v0, 8) && isM64(v1) {
  28681. p.domain = DomainGeneric
  28682. p.add(0, func(m *_Encoding, v []interface{}) {
  28683. m.rexm(1, 0, addr(v[1]))
  28684. m.emit(0x83)
  28685. m.mrsd(3, addr(v[1]), 1)
  28686. m.imm1(toImmAny(v[0]))
  28687. })
  28688. }
  28689. // SBBQ imm32, m64
  28690. if isImm32Ext(v0, 8) && isM64(v1) {
  28691. p.domain = DomainGeneric
  28692. p.add(0, func(m *_Encoding, v []interface{}) {
  28693. m.rexm(1, 0, addr(v[1]))
  28694. m.emit(0x81)
  28695. m.mrsd(3, addr(v[1]), 1)
  28696. m.imm4(toImmAny(v[0]))
  28697. })
  28698. }
  28699. // SBBQ r64, m64
  28700. if isReg64(v0) && isM64(v1) {
  28701. p.domain = DomainGeneric
  28702. p.add(0, func(m *_Encoding, v []interface{}) {
  28703. m.rexm(1, hcode(v[0]), addr(v[1]))
  28704. m.emit(0x19)
  28705. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  28706. })
  28707. }
  28708. if p.len == 0 {
  28709. panic("invalid operands for SBBQ")
  28710. }
  28711. return p
  28712. }
  28713. // SBBW performs "Subtract with Borrow".
  28714. //
  28715. // Mnemonic : SBB
  28716. // Supported forms : (8 forms)
  28717. //
  28718. // * SBBW imm16, ax
  28719. // * SBBW imm8, r16
  28720. // * SBBW imm16, r16
  28721. // * SBBW r16, r16
  28722. // * SBBW m16, r16
  28723. // * SBBW imm8, m16
  28724. // * SBBW imm16, m16
  28725. // * SBBW r16, m16
  28726. //
  28727. func (self *Program) SBBW(v0 interface{}, v1 interface{}) *Instruction {
  28728. p := self.alloc("SBBW", 2, Operands { v0, v1 })
  28729. // SBBW imm16, ax
  28730. if isImm16(v0) && v1 == AX {
  28731. p.domain = DomainGeneric
  28732. p.add(0, func(m *_Encoding, v []interface{}) {
  28733. m.emit(0x66)
  28734. m.emit(0x1d)
  28735. m.imm2(toImmAny(v[0]))
  28736. })
  28737. }
  28738. // SBBW imm8, r16
  28739. if isImm8Ext(v0, 2) && isReg16(v1) {
  28740. p.domain = DomainGeneric
  28741. p.add(0, func(m *_Encoding, v []interface{}) {
  28742. m.emit(0x66)
  28743. m.rexo(0, v[1], false)
  28744. m.emit(0x83)
  28745. m.emit(0xd8 | lcode(v[1]))
  28746. m.imm1(toImmAny(v[0]))
  28747. })
  28748. }
  28749. // SBBW imm16, r16
  28750. if isImm16(v0) && isReg16(v1) {
  28751. p.domain = DomainGeneric
  28752. p.add(0, func(m *_Encoding, v []interface{}) {
  28753. m.emit(0x66)
  28754. m.rexo(0, v[1], false)
  28755. m.emit(0x81)
  28756. m.emit(0xd8 | lcode(v[1]))
  28757. m.imm2(toImmAny(v[0]))
  28758. })
  28759. }
  28760. // SBBW r16, r16
  28761. if isReg16(v0) && isReg16(v1) {
  28762. p.domain = DomainGeneric
  28763. p.add(0, func(m *_Encoding, v []interface{}) {
  28764. m.emit(0x66)
  28765. m.rexo(hcode(v[0]), v[1], false)
  28766. m.emit(0x19)
  28767. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  28768. })
  28769. p.add(0, func(m *_Encoding, v []interface{}) {
  28770. m.emit(0x66)
  28771. m.rexo(hcode(v[1]), v[0], false)
  28772. m.emit(0x1b)
  28773. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  28774. })
  28775. }
  28776. // SBBW m16, r16
  28777. if isM16(v0) && isReg16(v1) {
  28778. p.domain = DomainGeneric
  28779. p.add(0, func(m *_Encoding, v []interface{}) {
  28780. m.emit(0x66)
  28781. m.rexo(hcode(v[1]), addr(v[0]), false)
  28782. m.emit(0x1b)
  28783. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  28784. })
  28785. }
  28786. // SBBW imm8, m16
  28787. if isImm8Ext(v0, 2) && isM16(v1) {
  28788. p.domain = DomainGeneric
  28789. p.add(0, func(m *_Encoding, v []interface{}) {
  28790. m.emit(0x66)
  28791. m.rexo(0, addr(v[1]), false)
  28792. m.emit(0x83)
  28793. m.mrsd(3, addr(v[1]), 1)
  28794. m.imm1(toImmAny(v[0]))
  28795. })
  28796. }
  28797. // SBBW imm16, m16
  28798. if isImm16(v0) && isM16(v1) {
  28799. p.domain = DomainGeneric
  28800. p.add(0, func(m *_Encoding, v []interface{}) {
  28801. m.emit(0x66)
  28802. m.rexo(0, addr(v[1]), false)
  28803. m.emit(0x81)
  28804. m.mrsd(3, addr(v[1]), 1)
  28805. m.imm2(toImmAny(v[0]))
  28806. })
  28807. }
  28808. // SBBW r16, m16
  28809. if isReg16(v0) && isM16(v1) {
  28810. p.domain = DomainGeneric
  28811. p.add(0, func(m *_Encoding, v []interface{}) {
  28812. m.emit(0x66)
  28813. m.rexo(hcode(v[0]), addr(v[1]), false)
  28814. m.emit(0x19)
  28815. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  28816. })
  28817. }
  28818. if p.len == 0 {
  28819. panic("invalid operands for SBBW")
  28820. }
  28821. return p
  28822. }
  28823. // SETA performs "Set byte if above (CF == 0 and ZF == 0)".
  28824. //
  28825. // Mnemonic : SETA
  28826. // Supported forms : (2 forms)
  28827. //
  28828. // * SETA r8
  28829. // * SETA m8
  28830. //
  28831. func (self *Program) SETA(v0 interface{}) *Instruction {
  28832. p := self.alloc("SETA", 1, Operands { v0 })
  28833. // SETA r8
  28834. if isReg8(v0) {
  28835. p.domain = DomainGeneric
  28836. p.add(0, func(m *_Encoding, v []interface{}) {
  28837. m.rexo(0, v[0], isReg8REX(v[0]))
  28838. m.emit(0x0f)
  28839. m.emit(0x97)
  28840. m.emit(0xc0 | lcode(v[0]))
  28841. })
  28842. }
  28843. // SETA m8
  28844. if isM8(v0) {
  28845. p.domain = DomainGeneric
  28846. p.add(0, func(m *_Encoding, v []interface{}) {
  28847. m.rexo(0, addr(v[0]), false)
  28848. m.emit(0x0f)
  28849. m.emit(0x97)
  28850. m.mrsd(0, addr(v[0]), 1)
  28851. })
  28852. }
  28853. if p.len == 0 {
  28854. panic("invalid operands for SETA")
  28855. }
  28856. return p
  28857. }
  28858. // SETAE performs "Set byte if above or equal (CF == 0)".
  28859. //
  28860. // Mnemonic : SETAE
  28861. // Supported forms : (2 forms)
  28862. //
  28863. // * SETAE r8
  28864. // * SETAE m8
  28865. //
  28866. func (self *Program) SETAE(v0 interface{}) *Instruction {
  28867. p := self.alloc("SETAE", 1, Operands { v0 })
  28868. // SETAE r8
  28869. if isReg8(v0) {
  28870. p.domain = DomainGeneric
  28871. p.add(0, func(m *_Encoding, v []interface{}) {
  28872. m.rexo(0, v[0], isReg8REX(v[0]))
  28873. m.emit(0x0f)
  28874. m.emit(0x93)
  28875. m.emit(0xc0 | lcode(v[0]))
  28876. })
  28877. }
  28878. // SETAE m8
  28879. if isM8(v0) {
  28880. p.domain = DomainGeneric
  28881. p.add(0, func(m *_Encoding, v []interface{}) {
  28882. m.rexo(0, addr(v[0]), false)
  28883. m.emit(0x0f)
  28884. m.emit(0x93)
  28885. m.mrsd(0, addr(v[0]), 1)
  28886. })
  28887. }
  28888. if p.len == 0 {
  28889. panic("invalid operands for SETAE")
  28890. }
  28891. return p
  28892. }
  28893. // SETB performs "Set byte if below (CF == 1)".
  28894. //
  28895. // Mnemonic : SETB
  28896. // Supported forms : (2 forms)
  28897. //
  28898. // * SETB r8
  28899. // * SETB m8
  28900. //
  28901. func (self *Program) SETB(v0 interface{}) *Instruction {
  28902. p := self.alloc("SETB", 1, Operands { v0 })
  28903. // SETB r8
  28904. if isReg8(v0) {
  28905. p.domain = DomainGeneric
  28906. p.add(0, func(m *_Encoding, v []interface{}) {
  28907. m.rexo(0, v[0], isReg8REX(v[0]))
  28908. m.emit(0x0f)
  28909. m.emit(0x92)
  28910. m.emit(0xc0 | lcode(v[0]))
  28911. })
  28912. }
  28913. // SETB m8
  28914. if isM8(v0) {
  28915. p.domain = DomainGeneric
  28916. p.add(0, func(m *_Encoding, v []interface{}) {
  28917. m.rexo(0, addr(v[0]), false)
  28918. m.emit(0x0f)
  28919. m.emit(0x92)
  28920. m.mrsd(0, addr(v[0]), 1)
  28921. })
  28922. }
  28923. if p.len == 0 {
  28924. panic("invalid operands for SETB")
  28925. }
  28926. return p
  28927. }
  28928. // SETBE performs "Set byte if below or equal (CF == 1 or ZF == 1)".
  28929. //
  28930. // Mnemonic : SETBE
  28931. // Supported forms : (2 forms)
  28932. //
  28933. // * SETBE r8
  28934. // * SETBE m8
  28935. //
  28936. func (self *Program) SETBE(v0 interface{}) *Instruction {
  28937. p := self.alloc("SETBE", 1, Operands { v0 })
  28938. // SETBE r8
  28939. if isReg8(v0) {
  28940. p.domain = DomainGeneric
  28941. p.add(0, func(m *_Encoding, v []interface{}) {
  28942. m.rexo(0, v[0], isReg8REX(v[0]))
  28943. m.emit(0x0f)
  28944. m.emit(0x96)
  28945. m.emit(0xc0 | lcode(v[0]))
  28946. })
  28947. }
  28948. // SETBE m8
  28949. if isM8(v0) {
  28950. p.domain = DomainGeneric
  28951. p.add(0, func(m *_Encoding, v []interface{}) {
  28952. m.rexo(0, addr(v[0]), false)
  28953. m.emit(0x0f)
  28954. m.emit(0x96)
  28955. m.mrsd(0, addr(v[0]), 1)
  28956. })
  28957. }
  28958. if p.len == 0 {
  28959. panic("invalid operands for SETBE")
  28960. }
  28961. return p
  28962. }
  28963. // SETC performs "Set byte if carry (CF == 1)".
  28964. //
  28965. // Mnemonic : SETC
  28966. // Supported forms : (2 forms)
  28967. //
  28968. // * SETC r8
  28969. // * SETC m8
  28970. //
  28971. func (self *Program) SETC(v0 interface{}) *Instruction {
  28972. p := self.alloc("SETC", 1, Operands { v0 })
  28973. // SETC r8
  28974. if isReg8(v0) {
  28975. p.domain = DomainGeneric
  28976. p.add(0, func(m *_Encoding, v []interface{}) {
  28977. m.rexo(0, v[0], isReg8REX(v[0]))
  28978. m.emit(0x0f)
  28979. m.emit(0x92)
  28980. m.emit(0xc0 | lcode(v[0]))
  28981. })
  28982. }
  28983. // SETC m8
  28984. if isM8(v0) {
  28985. p.domain = DomainGeneric
  28986. p.add(0, func(m *_Encoding, v []interface{}) {
  28987. m.rexo(0, addr(v[0]), false)
  28988. m.emit(0x0f)
  28989. m.emit(0x92)
  28990. m.mrsd(0, addr(v[0]), 1)
  28991. })
  28992. }
  28993. if p.len == 0 {
  28994. panic("invalid operands for SETC")
  28995. }
  28996. return p
  28997. }
  28998. // SETE performs "Set byte if equal (ZF == 1)".
  28999. //
  29000. // Mnemonic : SETE
  29001. // Supported forms : (2 forms)
  29002. //
  29003. // * SETE r8
  29004. // * SETE m8
  29005. //
  29006. func (self *Program) SETE(v0 interface{}) *Instruction {
  29007. p := self.alloc("SETE", 1, Operands { v0 })
  29008. // SETE r8
  29009. if isReg8(v0) {
  29010. p.domain = DomainGeneric
  29011. p.add(0, func(m *_Encoding, v []interface{}) {
  29012. m.rexo(0, v[0], isReg8REX(v[0]))
  29013. m.emit(0x0f)
  29014. m.emit(0x94)
  29015. m.emit(0xc0 | lcode(v[0]))
  29016. })
  29017. }
  29018. // SETE m8
  29019. if isM8(v0) {
  29020. p.domain = DomainGeneric
  29021. p.add(0, func(m *_Encoding, v []interface{}) {
  29022. m.rexo(0, addr(v[0]), false)
  29023. m.emit(0x0f)
  29024. m.emit(0x94)
  29025. m.mrsd(0, addr(v[0]), 1)
  29026. })
  29027. }
  29028. if p.len == 0 {
  29029. panic("invalid operands for SETE")
  29030. }
  29031. return p
  29032. }
  29033. // SETG performs "Set byte if greater (ZF == 0 and SF == OF)".
  29034. //
  29035. // Mnemonic : SETG
  29036. // Supported forms : (2 forms)
  29037. //
  29038. // * SETG r8
  29039. // * SETG m8
  29040. //
  29041. func (self *Program) SETG(v0 interface{}) *Instruction {
  29042. p := self.alloc("SETG", 1, Operands { v0 })
  29043. // SETG r8
  29044. if isReg8(v0) {
  29045. p.domain = DomainGeneric
  29046. p.add(0, func(m *_Encoding, v []interface{}) {
  29047. m.rexo(0, v[0], isReg8REX(v[0]))
  29048. m.emit(0x0f)
  29049. m.emit(0x9f)
  29050. m.emit(0xc0 | lcode(v[0]))
  29051. })
  29052. }
  29053. // SETG m8
  29054. if isM8(v0) {
  29055. p.domain = DomainGeneric
  29056. p.add(0, func(m *_Encoding, v []interface{}) {
  29057. m.rexo(0, addr(v[0]), false)
  29058. m.emit(0x0f)
  29059. m.emit(0x9f)
  29060. m.mrsd(0, addr(v[0]), 1)
  29061. })
  29062. }
  29063. if p.len == 0 {
  29064. panic("invalid operands for SETG")
  29065. }
  29066. return p
  29067. }
  29068. // SETGE performs "Set byte if greater or equal (SF == OF)".
  29069. //
  29070. // Mnemonic : SETGE
  29071. // Supported forms : (2 forms)
  29072. //
  29073. // * SETGE r8
  29074. // * SETGE m8
  29075. //
  29076. func (self *Program) SETGE(v0 interface{}) *Instruction {
  29077. p := self.alloc("SETGE", 1, Operands { v0 })
  29078. // SETGE r8
  29079. if isReg8(v0) {
  29080. p.domain = DomainGeneric
  29081. p.add(0, func(m *_Encoding, v []interface{}) {
  29082. m.rexo(0, v[0], isReg8REX(v[0]))
  29083. m.emit(0x0f)
  29084. m.emit(0x9d)
  29085. m.emit(0xc0 | lcode(v[0]))
  29086. })
  29087. }
  29088. // SETGE m8
  29089. if isM8(v0) {
  29090. p.domain = DomainGeneric
  29091. p.add(0, func(m *_Encoding, v []interface{}) {
  29092. m.rexo(0, addr(v[0]), false)
  29093. m.emit(0x0f)
  29094. m.emit(0x9d)
  29095. m.mrsd(0, addr(v[0]), 1)
  29096. })
  29097. }
  29098. if p.len == 0 {
  29099. panic("invalid operands for SETGE")
  29100. }
  29101. return p
  29102. }
  29103. // SETL performs "Set byte if less (SF != OF)".
  29104. //
  29105. // Mnemonic : SETL
  29106. // Supported forms : (2 forms)
  29107. //
  29108. // * SETL r8
  29109. // * SETL m8
  29110. //
  29111. func (self *Program) SETL(v0 interface{}) *Instruction {
  29112. p := self.alloc("SETL", 1, Operands { v0 })
  29113. // SETL r8
  29114. if isReg8(v0) {
  29115. p.domain = DomainGeneric
  29116. p.add(0, func(m *_Encoding, v []interface{}) {
  29117. m.rexo(0, v[0], isReg8REX(v[0]))
  29118. m.emit(0x0f)
  29119. m.emit(0x9c)
  29120. m.emit(0xc0 | lcode(v[0]))
  29121. })
  29122. }
  29123. // SETL m8
  29124. if isM8(v0) {
  29125. p.domain = DomainGeneric
  29126. p.add(0, func(m *_Encoding, v []interface{}) {
  29127. m.rexo(0, addr(v[0]), false)
  29128. m.emit(0x0f)
  29129. m.emit(0x9c)
  29130. m.mrsd(0, addr(v[0]), 1)
  29131. })
  29132. }
  29133. if p.len == 0 {
  29134. panic("invalid operands for SETL")
  29135. }
  29136. return p
  29137. }
  29138. // SETLE performs "Set byte if less or equal (ZF == 1 or SF != OF)".
  29139. //
  29140. // Mnemonic : SETLE
  29141. // Supported forms : (2 forms)
  29142. //
  29143. // * SETLE r8
  29144. // * SETLE m8
  29145. //
  29146. func (self *Program) SETLE(v0 interface{}) *Instruction {
  29147. p := self.alloc("SETLE", 1, Operands { v0 })
  29148. // SETLE r8
  29149. if isReg8(v0) {
  29150. p.domain = DomainGeneric
  29151. p.add(0, func(m *_Encoding, v []interface{}) {
  29152. m.rexo(0, v[0], isReg8REX(v[0]))
  29153. m.emit(0x0f)
  29154. m.emit(0x9e)
  29155. m.emit(0xc0 | lcode(v[0]))
  29156. })
  29157. }
  29158. // SETLE m8
  29159. if isM8(v0) {
  29160. p.domain = DomainGeneric
  29161. p.add(0, func(m *_Encoding, v []interface{}) {
  29162. m.rexo(0, addr(v[0]), false)
  29163. m.emit(0x0f)
  29164. m.emit(0x9e)
  29165. m.mrsd(0, addr(v[0]), 1)
  29166. })
  29167. }
  29168. if p.len == 0 {
  29169. panic("invalid operands for SETLE")
  29170. }
  29171. return p
  29172. }
  29173. // SETNA performs "Set byte if not above (CF == 1 or ZF == 1)".
  29174. //
  29175. // Mnemonic : SETNA
  29176. // Supported forms : (2 forms)
  29177. //
  29178. // * SETNA r8
  29179. // * SETNA m8
  29180. //
  29181. func (self *Program) SETNA(v0 interface{}) *Instruction {
  29182. p := self.alloc("SETNA", 1, Operands { v0 })
  29183. // SETNA r8
  29184. if isReg8(v0) {
  29185. p.domain = DomainGeneric
  29186. p.add(0, func(m *_Encoding, v []interface{}) {
  29187. m.rexo(0, v[0], isReg8REX(v[0]))
  29188. m.emit(0x0f)
  29189. m.emit(0x96)
  29190. m.emit(0xc0 | lcode(v[0]))
  29191. })
  29192. }
  29193. // SETNA m8
  29194. if isM8(v0) {
  29195. p.domain = DomainGeneric
  29196. p.add(0, func(m *_Encoding, v []interface{}) {
  29197. m.rexo(0, addr(v[0]), false)
  29198. m.emit(0x0f)
  29199. m.emit(0x96)
  29200. m.mrsd(0, addr(v[0]), 1)
  29201. })
  29202. }
  29203. if p.len == 0 {
  29204. panic("invalid operands for SETNA")
  29205. }
  29206. return p
  29207. }
  29208. // SETNAE performs "Set byte if not above or equal (CF == 1)".
  29209. //
  29210. // Mnemonic : SETNAE
  29211. // Supported forms : (2 forms)
  29212. //
  29213. // * SETNAE r8
  29214. // * SETNAE m8
  29215. //
  29216. func (self *Program) SETNAE(v0 interface{}) *Instruction {
  29217. p := self.alloc("SETNAE", 1, Operands { v0 })
  29218. // SETNAE r8
  29219. if isReg8(v0) {
  29220. p.domain = DomainGeneric
  29221. p.add(0, func(m *_Encoding, v []interface{}) {
  29222. m.rexo(0, v[0], isReg8REX(v[0]))
  29223. m.emit(0x0f)
  29224. m.emit(0x92)
  29225. m.emit(0xc0 | lcode(v[0]))
  29226. })
  29227. }
  29228. // SETNAE m8
  29229. if isM8(v0) {
  29230. p.domain = DomainGeneric
  29231. p.add(0, func(m *_Encoding, v []interface{}) {
  29232. m.rexo(0, addr(v[0]), false)
  29233. m.emit(0x0f)
  29234. m.emit(0x92)
  29235. m.mrsd(0, addr(v[0]), 1)
  29236. })
  29237. }
  29238. if p.len == 0 {
  29239. panic("invalid operands for SETNAE")
  29240. }
  29241. return p
  29242. }
  29243. // SETNB performs "Set byte if not below (CF == 0)".
  29244. //
  29245. // Mnemonic : SETNB
  29246. // Supported forms : (2 forms)
  29247. //
  29248. // * SETNB r8
  29249. // * SETNB m8
  29250. //
  29251. func (self *Program) SETNB(v0 interface{}) *Instruction {
  29252. p := self.alloc("SETNB", 1, Operands { v0 })
  29253. // SETNB r8
  29254. if isReg8(v0) {
  29255. p.domain = DomainGeneric
  29256. p.add(0, func(m *_Encoding, v []interface{}) {
  29257. m.rexo(0, v[0], isReg8REX(v[0]))
  29258. m.emit(0x0f)
  29259. m.emit(0x93)
  29260. m.emit(0xc0 | lcode(v[0]))
  29261. })
  29262. }
  29263. // SETNB m8
  29264. if isM8(v0) {
  29265. p.domain = DomainGeneric
  29266. p.add(0, func(m *_Encoding, v []interface{}) {
  29267. m.rexo(0, addr(v[0]), false)
  29268. m.emit(0x0f)
  29269. m.emit(0x93)
  29270. m.mrsd(0, addr(v[0]), 1)
  29271. })
  29272. }
  29273. if p.len == 0 {
  29274. panic("invalid operands for SETNB")
  29275. }
  29276. return p
  29277. }
  29278. // SETNBE performs "Set byte if not below or equal (CF == 0 and ZF == 0)".
  29279. //
  29280. // Mnemonic : SETNBE
  29281. // Supported forms : (2 forms)
  29282. //
  29283. // * SETNBE r8
  29284. // * SETNBE m8
  29285. //
  29286. func (self *Program) SETNBE(v0 interface{}) *Instruction {
  29287. p := self.alloc("SETNBE", 1, Operands { v0 })
  29288. // SETNBE r8
  29289. if isReg8(v0) {
  29290. p.domain = DomainGeneric
  29291. p.add(0, func(m *_Encoding, v []interface{}) {
  29292. m.rexo(0, v[0], isReg8REX(v[0]))
  29293. m.emit(0x0f)
  29294. m.emit(0x97)
  29295. m.emit(0xc0 | lcode(v[0]))
  29296. })
  29297. }
  29298. // SETNBE m8
  29299. if isM8(v0) {
  29300. p.domain = DomainGeneric
  29301. p.add(0, func(m *_Encoding, v []interface{}) {
  29302. m.rexo(0, addr(v[0]), false)
  29303. m.emit(0x0f)
  29304. m.emit(0x97)
  29305. m.mrsd(0, addr(v[0]), 1)
  29306. })
  29307. }
  29308. if p.len == 0 {
  29309. panic("invalid operands for SETNBE")
  29310. }
  29311. return p
  29312. }
  29313. // SETNC performs "Set byte if not carry (CF == 0)".
  29314. //
  29315. // Mnemonic : SETNC
  29316. // Supported forms : (2 forms)
  29317. //
  29318. // * SETNC r8
  29319. // * SETNC m8
  29320. //
  29321. func (self *Program) SETNC(v0 interface{}) *Instruction {
  29322. p := self.alloc("SETNC", 1, Operands { v0 })
  29323. // SETNC r8
  29324. if isReg8(v0) {
  29325. p.domain = DomainGeneric
  29326. p.add(0, func(m *_Encoding, v []interface{}) {
  29327. m.rexo(0, v[0], isReg8REX(v[0]))
  29328. m.emit(0x0f)
  29329. m.emit(0x93)
  29330. m.emit(0xc0 | lcode(v[0]))
  29331. })
  29332. }
  29333. // SETNC m8
  29334. if isM8(v0) {
  29335. p.domain = DomainGeneric
  29336. p.add(0, func(m *_Encoding, v []interface{}) {
  29337. m.rexo(0, addr(v[0]), false)
  29338. m.emit(0x0f)
  29339. m.emit(0x93)
  29340. m.mrsd(0, addr(v[0]), 1)
  29341. })
  29342. }
  29343. if p.len == 0 {
  29344. panic("invalid operands for SETNC")
  29345. }
  29346. return p
  29347. }
  29348. // SETNE performs "Set byte if not equal (ZF == 0)".
  29349. //
  29350. // Mnemonic : SETNE
  29351. // Supported forms : (2 forms)
  29352. //
  29353. // * SETNE r8
  29354. // * SETNE m8
  29355. //
  29356. func (self *Program) SETNE(v0 interface{}) *Instruction {
  29357. p := self.alloc("SETNE", 1, Operands { v0 })
  29358. // SETNE r8
  29359. if isReg8(v0) {
  29360. p.domain = DomainGeneric
  29361. p.add(0, func(m *_Encoding, v []interface{}) {
  29362. m.rexo(0, v[0], isReg8REX(v[0]))
  29363. m.emit(0x0f)
  29364. m.emit(0x95)
  29365. m.emit(0xc0 | lcode(v[0]))
  29366. })
  29367. }
  29368. // SETNE m8
  29369. if isM8(v0) {
  29370. p.domain = DomainGeneric
  29371. p.add(0, func(m *_Encoding, v []interface{}) {
  29372. m.rexo(0, addr(v[0]), false)
  29373. m.emit(0x0f)
  29374. m.emit(0x95)
  29375. m.mrsd(0, addr(v[0]), 1)
  29376. })
  29377. }
  29378. if p.len == 0 {
  29379. panic("invalid operands for SETNE")
  29380. }
  29381. return p
  29382. }
  29383. // SETNG performs "Set byte if not greater (ZF == 1 or SF != OF)".
  29384. //
  29385. // Mnemonic : SETNG
  29386. // Supported forms : (2 forms)
  29387. //
  29388. // * SETNG r8
  29389. // * SETNG m8
  29390. //
  29391. func (self *Program) SETNG(v0 interface{}) *Instruction {
  29392. p := self.alloc("SETNG", 1, Operands { v0 })
  29393. // SETNG r8
  29394. if isReg8(v0) {
  29395. p.domain = DomainGeneric
  29396. p.add(0, func(m *_Encoding, v []interface{}) {
  29397. m.rexo(0, v[0], isReg8REX(v[0]))
  29398. m.emit(0x0f)
  29399. m.emit(0x9e)
  29400. m.emit(0xc0 | lcode(v[0]))
  29401. })
  29402. }
  29403. // SETNG m8
  29404. if isM8(v0) {
  29405. p.domain = DomainGeneric
  29406. p.add(0, func(m *_Encoding, v []interface{}) {
  29407. m.rexo(0, addr(v[0]), false)
  29408. m.emit(0x0f)
  29409. m.emit(0x9e)
  29410. m.mrsd(0, addr(v[0]), 1)
  29411. })
  29412. }
  29413. if p.len == 0 {
  29414. panic("invalid operands for SETNG")
  29415. }
  29416. return p
  29417. }
  29418. // SETNGE performs "Set byte if not greater or equal (SF != OF)".
  29419. //
  29420. // Mnemonic : SETNGE
  29421. // Supported forms : (2 forms)
  29422. //
  29423. // * SETNGE r8
  29424. // * SETNGE m8
  29425. //
  29426. func (self *Program) SETNGE(v0 interface{}) *Instruction {
  29427. p := self.alloc("SETNGE", 1, Operands { v0 })
  29428. // SETNGE r8
  29429. if isReg8(v0) {
  29430. p.domain = DomainGeneric
  29431. p.add(0, func(m *_Encoding, v []interface{}) {
  29432. m.rexo(0, v[0], isReg8REX(v[0]))
  29433. m.emit(0x0f)
  29434. m.emit(0x9c)
  29435. m.emit(0xc0 | lcode(v[0]))
  29436. })
  29437. }
  29438. // SETNGE m8
  29439. if isM8(v0) {
  29440. p.domain = DomainGeneric
  29441. p.add(0, func(m *_Encoding, v []interface{}) {
  29442. m.rexo(0, addr(v[0]), false)
  29443. m.emit(0x0f)
  29444. m.emit(0x9c)
  29445. m.mrsd(0, addr(v[0]), 1)
  29446. })
  29447. }
  29448. if p.len == 0 {
  29449. panic("invalid operands for SETNGE")
  29450. }
  29451. return p
  29452. }
  29453. // SETNL performs "Set byte if not less (SF == OF)".
  29454. //
  29455. // Mnemonic : SETNL
  29456. // Supported forms : (2 forms)
  29457. //
  29458. // * SETNL r8
  29459. // * SETNL m8
  29460. //
  29461. func (self *Program) SETNL(v0 interface{}) *Instruction {
  29462. p := self.alloc("SETNL", 1, Operands { v0 })
  29463. // SETNL r8
  29464. if isReg8(v0) {
  29465. p.domain = DomainGeneric
  29466. p.add(0, func(m *_Encoding, v []interface{}) {
  29467. m.rexo(0, v[0], isReg8REX(v[0]))
  29468. m.emit(0x0f)
  29469. m.emit(0x9d)
  29470. m.emit(0xc0 | lcode(v[0]))
  29471. })
  29472. }
  29473. // SETNL m8
  29474. if isM8(v0) {
  29475. p.domain = DomainGeneric
  29476. p.add(0, func(m *_Encoding, v []interface{}) {
  29477. m.rexo(0, addr(v[0]), false)
  29478. m.emit(0x0f)
  29479. m.emit(0x9d)
  29480. m.mrsd(0, addr(v[0]), 1)
  29481. })
  29482. }
  29483. if p.len == 0 {
  29484. panic("invalid operands for SETNL")
  29485. }
  29486. return p
  29487. }
  29488. // SETNLE performs "Set byte if not less or equal (ZF == 0 and SF == OF)".
  29489. //
  29490. // Mnemonic : SETNLE
  29491. // Supported forms : (2 forms)
  29492. //
  29493. // * SETNLE r8
  29494. // * SETNLE m8
  29495. //
  29496. func (self *Program) SETNLE(v0 interface{}) *Instruction {
  29497. p := self.alloc("SETNLE", 1, Operands { v0 })
  29498. // SETNLE r8
  29499. if isReg8(v0) {
  29500. p.domain = DomainGeneric
  29501. p.add(0, func(m *_Encoding, v []interface{}) {
  29502. m.rexo(0, v[0], isReg8REX(v[0]))
  29503. m.emit(0x0f)
  29504. m.emit(0x9f)
  29505. m.emit(0xc0 | lcode(v[0]))
  29506. })
  29507. }
  29508. // SETNLE m8
  29509. if isM8(v0) {
  29510. p.domain = DomainGeneric
  29511. p.add(0, func(m *_Encoding, v []interface{}) {
  29512. m.rexo(0, addr(v[0]), false)
  29513. m.emit(0x0f)
  29514. m.emit(0x9f)
  29515. m.mrsd(0, addr(v[0]), 1)
  29516. })
  29517. }
  29518. if p.len == 0 {
  29519. panic("invalid operands for SETNLE")
  29520. }
  29521. return p
  29522. }
  29523. // SETNO performs "Set byte if not overflow (OF == 0)".
  29524. //
  29525. // Mnemonic : SETNO
  29526. // Supported forms : (2 forms)
  29527. //
  29528. // * SETNO r8
  29529. // * SETNO m8
  29530. //
  29531. func (self *Program) SETNO(v0 interface{}) *Instruction {
  29532. p := self.alloc("SETNO", 1, Operands { v0 })
  29533. // SETNO r8
  29534. if isReg8(v0) {
  29535. p.domain = DomainGeneric
  29536. p.add(0, func(m *_Encoding, v []interface{}) {
  29537. m.rexo(0, v[0], isReg8REX(v[0]))
  29538. m.emit(0x0f)
  29539. m.emit(0x91)
  29540. m.emit(0xc0 | lcode(v[0]))
  29541. })
  29542. }
  29543. // SETNO m8
  29544. if isM8(v0) {
  29545. p.domain = DomainGeneric
  29546. p.add(0, func(m *_Encoding, v []interface{}) {
  29547. m.rexo(0, addr(v[0]), false)
  29548. m.emit(0x0f)
  29549. m.emit(0x91)
  29550. m.mrsd(0, addr(v[0]), 1)
  29551. })
  29552. }
  29553. if p.len == 0 {
  29554. panic("invalid operands for SETNO")
  29555. }
  29556. return p
  29557. }
  29558. // SETNP performs "Set byte if not parity (PF == 0)".
  29559. //
  29560. // Mnemonic : SETNP
  29561. // Supported forms : (2 forms)
  29562. //
  29563. // * SETNP r8
  29564. // * SETNP m8
  29565. //
  29566. func (self *Program) SETNP(v0 interface{}) *Instruction {
  29567. p := self.alloc("SETNP", 1, Operands { v0 })
  29568. // SETNP r8
  29569. if isReg8(v0) {
  29570. p.domain = DomainGeneric
  29571. p.add(0, func(m *_Encoding, v []interface{}) {
  29572. m.rexo(0, v[0], isReg8REX(v[0]))
  29573. m.emit(0x0f)
  29574. m.emit(0x9b)
  29575. m.emit(0xc0 | lcode(v[0]))
  29576. })
  29577. }
  29578. // SETNP m8
  29579. if isM8(v0) {
  29580. p.domain = DomainGeneric
  29581. p.add(0, func(m *_Encoding, v []interface{}) {
  29582. m.rexo(0, addr(v[0]), false)
  29583. m.emit(0x0f)
  29584. m.emit(0x9b)
  29585. m.mrsd(0, addr(v[0]), 1)
  29586. })
  29587. }
  29588. if p.len == 0 {
  29589. panic("invalid operands for SETNP")
  29590. }
  29591. return p
  29592. }
  29593. // SETNS performs "Set byte if not sign (SF == 0)".
  29594. //
  29595. // Mnemonic : SETNS
  29596. // Supported forms : (2 forms)
  29597. //
  29598. // * SETNS r8
  29599. // * SETNS m8
  29600. //
  29601. func (self *Program) SETNS(v0 interface{}) *Instruction {
  29602. p := self.alloc("SETNS", 1, Operands { v0 })
  29603. // SETNS r8
  29604. if isReg8(v0) {
  29605. p.domain = DomainGeneric
  29606. p.add(0, func(m *_Encoding, v []interface{}) {
  29607. m.rexo(0, v[0], isReg8REX(v[0]))
  29608. m.emit(0x0f)
  29609. m.emit(0x99)
  29610. m.emit(0xc0 | lcode(v[0]))
  29611. })
  29612. }
  29613. // SETNS m8
  29614. if isM8(v0) {
  29615. p.domain = DomainGeneric
  29616. p.add(0, func(m *_Encoding, v []interface{}) {
  29617. m.rexo(0, addr(v[0]), false)
  29618. m.emit(0x0f)
  29619. m.emit(0x99)
  29620. m.mrsd(0, addr(v[0]), 1)
  29621. })
  29622. }
  29623. if p.len == 0 {
  29624. panic("invalid operands for SETNS")
  29625. }
  29626. return p
  29627. }
  29628. // SETNZ performs "Set byte if not zero (ZF == 0)".
  29629. //
  29630. // Mnemonic : SETNZ
  29631. // Supported forms : (2 forms)
  29632. //
  29633. // * SETNZ r8
  29634. // * SETNZ m8
  29635. //
  29636. func (self *Program) SETNZ(v0 interface{}) *Instruction {
  29637. p := self.alloc("SETNZ", 1, Operands { v0 })
  29638. // SETNZ r8
  29639. if isReg8(v0) {
  29640. p.domain = DomainGeneric
  29641. p.add(0, func(m *_Encoding, v []interface{}) {
  29642. m.rexo(0, v[0], isReg8REX(v[0]))
  29643. m.emit(0x0f)
  29644. m.emit(0x95)
  29645. m.emit(0xc0 | lcode(v[0]))
  29646. })
  29647. }
  29648. // SETNZ m8
  29649. if isM8(v0) {
  29650. p.domain = DomainGeneric
  29651. p.add(0, func(m *_Encoding, v []interface{}) {
  29652. m.rexo(0, addr(v[0]), false)
  29653. m.emit(0x0f)
  29654. m.emit(0x95)
  29655. m.mrsd(0, addr(v[0]), 1)
  29656. })
  29657. }
  29658. if p.len == 0 {
  29659. panic("invalid operands for SETNZ")
  29660. }
  29661. return p
  29662. }
  29663. // SETO performs "Set byte if overflow (OF == 1)".
  29664. //
  29665. // Mnemonic : SETO
  29666. // Supported forms : (2 forms)
  29667. //
  29668. // * SETO r8
  29669. // * SETO m8
  29670. //
  29671. func (self *Program) SETO(v0 interface{}) *Instruction {
  29672. p := self.alloc("SETO", 1, Operands { v0 })
  29673. // SETO r8
  29674. if isReg8(v0) {
  29675. p.domain = DomainGeneric
  29676. p.add(0, func(m *_Encoding, v []interface{}) {
  29677. m.rexo(0, v[0], isReg8REX(v[0]))
  29678. m.emit(0x0f)
  29679. m.emit(0x90)
  29680. m.emit(0xc0 | lcode(v[0]))
  29681. })
  29682. }
  29683. // SETO m8
  29684. if isM8(v0) {
  29685. p.domain = DomainGeneric
  29686. p.add(0, func(m *_Encoding, v []interface{}) {
  29687. m.rexo(0, addr(v[0]), false)
  29688. m.emit(0x0f)
  29689. m.emit(0x90)
  29690. m.mrsd(0, addr(v[0]), 1)
  29691. })
  29692. }
  29693. if p.len == 0 {
  29694. panic("invalid operands for SETO")
  29695. }
  29696. return p
  29697. }
  29698. // SETP performs "Set byte if parity (PF == 1)".
  29699. //
  29700. // Mnemonic : SETP
  29701. // Supported forms : (2 forms)
  29702. //
  29703. // * SETP r8
  29704. // * SETP m8
  29705. //
  29706. func (self *Program) SETP(v0 interface{}) *Instruction {
  29707. p := self.alloc("SETP", 1, Operands { v0 })
  29708. // SETP r8
  29709. if isReg8(v0) {
  29710. p.domain = DomainGeneric
  29711. p.add(0, func(m *_Encoding, v []interface{}) {
  29712. m.rexo(0, v[0], isReg8REX(v[0]))
  29713. m.emit(0x0f)
  29714. m.emit(0x9a)
  29715. m.emit(0xc0 | lcode(v[0]))
  29716. })
  29717. }
  29718. // SETP m8
  29719. if isM8(v0) {
  29720. p.domain = DomainGeneric
  29721. p.add(0, func(m *_Encoding, v []interface{}) {
  29722. m.rexo(0, addr(v[0]), false)
  29723. m.emit(0x0f)
  29724. m.emit(0x9a)
  29725. m.mrsd(0, addr(v[0]), 1)
  29726. })
  29727. }
  29728. if p.len == 0 {
  29729. panic("invalid operands for SETP")
  29730. }
  29731. return p
  29732. }
  29733. // SETPE performs "Set byte if parity even (PF == 1)".
  29734. //
  29735. // Mnemonic : SETPE
  29736. // Supported forms : (2 forms)
  29737. //
  29738. // * SETPE r8
  29739. // * SETPE m8
  29740. //
  29741. func (self *Program) SETPE(v0 interface{}) *Instruction {
  29742. p := self.alloc("SETPE", 1, Operands { v0 })
  29743. // SETPE r8
  29744. if isReg8(v0) {
  29745. p.domain = DomainGeneric
  29746. p.add(0, func(m *_Encoding, v []interface{}) {
  29747. m.rexo(0, v[0], isReg8REX(v[0]))
  29748. m.emit(0x0f)
  29749. m.emit(0x9a)
  29750. m.emit(0xc0 | lcode(v[0]))
  29751. })
  29752. }
  29753. // SETPE m8
  29754. if isM8(v0) {
  29755. p.domain = DomainGeneric
  29756. p.add(0, func(m *_Encoding, v []interface{}) {
  29757. m.rexo(0, addr(v[0]), false)
  29758. m.emit(0x0f)
  29759. m.emit(0x9a)
  29760. m.mrsd(0, addr(v[0]), 1)
  29761. })
  29762. }
  29763. if p.len == 0 {
  29764. panic("invalid operands for SETPE")
  29765. }
  29766. return p
  29767. }
  29768. // SETPO performs "Set byte if parity odd (PF == 0)".
  29769. //
  29770. // Mnemonic : SETPO
  29771. // Supported forms : (2 forms)
  29772. //
  29773. // * SETPO r8
  29774. // * SETPO m8
  29775. //
  29776. func (self *Program) SETPO(v0 interface{}) *Instruction {
  29777. p := self.alloc("SETPO", 1, Operands { v0 })
  29778. // SETPO r8
  29779. if isReg8(v0) {
  29780. p.domain = DomainGeneric
  29781. p.add(0, func(m *_Encoding, v []interface{}) {
  29782. m.rexo(0, v[0], isReg8REX(v[0]))
  29783. m.emit(0x0f)
  29784. m.emit(0x9b)
  29785. m.emit(0xc0 | lcode(v[0]))
  29786. })
  29787. }
  29788. // SETPO m8
  29789. if isM8(v0) {
  29790. p.domain = DomainGeneric
  29791. p.add(0, func(m *_Encoding, v []interface{}) {
  29792. m.rexo(0, addr(v[0]), false)
  29793. m.emit(0x0f)
  29794. m.emit(0x9b)
  29795. m.mrsd(0, addr(v[0]), 1)
  29796. })
  29797. }
  29798. if p.len == 0 {
  29799. panic("invalid operands for SETPO")
  29800. }
  29801. return p
  29802. }
  29803. // SETS performs "Set byte if sign (SF == 1)".
  29804. //
  29805. // Mnemonic : SETS
  29806. // Supported forms : (2 forms)
  29807. //
  29808. // * SETS r8
  29809. // * SETS m8
  29810. //
  29811. func (self *Program) SETS(v0 interface{}) *Instruction {
  29812. p := self.alloc("SETS", 1, Operands { v0 })
  29813. // SETS r8
  29814. if isReg8(v0) {
  29815. p.domain = DomainGeneric
  29816. p.add(0, func(m *_Encoding, v []interface{}) {
  29817. m.rexo(0, v[0], isReg8REX(v[0]))
  29818. m.emit(0x0f)
  29819. m.emit(0x98)
  29820. m.emit(0xc0 | lcode(v[0]))
  29821. })
  29822. }
  29823. // SETS m8
  29824. if isM8(v0) {
  29825. p.domain = DomainGeneric
  29826. p.add(0, func(m *_Encoding, v []interface{}) {
  29827. m.rexo(0, addr(v[0]), false)
  29828. m.emit(0x0f)
  29829. m.emit(0x98)
  29830. m.mrsd(0, addr(v[0]), 1)
  29831. })
  29832. }
  29833. if p.len == 0 {
  29834. panic("invalid operands for SETS")
  29835. }
  29836. return p
  29837. }
  29838. // SETZ performs "Set byte if zero (ZF == 1)".
  29839. //
  29840. // Mnemonic : SETZ
  29841. // Supported forms : (2 forms)
  29842. //
  29843. // * SETZ r8
  29844. // * SETZ m8
  29845. //
  29846. func (self *Program) SETZ(v0 interface{}) *Instruction {
  29847. p := self.alloc("SETZ", 1, Operands { v0 })
  29848. // SETZ r8
  29849. if isReg8(v0) {
  29850. p.domain = DomainGeneric
  29851. p.add(0, func(m *_Encoding, v []interface{}) {
  29852. m.rexo(0, v[0], isReg8REX(v[0]))
  29853. m.emit(0x0f)
  29854. m.emit(0x94)
  29855. m.emit(0xc0 | lcode(v[0]))
  29856. })
  29857. }
  29858. // SETZ m8
  29859. if isM8(v0) {
  29860. p.domain = DomainGeneric
  29861. p.add(0, func(m *_Encoding, v []interface{}) {
  29862. m.rexo(0, addr(v[0]), false)
  29863. m.emit(0x0f)
  29864. m.emit(0x94)
  29865. m.mrsd(0, addr(v[0]), 1)
  29866. })
  29867. }
  29868. if p.len == 0 {
  29869. panic("invalid operands for SETZ")
  29870. }
  29871. return p
  29872. }
  29873. // SFENCE performs "Store Fence".
  29874. //
  29875. // Mnemonic : SFENCE
  29876. // Supported forms : (1 form)
  29877. //
  29878. // * SFENCE [MMX+]
  29879. //
  29880. func (self *Program) SFENCE() *Instruction {
  29881. p := self.alloc("SFENCE", 0, Operands { })
  29882. // SFENCE
  29883. self.require(ISA_MMX_PLUS)
  29884. p.domain = DomainGeneric
  29885. p.add(0, func(m *_Encoding, v []interface{}) {
  29886. m.emit(0x0f)
  29887. m.emit(0xae)
  29888. m.emit(0xf8)
  29889. })
  29890. return p
  29891. }
  29892. // SHA1MSG1 performs "Perform an Intermediate Calculation for the Next Four SHA1 Message Doublewords".
  29893. //
  29894. // Mnemonic : SHA1MSG1
  29895. // Supported forms : (2 forms)
  29896. //
  29897. // * SHA1MSG1 xmm, xmm [SHA]
  29898. // * SHA1MSG1 m128, xmm [SHA]
  29899. //
  29900. func (self *Program) SHA1MSG1(v0 interface{}, v1 interface{}) *Instruction {
  29901. p := self.alloc("SHA1MSG1", 2, Operands { v0, v1 })
  29902. // SHA1MSG1 xmm, xmm
  29903. if isXMM(v0) && isXMM(v1) {
  29904. self.require(ISA_SHA)
  29905. p.domain = DomainCrypto
  29906. p.add(0, func(m *_Encoding, v []interface{}) {
  29907. m.rexo(hcode(v[1]), v[0], false)
  29908. m.emit(0x0f)
  29909. m.emit(0x38)
  29910. m.emit(0xc9)
  29911. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  29912. })
  29913. }
  29914. // SHA1MSG1 m128, xmm
  29915. if isM128(v0) && isXMM(v1) {
  29916. self.require(ISA_SHA)
  29917. p.domain = DomainCrypto
  29918. p.add(0, func(m *_Encoding, v []interface{}) {
  29919. m.rexo(hcode(v[1]), addr(v[0]), false)
  29920. m.emit(0x0f)
  29921. m.emit(0x38)
  29922. m.emit(0xc9)
  29923. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  29924. })
  29925. }
  29926. if p.len == 0 {
  29927. panic("invalid operands for SHA1MSG1")
  29928. }
  29929. return p
  29930. }
  29931. // SHA1MSG2 performs "Perform a Final Calculation for the Next Four SHA1 Message Doublewords".
  29932. //
  29933. // Mnemonic : SHA1MSG2
  29934. // Supported forms : (2 forms)
  29935. //
  29936. // * SHA1MSG2 xmm, xmm [SHA]
  29937. // * SHA1MSG2 m128, xmm [SHA]
  29938. //
  29939. func (self *Program) SHA1MSG2(v0 interface{}, v1 interface{}) *Instruction {
  29940. p := self.alloc("SHA1MSG2", 2, Operands { v0, v1 })
  29941. // SHA1MSG2 xmm, xmm
  29942. if isXMM(v0) && isXMM(v1) {
  29943. self.require(ISA_SHA)
  29944. p.domain = DomainCrypto
  29945. p.add(0, func(m *_Encoding, v []interface{}) {
  29946. m.rexo(hcode(v[1]), v[0], false)
  29947. m.emit(0x0f)
  29948. m.emit(0x38)
  29949. m.emit(0xca)
  29950. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  29951. })
  29952. }
  29953. // SHA1MSG2 m128, xmm
  29954. if isM128(v0) && isXMM(v1) {
  29955. self.require(ISA_SHA)
  29956. p.domain = DomainCrypto
  29957. p.add(0, func(m *_Encoding, v []interface{}) {
  29958. m.rexo(hcode(v[1]), addr(v[0]), false)
  29959. m.emit(0x0f)
  29960. m.emit(0x38)
  29961. m.emit(0xca)
  29962. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  29963. })
  29964. }
  29965. if p.len == 0 {
  29966. panic("invalid operands for SHA1MSG2")
  29967. }
  29968. return p
  29969. }
  29970. // SHA1NEXTE performs "Calculate SHA1 State Variable E after Four Rounds".
  29971. //
  29972. // Mnemonic : SHA1NEXTE
  29973. // Supported forms : (2 forms)
  29974. //
  29975. // * SHA1NEXTE xmm, xmm [SHA]
  29976. // * SHA1NEXTE m128, xmm [SHA]
  29977. //
  29978. func (self *Program) SHA1NEXTE(v0 interface{}, v1 interface{}) *Instruction {
  29979. p := self.alloc("SHA1NEXTE", 2, Operands { v0, v1 })
  29980. // SHA1NEXTE xmm, xmm
  29981. if isXMM(v0) && isXMM(v1) {
  29982. self.require(ISA_SHA)
  29983. p.domain = DomainCrypto
  29984. p.add(0, func(m *_Encoding, v []interface{}) {
  29985. m.rexo(hcode(v[1]), v[0], false)
  29986. m.emit(0x0f)
  29987. m.emit(0x38)
  29988. m.emit(0xc8)
  29989. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  29990. })
  29991. }
  29992. // SHA1NEXTE m128, xmm
  29993. if isM128(v0) && isXMM(v1) {
  29994. self.require(ISA_SHA)
  29995. p.domain = DomainCrypto
  29996. p.add(0, func(m *_Encoding, v []interface{}) {
  29997. m.rexo(hcode(v[1]), addr(v[0]), false)
  29998. m.emit(0x0f)
  29999. m.emit(0x38)
  30000. m.emit(0xc8)
  30001. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  30002. })
  30003. }
  30004. if p.len == 0 {
  30005. panic("invalid operands for SHA1NEXTE")
  30006. }
  30007. return p
  30008. }
  30009. // SHA1RNDS4 performs "Perform Four Rounds of SHA1 Operation".
  30010. //
  30011. // Mnemonic : SHA1RNDS4
  30012. // Supported forms : (2 forms)
  30013. //
  30014. // * SHA1RNDS4 imm8, xmm, xmm [SHA]
  30015. // * SHA1RNDS4 imm8, m128, xmm [SHA]
  30016. //
  30017. func (self *Program) SHA1RNDS4(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  30018. p := self.alloc("SHA1RNDS4", 3, Operands { v0, v1, v2 })
  30019. // SHA1RNDS4 imm8, xmm, xmm
  30020. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  30021. self.require(ISA_SHA)
  30022. p.domain = DomainCrypto
  30023. p.add(0, func(m *_Encoding, v []interface{}) {
  30024. m.rexo(hcode(v[2]), v[1], false)
  30025. m.emit(0x0f)
  30026. m.emit(0x3a)
  30027. m.emit(0xcc)
  30028. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  30029. m.imm1(toImmAny(v[0]))
  30030. })
  30031. }
  30032. // SHA1RNDS4 imm8, m128, xmm
  30033. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  30034. self.require(ISA_SHA)
  30035. p.domain = DomainCrypto
  30036. p.add(0, func(m *_Encoding, v []interface{}) {
  30037. m.rexo(hcode(v[2]), addr(v[1]), false)
  30038. m.emit(0x0f)
  30039. m.emit(0x3a)
  30040. m.emit(0xcc)
  30041. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  30042. m.imm1(toImmAny(v[0]))
  30043. })
  30044. }
  30045. if p.len == 0 {
  30046. panic("invalid operands for SHA1RNDS4")
  30047. }
  30048. return p
  30049. }
  30050. // SHA256MSG1 performs "Perform an Intermediate Calculation for the Next Four SHA256 Message Doublewords".
  30051. //
  30052. // Mnemonic : SHA256MSG1
  30053. // Supported forms : (2 forms)
  30054. //
  30055. // * SHA256MSG1 xmm, xmm [SHA]
  30056. // * SHA256MSG1 m128, xmm [SHA]
  30057. //
  30058. func (self *Program) SHA256MSG1(v0 interface{}, v1 interface{}) *Instruction {
  30059. p := self.alloc("SHA256MSG1", 2, Operands { v0, v1 })
  30060. // SHA256MSG1 xmm, xmm
  30061. if isXMM(v0) && isXMM(v1) {
  30062. self.require(ISA_SHA)
  30063. p.domain = DomainCrypto
  30064. p.add(0, func(m *_Encoding, v []interface{}) {
  30065. m.rexo(hcode(v[1]), v[0], false)
  30066. m.emit(0x0f)
  30067. m.emit(0x38)
  30068. m.emit(0xcc)
  30069. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  30070. })
  30071. }
  30072. // SHA256MSG1 m128, xmm
  30073. if isM128(v0) && isXMM(v1) {
  30074. self.require(ISA_SHA)
  30075. p.domain = DomainCrypto
  30076. p.add(0, func(m *_Encoding, v []interface{}) {
  30077. m.rexo(hcode(v[1]), addr(v[0]), false)
  30078. m.emit(0x0f)
  30079. m.emit(0x38)
  30080. m.emit(0xcc)
  30081. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  30082. })
  30083. }
  30084. if p.len == 0 {
  30085. panic("invalid operands for SHA256MSG1")
  30086. }
  30087. return p
  30088. }
  30089. // SHA256MSG2 performs "Perform a Final Calculation for the Next Four SHA256 Message Doublewords".
  30090. //
  30091. // Mnemonic : SHA256MSG2
  30092. // Supported forms : (2 forms)
  30093. //
  30094. // * SHA256MSG2 xmm, xmm [SHA]
  30095. // * SHA256MSG2 m128, xmm [SHA]
  30096. //
  30097. func (self *Program) SHA256MSG2(v0 interface{}, v1 interface{}) *Instruction {
  30098. p := self.alloc("SHA256MSG2", 2, Operands { v0, v1 })
  30099. // SHA256MSG2 xmm, xmm
  30100. if isXMM(v0) && isXMM(v1) {
  30101. self.require(ISA_SHA)
  30102. p.domain = DomainCrypto
  30103. p.add(0, func(m *_Encoding, v []interface{}) {
  30104. m.rexo(hcode(v[1]), v[0], false)
  30105. m.emit(0x0f)
  30106. m.emit(0x38)
  30107. m.emit(0xcd)
  30108. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  30109. })
  30110. }
  30111. // SHA256MSG2 m128, xmm
  30112. if isM128(v0) && isXMM(v1) {
  30113. self.require(ISA_SHA)
  30114. p.domain = DomainCrypto
  30115. p.add(0, func(m *_Encoding, v []interface{}) {
  30116. m.rexo(hcode(v[1]), addr(v[0]), false)
  30117. m.emit(0x0f)
  30118. m.emit(0x38)
  30119. m.emit(0xcd)
  30120. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  30121. })
  30122. }
  30123. if p.len == 0 {
  30124. panic("invalid operands for SHA256MSG2")
  30125. }
  30126. return p
  30127. }
  30128. // SHA256RNDS2 performs "Perform Two Rounds of SHA256 Operation".
  30129. //
  30130. // Mnemonic : SHA256RNDS2
  30131. // Supported forms : (2 forms)
  30132. //
  30133. // * SHA256RNDS2 xmm0, xmm, xmm [SHA]
  30134. // * SHA256RNDS2 xmm0, m128, xmm [SHA]
  30135. //
  30136. func (self *Program) SHA256RNDS2(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  30137. p := self.alloc("SHA256RNDS2", 3, Operands { v0, v1, v2 })
  30138. // SHA256RNDS2 xmm0, xmm, xmm
  30139. if v0 == XMM0 && isXMM(v1) && isXMM(v2) {
  30140. self.require(ISA_SHA)
  30141. p.domain = DomainCrypto
  30142. p.add(0, func(m *_Encoding, v []interface{}) {
  30143. m.rexo(hcode(v[2]), v[1], false)
  30144. m.emit(0x0f)
  30145. m.emit(0x38)
  30146. m.emit(0xcb)
  30147. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  30148. })
  30149. }
  30150. // SHA256RNDS2 xmm0, m128, xmm
  30151. if v0 == XMM0 && isM128(v1) && isXMM(v2) {
  30152. self.require(ISA_SHA)
  30153. p.domain = DomainCrypto
  30154. p.add(0, func(m *_Encoding, v []interface{}) {
  30155. m.rexo(hcode(v[2]), addr(v[1]), false)
  30156. m.emit(0x0f)
  30157. m.emit(0x38)
  30158. m.emit(0xcb)
  30159. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  30160. })
  30161. }
  30162. if p.len == 0 {
  30163. panic("invalid operands for SHA256RNDS2")
  30164. }
  30165. return p
  30166. }
  30167. // SHLB performs "Logical Shift Left".
  30168. //
  30169. // Mnemonic : SHL
  30170. // Supported forms : (6 forms)
  30171. //
  30172. // * SHLB 1, r8
  30173. // * SHLB imm8, r8
  30174. // * SHLB cl, r8
  30175. // * SHLB 1, m8
  30176. // * SHLB imm8, m8
  30177. // * SHLB cl, m8
  30178. //
  30179. func (self *Program) SHLB(v0 interface{}, v1 interface{}) *Instruction {
  30180. p := self.alloc("SHLB", 2, Operands { v0, v1 })
  30181. // SHLB 1, r8
  30182. if isConst1(v0) && isReg8(v1) {
  30183. p.domain = DomainGeneric
  30184. p.add(0, func(m *_Encoding, v []interface{}) {
  30185. m.rexo(0, v[1], isReg8REX(v[1]))
  30186. m.emit(0xd0)
  30187. m.emit(0xe0 | lcode(v[1]))
  30188. })
  30189. }
  30190. // SHLB imm8, r8
  30191. if isImm8(v0) && isReg8(v1) {
  30192. p.domain = DomainGeneric
  30193. p.add(0, func(m *_Encoding, v []interface{}) {
  30194. m.rexo(0, v[1], isReg8REX(v[1]))
  30195. m.emit(0xc0)
  30196. m.emit(0xe0 | lcode(v[1]))
  30197. m.imm1(toImmAny(v[0]))
  30198. })
  30199. }
  30200. // SHLB cl, r8
  30201. if v0 == CL && isReg8(v1) {
  30202. p.domain = DomainGeneric
  30203. p.add(0, func(m *_Encoding, v []interface{}) {
  30204. m.rexo(0, v[1], isReg8REX(v[1]))
  30205. m.emit(0xd2)
  30206. m.emit(0xe0 | lcode(v[1]))
  30207. })
  30208. }
  30209. // SHLB 1, m8
  30210. if isConst1(v0) && isM8(v1) {
  30211. p.domain = DomainGeneric
  30212. p.add(0, func(m *_Encoding, v []interface{}) {
  30213. m.rexo(0, addr(v[1]), false)
  30214. m.emit(0xd0)
  30215. m.mrsd(4, addr(v[1]), 1)
  30216. })
  30217. }
  30218. // SHLB imm8, m8
  30219. if isImm8(v0) && isM8(v1) {
  30220. p.domain = DomainGeneric
  30221. p.add(0, func(m *_Encoding, v []interface{}) {
  30222. m.rexo(0, addr(v[1]), false)
  30223. m.emit(0xc0)
  30224. m.mrsd(4, addr(v[1]), 1)
  30225. m.imm1(toImmAny(v[0]))
  30226. })
  30227. }
  30228. // SHLB cl, m8
  30229. if v0 == CL && isM8(v1) {
  30230. p.domain = DomainGeneric
  30231. p.add(0, func(m *_Encoding, v []interface{}) {
  30232. m.rexo(0, addr(v[1]), false)
  30233. m.emit(0xd2)
  30234. m.mrsd(4, addr(v[1]), 1)
  30235. })
  30236. }
  30237. if p.len == 0 {
  30238. panic("invalid operands for SHLB")
  30239. }
  30240. return p
  30241. }
  30242. // SHLDL performs "Integer Double Precision Shift Left".
  30243. //
  30244. // Mnemonic : SHLD
  30245. // Supported forms : (4 forms)
  30246. //
  30247. // * SHLDL imm8, r32, r32
  30248. // * SHLDL cl, r32, r32
  30249. // * SHLDL imm8, r32, m32
  30250. // * SHLDL cl, r32, m32
  30251. //
  30252. func (self *Program) SHLDL(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  30253. p := self.alloc("SHLDL", 3, Operands { v0, v1, v2 })
  30254. // SHLDL imm8, r32, r32
  30255. if isImm8(v0) && isReg32(v1) && isReg32(v2) {
  30256. p.domain = DomainGeneric
  30257. p.add(0, func(m *_Encoding, v []interface{}) {
  30258. m.rexo(hcode(v[1]), v[2], false)
  30259. m.emit(0x0f)
  30260. m.emit(0xa4)
  30261. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  30262. m.imm1(toImmAny(v[0]))
  30263. })
  30264. }
  30265. // SHLDL cl, r32, r32
  30266. if v0 == CL && isReg32(v1) && isReg32(v2) {
  30267. p.domain = DomainGeneric
  30268. p.add(0, func(m *_Encoding, v []interface{}) {
  30269. m.rexo(hcode(v[1]), v[2], false)
  30270. m.emit(0x0f)
  30271. m.emit(0xa5)
  30272. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  30273. })
  30274. }
  30275. // SHLDL imm8, r32, m32
  30276. if isImm8(v0) && isReg32(v1) && isM32(v2) {
  30277. p.domain = DomainGeneric
  30278. p.add(0, func(m *_Encoding, v []interface{}) {
  30279. m.rexo(hcode(v[1]), addr(v[2]), false)
  30280. m.emit(0x0f)
  30281. m.emit(0xa4)
  30282. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  30283. m.imm1(toImmAny(v[0]))
  30284. })
  30285. }
  30286. // SHLDL cl, r32, m32
  30287. if v0 == CL && isReg32(v1) && isM32(v2) {
  30288. p.domain = DomainGeneric
  30289. p.add(0, func(m *_Encoding, v []interface{}) {
  30290. m.rexo(hcode(v[1]), addr(v[2]), false)
  30291. m.emit(0x0f)
  30292. m.emit(0xa5)
  30293. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  30294. })
  30295. }
  30296. if p.len == 0 {
  30297. panic("invalid operands for SHLDL")
  30298. }
  30299. return p
  30300. }
  30301. // SHLDQ performs "Integer Double Precision Shift Left".
  30302. //
  30303. // Mnemonic : SHLD
  30304. // Supported forms : (4 forms)
  30305. //
  30306. // * SHLDQ imm8, r64, r64
  30307. // * SHLDQ cl, r64, r64
  30308. // * SHLDQ imm8, r64, m64
  30309. // * SHLDQ cl, r64, m64
  30310. //
  30311. func (self *Program) SHLDQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  30312. p := self.alloc("SHLDQ", 3, Operands { v0, v1, v2 })
  30313. // SHLDQ imm8, r64, r64
  30314. if isImm8(v0) && isReg64(v1) && isReg64(v2) {
  30315. p.domain = DomainGeneric
  30316. p.add(0, func(m *_Encoding, v []interface{}) {
  30317. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[2]))
  30318. m.emit(0x0f)
  30319. m.emit(0xa4)
  30320. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  30321. m.imm1(toImmAny(v[0]))
  30322. })
  30323. }
  30324. // SHLDQ cl, r64, r64
  30325. if v0 == CL && isReg64(v1) && isReg64(v2) {
  30326. p.domain = DomainGeneric
  30327. p.add(0, func(m *_Encoding, v []interface{}) {
  30328. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[2]))
  30329. m.emit(0x0f)
  30330. m.emit(0xa5)
  30331. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  30332. })
  30333. }
  30334. // SHLDQ imm8, r64, m64
  30335. if isImm8(v0) && isReg64(v1) && isM64(v2) {
  30336. p.domain = DomainGeneric
  30337. p.add(0, func(m *_Encoding, v []interface{}) {
  30338. m.rexm(1, hcode(v[1]), addr(v[2]))
  30339. m.emit(0x0f)
  30340. m.emit(0xa4)
  30341. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  30342. m.imm1(toImmAny(v[0]))
  30343. })
  30344. }
  30345. // SHLDQ cl, r64, m64
  30346. if v0 == CL && isReg64(v1) && isM64(v2) {
  30347. p.domain = DomainGeneric
  30348. p.add(0, func(m *_Encoding, v []interface{}) {
  30349. m.rexm(1, hcode(v[1]), addr(v[2]))
  30350. m.emit(0x0f)
  30351. m.emit(0xa5)
  30352. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  30353. })
  30354. }
  30355. if p.len == 0 {
  30356. panic("invalid operands for SHLDQ")
  30357. }
  30358. return p
  30359. }
  30360. // SHLDW performs "Integer Double Precision Shift Left".
  30361. //
  30362. // Mnemonic : SHLD
  30363. // Supported forms : (4 forms)
  30364. //
  30365. // * SHLDW imm8, r16, r16
  30366. // * SHLDW cl, r16, r16
  30367. // * SHLDW imm8, r16, m16
  30368. // * SHLDW cl, r16, m16
  30369. //
  30370. func (self *Program) SHLDW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  30371. p := self.alloc("SHLDW", 3, Operands { v0, v1, v2 })
  30372. // SHLDW imm8, r16, r16
  30373. if isImm8(v0) && isReg16(v1) && isReg16(v2) {
  30374. p.domain = DomainGeneric
  30375. p.add(0, func(m *_Encoding, v []interface{}) {
  30376. m.emit(0x66)
  30377. m.rexo(hcode(v[1]), v[2], false)
  30378. m.emit(0x0f)
  30379. m.emit(0xa4)
  30380. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  30381. m.imm1(toImmAny(v[0]))
  30382. })
  30383. }
  30384. // SHLDW cl, r16, r16
  30385. if v0 == CL && isReg16(v1) && isReg16(v2) {
  30386. p.domain = DomainGeneric
  30387. p.add(0, func(m *_Encoding, v []interface{}) {
  30388. m.emit(0x66)
  30389. m.rexo(hcode(v[1]), v[2], false)
  30390. m.emit(0x0f)
  30391. m.emit(0xa5)
  30392. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  30393. })
  30394. }
  30395. // SHLDW imm8, r16, m16
  30396. if isImm8(v0) && isReg16(v1) && isM16(v2) {
  30397. p.domain = DomainGeneric
  30398. p.add(0, func(m *_Encoding, v []interface{}) {
  30399. m.emit(0x66)
  30400. m.rexo(hcode(v[1]), addr(v[2]), false)
  30401. m.emit(0x0f)
  30402. m.emit(0xa4)
  30403. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  30404. m.imm1(toImmAny(v[0]))
  30405. })
  30406. }
  30407. // SHLDW cl, r16, m16
  30408. if v0 == CL && isReg16(v1) && isM16(v2) {
  30409. p.domain = DomainGeneric
  30410. p.add(0, func(m *_Encoding, v []interface{}) {
  30411. m.emit(0x66)
  30412. m.rexo(hcode(v[1]), addr(v[2]), false)
  30413. m.emit(0x0f)
  30414. m.emit(0xa5)
  30415. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  30416. })
  30417. }
  30418. if p.len == 0 {
  30419. panic("invalid operands for SHLDW")
  30420. }
  30421. return p
  30422. }
  30423. // SHLL performs "Logical Shift Left".
  30424. //
  30425. // Mnemonic : SHL
  30426. // Supported forms : (6 forms)
  30427. //
  30428. // * SHLL 1, r32
  30429. // * SHLL imm8, r32
  30430. // * SHLL cl, r32
  30431. // * SHLL 1, m32
  30432. // * SHLL imm8, m32
  30433. // * SHLL cl, m32
  30434. //
  30435. func (self *Program) SHLL(v0 interface{}, v1 interface{}) *Instruction {
  30436. p := self.alloc("SHLL", 2, Operands { v0, v1 })
  30437. // SHLL 1, r32
  30438. if isConst1(v0) && isReg32(v1) {
  30439. p.domain = DomainGeneric
  30440. p.add(0, func(m *_Encoding, v []interface{}) {
  30441. m.rexo(0, v[1], false)
  30442. m.emit(0xd1)
  30443. m.emit(0xe0 | lcode(v[1]))
  30444. })
  30445. }
  30446. // SHLL imm8, r32
  30447. if isImm8(v0) && isReg32(v1) {
  30448. p.domain = DomainGeneric
  30449. p.add(0, func(m *_Encoding, v []interface{}) {
  30450. m.rexo(0, v[1], false)
  30451. m.emit(0xc1)
  30452. m.emit(0xe0 | lcode(v[1]))
  30453. m.imm1(toImmAny(v[0]))
  30454. })
  30455. }
  30456. // SHLL cl, r32
  30457. if v0 == CL && isReg32(v1) {
  30458. p.domain = DomainGeneric
  30459. p.add(0, func(m *_Encoding, v []interface{}) {
  30460. m.rexo(0, v[1], false)
  30461. m.emit(0xd3)
  30462. m.emit(0xe0 | lcode(v[1]))
  30463. })
  30464. }
  30465. // SHLL 1, m32
  30466. if isConst1(v0) && isM32(v1) {
  30467. p.domain = DomainGeneric
  30468. p.add(0, func(m *_Encoding, v []interface{}) {
  30469. m.rexo(0, addr(v[1]), false)
  30470. m.emit(0xd1)
  30471. m.mrsd(4, addr(v[1]), 1)
  30472. })
  30473. }
  30474. // SHLL imm8, m32
  30475. if isImm8(v0) && isM32(v1) {
  30476. p.domain = DomainGeneric
  30477. p.add(0, func(m *_Encoding, v []interface{}) {
  30478. m.rexo(0, addr(v[1]), false)
  30479. m.emit(0xc1)
  30480. m.mrsd(4, addr(v[1]), 1)
  30481. m.imm1(toImmAny(v[0]))
  30482. })
  30483. }
  30484. // SHLL cl, m32
  30485. if v0 == CL && isM32(v1) {
  30486. p.domain = DomainGeneric
  30487. p.add(0, func(m *_Encoding, v []interface{}) {
  30488. m.rexo(0, addr(v[1]), false)
  30489. m.emit(0xd3)
  30490. m.mrsd(4, addr(v[1]), 1)
  30491. })
  30492. }
  30493. if p.len == 0 {
  30494. panic("invalid operands for SHLL")
  30495. }
  30496. return p
  30497. }
  30498. // SHLQ performs "Logical Shift Left".
  30499. //
  30500. // Mnemonic : SHL
  30501. // Supported forms : (6 forms)
  30502. //
  30503. // * SHLQ 1, r64
  30504. // * SHLQ imm8, r64
  30505. // * SHLQ cl, r64
  30506. // * SHLQ 1, m64
  30507. // * SHLQ imm8, m64
  30508. // * SHLQ cl, m64
  30509. //
  30510. func (self *Program) SHLQ(v0 interface{}, v1 interface{}) *Instruction {
  30511. p := self.alloc("SHLQ", 2, Operands { v0, v1 })
  30512. // SHLQ 1, r64
  30513. if isConst1(v0) && isReg64(v1) {
  30514. p.domain = DomainGeneric
  30515. p.add(0, func(m *_Encoding, v []interface{}) {
  30516. m.emit(0x48 | hcode(v[1]))
  30517. m.emit(0xd1)
  30518. m.emit(0xe0 | lcode(v[1]))
  30519. })
  30520. }
  30521. // SHLQ imm8, r64
  30522. if isImm8(v0) && isReg64(v1) {
  30523. p.domain = DomainGeneric
  30524. p.add(0, func(m *_Encoding, v []interface{}) {
  30525. m.emit(0x48 | hcode(v[1]))
  30526. m.emit(0xc1)
  30527. m.emit(0xe0 | lcode(v[1]))
  30528. m.imm1(toImmAny(v[0]))
  30529. })
  30530. }
  30531. // SHLQ cl, r64
  30532. if v0 == CL && isReg64(v1) {
  30533. p.domain = DomainGeneric
  30534. p.add(0, func(m *_Encoding, v []interface{}) {
  30535. m.emit(0x48 | hcode(v[1]))
  30536. m.emit(0xd3)
  30537. m.emit(0xe0 | lcode(v[1]))
  30538. })
  30539. }
  30540. // SHLQ 1, m64
  30541. if isConst1(v0) && isM64(v1) {
  30542. p.domain = DomainGeneric
  30543. p.add(0, func(m *_Encoding, v []interface{}) {
  30544. m.rexm(1, 0, addr(v[1]))
  30545. m.emit(0xd1)
  30546. m.mrsd(4, addr(v[1]), 1)
  30547. })
  30548. }
  30549. // SHLQ imm8, m64
  30550. if isImm8(v0) && isM64(v1) {
  30551. p.domain = DomainGeneric
  30552. p.add(0, func(m *_Encoding, v []interface{}) {
  30553. m.rexm(1, 0, addr(v[1]))
  30554. m.emit(0xc1)
  30555. m.mrsd(4, addr(v[1]), 1)
  30556. m.imm1(toImmAny(v[0]))
  30557. })
  30558. }
  30559. // SHLQ cl, m64
  30560. if v0 == CL && isM64(v1) {
  30561. p.domain = DomainGeneric
  30562. p.add(0, func(m *_Encoding, v []interface{}) {
  30563. m.rexm(1, 0, addr(v[1]))
  30564. m.emit(0xd3)
  30565. m.mrsd(4, addr(v[1]), 1)
  30566. })
  30567. }
  30568. if p.len == 0 {
  30569. panic("invalid operands for SHLQ")
  30570. }
  30571. return p
  30572. }
  30573. // SHLW performs "Logical Shift Left".
  30574. //
  30575. // Mnemonic : SHL
  30576. // Supported forms : (6 forms)
  30577. //
  30578. // * SHLW 1, r16
  30579. // * SHLW imm8, r16
  30580. // * SHLW cl, r16
  30581. // * SHLW 1, m16
  30582. // * SHLW imm8, m16
  30583. // * SHLW cl, m16
  30584. //
  30585. func (self *Program) SHLW(v0 interface{}, v1 interface{}) *Instruction {
  30586. p := self.alloc("SHLW", 2, Operands { v0, v1 })
  30587. // SHLW 1, r16
  30588. if isConst1(v0) && isReg16(v1) {
  30589. p.domain = DomainGeneric
  30590. p.add(0, func(m *_Encoding, v []interface{}) {
  30591. m.emit(0x66)
  30592. m.rexo(0, v[1], false)
  30593. m.emit(0xd1)
  30594. m.emit(0xe0 | lcode(v[1]))
  30595. })
  30596. }
  30597. // SHLW imm8, r16
  30598. if isImm8(v0) && isReg16(v1) {
  30599. p.domain = DomainGeneric
  30600. p.add(0, func(m *_Encoding, v []interface{}) {
  30601. m.emit(0x66)
  30602. m.rexo(0, v[1], false)
  30603. m.emit(0xc1)
  30604. m.emit(0xe0 | lcode(v[1]))
  30605. m.imm1(toImmAny(v[0]))
  30606. })
  30607. }
  30608. // SHLW cl, r16
  30609. if v0 == CL && isReg16(v1) {
  30610. p.domain = DomainGeneric
  30611. p.add(0, func(m *_Encoding, v []interface{}) {
  30612. m.emit(0x66)
  30613. m.rexo(0, v[1], false)
  30614. m.emit(0xd3)
  30615. m.emit(0xe0 | lcode(v[1]))
  30616. })
  30617. }
  30618. // SHLW 1, m16
  30619. if isConst1(v0) && isM16(v1) {
  30620. p.domain = DomainGeneric
  30621. p.add(0, func(m *_Encoding, v []interface{}) {
  30622. m.emit(0x66)
  30623. m.rexo(0, addr(v[1]), false)
  30624. m.emit(0xd1)
  30625. m.mrsd(4, addr(v[1]), 1)
  30626. })
  30627. }
  30628. // SHLW imm8, m16
  30629. if isImm8(v0) && isM16(v1) {
  30630. p.domain = DomainGeneric
  30631. p.add(0, func(m *_Encoding, v []interface{}) {
  30632. m.emit(0x66)
  30633. m.rexo(0, addr(v[1]), false)
  30634. m.emit(0xc1)
  30635. m.mrsd(4, addr(v[1]), 1)
  30636. m.imm1(toImmAny(v[0]))
  30637. })
  30638. }
  30639. // SHLW cl, m16
  30640. if v0 == CL && isM16(v1) {
  30641. p.domain = DomainGeneric
  30642. p.add(0, func(m *_Encoding, v []interface{}) {
  30643. m.emit(0x66)
  30644. m.rexo(0, addr(v[1]), false)
  30645. m.emit(0xd3)
  30646. m.mrsd(4, addr(v[1]), 1)
  30647. })
  30648. }
  30649. if p.len == 0 {
  30650. panic("invalid operands for SHLW")
  30651. }
  30652. return p
  30653. }
  30654. // SHLXL performs "Logical Shift Left Without Affecting Flags".
  30655. //
  30656. // Mnemonic : SHLX
  30657. // Supported forms : (2 forms)
  30658. //
  30659. // * SHLXL r32, r32, r32 [BMI2]
  30660. // * SHLXL r32, m32, r32 [BMI2]
  30661. //
  30662. func (self *Program) SHLXL(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  30663. p := self.alloc("SHLXL", 3, Operands { v0, v1, v2 })
  30664. // SHLXL r32, r32, r32
  30665. if isReg32(v0) && isReg32(v1) && isReg32(v2) {
  30666. self.require(ISA_BMI2)
  30667. p.domain = DomainGeneric
  30668. p.add(0, func(m *_Encoding, v []interface{}) {
  30669. m.emit(0xc4)
  30670. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  30671. m.emit(0x79 ^ (hlcode(v[0]) << 3))
  30672. m.emit(0xf7)
  30673. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  30674. })
  30675. }
  30676. // SHLXL r32, m32, r32
  30677. if isReg32(v0) && isM32(v1) && isReg32(v2) {
  30678. self.require(ISA_BMI2)
  30679. p.domain = DomainGeneric
  30680. p.add(0, func(m *_Encoding, v []interface{}) {
  30681. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  30682. m.emit(0xf7)
  30683. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  30684. })
  30685. }
  30686. if p.len == 0 {
  30687. panic("invalid operands for SHLXL")
  30688. }
  30689. return p
  30690. }
  30691. // SHLXQ performs "Logical Shift Left Without Affecting Flags".
  30692. //
  30693. // Mnemonic : SHLX
  30694. // Supported forms : (2 forms)
  30695. //
  30696. // * SHLXQ r64, r64, r64 [BMI2]
  30697. // * SHLXQ r64, m64, r64 [BMI2]
  30698. //
  30699. func (self *Program) SHLXQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  30700. p := self.alloc("SHLXQ", 3, Operands { v0, v1, v2 })
  30701. // SHLXQ r64, r64, r64
  30702. if isReg64(v0) && isReg64(v1) && isReg64(v2) {
  30703. self.require(ISA_BMI2)
  30704. p.domain = DomainGeneric
  30705. p.add(0, func(m *_Encoding, v []interface{}) {
  30706. m.emit(0xc4)
  30707. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  30708. m.emit(0xf9 ^ (hlcode(v[0]) << 3))
  30709. m.emit(0xf7)
  30710. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  30711. })
  30712. }
  30713. // SHLXQ r64, m64, r64
  30714. if isReg64(v0) && isM64(v1) && isReg64(v2) {
  30715. self.require(ISA_BMI2)
  30716. p.domain = DomainGeneric
  30717. p.add(0, func(m *_Encoding, v []interface{}) {
  30718. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  30719. m.emit(0xf7)
  30720. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  30721. })
  30722. }
  30723. if p.len == 0 {
  30724. panic("invalid operands for SHLXQ")
  30725. }
  30726. return p
  30727. }
  30728. // SHRB performs "Logical Shift Right".
  30729. //
  30730. // Mnemonic : SHR
  30731. // Supported forms : (6 forms)
  30732. //
  30733. // * SHRB 1, r8
  30734. // * SHRB imm8, r8
  30735. // * SHRB cl, r8
  30736. // * SHRB 1, m8
  30737. // * SHRB imm8, m8
  30738. // * SHRB cl, m8
  30739. //
  30740. func (self *Program) SHRB(v0 interface{}, v1 interface{}) *Instruction {
  30741. p := self.alloc("SHRB", 2, Operands { v0, v1 })
  30742. // SHRB 1, r8
  30743. if isConst1(v0) && isReg8(v1) {
  30744. p.domain = DomainGeneric
  30745. p.add(0, func(m *_Encoding, v []interface{}) {
  30746. m.rexo(0, v[1], isReg8REX(v[1]))
  30747. m.emit(0xd0)
  30748. m.emit(0xe8 | lcode(v[1]))
  30749. })
  30750. }
  30751. // SHRB imm8, r8
  30752. if isImm8(v0) && isReg8(v1) {
  30753. p.domain = DomainGeneric
  30754. p.add(0, func(m *_Encoding, v []interface{}) {
  30755. m.rexo(0, v[1], isReg8REX(v[1]))
  30756. m.emit(0xc0)
  30757. m.emit(0xe8 | lcode(v[1]))
  30758. m.imm1(toImmAny(v[0]))
  30759. })
  30760. }
  30761. // SHRB cl, r8
  30762. if v0 == CL && isReg8(v1) {
  30763. p.domain = DomainGeneric
  30764. p.add(0, func(m *_Encoding, v []interface{}) {
  30765. m.rexo(0, v[1], isReg8REX(v[1]))
  30766. m.emit(0xd2)
  30767. m.emit(0xe8 | lcode(v[1]))
  30768. })
  30769. }
  30770. // SHRB 1, m8
  30771. if isConst1(v0) && isM8(v1) {
  30772. p.domain = DomainGeneric
  30773. p.add(0, func(m *_Encoding, v []interface{}) {
  30774. m.rexo(0, addr(v[1]), false)
  30775. m.emit(0xd0)
  30776. m.mrsd(5, addr(v[1]), 1)
  30777. })
  30778. }
  30779. // SHRB imm8, m8
  30780. if isImm8(v0) && isM8(v1) {
  30781. p.domain = DomainGeneric
  30782. p.add(0, func(m *_Encoding, v []interface{}) {
  30783. m.rexo(0, addr(v[1]), false)
  30784. m.emit(0xc0)
  30785. m.mrsd(5, addr(v[1]), 1)
  30786. m.imm1(toImmAny(v[0]))
  30787. })
  30788. }
  30789. // SHRB cl, m8
  30790. if v0 == CL && isM8(v1) {
  30791. p.domain = DomainGeneric
  30792. p.add(0, func(m *_Encoding, v []interface{}) {
  30793. m.rexo(0, addr(v[1]), false)
  30794. m.emit(0xd2)
  30795. m.mrsd(5, addr(v[1]), 1)
  30796. })
  30797. }
  30798. if p.len == 0 {
  30799. panic("invalid operands for SHRB")
  30800. }
  30801. return p
  30802. }
  30803. // SHRDL performs "Integer Double Precision Shift Right".
  30804. //
  30805. // Mnemonic : SHRD
  30806. // Supported forms : (4 forms)
  30807. //
  30808. // * SHRDL imm8, r32, r32
  30809. // * SHRDL cl, r32, r32
  30810. // * SHRDL imm8, r32, m32
  30811. // * SHRDL cl, r32, m32
  30812. //
  30813. func (self *Program) SHRDL(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  30814. p := self.alloc("SHRDL", 3, Operands { v0, v1, v2 })
  30815. // SHRDL imm8, r32, r32
  30816. if isImm8(v0) && isReg32(v1) && isReg32(v2) {
  30817. p.domain = DomainGeneric
  30818. p.add(0, func(m *_Encoding, v []interface{}) {
  30819. m.rexo(hcode(v[1]), v[2], false)
  30820. m.emit(0x0f)
  30821. m.emit(0xac)
  30822. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  30823. m.imm1(toImmAny(v[0]))
  30824. })
  30825. }
  30826. // SHRDL cl, r32, r32
  30827. if v0 == CL && isReg32(v1) && isReg32(v2) {
  30828. p.domain = DomainGeneric
  30829. p.add(0, func(m *_Encoding, v []interface{}) {
  30830. m.rexo(hcode(v[1]), v[2], false)
  30831. m.emit(0x0f)
  30832. m.emit(0xad)
  30833. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  30834. })
  30835. }
  30836. // SHRDL imm8, r32, m32
  30837. if isImm8(v0) && isReg32(v1) && isM32(v2) {
  30838. p.domain = DomainGeneric
  30839. p.add(0, func(m *_Encoding, v []interface{}) {
  30840. m.rexo(hcode(v[1]), addr(v[2]), false)
  30841. m.emit(0x0f)
  30842. m.emit(0xac)
  30843. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  30844. m.imm1(toImmAny(v[0]))
  30845. })
  30846. }
  30847. // SHRDL cl, r32, m32
  30848. if v0 == CL && isReg32(v1) && isM32(v2) {
  30849. p.domain = DomainGeneric
  30850. p.add(0, func(m *_Encoding, v []interface{}) {
  30851. m.rexo(hcode(v[1]), addr(v[2]), false)
  30852. m.emit(0x0f)
  30853. m.emit(0xad)
  30854. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  30855. })
  30856. }
  30857. if p.len == 0 {
  30858. panic("invalid operands for SHRDL")
  30859. }
  30860. return p
  30861. }
  30862. // SHRDQ performs "Integer Double Precision Shift Right".
  30863. //
  30864. // Mnemonic : SHRD
  30865. // Supported forms : (4 forms)
  30866. //
  30867. // * SHRDQ imm8, r64, r64
  30868. // * SHRDQ cl, r64, r64
  30869. // * SHRDQ imm8, r64, m64
  30870. // * SHRDQ cl, r64, m64
  30871. //
  30872. func (self *Program) SHRDQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  30873. p := self.alloc("SHRDQ", 3, Operands { v0, v1, v2 })
  30874. // SHRDQ imm8, r64, r64
  30875. if isImm8(v0) && isReg64(v1) && isReg64(v2) {
  30876. p.domain = DomainGeneric
  30877. p.add(0, func(m *_Encoding, v []interface{}) {
  30878. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[2]))
  30879. m.emit(0x0f)
  30880. m.emit(0xac)
  30881. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  30882. m.imm1(toImmAny(v[0]))
  30883. })
  30884. }
  30885. // SHRDQ cl, r64, r64
  30886. if v0 == CL && isReg64(v1) && isReg64(v2) {
  30887. p.domain = DomainGeneric
  30888. p.add(0, func(m *_Encoding, v []interface{}) {
  30889. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[2]))
  30890. m.emit(0x0f)
  30891. m.emit(0xad)
  30892. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  30893. })
  30894. }
  30895. // SHRDQ imm8, r64, m64
  30896. if isImm8(v0) && isReg64(v1) && isM64(v2) {
  30897. p.domain = DomainGeneric
  30898. p.add(0, func(m *_Encoding, v []interface{}) {
  30899. m.rexm(1, hcode(v[1]), addr(v[2]))
  30900. m.emit(0x0f)
  30901. m.emit(0xac)
  30902. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  30903. m.imm1(toImmAny(v[0]))
  30904. })
  30905. }
  30906. // SHRDQ cl, r64, m64
  30907. if v0 == CL && isReg64(v1) && isM64(v2) {
  30908. p.domain = DomainGeneric
  30909. p.add(0, func(m *_Encoding, v []interface{}) {
  30910. m.rexm(1, hcode(v[1]), addr(v[2]))
  30911. m.emit(0x0f)
  30912. m.emit(0xad)
  30913. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  30914. })
  30915. }
  30916. if p.len == 0 {
  30917. panic("invalid operands for SHRDQ")
  30918. }
  30919. return p
  30920. }
  30921. // SHRDW performs "Integer Double Precision Shift Right".
  30922. //
  30923. // Mnemonic : SHRD
  30924. // Supported forms : (4 forms)
  30925. //
  30926. // * SHRDW imm8, r16, r16
  30927. // * SHRDW cl, r16, r16
  30928. // * SHRDW imm8, r16, m16
  30929. // * SHRDW cl, r16, m16
  30930. //
  30931. func (self *Program) SHRDW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  30932. p := self.alloc("SHRDW", 3, Operands { v0, v1, v2 })
  30933. // SHRDW imm8, r16, r16
  30934. if isImm8(v0) && isReg16(v1) && isReg16(v2) {
  30935. p.domain = DomainGeneric
  30936. p.add(0, func(m *_Encoding, v []interface{}) {
  30937. m.emit(0x66)
  30938. m.rexo(hcode(v[1]), v[2], false)
  30939. m.emit(0x0f)
  30940. m.emit(0xac)
  30941. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  30942. m.imm1(toImmAny(v[0]))
  30943. })
  30944. }
  30945. // SHRDW cl, r16, r16
  30946. if v0 == CL && isReg16(v1) && isReg16(v2) {
  30947. p.domain = DomainGeneric
  30948. p.add(0, func(m *_Encoding, v []interface{}) {
  30949. m.emit(0x66)
  30950. m.rexo(hcode(v[1]), v[2], false)
  30951. m.emit(0x0f)
  30952. m.emit(0xad)
  30953. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  30954. })
  30955. }
  30956. // SHRDW imm8, r16, m16
  30957. if isImm8(v0) && isReg16(v1) && isM16(v2) {
  30958. p.domain = DomainGeneric
  30959. p.add(0, func(m *_Encoding, v []interface{}) {
  30960. m.emit(0x66)
  30961. m.rexo(hcode(v[1]), addr(v[2]), false)
  30962. m.emit(0x0f)
  30963. m.emit(0xac)
  30964. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  30965. m.imm1(toImmAny(v[0]))
  30966. })
  30967. }
  30968. // SHRDW cl, r16, m16
  30969. if v0 == CL && isReg16(v1) && isM16(v2) {
  30970. p.domain = DomainGeneric
  30971. p.add(0, func(m *_Encoding, v []interface{}) {
  30972. m.emit(0x66)
  30973. m.rexo(hcode(v[1]), addr(v[2]), false)
  30974. m.emit(0x0f)
  30975. m.emit(0xad)
  30976. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  30977. })
  30978. }
  30979. if p.len == 0 {
  30980. panic("invalid operands for SHRDW")
  30981. }
  30982. return p
  30983. }
  30984. // SHRL performs "Logical Shift Right".
  30985. //
  30986. // Mnemonic : SHR
  30987. // Supported forms : (6 forms)
  30988. //
  30989. // * SHRL 1, r32
  30990. // * SHRL imm8, r32
  30991. // * SHRL cl, r32
  30992. // * SHRL 1, m32
  30993. // * SHRL imm8, m32
  30994. // * SHRL cl, m32
  30995. //
  30996. func (self *Program) SHRL(v0 interface{}, v1 interface{}) *Instruction {
  30997. p := self.alloc("SHRL", 2, Operands { v0, v1 })
  30998. // SHRL 1, r32
  30999. if isConst1(v0) && isReg32(v1) {
  31000. p.domain = DomainGeneric
  31001. p.add(0, func(m *_Encoding, v []interface{}) {
  31002. m.rexo(0, v[1], false)
  31003. m.emit(0xd1)
  31004. m.emit(0xe8 | lcode(v[1]))
  31005. })
  31006. }
  31007. // SHRL imm8, r32
  31008. if isImm8(v0) && isReg32(v1) {
  31009. p.domain = DomainGeneric
  31010. p.add(0, func(m *_Encoding, v []interface{}) {
  31011. m.rexo(0, v[1], false)
  31012. m.emit(0xc1)
  31013. m.emit(0xe8 | lcode(v[1]))
  31014. m.imm1(toImmAny(v[0]))
  31015. })
  31016. }
  31017. // SHRL cl, r32
  31018. if v0 == CL && isReg32(v1) {
  31019. p.domain = DomainGeneric
  31020. p.add(0, func(m *_Encoding, v []interface{}) {
  31021. m.rexo(0, v[1], false)
  31022. m.emit(0xd3)
  31023. m.emit(0xe8 | lcode(v[1]))
  31024. })
  31025. }
  31026. // SHRL 1, m32
  31027. if isConst1(v0) && isM32(v1) {
  31028. p.domain = DomainGeneric
  31029. p.add(0, func(m *_Encoding, v []interface{}) {
  31030. m.rexo(0, addr(v[1]), false)
  31031. m.emit(0xd1)
  31032. m.mrsd(5, addr(v[1]), 1)
  31033. })
  31034. }
  31035. // SHRL imm8, m32
  31036. if isImm8(v0) && isM32(v1) {
  31037. p.domain = DomainGeneric
  31038. p.add(0, func(m *_Encoding, v []interface{}) {
  31039. m.rexo(0, addr(v[1]), false)
  31040. m.emit(0xc1)
  31041. m.mrsd(5, addr(v[1]), 1)
  31042. m.imm1(toImmAny(v[0]))
  31043. })
  31044. }
  31045. // SHRL cl, m32
  31046. if v0 == CL && isM32(v1) {
  31047. p.domain = DomainGeneric
  31048. p.add(0, func(m *_Encoding, v []interface{}) {
  31049. m.rexo(0, addr(v[1]), false)
  31050. m.emit(0xd3)
  31051. m.mrsd(5, addr(v[1]), 1)
  31052. })
  31053. }
  31054. if p.len == 0 {
  31055. panic("invalid operands for SHRL")
  31056. }
  31057. return p
  31058. }
  31059. // SHRQ performs "Logical Shift Right".
  31060. //
  31061. // Mnemonic : SHR
  31062. // Supported forms : (6 forms)
  31063. //
  31064. // * SHRQ 1, r64
  31065. // * SHRQ imm8, r64
  31066. // * SHRQ cl, r64
  31067. // * SHRQ 1, m64
  31068. // * SHRQ imm8, m64
  31069. // * SHRQ cl, m64
  31070. //
  31071. func (self *Program) SHRQ(v0 interface{}, v1 interface{}) *Instruction {
  31072. p := self.alloc("SHRQ", 2, Operands { v0, v1 })
  31073. // SHRQ 1, r64
  31074. if isConst1(v0) && isReg64(v1) {
  31075. p.domain = DomainGeneric
  31076. p.add(0, func(m *_Encoding, v []interface{}) {
  31077. m.emit(0x48 | hcode(v[1]))
  31078. m.emit(0xd1)
  31079. m.emit(0xe8 | lcode(v[1]))
  31080. })
  31081. }
  31082. // SHRQ imm8, r64
  31083. if isImm8(v0) && isReg64(v1) {
  31084. p.domain = DomainGeneric
  31085. p.add(0, func(m *_Encoding, v []interface{}) {
  31086. m.emit(0x48 | hcode(v[1]))
  31087. m.emit(0xc1)
  31088. m.emit(0xe8 | lcode(v[1]))
  31089. m.imm1(toImmAny(v[0]))
  31090. })
  31091. }
  31092. // SHRQ cl, r64
  31093. if v0 == CL && isReg64(v1) {
  31094. p.domain = DomainGeneric
  31095. p.add(0, func(m *_Encoding, v []interface{}) {
  31096. m.emit(0x48 | hcode(v[1]))
  31097. m.emit(0xd3)
  31098. m.emit(0xe8 | lcode(v[1]))
  31099. })
  31100. }
  31101. // SHRQ 1, m64
  31102. if isConst1(v0) && isM64(v1) {
  31103. p.domain = DomainGeneric
  31104. p.add(0, func(m *_Encoding, v []interface{}) {
  31105. m.rexm(1, 0, addr(v[1]))
  31106. m.emit(0xd1)
  31107. m.mrsd(5, addr(v[1]), 1)
  31108. })
  31109. }
  31110. // SHRQ imm8, m64
  31111. if isImm8(v0) && isM64(v1) {
  31112. p.domain = DomainGeneric
  31113. p.add(0, func(m *_Encoding, v []interface{}) {
  31114. m.rexm(1, 0, addr(v[1]))
  31115. m.emit(0xc1)
  31116. m.mrsd(5, addr(v[1]), 1)
  31117. m.imm1(toImmAny(v[0]))
  31118. })
  31119. }
  31120. // SHRQ cl, m64
  31121. if v0 == CL && isM64(v1) {
  31122. p.domain = DomainGeneric
  31123. p.add(0, func(m *_Encoding, v []interface{}) {
  31124. m.rexm(1, 0, addr(v[1]))
  31125. m.emit(0xd3)
  31126. m.mrsd(5, addr(v[1]), 1)
  31127. })
  31128. }
  31129. if p.len == 0 {
  31130. panic("invalid operands for SHRQ")
  31131. }
  31132. return p
  31133. }
  31134. // SHRW performs "Logical Shift Right".
  31135. //
  31136. // Mnemonic : SHR
  31137. // Supported forms : (6 forms)
  31138. //
  31139. // * SHRW 1, r16
  31140. // * SHRW imm8, r16
  31141. // * SHRW cl, r16
  31142. // * SHRW 1, m16
  31143. // * SHRW imm8, m16
  31144. // * SHRW cl, m16
  31145. //
  31146. func (self *Program) SHRW(v0 interface{}, v1 interface{}) *Instruction {
  31147. p := self.alloc("SHRW", 2, Operands { v0, v1 })
  31148. // SHRW 1, r16
  31149. if isConst1(v0) && isReg16(v1) {
  31150. p.domain = DomainGeneric
  31151. p.add(0, func(m *_Encoding, v []interface{}) {
  31152. m.emit(0x66)
  31153. m.rexo(0, v[1], false)
  31154. m.emit(0xd1)
  31155. m.emit(0xe8 | lcode(v[1]))
  31156. })
  31157. }
  31158. // SHRW imm8, r16
  31159. if isImm8(v0) && isReg16(v1) {
  31160. p.domain = DomainGeneric
  31161. p.add(0, func(m *_Encoding, v []interface{}) {
  31162. m.emit(0x66)
  31163. m.rexo(0, v[1], false)
  31164. m.emit(0xc1)
  31165. m.emit(0xe8 | lcode(v[1]))
  31166. m.imm1(toImmAny(v[0]))
  31167. })
  31168. }
  31169. // SHRW cl, r16
  31170. if v0 == CL && isReg16(v1) {
  31171. p.domain = DomainGeneric
  31172. p.add(0, func(m *_Encoding, v []interface{}) {
  31173. m.emit(0x66)
  31174. m.rexo(0, v[1], false)
  31175. m.emit(0xd3)
  31176. m.emit(0xe8 | lcode(v[1]))
  31177. })
  31178. }
  31179. // SHRW 1, m16
  31180. if isConst1(v0) && isM16(v1) {
  31181. p.domain = DomainGeneric
  31182. p.add(0, func(m *_Encoding, v []interface{}) {
  31183. m.emit(0x66)
  31184. m.rexo(0, addr(v[1]), false)
  31185. m.emit(0xd1)
  31186. m.mrsd(5, addr(v[1]), 1)
  31187. })
  31188. }
  31189. // SHRW imm8, m16
  31190. if isImm8(v0) && isM16(v1) {
  31191. p.domain = DomainGeneric
  31192. p.add(0, func(m *_Encoding, v []interface{}) {
  31193. m.emit(0x66)
  31194. m.rexo(0, addr(v[1]), false)
  31195. m.emit(0xc1)
  31196. m.mrsd(5, addr(v[1]), 1)
  31197. m.imm1(toImmAny(v[0]))
  31198. })
  31199. }
  31200. // SHRW cl, m16
  31201. if v0 == CL && isM16(v1) {
  31202. p.domain = DomainGeneric
  31203. p.add(0, func(m *_Encoding, v []interface{}) {
  31204. m.emit(0x66)
  31205. m.rexo(0, addr(v[1]), false)
  31206. m.emit(0xd3)
  31207. m.mrsd(5, addr(v[1]), 1)
  31208. })
  31209. }
  31210. if p.len == 0 {
  31211. panic("invalid operands for SHRW")
  31212. }
  31213. return p
  31214. }
  31215. // SHRXL performs "Logical Shift Right Without Affecting Flags".
  31216. //
  31217. // Mnemonic : SHRX
  31218. // Supported forms : (2 forms)
  31219. //
  31220. // * SHRXL r32, r32, r32 [BMI2]
  31221. // * SHRXL r32, m32, r32 [BMI2]
  31222. //
  31223. func (self *Program) SHRXL(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  31224. p := self.alloc("SHRXL", 3, Operands { v0, v1, v2 })
  31225. // SHRXL r32, r32, r32
  31226. if isReg32(v0) && isReg32(v1) && isReg32(v2) {
  31227. self.require(ISA_BMI2)
  31228. p.domain = DomainGeneric
  31229. p.add(0, func(m *_Encoding, v []interface{}) {
  31230. m.emit(0xc4)
  31231. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  31232. m.emit(0x7b ^ (hlcode(v[0]) << 3))
  31233. m.emit(0xf7)
  31234. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  31235. })
  31236. }
  31237. // SHRXL r32, m32, r32
  31238. if isReg32(v0) && isM32(v1) && isReg32(v2) {
  31239. self.require(ISA_BMI2)
  31240. p.domain = DomainGeneric
  31241. p.add(0, func(m *_Encoding, v []interface{}) {
  31242. m.vex3(0xc4, 0b10, 0x03, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  31243. m.emit(0xf7)
  31244. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  31245. })
  31246. }
  31247. if p.len == 0 {
  31248. panic("invalid operands for SHRXL")
  31249. }
  31250. return p
  31251. }
  31252. // SHRXQ performs "Logical Shift Right Without Affecting Flags".
  31253. //
  31254. // Mnemonic : SHRX
  31255. // Supported forms : (2 forms)
  31256. //
  31257. // * SHRXQ r64, r64, r64 [BMI2]
  31258. // * SHRXQ r64, m64, r64 [BMI2]
  31259. //
  31260. func (self *Program) SHRXQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  31261. p := self.alloc("SHRXQ", 3, Operands { v0, v1, v2 })
  31262. // SHRXQ r64, r64, r64
  31263. if isReg64(v0) && isReg64(v1) && isReg64(v2) {
  31264. self.require(ISA_BMI2)
  31265. p.domain = DomainGeneric
  31266. p.add(0, func(m *_Encoding, v []interface{}) {
  31267. m.emit(0xc4)
  31268. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  31269. m.emit(0xfb ^ (hlcode(v[0]) << 3))
  31270. m.emit(0xf7)
  31271. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  31272. })
  31273. }
  31274. // SHRXQ r64, m64, r64
  31275. if isReg64(v0) && isM64(v1) && isReg64(v2) {
  31276. self.require(ISA_BMI2)
  31277. p.domain = DomainGeneric
  31278. p.add(0, func(m *_Encoding, v []interface{}) {
  31279. m.vex3(0xc4, 0b10, 0x83, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  31280. m.emit(0xf7)
  31281. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  31282. })
  31283. }
  31284. if p.len == 0 {
  31285. panic("invalid operands for SHRXQ")
  31286. }
  31287. return p
  31288. }
  31289. // SHUFPD performs "Shuffle Packed Double-Precision Floating-Point Values".
  31290. //
  31291. // Mnemonic : SHUFPD
  31292. // Supported forms : (2 forms)
  31293. //
  31294. // * SHUFPD imm8, xmm, xmm [SSE2]
  31295. // * SHUFPD imm8, m128, xmm [SSE2]
  31296. //
  31297. func (self *Program) SHUFPD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  31298. p := self.alloc("SHUFPD", 3, Operands { v0, v1, v2 })
  31299. // SHUFPD imm8, xmm, xmm
  31300. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  31301. self.require(ISA_SSE2)
  31302. p.domain = DomainMMXSSE
  31303. p.add(0, func(m *_Encoding, v []interface{}) {
  31304. m.emit(0x66)
  31305. m.rexo(hcode(v[2]), v[1], false)
  31306. m.emit(0x0f)
  31307. m.emit(0xc6)
  31308. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  31309. m.imm1(toImmAny(v[0]))
  31310. })
  31311. }
  31312. // SHUFPD imm8, m128, xmm
  31313. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  31314. self.require(ISA_SSE2)
  31315. p.domain = DomainMMXSSE
  31316. p.add(0, func(m *_Encoding, v []interface{}) {
  31317. m.emit(0x66)
  31318. m.rexo(hcode(v[2]), addr(v[1]), false)
  31319. m.emit(0x0f)
  31320. m.emit(0xc6)
  31321. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  31322. m.imm1(toImmAny(v[0]))
  31323. })
  31324. }
  31325. if p.len == 0 {
  31326. panic("invalid operands for SHUFPD")
  31327. }
  31328. return p
  31329. }
  31330. // SHUFPS performs "Shuffle Packed Single-Precision Floating-Point Values".
  31331. //
  31332. // Mnemonic : SHUFPS
  31333. // Supported forms : (2 forms)
  31334. //
  31335. // * SHUFPS imm8, xmm, xmm [SSE]
  31336. // * SHUFPS imm8, m128, xmm [SSE]
  31337. //
  31338. func (self *Program) SHUFPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  31339. p := self.alloc("SHUFPS", 3, Operands { v0, v1, v2 })
  31340. // SHUFPS imm8, xmm, xmm
  31341. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  31342. self.require(ISA_SSE)
  31343. p.domain = DomainMMXSSE
  31344. p.add(0, func(m *_Encoding, v []interface{}) {
  31345. m.rexo(hcode(v[2]), v[1], false)
  31346. m.emit(0x0f)
  31347. m.emit(0xc6)
  31348. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  31349. m.imm1(toImmAny(v[0]))
  31350. })
  31351. }
  31352. // SHUFPS imm8, m128, xmm
  31353. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  31354. self.require(ISA_SSE)
  31355. p.domain = DomainMMXSSE
  31356. p.add(0, func(m *_Encoding, v []interface{}) {
  31357. m.rexo(hcode(v[2]), addr(v[1]), false)
  31358. m.emit(0x0f)
  31359. m.emit(0xc6)
  31360. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  31361. m.imm1(toImmAny(v[0]))
  31362. })
  31363. }
  31364. if p.len == 0 {
  31365. panic("invalid operands for SHUFPS")
  31366. }
  31367. return p
  31368. }
  31369. // SQRTPD performs "Compute Square Roots of Packed Double-Precision Floating-Point Values".
  31370. //
  31371. // Mnemonic : SQRTPD
  31372. // Supported forms : (2 forms)
  31373. //
  31374. // * SQRTPD xmm, xmm [SSE2]
  31375. // * SQRTPD m128, xmm [SSE2]
  31376. //
  31377. func (self *Program) SQRTPD(v0 interface{}, v1 interface{}) *Instruction {
  31378. p := self.alloc("SQRTPD", 2, Operands { v0, v1 })
  31379. // SQRTPD xmm, xmm
  31380. if isXMM(v0) && isXMM(v1) {
  31381. self.require(ISA_SSE2)
  31382. p.domain = DomainMMXSSE
  31383. p.add(0, func(m *_Encoding, v []interface{}) {
  31384. m.emit(0x66)
  31385. m.rexo(hcode(v[1]), v[0], false)
  31386. m.emit(0x0f)
  31387. m.emit(0x51)
  31388. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  31389. })
  31390. }
  31391. // SQRTPD m128, xmm
  31392. if isM128(v0) && isXMM(v1) {
  31393. self.require(ISA_SSE2)
  31394. p.domain = DomainMMXSSE
  31395. p.add(0, func(m *_Encoding, v []interface{}) {
  31396. m.emit(0x66)
  31397. m.rexo(hcode(v[1]), addr(v[0]), false)
  31398. m.emit(0x0f)
  31399. m.emit(0x51)
  31400. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  31401. })
  31402. }
  31403. if p.len == 0 {
  31404. panic("invalid operands for SQRTPD")
  31405. }
  31406. return p
  31407. }
  31408. // SQRTPS performs "Compute Square Roots of Packed Single-Precision Floating-Point Values".
  31409. //
  31410. // Mnemonic : SQRTPS
  31411. // Supported forms : (2 forms)
  31412. //
  31413. // * SQRTPS xmm, xmm [SSE]
  31414. // * SQRTPS m128, xmm [SSE]
  31415. //
  31416. func (self *Program) SQRTPS(v0 interface{}, v1 interface{}) *Instruction {
  31417. p := self.alloc("SQRTPS", 2, Operands { v0, v1 })
  31418. // SQRTPS xmm, xmm
  31419. if isXMM(v0) && isXMM(v1) {
  31420. self.require(ISA_SSE)
  31421. p.domain = DomainMMXSSE
  31422. p.add(0, func(m *_Encoding, v []interface{}) {
  31423. m.rexo(hcode(v[1]), v[0], false)
  31424. m.emit(0x0f)
  31425. m.emit(0x51)
  31426. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  31427. })
  31428. }
  31429. // SQRTPS m128, xmm
  31430. if isM128(v0) && isXMM(v1) {
  31431. self.require(ISA_SSE)
  31432. p.domain = DomainMMXSSE
  31433. p.add(0, func(m *_Encoding, v []interface{}) {
  31434. m.rexo(hcode(v[1]), addr(v[0]), false)
  31435. m.emit(0x0f)
  31436. m.emit(0x51)
  31437. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  31438. })
  31439. }
  31440. if p.len == 0 {
  31441. panic("invalid operands for SQRTPS")
  31442. }
  31443. return p
  31444. }
  31445. // SQRTSD performs "Compute Square Root of Scalar Double-Precision Floating-Point Value".
  31446. //
  31447. // Mnemonic : SQRTSD
  31448. // Supported forms : (2 forms)
  31449. //
  31450. // * SQRTSD xmm, xmm [SSE2]
  31451. // * SQRTSD m64, xmm [SSE2]
  31452. //
  31453. func (self *Program) SQRTSD(v0 interface{}, v1 interface{}) *Instruction {
  31454. p := self.alloc("SQRTSD", 2, Operands { v0, v1 })
  31455. // SQRTSD xmm, xmm
  31456. if isXMM(v0) && isXMM(v1) {
  31457. self.require(ISA_SSE2)
  31458. p.domain = DomainMMXSSE
  31459. p.add(0, func(m *_Encoding, v []interface{}) {
  31460. m.emit(0xf2)
  31461. m.rexo(hcode(v[1]), v[0], false)
  31462. m.emit(0x0f)
  31463. m.emit(0x51)
  31464. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  31465. })
  31466. }
  31467. // SQRTSD m64, xmm
  31468. if isM64(v0) && isXMM(v1) {
  31469. self.require(ISA_SSE2)
  31470. p.domain = DomainMMXSSE
  31471. p.add(0, func(m *_Encoding, v []interface{}) {
  31472. m.emit(0xf2)
  31473. m.rexo(hcode(v[1]), addr(v[0]), false)
  31474. m.emit(0x0f)
  31475. m.emit(0x51)
  31476. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  31477. })
  31478. }
  31479. if p.len == 0 {
  31480. panic("invalid operands for SQRTSD")
  31481. }
  31482. return p
  31483. }
  31484. // SQRTSS performs "Compute Square Root of Scalar Single-Precision Floating-Point Value".
  31485. //
  31486. // Mnemonic : SQRTSS
  31487. // Supported forms : (2 forms)
  31488. //
  31489. // * SQRTSS xmm, xmm [SSE]
  31490. // * SQRTSS m32, xmm [SSE]
  31491. //
  31492. func (self *Program) SQRTSS(v0 interface{}, v1 interface{}) *Instruction {
  31493. p := self.alloc("SQRTSS", 2, Operands { v0, v1 })
  31494. // SQRTSS xmm, xmm
  31495. if isXMM(v0) && isXMM(v1) {
  31496. self.require(ISA_SSE)
  31497. p.domain = DomainMMXSSE
  31498. p.add(0, func(m *_Encoding, v []interface{}) {
  31499. m.emit(0xf3)
  31500. m.rexo(hcode(v[1]), v[0], false)
  31501. m.emit(0x0f)
  31502. m.emit(0x51)
  31503. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  31504. })
  31505. }
  31506. // SQRTSS m32, xmm
  31507. if isM32(v0) && isXMM(v1) {
  31508. self.require(ISA_SSE)
  31509. p.domain = DomainMMXSSE
  31510. p.add(0, func(m *_Encoding, v []interface{}) {
  31511. m.emit(0xf3)
  31512. m.rexo(hcode(v[1]), addr(v[0]), false)
  31513. m.emit(0x0f)
  31514. m.emit(0x51)
  31515. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  31516. })
  31517. }
  31518. if p.len == 0 {
  31519. panic("invalid operands for SQRTSS")
  31520. }
  31521. return p
  31522. }
  31523. // STC performs "Set Carry Flag".
  31524. //
  31525. // Mnemonic : STC
  31526. // Supported forms : (1 form)
  31527. //
  31528. // * STC
  31529. //
  31530. func (self *Program) STC() *Instruction {
  31531. p := self.alloc("STC", 0, Operands { })
  31532. // STC
  31533. p.domain = DomainGeneric
  31534. p.add(0, func(m *_Encoding, v []interface{}) {
  31535. m.emit(0xf9)
  31536. })
  31537. return p
  31538. }
  31539. // STD performs "Set Direction Flag".
  31540. //
  31541. // Mnemonic : STD
  31542. // Supported forms : (1 form)
  31543. //
  31544. // * STD
  31545. //
  31546. func (self *Program) STD() *Instruction {
  31547. p := self.alloc("STD", 0, Operands { })
  31548. // STD
  31549. p.domain = DomainGeneric
  31550. p.add(0, func(m *_Encoding, v []interface{}) {
  31551. m.emit(0xfd)
  31552. })
  31553. return p
  31554. }
  31555. // STMXCSR performs "Store MXCSR Register State".
  31556. //
  31557. // Mnemonic : STMXCSR
  31558. // Supported forms : (1 form)
  31559. //
  31560. // * STMXCSR m32 [SSE]
  31561. //
  31562. func (self *Program) STMXCSR(v0 interface{}) *Instruction {
  31563. p := self.alloc("STMXCSR", 1, Operands { v0 })
  31564. // STMXCSR m32
  31565. if isM32(v0) {
  31566. self.require(ISA_SSE)
  31567. p.domain = DomainMMXSSE
  31568. p.add(0, func(m *_Encoding, v []interface{}) {
  31569. m.rexo(0, addr(v[0]), false)
  31570. m.emit(0x0f)
  31571. m.emit(0xae)
  31572. m.mrsd(3, addr(v[0]), 1)
  31573. })
  31574. }
  31575. if p.len == 0 {
  31576. panic("invalid operands for STMXCSR")
  31577. }
  31578. return p
  31579. }
  31580. // SUBB performs "Subtract".
  31581. //
  31582. // Mnemonic : SUB
  31583. // Supported forms : (6 forms)
  31584. //
  31585. // * SUBB imm8, al
  31586. // * SUBB imm8, r8
  31587. // * SUBB r8, r8
  31588. // * SUBB m8, r8
  31589. // * SUBB imm8, m8
  31590. // * SUBB r8, m8
  31591. //
  31592. func (self *Program) SUBB(v0 interface{}, v1 interface{}) *Instruction {
  31593. p := self.alloc("SUBB", 2, Operands { v0, v1 })
  31594. // SUBB imm8, al
  31595. if isImm8(v0) && v1 == AL {
  31596. p.domain = DomainGeneric
  31597. p.add(0, func(m *_Encoding, v []interface{}) {
  31598. m.emit(0x2c)
  31599. m.imm1(toImmAny(v[0]))
  31600. })
  31601. }
  31602. // SUBB imm8, r8
  31603. if isImm8(v0) && isReg8(v1) {
  31604. p.domain = DomainGeneric
  31605. p.add(0, func(m *_Encoding, v []interface{}) {
  31606. m.rexo(0, v[1], isReg8REX(v[1]))
  31607. m.emit(0x80)
  31608. m.emit(0xe8 | lcode(v[1]))
  31609. m.imm1(toImmAny(v[0]))
  31610. })
  31611. }
  31612. // SUBB r8, r8
  31613. if isReg8(v0) && isReg8(v1) {
  31614. p.domain = DomainGeneric
  31615. p.add(0, func(m *_Encoding, v []interface{}) {
  31616. m.rexo(hcode(v[0]), v[1], isReg8REX(v[0]) || isReg8REX(v[1]))
  31617. m.emit(0x28)
  31618. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  31619. })
  31620. p.add(0, func(m *_Encoding, v []interface{}) {
  31621. m.rexo(hcode(v[1]), v[0], isReg8REX(v[0]) || isReg8REX(v[1]))
  31622. m.emit(0x2a)
  31623. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  31624. })
  31625. }
  31626. // SUBB m8, r8
  31627. if isM8(v0) && isReg8(v1) {
  31628. p.domain = DomainGeneric
  31629. p.add(0, func(m *_Encoding, v []interface{}) {
  31630. m.rexo(hcode(v[1]), addr(v[0]), isReg8REX(v[1]))
  31631. m.emit(0x2a)
  31632. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  31633. })
  31634. }
  31635. // SUBB imm8, m8
  31636. if isImm8(v0) && isM8(v1) {
  31637. p.domain = DomainGeneric
  31638. p.add(0, func(m *_Encoding, v []interface{}) {
  31639. m.rexo(0, addr(v[1]), false)
  31640. m.emit(0x80)
  31641. m.mrsd(5, addr(v[1]), 1)
  31642. m.imm1(toImmAny(v[0]))
  31643. })
  31644. }
  31645. // SUBB r8, m8
  31646. if isReg8(v0) && isM8(v1) {
  31647. p.domain = DomainGeneric
  31648. p.add(0, func(m *_Encoding, v []interface{}) {
  31649. m.rexo(hcode(v[0]), addr(v[1]), isReg8REX(v[0]))
  31650. m.emit(0x28)
  31651. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  31652. })
  31653. }
  31654. if p.len == 0 {
  31655. panic("invalid operands for SUBB")
  31656. }
  31657. return p
  31658. }
  31659. // SUBL performs "Subtract".
  31660. //
  31661. // Mnemonic : SUB
  31662. // Supported forms : (8 forms)
  31663. //
  31664. // * SUBL imm32, eax
  31665. // * SUBL imm8, r32
  31666. // * SUBL imm32, r32
  31667. // * SUBL r32, r32
  31668. // * SUBL m32, r32
  31669. // * SUBL imm8, m32
  31670. // * SUBL imm32, m32
  31671. // * SUBL r32, m32
  31672. //
  31673. func (self *Program) SUBL(v0 interface{}, v1 interface{}) *Instruction {
  31674. p := self.alloc("SUBL", 2, Operands { v0, v1 })
  31675. // SUBL imm32, eax
  31676. if isImm32(v0) && v1 == EAX {
  31677. p.domain = DomainGeneric
  31678. p.add(0, func(m *_Encoding, v []interface{}) {
  31679. m.emit(0x2d)
  31680. m.imm4(toImmAny(v[0]))
  31681. })
  31682. }
  31683. // SUBL imm8, r32
  31684. if isImm8Ext(v0, 4) && isReg32(v1) {
  31685. p.domain = DomainGeneric
  31686. p.add(0, func(m *_Encoding, v []interface{}) {
  31687. m.rexo(0, v[1], false)
  31688. m.emit(0x83)
  31689. m.emit(0xe8 | lcode(v[1]))
  31690. m.imm1(toImmAny(v[0]))
  31691. })
  31692. }
  31693. // SUBL imm32, r32
  31694. if isImm32(v0) && isReg32(v1) {
  31695. p.domain = DomainGeneric
  31696. p.add(0, func(m *_Encoding, v []interface{}) {
  31697. m.rexo(0, v[1], false)
  31698. m.emit(0x81)
  31699. m.emit(0xe8 | lcode(v[1]))
  31700. m.imm4(toImmAny(v[0]))
  31701. })
  31702. }
  31703. // SUBL r32, r32
  31704. if isReg32(v0) && isReg32(v1) {
  31705. p.domain = DomainGeneric
  31706. p.add(0, func(m *_Encoding, v []interface{}) {
  31707. m.rexo(hcode(v[0]), v[1], false)
  31708. m.emit(0x29)
  31709. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  31710. })
  31711. p.add(0, func(m *_Encoding, v []interface{}) {
  31712. m.rexo(hcode(v[1]), v[0], false)
  31713. m.emit(0x2b)
  31714. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  31715. })
  31716. }
  31717. // SUBL m32, r32
  31718. if isM32(v0) && isReg32(v1) {
  31719. p.domain = DomainGeneric
  31720. p.add(0, func(m *_Encoding, v []interface{}) {
  31721. m.rexo(hcode(v[1]), addr(v[0]), false)
  31722. m.emit(0x2b)
  31723. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  31724. })
  31725. }
  31726. // SUBL imm8, m32
  31727. if isImm8Ext(v0, 4) && isM32(v1) {
  31728. p.domain = DomainGeneric
  31729. p.add(0, func(m *_Encoding, v []interface{}) {
  31730. m.rexo(0, addr(v[1]), false)
  31731. m.emit(0x83)
  31732. m.mrsd(5, addr(v[1]), 1)
  31733. m.imm1(toImmAny(v[0]))
  31734. })
  31735. }
  31736. // SUBL imm32, m32
  31737. if isImm32(v0) && isM32(v1) {
  31738. p.domain = DomainGeneric
  31739. p.add(0, func(m *_Encoding, v []interface{}) {
  31740. m.rexo(0, addr(v[1]), false)
  31741. m.emit(0x81)
  31742. m.mrsd(5, addr(v[1]), 1)
  31743. m.imm4(toImmAny(v[0]))
  31744. })
  31745. }
  31746. // SUBL r32, m32
  31747. if isReg32(v0) && isM32(v1) {
  31748. p.domain = DomainGeneric
  31749. p.add(0, func(m *_Encoding, v []interface{}) {
  31750. m.rexo(hcode(v[0]), addr(v[1]), false)
  31751. m.emit(0x29)
  31752. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  31753. })
  31754. }
  31755. if p.len == 0 {
  31756. panic("invalid operands for SUBL")
  31757. }
  31758. return p
  31759. }
  31760. // SUBPD performs "Subtract Packed Double-Precision Floating-Point Values".
  31761. //
  31762. // Mnemonic : SUBPD
  31763. // Supported forms : (2 forms)
  31764. //
  31765. // * SUBPD xmm, xmm [SSE2]
  31766. // * SUBPD m128, xmm [SSE2]
  31767. //
  31768. func (self *Program) SUBPD(v0 interface{}, v1 interface{}) *Instruction {
  31769. p := self.alloc("SUBPD", 2, Operands { v0, v1 })
  31770. // SUBPD xmm, xmm
  31771. if isXMM(v0) && isXMM(v1) {
  31772. self.require(ISA_SSE2)
  31773. p.domain = DomainMMXSSE
  31774. p.add(0, func(m *_Encoding, v []interface{}) {
  31775. m.emit(0x66)
  31776. m.rexo(hcode(v[1]), v[0], false)
  31777. m.emit(0x0f)
  31778. m.emit(0x5c)
  31779. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  31780. })
  31781. }
  31782. // SUBPD m128, xmm
  31783. if isM128(v0) && isXMM(v1) {
  31784. self.require(ISA_SSE2)
  31785. p.domain = DomainMMXSSE
  31786. p.add(0, func(m *_Encoding, v []interface{}) {
  31787. m.emit(0x66)
  31788. m.rexo(hcode(v[1]), addr(v[0]), false)
  31789. m.emit(0x0f)
  31790. m.emit(0x5c)
  31791. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  31792. })
  31793. }
  31794. if p.len == 0 {
  31795. panic("invalid operands for SUBPD")
  31796. }
  31797. return p
  31798. }
  31799. // SUBPS performs "Subtract Packed Single-Precision Floating-Point Values".
  31800. //
  31801. // Mnemonic : SUBPS
  31802. // Supported forms : (2 forms)
  31803. //
  31804. // * SUBPS xmm, xmm [SSE]
  31805. // * SUBPS m128, xmm [SSE]
  31806. //
  31807. func (self *Program) SUBPS(v0 interface{}, v1 interface{}) *Instruction {
  31808. p := self.alloc("SUBPS", 2, Operands { v0, v1 })
  31809. // SUBPS xmm, xmm
  31810. if isXMM(v0) && isXMM(v1) {
  31811. self.require(ISA_SSE)
  31812. p.domain = DomainMMXSSE
  31813. p.add(0, func(m *_Encoding, v []interface{}) {
  31814. m.rexo(hcode(v[1]), v[0], false)
  31815. m.emit(0x0f)
  31816. m.emit(0x5c)
  31817. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  31818. })
  31819. }
  31820. // SUBPS m128, xmm
  31821. if isM128(v0) && isXMM(v1) {
  31822. self.require(ISA_SSE)
  31823. p.domain = DomainMMXSSE
  31824. p.add(0, func(m *_Encoding, v []interface{}) {
  31825. m.rexo(hcode(v[1]), addr(v[0]), false)
  31826. m.emit(0x0f)
  31827. m.emit(0x5c)
  31828. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  31829. })
  31830. }
  31831. if p.len == 0 {
  31832. panic("invalid operands for SUBPS")
  31833. }
  31834. return p
  31835. }
  31836. // SUBQ performs "Subtract".
  31837. //
  31838. // Mnemonic : SUB
  31839. // Supported forms : (8 forms)
  31840. //
  31841. // * SUBQ imm32, rax
  31842. // * SUBQ imm8, r64
  31843. // * SUBQ imm32, r64
  31844. // * SUBQ r64, r64
  31845. // * SUBQ m64, r64
  31846. // * SUBQ imm8, m64
  31847. // * SUBQ imm32, m64
  31848. // * SUBQ r64, m64
  31849. //
  31850. func (self *Program) SUBQ(v0 interface{}, v1 interface{}) *Instruction {
  31851. p := self.alloc("SUBQ", 2, Operands { v0, v1 })
  31852. // SUBQ imm32, rax
  31853. if isImm32(v0) && v1 == RAX {
  31854. p.domain = DomainGeneric
  31855. p.add(0, func(m *_Encoding, v []interface{}) {
  31856. m.emit(0x48)
  31857. m.emit(0x2d)
  31858. m.imm4(toImmAny(v[0]))
  31859. })
  31860. }
  31861. // SUBQ imm8, r64
  31862. if isImm8Ext(v0, 8) && isReg64(v1) {
  31863. p.domain = DomainGeneric
  31864. p.add(0, func(m *_Encoding, v []interface{}) {
  31865. m.emit(0x48 | hcode(v[1]))
  31866. m.emit(0x83)
  31867. m.emit(0xe8 | lcode(v[1]))
  31868. m.imm1(toImmAny(v[0]))
  31869. })
  31870. }
  31871. // SUBQ imm32, r64
  31872. if isImm32Ext(v0, 8) && isReg64(v1) {
  31873. p.domain = DomainGeneric
  31874. p.add(0, func(m *_Encoding, v []interface{}) {
  31875. m.emit(0x48 | hcode(v[1]))
  31876. m.emit(0x81)
  31877. m.emit(0xe8 | lcode(v[1]))
  31878. m.imm4(toImmAny(v[0]))
  31879. })
  31880. }
  31881. // SUBQ r64, r64
  31882. if isReg64(v0) && isReg64(v1) {
  31883. p.domain = DomainGeneric
  31884. p.add(0, func(m *_Encoding, v []interface{}) {
  31885. m.emit(0x48 | hcode(v[0]) << 2 | hcode(v[1]))
  31886. m.emit(0x29)
  31887. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  31888. })
  31889. p.add(0, func(m *_Encoding, v []interface{}) {
  31890. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  31891. m.emit(0x2b)
  31892. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  31893. })
  31894. }
  31895. // SUBQ m64, r64
  31896. if isM64(v0) && isReg64(v1) {
  31897. p.domain = DomainGeneric
  31898. p.add(0, func(m *_Encoding, v []interface{}) {
  31899. m.rexm(1, hcode(v[1]), addr(v[0]))
  31900. m.emit(0x2b)
  31901. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  31902. })
  31903. }
  31904. // SUBQ imm8, m64
  31905. if isImm8Ext(v0, 8) && isM64(v1) {
  31906. p.domain = DomainGeneric
  31907. p.add(0, func(m *_Encoding, v []interface{}) {
  31908. m.rexm(1, 0, addr(v[1]))
  31909. m.emit(0x83)
  31910. m.mrsd(5, addr(v[1]), 1)
  31911. m.imm1(toImmAny(v[0]))
  31912. })
  31913. }
  31914. // SUBQ imm32, m64
  31915. if isImm32Ext(v0, 8) && isM64(v1) {
  31916. p.domain = DomainGeneric
  31917. p.add(0, func(m *_Encoding, v []interface{}) {
  31918. m.rexm(1, 0, addr(v[1]))
  31919. m.emit(0x81)
  31920. m.mrsd(5, addr(v[1]), 1)
  31921. m.imm4(toImmAny(v[0]))
  31922. })
  31923. }
  31924. // SUBQ r64, m64
  31925. if isReg64(v0) && isM64(v1) {
  31926. p.domain = DomainGeneric
  31927. p.add(0, func(m *_Encoding, v []interface{}) {
  31928. m.rexm(1, hcode(v[0]), addr(v[1]))
  31929. m.emit(0x29)
  31930. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  31931. })
  31932. }
  31933. if p.len == 0 {
  31934. panic("invalid operands for SUBQ")
  31935. }
  31936. return p
  31937. }
  31938. // SUBSD performs "Subtract Scalar Double-Precision Floating-Point Values".
  31939. //
  31940. // Mnemonic : SUBSD
  31941. // Supported forms : (2 forms)
  31942. //
  31943. // * SUBSD xmm, xmm [SSE2]
  31944. // * SUBSD m64, xmm [SSE2]
  31945. //
  31946. func (self *Program) SUBSD(v0 interface{}, v1 interface{}) *Instruction {
  31947. p := self.alloc("SUBSD", 2, Operands { v0, v1 })
  31948. // SUBSD xmm, xmm
  31949. if isXMM(v0) && isXMM(v1) {
  31950. self.require(ISA_SSE2)
  31951. p.domain = DomainMMXSSE
  31952. p.add(0, func(m *_Encoding, v []interface{}) {
  31953. m.emit(0xf2)
  31954. m.rexo(hcode(v[1]), v[0], false)
  31955. m.emit(0x0f)
  31956. m.emit(0x5c)
  31957. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  31958. })
  31959. }
  31960. // SUBSD m64, xmm
  31961. if isM64(v0) && isXMM(v1) {
  31962. self.require(ISA_SSE2)
  31963. p.domain = DomainMMXSSE
  31964. p.add(0, func(m *_Encoding, v []interface{}) {
  31965. m.emit(0xf2)
  31966. m.rexo(hcode(v[1]), addr(v[0]), false)
  31967. m.emit(0x0f)
  31968. m.emit(0x5c)
  31969. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  31970. })
  31971. }
  31972. if p.len == 0 {
  31973. panic("invalid operands for SUBSD")
  31974. }
  31975. return p
  31976. }
  31977. // SUBSS performs "Subtract Scalar Single-Precision Floating-Point Values".
  31978. //
  31979. // Mnemonic : SUBSS
  31980. // Supported forms : (2 forms)
  31981. //
  31982. // * SUBSS xmm, xmm [SSE]
  31983. // * SUBSS m32, xmm [SSE]
  31984. //
  31985. func (self *Program) SUBSS(v0 interface{}, v1 interface{}) *Instruction {
  31986. p := self.alloc("SUBSS", 2, Operands { v0, v1 })
  31987. // SUBSS xmm, xmm
  31988. if isXMM(v0) && isXMM(v1) {
  31989. self.require(ISA_SSE)
  31990. p.domain = DomainMMXSSE
  31991. p.add(0, func(m *_Encoding, v []interface{}) {
  31992. m.emit(0xf3)
  31993. m.rexo(hcode(v[1]), v[0], false)
  31994. m.emit(0x0f)
  31995. m.emit(0x5c)
  31996. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  31997. })
  31998. }
  31999. // SUBSS m32, xmm
  32000. if isM32(v0) && isXMM(v1) {
  32001. self.require(ISA_SSE)
  32002. p.domain = DomainMMXSSE
  32003. p.add(0, func(m *_Encoding, v []interface{}) {
  32004. m.emit(0xf3)
  32005. m.rexo(hcode(v[1]), addr(v[0]), false)
  32006. m.emit(0x0f)
  32007. m.emit(0x5c)
  32008. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  32009. })
  32010. }
  32011. if p.len == 0 {
  32012. panic("invalid operands for SUBSS")
  32013. }
  32014. return p
  32015. }
  32016. // SUBW performs "Subtract".
  32017. //
  32018. // Mnemonic : SUB
  32019. // Supported forms : (8 forms)
  32020. //
  32021. // * SUBW imm16, ax
  32022. // * SUBW imm8, r16
  32023. // * SUBW imm16, r16
  32024. // * SUBW r16, r16
  32025. // * SUBW m16, r16
  32026. // * SUBW imm8, m16
  32027. // * SUBW imm16, m16
  32028. // * SUBW r16, m16
  32029. //
  32030. func (self *Program) SUBW(v0 interface{}, v1 interface{}) *Instruction {
  32031. p := self.alloc("SUBW", 2, Operands { v0, v1 })
  32032. // SUBW imm16, ax
  32033. if isImm16(v0) && v1 == AX {
  32034. p.domain = DomainGeneric
  32035. p.add(0, func(m *_Encoding, v []interface{}) {
  32036. m.emit(0x66)
  32037. m.emit(0x2d)
  32038. m.imm2(toImmAny(v[0]))
  32039. })
  32040. }
  32041. // SUBW imm8, r16
  32042. if isImm8Ext(v0, 2) && isReg16(v1) {
  32043. p.domain = DomainGeneric
  32044. p.add(0, func(m *_Encoding, v []interface{}) {
  32045. m.emit(0x66)
  32046. m.rexo(0, v[1], false)
  32047. m.emit(0x83)
  32048. m.emit(0xe8 | lcode(v[1]))
  32049. m.imm1(toImmAny(v[0]))
  32050. })
  32051. }
  32052. // SUBW imm16, r16
  32053. if isImm16(v0) && isReg16(v1) {
  32054. p.domain = DomainGeneric
  32055. p.add(0, func(m *_Encoding, v []interface{}) {
  32056. m.emit(0x66)
  32057. m.rexo(0, v[1], false)
  32058. m.emit(0x81)
  32059. m.emit(0xe8 | lcode(v[1]))
  32060. m.imm2(toImmAny(v[0]))
  32061. })
  32062. }
  32063. // SUBW r16, r16
  32064. if isReg16(v0) && isReg16(v1) {
  32065. p.domain = DomainGeneric
  32066. p.add(0, func(m *_Encoding, v []interface{}) {
  32067. m.emit(0x66)
  32068. m.rexo(hcode(v[0]), v[1], false)
  32069. m.emit(0x29)
  32070. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  32071. })
  32072. p.add(0, func(m *_Encoding, v []interface{}) {
  32073. m.emit(0x66)
  32074. m.rexo(hcode(v[1]), v[0], false)
  32075. m.emit(0x2b)
  32076. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  32077. })
  32078. }
  32079. // SUBW m16, r16
  32080. if isM16(v0) && isReg16(v1) {
  32081. p.domain = DomainGeneric
  32082. p.add(0, func(m *_Encoding, v []interface{}) {
  32083. m.emit(0x66)
  32084. m.rexo(hcode(v[1]), addr(v[0]), false)
  32085. m.emit(0x2b)
  32086. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  32087. })
  32088. }
  32089. // SUBW imm8, m16
  32090. if isImm8Ext(v0, 2) && isM16(v1) {
  32091. p.domain = DomainGeneric
  32092. p.add(0, func(m *_Encoding, v []interface{}) {
  32093. m.emit(0x66)
  32094. m.rexo(0, addr(v[1]), false)
  32095. m.emit(0x83)
  32096. m.mrsd(5, addr(v[1]), 1)
  32097. m.imm1(toImmAny(v[0]))
  32098. })
  32099. }
  32100. // SUBW imm16, m16
  32101. if isImm16(v0) && isM16(v1) {
  32102. p.domain = DomainGeneric
  32103. p.add(0, func(m *_Encoding, v []interface{}) {
  32104. m.emit(0x66)
  32105. m.rexo(0, addr(v[1]), false)
  32106. m.emit(0x81)
  32107. m.mrsd(5, addr(v[1]), 1)
  32108. m.imm2(toImmAny(v[0]))
  32109. })
  32110. }
  32111. // SUBW r16, m16
  32112. if isReg16(v0) && isM16(v1) {
  32113. p.domain = DomainGeneric
  32114. p.add(0, func(m *_Encoding, v []interface{}) {
  32115. m.emit(0x66)
  32116. m.rexo(hcode(v[0]), addr(v[1]), false)
  32117. m.emit(0x29)
  32118. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  32119. })
  32120. }
  32121. if p.len == 0 {
  32122. panic("invalid operands for SUBW")
  32123. }
  32124. return p
  32125. }
  32126. // SYSCALL performs "Fast System Call".
  32127. //
  32128. // Mnemonic : SYSCALL
  32129. // Supported forms : (1 form)
  32130. //
  32131. // * SYSCALL
  32132. //
  32133. func (self *Program) SYSCALL() *Instruction {
  32134. p := self.alloc("SYSCALL", 0, Operands { })
  32135. // SYSCALL
  32136. p.domain = DomainGeneric
  32137. p.add(0, func(m *_Encoding, v []interface{}) {
  32138. m.emit(0x0f)
  32139. m.emit(0x05)
  32140. })
  32141. return p
  32142. }
  32143. // T1MSKC performs "Inverse Mask From Trailing Ones".
  32144. //
  32145. // Mnemonic : T1MSKC
  32146. // Supported forms : (4 forms)
  32147. //
  32148. // * T1MSKC r32, r32 [TBM]
  32149. // * T1MSKC m32, r32 [TBM]
  32150. // * T1MSKC r64, r64 [TBM]
  32151. // * T1MSKC m64, r64 [TBM]
  32152. //
  32153. func (self *Program) T1MSKC(v0 interface{}, v1 interface{}) *Instruction {
  32154. p := self.alloc("T1MSKC", 2, Operands { v0, v1 })
  32155. // T1MSKC r32, r32
  32156. if isReg32(v0) && isReg32(v1) {
  32157. self.require(ISA_TBM)
  32158. p.domain = DomainGeneric
  32159. p.add(0, func(m *_Encoding, v []interface{}) {
  32160. m.emit(0x8f)
  32161. m.emit(0xe9 ^ (hcode(v[0]) << 5))
  32162. m.emit(0x78 ^ (hlcode(v[1]) << 3))
  32163. m.emit(0x01)
  32164. m.emit(0xf8 | lcode(v[0]))
  32165. })
  32166. }
  32167. // T1MSKC m32, r32
  32168. if isM32(v0) && isReg32(v1) {
  32169. self.require(ISA_TBM)
  32170. p.domain = DomainGeneric
  32171. p.add(0, func(m *_Encoding, v []interface{}) {
  32172. m.vex3(0x8f, 0b1001, 0x00, 0, addr(v[0]), hlcode(v[1]))
  32173. m.emit(0x01)
  32174. m.mrsd(7, addr(v[0]), 1)
  32175. })
  32176. }
  32177. // T1MSKC r64, r64
  32178. if isReg64(v0) && isReg64(v1) {
  32179. self.require(ISA_TBM)
  32180. p.domain = DomainGeneric
  32181. p.add(0, func(m *_Encoding, v []interface{}) {
  32182. m.emit(0x8f)
  32183. m.emit(0xe9 ^ (hcode(v[0]) << 5))
  32184. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  32185. m.emit(0x01)
  32186. m.emit(0xf8 | lcode(v[0]))
  32187. })
  32188. }
  32189. // T1MSKC m64, r64
  32190. if isM64(v0) && isReg64(v1) {
  32191. self.require(ISA_TBM)
  32192. p.domain = DomainGeneric
  32193. p.add(0, func(m *_Encoding, v []interface{}) {
  32194. m.vex3(0x8f, 0b1001, 0x80, 0, addr(v[0]), hlcode(v[1]))
  32195. m.emit(0x01)
  32196. m.mrsd(7, addr(v[0]), 1)
  32197. })
  32198. }
  32199. if p.len == 0 {
  32200. panic("invalid operands for T1MSKC")
  32201. }
  32202. return p
  32203. }
  32204. // TESTB performs "Logical Compare".
  32205. //
  32206. // Mnemonic : TEST
  32207. // Supported forms : (5 forms)
  32208. //
  32209. // * TESTB imm8, al
  32210. // * TESTB imm8, r8
  32211. // * TESTB r8, r8
  32212. // * TESTB imm8, m8
  32213. // * TESTB r8, m8
  32214. //
  32215. func (self *Program) TESTB(v0 interface{}, v1 interface{}) *Instruction {
  32216. p := self.alloc("TESTB", 2, Operands { v0, v1 })
  32217. // TESTB imm8, al
  32218. if isImm8(v0) && v1 == AL {
  32219. p.domain = DomainGeneric
  32220. p.add(0, func(m *_Encoding, v []interface{}) {
  32221. m.emit(0xa8)
  32222. m.imm1(toImmAny(v[0]))
  32223. })
  32224. }
  32225. // TESTB imm8, r8
  32226. if isImm8(v0) && isReg8(v1) {
  32227. p.domain = DomainGeneric
  32228. p.add(0, func(m *_Encoding, v []interface{}) {
  32229. m.rexo(0, v[1], isReg8REX(v[1]))
  32230. m.emit(0xf6)
  32231. m.emit(0xc0 | lcode(v[1]))
  32232. m.imm1(toImmAny(v[0]))
  32233. })
  32234. }
  32235. // TESTB r8, r8
  32236. if isReg8(v0) && isReg8(v1) {
  32237. p.domain = DomainGeneric
  32238. p.add(0, func(m *_Encoding, v []interface{}) {
  32239. m.rexo(hcode(v[0]), v[1], isReg8REX(v[0]) || isReg8REX(v[1]))
  32240. m.emit(0x84)
  32241. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  32242. })
  32243. }
  32244. // TESTB imm8, m8
  32245. if isImm8(v0) && isM8(v1) {
  32246. p.domain = DomainGeneric
  32247. p.add(0, func(m *_Encoding, v []interface{}) {
  32248. m.rexo(0, addr(v[1]), false)
  32249. m.emit(0xf6)
  32250. m.mrsd(0, addr(v[1]), 1)
  32251. m.imm1(toImmAny(v[0]))
  32252. })
  32253. }
  32254. // TESTB r8, m8
  32255. if isReg8(v0) && isM8(v1) {
  32256. p.domain = DomainGeneric
  32257. p.add(0, func(m *_Encoding, v []interface{}) {
  32258. m.rexo(hcode(v[0]), addr(v[1]), isReg8REX(v[0]))
  32259. m.emit(0x84)
  32260. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  32261. })
  32262. }
  32263. if p.len == 0 {
  32264. panic("invalid operands for TESTB")
  32265. }
  32266. return p
  32267. }
  32268. // TESTL performs "Logical Compare".
  32269. //
  32270. // Mnemonic : TEST
  32271. // Supported forms : (5 forms)
  32272. //
  32273. // * TESTL imm32, eax
  32274. // * TESTL imm32, r32
  32275. // * TESTL r32, r32
  32276. // * TESTL imm32, m32
  32277. // * TESTL r32, m32
  32278. //
  32279. func (self *Program) TESTL(v0 interface{}, v1 interface{}) *Instruction {
  32280. p := self.alloc("TESTL", 2, Operands { v0, v1 })
  32281. // TESTL imm32, eax
  32282. if isImm32(v0) && v1 == EAX {
  32283. p.domain = DomainGeneric
  32284. p.add(0, func(m *_Encoding, v []interface{}) {
  32285. m.emit(0xa9)
  32286. m.imm4(toImmAny(v[0]))
  32287. })
  32288. }
  32289. // TESTL imm32, r32
  32290. if isImm32(v0) && isReg32(v1) {
  32291. p.domain = DomainGeneric
  32292. p.add(0, func(m *_Encoding, v []interface{}) {
  32293. m.rexo(0, v[1], false)
  32294. m.emit(0xf7)
  32295. m.emit(0xc0 | lcode(v[1]))
  32296. m.imm4(toImmAny(v[0]))
  32297. })
  32298. }
  32299. // TESTL r32, r32
  32300. if isReg32(v0) && isReg32(v1) {
  32301. p.domain = DomainGeneric
  32302. p.add(0, func(m *_Encoding, v []interface{}) {
  32303. m.rexo(hcode(v[0]), v[1], false)
  32304. m.emit(0x85)
  32305. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  32306. })
  32307. }
  32308. // TESTL imm32, m32
  32309. if isImm32(v0) && isM32(v1) {
  32310. p.domain = DomainGeneric
  32311. p.add(0, func(m *_Encoding, v []interface{}) {
  32312. m.rexo(0, addr(v[1]), false)
  32313. m.emit(0xf7)
  32314. m.mrsd(0, addr(v[1]), 1)
  32315. m.imm4(toImmAny(v[0]))
  32316. })
  32317. }
  32318. // TESTL r32, m32
  32319. if isReg32(v0) && isM32(v1) {
  32320. p.domain = DomainGeneric
  32321. p.add(0, func(m *_Encoding, v []interface{}) {
  32322. m.rexo(hcode(v[0]), addr(v[1]), false)
  32323. m.emit(0x85)
  32324. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  32325. })
  32326. }
  32327. if p.len == 0 {
  32328. panic("invalid operands for TESTL")
  32329. }
  32330. return p
  32331. }
  32332. // TESTQ performs "Logical Compare".
  32333. //
  32334. // Mnemonic : TEST
  32335. // Supported forms : (5 forms)
  32336. //
  32337. // * TESTQ imm32, rax
  32338. // * TESTQ imm32, r64
  32339. // * TESTQ r64, r64
  32340. // * TESTQ imm32, m64
  32341. // * TESTQ r64, m64
  32342. //
  32343. func (self *Program) TESTQ(v0 interface{}, v1 interface{}) *Instruction {
  32344. p := self.alloc("TESTQ", 2, Operands { v0, v1 })
  32345. // TESTQ imm32, rax
  32346. if isImm32(v0) && v1 == RAX {
  32347. p.domain = DomainGeneric
  32348. p.add(0, func(m *_Encoding, v []interface{}) {
  32349. m.emit(0x48)
  32350. m.emit(0xa9)
  32351. m.imm4(toImmAny(v[0]))
  32352. })
  32353. }
  32354. // TESTQ imm32, r64
  32355. if isImm32Ext(v0, 8) && isReg64(v1) {
  32356. p.domain = DomainGeneric
  32357. p.add(0, func(m *_Encoding, v []interface{}) {
  32358. m.emit(0x48 | hcode(v[1]))
  32359. m.emit(0xf7)
  32360. m.emit(0xc0 | lcode(v[1]))
  32361. m.imm4(toImmAny(v[0]))
  32362. })
  32363. }
  32364. // TESTQ r64, r64
  32365. if isReg64(v0) && isReg64(v1) {
  32366. p.domain = DomainGeneric
  32367. p.add(0, func(m *_Encoding, v []interface{}) {
  32368. m.emit(0x48 | hcode(v[0]) << 2 | hcode(v[1]))
  32369. m.emit(0x85)
  32370. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  32371. })
  32372. }
  32373. // TESTQ imm32, m64
  32374. if isImm32Ext(v0, 8) && isM64(v1) {
  32375. p.domain = DomainGeneric
  32376. p.add(0, func(m *_Encoding, v []interface{}) {
  32377. m.rexm(1, 0, addr(v[1]))
  32378. m.emit(0xf7)
  32379. m.mrsd(0, addr(v[1]), 1)
  32380. m.imm4(toImmAny(v[0]))
  32381. })
  32382. }
  32383. // TESTQ r64, m64
  32384. if isReg64(v0) && isM64(v1) {
  32385. p.domain = DomainGeneric
  32386. p.add(0, func(m *_Encoding, v []interface{}) {
  32387. m.rexm(1, hcode(v[0]), addr(v[1]))
  32388. m.emit(0x85)
  32389. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  32390. })
  32391. }
  32392. if p.len == 0 {
  32393. panic("invalid operands for TESTQ")
  32394. }
  32395. return p
  32396. }
  32397. // TESTW performs "Logical Compare".
  32398. //
  32399. // Mnemonic : TEST
  32400. // Supported forms : (5 forms)
  32401. //
  32402. // * TESTW imm16, ax
  32403. // * TESTW imm16, r16
  32404. // * TESTW r16, r16
  32405. // * TESTW imm16, m16
  32406. // * TESTW r16, m16
  32407. //
  32408. func (self *Program) TESTW(v0 interface{}, v1 interface{}) *Instruction {
  32409. p := self.alloc("TESTW", 2, Operands { v0, v1 })
  32410. // TESTW imm16, ax
  32411. if isImm16(v0) && v1 == AX {
  32412. p.domain = DomainGeneric
  32413. p.add(0, func(m *_Encoding, v []interface{}) {
  32414. m.emit(0x66)
  32415. m.emit(0xa9)
  32416. m.imm2(toImmAny(v[0]))
  32417. })
  32418. }
  32419. // TESTW imm16, r16
  32420. if isImm16(v0) && isReg16(v1) {
  32421. p.domain = DomainGeneric
  32422. p.add(0, func(m *_Encoding, v []interface{}) {
  32423. m.emit(0x66)
  32424. m.rexo(0, v[1], false)
  32425. m.emit(0xf7)
  32426. m.emit(0xc0 | lcode(v[1]))
  32427. m.imm2(toImmAny(v[0]))
  32428. })
  32429. }
  32430. // TESTW r16, r16
  32431. if isReg16(v0) && isReg16(v1) {
  32432. p.domain = DomainGeneric
  32433. p.add(0, func(m *_Encoding, v []interface{}) {
  32434. m.emit(0x66)
  32435. m.rexo(hcode(v[0]), v[1], false)
  32436. m.emit(0x85)
  32437. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  32438. })
  32439. }
  32440. // TESTW imm16, m16
  32441. if isImm16(v0) && isM16(v1) {
  32442. p.domain = DomainGeneric
  32443. p.add(0, func(m *_Encoding, v []interface{}) {
  32444. m.emit(0x66)
  32445. m.rexo(0, addr(v[1]), false)
  32446. m.emit(0xf7)
  32447. m.mrsd(0, addr(v[1]), 1)
  32448. m.imm2(toImmAny(v[0]))
  32449. })
  32450. }
  32451. // TESTW r16, m16
  32452. if isReg16(v0) && isM16(v1) {
  32453. p.domain = DomainGeneric
  32454. p.add(0, func(m *_Encoding, v []interface{}) {
  32455. m.emit(0x66)
  32456. m.rexo(hcode(v[0]), addr(v[1]), false)
  32457. m.emit(0x85)
  32458. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  32459. })
  32460. }
  32461. if p.len == 0 {
  32462. panic("invalid operands for TESTW")
  32463. }
  32464. return p
  32465. }
  32466. // TZCNTL performs "Count the Number of Trailing Zero Bits".
  32467. //
  32468. // Mnemonic : TZCNT
  32469. // Supported forms : (2 forms)
  32470. //
  32471. // * TZCNTL r32, r32 [BMI]
  32472. // * TZCNTL m32, r32 [BMI]
  32473. //
  32474. func (self *Program) TZCNTL(v0 interface{}, v1 interface{}) *Instruction {
  32475. p := self.alloc("TZCNTL", 2, Operands { v0, v1 })
  32476. // TZCNTL r32, r32
  32477. if isReg32(v0) && isReg32(v1) {
  32478. self.require(ISA_BMI)
  32479. p.domain = DomainGeneric
  32480. p.add(0, func(m *_Encoding, v []interface{}) {
  32481. m.emit(0xf3)
  32482. m.rexo(hcode(v[1]), v[0], false)
  32483. m.emit(0x0f)
  32484. m.emit(0xbc)
  32485. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  32486. })
  32487. }
  32488. // TZCNTL m32, r32
  32489. if isM32(v0) && isReg32(v1) {
  32490. self.require(ISA_BMI)
  32491. p.domain = DomainGeneric
  32492. p.add(0, func(m *_Encoding, v []interface{}) {
  32493. m.emit(0xf3)
  32494. m.rexo(hcode(v[1]), addr(v[0]), false)
  32495. m.emit(0x0f)
  32496. m.emit(0xbc)
  32497. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  32498. })
  32499. }
  32500. if p.len == 0 {
  32501. panic("invalid operands for TZCNTL")
  32502. }
  32503. return p
  32504. }
  32505. // TZCNTQ performs "Count the Number of Trailing Zero Bits".
  32506. //
  32507. // Mnemonic : TZCNT
  32508. // Supported forms : (2 forms)
  32509. //
  32510. // * TZCNTQ r64, r64 [BMI]
  32511. // * TZCNTQ m64, r64 [BMI]
  32512. //
  32513. func (self *Program) TZCNTQ(v0 interface{}, v1 interface{}) *Instruction {
  32514. p := self.alloc("TZCNTQ", 2, Operands { v0, v1 })
  32515. // TZCNTQ r64, r64
  32516. if isReg64(v0) && isReg64(v1) {
  32517. self.require(ISA_BMI)
  32518. p.domain = DomainGeneric
  32519. p.add(0, func(m *_Encoding, v []interface{}) {
  32520. m.emit(0xf3)
  32521. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  32522. m.emit(0x0f)
  32523. m.emit(0xbc)
  32524. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  32525. })
  32526. }
  32527. // TZCNTQ m64, r64
  32528. if isM64(v0) && isReg64(v1) {
  32529. self.require(ISA_BMI)
  32530. p.domain = DomainGeneric
  32531. p.add(0, func(m *_Encoding, v []interface{}) {
  32532. m.emit(0xf3)
  32533. m.rexm(1, hcode(v[1]), addr(v[0]))
  32534. m.emit(0x0f)
  32535. m.emit(0xbc)
  32536. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  32537. })
  32538. }
  32539. if p.len == 0 {
  32540. panic("invalid operands for TZCNTQ")
  32541. }
  32542. return p
  32543. }
  32544. // TZCNTW performs "Count the Number of Trailing Zero Bits".
  32545. //
  32546. // Mnemonic : TZCNT
  32547. // Supported forms : (2 forms)
  32548. //
  32549. // * TZCNTW r16, r16 [BMI]
  32550. // * TZCNTW m16, r16 [BMI]
  32551. //
  32552. func (self *Program) TZCNTW(v0 interface{}, v1 interface{}) *Instruction {
  32553. p := self.alloc("TZCNTW", 2, Operands { v0, v1 })
  32554. // TZCNTW r16, r16
  32555. if isReg16(v0) && isReg16(v1) {
  32556. self.require(ISA_BMI)
  32557. p.domain = DomainGeneric
  32558. p.add(0, func(m *_Encoding, v []interface{}) {
  32559. m.emit(0x66)
  32560. m.emit(0xf3)
  32561. m.rexo(hcode(v[1]), v[0], false)
  32562. m.emit(0x0f)
  32563. m.emit(0xbc)
  32564. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  32565. })
  32566. }
  32567. // TZCNTW m16, r16
  32568. if isM16(v0) && isReg16(v1) {
  32569. self.require(ISA_BMI)
  32570. p.domain = DomainGeneric
  32571. p.add(0, func(m *_Encoding, v []interface{}) {
  32572. m.emit(0x66)
  32573. m.emit(0xf3)
  32574. m.rexo(hcode(v[1]), addr(v[0]), false)
  32575. m.emit(0x0f)
  32576. m.emit(0xbc)
  32577. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  32578. })
  32579. }
  32580. if p.len == 0 {
  32581. panic("invalid operands for TZCNTW")
  32582. }
  32583. return p
  32584. }
  32585. // TZMSK performs "Mask From Trailing Zeros".
  32586. //
  32587. // Mnemonic : TZMSK
  32588. // Supported forms : (4 forms)
  32589. //
  32590. // * TZMSK r32, r32 [TBM]
  32591. // * TZMSK m32, r32 [TBM]
  32592. // * TZMSK r64, r64 [TBM]
  32593. // * TZMSK m64, r64 [TBM]
  32594. //
  32595. func (self *Program) TZMSK(v0 interface{}, v1 interface{}) *Instruction {
  32596. p := self.alloc("TZMSK", 2, Operands { v0, v1 })
  32597. // TZMSK r32, r32
  32598. if isReg32(v0) && isReg32(v1) {
  32599. self.require(ISA_TBM)
  32600. p.domain = DomainGeneric
  32601. p.add(0, func(m *_Encoding, v []interface{}) {
  32602. m.emit(0x8f)
  32603. m.emit(0xe9 ^ (hcode(v[0]) << 5))
  32604. m.emit(0x78 ^ (hlcode(v[1]) << 3))
  32605. m.emit(0x01)
  32606. m.emit(0xe0 | lcode(v[0]))
  32607. })
  32608. }
  32609. // TZMSK m32, r32
  32610. if isM32(v0) && isReg32(v1) {
  32611. self.require(ISA_TBM)
  32612. p.domain = DomainGeneric
  32613. p.add(0, func(m *_Encoding, v []interface{}) {
  32614. m.vex3(0x8f, 0b1001, 0x00, 0, addr(v[0]), hlcode(v[1]))
  32615. m.emit(0x01)
  32616. m.mrsd(4, addr(v[0]), 1)
  32617. })
  32618. }
  32619. // TZMSK r64, r64
  32620. if isReg64(v0) && isReg64(v1) {
  32621. self.require(ISA_TBM)
  32622. p.domain = DomainGeneric
  32623. p.add(0, func(m *_Encoding, v []interface{}) {
  32624. m.emit(0x8f)
  32625. m.emit(0xe9 ^ (hcode(v[0]) << 5))
  32626. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  32627. m.emit(0x01)
  32628. m.emit(0xe0 | lcode(v[0]))
  32629. })
  32630. }
  32631. // TZMSK m64, r64
  32632. if isM64(v0) && isReg64(v1) {
  32633. self.require(ISA_TBM)
  32634. p.domain = DomainGeneric
  32635. p.add(0, func(m *_Encoding, v []interface{}) {
  32636. m.vex3(0x8f, 0b1001, 0x80, 0, addr(v[0]), hlcode(v[1]))
  32637. m.emit(0x01)
  32638. m.mrsd(4, addr(v[0]), 1)
  32639. })
  32640. }
  32641. if p.len == 0 {
  32642. panic("invalid operands for TZMSK")
  32643. }
  32644. return p
  32645. }
  32646. // UCOMISD performs "Unordered Compare Scalar Double-Precision Floating-Point Values and Set EFLAGS".
  32647. //
  32648. // Mnemonic : UCOMISD
  32649. // Supported forms : (2 forms)
  32650. //
  32651. // * UCOMISD xmm, xmm [SSE2]
  32652. // * UCOMISD m64, xmm [SSE2]
  32653. //
  32654. func (self *Program) UCOMISD(v0 interface{}, v1 interface{}) *Instruction {
  32655. p := self.alloc("UCOMISD", 2, Operands { v0, v1 })
  32656. // UCOMISD xmm, xmm
  32657. if isXMM(v0) && isXMM(v1) {
  32658. self.require(ISA_SSE2)
  32659. p.domain = DomainMMXSSE
  32660. p.add(0, func(m *_Encoding, v []interface{}) {
  32661. m.emit(0x66)
  32662. m.rexo(hcode(v[1]), v[0], false)
  32663. m.emit(0x0f)
  32664. m.emit(0x2e)
  32665. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  32666. })
  32667. }
  32668. // UCOMISD m64, xmm
  32669. if isM64(v0) && isXMM(v1) {
  32670. self.require(ISA_SSE2)
  32671. p.domain = DomainMMXSSE
  32672. p.add(0, func(m *_Encoding, v []interface{}) {
  32673. m.emit(0x66)
  32674. m.rexo(hcode(v[1]), addr(v[0]), false)
  32675. m.emit(0x0f)
  32676. m.emit(0x2e)
  32677. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  32678. })
  32679. }
  32680. if p.len == 0 {
  32681. panic("invalid operands for UCOMISD")
  32682. }
  32683. return p
  32684. }
  32685. // UCOMISS performs "Unordered Compare Scalar Single-Precision Floating-Point Values and Set EFLAGS".
  32686. //
  32687. // Mnemonic : UCOMISS
  32688. // Supported forms : (2 forms)
  32689. //
  32690. // * UCOMISS xmm, xmm [SSE]
  32691. // * UCOMISS m32, xmm [SSE]
  32692. //
  32693. func (self *Program) UCOMISS(v0 interface{}, v1 interface{}) *Instruction {
  32694. p := self.alloc("UCOMISS", 2, Operands { v0, v1 })
  32695. // UCOMISS xmm, xmm
  32696. if isXMM(v0) && isXMM(v1) {
  32697. self.require(ISA_SSE)
  32698. p.domain = DomainMMXSSE
  32699. p.add(0, func(m *_Encoding, v []interface{}) {
  32700. m.rexo(hcode(v[1]), v[0], false)
  32701. m.emit(0x0f)
  32702. m.emit(0x2e)
  32703. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  32704. })
  32705. }
  32706. // UCOMISS m32, xmm
  32707. if isM32(v0) && isXMM(v1) {
  32708. self.require(ISA_SSE)
  32709. p.domain = DomainMMXSSE
  32710. p.add(0, func(m *_Encoding, v []interface{}) {
  32711. m.rexo(hcode(v[1]), addr(v[0]), false)
  32712. m.emit(0x0f)
  32713. m.emit(0x2e)
  32714. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  32715. })
  32716. }
  32717. if p.len == 0 {
  32718. panic("invalid operands for UCOMISS")
  32719. }
  32720. return p
  32721. }
  32722. // UD2 performs "Undefined Instruction".
  32723. //
  32724. // Mnemonic : UD2
  32725. // Supported forms : (1 form)
  32726. //
  32727. // * UD2
  32728. //
  32729. func (self *Program) UD2() *Instruction {
  32730. p := self.alloc("UD2", 0, Operands { })
  32731. // UD2
  32732. p.domain = DomainGeneric
  32733. p.add(0, func(m *_Encoding, v []interface{}) {
  32734. m.emit(0x0f)
  32735. m.emit(0x0b)
  32736. })
  32737. return p
  32738. }
  32739. // UNPCKHPD performs "Unpack and Interleave High Packed Double-Precision Floating-Point Values".
  32740. //
  32741. // Mnemonic : UNPCKHPD
  32742. // Supported forms : (2 forms)
  32743. //
  32744. // * UNPCKHPD xmm, xmm [SSE2]
  32745. // * UNPCKHPD m128, xmm [SSE2]
  32746. //
  32747. func (self *Program) UNPCKHPD(v0 interface{}, v1 interface{}) *Instruction {
  32748. p := self.alloc("UNPCKHPD", 2, Operands { v0, v1 })
  32749. // UNPCKHPD xmm, xmm
  32750. if isXMM(v0) && isXMM(v1) {
  32751. self.require(ISA_SSE2)
  32752. p.domain = DomainMMXSSE
  32753. p.add(0, func(m *_Encoding, v []interface{}) {
  32754. m.emit(0x66)
  32755. m.rexo(hcode(v[1]), v[0], false)
  32756. m.emit(0x0f)
  32757. m.emit(0x15)
  32758. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  32759. })
  32760. }
  32761. // UNPCKHPD m128, xmm
  32762. if isM128(v0) && isXMM(v1) {
  32763. self.require(ISA_SSE2)
  32764. p.domain = DomainMMXSSE
  32765. p.add(0, func(m *_Encoding, v []interface{}) {
  32766. m.emit(0x66)
  32767. m.rexo(hcode(v[1]), addr(v[0]), false)
  32768. m.emit(0x0f)
  32769. m.emit(0x15)
  32770. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  32771. })
  32772. }
  32773. if p.len == 0 {
  32774. panic("invalid operands for UNPCKHPD")
  32775. }
  32776. return p
  32777. }
  32778. // UNPCKHPS performs "Unpack and Interleave High Packed Single-Precision Floating-Point Values".
  32779. //
  32780. // Mnemonic : UNPCKHPS
  32781. // Supported forms : (2 forms)
  32782. //
  32783. // * UNPCKHPS xmm, xmm [SSE]
  32784. // * UNPCKHPS m128, xmm [SSE]
  32785. //
  32786. func (self *Program) UNPCKHPS(v0 interface{}, v1 interface{}) *Instruction {
  32787. p := self.alloc("UNPCKHPS", 2, Operands { v0, v1 })
  32788. // UNPCKHPS xmm, xmm
  32789. if isXMM(v0) && isXMM(v1) {
  32790. self.require(ISA_SSE)
  32791. p.domain = DomainMMXSSE
  32792. p.add(0, func(m *_Encoding, v []interface{}) {
  32793. m.rexo(hcode(v[1]), v[0], false)
  32794. m.emit(0x0f)
  32795. m.emit(0x15)
  32796. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  32797. })
  32798. }
  32799. // UNPCKHPS m128, xmm
  32800. if isM128(v0) && isXMM(v1) {
  32801. self.require(ISA_SSE)
  32802. p.domain = DomainMMXSSE
  32803. p.add(0, func(m *_Encoding, v []interface{}) {
  32804. m.rexo(hcode(v[1]), addr(v[0]), false)
  32805. m.emit(0x0f)
  32806. m.emit(0x15)
  32807. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  32808. })
  32809. }
  32810. if p.len == 0 {
  32811. panic("invalid operands for UNPCKHPS")
  32812. }
  32813. return p
  32814. }
  32815. // UNPCKLPD performs "Unpack and Interleave Low Packed Double-Precision Floating-Point Values".
  32816. //
  32817. // Mnemonic : UNPCKLPD
  32818. // Supported forms : (2 forms)
  32819. //
  32820. // * UNPCKLPD xmm, xmm [SSE2]
  32821. // * UNPCKLPD m128, xmm [SSE2]
  32822. //
  32823. func (self *Program) UNPCKLPD(v0 interface{}, v1 interface{}) *Instruction {
  32824. p := self.alloc("UNPCKLPD", 2, Operands { v0, v1 })
  32825. // UNPCKLPD xmm, xmm
  32826. if isXMM(v0) && isXMM(v1) {
  32827. self.require(ISA_SSE2)
  32828. p.domain = DomainMMXSSE
  32829. p.add(0, func(m *_Encoding, v []interface{}) {
  32830. m.emit(0x66)
  32831. m.rexo(hcode(v[1]), v[0], false)
  32832. m.emit(0x0f)
  32833. m.emit(0x14)
  32834. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  32835. })
  32836. }
  32837. // UNPCKLPD m128, xmm
  32838. if isM128(v0) && isXMM(v1) {
  32839. self.require(ISA_SSE2)
  32840. p.domain = DomainMMXSSE
  32841. p.add(0, func(m *_Encoding, v []interface{}) {
  32842. m.emit(0x66)
  32843. m.rexo(hcode(v[1]), addr(v[0]), false)
  32844. m.emit(0x0f)
  32845. m.emit(0x14)
  32846. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  32847. })
  32848. }
  32849. if p.len == 0 {
  32850. panic("invalid operands for UNPCKLPD")
  32851. }
  32852. return p
  32853. }
  32854. // UNPCKLPS performs "Unpack and Interleave Low Packed Single-Precision Floating-Point Values".
  32855. //
  32856. // Mnemonic : UNPCKLPS
  32857. // Supported forms : (2 forms)
  32858. //
  32859. // * UNPCKLPS xmm, xmm [SSE]
  32860. // * UNPCKLPS m128, xmm [SSE]
  32861. //
  32862. func (self *Program) UNPCKLPS(v0 interface{}, v1 interface{}) *Instruction {
  32863. p := self.alloc("UNPCKLPS", 2, Operands { v0, v1 })
  32864. // UNPCKLPS xmm, xmm
  32865. if isXMM(v0) && isXMM(v1) {
  32866. self.require(ISA_SSE)
  32867. p.domain = DomainMMXSSE
  32868. p.add(0, func(m *_Encoding, v []interface{}) {
  32869. m.rexo(hcode(v[1]), v[0], false)
  32870. m.emit(0x0f)
  32871. m.emit(0x14)
  32872. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  32873. })
  32874. }
  32875. // UNPCKLPS m128, xmm
  32876. if isM128(v0) && isXMM(v1) {
  32877. self.require(ISA_SSE)
  32878. p.domain = DomainMMXSSE
  32879. p.add(0, func(m *_Encoding, v []interface{}) {
  32880. m.rexo(hcode(v[1]), addr(v[0]), false)
  32881. m.emit(0x0f)
  32882. m.emit(0x14)
  32883. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  32884. })
  32885. }
  32886. if p.len == 0 {
  32887. panic("invalid operands for UNPCKLPS")
  32888. }
  32889. return p
  32890. }
  32891. // VADDPD performs "Add Packed Double-Precision Floating-Point Values".
  32892. //
  32893. // Mnemonic : VADDPD
  32894. // Supported forms : (11 forms)
  32895. //
  32896. // * VADDPD xmm, xmm, xmm [AVX]
  32897. // * VADDPD m128, xmm, xmm [AVX]
  32898. // * VADDPD ymm, ymm, ymm [AVX]
  32899. // * VADDPD m256, ymm, ymm [AVX]
  32900. // * VADDPD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  32901. // * VADDPD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  32902. // * VADDPD zmm, zmm, zmm{k}{z} [AVX512F]
  32903. // * VADDPD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  32904. // * VADDPD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  32905. // * VADDPD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  32906. // * VADDPD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  32907. //
  32908. func (self *Program) VADDPD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  32909. var p *Instruction
  32910. switch len(vv) {
  32911. case 0 : p = self.alloc("VADDPD", 3, Operands { v0, v1, v2 })
  32912. case 1 : p = self.alloc("VADDPD", 4, Operands { v0, v1, v2, vv[0] })
  32913. default : panic("instruction VADDPD takes 3 or 4 operands")
  32914. }
  32915. // VADDPD xmm, xmm, xmm
  32916. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  32917. self.require(ISA_AVX)
  32918. p.domain = DomainAVX
  32919. p.add(0, func(m *_Encoding, v []interface{}) {
  32920. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  32921. m.emit(0x58)
  32922. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  32923. })
  32924. }
  32925. // VADDPD m128, xmm, xmm
  32926. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  32927. self.require(ISA_AVX)
  32928. p.domain = DomainAVX
  32929. p.add(0, func(m *_Encoding, v []interface{}) {
  32930. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  32931. m.emit(0x58)
  32932. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  32933. })
  32934. }
  32935. // VADDPD ymm, ymm, ymm
  32936. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  32937. self.require(ISA_AVX)
  32938. p.domain = DomainAVX
  32939. p.add(0, func(m *_Encoding, v []interface{}) {
  32940. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  32941. m.emit(0x58)
  32942. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  32943. })
  32944. }
  32945. // VADDPD m256, ymm, ymm
  32946. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  32947. self.require(ISA_AVX)
  32948. p.domain = DomainAVX
  32949. p.add(0, func(m *_Encoding, v []interface{}) {
  32950. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  32951. m.emit(0x58)
  32952. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  32953. })
  32954. }
  32955. // VADDPD m512/m64bcst, zmm, zmm{k}{z}
  32956. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  32957. self.require(ISA_AVX512F)
  32958. p.domain = DomainAVX
  32959. p.add(0, func(m *_Encoding, v []interface{}) {
  32960. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  32961. m.emit(0x58)
  32962. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  32963. })
  32964. }
  32965. // VADDPD {er}, zmm, zmm, zmm{k}{z}
  32966. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  32967. self.require(ISA_AVX512F)
  32968. p.domain = DomainAVX
  32969. p.add(0, func(m *_Encoding, v []interface{}) {
  32970. m.emit(0x62)
  32971. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  32972. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  32973. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  32974. m.emit(0x58)
  32975. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  32976. })
  32977. }
  32978. // VADDPD zmm, zmm, zmm{k}{z}
  32979. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  32980. self.require(ISA_AVX512F)
  32981. p.domain = DomainAVX
  32982. p.add(0, func(m *_Encoding, v []interface{}) {
  32983. m.emit(0x62)
  32984. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  32985. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  32986. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  32987. m.emit(0x58)
  32988. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  32989. })
  32990. }
  32991. // VADDPD m128/m64bcst, xmm, xmm{k}{z}
  32992. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  32993. self.require(ISA_AVX512VL | ISA_AVX512F)
  32994. p.domain = DomainAVX
  32995. p.add(0, func(m *_Encoding, v []interface{}) {
  32996. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  32997. m.emit(0x58)
  32998. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  32999. })
  33000. }
  33001. // VADDPD xmm, xmm, xmm{k}{z}
  33002. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  33003. self.require(ISA_AVX512VL | ISA_AVX512F)
  33004. p.domain = DomainAVX
  33005. p.add(0, func(m *_Encoding, v []interface{}) {
  33006. m.emit(0x62)
  33007. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  33008. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  33009. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  33010. m.emit(0x58)
  33011. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33012. })
  33013. }
  33014. // VADDPD m256/m64bcst, ymm, ymm{k}{z}
  33015. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  33016. self.require(ISA_AVX512VL | ISA_AVX512F)
  33017. p.domain = DomainAVX
  33018. p.add(0, func(m *_Encoding, v []interface{}) {
  33019. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  33020. m.emit(0x58)
  33021. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  33022. })
  33023. }
  33024. // VADDPD ymm, ymm, ymm{k}{z}
  33025. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  33026. self.require(ISA_AVX512VL | ISA_AVX512F)
  33027. p.domain = DomainAVX
  33028. p.add(0, func(m *_Encoding, v []interface{}) {
  33029. m.emit(0x62)
  33030. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  33031. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  33032. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  33033. m.emit(0x58)
  33034. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33035. })
  33036. }
  33037. if p.len == 0 {
  33038. panic("invalid operands for VADDPD")
  33039. }
  33040. return p
  33041. }
  33042. // VADDPS performs "Add Packed Single-Precision Floating-Point Values".
  33043. //
  33044. // Mnemonic : VADDPS
  33045. // Supported forms : (11 forms)
  33046. //
  33047. // * VADDPS xmm, xmm, xmm [AVX]
  33048. // * VADDPS m128, xmm, xmm [AVX]
  33049. // * VADDPS ymm, ymm, ymm [AVX]
  33050. // * VADDPS m256, ymm, ymm [AVX]
  33051. // * VADDPS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  33052. // * VADDPS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  33053. // * VADDPS zmm, zmm, zmm{k}{z} [AVX512F]
  33054. // * VADDPS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  33055. // * VADDPS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  33056. // * VADDPS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  33057. // * VADDPS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  33058. //
  33059. func (self *Program) VADDPS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  33060. var p *Instruction
  33061. switch len(vv) {
  33062. case 0 : p = self.alloc("VADDPS", 3, Operands { v0, v1, v2 })
  33063. case 1 : p = self.alloc("VADDPS", 4, Operands { v0, v1, v2, vv[0] })
  33064. default : panic("instruction VADDPS takes 3 or 4 operands")
  33065. }
  33066. // VADDPS xmm, xmm, xmm
  33067. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  33068. self.require(ISA_AVX)
  33069. p.domain = DomainAVX
  33070. p.add(0, func(m *_Encoding, v []interface{}) {
  33071. m.vex2(0, hcode(v[2]), v[0], hlcode(v[1]))
  33072. m.emit(0x58)
  33073. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33074. })
  33075. }
  33076. // VADDPS m128, xmm, xmm
  33077. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  33078. self.require(ISA_AVX)
  33079. p.domain = DomainAVX
  33080. p.add(0, func(m *_Encoding, v []interface{}) {
  33081. m.vex2(0, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  33082. m.emit(0x58)
  33083. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  33084. })
  33085. }
  33086. // VADDPS ymm, ymm, ymm
  33087. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  33088. self.require(ISA_AVX)
  33089. p.domain = DomainAVX
  33090. p.add(0, func(m *_Encoding, v []interface{}) {
  33091. m.vex2(4, hcode(v[2]), v[0], hlcode(v[1]))
  33092. m.emit(0x58)
  33093. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33094. })
  33095. }
  33096. // VADDPS m256, ymm, ymm
  33097. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  33098. self.require(ISA_AVX)
  33099. p.domain = DomainAVX
  33100. p.add(0, func(m *_Encoding, v []interface{}) {
  33101. m.vex2(4, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  33102. m.emit(0x58)
  33103. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  33104. })
  33105. }
  33106. // VADDPS m512/m32bcst, zmm, zmm{k}{z}
  33107. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  33108. self.require(ISA_AVX512F)
  33109. p.domain = DomainAVX
  33110. p.add(0, func(m *_Encoding, v []interface{}) {
  33111. m.evex(0b01, 0x04, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  33112. m.emit(0x58)
  33113. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  33114. })
  33115. }
  33116. // VADDPS {er}, zmm, zmm, zmm{k}{z}
  33117. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  33118. self.require(ISA_AVX512F)
  33119. p.domain = DomainAVX
  33120. p.add(0, func(m *_Encoding, v []interface{}) {
  33121. m.emit(0x62)
  33122. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  33123. m.emit(0x7c ^ (hlcode(v[2]) << 3))
  33124. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  33125. m.emit(0x58)
  33126. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  33127. })
  33128. }
  33129. // VADDPS zmm, zmm, zmm{k}{z}
  33130. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  33131. self.require(ISA_AVX512F)
  33132. p.domain = DomainAVX
  33133. p.add(0, func(m *_Encoding, v []interface{}) {
  33134. m.emit(0x62)
  33135. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  33136. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  33137. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  33138. m.emit(0x58)
  33139. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33140. })
  33141. }
  33142. // VADDPS m128/m32bcst, xmm, xmm{k}{z}
  33143. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  33144. self.require(ISA_AVX512VL | ISA_AVX512F)
  33145. p.domain = DomainAVX
  33146. p.add(0, func(m *_Encoding, v []interface{}) {
  33147. m.evex(0b01, 0x04, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  33148. m.emit(0x58)
  33149. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  33150. })
  33151. }
  33152. // VADDPS xmm, xmm, xmm{k}{z}
  33153. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  33154. self.require(ISA_AVX512VL | ISA_AVX512F)
  33155. p.domain = DomainAVX
  33156. p.add(0, func(m *_Encoding, v []interface{}) {
  33157. m.emit(0x62)
  33158. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  33159. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  33160. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  33161. m.emit(0x58)
  33162. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33163. })
  33164. }
  33165. // VADDPS m256/m32bcst, ymm, ymm{k}{z}
  33166. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  33167. self.require(ISA_AVX512VL | ISA_AVX512F)
  33168. p.domain = DomainAVX
  33169. p.add(0, func(m *_Encoding, v []interface{}) {
  33170. m.evex(0b01, 0x04, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  33171. m.emit(0x58)
  33172. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  33173. })
  33174. }
  33175. // VADDPS ymm, ymm, ymm{k}{z}
  33176. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  33177. self.require(ISA_AVX512VL | ISA_AVX512F)
  33178. p.domain = DomainAVX
  33179. p.add(0, func(m *_Encoding, v []interface{}) {
  33180. m.emit(0x62)
  33181. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  33182. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  33183. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  33184. m.emit(0x58)
  33185. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33186. })
  33187. }
  33188. if p.len == 0 {
  33189. panic("invalid operands for VADDPS")
  33190. }
  33191. return p
  33192. }
  33193. // VADDSD performs "Add Scalar Double-Precision Floating-Point Values".
  33194. //
  33195. // Mnemonic : VADDSD
  33196. // Supported forms : (5 forms)
  33197. //
  33198. // * VADDSD xmm, xmm, xmm [AVX]
  33199. // * VADDSD m64, xmm, xmm [AVX]
  33200. // * VADDSD m64, xmm, xmm{k}{z} [AVX512F]
  33201. // * VADDSD {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  33202. // * VADDSD xmm, xmm, xmm{k}{z} [AVX512F]
  33203. //
  33204. func (self *Program) VADDSD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  33205. var p *Instruction
  33206. switch len(vv) {
  33207. case 0 : p = self.alloc("VADDSD", 3, Operands { v0, v1, v2 })
  33208. case 1 : p = self.alloc("VADDSD", 4, Operands { v0, v1, v2, vv[0] })
  33209. default : panic("instruction VADDSD takes 3 or 4 operands")
  33210. }
  33211. // VADDSD xmm, xmm, xmm
  33212. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  33213. self.require(ISA_AVX)
  33214. p.domain = DomainAVX
  33215. p.add(0, func(m *_Encoding, v []interface{}) {
  33216. m.vex2(3, hcode(v[2]), v[0], hlcode(v[1]))
  33217. m.emit(0x58)
  33218. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33219. })
  33220. }
  33221. // VADDSD m64, xmm, xmm
  33222. if len(vv) == 0 && isM64(v0) && isXMM(v1) && isXMM(v2) {
  33223. self.require(ISA_AVX)
  33224. p.domain = DomainAVX
  33225. p.add(0, func(m *_Encoding, v []interface{}) {
  33226. m.vex2(3, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  33227. m.emit(0x58)
  33228. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  33229. })
  33230. }
  33231. // VADDSD m64, xmm, xmm{k}{z}
  33232. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  33233. self.require(ISA_AVX512F)
  33234. p.domain = DomainAVX
  33235. p.add(0, func(m *_Encoding, v []interface{}) {
  33236. m.evex(0b01, 0x87, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  33237. m.emit(0x58)
  33238. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  33239. })
  33240. }
  33241. // VADDSD {er}, xmm, xmm, xmm{k}{z}
  33242. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  33243. self.require(ISA_AVX512F)
  33244. p.domain = DomainAVX
  33245. p.add(0, func(m *_Encoding, v []interface{}) {
  33246. m.emit(0x62)
  33247. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  33248. m.emit(0xff ^ (hlcode(v[2]) << 3))
  33249. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  33250. m.emit(0x58)
  33251. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  33252. })
  33253. }
  33254. // VADDSD xmm, xmm, xmm{k}{z}
  33255. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  33256. self.require(ISA_AVX512F)
  33257. p.domain = DomainAVX
  33258. p.add(0, func(m *_Encoding, v []interface{}) {
  33259. m.emit(0x62)
  33260. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  33261. m.emit(0xff ^ (hlcode(v[1]) << 3))
  33262. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  33263. m.emit(0x58)
  33264. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33265. })
  33266. }
  33267. if p.len == 0 {
  33268. panic("invalid operands for VADDSD")
  33269. }
  33270. return p
  33271. }
  33272. // VADDSS performs "Add Scalar Single-Precision Floating-Point Values".
  33273. //
  33274. // Mnemonic : VADDSS
  33275. // Supported forms : (5 forms)
  33276. //
  33277. // * VADDSS xmm, xmm, xmm [AVX]
  33278. // * VADDSS m32, xmm, xmm [AVX]
  33279. // * VADDSS m32, xmm, xmm{k}{z} [AVX512F]
  33280. // * VADDSS {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  33281. // * VADDSS xmm, xmm, xmm{k}{z} [AVX512F]
  33282. //
  33283. func (self *Program) VADDSS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  33284. var p *Instruction
  33285. switch len(vv) {
  33286. case 0 : p = self.alloc("VADDSS", 3, Operands { v0, v1, v2 })
  33287. case 1 : p = self.alloc("VADDSS", 4, Operands { v0, v1, v2, vv[0] })
  33288. default : panic("instruction VADDSS takes 3 or 4 operands")
  33289. }
  33290. // VADDSS xmm, xmm, xmm
  33291. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  33292. self.require(ISA_AVX)
  33293. p.domain = DomainAVX
  33294. p.add(0, func(m *_Encoding, v []interface{}) {
  33295. m.vex2(2, hcode(v[2]), v[0], hlcode(v[1]))
  33296. m.emit(0x58)
  33297. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33298. })
  33299. }
  33300. // VADDSS m32, xmm, xmm
  33301. if len(vv) == 0 && isM32(v0) && isXMM(v1) && isXMM(v2) {
  33302. self.require(ISA_AVX)
  33303. p.domain = DomainAVX
  33304. p.add(0, func(m *_Encoding, v []interface{}) {
  33305. m.vex2(2, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  33306. m.emit(0x58)
  33307. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  33308. })
  33309. }
  33310. // VADDSS m32, xmm, xmm{k}{z}
  33311. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  33312. self.require(ISA_AVX512F)
  33313. p.domain = DomainAVX
  33314. p.add(0, func(m *_Encoding, v []interface{}) {
  33315. m.evex(0b01, 0x06, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  33316. m.emit(0x58)
  33317. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  33318. })
  33319. }
  33320. // VADDSS {er}, xmm, xmm, xmm{k}{z}
  33321. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  33322. self.require(ISA_AVX512F)
  33323. p.domain = DomainAVX
  33324. p.add(0, func(m *_Encoding, v []interface{}) {
  33325. m.emit(0x62)
  33326. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  33327. m.emit(0x7e ^ (hlcode(v[2]) << 3))
  33328. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  33329. m.emit(0x58)
  33330. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  33331. })
  33332. }
  33333. // VADDSS xmm, xmm, xmm{k}{z}
  33334. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  33335. self.require(ISA_AVX512F)
  33336. p.domain = DomainAVX
  33337. p.add(0, func(m *_Encoding, v []interface{}) {
  33338. m.emit(0x62)
  33339. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  33340. m.emit(0x7e ^ (hlcode(v[1]) << 3))
  33341. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  33342. m.emit(0x58)
  33343. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33344. })
  33345. }
  33346. if p.len == 0 {
  33347. panic("invalid operands for VADDSS")
  33348. }
  33349. return p
  33350. }
  33351. // VADDSUBPD performs "Packed Double-FP Add/Subtract".
  33352. //
  33353. // Mnemonic : VADDSUBPD
  33354. // Supported forms : (4 forms)
  33355. //
  33356. // * VADDSUBPD xmm, xmm, xmm [AVX]
  33357. // * VADDSUBPD m128, xmm, xmm [AVX]
  33358. // * VADDSUBPD ymm, ymm, ymm [AVX]
  33359. // * VADDSUBPD m256, ymm, ymm [AVX]
  33360. //
  33361. func (self *Program) VADDSUBPD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  33362. p := self.alloc("VADDSUBPD", 3, Operands { v0, v1, v2 })
  33363. // VADDSUBPD xmm, xmm, xmm
  33364. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  33365. self.require(ISA_AVX)
  33366. p.domain = DomainAVX
  33367. p.add(0, func(m *_Encoding, v []interface{}) {
  33368. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  33369. m.emit(0xd0)
  33370. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33371. })
  33372. }
  33373. // VADDSUBPD m128, xmm, xmm
  33374. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  33375. self.require(ISA_AVX)
  33376. p.domain = DomainAVX
  33377. p.add(0, func(m *_Encoding, v []interface{}) {
  33378. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  33379. m.emit(0xd0)
  33380. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  33381. })
  33382. }
  33383. // VADDSUBPD ymm, ymm, ymm
  33384. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  33385. self.require(ISA_AVX)
  33386. p.domain = DomainAVX
  33387. p.add(0, func(m *_Encoding, v []interface{}) {
  33388. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  33389. m.emit(0xd0)
  33390. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33391. })
  33392. }
  33393. // VADDSUBPD m256, ymm, ymm
  33394. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  33395. self.require(ISA_AVX)
  33396. p.domain = DomainAVX
  33397. p.add(0, func(m *_Encoding, v []interface{}) {
  33398. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  33399. m.emit(0xd0)
  33400. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  33401. })
  33402. }
  33403. if p.len == 0 {
  33404. panic("invalid operands for VADDSUBPD")
  33405. }
  33406. return p
  33407. }
  33408. // VADDSUBPS performs "Packed Single-FP Add/Subtract".
  33409. //
  33410. // Mnemonic : VADDSUBPS
  33411. // Supported forms : (4 forms)
  33412. //
  33413. // * VADDSUBPS xmm, xmm, xmm [AVX]
  33414. // * VADDSUBPS m128, xmm, xmm [AVX]
  33415. // * VADDSUBPS ymm, ymm, ymm [AVX]
  33416. // * VADDSUBPS m256, ymm, ymm [AVX]
  33417. //
  33418. func (self *Program) VADDSUBPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  33419. p := self.alloc("VADDSUBPS", 3, Operands { v0, v1, v2 })
  33420. // VADDSUBPS xmm, xmm, xmm
  33421. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  33422. self.require(ISA_AVX)
  33423. p.domain = DomainAVX
  33424. p.add(0, func(m *_Encoding, v []interface{}) {
  33425. m.vex2(3, hcode(v[2]), v[0], hlcode(v[1]))
  33426. m.emit(0xd0)
  33427. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33428. })
  33429. }
  33430. // VADDSUBPS m128, xmm, xmm
  33431. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  33432. self.require(ISA_AVX)
  33433. p.domain = DomainAVX
  33434. p.add(0, func(m *_Encoding, v []interface{}) {
  33435. m.vex2(3, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  33436. m.emit(0xd0)
  33437. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  33438. })
  33439. }
  33440. // VADDSUBPS ymm, ymm, ymm
  33441. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  33442. self.require(ISA_AVX)
  33443. p.domain = DomainAVX
  33444. p.add(0, func(m *_Encoding, v []interface{}) {
  33445. m.vex2(7, hcode(v[2]), v[0], hlcode(v[1]))
  33446. m.emit(0xd0)
  33447. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33448. })
  33449. }
  33450. // VADDSUBPS m256, ymm, ymm
  33451. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  33452. self.require(ISA_AVX)
  33453. p.domain = DomainAVX
  33454. p.add(0, func(m *_Encoding, v []interface{}) {
  33455. m.vex2(7, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  33456. m.emit(0xd0)
  33457. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  33458. })
  33459. }
  33460. if p.len == 0 {
  33461. panic("invalid operands for VADDSUBPS")
  33462. }
  33463. return p
  33464. }
  33465. // VAESDEC performs "Perform One Round of an AES Decryption Flow".
  33466. //
  33467. // Mnemonic : VAESDEC
  33468. // Supported forms : (2 forms)
  33469. //
  33470. // * VAESDEC xmm, xmm, xmm [AES,AVX]
  33471. // * VAESDEC m128, xmm, xmm [AES,AVX]
  33472. //
  33473. func (self *Program) VAESDEC(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  33474. p := self.alloc("VAESDEC", 3, Operands { v0, v1, v2 })
  33475. // VAESDEC xmm, xmm, xmm
  33476. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  33477. self.require(ISA_AVX | ISA_AES)
  33478. p.domain = DomainCrypto
  33479. p.add(0, func(m *_Encoding, v []interface{}) {
  33480. m.emit(0xc4)
  33481. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  33482. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  33483. m.emit(0xde)
  33484. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33485. })
  33486. }
  33487. // VAESDEC m128, xmm, xmm
  33488. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  33489. self.require(ISA_AVX | ISA_AES)
  33490. p.domain = DomainCrypto
  33491. p.add(0, func(m *_Encoding, v []interface{}) {
  33492. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  33493. m.emit(0xde)
  33494. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  33495. })
  33496. }
  33497. if p.len == 0 {
  33498. panic("invalid operands for VAESDEC")
  33499. }
  33500. return p
  33501. }
  33502. // VAESDECLAST performs "Perform Last Round of an AES Decryption Flow".
  33503. //
  33504. // Mnemonic : VAESDECLAST
  33505. // Supported forms : (2 forms)
  33506. //
  33507. // * VAESDECLAST xmm, xmm, xmm [AES,AVX]
  33508. // * VAESDECLAST m128, xmm, xmm [AES,AVX]
  33509. //
  33510. func (self *Program) VAESDECLAST(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  33511. p := self.alloc("VAESDECLAST", 3, Operands { v0, v1, v2 })
  33512. // VAESDECLAST xmm, xmm, xmm
  33513. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  33514. self.require(ISA_AVX | ISA_AES)
  33515. p.domain = DomainCrypto
  33516. p.add(0, func(m *_Encoding, v []interface{}) {
  33517. m.emit(0xc4)
  33518. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  33519. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  33520. m.emit(0xdf)
  33521. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33522. })
  33523. }
  33524. // VAESDECLAST m128, xmm, xmm
  33525. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  33526. self.require(ISA_AVX | ISA_AES)
  33527. p.domain = DomainCrypto
  33528. p.add(0, func(m *_Encoding, v []interface{}) {
  33529. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  33530. m.emit(0xdf)
  33531. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  33532. })
  33533. }
  33534. if p.len == 0 {
  33535. panic("invalid operands for VAESDECLAST")
  33536. }
  33537. return p
  33538. }
  33539. // VAESENC performs "Perform One Round of an AES Encryption Flow".
  33540. //
  33541. // Mnemonic : VAESENC
  33542. // Supported forms : (2 forms)
  33543. //
  33544. // * VAESENC xmm, xmm, xmm [AES,AVX]
  33545. // * VAESENC m128, xmm, xmm [AES,AVX]
  33546. //
  33547. func (self *Program) VAESENC(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  33548. p := self.alloc("VAESENC", 3, Operands { v0, v1, v2 })
  33549. // VAESENC xmm, xmm, xmm
  33550. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  33551. self.require(ISA_AVX | ISA_AES)
  33552. p.domain = DomainCrypto
  33553. p.add(0, func(m *_Encoding, v []interface{}) {
  33554. m.emit(0xc4)
  33555. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  33556. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  33557. m.emit(0xdc)
  33558. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33559. })
  33560. }
  33561. // VAESENC m128, xmm, xmm
  33562. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  33563. self.require(ISA_AVX | ISA_AES)
  33564. p.domain = DomainCrypto
  33565. p.add(0, func(m *_Encoding, v []interface{}) {
  33566. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  33567. m.emit(0xdc)
  33568. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  33569. })
  33570. }
  33571. if p.len == 0 {
  33572. panic("invalid operands for VAESENC")
  33573. }
  33574. return p
  33575. }
  33576. // VAESENCLAST performs "Perform Last Round of an AES Encryption Flow".
  33577. //
  33578. // Mnemonic : VAESENCLAST
  33579. // Supported forms : (2 forms)
  33580. //
  33581. // * VAESENCLAST xmm, xmm, xmm [AES,AVX]
  33582. // * VAESENCLAST m128, xmm, xmm [AES,AVX]
  33583. //
  33584. func (self *Program) VAESENCLAST(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  33585. p := self.alloc("VAESENCLAST", 3, Operands { v0, v1, v2 })
  33586. // VAESENCLAST xmm, xmm, xmm
  33587. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  33588. self.require(ISA_AVX | ISA_AES)
  33589. p.domain = DomainCrypto
  33590. p.add(0, func(m *_Encoding, v []interface{}) {
  33591. m.emit(0xc4)
  33592. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  33593. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  33594. m.emit(0xdd)
  33595. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33596. })
  33597. }
  33598. // VAESENCLAST m128, xmm, xmm
  33599. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  33600. self.require(ISA_AVX | ISA_AES)
  33601. p.domain = DomainCrypto
  33602. p.add(0, func(m *_Encoding, v []interface{}) {
  33603. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  33604. m.emit(0xdd)
  33605. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  33606. })
  33607. }
  33608. if p.len == 0 {
  33609. panic("invalid operands for VAESENCLAST")
  33610. }
  33611. return p
  33612. }
  33613. // VAESIMC performs "Perform the AES InvMixColumn Transformation".
  33614. //
  33615. // Mnemonic : VAESIMC
  33616. // Supported forms : (2 forms)
  33617. //
  33618. // * VAESIMC xmm, xmm [AES,AVX]
  33619. // * VAESIMC m128, xmm [AES,AVX]
  33620. //
  33621. func (self *Program) VAESIMC(v0 interface{}, v1 interface{}) *Instruction {
  33622. p := self.alloc("VAESIMC", 2, Operands { v0, v1 })
  33623. // VAESIMC xmm, xmm
  33624. if isXMM(v0) && isXMM(v1) {
  33625. self.require(ISA_AVX | ISA_AES)
  33626. p.domain = DomainCrypto
  33627. p.add(0, func(m *_Encoding, v []interface{}) {
  33628. m.emit(0xc4)
  33629. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  33630. m.emit(0x79)
  33631. m.emit(0xdb)
  33632. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  33633. })
  33634. }
  33635. // VAESIMC m128, xmm
  33636. if isM128(v0) && isXMM(v1) {
  33637. self.require(ISA_AVX | ISA_AES)
  33638. p.domain = DomainCrypto
  33639. p.add(0, func(m *_Encoding, v []interface{}) {
  33640. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  33641. m.emit(0xdb)
  33642. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  33643. })
  33644. }
  33645. if p.len == 0 {
  33646. panic("invalid operands for VAESIMC")
  33647. }
  33648. return p
  33649. }
  33650. // VAESKEYGENASSIST performs "AES Round Key Generation Assist".
  33651. //
  33652. // Mnemonic : VAESKEYGENASSIST
  33653. // Supported forms : (2 forms)
  33654. //
  33655. // * VAESKEYGENASSIST imm8, xmm, xmm [AES,AVX]
  33656. // * VAESKEYGENASSIST imm8, m128, xmm [AES,AVX]
  33657. //
  33658. func (self *Program) VAESKEYGENASSIST(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  33659. p := self.alloc("VAESKEYGENASSIST", 3, Operands { v0, v1, v2 })
  33660. // VAESKEYGENASSIST imm8, xmm, xmm
  33661. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  33662. self.require(ISA_AVX | ISA_AES)
  33663. p.domain = DomainCrypto
  33664. p.add(0, func(m *_Encoding, v []interface{}) {
  33665. m.emit(0xc4)
  33666. m.emit(0xe3 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  33667. m.emit(0x79)
  33668. m.emit(0xdf)
  33669. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  33670. m.imm1(toImmAny(v[0]))
  33671. })
  33672. }
  33673. // VAESKEYGENASSIST imm8, m128, xmm
  33674. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  33675. self.require(ISA_AVX | ISA_AES)
  33676. p.domain = DomainCrypto
  33677. p.add(0, func(m *_Encoding, v []interface{}) {
  33678. m.vex3(0xc4, 0b11, 0x01, hcode(v[2]), addr(v[1]), 0)
  33679. m.emit(0xdf)
  33680. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  33681. m.imm1(toImmAny(v[0]))
  33682. })
  33683. }
  33684. if p.len == 0 {
  33685. panic("invalid operands for VAESKEYGENASSIST")
  33686. }
  33687. return p
  33688. }
  33689. // VALIGND performs "Align Doubleword Vectors".
  33690. //
  33691. // Mnemonic : VALIGND
  33692. // Supported forms : (6 forms)
  33693. //
  33694. // * VALIGND imm8, m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  33695. // * VALIGND imm8, zmm, zmm, zmm{k}{z} [AVX512F]
  33696. // * VALIGND imm8, m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  33697. // * VALIGND imm8, xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  33698. // * VALIGND imm8, m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  33699. // * VALIGND imm8, ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  33700. //
  33701. func (self *Program) VALIGND(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  33702. p := self.alloc("VALIGND", 4, Operands { v0, v1, v2, v3 })
  33703. // VALIGND imm8, m512/m32bcst, zmm, zmm{k}{z}
  33704. if isImm8(v0) && isM512M32bcst(v1) && isZMM(v2) && isZMMkz(v3) {
  33705. self.require(ISA_AVX512F)
  33706. p.domain = DomainAVX
  33707. p.add(0, func(m *_Encoding, v []interface{}) {
  33708. m.evex(0b11, 0x05, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  33709. m.emit(0x03)
  33710. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  33711. m.imm1(toImmAny(v[0]))
  33712. })
  33713. }
  33714. // VALIGND imm8, zmm, zmm, zmm{k}{z}
  33715. if isImm8(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(v3) {
  33716. self.require(ISA_AVX512F)
  33717. p.domain = DomainAVX
  33718. p.add(0, func(m *_Encoding, v []interface{}) {
  33719. m.emit(0x62)
  33720. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  33721. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  33722. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  33723. m.emit(0x03)
  33724. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  33725. m.imm1(toImmAny(v[0]))
  33726. })
  33727. }
  33728. // VALIGND imm8, m128/m32bcst, xmm, xmm{k}{z}
  33729. if isImm8(v0) && isM128M32bcst(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  33730. self.require(ISA_AVX512VL | ISA_AVX512F)
  33731. p.domain = DomainAVX
  33732. p.add(0, func(m *_Encoding, v []interface{}) {
  33733. m.evex(0b11, 0x05, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  33734. m.emit(0x03)
  33735. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  33736. m.imm1(toImmAny(v[0]))
  33737. })
  33738. }
  33739. // VALIGND imm8, xmm, xmm, xmm{k}{z}
  33740. if isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  33741. self.require(ISA_AVX512VL | ISA_AVX512F)
  33742. p.domain = DomainAVX
  33743. p.add(0, func(m *_Encoding, v []interface{}) {
  33744. m.emit(0x62)
  33745. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  33746. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  33747. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  33748. m.emit(0x03)
  33749. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  33750. m.imm1(toImmAny(v[0]))
  33751. })
  33752. }
  33753. // VALIGND imm8, m256/m32bcst, ymm, ymm{k}{z}
  33754. if isImm8(v0) && isM256M32bcst(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  33755. self.require(ISA_AVX512VL | ISA_AVX512F)
  33756. p.domain = DomainAVX
  33757. p.add(0, func(m *_Encoding, v []interface{}) {
  33758. m.evex(0b11, 0x05, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  33759. m.emit(0x03)
  33760. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  33761. m.imm1(toImmAny(v[0]))
  33762. })
  33763. }
  33764. // VALIGND imm8, ymm, ymm, ymm{k}{z}
  33765. if isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  33766. self.require(ISA_AVX512VL | ISA_AVX512F)
  33767. p.domain = DomainAVX
  33768. p.add(0, func(m *_Encoding, v []interface{}) {
  33769. m.emit(0x62)
  33770. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  33771. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  33772. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  33773. m.emit(0x03)
  33774. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  33775. m.imm1(toImmAny(v[0]))
  33776. })
  33777. }
  33778. if p.len == 0 {
  33779. panic("invalid operands for VALIGND")
  33780. }
  33781. return p
  33782. }
  33783. // VALIGNQ performs "Align Quadword Vectors".
  33784. //
  33785. // Mnemonic : VALIGNQ
  33786. // Supported forms : (6 forms)
  33787. //
  33788. // * VALIGNQ imm8, m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  33789. // * VALIGNQ imm8, zmm, zmm, zmm{k}{z} [AVX512F]
  33790. // * VALIGNQ imm8, m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  33791. // * VALIGNQ imm8, xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  33792. // * VALIGNQ imm8, m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  33793. // * VALIGNQ imm8, ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  33794. //
  33795. func (self *Program) VALIGNQ(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  33796. p := self.alloc("VALIGNQ", 4, Operands { v0, v1, v2, v3 })
  33797. // VALIGNQ imm8, m512/m64bcst, zmm, zmm{k}{z}
  33798. if isImm8(v0) && isM512M64bcst(v1) && isZMM(v2) && isZMMkz(v3) {
  33799. self.require(ISA_AVX512F)
  33800. p.domain = DomainAVX
  33801. p.add(0, func(m *_Encoding, v []interface{}) {
  33802. m.evex(0b11, 0x85, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  33803. m.emit(0x03)
  33804. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  33805. m.imm1(toImmAny(v[0]))
  33806. })
  33807. }
  33808. // VALIGNQ imm8, zmm, zmm, zmm{k}{z}
  33809. if isImm8(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(v3) {
  33810. self.require(ISA_AVX512F)
  33811. p.domain = DomainAVX
  33812. p.add(0, func(m *_Encoding, v []interface{}) {
  33813. m.emit(0x62)
  33814. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  33815. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  33816. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  33817. m.emit(0x03)
  33818. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  33819. m.imm1(toImmAny(v[0]))
  33820. })
  33821. }
  33822. // VALIGNQ imm8, m128/m64bcst, xmm, xmm{k}{z}
  33823. if isImm8(v0) && isM128M64bcst(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  33824. self.require(ISA_AVX512VL | ISA_AVX512F)
  33825. p.domain = DomainAVX
  33826. p.add(0, func(m *_Encoding, v []interface{}) {
  33827. m.evex(0b11, 0x85, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  33828. m.emit(0x03)
  33829. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  33830. m.imm1(toImmAny(v[0]))
  33831. })
  33832. }
  33833. // VALIGNQ imm8, xmm, xmm, xmm{k}{z}
  33834. if isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  33835. self.require(ISA_AVX512VL | ISA_AVX512F)
  33836. p.domain = DomainAVX
  33837. p.add(0, func(m *_Encoding, v []interface{}) {
  33838. m.emit(0x62)
  33839. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  33840. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  33841. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  33842. m.emit(0x03)
  33843. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  33844. m.imm1(toImmAny(v[0]))
  33845. })
  33846. }
  33847. // VALIGNQ imm8, m256/m64bcst, ymm, ymm{k}{z}
  33848. if isImm8(v0) && isM256M64bcst(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  33849. self.require(ISA_AVX512VL | ISA_AVX512F)
  33850. p.domain = DomainAVX
  33851. p.add(0, func(m *_Encoding, v []interface{}) {
  33852. m.evex(0b11, 0x85, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  33853. m.emit(0x03)
  33854. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  33855. m.imm1(toImmAny(v[0]))
  33856. })
  33857. }
  33858. // VALIGNQ imm8, ymm, ymm, ymm{k}{z}
  33859. if isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  33860. self.require(ISA_AVX512VL | ISA_AVX512F)
  33861. p.domain = DomainAVX
  33862. p.add(0, func(m *_Encoding, v []interface{}) {
  33863. m.emit(0x62)
  33864. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  33865. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  33866. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  33867. m.emit(0x03)
  33868. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  33869. m.imm1(toImmAny(v[0]))
  33870. })
  33871. }
  33872. if p.len == 0 {
  33873. panic("invalid operands for VALIGNQ")
  33874. }
  33875. return p
  33876. }
  33877. // VANDNPD performs "Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values".
  33878. //
  33879. // Mnemonic : VANDNPD
  33880. // Supported forms : (10 forms)
  33881. //
  33882. // * VANDNPD xmm, xmm, xmm [AVX]
  33883. // * VANDNPD m128, xmm, xmm [AVX]
  33884. // * VANDNPD ymm, ymm, ymm [AVX]
  33885. // * VANDNPD m256, ymm, ymm [AVX]
  33886. // * VANDNPD m512/m64bcst, zmm, zmm{k}{z} [AVX512DQ]
  33887. // * VANDNPD zmm, zmm, zmm{k}{z} [AVX512DQ]
  33888. // * VANDNPD m128/m64bcst, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  33889. // * VANDNPD xmm, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  33890. // * VANDNPD m256/m64bcst, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  33891. // * VANDNPD ymm, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  33892. //
  33893. func (self *Program) VANDNPD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  33894. p := self.alloc("VANDNPD", 3, Operands { v0, v1, v2 })
  33895. // VANDNPD xmm, xmm, xmm
  33896. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  33897. self.require(ISA_AVX)
  33898. p.domain = DomainAVX
  33899. p.add(0, func(m *_Encoding, v []interface{}) {
  33900. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  33901. m.emit(0x55)
  33902. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33903. })
  33904. }
  33905. // VANDNPD m128, xmm, xmm
  33906. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  33907. self.require(ISA_AVX)
  33908. p.domain = DomainAVX
  33909. p.add(0, func(m *_Encoding, v []interface{}) {
  33910. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  33911. m.emit(0x55)
  33912. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  33913. })
  33914. }
  33915. // VANDNPD ymm, ymm, ymm
  33916. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  33917. self.require(ISA_AVX)
  33918. p.domain = DomainAVX
  33919. p.add(0, func(m *_Encoding, v []interface{}) {
  33920. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  33921. m.emit(0x55)
  33922. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33923. })
  33924. }
  33925. // VANDNPD m256, ymm, ymm
  33926. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  33927. self.require(ISA_AVX)
  33928. p.domain = DomainAVX
  33929. p.add(0, func(m *_Encoding, v []interface{}) {
  33930. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  33931. m.emit(0x55)
  33932. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  33933. })
  33934. }
  33935. // VANDNPD m512/m64bcst, zmm, zmm{k}{z}
  33936. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  33937. self.require(ISA_AVX512DQ)
  33938. p.domain = DomainAVX
  33939. p.add(0, func(m *_Encoding, v []interface{}) {
  33940. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  33941. m.emit(0x55)
  33942. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  33943. })
  33944. }
  33945. // VANDNPD zmm, zmm, zmm{k}{z}
  33946. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  33947. self.require(ISA_AVX512DQ)
  33948. p.domain = DomainAVX
  33949. p.add(0, func(m *_Encoding, v []interface{}) {
  33950. m.emit(0x62)
  33951. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  33952. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  33953. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  33954. m.emit(0x55)
  33955. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33956. })
  33957. }
  33958. // VANDNPD m128/m64bcst, xmm, xmm{k}{z}
  33959. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  33960. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  33961. p.domain = DomainAVX
  33962. p.add(0, func(m *_Encoding, v []interface{}) {
  33963. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  33964. m.emit(0x55)
  33965. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  33966. })
  33967. }
  33968. // VANDNPD xmm, xmm, xmm{k}{z}
  33969. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  33970. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  33971. p.domain = DomainAVX
  33972. p.add(0, func(m *_Encoding, v []interface{}) {
  33973. m.emit(0x62)
  33974. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  33975. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  33976. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  33977. m.emit(0x55)
  33978. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  33979. })
  33980. }
  33981. // VANDNPD m256/m64bcst, ymm, ymm{k}{z}
  33982. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  33983. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  33984. p.domain = DomainAVX
  33985. p.add(0, func(m *_Encoding, v []interface{}) {
  33986. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  33987. m.emit(0x55)
  33988. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  33989. })
  33990. }
  33991. // VANDNPD ymm, ymm, ymm{k}{z}
  33992. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  33993. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  33994. p.domain = DomainAVX
  33995. p.add(0, func(m *_Encoding, v []interface{}) {
  33996. m.emit(0x62)
  33997. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  33998. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  33999. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  34000. m.emit(0x55)
  34001. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  34002. })
  34003. }
  34004. if p.len == 0 {
  34005. panic("invalid operands for VANDNPD")
  34006. }
  34007. return p
  34008. }
  34009. // VANDNPS performs "Bitwise Logical AND NOT of Packed Single-Precision Floating-Point Values".
  34010. //
  34011. // Mnemonic : VANDNPS
  34012. // Supported forms : (10 forms)
  34013. //
  34014. // * VANDNPS xmm, xmm, xmm [AVX]
  34015. // * VANDNPS m128, xmm, xmm [AVX]
  34016. // * VANDNPS ymm, ymm, ymm [AVX]
  34017. // * VANDNPS m256, ymm, ymm [AVX]
  34018. // * VANDNPS m512/m32bcst, zmm, zmm{k}{z} [AVX512DQ]
  34019. // * VANDNPS zmm, zmm, zmm{k}{z} [AVX512DQ]
  34020. // * VANDNPS m128/m32bcst, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  34021. // * VANDNPS xmm, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  34022. // * VANDNPS m256/m32bcst, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  34023. // * VANDNPS ymm, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  34024. //
  34025. func (self *Program) VANDNPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  34026. p := self.alloc("VANDNPS", 3, Operands { v0, v1, v2 })
  34027. // VANDNPS xmm, xmm, xmm
  34028. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  34029. self.require(ISA_AVX)
  34030. p.domain = DomainAVX
  34031. p.add(0, func(m *_Encoding, v []interface{}) {
  34032. m.vex2(0, hcode(v[2]), v[0], hlcode(v[1]))
  34033. m.emit(0x55)
  34034. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  34035. })
  34036. }
  34037. // VANDNPS m128, xmm, xmm
  34038. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  34039. self.require(ISA_AVX)
  34040. p.domain = DomainAVX
  34041. p.add(0, func(m *_Encoding, v []interface{}) {
  34042. m.vex2(0, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  34043. m.emit(0x55)
  34044. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  34045. })
  34046. }
  34047. // VANDNPS ymm, ymm, ymm
  34048. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  34049. self.require(ISA_AVX)
  34050. p.domain = DomainAVX
  34051. p.add(0, func(m *_Encoding, v []interface{}) {
  34052. m.vex2(4, hcode(v[2]), v[0], hlcode(v[1]))
  34053. m.emit(0x55)
  34054. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  34055. })
  34056. }
  34057. // VANDNPS m256, ymm, ymm
  34058. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  34059. self.require(ISA_AVX)
  34060. p.domain = DomainAVX
  34061. p.add(0, func(m *_Encoding, v []interface{}) {
  34062. m.vex2(4, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  34063. m.emit(0x55)
  34064. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  34065. })
  34066. }
  34067. // VANDNPS m512/m32bcst, zmm, zmm{k}{z}
  34068. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  34069. self.require(ISA_AVX512DQ)
  34070. p.domain = DomainAVX
  34071. p.add(0, func(m *_Encoding, v []interface{}) {
  34072. m.evex(0b01, 0x04, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  34073. m.emit(0x55)
  34074. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  34075. })
  34076. }
  34077. // VANDNPS zmm, zmm, zmm{k}{z}
  34078. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  34079. self.require(ISA_AVX512DQ)
  34080. p.domain = DomainAVX
  34081. p.add(0, func(m *_Encoding, v []interface{}) {
  34082. m.emit(0x62)
  34083. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  34084. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  34085. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  34086. m.emit(0x55)
  34087. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  34088. })
  34089. }
  34090. // VANDNPS m128/m32bcst, xmm, xmm{k}{z}
  34091. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  34092. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  34093. p.domain = DomainAVX
  34094. p.add(0, func(m *_Encoding, v []interface{}) {
  34095. m.evex(0b01, 0x04, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  34096. m.emit(0x55)
  34097. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  34098. })
  34099. }
  34100. // VANDNPS xmm, xmm, xmm{k}{z}
  34101. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  34102. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  34103. p.domain = DomainAVX
  34104. p.add(0, func(m *_Encoding, v []interface{}) {
  34105. m.emit(0x62)
  34106. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  34107. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  34108. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  34109. m.emit(0x55)
  34110. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  34111. })
  34112. }
  34113. // VANDNPS m256/m32bcst, ymm, ymm{k}{z}
  34114. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  34115. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  34116. p.domain = DomainAVX
  34117. p.add(0, func(m *_Encoding, v []interface{}) {
  34118. m.evex(0b01, 0x04, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  34119. m.emit(0x55)
  34120. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  34121. })
  34122. }
  34123. // VANDNPS ymm, ymm, ymm{k}{z}
  34124. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  34125. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  34126. p.domain = DomainAVX
  34127. p.add(0, func(m *_Encoding, v []interface{}) {
  34128. m.emit(0x62)
  34129. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  34130. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  34131. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  34132. m.emit(0x55)
  34133. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  34134. })
  34135. }
  34136. if p.len == 0 {
  34137. panic("invalid operands for VANDNPS")
  34138. }
  34139. return p
  34140. }
  34141. // VANDPD performs "Bitwise Logical AND of Packed Double-Precision Floating-Point Values".
  34142. //
  34143. // Mnemonic : VANDPD
  34144. // Supported forms : (10 forms)
  34145. //
  34146. // * VANDPD xmm, xmm, xmm [AVX]
  34147. // * VANDPD m128, xmm, xmm [AVX]
  34148. // * VANDPD ymm, ymm, ymm [AVX]
  34149. // * VANDPD m256, ymm, ymm [AVX]
  34150. // * VANDPD m512/m64bcst, zmm, zmm{k}{z} [AVX512DQ]
  34151. // * VANDPD zmm, zmm, zmm{k}{z} [AVX512DQ]
  34152. // * VANDPD m128/m64bcst, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  34153. // * VANDPD xmm, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  34154. // * VANDPD m256/m64bcst, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  34155. // * VANDPD ymm, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  34156. //
  34157. func (self *Program) VANDPD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  34158. p := self.alloc("VANDPD", 3, Operands { v0, v1, v2 })
  34159. // VANDPD xmm, xmm, xmm
  34160. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  34161. self.require(ISA_AVX)
  34162. p.domain = DomainAVX
  34163. p.add(0, func(m *_Encoding, v []interface{}) {
  34164. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  34165. m.emit(0x54)
  34166. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  34167. })
  34168. }
  34169. // VANDPD m128, xmm, xmm
  34170. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  34171. self.require(ISA_AVX)
  34172. p.domain = DomainAVX
  34173. p.add(0, func(m *_Encoding, v []interface{}) {
  34174. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  34175. m.emit(0x54)
  34176. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  34177. })
  34178. }
  34179. // VANDPD ymm, ymm, ymm
  34180. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  34181. self.require(ISA_AVX)
  34182. p.domain = DomainAVX
  34183. p.add(0, func(m *_Encoding, v []interface{}) {
  34184. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  34185. m.emit(0x54)
  34186. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  34187. })
  34188. }
  34189. // VANDPD m256, ymm, ymm
  34190. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  34191. self.require(ISA_AVX)
  34192. p.domain = DomainAVX
  34193. p.add(0, func(m *_Encoding, v []interface{}) {
  34194. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  34195. m.emit(0x54)
  34196. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  34197. })
  34198. }
  34199. // VANDPD m512/m64bcst, zmm, zmm{k}{z}
  34200. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  34201. self.require(ISA_AVX512DQ)
  34202. p.domain = DomainAVX
  34203. p.add(0, func(m *_Encoding, v []interface{}) {
  34204. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  34205. m.emit(0x54)
  34206. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  34207. })
  34208. }
  34209. // VANDPD zmm, zmm, zmm{k}{z}
  34210. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  34211. self.require(ISA_AVX512DQ)
  34212. p.domain = DomainAVX
  34213. p.add(0, func(m *_Encoding, v []interface{}) {
  34214. m.emit(0x62)
  34215. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  34216. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  34217. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  34218. m.emit(0x54)
  34219. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  34220. })
  34221. }
  34222. // VANDPD m128/m64bcst, xmm, xmm{k}{z}
  34223. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  34224. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  34225. p.domain = DomainAVX
  34226. p.add(0, func(m *_Encoding, v []interface{}) {
  34227. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  34228. m.emit(0x54)
  34229. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  34230. })
  34231. }
  34232. // VANDPD xmm, xmm, xmm{k}{z}
  34233. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  34234. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  34235. p.domain = DomainAVX
  34236. p.add(0, func(m *_Encoding, v []interface{}) {
  34237. m.emit(0x62)
  34238. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  34239. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  34240. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  34241. m.emit(0x54)
  34242. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  34243. })
  34244. }
  34245. // VANDPD m256/m64bcst, ymm, ymm{k}{z}
  34246. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  34247. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  34248. p.domain = DomainAVX
  34249. p.add(0, func(m *_Encoding, v []interface{}) {
  34250. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  34251. m.emit(0x54)
  34252. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  34253. })
  34254. }
  34255. // VANDPD ymm, ymm, ymm{k}{z}
  34256. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  34257. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  34258. p.domain = DomainAVX
  34259. p.add(0, func(m *_Encoding, v []interface{}) {
  34260. m.emit(0x62)
  34261. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  34262. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  34263. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  34264. m.emit(0x54)
  34265. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  34266. })
  34267. }
  34268. if p.len == 0 {
  34269. panic("invalid operands for VANDPD")
  34270. }
  34271. return p
  34272. }
  34273. // VANDPS performs "Bitwise Logical AND of Packed Single-Precision Floating-Point Values".
  34274. //
  34275. // Mnemonic : VANDPS
  34276. // Supported forms : (10 forms)
  34277. //
  34278. // * VANDPS xmm, xmm, xmm [AVX]
  34279. // * VANDPS m128, xmm, xmm [AVX]
  34280. // * VANDPS ymm, ymm, ymm [AVX]
  34281. // * VANDPS m256, ymm, ymm [AVX]
  34282. // * VANDPS m512/m32bcst, zmm, zmm{k}{z} [AVX512DQ]
  34283. // * VANDPS zmm, zmm, zmm{k}{z} [AVX512DQ]
  34284. // * VANDPS m128/m32bcst, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  34285. // * VANDPS xmm, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  34286. // * VANDPS m256/m32bcst, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  34287. // * VANDPS ymm, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  34288. //
  34289. func (self *Program) VANDPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  34290. p := self.alloc("VANDPS", 3, Operands { v0, v1, v2 })
  34291. // VANDPS xmm, xmm, xmm
  34292. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  34293. self.require(ISA_AVX)
  34294. p.domain = DomainAVX
  34295. p.add(0, func(m *_Encoding, v []interface{}) {
  34296. m.vex2(0, hcode(v[2]), v[0], hlcode(v[1]))
  34297. m.emit(0x54)
  34298. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  34299. })
  34300. }
  34301. // VANDPS m128, xmm, xmm
  34302. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  34303. self.require(ISA_AVX)
  34304. p.domain = DomainAVX
  34305. p.add(0, func(m *_Encoding, v []interface{}) {
  34306. m.vex2(0, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  34307. m.emit(0x54)
  34308. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  34309. })
  34310. }
  34311. // VANDPS ymm, ymm, ymm
  34312. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  34313. self.require(ISA_AVX)
  34314. p.domain = DomainAVX
  34315. p.add(0, func(m *_Encoding, v []interface{}) {
  34316. m.vex2(4, hcode(v[2]), v[0], hlcode(v[1]))
  34317. m.emit(0x54)
  34318. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  34319. })
  34320. }
  34321. // VANDPS m256, ymm, ymm
  34322. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  34323. self.require(ISA_AVX)
  34324. p.domain = DomainAVX
  34325. p.add(0, func(m *_Encoding, v []interface{}) {
  34326. m.vex2(4, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  34327. m.emit(0x54)
  34328. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  34329. })
  34330. }
  34331. // VANDPS m512/m32bcst, zmm, zmm{k}{z}
  34332. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  34333. self.require(ISA_AVX512DQ)
  34334. p.domain = DomainAVX
  34335. p.add(0, func(m *_Encoding, v []interface{}) {
  34336. m.evex(0b01, 0x04, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  34337. m.emit(0x54)
  34338. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  34339. })
  34340. }
  34341. // VANDPS zmm, zmm, zmm{k}{z}
  34342. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  34343. self.require(ISA_AVX512DQ)
  34344. p.domain = DomainAVX
  34345. p.add(0, func(m *_Encoding, v []interface{}) {
  34346. m.emit(0x62)
  34347. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  34348. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  34349. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  34350. m.emit(0x54)
  34351. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  34352. })
  34353. }
  34354. // VANDPS m128/m32bcst, xmm, xmm{k}{z}
  34355. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  34356. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  34357. p.domain = DomainAVX
  34358. p.add(0, func(m *_Encoding, v []interface{}) {
  34359. m.evex(0b01, 0x04, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  34360. m.emit(0x54)
  34361. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  34362. })
  34363. }
  34364. // VANDPS xmm, xmm, xmm{k}{z}
  34365. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  34366. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  34367. p.domain = DomainAVX
  34368. p.add(0, func(m *_Encoding, v []interface{}) {
  34369. m.emit(0x62)
  34370. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  34371. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  34372. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  34373. m.emit(0x54)
  34374. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  34375. })
  34376. }
  34377. // VANDPS m256/m32bcst, ymm, ymm{k}{z}
  34378. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  34379. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  34380. p.domain = DomainAVX
  34381. p.add(0, func(m *_Encoding, v []interface{}) {
  34382. m.evex(0b01, 0x04, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  34383. m.emit(0x54)
  34384. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  34385. })
  34386. }
  34387. // VANDPS ymm, ymm, ymm{k}{z}
  34388. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  34389. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  34390. p.domain = DomainAVX
  34391. p.add(0, func(m *_Encoding, v []interface{}) {
  34392. m.emit(0x62)
  34393. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  34394. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  34395. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  34396. m.emit(0x54)
  34397. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  34398. })
  34399. }
  34400. if p.len == 0 {
  34401. panic("invalid operands for VANDPS")
  34402. }
  34403. return p
  34404. }
  34405. // VBLENDMPD performs "Blend Packed Double-Precision Floating-Point Vectors Using an OpMask Control".
  34406. //
  34407. // Mnemonic : VBLENDMPD
  34408. // Supported forms : (6 forms)
  34409. //
  34410. // * VBLENDMPD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  34411. // * VBLENDMPD zmm, zmm, zmm{k}{z} [AVX512F]
  34412. // * VBLENDMPD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  34413. // * VBLENDMPD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  34414. // * VBLENDMPD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  34415. // * VBLENDMPD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  34416. //
  34417. func (self *Program) VBLENDMPD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  34418. p := self.alloc("VBLENDMPD", 3, Operands { v0, v1, v2 })
  34419. // VBLENDMPD m512/m64bcst, zmm, zmm{k}{z}
  34420. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  34421. self.require(ISA_AVX512F)
  34422. p.domain = DomainAVX
  34423. p.add(0, func(m *_Encoding, v []interface{}) {
  34424. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  34425. m.emit(0x65)
  34426. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  34427. })
  34428. }
  34429. // VBLENDMPD zmm, zmm, zmm{k}{z}
  34430. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  34431. self.require(ISA_AVX512F)
  34432. p.domain = DomainAVX
  34433. p.add(0, func(m *_Encoding, v []interface{}) {
  34434. m.emit(0x62)
  34435. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  34436. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  34437. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  34438. m.emit(0x65)
  34439. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  34440. })
  34441. }
  34442. // VBLENDMPD m128/m64bcst, xmm, xmm{k}{z}
  34443. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  34444. self.require(ISA_AVX512VL | ISA_AVX512F)
  34445. p.domain = DomainAVX
  34446. p.add(0, func(m *_Encoding, v []interface{}) {
  34447. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  34448. m.emit(0x65)
  34449. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  34450. })
  34451. }
  34452. // VBLENDMPD xmm, xmm, xmm{k}{z}
  34453. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  34454. self.require(ISA_AVX512VL | ISA_AVX512F)
  34455. p.domain = DomainAVX
  34456. p.add(0, func(m *_Encoding, v []interface{}) {
  34457. m.emit(0x62)
  34458. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  34459. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  34460. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  34461. m.emit(0x65)
  34462. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  34463. })
  34464. }
  34465. // VBLENDMPD m256/m64bcst, ymm, ymm{k}{z}
  34466. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  34467. self.require(ISA_AVX512VL | ISA_AVX512F)
  34468. p.domain = DomainAVX
  34469. p.add(0, func(m *_Encoding, v []interface{}) {
  34470. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  34471. m.emit(0x65)
  34472. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  34473. })
  34474. }
  34475. // VBLENDMPD ymm, ymm, ymm{k}{z}
  34476. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  34477. self.require(ISA_AVX512VL | ISA_AVX512F)
  34478. p.domain = DomainAVX
  34479. p.add(0, func(m *_Encoding, v []interface{}) {
  34480. m.emit(0x62)
  34481. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  34482. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  34483. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  34484. m.emit(0x65)
  34485. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  34486. })
  34487. }
  34488. if p.len == 0 {
  34489. panic("invalid operands for VBLENDMPD")
  34490. }
  34491. return p
  34492. }
  34493. // VBLENDMPS performs "Blend Packed Single-Precision Floating-Point Vectors Using an OpMask Control".
  34494. //
  34495. // Mnemonic : VBLENDMPS
  34496. // Supported forms : (6 forms)
  34497. //
  34498. // * VBLENDMPS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  34499. // * VBLENDMPS zmm, zmm, zmm{k}{z} [AVX512F]
  34500. // * VBLENDMPS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  34501. // * VBLENDMPS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  34502. // * VBLENDMPS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  34503. // * VBLENDMPS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  34504. //
  34505. func (self *Program) VBLENDMPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  34506. p := self.alloc("VBLENDMPS", 3, Operands { v0, v1, v2 })
  34507. // VBLENDMPS m512/m32bcst, zmm, zmm{k}{z}
  34508. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  34509. self.require(ISA_AVX512F)
  34510. p.domain = DomainAVX
  34511. p.add(0, func(m *_Encoding, v []interface{}) {
  34512. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  34513. m.emit(0x65)
  34514. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  34515. })
  34516. }
  34517. // VBLENDMPS zmm, zmm, zmm{k}{z}
  34518. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  34519. self.require(ISA_AVX512F)
  34520. p.domain = DomainAVX
  34521. p.add(0, func(m *_Encoding, v []interface{}) {
  34522. m.emit(0x62)
  34523. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  34524. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  34525. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  34526. m.emit(0x65)
  34527. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  34528. })
  34529. }
  34530. // VBLENDMPS m128/m32bcst, xmm, xmm{k}{z}
  34531. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  34532. self.require(ISA_AVX512VL | ISA_AVX512F)
  34533. p.domain = DomainAVX
  34534. p.add(0, func(m *_Encoding, v []interface{}) {
  34535. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  34536. m.emit(0x65)
  34537. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  34538. })
  34539. }
  34540. // VBLENDMPS xmm, xmm, xmm{k}{z}
  34541. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  34542. self.require(ISA_AVX512VL | ISA_AVX512F)
  34543. p.domain = DomainAVX
  34544. p.add(0, func(m *_Encoding, v []interface{}) {
  34545. m.emit(0x62)
  34546. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  34547. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  34548. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  34549. m.emit(0x65)
  34550. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  34551. })
  34552. }
  34553. // VBLENDMPS m256/m32bcst, ymm, ymm{k}{z}
  34554. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  34555. self.require(ISA_AVX512VL | ISA_AVX512F)
  34556. p.domain = DomainAVX
  34557. p.add(0, func(m *_Encoding, v []interface{}) {
  34558. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  34559. m.emit(0x65)
  34560. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  34561. })
  34562. }
  34563. // VBLENDMPS ymm, ymm, ymm{k}{z}
  34564. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  34565. self.require(ISA_AVX512VL | ISA_AVX512F)
  34566. p.domain = DomainAVX
  34567. p.add(0, func(m *_Encoding, v []interface{}) {
  34568. m.emit(0x62)
  34569. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  34570. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  34571. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  34572. m.emit(0x65)
  34573. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  34574. })
  34575. }
  34576. if p.len == 0 {
  34577. panic("invalid operands for VBLENDMPS")
  34578. }
  34579. return p
  34580. }
  34581. // VBLENDPD performs "Blend Packed Double Precision Floating-Point Values".
  34582. //
  34583. // Mnemonic : VBLENDPD
  34584. // Supported forms : (4 forms)
  34585. //
  34586. // * VBLENDPD imm8, xmm, xmm, xmm [AVX]
  34587. // * VBLENDPD imm8, m128, xmm, xmm [AVX]
  34588. // * VBLENDPD imm8, ymm, ymm, ymm [AVX]
  34589. // * VBLENDPD imm8, m256, ymm, ymm [AVX]
  34590. //
  34591. func (self *Program) VBLENDPD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  34592. p := self.alloc("VBLENDPD", 4, Operands { v0, v1, v2, v3 })
  34593. // VBLENDPD imm8, xmm, xmm, xmm
  34594. if isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  34595. self.require(ISA_AVX)
  34596. p.domain = DomainAVX
  34597. p.add(0, func(m *_Encoding, v []interface{}) {
  34598. m.emit(0xc4)
  34599. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  34600. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  34601. m.emit(0x0d)
  34602. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  34603. m.imm1(toImmAny(v[0]))
  34604. })
  34605. }
  34606. // VBLENDPD imm8, m128, xmm, xmm
  34607. if isImm8(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  34608. self.require(ISA_AVX)
  34609. p.domain = DomainAVX
  34610. p.add(0, func(m *_Encoding, v []interface{}) {
  34611. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  34612. m.emit(0x0d)
  34613. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  34614. m.imm1(toImmAny(v[0]))
  34615. })
  34616. }
  34617. // VBLENDPD imm8, ymm, ymm, ymm
  34618. if isImm8(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  34619. self.require(ISA_AVX)
  34620. p.domain = DomainAVX
  34621. p.add(0, func(m *_Encoding, v []interface{}) {
  34622. m.emit(0xc4)
  34623. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  34624. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  34625. m.emit(0x0d)
  34626. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  34627. m.imm1(toImmAny(v[0]))
  34628. })
  34629. }
  34630. // VBLENDPD imm8, m256, ymm, ymm
  34631. if isImm8(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  34632. self.require(ISA_AVX)
  34633. p.domain = DomainAVX
  34634. p.add(0, func(m *_Encoding, v []interface{}) {
  34635. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  34636. m.emit(0x0d)
  34637. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  34638. m.imm1(toImmAny(v[0]))
  34639. })
  34640. }
  34641. if p.len == 0 {
  34642. panic("invalid operands for VBLENDPD")
  34643. }
  34644. return p
  34645. }
  34646. // VBLENDPS performs " Blend Packed Single Precision Floating-Point Values".
  34647. //
  34648. // Mnemonic : VBLENDPS
  34649. // Supported forms : (4 forms)
  34650. //
  34651. // * VBLENDPS imm8, xmm, xmm, xmm [AVX]
  34652. // * VBLENDPS imm8, m128, xmm, xmm [AVX]
  34653. // * VBLENDPS imm8, ymm, ymm, ymm [AVX]
  34654. // * VBLENDPS imm8, m256, ymm, ymm [AVX]
  34655. //
  34656. func (self *Program) VBLENDPS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  34657. p := self.alloc("VBLENDPS", 4, Operands { v0, v1, v2, v3 })
  34658. // VBLENDPS imm8, xmm, xmm, xmm
  34659. if isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  34660. self.require(ISA_AVX)
  34661. p.domain = DomainAVX
  34662. p.add(0, func(m *_Encoding, v []interface{}) {
  34663. m.emit(0xc4)
  34664. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  34665. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  34666. m.emit(0x0c)
  34667. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  34668. m.imm1(toImmAny(v[0]))
  34669. })
  34670. }
  34671. // VBLENDPS imm8, m128, xmm, xmm
  34672. if isImm8(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  34673. self.require(ISA_AVX)
  34674. p.domain = DomainAVX
  34675. p.add(0, func(m *_Encoding, v []interface{}) {
  34676. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  34677. m.emit(0x0c)
  34678. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  34679. m.imm1(toImmAny(v[0]))
  34680. })
  34681. }
  34682. // VBLENDPS imm8, ymm, ymm, ymm
  34683. if isImm8(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  34684. self.require(ISA_AVX)
  34685. p.domain = DomainAVX
  34686. p.add(0, func(m *_Encoding, v []interface{}) {
  34687. m.emit(0xc4)
  34688. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  34689. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  34690. m.emit(0x0c)
  34691. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  34692. m.imm1(toImmAny(v[0]))
  34693. })
  34694. }
  34695. // VBLENDPS imm8, m256, ymm, ymm
  34696. if isImm8(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  34697. self.require(ISA_AVX)
  34698. p.domain = DomainAVX
  34699. p.add(0, func(m *_Encoding, v []interface{}) {
  34700. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  34701. m.emit(0x0c)
  34702. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  34703. m.imm1(toImmAny(v[0]))
  34704. })
  34705. }
  34706. if p.len == 0 {
  34707. panic("invalid operands for VBLENDPS")
  34708. }
  34709. return p
  34710. }
  34711. // VBLENDVPD performs " Variable Blend Packed Double Precision Floating-Point Values".
  34712. //
  34713. // Mnemonic : VBLENDVPD
  34714. // Supported forms : (4 forms)
  34715. //
  34716. // * VBLENDVPD xmm, xmm, xmm, xmm [AVX]
  34717. // * VBLENDVPD xmm, m128, xmm, xmm [AVX]
  34718. // * VBLENDVPD ymm, ymm, ymm, ymm [AVX]
  34719. // * VBLENDVPD ymm, m256, ymm, ymm [AVX]
  34720. //
  34721. func (self *Program) VBLENDVPD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  34722. p := self.alloc("VBLENDVPD", 4, Operands { v0, v1, v2, v3 })
  34723. // VBLENDVPD xmm, xmm, xmm, xmm
  34724. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  34725. self.require(ISA_AVX)
  34726. p.domain = DomainAVX
  34727. p.add(0, func(m *_Encoding, v []interface{}) {
  34728. m.emit(0xc4)
  34729. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  34730. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  34731. m.emit(0x4b)
  34732. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  34733. m.emit(hlcode(v[0]) << 4)
  34734. })
  34735. }
  34736. // VBLENDVPD xmm, m128, xmm, xmm
  34737. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  34738. self.require(ISA_AVX)
  34739. p.domain = DomainAVX
  34740. p.add(0, func(m *_Encoding, v []interface{}) {
  34741. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  34742. m.emit(0x4b)
  34743. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  34744. m.emit(hlcode(v[0]) << 4)
  34745. })
  34746. }
  34747. // VBLENDVPD ymm, ymm, ymm, ymm
  34748. if isYMM(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  34749. self.require(ISA_AVX)
  34750. p.domain = DomainAVX
  34751. p.add(0, func(m *_Encoding, v []interface{}) {
  34752. m.emit(0xc4)
  34753. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  34754. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  34755. m.emit(0x4b)
  34756. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  34757. m.emit(hlcode(v[0]) << 4)
  34758. })
  34759. }
  34760. // VBLENDVPD ymm, m256, ymm, ymm
  34761. if isYMM(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  34762. self.require(ISA_AVX)
  34763. p.domain = DomainAVX
  34764. p.add(0, func(m *_Encoding, v []interface{}) {
  34765. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  34766. m.emit(0x4b)
  34767. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  34768. m.emit(hlcode(v[0]) << 4)
  34769. })
  34770. }
  34771. if p.len == 0 {
  34772. panic("invalid operands for VBLENDVPD")
  34773. }
  34774. return p
  34775. }
  34776. // VBLENDVPS performs " Variable Blend Packed Single Precision Floating-Point Values".
  34777. //
  34778. // Mnemonic : VBLENDVPS
  34779. // Supported forms : (4 forms)
  34780. //
  34781. // * VBLENDVPS xmm, xmm, xmm, xmm [AVX]
  34782. // * VBLENDVPS xmm, m128, xmm, xmm [AVX]
  34783. // * VBLENDVPS ymm, ymm, ymm, ymm [AVX]
  34784. // * VBLENDVPS ymm, m256, ymm, ymm [AVX]
  34785. //
  34786. func (self *Program) VBLENDVPS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  34787. p := self.alloc("VBLENDVPS", 4, Operands { v0, v1, v2, v3 })
  34788. // VBLENDVPS xmm, xmm, xmm, xmm
  34789. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  34790. self.require(ISA_AVX)
  34791. p.domain = DomainAVX
  34792. p.add(0, func(m *_Encoding, v []interface{}) {
  34793. m.emit(0xc4)
  34794. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  34795. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  34796. m.emit(0x4a)
  34797. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  34798. m.emit(hlcode(v[0]) << 4)
  34799. })
  34800. }
  34801. // VBLENDVPS xmm, m128, xmm, xmm
  34802. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  34803. self.require(ISA_AVX)
  34804. p.domain = DomainAVX
  34805. p.add(0, func(m *_Encoding, v []interface{}) {
  34806. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  34807. m.emit(0x4a)
  34808. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  34809. m.emit(hlcode(v[0]) << 4)
  34810. })
  34811. }
  34812. // VBLENDVPS ymm, ymm, ymm, ymm
  34813. if isYMM(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  34814. self.require(ISA_AVX)
  34815. p.domain = DomainAVX
  34816. p.add(0, func(m *_Encoding, v []interface{}) {
  34817. m.emit(0xc4)
  34818. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  34819. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  34820. m.emit(0x4a)
  34821. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  34822. m.emit(hlcode(v[0]) << 4)
  34823. })
  34824. }
  34825. // VBLENDVPS ymm, m256, ymm, ymm
  34826. if isYMM(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  34827. self.require(ISA_AVX)
  34828. p.domain = DomainAVX
  34829. p.add(0, func(m *_Encoding, v []interface{}) {
  34830. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  34831. m.emit(0x4a)
  34832. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  34833. m.emit(hlcode(v[0]) << 4)
  34834. })
  34835. }
  34836. if p.len == 0 {
  34837. panic("invalid operands for VBLENDVPS")
  34838. }
  34839. return p
  34840. }
  34841. // VBROADCASTF128 performs "Broadcast 128 Bit of Floating-Point Data".
  34842. //
  34843. // Mnemonic : VBROADCASTF128
  34844. // Supported forms : (1 form)
  34845. //
  34846. // * VBROADCASTF128 m128, ymm [AVX]
  34847. //
  34848. func (self *Program) VBROADCASTF128(v0 interface{}, v1 interface{}) *Instruction {
  34849. p := self.alloc("VBROADCASTF128", 2, Operands { v0, v1 })
  34850. // VBROADCASTF128 m128, ymm
  34851. if isM128(v0) && isYMM(v1) {
  34852. self.require(ISA_AVX)
  34853. p.domain = DomainAVX
  34854. p.add(0, func(m *_Encoding, v []interface{}) {
  34855. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  34856. m.emit(0x1a)
  34857. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  34858. })
  34859. }
  34860. if p.len == 0 {
  34861. panic("invalid operands for VBROADCASTF128")
  34862. }
  34863. return p
  34864. }
  34865. // VBROADCASTF32X2 performs "Broadcast Two Single-Precision Floating-Point Elements".
  34866. //
  34867. // Mnemonic : VBROADCASTF32X2
  34868. // Supported forms : (4 forms)
  34869. //
  34870. // * VBROADCASTF32X2 xmm, zmm{k}{z} [AVX512DQ]
  34871. // * VBROADCASTF32X2 m64, zmm{k}{z} [AVX512DQ]
  34872. // * VBROADCASTF32X2 xmm, ymm{k}{z} [AVX512DQ,AVX512VL]
  34873. // * VBROADCASTF32X2 m64, ymm{k}{z} [AVX512DQ,AVX512VL]
  34874. //
  34875. func (self *Program) VBROADCASTF32X2(v0 interface{}, v1 interface{}) *Instruction {
  34876. p := self.alloc("VBROADCASTF32X2", 2, Operands { v0, v1 })
  34877. // VBROADCASTF32X2 xmm, zmm{k}{z}
  34878. if isEVEXXMM(v0) && isZMMkz(v1) {
  34879. self.require(ISA_AVX512DQ)
  34880. p.domain = DomainAVX
  34881. p.add(0, func(m *_Encoding, v []interface{}) {
  34882. m.emit(0x62)
  34883. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  34884. m.emit(0x7d)
  34885. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  34886. m.emit(0x19)
  34887. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  34888. })
  34889. }
  34890. // VBROADCASTF32X2 m64, zmm{k}{z}
  34891. if isM64(v0) && isZMMkz(v1) {
  34892. self.require(ISA_AVX512DQ)
  34893. p.domain = DomainAVX
  34894. p.add(0, func(m *_Encoding, v []interface{}) {
  34895. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  34896. m.emit(0x19)
  34897. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  34898. })
  34899. }
  34900. // VBROADCASTF32X2 xmm, ymm{k}{z}
  34901. if isEVEXXMM(v0) && isYMMkz(v1) {
  34902. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  34903. p.domain = DomainAVX
  34904. p.add(0, func(m *_Encoding, v []interface{}) {
  34905. m.emit(0x62)
  34906. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  34907. m.emit(0x7d)
  34908. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  34909. m.emit(0x19)
  34910. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  34911. })
  34912. }
  34913. // VBROADCASTF32X2 m64, ymm{k}{z}
  34914. if isM64(v0) && isYMMkz(v1) {
  34915. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  34916. p.domain = DomainAVX
  34917. p.add(0, func(m *_Encoding, v []interface{}) {
  34918. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  34919. m.emit(0x19)
  34920. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  34921. })
  34922. }
  34923. if p.len == 0 {
  34924. panic("invalid operands for VBROADCASTF32X2")
  34925. }
  34926. return p
  34927. }
  34928. // VBROADCASTF32X4 performs "Broadcast Four Single-Precision Floating-Point Elements".
  34929. //
  34930. // Mnemonic : VBROADCASTF32X4
  34931. // Supported forms : (2 forms)
  34932. //
  34933. // * VBROADCASTF32X4 m128, zmm{k}{z} [AVX512F]
  34934. // * VBROADCASTF32X4 m128, ymm{k}{z} [AVX512F,AVX512VL]
  34935. //
  34936. func (self *Program) VBROADCASTF32X4(v0 interface{}, v1 interface{}) *Instruction {
  34937. p := self.alloc("VBROADCASTF32X4", 2, Operands { v0, v1 })
  34938. // VBROADCASTF32X4 m128, zmm{k}{z}
  34939. if isM128(v0) && isZMMkz(v1) {
  34940. self.require(ISA_AVX512F)
  34941. p.domain = DomainAVX
  34942. p.add(0, func(m *_Encoding, v []interface{}) {
  34943. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  34944. m.emit(0x1a)
  34945. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  34946. })
  34947. }
  34948. // VBROADCASTF32X4 m128, ymm{k}{z}
  34949. if isM128(v0) && isYMMkz(v1) {
  34950. self.require(ISA_AVX512VL | ISA_AVX512F)
  34951. p.domain = DomainAVX
  34952. p.add(0, func(m *_Encoding, v []interface{}) {
  34953. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  34954. m.emit(0x1a)
  34955. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  34956. })
  34957. }
  34958. if p.len == 0 {
  34959. panic("invalid operands for VBROADCASTF32X4")
  34960. }
  34961. return p
  34962. }
  34963. // VBROADCASTF32X8 performs "Broadcast Eight Single-Precision Floating-Point Elements".
  34964. //
  34965. // Mnemonic : VBROADCASTF32X8
  34966. // Supported forms : (1 form)
  34967. //
  34968. // * VBROADCASTF32X8 m256, zmm{k}{z} [AVX512DQ]
  34969. //
  34970. func (self *Program) VBROADCASTF32X8(v0 interface{}, v1 interface{}) *Instruction {
  34971. p := self.alloc("VBROADCASTF32X8", 2, Operands { v0, v1 })
  34972. // VBROADCASTF32X8 m256, zmm{k}{z}
  34973. if isM256(v0) && isZMMkz(v1) {
  34974. self.require(ISA_AVX512DQ)
  34975. p.domain = DomainAVX
  34976. p.add(0, func(m *_Encoding, v []interface{}) {
  34977. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  34978. m.emit(0x1b)
  34979. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  34980. })
  34981. }
  34982. if p.len == 0 {
  34983. panic("invalid operands for VBROADCASTF32X8")
  34984. }
  34985. return p
  34986. }
  34987. // VBROADCASTF64X2 performs "Broadcast Two Double-Precision Floating-Point Elements".
  34988. //
  34989. // Mnemonic : VBROADCASTF64X2
  34990. // Supported forms : (2 forms)
  34991. //
  34992. // * VBROADCASTF64X2 m128, zmm{k}{z} [AVX512DQ]
  34993. // * VBROADCASTF64X2 m128, ymm{k}{z} [AVX512DQ,AVX512VL]
  34994. //
  34995. func (self *Program) VBROADCASTF64X2(v0 interface{}, v1 interface{}) *Instruction {
  34996. p := self.alloc("VBROADCASTF64X2", 2, Operands { v0, v1 })
  34997. // VBROADCASTF64X2 m128, zmm{k}{z}
  34998. if isM128(v0) && isZMMkz(v1) {
  34999. self.require(ISA_AVX512DQ)
  35000. p.domain = DomainAVX
  35001. p.add(0, func(m *_Encoding, v []interface{}) {
  35002. m.evex(0b10, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  35003. m.emit(0x1a)
  35004. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  35005. })
  35006. }
  35007. // VBROADCASTF64X2 m128, ymm{k}{z}
  35008. if isM128(v0) && isYMMkz(v1) {
  35009. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  35010. p.domain = DomainAVX
  35011. p.add(0, func(m *_Encoding, v []interface{}) {
  35012. m.evex(0b10, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  35013. m.emit(0x1a)
  35014. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  35015. })
  35016. }
  35017. if p.len == 0 {
  35018. panic("invalid operands for VBROADCASTF64X2")
  35019. }
  35020. return p
  35021. }
  35022. // VBROADCASTF64X4 performs "Broadcast Four Double-Precision Floating-Point Elements".
  35023. //
  35024. // Mnemonic : VBROADCASTF64X4
  35025. // Supported forms : (1 form)
  35026. //
  35027. // * VBROADCASTF64X4 m256, zmm{k}{z} [AVX512F]
  35028. //
  35029. func (self *Program) VBROADCASTF64X4(v0 interface{}, v1 interface{}) *Instruction {
  35030. p := self.alloc("VBROADCASTF64X4", 2, Operands { v0, v1 })
  35031. // VBROADCASTF64X4 m256, zmm{k}{z}
  35032. if isM256(v0) && isZMMkz(v1) {
  35033. self.require(ISA_AVX512F)
  35034. p.domain = DomainAVX
  35035. p.add(0, func(m *_Encoding, v []interface{}) {
  35036. m.evex(0b10, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  35037. m.emit(0x1b)
  35038. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  35039. })
  35040. }
  35041. if p.len == 0 {
  35042. panic("invalid operands for VBROADCASTF64X4")
  35043. }
  35044. return p
  35045. }
  35046. // VBROADCASTI128 performs "Broadcast 128 Bits of Integer Data".
  35047. //
  35048. // Mnemonic : VBROADCASTI128
  35049. // Supported forms : (1 form)
  35050. //
  35051. // * VBROADCASTI128 m128, ymm [AVX2]
  35052. //
  35053. func (self *Program) VBROADCASTI128(v0 interface{}, v1 interface{}) *Instruction {
  35054. p := self.alloc("VBROADCASTI128", 2, Operands { v0, v1 })
  35055. // VBROADCASTI128 m128, ymm
  35056. if isM128(v0) && isYMM(v1) {
  35057. self.require(ISA_AVX2)
  35058. p.domain = DomainAVX
  35059. p.add(0, func(m *_Encoding, v []interface{}) {
  35060. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  35061. m.emit(0x5a)
  35062. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  35063. })
  35064. }
  35065. if p.len == 0 {
  35066. panic("invalid operands for VBROADCASTI128")
  35067. }
  35068. return p
  35069. }
  35070. // VBROADCASTI32X2 performs "Broadcast Two Doubleword Elements".
  35071. //
  35072. // Mnemonic : VBROADCASTI32X2
  35073. // Supported forms : (6 forms)
  35074. //
  35075. // * VBROADCASTI32X2 xmm, zmm{k}{z} [AVX512DQ]
  35076. // * VBROADCASTI32X2 m64, zmm{k}{z} [AVX512DQ]
  35077. // * VBROADCASTI32X2 xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  35078. // * VBROADCASTI32X2 xmm, ymm{k}{z} [AVX512DQ,AVX512VL]
  35079. // * VBROADCASTI32X2 m64, xmm{k}{z} [AVX512DQ,AVX512VL]
  35080. // * VBROADCASTI32X2 m64, ymm{k}{z} [AVX512DQ,AVX512VL]
  35081. //
  35082. func (self *Program) VBROADCASTI32X2(v0 interface{}, v1 interface{}) *Instruction {
  35083. p := self.alloc("VBROADCASTI32X2", 2, Operands { v0, v1 })
  35084. // VBROADCASTI32X2 xmm, zmm{k}{z}
  35085. if isEVEXXMM(v0) && isZMMkz(v1) {
  35086. self.require(ISA_AVX512DQ)
  35087. p.domain = DomainAVX
  35088. p.add(0, func(m *_Encoding, v []interface{}) {
  35089. m.emit(0x62)
  35090. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  35091. m.emit(0x7d)
  35092. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  35093. m.emit(0x59)
  35094. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  35095. })
  35096. }
  35097. // VBROADCASTI32X2 m64, zmm{k}{z}
  35098. if isM64(v0) && isZMMkz(v1) {
  35099. self.require(ISA_AVX512DQ)
  35100. p.domain = DomainAVX
  35101. p.add(0, func(m *_Encoding, v []interface{}) {
  35102. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  35103. m.emit(0x59)
  35104. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  35105. })
  35106. }
  35107. // VBROADCASTI32X2 xmm, xmm{k}{z}
  35108. if isEVEXXMM(v0) && isXMMkz(v1) {
  35109. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  35110. p.domain = DomainAVX
  35111. p.add(0, func(m *_Encoding, v []interface{}) {
  35112. m.emit(0x62)
  35113. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  35114. m.emit(0x7d)
  35115. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  35116. m.emit(0x59)
  35117. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  35118. })
  35119. }
  35120. // VBROADCASTI32X2 xmm, ymm{k}{z}
  35121. if isEVEXXMM(v0) && isYMMkz(v1) {
  35122. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  35123. p.domain = DomainAVX
  35124. p.add(0, func(m *_Encoding, v []interface{}) {
  35125. m.emit(0x62)
  35126. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  35127. m.emit(0x7d)
  35128. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  35129. m.emit(0x59)
  35130. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  35131. })
  35132. }
  35133. // VBROADCASTI32X2 m64, xmm{k}{z}
  35134. if isM64(v0) && isXMMkz(v1) {
  35135. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  35136. p.domain = DomainAVX
  35137. p.add(0, func(m *_Encoding, v []interface{}) {
  35138. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  35139. m.emit(0x59)
  35140. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  35141. })
  35142. }
  35143. // VBROADCASTI32X2 m64, ymm{k}{z}
  35144. if isM64(v0) && isYMMkz(v1) {
  35145. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  35146. p.domain = DomainAVX
  35147. p.add(0, func(m *_Encoding, v []interface{}) {
  35148. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  35149. m.emit(0x59)
  35150. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  35151. })
  35152. }
  35153. if p.len == 0 {
  35154. panic("invalid operands for VBROADCASTI32X2")
  35155. }
  35156. return p
  35157. }
  35158. // VBROADCASTI32X4 performs "Broadcast Four Doubleword Elements".
  35159. //
  35160. // Mnemonic : VBROADCASTI32X4
  35161. // Supported forms : (2 forms)
  35162. //
  35163. // * VBROADCASTI32X4 m128, zmm{k}{z} [AVX512F]
  35164. // * VBROADCASTI32X4 m128, ymm{k}{z} [AVX512F,AVX512VL]
  35165. //
  35166. func (self *Program) VBROADCASTI32X4(v0 interface{}, v1 interface{}) *Instruction {
  35167. p := self.alloc("VBROADCASTI32X4", 2, Operands { v0, v1 })
  35168. // VBROADCASTI32X4 m128, zmm{k}{z}
  35169. if isM128(v0) && isZMMkz(v1) {
  35170. self.require(ISA_AVX512F)
  35171. p.domain = DomainAVX
  35172. p.add(0, func(m *_Encoding, v []interface{}) {
  35173. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  35174. m.emit(0x5a)
  35175. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  35176. })
  35177. }
  35178. // VBROADCASTI32X4 m128, ymm{k}{z}
  35179. if isM128(v0) && isYMMkz(v1) {
  35180. self.require(ISA_AVX512VL | ISA_AVX512F)
  35181. p.domain = DomainAVX
  35182. p.add(0, func(m *_Encoding, v []interface{}) {
  35183. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  35184. m.emit(0x5a)
  35185. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  35186. })
  35187. }
  35188. if p.len == 0 {
  35189. panic("invalid operands for VBROADCASTI32X4")
  35190. }
  35191. return p
  35192. }
  35193. // VBROADCASTI32X8 performs "Broadcast Eight Doubleword Elements".
  35194. //
  35195. // Mnemonic : VBROADCASTI32X8
  35196. // Supported forms : (1 form)
  35197. //
  35198. // * VBROADCASTI32X8 m256, zmm{k}{z} [AVX512DQ]
  35199. //
  35200. func (self *Program) VBROADCASTI32X8(v0 interface{}, v1 interface{}) *Instruction {
  35201. p := self.alloc("VBROADCASTI32X8", 2, Operands { v0, v1 })
  35202. // VBROADCASTI32X8 m256, zmm{k}{z}
  35203. if isM256(v0) && isZMMkz(v1) {
  35204. self.require(ISA_AVX512DQ)
  35205. p.domain = DomainAVX
  35206. p.add(0, func(m *_Encoding, v []interface{}) {
  35207. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  35208. m.emit(0x5b)
  35209. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  35210. })
  35211. }
  35212. if p.len == 0 {
  35213. panic("invalid operands for VBROADCASTI32X8")
  35214. }
  35215. return p
  35216. }
  35217. // VBROADCASTI64X2 performs "Broadcast Two Quadword Elements".
  35218. //
  35219. // Mnemonic : VBROADCASTI64X2
  35220. // Supported forms : (2 forms)
  35221. //
  35222. // * VBROADCASTI64X2 m128, zmm{k}{z} [AVX512DQ]
  35223. // * VBROADCASTI64X2 m128, ymm{k}{z} [AVX512DQ,AVX512VL]
  35224. //
  35225. func (self *Program) VBROADCASTI64X2(v0 interface{}, v1 interface{}) *Instruction {
  35226. p := self.alloc("VBROADCASTI64X2", 2, Operands { v0, v1 })
  35227. // VBROADCASTI64X2 m128, zmm{k}{z}
  35228. if isM128(v0) && isZMMkz(v1) {
  35229. self.require(ISA_AVX512DQ)
  35230. p.domain = DomainAVX
  35231. p.add(0, func(m *_Encoding, v []interface{}) {
  35232. m.evex(0b10, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  35233. m.emit(0x5a)
  35234. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  35235. })
  35236. }
  35237. // VBROADCASTI64X2 m128, ymm{k}{z}
  35238. if isM128(v0) && isYMMkz(v1) {
  35239. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  35240. p.domain = DomainAVX
  35241. p.add(0, func(m *_Encoding, v []interface{}) {
  35242. m.evex(0b10, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  35243. m.emit(0x5a)
  35244. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  35245. })
  35246. }
  35247. if p.len == 0 {
  35248. panic("invalid operands for VBROADCASTI64X2")
  35249. }
  35250. return p
  35251. }
  35252. // VBROADCASTI64X4 performs "Broadcast Four Quadword Elements".
  35253. //
  35254. // Mnemonic : VBROADCASTI64X4
  35255. // Supported forms : (1 form)
  35256. //
  35257. // * VBROADCASTI64X4 m256, zmm{k}{z} [AVX512F]
  35258. //
  35259. func (self *Program) VBROADCASTI64X4(v0 interface{}, v1 interface{}) *Instruction {
  35260. p := self.alloc("VBROADCASTI64X4", 2, Operands { v0, v1 })
  35261. // VBROADCASTI64X4 m256, zmm{k}{z}
  35262. if isM256(v0) && isZMMkz(v1) {
  35263. self.require(ISA_AVX512F)
  35264. p.domain = DomainAVX
  35265. p.add(0, func(m *_Encoding, v []interface{}) {
  35266. m.evex(0b10, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  35267. m.emit(0x5b)
  35268. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  35269. })
  35270. }
  35271. if p.len == 0 {
  35272. panic("invalid operands for VBROADCASTI64X4")
  35273. }
  35274. return p
  35275. }
  35276. // VBROADCASTSD performs "Broadcast Double-Precision Floating-Point Element".
  35277. //
  35278. // Mnemonic : VBROADCASTSD
  35279. // Supported forms : (6 forms)
  35280. //
  35281. // * VBROADCASTSD m64, ymm [AVX]
  35282. // * VBROADCASTSD xmm, ymm [AVX2]
  35283. // * VBROADCASTSD xmm, zmm{k}{z} [AVX512F]
  35284. // * VBROADCASTSD m64, zmm{k}{z} [AVX512F]
  35285. // * VBROADCASTSD xmm, ymm{k}{z} [AVX512F,AVX512VL]
  35286. // * VBROADCASTSD m64, ymm{k}{z} [AVX512F,AVX512VL]
  35287. //
  35288. func (self *Program) VBROADCASTSD(v0 interface{}, v1 interface{}) *Instruction {
  35289. p := self.alloc("VBROADCASTSD", 2, Operands { v0, v1 })
  35290. // VBROADCASTSD m64, ymm
  35291. if isM64(v0) && isYMM(v1) {
  35292. self.require(ISA_AVX)
  35293. p.domain = DomainAVX
  35294. p.add(0, func(m *_Encoding, v []interface{}) {
  35295. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  35296. m.emit(0x19)
  35297. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  35298. })
  35299. }
  35300. // VBROADCASTSD xmm, ymm
  35301. if isXMM(v0) && isYMM(v1) {
  35302. self.require(ISA_AVX2)
  35303. p.domain = DomainAVX
  35304. p.add(0, func(m *_Encoding, v []interface{}) {
  35305. m.emit(0xc4)
  35306. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  35307. m.emit(0x7d)
  35308. m.emit(0x19)
  35309. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  35310. })
  35311. }
  35312. // VBROADCASTSD xmm, zmm{k}{z}
  35313. if isEVEXXMM(v0) && isZMMkz(v1) {
  35314. self.require(ISA_AVX512F)
  35315. p.domain = DomainAVX
  35316. p.add(0, func(m *_Encoding, v []interface{}) {
  35317. m.emit(0x62)
  35318. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  35319. m.emit(0xfd)
  35320. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  35321. m.emit(0x19)
  35322. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  35323. })
  35324. }
  35325. // VBROADCASTSD m64, zmm{k}{z}
  35326. if isM64(v0) && isZMMkz(v1) {
  35327. self.require(ISA_AVX512F)
  35328. p.domain = DomainAVX
  35329. p.add(0, func(m *_Encoding, v []interface{}) {
  35330. m.evex(0b10, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  35331. m.emit(0x19)
  35332. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  35333. })
  35334. }
  35335. // VBROADCASTSD xmm, ymm{k}{z}
  35336. if isEVEXXMM(v0) && isYMMkz(v1) {
  35337. self.require(ISA_AVX512VL | ISA_AVX512F)
  35338. p.domain = DomainAVX
  35339. p.add(0, func(m *_Encoding, v []interface{}) {
  35340. m.emit(0x62)
  35341. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  35342. m.emit(0xfd)
  35343. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  35344. m.emit(0x19)
  35345. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  35346. })
  35347. }
  35348. // VBROADCASTSD m64, ymm{k}{z}
  35349. if isM64(v0) && isYMMkz(v1) {
  35350. self.require(ISA_AVX512VL | ISA_AVX512F)
  35351. p.domain = DomainAVX
  35352. p.add(0, func(m *_Encoding, v []interface{}) {
  35353. m.evex(0b10, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  35354. m.emit(0x19)
  35355. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  35356. })
  35357. }
  35358. if p.len == 0 {
  35359. panic("invalid operands for VBROADCASTSD")
  35360. }
  35361. return p
  35362. }
  35363. // VBROADCASTSS performs "Broadcast Single-Precision Floating-Point Element".
  35364. //
  35365. // Mnemonic : VBROADCASTSS
  35366. // Supported forms : (8 forms)
  35367. //
  35368. // * VBROADCASTSS m32, xmm [AVX]
  35369. // * VBROADCASTSS m32, ymm [AVX]
  35370. // * VBROADCASTSS xmm, xmm [AVX2]
  35371. // * VBROADCASTSS xmm, ymm [AVX2]
  35372. // * VBROADCASTSS xmm, zmm{k}{z} [AVX512F]
  35373. // * VBROADCASTSS m32, zmm{k}{z} [AVX512F]
  35374. // * VBROADCASTSS xmm, ymm{k}{z} [AVX512F,AVX512VL]
  35375. // * VBROADCASTSS m32, ymm{k}{z} [AVX512F,AVX512VL]
  35376. //
  35377. func (self *Program) VBROADCASTSS(v0 interface{}, v1 interface{}) *Instruction {
  35378. p := self.alloc("VBROADCASTSS", 2, Operands { v0, v1 })
  35379. // VBROADCASTSS m32, xmm
  35380. if isM32(v0) && isXMM(v1) {
  35381. self.require(ISA_AVX)
  35382. p.domain = DomainAVX
  35383. p.add(0, func(m *_Encoding, v []interface{}) {
  35384. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  35385. m.emit(0x18)
  35386. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  35387. })
  35388. }
  35389. // VBROADCASTSS m32, ymm
  35390. if isM32(v0) && isYMM(v1) {
  35391. self.require(ISA_AVX)
  35392. p.domain = DomainAVX
  35393. p.add(0, func(m *_Encoding, v []interface{}) {
  35394. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  35395. m.emit(0x18)
  35396. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  35397. })
  35398. }
  35399. // VBROADCASTSS xmm, xmm
  35400. if isXMM(v0) && isXMM(v1) {
  35401. self.require(ISA_AVX2)
  35402. p.domain = DomainAVX
  35403. p.add(0, func(m *_Encoding, v []interface{}) {
  35404. m.emit(0xc4)
  35405. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  35406. m.emit(0x79)
  35407. m.emit(0x18)
  35408. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  35409. })
  35410. }
  35411. // VBROADCASTSS xmm, ymm
  35412. if isXMM(v0) && isYMM(v1) {
  35413. self.require(ISA_AVX2)
  35414. p.domain = DomainAVX
  35415. p.add(0, func(m *_Encoding, v []interface{}) {
  35416. m.emit(0xc4)
  35417. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  35418. m.emit(0x7d)
  35419. m.emit(0x18)
  35420. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  35421. })
  35422. }
  35423. // VBROADCASTSS xmm, zmm{k}{z}
  35424. if isEVEXXMM(v0) && isZMMkz(v1) {
  35425. self.require(ISA_AVX512F)
  35426. p.domain = DomainAVX
  35427. p.add(0, func(m *_Encoding, v []interface{}) {
  35428. m.emit(0x62)
  35429. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  35430. m.emit(0x7d)
  35431. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  35432. m.emit(0x18)
  35433. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  35434. })
  35435. }
  35436. // VBROADCASTSS m32, zmm{k}{z}
  35437. if isM32(v0) && isZMMkz(v1) {
  35438. self.require(ISA_AVX512F)
  35439. p.domain = DomainAVX
  35440. p.add(0, func(m *_Encoding, v []interface{}) {
  35441. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  35442. m.emit(0x18)
  35443. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  35444. })
  35445. }
  35446. // VBROADCASTSS xmm, ymm{k}{z}
  35447. if isEVEXXMM(v0) && isYMMkz(v1) {
  35448. self.require(ISA_AVX512VL | ISA_AVX512F)
  35449. p.domain = DomainAVX
  35450. p.add(0, func(m *_Encoding, v []interface{}) {
  35451. m.emit(0x62)
  35452. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  35453. m.emit(0x7d)
  35454. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  35455. m.emit(0x18)
  35456. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  35457. })
  35458. }
  35459. // VBROADCASTSS m32, ymm{k}{z}
  35460. if isM32(v0) && isYMMkz(v1) {
  35461. self.require(ISA_AVX512VL | ISA_AVX512F)
  35462. p.domain = DomainAVX
  35463. p.add(0, func(m *_Encoding, v []interface{}) {
  35464. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  35465. m.emit(0x18)
  35466. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  35467. })
  35468. }
  35469. if p.len == 0 {
  35470. panic("invalid operands for VBROADCASTSS")
  35471. }
  35472. return p
  35473. }
  35474. // VCMPPD performs "Compare Packed Double-Precision Floating-Point Values".
  35475. //
  35476. // Mnemonic : VCMPPD
  35477. // Supported forms : (11 forms)
  35478. //
  35479. // * VCMPPD imm8, xmm, xmm, xmm [AVX]
  35480. // * VCMPPD imm8, m128, xmm, xmm [AVX]
  35481. // * VCMPPD imm8, ymm, ymm, ymm [AVX]
  35482. // * VCMPPD imm8, m256, ymm, ymm [AVX]
  35483. // * VCMPPD imm8, m512/m64bcst, zmm, k{k} [AVX512F]
  35484. // * VCMPPD imm8, {sae}, zmm, zmm, k{k} [AVX512F]
  35485. // * VCMPPD imm8, zmm, zmm, k{k} [AVX512F]
  35486. // * VCMPPD imm8, m128/m64bcst, xmm, k{k} [AVX512F,AVX512VL]
  35487. // * VCMPPD imm8, xmm, xmm, k{k} [AVX512F,AVX512VL]
  35488. // * VCMPPD imm8, m256/m64bcst, ymm, k{k} [AVX512F,AVX512VL]
  35489. // * VCMPPD imm8, ymm, ymm, k{k} [AVX512F,AVX512VL]
  35490. //
  35491. func (self *Program) VCMPPD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}, vv ...interface{}) *Instruction {
  35492. var p *Instruction
  35493. switch len(vv) {
  35494. case 0 : p = self.alloc("VCMPPD", 4, Operands { v0, v1, v2, v3 })
  35495. case 1 : p = self.alloc("VCMPPD", 5, Operands { v0, v1, v2, v3, vv[0] })
  35496. default : panic("instruction VCMPPD takes 4 or 5 operands")
  35497. }
  35498. // VCMPPD imm8, xmm, xmm, xmm
  35499. if len(vv) == 0 && isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  35500. self.require(ISA_AVX)
  35501. p.domain = DomainAVX
  35502. p.add(0, func(m *_Encoding, v []interface{}) {
  35503. m.vex2(1, hcode(v[3]), v[1], hlcode(v[2]))
  35504. m.emit(0xc2)
  35505. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  35506. m.imm1(toImmAny(v[0]))
  35507. })
  35508. }
  35509. // VCMPPD imm8, m128, xmm, xmm
  35510. if len(vv) == 0 && isImm8(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  35511. self.require(ISA_AVX)
  35512. p.domain = DomainAVX
  35513. p.add(0, func(m *_Encoding, v []interface{}) {
  35514. m.vex2(1, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  35515. m.emit(0xc2)
  35516. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  35517. m.imm1(toImmAny(v[0]))
  35518. })
  35519. }
  35520. // VCMPPD imm8, ymm, ymm, ymm
  35521. if len(vv) == 0 && isImm8(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  35522. self.require(ISA_AVX)
  35523. p.domain = DomainAVX
  35524. p.add(0, func(m *_Encoding, v []interface{}) {
  35525. m.vex2(5, hcode(v[3]), v[1], hlcode(v[2]))
  35526. m.emit(0xc2)
  35527. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  35528. m.imm1(toImmAny(v[0]))
  35529. })
  35530. }
  35531. // VCMPPD imm8, m256, ymm, ymm
  35532. if len(vv) == 0 && isImm8(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  35533. self.require(ISA_AVX)
  35534. p.domain = DomainAVX
  35535. p.add(0, func(m *_Encoding, v []interface{}) {
  35536. m.vex2(5, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  35537. m.emit(0xc2)
  35538. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  35539. m.imm1(toImmAny(v[0]))
  35540. })
  35541. }
  35542. // VCMPPD imm8, m512/m64bcst, zmm, k{k}
  35543. if len(vv) == 0 && isImm8(v0) && isM512M64bcst(v1) && isZMM(v2) && isKk(v3) {
  35544. self.require(ISA_AVX512F)
  35545. p.domain = DomainAVX
  35546. p.add(0, func(m *_Encoding, v []interface{}) {
  35547. m.evex(0b01, 0x85, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, bcode(v[1]))
  35548. m.emit(0xc2)
  35549. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  35550. m.imm1(toImmAny(v[0]))
  35551. })
  35552. }
  35553. // VCMPPD imm8, {sae}, zmm, zmm, k{k}
  35554. if len(vv) == 1 && isImm8(v0) && isSAE(v1) && isZMM(v2) && isZMM(v3) && isKk(vv[0]) {
  35555. self.require(ISA_AVX512F)
  35556. p.domain = DomainAVX
  35557. p.add(0, func(m *_Encoding, v []interface{}) {
  35558. m.emit(0x62)
  35559. m.emit(0xf1 ^ ((hcode(v[4]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[4]) << 4)))
  35560. m.emit(0xfd ^ (hlcode(v[3]) << 3))
  35561. m.emit((0x08 ^ (ecode(v[3]) << 3)) | kcode(v[4]) | 0x10)
  35562. m.emit(0xc2)
  35563. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[2]))
  35564. m.imm1(toImmAny(v[0]))
  35565. })
  35566. }
  35567. // VCMPPD imm8, zmm, zmm, k{k}
  35568. if len(vv) == 0 && isImm8(v0) && isZMM(v1) && isZMM(v2) && isKk(v3) {
  35569. self.require(ISA_AVX512F)
  35570. p.domain = DomainAVX
  35571. p.add(0, func(m *_Encoding, v []interface{}) {
  35572. m.emit(0x62)
  35573. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  35574. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  35575. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  35576. m.emit(0xc2)
  35577. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  35578. m.imm1(toImmAny(v[0]))
  35579. })
  35580. }
  35581. // VCMPPD imm8, m128/m64bcst, xmm, k{k}
  35582. if len(vv) == 0 && isImm8(v0) && isM128M64bcst(v1) && isEVEXXMM(v2) && isKk(v3) {
  35583. self.require(ISA_AVX512VL | ISA_AVX512F)
  35584. p.domain = DomainAVX
  35585. p.add(0, func(m *_Encoding, v []interface{}) {
  35586. m.evex(0b01, 0x85, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, bcode(v[1]))
  35587. m.emit(0xc2)
  35588. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  35589. m.imm1(toImmAny(v[0]))
  35590. })
  35591. }
  35592. // VCMPPD imm8, xmm, xmm, k{k}
  35593. if len(vv) == 0 && isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isKk(v3) {
  35594. self.require(ISA_AVX512VL | ISA_AVX512F)
  35595. p.domain = DomainAVX
  35596. p.add(0, func(m *_Encoding, v []interface{}) {
  35597. m.emit(0x62)
  35598. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  35599. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  35600. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  35601. m.emit(0xc2)
  35602. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  35603. m.imm1(toImmAny(v[0]))
  35604. })
  35605. }
  35606. // VCMPPD imm8, m256/m64bcst, ymm, k{k}
  35607. if len(vv) == 0 && isImm8(v0) && isM256M64bcst(v1) && isEVEXYMM(v2) && isKk(v3) {
  35608. self.require(ISA_AVX512VL | ISA_AVX512F)
  35609. p.domain = DomainAVX
  35610. p.add(0, func(m *_Encoding, v []interface{}) {
  35611. m.evex(0b01, 0x85, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, bcode(v[1]))
  35612. m.emit(0xc2)
  35613. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  35614. m.imm1(toImmAny(v[0]))
  35615. })
  35616. }
  35617. // VCMPPD imm8, ymm, ymm, k{k}
  35618. if len(vv) == 0 && isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isKk(v3) {
  35619. self.require(ISA_AVX512VL | ISA_AVX512F)
  35620. p.domain = DomainAVX
  35621. p.add(0, func(m *_Encoding, v []interface{}) {
  35622. m.emit(0x62)
  35623. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  35624. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  35625. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  35626. m.emit(0xc2)
  35627. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  35628. m.imm1(toImmAny(v[0]))
  35629. })
  35630. }
  35631. if p.len == 0 {
  35632. panic("invalid operands for VCMPPD")
  35633. }
  35634. return p
  35635. }
  35636. // VCMPPS performs "Compare Packed Single-Precision Floating-Point Values".
  35637. //
  35638. // Mnemonic : VCMPPS
  35639. // Supported forms : (11 forms)
  35640. //
  35641. // * VCMPPS imm8, xmm, xmm, xmm [AVX]
  35642. // * VCMPPS imm8, m128, xmm, xmm [AVX]
  35643. // * VCMPPS imm8, ymm, ymm, ymm [AVX]
  35644. // * VCMPPS imm8, m256, ymm, ymm [AVX]
  35645. // * VCMPPS imm8, m512/m32bcst, zmm, k{k} [AVX512F]
  35646. // * VCMPPS imm8, {sae}, zmm, zmm, k{k} [AVX512F]
  35647. // * VCMPPS imm8, zmm, zmm, k{k} [AVX512F]
  35648. // * VCMPPS imm8, m128/m32bcst, xmm, k{k} [AVX512F,AVX512VL]
  35649. // * VCMPPS imm8, xmm, xmm, k{k} [AVX512F,AVX512VL]
  35650. // * VCMPPS imm8, m256/m32bcst, ymm, k{k} [AVX512F,AVX512VL]
  35651. // * VCMPPS imm8, ymm, ymm, k{k} [AVX512F,AVX512VL]
  35652. //
  35653. func (self *Program) VCMPPS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}, vv ...interface{}) *Instruction {
  35654. var p *Instruction
  35655. switch len(vv) {
  35656. case 0 : p = self.alloc("VCMPPS", 4, Operands { v0, v1, v2, v3 })
  35657. case 1 : p = self.alloc("VCMPPS", 5, Operands { v0, v1, v2, v3, vv[0] })
  35658. default : panic("instruction VCMPPS takes 4 or 5 operands")
  35659. }
  35660. // VCMPPS imm8, xmm, xmm, xmm
  35661. if len(vv) == 0 && isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  35662. self.require(ISA_AVX)
  35663. p.domain = DomainAVX
  35664. p.add(0, func(m *_Encoding, v []interface{}) {
  35665. m.vex2(0, hcode(v[3]), v[1], hlcode(v[2]))
  35666. m.emit(0xc2)
  35667. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  35668. m.imm1(toImmAny(v[0]))
  35669. })
  35670. }
  35671. // VCMPPS imm8, m128, xmm, xmm
  35672. if len(vv) == 0 && isImm8(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  35673. self.require(ISA_AVX)
  35674. p.domain = DomainAVX
  35675. p.add(0, func(m *_Encoding, v []interface{}) {
  35676. m.vex2(0, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  35677. m.emit(0xc2)
  35678. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  35679. m.imm1(toImmAny(v[0]))
  35680. })
  35681. }
  35682. // VCMPPS imm8, ymm, ymm, ymm
  35683. if len(vv) == 0 && isImm8(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  35684. self.require(ISA_AVX)
  35685. p.domain = DomainAVX
  35686. p.add(0, func(m *_Encoding, v []interface{}) {
  35687. m.vex2(4, hcode(v[3]), v[1], hlcode(v[2]))
  35688. m.emit(0xc2)
  35689. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  35690. m.imm1(toImmAny(v[0]))
  35691. })
  35692. }
  35693. // VCMPPS imm8, m256, ymm, ymm
  35694. if len(vv) == 0 && isImm8(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  35695. self.require(ISA_AVX)
  35696. p.domain = DomainAVX
  35697. p.add(0, func(m *_Encoding, v []interface{}) {
  35698. m.vex2(4, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  35699. m.emit(0xc2)
  35700. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  35701. m.imm1(toImmAny(v[0]))
  35702. })
  35703. }
  35704. // VCMPPS imm8, m512/m32bcst, zmm, k{k}
  35705. if len(vv) == 0 && isImm8(v0) && isM512M32bcst(v1) && isZMM(v2) && isKk(v3) {
  35706. self.require(ISA_AVX512F)
  35707. p.domain = DomainAVX
  35708. p.add(0, func(m *_Encoding, v []interface{}) {
  35709. m.evex(0b01, 0x04, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, bcode(v[1]))
  35710. m.emit(0xc2)
  35711. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  35712. m.imm1(toImmAny(v[0]))
  35713. })
  35714. }
  35715. // VCMPPS imm8, {sae}, zmm, zmm, k{k}
  35716. if len(vv) == 1 && isImm8(v0) && isSAE(v1) && isZMM(v2) && isZMM(v3) && isKk(vv[0]) {
  35717. self.require(ISA_AVX512F)
  35718. p.domain = DomainAVX
  35719. p.add(0, func(m *_Encoding, v []interface{}) {
  35720. m.emit(0x62)
  35721. m.emit(0xf1 ^ ((hcode(v[4]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[4]) << 4)))
  35722. m.emit(0x7c ^ (hlcode(v[3]) << 3))
  35723. m.emit((0x08 ^ (ecode(v[3]) << 3)) | kcode(v[4]) | 0x10)
  35724. m.emit(0xc2)
  35725. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[2]))
  35726. m.imm1(toImmAny(v[0]))
  35727. })
  35728. }
  35729. // VCMPPS imm8, zmm, zmm, k{k}
  35730. if len(vv) == 0 && isImm8(v0) && isZMM(v1) && isZMM(v2) && isKk(v3) {
  35731. self.require(ISA_AVX512F)
  35732. p.domain = DomainAVX
  35733. p.add(0, func(m *_Encoding, v []interface{}) {
  35734. m.emit(0x62)
  35735. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  35736. m.emit(0x7c ^ (hlcode(v[2]) << 3))
  35737. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  35738. m.emit(0xc2)
  35739. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  35740. m.imm1(toImmAny(v[0]))
  35741. })
  35742. }
  35743. // VCMPPS imm8, m128/m32bcst, xmm, k{k}
  35744. if len(vv) == 0 && isImm8(v0) && isM128M32bcst(v1) && isEVEXXMM(v2) && isKk(v3) {
  35745. self.require(ISA_AVX512VL | ISA_AVX512F)
  35746. p.domain = DomainAVX
  35747. p.add(0, func(m *_Encoding, v []interface{}) {
  35748. m.evex(0b01, 0x04, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, bcode(v[1]))
  35749. m.emit(0xc2)
  35750. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  35751. m.imm1(toImmAny(v[0]))
  35752. })
  35753. }
  35754. // VCMPPS imm8, xmm, xmm, k{k}
  35755. if len(vv) == 0 && isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isKk(v3) {
  35756. self.require(ISA_AVX512VL | ISA_AVX512F)
  35757. p.domain = DomainAVX
  35758. p.add(0, func(m *_Encoding, v []interface{}) {
  35759. m.emit(0x62)
  35760. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  35761. m.emit(0x7c ^ (hlcode(v[2]) << 3))
  35762. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  35763. m.emit(0xc2)
  35764. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  35765. m.imm1(toImmAny(v[0]))
  35766. })
  35767. }
  35768. // VCMPPS imm8, m256/m32bcst, ymm, k{k}
  35769. if len(vv) == 0 && isImm8(v0) && isM256M32bcst(v1) && isEVEXYMM(v2) && isKk(v3) {
  35770. self.require(ISA_AVX512VL | ISA_AVX512F)
  35771. p.domain = DomainAVX
  35772. p.add(0, func(m *_Encoding, v []interface{}) {
  35773. m.evex(0b01, 0x04, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, bcode(v[1]))
  35774. m.emit(0xc2)
  35775. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  35776. m.imm1(toImmAny(v[0]))
  35777. })
  35778. }
  35779. // VCMPPS imm8, ymm, ymm, k{k}
  35780. if len(vv) == 0 && isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isKk(v3) {
  35781. self.require(ISA_AVX512VL | ISA_AVX512F)
  35782. p.domain = DomainAVX
  35783. p.add(0, func(m *_Encoding, v []interface{}) {
  35784. m.emit(0x62)
  35785. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  35786. m.emit(0x7c ^ (hlcode(v[2]) << 3))
  35787. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  35788. m.emit(0xc2)
  35789. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  35790. m.imm1(toImmAny(v[0]))
  35791. })
  35792. }
  35793. if p.len == 0 {
  35794. panic("invalid operands for VCMPPS")
  35795. }
  35796. return p
  35797. }
  35798. // VCMPSD performs "Compare Scalar Double-Precision Floating-Point Values".
  35799. //
  35800. // Mnemonic : VCMPSD
  35801. // Supported forms : (5 forms)
  35802. //
  35803. // * VCMPSD imm8, xmm, xmm, xmm [AVX]
  35804. // * VCMPSD imm8, m64, xmm, xmm [AVX]
  35805. // * VCMPSD imm8, m64, xmm, k{k} [AVX512F]
  35806. // * VCMPSD imm8, {sae}, xmm, xmm, k{k} [AVX512F]
  35807. // * VCMPSD imm8, xmm, xmm, k{k} [AVX512F]
  35808. //
  35809. func (self *Program) VCMPSD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}, vv ...interface{}) *Instruction {
  35810. var p *Instruction
  35811. switch len(vv) {
  35812. case 0 : p = self.alloc("VCMPSD", 4, Operands { v0, v1, v2, v3 })
  35813. case 1 : p = self.alloc("VCMPSD", 5, Operands { v0, v1, v2, v3, vv[0] })
  35814. default : panic("instruction VCMPSD takes 4 or 5 operands")
  35815. }
  35816. // VCMPSD imm8, xmm, xmm, xmm
  35817. if len(vv) == 0 && isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  35818. self.require(ISA_AVX)
  35819. p.domain = DomainAVX
  35820. p.add(0, func(m *_Encoding, v []interface{}) {
  35821. m.vex2(3, hcode(v[3]), v[1], hlcode(v[2]))
  35822. m.emit(0xc2)
  35823. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  35824. m.imm1(toImmAny(v[0]))
  35825. })
  35826. }
  35827. // VCMPSD imm8, m64, xmm, xmm
  35828. if len(vv) == 0 && isImm8(v0) && isM64(v1) && isXMM(v2) && isXMM(v3) {
  35829. self.require(ISA_AVX)
  35830. p.domain = DomainAVX
  35831. p.add(0, func(m *_Encoding, v []interface{}) {
  35832. m.vex2(3, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  35833. m.emit(0xc2)
  35834. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  35835. m.imm1(toImmAny(v[0]))
  35836. })
  35837. }
  35838. // VCMPSD imm8, m64, xmm, k{k}
  35839. if len(vv) == 0 && isImm8(v0) && isM64(v1) && isEVEXXMM(v2) && isKk(v3) {
  35840. self.require(ISA_AVX512F)
  35841. p.domain = DomainAVX
  35842. p.add(0, func(m *_Encoding, v []interface{}) {
  35843. m.evex(0b01, 0x87, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, 0)
  35844. m.emit(0xc2)
  35845. m.mrsd(lcode(v[3]), addr(v[1]), 8)
  35846. m.imm1(toImmAny(v[0]))
  35847. })
  35848. }
  35849. // VCMPSD imm8, {sae}, xmm, xmm, k{k}
  35850. if len(vv) == 1 && isImm8(v0) && isSAE(v1) && isEVEXXMM(v2) && isEVEXXMM(v3) && isKk(vv[0]) {
  35851. self.require(ISA_AVX512F)
  35852. p.domain = DomainAVX
  35853. p.add(0, func(m *_Encoding, v []interface{}) {
  35854. m.emit(0x62)
  35855. m.emit(0xf1 ^ ((hcode(v[4]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[4]) << 4)))
  35856. m.emit(0xff ^ (hlcode(v[3]) << 3))
  35857. m.emit((0x08 ^ (ecode(v[3]) << 3)) | kcode(v[4]) | 0x10)
  35858. m.emit(0xc2)
  35859. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[2]))
  35860. m.imm1(toImmAny(v[0]))
  35861. })
  35862. }
  35863. // VCMPSD imm8, xmm, xmm, k{k}
  35864. if len(vv) == 0 && isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isKk(v3) {
  35865. self.require(ISA_AVX512F)
  35866. p.domain = DomainAVX
  35867. p.add(0, func(m *_Encoding, v []interface{}) {
  35868. m.emit(0x62)
  35869. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  35870. m.emit(0xff ^ (hlcode(v[2]) << 3))
  35871. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  35872. m.emit(0xc2)
  35873. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  35874. m.imm1(toImmAny(v[0]))
  35875. })
  35876. }
  35877. if p.len == 0 {
  35878. panic("invalid operands for VCMPSD")
  35879. }
  35880. return p
  35881. }
  35882. // VCMPSS performs "Compare Scalar Single-Precision Floating-Point Values".
  35883. //
  35884. // Mnemonic : VCMPSS
  35885. // Supported forms : (5 forms)
  35886. //
  35887. // * VCMPSS imm8, xmm, xmm, xmm [AVX]
  35888. // * VCMPSS imm8, m32, xmm, xmm [AVX]
  35889. // * VCMPSS imm8, m32, xmm, k{k} [AVX512F]
  35890. // * VCMPSS imm8, {sae}, xmm, xmm, k{k} [AVX512F]
  35891. // * VCMPSS imm8, xmm, xmm, k{k} [AVX512F]
  35892. //
  35893. func (self *Program) VCMPSS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}, vv ...interface{}) *Instruction {
  35894. var p *Instruction
  35895. switch len(vv) {
  35896. case 0 : p = self.alloc("VCMPSS", 4, Operands { v0, v1, v2, v3 })
  35897. case 1 : p = self.alloc("VCMPSS", 5, Operands { v0, v1, v2, v3, vv[0] })
  35898. default : panic("instruction VCMPSS takes 4 or 5 operands")
  35899. }
  35900. // VCMPSS imm8, xmm, xmm, xmm
  35901. if len(vv) == 0 && isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  35902. self.require(ISA_AVX)
  35903. p.domain = DomainAVX
  35904. p.add(0, func(m *_Encoding, v []interface{}) {
  35905. m.vex2(2, hcode(v[3]), v[1], hlcode(v[2]))
  35906. m.emit(0xc2)
  35907. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  35908. m.imm1(toImmAny(v[0]))
  35909. })
  35910. }
  35911. // VCMPSS imm8, m32, xmm, xmm
  35912. if len(vv) == 0 && isImm8(v0) && isM32(v1) && isXMM(v2) && isXMM(v3) {
  35913. self.require(ISA_AVX)
  35914. p.domain = DomainAVX
  35915. p.add(0, func(m *_Encoding, v []interface{}) {
  35916. m.vex2(2, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  35917. m.emit(0xc2)
  35918. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  35919. m.imm1(toImmAny(v[0]))
  35920. })
  35921. }
  35922. // VCMPSS imm8, m32, xmm, k{k}
  35923. if len(vv) == 0 && isImm8(v0) && isM32(v1) && isEVEXXMM(v2) && isKk(v3) {
  35924. self.require(ISA_AVX512F)
  35925. p.domain = DomainAVX
  35926. p.add(0, func(m *_Encoding, v []interface{}) {
  35927. m.evex(0b01, 0x06, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, 0)
  35928. m.emit(0xc2)
  35929. m.mrsd(lcode(v[3]), addr(v[1]), 4)
  35930. m.imm1(toImmAny(v[0]))
  35931. })
  35932. }
  35933. // VCMPSS imm8, {sae}, xmm, xmm, k{k}
  35934. if len(vv) == 1 && isImm8(v0) && isSAE(v1) && isEVEXXMM(v2) && isEVEXXMM(v3) && isKk(vv[0]) {
  35935. self.require(ISA_AVX512F)
  35936. p.domain = DomainAVX
  35937. p.add(0, func(m *_Encoding, v []interface{}) {
  35938. m.emit(0x62)
  35939. m.emit(0xf1 ^ ((hcode(v[4]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[4]) << 4)))
  35940. m.emit(0x7e ^ (hlcode(v[3]) << 3))
  35941. m.emit((0x08 ^ (ecode(v[3]) << 3)) | kcode(v[4]) | 0x10)
  35942. m.emit(0xc2)
  35943. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[2]))
  35944. m.imm1(toImmAny(v[0]))
  35945. })
  35946. }
  35947. // VCMPSS imm8, xmm, xmm, k{k}
  35948. if len(vv) == 0 && isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isKk(v3) {
  35949. self.require(ISA_AVX512F)
  35950. p.domain = DomainAVX
  35951. p.add(0, func(m *_Encoding, v []interface{}) {
  35952. m.emit(0x62)
  35953. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  35954. m.emit(0x7e ^ (hlcode(v[2]) << 3))
  35955. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  35956. m.emit(0xc2)
  35957. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  35958. m.imm1(toImmAny(v[0]))
  35959. })
  35960. }
  35961. if p.len == 0 {
  35962. panic("invalid operands for VCMPSS")
  35963. }
  35964. return p
  35965. }
  35966. // VCOMISD performs "Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS".
  35967. //
  35968. // Mnemonic : VCOMISD
  35969. // Supported forms : (5 forms)
  35970. //
  35971. // * VCOMISD xmm, xmm [AVX]
  35972. // * VCOMISD m64, xmm [AVX]
  35973. // * VCOMISD m64, xmm [AVX512F]
  35974. // * VCOMISD {sae}, xmm, xmm [AVX512F]
  35975. // * VCOMISD xmm, xmm [AVX512F]
  35976. //
  35977. func (self *Program) VCOMISD(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  35978. var p *Instruction
  35979. switch len(vv) {
  35980. case 0 : p = self.alloc("VCOMISD", 2, Operands { v0, v1 })
  35981. case 1 : p = self.alloc("VCOMISD", 3, Operands { v0, v1, vv[0] })
  35982. default : panic("instruction VCOMISD takes 2 or 3 operands")
  35983. }
  35984. // VCOMISD xmm, xmm
  35985. if len(vv) == 0 && isXMM(v0) && isXMM(v1) {
  35986. self.require(ISA_AVX)
  35987. p.domain = DomainAVX
  35988. p.add(0, func(m *_Encoding, v []interface{}) {
  35989. m.vex2(1, hcode(v[1]), v[0], 0)
  35990. m.emit(0x2f)
  35991. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  35992. })
  35993. }
  35994. // VCOMISD m64, xmm
  35995. if len(vv) == 0 && isM64(v0) && isXMM(v1) {
  35996. self.require(ISA_AVX)
  35997. p.domain = DomainAVX
  35998. p.add(0, func(m *_Encoding, v []interface{}) {
  35999. m.vex2(1, hcode(v[1]), addr(v[0]), 0)
  36000. m.emit(0x2f)
  36001. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  36002. })
  36003. }
  36004. // VCOMISD m64, xmm
  36005. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) {
  36006. self.require(ISA_AVX512F)
  36007. p.domain = DomainAVX
  36008. p.add(0, func(m *_Encoding, v []interface{}) {
  36009. m.evex(0b01, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  36010. m.emit(0x2f)
  36011. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  36012. })
  36013. }
  36014. // VCOMISD {sae}, xmm, xmm
  36015. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isEVEXXMM(vv[0]) {
  36016. self.require(ISA_AVX512F)
  36017. p.domain = DomainAVX
  36018. p.add(0, func(m *_Encoding, v []interface{}) {
  36019. m.emit(0x62)
  36020. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  36021. m.emit(0xfd)
  36022. m.emit(0x18)
  36023. m.emit(0x2f)
  36024. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  36025. })
  36026. }
  36027. // VCOMISD xmm, xmm
  36028. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) {
  36029. self.require(ISA_AVX512F)
  36030. p.domain = DomainAVX
  36031. p.add(0, func(m *_Encoding, v []interface{}) {
  36032. m.emit(0x62)
  36033. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  36034. m.emit(0xfd)
  36035. m.emit(0x48)
  36036. m.emit(0x2f)
  36037. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36038. })
  36039. }
  36040. if p.len == 0 {
  36041. panic("invalid operands for VCOMISD")
  36042. }
  36043. return p
  36044. }
  36045. // VCOMISS performs "Compare Scalar Ordered Single-Precision Floating-Point Values and Set EFLAGS".
  36046. //
  36047. // Mnemonic : VCOMISS
  36048. // Supported forms : (5 forms)
  36049. //
  36050. // * VCOMISS xmm, xmm [AVX]
  36051. // * VCOMISS m32, xmm [AVX]
  36052. // * VCOMISS m32, xmm [AVX512F]
  36053. // * VCOMISS {sae}, xmm, xmm [AVX512F]
  36054. // * VCOMISS xmm, xmm [AVX512F]
  36055. //
  36056. func (self *Program) VCOMISS(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  36057. var p *Instruction
  36058. switch len(vv) {
  36059. case 0 : p = self.alloc("VCOMISS", 2, Operands { v0, v1 })
  36060. case 1 : p = self.alloc("VCOMISS", 3, Operands { v0, v1, vv[0] })
  36061. default : panic("instruction VCOMISS takes 2 or 3 operands")
  36062. }
  36063. // VCOMISS xmm, xmm
  36064. if len(vv) == 0 && isXMM(v0) && isXMM(v1) {
  36065. self.require(ISA_AVX)
  36066. p.domain = DomainAVX
  36067. p.add(0, func(m *_Encoding, v []interface{}) {
  36068. m.vex2(0, hcode(v[1]), v[0], 0)
  36069. m.emit(0x2f)
  36070. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36071. })
  36072. }
  36073. // VCOMISS m32, xmm
  36074. if len(vv) == 0 && isM32(v0) && isXMM(v1) {
  36075. self.require(ISA_AVX)
  36076. p.domain = DomainAVX
  36077. p.add(0, func(m *_Encoding, v []interface{}) {
  36078. m.vex2(0, hcode(v[1]), addr(v[0]), 0)
  36079. m.emit(0x2f)
  36080. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  36081. })
  36082. }
  36083. // VCOMISS m32, xmm
  36084. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) {
  36085. self.require(ISA_AVX512F)
  36086. p.domain = DomainAVX
  36087. p.add(0, func(m *_Encoding, v []interface{}) {
  36088. m.evex(0b01, 0x04, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  36089. m.emit(0x2f)
  36090. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  36091. })
  36092. }
  36093. // VCOMISS {sae}, xmm, xmm
  36094. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isEVEXXMM(vv[0]) {
  36095. self.require(ISA_AVX512F)
  36096. p.domain = DomainAVX
  36097. p.add(0, func(m *_Encoding, v []interface{}) {
  36098. m.emit(0x62)
  36099. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  36100. m.emit(0x7c)
  36101. m.emit(0x18)
  36102. m.emit(0x2f)
  36103. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  36104. })
  36105. }
  36106. // VCOMISS xmm, xmm
  36107. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) {
  36108. self.require(ISA_AVX512F)
  36109. p.domain = DomainAVX
  36110. p.add(0, func(m *_Encoding, v []interface{}) {
  36111. m.emit(0x62)
  36112. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  36113. m.emit(0x7c)
  36114. m.emit(0x48)
  36115. m.emit(0x2f)
  36116. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36117. })
  36118. }
  36119. if p.len == 0 {
  36120. panic("invalid operands for VCOMISS")
  36121. }
  36122. return p
  36123. }
  36124. // VCOMPRESSPD performs "Store Sparse Packed Double-Precision Floating-Point Values into Dense Memory/Register".
  36125. //
  36126. // Mnemonic : VCOMPRESSPD
  36127. // Supported forms : (6 forms)
  36128. //
  36129. // * VCOMPRESSPD zmm, zmm{k}{z} [AVX512F]
  36130. // * VCOMPRESSPD zmm, m512{k}{z} [AVX512F]
  36131. // * VCOMPRESSPD xmm, xmm{k}{z} [AVX512F,AVX512VL]
  36132. // * VCOMPRESSPD xmm, m128{k}{z} [AVX512F,AVX512VL]
  36133. // * VCOMPRESSPD ymm, ymm{k}{z} [AVX512F,AVX512VL]
  36134. // * VCOMPRESSPD ymm, m256{k}{z} [AVX512F,AVX512VL]
  36135. //
  36136. func (self *Program) VCOMPRESSPD(v0 interface{}, v1 interface{}) *Instruction {
  36137. p := self.alloc("VCOMPRESSPD", 2, Operands { v0, v1 })
  36138. // VCOMPRESSPD zmm, zmm{k}{z}
  36139. if isZMM(v0) && isZMMkz(v1) {
  36140. self.require(ISA_AVX512F)
  36141. p.domain = DomainAVX
  36142. p.add(0, func(m *_Encoding, v []interface{}) {
  36143. m.emit(0x62)
  36144. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  36145. m.emit(0xfd)
  36146. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  36147. m.emit(0x8a)
  36148. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  36149. })
  36150. }
  36151. // VCOMPRESSPD zmm, m512{k}{z}
  36152. if isZMM(v0) && isM512kz(v1) {
  36153. self.require(ISA_AVX512F)
  36154. p.domain = DomainAVX
  36155. p.add(0, func(m *_Encoding, v []interface{}) {
  36156. m.evex(0b10, 0x85, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  36157. m.emit(0x8a)
  36158. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  36159. })
  36160. }
  36161. // VCOMPRESSPD xmm, xmm{k}{z}
  36162. if isEVEXXMM(v0) && isXMMkz(v1) {
  36163. self.require(ISA_AVX512VL | ISA_AVX512F)
  36164. p.domain = DomainAVX
  36165. p.add(0, func(m *_Encoding, v []interface{}) {
  36166. m.emit(0x62)
  36167. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  36168. m.emit(0xfd)
  36169. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  36170. m.emit(0x8a)
  36171. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  36172. })
  36173. }
  36174. // VCOMPRESSPD xmm, m128{k}{z}
  36175. if isEVEXXMM(v0) && isM128kz(v1) {
  36176. self.require(ISA_AVX512VL | ISA_AVX512F)
  36177. p.domain = DomainAVX
  36178. p.add(0, func(m *_Encoding, v []interface{}) {
  36179. m.evex(0b10, 0x85, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  36180. m.emit(0x8a)
  36181. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  36182. })
  36183. }
  36184. // VCOMPRESSPD ymm, ymm{k}{z}
  36185. if isEVEXYMM(v0) && isYMMkz(v1) {
  36186. self.require(ISA_AVX512VL | ISA_AVX512F)
  36187. p.domain = DomainAVX
  36188. p.add(0, func(m *_Encoding, v []interface{}) {
  36189. m.emit(0x62)
  36190. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  36191. m.emit(0xfd)
  36192. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  36193. m.emit(0x8a)
  36194. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  36195. })
  36196. }
  36197. // VCOMPRESSPD ymm, m256{k}{z}
  36198. if isEVEXYMM(v0) && isM256kz(v1) {
  36199. self.require(ISA_AVX512VL | ISA_AVX512F)
  36200. p.domain = DomainAVX
  36201. p.add(0, func(m *_Encoding, v []interface{}) {
  36202. m.evex(0b10, 0x85, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  36203. m.emit(0x8a)
  36204. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  36205. })
  36206. }
  36207. if p.len == 0 {
  36208. panic("invalid operands for VCOMPRESSPD")
  36209. }
  36210. return p
  36211. }
  36212. // VCOMPRESSPS performs "Store Sparse Packed Single-Precision Floating-Point Values into Dense Memory/Register".
  36213. //
  36214. // Mnemonic : VCOMPRESSPS
  36215. // Supported forms : (6 forms)
  36216. //
  36217. // * VCOMPRESSPS zmm, zmm{k}{z} [AVX512F]
  36218. // * VCOMPRESSPS zmm, m512{k}{z} [AVX512F]
  36219. // * VCOMPRESSPS xmm, xmm{k}{z} [AVX512F,AVX512VL]
  36220. // * VCOMPRESSPS xmm, m128{k}{z} [AVX512F,AVX512VL]
  36221. // * VCOMPRESSPS ymm, ymm{k}{z} [AVX512F,AVX512VL]
  36222. // * VCOMPRESSPS ymm, m256{k}{z} [AVX512F,AVX512VL]
  36223. //
  36224. func (self *Program) VCOMPRESSPS(v0 interface{}, v1 interface{}) *Instruction {
  36225. p := self.alloc("VCOMPRESSPS", 2, Operands { v0, v1 })
  36226. // VCOMPRESSPS zmm, zmm{k}{z}
  36227. if isZMM(v0) && isZMMkz(v1) {
  36228. self.require(ISA_AVX512F)
  36229. p.domain = DomainAVX
  36230. p.add(0, func(m *_Encoding, v []interface{}) {
  36231. m.emit(0x62)
  36232. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  36233. m.emit(0x7d)
  36234. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  36235. m.emit(0x8a)
  36236. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  36237. })
  36238. }
  36239. // VCOMPRESSPS zmm, m512{k}{z}
  36240. if isZMM(v0) && isM512kz(v1) {
  36241. self.require(ISA_AVX512F)
  36242. p.domain = DomainAVX
  36243. p.add(0, func(m *_Encoding, v []interface{}) {
  36244. m.evex(0b10, 0x05, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  36245. m.emit(0x8a)
  36246. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  36247. })
  36248. }
  36249. // VCOMPRESSPS xmm, xmm{k}{z}
  36250. if isEVEXXMM(v0) && isXMMkz(v1) {
  36251. self.require(ISA_AVX512VL | ISA_AVX512F)
  36252. p.domain = DomainAVX
  36253. p.add(0, func(m *_Encoding, v []interface{}) {
  36254. m.emit(0x62)
  36255. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  36256. m.emit(0x7d)
  36257. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  36258. m.emit(0x8a)
  36259. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  36260. })
  36261. }
  36262. // VCOMPRESSPS xmm, m128{k}{z}
  36263. if isEVEXXMM(v0) && isM128kz(v1) {
  36264. self.require(ISA_AVX512VL | ISA_AVX512F)
  36265. p.domain = DomainAVX
  36266. p.add(0, func(m *_Encoding, v []interface{}) {
  36267. m.evex(0b10, 0x05, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  36268. m.emit(0x8a)
  36269. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  36270. })
  36271. }
  36272. // VCOMPRESSPS ymm, ymm{k}{z}
  36273. if isEVEXYMM(v0) && isYMMkz(v1) {
  36274. self.require(ISA_AVX512VL | ISA_AVX512F)
  36275. p.domain = DomainAVX
  36276. p.add(0, func(m *_Encoding, v []interface{}) {
  36277. m.emit(0x62)
  36278. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  36279. m.emit(0x7d)
  36280. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  36281. m.emit(0x8a)
  36282. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  36283. })
  36284. }
  36285. // VCOMPRESSPS ymm, m256{k}{z}
  36286. if isEVEXYMM(v0) && isM256kz(v1) {
  36287. self.require(ISA_AVX512VL | ISA_AVX512F)
  36288. p.domain = DomainAVX
  36289. p.add(0, func(m *_Encoding, v []interface{}) {
  36290. m.evex(0b10, 0x05, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  36291. m.emit(0x8a)
  36292. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  36293. })
  36294. }
  36295. if p.len == 0 {
  36296. panic("invalid operands for VCOMPRESSPS")
  36297. }
  36298. return p
  36299. }
  36300. // VCVTDQ2PD performs "Convert Packed Dword Integers to Packed Double-Precision FP Values".
  36301. //
  36302. // Mnemonic : VCVTDQ2PD
  36303. // Supported forms : (10 forms)
  36304. //
  36305. // * VCVTDQ2PD xmm, xmm [AVX]
  36306. // * VCVTDQ2PD m64, xmm [AVX]
  36307. // * VCVTDQ2PD xmm, ymm [AVX]
  36308. // * VCVTDQ2PD m128, ymm [AVX]
  36309. // * VCVTDQ2PD m256/m32bcst, zmm{k}{z} [AVX512F]
  36310. // * VCVTDQ2PD ymm, zmm{k}{z} [AVX512F]
  36311. // * VCVTDQ2PD m64/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  36312. // * VCVTDQ2PD m128/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  36313. // * VCVTDQ2PD xmm, xmm{k}{z} [AVX512F,AVX512VL]
  36314. // * VCVTDQ2PD xmm, ymm{k}{z} [AVX512F,AVX512VL]
  36315. //
  36316. func (self *Program) VCVTDQ2PD(v0 interface{}, v1 interface{}) *Instruction {
  36317. p := self.alloc("VCVTDQ2PD", 2, Operands { v0, v1 })
  36318. // VCVTDQ2PD xmm, xmm
  36319. if isXMM(v0) && isXMM(v1) {
  36320. self.require(ISA_AVX)
  36321. p.domain = DomainAVX
  36322. p.add(0, func(m *_Encoding, v []interface{}) {
  36323. m.vex2(2, hcode(v[1]), v[0], 0)
  36324. m.emit(0xe6)
  36325. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36326. })
  36327. }
  36328. // VCVTDQ2PD m64, xmm
  36329. if isM64(v0) && isXMM(v1) {
  36330. self.require(ISA_AVX)
  36331. p.domain = DomainAVX
  36332. p.add(0, func(m *_Encoding, v []interface{}) {
  36333. m.vex2(2, hcode(v[1]), addr(v[0]), 0)
  36334. m.emit(0xe6)
  36335. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  36336. })
  36337. }
  36338. // VCVTDQ2PD xmm, ymm
  36339. if isXMM(v0) && isYMM(v1) {
  36340. self.require(ISA_AVX)
  36341. p.domain = DomainAVX
  36342. p.add(0, func(m *_Encoding, v []interface{}) {
  36343. m.vex2(6, hcode(v[1]), v[0], 0)
  36344. m.emit(0xe6)
  36345. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36346. })
  36347. }
  36348. // VCVTDQ2PD m128, ymm
  36349. if isM128(v0) && isYMM(v1) {
  36350. self.require(ISA_AVX)
  36351. p.domain = DomainAVX
  36352. p.add(0, func(m *_Encoding, v []interface{}) {
  36353. m.vex2(6, hcode(v[1]), addr(v[0]), 0)
  36354. m.emit(0xe6)
  36355. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  36356. })
  36357. }
  36358. // VCVTDQ2PD m256/m32bcst, zmm{k}{z}
  36359. if isM256M32bcst(v0) && isZMMkz(v1) {
  36360. self.require(ISA_AVX512F)
  36361. p.domain = DomainAVX
  36362. p.add(0, func(m *_Encoding, v []interface{}) {
  36363. m.evex(0b01, 0x06, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  36364. m.emit(0xe6)
  36365. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  36366. })
  36367. }
  36368. // VCVTDQ2PD ymm, zmm{k}{z}
  36369. if isEVEXYMM(v0) && isZMMkz(v1) {
  36370. self.require(ISA_AVX512F)
  36371. p.domain = DomainAVX
  36372. p.add(0, func(m *_Encoding, v []interface{}) {
  36373. m.emit(0x62)
  36374. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  36375. m.emit(0x7e)
  36376. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  36377. m.emit(0xe6)
  36378. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36379. })
  36380. }
  36381. // VCVTDQ2PD m64/m32bcst, xmm{k}{z}
  36382. if isM64M32bcst(v0) && isXMMkz(v1) {
  36383. self.require(ISA_AVX512VL | ISA_AVX512F)
  36384. p.domain = DomainAVX
  36385. p.add(0, func(m *_Encoding, v []interface{}) {
  36386. m.evex(0b01, 0x06, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  36387. m.emit(0xe6)
  36388. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  36389. })
  36390. }
  36391. // VCVTDQ2PD m128/m32bcst, ymm{k}{z}
  36392. if isM128M32bcst(v0) && isYMMkz(v1) {
  36393. self.require(ISA_AVX512VL | ISA_AVX512F)
  36394. p.domain = DomainAVX
  36395. p.add(0, func(m *_Encoding, v []interface{}) {
  36396. m.evex(0b01, 0x06, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  36397. m.emit(0xe6)
  36398. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  36399. })
  36400. }
  36401. // VCVTDQ2PD xmm, xmm{k}{z}
  36402. if isEVEXXMM(v0) && isXMMkz(v1) {
  36403. self.require(ISA_AVX512VL | ISA_AVX512F)
  36404. p.domain = DomainAVX
  36405. p.add(0, func(m *_Encoding, v []interface{}) {
  36406. m.emit(0x62)
  36407. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  36408. m.emit(0x7e)
  36409. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  36410. m.emit(0xe6)
  36411. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36412. })
  36413. }
  36414. // VCVTDQ2PD xmm, ymm{k}{z}
  36415. if isEVEXXMM(v0) && isYMMkz(v1) {
  36416. self.require(ISA_AVX512VL | ISA_AVX512F)
  36417. p.domain = DomainAVX
  36418. p.add(0, func(m *_Encoding, v []interface{}) {
  36419. m.emit(0x62)
  36420. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  36421. m.emit(0x7e)
  36422. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  36423. m.emit(0xe6)
  36424. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36425. })
  36426. }
  36427. if p.len == 0 {
  36428. panic("invalid operands for VCVTDQ2PD")
  36429. }
  36430. return p
  36431. }
  36432. // VCVTDQ2PS performs "Convert Packed Dword Integers to Packed Single-Precision FP Values".
  36433. //
  36434. // Mnemonic : VCVTDQ2PS
  36435. // Supported forms : (11 forms)
  36436. //
  36437. // * VCVTDQ2PS xmm, xmm [AVX]
  36438. // * VCVTDQ2PS m128, xmm [AVX]
  36439. // * VCVTDQ2PS ymm, ymm [AVX]
  36440. // * VCVTDQ2PS m256, ymm [AVX]
  36441. // * VCVTDQ2PS m512/m32bcst, zmm{k}{z} [AVX512F]
  36442. // * VCVTDQ2PS {er}, zmm, zmm{k}{z} [AVX512F]
  36443. // * VCVTDQ2PS zmm, zmm{k}{z} [AVX512F]
  36444. // * VCVTDQ2PS m128/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  36445. // * VCVTDQ2PS m256/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  36446. // * VCVTDQ2PS xmm, xmm{k}{z} [AVX512F,AVX512VL]
  36447. // * VCVTDQ2PS ymm, ymm{k}{z} [AVX512F,AVX512VL]
  36448. //
  36449. func (self *Program) VCVTDQ2PS(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  36450. var p *Instruction
  36451. switch len(vv) {
  36452. case 0 : p = self.alloc("VCVTDQ2PS", 2, Operands { v0, v1 })
  36453. case 1 : p = self.alloc("VCVTDQ2PS", 3, Operands { v0, v1, vv[0] })
  36454. default : panic("instruction VCVTDQ2PS takes 2 or 3 operands")
  36455. }
  36456. // VCVTDQ2PS xmm, xmm
  36457. if len(vv) == 0 && isXMM(v0) && isXMM(v1) {
  36458. self.require(ISA_AVX)
  36459. p.domain = DomainAVX
  36460. p.add(0, func(m *_Encoding, v []interface{}) {
  36461. m.vex2(0, hcode(v[1]), v[0], 0)
  36462. m.emit(0x5b)
  36463. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36464. })
  36465. }
  36466. // VCVTDQ2PS m128, xmm
  36467. if len(vv) == 0 && isM128(v0) && isXMM(v1) {
  36468. self.require(ISA_AVX)
  36469. p.domain = DomainAVX
  36470. p.add(0, func(m *_Encoding, v []interface{}) {
  36471. m.vex2(0, hcode(v[1]), addr(v[0]), 0)
  36472. m.emit(0x5b)
  36473. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  36474. })
  36475. }
  36476. // VCVTDQ2PS ymm, ymm
  36477. if len(vv) == 0 && isYMM(v0) && isYMM(v1) {
  36478. self.require(ISA_AVX)
  36479. p.domain = DomainAVX
  36480. p.add(0, func(m *_Encoding, v []interface{}) {
  36481. m.vex2(4, hcode(v[1]), v[0], 0)
  36482. m.emit(0x5b)
  36483. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36484. })
  36485. }
  36486. // VCVTDQ2PS m256, ymm
  36487. if len(vv) == 0 && isM256(v0) && isYMM(v1) {
  36488. self.require(ISA_AVX)
  36489. p.domain = DomainAVX
  36490. p.add(0, func(m *_Encoding, v []interface{}) {
  36491. m.vex2(4, hcode(v[1]), addr(v[0]), 0)
  36492. m.emit(0x5b)
  36493. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  36494. })
  36495. }
  36496. // VCVTDQ2PS m512/m32bcst, zmm{k}{z}
  36497. if len(vv) == 0 && isM512M32bcst(v0) && isZMMkz(v1) {
  36498. self.require(ISA_AVX512F)
  36499. p.domain = DomainAVX
  36500. p.add(0, func(m *_Encoding, v []interface{}) {
  36501. m.evex(0b01, 0x04, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  36502. m.emit(0x5b)
  36503. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  36504. })
  36505. }
  36506. // VCVTDQ2PS {er}, zmm, zmm{k}{z}
  36507. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMMkz(vv[0]) {
  36508. self.require(ISA_AVX512F)
  36509. p.domain = DomainAVX
  36510. p.add(0, func(m *_Encoding, v []interface{}) {
  36511. m.emit(0x62)
  36512. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  36513. m.emit(0x7c)
  36514. m.emit((zcode(v[2]) << 7) | (vcode(v[0]) << 5) | kcode(v[2]) | 0x18)
  36515. m.emit(0x5b)
  36516. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  36517. })
  36518. }
  36519. // VCVTDQ2PS zmm, zmm{k}{z}
  36520. if len(vv) == 0 && isZMM(v0) && isZMMkz(v1) {
  36521. self.require(ISA_AVX512F)
  36522. p.domain = DomainAVX
  36523. p.add(0, func(m *_Encoding, v []interface{}) {
  36524. m.emit(0x62)
  36525. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  36526. m.emit(0x7c)
  36527. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  36528. m.emit(0x5b)
  36529. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36530. })
  36531. }
  36532. // VCVTDQ2PS m128/m32bcst, xmm{k}{z}
  36533. if len(vv) == 0 && isM128M32bcst(v0) && isXMMkz(v1) {
  36534. self.require(ISA_AVX512VL | ISA_AVX512F)
  36535. p.domain = DomainAVX
  36536. p.add(0, func(m *_Encoding, v []interface{}) {
  36537. m.evex(0b01, 0x04, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  36538. m.emit(0x5b)
  36539. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  36540. })
  36541. }
  36542. // VCVTDQ2PS m256/m32bcst, ymm{k}{z}
  36543. if len(vv) == 0 && isM256M32bcst(v0) && isYMMkz(v1) {
  36544. self.require(ISA_AVX512VL | ISA_AVX512F)
  36545. p.domain = DomainAVX
  36546. p.add(0, func(m *_Encoding, v []interface{}) {
  36547. m.evex(0b01, 0x04, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  36548. m.emit(0x5b)
  36549. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  36550. })
  36551. }
  36552. // VCVTDQ2PS xmm, xmm{k}{z}
  36553. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  36554. self.require(ISA_AVX512VL | ISA_AVX512F)
  36555. p.domain = DomainAVX
  36556. p.add(0, func(m *_Encoding, v []interface{}) {
  36557. m.emit(0x62)
  36558. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  36559. m.emit(0x7c)
  36560. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  36561. m.emit(0x5b)
  36562. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36563. })
  36564. }
  36565. // VCVTDQ2PS ymm, ymm{k}{z}
  36566. if len(vv) == 0 && isEVEXYMM(v0) && isYMMkz(v1) {
  36567. self.require(ISA_AVX512VL | ISA_AVX512F)
  36568. p.domain = DomainAVX
  36569. p.add(0, func(m *_Encoding, v []interface{}) {
  36570. m.emit(0x62)
  36571. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  36572. m.emit(0x7c)
  36573. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  36574. m.emit(0x5b)
  36575. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36576. })
  36577. }
  36578. if p.len == 0 {
  36579. panic("invalid operands for VCVTDQ2PS")
  36580. }
  36581. return p
  36582. }
  36583. // VCVTPD2DQ performs "Convert Packed Double-Precision FP Values to Packed Dword Integers".
  36584. //
  36585. // Mnemonic : VCVTPD2DQ
  36586. // Supported forms : (11 forms)
  36587. //
  36588. // * VCVTPD2DQ xmm, xmm [AVX]
  36589. // * VCVTPD2DQ ymm, xmm [AVX]
  36590. // * VCVTPD2DQ m128, xmm [AVX]
  36591. // * VCVTPD2DQ m256, xmm [AVX]
  36592. // * VCVTPD2DQ m512/m64bcst, ymm{k}{z} [AVX512F]
  36593. // * VCVTPD2DQ {er}, zmm, ymm{k}{z} [AVX512F]
  36594. // * VCVTPD2DQ zmm, ymm{k}{z} [AVX512F]
  36595. // * VCVTPD2DQ m128/m64bcst, xmm{k}{z} [AVX512F,AVX512VL]
  36596. // * VCVTPD2DQ m256/m64bcst, xmm{k}{z} [AVX512F,AVX512VL]
  36597. // * VCVTPD2DQ xmm, xmm{k}{z} [AVX512F,AVX512VL]
  36598. // * VCVTPD2DQ ymm, xmm{k}{z} [AVX512F,AVX512VL]
  36599. //
  36600. func (self *Program) VCVTPD2DQ(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  36601. var p *Instruction
  36602. switch len(vv) {
  36603. case 0 : p = self.alloc("VCVTPD2DQ", 2, Operands { v0, v1 })
  36604. case 1 : p = self.alloc("VCVTPD2DQ", 3, Operands { v0, v1, vv[0] })
  36605. default : panic("instruction VCVTPD2DQ takes 2 or 3 operands")
  36606. }
  36607. // VCVTPD2DQ xmm, xmm
  36608. if len(vv) == 0 && isXMM(v0) && isXMM(v1) {
  36609. self.require(ISA_AVX)
  36610. p.domain = DomainAVX
  36611. p.add(0, func(m *_Encoding, v []interface{}) {
  36612. m.vex2(3, hcode(v[1]), v[0], 0)
  36613. m.emit(0xe6)
  36614. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36615. })
  36616. }
  36617. // VCVTPD2DQ ymm, xmm
  36618. if len(vv) == 0 && isYMM(v0) && isXMM(v1) {
  36619. self.require(ISA_AVX)
  36620. p.domain = DomainAVX
  36621. p.add(0, func(m *_Encoding, v []interface{}) {
  36622. m.vex2(7, hcode(v[1]), v[0], 0)
  36623. m.emit(0xe6)
  36624. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36625. })
  36626. }
  36627. // VCVTPD2DQ m128, xmm
  36628. if len(vv) == 0 && isM128(v0) && isXMM(v1) {
  36629. self.require(ISA_AVX)
  36630. p.domain = DomainAVX
  36631. p.add(0, func(m *_Encoding, v []interface{}) {
  36632. m.vex2(3, hcode(v[1]), addr(v[0]), 0)
  36633. m.emit(0xe6)
  36634. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  36635. })
  36636. }
  36637. // VCVTPD2DQ m256, xmm
  36638. if len(vv) == 0 && isM256(v0) && isXMM(v1) {
  36639. self.require(ISA_AVX)
  36640. p.domain = DomainAVX
  36641. p.add(0, func(m *_Encoding, v []interface{}) {
  36642. m.vex2(7, hcode(v[1]), addr(v[0]), 0)
  36643. m.emit(0xe6)
  36644. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  36645. })
  36646. }
  36647. // VCVTPD2DQ m512/m64bcst, ymm{k}{z}
  36648. if len(vv) == 0 && isM512M64bcst(v0) && isYMMkz(v1) {
  36649. self.require(ISA_AVX512F)
  36650. p.domain = DomainAVX
  36651. p.add(0, func(m *_Encoding, v []interface{}) {
  36652. m.evex(0b01, 0x87, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  36653. m.emit(0xe6)
  36654. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  36655. })
  36656. }
  36657. // VCVTPD2DQ {er}, zmm, ymm{k}{z}
  36658. if len(vv) == 1 && isER(v0) && isZMM(v1) && isYMMkz(vv[0]) {
  36659. self.require(ISA_AVX512F)
  36660. p.domain = DomainAVX
  36661. p.add(0, func(m *_Encoding, v []interface{}) {
  36662. m.emit(0x62)
  36663. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  36664. m.emit(0xff)
  36665. m.emit((zcode(v[2]) << 7) | (vcode(v[0]) << 5) | kcode(v[2]) | 0x18)
  36666. m.emit(0xe6)
  36667. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  36668. })
  36669. }
  36670. // VCVTPD2DQ zmm, ymm{k}{z}
  36671. if len(vv) == 0 && isZMM(v0) && isYMMkz(v1) {
  36672. self.require(ISA_AVX512F)
  36673. p.domain = DomainAVX
  36674. p.add(0, func(m *_Encoding, v []interface{}) {
  36675. m.emit(0x62)
  36676. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  36677. m.emit(0xff)
  36678. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  36679. m.emit(0xe6)
  36680. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36681. })
  36682. }
  36683. // VCVTPD2DQ m128/m64bcst, xmm{k}{z}
  36684. if len(vv) == 0 && isM128M64bcst(v0) && isXMMkz(v1) {
  36685. self.require(ISA_AVX512VL | ISA_AVX512F)
  36686. p.domain = DomainAVX
  36687. p.add(0, func(m *_Encoding, v []interface{}) {
  36688. m.evex(0b01, 0x87, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  36689. m.emit(0xe6)
  36690. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  36691. })
  36692. }
  36693. // VCVTPD2DQ m256/m64bcst, xmm{k}{z}
  36694. if len(vv) == 0 && isM256M64bcst(v0) && isXMMkz(v1) {
  36695. self.require(ISA_AVX512VL | ISA_AVX512F)
  36696. p.domain = DomainAVX
  36697. p.add(0, func(m *_Encoding, v []interface{}) {
  36698. m.evex(0b01, 0x87, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  36699. m.emit(0xe6)
  36700. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  36701. })
  36702. }
  36703. // VCVTPD2DQ xmm, xmm{k}{z}
  36704. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  36705. self.require(ISA_AVX512VL | ISA_AVX512F)
  36706. p.domain = DomainAVX
  36707. p.add(0, func(m *_Encoding, v []interface{}) {
  36708. m.emit(0x62)
  36709. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  36710. m.emit(0xff)
  36711. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  36712. m.emit(0xe6)
  36713. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36714. })
  36715. }
  36716. // VCVTPD2DQ ymm, xmm{k}{z}
  36717. if len(vv) == 0 && isEVEXYMM(v0) && isXMMkz(v1) {
  36718. self.require(ISA_AVX512VL | ISA_AVX512F)
  36719. p.domain = DomainAVX
  36720. p.add(0, func(m *_Encoding, v []interface{}) {
  36721. m.emit(0x62)
  36722. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  36723. m.emit(0xff)
  36724. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  36725. m.emit(0xe6)
  36726. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36727. })
  36728. }
  36729. if p.len == 0 {
  36730. panic("invalid operands for VCVTPD2DQ")
  36731. }
  36732. return p
  36733. }
  36734. // VCVTPD2PS performs "Convert Packed Double-Precision FP Values to Packed Single-Precision FP Values".
  36735. //
  36736. // Mnemonic : VCVTPD2PS
  36737. // Supported forms : (11 forms)
  36738. //
  36739. // * VCVTPD2PS xmm, xmm [AVX]
  36740. // * VCVTPD2PS ymm, xmm [AVX]
  36741. // * VCVTPD2PS m128, xmm [AVX]
  36742. // * VCVTPD2PS m256, xmm [AVX]
  36743. // * VCVTPD2PS m512/m64bcst, ymm{k}{z} [AVX512F]
  36744. // * VCVTPD2PS {er}, zmm, ymm{k}{z} [AVX512F]
  36745. // * VCVTPD2PS zmm, ymm{k}{z} [AVX512F]
  36746. // * VCVTPD2PS m128/m64bcst, xmm{k}{z} [AVX512F,AVX512VL]
  36747. // * VCVTPD2PS m256/m64bcst, xmm{k}{z} [AVX512F,AVX512VL]
  36748. // * VCVTPD2PS xmm, xmm{k}{z} [AVX512F,AVX512VL]
  36749. // * VCVTPD2PS ymm, xmm{k}{z} [AVX512F,AVX512VL]
  36750. //
  36751. func (self *Program) VCVTPD2PS(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  36752. var p *Instruction
  36753. switch len(vv) {
  36754. case 0 : p = self.alloc("VCVTPD2PS", 2, Operands { v0, v1 })
  36755. case 1 : p = self.alloc("VCVTPD2PS", 3, Operands { v0, v1, vv[0] })
  36756. default : panic("instruction VCVTPD2PS takes 2 or 3 operands")
  36757. }
  36758. // VCVTPD2PS xmm, xmm
  36759. if len(vv) == 0 && isXMM(v0) && isXMM(v1) {
  36760. self.require(ISA_AVX)
  36761. p.domain = DomainAVX
  36762. p.add(0, func(m *_Encoding, v []interface{}) {
  36763. m.vex2(1, hcode(v[1]), v[0], 0)
  36764. m.emit(0x5a)
  36765. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36766. })
  36767. }
  36768. // VCVTPD2PS ymm, xmm
  36769. if len(vv) == 0 && isYMM(v0) && isXMM(v1) {
  36770. self.require(ISA_AVX)
  36771. p.domain = DomainAVX
  36772. p.add(0, func(m *_Encoding, v []interface{}) {
  36773. m.vex2(5, hcode(v[1]), v[0], 0)
  36774. m.emit(0x5a)
  36775. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36776. })
  36777. }
  36778. // VCVTPD2PS m128, xmm
  36779. if len(vv) == 0 && isM128(v0) && isXMM(v1) {
  36780. self.require(ISA_AVX)
  36781. p.domain = DomainAVX
  36782. p.add(0, func(m *_Encoding, v []interface{}) {
  36783. m.vex2(1, hcode(v[1]), addr(v[0]), 0)
  36784. m.emit(0x5a)
  36785. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  36786. })
  36787. }
  36788. // VCVTPD2PS m256, xmm
  36789. if len(vv) == 0 && isM256(v0) && isXMM(v1) {
  36790. self.require(ISA_AVX)
  36791. p.domain = DomainAVX
  36792. p.add(0, func(m *_Encoding, v []interface{}) {
  36793. m.vex2(5, hcode(v[1]), addr(v[0]), 0)
  36794. m.emit(0x5a)
  36795. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  36796. })
  36797. }
  36798. // VCVTPD2PS m512/m64bcst, ymm{k}{z}
  36799. if len(vv) == 0 && isM512M64bcst(v0) && isYMMkz(v1) {
  36800. self.require(ISA_AVX512F)
  36801. p.domain = DomainAVX
  36802. p.add(0, func(m *_Encoding, v []interface{}) {
  36803. m.evex(0b01, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  36804. m.emit(0x5a)
  36805. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  36806. })
  36807. }
  36808. // VCVTPD2PS {er}, zmm, ymm{k}{z}
  36809. if len(vv) == 1 && isER(v0) && isZMM(v1) && isYMMkz(vv[0]) {
  36810. self.require(ISA_AVX512F)
  36811. p.domain = DomainAVX
  36812. p.add(0, func(m *_Encoding, v []interface{}) {
  36813. m.emit(0x62)
  36814. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  36815. m.emit(0xfd)
  36816. m.emit((zcode(v[2]) << 7) | (vcode(v[0]) << 5) | kcode(v[2]) | 0x18)
  36817. m.emit(0x5a)
  36818. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  36819. })
  36820. }
  36821. // VCVTPD2PS zmm, ymm{k}{z}
  36822. if len(vv) == 0 && isZMM(v0) && isYMMkz(v1) {
  36823. self.require(ISA_AVX512F)
  36824. p.domain = DomainAVX
  36825. p.add(0, func(m *_Encoding, v []interface{}) {
  36826. m.emit(0x62)
  36827. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  36828. m.emit(0xfd)
  36829. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  36830. m.emit(0x5a)
  36831. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36832. })
  36833. }
  36834. // VCVTPD2PS m128/m64bcst, xmm{k}{z}
  36835. if len(vv) == 0 && isM128M64bcst(v0) && isXMMkz(v1) {
  36836. self.require(ISA_AVX512VL | ISA_AVX512F)
  36837. p.domain = DomainAVX
  36838. p.add(0, func(m *_Encoding, v []interface{}) {
  36839. m.evex(0b01, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  36840. m.emit(0x5a)
  36841. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  36842. })
  36843. }
  36844. // VCVTPD2PS m256/m64bcst, xmm{k}{z}
  36845. if len(vv) == 0 && isM256M64bcst(v0) && isXMMkz(v1) {
  36846. self.require(ISA_AVX512VL | ISA_AVX512F)
  36847. p.domain = DomainAVX
  36848. p.add(0, func(m *_Encoding, v []interface{}) {
  36849. m.evex(0b01, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  36850. m.emit(0x5a)
  36851. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  36852. })
  36853. }
  36854. // VCVTPD2PS xmm, xmm{k}{z}
  36855. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  36856. self.require(ISA_AVX512VL | ISA_AVX512F)
  36857. p.domain = DomainAVX
  36858. p.add(0, func(m *_Encoding, v []interface{}) {
  36859. m.emit(0x62)
  36860. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  36861. m.emit(0xfd)
  36862. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  36863. m.emit(0x5a)
  36864. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36865. })
  36866. }
  36867. // VCVTPD2PS ymm, xmm{k}{z}
  36868. if len(vv) == 0 && isEVEXYMM(v0) && isXMMkz(v1) {
  36869. self.require(ISA_AVX512VL | ISA_AVX512F)
  36870. p.domain = DomainAVX
  36871. p.add(0, func(m *_Encoding, v []interface{}) {
  36872. m.emit(0x62)
  36873. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  36874. m.emit(0xfd)
  36875. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  36876. m.emit(0x5a)
  36877. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36878. })
  36879. }
  36880. if p.len == 0 {
  36881. panic("invalid operands for VCVTPD2PS")
  36882. }
  36883. return p
  36884. }
  36885. // VCVTPD2QQ performs "Convert Packed Double-Precision Floating-Point Values to Packed Quadword Integers".
  36886. //
  36887. // Mnemonic : VCVTPD2QQ
  36888. // Supported forms : (7 forms)
  36889. //
  36890. // * VCVTPD2QQ m512/m64bcst, zmm{k}{z} [AVX512DQ]
  36891. // * VCVTPD2QQ {er}, zmm, zmm{k}{z} [AVX512DQ]
  36892. // * VCVTPD2QQ zmm, zmm{k}{z} [AVX512DQ]
  36893. // * VCVTPD2QQ m128/m64bcst, xmm{k}{z} [AVX512DQ,AVX512VL]
  36894. // * VCVTPD2QQ m256/m64bcst, ymm{k}{z} [AVX512DQ,AVX512VL]
  36895. // * VCVTPD2QQ xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  36896. // * VCVTPD2QQ ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  36897. //
  36898. func (self *Program) VCVTPD2QQ(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  36899. var p *Instruction
  36900. switch len(vv) {
  36901. case 0 : p = self.alloc("VCVTPD2QQ", 2, Operands { v0, v1 })
  36902. case 1 : p = self.alloc("VCVTPD2QQ", 3, Operands { v0, v1, vv[0] })
  36903. default : panic("instruction VCVTPD2QQ takes 2 or 3 operands")
  36904. }
  36905. // VCVTPD2QQ m512/m64bcst, zmm{k}{z}
  36906. if len(vv) == 0 && isM512M64bcst(v0) && isZMMkz(v1) {
  36907. self.require(ISA_AVX512DQ)
  36908. p.domain = DomainAVX
  36909. p.add(0, func(m *_Encoding, v []interface{}) {
  36910. m.evex(0b01, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  36911. m.emit(0x7b)
  36912. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  36913. })
  36914. }
  36915. // VCVTPD2QQ {er}, zmm, zmm{k}{z}
  36916. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMMkz(vv[0]) {
  36917. self.require(ISA_AVX512DQ)
  36918. p.domain = DomainAVX
  36919. p.add(0, func(m *_Encoding, v []interface{}) {
  36920. m.emit(0x62)
  36921. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  36922. m.emit(0xfd)
  36923. m.emit((zcode(v[2]) << 7) | (vcode(v[0]) << 5) | kcode(v[2]) | 0x18)
  36924. m.emit(0x7b)
  36925. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  36926. })
  36927. }
  36928. // VCVTPD2QQ zmm, zmm{k}{z}
  36929. if len(vv) == 0 && isZMM(v0) && isZMMkz(v1) {
  36930. self.require(ISA_AVX512DQ)
  36931. p.domain = DomainAVX
  36932. p.add(0, func(m *_Encoding, v []interface{}) {
  36933. m.emit(0x62)
  36934. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  36935. m.emit(0xfd)
  36936. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  36937. m.emit(0x7b)
  36938. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36939. })
  36940. }
  36941. // VCVTPD2QQ m128/m64bcst, xmm{k}{z}
  36942. if len(vv) == 0 && isM128M64bcst(v0) && isXMMkz(v1) {
  36943. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  36944. p.domain = DomainAVX
  36945. p.add(0, func(m *_Encoding, v []interface{}) {
  36946. m.evex(0b01, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  36947. m.emit(0x7b)
  36948. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  36949. })
  36950. }
  36951. // VCVTPD2QQ m256/m64bcst, ymm{k}{z}
  36952. if len(vv) == 0 && isM256M64bcst(v0) && isYMMkz(v1) {
  36953. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  36954. p.domain = DomainAVX
  36955. p.add(0, func(m *_Encoding, v []interface{}) {
  36956. m.evex(0b01, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  36957. m.emit(0x7b)
  36958. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  36959. })
  36960. }
  36961. // VCVTPD2QQ xmm, xmm{k}{z}
  36962. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  36963. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  36964. p.domain = DomainAVX
  36965. p.add(0, func(m *_Encoding, v []interface{}) {
  36966. m.emit(0x62)
  36967. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  36968. m.emit(0xfd)
  36969. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  36970. m.emit(0x7b)
  36971. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36972. })
  36973. }
  36974. // VCVTPD2QQ ymm, ymm{k}{z}
  36975. if len(vv) == 0 && isEVEXYMM(v0) && isYMMkz(v1) {
  36976. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  36977. p.domain = DomainAVX
  36978. p.add(0, func(m *_Encoding, v []interface{}) {
  36979. m.emit(0x62)
  36980. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  36981. m.emit(0xfd)
  36982. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  36983. m.emit(0x7b)
  36984. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  36985. })
  36986. }
  36987. if p.len == 0 {
  36988. panic("invalid operands for VCVTPD2QQ")
  36989. }
  36990. return p
  36991. }
  36992. // VCVTPD2UDQ performs "Convert Packed Double-Precision Floating-Point Values to Packed Unsigned Doubleword Integers".
  36993. //
  36994. // Mnemonic : VCVTPD2UDQ
  36995. // Supported forms : (7 forms)
  36996. //
  36997. // * VCVTPD2UDQ m512/m64bcst, ymm{k}{z} [AVX512F]
  36998. // * VCVTPD2UDQ {er}, zmm, ymm{k}{z} [AVX512F]
  36999. // * VCVTPD2UDQ zmm, ymm{k}{z} [AVX512F]
  37000. // * VCVTPD2UDQ m128/m64bcst, xmm{k}{z} [AVX512F,AVX512VL]
  37001. // * VCVTPD2UDQ m256/m64bcst, xmm{k}{z} [AVX512F,AVX512VL]
  37002. // * VCVTPD2UDQ xmm, xmm{k}{z} [AVX512F,AVX512VL]
  37003. // * VCVTPD2UDQ ymm, xmm{k}{z} [AVX512F,AVX512VL]
  37004. //
  37005. func (self *Program) VCVTPD2UDQ(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  37006. var p *Instruction
  37007. switch len(vv) {
  37008. case 0 : p = self.alloc("VCVTPD2UDQ", 2, Operands { v0, v1 })
  37009. case 1 : p = self.alloc("VCVTPD2UDQ", 3, Operands { v0, v1, vv[0] })
  37010. default : panic("instruction VCVTPD2UDQ takes 2 or 3 operands")
  37011. }
  37012. // VCVTPD2UDQ m512/m64bcst, ymm{k}{z}
  37013. if len(vv) == 0 && isM512M64bcst(v0) && isYMMkz(v1) {
  37014. self.require(ISA_AVX512F)
  37015. p.domain = DomainAVX
  37016. p.add(0, func(m *_Encoding, v []interface{}) {
  37017. m.evex(0b01, 0x84, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  37018. m.emit(0x79)
  37019. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  37020. })
  37021. }
  37022. // VCVTPD2UDQ {er}, zmm, ymm{k}{z}
  37023. if len(vv) == 1 && isER(v0) && isZMM(v1) && isYMMkz(vv[0]) {
  37024. self.require(ISA_AVX512F)
  37025. p.domain = DomainAVX
  37026. p.add(0, func(m *_Encoding, v []interface{}) {
  37027. m.emit(0x62)
  37028. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  37029. m.emit(0xfc)
  37030. m.emit((zcode(v[2]) << 7) | (vcode(v[0]) << 5) | kcode(v[2]) | 0x18)
  37031. m.emit(0x79)
  37032. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  37033. })
  37034. }
  37035. // VCVTPD2UDQ zmm, ymm{k}{z}
  37036. if len(vv) == 0 && isZMM(v0) && isYMMkz(v1) {
  37037. self.require(ISA_AVX512F)
  37038. p.domain = DomainAVX
  37039. p.add(0, func(m *_Encoding, v []interface{}) {
  37040. m.emit(0x62)
  37041. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  37042. m.emit(0xfc)
  37043. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  37044. m.emit(0x79)
  37045. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37046. })
  37047. }
  37048. // VCVTPD2UDQ m128/m64bcst, xmm{k}{z}
  37049. if len(vv) == 0 && isM128M64bcst(v0) && isXMMkz(v1) {
  37050. self.require(ISA_AVX512VL | ISA_AVX512F)
  37051. p.domain = DomainAVX
  37052. p.add(0, func(m *_Encoding, v []interface{}) {
  37053. m.evex(0b01, 0x84, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  37054. m.emit(0x79)
  37055. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  37056. })
  37057. }
  37058. // VCVTPD2UDQ m256/m64bcst, xmm{k}{z}
  37059. if len(vv) == 0 && isM256M64bcst(v0) && isXMMkz(v1) {
  37060. self.require(ISA_AVX512VL | ISA_AVX512F)
  37061. p.domain = DomainAVX
  37062. p.add(0, func(m *_Encoding, v []interface{}) {
  37063. m.evex(0b01, 0x84, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  37064. m.emit(0x79)
  37065. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  37066. })
  37067. }
  37068. // VCVTPD2UDQ xmm, xmm{k}{z}
  37069. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  37070. self.require(ISA_AVX512VL | ISA_AVX512F)
  37071. p.domain = DomainAVX
  37072. p.add(0, func(m *_Encoding, v []interface{}) {
  37073. m.emit(0x62)
  37074. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  37075. m.emit(0xfc)
  37076. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  37077. m.emit(0x79)
  37078. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37079. })
  37080. }
  37081. // VCVTPD2UDQ ymm, xmm{k}{z}
  37082. if len(vv) == 0 && isEVEXYMM(v0) && isXMMkz(v1) {
  37083. self.require(ISA_AVX512VL | ISA_AVX512F)
  37084. p.domain = DomainAVX
  37085. p.add(0, func(m *_Encoding, v []interface{}) {
  37086. m.emit(0x62)
  37087. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  37088. m.emit(0xfc)
  37089. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  37090. m.emit(0x79)
  37091. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37092. })
  37093. }
  37094. if p.len == 0 {
  37095. panic("invalid operands for VCVTPD2UDQ")
  37096. }
  37097. return p
  37098. }
  37099. // VCVTPD2UQQ performs "Convert Packed Double-Precision Floating-Point Values to Packed Unsigned Quadword Integers".
  37100. //
  37101. // Mnemonic : VCVTPD2UQQ
  37102. // Supported forms : (7 forms)
  37103. //
  37104. // * VCVTPD2UQQ m512/m64bcst, zmm{k}{z} [AVX512DQ]
  37105. // * VCVTPD2UQQ {er}, zmm, zmm{k}{z} [AVX512DQ]
  37106. // * VCVTPD2UQQ zmm, zmm{k}{z} [AVX512DQ]
  37107. // * VCVTPD2UQQ m128/m64bcst, xmm{k}{z} [AVX512DQ,AVX512VL]
  37108. // * VCVTPD2UQQ m256/m64bcst, ymm{k}{z} [AVX512DQ,AVX512VL]
  37109. // * VCVTPD2UQQ xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  37110. // * VCVTPD2UQQ ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  37111. //
  37112. func (self *Program) VCVTPD2UQQ(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  37113. var p *Instruction
  37114. switch len(vv) {
  37115. case 0 : p = self.alloc("VCVTPD2UQQ", 2, Operands { v0, v1 })
  37116. case 1 : p = self.alloc("VCVTPD2UQQ", 3, Operands { v0, v1, vv[0] })
  37117. default : panic("instruction VCVTPD2UQQ takes 2 or 3 operands")
  37118. }
  37119. // VCVTPD2UQQ m512/m64bcst, zmm{k}{z}
  37120. if len(vv) == 0 && isM512M64bcst(v0) && isZMMkz(v1) {
  37121. self.require(ISA_AVX512DQ)
  37122. p.domain = DomainAVX
  37123. p.add(0, func(m *_Encoding, v []interface{}) {
  37124. m.evex(0b01, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  37125. m.emit(0x79)
  37126. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  37127. })
  37128. }
  37129. // VCVTPD2UQQ {er}, zmm, zmm{k}{z}
  37130. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMMkz(vv[0]) {
  37131. self.require(ISA_AVX512DQ)
  37132. p.domain = DomainAVX
  37133. p.add(0, func(m *_Encoding, v []interface{}) {
  37134. m.emit(0x62)
  37135. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  37136. m.emit(0xfd)
  37137. m.emit((zcode(v[2]) << 7) | (vcode(v[0]) << 5) | kcode(v[2]) | 0x18)
  37138. m.emit(0x79)
  37139. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  37140. })
  37141. }
  37142. // VCVTPD2UQQ zmm, zmm{k}{z}
  37143. if len(vv) == 0 && isZMM(v0) && isZMMkz(v1) {
  37144. self.require(ISA_AVX512DQ)
  37145. p.domain = DomainAVX
  37146. p.add(0, func(m *_Encoding, v []interface{}) {
  37147. m.emit(0x62)
  37148. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  37149. m.emit(0xfd)
  37150. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  37151. m.emit(0x79)
  37152. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37153. })
  37154. }
  37155. // VCVTPD2UQQ m128/m64bcst, xmm{k}{z}
  37156. if len(vv) == 0 && isM128M64bcst(v0) && isXMMkz(v1) {
  37157. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  37158. p.domain = DomainAVX
  37159. p.add(0, func(m *_Encoding, v []interface{}) {
  37160. m.evex(0b01, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  37161. m.emit(0x79)
  37162. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  37163. })
  37164. }
  37165. // VCVTPD2UQQ m256/m64bcst, ymm{k}{z}
  37166. if len(vv) == 0 && isM256M64bcst(v0) && isYMMkz(v1) {
  37167. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  37168. p.domain = DomainAVX
  37169. p.add(0, func(m *_Encoding, v []interface{}) {
  37170. m.evex(0b01, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  37171. m.emit(0x79)
  37172. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  37173. })
  37174. }
  37175. // VCVTPD2UQQ xmm, xmm{k}{z}
  37176. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  37177. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  37178. p.domain = DomainAVX
  37179. p.add(0, func(m *_Encoding, v []interface{}) {
  37180. m.emit(0x62)
  37181. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  37182. m.emit(0xfd)
  37183. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  37184. m.emit(0x79)
  37185. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37186. })
  37187. }
  37188. // VCVTPD2UQQ ymm, ymm{k}{z}
  37189. if len(vv) == 0 && isEVEXYMM(v0) && isYMMkz(v1) {
  37190. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  37191. p.domain = DomainAVX
  37192. p.add(0, func(m *_Encoding, v []interface{}) {
  37193. m.emit(0x62)
  37194. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  37195. m.emit(0xfd)
  37196. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  37197. m.emit(0x79)
  37198. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37199. })
  37200. }
  37201. if p.len == 0 {
  37202. panic("invalid operands for VCVTPD2UQQ")
  37203. }
  37204. return p
  37205. }
  37206. // VCVTPH2PS performs "Convert Half-Precision FP Values to Single-Precision FP Values".
  37207. //
  37208. // Mnemonic : VCVTPH2PS
  37209. // Supported forms : (11 forms)
  37210. //
  37211. // * VCVTPH2PS xmm, xmm [F16C]
  37212. // * VCVTPH2PS m64, xmm [F16C]
  37213. // * VCVTPH2PS xmm, ymm [F16C]
  37214. // * VCVTPH2PS m128, ymm [F16C]
  37215. // * VCVTPH2PS m256, zmm{k}{z} [AVX512F]
  37216. // * VCVTPH2PS {sae}, ymm, zmm{k}{z} [AVX512F]
  37217. // * VCVTPH2PS ymm, zmm{k}{z} [AVX512F]
  37218. // * VCVTPH2PS xmm, xmm{k}{z} [AVX512F,AVX512VL]
  37219. // * VCVTPH2PS xmm, ymm{k}{z} [AVX512F,AVX512VL]
  37220. // * VCVTPH2PS m64, xmm{k}{z} [AVX512F,AVX512VL]
  37221. // * VCVTPH2PS m128, ymm{k}{z} [AVX512F,AVX512VL]
  37222. //
  37223. func (self *Program) VCVTPH2PS(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  37224. var p *Instruction
  37225. switch len(vv) {
  37226. case 0 : p = self.alloc("VCVTPH2PS", 2, Operands { v0, v1 })
  37227. case 1 : p = self.alloc("VCVTPH2PS", 3, Operands { v0, v1, vv[0] })
  37228. default : panic("instruction VCVTPH2PS takes 2 or 3 operands")
  37229. }
  37230. // VCVTPH2PS xmm, xmm
  37231. if len(vv) == 0 && isXMM(v0) && isXMM(v1) {
  37232. self.require(ISA_F16C)
  37233. p.domain = DomainAVX
  37234. p.add(0, func(m *_Encoding, v []interface{}) {
  37235. m.emit(0xc4)
  37236. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  37237. m.emit(0x79)
  37238. m.emit(0x13)
  37239. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37240. })
  37241. }
  37242. // VCVTPH2PS m64, xmm
  37243. if len(vv) == 0 && isM64(v0) && isXMM(v1) {
  37244. self.require(ISA_F16C)
  37245. p.domain = DomainAVX
  37246. p.add(0, func(m *_Encoding, v []interface{}) {
  37247. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  37248. m.emit(0x13)
  37249. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  37250. })
  37251. }
  37252. // VCVTPH2PS xmm, ymm
  37253. if len(vv) == 0 && isXMM(v0) && isYMM(v1) {
  37254. self.require(ISA_F16C)
  37255. p.domain = DomainAVX
  37256. p.add(0, func(m *_Encoding, v []interface{}) {
  37257. m.emit(0xc4)
  37258. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  37259. m.emit(0x7d)
  37260. m.emit(0x13)
  37261. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37262. })
  37263. }
  37264. // VCVTPH2PS m128, ymm
  37265. if len(vv) == 0 && isM128(v0) && isYMM(v1) {
  37266. self.require(ISA_F16C)
  37267. p.domain = DomainAVX
  37268. p.add(0, func(m *_Encoding, v []interface{}) {
  37269. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  37270. m.emit(0x13)
  37271. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  37272. })
  37273. }
  37274. // VCVTPH2PS m256, zmm{k}{z}
  37275. if len(vv) == 0 && isM256(v0) && isZMMkz(v1) {
  37276. self.require(ISA_AVX512F)
  37277. p.domain = DomainAVX
  37278. p.add(0, func(m *_Encoding, v []interface{}) {
  37279. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  37280. m.emit(0x13)
  37281. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  37282. })
  37283. }
  37284. // VCVTPH2PS {sae}, ymm, zmm{k}{z}
  37285. if len(vv) == 1 && isSAE(v0) && isEVEXYMM(v1) && isZMMkz(vv[0]) {
  37286. self.require(ISA_AVX512F)
  37287. p.domain = DomainAVX
  37288. p.add(0, func(m *_Encoding, v []interface{}) {
  37289. m.emit(0x62)
  37290. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  37291. m.emit(0x7d)
  37292. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x18)
  37293. m.emit(0x13)
  37294. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  37295. })
  37296. }
  37297. // VCVTPH2PS ymm, zmm{k}{z}
  37298. if len(vv) == 0 && isEVEXYMM(v0) && isZMMkz(v1) {
  37299. self.require(ISA_AVX512F)
  37300. p.domain = DomainAVX
  37301. p.add(0, func(m *_Encoding, v []interface{}) {
  37302. m.emit(0x62)
  37303. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  37304. m.emit(0x7d)
  37305. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  37306. m.emit(0x13)
  37307. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37308. })
  37309. }
  37310. // VCVTPH2PS xmm, xmm{k}{z}
  37311. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  37312. self.require(ISA_AVX512VL | ISA_AVX512F)
  37313. p.domain = DomainAVX
  37314. p.add(0, func(m *_Encoding, v []interface{}) {
  37315. m.emit(0x62)
  37316. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  37317. m.emit(0x7d)
  37318. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  37319. m.emit(0x13)
  37320. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37321. })
  37322. }
  37323. // VCVTPH2PS xmm, ymm{k}{z}
  37324. if len(vv) == 0 && isEVEXXMM(v0) && isYMMkz(v1) {
  37325. self.require(ISA_AVX512VL | ISA_AVX512F)
  37326. p.domain = DomainAVX
  37327. p.add(0, func(m *_Encoding, v []interface{}) {
  37328. m.emit(0x62)
  37329. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  37330. m.emit(0x7d)
  37331. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  37332. m.emit(0x13)
  37333. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37334. })
  37335. }
  37336. // VCVTPH2PS m64, xmm{k}{z}
  37337. if len(vv) == 0 && isM64(v0) && isXMMkz(v1) {
  37338. self.require(ISA_AVX512VL | ISA_AVX512F)
  37339. p.domain = DomainAVX
  37340. p.add(0, func(m *_Encoding, v []interface{}) {
  37341. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  37342. m.emit(0x13)
  37343. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  37344. })
  37345. }
  37346. // VCVTPH2PS m128, ymm{k}{z}
  37347. if len(vv) == 0 && isM128(v0) && isYMMkz(v1) {
  37348. self.require(ISA_AVX512VL | ISA_AVX512F)
  37349. p.domain = DomainAVX
  37350. p.add(0, func(m *_Encoding, v []interface{}) {
  37351. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  37352. m.emit(0x13)
  37353. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  37354. })
  37355. }
  37356. if p.len == 0 {
  37357. panic("invalid operands for VCVTPH2PS")
  37358. }
  37359. return p
  37360. }
  37361. // VCVTPS2DQ performs "Convert Packed Single-Precision FP Values to Packed Dword Integers".
  37362. //
  37363. // Mnemonic : VCVTPS2DQ
  37364. // Supported forms : (11 forms)
  37365. //
  37366. // * VCVTPS2DQ xmm, xmm [AVX]
  37367. // * VCVTPS2DQ m128, xmm [AVX]
  37368. // * VCVTPS2DQ ymm, ymm [AVX]
  37369. // * VCVTPS2DQ m256, ymm [AVX]
  37370. // * VCVTPS2DQ m512/m32bcst, zmm{k}{z} [AVX512F]
  37371. // * VCVTPS2DQ {er}, zmm, zmm{k}{z} [AVX512F]
  37372. // * VCVTPS2DQ zmm, zmm{k}{z} [AVX512F]
  37373. // * VCVTPS2DQ m128/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  37374. // * VCVTPS2DQ m256/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  37375. // * VCVTPS2DQ xmm, xmm{k}{z} [AVX512F,AVX512VL]
  37376. // * VCVTPS2DQ ymm, ymm{k}{z} [AVX512F,AVX512VL]
  37377. //
  37378. func (self *Program) VCVTPS2DQ(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  37379. var p *Instruction
  37380. switch len(vv) {
  37381. case 0 : p = self.alloc("VCVTPS2DQ", 2, Operands { v0, v1 })
  37382. case 1 : p = self.alloc("VCVTPS2DQ", 3, Operands { v0, v1, vv[0] })
  37383. default : panic("instruction VCVTPS2DQ takes 2 or 3 operands")
  37384. }
  37385. // VCVTPS2DQ xmm, xmm
  37386. if len(vv) == 0 && isXMM(v0) && isXMM(v1) {
  37387. self.require(ISA_AVX)
  37388. p.domain = DomainAVX
  37389. p.add(0, func(m *_Encoding, v []interface{}) {
  37390. m.vex2(1, hcode(v[1]), v[0], 0)
  37391. m.emit(0x5b)
  37392. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37393. })
  37394. }
  37395. // VCVTPS2DQ m128, xmm
  37396. if len(vv) == 0 && isM128(v0) && isXMM(v1) {
  37397. self.require(ISA_AVX)
  37398. p.domain = DomainAVX
  37399. p.add(0, func(m *_Encoding, v []interface{}) {
  37400. m.vex2(1, hcode(v[1]), addr(v[0]), 0)
  37401. m.emit(0x5b)
  37402. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  37403. })
  37404. }
  37405. // VCVTPS2DQ ymm, ymm
  37406. if len(vv) == 0 && isYMM(v0) && isYMM(v1) {
  37407. self.require(ISA_AVX)
  37408. p.domain = DomainAVX
  37409. p.add(0, func(m *_Encoding, v []interface{}) {
  37410. m.vex2(5, hcode(v[1]), v[0], 0)
  37411. m.emit(0x5b)
  37412. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37413. })
  37414. }
  37415. // VCVTPS2DQ m256, ymm
  37416. if len(vv) == 0 && isM256(v0) && isYMM(v1) {
  37417. self.require(ISA_AVX)
  37418. p.domain = DomainAVX
  37419. p.add(0, func(m *_Encoding, v []interface{}) {
  37420. m.vex2(5, hcode(v[1]), addr(v[0]), 0)
  37421. m.emit(0x5b)
  37422. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  37423. })
  37424. }
  37425. // VCVTPS2DQ m512/m32bcst, zmm{k}{z}
  37426. if len(vv) == 0 && isM512M32bcst(v0) && isZMMkz(v1) {
  37427. self.require(ISA_AVX512F)
  37428. p.domain = DomainAVX
  37429. p.add(0, func(m *_Encoding, v []interface{}) {
  37430. m.evex(0b01, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  37431. m.emit(0x5b)
  37432. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  37433. })
  37434. }
  37435. // VCVTPS2DQ {er}, zmm, zmm{k}{z}
  37436. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMMkz(vv[0]) {
  37437. self.require(ISA_AVX512F)
  37438. p.domain = DomainAVX
  37439. p.add(0, func(m *_Encoding, v []interface{}) {
  37440. m.emit(0x62)
  37441. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  37442. m.emit(0x7d)
  37443. m.emit((zcode(v[2]) << 7) | (vcode(v[0]) << 5) | kcode(v[2]) | 0x18)
  37444. m.emit(0x5b)
  37445. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  37446. })
  37447. }
  37448. // VCVTPS2DQ zmm, zmm{k}{z}
  37449. if len(vv) == 0 && isZMM(v0) && isZMMkz(v1) {
  37450. self.require(ISA_AVX512F)
  37451. p.domain = DomainAVX
  37452. p.add(0, func(m *_Encoding, v []interface{}) {
  37453. m.emit(0x62)
  37454. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  37455. m.emit(0x7d)
  37456. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  37457. m.emit(0x5b)
  37458. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37459. })
  37460. }
  37461. // VCVTPS2DQ m128/m32bcst, xmm{k}{z}
  37462. if len(vv) == 0 && isM128M32bcst(v0) && isXMMkz(v1) {
  37463. self.require(ISA_AVX512VL | ISA_AVX512F)
  37464. p.domain = DomainAVX
  37465. p.add(0, func(m *_Encoding, v []interface{}) {
  37466. m.evex(0b01, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  37467. m.emit(0x5b)
  37468. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  37469. })
  37470. }
  37471. // VCVTPS2DQ m256/m32bcst, ymm{k}{z}
  37472. if len(vv) == 0 && isM256M32bcst(v0) && isYMMkz(v1) {
  37473. self.require(ISA_AVX512VL | ISA_AVX512F)
  37474. p.domain = DomainAVX
  37475. p.add(0, func(m *_Encoding, v []interface{}) {
  37476. m.evex(0b01, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  37477. m.emit(0x5b)
  37478. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  37479. })
  37480. }
  37481. // VCVTPS2DQ xmm, xmm{k}{z}
  37482. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  37483. self.require(ISA_AVX512VL | ISA_AVX512F)
  37484. p.domain = DomainAVX
  37485. p.add(0, func(m *_Encoding, v []interface{}) {
  37486. m.emit(0x62)
  37487. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  37488. m.emit(0x7d)
  37489. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  37490. m.emit(0x5b)
  37491. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37492. })
  37493. }
  37494. // VCVTPS2DQ ymm, ymm{k}{z}
  37495. if len(vv) == 0 && isEVEXYMM(v0) && isYMMkz(v1) {
  37496. self.require(ISA_AVX512VL | ISA_AVX512F)
  37497. p.domain = DomainAVX
  37498. p.add(0, func(m *_Encoding, v []interface{}) {
  37499. m.emit(0x62)
  37500. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  37501. m.emit(0x7d)
  37502. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  37503. m.emit(0x5b)
  37504. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37505. })
  37506. }
  37507. if p.len == 0 {
  37508. panic("invalid operands for VCVTPS2DQ")
  37509. }
  37510. return p
  37511. }
  37512. // VCVTPS2PD performs "Convert Packed Single-Precision FP Values to Packed Double-Precision FP Values".
  37513. //
  37514. // Mnemonic : VCVTPS2PD
  37515. // Supported forms : (11 forms)
  37516. //
  37517. // * VCVTPS2PD xmm, xmm [AVX]
  37518. // * VCVTPS2PD m64, xmm [AVX]
  37519. // * VCVTPS2PD xmm, ymm [AVX]
  37520. // * VCVTPS2PD m128, ymm [AVX]
  37521. // * VCVTPS2PD m256/m32bcst, zmm{k}{z} [AVX512F]
  37522. // * VCVTPS2PD {sae}, ymm, zmm{k}{z} [AVX512F]
  37523. // * VCVTPS2PD ymm, zmm{k}{z} [AVX512F]
  37524. // * VCVTPS2PD m64/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  37525. // * VCVTPS2PD m128/m32bcst, ymm{k}{z} [AVX512VL]
  37526. // * VCVTPS2PD xmm, xmm{k}{z} [AVX512F,AVX512VL]
  37527. // * VCVTPS2PD xmm, ymm{k}{z} [AVX512VL]
  37528. //
  37529. func (self *Program) VCVTPS2PD(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  37530. var p *Instruction
  37531. switch len(vv) {
  37532. case 0 : p = self.alloc("VCVTPS2PD", 2, Operands { v0, v1 })
  37533. case 1 : p = self.alloc("VCVTPS2PD", 3, Operands { v0, v1, vv[0] })
  37534. default : panic("instruction VCVTPS2PD takes 2 or 3 operands")
  37535. }
  37536. // VCVTPS2PD xmm, xmm
  37537. if len(vv) == 0 && isXMM(v0) && isXMM(v1) {
  37538. self.require(ISA_AVX)
  37539. p.domain = DomainAVX
  37540. p.add(0, func(m *_Encoding, v []interface{}) {
  37541. m.vex2(0, hcode(v[1]), v[0], 0)
  37542. m.emit(0x5a)
  37543. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37544. })
  37545. }
  37546. // VCVTPS2PD m64, xmm
  37547. if len(vv) == 0 && isM64(v0) && isXMM(v1) {
  37548. self.require(ISA_AVX)
  37549. p.domain = DomainAVX
  37550. p.add(0, func(m *_Encoding, v []interface{}) {
  37551. m.vex2(0, hcode(v[1]), addr(v[0]), 0)
  37552. m.emit(0x5a)
  37553. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  37554. })
  37555. }
  37556. // VCVTPS2PD xmm, ymm
  37557. if len(vv) == 0 && isXMM(v0) && isYMM(v1) {
  37558. self.require(ISA_AVX)
  37559. p.domain = DomainAVX
  37560. p.add(0, func(m *_Encoding, v []interface{}) {
  37561. m.vex2(4, hcode(v[1]), v[0], 0)
  37562. m.emit(0x5a)
  37563. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37564. })
  37565. }
  37566. // VCVTPS2PD m128, ymm
  37567. if len(vv) == 0 && isM128(v0) && isYMM(v1) {
  37568. self.require(ISA_AVX)
  37569. p.domain = DomainAVX
  37570. p.add(0, func(m *_Encoding, v []interface{}) {
  37571. m.vex2(4, hcode(v[1]), addr(v[0]), 0)
  37572. m.emit(0x5a)
  37573. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  37574. })
  37575. }
  37576. // VCVTPS2PD m256/m32bcst, zmm{k}{z}
  37577. if len(vv) == 0 && isM256M32bcst(v0) && isZMMkz(v1) {
  37578. self.require(ISA_AVX512F)
  37579. p.domain = DomainAVX
  37580. p.add(0, func(m *_Encoding, v []interface{}) {
  37581. m.evex(0b01, 0x04, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  37582. m.emit(0x5a)
  37583. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  37584. })
  37585. }
  37586. // VCVTPS2PD {sae}, ymm, zmm{k}{z}
  37587. if len(vv) == 1 && isSAE(v0) && isEVEXYMM(v1) && isZMMkz(vv[0]) {
  37588. self.require(ISA_AVX512F)
  37589. p.domain = DomainAVX
  37590. p.add(0, func(m *_Encoding, v []interface{}) {
  37591. m.emit(0x62)
  37592. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  37593. m.emit(0x7c)
  37594. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x18)
  37595. m.emit(0x5a)
  37596. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  37597. })
  37598. }
  37599. // VCVTPS2PD ymm, zmm{k}{z}
  37600. if len(vv) == 0 && isEVEXYMM(v0) && isZMMkz(v1) {
  37601. self.require(ISA_AVX512F)
  37602. p.domain = DomainAVX
  37603. p.add(0, func(m *_Encoding, v []interface{}) {
  37604. m.emit(0x62)
  37605. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  37606. m.emit(0x7c)
  37607. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  37608. m.emit(0x5a)
  37609. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37610. })
  37611. }
  37612. // VCVTPS2PD m64/m32bcst, xmm{k}{z}
  37613. if len(vv) == 0 && isM64M32bcst(v0) && isXMMkz(v1) {
  37614. self.require(ISA_AVX512VL | ISA_AVX512F)
  37615. p.domain = DomainAVX
  37616. p.add(0, func(m *_Encoding, v []interface{}) {
  37617. m.evex(0b01, 0x04, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  37618. m.emit(0x5a)
  37619. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  37620. })
  37621. }
  37622. // VCVTPS2PD m128/m32bcst, ymm{k}{z}
  37623. if len(vv) == 0 && isM128M32bcst(v0) && isYMMkz(v1) {
  37624. self.require(ISA_AVX512VL)
  37625. p.domain = DomainAVX
  37626. p.add(0, func(m *_Encoding, v []interface{}) {
  37627. m.evex(0b01, 0x04, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  37628. m.emit(0x5a)
  37629. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  37630. })
  37631. }
  37632. // VCVTPS2PD xmm, xmm{k}{z}
  37633. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  37634. self.require(ISA_AVX512VL | ISA_AVX512F)
  37635. p.domain = DomainAVX
  37636. p.add(0, func(m *_Encoding, v []interface{}) {
  37637. m.emit(0x62)
  37638. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  37639. m.emit(0x7c)
  37640. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  37641. m.emit(0x5a)
  37642. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37643. })
  37644. }
  37645. // VCVTPS2PD xmm, ymm{k}{z}
  37646. if len(vv) == 0 && isEVEXXMM(v0) && isYMMkz(v1) {
  37647. self.require(ISA_AVX512VL)
  37648. p.domain = DomainAVX
  37649. p.add(0, func(m *_Encoding, v []interface{}) {
  37650. m.emit(0x62)
  37651. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  37652. m.emit(0x7c)
  37653. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  37654. m.emit(0x5a)
  37655. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37656. })
  37657. }
  37658. if p.len == 0 {
  37659. panic("invalid operands for VCVTPS2PD")
  37660. }
  37661. return p
  37662. }
  37663. // VCVTPS2PH performs "Convert Single-Precision FP value to Half-Precision FP value".
  37664. //
  37665. // Mnemonic : VCVTPS2PH
  37666. // Supported forms : (11 forms)
  37667. //
  37668. // * VCVTPS2PH imm8, xmm, xmm [F16C]
  37669. // * VCVTPS2PH imm8, ymm, xmm [F16C]
  37670. // * VCVTPS2PH imm8, xmm, m64 [F16C]
  37671. // * VCVTPS2PH imm8, ymm, m128 [F16C]
  37672. // * VCVTPS2PH imm8, zmm, m256{k}{z} [AVX512F]
  37673. // * VCVTPS2PH imm8, {sae}, zmm, ymm{k}{z} [AVX512F]
  37674. // * VCVTPS2PH imm8, zmm, ymm{k}{z} [AVX512F]
  37675. // * VCVTPS2PH imm8, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  37676. // * VCVTPS2PH imm8, xmm, m64{k}{z} [AVX512F,AVX512VL]
  37677. // * VCVTPS2PH imm8, ymm, xmm{k}{z} [AVX512F,AVX512VL]
  37678. // * VCVTPS2PH imm8, ymm, m128{k}{z} [AVX512F,AVX512VL]
  37679. //
  37680. func (self *Program) VCVTPS2PH(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  37681. var p *Instruction
  37682. switch len(vv) {
  37683. case 0 : p = self.alloc("VCVTPS2PH", 3, Operands { v0, v1, v2 })
  37684. case 1 : p = self.alloc("VCVTPS2PH", 4, Operands { v0, v1, v2, vv[0] })
  37685. default : panic("instruction VCVTPS2PH takes 3 or 4 operands")
  37686. }
  37687. // VCVTPS2PH imm8, xmm, xmm
  37688. if len(vv) == 0 && isImm8(v0) && isXMM(v1) && isXMM(v2) {
  37689. self.require(ISA_F16C)
  37690. p.domain = DomainAVX
  37691. p.add(0, func(m *_Encoding, v []interface{}) {
  37692. m.emit(0xc4)
  37693. m.emit(0xe3 ^ (hcode(v[1]) << 7) ^ (hcode(v[2]) << 5))
  37694. m.emit(0x79)
  37695. m.emit(0x1d)
  37696. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  37697. m.imm1(toImmAny(v[0]))
  37698. })
  37699. }
  37700. // VCVTPS2PH imm8, ymm, xmm
  37701. if len(vv) == 0 && isImm8(v0) && isYMM(v1) && isXMM(v2) {
  37702. self.require(ISA_F16C)
  37703. p.domain = DomainAVX
  37704. p.add(0, func(m *_Encoding, v []interface{}) {
  37705. m.emit(0xc4)
  37706. m.emit(0xe3 ^ (hcode(v[1]) << 7) ^ (hcode(v[2]) << 5))
  37707. m.emit(0x7d)
  37708. m.emit(0x1d)
  37709. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  37710. m.imm1(toImmAny(v[0]))
  37711. })
  37712. }
  37713. // VCVTPS2PH imm8, xmm, m64
  37714. if len(vv) == 0 && isImm8(v0) && isXMM(v1) && isM64(v2) {
  37715. self.require(ISA_F16C)
  37716. p.domain = DomainAVX
  37717. p.add(0, func(m *_Encoding, v []interface{}) {
  37718. m.vex3(0xc4, 0b11, 0x01, hcode(v[1]), addr(v[2]), 0)
  37719. m.emit(0x1d)
  37720. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  37721. m.imm1(toImmAny(v[0]))
  37722. })
  37723. }
  37724. // VCVTPS2PH imm8, ymm, m128
  37725. if len(vv) == 0 && isImm8(v0) && isYMM(v1) && isM128(v2) {
  37726. self.require(ISA_F16C)
  37727. p.domain = DomainAVX
  37728. p.add(0, func(m *_Encoding, v []interface{}) {
  37729. m.vex3(0xc4, 0b11, 0x05, hcode(v[1]), addr(v[2]), 0)
  37730. m.emit(0x1d)
  37731. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  37732. m.imm1(toImmAny(v[0]))
  37733. })
  37734. }
  37735. // VCVTPS2PH imm8, zmm, m256{k}{z}
  37736. if len(vv) == 0 && isImm8(v0) && isZMM(v1) && isM256kz(v2) {
  37737. self.require(ISA_AVX512F)
  37738. p.domain = DomainAVX
  37739. p.add(0, func(m *_Encoding, v []interface{}) {
  37740. m.evex(0b11, 0x05, 0b10, ehcode(v[1]), addr(v[2]), 0, kcode(v[2]), zcode(v[2]), 0)
  37741. m.emit(0x1d)
  37742. m.mrsd(lcode(v[1]), addr(v[2]), 32)
  37743. m.imm1(toImmAny(v[0]))
  37744. })
  37745. }
  37746. // VCVTPS2PH imm8, {sae}, zmm, ymm{k}{z}
  37747. if len(vv) == 1 && isImm8(v0) && isSAE(v1) && isZMM(v2) && isYMMkz(vv[0]) {
  37748. self.require(ISA_AVX512F)
  37749. p.domain = DomainAVX
  37750. p.add(0, func(m *_Encoding, v []interface{}) {
  37751. m.emit(0x62)
  37752. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[3]) << 5) | (ecode(v[2]) << 4)))
  37753. m.emit(0x7d)
  37754. m.emit((zcode(v[3]) << 7) | kcode(v[3]) | 0x18)
  37755. m.emit(0x1d)
  37756. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[3]))
  37757. m.imm1(toImmAny(v[0]))
  37758. })
  37759. }
  37760. // VCVTPS2PH imm8, zmm, ymm{k}{z}
  37761. if len(vv) == 0 && isImm8(v0) && isZMM(v1) && isYMMkz(v2) {
  37762. self.require(ISA_AVX512F)
  37763. p.domain = DomainAVX
  37764. p.add(0, func(m *_Encoding, v []interface{}) {
  37765. m.emit(0x62)
  37766. m.emit(0xf3 ^ ((hcode(v[1]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[1]) << 4)))
  37767. m.emit(0x7d)
  37768. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x48)
  37769. m.emit(0x1d)
  37770. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  37771. m.imm1(toImmAny(v[0]))
  37772. })
  37773. }
  37774. // VCVTPS2PH imm8, xmm, xmm{k}{z}
  37775. if len(vv) == 0 && isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  37776. self.require(ISA_AVX512VL | ISA_AVX512F)
  37777. p.domain = DomainAVX
  37778. p.add(0, func(m *_Encoding, v []interface{}) {
  37779. m.emit(0x62)
  37780. m.emit(0xf3 ^ ((hcode(v[1]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[1]) << 4)))
  37781. m.emit(0x7d)
  37782. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x08)
  37783. m.emit(0x1d)
  37784. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  37785. m.imm1(toImmAny(v[0]))
  37786. })
  37787. }
  37788. // VCVTPS2PH imm8, xmm, m64{k}{z}
  37789. if len(vv) == 0 && isImm8(v0) && isEVEXXMM(v1) && isM64kz(v2) {
  37790. self.require(ISA_AVX512VL | ISA_AVX512F)
  37791. p.domain = DomainAVX
  37792. p.add(0, func(m *_Encoding, v []interface{}) {
  37793. m.evex(0b11, 0x05, 0b00, ehcode(v[1]), addr(v[2]), 0, kcode(v[2]), zcode(v[2]), 0)
  37794. m.emit(0x1d)
  37795. m.mrsd(lcode(v[1]), addr(v[2]), 8)
  37796. m.imm1(toImmAny(v[0]))
  37797. })
  37798. }
  37799. // VCVTPS2PH imm8, ymm, xmm{k}{z}
  37800. if len(vv) == 0 && isImm8(v0) && isEVEXYMM(v1) && isXMMkz(v2) {
  37801. self.require(ISA_AVX512VL | ISA_AVX512F)
  37802. p.domain = DomainAVX
  37803. p.add(0, func(m *_Encoding, v []interface{}) {
  37804. m.emit(0x62)
  37805. m.emit(0xf3 ^ ((hcode(v[1]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[1]) << 4)))
  37806. m.emit(0x7d)
  37807. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x28)
  37808. m.emit(0x1d)
  37809. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  37810. m.imm1(toImmAny(v[0]))
  37811. })
  37812. }
  37813. // VCVTPS2PH imm8, ymm, m128{k}{z}
  37814. if len(vv) == 0 && isImm8(v0) && isEVEXYMM(v1) && isM128kz(v2) {
  37815. self.require(ISA_AVX512VL | ISA_AVX512F)
  37816. p.domain = DomainAVX
  37817. p.add(0, func(m *_Encoding, v []interface{}) {
  37818. m.evex(0b11, 0x05, 0b01, ehcode(v[1]), addr(v[2]), 0, kcode(v[2]), zcode(v[2]), 0)
  37819. m.emit(0x1d)
  37820. m.mrsd(lcode(v[1]), addr(v[2]), 16)
  37821. m.imm1(toImmAny(v[0]))
  37822. })
  37823. }
  37824. if p.len == 0 {
  37825. panic("invalid operands for VCVTPS2PH")
  37826. }
  37827. return p
  37828. }
  37829. // VCVTPS2QQ performs "Convert Packed Single Precision Floating-Point Values to Packed Singed Quadword Integer Values".
  37830. //
  37831. // Mnemonic : VCVTPS2QQ
  37832. // Supported forms : (7 forms)
  37833. //
  37834. // * VCVTPS2QQ m256/m32bcst, zmm{k}{z} [AVX512DQ]
  37835. // * VCVTPS2QQ {er}, ymm, zmm{k}{z} [AVX512DQ]
  37836. // * VCVTPS2QQ ymm, zmm{k}{z} [AVX512DQ]
  37837. // * VCVTPS2QQ m64/m32bcst, xmm{k}{z} [AVX512DQ,AVX512VL]
  37838. // * VCVTPS2QQ m128/m32bcst, ymm{k}{z} [AVX512DQ,AVX512VL]
  37839. // * VCVTPS2QQ xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  37840. // * VCVTPS2QQ xmm, ymm{k}{z} [AVX512DQ,AVX512VL]
  37841. //
  37842. func (self *Program) VCVTPS2QQ(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  37843. var p *Instruction
  37844. switch len(vv) {
  37845. case 0 : p = self.alloc("VCVTPS2QQ", 2, Operands { v0, v1 })
  37846. case 1 : p = self.alloc("VCVTPS2QQ", 3, Operands { v0, v1, vv[0] })
  37847. default : panic("instruction VCVTPS2QQ takes 2 or 3 operands")
  37848. }
  37849. // VCVTPS2QQ m256/m32bcst, zmm{k}{z}
  37850. if len(vv) == 0 && isM256M32bcst(v0) && isZMMkz(v1) {
  37851. self.require(ISA_AVX512DQ)
  37852. p.domain = DomainAVX
  37853. p.add(0, func(m *_Encoding, v []interface{}) {
  37854. m.evex(0b01, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  37855. m.emit(0x7b)
  37856. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  37857. })
  37858. }
  37859. // VCVTPS2QQ {er}, ymm, zmm{k}{z}
  37860. if len(vv) == 1 && isER(v0) && isEVEXYMM(v1) && isZMMkz(vv[0]) {
  37861. self.require(ISA_AVX512DQ)
  37862. p.domain = DomainAVX
  37863. p.add(0, func(m *_Encoding, v []interface{}) {
  37864. m.emit(0x62)
  37865. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  37866. m.emit(0x7d)
  37867. m.emit((zcode(v[2]) << 7) | (vcode(v[0]) << 5) | kcode(v[2]) | 0x18)
  37868. m.emit(0x7b)
  37869. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  37870. })
  37871. }
  37872. // VCVTPS2QQ ymm, zmm{k}{z}
  37873. if len(vv) == 0 && isEVEXYMM(v0) && isZMMkz(v1) {
  37874. self.require(ISA_AVX512DQ)
  37875. p.domain = DomainAVX
  37876. p.add(0, func(m *_Encoding, v []interface{}) {
  37877. m.emit(0x62)
  37878. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  37879. m.emit(0x7d)
  37880. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  37881. m.emit(0x7b)
  37882. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37883. })
  37884. }
  37885. // VCVTPS2QQ m64/m32bcst, xmm{k}{z}
  37886. if len(vv) == 0 && isM64M32bcst(v0) && isXMMkz(v1) {
  37887. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  37888. p.domain = DomainAVX
  37889. p.add(0, func(m *_Encoding, v []interface{}) {
  37890. m.evex(0b01, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  37891. m.emit(0x7b)
  37892. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  37893. })
  37894. }
  37895. // VCVTPS2QQ m128/m32bcst, ymm{k}{z}
  37896. if len(vv) == 0 && isM128M32bcst(v0) && isYMMkz(v1) {
  37897. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  37898. p.domain = DomainAVX
  37899. p.add(0, func(m *_Encoding, v []interface{}) {
  37900. m.evex(0b01, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  37901. m.emit(0x7b)
  37902. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  37903. })
  37904. }
  37905. // VCVTPS2QQ xmm, xmm{k}{z}
  37906. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  37907. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  37908. p.domain = DomainAVX
  37909. p.add(0, func(m *_Encoding, v []interface{}) {
  37910. m.emit(0x62)
  37911. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  37912. m.emit(0x7d)
  37913. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  37914. m.emit(0x7b)
  37915. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37916. })
  37917. }
  37918. // VCVTPS2QQ xmm, ymm{k}{z}
  37919. if len(vv) == 0 && isEVEXXMM(v0) && isYMMkz(v1) {
  37920. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  37921. p.domain = DomainAVX
  37922. p.add(0, func(m *_Encoding, v []interface{}) {
  37923. m.emit(0x62)
  37924. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  37925. m.emit(0x7d)
  37926. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  37927. m.emit(0x7b)
  37928. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37929. })
  37930. }
  37931. if p.len == 0 {
  37932. panic("invalid operands for VCVTPS2QQ")
  37933. }
  37934. return p
  37935. }
  37936. // VCVTPS2UDQ performs "Convert Packed Single-Precision Floating-Point Values to Packed Unsigned Doubleword Integer Values".
  37937. //
  37938. // Mnemonic : VCVTPS2UDQ
  37939. // Supported forms : (7 forms)
  37940. //
  37941. // * VCVTPS2UDQ m512/m32bcst, zmm{k}{z} [AVX512F]
  37942. // * VCVTPS2UDQ {er}, zmm, zmm{k}{z} [AVX512F]
  37943. // * VCVTPS2UDQ zmm, zmm{k}{z} [AVX512F]
  37944. // * VCVTPS2UDQ m128/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  37945. // * VCVTPS2UDQ m256/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  37946. // * VCVTPS2UDQ xmm, xmm{k}{z} [AVX512F,AVX512VL]
  37947. // * VCVTPS2UDQ ymm, ymm{k}{z} [AVX512F,AVX512VL]
  37948. //
  37949. func (self *Program) VCVTPS2UDQ(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  37950. var p *Instruction
  37951. switch len(vv) {
  37952. case 0 : p = self.alloc("VCVTPS2UDQ", 2, Operands { v0, v1 })
  37953. case 1 : p = self.alloc("VCVTPS2UDQ", 3, Operands { v0, v1, vv[0] })
  37954. default : panic("instruction VCVTPS2UDQ takes 2 or 3 operands")
  37955. }
  37956. // VCVTPS2UDQ m512/m32bcst, zmm{k}{z}
  37957. if len(vv) == 0 && isM512M32bcst(v0) && isZMMkz(v1) {
  37958. self.require(ISA_AVX512F)
  37959. p.domain = DomainAVX
  37960. p.add(0, func(m *_Encoding, v []interface{}) {
  37961. m.evex(0b01, 0x04, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  37962. m.emit(0x79)
  37963. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  37964. })
  37965. }
  37966. // VCVTPS2UDQ {er}, zmm, zmm{k}{z}
  37967. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMMkz(vv[0]) {
  37968. self.require(ISA_AVX512F)
  37969. p.domain = DomainAVX
  37970. p.add(0, func(m *_Encoding, v []interface{}) {
  37971. m.emit(0x62)
  37972. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  37973. m.emit(0x7c)
  37974. m.emit((zcode(v[2]) << 7) | (vcode(v[0]) << 5) | kcode(v[2]) | 0x18)
  37975. m.emit(0x79)
  37976. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  37977. })
  37978. }
  37979. // VCVTPS2UDQ zmm, zmm{k}{z}
  37980. if len(vv) == 0 && isZMM(v0) && isZMMkz(v1) {
  37981. self.require(ISA_AVX512F)
  37982. p.domain = DomainAVX
  37983. p.add(0, func(m *_Encoding, v []interface{}) {
  37984. m.emit(0x62)
  37985. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  37986. m.emit(0x7c)
  37987. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  37988. m.emit(0x79)
  37989. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  37990. })
  37991. }
  37992. // VCVTPS2UDQ m128/m32bcst, xmm{k}{z}
  37993. if len(vv) == 0 && isM128M32bcst(v0) && isXMMkz(v1) {
  37994. self.require(ISA_AVX512VL | ISA_AVX512F)
  37995. p.domain = DomainAVX
  37996. p.add(0, func(m *_Encoding, v []interface{}) {
  37997. m.evex(0b01, 0x04, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  37998. m.emit(0x79)
  37999. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  38000. })
  38001. }
  38002. // VCVTPS2UDQ m256/m32bcst, ymm{k}{z}
  38003. if len(vv) == 0 && isM256M32bcst(v0) && isYMMkz(v1) {
  38004. self.require(ISA_AVX512VL | ISA_AVX512F)
  38005. p.domain = DomainAVX
  38006. p.add(0, func(m *_Encoding, v []interface{}) {
  38007. m.evex(0b01, 0x04, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  38008. m.emit(0x79)
  38009. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  38010. })
  38011. }
  38012. // VCVTPS2UDQ xmm, xmm{k}{z}
  38013. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  38014. self.require(ISA_AVX512VL | ISA_AVX512F)
  38015. p.domain = DomainAVX
  38016. p.add(0, func(m *_Encoding, v []interface{}) {
  38017. m.emit(0x62)
  38018. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  38019. m.emit(0x7c)
  38020. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  38021. m.emit(0x79)
  38022. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  38023. })
  38024. }
  38025. // VCVTPS2UDQ ymm, ymm{k}{z}
  38026. if len(vv) == 0 && isEVEXYMM(v0) && isYMMkz(v1) {
  38027. self.require(ISA_AVX512VL | ISA_AVX512F)
  38028. p.domain = DomainAVX
  38029. p.add(0, func(m *_Encoding, v []interface{}) {
  38030. m.emit(0x62)
  38031. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  38032. m.emit(0x7c)
  38033. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  38034. m.emit(0x79)
  38035. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  38036. })
  38037. }
  38038. if p.len == 0 {
  38039. panic("invalid operands for VCVTPS2UDQ")
  38040. }
  38041. return p
  38042. }
  38043. // VCVTPS2UQQ performs "Convert Packed Single Precision Floating-Point Values to Packed Unsigned Quadword Integer Values".
  38044. //
  38045. // Mnemonic : VCVTPS2UQQ
  38046. // Supported forms : (7 forms)
  38047. //
  38048. // * VCVTPS2UQQ m256/m32bcst, zmm{k}{z} [AVX512DQ]
  38049. // * VCVTPS2UQQ {er}, ymm, zmm{k}{z} [AVX512DQ]
  38050. // * VCVTPS2UQQ ymm, zmm{k}{z} [AVX512DQ]
  38051. // * VCVTPS2UQQ m64/m32bcst, xmm{k}{z} [AVX512DQ,AVX512VL]
  38052. // * VCVTPS2UQQ m128/m32bcst, ymm{k}{z} [AVX512DQ,AVX512VL]
  38053. // * VCVTPS2UQQ xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  38054. // * VCVTPS2UQQ xmm, ymm{k}{z} [AVX512DQ,AVX512VL]
  38055. //
  38056. func (self *Program) VCVTPS2UQQ(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  38057. var p *Instruction
  38058. switch len(vv) {
  38059. case 0 : p = self.alloc("VCVTPS2UQQ", 2, Operands { v0, v1 })
  38060. case 1 : p = self.alloc("VCVTPS2UQQ", 3, Operands { v0, v1, vv[0] })
  38061. default : panic("instruction VCVTPS2UQQ takes 2 or 3 operands")
  38062. }
  38063. // VCVTPS2UQQ m256/m32bcst, zmm{k}{z}
  38064. if len(vv) == 0 && isM256M32bcst(v0) && isZMMkz(v1) {
  38065. self.require(ISA_AVX512DQ)
  38066. p.domain = DomainAVX
  38067. p.add(0, func(m *_Encoding, v []interface{}) {
  38068. m.evex(0b01, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  38069. m.emit(0x79)
  38070. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  38071. })
  38072. }
  38073. // VCVTPS2UQQ {er}, ymm, zmm{k}{z}
  38074. if len(vv) == 1 && isER(v0) && isEVEXYMM(v1) && isZMMkz(vv[0]) {
  38075. self.require(ISA_AVX512DQ)
  38076. p.domain = DomainAVX
  38077. p.add(0, func(m *_Encoding, v []interface{}) {
  38078. m.emit(0x62)
  38079. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  38080. m.emit(0x7d)
  38081. m.emit((zcode(v[2]) << 7) | (vcode(v[0]) << 5) | kcode(v[2]) | 0x18)
  38082. m.emit(0x79)
  38083. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  38084. })
  38085. }
  38086. // VCVTPS2UQQ ymm, zmm{k}{z}
  38087. if len(vv) == 0 && isEVEXYMM(v0) && isZMMkz(v1) {
  38088. self.require(ISA_AVX512DQ)
  38089. p.domain = DomainAVX
  38090. p.add(0, func(m *_Encoding, v []interface{}) {
  38091. m.emit(0x62)
  38092. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  38093. m.emit(0x7d)
  38094. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  38095. m.emit(0x79)
  38096. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  38097. })
  38098. }
  38099. // VCVTPS2UQQ m64/m32bcst, xmm{k}{z}
  38100. if len(vv) == 0 && isM64M32bcst(v0) && isXMMkz(v1) {
  38101. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  38102. p.domain = DomainAVX
  38103. p.add(0, func(m *_Encoding, v []interface{}) {
  38104. m.evex(0b01, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  38105. m.emit(0x79)
  38106. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  38107. })
  38108. }
  38109. // VCVTPS2UQQ m128/m32bcst, ymm{k}{z}
  38110. if len(vv) == 0 && isM128M32bcst(v0) && isYMMkz(v1) {
  38111. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  38112. p.domain = DomainAVX
  38113. p.add(0, func(m *_Encoding, v []interface{}) {
  38114. m.evex(0b01, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  38115. m.emit(0x79)
  38116. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  38117. })
  38118. }
  38119. // VCVTPS2UQQ xmm, xmm{k}{z}
  38120. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  38121. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  38122. p.domain = DomainAVX
  38123. p.add(0, func(m *_Encoding, v []interface{}) {
  38124. m.emit(0x62)
  38125. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  38126. m.emit(0x7d)
  38127. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  38128. m.emit(0x79)
  38129. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  38130. })
  38131. }
  38132. // VCVTPS2UQQ xmm, ymm{k}{z}
  38133. if len(vv) == 0 && isEVEXXMM(v0) && isYMMkz(v1) {
  38134. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  38135. p.domain = DomainAVX
  38136. p.add(0, func(m *_Encoding, v []interface{}) {
  38137. m.emit(0x62)
  38138. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  38139. m.emit(0x7d)
  38140. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  38141. m.emit(0x79)
  38142. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  38143. })
  38144. }
  38145. if p.len == 0 {
  38146. panic("invalid operands for VCVTPS2UQQ")
  38147. }
  38148. return p
  38149. }
  38150. // VCVTQQ2PD performs "Convert Packed Quadword Integers to Packed Double-Precision Floating-Point Values".
  38151. //
  38152. // Mnemonic : VCVTQQ2PD
  38153. // Supported forms : (7 forms)
  38154. //
  38155. // * VCVTQQ2PD m512/m64bcst, zmm{k}{z} [AVX512DQ]
  38156. // * VCVTQQ2PD {er}, zmm, zmm{k}{z} [AVX512DQ]
  38157. // * VCVTQQ2PD zmm, zmm{k}{z} [AVX512DQ]
  38158. // * VCVTQQ2PD m128/m64bcst, xmm{k}{z} [AVX512DQ,AVX512VL]
  38159. // * VCVTQQ2PD m256/m64bcst, ymm{k}{z} [AVX512DQ,AVX512VL]
  38160. // * VCVTQQ2PD xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  38161. // * VCVTQQ2PD ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  38162. //
  38163. func (self *Program) VCVTQQ2PD(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  38164. var p *Instruction
  38165. switch len(vv) {
  38166. case 0 : p = self.alloc("VCVTQQ2PD", 2, Operands { v0, v1 })
  38167. case 1 : p = self.alloc("VCVTQQ2PD", 3, Operands { v0, v1, vv[0] })
  38168. default : panic("instruction VCVTQQ2PD takes 2 or 3 operands")
  38169. }
  38170. // VCVTQQ2PD m512/m64bcst, zmm{k}{z}
  38171. if len(vv) == 0 && isM512M64bcst(v0) && isZMMkz(v1) {
  38172. self.require(ISA_AVX512DQ)
  38173. p.domain = DomainAVX
  38174. p.add(0, func(m *_Encoding, v []interface{}) {
  38175. m.evex(0b01, 0x86, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  38176. m.emit(0xe6)
  38177. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  38178. })
  38179. }
  38180. // VCVTQQ2PD {er}, zmm, zmm{k}{z}
  38181. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMMkz(vv[0]) {
  38182. self.require(ISA_AVX512DQ)
  38183. p.domain = DomainAVX
  38184. p.add(0, func(m *_Encoding, v []interface{}) {
  38185. m.emit(0x62)
  38186. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  38187. m.emit(0xfe)
  38188. m.emit((zcode(v[2]) << 7) | (vcode(v[0]) << 5) | kcode(v[2]) | 0x18)
  38189. m.emit(0xe6)
  38190. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  38191. })
  38192. }
  38193. // VCVTQQ2PD zmm, zmm{k}{z}
  38194. if len(vv) == 0 && isZMM(v0) && isZMMkz(v1) {
  38195. self.require(ISA_AVX512DQ)
  38196. p.domain = DomainAVX
  38197. p.add(0, func(m *_Encoding, v []interface{}) {
  38198. m.emit(0x62)
  38199. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  38200. m.emit(0xfe)
  38201. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  38202. m.emit(0xe6)
  38203. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  38204. })
  38205. }
  38206. // VCVTQQ2PD m128/m64bcst, xmm{k}{z}
  38207. if len(vv) == 0 && isM128M64bcst(v0) && isXMMkz(v1) {
  38208. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  38209. p.domain = DomainAVX
  38210. p.add(0, func(m *_Encoding, v []interface{}) {
  38211. m.evex(0b01, 0x86, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  38212. m.emit(0xe6)
  38213. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  38214. })
  38215. }
  38216. // VCVTQQ2PD m256/m64bcst, ymm{k}{z}
  38217. if len(vv) == 0 && isM256M64bcst(v0) && isYMMkz(v1) {
  38218. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  38219. p.domain = DomainAVX
  38220. p.add(0, func(m *_Encoding, v []interface{}) {
  38221. m.evex(0b01, 0x86, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  38222. m.emit(0xe6)
  38223. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  38224. })
  38225. }
  38226. // VCVTQQ2PD xmm, xmm{k}{z}
  38227. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  38228. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  38229. p.domain = DomainAVX
  38230. p.add(0, func(m *_Encoding, v []interface{}) {
  38231. m.emit(0x62)
  38232. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  38233. m.emit(0xfe)
  38234. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  38235. m.emit(0xe6)
  38236. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  38237. })
  38238. }
  38239. // VCVTQQ2PD ymm, ymm{k}{z}
  38240. if len(vv) == 0 && isEVEXYMM(v0) && isYMMkz(v1) {
  38241. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  38242. p.domain = DomainAVX
  38243. p.add(0, func(m *_Encoding, v []interface{}) {
  38244. m.emit(0x62)
  38245. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  38246. m.emit(0xfe)
  38247. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  38248. m.emit(0xe6)
  38249. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  38250. })
  38251. }
  38252. if p.len == 0 {
  38253. panic("invalid operands for VCVTQQ2PD")
  38254. }
  38255. return p
  38256. }
  38257. // VCVTQQ2PS performs "Convert Packed Quadword Integers to Packed Single-Precision Floating-Point Values".
  38258. //
  38259. // Mnemonic : VCVTQQ2PS
  38260. // Supported forms : (7 forms)
  38261. //
  38262. // * VCVTQQ2PS m512/m64bcst, ymm{k}{z} [AVX512DQ]
  38263. // * VCVTQQ2PS {er}, zmm, ymm{k}{z} [AVX512DQ]
  38264. // * VCVTQQ2PS zmm, ymm{k}{z} [AVX512DQ]
  38265. // * VCVTQQ2PS m128/m64bcst, xmm{k}{z} [AVX512DQ,AVX512VL]
  38266. // * VCVTQQ2PS m256/m64bcst, xmm{k}{z} [AVX512DQ,AVX512VL]
  38267. // * VCVTQQ2PS xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  38268. // * VCVTQQ2PS ymm, xmm{k}{z} [AVX512DQ,AVX512VL]
  38269. //
  38270. func (self *Program) VCVTQQ2PS(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  38271. var p *Instruction
  38272. switch len(vv) {
  38273. case 0 : p = self.alloc("VCVTQQ2PS", 2, Operands { v0, v1 })
  38274. case 1 : p = self.alloc("VCVTQQ2PS", 3, Operands { v0, v1, vv[0] })
  38275. default : panic("instruction VCVTQQ2PS takes 2 or 3 operands")
  38276. }
  38277. // VCVTQQ2PS m512/m64bcst, ymm{k}{z}
  38278. if len(vv) == 0 && isM512M64bcst(v0) && isYMMkz(v1) {
  38279. self.require(ISA_AVX512DQ)
  38280. p.domain = DomainAVX
  38281. p.add(0, func(m *_Encoding, v []interface{}) {
  38282. m.evex(0b01, 0x84, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  38283. m.emit(0x5b)
  38284. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  38285. })
  38286. }
  38287. // VCVTQQ2PS {er}, zmm, ymm{k}{z}
  38288. if len(vv) == 1 && isER(v0) && isZMM(v1) && isYMMkz(vv[0]) {
  38289. self.require(ISA_AVX512DQ)
  38290. p.domain = DomainAVX
  38291. p.add(0, func(m *_Encoding, v []interface{}) {
  38292. m.emit(0x62)
  38293. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  38294. m.emit(0xfc)
  38295. m.emit((zcode(v[2]) << 7) | (vcode(v[0]) << 5) | kcode(v[2]) | 0x18)
  38296. m.emit(0x5b)
  38297. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  38298. })
  38299. }
  38300. // VCVTQQ2PS zmm, ymm{k}{z}
  38301. if len(vv) == 0 && isZMM(v0) && isYMMkz(v1) {
  38302. self.require(ISA_AVX512DQ)
  38303. p.domain = DomainAVX
  38304. p.add(0, func(m *_Encoding, v []interface{}) {
  38305. m.emit(0x62)
  38306. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  38307. m.emit(0xfc)
  38308. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  38309. m.emit(0x5b)
  38310. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  38311. })
  38312. }
  38313. // VCVTQQ2PS m128/m64bcst, xmm{k}{z}
  38314. if len(vv) == 0 && isM128M64bcst(v0) && isXMMkz(v1) {
  38315. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  38316. p.domain = DomainAVX
  38317. p.add(0, func(m *_Encoding, v []interface{}) {
  38318. m.evex(0b01, 0x84, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  38319. m.emit(0x5b)
  38320. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  38321. })
  38322. }
  38323. // VCVTQQ2PS m256/m64bcst, xmm{k}{z}
  38324. if len(vv) == 0 && isM256M64bcst(v0) && isXMMkz(v1) {
  38325. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  38326. p.domain = DomainAVX
  38327. p.add(0, func(m *_Encoding, v []interface{}) {
  38328. m.evex(0b01, 0x84, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  38329. m.emit(0x5b)
  38330. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  38331. })
  38332. }
  38333. // VCVTQQ2PS xmm, xmm{k}{z}
  38334. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  38335. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  38336. p.domain = DomainAVX
  38337. p.add(0, func(m *_Encoding, v []interface{}) {
  38338. m.emit(0x62)
  38339. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  38340. m.emit(0xfc)
  38341. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  38342. m.emit(0x5b)
  38343. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  38344. })
  38345. }
  38346. // VCVTQQ2PS ymm, xmm{k}{z}
  38347. if len(vv) == 0 && isEVEXYMM(v0) && isXMMkz(v1) {
  38348. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  38349. p.domain = DomainAVX
  38350. p.add(0, func(m *_Encoding, v []interface{}) {
  38351. m.emit(0x62)
  38352. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  38353. m.emit(0xfc)
  38354. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  38355. m.emit(0x5b)
  38356. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  38357. })
  38358. }
  38359. if p.len == 0 {
  38360. panic("invalid operands for VCVTQQ2PS")
  38361. }
  38362. return p
  38363. }
  38364. // VCVTSD2SI performs "Convert Scalar Double-Precision FP Value to Integer".
  38365. //
  38366. // Mnemonic : VCVTSD2SI
  38367. // Supported forms : (10 forms)
  38368. //
  38369. // * VCVTSD2SI xmm, r32 [AVX]
  38370. // * VCVTSD2SI m64, r32 [AVX]
  38371. // * VCVTSD2SI xmm, r64 [AVX]
  38372. // * VCVTSD2SI m64, r64 [AVX]
  38373. // * VCVTSD2SI m64, r32 [AVX512F]
  38374. // * VCVTSD2SI m64, r64 [AVX512F]
  38375. // * VCVTSD2SI {er}, xmm, r32 [AVX512F]
  38376. // * VCVTSD2SI {er}, xmm, r64 [AVX512F]
  38377. // * VCVTSD2SI xmm, r32 [AVX512F]
  38378. // * VCVTSD2SI xmm, r64 [AVX512F]
  38379. //
  38380. func (self *Program) VCVTSD2SI(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  38381. var p *Instruction
  38382. switch len(vv) {
  38383. case 0 : p = self.alloc("VCVTSD2SI", 2, Operands { v0, v1 })
  38384. case 1 : p = self.alloc("VCVTSD2SI", 3, Operands { v0, v1, vv[0] })
  38385. default : panic("instruction VCVTSD2SI takes 2 or 3 operands")
  38386. }
  38387. // VCVTSD2SI xmm, r32
  38388. if len(vv) == 0 && isXMM(v0) && isReg32(v1) {
  38389. self.require(ISA_AVX)
  38390. p.domain = DomainAVX
  38391. p.add(0, func(m *_Encoding, v []interface{}) {
  38392. m.vex2(3, hcode(v[1]), v[0], 0)
  38393. m.emit(0x2d)
  38394. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  38395. })
  38396. }
  38397. // VCVTSD2SI m64, r32
  38398. if len(vv) == 0 && isM64(v0) && isReg32(v1) {
  38399. self.require(ISA_AVX)
  38400. p.domain = DomainAVX
  38401. p.add(0, func(m *_Encoding, v []interface{}) {
  38402. m.vex2(3, hcode(v[1]), addr(v[0]), 0)
  38403. m.emit(0x2d)
  38404. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  38405. })
  38406. }
  38407. // VCVTSD2SI xmm, r64
  38408. if len(vv) == 0 && isXMM(v0) && isReg64(v1) {
  38409. self.require(ISA_AVX)
  38410. p.domain = DomainAVX
  38411. p.add(0, func(m *_Encoding, v []interface{}) {
  38412. m.emit(0xc4)
  38413. m.emit(0xe1 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  38414. m.emit(0xfb)
  38415. m.emit(0x2d)
  38416. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  38417. })
  38418. }
  38419. // VCVTSD2SI m64, r64
  38420. if len(vv) == 0 && isM64(v0) && isReg64(v1) {
  38421. self.require(ISA_AVX)
  38422. p.domain = DomainAVX
  38423. p.add(0, func(m *_Encoding, v []interface{}) {
  38424. m.vex3(0xc4, 0b1, 0x83, hcode(v[1]), addr(v[0]), 0)
  38425. m.emit(0x2d)
  38426. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  38427. })
  38428. }
  38429. // VCVTSD2SI m64, r32
  38430. if len(vv) == 0 && isM64(v0) && isReg32(v1) {
  38431. self.require(ISA_AVX512F)
  38432. p.domain = DomainAVX
  38433. p.add(0, func(m *_Encoding, v []interface{}) {
  38434. m.evex(0b01, 0x07, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  38435. m.emit(0x2d)
  38436. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  38437. })
  38438. }
  38439. // VCVTSD2SI m64, r64
  38440. if len(vv) == 0 && isM64(v0) && isReg64(v1) {
  38441. self.require(ISA_AVX512F)
  38442. p.domain = DomainAVX
  38443. p.add(0, func(m *_Encoding, v []interface{}) {
  38444. m.evex(0b01, 0x87, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  38445. m.emit(0x2d)
  38446. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  38447. })
  38448. }
  38449. // VCVTSD2SI {er}, xmm, r32
  38450. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isReg32(vv[0]) {
  38451. self.require(ISA_AVX512F)
  38452. p.domain = DomainAVX
  38453. p.add(0, func(m *_Encoding, v []interface{}) {
  38454. m.emit(0x62)
  38455. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  38456. m.emit(0x7f)
  38457. m.emit((vcode(v[0]) << 5) | 0x18)
  38458. m.emit(0x2d)
  38459. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  38460. })
  38461. }
  38462. // VCVTSD2SI {er}, xmm, r64
  38463. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isReg64(vv[0]) {
  38464. self.require(ISA_AVX512F)
  38465. p.domain = DomainAVX
  38466. p.add(0, func(m *_Encoding, v []interface{}) {
  38467. m.emit(0x62)
  38468. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  38469. m.emit(0xff)
  38470. m.emit((vcode(v[0]) << 5) | 0x18)
  38471. m.emit(0x2d)
  38472. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  38473. })
  38474. }
  38475. // VCVTSD2SI xmm, r32
  38476. if len(vv) == 0 && isEVEXXMM(v0) && isReg32(v1) {
  38477. self.require(ISA_AVX512F)
  38478. p.domain = DomainAVX
  38479. p.add(0, func(m *_Encoding, v []interface{}) {
  38480. m.emit(0x62)
  38481. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  38482. m.emit(0x7f)
  38483. m.emit(0x48)
  38484. m.emit(0x2d)
  38485. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  38486. })
  38487. }
  38488. // VCVTSD2SI xmm, r64
  38489. if len(vv) == 0 && isEVEXXMM(v0) && isReg64(v1) {
  38490. self.require(ISA_AVX512F)
  38491. p.domain = DomainAVX
  38492. p.add(0, func(m *_Encoding, v []interface{}) {
  38493. m.emit(0x62)
  38494. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  38495. m.emit(0xff)
  38496. m.emit(0x48)
  38497. m.emit(0x2d)
  38498. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  38499. })
  38500. }
  38501. if p.len == 0 {
  38502. panic("invalid operands for VCVTSD2SI")
  38503. }
  38504. return p
  38505. }
  38506. // VCVTSD2SS performs "Convert Scalar Double-Precision FP Value to Scalar Single-Precision FP Value".
  38507. //
  38508. // Mnemonic : VCVTSD2SS
  38509. // Supported forms : (5 forms)
  38510. //
  38511. // * VCVTSD2SS xmm, xmm, xmm [AVX]
  38512. // * VCVTSD2SS m64, xmm, xmm [AVX]
  38513. // * VCVTSD2SS m64, xmm, xmm{k}{z} [AVX512F]
  38514. // * VCVTSD2SS {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  38515. // * VCVTSD2SS xmm, xmm, xmm{k}{z} [AVX512F]
  38516. //
  38517. func (self *Program) VCVTSD2SS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  38518. var p *Instruction
  38519. switch len(vv) {
  38520. case 0 : p = self.alloc("VCVTSD2SS", 3, Operands { v0, v1, v2 })
  38521. case 1 : p = self.alloc("VCVTSD2SS", 4, Operands { v0, v1, v2, vv[0] })
  38522. default : panic("instruction VCVTSD2SS takes 3 or 4 operands")
  38523. }
  38524. // VCVTSD2SS xmm, xmm, xmm
  38525. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  38526. self.require(ISA_AVX)
  38527. p.domain = DomainAVX
  38528. p.add(0, func(m *_Encoding, v []interface{}) {
  38529. m.vex2(3, hcode(v[2]), v[0], hlcode(v[1]))
  38530. m.emit(0x5a)
  38531. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  38532. })
  38533. }
  38534. // VCVTSD2SS m64, xmm, xmm
  38535. if len(vv) == 0 && isM64(v0) && isXMM(v1) && isXMM(v2) {
  38536. self.require(ISA_AVX)
  38537. p.domain = DomainAVX
  38538. p.add(0, func(m *_Encoding, v []interface{}) {
  38539. m.vex2(3, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  38540. m.emit(0x5a)
  38541. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  38542. })
  38543. }
  38544. // VCVTSD2SS m64, xmm, xmm{k}{z}
  38545. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  38546. self.require(ISA_AVX512F)
  38547. p.domain = DomainAVX
  38548. p.add(0, func(m *_Encoding, v []interface{}) {
  38549. m.evex(0b01, 0x87, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  38550. m.emit(0x5a)
  38551. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  38552. })
  38553. }
  38554. // VCVTSD2SS {er}, xmm, xmm, xmm{k}{z}
  38555. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  38556. self.require(ISA_AVX512F)
  38557. p.domain = DomainAVX
  38558. p.add(0, func(m *_Encoding, v []interface{}) {
  38559. m.emit(0x62)
  38560. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  38561. m.emit(0xff ^ (hlcode(v[2]) << 3))
  38562. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  38563. m.emit(0x5a)
  38564. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  38565. })
  38566. }
  38567. // VCVTSD2SS xmm, xmm, xmm{k}{z}
  38568. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  38569. self.require(ISA_AVX512F)
  38570. p.domain = DomainAVX
  38571. p.add(0, func(m *_Encoding, v []interface{}) {
  38572. m.emit(0x62)
  38573. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  38574. m.emit(0xff ^ (hlcode(v[1]) << 3))
  38575. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  38576. m.emit(0x5a)
  38577. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  38578. })
  38579. }
  38580. if p.len == 0 {
  38581. panic("invalid operands for VCVTSD2SS")
  38582. }
  38583. return p
  38584. }
  38585. // VCVTSD2USI performs "Convert Scalar Double-Precision Floating-Point Value to Unsigned Doubleword Integer".
  38586. //
  38587. // Mnemonic : VCVTSD2USI
  38588. // Supported forms : (6 forms)
  38589. //
  38590. // * VCVTSD2USI m64, r32 [AVX512F]
  38591. // * VCVTSD2USI m64, r64 [AVX512F]
  38592. // * VCVTSD2USI {er}, xmm, r32 [AVX512F]
  38593. // * VCVTSD2USI {er}, xmm, r64 [AVX512F]
  38594. // * VCVTSD2USI xmm, r32 [AVX512F]
  38595. // * VCVTSD2USI xmm, r64 [AVX512F]
  38596. //
  38597. func (self *Program) VCVTSD2USI(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  38598. var p *Instruction
  38599. switch len(vv) {
  38600. case 0 : p = self.alloc("VCVTSD2USI", 2, Operands { v0, v1 })
  38601. case 1 : p = self.alloc("VCVTSD2USI", 3, Operands { v0, v1, vv[0] })
  38602. default : panic("instruction VCVTSD2USI takes 2 or 3 operands")
  38603. }
  38604. // VCVTSD2USI m64, r32
  38605. if len(vv) == 0 && isM64(v0) && isReg32(v1) {
  38606. self.require(ISA_AVX512F)
  38607. p.domain = DomainAVX
  38608. p.add(0, func(m *_Encoding, v []interface{}) {
  38609. m.evex(0b01, 0x07, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  38610. m.emit(0x79)
  38611. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  38612. })
  38613. }
  38614. // VCVTSD2USI m64, r64
  38615. if len(vv) == 0 && isM64(v0) && isReg64(v1) {
  38616. self.require(ISA_AVX512F)
  38617. p.domain = DomainAVX
  38618. p.add(0, func(m *_Encoding, v []interface{}) {
  38619. m.evex(0b01, 0x87, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  38620. m.emit(0x79)
  38621. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  38622. })
  38623. }
  38624. // VCVTSD2USI {er}, xmm, r32
  38625. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isReg32(vv[0]) {
  38626. self.require(ISA_AVX512F)
  38627. p.domain = DomainAVX
  38628. p.add(0, func(m *_Encoding, v []interface{}) {
  38629. m.emit(0x62)
  38630. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  38631. m.emit(0x7f)
  38632. m.emit((vcode(v[0]) << 5) | 0x18)
  38633. m.emit(0x79)
  38634. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  38635. })
  38636. }
  38637. // VCVTSD2USI {er}, xmm, r64
  38638. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isReg64(vv[0]) {
  38639. self.require(ISA_AVX512F)
  38640. p.domain = DomainAVX
  38641. p.add(0, func(m *_Encoding, v []interface{}) {
  38642. m.emit(0x62)
  38643. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  38644. m.emit(0xff)
  38645. m.emit((vcode(v[0]) << 5) | 0x18)
  38646. m.emit(0x79)
  38647. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  38648. })
  38649. }
  38650. // VCVTSD2USI xmm, r32
  38651. if len(vv) == 0 && isEVEXXMM(v0) && isReg32(v1) {
  38652. self.require(ISA_AVX512F)
  38653. p.domain = DomainAVX
  38654. p.add(0, func(m *_Encoding, v []interface{}) {
  38655. m.emit(0x62)
  38656. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  38657. m.emit(0x7f)
  38658. m.emit(0x48)
  38659. m.emit(0x79)
  38660. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  38661. })
  38662. }
  38663. // VCVTSD2USI xmm, r64
  38664. if len(vv) == 0 && isEVEXXMM(v0) && isReg64(v1) {
  38665. self.require(ISA_AVX512F)
  38666. p.domain = DomainAVX
  38667. p.add(0, func(m *_Encoding, v []interface{}) {
  38668. m.emit(0x62)
  38669. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  38670. m.emit(0xff)
  38671. m.emit(0x48)
  38672. m.emit(0x79)
  38673. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  38674. })
  38675. }
  38676. if p.len == 0 {
  38677. panic("invalid operands for VCVTSD2USI")
  38678. }
  38679. return p
  38680. }
  38681. // VCVTSI2SD performs "Convert Dword Integer to Scalar Double-Precision FP Value".
  38682. //
  38683. // Mnemonic : VCVTSI2SD
  38684. // Supported forms : (9 forms)
  38685. //
  38686. // * VCVTSI2SD r32, xmm, xmm [AVX]
  38687. // * VCVTSI2SD r64, xmm, xmm [AVX]
  38688. // * VCVTSI2SD m32, xmm, xmm [AVX]
  38689. // * VCVTSI2SD m64, xmm, xmm [AVX]
  38690. // * VCVTSI2SD r32, xmm, xmm [AVX512F]
  38691. // * VCVTSI2SD m32, xmm, xmm [AVX512F]
  38692. // * VCVTSI2SD m64, xmm, xmm [AVX512F]
  38693. // * VCVTSI2SD {er}, r64, xmm, xmm [AVX512F]
  38694. // * VCVTSI2SD r64, xmm, xmm [AVX512F]
  38695. //
  38696. func (self *Program) VCVTSI2SD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  38697. var p *Instruction
  38698. switch len(vv) {
  38699. case 0 : p = self.alloc("VCVTSI2SD", 3, Operands { v0, v1, v2 })
  38700. case 1 : p = self.alloc("VCVTSI2SD", 4, Operands { v0, v1, v2, vv[0] })
  38701. default : panic("instruction VCVTSI2SD takes 3 or 4 operands")
  38702. }
  38703. // VCVTSI2SD r32, xmm, xmm
  38704. if len(vv) == 0 && isReg32(v0) && isXMM(v1) && isXMM(v2) {
  38705. self.require(ISA_AVX)
  38706. p.domain = DomainAVX
  38707. p.add(0, func(m *_Encoding, v []interface{}) {
  38708. m.vex2(3, hcode(v[2]), v[0], hlcode(v[1]))
  38709. m.emit(0x2a)
  38710. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  38711. })
  38712. }
  38713. // VCVTSI2SD r64, xmm, xmm
  38714. if len(vv) == 0 && isReg64(v0) && isXMM(v1) && isXMM(v2) {
  38715. self.require(ISA_AVX)
  38716. p.domain = DomainAVX
  38717. p.add(0, func(m *_Encoding, v []interface{}) {
  38718. m.emit(0xc4)
  38719. m.emit(0xe1 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  38720. m.emit(0xfb ^ (hlcode(v[1]) << 3))
  38721. m.emit(0x2a)
  38722. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  38723. })
  38724. }
  38725. // VCVTSI2SD m32, xmm, xmm
  38726. if len(vv) == 0 && isM32(v0) && isXMM(v1) && isXMM(v2) {
  38727. self.require(ISA_AVX)
  38728. p.domain = DomainAVX
  38729. p.add(0, func(m *_Encoding, v []interface{}) {
  38730. m.vex2(3, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  38731. m.emit(0x2a)
  38732. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  38733. })
  38734. }
  38735. // VCVTSI2SD m64, xmm, xmm
  38736. if len(vv) == 0 && isM64(v0) && isXMM(v1) && isXMM(v2) {
  38737. self.require(ISA_AVX)
  38738. p.domain = DomainAVX
  38739. p.add(0, func(m *_Encoding, v []interface{}) {
  38740. m.vex3(0xc4, 0b1, 0x83, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  38741. m.emit(0x2a)
  38742. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  38743. })
  38744. }
  38745. // VCVTSI2SD r32, xmm, xmm
  38746. if len(vv) == 0 && isReg32(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) {
  38747. self.require(ISA_AVX512F)
  38748. p.domain = DomainAVX
  38749. p.add(0, func(m *_Encoding, v []interface{}) {
  38750. m.emit(0x62)
  38751. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  38752. m.emit(0x7f ^ (hlcode(v[1]) << 3))
  38753. m.emit((0x08 ^ (ecode(v[1]) << 3)) | 0x00)
  38754. m.emit(0x2a)
  38755. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  38756. })
  38757. }
  38758. // VCVTSI2SD m32, xmm, xmm
  38759. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) {
  38760. self.require(ISA_AVX512F)
  38761. p.domain = DomainAVX
  38762. p.add(0, func(m *_Encoding, v []interface{}) {
  38763. m.evex(0b01, 0x07, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), 0, 0, 0)
  38764. m.emit(0x2a)
  38765. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  38766. })
  38767. }
  38768. // VCVTSI2SD m64, xmm, xmm
  38769. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) {
  38770. self.require(ISA_AVX512F)
  38771. p.domain = DomainAVX
  38772. p.add(0, func(m *_Encoding, v []interface{}) {
  38773. m.evex(0b01, 0x87, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), 0, 0, 0)
  38774. m.emit(0x2a)
  38775. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  38776. })
  38777. }
  38778. // VCVTSI2SD {er}, r64, xmm, xmm
  38779. if len(vv) == 1 && isER(v0) && isReg64(v1) && isEVEXXMM(v2) && isEVEXXMM(vv[0]) {
  38780. self.require(ISA_AVX512F)
  38781. p.domain = DomainAVX
  38782. p.add(0, func(m *_Encoding, v []interface{}) {
  38783. m.emit(0x62)
  38784. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  38785. m.emit(0xff ^ (hlcode(v[2]) << 3))
  38786. m.emit((vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | 0x10)
  38787. m.emit(0x2a)
  38788. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  38789. })
  38790. }
  38791. // VCVTSI2SD r64, xmm, xmm
  38792. if len(vv) == 0 && isReg64(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) {
  38793. self.require(ISA_AVX512F)
  38794. p.domain = DomainAVX
  38795. p.add(0, func(m *_Encoding, v []interface{}) {
  38796. m.emit(0x62)
  38797. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  38798. m.emit(0xff ^ (hlcode(v[1]) << 3))
  38799. m.emit((0x08 ^ (ecode(v[1]) << 3)) | 0x40)
  38800. m.emit(0x2a)
  38801. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  38802. })
  38803. }
  38804. if p.len == 0 {
  38805. panic("invalid operands for VCVTSI2SD")
  38806. }
  38807. return p
  38808. }
  38809. // VCVTSI2SS performs "Convert Dword Integer to Scalar Single-Precision FP Value".
  38810. //
  38811. // Mnemonic : VCVTSI2SS
  38812. // Supported forms : (10 forms)
  38813. //
  38814. // * VCVTSI2SS r32, xmm, xmm [AVX]
  38815. // * VCVTSI2SS r64, xmm, xmm [AVX]
  38816. // * VCVTSI2SS m32, xmm, xmm [AVX]
  38817. // * VCVTSI2SS m64, xmm, xmm [AVX]
  38818. // * VCVTSI2SS m32, xmm, xmm [AVX512F]
  38819. // * VCVTSI2SS m64, xmm, xmm [AVX512F]
  38820. // * VCVTSI2SS {er}, r32, xmm, xmm [AVX512F]
  38821. // * VCVTSI2SS {er}, r64, xmm, xmm [AVX512F]
  38822. // * VCVTSI2SS r32, xmm, xmm [AVX512F]
  38823. // * VCVTSI2SS r64, xmm, xmm [AVX512F]
  38824. //
  38825. func (self *Program) VCVTSI2SS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  38826. var p *Instruction
  38827. switch len(vv) {
  38828. case 0 : p = self.alloc("VCVTSI2SS", 3, Operands { v0, v1, v2 })
  38829. case 1 : p = self.alloc("VCVTSI2SS", 4, Operands { v0, v1, v2, vv[0] })
  38830. default : panic("instruction VCVTSI2SS takes 3 or 4 operands")
  38831. }
  38832. // VCVTSI2SS r32, xmm, xmm
  38833. if len(vv) == 0 && isReg32(v0) && isXMM(v1) && isXMM(v2) {
  38834. self.require(ISA_AVX)
  38835. p.domain = DomainAVX
  38836. p.add(0, func(m *_Encoding, v []interface{}) {
  38837. m.vex2(2, hcode(v[2]), v[0], hlcode(v[1]))
  38838. m.emit(0x2a)
  38839. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  38840. })
  38841. }
  38842. // VCVTSI2SS r64, xmm, xmm
  38843. if len(vv) == 0 && isReg64(v0) && isXMM(v1) && isXMM(v2) {
  38844. self.require(ISA_AVX)
  38845. p.domain = DomainAVX
  38846. p.add(0, func(m *_Encoding, v []interface{}) {
  38847. m.emit(0xc4)
  38848. m.emit(0xe1 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  38849. m.emit(0xfa ^ (hlcode(v[1]) << 3))
  38850. m.emit(0x2a)
  38851. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  38852. })
  38853. }
  38854. // VCVTSI2SS m32, xmm, xmm
  38855. if len(vv) == 0 && isM32(v0) && isXMM(v1) && isXMM(v2) {
  38856. self.require(ISA_AVX)
  38857. p.domain = DomainAVX
  38858. p.add(0, func(m *_Encoding, v []interface{}) {
  38859. m.vex2(2, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  38860. m.emit(0x2a)
  38861. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  38862. })
  38863. }
  38864. // VCVTSI2SS m64, xmm, xmm
  38865. if len(vv) == 0 && isM64(v0) && isXMM(v1) && isXMM(v2) {
  38866. self.require(ISA_AVX)
  38867. p.domain = DomainAVX
  38868. p.add(0, func(m *_Encoding, v []interface{}) {
  38869. m.vex3(0xc4, 0b1, 0x82, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  38870. m.emit(0x2a)
  38871. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  38872. })
  38873. }
  38874. // VCVTSI2SS m32, xmm, xmm
  38875. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) {
  38876. self.require(ISA_AVX512F)
  38877. p.domain = DomainAVX
  38878. p.add(0, func(m *_Encoding, v []interface{}) {
  38879. m.evex(0b01, 0x06, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), 0, 0, 0)
  38880. m.emit(0x2a)
  38881. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  38882. })
  38883. }
  38884. // VCVTSI2SS m64, xmm, xmm
  38885. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) {
  38886. self.require(ISA_AVX512F)
  38887. p.domain = DomainAVX
  38888. p.add(0, func(m *_Encoding, v []interface{}) {
  38889. m.evex(0b01, 0x86, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), 0, 0, 0)
  38890. m.emit(0x2a)
  38891. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  38892. })
  38893. }
  38894. // VCVTSI2SS {er}, r32, xmm, xmm
  38895. if len(vv) == 1 && isER(v0) && isReg32(v1) && isEVEXXMM(v2) && isEVEXXMM(vv[0]) {
  38896. self.require(ISA_AVX512F)
  38897. p.domain = DomainAVX
  38898. p.add(0, func(m *_Encoding, v []interface{}) {
  38899. m.emit(0x62)
  38900. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  38901. m.emit(0x7e ^ (hlcode(v[2]) << 3))
  38902. m.emit((vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | 0x10)
  38903. m.emit(0x2a)
  38904. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  38905. })
  38906. }
  38907. // VCVTSI2SS {er}, r64, xmm, xmm
  38908. if len(vv) == 1 && isER(v0) && isReg64(v1) && isEVEXXMM(v2) && isEVEXXMM(vv[0]) {
  38909. self.require(ISA_AVX512F)
  38910. p.domain = DomainAVX
  38911. p.add(0, func(m *_Encoding, v []interface{}) {
  38912. m.emit(0x62)
  38913. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  38914. m.emit(0xfe ^ (hlcode(v[2]) << 3))
  38915. m.emit((vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | 0x10)
  38916. m.emit(0x2a)
  38917. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  38918. })
  38919. }
  38920. // VCVTSI2SS r32, xmm, xmm
  38921. if len(vv) == 0 && isReg32(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) {
  38922. self.require(ISA_AVX512F)
  38923. p.domain = DomainAVX
  38924. p.add(0, func(m *_Encoding, v []interface{}) {
  38925. m.emit(0x62)
  38926. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  38927. m.emit(0x7e ^ (hlcode(v[1]) << 3))
  38928. m.emit((0x08 ^ (ecode(v[1]) << 3)) | 0x40)
  38929. m.emit(0x2a)
  38930. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  38931. })
  38932. }
  38933. // VCVTSI2SS r64, xmm, xmm
  38934. if len(vv) == 0 && isReg64(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) {
  38935. self.require(ISA_AVX512F)
  38936. p.domain = DomainAVX
  38937. p.add(0, func(m *_Encoding, v []interface{}) {
  38938. m.emit(0x62)
  38939. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  38940. m.emit(0xfe ^ (hlcode(v[1]) << 3))
  38941. m.emit((0x08 ^ (ecode(v[1]) << 3)) | 0x40)
  38942. m.emit(0x2a)
  38943. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  38944. })
  38945. }
  38946. if p.len == 0 {
  38947. panic("invalid operands for VCVTSI2SS")
  38948. }
  38949. return p
  38950. }
  38951. // VCVTSS2SD performs "Convert Scalar Single-Precision FP Value to Scalar Double-Precision FP Value".
  38952. //
  38953. // Mnemonic : VCVTSS2SD
  38954. // Supported forms : (5 forms)
  38955. //
  38956. // * VCVTSS2SD xmm, xmm, xmm [AVX]
  38957. // * VCVTSS2SD m32, xmm, xmm [AVX]
  38958. // * VCVTSS2SD m32, xmm, xmm{k}{z} [AVX512F]
  38959. // * VCVTSS2SD {sae}, xmm, xmm, xmm{k}{z} [AVX512F]
  38960. // * VCVTSS2SD xmm, xmm, xmm{k}{z} [AVX512F]
  38961. //
  38962. func (self *Program) VCVTSS2SD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  38963. var p *Instruction
  38964. switch len(vv) {
  38965. case 0 : p = self.alloc("VCVTSS2SD", 3, Operands { v0, v1, v2 })
  38966. case 1 : p = self.alloc("VCVTSS2SD", 4, Operands { v0, v1, v2, vv[0] })
  38967. default : panic("instruction VCVTSS2SD takes 3 or 4 operands")
  38968. }
  38969. // VCVTSS2SD xmm, xmm, xmm
  38970. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  38971. self.require(ISA_AVX)
  38972. p.domain = DomainAVX
  38973. p.add(0, func(m *_Encoding, v []interface{}) {
  38974. m.vex2(2, hcode(v[2]), v[0], hlcode(v[1]))
  38975. m.emit(0x5a)
  38976. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  38977. })
  38978. }
  38979. // VCVTSS2SD m32, xmm, xmm
  38980. if len(vv) == 0 && isM32(v0) && isXMM(v1) && isXMM(v2) {
  38981. self.require(ISA_AVX)
  38982. p.domain = DomainAVX
  38983. p.add(0, func(m *_Encoding, v []interface{}) {
  38984. m.vex2(2, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  38985. m.emit(0x5a)
  38986. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  38987. })
  38988. }
  38989. // VCVTSS2SD m32, xmm, xmm{k}{z}
  38990. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  38991. self.require(ISA_AVX512F)
  38992. p.domain = DomainAVX
  38993. p.add(0, func(m *_Encoding, v []interface{}) {
  38994. m.evex(0b01, 0x06, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  38995. m.emit(0x5a)
  38996. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  38997. })
  38998. }
  38999. // VCVTSS2SD {sae}, xmm, xmm, xmm{k}{z}
  39000. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  39001. self.require(ISA_AVX512F)
  39002. p.domain = DomainAVX
  39003. p.add(0, func(m *_Encoding, v []interface{}) {
  39004. m.emit(0x62)
  39005. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  39006. m.emit(0x7e ^ (hlcode(v[2]) << 3))
  39007. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  39008. m.emit(0x5a)
  39009. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  39010. })
  39011. }
  39012. // VCVTSS2SD xmm, xmm, xmm{k}{z}
  39013. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  39014. self.require(ISA_AVX512F)
  39015. p.domain = DomainAVX
  39016. p.add(0, func(m *_Encoding, v []interface{}) {
  39017. m.emit(0x62)
  39018. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  39019. m.emit(0x7e ^ (hlcode(v[1]) << 3))
  39020. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  39021. m.emit(0x5a)
  39022. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  39023. })
  39024. }
  39025. if p.len == 0 {
  39026. panic("invalid operands for VCVTSS2SD")
  39027. }
  39028. return p
  39029. }
  39030. // VCVTSS2SI performs "Convert Scalar Single-Precision FP Value to Dword Integer".
  39031. //
  39032. // Mnemonic : VCVTSS2SI
  39033. // Supported forms : (10 forms)
  39034. //
  39035. // * VCVTSS2SI xmm, r32 [AVX]
  39036. // * VCVTSS2SI m32, r32 [AVX]
  39037. // * VCVTSS2SI xmm, r64 [AVX]
  39038. // * VCVTSS2SI m32, r64 [AVX]
  39039. // * VCVTSS2SI m32, r32 [AVX512F]
  39040. // * VCVTSS2SI m32, r64 [AVX512F]
  39041. // * VCVTSS2SI {er}, xmm, r32 [AVX512F]
  39042. // * VCVTSS2SI {er}, xmm, r64 [AVX512F]
  39043. // * VCVTSS2SI xmm, r32 [AVX512F]
  39044. // * VCVTSS2SI xmm, r64 [AVX512F]
  39045. //
  39046. func (self *Program) VCVTSS2SI(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  39047. var p *Instruction
  39048. switch len(vv) {
  39049. case 0 : p = self.alloc("VCVTSS2SI", 2, Operands { v0, v1 })
  39050. case 1 : p = self.alloc("VCVTSS2SI", 3, Operands { v0, v1, vv[0] })
  39051. default : panic("instruction VCVTSS2SI takes 2 or 3 operands")
  39052. }
  39053. // VCVTSS2SI xmm, r32
  39054. if len(vv) == 0 && isXMM(v0) && isReg32(v1) {
  39055. self.require(ISA_AVX)
  39056. p.domain = DomainAVX
  39057. p.add(0, func(m *_Encoding, v []interface{}) {
  39058. m.vex2(2, hcode(v[1]), v[0], 0)
  39059. m.emit(0x2d)
  39060. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39061. })
  39062. }
  39063. // VCVTSS2SI m32, r32
  39064. if len(vv) == 0 && isM32(v0) && isReg32(v1) {
  39065. self.require(ISA_AVX)
  39066. p.domain = DomainAVX
  39067. p.add(0, func(m *_Encoding, v []interface{}) {
  39068. m.vex2(2, hcode(v[1]), addr(v[0]), 0)
  39069. m.emit(0x2d)
  39070. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  39071. })
  39072. }
  39073. // VCVTSS2SI xmm, r64
  39074. if len(vv) == 0 && isXMM(v0) && isReg64(v1) {
  39075. self.require(ISA_AVX)
  39076. p.domain = DomainAVX
  39077. p.add(0, func(m *_Encoding, v []interface{}) {
  39078. m.emit(0xc4)
  39079. m.emit(0xe1 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  39080. m.emit(0xfa)
  39081. m.emit(0x2d)
  39082. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39083. })
  39084. }
  39085. // VCVTSS2SI m32, r64
  39086. if len(vv) == 0 && isM32(v0) && isReg64(v1) {
  39087. self.require(ISA_AVX)
  39088. p.domain = DomainAVX
  39089. p.add(0, func(m *_Encoding, v []interface{}) {
  39090. m.vex3(0xc4, 0b1, 0x82, hcode(v[1]), addr(v[0]), 0)
  39091. m.emit(0x2d)
  39092. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  39093. })
  39094. }
  39095. // VCVTSS2SI m32, r32
  39096. if len(vv) == 0 && isM32(v0) && isReg32(v1) {
  39097. self.require(ISA_AVX512F)
  39098. p.domain = DomainAVX
  39099. p.add(0, func(m *_Encoding, v []interface{}) {
  39100. m.evex(0b01, 0x06, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  39101. m.emit(0x2d)
  39102. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  39103. })
  39104. }
  39105. // VCVTSS2SI m32, r64
  39106. if len(vv) == 0 && isM32(v0) && isReg64(v1) {
  39107. self.require(ISA_AVX512F)
  39108. p.domain = DomainAVX
  39109. p.add(0, func(m *_Encoding, v []interface{}) {
  39110. m.evex(0b01, 0x86, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  39111. m.emit(0x2d)
  39112. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  39113. })
  39114. }
  39115. // VCVTSS2SI {er}, xmm, r32
  39116. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isReg32(vv[0]) {
  39117. self.require(ISA_AVX512F)
  39118. p.domain = DomainAVX
  39119. p.add(0, func(m *_Encoding, v []interface{}) {
  39120. m.emit(0x62)
  39121. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  39122. m.emit(0x7e)
  39123. m.emit((vcode(v[0]) << 5) | 0x18)
  39124. m.emit(0x2d)
  39125. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  39126. })
  39127. }
  39128. // VCVTSS2SI {er}, xmm, r64
  39129. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isReg64(vv[0]) {
  39130. self.require(ISA_AVX512F)
  39131. p.domain = DomainAVX
  39132. p.add(0, func(m *_Encoding, v []interface{}) {
  39133. m.emit(0x62)
  39134. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  39135. m.emit(0xfe)
  39136. m.emit((vcode(v[0]) << 5) | 0x18)
  39137. m.emit(0x2d)
  39138. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  39139. })
  39140. }
  39141. // VCVTSS2SI xmm, r32
  39142. if len(vv) == 0 && isEVEXXMM(v0) && isReg32(v1) {
  39143. self.require(ISA_AVX512F)
  39144. p.domain = DomainAVX
  39145. p.add(0, func(m *_Encoding, v []interface{}) {
  39146. m.emit(0x62)
  39147. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  39148. m.emit(0x7e)
  39149. m.emit(0x48)
  39150. m.emit(0x2d)
  39151. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39152. })
  39153. }
  39154. // VCVTSS2SI xmm, r64
  39155. if len(vv) == 0 && isEVEXXMM(v0) && isReg64(v1) {
  39156. self.require(ISA_AVX512F)
  39157. p.domain = DomainAVX
  39158. p.add(0, func(m *_Encoding, v []interface{}) {
  39159. m.emit(0x62)
  39160. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  39161. m.emit(0xfe)
  39162. m.emit(0x48)
  39163. m.emit(0x2d)
  39164. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39165. })
  39166. }
  39167. if p.len == 0 {
  39168. panic("invalid operands for VCVTSS2SI")
  39169. }
  39170. return p
  39171. }
  39172. // VCVTSS2USI performs "Convert Scalar Single-Precision Floating-Point Value to Unsigned Doubleword Integer".
  39173. //
  39174. // Mnemonic : VCVTSS2USI
  39175. // Supported forms : (6 forms)
  39176. //
  39177. // * VCVTSS2USI m32, r32 [AVX512F]
  39178. // * VCVTSS2USI m32, r64 [AVX512F]
  39179. // * VCVTSS2USI {er}, xmm, r32 [AVX512F]
  39180. // * VCVTSS2USI {er}, xmm, r64 [AVX512F]
  39181. // * VCVTSS2USI xmm, r32 [AVX512F]
  39182. // * VCVTSS2USI xmm, r64 [AVX512F]
  39183. //
  39184. func (self *Program) VCVTSS2USI(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  39185. var p *Instruction
  39186. switch len(vv) {
  39187. case 0 : p = self.alloc("VCVTSS2USI", 2, Operands { v0, v1 })
  39188. case 1 : p = self.alloc("VCVTSS2USI", 3, Operands { v0, v1, vv[0] })
  39189. default : panic("instruction VCVTSS2USI takes 2 or 3 operands")
  39190. }
  39191. // VCVTSS2USI m32, r32
  39192. if len(vv) == 0 && isM32(v0) && isReg32(v1) {
  39193. self.require(ISA_AVX512F)
  39194. p.domain = DomainAVX
  39195. p.add(0, func(m *_Encoding, v []interface{}) {
  39196. m.evex(0b01, 0x06, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  39197. m.emit(0x79)
  39198. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  39199. })
  39200. }
  39201. // VCVTSS2USI m32, r64
  39202. if len(vv) == 0 && isM32(v0) && isReg64(v1) {
  39203. self.require(ISA_AVX512F)
  39204. p.domain = DomainAVX
  39205. p.add(0, func(m *_Encoding, v []interface{}) {
  39206. m.evex(0b01, 0x86, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  39207. m.emit(0x79)
  39208. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  39209. })
  39210. }
  39211. // VCVTSS2USI {er}, xmm, r32
  39212. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isReg32(vv[0]) {
  39213. self.require(ISA_AVX512F)
  39214. p.domain = DomainAVX
  39215. p.add(0, func(m *_Encoding, v []interface{}) {
  39216. m.emit(0x62)
  39217. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  39218. m.emit(0x7e)
  39219. m.emit((vcode(v[0]) << 5) | 0x18)
  39220. m.emit(0x79)
  39221. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  39222. })
  39223. }
  39224. // VCVTSS2USI {er}, xmm, r64
  39225. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isReg64(vv[0]) {
  39226. self.require(ISA_AVX512F)
  39227. p.domain = DomainAVX
  39228. p.add(0, func(m *_Encoding, v []interface{}) {
  39229. m.emit(0x62)
  39230. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  39231. m.emit(0xfe)
  39232. m.emit((vcode(v[0]) << 5) | 0x18)
  39233. m.emit(0x79)
  39234. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  39235. })
  39236. }
  39237. // VCVTSS2USI xmm, r32
  39238. if len(vv) == 0 && isEVEXXMM(v0) && isReg32(v1) {
  39239. self.require(ISA_AVX512F)
  39240. p.domain = DomainAVX
  39241. p.add(0, func(m *_Encoding, v []interface{}) {
  39242. m.emit(0x62)
  39243. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  39244. m.emit(0x7e)
  39245. m.emit(0x48)
  39246. m.emit(0x79)
  39247. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39248. })
  39249. }
  39250. // VCVTSS2USI xmm, r64
  39251. if len(vv) == 0 && isEVEXXMM(v0) && isReg64(v1) {
  39252. self.require(ISA_AVX512F)
  39253. p.domain = DomainAVX
  39254. p.add(0, func(m *_Encoding, v []interface{}) {
  39255. m.emit(0x62)
  39256. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  39257. m.emit(0xfe)
  39258. m.emit(0x48)
  39259. m.emit(0x79)
  39260. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39261. })
  39262. }
  39263. if p.len == 0 {
  39264. panic("invalid operands for VCVTSS2USI")
  39265. }
  39266. return p
  39267. }
  39268. // VCVTTPD2DQ performs "Convert with Truncation Packed Double-Precision FP Values to Packed Dword Integers".
  39269. //
  39270. // Mnemonic : VCVTTPD2DQ
  39271. // Supported forms : (11 forms)
  39272. //
  39273. // * VCVTTPD2DQ xmm, xmm [AVX]
  39274. // * VCVTTPD2DQ ymm, xmm [AVX]
  39275. // * VCVTTPD2DQ m128, xmm [AVX]
  39276. // * VCVTTPD2DQ m256, xmm [AVX]
  39277. // * VCVTTPD2DQ m512/m64bcst, ymm{k}{z} [AVX512F]
  39278. // * VCVTTPD2DQ {sae}, zmm, ymm{k}{z} [AVX512F]
  39279. // * VCVTTPD2DQ zmm, ymm{k}{z} [AVX512F]
  39280. // * VCVTTPD2DQ m128/m64bcst, xmm{k}{z} [AVX512F,AVX512VL]
  39281. // * VCVTTPD2DQ m256/m64bcst, xmm{k}{z} [AVX512F,AVX512VL]
  39282. // * VCVTTPD2DQ xmm, xmm{k}{z} [AVX512F,AVX512VL]
  39283. // * VCVTTPD2DQ ymm, xmm{k}{z} [AVX512F,AVX512VL]
  39284. //
  39285. func (self *Program) VCVTTPD2DQ(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  39286. var p *Instruction
  39287. switch len(vv) {
  39288. case 0 : p = self.alloc("VCVTTPD2DQ", 2, Operands { v0, v1 })
  39289. case 1 : p = self.alloc("VCVTTPD2DQ", 3, Operands { v0, v1, vv[0] })
  39290. default : panic("instruction VCVTTPD2DQ takes 2 or 3 operands")
  39291. }
  39292. // VCVTTPD2DQ xmm, xmm
  39293. if len(vv) == 0 && isXMM(v0) && isXMM(v1) {
  39294. self.require(ISA_AVX)
  39295. p.domain = DomainAVX
  39296. p.add(0, func(m *_Encoding, v []interface{}) {
  39297. m.vex2(1, hcode(v[1]), v[0], 0)
  39298. m.emit(0xe6)
  39299. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39300. })
  39301. }
  39302. // VCVTTPD2DQ ymm, xmm
  39303. if len(vv) == 0 && isYMM(v0) && isXMM(v1) {
  39304. self.require(ISA_AVX)
  39305. p.domain = DomainAVX
  39306. p.add(0, func(m *_Encoding, v []interface{}) {
  39307. m.vex2(5, hcode(v[1]), v[0], 0)
  39308. m.emit(0xe6)
  39309. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39310. })
  39311. }
  39312. // VCVTTPD2DQ m128, xmm
  39313. if len(vv) == 0 && isM128(v0) && isXMM(v1) {
  39314. self.require(ISA_AVX)
  39315. p.domain = DomainAVX
  39316. p.add(0, func(m *_Encoding, v []interface{}) {
  39317. m.vex2(1, hcode(v[1]), addr(v[0]), 0)
  39318. m.emit(0xe6)
  39319. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  39320. })
  39321. }
  39322. // VCVTTPD2DQ m256, xmm
  39323. if len(vv) == 0 && isM256(v0) && isXMM(v1) {
  39324. self.require(ISA_AVX)
  39325. p.domain = DomainAVX
  39326. p.add(0, func(m *_Encoding, v []interface{}) {
  39327. m.vex2(5, hcode(v[1]), addr(v[0]), 0)
  39328. m.emit(0xe6)
  39329. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  39330. })
  39331. }
  39332. // VCVTTPD2DQ m512/m64bcst, ymm{k}{z}
  39333. if len(vv) == 0 && isM512M64bcst(v0) && isYMMkz(v1) {
  39334. self.require(ISA_AVX512F)
  39335. p.domain = DomainAVX
  39336. p.add(0, func(m *_Encoding, v []interface{}) {
  39337. m.evex(0b01, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  39338. m.emit(0xe6)
  39339. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  39340. })
  39341. }
  39342. // VCVTTPD2DQ {sae}, zmm, ymm{k}{z}
  39343. if len(vv) == 1 && isSAE(v0) && isZMM(v1) && isYMMkz(vv[0]) {
  39344. self.require(ISA_AVX512F)
  39345. p.domain = DomainAVX
  39346. p.add(0, func(m *_Encoding, v []interface{}) {
  39347. m.emit(0x62)
  39348. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  39349. m.emit(0xfd)
  39350. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x18)
  39351. m.emit(0xe6)
  39352. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  39353. })
  39354. }
  39355. // VCVTTPD2DQ zmm, ymm{k}{z}
  39356. if len(vv) == 0 && isZMM(v0) && isYMMkz(v1) {
  39357. self.require(ISA_AVX512F)
  39358. p.domain = DomainAVX
  39359. p.add(0, func(m *_Encoding, v []interface{}) {
  39360. m.emit(0x62)
  39361. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  39362. m.emit(0xfd)
  39363. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  39364. m.emit(0xe6)
  39365. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39366. })
  39367. }
  39368. // VCVTTPD2DQ m128/m64bcst, xmm{k}{z}
  39369. if len(vv) == 0 && isM128M64bcst(v0) && isXMMkz(v1) {
  39370. self.require(ISA_AVX512VL | ISA_AVX512F)
  39371. p.domain = DomainAVX
  39372. p.add(0, func(m *_Encoding, v []interface{}) {
  39373. m.evex(0b01, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  39374. m.emit(0xe6)
  39375. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  39376. })
  39377. }
  39378. // VCVTTPD2DQ m256/m64bcst, xmm{k}{z}
  39379. if len(vv) == 0 && isM256M64bcst(v0) && isXMMkz(v1) {
  39380. self.require(ISA_AVX512VL | ISA_AVX512F)
  39381. p.domain = DomainAVX
  39382. p.add(0, func(m *_Encoding, v []interface{}) {
  39383. m.evex(0b01, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  39384. m.emit(0xe6)
  39385. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  39386. })
  39387. }
  39388. // VCVTTPD2DQ xmm, xmm{k}{z}
  39389. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  39390. self.require(ISA_AVX512VL | ISA_AVX512F)
  39391. p.domain = DomainAVX
  39392. p.add(0, func(m *_Encoding, v []interface{}) {
  39393. m.emit(0x62)
  39394. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  39395. m.emit(0xfd)
  39396. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  39397. m.emit(0xe6)
  39398. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39399. })
  39400. }
  39401. // VCVTTPD2DQ ymm, xmm{k}{z}
  39402. if len(vv) == 0 && isEVEXYMM(v0) && isXMMkz(v1) {
  39403. self.require(ISA_AVX512VL | ISA_AVX512F)
  39404. p.domain = DomainAVX
  39405. p.add(0, func(m *_Encoding, v []interface{}) {
  39406. m.emit(0x62)
  39407. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  39408. m.emit(0xfd)
  39409. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  39410. m.emit(0xe6)
  39411. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39412. })
  39413. }
  39414. if p.len == 0 {
  39415. panic("invalid operands for VCVTTPD2DQ")
  39416. }
  39417. return p
  39418. }
  39419. // VCVTTPD2QQ performs "Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Quadword Integers".
  39420. //
  39421. // Mnemonic : VCVTTPD2QQ
  39422. // Supported forms : (7 forms)
  39423. //
  39424. // * VCVTTPD2QQ m512/m64bcst, zmm{k}{z} [AVX512DQ]
  39425. // * VCVTTPD2QQ {sae}, zmm, zmm{k}{z} [AVX512DQ]
  39426. // * VCVTTPD2QQ zmm, zmm{k}{z} [AVX512DQ]
  39427. // * VCVTTPD2QQ m128/m64bcst, xmm{k}{z} [AVX512DQ,AVX512VL]
  39428. // * VCVTTPD2QQ m256/m64bcst, ymm{k}{z} [AVX512DQ,AVX512VL]
  39429. // * VCVTTPD2QQ xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  39430. // * VCVTTPD2QQ ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  39431. //
  39432. func (self *Program) VCVTTPD2QQ(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  39433. var p *Instruction
  39434. switch len(vv) {
  39435. case 0 : p = self.alloc("VCVTTPD2QQ", 2, Operands { v0, v1 })
  39436. case 1 : p = self.alloc("VCVTTPD2QQ", 3, Operands { v0, v1, vv[0] })
  39437. default : panic("instruction VCVTTPD2QQ takes 2 or 3 operands")
  39438. }
  39439. // VCVTTPD2QQ m512/m64bcst, zmm{k}{z}
  39440. if len(vv) == 0 && isM512M64bcst(v0) && isZMMkz(v1) {
  39441. self.require(ISA_AVX512DQ)
  39442. p.domain = DomainAVX
  39443. p.add(0, func(m *_Encoding, v []interface{}) {
  39444. m.evex(0b01, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  39445. m.emit(0x7a)
  39446. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  39447. })
  39448. }
  39449. // VCVTTPD2QQ {sae}, zmm, zmm{k}{z}
  39450. if len(vv) == 1 && isSAE(v0) && isZMM(v1) && isZMMkz(vv[0]) {
  39451. self.require(ISA_AVX512DQ)
  39452. p.domain = DomainAVX
  39453. p.add(0, func(m *_Encoding, v []interface{}) {
  39454. m.emit(0x62)
  39455. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  39456. m.emit(0xfd)
  39457. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x18)
  39458. m.emit(0x7a)
  39459. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  39460. })
  39461. }
  39462. // VCVTTPD2QQ zmm, zmm{k}{z}
  39463. if len(vv) == 0 && isZMM(v0) && isZMMkz(v1) {
  39464. self.require(ISA_AVX512DQ)
  39465. p.domain = DomainAVX
  39466. p.add(0, func(m *_Encoding, v []interface{}) {
  39467. m.emit(0x62)
  39468. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  39469. m.emit(0xfd)
  39470. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  39471. m.emit(0x7a)
  39472. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39473. })
  39474. }
  39475. // VCVTTPD2QQ m128/m64bcst, xmm{k}{z}
  39476. if len(vv) == 0 && isM128M64bcst(v0) && isXMMkz(v1) {
  39477. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  39478. p.domain = DomainAVX
  39479. p.add(0, func(m *_Encoding, v []interface{}) {
  39480. m.evex(0b01, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  39481. m.emit(0x7a)
  39482. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  39483. })
  39484. }
  39485. // VCVTTPD2QQ m256/m64bcst, ymm{k}{z}
  39486. if len(vv) == 0 && isM256M64bcst(v0) && isYMMkz(v1) {
  39487. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  39488. p.domain = DomainAVX
  39489. p.add(0, func(m *_Encoding, v []interface{}) {
  39490. m.evex(0b01, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  39491. m.emit(0x7a)
  39492. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  39493. })
  39494. }
  39495. // VCVTTPD2QQ xmm, xmm{k}{z}
  39496. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  39497. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  39498. p.domain = DomainAVX
  39499. p.add(0, func(m *_Encoding, v []interface{}) {
  39500. m.emit(0x62)
  39501. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  39502. m.emit(0xfd)
  39503. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  39504. m.emit(0x7a)
  39505. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39506. })
  39507. }
  39508. // VCVTTPD2QQ ymm, ymm{k}{z}
  39509. if len(vv) == 0 && isEVEXYMM(v0) && isYMMkz(v1) {
  39510. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  39511. p.domain = DomainAVX
  39512. p.add(0, func(m *_Encoding, v []interface{}) {
  39513. m.emit(0x62)
  39514. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  39515. m.emit(0xfd)
  39516. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  39517. m.emit(0x7a)
  39518. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39519. })
  39520. }
  39521. if p.len == 0 {
  39522. panic("invalid operands for VCVTTPD2QQ")
  39523. }
  39524. return p
  39525. }
  39526. // VCVTTPD2UDQ performs "Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Unsigned Doubleword Integers".
  39527. //
  39528. // Mnemonic : VCVTTPD2UDQ
  39529. // Supported forms : (7 forms)
  39530. //
  39531. // * VCVTTPD2UDQ m512/m64bcst, ymm{k}{z} [AVX512F]
  39532. // * VCVTTPD2UDQ {sae}, zmm, ymm{k}{z} [AVX512F]
  39533. // * VCVTTPD2UDQ zmm, ymm{k}{z} [AVX512F]
  39534. // * VCVTTPD2UDQ m128/m64bcst, xmm{k}{z} [AVX512F,AVX512VL]
  39535. // * VCVTTPD2UDQ m256/m64bcst, xmm{k}{z} [AVX512F,AVX512VL]
  39536. // * VCVTTPD2UDQ xmm, xmm{k}{z} [AVX512F,AVX512VL]
  39537. // * VCVTTPD2UDQ ymm, xmm{k}{z} [AVX512F,AVX512VL]
  39538. //
  39539. func (self *Program) VCVTTPD2UDQ(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  39540. var p *Instruction
  39541. switch len(vv) {
  39542. case 0 : p = self.alloc("VCVTTPD2UDQ", 2, Operands { v0, v1 })
  39543. case 1 : p = self.alloc("VCVTTPD2UDQ", 3, Operands { v0, v1, vv[0] })
  39544. default : panic("instruction VCVTTPD2UDQ takes 2 or 3 operands")
  39545. }
  39546. // VCVTTPD2UDQ m512/m64bcst, ymm{k}{z}
  39547. if len(vv) == 0 && isM512M64bcst(v0) && isYMMkz(v1) {
  39548. self.require(ISA_AVX512F)
  39549. p.domain = DomainAVX
  39550. p.add(0, func(m *_Encoding, v []interface{}) {
  39551. m.evex(0b01, 0x84, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  39552. m.emit(0x78)
  39553. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  39554. })
  39555. }
  39556. // VCVTTPD2UDQ {sae}, zmm, ymm{k}{z}
  39557. if len(vv) == 1 && isSAE(v0) && isZMM(v1) && isYMMkz(vv[0]) {
  39558. self.require(ISA_AVX512F)
  39559. p.domain = DomainAVX
  39560. p.add(0, func(m *_Encoding, v []interface{}) {
  39561. m.emit(0x62)
  39562. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  39563. m.emit(0xfc)
  39564. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x18)
  39565. m.emit(0x78)
  39566. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  39567. })
  39568. }
  39569. // VCVTTPD2UDQ zmm, ymm{k}{z}
  39570. if len(vv) == 0 && isZMM(v0) && isYMMkz(v1) {
  39571. self.require(ISA_AVX512F)
  39572. p.domain = DomainAVX
  39573. p.add(0, func(m *_Encoding, v []interface{}) {
  39574. m.emit(0x62)
  39575. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  39576. m.emit(0xfc)
  39577. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  39578. m.emit(0x78)
  39579. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39580. })
  39581. }
  39582. // VCVTTPD2UDQ m128/m64bcst, xmm{k}{z}
  39583. if len(vv) == 0 && isM128M64bcst(v0) && isXMMkz(v1) {
  39584. self.require(ISA_AVX512VL | ISA_AVX512F)
  39585. p.domain = DomainAVX
  39586. p.add(0, func(m *_Encoding, v []interface{}) {
  39587. m.evex(0b01, 0x84, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  39588. m.emit(0x78)
  39589. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  39590. })
  39591. }
  39592. // VCVTTPD2UDQ m256/m64bcst, xmm{k}{z}
  39593. if len(vv) == 0 && isM256M64bcst(v0) && isXMMkz(v1) {
  39594. self.require(ISA_AVX512VL | ISA_AVX512F)
  39595. p.domain = DomainAVX
  39596. p.add(0, func(m *_Encoding, v []interface{}) {
  39597. m.evex(0b01, 0x84, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  39598. m.emit(0x78)
  39599. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  39600. })
  39601. }
  39602. // VCVTTPD2UDQ xmm, xmm{k}{z}
  39603. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  39604. self.require(ISA_AVX512VL | ISA_AVX512F)
  39605. p.domain = DomainAVX
  39606. p.add(0, func(m *_Encoding, v []interface{}) {
  39607. m.emit(0x62)
  39608. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  39609. m.emit(0xfc)
  39610. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  39611. m.emit(0x78)
  39612. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39613. })
  39614. }
  39615. // VCVTTPD2UDQ ymm, xmm{k}{z}
  39616. if len(vv) == 0 && isEVEXYMM(v0) && isXMMkz(v1) {
  39617. self.require(ISA_AVX512VL | ISA_AVX512F)
  39618. p.domain = DomainAVX
  39619. p.add(0, func(m *_Encoding, v []interface{}) {
  39620. m.emit(0x62)
  39621. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  39622. m.emit(0xfc)
  39623. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  39624. m.emit(0x78)
  39625. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39626. })
  39627. }
  39628. if p.len == 0 {
  39629. panic("invalid operands for VCVTTPD2UDQ")
  39630. }
  39631. return p
  39632. }
  39633. // VCVTTPD2UQQ performs "Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Unsigned Quadword Integers".
  39634. //
  39635. // Mnemonic : VCVTTPD2UQQ
  39636. // Supported forms : (7 forms)
  39637. //
  39638. // * VCVTTPD2UQQ m512/m64bcst, zmm{k}{z} [AVX512DQ]
  39639. // * VCVTTPD2UQQ {sae}, zmm, zmm{k}{z} [AVX512DQ]
  39640. // * VCVTTPD2UQQ zmm, zmm{k}{z} [AVX512DQ]
  39641. // * VCVTTPD2UQQ m128/m64bcst, xmm{k}{z} [AVX512DQ,AVX512VL]
  39642. // * VCVTTPD2UQQ m256/m64bcst, ymm{k}{z} [AVX512DQ,AVX512VL]
  39643. // * VCVTTPD2UQQ xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  39644. // * VCVTTPD2UQQ ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  39645. //
  39646. func (self *Program) VCVTTPD2UQQ(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  39647. var p *Instruction
  39648. switch len(vv) {
  39649. case 0 : p = self.alloc("VCVTTPD2UQQ", 2, Operands { v0, v1 })
  39650. case 1 : p = self.alloc("VCVTTPD2UQQ", 3, Operands { v0, v1, vv[0] })
  39651. default : panic("instruction VCVTTPD2UQQ takes 2 or 3 operands")
  39652. }
  39653. // VCVTTPD2UQQ m512/m64bcst, zmm{k}{z}
  39654. if len(vv) == 0 && isM512M64bcst(v0) && isZMMkz(v1) {
  39655. self.require(ISA_AVX512DQ)
  39656. p.domain = DomainAVX
  39657. p.add(0, func(m *_Encoding, v []interface{}) {
  39658. m.evex(0b01, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  39659. m.emit(0x78)
  39660. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  39661. })
  39662. }
  39663. // VCVTTPD2UQQ {sae}, zmm, zmm{k}{z}
  39664. if len(vv) == 1 && isSAE(v0) && isZMM(v1) && isZMMkz(vv[0]) {
  39665. self.require(ISA_AVX512DQ)
  39666. p.domain = DomainAVX
  39667. p.add(0, func(m *_Encoding, v []interface{}) {
  39668. m.emit(0x62)
  39669. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  39670. m.emit(0xfd)
  39671. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x18)
  39672. m.emit(0x78)
  39673. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  39674. })
  39675. }
  39676. // VCVTTPD2UQQ zmm, zmm{k}{z}
  39677. if len(vv) == 0 && isZMM(v0) && isZMMkz(v1) {
  39678. self.require(ISA_AVX512DQ)
  39679. p.domain = DomainAVX
  39680. p.add(0, func(m *_Encoding, v []interface{}) {
  39681. m.emit(0x62)
  39682. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  39683. m.emit(0xfd)
  39684. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  39685. m.emit(0x78)
  39686. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39687. })
  39688. }
  39689. // VCVTTPD2UQQ m128/m64bcst, xmm{k}{z}
  39690. if len(vv) == 0 && isM128M64bcst(v0) && isXMMkz(v1) {
  39691. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  39692. p.domain = DomainAVX
  39693. p.add(0, func(m *_Encoding, v []interface{}) {
  39694. m.evex(0b01, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  39695. m.emit(0x78)
  39696. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  39697. })
  39698. }
  39699. // VCVTTPD2UQQ m256/m64bcst, ymm{k}{z}
  39700. if len(vv) == 0 && isM256M64bcst(v0) && isYMMkz(v1) {
  39701. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  39702. p.domain = DomainAVX
  39703. p.add(0, func(m *_Encoding, v []interface{}) {
  39704. m.evex(0b01, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  39705. m.emit(0x78)
  39706. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  39707. })
  39708. }
  39709. // VCVTTPD2UQQ xmm, xmm{k}{z}
  39710. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  39711. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  39712. p.domain = DomainAVX
  39713. p.add(0, func(m *_Encoding, v []interface{}) {
  39714. m.emit(0x62)
  39715. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  39716. m.emit(0xfd)
  39717. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  39718. m.emit(0x78)
  39719. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39720. })
  39721. }
  39722. // VCVTTPD2UQQ ymm, ymm{k}{z}
  39723. if len(vv) == 0 && isEVEXYMM(v0) && isYMMkz(v1) {
  39724. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  39725. p.domain = DomainAVX
  39726. p.add(0, func(m *_Encoding, v []interface{}) {
  39727. m.emit(0x62)
  39728. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  39729. m.emit(0xfd)
  39730. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  39731. m.emit(0x78)
  39732. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39733. })
  39734. }
  39735. if p.len == 0 {
  39736. panic("invalid operands for VCVTTPD2UQQ")
  39737. }
  39738. return p
  39739. }
  39740. // VCVTTPS2DQ performs "Convert with Truncation Packed Single-Precision FP Values to Packed Dword Integers".
  39741. //
  39742. // Mnemonic : VCVTTPS2DQ
  39743. // Supported forms : (11 forms)
  39744. //
  39745. // * VCVTTPS2DQ xmm, xmm [AVX]
  39746. // * VCVTTPS2DQ m128, xmm [AVX]
  39747. // * VCVTTPS2DQ ymm, ymm [AVX]
  39748. // * VCVTTPS2DQ m256, ymm [AVX]
  39749. // * VCVTTPS2DQ m512/m32bcst, zmm{k}{z} [AVX512F]
  39750. // * VCVTTPS2DQ {sae}, zmm, zmm{k}{z} [AVX512F]
  39751. // * VCVTTPS2DQ zmm, zmm{k}{z} [AVX512F]
  39752. // * VCVTTPS2DQ m128/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  39753. // * VCVTTPS2DQ m256/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  39754. // * VCVTTPS2DQ xmm, xmm{k}{z} [AVX512F,AVX512VL]
  39755. // * VCVTTPS2DQ ymm, ymm{k}{z} [AVX512F,AVX512VL]
  39756. //
  39757. func (self *Program) VCVTTPS2DQ(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  39758. var p *Instruction
  39759. switch len(vv) {
  39760. case 0 : p = self.alloc("VCVTTPS2DQ", 2, Operands { v0, v1 })
  39761. case 1 : p = self.alloc("VCVTTPS2DQ", 3, Operands { v0, v1, vv[0] })
  39762. default : panic("instruction VCVTTPS2DQ takes 2 or 3 operands")
  39763. }
  39764. // VCVTTPS2DQ xmm, xmm
  39765. if len(vv) == 0 && isXMM(v0) && isXMM(v1) {
  39766. self.require(ISA_AVX)
  39767. p.domain = DomainAVX
  39768. p.add(0, func(m *_Encoding, v []interface{}) {
  39769. m.vex2(2, hcode(v[1]), v[0], 0)
  39770. m.emit(0x5b)
  39771. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39772. })
  39773. }
  39774. // VCVTTPS2DQ m128, xmm
  39775. if len(vv) == 0 && isM128(v0) && isXMM(v1) {
  39776. self.require(ISA_AVX)
  39777. p.domain = DomainAVX
  39778. p.add(0, func(m *_Encoding, v []interface{}) {
  39779. m.vex2(2, hcode(v[1]), addr(v[0]), 0)
  39780. m.emit(0x5b)
  39781. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  39782. })
  39783. }
  39784. // VCVTTPS2DQ ymm, ymm
  39785. if len(vv) == 0 && isYMM(v0) && isYMM(v1) {
  39786. self.require(ISA_AVX)
  39787. p.domain = DomainAVX
  39788. p.add(0, func(m *_Encoding, v []interface{}) {
  39789. m.vex2(6, hcode(v[1]), v[0], 0)
  39790. m.emit(0x5b)
  39791. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39792. })
  39793. }
  39794. // VCVTTPS2DQ m256, ymm
  39795. if len(vv) == 0 && isM256(v0) && isYMM(v1) {
  39796. self.require(ISA_AVX)
  39797. p.domain = DomainAVX
  39798. p.add(0, func(m *_Encoding, v []interface{}) {
  39799. m.vex2(6, hcode(v[1]), addr(v[0]), 0)
  39800. m.emit(0x5b)
  39801. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  39802. })
  39803. }
  39804. // VCVTTPS2DQ m512/m32bcst, zmm{k}{z}
  39805. if len(vv) == 0 && isM512M32bcst(v0) && isZMMkz(v1) {
  39806. self.require(ISA_AVX512F)
  39807. p.domain = DomainAVX
  39808. p.add(0, func(m *_Encoding, v []interface{}) {
  39809. m.evex(0b01, 0x06, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  39810. m.emit(0x5b)
  39811. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  39812. })
  39813. }
  39814. // VCVTTPS2DQ {sae}, zmm, zmm{k}{z}
  39815. if len(vv) == 1 && isSAE(v0) && isZMM(v1) && isZMMkz(vv[0]) {
  39816. self.require(ISA_AVX512F)
  39817. p.domain = DomainAVX
  39818. p.add(0, func(m *_Encoding, v []interface{}) {
  39819. m.emit(0x62)
  39820. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  39821. m.emit(0x7e)
  39822. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x18)
  39823. m.emit(0x5b)
  39824. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  39825. })
  39826. }
  39827. // VCVTTPS2DQ zmm, zmm{k}{z}
  39828. if len(vv) == 0 && isZMM(v0) && isZMMkz(v1) {
  39829. self.require(ISA_AVX512F)
  39830. p.domain = DomainAVX
  39831. p.add(0, func(m *_Encoding, v []interface{}) {
  39832. m.emit(0x62)
  39833. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  39834. m.emit(0x7e)
  39835. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  39836. m.emit(0x5b)
  39837. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39838. })
  39839. }
  39840. // VCVTTPS2DQ m128/m32bcst, xmm{k}{z}
  39841. if len(vv) == 0 && isM128M32bcst(v0) && isXMMkz(v1) {
  39842. self.require(ISA_AVX512VL | ISA_AVX512F)
  39843. p.domain = DomainAVX
  39844. p.add(0, func(m *_Encoding, v []interface{}) {
  39845. m.evex(0b01, 0x06, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  39846. m.emit(0x5b)
  39847. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  39848. })
  39849. }
  39850. // VCVTTPS2DQ m256/m32bcst, ymm{k}{z}
  39851. if len(vv) == 0 && isM256M32bcst(v0) && isYMMkz(v1) {
  39852. self.require(ISA_AVX512VL | ISA_AVX512F)
  39853. p.domain = DomainAVX
  39854. p.add(0, func(m *_Encoding, v []interface{}) {
  39855. m.evex(0b01, 0x06, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  39856. m.emit(0x5b)
  39857. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  39858. })
  39859. }
  39860. // VCVTTPS2DQ xmm, xmm{k}{z}
  39861. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  39862. self.require(ISA_AVX512VL | ISA_AVX512F)
  39863. p.domain = DomainAVX
  39864. p.add(0, func(m *_Encoding, v []interface{}) {
  39865. m.emit(0x62)
  39866. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  39867. m.emit(0x7e)
  39868. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  39869. m.emit(0x5b)
  39870. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39871. })
  39872. }
  39873. // VCVTTPS2DQ ymm, ymm{k}{z}
  39874. if len(vv) == 0 && isEVEXYMM(v0) && isYMMkz(v1) {
  39875. self.require(ISA_AVX512VL | ISA_AVX512F)
  39876. p.domain = DomainAVX
  39877. p.add(0, func(m *_Encoding, v []interface{}) {
  39878. m.emit(0x62)
  39879. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  39880. m.emit(0x7e)
  39881. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  39882. m.emit(0x5b)
  39883. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39884. })
  39885. }
  39886. if p.len == 0 {
  39887. panic("invalid operands for VCVTTPS2DQ")
  39888. }
  39889. return p
  39890. }
  39891. // VCVTTPS2QQ performs "Convert with Truncation Packed Single Precision Floating-Point Values to Packed Singed Quadword Integer Values".
  39892. //
  39893. // Mnemonic : VCVTTPS2QQ
  39894. // Supported forms : (7 forms)
  39895. //
  39896. // * VCVTTPS2QQ m256/m32bcst, zmm{k}{z} [AVX512DQ]
  39897. // * VCVTTPS2QQ {sae}, ymm, zmm{k}{z} [AVX512DQ]
  39898. // * VCVTTPS2QQ ymm, zmm{k}{z} [AVX512DQ]
  39899. // * VCVTTPS2QQ m64/m32bcst, xmm{k}{z} [AVX512DQ,AVX512VL]
  39900. // * VCVTTPS2QQ m128/m32bcst, ymm{k}{z} [AVX512DQ,AVX512VL]
  39901. // * VCVTTPS2QQ xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  39902. // * VCVTTPS2QQ xmm, ymm{k}{z} [AVX512DQ,AVX512VL]
  39903. //
  39904. func (self *Program) VCVTTPS2QQ(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  39905. var p *Instruction
  39906. switch len(vv) {
  39907. case 0 : p = self.alloc("VCVTTPS2QQ", 2, Operands { v0, v1 })
  39908. case 1 : p = self.alloc("VCVTTPS2QQ", 3, Operands { v0, v1, vv[0] })
  39909. default : panic("instruction VCVTTPS2QQ takes 2 or 3 operands")
  39910. }
  39911. // VCVTTPS2QQ m256/m32bcst, zmm{k}{z}
  39912. if len(vv) == 0 && isM256M32bcst(v0) && isZMMkz(v1) {
  39913. self.require(ISA_AVX512DQ)
  39914. p.domain = DomainAVX
  39915. p.add(0, func(m *_Encoding, v []interface{}) {
  39916. m.evex(0b01, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  39917. m.emit(0x7a)
  39918. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  39919. })
  39920. }
  39921. // VCVTTPS2QQ {sae}, ymm, zmm{k}{z}
  39922. if len(vv) == 1 && isSAE(v0) && isEVEXYMM(v1) && isZMMkz(vv[0]) {
  39923. self.require(ISA_AVX512DQ)
  39924. p.domain = DomainAVX
  39925. p.add(0, func(m *_Encoding, v []interface{}) {
  39926. m.emit(0x62)
  39927. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  39928. m.emit(0x7d)
  39929. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x18)
  39930. m.emit(0x7a)
  39931. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  39932. })
  39933. }
  39934. // VCVTTPS2QQ ymm, zmm{k}{z}
  39935. if len(vv) == 0 && isEVEXYMM(v0) && isZMMkz(v1) {
  39936. self.require(ISA_AVX512DQ)
  39937. p.domain = DomainAVX
  39938. p.add(0, func(m *_Encoding, v []interface{}) {
  39939. m.emit(0x62)
  39940. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  39941. m.emit(0x7d)
  39942. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  39943. m.emit(0x7a)
  39944. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39945. })
  39946. }
  39947. // VCVTTPS2QQ m64/m32bcst, xmm{k}{z}
  39948. if len(vv) == 0 && isM64M32bcst(v0) && isXMMkz(v1) {
  39949. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  39950. p.domain = DomainAVX
  39951. p.add(0, func(m *_Encoding, v []interface{}) {
  39952. m.evex(0b01, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  39953. m.emit(0x7a)
  39954. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  39955. })
  39956. }
  39957. // VCVTTPS2QQ m128/m32bcst, ymm{k}{z}
  39958. if len(vv) == 0 && isM128M32bcst(v0) && isYMMkz(v1) {
  39959. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  39960. p.domain = DomainAVX
  39961. p.add(0, func(m *_Encoding, v []interface{}) {
  39962. m.evex(0b01, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  39963. m.emit(0x7a)
  39964. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  39965. })
  39966. }
  39967. // VCVTTPS2QQ xmm, xmm{k}{z}
  39968. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  39969. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  39970. p.domain = DomainAVX
  39971. p.add(0, func(m *_Encoding, v []interface{}) {
  39972. m.emit(0x62)
  39973. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  39974. m.emit(0x7d)
  39975. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  39976. m.emit(0x7a)
  39977. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39978. })
  39979. }
  39980. // VCVTTPS2QQ xmm, ymm{k}{z}
  39981. if len(vv) == 0 && isEVEXXMM(v0) && isYMMkz(v1) {
  39982. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  39983. p.domain = DomainAVX
  39984. p.add(0, func(m *_Encoding, v []interface{}) {
  39985. m.emit(0x62)
  39986. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  39987. m.emit(0x7d)
  39988. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  39989. m.emit(0x7a)
  39990. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  39991. })
  39992. }
  39993. if p.len == 0 {
  39994. panic("invalid operands for VCVTTPS2QQ")
  39995. }
  39996. return p
  39997. }
  39998. // VCVTTPS2UDQ performs "Convert with Truncation Packed Single-Precision Floating-Point Values to Packed Unsigned Doubleword Integer Values".
  39999. //
  40000. // Mnemonic : VCVTTPS2UDQ
  40001. // Supported forms : (7 forms)
  40002. //
  40003. // * VCVTTPS2UDQ m512/m32bcst, zmm{k}{z} [AVX512F]
  40004. // * VCVTTPS2UDQ {sae}, zmm, zmm{k}{z} [AVX512F]
  40005. // * VCVTTPS2UDQ zmm, zmm{k}{z} [AVX512F]
  40006. // * VCVTTPS2UDQ m128/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  40007. // * VCVTTPS2UDQ m256/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  40008. // * VCVTTPS2UDQ xmm, xmm{k}{z} [AVX512F,AVX512VL]
  40009. // * VCVTTPS2UDQ ymm, ymm{k}{z} [AVX512F,AVX512VL]
  40010. //
  40011. func (self *Program) VCVTTPS2UDQ(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  40012. var p *Instruction
  40013. switch len(vv) {
  40014. case 0 : p = self.alloc("VCVTTPS2UDQ", 2, Operands { v0, v1 })
  40015. case 1 : p = self.alloc("VCVTTPS2UDQ", 3, Operands { v0, v1, vv[0] })
  40016. default : panic("instruction VCVTTPS2UDQ takes 2 or 3 operands")
  40017. }
  40018. // VCVTTPS2UDQ m512/m32bcst, zmm{k}{z}
  40019. if len(vv) == 0 && isM512M32bcst(v0) && isZMMkz(v1) {
  40020. self.require(ISA_AVX512F)
  40021. p.domain = DomainAVX
  40022. p.add(0, func(m *_Encoding, v []interface{}) {
  40023. m.evex(0b01, 0x04, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  40024. m.emit(0x78)
  40025. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  40026. })
  40027. }
  40028. // VCVTTPS2UDQ {sae}, zmm, zmm{k}{z}
  40029. if len(vv) == 1 && isSAE(v0) && isZMM(v1) && isZMMkz(vv[0]) {
  40030. self.require(ISA_AVX512F)
  40031. p.domain = DomainAVX
  40032. p.add(0, func(m *_Encoding, v []interface{}) {
  40033. m.emit(0x62)
  40034. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  40035. m.emit(0x7c)
  40036. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x18)
  40037. m.emit(0x78)
  40038. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  40039. })
  40040. }
  40041. // VCVTTPS2UDQ zmm, zmm{k}{z}
  40042. if len(vv) == 0 && isZMM(v0) && isZMMkz(v1) {
  40043. self.require(ISA_AVX512F)
  40044. p.domain = DomainAVX
  40045. p.add(0, func(m *_Encoding, v []interface{}) {
  40046. m.emit(0x62)
  40047. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40048. m.emit(0x7c)
  40049. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  40050. m.emit(0x78)
  40051. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40052. })
  40053. }
  40054. // VCVTTPS2UDQ m128/m32bcst, xmm{k}{z}
  40055. if len(vv) == 0 && isM128M32bcst(v0) && isXMMkz(v1) {
  40056. self.require(ISA_AVX512VL | ISA_AVX512F)
  40057. p.domain = DomainAVX
  40058. p.add(0, func(m *_Encoding, v []interface{}) {
  40059. m.evex(0b01, 0x04, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  40060. m.emit(0x78)
  40061. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  40062. })
  40063. }
  40064. // VCVTTPS2UDQ m256/m32bcst, ymm{k}{z}
  40065. if len(vv) == 0 && isM256M32bcst(v0) && isYMMkz(v1) {
  40066. self.require(ISA_AVX512VL | ISA_AVX512F)
  40067. p.domain = DomainAVX
  40068. p.add(0, func(m *_Encoding, v []interface{}) {
  40069. m.evex(0b01, 0x04, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  40070. m.emit(0x78)
  40071. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  40072. })
  40073. }
  40074. // VCVTTPS2UDQ xmm, xmm{k}{z}
  40075. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  40076. self.require(ISA_AVX512VL | ISA_AVX512F)
  40077. p.domain = DomainAVX
  40078. p.add(0, func(m *_Encoding, v []interface{}) {
  40079. m.emit(0x62)
  40080. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40081. m.emit(0x7c)
  40082. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  40083. m.emit(0x78)
  40084. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40085. })
  40086. }
  40087. // VCVTTPS2UDQ ymm, ymm{k}{z}
  40088. if len(vv) == 0 && isEVEXYMM(v0) && isYMMkz(v1) {
  40089. self.require(ISA_AVX512VL | ISA_AVX512F)
  40090. p.domain = DomainAVX
  40091. p.add(0, func(m *_Encoding, v []interface{}) {
  40092. m.emit(0x62)
  40093. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40094. m.emit(0x7c)
  40095. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  40096. m.emit(0x78)
  40097. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40098. })
  40099. }
  40100. if p.len == 0 {
  40101. panic("invalid operands for VCVTTPS2UDQ")
  40102. }
  40103. return p
  40104. }
  40105. // VCVTTPS2UQQ performs "Convert with Truncation Packed Single Precision Floating-Point Values to Packed Unsigned Quadword Integer Values".
  40106. //
  40107. // Mnemonic : VCVTTPS2UQQ
  40108. // Supported forms : (7 forms)
  40109. //
  40110. // * VCVTTPS2UQQ m256/m32bcst, zmm{k}{z} [AVX512DQ]
  40111. // * VCVTTPS2UQQ {sae}, ymm, zmm{k}{z} [AVX512DQ]
  40112. // * VCVTTPS2UQQ ymm, zmm{k}{z} [AVX512DQ]
  40113. // * VCVTTPS2UQQ m64/m32bcst, xmm{k}{z} [AVX512DQ,AVX512VL]
  40114. // * VCVTTPS2UQQ m128/m32bcst, ymm{k}{z} [AVX512DQ,AVX512VL]
  40115. // * VCVTTPS2UQQ xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  40116. // * VCVTTPS2UQQ xmm, ymm{k}{z} [AVX512DQ,AVX512VL]
  40117. //
  40118. func (self *Program) VCVTTPS2UQQ(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  40119. var p *Instruction
  40120. switch len(vv) {
  40121. case 0 : p = self.alloc("VCVTTPS2UQQ", 2, Operands { v0, v1 })
  40122. case 1 : p = self.alloc("VCVTTPS2UQQ", 3, Operands { v0, v1, vv[0] })
  40123. default : panic("instruction VCVTTPS2UQQ takes 2 or 3 operands")
  40124. }
  40125. // VCVTTPS2UQQ m256/m32bcst, zmm{k}{z}
  40126. if len(vv) == 0 && isM256M32bcst(v0) && isZMMkz(v1) {
  40127. self.require(ISA_AVX512DQ)
  40128. p.domain = DomainAVX
  40129. p.add(0, func(m *_Encoding, v []interface{}) {
  40130. m.evex(0b01, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  40131. m.emit(0x78)
  40132. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  40133. })
  40134. }
  40135. // VCVTTPS2UQQ {sae}, ymm, zmm{k}{z}
  40136. if len(vv) == 1 && isSAE(v0) && isEVEXYMM(v1) && isZMMkz(vv[0]) {
  40137. self.require(ISA_AVX512DQ)
  40138. p.domain = DomainAVX
  40139. p.add(0, func(m *_Encoding, v []interface{}) {
  40140. m.emit(0x62)
  40141. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  40142. m.emit(0x7d)
  40143. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x18)
  40144. m.emit(0x78)
  40145. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  40146. })
  40147. }
  40148. // VCVTTPS2UQQ ymm, zmm{k}{z}
  40149. if len(vv) == 0 && isEVEXYMM(v0) && isZMMkz(v1) {
  40150. self.require(ISA_AVX512DQ)
  40151. p.domain = DomainAVX
  40152. p.add(0, func(m *_Encoding, v []interface{}) {
  40153. m.emit(0x62)
  40154. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40155. m.emit(0x7d)
  40156. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  40157. m.emit(0x78)
  40158. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40159. })
  40160. }
  40161. // VCVTTPS2UQQ m64/m32bcst, xmm{k}{z}
  40162. if len(vv) == 0 && isM64M32bcst(v0) && isXMMkz(v1) {
  40163. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  40164. p.domain = DomainAVX
  40165. p.add(0, func(m *_Encoding, v []interface{}) {
  40166. m.evex(0b01, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  40167. m.emit(0x78)
  40168. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  40169. })
  40170. }
  40171. // VCVTTPS2UQQ m128/m32bcst, ymm{k}{z}
  40172. if len(vv) == 0 && isM128M32bcst(v0) && isYMMkz(v1) {
  40173. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  40174. p.domain = DomainAVX
  40175. p.add(0, func(m *_Encoding, v []interface{}) {
  40176. m.evex(0b01, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  40177. m.emit(0x78)
  40178. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  40179. })
  40180. }
  40181. // VCVTTPS2UQQ xmm, xmm{k}{z}
  40182. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  40183. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  40184. p.domain = DomainAVX
  40185. p.add(0, func(m *_Encoding, v []interface{}) {
  40186. m.emit(0x62)
  40187. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40188. m.emit(0x7d)
  40189. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  40190. m.emit(0x78)
  40191. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40192. })
  40193. }
  40194. // VCVTTPS2UQQ xmm, ymm{k}{z}
  40195. if len(vv) == 0 && isEVEXXMM(v0) && isYMMkz(v1) {
  40196. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  40197. p.domain = DomainAVX
  40198. p.add(0, func(m *_Encoding, v []interface{}) {
  40199. m.emit(0x62)
  40200. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40201. m.emit(0x7d)
  40202. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  40203. m.emit(0x78)
  40204. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40205. })
  40206. }
  40207. if p.len == 0 {
  40208. panic("invalid operands for VCVTTPS2UQQ")
  40209. }
  40210. return p
  40211. }
  40212. // VCVTTSD2SI performs "Convert with Truncation Scalar Double-Precision FP Value to Signed Integer".
  40213. //
  40214. // Mnemonic : VCVTTSD2SI
  40215. // Supported forms : (10 forms)
  40216. //
  40217. // * VCVTTSD2SI xmm, r32 [AVX]
  40218. // * VCVTTSD2SI m64, r32 [AVX]
  40219. // * VCVTTSD2SI xmm, r64 [AVX]
  40220. // * VCVTTSD2SI m64, r64 [AVX]
  40221. // * VCVTTSD2SI m64, r32 [AVX512F]
  40222. // * VCVTTSD2SI m64, r64 [AVX512F]
  40223. // * VCVTTSD2SI {sae}, xmm, r32 [AVX512F]
  40224. // * VCVTTSD2SI {sae}, xmm, r64 [AVX512F]
  40225. // * VCVTTSD2SI xmm, r32 [AVX512F]
  40226. // * VCVTTSD2SI xmm, r64 [AVX512F]
  40227. //
  40228. func (self *Program) VCVTTSD2SI(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  40229. var p *Instruction
  40230. switch len(vv) {
  40231. case 0 : p = self.alloc("VCVTTSD2SI", 2, Operands { v0, v1 })
  40232. case 1 : p = self.alloc("VCVTTSD2SI", 3, Operands { v0, v1, vv[0] })
  40233. default : panic("instruction VCVTTSD2SI takes 2 or 3 operands")
  40234. }
  40235. // VCVTTSD2SI xmm, r32
  40236. if len(vv) == 0 && isXMM(v0) && isReg32(v1) {
  40237. self.require(ISA_AVX)
  40238. p.domain = DomainAVX
  40239. p.add(0, func(m *_Encoding, v []interface{}) {
  40240. m.vex2(3, hcode(v[1]), v[0], 0)
  40241. m.emit(0x2c)
  40242. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40243. })
  40244. }
  40245. // VCVTTSD2SI m64, r32
  40246. if len(vv) == 0 && isM64(v0) && isReg32(v1) {
  40247. self.require(ISA_AVX)
  40248. p.domain = DomainAVX
  40249. p.add(0, func(m *_Encoding, v []interface{}) {
  40250. m.vex2(3, hcode(v[1]), addr(v[0]), 0)
  40251. m.emit(0x2c)
  40252. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  40253. })
  40254. }
  40255. // VCVTTSD2SI xmm, r64
  40256. if len(vv) == 0 && isXMM(v0) && isReg64(v1) {
  40257. self.require(ISA_AVX)
  40258. p.domain = DomainAVX
  40259. p.add(0, func(m *_Encoding, v []interface{}) {
  40260. m.emit(0xc4)
  40261. m.emit(0xe1 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  40262. m.emit(0xfb)
  40263. m.emit(0x2c)
  40264. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40265. })
  40266. }
  40267. // VCVTTSD2SI m64, r64
  40268. if len(vv) == 0 && isM64(v0) && isReg64(v1) {
  40269. self.require(ISA_AVX)
  40270. p.domain = DomainAVX
  40271. p.add(0, func(m *_Encoding, v []interface{}) {
  40272. m.vex3(0xc4, 0b1, 0x83, hcode(v[1]), addr(v[0]), 0)
  40273. m.emit(0x2c)
  40274. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  40275. })
  40276. }
  40277. // VCVTTSD2SI m64, r32
  40278. if len(vv) == 0 && isM64(v0) && isReg32(v1) {
  40279. self.require(ISA_AVX512F)
  40280. p.domain = DomainAVX
  40281. p.add(0, func(m *_Encoding, v []interface{}) {
  40282. m.evex(0b01, 0x07, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  40283. m.emit(0x2c)
  40284. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  40285. })
  40286. }
  40287. // VCVTTSD2SI m64, r64
  40288. if len(vv) == 0 && isM64(v0) && isReg64(v1) {
  40289. self.require(ISA_AVX512F)
  40290. p.domain = DomainAVX
  40291. p.add(0, func(m *_Encoding, v []interface{}) {
  40292. m.evex(0b01, 0x87, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  40293. m.emit(0x2c)
  40294. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  40295. })
  40296. }
  40297. // VCVTTSD2SI {sae}, xmm, r32
  40298. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isReg32(vv[0]) {
  40299. self.require(ISA_AVX512F)
  40300. p.domain = DomainAVX
  40301. p.add(0, func(m *_Encoding, v []interface{}) {
  40302. m.emit(0x62)
  40303. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  40304. m.emit(0x7f)
  40305. m.emit(0x18)
  40306. m.emit(0x2c)
  40307. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  40308. })
  40309. }
  40310. // VCVTTSD2SI {sae}, xmm, r64
  40311. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isReg64(vv[0]) {
  40312. self.require(ISA_AVX512F)
  40313. p.domain = DomainAVX
  40314. p.add(0, func(m *_Encoding, v []interface{}) {
  40315. m.emit(0x62)
  40316. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  40317. m.emit(0xff)
  40318. m.emit(0x18)
  40319. m.emit(0x2c)
  40320. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  40321. })
  40322. }
  40323. // VCVTTSD2SI xmm, r32
  40324. if len(vv) == 0 && isEVEXXMM(v0) && isReg32(v1) {
  40325. self.require(ISA_AVX512F)
  40326. p.domain = DomainAVX
  40327. p.add(0, func(m *_Encoding, v []interface{}) {
  40328. m.emit(0x62)
  40329. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40330. m.emit(0x7f)
  40331. m.emit(0x48)
  40332. m.emit(0x2c)
  40333. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40334. })
  40335. }
  40336. // VCVTTSD2SI xmm, r64
  40337. if len(vv) == 0 && isEVEXXMM(v0) && isReg64(v1) {
  40338. self.require(ISA_AVX512F)
  40339. p.domain = DomainAVX
  40340. p.add(0, func(m *_Encoding, v []interface{}) {
  40341. m.emit(0x62)
  40342. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40343. m.emit(0xff)
  40344. m.emit(0x48)
  40345. m.emit(0x2c)
  40346. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40347. })
  40348. }
  40349. if p.len == 0 {
  40350. panic("invalid operands for VCVTTSD2SI")
  40351. }
  40352. return p
  40353. }
  40354. // VCVTTSD2USI performs "Convert with Truncation Scalar Double-Precision Floating-Point Value to Unsigned Integer".
  40355. //
  40356. // Mnemonic : VCVTTSD2USI
  40357. // Supported forms : (6 forms)
  40358. //
  40359. // * VCVTTSD2USI m64, r32 [AVX512F]
  40360. // * VCVTTSD2USI m64, r64 [AVX512F]
  40361. // * VCVTTSD2USI {sae}, xmm, r32 [AVX512F]
  40362. // * VCVTTSD2USI {sae}, xmm, r64 [AVX512F]
  40363. // * VCVTTSD2USI xmm, r32 [AVX512F]
  40364. // * VCVTTSD2USI xmm, r64 [AVX512F]
  40365. //
  40366. func (self *Program) VCVTTSD2USI(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  40367. var p *Instruction
  40368. switch len(vv) {
  40369. case 0 : p = self.alloc("VCVTTSD2USI", 2, Operands { v0, v1 })
  40370. case 1 : p = self.alloc("VCVTTSD2USI", 3, Operands { v0, v1, vv[0] })
  40371. default : panic("instruction VCVTTSD2USI takes 2 or 3 operands")
  40372. }
  40373. // VCVTTSD2USI m64, r32
  40374. if len(vv) == 0 && isM64(v0) && isReg32(v1) {
  40375. self.require(ISA_AVX512F)
  40376. p.domain = DomainAVX
  40377. p.add(0, func(m *_Encoding, v []interface{}) {
  40378. m.evex(0b01, 0x07, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  40379. m.emit(0x78)
  40380. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  40381. })
  40382. }
  40383. // VCVTTSD2USI m64, r64
  40384. if len(vv) == 0 && isM64(v0) && isReg64(v1) {
  40385. self.require(ISA_AVX512F)
  40386. p.domain = DomainAVX
  40387. p.add(0, func(m *_Encoding, v []interface{}) {
  40388. m.evex(0b01, 0x87, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  40389. m.emit(0x78)
  40390. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  40391. })
  40392. }
  40393. // VCVTTSD2USI {sae}, xmm, r32
  40394. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isReg32(vv[0]) {
  40395. self.require(ISA_AVX512F)
  40396. p.domain = DomainAVX
  40397. p.add(0, func(m *_Encoding, v []interface{}) {
  40398. m.emit(0x62)
  40399. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  40400. m.emit(0x7f)
  40401. m.emit(0x18)
  40402. m.emit(0x78)
  40403. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  40404. })
  40405. }
  40406. // VCVTTSD2USI {sae}, xmm, r64
  40407. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isReg64(vv[0]) {
  40408. self.require(ISA_AVX512F)
  40409. p.domain = DomainAVX
  40410. p.add(0, func(m *_Encoding, v []interface{}) {
  40411. m.emit(0x62)
  40412. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  40413. m.emit(0xff)
  40414. m.emit(0x18)
  40415. m.emit(0x78)
  40416. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  40417. })
  40418. }
  40419. // VCVTTSD2USI xmm, r32
  40420. if len(vv) == 0 && isEVEXXMM(v0) && isReg32(v1) {
  40421. self.require(ISA_AVX512F)
  40422. p.domain = DomainAVX
  40423. p.add(0, func(m *_Encoding, v []interface{}) {
  40424. m.emit(0x62)
  40425. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40426. m.emit(0x7f)
  40427. m.emit(0x48)
  40428. m.emit(0x78)
  40429. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40430. })
  40431. }
  40432. // VCVTTSD2USI xmm, r64
  40433. if len(vv) == 0 && isEVEXXMM(v0) && isReg64(v1) {
  40434. self.require(ISA_AVX512F)
  40435. p.domain = DomainAVX
  40436. p.add(0, func(m *_Encoding, v []interface{}) {
  40437. m.emit(0x62)
  40438. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40439. m.emit(0xff)
  40440. m.emit(0x48)
  40441. m.emit(0x78)
  40442. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40443. })
  40444. }
  40445. if p.len == 0 {
  40446. panic("invalid operands for VCVTTSD2USI")
  40447. }
  40448. return p
  40449. }
  40450. // VCVTTSS2SI performs "Convert with Truncation Scalar Single-Precision FP Value to Dword Integer".
  40451. //
  40452. // Mnemonic : VCVTTSS2SI
  40453. // Supported forms : (10 forms)
  40454. //
  40455. // * VCVTTSS2SI xmm, r32 [AVX]
  40456. // * VCVTTSS2SI m32, r32 [AVX]
  40457. // * VCVTTSS2SI xmm, r64 [AVX]
  40458. // * VCVTTSS2SI m32, r64 [AVX]
  40459. // * VCVTTSS2SI m32, r32 [AVX512F]
  40460. // * VCVTTSS2SI m32, r64 [AVX512F]
  40461. // * VCVTTSS2SI {sae}, xmm, r32 [AVX512F]
  40462. // * VCVTTSS2SI {sae}, xmm, r64 [AVX512F]
  40463. // * VCVTTSS2SI xmm, r32 [AVX512F]
  40464. // * VCVTTSS2SI xmm, r64 [AVX512F]
  40465. //
  40466. func (self *Program) VCVTTSS2SI(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  40467. var p *Instruction
  40468. switch len(vv) {
  40469. case 0 : p = self.alloc("VCVTTSS2SI", 2, Operands { v0, v1 })
  40470. case 1 : p = self.alloc("VCVTTSS2SI", 3, Operands { v0, v1, vv[0] })
  40471. default : panic("instruction VCVTTSS2SI takes 2 or 3 operands")
  40472. }
  40473. // VCVTTSS2SI xmm, r32
  40474. if len(vv) == 0 && isXMM(v0) && isReg32(v1) {
  40475. self.require(ISA_AVX)
  40476. p.domain = DomainAVX
  40477. p.add(0, func(m *_Encoding, v []interface{}) {
  40478. m.vex2(2, hcode(v[1]), v[0], 0)
  40479. m.emit(0x2c)
  40480. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40481. })
  40482. }
  40483. // VCVTTSS2SI m32, r32
  40484. if len(vv) == 0 && isM32(v0) && isReg32(v1) {
  40485. self.require(ISA_AVX)
  40486. p.domain = DomainAVX
  40487. p.add(0, func(m *_Encoding, v []interface{}) {
  40488. m.vex2(2, hcode(v[1]), addr(v[0]), 0)
  40489. m.emit(0x2c)
  40490. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  40491. })
  40492. }
  40493. // VCVTTSS2SI xmm, r64
  40494. if len(vv) == 0 && isXMM(v0) && isReg64(v1) {
  40495. self.require(ISA_AVX)
  40496. p.domain = DomainAVX
  40497. p.add(0, func(m *_Encoding, v []interface{}) {
  40498. m.emit(0xc4)
  40499. m.emit(0xe1 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  40500. m.emit(0xfa)
  40501. m.emit(0x2c)
  40502. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40503. })
  40504. }
  40505. // VCVTTSS2SI m32, r64
  40506. if len(vv) == 0 && isM32(v0) && isReg64(v1) {
  40507. self.require(ISA_AVX)
  40508. p.domain = DomainAVX
  40509. p.add(0, func(m *_Encoding, v []interface{}) {
  40510. m.vex3(0xc4, 0b1, 0x82, hcode(v[1]), addr(v[0]), 0)
  40511. m.emit(0x2c)
  40512. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  40513. })
  40514. }
  40515. // VCVTTSS2SI m32, r32
  40516. if len(vv) == 0 && isM32(v0) && isReg32(v1) {
  40517. self.require(ISA_AVX512F)
  40518. p.domain = DomainAVX
  40519. p.add(0, func(m *_Encoding, v []interface{}) {
  40520. m.evex(0b01, 0x06, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  40521. m.emit(0x2c)
  40522. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  40523. })
  40524. }
  40525. // VCVTTSS2SI m32, r64
  40526. if len(vv) == 0 && isM32(v0) && isReg64(v1) {
  40527. self.require(ISA_AVX512F)
  40528. p.domain = DomainAVX
  40529. p.add(0, func(m *_Encoding, v []interface{}) {
  40530. m.evex(0b01, 0x86, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  40531. m.emit(0x2c)
  40532. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  40533. })
  40534. }
  40535. // VCVTTSS2SI {sae}, xmm, r32
  40536. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isReg32(vv[0]) {
  40537. self.require(ISA_AVX512F)
  40538. p.domain = DomainAVX
  40539. p.add(0, func(m *_Encoding, v []interface{}) {
  40540. m.emit(0x62)
  40541. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  40542. m.emit(0x7e)
  40543. m.emit(0x18)
  40544. m.emit(0x2c)
  40545. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  40546. })
  40547. }
  40548. // VCVTTSS2SI {sae}, xmm, r64
  40549. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isReg64(vv[0]) {
  40550. self.require(ISA_AVX512F)
  40551. p.domain = DomainAVX
  40552. p.add(0, func(m *_Encoding, v []interface{}) {
  40553. m.emit(0x62)
  40554. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  40555. m.emit(0xfe)
  40556. m.emit(0x18)
  40557. m.emit(0x2c)
  40558. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  40559. })
  40560. }
  40561. // VCVTTSS2SI xmm, r32
  40562. if len(vv) == 0 && isEVEXXMM(v0) && isReg32(v1) {
  40563. self.require(ISA_AVX512F)
  40564. p.domain = DomainAVX
  40565. p.add(0, func(m *_Encoding, v []interface{}) {
  40566. m.emit(0x62)
  40567. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40568. m.emit(0x7e)
  40569. m.emit(0x48)
  40570. m.emit(0x2c)
  40571. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40572. })
  40573. }
  40574. // VCVTTSS2SI xmm, r64
  40575. if len(vv) == 0 && isEVEXXMM(v0) && isReg64(v1) {
  40576. self.require(ISA_AVX512F)
  40577. p.domain = DomainAVX
  40578. p.add(0, func(m *_Encoding, v []interface{}) {
  40579. m.emit(0x62)
  40580. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40581. m.emit(0xfe)
  40582. m.emit(0x48)
  40583. m.emit(0x2c)
  40584. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40585. })
  40586. }
  40587. if p.len == 0 {
  40588. panic("invalid operands for VCVTTSS2SI")
  40589. }
  40590. return p
  40591. }
  40592. // VCVTTSS2USI performs "Convert with Truncation Scalar Single-Precision Floating-Point Value to Unsigned Integer".
  40593. //
  40594. // Mnemonic : VCVTTSS2USI
  40595. // Supported forms : (6 forms)
  40596. //
  40597. // * VCVTTSS2USI m32, r32 [AVX512F]
  40598. // * VCVTTSS2USI m32, r64 [AVX512F]
  40599. // * VCVTTSS2USI {sae}, xmm, r32 [AVX512F]
  40600. // * VCVTTSS2USI {sae}, xmm, r64 [AVX512F]
  40601. // * VCVTTSS2USI xmm, r32 [AVX512F]
  40602. // * VCVTTSS2USI xmm, r64 [AVX512F]
  40603. //
  40604. func (self *Program) VCVTTSS2USI(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  40605. var p *Instruction
  40606. switch len(vv) {
  40607. case 0 : p = self.alloc("VCVTTSS2USI", 2, Operands { v0, v1 })
  40608. case 1 : p = self.alloc("VCVTTSS2USI", 3, Operands { v0, v1, vv[0] })
  40609. default : panic("instruction VCVTTSS2USI takes 2 or 3 operands")
  40610. }
  40611. // VCVTTSS2USI m32, r32
  40612. if len(vv) == 0 && isM32(v0) && isReg32(v1) {
  40613. self.require(ISA_AVX512F)
  40614. p.domain = DomainAVX
  40615. p.add(0, func(m *_Encoding, v []interface{}) {
  40616. m.evex(0b01, 0x06, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  40617. m.emit(0x78)
  40618. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  40619. })
  40620. }
  40621. // VCVTTSS2USI m32, r64
  40622. if len(vv) == 0 && isM32(v0) && isReg64(v1) {
  40623. self.require(ISA_AVX512F)
  40624. p.domain = DomainAVX
  40625. p.add(0, func(m *_Encoding, v []interface{}) {
  40626. m.evex(0b01, 0x86, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  40627. m.emit(0x78)
  40628. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  40629. })
  40630. }
  40631. // VCVTTSS2USI {sae}, xmm, r32
  40632. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isReg32(vv[0]) {
  40633. self.require(ISA_AVX512F)
  40634. p.domain = DomainAVX
  40635. p.add(0, func(m *_Encoding, v []interface{}) {
  40636. m.emit(0x62)
  40637. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  40638. m.emit(0x7e)
  40639. m.emit(0x18)
  40640. m.emit(0x78)
  40641. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  40642. })
  40643. }
  40644. // VCVTTSS2USI {sae}, xmm, r64
  40645. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isReg64(vv[0]) {
  40646. self.require(ISA_AVX512F)
  40647. p.domain = DomainAVX
  40648. p.add(0, func(m *_Encoding, v []interface{}) {
  40649. m.emit(0x62)
  40650. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  40651. m.emit(0xfe)
  40652. m.emit(0x18)
  40653. m.emit(0x78)
  40654. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  40655. })
  40656. }
  40657. // VCVTTSS2USI xmm, r32
  40658. if len(vv) == 0 && isEVEXXMM(v0) && isReg32(v1) {
  40659. self.require(ISA_AVX512F)
  40660. p.domain = DomainAVX
  40661. p.add(0, func(m *_Encoding, v []interface{}) {
  40662. m.emit(0x62)
  40663. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40664. m.emit(0x7e)
  40665. m.emit(0x48)
  40666. m.emit(0x78)
  40667. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40668. })
  40669. }
  40670. // VCVTTSS2USI xmm, r64
  40671. if len(vv) == 0 && isEVEXXMM(v0) && isReg64(v1) {
  40672. self.require(ISA_AVX512F)
  40673. p.domain = DomainAVX
  40674. p.add(0, func(m *_Encoding, v []interface{}) {
  40675. m.emit(0x62)
  40676. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40677. m.emit(0xfe)
  40678. m.emit(0x48)
  40679. m.emit(0x78)
  40680. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40681. })
  40682. }
  40683. if p.len == 0 {
  40684. panic("invalid operands for VCVTTSS2USI")
  40685. }
  40686. return p
  40687. }
  40688. // VCVTUDQ2PD performs "Convert Packed Unsigned Doubleword Integers to Packed Double-Precision Floating-Point Values".
  40689. //
  40690. // Mnemonic : VCVTUDQ2PD
  40691. // Supported forms : (6 forms)
  40692. //
  40693. // * VCVTUDQ2PD m256/m32bcst, zmm{k}{z} [AVX512F]
  40694. // * VCVTUDQ2PD ymm, zmm{k}{z} [AVX512F]
  40695. // * VCVTUDQ2PD m64/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  40696. // * VCVTUDQ2PD m128/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  40697. // * VCVTUDQ2PD xmm, xmm{k}{z} [AVX512F,AVX512VL]
  40698. // * VCVTUDQ2PD xmm, ymm{k}{z} [AVX512F,AVX512VL]
  40699. //
  40700. func (self *Program) VCVTUDQ2PD(v0 interface{}, v1 interface{}) *Instruction {
  40701. p := self.alloc("VCVTUDQ2PD", 2, Operands { v0, v1 })
  40702. // VCVTUDQ2PD m256/m32bcst, zmm{k}{z}
  40703. if isM256M32bcst(v0) && isZMMkz(v1) {
  40704. self.require(ISA_AVX512F)
  40705. p.domain = DomainAVX
  40706. p.add(0, func(m *_Encoding, v []interface{}) {
  40707. m.evex(0b01, 0x06, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  40708. m.emit(0x7a)
  40709. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  40710. })
  40711. }
  40712. // VCVTUDQ2PD ymm, zmm{k}{z}
  40713. if isEVEXYMM(v0) && isZMMkz(v1) {
  40714. self.require(ISA_AVX512F)
  40715. p.domain = DomainAVX
  40716. p.add(0, func(m *_Encoding, v []interface{}) {
  40717. m.emit(0x62)
  40718. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40719. m.emit(0x7e)
  40720. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  40721. m.emit(0x7a)
  40722. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40723. })
  40724. }
  40725. // VCVTUDQ2PD m64/m32bcst, xmm{k}{z}
  40726. if isM64M32bcst(v0) && isXMMkz(v1) {
  40727. self.require(ISA_AVX512VL | ISA_AVX512F)
  40728. p.domain = DomainAVX
  40729. p.add(0, func(m *_Encoding, v []interface{}) {
  40730. m.evex(0b01, 0x06, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  40731. m.emit(0x7a)
  40732. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  40733. })
  40734. }
  40735. // VCVTUDQ2PD m128/m32bcst, ymm{k}{z}
  40736. if isM128M32bcst(v0) && isYMMkz(v1) {
  40737. self.require(ISA_AVX512VL | ISA_AVX512F)
  40738. p.domain = DomainAVX
  40739. p.add(0, func(m *_Encoding, v []interface{}) {
  40740. m.evex(0b01, 0x06, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  40741. m.emit(0x7a)
  40742. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  40743. })
  40744. }
  40745. // VCVTUDQ2PD xmm, xmm{k}{z}
  40746. if isEVEXXMM(v0) && isXMMkz(v1) {
  40747. self.require(ISA_AVX512VL | ISA_AVX512F)
  40748. p.domain = DomainAVX
  40749. p.add(0, func(m *_Encoding, v []interface{}) {
  40750. m.emit(0x62)
  40751. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40752. m.emit(0x7e)
  40753. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  40754. m.emit(0x7a)
  40755. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40756. })
  40757. }
  40758. // VCVTUDQ2PD xmm, ymm{k}{z}
  40759. if isEVEXXMM(v0) && isYMMkz(v1) {
  40760. self.require(ISA_AVX512VL | ISA_AVX512F)
  40761. p.domain = DomainAVX
  40762. p.add(0, func(m *_Encoding, v []interface{}) {
  40763. m.emit(0x62)
  40764. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40765. m.emit(0x7e)
  40766. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  40767. m.emit(0x7a)
  40768. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40769. })
  40770. }
  40771. if p.len == 0 {
  40772. panic("invalid operands for VCVTUDQ2PD")
  40773. }
  40774. return p
  40775. }
  40776. // VCVTUDQ2PS performs "Convert Packed Unsigned Doubleword Integers to Packed Single-Precision Floating-Point Values".
  40777. //
  40778. // Mnemonic : VCVTUDQ2PS
  40779. // Supported forms : (7 forms)
  40780. //
  40781. // * VCVTUDQ2PS m512/m32bcst, zmm{k}{z} [AVX512F]
  40782. // * VCVTUDQ2PS {er}, zmm, zmm{k}{z} [AVX512F]
  40783. // * VCVTUDQ2PS zmm, zmm{k}{z} [AVX512F]
  40784. // * VCVTUDQ2PS m128/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  40785. // * VCVTUDQ2PS m256/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  40786. // * VCVTUDQ2PS xmm, xmm{k}{z} [AVX512F,AVX512VL]
  40787. // * VCVTUDQ2PS ymm, ymm{k}{z} [AVX512F,AVX512VL]
  40788. //
  40789. func (self *Program) VCVTUDQ2PS(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  40790. var p *Instruction
  40791. switch len(vv) {
  40792. case 0 : p = self.alloc("VCVTUDQ2PS", 2, Operands { v0, v1 })
  40793. case 1 : p = self.alloc("VCVTUDQ2PS", 3, Operands { v0, v1, vv[0] })
  40794. default : panic("instruction VCVTUDQ2PS takes 2 or 3 operands")
  40795. }
  40796. // VCVTUDQ2PS m512/m32bcst, zmm{k}{z}
  40797. if len(vv) == 0 && isM512M32bcst(v0) && isZMMkz(v1) {
  40798. self.require(ISA_AVX512F)
  40799. p.domain = DomainAVX
  40800. p.add(0, func(m *_Encoding, v []interface{}) {
  40801. m.evex(0b01, 0x07, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  40802. m.emit(0x7a)
  40803. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  40804. })
  40805. }
  40806. // VCVTUDQ2PS {er}, zmm, zmm{k}{z}
  40807. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMMkz(vv[0]) {
  40808. self.require(ISA_AVX512F)
  40809. p.domain = DomainAVX
  40810. p.add(0, func(m *_Encoding, v []interface{}) {
  40811. m.emit(0x62)
  40812. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  40813. m.emit(0x7f)
  40814. m.emit((zcode(v[2]) << 7) | (vcode(v[0]) << 5) | kcode(v[2]) | 0x18)
  40815. m.emit(0x7a)
  40816. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  40817. })
  40818. }
  40819. // VCVTUDQ2PS zmm, zmm{k}{z}
  40820. if len(vv) == 0 && isZMM(v0) && isZMMkz(v1) {
  40821. self.require(ISA_AVX512F)
  40822. p.domain = DomainAVX
  40823. p.add(0, func(m *_Encoding, v []interface{}) {
  40824. m.emit(0x62)
  40825. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40826. m.emit(0x7f)
  40827. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  40828. m.emit(0x7a)
  40829. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40830. })
  40831. }
  40832. // VCVTUDQ2PS m128/m32bcst, xmm{k}{z}
  40833. if len(vv) == 0 && isM128M32bcst(v0) && isXMMkz(v1) {
  40834. self.require(ISA_AVX512VL | ISA_AVX512F)
  40835. p.domain = DomainAVX
  40836. p.add(0, func(m *_Encoding, v []interface{}) {
  40837. m.evex(0b01, 0x07, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  40838. m.emit(0x7a)
  40839. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  40840. })
  40841. }
  40842. // VCVTUDQ2PS m256/m32bcst, ymm{k}{z}
  40843. if len(vv) == 0 && isM256M32bcst(v0) && isYMMkz(v1) {
  40844. self.require(ISA_AVX512VL | ISA_AVX512F)
  40845. p.domain = DomainAVX
  40846. p.add(0, func(m *_Encoding, v []interface{}) {
  40847. m.evex(0b01, 0x07, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  40848. m.emit(0x7a)
  40849. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  40850. })
  40851. }
  40852. // VCVTUDQ2PS xmm, xmm{k}{z}
  40853. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  40854. self.require(ISA_AVX512VL | ISA_AVX512F)
  40855. p.domain = DomainAVX
  40856. p.add(0, func(m *_Encoding, v []interface{}) {
  40857. m.emit(0x62)
  40858. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40859. m.emit(0x7f)
  40860. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  40861. m.emit(0x7a)
  40862. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40863. })
  40864. }
  40865. // VCVTUDQ2PS ymm, ymm{k}{z}
  40866. if len(vv) == 0 && isEVEXYMM(v0) && isYMMkz(v1) {
  40867. self.require(ISA_AVX512VL | ISA_AVX512F)
  40868. p.domain = DomainAVX
  40869. p.add(0, func(m *_Encoding, v []interface{}) {
  40870. m.emit(0x62)
  40871. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40872. m.emit(0x7f)
  40873. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  40874. m.emit(0x7a)
  40875. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40876. })
  40877. }
  40878. if p.len == 0 {
  40879. panic("invalid operands for VCVTUDQ2PS")
  40880. }
  40881. return p
  40882. }
  40883. // VCVTUQQ2PD performs "Convert Packed Unsigned Quadword Integers to Packed Double-Precision Floating-Point Values".
  40884. //
  40885. // Mnemonic : VCVTUQQ2PD
  40886. // Supported forms : (7 forms)
  40887. //
  40888. // * VCVTUQQ2PD m512/m64bcst, zmm{k}{z} [AVX512DQ]
  40889. // * VCVTUQQ2PD {er}, zmm, zmm{k}{z} [AVX512DQ]
  40890. // * VCVTUQQ2PD zmm, zmm{k}{z} [AVX512DQ]
  40891. // * VCVTUQQ2PD m128/m64bcst, xmm{k}{z} [AVX512DQ,AVX512VL]
  40892. // * VCVTUQQ2PD m256/m64bcst, ymm{k}{z} [AVX512DQ,AVX512VL]
  40893. // * VCVTUQQ2PD xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  40894. // * VCVTUQQ2PD ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  40895. //
  40896. func (self *Program) VCVTUQQ2PD(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  40897. var p *Instruction
  40898. switch len(vv) {
  40899. case 0 : p = self.alloc("VCVTUQQ2PD", 2, Operands { v0, v1 })
  40900. case 1 : p = self.alloc("VCVTUQQ2PD", 3, Operands { v0, v1, vv[0] })
  40901. default : panic("instruction VCVTUQQ2PD takes 2 or 3 operands")
  40902. }
  40903. // VCVTUQQ2PD m512/m64bcst, zmm{k}{z}
  40904. if len(vv) == 0 && isM512M64bcst(v0) && isZMMkz(v1) {
  40905. self.require(ISA_AVX512DQ)
  40906. p.domain = DomainAVX
  40907. p.add(0, func(m *_Encoding, v []interface{}) {
  40908. m.evex(0b01, 0x86, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  40909. m.emit(0x7a)
  40910. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  40911. })
  40912. }
  40913. // VCVTUQQ2PD {er}, zmm, zmm{k}{z}
  40914. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMMkz(vv[0]) {
  40915. self.require(ISA_AVX512DQ)
  40916. p.domain = DomainAVX
  40917. p.add(0, func(m *_Encoding, v []interface{}) {
  40918. m.emit(0x62)
  40919. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  40920. m.emit(0xfe)
  40921. m.emit((zcode(v[2]) << 7) | (vcode(v[0]) << 5) | kcode(v[2]) | 0x18)
  40922. m.emit(0x7a)
  40923. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  40924. })
  40925. }
  40926. // VCVTUQQ2PD zmm, zmm{k}{z}
  40927. if len(vv) == 0 && isZMM(v0) && isZMMkz(v1) {
  40928. self.require(ISA_AVX512DQ)
  40929. p.domain = DomainAVX
  40930. p.add(0, func(m *_Encoding, v []interface{}) {
  40931. m.emit(0x62)
  40932. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40933. m.emit(0xfe)
  40934. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  40935. m.emit(0x7a)
  40936. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40937. })
  40938. }
  40939. // VCVTUQQ2PD m128/m64bcst, xmm{k}{z}
  40940. if len(vv) == 0 && isM128M64bcst(v0) && isXMMkz(v1) {
  40941. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  40942. p.domain = DomainAVX
  40943. p.add(0, func(m *_Encoding, v []interface{}) {
  40944. m.evex(0b01, 0x86, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  40945. m.emit(0x7a)
  40946. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  40947. })
  40948. }
  40949. // VCVTUQQ2PD m256/m64bcst, ymm{k}{z}
  40950. if len(vv) == 0 && isM256M64bcst(v0) && isYMMkz(v1) {
  40951. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  40952. p.domain = DomainAVX
  40953. p.add(0, func(m *_Encoding, v []interface{}) {
  40954. m.evex(0b01, 0x86, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  40955. m.emit(0x7a)
  40956. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  40957. })
  40958. }
  40959. // VCVTUQQ2PD xmm, xmm{k}{z}
  40960. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  40961. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  40962. p.domain = DomainAVX
  40963. p.add(0, func(m *_Encoding, v []interface{}) {
  40964. m.emit(0x62)
  40965. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40966. m.emit(0xfe)
  40967. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  40968. m.emit(0x7a)
  40969. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40970. })
  40971. }
  40972. // VCVTUQQ2PD ymm, ymm{k}{z}
  40973. if len(vv) == 0 && isEVEXYMM(v0) && isYMMkz(v1) {
  40974. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  40975. p.domain = DomainAVX
  40976. p.add(0, func(m *_Encoding, v []interface{}) {
  40977. m.emit(0x62)
  40978. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  40979. m.emit(0xfe)
  40980. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  40981. m.emit(0x7a)
  40982. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  40983. })
  40984. }
  40985. if p.len == 0 {
  40986. panic("invalid operands for VCVTUQQ2PD")
  40987. }
  40988. return p
  40989. }
  40990. // VCVTUQQ2PS performs "Convert Packed Unsigned Quadword Integers to Packed Single-Precision Floating-Point Values".
  40991. //
  40992. // Mnemonic : VCVTUQQ2PS
  40993. // Supported forms : (7 forms)
  40994. //
  40995. // * VCVTUQQ2PS m512/m64bcst, ymm{k}{z} [AVX512DQ]
  40996. // * VCVTUQQ2PS {er}, zmm, ymm{k}{z} [AVX512DQ]
  40997. // * VCVTUQQ2PS zmm, ymm{k}{z} [AVX512DQ]
  40998. // * VCVTUQQ2PS m128/m64bcst, xmm{k}{z} [AVX512DQ,AVX512VL]
  40999. // * VCVTUQQ2PS m256/m64bcst, xmm{k}{z} [AVX512DQ,AVX512VL]
  41000. // * VCVTUQQ2PS xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  41001. // * VCVTUQQ2PS ymm, xmm{k}{z} [AVX512DQ,AVX512VL]
  41002. //
  41003. func (self *Program) VCVTUQQ2PS(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  41004. var p *Instruction
  41005. switch len(vv) {
  41006. case 0 : p = self.alloc("VCVTUQQ2PS", 2, Operands { v0, v1 })
  41007. case 1 : p = self.alloc("VCVTUQQ2PS", 3, Operands { v0, v1, vv[0] })
  41008. default : panic("instruction VCVTUQQ2PS takes 2 or 3 operands")
  41009. }
  41010. // VCVTUQQ2PS m512/m64bcst, ymm{k}{z}
  41011. if len(vv) == 0 && isM512M64bcst(v0) && isYMMkz(v1) {
  41012. self.require(ISA_AVX512DQ)
  41013. p.domain = DomainAVX
  41014. p.add(0, func(m *_Encoding, v []interface{}) {
  41015. m.evex(0b01, 0x87, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  41016. m.emit(0x7a)
  41017. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  41018. })
  41019. }
  41020. // VCVTUQQ2PS {er}, zmm, ymm{k}{z}
  41021. if len(vv) == 1 && isER(v0) && isZMM(v1) && isYMMkz(vv[0]) {
  41022. self.require(ISA_AVX512DQ)
  41023. p.domain = DomainAVX
  41024. p.add(0, func(m *_Encoding, v []interface{}) {
  41025. m.emit(0x62)
  41026. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  41027. m.emit(0xff)
  41028. m.emit((zcode(v[2]) << 7) | (vcode(v[0]) << 5) | kcode(v[2]) | 0x18)
  41029. m.emit(0x7a)
  41030. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  41031. })
  41032. }
  41033. // VCVTUQQ2PS zmm, ymm{k}{z}
  41034. if len(vv) == 0 && isZMM(v0) && isYMMkz(v1) {
  41035. self.require(ISA_AVX512DQ)
  41036. p.domain = DomainAVX
  41037. p.add(0, func(m *_Encoding, v []interface{}) {
  41038. m.emit(0x62)
  41039. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  41040. m.emit(0xff)
  41041. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  41042. m.emit(0x7a)
  41043. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  41044. })
  41045. }
  41046. // VCVTUQQ2PS m128/m64bcst, xmm{k}{z}
  41047. if len(vv) == 0 && isM128M64bcst(v0) && isXMMkz(v1) {
  41048. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  41049. p.domain = DomainAVX
  41050. p.add(0, func(m *_Encoding, v []interface{}) {
  41051. m.evex(0b01, 0x87, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  41052. m.emit(0x7a)
  41053. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  41054. })
  41055. }
  41056. // VCVTUQQ2PS m256/m64bcst, xmm{k}{z}
  41057. if len(vv) == 0 && isM256M64bcst(v0) && isXMMkz(v1) {
  41058. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  41059. p.domain = DomainAVX
  41060. p.add(0, func(m *_Encoding, v []interface{}) {
  41061. m.evex(0b01, 0x87, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  41062. m.emit(0x7a)
  41063. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  41064. })
  41065. }
  41066. // VCVTUQQ2PS xmm, xmm{k}{z}
  41067. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  41068. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  41069. p.domain = DomainAVX
  41070. p.add(0, func(m *_Encoding, v []interface{}) {
  41071. m.emit(0x62)
  41072. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  41073. m.emit(0xff)
  41074. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  41075. m.emit(0x7a)
  41076. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  41077. })
  41078. }
  41079. // VCVTUQQ2PS ymm, xmm{k}{z}
  41080. if len(vv) == 0 && isEVEXYMM(v0) && isXMMkz(v1) {
  41081. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  41082. p.domain = DomainAVX
  41083. p.add(0, func(m *_Encoding, v []interface{}) {
  41084. m.emit(0x62)
  41085. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  41086. m.emit(0xff)
  41087. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  41088. m.emit(0x7a)
  41089. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  41090. })
  41091. }
  41092. if p.len == 0 {
  41093. panic("invalid operands for VCVTUQQ2PS")
  41094. }
  41095. return p
  41096. }
  41097. // VCVTUSI2SD performs "Convert Unsigned Integer to Scalar Double-Precision Floating-Point Value".
  41098. //
  41099. // Mnemonic : VCVTUSI2SD
  41100. // Supported forms : (5 forms)
  41101. //
  41102. // * VCVTUSI2SD r32, xmm, xmm [AVX512F]
  41103. // * VCVTUSI2SD m32, xmm, xmm [AVX512F]
  41104. // * VCVTUSI2SD m64, xmm, xmm [AVX512F]
  41105. // * VCVTUSI2SD {er}, r64, xmm, xmm [AVX512F]
  41106. // * VCVTUSI2SD r64, xmm, xmm [AVX512F]
  41107. //
  41108. func (self *Program) VCVTUSI2SD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  41109. var p *Instruction
  41110. switch len(vv) {
  41111. case 0 : p = self.alloc("VCVTUSI2SD", 3, Operands { v0, v1, v2 })
  41112. case 1 : p = self.alloc("VCVTUSI2SD", 4, Operands { v0, v1, v2, vv[0] })
  41113. default : panic("instruction VCVTUSI2SD takes 3 or 4 operands")
  41114. }
  41115. // VCVTUSI2SD r32, xmm, xmm
  41116. if len(vv) == 0 && isReg32(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) {
  41117. self.require(ISA_AVX512F)
  41118. p.domain = DomainAVX
  41119. p.add(0, func(m *_Encoding, v []interface{}) {
  41120. m.emit(0x62)
  41121. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  41122. m.emit(0x7f ^ (hlcode(v[1]) << 3))
  41123. m.emit((0x08 ^ (ecode(v[1]) << 3)) | 0x00)
  41124. m.emit(0x7b)
  41125. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  41126. })
  41127. }
  41128. // VCVTUSI2SD m32, xmm, xmm
  41129. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) {
  41130. self.require(ISA_AVX512F)
  41131. p.domain = DomainAVX
  41132. p.add(0, func(m *_Encoding, v []interface{}) {
  41133. m.evex(0b01, 0x07, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), 0, 0, 0)
  41134. m.emit(0x7b)
  41135. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  41136. })
  41137. }
  41138. // VCVTUSI2SD m64, xmm, xmm
  41139. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) {
  41140. self.require(ISA_AVX512F)
  41141. p.domain = DomainAVX
  41142. p.add(0, func(m *_Encoding, v []interface{}) {
  41143. m.evex(0b01, 0x87, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), 0, 0, 0)
  41144. m.emit(0x7b)
  41145. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  41146. })
  41147. }
  41148. // VCVTUSI2SD {er}, r64, xmm, xmm
  41149. if len(vv) == 1 && isER(v0) && isReg64(v1) && isEVEXXMM(v2) && isEVEXXMM(vv[0]) {
  41150. self.require(ISA_AVX512F)
  41151. p.domain = DomainAVX
  41152. p.add(0, func(m *_Encoding, v []interface{}) {
  41153. m.emit(0x62)
  41154. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  41155. m.emit(0xff ^ (hlcode(v[2]) << 3))
  41156. m.emit((vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | 0x10)
  41157. m.emit(0x7b)
  41158. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  41159. })
  41160. }
  41161. // VCVTUSI2SD r64, xmm, xmm
  41162. if len(vv) == 0 && isReg64(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) {
  41163. self.require(ISA_AVX512F)
  41164. p.domain = DomainAVX
  41165. p.add(0, func(m *_Encoding, v []interface{}) {
  41166. m.emit(0x62)
  41167. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  41168. m.emit(0xff ^ (hlcode(v[1]) << 3))
  41169. m.emit((0x08 ^ (ecode(v[1]) << 3)) | 0x40)
  41170. m.emit(0x7b)
  41171. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  41172. })
  41173. }
  41174. if p.len == 0 {
  41175. panic("invalid operands for VCVTUSI2SD")
  41176. }
  41177. return p
  41178. }
  41179. // VCVTUSI2SS performs "Convert Unsigned Integer to Scalar Single-Precision Floating-Point Value".
  41180. //
  41181. // Mnemonic : VCVTUSI2SS
  41182. // Supported forms : (6 forms)
  41183. //
  41184. // * VCVTUSI2SS m32, xmm, xmm [AVX512F]
  41185. // * VCVTUSI2SS m64, xmm, xmm [AVX512F]
  41186. // * VCVTUSI2SS {er}, r32, xmm, xmm [AVX512F]
  41187. // * VCVTUSI2SS {er}, r64, xmm, xmm [AVX512F]
  41188. // * VCVTUSI2SS r32, xmm, xmm [AVX512F]
  41189. // * VCVTUSI2SS r64, xmm, xmm [AVX512F]
  41190. //
  41191. func (self *Program) VCVTUSI2SS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  41192. var p *Instruction
  41193. switch len(vv) {
  41194. case 0 : p = self.alloc("VCVTUSI2SS", 3, Operands { v0, v1, v2 })
  41195. case 1 : p = self.alloc("VCVTUSI2SS", 4, Operands { v0, v1, v2, vv[0] })
  41196. default : panic("instruction VCVTUSI2SS takes 3 or 4 operands")
  41197. }
  41198. // VCVTUSI2SS m32, xmm, xmm
  41199. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) {
  41200. self.require(ISA_AVX512F)
  41201. p.domain = DomainAVX
  41202. p.add(0, func(m *_Encoding, v []interface{}) {
  41203. m.evex(0b01, 0x06, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), 0, 0, 0)
  41204. m.emit(0x7b)
  41205. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  41206. })
  41207. }
  41208. // VCVTUSI2SS m64, xmm, xmm
  41209. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) {
  41210. self.require(ISA_AVX512F)
  41211. p.domain = DomainAVX
  41212. p.add(0, func(m *_Encoding, v []interface{}) {
  41213. m.evex(0b01, 0x86, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), 0, 0, 0)
  41214. m.emit(0x7b)
  41215. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  41216. })
  41217. }
  41218. // VCVTUSI2SS {er}, r32, xmm, xmm
  41219. if len(vv) == 1 && isER(v0) && isReg32(v1) && isEVEXXMM(v2) && isEVEXXMM(vv[0]) {
  41220. self.require(ISA_AVX512F)
  41221. p.domain = DomainAVX
  41222. p.add(0, func(m *_Encoding, v []interface{}) {
  41223. m.emit(0x62)
  41224. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  41225. m.emit(0x7e ^ (hlcode(v[2]) << 3))
  41226. m.emit((vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | 0x10)
  41227. m.emit(0x7b)
  41228. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  41229. })
  41230. }
  41231. // VCVTUSI2SS {er}, r64, xmm, xmm
  41232. if len(vv) == 1 && isER(v0) && isReg64(v1) && isEVEXXMM(v2) && isEVEXXMM(vv[0]) {
  41233. self.require(ISA_AVX512F)
  41234. p.domain = DomainAVX
  41235. p.add(0, func(m *_Encoding, v []interface{}) {
  41236. m.emit(0x62)
  41237. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  41238. m.emit(0xfe ^ (hlcode(v[2]) << 3))
  41239. m.emit((vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | 0x10)
  41240. m.emit(0x7b)
  41241. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  41242. })
  41243. }
  41244. // VCVTUSI2SS r32, xmm, xmm
  41245. if len(vv) == 0 && isReg32(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) {
  41246. self.require(ISA_AVX512F)
  41247. p.domain = DomainAVX
  41248. p.add(0, func(m *_Encoding, v []interface{}) {
  41249. m.emit(0x62)
  41250. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  41251. m.emit(0x7e ^ (hlcode(v[1]) << 3))
  41252. m.emit((0x08 ^ (ecode(v[1]) << 3)) | 0x40)
  41253. m.emit(0x7b)
  41254. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  41255. })
  41256. }
  41257. // VCVTUSI2SS r64, xmm, xmm
  41258. if len(vv) == 0 && isReg64(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) {
  41259. self.require(ISA_AVX512F)
  41260. p.domain = DomainAVX
  41261. p.add(0, func(m *_Encoding, v []interface{}) {
  41262. m.emit(0x62)
  41263. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  41264. m.emit(0xfe ^ (hlcode(v[1]) << 3))
  41265. m.emit((0x08 ^ (ecode(v[1]) << 3)) | 0x40)
  41266. m.emit(0x7b)
  41267. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  41268. })
  41269. }
  41270. if p.len == 0 {
  41271. panic("invalid operands for VCVTUSI2SS")
  41272. }
  41273. return p
  41274. }
  41275. // VDBPSADBW performs "Double Block Packed Sum-Absolute-Differences on Unsigned Bytes".
  41276. //
  41277. // Mnemonic : VDBPSADBW
  41278. // Supported forms : (6 forms)
  41279. //
  41280. // * VDBPSADBW imm8, zmm, zmm, zmm{k}{z} [AVX512BW]
  41281. // * VDBPSADBW imm8, m512, zmm, zmm{k}{z} [AVX512BW]
  41282. // * VDBPSADBW imm8, xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  41283. // * VDBPSADBW imm8, m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  41284. // * VDBPSADBW imm8, ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  41285. // * VDBPSADBW imm8, m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  41286. //
  41287. func (self *Program) VDBPSADBW(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  41288. p := self.alloc("VDBPSADBW", 4, Operands { v0, v1, v2, v3 })
  41289. // VDBPSADBW imm8, zmm, zmm, zmm{k}{z}
  41290. if isImm8(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(v3) {
  41291. self.require(ISA_AVX512BW)
  41292. p.domain = DomainAVX
  41293. p.add(0, func(m *_Encoding, v []interface{}) {
  41294. m.emit(0x62)
  41295. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  41296. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  41297. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  41298. m.emit(0x42)
  41299. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  41300. m.imm1(toImmAny(v[0]))
  41301. })
  41302. }
  41303. // VDBPSADBW imm8, m512, zmm, zmm{k}{z}
  41304. if isImm8(v0) && isM512(v1) && isZMM(v2) && isZMMkz(v3) {
  41305. self.require(ISA_AVX512BW)
  41306. p.domain = DomainAVX
  41307. p.add(0, func(m *_Encoding, v []interface{}) {
  41308. m.evex(0b11, 0x05, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  41309. m.emit(0x42)
  41310. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  41311. m.imm1(toImmAny(v[0]))
  41312. })
  41313. }
  41314. // VDBPSADBW imm8, xmm, xmm, xmm{k}{z}
  41315. if isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  41316. self.require(ISA_AVX512VL | ISA_AVX512BW)
  41317. p.domain = DomainAVX
  41318. p.add(0, func(m *_Encoding, v []interface{}) {
  41319. m.emit(0x62)
  41320. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  41321. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  41322. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  41323. m.emit(0x42)
  41324. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  41325. m.imm1(toImmAny(v[0]))
  41326. })
  41327. }
  41328. // VDBPSADBW imm8, m128, xmm, xmm{k}{z}
  41329. if isImm8(v0) && isM128(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  41330. self.require(ISA_AVX512VL | ISA_AVX512BW)
  41331. p.domain = DomainAVX
  41332. p.add(0, func(m *_Encoding, v []interface{}) {
  41333. m.evex(0b11, 0x05, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  41334. m.emit(0x42)
  41335. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  41336. m.imm1(toImmAny(v[0]))
  41337. })
  41338. }
  41339. // VDBPSADBW imm8, ymm, ymm, ymm{k}{z}
  41340. if isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  41341. self.require(ISA_AVX512VL | ISA_AVX512BW)
  41342. p.domain = DomainAVX
  41343. p.add(0, func(m *_Encoding, v []interface{}) {
  41344. m.emit(0x62)
  41345. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  41346. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  41347. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  41348. m.emit(0x42)
  41349. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  41350. m.imm1(toImmAny(v[0]))
  41351. })
  41352. }
  41353. // VDBPSADBW imm8, m256, ymm, ymm{k}{z}
  41354. if isImm8(v0) && isM256(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  41355. self.require(ISA_AVX512VL | ISA_AVX512BW)
  41356. p.domain = DomainAVX
  41357. p.add(0, func(m *_Encoding, v []interface{}) {
  41358. m.evex(0b11, 0x05, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  41359. m.emit(0x42)
  41360. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  41361. m.imm1(toImmAny(v[0]))
  41362. })
  41363. }
  41364. if p.len == 0 {
  41365. panic("invalid operands for VDBPSADBW")
  41366. }
  41367. return p
  41368. }
  41369. // VDIVPD performs "Divide Packed Double-Precision Floating-Point Values".
  41370. //
  41371. // Mnemonic : VDIVPD
  41372. // Supported forms : (11 forms)
  41373. //
  41374. // * VDIVPD xmm, xmm, xmm [AVX]
  41375. // * VDIVPD m128, xmm, xmm [AVX]
  41376. // * VDIVPD ymm, ymm, ymm [AVX]
  41377. // * VDIVPD m256, ymm, ymm [AVX]
  41378. // * VDIVPD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  41379. // * VDIVPD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  41380. // * VDIVPD zmm, zmm, zmm{k}{z} [AVX512F]
  41381. // * VDIVPD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  41382. // * VDIVPD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  41383. // * VDIVPD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  41384. // * VDIVPD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  41385. //
  41386. func (self *Program) VDIVPD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  41387. var p *Instruction
  41388. switch len(vv) {
  41389. case 0 : p = self.alloc("VDIVPD", 3, Operands { v0, v1, v2 })
  41390. case 1 : p = self.alloc("VDIVPD", 4, Operands { v0, v1, v2, vv[0] })
  41391. default : panic("instruction VDIVPD takes 3 or 4 operands")
  41392. }
  41393. // VDIVPD xmm, xmm, xmm
  41394. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  41395. self.require(ISA_AVX)
  41396. p.domain = DomainAVX
  41397. p.add(0, func(m *_Encoding, v []interface{}) {
  41398. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  41399. m.emit(0x5e)
  41400. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  41401. })
  41402. }
  41403. // VDIVPD m128, xmm, xmm
  41404. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  41405. self.require(ISA_AVX)
  41406. p.domain = DomainAVX
  41407. p.add(0, func(m *_Encoding, v []interface{}) {
  41408. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  41409. m.emit(0x5e)
  41410. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  41411. })
  41412. }
  41413. // VDIVPD ymm, ymm, ymm
  41414. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  41415. self.require(ISA_AVX)
  41416. p.domain = DomainAVX
  41417. p.add(0, func(m *_Encoding, v []interface{}) {
  41418. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  41419. m.emit(0x5e)
  41420. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  41421. })
  41422. }
  41423. // VDIVPD m256, ymm, ymm
  41424. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  41425. self.require(ISA_AVX)
  41426. p.domain = DomainAVX
  41427. p.add(0, func(m *_Encoding, v []interface{}) {
  41428. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  41429. m.emit(0x5e)
  41430. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  41431. })
  41432. }
  41433. // VDIVPD m512/m64bcst, zmm, zmm{k}{z}
  41434. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  41435. self.require(ISA_AVX512F)
  41436. p.domain = DomainAVX
  41437. p.add(0, func(m *_Encoding, v []interface{}) {
  41438. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  41439. m.emit(0x5e)
  41440. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  41441. })
  41442. }
  41443. // VDIVPD {er}, zmm, zmm, zmm{k}{z}
  41444. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  41445. self.require(ISA_AVX512F)
  41446. p.domain = DomainAVX
  41447. p.add(0, func(m *_Encoding, v []interface{}) {
  41448. m.emit(0x62)
  41449. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  41450. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  41451. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  41452. m.emit(0x5e)
  41453. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  41454. })
  41455. }
  41456. // VDIVPD zmm, zmm, zmm{k}{z}
  41457. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  41458. self.require(ISA_AVX512F)
  41459. p.domain = DomainAVX
  41460. p.add(0, func(m *_Encoding, v []interface{}) {
  41461. m.emit(0x62)
  41462. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  41463. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  41464. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  41465. m.emit(0x5e)
  41466. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  41467. })
  41468. }
  41469. // VDIVPD m128/m64bcst, xmm, xmm{k}{z}
  41470. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  41471. self.require(ISA_AVX512VL | ISA_AVX512F)
  41472. p.domain = DomainAVX
  41473. p.add(0, func(m *_Encoding, v []interface{}) {
  41474. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  41475. m.emit(0x5e)
  41476. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  41477. })
  41478. }
  41479. // VDIVPD xmm, xmm, xmm{k}{z}
  41480. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  41481. self.require(ISA_AVX512VL | ISA_AVX512F)
  41482. p.domain = DomainAVX
  41483. p.add(0, func(m *_Encoding, v []interface{}) {
  41484. m.emit(0x62)
  41485. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  41486. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  41487. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  41488. m.emit(0x5e)
  41489. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  41490. })
  41491. }
  41492. // VDIVPD m256/m64bcst, ymm, ymm{k}{z}
  41493. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  41494. self.require(ISA_AVX512VL | ISA_AVX512F)
  41495. p.domain = DomainAVX
  41496. p.add(0, func(m *_Encoding, v []interface{}) {
  41497. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  41498. m.emit(0x5e)
  41499. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  41500. })
  41501. }
  41502. // VDIVPD ymm, ymm, ymm{k}{z}
  41503. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  41504. self.require(ISA_AVX512VL | ISA_AVX512F)
  41505. p.domain = DomainAVX
  41506. p.add(0, func(m *_Encoding, v []interface{}) {
  41507. m.emit(0x62)
  41508. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  41509. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  41510. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  41511. m.emit(0x5e)
  41512. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  41513. })
  41514. }
  41515. if p.len == 0 {
  41516. panic("invalid operands for VDIVPD")
  41517. }
  41518. return p
  41519. }
  41520. // VDIVPS performs "Divide Packed Single-Precision Floating-Point Values".
  41521. //
  41522. // Mnemonic : VDIVPS
  41523. // Supported forms : (11 forms)
  41524. //
  41525. // * VDIVPS xmm, xmm, xmm [AVX]
  41526. // * VDIVPS m128, xmm, xmm [AVX]
  41527. // * VDIVPS ymm, ymm, ymm [AVX]
  41528. // * VDIVPS m256, ymm, ymm [AVX]
  41529. // * VDIVPS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  41530. // * VDIVPS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  41531. // * VDIVPS zmm, zmm, zmm{k}{z} [AVX512F]
  41532. // * VDIVPS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  41533. // * VDIVPS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  41534. // * VDIVPS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  41535. // * VDIVPS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  41536. //
  41537. func (self *Program) VDIVPS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  41538. var p *Instruction
  41539. switch len(vv) {
  41540. case 0 : p = self.alloc("VDIVPS", 3, Operands { v0, v1, v2 })
  41541. case 1 : p = self.alloc("VDIVPS", 4, Operands { v0, v1, v2, vv[0] })
  41542. default : panic("instruction VDIVPS takes 3 or 4 operands")
  41543. }
  41544. // VDIVPS xmm, xmm, xmm
  41545. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  41546. self.require(ISA_AVX)
  41547. p.domain = DomainAVX
  41548. p.add(0, func(m *_Encoding, v []interface{}) {
  41549. m.vex2(0, hcode(v[2]), v[0], hlcode(v[1]))
  41550. m.emit(0x5e)
  41551. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  41552. })
  41553. }
  41554. // VDIVPS m128, xmm, xmm
  41555. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  41556. self.require(ISA_AVX)
  41557. p.domain = DomainAVX
  41558. p.add(0, func(m *_Encoding, v []interface{}) {
  41559. m.vex2(0, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  41560. m.emit(0x5e)
  41561. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  41562. })
  41563. }
  41564. // VDIVPS ymm, ymm, ymm
  41565. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  41566. self.require(ISA_AVX)
  41567. p.domain = DomainAVX
  41568. p.add(0, func(m *_Encoding, v []interface{}) {
  41569. m.vex2(4, hcode(v[2]), v[0], hlcode(v[1]))
  41570. m.emit(0x5e)
  41571. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  41572. })
  41573. }
  41574. // VDIVPS m256, ymm, ymm
  41575. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  41576. self.require(ISA_AVX)
  41577. p.domain = DomainAVX
  41578. p.add(0, func(m *_Encoding, v []interface{}) {
  41579. m.vex2(4, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  41580. m.emit(0x5e)
  41581. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  41582. })
  41583. }
  41584. // VDIVPS m512/m32bcst, zmm, zmm{k}{z}
  41585. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  41586. self.require(ISA_AVX512F)
  41587. p.domain = DomainAVX
  41588. p.add(0, func(m *_Encoding, v []interface{}) {
  41589. m.evex(0b01, 0x04, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  41590. m.emit(0x5e)
  41591. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  41592. })
  41593. }
  41594. // VDIVPS {er}, zmm, zmm, zmm{k}{z}
  41595. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  41596. self.require(ISA_AVX512F)
  41597. p.domain = DomainAVX
  41598. p.add(0, func(m *_Encoding, v []interface{}) {
  41599. m.emit(0x62)
  41600. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  41601. m.emit(0x7c ^ (hlcode(v[2]) << 3))
  41602. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  41603. m.emit(0x5e)
  41604. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  41605. })
  41606. }
  41607. // VDIVPS zmm, zmm, zmm{k}{z}
  41608. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  41609. self.require(ISA_AVX512F)
  41610. p.domain = DomainAVX
  41611. p.add(0, func(m *_Encoding, v []interface{}) {
  41612. m.emit(0x62)
  41613. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  41614. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  41615. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  41616. m.emit(0x5e)
  41617. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  41618. })
  41619. }
  41620. // VDIVPS m128/m32bcst, xmm, xmm{k}{z}
  41621. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  41622. self.require(ISA_AVX512VL | ISA_AVX512F)
  41623. p.domain = DomainAVX
  41624. p.add(0, func(m *_Encoding, v []interface{}) {
  41625. m.evex(0b01, 0x04, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  41626. m.emit(0x5e)
  41627. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  41628. })
  41629. }
  41630. // VDIVPS xmm, xmm, xmm{k}{z}
  41631. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  41632. self.require(ISA_AVX512VL | ISA_AVX512F)
  41633. p.domain = DomainAVX
  41634. p.add(0, func(m *_Encoding, v []interface{}) {
  41635. m.emit(0x62)
  41636. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  41637. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  41638. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  41639. m.emit(0x5e)
  41640. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  41641. })
  41642. }
  41643. // VDIVPS m256/m32bcst, ymm, ymm{k}{z}
  41644. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  41645. self.require(ISA_AVX512VL | ISA_AVX512F)
  41646. p.domain = DomainAVX
  41647. p.add(0, func(m *_Encoding, v []interface{}) {
  41648. m.evex(0b01, 0x04, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  41649. m.emit(0x5e)
  41650. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  41651. })
  41652. }
  41653. // VDIVPS ymm, ymm, ymm{k}{z}
  41654. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  41655. self.require(ISA_AVX512VL | ISA_AVX512F)
  41656. p.domain = DomainAVX
  41657. p.add(0, func(m *_Encoding, v []interface{}) {
  41658. m.emit(0x62)
  41659. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  41660. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  41661. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  41662. m.emit(0x5e)
  41663. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  41664. })
  41665. }
  41666. if p.len == 0 {
  41667. panic("invalid operands for VDIVPS")
  41668. }
  41669. return p
  41670. }
  41671. // VDIVSD performs "Divide Scalar Double-Precision Floating-Point Values".
  41672. //
  41673. // Mnemonic : VDIVSD
  41674. // Supported forms : (5 forms)
  41675. //
  41676. // * VDIVSD xmm, xmm, xmm [AVX]
  41677. // * VDIVSD m64, xmm, xmm [AVX]
  41678. // * VDIVSD m64, xmm, xmm{k}{z} [AVX512F]
  41679. // * VDIVSD {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  41680. // * VDIVSD xmm, xmm, xmm{k}{z} [AVX512F]
  41681. //
  41682. func (self *Program) VDIVSD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  41683. var p *Instruction
  41684. switch len(vv) {
  41685. case 0 : p = self.alloc("VDIVSD", 3, Operands { v0, v1, v2 })
  41686. case 1 : p = self.alloc("VDIVSD", 4, Operands { v0, v1, v2, vv[0] })
  41687. default : panic("instruction VDIVSD takes 3 or 4 operands")
  41688. }
  41689. // VDIVSD xmm, xmm, xmm
  41690. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  41691. self.require(ISA_AVX)
  41692. p.domain = DomainAVX
  41693. p.add(0, func(m *_Encoding, v []interface{}) {
  41694. m.vex2(3, hcode(v[2]), v[0], hlcode(v[1]))
  41695. m.emit(0x5e)
  41696. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  41697. })
  41698. }
  41699. // VDIVSD m64, xmm, xmm
  41700. if len(vv) == 0 && isM64(v0) && isXMM(v1) && isXMM(v2) {
  41701. self.require(ISA_AVX)
  41702. p.domain = DomainAVX
  41703. p.add(0, func(m *_Encoding, v []interface{}) {
  41704. m.vex2(3, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  41705. m.emit(0x5e)
  41706. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  41707. })
  41708. }
  41709. // VDIVSD m64, xmm, xmm{k}{z}
  41710. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  41711. self.require(ISA_AVX512F)
  41712. p.domain = DomainAVX
  41713. p.add(0, func(m *_Encoding, v []interface{}) {
  41714. m.evex(0b01, 0x87, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  41715. m.emit(0x5e)
  41716. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  41717. })
  41718. }
  41719. // VDIVSD {er}, xmm, xmm, xmm{k}{z}
  41720. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  41721. self.require(ISA_AVX512F)
  41722. p.domain = DomainAVX
  41723. p.add(0, func(m *_Encoding, v []interface{}) {
  41724. m.emit(0x62)
  41725. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  41726. m.emit(0xff ^ (hlcode(v[2]) << 3))
  41727. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  41728. m.emit(0x5e)
  41729. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  41730. })
  41731. }
  41732. // VDIVSD xmm, xmm, xmm{k}{z}
  41733. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  41734. self.require(ISA_AVX512F)
  41735. p.domain = DomainAVX
  41736. p.add(0, func(m *_Encoding, v []interface{}) {
  41737. m.emit(0x62)
  41738. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  41739. m.emit(0xff ^ (hlcode(v[1]) << 3))
  41740. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  41741. m.emit(0x5e)
  41742. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  41743. })
  41744. }
  41745. if p.len == 0 {
  41746. panic("invalid operands for VDIVSD")
  41747. }
  41748. return p
  41749. }
  41750. // VDIVSS performs "Divide Scalar Single-Precision Floating-Point Values".
  41751. //
  41752. // Mnemonic : VDIVSS
  41753. // Supported forms : (5 forms)
  41754. //
  41755. // * VDIVSS xmm, xmm, xmm [AVX]
  41756. // * VDIVSS m32, xmm, xmm [AVX]
  41757. // * VDIVSS m32, xmm, xmm{k}{z} [AVX512F]
  41758. // * VDIVSS {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  41759. // * VDIVSS xmm, xmm, xmm{k}{z} [AVX512F]
  41760. //
  41761. func (self *Program) VDIVSS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  41762. var p *Instruction
  41763. switch len(vv) {
  41764. case 0 : p = self.alloc("VDIVSS", 3, Operands { v0, v1, v2 })
  41765. case 1 : p = self.alloc("VDIVSS", 4, Operands { v0, v1, v2, vv[0] })
  41766. default : panic("instruction VDIVSS takes 3 or 4 operands")
  41767. }
  41768. // VDIVSS xmm, xmm, xmm
  41769. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  41770. self.require(ISA_AVX)
  41771. p.domain = DomainAVX
  41772. p.add(0, func(m *_Encoding, v []interface{}) {
  41773. m.vex2(2, hcode(v[2]), v[0], hlcode(v[1]))
  41774. m.emit(0x5e)
  41775. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  41776. })
  41777. }
  41778. // VDIVSS m32, xmm, xmm
  41779. if len(vv) == 0 && isM32(v0) && isXMM(v1) && isXMM(v2) {
  41780. self.require(ISA_AVX)
  41781. p.domain = DomainAVX
  41782. p.add(0, func(m *_Encoding, v []interface{}) {
  41783. m.vex2(2, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  41784. m.emit(0x5e)
  41785. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  41786. })
  41787. }
  41788. // VDIVSS m32, xmm, xmm{k}{z}
  41789. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  41790. self.require(ISA_AVX512F)
  41791. p.domain = DomainAVX
  41792. p.add(0, func(m *_Encoding, v []interface{}) {
  41793. m.evex(0b01, 0x06, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  41794. m.emit(0x5e)
  41795. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  41796. })
  41797. }
  41798. // VDIVSS {er}, xmm, xmm, xmm{k}{z}
  41799. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  41800. self.require(ISA_AVX512F)
  41801. p.domain = DomainAVX
  41802. p.add(0, func(m *_Encoding, v []interface{}) {
  41803. m.emit(0x62)
  41804. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  41805. m.emit(0x7e ^ (hlcode(v[2]) << 3))
  41806. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  41807. m.emit(0x5e)
  41808. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  41809. })
  41810. }
  41811. // VDIVSS xmm, xmm, xmm{k}{z}
  41812. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  41813. self.require(ISA_AVX512F)
  41814. p.domain = DomainAVX
  41815. p.add(0, func(m *_Encoding, v []interface{}) {
  41816. m.emit(0x62)
  41817. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  41818. m.emit(0x7e ^ (hlcode(v[1]) << 3))
  41819. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  41820. m.emit(0x5e)
  41821. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  41822. })
  41823. }
  41824. if p.len == 0 {
  41825. panic("invalid operands for VDIVSS")
  41826. }
  41827. return p
  41828. }
  41829. // VDPPD performs "Dot Product of Packed Double Precision Floating-Point Values".
  41830. //
  41831. // Mnemonic : VDPPD
  41832. // Supported forms : (2 forms)
  41833. //
  41834. // * VDPPD imm8, xmm, xmm, xmm [AVX]
  41835. // * VDPPD imm8, m128, xmm, xmm [AVX]
  41836. //
  41837. func (self *Program) VDPPD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  41838. p := self.alloc("VDPPD", 4, Operands { v0, v1, v2, v3 })
  41839. // VDPPD imm8, xmm, xmm, xmm
  41840. if isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  41841. self.require(ISA_AVX)
  41842. p.domain = DomainAVX
  41843. p.add(0, func(m *_Encoding, v []interface{}) {
  41844. m.emit(0xc4)
  41845. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  41846. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  41847. m.emit(0x41)
  41848. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  41849. m.imm1(toImmAny(v[0]))
  41850. })
  41851. }
  41852. // VDPPD imm8, m128, xmm, xmm
  41853. if isImm8(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  41854. self.require(ISA_AVX)
  41855. p.domain = DomainAVX
  41856. p.add(0, func(m *_Encoding, v []interface{}) {
  41857. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  41858. m.emit(0x41)
  41859. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  41860. m.imm1(toImmAny(v[0]))
  41861. })
  41862. }
  41863. if p.len == 0 {
  41864. panic("invalid operands for VDPPD")
  41865. }
  41866. return p
  41867. }
  41868. // VDPPS performs "Dot Product of Packed Single Precision Floating-Point Values".
  41869. //
  41870. // Mnemonic : VDPPS
  41871. // Supported forms : (4 forms)
  41872. //
  41873. // * VDPPS imm8, xmm, xmm, xmm [AVX]
  41874. // * VDPPS imm8, m128, xmm, xmm [AVX]
  41875. // * VDPPS imm8, ymm, ymm, ymm [AVX]
  41876. // * VDPPS imm8, m256, ymm, ymm [AVX]
  41877. //
  41878. func (self *Program) VDPPS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  41879. p := self.alloc("VDPPS", 4, Operands { v0, v1, v2, v3 })
  41880. // VDPPS imm8, xmm, xmm, xmm
  41881. if isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  41882. self.require(ISA_AVX)
  41883. p.domain = DomainAVX
  41884. p.add(0, func(m *_Encoding, v []interface{}) {
  41885. m.emit(0xc4)
  41886. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  41887. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  41888. m.emit(0x40)
  41889. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  41890. m.imm1(toImmAny(v[0]))
  41891. })
  41892. }
  41893. // VDPPS imm8, m128, xmm, xmm
  41894. if isImm8(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  41895. self.require(ISA_AVX)
  41896. p.domain = DomainAVX
  41897. p.add(0, func(m *_Encoding, v []interface{}) {
  41898. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  41899. m.emit(0x40)
  41900. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  41901. m.imm1(toImmAny(v[0]))
  41902. })
  41903. }
  41904. // VDPPS imm8, ymm, ymm, ymm
  41905. if isImm8(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  41906. self.require(ISA_AVX)
  41907. p.domain = DomainAVX
  41908. p.add(0, func(m *_Encoding, v []interface{}) {
  41909. m.emit(0xc4)
  41910. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  41911. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  41912. m.emit(0x40)
  41913. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  41914. m.imm1(toImmAny(v[0]))
  41915. })
  41916. }
  41917. // VDPPS imm8, m256, ymm, ymm
  41918. if isImm8(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  41919. self.require(ISA_AVX)
  41920. p.domain = DomainAVX
  41921. p.add(0, func(m *_Encoding, v []interface{}) {
  41922. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  41923. m.emit(0x40)
  41924. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  41925. m.imm1(toImmAny(v[0]))
  41926. })
  41927. }
  41928. if p.len == 0 {
  41929. panic("invalid operands for VDPPS")
  41930. }
  41931. return p
  41932. }
  41933. // VEXP2PD performs "Approximation to the Exponential 2^x of Packed Double-Precision Floating-Point Values with Less Than 2^-23 Relative Error".
  41934. //
  41935. // Mnemonic : VEXP2PD
  41936. // Supported forms : (3 forms)
  41937. //
  41938. // * VEXP2PD m512/m64bcst, zmm{k}{z} [AVX512ER]
  41939. // * VEXP2PD {sae}, zmm, zmm{k}{z} [AVX512ER]
  41940. // * VEXP2PD zmm, zmm{k}{z} [AVX512ER]
  41941. //
  41942. func (self *Program) VEXP2PD(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  41943. var p *Instruction
  41944. switch len(vv) {
  41945. case 0 : p = self.alloc("VEXP2PD", 2, Operands { v0, v1 })
  41946. case 1 : p = self.alloc("VEXP2PD", 3, Operands { v0, v1, vv[0] })
  41947. default : panic("instruction VEXP2PD takes 2 or 3 operands")
  41948. }
  41949. // VEXP2PD m512/m64bcst, zmm{k}{z}
  41950. if len(vv) == 0 && isM512M64bcst(v0) && isZMMkz(v1) {
  41951. self.require(ISA_AVX512ER)
  41952. p.domain = DomainAVX
  41953. p.add(0, func(m *_Encoding, v []interface{}) {
  41954. m.evex(0b10, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  41955. m.emit(0xc8)
  41956. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  41957. })
  41958. }
  41959. // VEXP2PD {sae}, zmm, zmm{k}{z}
  41960. if len(vv) == 1 && isSAE(v0) && isZMM(v1) && isZMMkz(vv[0]) {
  41961. self.require(ISA_AVX512ER)
  41962. p.domain = DomainAVX
  41963. p.add(0, func(m *_Encoding, v []interface{}) {
  41964. m.emit(0x62)
  41965. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  41966. m.emit(0xfd)
  41967. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x18)
  41968. m.emit(0xc8)
  41969. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  41970. })
  41971. }
  41972. // VEXP2PD zmm, zmm{k}{z}
  41973. if len(vv) == 0 && isZMM(v0) && isZMMkz(v1) {
  41974. self.require(ISA_AVX512ER)
  41975. p.domain = DomainAVX
  41976. p.add(0, func(m *_Encoding, v []interface{}) {
  41977. m.emit(0x62)
  41978. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  41979. m.emit(0xfd)
  41980. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  41981. m.emit(0xc8)
  41982. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  41983. })
  41984. }
  41985. if p.len == 0 {
  41986. panic("invalid operands for VEXP2PD")
  41987. }
  41988. return p
  41989. }
  41990. // VEXP2PS performs "Approximation to the Exponential 2^x of Packed Single-Precision Floating-Point Values with Less Than 2^-23 Relative Error".
  41991. //
  41992. // Mnemonic : VEXP2PS
  41993. // Supported forms : (3 forms)
  41994. //
  41995. // * VEXP2PS m512/m32bcst, zmm{k}{z} [AVX512ER]
  41996. // * VEXP2PS {sae}, zmm, zmm{k}{z} [AVX512ER]
  41997. // * VEXP2PS zmm, zmm{k}{z} [AVX512ER]
  41998. //
  41999. func (self *Program) VEXP2PS(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  42000. var p *Instruction
  42001. switch len(vv) {
  42002. case 0 : p = self.alloc("VEXP2PS", 2, Operands { v0, v1 })
  42003. case 1 : p = self.alloc("VEXP2PS", 3, Operands { v0, v1, vv[0] })
  42004. default : panic("instruction VEXP2PS takes 2 or 3 operands")
  42005. }
  42006. // VEXP2PS m512/m32bcst, zmm{k}{z}
  42007. if len(vv) == 0 && isM512M32bcst(v0) && isZMMkz(v1) {
  42008. self.require(ISA_AVX512ER)
  42009. p.domain = DomainAVX
  42010. p.add(0, func(m *_Encoding, v []interface{}) {
  42011. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  42012. m.emit(0xc8)
  42013. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  42014. })
  42015. }
  42016. // VEXP2PS {sae}, zmm, zmm{k}{z}
  42017. if len(vv) == 1 && isSAE(v0) && isZMM(v1) && isZMMkz(vv[0]) {
  42018. self.require(ISA_AVX512ER)
  42019. p.domain = DomainAVX
  42020. p.add(0, func(m *_Encoding, v []interface{}) {
  42021. m.emit(0x62)
  42022. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  42023. m.emit(0x7d)
  42024. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x18)
  42025. m.emit(0xc8)
  42026. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  42027. })
  42028. }
  42029. // VEXP2PS zmm, zmm{k}{z}
  42030. if len(vv) == 0 && isZMM(v0) && isZMMkz(v1) {
  42031. self.require(ISA_AVX512ER)
  42032. p.domain = DomainAVX
  42033. p.add(0, func(m *_Encoding, v []interface{}) {
  42034. m.emit(0x62)
  42035. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  42036. m.emit(0x7d)
  42037. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  42038. m.emit(0xc8)
  42039. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  42040. })
  42041. }
  42042. if p.len == 0 {
  42043. panic("invalid operands for VEXP2PS")
  42044. }
  42045. return p
  42046. }
  42047. // VEXPANDPD performs "Load Sparse Packed Double-Precision Floating-Point Values from Dense Memory".
  42048. //
  42049. // Mnemonic : VEXPANDPD
  42050. // Supported forms : (6 forms)
  42051. //
  42052. // * VEXPANDPD zmm, zmm{k}{z} [AVX512F]
  42053. // * VEXPANDPD m512, zmm{k}{z} [AVX512F]
  42054. // * VEXPANDPD xmm, xmm{k}{z} [AVX512VL]
  42055. // * VEXPANDPD ymm, ymm{k}{z} [AVX512F,AVX512VL]
  42056. // * VEXPANDPD m128, xmm{k}{z} [AVX512VL]
  42057. // * VEXPANDPD m256, ymm{k}{z} [AVX512F,AVX512VL]
  42058. //
  42059. func (self *Program) VEXPANDPD(v0 interface{}, v1 interface{}) *Instruction {
  42060. p := self.alloc("VEXPANDPD", 2, Operands { v0, v1 })
  42061. // VEXPANDPD zmm, zmm{k}{z}
  42062. if isZMM(v0) && isZMMkz(v1) {
  42063. self.require(ISA_AVX512F)
  42064. p.domain = DomainAVX
  42065. p.add(0, func(m *_Encoding, v []interface{}) {
  42066. m.emit(0x62)
  42067. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  42068. m.emit(0xfd)
  42069. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  42070. m.emit(0x88)
  42071. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  42072. })
  42073. }
  42074. // VEXPANDPD m512, zmm{k}{z}
  42075. if isM512(v0) && isZMMkz(v1) {
  42076. self.require(ISA_AVX512F)
  42077. p.domain = DomainAVX
  42078. p.add(0, func(m *_Encoding, v []interface{}) {
  42079. m.evex(0b10, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  42080. m.emit(0x88)
  42081. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  42082. })
  42083. }
  42084. // VEXPANDPD xmm, xmm{k}{z}
  42085. if isEVEXXMM(v0) && isXMMkz(v1) {
  42086. self.require(ISA_AVX512VL)
  42087. p.domain = DomainAVX
  42088. p.add(0, func(m *_Encoding, v []interface{}) {
  42089. m.emit(0x62)
  42090. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  42091. m.emit(0xfd)
  42092. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  42093. m.emit(0x88)
  42094. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  42095. })
  42096. }
  42097. // VEXPANDPD ymm, ymm{k}{z}
  42098. if isEVEXYMM(v0) && isYMMkz(v1) {
  42099. self.require(ISA_AVX512VL | ISA_AVX512F)
  42100. p.domain = DomainAVX
  42101. p.add(0, func(m *_Encoding, v []interface{}) {
  42102. m.emit(0x62)
  42103. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  42104. m.emit(0xfd)
  42105. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  42106. m.emit(0x88)
  42107. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  42108. })
  42109. }
  42110. // VEXPANDPD m128, xmm{k}{z}
  42111. if isM128(v0) && isXMMkz(v1) {
  42112. self.require(ISA_AVX512VL)
  42113. p.domain = DomainAVX
  42114. p.add(0, func(m *_Encoding, v []interface{}) {
  42115. m.evex(0b10, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  42116. m.emit(0x88)
  42117. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  42118. })
  42119. }
  42120. // VEXPANDPD m256, ymm{k}{z}
  42121. if isM256(v0) && isYMMkz(v1) {
  42122. self.require(ISA_AVX512VL | ISA_AVX512F)
  42123. p.domain = DomainAVX
  42124. p.add(0, func(m *_Encoding, v []interface{}) {
  42125. m.evex(0b10, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  42126. m.emit(0x88)
  42127. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  42128. })
  42129. }
  42130. if p.len == 0 {
  42131. panic("invalid operands for VEXPANDPD")
  42132. }
  42133. return p
  42134. }
  42135. // VEXPANDPS performs "Load Sparse Packed Single-Precision Floating-Point Values from Dense Memory".
  42136. //
  42137. // Mnemonic : VEXPANDPS
  42138. // Supported forms : (6 forms)
  42139. //
  42140. // * VEXPANDPS zmm, zmm{k}{z} [AVX512F]
  42141. // * VEXPANDPS m512, zmm{k}{z} [AVX512F]
  42142. // * VEXPANDPS xmm, xmm{k}{z} [AVX512F,AVX512VL]
  42143. // * VEXPANDPS ymm, ymm{k}{z} [AVX512F,AVX512VL]
  42144. // * VEXPANDPS m128, xmm{k}{z} [AVX512F,AVX512VL]
  42145. // * VEXPANDPS m256, ymm{k}{z} [AVX512F,AVX512VL]
  42146. //
  42147. func (self *Program) VEXPANDPS(v0 interface{}, v1 interface{}) *Instruction {
  42148. p := self.alloc("VEXPANDPS", 2, Operands { v0, v1 })
  42149. // VEXPANDPS zmm, zmm{k}{z}
  42150. if isZMM(v0) && isZMMkz(v1) {
  42151. self.require(ISA_AVX512F)
  42152. p.domain = DomainAVX
  42153. p.add(0, func(m *_Encoding, v []interface{}) {
  42154. m.emit(0x62)
  42155. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  42156. m.emit(0x7d)
  42157. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  42158. m.emit(0x88)
  42159. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  42160. })
  42161. }
  42162. // VEXPANDPS m512, zmm{k}{z}
  42163. if isM512(v0) && isZMMkz(v1) {
  42164. self.require(ISA_AVX512F)
  42165. p.domain = DomainAVX
  42166. p.add(0, func(m *_Encoding, v []interface{}) {
  42167. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  42168. m.emit(0x88)
  42169. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  42170. })
  42171. }
  42172. // VEXPANDPS xmm, xmm{k}{z}
  42173. if isEVEXXMM(v0) && isXMMkz(v1) {
  42174. self.require(ISA_AVX512VL | ISA_AVX512F)
  42175. p.domain = DomainAVX
  42176. p.add(0, func(m *_Encoding, v []interface{}) {
  42177. m.emit(0x62)
  42178. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  42179. m.emit(0x7d)
  42180. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  42181. m.emit(0x88)
  42182. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  42183. })
  42184. }
  42185. // VEXPANDPS ymm, ymm{k}{z}
  42186. if isEVEXYMM(v0) && isYMMkz(v1) {
  42187. self.require(ISA_AVX512VL | ISA_AVX512F)
  42188. p.domain = DomainAVX
  42189. p.add(0, func(m *_Encoding, v []interface{}) {
  42190. m.emit(0x62)
  42191. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  42192. m.emit(0x7d)
  42193. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  42194. m.emit(0x88)
  42195. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  42196. })
  42197. }
  42198. // VEXPANDPS m128, xmm{k}{z}
  42199. if isM128(v0) && isXMMkz(v1) {
  42200. self.require(ISA_AVX512VL | ISA_AVX512F)
  42201. p.domain = DomainAVX
  42202. p.add(0, func(m *_Encoding, v []interface{}) {
  42203. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  42204. m.emit(0x88)
  42205. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  42206. })
  42207. }
  42208. // VEXPANDPS m256, ymm{k}{z}
  42209. if isM256(v0) && isYMMkz(v1) {
  42210. self.require(ISA_AVX512VL | ISA_AVX512F)
  42211. p.domain = DomainAVX
  42212. p.add(0, func(m *_Encoding, v []interface{}) {
  42213. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  42214. m.emit(0x88)
  42215. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  42216. })
  42217. }
  42218. if p.len == 0 {
  42219. panic("invalid operands for VEXPANDPS")
  42220. }
  42221. return p
  42222. }
  42223. // VEXTRACTF128 performs "Extract Packed Floating-Point Values".
  42224. //
  42225. // Mnemonic : VEXTRACTF128
  42226. // Supported forms : (2 forms)
  42227. //
  42228. // * VEXTRACTF128 imm8, ymm, xmm [AVX]
  42229. // * VEXTRACTF128 imm8, ymm, m128 [AVX]
  42230. //
  42231. func (self *Program) VEXTRACTF128(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  42232. p := self.alloc("VEXTRACTF128", 3, Operands { v0, v1, v2 })
  42233. // VEXTRACTF128 imm8, ymm, xmm
  42234. if isImm8(v0) && isYMM(v1) && isXMM(v2) {
  42235. self.require(ISA_AVX)
  42236. p.domain = DomainAVX
  42237. p.add(0, func(m *_Encoding, v []interface{}) {
  42238. m.emit(0xc4)
  42239. m.emit(0xe3 ^ (hcode(v[1]) << 7) ^ (hcode(v[2]) << 5))
  42240. m.emit(0x7d)
  42241. m.emit(0x19)
  42242. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  42243. m.imm1(toImmAny(v[0]))
  42244. })
  42245. }
  42246. // VEXTRACTF128 imm8, ymm, m128
  42247. if isImm8(v0) && isYMM(v1) && isM128(v2) {
  42248. self.require(ISA_AVX)
  42249. p.domain = DomainAVX
  42250. p.add(0, func(m *_Encoding, v []interface{}) {
  42251. m.vex3(0xc4, 0b11, 0x05, hcode(v[1]), addr(v[2]), 0)
  42252. m.emit(0x19)
  42253. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  42254. m.imm1(toImmAny(v[0]))
  42255. })
  42256. }
  42257. if p.len == 0 {
  42258. panic("invalid operands for VEXTRACTF128")
  42259. }
  42260. return p
  42261. }
  42262. // VEXTRACTF32X4 performs "Extract 128 Bits of Packed Single-Precision Floating-Point Values".
  42263. //
  42264. // Mnemonic : VEXTRACTF32X4
  42265. // Supported forms : (4 forms)
  42266. //
  42267. // * VEXTRACTF32X4 imm8, zmm, xmm{k}{z} [AVX512F]
  42268. // * VEXTRACTF32X4 imm8, zmm, m128{k}{z} [AVX512F]
  42269. // * VEXTRACTF32X4 imm8, ymm, xmm{k}{z} [AVX512F,AVX512VL]
  42270. // * VEXTRACTF32X4 imm8, ymm, m128{k}{z} [AVX512F,AVX512VL]
  42271. //
  42272. func (self *Program) VEXTRACTF32X4(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  42273. p := self.alloc("VEXTRACTF32X4", 3, Operands { v0, v1, v2 })
  42274. // VEXTRACTF32X4 imm8, zmm, xmm{k}{z}
  42275. if isImm8(v0) && isZMM(v1) && isXMMkz(v2) {
  42276. self.require(ISA_AVX512F)
  42277. p.domain = DomainAVX
  42278. p.add(0, func(m *_Encoding, v []interface{}) {
  42279. m.emit(0x62)
  42280. m.emit(0xf3 ^ ((hcode(v[1]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[1]) << 4)))
  42281. m.emit(0x7d)
  42282. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x48)
  42283. m.emit(0x19)
  42284. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  42285. m.imm1(toImmAny(v[0]))
  42286. })
  42287. }
  42288. // VEXTRACTF32X4 imm8, zmm, m128{k}{z}
  42289. if isImm8(v0) && isZMM(v1) && isM128kz(v2) {
  42290. self.require(ISA_AVX512F)
  42291. p.domain = DomainAVX
  42292. p.add(0, func(m *_Encoding, v []interface{}) {
  42293. m.evex(0b11, 0x05, 0b10, ehcode(v[1]), addr(v[2]), 0, kcode(v[2]), zcode(v[2]), 0)
  42294. m.emit(0x19)
  42295. m.mrsd(lcode(v[1]), addr(v[2]), 16)
  42296. m.imm1(toImmAny(v[0]))
  42297. })
  42298. }
  42299. // VEXTRACTF32X4 imm8, ymm, xmm{k}{z}
  42300. if isImm8(v0) && isEVEXYMM(v1) && isXMMkz(v2) {
  42301. self.require(ISA_AVX512VL | ISA_AVX512F)
  42302. p.domain = DomainAVX
  42303. p.add(0, func(m *_Encoding, v []interface{}) {
  42304. m.emit(0x62)
  42305. m.emit(0xf3 ^ ((hcode(v[1]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[1]) << 4)))
  42306. m.emit(0x7d)
  42307. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x28)
  42308. m.emit(0x19)
  42309. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  42310. m.imm1(toImmAny(v[0]))
  42311. })
  42312. }
  42313. // VEXTRACTF32X4 imm8, ymm, m128{k}{z}
  42314. if isImm8(v0) && isEVEXYMM(v1) && isM128kz(v2) {
  42315. self.require(ISA_AVX512VL | ISA_AVX512F)
  42316. p.domain = DomainAVX
  42317. p.add(0, func(m *_Encoding, v []interface{}) {
  42318. m.evex(0b11, 0x05, 0b01, ehcode(v[1]), addr(v[2]), 0, kcode(v[2]), zcode(v[2]), 0)
  42319. m.emit(0x19)
  42320. m.mrsd(lcode(v[1]), addr(v[2]), 16)
  42321. m.imm1(toImmAny(v[0]))
  42322. })
  42323. }
  42324. if p.len == 0 {
  42325. panic("invalid operands for VEXTRACTF32X4")
  42326. }
  42327. return p
  42328. }
  42329. // VEXTRACTF32X8 performs "Extract 256 Bits of Packed Single-Precision Floating-Point Values".
  42330. //
  42331. // Mnemonic : VEXTRACTF32X8
  42332. // Supported forms : (2 forms)
  42333. //
  42334. // * VEXTRACTF32X8 imm8, zmm, ymm{k}{z} [AVX512DQ]
  42335. // * VEXTRACTF32X8 imm8, zmm, m256{k}{z} [AVX512DQ]
  42336. //
  42337. func (self *Program) VEXTRACTF32X8(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  42338. p := self.alloc("VEXTRACTF32X8", 3, Operands { v0, v1, v2 })
  42339. // VEXTRACTF32X8 imm8, zmm, ymm{k}{z}
  42340. if isImm8(v0) && isZMM(v1) && isYMMkz(v2) {
  42341. self.require(ISA_AVX512DQ)
  42342. p.domain = DomainAVX
  42343. p.add(0, func(m *_Encoding, v []interface{}) {
  42344. m.emit(0x62)
  42345. m.emit(0xf3 ^ ((hcode(v[1]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[1]) << 4)))
  42346. m.emit(0x7d)
  42347. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x48)
  42348. m.emit(0x1b)
  42349. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  42350. m.imm1(toImmAny(v[0]))
  42351. })
  42352. }
  42353. // VEXTRACTF32X8 imm8, zmm, m256{k}{z}
  42354. if isImm8(v0) && isZMM(v1) && isM256kz(v2) {
  42355. self.require(ISA_AVX512DQ)
  42356. p.domain = DomainAVX
  42357. p.add(0, func(m *_Encoding, v []interface{}) {
  42358. m.evex(0b11, 0x05, 0b10, ehcode(v[1]), addr(v[2]), 0, kcode(v[2]), zcode(v[2]), 0)
  42359. m.emit(0x1b)
  42360. m.mrsd(lcode(v[1]), addr(v[2]), 32)
  42361. m.imm1(toImmAny(v[0]))
  42362. })
  42363. }
  42364. if p.len == 0 {
  42365. panic("invalid operands for VEXTRACTF32X8")
  42366. }
  42367. return p
  42368. }
  42369. // VEXTRACTF64X2 performs "Extract 128 Bits of Packed Double-Precision Floating-Point Values".
  42370. //
  42371. // Mnemonic : VEXTRACTF64X2
  42372. // Supported forms : (4 forms)
  42373. //
  42374. // * VEXTRACTF64X2 imm8, zmm, xmm{k}{z} [AVX512DQ]
  42375. // * VEXTRACTF64X2 imm8, zmm, m128{k}{z} [AVX512DQ]
  42376. // * VEXTRACTF64X2 imm8, ymm, xmm{k}{z} [AVX512DQ,AVX512VL]
  42377. // * VEXTRACTF64X2 imm8, ymm, m128{k}{z} [AVX512DQ,AVX512VL]
  42378. //
  42379. func (self *Program) VEXTRACTF64X2(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  42380. p := self.alloc("VEXTRACTF64X2", 3, Operands { v0, v1, v2 })
  42381. // VEXTRACTF64X2 imm8, zmm, xmm{k}{z}
  42382. if isImm8(v0) && isZMM(v1) && isXMMkz(v2) {
  42383. self.require(ISA_AVX512DQ)
  42384. p.domain = DomainAVX
  42385. p.add(0, func(m *_Encoding, v []interface{}) {
  42386. m.emit(0x62)
  42387. m.emit(0xf3 ^ ((hcode(v[1]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[1]) << 4)))
  42388. m.emit(0xfd)
  42389. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x48)
  42390. m.emit(0x19)
  42391. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  42392. m.imm1(toImmAny(v[0]))
  42393. })
  42394. }
  42395. // VEXTRACTF64X2 imm8, zmm, m128{k}{z}
  42396. if isImm8(v0) && isZMM(v1) && isM128kz(v2) {
  42397. self.require(ISA_AVX512DQ)
  42398. p.domain = DomainAVX
  42399. p.add(0, func(m *_Encoding, v []interface{}) {
  42400. m.evex(0b11, 0x85, 0b10, ehcode(v[1]), addr(v[2]), 0, kcode(v[2]), zcode(v[2]), 0)
  42401. m.emit(0x19)
  42402. m.mrsd(lcode(v[1]), addr(v[2]), 16)
  42403. m.imm1(toImmAny(v[0]))
  42404. })
  42405. }
  42406. // VEXTRACTF64X2 imm8, ymm, xmm{k}{z}
  42407. if isImm8(v0) && isEVEXYMM(v1) && isXMMkz(v2) {
  42408. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  42409. p.domain = DomainAVX
  42410. p.add(0, func(m *_Encoding, v []interface{}) {
  42411. m.emit(0x62)
  42412. m.emit(0xf3 ^ ((hcode(v[1]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[1]) << 4)))
  42413. m.emit(0xfd)
  42414. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x28)
  42415. m.emit(0x19)
  42416. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  42417. m.imm1(toImmAny(v[0]))
  42418. })
  42419. }
  42420. // VEXTRACTF64X2 imm8, ymm, m128{k}{z}
  42421. if isImm8(v0) && isEVEXYMM(v1) && isM128kz(v2) {
  42422. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  42423. p.domain = DomainAVX
  42424. p.add(0, func(m *_Encoding, v []interface{}) {
  42425. m.evex(0b11, 0x85, 0b01, ehcode(v[1]), addr(v[2]), 0, kcode(v[2]), zcode(v[2]), 0)
  42426. m.emit(0x19)
  42427. m.mrsd(lcode(v[1]), addr(v[2]), 16)
  42428. m.imm1(toImmAny(v[0]))
  42429. })
  42430. }
  42431. if p.len == 0 {
  42432. panic("invalid operands for VEXTRACTF64X2")
  42433. }
  42434. return p
  42435. }
  42436. // VEXTRACTF64X4 performs "Extract 256 Bits of Packed Double-Precision Floating-Point Values".
  42437. //
  42438. // Mnemonic : VEXTRACTF64X4
  42439. // Supported forms : (2 forms)
  42440. //
  42441. // * VEXTRACTF64X4 imm8, zmm, ymm{k}{z} [AVX512F]
  42442. // * VEXTRACTF64X4 imm8, zmm, m256{k}{z} [AVX512F]
  42443. //
  42444. func (self *Program) VEXTRACTF64X4(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  42445. p := self.alloc("VEXTRACTF64X4", 3, Operands { v0, v1, v2 })
  42446. // VEXTRACTF64X4 imm8, zmm, ymm{k}{z}
  42447. if isImm8(v0) && isZMM(v1) && isYMMkz(v2) {
  42448. self.require(ISA_AVX512F)
  42449. p.domain = DomainAVX
  42450. p.add(0, func(m *_Encoding, v []interface{}) {
  42451. m.emit(0x62)
  42452. m.emit(0xf3 ^ ((hcode(v[1]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[1]) << 4)))
  42453. m.emit(0xfd)
  42454. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x48)
  42455. m.emit(0x1b)
  42456. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  42457. m.imm1(toImmAny(v[0]))
  42458. })
  42459. }
  42460. // VEXTRACTF64X4 imm8, zmm, m256{k}{z}
  42461. if isImm8(v0) && isZMM(v1) && isM256kz(v2) {
  42462. self.require(ISA_AVX512F)
  42463. p.domain = DomainAVX
  42464. p.add(0, func(m *_Encoding, v []interface{}) {
  42465. m.evex(0b11, 0x85, 0b10, ehcode(v[1]), addr(v[2]), 0, kcode(v[2]), zcode(v[2]), 0)
  42466. m.emit(0x1b)
  42467. m.mrsd(lcode(v[1]), addr(v[2]), 32)
  42468. m.imm1(toImmAny(v[0]))
  42469. })
  42470. }
  42471. if p.len == 0 {
  42472. panic("invalid operands for VEXTRACTF64X4")
  42473. }
  42474. return p
  42475. }
  42476. // VEXTRACTI128 performs "Extract Packed Integer Values".
  42477. //
  42478. // Mnemonic : VEXTRACTI128
  42479. // Supported forms : (2 forms)
  42480. //
  42481. // * VEXTRACTI128 imm8, ymm, xmm [AVX2]
  42482. // * VEXTRACTI128 imm8, ymm, m128 [AVX2]
  42483. //
  42484. func (self *Program) VEXTRACTI128(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  42485. p := self.alloc("VEXTRACTI128", 3, Operands { v0, v1, v2 })
  42486. // VEXTRACTI128 imm8, ymm, xmm
  42487. if isImm8(v0) && isYMM(v1) && isXMM(v2) {
  42488. self.require(ISA_AVX2)
  42489. p.domain = DomainAVX
  42490. p.add(0, func(m *_Encoding, v []interface{}) {
  42491. m.emit(0xc4)
  42492. m.emit(0xe3 ^ (hcode(v[1]) << 7) ^ (hcode(v[2]) << 5))
  42493. m.emit(0x7d)
  42494. m.emit(0x39)
  42495. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  42496. m.imm1(toImmAny(v[0]))
  42497. })
  42498. }
  42499. // VEXTRACTI128 imm8, ymm, m128
  42500. if isImm8(v0) && isYMM(v1) && isM128(v2) {
  42501. self.require(ISA_AVX2)
  42502. p.domain = DomainAVX
  42503. p.add(0, func(m *_Encoding, v []interface{}) {
  42504. m.vex3(0xc4, 0b11, 0x05, hcode(v[1]), addr(v[2]), 0)
  42505. m.emit(0x39)
  42506. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  42507. m.imm1(toImmAny(v[0]))
  42508. })
  42509. }
  42510. if p.len == 0 {
  42511. panic("invalid operands for VEXTRACTI128")
  42512. }
  42513. return p
  42514. }
  42515. // VEXTRACTI32X4 performs "Extract 128 Bits of Packed Doubleword Integer Values".
  42516. //
  42517. // Mnemonic : VEXTRACTI32X4
  42518. // Supported forms : (4 forms)
  42519. //
  42520. // * VEXTRACTI32X4 imm8, zmm, xmm{k}{z} [AVX512F]
  42521. // * VEXTRACTI32X4 imm8, zmm, m128{k}{z} [AVX512F]
  42522. // * VEXTRACTI32X4 imm8, ymm, xmm{k}{z} [AVX512F,AVX512VL]
  42523. // * VEXTRACTI32X4 imm8, ymm, m128{k}{z} [AVX512F,AVX512VL]
  42524. //
  42525. func (self *Program) VEXTRACTI32X4(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  42526. p := self.alloc("VEXTRACTI32X4", 3, Operands { v0, v1, v2 })
  42527. // VEXTRACTI32X4 imm8, zmm, xmm{k}{z}
  42528. if isImm8(v0) && isZMM(v1) && isXMMkz(v2) {
  42529. self.require(ISA_AVX512F)
  42530. p.domain = DomainAVX
  42531. p.add(0, func(m *_Encoding, v []interface{}) {
  42532. m.emit(0x62)
  42533. m.emit(0xf3 ^ ((hcode(v[1]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[1]) << 4)))
  42534. m.emit(0x7d)
  42535. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x48)
  42536. m.emit(0x39)
  42537. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  42538. m.imm1(toImmAny(v[0]))
  42539. })
  42540. }
  42541. // VEXTRACTI32X4 imm8, zmm, m128{k}{z}
  42542. if isImm8(v0) && isZMM(v1) && isM128kz(v2) {
  42543. self.require(ISA_AVX512F)
  42544. p.domain = DomainAVX
  42545. p.add(0, func(m *_Encoding, v []interface{}) {
  42546. m.evex(0b11, 0x05, 0b10, ehcode(v[1]), addr(v[2]), 0, kcode(v[2]), zcode(v[2]), 0)
  42547. m.emit(0x39)
  42548. m.mrsd(lcode(v[1]), addr(v[2]), 16)
  42549. m.imm1(toImmAny(v[0]))
  42550. })
  42551. }
  42552. // VEXTRACTI32X4 imm8, ymm, xmm{k}{z}
  42553. if isImm8(v0) && isEVEXYMM(v1) && isXMMkz(v2) {
  42554. self.require(ISA_AVX512VL | ISA_AVX512F)
  42555. p.domain = DomainAVX
  42556. p.add(0, func(m *_Encoding, v []interface{}) {
  42557. m.emit(0x62)
  42558. m.emit(0xf3 ^ ((hcode(v[1]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[1]) << 4)))
  42559. m.emit(0x7d)
  42560. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x28)
  42561. m.emit(0x39)
  42562. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  42563. m.imm1(toImmAny(v[0]))
  42564. })
  42565. }
  42566. // VEXTRACTI32X4 imm8, ymm, m128{k}{z}
  42567. if isImm8(v0) && isEVEXYMM(v1) && isM128kz(v2) {
  42568. self.require(ISA_AVX512VL | ISA_AVX512F)
  42569. p.domain = DomainAVX
  42570. p.add(0, func(m *_Encoding, v []interface{}) {
  42571. m.evex(0b11, 0x05, 0b01, ehcode(v[1]), addr(v[2]), 0, kcode(v[2]), zcode(v[2]), 0)
  42572. m.emit(0x39)
  42573. m.mrsd(lcode(v[1]), addr(v[2]), 16)
  42574. m.imm1(toImmAny(v[0]))
  42575. })
  42576. }
  42577. if p.len == 0 {
  42578. panic("invalid operands for VEXTRACTI32X4")
  42579. }
  42580. return p
  42581. }
  42582. // VEXTRACTI32X8 performs "Extract 256 Bits of Packed Doubleword Integer Values".
  42583. //
  42584. // Mnemonic : VEXTRACTI32X8
  42585. // Supported forms : (2 forms)
  42586. //
  42587. // * VEXTRACTI32X8 imm8, zmm, ymm{k}{z} [AVX512DQ]
  42588. // * VEXTRACTI32X8 imm8, zmm, m256{k}{z} [AVX512DQ]
  42589. //
  42590. func (self *Program) VEXTRACTI32X8(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  42591. p := self.alloc("VEXTRACTI32X8", 3, Operands { v0, v1, v2 })
  42592. // VEXTRACTI32X8 imm8, zmm, ymm{k}{z}
  42593. if isImm8(v0) && isZMM(v1) && isYMMkz(v2) {
  42594. self.require(ISA_AVX512DQ)
  42595. p.domain = DomainAVX
  42596. p.add(0, func(m *_Encoding, v []interface{}) {
  42597. m.emit(0x62)
  42598. m.emit(0xf3 ^ ((hcode(v[1]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[1]) << 4)))
  42599. m.emit(0x7d)
  42600. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x48)
  42601. m.emit(0x3b)
  42602. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  42603. m.imm1(toImmAny(v[0]))
  42604. })
  42605. }
  42606. // VEXTRACTI32X8 imm8, zmm, m256{k}{z}
  42607. if isImm8(v0) && isZMM(v1) && isM256kz(v2) {
  42608. self.require(ISA_AVX512DQ)
  42609. p.domain = DomainAVX
  42610. p.add(0, func(m *_Encoding, v []interface{}) {
  42611. m.evex(0b11, 0x05, 0b10, ehcode(v[1]), addr(v[2]), 0, kcode(v[2]), zcode(v[2]), 0)
  42612. m.emit(0x3b)
  42613. m.mrsd(lcode(v[1]), addr(v[2]), 32)
  42614. m.imm1(toImmAny(v[0]))
  42615. })
  42616. }
  42617. if p.len == 0 {
  42618. panic("invalid operands for VEXTRACTI32X8")
  42619. }
  42620. return p
  42621. }
  42622. // VEXTRACTI64X2 performs "Extract 128 Bits of Packed Quadword Integer Values".
  42623. //
  42624. // Mnemonic : VEXTRACTI64X2
  42625. // Supported forms : (4 forms)
  42626. //
  42627. // * VEXTRACTI64X2 imm8, zmm, xmm{k}{z} [AVX512DQ]
  42628. // * VEXTRACTI64X2 imm8, zmm, m128{k}{z} [AVX512DQ]
  42629. // * VEXTRACTI64X2 imm8, ymm, xmm{k}{z} [AVX512DQ,AVX512VL]
  42630. // * VEXTRACTI64X2 imm8, ymm, m128{k}{z} [AVX512DQ,AVX512VL]
  42631. //
  42632. func (self *Program) VEXTRACTI64X2(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  42633. p := self.alloc("VEXTRACTI64X2", 3, Operands { v0, v1, v2 })
  42634. // VEXTRACTI64X2 imm8, zmm, xmm{k}{z}
  42635. if isImm8(v0) && isZMM(v1) && isXMMkz(v2) {
  42636. self.require(ISA_AVX512DQ)
  42637. p.domain = DomainAVX
  42638. p.add(0, func(m *_Encoding, v []interface{}) {
  42639. m.emit(0x62)
  42640. m.emit(0xf3 ^ ((hcode(v[1]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[1]) << 4)))
  42641. m.emit(0xfd)
  42642. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x48)
  42643. m.emit(0x39)
  42644. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  42645. m.imm1(toImmAny(v[0]))
  42646. })
  42647. }
  42648. // VEXTRACTI64X2 imm8, zmm, m128{k}{z}
  42649. if isImm8(v0) && isZMM(v1) && isM128kz(v2) {
  42650. self.require(ISA_AVX512DQ)
  42651. p.domain = DomainAVX
  42652. p.add(0, func(m *_Encoding, v []interface{}) {
  42653. m.evex(0b11, 0x85, 0b10, ehcode(v[1]), addr(v[2]), 0, kcode(v[2]), zcode(v[2]), 0)
  42654. m.emit(0x39)
  42655. m.mrsd(lcode(v[1]), addr(v[2]), 16)
  42656. m.imm1(toImmAny(v[0]))
  42657. })
  42658. }
  42659. // VEXTRACTI64X2 imm8, ymm, xmm{k}{z}
  42660. if isImm8(v0) && isEVEXYMM(v1) && isXMMkz(v2) {
  42661. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  42662. p.domain = DomainAVX
  42663. p.add(0, func(m *_Encoding, v []interface{}) {
  42664. m.emit(0x62)
  42665. m.emit(0xf3 ^ ((hcode(v[1]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[1]) << 4)))
  42666. m.emit(0xfd)
  42667. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x28)
  42668. m.emit(0x39)
  42669. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  42670. m.imm1(toImmAny(v[0]))
  42671. })
  42672. }
  42673. // VEXTRACTI64X2 imm8, ymm, m128{k}{z}
  42674. if isImm8(v0) && isEVEXYMM(v1) && isM128kz(v2) {
  42675. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  42676. p.domain = DomainAVX
  42677. p.add(0, func(m *_Encoding, v []interface{}) {
  42678. m.evex(0b11, 0x85, 0b01, ehcode(v[1]), addr(v[2]), 0, kcode(v[2]), zcode(v[2]), 0)
  42679. m.emit(0x39)
  42680. m.mrsd(lcode(v[1]), addr(v[2]), 16)
  42681. m.imm1(toImmAny(v[0]))
  42682. })
  42683. }
  42684. if p.len == 0 {
  42685. panic("invalid operands for VEXTRACTI64X2")
  42686. }
  42687. return p
  42688. }
  42689. // VEXTRACTI64X4 performs "Extract 256 Bits of Packed Quadword Integer Values".
  42690. //
  42691. // Mnemonic : VEXTRACTI64X4
  42692. // Supported forms : (2 forms)
  42693. //
  42694. // * VEXTRACTI64X4 imm8, zmm, ymm{k}{z} [AVX512F]
  42695. // * VEXTRACTI64X4 imm8, zmm, m256{k}{z} [AVX512F]
  42696. //
  42697. func (self *Program) VEXTRACTI64X4(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  42698. p := self.alloc("VEXTRACTI64X4", 3, Operands { v0, v1, v2 })
  42699. // VEXTRACTI64X4 imm8, zmm, ymm{k}{z}
  42700. if isImm8(v0) && isZMM(v1) && isYMMkz(v2) {
  42701. self.require(ISA_AVX512F)
  42702. p.domain = DomainAVX
  42703. p.add(0, func(m *_Encoding, v []interface{}) {
  42704. m.emit(0x62)
  42705. m.emit(0xf3 ^ ((hcode(v[1]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[1]) << 4)))
  42706. m.emit(0xfd)
  42707. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x48)
  42708. m.emit(0x3b)
  42709. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  42710. m.imm1(toImmAny(v[0]))
  42711. })
  42712. }
  42713. // VEXTRACTI64X4 imm8, zmm, m256{k}{z}
  42714. if isImm8(v0) && isZMM(v1) && isM256kz(v2) {
  42715. self.require(ISA_AVX512F)
  42716. p.domain = DomainAVX
  42717. p.add(0, func(m *_Encoding, v []interface{}) {
  42718. m.evex(0b11, 0x85, 0b10, ehcode(v[1]), addr(v[2]), 0, kcode(v[2]), zcode(v[2]), 0)
  42719. m.emit(0x3b)
  42720. m.mrsd(lcode(v[1]), addr(v[2]), 32)
  42721. m.imm1(toImmAny(v[0]))
  42722. })
  42723. }
  42724. if p.len == 0 {
  42725. panic("invalid operands for VEXTRACTI64X4")
  42726. }
  42727. return p
  42728. }
  42729. // VEXTRACTPS performs "Extract Packed Single Precision Floating-Point Value".
  42730. //
  42731. // Mnemonic : VEXTRACTPS
  42732. // Supported forms : (4 forms)
  42733. //
  42734. // * VEXTRACTPS imm8, xmm, r32 [AVX]
  42735. // * VEXTRACTPS imm8, xmm, m32 [AVX]
  42736. // * VEXTRACTPS imm8, xmm, r32 [AVX512F]
  42737. // * VEXTRACTPS imm8, xmm, m32 [AVX512F]
  42738. //
  42739. func (self *Program) VEXTRACTPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  42740. p := self.alloc("VEXTRACTPS", 3, Operands { v0, v1, v2 })
  42741. // VEXTRACTPS imm8, xmm, r32
  42742. if isImm8(v0) && isXMM(v1) && isReg32(v2) {
  42743. self.require(ISA_AVX)
  42744. p.domain = DomainAVX
  42745. p.add(0, func(m *_Encoding, v []interface{}) {
  42746. m.emit(0xc4)
  42747. m.emit(0xe3 ^ (hcode(v[1]) << 7) ^ (hcode(v[2]) << 5))
  42748. m.emit(0x79)
  42749. m.emit(0x17)
  42750. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  42751. m.imm1(toImmAny(v[0]))
  42752. })
  42753. }
  42754. // VEXTRACTPS imm8, xmm, m32
  42755. if isImm8(v0) && isXMM(v1) && isM32(v2) {
  42756. self.require(ISA_AVX)
  42757. p.domain = DomainAVX
  42758. p.add(0, func(m *_Encoding, v []interface{}) {
  42759. m.vex3(0xc4, 0b11, 0x01, hcode(v[1]), addr(v[2]), 0)
  42760. m.emit(0x17)
  42761. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  42762. m.imm1(toImmAny(v[0]))
  42763. })
  42764. }
  42765. // VEXTRACTPS imm8, xmm, r32
  42766. if isImm8(v0) && isEVEXXMM(v1) && isReg32(v2) {
  42767. self.require(ISA_AVX512F)
  42768. p.domain = DomainAVX
  42769. p.add(0, func(m *_Encoding, v []interface{}) {
  42770. m.emit(0x62)
  42771. m.emit(0xf3 ^ ((hcode(v[1]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[1]) << 4)))
  42772. m.emit(0x7d)
  42773. m.emit(0x08)
  42774. m.emit(0x17)
  42775. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  42776. m.imm1(toImmAny(v[0]))
  42777. })
  42778. }
  42779. // VEXTRACTPS imm8, xmm, m32
  42780. if isImm8(v0) && isEVEXXMM(v1) && isM32(v2) {
  42781. self.require(ISA_AVX512F)
  42782. p.domain = DomainAVX
  42783. p.add(0, func(m *_Encoding, v []interface{}) {
  42784. m.evex(0b11, 0x05, 0b00, ehcode(v[1]), addr(v[2]), 0, 0, 0, 0)
  42785. m.emit(0x17)
  42786. m.mrsd(lcode(v[1]), addr(v[2]), 4)
  42787. m.imm1(toImmAny(v[0]))
  42788. })
  42789. }
  42790. if p.len == 0 {
  42791. panic("invalid operands for VEXTRACTPS")
  42792. }
  42793. return p
  42794. }
  42795. // VFIXUPIMMPD performs "Fix Up Special Packed Double-Precision Floating-Point Values".
  42796. //
  42797. // Mnemonic : VFIXUPIMMPD
  42798. // Supported forms : (7 forms)
  42799. //
  42800. // * VFIXUPIMMPD imm8, m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  42801. // * VFIXUPIMMPD imm8, {sae}, zmm, zmm, zmm{k}{z} [AVX512F]
  42802. // * VFIXUPIMMPD imm8, zmm, zmm, zmm{k}{z} [AVX512F]
  42803. // * VFIXUPIMMPD imm8, m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  42804. // * VFIXUPIMMPD imm8, xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  42805. // * VFIXUPIMMPD imm8, m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  42806. // * VFIXUPIMMPD imm8, ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  42807. //
  42808. func (self *Program) VFIXUPIMMPD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}, vv ...interface{}) *Instruction {
  42809. var p *Instruction
  42810. switch len(vv) {
  42811. case 0 : p = self.alloc("VFIXUPIMMPD", 4, Operands { v0, v1, v2, v3 })
  42812. case 1 : p = self.alloc("VFIXUPIMMPD", 5, Operands { v0, v1, v2, v3, vv[0] })
  42813. default : panic("instruction VFIXUPIMMPD takes 4 or 5 operands")
  42814. }
  42815. // VFIXUPIMMPD imm8, m512/m64bcst, zmm, zmm{k}{z}
  42816. if len(vv) == 0 && isImm8(v0) && isM512M64bcst(v1) && isZMM(v2) && isZMMkz(v3) {
  42817. self.require(ISA_AVX512F)
  42818. p.domain = DomainAVX
  42819. p.add(0, func(m *_Encoding, v []interface{}) {
  42820. m.evex(0b11, 0x85, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  42821. m.emit(0x54)
  42822. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  42823. m.imm1(toImmAny(v[0]))
  42824. })
  42825. }
  42826. // VFIXUPIMMPD imm8, {sae}, zmm, zmm, zmm{k}{z}
  42827. if len(vv) == 1 && isImm8(v0) && isSAE(v1) && isZMM(v2) && isZMM(v3) && isZMMkz(vv[0]) {
  42828. self.require(ISA_AVX512F)
  42829. p.domain = DomainAVX
  42830. p.add(0, func(m *_Encoding, v []interface{}) {
  42831. m.emit(0x62)
  42832. m.emit(0xf3 ^ ((hcode(v[4]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[4]) << 4)))
  42833. m.emit(0xfd ^ (hlcode(v[3]) << 3))
  42834. m.emit((zcode(v[4]) << 7) | (0x08 ^ (ecode(v[3]) << 3)) | kcode(v[4]) | 0x10)
  42835. m.emit(0x54)
  42836. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[2]))
  42837. m.imm1(toImmAny(v[0]))
  42838. })
  42839. }
  42840. // VFIXUPIMMPD imm8, zmm, zmm, zmm{k}{z}
  42841. if len(vv) == 0 && isImm8(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(v3) {
  42842. self.require(ISA_AVX512F)
  42843. p.domain = DomainAVX
  42844. p.add(0, func(m *_Encoding, v []interface{}) {
  42845. m.emit(0x62)
  42846. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  42847. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  42848. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  42849. m.emit(0x54)
  42850. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  42851. m.imm1(toImmAny(v[0]))
  42852. })
  42853. }
  42854. // VFIXUPIMMPD imm8, m128/m64bcst, xmm, xmm{k}{z}
  42855. if len(vv) == 0 && isImm8(v0) && isM128M64bcst(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  42856. self.require(ISA_AVX512VL | ISA_AVX512F)
  42857. p.domain = DomainAVX
  42858. p.add(0, func(m *_Encoding, v []interface{}) {
  42859. m.evex(0b11, 0x85, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  42860. m.emit(0x54)
  42861. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  42862. m.imm1(toImmAny(v[0]))
  42863. })
  42864. }
  42865. // VFIXUPIMMPD imm8, xmm, xmm, xmm{k}{z}
  42866. if len(vv) == 0 && isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  42867. self.require(ISA_AVX512VL | ISA_AVX512F)
  42868. p.domain = DomainAVX
  42869. p.add(0, func(m *_Encoding, v []interface{}) {
  42870. m.emit(0x62)
  42871. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  42872. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  42873. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  42874. m.emit(0x54)
  42875. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  42876. m.imm1(toImmAny(v[0]))
  42877. })
  42878. }
  42879. // VFIXUPIMMPD imm8, m256/m64bcst, ymm, ymm{k}{z}
  42880. if len(vv) == 0 && isImm8(v0) && isM256M64bcst(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  42881. self.require(ISA_AVX512VL | ISA_AVX512F)
  42882. p.domain = DomainAVX
  42883. p.add(0, func(m *_Encoding, v []interface{}) {
  42884. m.evex(0b11, 0x85, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  42885. m.emit(0x54)
  42886. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  42887. m.imm1(toImmAny(v[0]))
  42888. })
  42889. }
  42890. // VFIXUPIMMPD imm8, ymm, ymm, ymm{k}{z}
  42891. if len(vv) == 0 && isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  42892. self.require(ISA_AVX512VL | ISA_AVX512F)
  42893. p.domain = DomainAVX
  42894. p.add(0, func(m *_Encoding, v []interface{}) {
  42895. m.emit(0x62)
  42896. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  42897. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  42898. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  42899. m.emit(0x54)
  42900. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  42901. m.imm1(toImmAny(v[0]))
  42902. })
  42903. }
  42904. if p.len == 0 {
  42905. panic("invalid operands for VFIXUPIMMPD")
  42906. }
  42907. return p
  42908. }
  42909. // VFIXUPIMMPS performs "Fix Up Special Packed Single-Precision Floating-Point Values".
  42910. //
  42911. // Mnemonic : VFIXUPIMMPS
  42912. // Supported forms : (7 forms)
  42913. //
  42914. // * VFIXUPIMMPS imm8, m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  42915. // * VFIXUPIMMPS imm8, {sae}, zmm, zmm, zmm{k}{z} [AVX512F]
  42916. // * VFIXUPIMMPS imm8, zmm, zmm, zmm{k}{z} [AVX512F]
  42917. // * VFIXUPIMMPS imm8, m128/m32bcst, xmm, xmm{k}{z} [AVX512VL]
  42918. // * VFIXUPIMMPS imm8, xmm, xmm, xmm{k}{z} [AVX512VL]
  42919. // * VFIXUPIMMPS imm8, m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  42920. // * VFIXUPIMMPS imm8, ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  42921. //
  42922. func (self *Program) VFIXUPIMMPS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}, vv ...interface{}) *Instruction {
  42923. var p *Instruction
  42924. switch len(vv) {
  42925. case 0 : p = self.alloc("VFIXUPIMMPS", 4, Operands { v0, v1, v2, v3 })
  42926. case 1 : p = self.alloc("VFIXUPIMMPS", 5, Operands { v0, v1, v2, v3, vv[0] })
  42927. default : panic("instruction VFIXUPIMMPS takes 4 or 5 operands")
  42928. }
  42929. // VFIXUPIMMPS imm8, m512/m32bcst, zmm, zmm{k}{z}
  42930. if len(vv) == 0 && isImm8(v0) && isM512M32bcst(v1) && isZMM(v2) && isZMMkz(v3) {
  42931. self.require(ISA_AVX512F)
  42932. p.domain = DomainAVX
  42933. p.add(0, func(m *_Encoding, v []interface{}) {
  42934. m.evex(0b11, 0x05, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  42935. m.emit(0x54)
  42936. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  42937. m.imm1(toImmAny(v[0]))
  42938. })
  42939. }
  42940. // VFIXUPIMMPS imm8, {sae}, zmm, zmm, zmm{k}{z}
  42941. if len(vv) == 1 && isImm8(v0) && isSAE(v1) && isZMM(v2) && isZMM(v3) && isZMMkz(vv[0]) {
  42942. self.require(ISA_AVX512F)
  42943. p.domain = DomainAVX
  42944. p.add(0, func(m *_Encoding, v []interface{}) {
  42945. m.emit(0x62)
  42946. m.emit(0xf3 ^ ((hcode(v[4]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[4]) << 4)))
  42947. m.emit(0x7d ^ (hlcode(v[3]) << 3))
  42948. m.emit((zcode(v[4]) << 7) | (0x08 ^ (ecode(v[3]) << 3)) | kcode(v[4]) | 0x10)
  42949. m.emit(0x54)
  42950. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[2]))
  42951. m.imm1(toImmAny(v[0]))
  42952. })
  42953. }
  42954. // VFIXUPIMMPS imm8, zmm, zmm, zmm{k}{z}
  42955. if len(vv) == 0 && isImm8(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(v3) {
  42956. self.require(ISA_AVX512F)
  42957. p.domain = DomainAVX
  42958. p.add(0, func(m *_Encoding, v []interface{}) {
  42959. m.emit(0x62)
  42960. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  42961. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  42962. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  42963. m.emit(0x54)
  42964. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  42965. m.imm1(toImmAny(v[0]))
  42966. })
  42967. }
  42968. // VFIXUPIMMPS imm8, m128/m32bcst, xmm, xmm{k}{z}
  42969. if len(vv) == 0 && isImm8(v0) && isM128M32bcst(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  42970. self.require(ISA_AVX512VL)
  42971. p.domain = DomainAVX
  42972. p.add(0, func(m *_Encoding, v []interface{}) {
  42973. m.evex(0b11, 0x05, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  42974. m.emit(0x54)
  42975. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  42976. m.imm1(toImmAny(v[0]))
  42977. })
  42978. }
  42979. // VFIXUPIMMPS imm8, xmm, xmm, xmm{k}{z}
  42980. if len(vv) == 0 && isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  42981. self.require(ISA_AVX512VL)
  42982. p.domain = DomainAVX
  42983. p.add(0, func(m *_Encoding, v []interface{}) {
  42984. m.emit(0x62)
  42985. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  42986. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  42987. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  42988. m.emit(0x54)
  42989. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  42990. m.imm1(toImmAny(v[0]))
  42991. })
  42992. }
  42993. // VFIXUPIMMPS imm8, m256/m32bcst, ymm, ymm{k}{z}
  42994. if len(vv) == 0 && isImm8(v0) && isM256M32bcst(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  42995. self.require(ISA_AVX512VL | ISA_AVX512F)
  42996. p.domain = DomainAVX
  42997. p.add(0, func(m *_Encoding, v []interface{}) {
  42998. m.evex(0b11, 0x05, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  42999. m.emit(0x54)
  43000. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  43001. m.imm1(toImmAny(v[0]))
  43002. })
  43003. }
  43004. // VFIXUPIMMPS imm8, ymm, ymm, ymm{k}{z}
  43005. if len(vv) == 0 && isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  43006. self.require(ISA_AVX512VL | ISA_AVX512F)
  43007. p.domain = DomainAVX
  43008. p.add(0, func(m *_Encoding, v []interface{}) {
  43009. m.emit(0x62)
  43010. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  43011. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  43012. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  43013. m.emit(0x54)
  43014. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  43015. m.imm1(toImmAny(v[0]))
  43016. })
  43017. }
  43018. if p.len == 0 {
  43019. panic("invalid operands for VFIXUPIMMPS")
  43020. }
  43021. return p
  43022. }
  43023. // VFIXUPIMMSD performs "Fix Up Special Scalar Double-Precision Floating-Point Value".
  43024. //
  43025. // Mnemonic : VFIXUPIMMSD
  43026. // Supported forms : (3 forms)
  43027. //
  43028. // * VFIXUPIMMSD imm8, m64, xmm, xmm{k}{z} [AVX512F]
  43029. // * VFIXUPIMMSD imm8, {sae}, xmm, xmm, xmm{k}{z} [AVX512F]
  43030. // * VFIXUPIMMSD imm8, xmm, xmm, xmm{k}{z} [AVX512F]
  43031. //
  43032. func (self *Program) VFIXUPIMMSD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}, vv ...interface{}) *Instruction {
  43033. var p *Instruction
  43034. switch len(vv) {
  43035. case 0 : p = self.alloc("VFIXUPIMMSD", 4, Operands { v0, v1, v2, v3 })
  43036. case 1 : p = self.alloc("VFIXUPIMMSD", 5, Operands { v0, v1, v2, v3, vv[0] })
  43037. default : panic("instruction VFIXUPIMMSD takes 4 or 5 operands")
  43038. }
  43039. // VFIXUPIMMSD imm8, m64, xmm, xmm{k}{z}
  43040. if len(vv) == 0 && isImm8(v0) && isM64(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  43041. self.require(ISA_AVX512F)
  43042. p.domain = DomainAVX
  43043. p.add(0, func(m *_Encoding, v []interface{}) {
  43044. m.evex(0b11, 0x85, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  43045. m.emit(0x55)
  43046. m.mrsd(lcode(v[3]), addr(v[1]), 8)
  43047. m.imm1(toImmAny(v[0]))
  43048. })
  43049. }
  43050. // VFIXUPIMMSD imm8, {sae}, xmm, xmm, xmm{k}{z}
  43051. if len(vv) == 1 && isImm8(v0) && isSAE(v1) && isEVEXXMM(v2) && isEVEXXMM(v3) && isXMMkz(vv[0]) {
  43052. self.require(ISA_AVX512F)
  43053. p.domain = DomainAVX
  43054. p.add(0, func(m *_Encoding, v []interface{}) {
  43055. m.emit(0x62)
  43056. m.emit(0xf3 ^ ((hcode(v[4]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[4]) << 4)))
  43057. m.emit(0xfd ^ (hlcode(v[3]) << 3))
  43058. m.emit((zcode(v[4]) << 7) | (0x08 ^ (ecode(v[3]) << 3)) | kcode(v[4]) | 0x10)
  43059. m.emit(0x55)
  43060. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[2]))
  43061. m.imm1(toImmAny(v[0]))
  43062. })
  43063. }
  43064. // VFIXUPIMMSD imm8, xmm, xmm, xmm{k}{z}
  43065. if len(vv) == 0 && isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  43066. self.require(ISA_AVX512F)
  43067. p.domain = DomainAVX
  43068. p.add(0, func(m *_Encoding, v []interface{}) {
  43069. m.emit(0x62)
  43070. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  43071. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  43072. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  43073. m.emit(0x55)
  43074. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  43075. m.imm1(toImmAny(v[0]))
  43076. })
  43077. }
  43078. if p.len == 0 {
  43079. panic("invalid operands for VFIXUPIMMSD")
  43080. }
  43081. return p
  43082. }
  43083. // VFIXUPIMMSS performs "Fix Up Special Scalar Single-Precision Floating-Point Value".
  43084. //
  43085. // Mnemonic : VFIXUPIMMSS
  43086. // Supported forms : (3 forms)
  43087. //
  43088. // * VFIXUPIMMSS imm8, m32, xmm, xmm{k}{z} [AVX512F]
  43089. // * VFIXUPIMMSS imm8, {sae}, xmm, xmm, xmm{k}{z} [AVX512F]
  43090. // * VFIXUPIMMSS imm8, xmm, xmm, xmm{k}{z} [AVX512F]
  43091. //
  43092. func (self *Program) VFIXUPIMMSS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}, vv ...interface{}) *Instruction {
  43093. var p *Instruction
  43094. switch len(vv) {
  43095. case 0 : p = self.alloc("VFIXUPIMMSS", 4, Operands { v0, v1, v2, v3 })
  43096. case 1 : p = self.alloc("VFIXUPIMMSS", 5, Operands { v0, v1, v2, v3, vv[0] })
  43097. default : panic("instruction VFIXUPIMMSS takes 4 or 5 operands")
  43098. }
  43099. // VFIXUPIMMSS imm8, m32, xmm, xmm{k}{z}
  43100. if len(vv) == 0 && isImm8(v0) && isM32(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  43101. self.require(ISA_AVX512F)
  43102. p.domain = DomainAVX
  43103. p.add(0, func(m *_Encoding, v []interface{}) {
  43104. m.evex(0b11, 0x05, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  43105. m.emit(0x55)
  43106. m.mrsd(lcode(v[3]), addr(v[1]), 4)
  43107. m.imm1(toImmAny(v[0]))
  43108. })
  43109. }
  43110. // VFIXUPIMMSS imm8, {sae}, xmm, xmm, xmm{k}{z}
  43111. if len(vv) == 1 && isImm8(v0) && isSAE(v1) && isEVEXXMM(v2) && isEVEXXMM(v3) && isXMMkz(vv[0]) {
  43112. self.require(ISA_AVX512F)
  43113. p.domain = DomainAVX
  43114. p.add(0, func(m *_Encoding, v []interface{}) {
  43115. m.emit(0x62)
  43116. m.emit(0xf3 ^ ((hcode(v[4]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[4]) << 4)))
  43117. m.emit(0x7d ^ (hlcode(v[3]) << 3))
  43118. m.emit((zcode(v[4]) << 7) | (0x08 ^ (ecode(v[3]) << 3)) | kcode(v[4]) | 0x10)
  43119. m.emit(0x55)
  43120. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[2]))
  43121. m.imm1(toImmAny(v[0]))
  43122. })
  43123. }
  43124. // VFIXUPIMMSS imm8, xmm, xmm, xmm{k}{z}
  43125. if len(vv) == 0 && isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  43126. self.require(ISA_AVX512F)
  43127. p.domain = DomainAVX
  43128. p.add(0, func(m *_Encoding, v []interface{}) {
  43129. m.emit(0x62)
  43130. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  43131. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  43132. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  43133. m.emit(0x55)
  43134. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  43135. m.imm1(toImmAny(v[0]))
  43136. })
  43137. }
  43138. if p.len == 0 {
  43139. panic("invalid operands for VFIXUPIMMSS")
  43140. }
  43141. return p
  43142. }
  43143. // VFMADD132PD performs "Fused Multiply-Add of Packed Double-Precision Floating-Point Values".
  43144. //
  43145. // Mnemonic : VFMADD132PD
  43146. // Supported forms : (11 forms)
  43147. //
  43148. // * VFMADD132PD xmm, xmm, xmm [FMA3]
  43149. // * VFMADD132PD m128, xmm, xmm [FMA3]
  43150. // * VFMADD132PD ymm, ymm, ymm [FMA3]
  43151. // * VFMADD132PD m256, ymm, ymm [FMA3]
  43152. // * VFMADD132PD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  43153. // * VFMADD132PD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  43154. // * VFMADD132PD zmm, zmm, zmm{k}{z} [AVX512F]
  43155. // * VFMADD132PD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  43156. // * VFMADD132PD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  43157. // * VFMADD132PD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  43158. // * VFMADD132PD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  43159. //
  43160. func (self *Program) VFMADD132PD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  43161. var p *Instruction
  43162. switch len(vv) {
  43163. case 0 : p = self.alloc("VFMADD132PD", 3, Operands { v0, v1, v2 })
  43164. case 1 : p = self.alloc("VFMADD132PD", 4, Operands { v0, v1, v2, vv[0] })
  43165. default : panic("instruction VFMADD132PD takes 3 or 4 operands")
  43166. }
  43167. // VFMADD132PD xmm, xmm, xmm
  43168. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  43169. self.require(ISA_FMA3)
  43170. p.domain = DomainFMA
  43171. p.add(0, func(m *_Encoding, v []interface{}) {
  43172. m.emit(0xc4)
  43173. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  43174. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  43175. m.emit(0x98)
  43176. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43177. })
  43178. }
  43179. // VFMADD132PD m128, xmm, xmm
  43180. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  43181. self.require(ISA_FMA3)
  43182. p.domain = DomainFMA
  43183. p.add(0, func(m *_Encoding, v []interface{}) {
  43184. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  43185. m.emit(0x98)
  43186. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  43187. })
  43188. }
  43189. // VFMADD132PD ymm, ymm, ymm
  43190. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  43191. self.require(ISA_FMA3)
  43192. p.domain = DomainFMA
  43193. p.add(0, func(m *_Encoding, v []interface{}) {
  43194. m.emit(0xc4)
  43195. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  43196. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  43197. m.emit(0x98)
  43198. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43199. })
  43200. }
  43201. // VFMADD132PD m256, ymm, ymm
  43202. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  43203. self.require(ISA_FMA3)
  43204. p.domain = DomainFMA
  43205. p.add(0, func(m *_Encoding, v []interface{}) {
  43206. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  43207. m.emit(0x98)
  43208. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  43209. })
  43210. }
  43211. // VFMADD132PD m512/m64bcst, zmm, zmm{k}{z}
  43212. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  43213. self.require(ISA_AVX512F)
  43214. p.domain = DomainFMA
  43215. p.add(0, func(m *_Encoding, v []interface{}) {
  43216. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  43217. m.emit(0x98)
  43218. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  43219. })
  43220. }
  43221. // VFMADD132PD {er}, zmm, zmm, zmm{k}{z}
  43222. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  43223. self.require(ISA_AVX512F)
  43224. p.domain = DomainFMA
  43225. p.add(0, func(m *_Encoding, v []interface{}) {
  43226. m.emit(0x62)
  43227. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  43228. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  43229. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  43230. m.emit(0x98)
  43231. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  43232. })
  43233. }
  43234. // VFMADD132PD zmm, zmm, zmm{k}{z}
  43235. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  43236. self.require(ISA_AVX512F)
  43237. p.domain = DomainFMA
  43238. p.add(0, func(m *_Encoding, v []interface{}) {
  43239. m.emit(0x62)
  43240. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  43241. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  43242. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  43243. m.emit(0x98)
  43244. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43245. })
  43246. }
  43247. // VFMADD132PD m128/m64bcst, xmm, xmm{k}{z}
  43248. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  43249. self.require(ISA_AVX512VL | ISA_AVX512F)
  43250. p.domain = DomainFMA
  43251. p.add(0, func(m *_Encoding, v []interface{}) {
  43252. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  43253. m.emit(0x98)
  43254. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  43255. })
  43256. }
  43257. // VFMADD132PD xmm, xmm, xmm{k}{z}
  43258. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  43259. self.require(ISA_AVX512VL | ISA_AVX512F)
  43260. p.domain = DomainFMA
  43261. p.add(0, func(m *_Encoding, v []interface{}) {
  43262. m.emit(0x62)
  43263. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  43264. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  43265. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  43266. m.emit(0x98)
  43267. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43268. })
  43269. }
  43270. // VFMADD132PD m256/m64bcst, ymm, ymm{k}{z}
  43271. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  43272. self.require(ISA_AVX512VL | ISA_AVX512F)
  43273. p.domain = DomainFMA
  43274. p.add(0, func(m *_Encoding, v []interface{}) {
  43275. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  43276. m.emit(0x98)
  43277. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  43278. })
  43279. }
  43280. // VFMADD132PD ymm, ymm, ymm{k}{z}
  43281. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  43282. self.require(ISA_AVX512VL | ISA_AVX512F)
  43283. p.domain = DomainFMA
  43284. p.add(0, func(m *_Encoding, v []interface{}) {
  43285. m.emit(0x62)
  43286. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  43287. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  43288. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  43289. m.emit(0x98)
  43290. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43291. })
  43292. }
  43293. if p.len == 0 {
  43294. panic("invalid operands for VFMADD132PD")
  43295. }
  43296. return p
  43297. }
  43298. // VFMADD132PS performs "Fused Multiply-Add of Packed Single-Precision Floating-Point Values".
  43299. //
  43300. // Mnemonic : VFMADD132PS
  43301. // Supported forms : (11 forms)
  43302. //
  43303. // * VFMADD132PS xmm, xmm, xmm [FMA3]
  43304. // * VFMADD132PS m128, xmm, xmm [FMA3]
  43305. // * VFMADD132PS ymm, ymm, ymm [FMA3]
  43306. // * VFMADD132PS m256, ymm, ymm [FMA3]
  43307. // * VFMADD132PS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  43308. // * VFMADD132PS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  43309. // * VFMADD132PS zmm, zmm, zmm{k}{z} [AVX512F]
  43310. // * VFMADD132PS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  43311. // * VFMADD132PS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  43312. // * VFMADD132PS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  43313. // * VFMADD132PS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  43314. //
  43315. func (self *Program) VFMADD132PS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  43316. var p *Instruction
  43317. switch len(vv) {
  43318. case 0 : p = self.alloc("VFMADD132PS", 3, Operands { v0, v1, v2 })
  43319. case 1 : p = self.alloc("VFMADD132PS", 4, Operands { v0, v1, v2, vv[0] })
  43320. default : panic("instruction VFMADD132PS takes 3 or 4 operands")
  43321. }
  43322. // VFMADD132PS xmm, xmm, xmm
  43323. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  43324. self.require(ISA_FMA3)
  43325. p.domain = DomainFMA
  43326. p.add(0, func(m *_Encoding, v []interface{}) {
  43327. m.emit(0xc4)
  43328. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  43329. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  43330. m.emit(0x98)
  43331. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43332. })
  43333. }
  43334. // VFMADD132PS m128, xmm, xmm
  43335. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  43336. self.require(ISA_FMA3)
  43337. p.domain = DomainFMA
  43338. p.add(0, func(m *_Encoding, v []interface{}) {
  43339. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  43340. m.emit(0x98)
  43341. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  43342. })
  43343. }
  43344. // VFMADD132PS ymm, ymm, ymm
  43345. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  43346. self.require(ISA_FMA3)
  43347. p.domain = DomainFMA
  43348. p.add(0, func(m *_Encoding, v []interface{}) {
  43349. m.emit(0xc4)
  43350. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  43351. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  43352. m.emit(0x98)
  43353. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43354. })
  43355. }
  43356. // VFMADD132PS m256, ymm, ymm
  43357. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  43358. self.require(ISA_FMA3)
  43359. p.domain = DomainFMA
  43360. p.add(0, func(m *_Encoding, v []interface{}) {
  43361. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  43362. m.emit(0x98)
  43363. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  43364. })
  43365. }
  43366. // VFMADD132PS m512/m32bcst, zmm, zmm{k}{z}
  43367. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  43368. self.require(ISA_AVX512F)
  43369. p.domain = DomainFMA
  43370. p.add(0, func(m *_Encoding, v []interface{}) {
  43371. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  43372. m.emit(0x98)
  43373. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  43374. })
  43375. }
  43376. // VFMADD132PS {er}, zmm, zmm, zmm{k}{z}
  43377. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  43378. self.require(ISA_AVX512F)
  43379. p.domain = DomainFMA
  43380. p.add(0, func(m *_Encoding, v []interface{}) {
  43381. m.emit(0x62)
  43382. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  43383. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  43384. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  43385. m.emit(0x98)
  43386. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  43387. })
  43388. }
  43389. // VFMADD132PS zmm, zmm, zmm{k}{z}
  43390. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  43391. self.require(ISA_AVX512F)
  43392. p.domain = DomainFMA
  43393. p.add(0, func(m *_Encoding, v []interface{}) {
  43394. m.emit(0x62)
  43395. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  43396. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  43397. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  43398. m.emit(0x98)
  43399. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43400. })
  43401. }
  43402. // VFMADD132PS m128/m32bcst, xmm, xmm{k}{z}
  43403. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  43404. self.require(ISA_AVX512VL | ISA_AVX512F)
  43405. p.domain = DomainFMA
  43406. p.add(0, func(m *_Encoding, v []interface{}) {
  43407. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  43408. m.emit(0x98)
  43409. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  43410. })
  43411. }
  43412. // VFMADD132PS xmm, xmm, xmm{k}{z}
  43413. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  43414. self.require(ISA_AVX512VL | ISA_AVX512F)
  43415. p.domain = DomainFMA
  43416. p.add(0, func(m *_Encoding, v []interface{}) {
  43417. m.emit(0x62)
  43418. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  43419. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  43420. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  43421. m.emit(0x98)
  43422. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43423. })
  43424. }
  43425. // VFMADD132PS m256/m32bcst, ymm, ymm{k}{z}
  43426. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  43427. self.require(ISA_AVX512VL | ISA_AVX512F)
  43428. p.domain = DomainFMA
  43429. p.add(0, func(m *_Encoding, v []interface{}) {
  43430. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  43431. m.emit(0x98)
  43432. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  43433. })
  43434. }
  43435. // VFMADD132PS ymm, ymm, ymm{k}{z}
  43436. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  43437. self.require(ISA_AVX512VL | ISA_AVX512F)
  43438. p.domain = DomainFMA
  43439. p.add(0, func(m *_Encoding, v []interface{}) {
  43440. m.emit(0x62)
  43441. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  43442. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  43443. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  43444. m.emit(0x98)
  43445. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43446. })
  43447. }
  43448. if p.len == 0 {
  43449. panic("invalid operands for VFMADD132PS")
  43450. }
  43451. return p
  43452. }
  43453. // VFMADD132SD performs "Fused Multiply-Add of Scalar Double-Precision Floating-Point Values".
  43454. //
  43455. // Mnemonic : VFMADD132SD
  43456. // Supported forms : (5 forms)
  43457. //
  43458. // * VFMADD132SD xmm, xmm, xmm [FMA3]
  43459. // * VFMADD132SD m64, xmm, xmm [FMA3]
  43460. // * VFMADD132SD m64, xmm, xmm{k}{z} [AVX512F]
  43461. // * VFMADD132SD {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  43462. // * VFMADD132SD xmm, xmm, xmm{k}{z} [AVX512F]
  43463. //
  43464. func (self *Program) VFMADD132SD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  43465. var p *Instruction
  43466. switch len(vv) {
  43467. case 0 : p = self.alloc("VFMADD132SD", 3, Operands { v0, v1, v2 })
  43468. case 1 : p = self.alloc("VFMADD132SD", 4, Operands { v0, v1, v2, vv[0] })
  43469. default : panic("instruction VFMADD132SD takes 3 or 4 operands")
  43470. }
  43471. // VFMADD132SD xmm, xmm, xmm
  43472. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  43473. self.require(ISA_FMA3)
  43474. p.domain = DomainFMA
  43475. p.add(0, func(m *_Encoding, v []interface{}) {
  43476. m.emit(0xc4)
  43477. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  43478. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  43479. m.emit(0x99)
  43480. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43481. })
  43482. }
  43483. // VFMADD132SD m64, xmm, xmm
  43484. if len(vv) == 0 && isM64(v0) && isXMM(v1) && isXMM(v2) {
  43485. self.require(ISA_FMA3)
  43486. p.domain = DomainFMA
  43487. p.add(0, func(m *_Encoding, v []interface{}) {
  43488. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  43489. m.emit(0x99)
  43490. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  43491. })
  43492. }
  43493. // VFMADD132SD m64, xmm, xmm{k}{z}
  43494. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  43495. self.require(ISA_AVX512F)
  43496. p.domain = DomainFMA
  43497. p.add(0, func(m *_Encoding, v []interface{}) {
  43498. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  43499. m.emit(0x99)
  43500. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  43501. })
  43502. }
  43503. // VFMADD132SD {er}, xmm, xmm, xmm{k}{z}
  43504. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  43505. self.require(ISA_AVX512F)
  43506. p.domain = DomainFMA
  43507. p.add(0, func(m *_Encoding, v []interface{}) {
  43508. m.emit(0x62)
  43509. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  43510. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  43511. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  43512. m.emit(0x99)
  43513. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  43514. })
  43515. }
  43516. // VFMADD132SD xmm, xmm, xmm{k}{z}
  43517. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  43518. self.require(ISA_AVX512F)
  43519. p.domain = DomainFMA
  43520. p.add(0, func(m *_Encoding, v []interface{}) {
  43521. m.emit(0x62)
  43522. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  43523. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  43524. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  43525. m.emit(0x99)
  43526. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43527. })
  43528. }
  43529. if p.len == 0 {
  43530. panic("invalid operands for VFMADD132SD")
  43531. }
  43532. return p
  43533. }
  43534. // VFMADD132SS performs "Fused Multiply-Add of Scalar Single-Precision Floating-Point Values".
  43535. //
  43536. // Mnemonic : VFMADD132SS
  43537. // Supported forms : (5 forms)
  43538. //
  43539. // * VFMADD132SS xmm, xmm, xmm [FMA3]
  43540. // * VFMADD132SS m32, xmm, xmm [FMA3]
  43541. // * VFMADD132SS m32, xmm, xmm{k}{z} [AVX512F]
  43542. // * VFMADD132SS {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  43543. // * VFMADD132SS xmm, xmm, xmm{k}{z} [AVX512F]
  43544. //
  43545. func (self *Program) VFMADD132SS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  43546. var p *Instruction
  43547. switch len(vv) {
  43548. case 0 : p = self.alloc("VFMADD132SS", 3, Operands { v0, v1, v2 })
  43549. case 1 : p = self.alloc("VFMADD132SS", 4, Operands { v0, v1, v2, vv[0] })
  43550. default : panic("instruction VFMADD132SS takes 3 or 4 operands")
  43551. }
  43552. // VFMADD132SS xmm, xmm, xmm
  43553. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  43554. self.require(ISA_FMA3)
  43555. p.domain = DomainFMA
  43556. p.add(0, func(m *_Encoding, v []interface{}) {
  43557. m.emit(0xc4)
  43558. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  43559. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  43560. m.emit(0x99)
  43561. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43562. })
  43563. }
  43564. // VFMADD132SS m32, xmm, xmm
  43565. if len(vv) == 0 && isM32(v0) && isXMM(v1) && isXMM(v2) {
  43566. self.require(ISA_FMA3)
  43567. p.domain = DomainFMA
  43568. p.add(0, func(m *_Encoding, v []interface{}) {
  43569. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  43570. m.emit(0x99)
  43571. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  43572. })
  43573. }
  43574. // VFMADD132SS m32, xmm, xmm{k}{z}
  43575. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  43576. self.require(ISA_AVX512F)
  43577. p.domain = DomainFMA
  43578. p.add(0, func(m *_Encoding, v []interface{}) {
  43579. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  43580. m.emit(0x99)
  43581. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  43582. })
  43583. }
  43584. // VFMADD132SS {er}, xmm, xmm, xmm{k}{z}
  43585. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  43586. self.require(ISA_AVX512F)
  43587. p.domain = DomainFMA
  43588. p.add(0, func(m *_Encoding, v []interface{}) {
  43589. m.emit(0x62)
  43590. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  43591. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  43592. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  43593. m.emit(0x99)
  43594. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  43595. })
  43596. }
  43597. // VFMADD132SS xmm, xmm, xmm{k}{z}
  43598. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  43599. self.require(ISA_AVX512F)
  43600. p.domain = DomainFMA
  43601. p.add(0, func(m *_Encoding, v []interface{}) {
  43602. m.emit(0x62)
  43603. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  43604. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  43605. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  43606. m.emit(0x99)
  43607. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43608. })
  43609. }
  43610. if p.len == 0 {
  43611. panic("invalid operands for VFMADD132SS")
  43612. }
  43613. return p
  43614. }
  43615. // VFMADD213PD performs "Fused Multiply-Add of Packed Double-Precision Floating-Point Values".
  43616. //
  43617. // Mnemonic : VFMADD213PD
  43618. // Supported forms : (11 forms)
  43619. //
  43620. // * VFMADD213PD xmm, xmm, xmm [FMA3]
  43621. // * VFMADD213PD m128, xmm, xmm [FMA3]
  43622. // * VFMADD213PD ymm, ymm, ymm [FMA3]
  43623. // * VFMADD213PD m256, ymm, ymm [FMA3]
  43624. // * VFMADD213PD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  43625. // * VFMADD213PD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  43626. // * VFMADD213PD zmm, zmm, zmm{k}{z} [AVX512F]
  43627. // * VFMADD213PD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  43628. // * VFMADD213PD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  43629. // * VFMADD213PD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  43630. // * VFMADD213PD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  43631. //
  43632. func (self *Program) VFMADD213PD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  43633. var p *Instruction
  43634. switch len(vv) {
  43635. case 0 : p = self.alloc("VFMADD213PD", 3, Operands { v0, v1, v2 })
  43636. case 1 : p = self.alloc("VFMADD213PD", 4, Operands { v0, v1, v2, vv[0] })
  43637. default : panic("instruction VFMADD213PD takes 3 or 4 operands")
  43638. }
  43639. // VFMADD213PD xmm, xmm, xmm
  43640. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  43641. self.require(ISA_FMA3)
  43642. p.domain = DomainFMA
  43643. p.add(0, func(m *_Encoding, v []interface{}) {
  43644. m.emit(0xc4)
  43645. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  43646. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  43647. m.emit(0xa8)
  43648. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43649. })
  43650. }
  43651. // VFMADD213PD m128, xmm, xmm
  43652. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  43653. self.require(ISA_FMA3)
  43654. p.domain = DomainFMA
  43655. p.add(0, func(m *_Encoding, v []interface{}) {
  43656. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  43657. m.emit(0xa8)
  43658. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  43659. })
  43660. }
  43661. // VFMADD213PD ymm, ymm, ymm
  43662. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  43663. self.require(ISA_FMA3)
  43664. p.domain = DomainFMA
  43665. p.add(0, func(m *_Encoding, v []interface{}) {
  43666. m.emit(0xc4)
  43667. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  43668. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  43669. m.emit(0xa8)
  43670. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43671. })
  43672. }
  43673. // VFMADD213PD m256, ymm, ymm
  43674. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  43675. self.require(ISA_FMA3)
  43676. p.domain = DomainFMA
  43677. p.add(0, func(m *_Encoding, v []interface{}) {
  43678. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  43679. m.emit(0xa8)
  43680. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  43681. })
  43682. }
  43683. // VFMADD213PD m512/m64bcst, zmm, zmm{k}{z}
  43684. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  43685. self.require(ISA_AVX512F)
  43686. p.domain = DomainFMA
  43687. p.add(0, func(m *_Encoding, v []interface{}) {
  43688. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  43689. m.emit(0xa8)
  43690. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  43691. })
  43692. }
  43693. // VFMADD213PD {er}, zmm, zmm, zmm{k}{z}
  43694. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  43695. self.require(ISA_AVX512F)
  43696. p.domain = DomainFMA
  43697. p.add(0, func(m *_Encoding, v []interface{}) {
  43698. m.emit(0x62)
  43699. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  43700. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  43701. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  43702. m.emit(0xa8)
  43703. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  43704. })
  43705. }
  43706. // VFMADD213PD zmm, zmm, zmm{k}{z}
  43707. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  43708. self.require(ISA_AVX512F)
  43709. p.domain = DomainFMA
  43710. p.add(0, func(m *_Encoding, v []interface{}) {
  43711. m.emit(0x62)
  43712. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  43713. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  43714. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  43715. m.emit(0xa8)
  43716. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43717. })
  43718. }
  43719. // VFMADD213PD m128/m64bcst, xmm, xmm{k}{z}
  43720. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  43721. self.require(ISA_AVX512VL | ISA_AVX512F)
  43722. p.domain = DomainFMA
  43723. p.add(0, func(m *_Encoding, v []interface{}) {
  43724. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  43725. m.emit(0xa8)
  43726. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  43727. })
  43728. }
  43729. // VFMADD213PD xmm, xmm, xmm{k}{z}
  43730. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  43731. self.require(ISA_AVX512VL | ISA_AVX512F)
  43732. p.domain = DomainFMA
  43733. p.add(0, func(m *_Encoding, v []interface{}) {
  43734. m.emit(0x62)
  43735. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  43736. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  43737. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  43738. m.emit(0xa8)
  43739. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43740. })
  43741. }
  43742. // VFMADD213PD m256/m64bcst, ymm, ymm{k}{z}
  43743. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  43744. self.require(ISA_AVX512VL | ISA_AVX512F)
  43745. p.domain = DomainFMA
  43746. p.add(0, func(m *_Encoding, v []interface{}) {
  43747. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  43748. m.emit(0xa8)
  43749. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  43750. })
  43751. }
  43752. // VFMADD213PD ymm, ymm, ymm{k}{z}
  43753. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  43754. self.require(ISA_AVX512VL | ISA_AVX512F)
  43755. p.domain = DomainFMA
  43756. p.add(0, func(m *_Encoding, v []interface{}) {
  43757. m.emit(0x62)
  43758. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  43759. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  43760. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  43761. m.emit(0xa8)
  43762. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43763. })
  43764. }
  43765. if p.len == 0 {
  43766. panic("invalid operands for VFMADD213PD")
  43767. }
  43768. return p
  43769. }
  43770. // VFMADD213PS performs "Fused Multiply-Add of Packed Single-Precision Floating-Point Values".
  43771. //
  43772. // Mnemonic : VFMADD213PS
  43773. // Supported forms : (11 forms)
  43774. //
  43775. // * VFMADD213PS xmm, xmm, xmm [FMA3]
  43776. // * VFMADD213PS m128, xmm, xmm [FMA3]
  43777. // * VFMADD213PS ymm, ymm, ymm [FMA3]
  43778. // * VFMADD213PS m256, ymm, ymm [FMA3]
  43779. // * VFMADD213PS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  43780. // * VFMADD213PS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  43781. // * VFMADD213PS zmm, zmm, zmm{k}{z} [AVX512F]
  43782. // * VFMADD213PS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  43783. // * VFMADD213PS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  43784. // * VFMADD213PS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  43785. // * VFMADD213PS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  43786. //
  43787. func (self *Program) VFMADD213PS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  43788. var p *Instruction
  43789. switch len(vv) {
  43790. case 0 : p = self.alloc("VFMADD213PS", 3, Operands { v0, v1, v2 })
  43791. case 1 : p = self.alloc("VFMADD213PS", 4, Operands { v0, v1, v2, vv[0] })
  43792. default : panic("instruction VFMADD213PS takes 3 or 4 operands")
  43793. }
  43794. // VFMADD213PS xmm, xmm, xmm
  43795. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  43796. self.require(ISA_FMA3)
  43797. p.domain = DomainFMA
  43798. p.add(0, func(m *_Encoding, v []interface{}) {
  43799. m.emit(0xc4)
  43800. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  43801. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  43802. m.emit(0xa8)
  43803. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43804. })
  43805. }
  43806. // VFMADD213PS m128, xmm, xmm
  43807. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  43808. self.require(ISA_FMA3)
  43809. p.domain = DomainFMA
  43810. p.add(0, func(m *_Encoding, v []interface{}) {
  43811. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  43812. m.emit(0xa8)
  43813. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  43814. })
  43815. }
  43816. // VFMADD213PS ymm, ymm, ymm
  43817. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  43818. self.require(ISA_FMA3)
  43819. p.domain = DomainFMA
  43820. p.add(0, func(m *_Encoding, v []interface{}) {
  43821. m.emit(0xc4)
  43822. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  43823. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  43824. m.emit(0xa8)
  43825. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43826. })
  43827. }
  43828. // VFMADD213PS m256, ymm, ymm
  43829. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  43830. self.require(ISA_FMA3)
  43831. p.domain = DomainFMA
  43832. p.add(0, func(m *_Encoding, v []interface{}) {
  43833. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  43834. m.emit(0xa8)
  43835. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  43836. })
  43837. }
  43838. // VFMADD213PS m512/m32bcst, zmm, zmm{k}{z}
  43839. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  43840. self.require(ISA_AVX512F)
  43841. p.domain = DomainFMA
  43842. p.add(0, func(m *_Encoding, v []interface{}) {
  43843. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  43844. m.emit(0xa8)
  43845. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  43846. })
  43847. }
  43848. // VFMADD213PS {er}, zmm, zmm, zmm{k}{z}
  43849. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  43850. self.require(ISA_AVX512F)
  43851. p.domain = DomainFMA
  43852. p.add(0, func(m *_Encoding, v []interface{}) {
  43853. m.emit(0x62)
  43854. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  43855. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  43856. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  43857. m.emit(0xa8)
  43858. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  43859. })
  43860. }
  43861. // VFMADD213PS zmm, zmm, zmm{k}{z}
  43862. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  43863. self.require(ISA_AVX512F)
  43864. p.domain = DomainFMA
  43865. p.add(0, func(m *_Encoding, v []interface{}) {
  43866. m.emit(0x62)
  43867. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  43868. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  43869. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  43870. m.emit(0xa8)
  43871. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43872. })
  43873. }
  43874. // VFMADD213PS m128/m32bcst, xmm, xmm{k}{z}
  43875. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  43876. self.require(ISA_AVX512VL | ISA_AVX512F)
  43877. p.domain = DomainFMA
  43878. p.add(0, func(m *_Encoding, v []interface{}) {
  43879. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  43880. m.emit(0xa8)
  43881. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  43882. })
  43883. }
  43884. // VFMADD213PS xmm, xmm, xmm{k}{z}
  43885. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  43886. self.require(ISA_AVX512VL | ISA_AVX512F)
  43887. p.domain = DomainFMA
  43888. p.add(0, func(m *_Encoding, v []interface{}) {
  43889. m.emit(0x62)
  43890. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  43891. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  43892. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  43893. m.emit(0xa8)
  43894. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43895. })
  43896. }
  43897. // VFMADD213PS m256/m32bcst, ymm, ymm{k}{z}
  43898. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  43899. self.require(ISA_AVX512VL | ISA_AVX512F)
  43900. p.domain = DomainFMA
  43901. p.add(0, func(m *_Encoding, v []interface{}) {
  43902. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  43903. m.emit(0xa8)
  43904. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  43905. })
  43906. }
  43907. // VFMADD213PS ymm, ymm, ymm{k}{z}
  43908. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  43909. self.require(ISA_AVX512VL | ISA_AVX512F)
  43910. p.domain = DomainFMA
  43911. p.add(0, func(m *_Encoding, v []interface{}) {
  43912. m.emit(0x62)
  43913. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  43914. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  43915. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  43916. m.emit(0xa8)
  43917. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43918. })
  43919. }
  43920. if p.len == 0 {
  43921. panic("invalid operands for VFMADD213PS")
  43922. }
  43923. return p
  43924. }
  43925. // VFMADD213SD performs "Fused Multiply-Add of Scalar Double-Precision Floating-Point Values".
  43926. //
  43927. // Mnemonic : VFMADD213SD
  43928. // Supported forms : (5 forms)
  43929. //
  43930. // * VFMADD213SD xmm, xmm, xmm [FMA3]
  43931. // * VFMADD213SD m64, xmm, xmm [FMA3]
  43932. // * VFMADD213SD m64, xmm, xmm{k}{z} [AVX512F]
  43933. // * VFMADD213SD {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  43934. // * VFMADD213SD xmm, xmm, xmm{k}{z} [AVX512F]
  43935. //
  43936. func (self *Program) VFMADD213SD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  43937. var p *Instruction
  43938. switch len(vv) {
  43939. case 0 : p = self.alloc("VFMADD213SD", 3, Operands { v0, v1, v2 })
  43940. case 1 : p = self.alloc("VFMADD213SD", 4, Operands { v0, v1, v2, vv[0] })
  43941. default : panic("instruction VFMADD213SD takes 3 or 4 operands")
  43942. }
  43943. // VFMADD213SD xmm, xmm, xmm
  43944. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  43945. self.require(ISA_FMA3)
  43946. p.domain = DomainFMA
  43947. p.add(0, func(m *_Encoding, v []interface{}) {
  43948. m.emit(0xc4)
  43949. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  43950. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  43951. m.emit(0xa9)
  43952. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43953. })
  43954. }
  43955. // VFMADD213SD m64, xmm, xmm
  43956. if len(vv) == 0 && isM64(v0) && isXMM(v1) && isXMM(v2) {
  43957. self.require(ISA_FMA3)
  43958. p.domain = DomainFMA
  43959. p.add(0, func(m *_Encoding, v []interface{}) {
  43960. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  43961. m.emit(0xa9)
  43962. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  43963. })
  43964. }
  43965. // VFMADD213SD m64, xmm, xmm{k}{z}
  43966. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  43967. self.require(ISA_AVX512F)
  43968. p.domain = DomainFMA
  43969. p.add(0, func(m *_Encoding, v []interface{}) {
  43970. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  43971. m.emit(0xa9)
  43972. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  43973. })
  43974. }
  43975. // VFMADD213SD {er}, xmm, xmm, xmm{k}{z}
  43976. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  43977. self.require(ISA_AVX512F)
  43978. p.domain = DomainFMA
  43979. p.add(0, func(m *_Encoding, v []interface{}) {
  43980. m.emit(0x62)
  43981. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  43982. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  43983. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  43984. m.emit(0xa9)
  43985. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  43986. })
  43987. }
  43988. // VFMADD213SD xmm, xmm, xmm{k}{z}
  43989. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  43990. self.require(ISA_AVX512F)
  43991. p.domain = DomainFMA
  43992. p.add(0, func(m *_Encoding, v []interface{}) {
  43993. m.emit(0x62)
  43994. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  43995. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  43996. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  43997. m.emit(0xa9)
  43998. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  43999. })
  44000. }
  44001. if p.len == 0 {
  44002. panic("invalid operands for VFMADD213SD")
  44003. }
  44004. return p
  44005. }
  44006. // VFMADD213SS performs "Fused Multiply-Add of Scalar Single-Precision Floating-Point Values".
  44007. //
  44008. // Mnemonic : VFMADD213SS
  44009. // Supported forms : (5 forms)
  44010. //
  44011. // * VFMADD213SS xmm, xmm, xmm [FMA3]
  44012. // * VFMADD213SS m32, xmm, xmm [FMA3]
  44013. // * VFMADD213SS m32, xmm, xmm{k}{z} [AVX512F]
  44014. // * VFMADD213SS {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  44015. // * VFMADD213SS xmm, xmm, xmm{k}{z} [AVX512F]
  44016. //
  44017. func (self *Program) VFMADD213SS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  44018. var p *Instruction
  44019. switch len(vv) {
  44020. case 0 : p = self.alloc("VFMADD213SS", 3, Operands { v0, v1, v2 })
  44021. case 1 : p = self.alloc("VFMADD213SS", 4, Operands { v0, v1, v2, vv[0] })
  44022. default : panic("instruction VFMADD213SS takes 3 or 4 operands")
  44023. }
  44024. // VFMADD213SS xmm, xmm, xmm
  44025. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  44026. self.require(ISA_FMA3)
  44027. p.domain = DomainFMA
  44028. p.add(0, func(m *_Encoding, v []interface{}) {
  44029. m.emit(0xc4)
  44030. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  44031. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  44032. m.emit(0xa9)
  44033. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  44034. })
  44035. }
  44036. // VFMADD213SS m32, xmm, xmm
  44037. if len(vv) == 0 && isM32(v0) && isXMM(v1) && isXMM(v2) {
  44038. self.require(ISA_FMA3)
  44039. p.domain = DomainFMA
  44040. p.add(0, func(m *_Encoding, v []interface{}) {
  44041. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  44042. m.emit(0xa9)
  44043. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  44044. })
  44045. }
  44046. // VFMADD213SS m32, xmm, xmm{k}{z}
  44047. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  44048. self.require(ISA_AVX512F)
  44049. p.domain = DomainFMA
  44050. p.add(0, func(m *_Encoding, v []interface{}) {
  44051. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  44052. m.emit(0xa9)
  44053. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  44054. })
  44055. }
  44056. // VFMADD213SS {er}, xmm, xmm, xmm{k}{z}
  44057. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  44058. self.require(ISA_AVX512F)
  44059. p.domain = DomainFMA
  44060. p.add(0, func(m *_Encoding, v []interface{}) {
  44061. m.emit(0x62)
  44062. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  44063. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  44064. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  44065. m.emit(0xa9)
  44066. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  44067. })
  44068. }
  44069. // VFMADD213SS xmm, xmm, xmm{k}{z}
  44070. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  44071. self.require(ISA_AVX512F)
  44072. p.domain = DomainFMA
  44073. p.add(0, func(m *_Encoding, v []interface{}) {
  44074. m.emit(0x62)
  44075. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  44076. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  44077. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  44078. m.emit(0xa9)
  44079. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  44080. })
  44081. }
  44082. if p.len == 0 {
  44083. panic("invalid operands for VFMADD213SS")
  44084. }
  44085. return p
  44086. }
  44087. // VFMADD231PD performs "Fused Multiply-Add of Packed Double-Precision Floating-Point Values".
  44088. //
  44089. // Mnemonic : VFMADD231PD
  44090. // Supported forms : (11 forms)
  44091. //
  44092. // * VFMADD231PD xmm, xmm, xmm [FMA3]
  44093. // * VFMADD231PD m128, xmm, xmm [FMA3]
  44094. // * VFMADD231PD ymm, ymm, ymm [FMA3]
  44095. // * VFMADD231PD m256, ymm, ymm [FMA3]
  44096. // * VFMADD231PD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  44097. // * VFMADD231PD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  44098. // * VFMADD231PD zmm, zmm, zmm{k}{z} [AVX512F]
  44099. // * VFMADD231PD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  44100. // * VFMADD231PD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  44101. // * VFMADD231PD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  44102. // * VFMADD231PD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  44103. //
  44104. func (self *Program) VFMADD231PD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  44105. var p *Instruction
  44106. switch len(vv) {
  44107. case 0 : p = self.alloc("VFMADD231PD", 3, Operands { v0, v1, v2 })
  44108. case 1 : p = self.alloc("VFMADD231PD", 4, Operands { v0, v1, v2, vv[0] })
  44109. default : panic("instruction VFMADD231PD takes 3 or 4 operands")
  44110. }
  44111. // VFMADD231PD xmm, xmm, xmm
  44112. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  44113. self.require(ISA_FMA3)
  44114. p.domain = DomainFMA
  44115. p.add(0, func(m *_Encoding, v []interface{}) {
  44116. m.emit(0xc4)
  44117. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  44118. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  44119. m.emit(0xb8)
  44120. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  44121. })
  44122. }
  44123. // VFMADD231PD m128, xmm, xmm
  44124. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  44125. self.require(ISA_FMA3)
  44126. p.domain = DomainFMA
  44127. p.add(0, func(m *_Encoding, v []interface{}) {
  44128. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  44129. m.emit(0xb8)
  44130. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  44131. })
  44132. }
  44133. // VFMADD231PD ymm, ymm, ymm
  44134. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  44135. self.require(ISA_FMA3)
  44136. p.domain = DomainFMA
  44137. p.add(0, func(m *_Encoding, v []interface{}) {
  44138. m.emit(0xc4)
  44139. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  44140. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  44141. m.emit(0xb8)
  44142. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  44143. })
  44144. }
  44145. // VFMADD231PD m256, ymm, ymm
  44146. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  44147. self.require(ISA_FMA3)
  44148. p.domain = DomainFMA
  44149. p.add(0, func(m *_Encoding, v []interface{}) {
  44150. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  44151. m.emit(0xb8)
  44152. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  44153. })
  44154. }
  44155. // VFMADD231PD m512/m64bcst, zmm, zmm{k}{z}
  44156. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  44157. self.require(ISA_AVX512F)
  44158. p.domain = DomainFMA
  44159. p.add(0, func(m *_Encoding, v []interface{}) {
  44160. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  44161. m.emit(0xb8)
  44162. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  44163. })
  44164. }
  44165. // VFMADD231PD {er}, zmm, zmm, zmm{k}{z}
  44166. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  44167. self.require(ISA_AVX512F)
  44168. p.domain = DomainFMA
  44169. p.add(0, func(m *_Encoding, v []interface{}) {
  44170. m.emit(0x62)
  44171. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  44172. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  44173. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  44174. m.emit(0xb8)
  44175. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  44176. })
  44177. }
  44178. // VFMADD231PD zmm, zmm, zmm{k}{z}
  44179. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  44180. self.require(ISA_AVX512F)
  44181. p.domain = DomainFMA
  44182. p.add(0, func(m *_Encoding, v []interface{}) {
  44183. m.emit(0x62)
  44184. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  44185. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  44186. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  44187. m.emit(0xb8)
  44188. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  44189. })
  44190. }
  44191. // VFMADD231PD m128/m64bcst, xmm, xmm{k}{z}
  44192. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  44193. self.require(ISA_AVX512VL | ISA_AVX512F)
  44194. p.domain = DomainFMA
  44195. p.add(0, func(m *_Encoding, v []interface{}) {
  44196. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  44197. m.emit(0xb8)
  44198. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  44199. })
  44200. }
  44201. // VFMADD231PD xmm, xmm, xmm{k}{z}
  44202. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  44203. self.require(ISA_AVX512VL | ISA_AVX512F)
  44204. p.domain = DomainFMA
  44205. p.add(0, func(m *_Encoding, v []interface{}) {
  44206. m.emit(0x62)
  44207. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  44208. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  44209. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  44210. m.emit(0xb8)
  44211. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  44212. })
  44213. }
  44214. // VFMADD231PD m256/m64bcst, ymm, ymm{k}{z}
  44215. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  44216. self.require(ISA_AVX512VL | ISA_AVX512F)
  44217. p.domain = DomainFMA
  44218. p.add(0, func(m *_Encoding, v []interface{}) {
  44219. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  44220. m.emit(0xb8)
  44221. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  44222. })
  44223. }
  44224. // VFMADD231PD ymm, ymm, ymm{k}{z}
  44225. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  44226. self.require(ISA_AVX512VL | ISA_AVX512F)
  44227. p.domain = DomainFMA
  44228. p.add(0, func(m *_Encoding, v []interface{}) {
  44229. m.emit(0x62)
  44230. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  44231. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  44232. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  44233. m.emit(0xb8)
  44234. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  44235. })
  44236. }
  44237. if p.len == 0 {
  44238. panic("invalid operands for VFMADD231PD")
  44239. }
  44240. return p
  44241. }
  44242. // VFMADD231PS performs "Fused Multiply-Add of Packed Single-Precision Floating-Point Values".
  44243. //
  44244. // Mnemonic : VFMADD231PS
  44245. // Supported forms : (11 forms)
  44246. //
  44247. // * VFMADD231PS xmm, xmm, xmm [FMA3]
  44248. // * VFMADD231PS m128, xmm, xmm [FMA3]
  44249. // * VFMADD231PS ymm, ymm, ymm [FMA3]
  44250. // * VFMADD231PS m256, ymm, ymm [FMA3]
  44251. // * VFMADD231PS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  44252. // * VFMADD231PS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  44253. // * VFMADD231PS zmm, zmm, zmm{k}{z} [AVX512F]
  44254. // * VFMADD231PS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  44255. // * VFMADD231PS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  44256. // * VFMADD231PS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  44257. // * VFMADD231PS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  44258. //
  44259. func (self *Program) VFMADD231PS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  44260. var p *Instruction
  44261. switch len(vv) {
  44262. case 0 : p = self.alloc("VFMADD231PS", 3, Operands { v0, v1, v2 })
  44263. case 1 : p = self.alloc("VFMADD231PS", 4, Operands { v0, v1, v2, vv[0] })
  44264. default : panic("instruction VFMADD231PS takes 3 or 4 operands")
  44265. }
  44266. // VFMADD231PS xmm, xmm, xmm
  44267. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  44268. self.require(ISA_FMA3)
  44269. p.domain = DomainFMA
  44270. p.add(0, func(m *_Encoding, v []interface{}) {
  44271. m.emit(0xc4)
  44272. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  44273. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  44274. m.emit(0xb8)
  44275. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  44276. })
  44277. }
  44278. // VFMADD231PS m128, xmm, xmm
  44279. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  44280. self.require(ISA_FMA3)
  44281. p.domain = DomainFMA
  44282. p.add(0, func(m *_Encoding, v []interface{}) {
  44283. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  44284. m.emit(0xb8)
  44285. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  44286. })
  44287. }
  44288. // VFMADD231PS ymm, ymm, ymm
  44289. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  44290. self.require(ISA_FMA3)
  44291. p.domain = DomainFMA
  44292. p.add(0, func(m *_Encoding, v []interface{}) {
  44293. m.emit(0xc4)
  44294. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  44295. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  44296. m.emit(0xb8)
  44297. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  44298. })
  44299. }
  44300. // VFMADD231PS m256, ymm, ymm
  44301. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  44302. self.require(ISA_FMA3)
  44303. p.domain = DomainFMA
  44304. p.add(0, func(m *_Encoding, v []interface{}) {
  44305. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  44306. m.emit(0xb8)
  44307. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  44308. })
  44309. }
  44310. // VFMADD231PS m512/m32bcst, zmm, zmm{k}{z}
  44311. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  44312. self.require(ISA_AVX512F)
  44313. p.domain = DomainFMA
  44314. p.add(0, func(m *_Encoding, v []interface{}) {
  44315. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  44316. m.emit(0xb8)
  44317. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  44318. })
  44319. }
  44320. // VFMADD231PS {er}, zmm, zmm, zmm{k}{z}
  44321. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  44322. self.require(ISA_AVX512F)
  44323. p.domain = DomainFMA
  44324. p.add(0, func(m *_Encoding, v []interface{}) {
  44325. m.emit(0x62)
  44326. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  44327. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  44328. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  44329. m.emit(0xb8)
  44330. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  44331. })
  44332. }
  44333. // VFMADD231PS zmm, zmm, zmm{k}{z}
  44334. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  44335. self.require(ISA_AVX512F)
  44336. p.domain = DomainFMA
  44337. p.add(0, func(m *_Encoding, v []interface{}) {
  44338. m.emit(0x62)
  44339. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  44340. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  44341. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  44342. m.emit(0xb8)
  44343. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  44344. })
  44345. }
  44346. // VFMADD231PS m128/m32bcst, xmm, xmm{k}{z}
  44347. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  44348. self.require(ISA_AVX512VL | ISA_AVX512F)
  44349. p.domain = DomainFMA
  44350. p.add(0, func(m *_Encoding, v []interface{}) {
  44351. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  44352. m.emit(0xb8)
  44353. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  44354. })
  44355. }
  44356. // VFMADD231PS xmm, xmm, xmm{k}{z}
  44357. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  44358. self.require(ISA_AVX512VL | ISA_AVX512F)
  44359. p.domain = DomainFMA
  44360. p.add(0, func(m *_Encoding, v []interface{}) {
  44361. m.emit(0x62)
  44362. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  44363. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  44364. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  44365. m.emit(0xb8)
  44366. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  44367. })
  44368. }
  44369. // VFMADD231PS m256/m32bcst, ymm, ymm{k}{z}
  44370. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  44371. self.require(ISA_AVX512VL | ISA_AVX512F)
  44372. p.domain = DomainFMA
  44373. p.add(0, func(m *_Encoding, v []interface{}) {
  44374. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  44375. m.emit(0xb8)
  44376. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  44377. })
  44378. }
  44379. // VFMADD231PS ymm, ymm, ymm{k}{z}
  44380. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  44381. self.require(ISA_AVX512VL | ISA_AVX512F)
  44382. p.domain = DomainFMA
  44383. p.add(0, func(m *_Encoding, v []interface{}) {
  44384. m.emit(0x62)
  44385. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  44386. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  44387. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  44388. m.emit(0xb8)
  44389. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  44390. })
  44391. }
  44392. if p.len == 0 {
  44393. panic("invalid operands for VFMADD231PS")
  44394. }
  44395. return p
  44396. }
  44397. // VFMADD231SD performs "Fused Multiply-Add of Scalar Double-Precision Floating-Point Values".
  44398. //
  44399. // Mnemonic : VFMADD231SD
  44400. // Supported forms : (5 forms)
  44401. //
  44402. // * VFMADD231SD xmm, xmm, xmm [FMA3]
  44403. // * VFMADD231SD m64, xmm, xmm [FMA3]
  44404. // * VFMADD231SD m64, xmm, xmm{k}{z} [AVX512F]
  44405. // * VFMADD231SD {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  44406. // * VFMADD231SD xmm, xmm, xmm{k}{z} [AVX512F]
  44407. //
  44408. func (self *Program) VFMADD231SD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  44409. var p *Instruction
  44410. switch len(vv) {
  44411. case 0 : p = self.alloc("VFMADD231SD", 3, Operands { v0, v1, v2 })
  44412. case 1 : p = self.alloc("VFMADD231SD", 4, Operands { v0, v1, v2, vv[0] })
  44413. default : panic("instruction VFMADD231SD takes 3 or 4 operands")
  44414. }
  44415. // VFMADD231SD xmm, xmm, xmm
  44416. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  44417. self.require(ISA_FMA3)
  44418. p.domain = DomainFMA
  44419. p.add(0, func(m *_Encoding, v []interface{}) {
  44420. m.emit(0xc4)
  44421. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  44422. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  44423. m.emit(0xb9)
  44424. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  44425. })
  44426. }
  44427. // VFMADD231SD m64, xmm, xmm
  44428. if len(vv) == 0 && isM64(v0) && isXMM(v1) && isXMM(v2) {
  44429. self.require(ISA_FMA3)
  44430. p.domain = DomainFMA
  44431. p.add(0, func(m *_Encoding, v []interface{}) {
  44432. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  44433. m.emit(0xb9)
  44434. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  44435. })
  44436. }
  44437. // VFMADD231SD m64, xmm, xmm{k}{z}
  44438. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  44439. self.require(ISA_AVX512F)
  44440. p.domain = DomainFMA
  44441. p.add(0, func(m *_Encoding, v []interface{}) {
  44442. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  44443. m.emit(0xb9)
  44444. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  44445. })
  44446. }
  44447. // VFMADD231SD {er}, xmm, xmm, xmm{k}{z}
  44448. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  44449. self.require(ISA_AVX512F)
  44450. p.domain = DomainFMA
  44451. p.add(0, func(m *_Encoding, v []interface{}) {
  44452. m.emit(0x62)
  44453. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  44454. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  44455. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  44456. m.emit(0xb9)
  44457. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  44458. })
  44459. }
  44460. // VFMADD231SD xmm, xmm, xmm{k}{z}
  44461. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  44462. self.require(ISA_AVX512F)
  44463. p.domain = DomainFMA
  44464. p.add(0, func(m *_Encoding, v []interface{}) {
  44465. m.emit(0x62)
  44466. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  44467. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  44468. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  44469. m.emit(0xb9)
  44470. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  44471. })
  44472. }
  44473. if p.len == 0 {
  44474. panic("invalid operands for VFMADD231SD")
  44475. }
  44476. return p
  44477. }
  44478. // VFMADD231SS performs "Fused Multiply-Add of Scalar Single-Precision Floating-Point Values".
  44479. //
  44480. // Mnemonic : VFMADD231SS
  44481. // Supported forms : (5 forms)
  44482. //
  44483. // * VFMADD231SS xmm, xmm, xmm [FMA3]
  44484. // * VFMADD231SS m32, xmm, xmm [FMA3]
  44485. // * VFMADD231SS m32, xmm, xmm{k}{z} [AVX512F]
  44486. // * VFMADD231SS {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  44487. // * VFMADD231SS xmm, xmm, xmm{k}{z} [AVX512F]
  44488. //
  44489. func (self *Program) VFMADD231SS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  44490. var p *Instruction
  44491. switch len(vv) {
  44492. case 0 : p = self.alloc("VFMADD231SS", 3, Operands { v0, v1, v2 })
  44493. case 1 : p = self.alloc("VFMADD231SS", 4, Operands { v0, v1, v2, vv[0] })
  44494. default : panic("instruction VFMADD231SS takes 3 or 4 operands")
  44495. }
  44496. // VFMADD231SS xmm, xmm, xmm
  44497. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  44498. self.require(ISA_FMA3)
  44499. p.domain = DomainFMA
  44500. p.add(0, func(m *_Encoding, v []interface{}) {
  44501. m.emit(0xc4)
  44502. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  44503. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  44504. m.emit(0xb9)
  44505. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  44506. })
  44507. }
  44508. // VFMADD231SS m32, xmm, xmm
  44509. if len(vv) == 0 && isM32(v0) && isXMM(v1) && isXMM(v2) {
  44510. self.require(ISA_FMA3)
  44511. p.domain = DomainFMA
  44512. p.add(0, func(m *_Encoding, v []interface{}) {
  44513. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  44514. m.emit(0xb9)
  44515. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  44516. })
  44517. }
  44518. // VFMADD231SS m32, xmm, xmm{k}{z}
  44519. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  44520. self.require(ISA_AVX512F)
  44521. p.domain = DomainFMA
  44522. p.add(0, func(m *_Encoding, v []interface{}) {
  44523. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  44524. m.emit(0xb9)
  44525. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  44526. })
  44527. }
  44528. // VFMADD231SS {er}, xmm, xmm, xmm{k}{z}
  44529. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  44530. self.require(ISA_AVX512F)
  44531. p.domain = DomainFMA
  44532. p.add(0, func(m *_Encoding, v []interface{}) {
  44533. m.emit(0x62)
  44534. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  44535. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  44536. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  44537. m.emit(0xb9)
  44538. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  44539. })
  44540. }
  44541. // VFMADD231SS xmm, xmm, xmm{k}{z}
  44542. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  44543. self.require(ISA_AVX512F)
  44544. p.domain = DomainFMA
  44545. p.add(0, func(m *_Encoding, v []interface{}) {
  44546. m.emit(0x62)
  44547. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  44548. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  44549. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  44550. m.emit(0xb9)
  44551. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  44552. })
  44553. }
  44554. if p.len == 0 {
  44555. panic("invalid operands for VFMADD231SS")
  44556. }
  44557. return p
  44558. }
  44559. // VFMADDPD performs "Fused Multiply-Add of Packed Double-Precision Floating-Point Values".
  44560. //
  44561. // Mnemonic : VFMADDPD
  44562. // Supported forms : (6 forms)
  44563. //
  44564. // * VFMADDPD xmm, xmm, xmm, xmm [FMA4]
  44565. // * VFMADDPD m128, xmm, xmm, xmm [FMA4]
  44566. // * VFMADDPD xmm, m128, xmm, xmm [FMA4]
  44567. // * VFMADDPD ymm, ymm, ymm, ymm [FMA4]
  44568. // * VFMADDPD m256, ymm, ymm, ymm [FMA4]
  44569. // * VFMADDPD ymm, m256, ymm, ymm [FMA4]
  44570. //
  44571. func (self *Program) VFMADDPD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  44572. p := self.alloc("VFMADDPD", 4, Operands { v0, v1, v2, v3 })
  44573. // VFMADDPD xmm, xmm, xmm, xmm
  44574. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  44575. self.require(ISA_FMA4)
  44576. p.domain = DomainFMA
  44577. p.add(0, func(m *_Encoding, v []interface{}) {
  44578. m.emit(0xc4)
  44579. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  44580. m.emit(0xf9 ^ (hlcode(v[2]) << 3))
  44581. m.emit(0x69)
  44582. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  44583. m.emit(hlcode(v[1]) << 4)
  44584. })
  44585. p.add(0, func(m *_Encoding, v []interface{}) {
  44586. m.emit(0xc4)
  44587. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  44588. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  44589. m.emit(0x69)
  44590. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  44591. m.emit(hlcode(v[0]) << 4)
  44592. })
  44593. }
  44594. // VFMADDPD m128, xmm, xmm, xmm
  44595. if isM128(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  44596. self.require(ISA_FMA4)
  44597. p.domain = DomainFMA
  44598. p.add(0, func(m *_Encoding, v []interface{}) {
  44599. m.vex3(0xc4, 0b11, 0x81, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  44600. m.emit(0x69)
  44601. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  44602. m.emit(hlcode(v[1]) << 4)
  44603. })
  44604. }
  44605. // VFMADDPD xmm, m128, xmm, xmm
  44606. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  44607. self.require(ISA_FMA4)
  44608. p.domain = DomainFMA
  44609. p.add(0, func(m *_Encoding, v []interface{}) {
  44610. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  44611. m.emit(0x69)
  44612. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  44613. m.emit(hlcode(v[0]) << 4)
  44614. })
  44615. }
  44616. // VFMADDPD ymm, ymm, ymm, ymm
  44617. if isYMM(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  44618. self.require(ISA_FMA4)
  44619. p.domain = DomainFMA
  44620. p.add(0, func(m *_Encoding, v []interface{}) {
  44621. m.emit(0xc4)
  44622. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  44623. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  44624. m.emit(0x69)
  44625. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  44626. m.emit(hlcode(v[1]) << 4)
  44627. })
  44628. p.add(0, func(m *_Encoding, v []interface{}) {
  44629. m.emit(0xc4)
  44630. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  44631. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  44632. m.emit(0x69)
  44633. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  44634. m.emit(hlcode(v[0]) << 4)
  44635. })
  44636. }
  44637. // VFMADDPD m256, ymm, ymm, ymm
  44638. if isM256(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  44639. self.require(ISA_FMA4)
  44640. p.domain = DomainFMA
  44641. p.add(0, func(m *_Encoding, v []interface{}) {
  44642. m.vex3(0xc4, 0b11, 0x85, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  44643. m.emit(0x69)
  44644. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  44645. m.emit(hlcode(v[1]) << 4)
  44646. })
  44647. }
  44648. // VFMADDPD ymm, m256, ymm, ymm
  44649. if isYMM(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  44650. self.require(ISA_FMA4)
  44651. p.domain = DomainFMA
  44652. p.add(0, func(m *_Encoding, v []interface{}) {
  44653. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  44654. m.emit(0x69)
  44655. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  44656. m.emit(hlcode(v[0]) << 4)
  44657. })
  44658. }
  44659. if p.len == 0 {
  44660. panic("invalid operands for VFMADDPD")
  44661. }
  44662. return p
  44663. }
  44664. // VFMADDPS performs "Fused Multiply-Add of Packed Single-Precision Floating-Point Values".
  44665. //
  44666. // Mnemonic : VFMADDPS
  44667. // Supported forms : (6 forms)
  44668. //
  44669. // * VFMADDPS xmm, xmm, xmm, xmm [FMA4]
  44670. // * VFMADDPS m128, xmm, xmm, xmm [FMA4]
  44671. // * VFMADDPS xmm, m128, xmm, xmm [FMA4]
  44672. // * VFMADDPS ymm, ymm, ymm, ymm [FMA4]
  44673. // * VFMADDPS m256, ymm, ymm, ymm [FMA4]
  44674. // * VFMADDPS ymm, m256, ymm, ymm [FMA4]
  44675. //
  44676. func (self *Program) VFMADDPS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  44677. p := self.alloc("VFMADDPS", 4, Operands { v0, v1, v2, v3 })
  44678. // VFMADDPS xmm, xmm, xmm, xmm
  44679. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  44680. self.require(ISA_FMA4)
  44681. p.domain = DomainFMA
  44682. p.add(0, func(m *_Encoding, v []interface{}) {
  44683. m.emit(0xc4)
  44684. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  44685. m.emit(0xf9 ^ (hlcode(v[2]) << 3))
  44686. m.emit(0x68)
  44687. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  44688. m.emit(hlcode(v[1]) << 4)
  44689. })
  44690. p.add(0, func(m *_Encoding, v []interface{}) {
  44691. m.emit(0xc4)
  44692. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  44693. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  44694. m.emit(0x68)
  44695. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  44696. m.emit(hlcode(v[0]) << 4)
  44697. })
  44698. }
  44699. // VFMADDPS m128, xmm, xmm, xmm
  44700. if isM128(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  44701. self.require(ISA_FMA4)
  44702. p.domain = DomainFMA
  44703. p.add(0, func(m *_Encoding, v []interface{}) {
  44704. m.vex3(0xc4, 0b11, 0x81, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  44705. m.emit(0x68)
  44706. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  44707. m.emit(hlcode(v[1]) << 4)
  44708. })
  44709. }
  44710. // VFMADDPS xmm, m128, xmm, xmm
  44711. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  44712. self.require(ISA_FMA4)
  44713. p.domain = DomainFMA
  44714. p.add(0, func(m *_Encoding, v []interface{}) {
  44715. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  44716. m.emit(0x68)
  44717. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  44718. m.emit(hlcode(v[0]) << 4)
  44719. })
  44720. }
  44721. // VFMADDPS ymm, ymm, ymm, ymm
  44722. if isYMM(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  44723. self.require(ISA_FMA4)
  44724. p.domain = DomainFMA
  44725. p.add(0, func(m *_Encoding, v []interface{}) {
  44726. m.emit(0xc4)
  44727. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  44728. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  44729. m.emit(0x68)
  44730. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  44731. m.emit(hlcode(v[1]) << 4)
  44732. })
  44733. p.add(0, func(m *_Encoding, v []interface{}) {
  44734. m.emit(0xc4)
  44735. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  44736. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  44737. m.emit(0x68)
  44738. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  44739. m.emit(hlcode(v[0]) << 4)
  44740. })
  44741. }
  44742. // VFMADDPS m256, ymm, ymm, ymm
  44743. if isM256(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  44744. self.require(ISA_FMA4)
  44745. p.domain = DomainFMA
  44746. p.add(0, func(m *_Encoding, v []interface{}) {
  44747. m.vex3(0xc4, 0b11, 0x85, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  44748. m.emit(0x68)
  44749. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  44750. m.emit(hlcode(v[1]) << 4)
  44751. })
  44752. }
  44753. // VFMADDPS ymm, m256, ymm, ymm
  44754. if isYMM(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  44755. self.require(ISA_FMA4)
  44756. p.domain = DomainFMA
  44757. p.add(0, func(m *_Encoding, v []interface{}) {
  44758. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  44759. m.emit(0x68)
  44760. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  44761. m.emit(hlcode(v[0]) << 4)
  44762. })
  44763. }
  44764. if p.len == 0 {
  44765. panic("invalid operands for VFMADDPS")
  44766. }
  44767. return p
  44768. }
  44769. // VFMADDSD performs "Fused Multiply-Add of Scalar Double-Precision Floating-Point Values".
  44770. //
  44771. // Mnemonic : VFMADDSD
  44772. // Supported forms : (3 forms)
  44773. //
  44774. // * VFMADDSD xmm, xmm, xmm, xmm [FMA4]
  44775. // * VFMADDSD m64, xmm, xmm, xmm [FMA4]
  44776. // * VFMADDSD xmm, m64, xmm, xmm [FMA4]
  44777. //
  44778. func (self *Program) VFMADDSD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  44779. p := self.alloc("VFMADDSD", 4, Operands { v0, v1, v2, v3 })
  44780. // VFMADDSD xmm, xmm, xmm, xmm
  44781. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  44782. self.require(ISA_FMA4)
  44783. p.domain = DomainFMA
  44784. p.add(0, func(m *_Encoding, v []interface{}) {
  44785. m.emit(0xc4)
  44786. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  44787. m.emit(0xf9 ^ (hlcode(v[2]) << 3))
  44788. m.emit(0x6b)
  44789. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  44790. m.emit(hlcode(v[1]) << 4)
  44791. })
  44792. p.add(0, func(m *_Encoding, v []interface{}) {
  44793. m.emit(0xc4)
  44794. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  44795. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  44796. m.emit(0x6b)
  44797. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  44798. m.emit(hlcode(v[0]) << 4)
  44799. })
  44800. }
  44801. // VFMADDSD m64, xmm, xmm, xmm
  44802. if isM64(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  44803. self.require(ISA_FMA4)
  44804. p.domain = DomainFMA
  44805. p.add(0, func(m *_Encoding, v []interface{}) {
  44806. m.vex3(0xc4, 0b11, 0x81, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  44807. m.emit(0x6b)
  44808. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  44809. m.emit(hlcode(v[1]) << 4)
  44810. })
  44811. }
  44812. // VFMADDSD xmm, m64, xmm, xmm
  44813. if isXMM(v0) && isM64(v1) && isXMM(v2) && isXMM(v3) {
  44814. self.require(ISA_FMA4)
  44815. p.domain = DomainFMA
  44816. p.add(0, func(m *_Encoding, v []interface{}) {
  44817. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  44818. m.emit(0x6b)
  44819. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  44820. m.emit(hlcode(v[0]) << 4)
  44821. })
  44822. }
  44823. if p.len == 0 {
  44824. panic("invalid operands for VFMADDSD")
  44825. }
  44826. return p
  44827. }
  44828. // VFMADDSS performs "Fused Multiply-Add of Scalar Single-Precision Floating-Point Values".
  44829. //
  44830. // Mnemonic : VFMADDSS
  44831. // Supported forms : (3 forms)
  44832. //
  44833. // * VFMADDSS xmm, xmm, xmm, xmm [FMA4]
  44834. // * VFMADDSS m32, xmm, xmm, xmm [FMA4]
  44835. // * VFMADDSS xmm, m32, xmm, xmm [FMA4]
  44836. //
  44837. func (self *Program) VFMADDSS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  44838. p := self.alloc("VFMADDSS", 4, Operands { v0, v1, v2, v3 })
  44839. // VFMADDSS xmm, xmm, xmm, xmm
  44840. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  44841. self.require(ISA_FMA4)
  44842. p.domain = DomainFMA
  44843. p.add(0, func(m *_Encoding, v []interface{}) {
  44844. m.emit(0xc4)
  44845. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  44846. m.emit(0xf9 ^ (hlcode(v[2]) << 3))
  44847. m.emit(0x6a)
  44848. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  44849. m.emit(hlcode(v[1]) << 4)
  44850. })
  44851. p.add(0, func(m *_Encoding, v []interface{}) {
  44852. m.emit(0xc4)
  44853. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  44854. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  44855. m.emit(0x6a)
  44856. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  44857. m.emit(hlcode(v[0]) << 4)
  44858. })
  44859. }
  44860. // VFMADDSS m32, xmm, xmm, xmm
  44861. if isM32(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  44862. self.require(ISA_FMA4)
  44863. p.domain = DomainFMA
  44864. p.add(0, func(m *_Encoding, v []interface{}) {
  44865. m.vex3(0xc4, 0b11, 0x81, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  44866. m.emit(0x6a)
  44867. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  44868. m.emit(hlcode(v[1]) << 4)
  44869. })
  44870. }
  44871. // VFMADDSS xmm, m32, xmm, xmm
  44872. if isXMM(v0) && isM32(v1) && isXMM(v2) && isXMM(v3) {
  44873. self.require(ISA_FMA4)
  44874. p.domain = DomainFMA
  44875. p.add(0, func(m *_Encoding, v []interface{}) {
  44876. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  44877. m.emit(0x6a)
  44878. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  44879. m.emit(hlcode(v[0]) << 4)
  44880. })
  44881. }
  44882. if p.len == 0 {
  44883. panic("invalid operands for VFMADDSS")
  44884. }
  44885. return p
  44886. }
  44887. // VFMADDSUB132PD performs "Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values".
  44888. //
  44889. // Mnemonic : VFMADDSUB132PD
  44890. // Supported forms : (11 forms)
  44891. //
  44892. // * VFMADDSUB132PD xmm, xmm, xmm [FMA3]
  44893. // * VFMADDSUB132PD m128, xmm, xmm [FMA3]
  44894. // * VFMADDSUB132PD ymm, ymm, ymm [FMA3]
  44895. // * VFMADDSUB132PD m256, ymm, ymm [FMA3]
  44896. // * VFMADDSUB132PD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  44897. // * VFMADDSUB132PD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  44898. // * VFMADDSUB132PD zmm, zmm, zmm{k}{z} [AVX512F]
  44899. // * VFMADDSUB132PD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  44900. // * VFMADDSUB132PD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  44901. // * VFMADDSUB132PD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  44902. // * VFMADDSUB132PD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  44903. //
  44904. func (self *Program) VFMADDSUB132PD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  44905. var p *Instruction
  44906. switch len(vv) {
  44907. case 0 : p = self.alloc("VFMADDSUB132PD", 3, Operands { v0, v1, v2 })
  44908. case 1 : p = self.alloc("VFMADDSUB132PD", 4, Operands { v0, v1, v2, vv[0] })
  44909. default : panic("instruction VFMADDSUB132PD takes 3 or 4 operands")
  44910. }
  44911. // VFMADDSUB132PD xmm, xmm, xmm
  44912. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  44913. self.require(ISA_FMA3)
  44914. p.domain = DomainFMA
  44915. p.add(0, func(m *_Encoding, v []interface{}) {
  44916. m.emit(0xc4)
  44917. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  44918. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  44919. m.emit(0x96)
  44920. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  44921. })
  44922. }
  44923. // VFMADDSUB132PD m128, xmm, xmm
  44924. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  44925. self.require(ISA_FMA3)
  44926. p.domain = DomainFMA
  44927. p.add(0, func(m *_Encoding, v []interface{}) {
  44928. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  44929. m.emit(0x96)
  44930. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  44931. })
  44932. }
  44933. // VFMADDSUB132PD ymm, ymm, ymm
  44934. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  44935. self.require(ISA_FMA3)
  44936. p.domain = DomainFMA
  44937. p.add(0, func(m *_Encoding, v []interface{}) {
  44938. m.emit(0xc4)
  44939. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  44940. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  44941. m.emit(0x96)
  44942. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  44943. })
  44944. }
  44945. // VFMADDSUB132PD m256, ymm, ymm
  44946. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  44947. self.require(ISA_FMA3)
  44948. p.domain = DomainFMA
  44949. p.add(0, func(m *_Encoding, v []interface{}) {
  44950. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  44951. m.emit(0x96)
  44952. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  44953. })
  44954. }
  44955. // VFMADDSUB132PD m512/m64bcst, zmm, zmm{k}{z}
  44956. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  44957. self.require(ISA_AVX512F)
  44958. p.domain = DomainFMA
  44959. p.add(0, func(m *_Encoding, v []interface{}) {
  44960. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  44961. m.emit(0x96)
  44962. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  44963. })
  44964. }
  44965. // VFMADDSUB132PD {er}, zmm, zmm, zmm{k}{z}
  44966. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  44967. self.require(ISA_AVX512F)
  44968. p.domain = DomainFMA
  44969. p.add(0, func(m *_Encoding, v []interface{}) {
  44970. m.emit(0x62)
  44971. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  44972. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  44973. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  44974. m.emit(0x96)
  44975. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  44976. })
  44977. }
  44978. // VFMADDSUB132PD zmm, zmm, zmm{k}{z}
  44979. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  44980. self.require(ISA_AVX512F)
  44981. p.domain = DomainFMA
  44982. p.add(0, func(m *_Encoding, v []interface{}) {
  44983. m.emit(0x62)
  44984. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  44985. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  44986. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  44987. m.emit(0x96)
  44988. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  44989. })
  44990. }
  44991. // VFMADDSUB132PD m128/m64bcst, xmm, xmm{k}{z}
  44992. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  44993. self.require(ISA_AVX512VL | ISA_AVX512F)
  44994. p.domain = DomainFMA
  44995. p.add(0, func(m *_Encoding, v []interface{}) {
  44996. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  44997. m.emit(0x96)
  44998. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  44999. })
  45000. }
  45001. // VFMADDSUB132PD xmm, xmm, xmm{k}{z}
  45002. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  45003. self.require(ISA_AVX512VL | ISA_AVX512F)
  45004. p.domain = DomainFMA
  45005. p.add(0, func(m *_Encoding, v []interface{}) {
  45006. m.emit(0x62)
  45007. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  45008. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  45009. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  45010. m.emit(0x96)
  45011. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45012. })
  45013. }
  45014. // VFMADDSUB132PD m256/m64bcst, ymm, ymm{k}{z}
  45015. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  45016. self.require(ISA_AVX512VL | ISA_AVX512F)
  45017. p.domain = DomainFMA
  45018. p.add(0, func(m *_Encoding, v []interface{}) {
  45019. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  45020. m.emit(0x96)
  45021. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  45022. })
  45023. }
  45024. // VFMADDSUB132PD ymm, ymm, ymm{k}{z}
  45025. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  45026. self.require(ISA_AVX512VL | ISA_AVX512F)
  45027. p.domain = DomainFMA
  45028. p.add(0, func(m *_Encoding, v []interface{}) {
  45029. m.emit(0x62)
  45030. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  45031. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  45032. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  45033. m.emit(0x96)
  45034. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45035. })
  45036. }
  45037. if p.len == 0 {
  45038. panic("invalid operands for VFMADDSUB132PD")
  45039. }
  45040. return p
  45041. }
  45042. // VFMADDSUB132PS performs "Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values".
  45043. //
  45044. // Mnemonic : VFMADDSUB132PS
  45045. // Supported forms : (11 forms)
  45046. //
  45047. // * VFMADDSUB132PS xmm, xmm, xmm [FMA3]
  45048. // * VFMADDSUB132PS m128, xmm, xmm [FMA3]
  45049. // * VFMADDSUB132PS ymm, ymm, ymm [FMA3]
  45050. // * VFMADDSUB132PS m256, ymm, ymm [FMA3]
  45051. // * VFMADDSUB132PS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  45052. // * VFMADDSUB132PS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  45053. // * VFMADDSUB132PS zmm, zmm, zmm{k}{z} [AVX512F]
  45054. // * VFMADDSUB132PS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  45055. // * VFMADDSUB132PS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  45056. // * VFMADDSUB132PS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  45057. // * VFMADDSUB132PS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  45058. //
  45059. func (self *Program) VFMADDSUB132PS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  45060. var p *Instruction
  45061. switch len(vv) {
  45062. case 0 : p = self.alloc("VFMADDSUB132PS", 3, Operands { v0, v1, v2 })
  45063. case 1 : p = self.alloc("VFMADDSUB132PS", 4, Operands { v0, v1, v2, vv[0] })
  45064. default : panic("instruction VFMADDSUB132PS takes 3 or 4 operands")
  45065. }
  45066. // VFMADDSUB132PS xmm, xmm, xmm
  45067. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  45068. self.require(ISA_FMA3)
  45069. p.domain = DomainFMA
  45070. p.add(0, func(m *_Encoding, v []interface{}) {
  45071. m.emit(0xc4)
  45072. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  45073. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  45074. m.emit(0x96)
  45075. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45076. })
  45077. }
  45078. // VFMADDSUB132PS m128, xmm, xmm
  45079. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  45080. self.require(ISA_FMA3)
  45081. p.domain = DomainFMA
  45082. p.add(0, func(m *_Encoding, v []interface{}) {
  45083. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  45084. m.emit(0x96)
  45085. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  45086. })
  45087. }
  45088. // VFMADDSUB132PS ymm, ymm, ymm
  45089. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  45090. self.require(ISA_FMA3)
  45091. p.domain = DomainFMA
  45092. p.add(0, func(m *_Encoding, v []interface{}) {
  45093. m.emit(0xc4)
  45094. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  45095. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  45096. m.emit(0x96)
  45097. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45098. })
  45099. }
  45100. // VFMADDSUB132PS m256, ymm, ymm
  45101. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  45102. self.require(ISA_FMA3)
  45103. p.domain = DomainFMA
  45104. p.add(0, func(m *_Encoding, v []interface{}) {
  45105. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  45106. m.emit(0x96)
  45107. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  45108. })
  45109. }
  45110. // VFMADDSUB132PS m512/m32bcst, zmm, zmm{k}{z}
  45111. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  45112. self.require(ISA_AVX512F)
  45113. p.domain = DomainFMA
  45114. p.add(0, func(m *_Encoding, v []interface{}) {
  45115. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  45116. m.emit(0x96)
  45117. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  45118. })
  45119. }
  45120. // VFMADDSUB132PS {er}, zmm, zmm, zmm{k}{z}
  45121. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  45122. self.require(ISA_AVX512F)
  45123. p.domain = DomainFMA
  45124. p.add(0, func(m *_Encoding, v []interface{}) {
  45125. m.emit(0x62)
  45126. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  45127. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  45128. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  45129. m.emit(0x96)
  45130. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  45131. })
  45132. }
  45133. // VFMADDSUB132PS zmm, zmm, zmm{k}{z}
  45134. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  45135. self.require(ISA_AVX512F)
  45136. p.domain = DomainFMA
  45137. p.add(0, func(m *_Encoding, v []interface{}) {
  45138. m.emit(0x62)
  45139. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  45140. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  45141. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  45142. m.emit(0x96)
  45143. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45144. })
  45145. }
  45146. // VFMADDSUB132PS m128/m32bcst, xmm, xmm{k}{z}
  45147. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  45148. self.require(ISA_AVX512VL | ISA_AVX512F)
  45149. p.domain = DomainFMA
  45150. p.add(0, func(m *_Encoding, v []interface{}) {
  45151. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  45152. m.emit(0x96)
  45153. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  45154. })
  45155. }
  45156. // VFMADDSUB132PS xmm, xmm, xmm{k}{z}
  45157. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  45158. self.require(ISA_AVX512VL | ISA_AVX512F)
  45159. p.domain = DomainFMA
  45160. p.add(0, func(m *_Encoding, v []interface{}) {
  45161. m.emit(0x62)
  45162. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  45163. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  45164. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  45165. m.emit(0x96)
  45166. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45167. })
  45168. }
  45169. // VFMADDSUB132PS m256/m32bcst, ymm, ymm{k}{z}
  45170. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  45171. self.require(ISA_AVX512VL | ISA_AVX512F)
  45172. p.domain = DomainFMA
  45173. p.add(0, func(m *_Encoding, v []interface{}) {
  45174. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  45175. m.emit(0x96)
  45176. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  45177. })
  45178. }
  45179. // VFMADDSUB132PS ymm, ymm, ymm{k}{z}
  45180. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  45181. self.require(ISA_AVX512VL | ISA_AVX512F)
  45182. p.domain = DomainFMA
  45183. p.add(0, func(m *_Encoding, v []interface{}) {
  45184. m.emit(0x62)
  45185. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  45186. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  45187. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  45188. m.emit(0x96)
  45189. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45190. })
  45191. }
  45192. if p.len == 0 {
  45193. panic("invalid operands for VFMADDSUB132PS")
  45194. }
  45195. return p
  45196. }
  45197. // VFMADDSUB213PD performs "Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values".
  45198. //
  45199. // Mnemonic : VFMADDSUB213PD
  45200. // Supported forms : (11 forms)
  45201. //
  45202. // * VFMADDSUB213PD xmm, xmm, xmm [FMA3]
  45203. // * VFMADDSUB213PD m128, xmm, xmm [FMA3]
  45204. // * VFMADDSUB213PD ymm, ymm, ymm [FMA3]
  45205. // * VFMADDSUB213PD m256, ymm, ymm [FMA3]
  45206. // * VFMADDSUB213PD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  45207. // * VFMADDSUB213PD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  45208. // * VFMADDSUB213PD zmm, zmm, zmm{k}{z} [AVX512F]
  45209. // * VFMADDSUB213PD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  45210. // * VFMADDSUB213PD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  45211. // * VFMADDSUB213PD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  45212. // * VFMADDSUB213PD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  45213. //
  45214. func (self *Program) VFMADDSUB213PD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  45215. var p *Instruction
  45216. switch len(vv) {
  45217. case 0 : p = self.alloc("VFMADDSUB213PD", 3, Operands { v0, v1, v2 })
  45218. case 1 : p = self.alloc("VFMADDSUB213PD", 4, Operands { v0, v1, v2, vv[0] })
  45219. default : panic("instruction VFMADDSUB213PD takes 3 or 4 operands")
  45220. }
  45221. // VFMADDSUB213PD xmm, xmm, xmm
  45222. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  45223. self.require(ISA_FMA3)
  45224. p.domain = DomainFMA
  45225. p.add(0, func(m *_Encoding, v []interface{}) {
  45226. m.emit(0xc4)
  45227. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  45228. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  45229. m.emit(0xa6)
  45230. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45231. })
  45232. }
  45233. // VFMADDSUB213PD m128, xmm, xmm
  45234. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  45235. self.require(ISA_FMA3)
  45236. p.domain = DomainFMA
  45237. p.add(0, func(m *_Encoding, v []interface{}) {
  45238. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  45239. m.emit(0xa6)
  45240. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  45241. })
  45242. }
  45243. // VFMADDSUB213PD ymm, ymm, ymm
  45244. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  45245. self.require(ISA_FMA3)
  45246. p.domain = DomainFMA
  45247. p.add(0, func(m *_Encoding, v []interface{}) {
  45248. m.emit(0xc4)
  45249. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  45250. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  45251. m.emit(0xa6)
  45252. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45253. })
  45254. }
  45255. // VFMADDSUB213PD m256, ymm, ymm
  45256. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  45257. self.require(ISA_FMA3)
  45258. p.domain = DomainFMA
  45259. p.add(0, func(m *_Encoding, v []interface{}) {
  45260. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  45261. m.emit(0xa6)
  45262. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  45263. })
  45264. }
  45265. // VFMADDSUB213PD m512/m64bcst, zmm, zmm{k}{z}
  45266. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  45267. self.require(ISA_AVX512F)
  45268. p.domain = DomainFMA
  45269. p.add(0, func(m *_Encoding, v []interface{}) {
  45270. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  45271. m.emit(0xa6)
  45272. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  45273. })
  45274. }
  45275. // VFMADDSUB213PD {er}, zmm, zmm, zmm{k}{z}
  45276. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  45277. self.require(ISA_AVX512F)
  45278. p.domain = DomainFMA
  45279. p.add(0, func(m *_Encoding, v []interface{}) {
  45280. m.emit(0x62)
  45281. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  45282. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  45283. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  45284. m.emit(0xa6)
  45285. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  45286. })
  45287. }
  45288. // VFMADDSUB213PD zmm, zmm, zmm{k}{z}
  45289. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  45290. self.require(ISA_AVX512F)
  45291. p.domain = DomainFMA
  45292. p.add(0, func(m *_Encoding, v []interface{}) {
  45293. m.emit(0x62)
  45294. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  45295. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  45296. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  45297. m.emit(0xa6)
  45298. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45299. })
  45300. }
  45301. // VFMADDSUB213PD m128/m64bcst, xmm, xmm{k}{z}
  45302. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  45303. self.require(ISA_AVX512VL | ISA_AVX512F)
  45304. p.domain = DomainFMA
  45305. p.add(0, func(m *_Encoding, v []interface{}) {
  45306. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  45307. m.emit(0xa6)
  45308. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  45309. })
  45310. }
  45311. // VFMADDSUB213PD xmm, xmm, xmm{k}{z}
  45312. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  45313. self.require(ISA_AVX512VL | ISA_AVX512F)
  45314. p.domain = DomainFMA
  45315. p.add(0, func(m *_Encoding, v []interface{}) {
  45316. m.emit(0x62)
  45317. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  45318. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  45319. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  45320. m.emit(0xa6)
  45321. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45322. })
  45323. }
  45324. // VFMADDSUB213PD m256/m64bcst, ymm, ymm{k}{z}
  45325. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  45326. self.require(ISA_AVX512VL | ISA_AVX512F)
  45327. p.domain = DomainFMA
  45328. p.add(0, func(m *_Encoding, v []interface{}) {
  45329. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  45330. m.emit(0xa6)
  45331. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  45332. })
  45333. }
  45334. // VFMADDSUB213PD ymm, ymm, ymm{k}{z}
  45335. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  45336. self.require(ISA_AVX512VL | ISA_AVX512F)
  45337. p.domain = DomainFMA
  45338. p.add(0, func(m *_Encoding, v []interface{}) {
  45339. m.emit(0x62)
  45340. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  45341. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  45342. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  45343. m.emit(0xa6)
  45344. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45345. })
  45346. }
  45347. if p.len == 0 {
  45348. panic("invalid operands for VFMADDSUB213PD")
  45349. }
  45350. return p
  45351. }
  45352. // VFMADDSUB213PS performs "Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values".
  45353. //
  45354. // Mnemonic : VFMADDSUB213PS
  45355. // Supported forms : (11 forms)
  45356. //
  45357. // * VFMADDSUB213PS xmm, xmm, xmm [FMA3]
  45358. // * VFMADDSUB213PS m128, xmm, xmm [FMA3]
  45359. // * VFMADDSUB213PS ymm, ymm, ymm [FMA3]
  45360. // * VFMADDSUB213PS m256, ymm, ymm [FMA3]
  45361. // * VFMADDSUB213PS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  45362. // * VFMADDSUB213PS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  45363. // * VFMADDSUB213PS zmm, zmm, zmm{k}{z} [AVX512F]
  45364. // * VFMADDSUB213PS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  45365. // * VFMADDSUB213PS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  45366. // * VFMADDSUB213PS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  45367. // * VFMADDSUB213PS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  45368. //
  45369. func (self *Program) VFMADDSUB213PS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  45370. var p *Instruction
  45371. switch len(vv) {
  45372. case 0 : p = self.alloc("VFMADDSUB213PS", 3, Operands { v0, v1, v2 })
  45373. case 1 : p = self.alloc("VFMADDSUB213PS", 4, Operands { v0, v1, v2, vv[0] })
  45374. default : panic("instruction VFMADDSUB213PS takes 3 or 4 operands")
  45375. }
  45376. // VFMADDSUB213PS xmm, xmm, xmm
  45377. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  45378. self.require(ISA_FMA3)
  45379. p.domain = DomainFMA
  45380. p.add(0, func(m *_Encoding, v []interface{}) {
  45381. m.emit(0xc4)
  45382. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  45383. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  45384. m.emit(0xa6)
  45385. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45386. })
  45387. }
  45388. // VFMADDSUB213PS m128, xmm, xmm
  45389. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  45390. self.require(ISA_FMA3)
  45391. p.domain = DomainFMA
  45392. p.add(0, func(m *_Encoding, v []interface{}) {
  45393. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  45394. m.emit(0xa6)
  45395. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  45396. })
  45397. }
  45398. // VFMADDSUB213PS ymm, ymm, ymm
  45399. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  45400. self.require(ISA_FMA3)
  45401. p.domain = DomainFMA
  45402. p.add(0, func(m *_Encoding, v []interface{}) {
  45403. m.emit(0xc4)
  45404. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  45405. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  45406. m.emit(0xa6)
  45407. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45408. })
  45409. }
  45410. // VFMADDSUB213PS m256, ymm, ymm
  45411. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  45412. self.require(ISA_FMA3)
  45413. p.domain = DomainFMA
  45414. p.add(0, func(m *_Encoding, v []interface{}) {
  45415. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  45416. m.emit(0xa6)
  45417. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  45418. })
  45419. }
  45420. // VFMADDSUB213PS m512/m32bcst, zmm, zmm{k}{z}
  45421. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  45422. self.require(ISA_AVX512F)
  45423. p.domain = DomainFMA
  45424. p.add(0, func(m *_Encoding, v []interface{}) {
  45425. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  45426. m.emit(0xa6)
  45427. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  45428. })
  45429. }
  45430. // VFMADDSUB213PS {er}, zmm, zmm, zmm{k}{z}
  45431. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  45432. self.require(ISA_AVX512F)
  45433. p.domain = DomainFMA
  45434. p.add(0, func(m *_Encoding, v []interface{}) {
  45435. m.emit(0x62)
  45436. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  45437. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  45438. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  45439. m.emit(0xa6)
  45440. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  45441. })
  45442. }
  45443. // VFMADDSUB213PS zmm, zmm, zmm{k}{z}
  45444. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  45445. self.require(ISA_AVX512F)
  45446. p.domain = DomainFMA
  45447. p.add(0, func(m *_Encoding, v []interface{}) {
  45448. m.emit(0x62)
  45449. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  45450. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  45451. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  45452. m.emit(0xa6)
  45453. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45454. })
  45455. }
  45456. // VFMADDSUB213PS m128/m32bcst, xmm, xmm{k}{z}
  45457. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  45458. self.require(ISA_AVX512VL | ISA_AVX512F)
  45459. p.domain = DomainFMA
  45460. p.add(0, func(m *_Encoding, v []interface{}) {
  45461. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  45462. m.emit(0xa6)
  45463. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  45464. })
  45465. }
  45466. // VFMADDSUB213PS xmm, xmm, xmm{k}{z}
  45467. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  45468. self.require(ISA_AVX512VL | ISA_AVX512F)
  45469. p.domain = DomainFMA
  45470. p.add(0, func(m *_Encoding, v []interface{}) {
  45471. m.emit(0x62)
  45472. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  45473. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  45474. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  45475. m.emit(0xa6)
  45476. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45477. })
  45478. }
  45479. // VFMADDSUB213PS m256/m32bcst, ymm, ymm{k}{z}
  45480. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  45481. self.require(ISA_AVX512VL | ISA_AVX512F)
  45482. p.domain = DomainFMA
  45483. p.add(0, func(m *_Encoding, v []interface{}) {
  45484. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  45485. m.emit(0xa6)
  45486. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  45487. })
  45488. }
  45489. // VFMADDSUB213PS ymm, ymm, ymm{k}{z}
  45490. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  45491. self.require(ISA_AVX512VL | ISA_AVX512F)
  45492. p.domain = DomainFMA
  45493. p.add(0, func(m *_Encoding, v []interface{}) {
  45494. m.emit(0x62)
  45495. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  45496. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  45497. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  45498. m.emit(0xa6)
  45499. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45500. })
  45501. }
  45502. if p.len == 0 {
  45503. panic("invalid operands for VFMADDSUB213PS")
  45504. }
  45505. return p
  45506. }
  45507. // VFMADDSUB231PD performs "Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values".
  45508. //
  45509. // Mnemonic : VFMADDSUB231PD
  45510. // Supported forms : (11 forms)
  45511. //
  45512. // * VFMADDSUB231PD xmm, xmm, xmm [FMA3]
  45513. // * VFMADDSUB231PD m128, xmm, xmm [FMA3]
  45514. // * VFMADDSUB231PD ymm, ymm, ymm [FMA3]
  45515. // * VFMADDSUB231PD m256, ymm, ymm [FMA3]
  45516. // * VFMADDSUB231PD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  45517. // * VFMADDSUB231PD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  45518. // * VFMADDSUB231PD zmm, zmm, zmm{k}{z} [AVX512F]
  45519. // * VFMADDSUB231PD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  45520. // * VFMADDSUB231PD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  45521. // * VFMADDSUB231PD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  45522. // * VFMADDSUB231PD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  45523. //
  45524. func (self *Program) VFMADDSUB231PD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  45525. var p *Instruction
  45526. switch len(vv) {
  45527. case 0 : p = self.alloc("VFMADDSUB231PD", 3, Operands { v0, v1, v2 })
  45528. case 1 : p = self.alloc("VFMADDSUB231PD", 4, Operands { v0, v1, v2, vv[0] })
  45529. default : panic("instruction VFMADDSUB231PD takes 3 or 4 operands")
  45530. }
  45531. // VFMADDSUB231PD xmm, xmm, xmm
  45532. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  45533. self.require(ISA_FMA3)
  45534. p.domain = DomainFMA
  45535. p.add(0, func(m *_Encoding, v []interface{}) {
  45536. m.emit(0xc4)
  45537. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  45538. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  45539. m.emit(0xb6)
  45540. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45541. })
  45542. }
  45543. // VFMADDSUB231PD m128, xmm, xmm
  45544. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  45545. self.require(ISA_FMA3)
  45546. p.domain = DomainFMA
  45547. p.add(0, func(m *_Encoding, v []interface{}) {
  45548. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  45549. m.emit(0xb6)
  45550. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  45551. })
  45552. }
  45553. // VFMADDSUB231PD ymm, ymm, ymm
  45554. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  45555. self.require(ISA_FMA3)
  45556. p.domain = DomainFMA
  45557. p.add(0, func(m *_Encoding, v []interface{}) {
  45558. m.emit(0xc4)
  45559. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  45560. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  45561. m.emit(0xb6)
  45562. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45563. })
  45564. }
  45565. // VFMADDSUB231PD m256, ymm, ymm
  45566. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  45567. self.require(ISA_FMA3)
  45568. p.domain = DomainFMA
  45569. p.add(0, func(m *_Encoding, v []interface{}) {
  45570. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  45571. m.emit(0xb6)
  45572. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  45573. })
  45574. }
  45575. // VFMADDSUB231PD m512/m64bcst, zmm, zmm{k}{z}
  45576. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  45577. self.require(ISA_AVX512F)
  45578. p.domain = DomainFMA
  45579. p.add(0, func(m *_Encoding, v []interface{}) {
  45580. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  45581. m.emit(0xb6)
  45582. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  45583. })
  45584. }
  45585. // VFMADDSUB231PD {er}, zmm, zmm, zmm{k}{z}
  45586. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  45587. self.require(ISA_AVX512F)
  45588. p.domain = DomainFMA
  45589. p.add(0, func(m *_Encoding, v []interface{}) {
  45590. m.emit(0x62)
  45591. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  45592. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  45593. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  45594. m.emit(0xb6)
  45595. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  45596. })
  45597. }
  45598. // VFMADDSUB231PD zmm, zmm, zmm{k}{z}
  45599. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  45600. self.require(ISA_AVX512F)
  45601. p.domain = DomainFMA
  45602. p.add(0, func(m *_Encoding, v []interface{}) {
  45603. m.emit(0x62)
  45604. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  45605. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  45606. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  45607. m.emit(0xb6)
  45608. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45609. })
  45610. }
  45611. // VFMADDSUB231PD m128/m64bcst, xmm, xmm{k}{z}
  45612. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  45613. self.require(ISA_AVX512VL | ISA_AVX512F)
  45614. p.domain = DomainFMA
  45615. p.add(0, func(m *_Encoding, v []interface{}) {
  45616. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  45617. m.emit(0xb6)
  45618. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  45619. })
  45620. }
  45621. // VFMADDSUB231PD xmm, xmm, xmm{k}{z}
  45622. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  45623. self.require(ISA_AVX512VL | ISA_AVX512F)
  45624. p.domain = DomainFMA
  45625. p.add(0, func(m *_Encoding, v []interface{}) {
  45626. m.emit(0x62)
  45627. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  45628. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  45629. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  45630. m.emit(0xb6)
  45631. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45632. })
  45633. }
  45634. // VFMADDSUB231PD m256/m64bcst, ymm, ymm{k}{z}
  45635. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  45636. self.require(ISA_AVX512VL | ISA_AVX512F)
  45637. p.domain = DomainFMA
  45638. p.add(0, func(m *_Encoding, v []interface{}) {
  45639. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  45640. m.emit(0xb6)
  45641. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  45642. })
  45643. }
  45644. // VFMADDSUB231PD ymm, ymm, ymm{k}{z}
  45645. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  45646. self.require(ISA_AVX512VL | ISA_AVX512F)
  45647. p.domain = DomainFMA
  45648. p.add(0, func(m *_Encoding, v []interface{}) {
  45649. m.emit(0x62)
  45650. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  45651. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  45652. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  45653. m.emit(0xb6)
  45654. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45655. })
  45656. }
  45657. if p.len == 0 {
  45658. panic("invalid operands for VFMADDSUB231PD")
  45659. }
  45660. return p
  45661. }
  45662. // VFMADDSUB231PS performs "Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values".
  45663. //
  45664. // Mnemonic : VFMADDSUB231PS
  45665. // Supported forms : (11 forms)
  45666. //
  45667. // * VFMADDSUB231PS xmm, xmm, xmm [FMA3]
  45668. // * VFMADDSUB231PS m128, xmm, xmm [FMA3]
  45669. // * VFMADDSUB231PS ymm, ymm, ymm [FMA3]
  45670. // * VFMADDSUB231PS m256, ymm, ymm [FMA3]
  45671. // * VFMADDSUB231PS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  45672. // * VFMADDSUB231PS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  45673. // * VFMADDSUB231PS zmm, zmm, zmm{k}{z} [AVX512F]
  45674. // * VFMADDSUB231PS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  45675. // * VFMADDSUB231PS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  45676. // * VFMADDSUB231PS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  45677. // * VFMADDSUB231PS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  45678. //
  45679. func (self *Program) VFMADDSUB231PS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  45680. var p *Instruction
  45681. switch len(vv) {
  45682. case 0 : p = self.alloc("VFMADDSUB231PS", 3, Operands { v0, v1, v2 })
  45683. case 1 : p = self.alloc("VFMADDSUB231PS", 4, Operands { v0, v1, v2, vv[0] })
  45684. default : panic("instruction VFMADDSUB231PS takes 3 or 4 operands")
  45685. }
  45686. // VFMADDSUB231PS xmm, xmm, xmm
  45687. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  45688. self.require(ISA_FMA3)
  45689. p.domain = DomainFMA
  45690. p.add(0, func(m *_Encoding, v []interface{}) {
  45691. m.emit(0xc4)
  45692. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  45693. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  45694. m.emit(0xb6)
  45695. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45696. })
  45697. }
  45698. // VFMADDSUB231PS m128, xmm, xmm
  45699. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  45700. self.require(ISA_FMA3)
  45701. p.domain = DomainFMA
  45702. p.add(0, func(m *_Encoding, v []interface{}) {
  45703. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  45704. m.emit(0xb6)
  45705. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  45706. })
  45707. }
  45708. // VFMADDSUB231PS ymm, ymm, ymm
  45709. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  45710. self.require(ISA_FMA3)
  45711. p.domain = DomainFMA
  45712. p.add(0, func(m *_Encoding, v []interface{}) {
  45713. m.emit(0xc4)
  45714. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  45715. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  45716. m.emit(0xb6)
  45717. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45718. })
  45719. }
  45720. // VFMADDSUB231PS m256, ymm, ymm
  45721. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  45722. self.require(ISA_FMA3)
  45723. p.domain = DomainFMA
  45724. p.add(0, func(m *_Encoding, v []interface{}) {
  45725. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  45726. m.emit(0xb6)
  45727. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  45728. })
  45729. }
  45730. // VFMADDSUB231PS m512/m32bcst, zmm, zmm{k}{z}
  45731. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  45732. self.require(ISA_AVX512F)
  45733. p.domain = DomainFMA
  45734. p.add(0, func(m *_Encoding, v []interface{}) {
  45735. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  45736. m.emit(0xb6)
  45737. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  45738. })
  45739. }
  45740. // VFMADDSUB231PS {er}, zmm, zmm, zmm{k}{z}
  45741. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  45742. self.require(ISA_AVX512F)
  45743. p.domain = DomainFMA
  45744. p.add(0, func(m *_Encoding, v []interface{}) {
  45745. m.emit(0x62)
  45746. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  45747. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  45748. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  45749. m.emit(0xb6)
  45750. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  45751. })
  45752. }
  45753. // VFMADDSUB231PS zmm, zmm, zmm{k}{z}
  45754. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  45755. self.require(ISA_AVX512F)
  45756. p.domain = DomainFMA
  45757. p.add(0, func(m *_Encoding, v []interface{}) {
  45758. m.emit(0x62)
  45759. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  45760. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  45761. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  45762. m.emit(0xb6)
  45763. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45764. })
  45765. }
  45766. // VFMADDSUB231PS m128/m32bcst, xmm, xmm{k}{z}
  45767. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  45768. self.require(ISA_AVX512VL | ISA_AVX512F)
  45769. p.domain = DomainFMA
  45770. p.add(0, func(m *_Encoding, v []interface{}) {
  45771. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  45772. m.emit(0xb6)
  45773. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  45774. })
  45775. }
  45776. // VFMADDSUB231PS xmm, xmm, xmm{k}{z}
  45777. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  45778. self.require(ISA_AVX512VL | ISA_AVX512F)
  45779. p.domain = DomainFMA
  45780. p.add(0, func(m *_Encoding, v []interface{}) {
  45781. m.emit(0x62)
  45782. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  45783. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  45784. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  45785. m.emit(0xb6)
  45786. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45787. })
  45788. }
  45789. // VFMADDSUB231PS m256/m32bcst, ymm, ymm{k}{z}
  45790. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  45791. self.require(ISA_AVX512VL | ISA_AVX512F)
  45792. p.domain = DomainFMA
  45793. p.add(0, func(m *_Encoding, v []interface{}) {
  45794. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  45795. m.emit(0xb6)
  45796. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  45797. })
  45798. }
  45799. // VFMADDSUB231PS ymm, ymm, ymm{k}{z}
  45800. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  45801. self.require(ISA_AVX512VL | ISA_AVX512F)
  45802. p.domain = DomainFMA
  45803. p.add(0, func(m *_Encoding, v []interface{}) {
  45804. m.emit(0x62)
  45805. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  45806. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  45807. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  45808. m.emit(0xb6)
  45809. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  45810. })
  45811. }
  45812. if p.len == 0 {
  45813. panic("invalid operands for VFMADDSUB231PS")
  45814. }
  45815. return p
  45816. }
  45817. // VFMADDSUBPD performs "Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values".
  45818. //
  45819. // Mnemonic : VFMADDSUBPD
  45820. // Supported forms : (6 forms)
  45821. //
  45822. // * VFMADDSUBPD xmm, xmm, xmm, xmm [FMA4]
  45823. // * VFMADDSUBPD m128, xmm, xmm, xmm [FMA4]
  45824. // * VFMADDSUBPD xmm, m128, xmm, xmm [FMA4]
  45825. // * VFMADDSUBPD ymm, ymm, ymm, ymm [FMA4]
  45826. // * VFMADDSUBPD m256, ymm, ymm, ymm [FMA4]
  45827. // * VFMADDSUBPD ymm, m256, ymm, ymm [FMA4]
  45828. //
  45829. func (self *Program) VFMADDSUBPD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  45830. p := self.alloc("VFMADDSUBPD", 4, Operands { v0, v1, v2, v3 })
  45831. // VFMADDSUBPD xmm, xmm, xmm, xmm
  45832. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  45833. self.require(ISA_FMA4)
  45834. p.domain = DomainFMA
  45835. p.add(0, func(m *_Encoding, v []interface{}) {
  45836. m.emit(0xc4)
  45837. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  45838. m.emit(0xf9 ^ (hlcode(v[2]) << 3))
  45839. m.emit(0x5d)
  45840. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  45841. m.emit(hlcode(v[1]) << 4)
  45842. })
  45843. p.add(0, func(m *_Encoding, v []interface{}) {
  45844. m.emit(0xc4)
  45845. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  45846. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  45847. m.emit(0x5d)
  45848. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  45849. m.emit(hlcode(v[0]) << 4)
  45850. })
  45851. }
  45852. // VFMADDSUBPD m128, xmm, xmm, xmm
  45853. if isM128(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  45854. self.require(ISA_FMA4)
  45855. p.domain = DomainFMA
  45856. p.add(0, func(m *_Encoding, v []interface{}) {
  45857. m.vex3(0xc4, 0b11, 0x81, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  45858. m.emit(0x5d)
  45859. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  45860. m.emit(hlcode(v[1]) << 4)
  45861. })
  45862. }
  45863. // VFMADDSUBPD xmm, m128, xmm, xmm
  45864. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  45865. self.require(ISA_FMA4)
  45866. p.domain = DomainFMA
  45867. p.add(0, func(m *_Encoding, v []interface{}) {
  45868. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  45869. m.emit(0x5d)
  45870. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  45871. m.emit(hlcode(v[0]) << 4)
  45872. })
  45873. }
  45874. // VFMADDSUBPD ymm, ymm, ymm, ymm
  45875. if isYMM(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  45876. self.require(ISA_FMA4)
  45877. p.domain = DomainFMA
  45878. p.add(0, func(m *_Encoding, v []interface{}) {
  45879. m.emit(0xc4)
  45880. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  45881. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  45882. m.emit(0x5d)
  45883. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  45884. m.emit(hlcode(v[1]) << 4)
  45885. })
  45886. p.add(0, func(m *_Encoding, v []interface{}) {
  45887. m.emit(0xc4)
  45888. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  45889. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  45890. m.emit(0x5d)
  45891. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  45892. m.emit(hlcode(v[0]) << 4)
  45893. })
  45894. }
  45895. // VFMADDSUBPD m256, ymm, ymm, ymm
  45896. if isM256(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  45897. self.require(ISA_FMA4)
  45898. p.domain = DomainFMA
  45899. p.add(0, func(m *_Encoding, v []interface{}) {
  45900. m.vex3(0xc4, 0b11, 0x85, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  45901. m.emit(0x5d)
  45902. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  45903. m.emit(hlcode(v[1]) << 4)
  45904. })
  45905. }
  45906. // VFMADDSUBPD ymm, m256, ymm, ymm
  45907. if isYMM(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  45908. self.require(ISA_FMA4)
  45909. p.domain = DomainFMA
  45910. p.add(0, func(m *_Encoding, v []interface{}) {
  45911. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  45912. m.emit(0x5d)
  45913. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  45914. m.emit(hlcode(v[0]) << 4)
  45915. })
  45916. }
  45917. if p.len == 0 {
  45918. panic("invalid operands for VFMADDSUBPD")
  45919. }
  45920. return p
  45921. }
  45922. // VFMADDSUBPS performs "Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values".
  45923. //
  45924. // Mnemonic : VFMADDSUBPS
  45925. // Supported forms : (6 forms)
  45926. //
  45927. // * VFMADDSUBPS xmm, xmm, xmm, xmm [FMA4]
  45928. // * VFMADDSUBPS m128, xmm, xmm, xmm [FMA4]
  45929. // * VFMADDSUBPS xmm, m128, xmm, xmm [FMA4]
  45930. // * VFMADDSUBPS ymm, ymm, ymm, ymm [FMA4]
  45931. // * VFMADDSUBPS m256, ymm, ymm, ymm [FMA4]
  45932. // * VFMADDSUBPS ymm, m256, ymm, ymm [FMA4]
  45933. //
  45934. func (self *Program) VFMADDSUBPS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  45935. p := self.alloc("VFMADDSUBPS", 4, Operands { v0, v1, v2, v3 })
  45936. // VFMADDSUBPS xmm, xmm, xmm, xmm
  45937. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  45938. self.require(ISA_FMA4)
  45939. p.domain = DomainFMA
  45940. p.add(0, func(m *_Encoding, v []interface{}) {
  45941. m.emit(0xc4)
  45942. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  45943. m.emit(0xf9 ^ (hlcode(v[2]) << 3))
  45944. m.emit(0x5c)
  45945. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  45946. m.emit(hlcode(v[1]) << 4)
  45947. })
  45948. p.add(0, func(m *_Encoding, v []interface{}) {
  45949. m.emit(0xc4)
  45950. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  45951. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  45952. m.emit(0x5c)
  45953. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  45954. m.emit(hlcode(v[0]) << 4)
  45955. })
  45956. }
  45957. // VFMADDSUBPS m128, xmm, xmm, xmm
  45958. if isM128(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  45959. self.require(ISA_FMA4)
  45960. p.domain = DomainFMA
  45961. p.add(0, func(m *_Encoding, v []interface{}) {
  45962. m.vex3(0xc4, 0b11, 0x81, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  45963. m.emit(0x5c)
  45964. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  45965. m.emit(hlcode(v[1]) << 4)
  45966. })
  45967. }
  45968. // VFMADDSUBPS xmm, m128, xmm, xmm
  45969. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  45970. self.require(ISA_FMA4)
  45971. p.domain = DomainFMA
  45972. p.add(0, func(m *_Encoding, v []interface{}) {
  45973. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  45974. m.emit(0x5c)
  45975. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  45976. m.emit(hlcode(v[0]) << 4)
  45977. })
  45978. }
  45979. // VFMADDSUBPS ymm, ymm, ymm, ymm
  45980. if isYMM(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  45981. self.require(ISA_FMA4)
  45982. p.domain = DomainFMA
  45983. p.add(0, func(m *_Encoding, v []interface{}) {
  45984. m.emit(0xc4)
  45985. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  45986. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  45987. m.emit(0x5c)
  45988. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  45989. m.emit(hlcode(v[1]) << 4)
  45990. })
  45991. p.add(0, func(m *_Encoding, v []interface{}) {
  45992. m.emit(0xc4)
  45993. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  45994. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  45995. m.emit(0x5c)
  45996. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  45997. m.emit(hlcode(v[0]) << 4)
  45998. })
  45999. }
  46000. // VFMADDSUBPS m256, ymm, ymm, ymm
  46001. if isM256(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  46002. self.require(ISA_FMA4)
  46003. p.domain = DomainFMA
  46004. p.add(0, func(m *_Encoding, v []interface{}) {
  46005. m.vex3(0xc4, 0b11, 0x85, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  46006. m.emit(0x5c)
  46007. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  46008. m.emit(hlcode(v[1]) << 4)
  46009. })
  46010. }
  46011. // VFMADDSUBPS ymm, m256, ymm, ymm
  46012. if isYMM(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  46013. self.require(ISA_FMA4)
  46014. p.domain = DomainFMA
  46015. p.add(0, func(m *_Encoding, v []interface{}) {
  46016. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  46017. m.emit(0x5c)
  46018. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  46019. m.emit(hlcode(v[0]) << 4)
  46020. })
  46021. }
  46022. if p.len == 0 {
  46023. panic("invalid operands for VFMADDSUBPS")
  46024. }
  46025. return p
  46026. }
  46027. // VFMSUB132PD performs "Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values".
  46028. //
  46029. // Mnemonic : VFMSUB132PD
  46030. // Supported forms : (11 forms)
  46031. //
  46032. // * VFMSUB132PD xmm, xmm, xmm [FMA3]
  46033. // * VFMSUB132PD m128, xmm, xmm [FMA3]
  46034. // * VFMSUB132PD ymm, ymm, ymm [FMA3]
  46035. // * VFMSUB132PD m256, ymm, ymm [FMA3]
  46036. // * VFMSUB132PD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  46037. // * VFMSUB132PD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  46038. // * VFMSUB132PD zmm, zmm, zmm{k}{z} [AVX512F]
  46039. // * VFMSUB132PD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  46040. // * VFMSUB132PD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  46041. // * VFMSUB132PD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  46042. // * VFMSUB132PD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  46043. //
  46044. func (self *Program) VFMSUB132PD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  46045. var p *Instruction
  46046. switch len(vv) {
  46047. case 0 : p = self.alloc("VFMSUB132PD", 3, Operands { v0, v1, v2 })
  46048. case 1 : p = self.alloc("VFMSUB132PD", 4, Operands { v0, v1, v2, vv[0] })
  46049. default : panic("instruction VFMSUB132PD takes 3 or 4 operands")
  46050. }
  46051. // VFMSUB132PD xmm, xmm, xmm
  46052. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  46053. self.require(ISA_FMA3)
  46054. p.domain = DomainFMA
  46055. p.add(0, func(m *_Encoding, v []interface{}) {
  46056. m.emit(0xc4)
  46057. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  46058. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  46059. m.emit(0x9a)
  46060. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46061. })
  46062. }
  46063. // VFMSUB132PD m128, xmm, xmm
  46064. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  46065. self.require(ISA_FMA3)
  46066. p.domain = DomainFMA
  46067. p.add(0, func(m *_Encoding, v []interface{}) {
  46068. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  46069. m.emit(0x9a)
  46070. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  46071. })
  46072. }
  46073. // VFMSUB132PD ymm, ymm, ymm
  46074. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  46075. self.require(ISA_FMA3)
  46076. p.domain = DomainFMA
  46077. p.add(0, func(m *_Encoding, v []interface{}) {
  46078. m.emit(0xc4)
  46079. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  46080. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  46081. m.emit(0x9a)
  46082. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46083. })
  46084. }
  46085. // VFMSUB132PD m256, ymm, ymm
  46086. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  46087. self.require(ISA_FMA3)
  46088. p.domain = DomainFMA
  46089. p.add(0, func(m *_Encoding, v []interface{}) {
  46090. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  46091. m.emit(0x9a)
  46092. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  46093. })
  46094. }
  46095. // VFMSUB132PD m512/m64bcst, zmm, zmm{k}{z}
  46096. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  46097. self.require(ISA_AVX512F)
  46098. p.domain = DomainFMA
  46099. p.add(0, func(m *_Encoding, v []interface{}) {
  46100. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  46101. m.emit(0x9a)
  46102. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  46103. })
  46104. }
  46105. // VFMSUB132PD {er}, zmm, zmm, zmm{k}{z}
  46106. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  46107. self.require(ISA_AVX512F)
  46108. p.domain = DomainFMA
  46109. p.add(0, func(m *_Encoding, v []interface{}) {
  46110. m.emit(0x62)
  46111. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  46112. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  46113. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  46114. m.emit(0x9a)
  46115. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  46116. })
  46117. }
  46118. // VFMSUB132PD zmm, zmm, zmm{k}{z}
  46119. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  46120. self.require(ISA_AVX512F)
  46121. p.domain = DomainFMA
  46122. p.add(0, func(m *_Encoding, v []interface{}) {
  46123. m.emit(0x62)
  46124. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  46125. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  46126. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  46127. m.emit(0x9a)
  46128. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46129. })
  46130. }
  46131. // VFMSUB132PD m128/m64bcst, xmm, xmm{k}{z}
  46132. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  46133. self.require(ISA_AVX512VL | ISA_AVX512F)
  46134. p.domain = DomainFMA
  46135. p.add(0, func(m *_Encoding, v []interface{}) {
  46136. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  46137. m.emit(0x9a)
  46138. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  46139. })
  46140. }
  46141. // VFMSUB132PD xmm, xmm, xmm{k}{z}
  46142. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  46143. self.require(ISA_AVX512VL | ISA_AVX512F)
  46144. p.domain = DomainFMA
  46145. p.add(0, func(m *_Encoding, v []interface{}) {
  46146. m.emit(0x62)
  46147. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  46148. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  46149. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  46150. m.emit(0x9a)
  46151. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46152. })
  46153. }
  46154. // VFMSUB132PD m256/m64bcst, ymm, ymm{k}{z}
  46155. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  46156. self.require(ISA_AVX512VL | ISA_AVX512F)
  46157. p.domain = DomainFMA
  46158. p.add(0, func(m *_Encoding, v []interface{}) {
  46159. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  46160. m.emit(0x9a)
  46161. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  46162. })
  46163. }
  46164. // VFMSUB132PD ymm, ymm, ymm{k}{z}
  46165. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  46166. self.require(ISA_AVX512VL | ISA_AVX512F)
  46167. p.domain = DomainFMA
  46168. p.add(0, func(m *_Encoding, v []interface{}) {
  46169. m.emit(0x62)
  46170. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  46171. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  46172. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  46173. m.emit(0x9a)
  46174. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46175. })
  46176. }
  46177. if p.len == 0 {
  46178. panic("invalid operands for VFMSUB132PD")
  46179. }
  46180. return p
  46181. }
  46182. // VFMSUB132PS performs "Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values".
  46183. //
  46184. // Mnemonic : VFMSUB132PS
  46185. // Supported forms : (11 forms)
  46186. //
  46187. // * VFMSUB132PS xmm, xmm, xmm [FMA3]
  46188. // * VFMSUB132PS m128, xmm, xmm [FMA3]
  46189. // * VFMSUB132PS ymm, ymm, ymm [FMA3]
  46190. // * VFMSUB132PS m256, ymm, ymm [FMA3]
  46191. // * VFMSUB132PS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  46192. // * VFMSUB132PS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  46193. // * VFMSUB132PS zmm, zmm, zmm{k}{z} [AVX512F]
  46194. // * VFMSUB132PS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  46195. // * VFMSUB132PS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  46196. // * VFMSUB132PS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  46197. // * VFMSUB132PS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  46198. //
  46199. func (self *Program) VFMSUB132PS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  46200. var p *Instruction
  46201. switch len(vv) {
  46202. case 0 : p = self.alloc("VFMSUB132PS", 3, Operands { v0, v1, v2 })
  46203. case 1 : p = self.alloc("VFMSUB132PS", 4, Operands { v0, v1, v2, vv[0] })
  46204. default : panic("instruction VFMSUB132PS takes 3 or 4 operands")
  46205. }
  46206. // VFMSUB132PS xmm, xmm, xmm
  46207. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  46208. self.require(ISA_FMA3)
  46209. p.domain = DomainFMA
  46210. p.add(0, func(m *_Encoding, v []interface{}) {
  46211. m.emit(0xc4)
  46212. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  46213. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  46214. m.emit(0x9a)
  46215. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46216. })
  46217. }
  46218. // VFMSUB132PS m128, xmm, xmm
  46219. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  46220. self.require(ISA_FMA3)
  46221. p.domain = DomainFMA
  46222. p.add(0, func(m *_Encoding, v []interface{}) {
  46223. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  46224. m.emit(0x9a)
  46225. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  46226. })
  46227. }
  46228. // VFMSUB132PS ymm, ymm, ymm
  46229. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  46230. self.require(ISA_FMA3)
  46231. p.domain = DomainFMA
  46232. p.add(0, func(m *_Encoding, v []interface{}) {
  46233. m.emit(0xc4)
  46234. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  46235. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  46236. m.emit(0x9a)
  46237. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46238. })
  46239. }
  46240. // VFMSUB132PS m256, ymm, ymm
  46241. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  46242. self.require(ISA_FMA3)
  46243. p.domain = DomainFMA
  46244. p.add(0, func(m *_Encoding, v []interface{}) {
  46245. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  46246. m.emit(0x9a)
  46247. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  46248. })
  46249. }
  46250. // VFMSUB132PS m512/m32bcst, zmm, zmm{k}{z}
  46251. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  46252. self.require(ISA_AVX512F)
  46253. p.domain = DomainFMA
  46254. p.add(0, func(m *_Encoding, v []interface{}) {
  46255. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  46256. m.emit(0x9a)
  46257. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  46258. })
  46259. }
  46260. // VFMSUB132PS {er}, zmm, zmm, zmm{k}{z}
  46261. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  46262. self.require(ISA_AVX512F)
  46263. p.domain = DomainFMA
  46264. p.add(0, func(m *_Encoding, v []interface{}) {
  46265. m.emit(0x62)
  46266. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  46267. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  46268. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  46269. m.emit(0x9a)
  46270. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  46271. })
  46272. }
  46273. // VFMSUB132PS zmm, zmm, zmm{k}{z}
  46274. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  46275. self.require(ISA_AVX512F)
  46276. p.domain = DomainFMA
  46277. p.add(0, func(m *_Encoding, v []interface{}) {
  46278. m.emit(0x62)
  46279. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  46280. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  46281. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  46282. m.emit(0x9a)
  46283. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46284. })
  46285. }
  46286. // VFMSUB132PS m128/m32bcst, xmm, xmm{k}{z}
  46287. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  46288. self.require(ISA_AVX512VL | ISA_AVX512F)
  46289. p.domain = DomainFMA
  46290. p.add(0, func(m *_Encoding, v []interface{}) {
  46291. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  46292. m.emit(0x9a)
  46293. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  46294. })
  46295. }
  46296. // VFMSUB132PS xmm, xmm, xmm{k}{z}
  46297. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  46298. self.require(ISA_AVX512VL | ISA_AVX512F)
  46299. p.domain = DomainFMA
  46300. p.add(0, func(m *_Encoding, v []interface{}) {
  46301. m.emit(0x62)
  46302. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  46303. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  46304. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  46305. m.emit(0x9a)
  46306. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46307. })
  46308. }
  46309. // VFMSUB132PS m256/m32bcst, ymm, ymm{k}{z}
  46310. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  46311. self.require(ISA_AVX512VL | ISA_AVX512F)
  46312. p.domain = DomainFMA
  46313. p.add(0, func(m *_Encoding, v []interface{}) {
  46314. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  46315. m.emit(0x9a)
  46316. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  46317. })
  46318. }
  46319. // VFMSUB132PS ymm, ymm, ymm{k}{z}
  46320. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  46321. self.require(ISA_AVX512VL | ISA_AVX512F)
  46322. p.domain = DomainFMA
  46323. p.add(0, func(m *_Encoding, v []interface{}) {
  46324. m.emit(0x62)
  46325. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  46326. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  46327. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  46328. m.emit(0x9a)
  46329. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46330. })
  46331. }
  46332. if p.len == 0 {
  46333. panic("invalid operands for VFMSUB132PS")
  46334. }
  46335. return p
  46336. }
  46337. // VFMSUB132SD performs "Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values".
  46338. //
  46339. // Mnemonic : VFMSUB132SD
  46340. // Supported forms : (5 forms)
  46341. //
  46342. // * VFMSUB132SD xmm, xmm, xmm [FMA3]
  46343. // * VFMSUB132SD m64, xmm, xmm [FMA3]
  46344. // * VFMSUB132SD m64, xmm, xmm{k}{z} [AVX512F]
  46345. // * VFMSUB132SD {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  46346. // * VFMSUB132SD xmm, xmm, xmm{k}{z} [AVX512F]
  46347. //
  46348. func (self *Program) VFMSUB132SD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  46349. var p *Instruction
  46350. switch len(vv) {
  46351. case 0 : p = self.alloc("VFMSUB132SD", 3, Operands { v0, v1, v2 })
  46352. case 1 : p = self.alloc("VFMSUB132SD", 4, Operands { v0, v1, v2, vv[0] })
  46353. default : panic("instruction VFMSUB132SD takes 3 or 4 operands")
  46354. }
  46355. // VFMSUB132SD xmm, xmm, xmm
  46356. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  46357. self.require(ISA_FMA3)
  46358. p.domain = DomainFMA
  46359. p.add(0, func(m *_Encoding, v []interface{}) {
  46360. m.emit(0xc4)
  46361. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  46362. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  46363. m.emit(0x9b)
  46364. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46365. })
  46366. }
  46367. // VFMSUB132SD m64, xmm, xmm
  46368. if len(vv) == 0 && isM64(v0) && isXMM(v1) && isXMM(v2) {
  46369. self.require(ISA_FMA3)
  46370. p.domain = DomainFMA
  46371. p.add(0, func(m *_Encoding, v []interface{}) {
  46372. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  46373. m.emit(0x9b)
  46374. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  46375. })
  46376. }
  46377. // VFMSUB132SD m64, xmm, xmm{k}{z}
  46378. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  46379. self.require(ISA_AVX512F)
  46380. p.domain = DomainFMA
  46381. p.add(0, func(m *_Encoding, v []interface{}) {
  46382. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  46383. m.emit(0x9b)
  46384. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  46385. })
  46386. }
  46387. // VFMSUB132SD {er}, xmm, xmm, xmm{k}{z}
  46388. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  46389. self.require(ISA_AVX512F)
  46390. p.domain = DomainFMA
  46391. p.add(0, func(m *_Encoding, v []interface{}) {
  46392. m.emit(0x62)
  46393. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  46394. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  46395. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  46396. m.emit(0x9b)
  46397. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  46398. })
  46399. }
  46400. // VFMSUB132SD xmm, xmm, xmm{k}{z}
  46401. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  46402. self.require(ISA_AVX512F)
  46403. p.domain = DomainFMA
  46404. p.add(0, func(m *_Encoding, v []interface{}) {
  46405. m.emit(0x62)
  46406. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  46407. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  46408. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  46409. m.emit(0x9b)
  46410. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46411. })
  46412. }
  46413. if p.len == 0 {
  46414. panic("invalid operands for VFMSUB132SD")
  46415. }
  46416. return p
  46417. }
  46418. // VFMSUB132SS performs "Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values".
  46419. //
  46420. // Mnemonic : VFMSUB132SS
  46421. // Supported forms : (5 forms)
  46422. //
  46423. // * VFMSUB132SS xmm, xmm, xmm [FMA3]
  46424. // * VFMSUB132SS m32, xmm, xmm [FMA3]
  46425. // * VFMSUB132SS m32, xmm, xmm{k}{z} [AVX512F]
  46426. // * VFMSUB132SS {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  46427. // * VFMSUB132SS xmm, xmm, xmm{k}{z} [AVX512F]
  46428. //
  46429. func (self *Program) VFMSUB132SS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  46430. var p *Instruction
  46431. switch len(vv) {
  46432. case 0 : p = self.alloc("VFMSUB132SS", 3, Operands { v0, v1, v2 })
  46433. case 1 : p = self.alloc("VFMSUB132SS", 4, Operands { v0, v1, v2, vv[0] })
  46434. default : panic("instruction VFMSUB132SS takes 3 or 4 operands")
  46435. }
  46436. // VFMSUB132SS xmm, xmm, xmm
  46437. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  46438. self.require(ISA_FMA3)
  46439. p.domain = DomainFMA
  46440. p.add(0, func(m *_Encoding, v []interface{}) {
  46441. m.emit(0xc4)
  46442. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  46443. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  46444. m.emit(0x9b)
  46445. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46446. })
  46447. }
  46448. // VFMSUB132SS m32, xmm, xmm
  46449. if len(vv) == 0 && isM32(v0) && isXMM(v1) && isXMM(v2) {
  46450. self.require(ISA_FMA3)
  46451. p.domain = DomainFMA
  46452. p.add(0, func(m *_Encoding, v []interface{}) {
  46453. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  46454. m.emit(0x9b)
  46455. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  46456. })
  46457. }
  46458. // VFMSUB132SS m32, xmm, xmm{k}{z}
  46459. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  46460. self.require(ISA_AVX512F)
  46461. p.domain = DomainFMA
  46462. p.add(0, func(m *_Encoding, v []interface{}) {
  46463. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  46464. m.emit(0x9b)
  46465. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  46466. })
  46467. }
  46468. // VFMSUB132SS {er}, xmm, xmm, xmm{k}{z}
  46469. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  46470. self.require(ISA_AVX512F)
  46471. p.domain = DomainFMA
  46472. p.add(0, func(m *_Encoding, v []interface{}) {
  46473. m.emit(0x62)
  46474. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  46475. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  46476. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  46477. m.emit(0x9b)
  46478. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  46479. })
  46480. }
  46481. // VFMSUB132SS xmm, xmm, xmm{k}{z}
  46482. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  46483. self.require(ISA_AVX512F)
  46484. p.domain = DomainFMA
  46485. p.add(0, func(m *_Encoding, v []interface{}) {
  46486. m.emit(0x62)
  46487. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  46488. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  46489. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  46490. m.emit(0x9b)
  46491. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46492. })
  46493. }
  46494. if p.len == 0 {
  46495. panic("invalid operands for VFMSUB132SS")
  46496. }
  46497. return p
  46498. }
  46499. // VFMSUB213PD performs "Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values".
  46500. //
  46501. // Mnemonic : VFMSUB213PD
  46502. // Supported forms : (11 forms)
  46503. //
  46504. // * VFMSUB213PD xmm, xmm, xmm [FMA3]
  46505. // * VFMSUB213PD m128, xmm, xmm [FMA3]
  46506. // * VFMSUB213PD ymm, ymm, ymm [FMA3]
  46507. // * VFMSUB213PD m256, ymm, ymm [FMA3]
  46508. // * VFMSUB213PD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  46509. // * VFMSUB213PD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  46510. // * VFMSUB213PD zmm, zmm, zmm{k}{z} [AVX512F]
  46511. // * VFMSUB213PD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  46512. // * VFMSUB213PD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  46513. // * VFMSUB213PD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  46514. // * VFMSUB213PD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  46515. //
  46516. func (self *Program) VFMSUB213PD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  46517. var p *Instruction
  46518. switch len(vv) {
  46519. case 0 : p = self.alloc("VFMSUB213PD", 3, Operands { v0, v1, v2 })
  46520. case 1 : p = self.alloc("VFMSUB213PD", 4, Operands { v0, v1, v2, vv[0] })
  46521. default : panic("instruction VFMSUB213PD takes 3 or 4 operands")
  46522. }
  46523. // VFMSUB213PD xmm, xmm, xmm
  46524. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  46525. self.require(ISA_FMA3)
  46526. p.domain = DomainFMA
  46527. p.add(0, func(m *_Encoding, v []interface{}) {
  46528. m.emit(0xc4)
  46529. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  46530. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  46531. m.emit(0xaa)
  46532. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46533. })
  46534. }
  46535. // VFMSUB213PD m128, xmm, xmm
  46536. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  46537. self.require(ISA_FMA3)
  46538. p.domain = DomainFMA
  46539. p.add(0, func(m *_Encoding, v []interface{}) {
  46540. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  46541. m.emit(0xaa)
  46542. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  46543. })
  46544. }
  46545. // VFMSUB213PD ymm, ymm, ymm
  46546. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  46547. self.require(ISA_FMA3)
  46548. p.domain = DomainFMA
  46549. p.add(0, func(m *_Encoding, v []interface{}) {
  46550. m.emit(0xc4)
  46551. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  46552. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  46553. m.emit(0xaa)
  46554. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46555. })
  46556. }
  46557. // VFMSUB213PD m256, ymm, ymm
  46558. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  46559. self.require(ISA_FMA3)
  46560. p.domain = DomainFMA
  46561. p.add(0, func(m *_Encoding, v []interface{}) {
  46562. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  46563. m.emit(0xaa)
  46564. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  46565. })
  46566. }
  46567. // VFMSUB213PD m512/m64bcst, zmm, zmm{k}{z}
  46568. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  46569. self.require(ISA_AVX512F)
  46570. p.domain = DomainFMA
  46571. p.add(0, func(m *_Encoding, v []interface{}) {
  46572. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  46573. m.emit(0xaa)
  46574. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  46575. })
  46576. }
  46577. // VFMSUB213PD {er}, zmm, zmm, zmm{k}{z}
  46578. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  46579. self.require(ISA_AVX512F)
  46580. p.domain = DomainFMA
  46581. p.add(0, func(m *_Encoding, v []interface{}) {
  46582. m.emit(0x62)
  46583. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  46584. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  46585. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  46586. m.emit(0xaa)
  46587. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  46588. })
  46589. }
  46590. // VFMSUB213PD zmm, zmm, zmm{k}{z}
  46591. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  46592. self.require(ISA_AVX512F)
  46593. p.domain = DomainFMA
  46594. p.add(0, func(m *_Encoding, v []interface{}) {
  46595. m.emit(0x62)
  46596. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  46597. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  46598. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  46599. m.emit(0xaa)
  46600. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46601. })
  46602. }
  46603. // VFMSUB213PD m128/m64bcst, xmm, xmm{k}{z}
  46604. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  46605. self.require(ISA_AVX512VL | ISA_AVX512F)
  46606. p.domain = DomainFMA
  46607. p.add(0, func(m *_Encoding, v []interface{}) {
  46608. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  46609. m.emit(0xaa)
  46610. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  46611. })
  46612. }
  46613. // VFMSUB213PD xmm, xmm, xmm{k}{z}
  46614. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  46615. self.require(ISA_AVX512VL | ISA_AVX512F)
  46616. p.domain = DomainFMA
  46617. p.add(0, func(m *_Encoding, v []interface{}) {
  46618. m.emit(0x62)
  46619. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  46620. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  46621. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  46622. m.emit(0xaa)
  46623. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46624. })
  46625. }
  46626. // VFMSUB213PD m256/m64bcst, ymm, ymm{k}{z}
  46627. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  46628. self.require(ISA_AVX512VL | ISA_AVX512F)
  46629. p.domain = DomainFMA
  46630. p.add(0, func(m *_Encoding, v []interface{}) {
  46631. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  46632. m.emit(0xaa)
  46633. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  46634. })
  46635. }
  46636. // VFMSUB213PD ymm, ymm, ymm{k}{z}
  46637. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  46638. self.require(ISA_AVX512VL | ISA_AVX512F)
  46639. p.domain = DomainFMA
  46640. p.add(0, func(m *_Encoding, v []interface{}) {
  46641. m.emit(0x62)
  46642. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  46643. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  46644. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  46645. m.emit(0xaa)
  46646. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46647. })
  46648. }
  46649. if p.len == 0 {
  46650. panic("invalid operands for VFMSUB213PD")
  46651. }
  46652. return p
  46653. }
  46654. // VFMSUB213PS performs "Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values".
  46655. //
  46656. // Mnemonic : VFMSUB213PS
  46657. // Supported forms : (11 forms)
  46658. //
  46659. // * VFMSUB213PS xmm, xmm, xmm [FMA3]
  46660. // * VFMSUB213PS m128, xmm, xmm [FMA3]
  46661. // * VFMSUB213PS ymm, ymm, ymm [FMA3]
  46662. // * VFMSUB213PS m256, ymm, ymm [FMA3]
  46663. // * VFMSUB213PS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  46664. // * VFMSUB213PS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  46665. // * VFMSUB213PS zmm, zmm, zmm{k}{z} [AVX512F]
  46666. // * VFMSUB213PS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  46667. // * VFMSUB213PS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  46668. // * VFMSUB213PS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  46669. // * VFMSUB213PS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  46670. //
  46671. func (self *Program) VFMSUB213PS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  46672. var p *Instruction
  46673. switch len(vv) {
  46674. case 0 : p = self.alloc("VFMSUB213PS", 3, Operands { v0, v1, v2 })
  46675. case 1 : p = self.alloc("VFMSUB213PS", 4, Operands { v0, v1, v2, vv[0] })
  46676. default : panic("instruction VFMSUB213PS takes 3 or 4 operands")
  46677. }
  46678. // VFMSUB213PS xmm, xmm, xmm
  46679. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  46680. self.require(ISA_FMA3)
  46681. p.domain = DomainFMA
  46682. p.add(0, func(m *_Encoding, v []interface{}) {
  46683. m.emit(0xc4)
  46684. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  46685. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  46686. m.emit(0xaa)
  46687. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46688. })
  46689. }
  46690. // VFMSUB213PS m128, xmm, xmm
  46691. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  46692. self.require(ISA_FMA3)
  46693. p.domain = DomainFMA
  46694. p.add(0, func(m *_Encoding, v []interface{}) {
  46695. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  46696. m.emit(0xaa)
  46697. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  46698. })
  46699. }
  46700. // VFMSUB213PS ymm, ymm, ymm
  46701. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  46702. self.require(ISA_FMA3)
  46703. p.domain = DomainFMA
  46704. p.add(0, func(m *_Encoding, v []interface{}) {
  46705. m.emit(0xc4)
  46706. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  46707. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  46708. m.emit(0xaa)
  46709. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46710. })
  46711. }
  46712. // VFMSUB213PS m256, ymm, ymm
  46713. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  46714. self.require(ISA_FMA3)
  46715. p.domain = DomainFMA
  46716. p.add(0, func(m *_Encoding, v []interface{}) {
  46717. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  46718. m.emit(0xaa)
  46719. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  46720. })
  46721. }
  46722. // VFMSUB213PS m512/m32bcst, zmm, zmm{k}{z}
  46723. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  46724. self.require(ISA_AVX512F)
  46725. p.domain = DomainFMA
  46726. p.add(0, func(m *_Encoding, v []interface{}) {
  46727. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  46728. m.emit(0xaa)
  46729. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  46730. })
  46731. }
  46732. // VFMSUB213PS {er}, zmm, zmm, zmm{k}{z}
  46733. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  46734. self.require(ISA_AVX512F)
  46735. p.domain = DomainFMA
  46736. p.add(0, func(m *_Encoding, v []interface{}) {
  46737. m.emit(0x62)
  46738. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  46739. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  46740. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  46741. m.emit(0xaa)
  46742. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  46743. })
  46744. }
  46745. // VFMSUB213PS zmm, zmm, zmm{k}{z}
  46746. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  46747. self.require(ISA_AVX512F)
  46748. p.domain = DomainFMA
  46749. p.add(0, func(m *_Encoding, v []interface{}) {
  46750. m.emit(0x62)
  46751. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  46752. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  46753. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  46754. m.emit(0xaa)
  46755. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46756. })
  46757. }
  46758. // VFMSUB213PS m128/m32bcst, xmm, xmm{k}{z}
  46759. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  46760. self.require(ISA_AVX512VL | ISA_AVX512F)
  46761. p.domain = DomainFMA
  46762. p.add(0, func(m *_Encoding, v []interface{}) {
  46763. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  46764. m.emit(0xaa)
  46765. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  46766. })
  46767. }
  46768. // VFMSUB213PS xmm, xmm, xmm{k}{z}
  46769. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  46770. self.require(ISA_AVX512VL | ISA_AVX512F)
  46771. p.domain = DomainFMA
  46772. p.add(0, func(m *_Encoding, v []interface{}) {
  46773. m.emit(0x62)
  46774. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  46775. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  46776. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  46777. m.emit(0xaa)
  46778. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46779. })
  46780. }
  46781. // VFMSUB213PS m256/m32bcst, ymm, ymm{k}{z}
  46782. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  46783. self.require(ISA_AVX512VL | ISA_AVX512F)
  46784. p.domain = DomainFMA
  46785. p.add(0, func(m *_Encoding, v []interface{}) {
  46786. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  46787. m.emit(0xaa)
  46788. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  46789. })
  46790. }
  46791. // VFMSUB213PS ymm, ymm, ymm{k}{z}
  46792. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  46793. self.require(ISA_AVX512VL | ISA_AVX512F)
  46794. p.domain = DomainFMA
  46795. p.add(0, func(m *_Encoding, v []interface{}) {
  46796. m.emit(0x62)
  46797. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  46798. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  46799. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  46800. m.emit(0xaa)
  46801. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46802. })
  46803. }
  46804. if p.len == 0 {
  46805. panic("invalid operands for VFMSUB213PS")
  46806. }
  46807. return p
  46808. }
  46809. // VFMSUB213SD performs "Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values".
  46810. //
  46811. // Mnemonic : VFMSUB213SD
  46812. // Supported forms : (5 forms)
  46813. //
  46814. // * VFMSUB213SD xmm, xmm, xmm [FMA3]
  46815. // * VFMSUB213SD m64, xmm, xmm [FMA3]
  46816. // * VFMSUB213SD m64, xmm, xmm{k}{z} [AVX512F]
  46817. // * VFMSUB213SD {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  46818. // * VFMSUB213SD xmm, xmm, xmm{k}{z} [AVX512F]
  46819. //
  46820. func (self *Program) VFMSUB213SD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  46821. var p *Instruction
  46822. switch len(vv) {
  46823. case 0 : p = self.alloc("VFMSUB213SD", 3, Operands { v0, v1, v2 })
  46824. case 1 : p = self.alloc("VFMSUB213SD", 4, Operands { v0, v1, v2, vv[0] })
  46825. default : panic("instruction VFMSUB213SD takes 3 or 4 operands")
  46826. }
  46827. // VFMSUB213SD xmm, xmm, xmm
  46828. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  46829. self.require(ISA_FMA3)
  46830. p.domain = DomainFMA
  46831. p.add(0, func(m *_Encoding, v []interface{}) {
  46832. m.emit(0xc4)
  46833. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  46834. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  46835. m.emit(0xab)
  46836. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46837. })
  46838. }
  46839. // VFMSUB213SD m64, xmm, xmm
  46840. if len(vv) == 0 && isM64(v0) && isXMM(v1) && isXMM(v2) {
  46841. self.require(ISA_FMA3)
  46842. p.domain = DomainFMA
  46843. p.add(0, func(m *_Encoding, v []interface{}) {
  46844. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  46845. m.emit(0xab)
  46846. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  46847. })
  46848. }
  46849. // VFMSUB213SD m64, xmm, xmm{k}{z}
  46850. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  46851. self.require(ISA_AVX512F)
  46852. p.domain = DomainFMA
  46853. p.add(0, func(m *_Encoding, v []interface{}) {
  46854. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  46855. m.emit(0xab)
  46856. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  46857. })
  46858. }
  46859. // VFMSUB213SD {er}, xmm, xmm, xmm{k}{z}
  46860. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  46861. self.require(ISA_AVX512F)
  46862. p.domain = DomainFMA
  46863. p.add(0, func(m *_Encoding, v []interface{}) {
  46864. m.emit(0x62)
  46865. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  46866. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  46867. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  46868. m.emit(0xab)
  46869. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  46870. })
  46871. }
  46872. // VFMSUB213SD xmm, xmm, xmm{k}{z}
  46873. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  46874. self.require(ISA_AVX512F)
  46875. p.domain = DomainFMA
  46876. p.add(0, func(m *_Encoding, v []interface{}) {
  46877. m.emit(0x62)
  46878. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  46879. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  46880. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  46881. m.emit(0xab)
  46882. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46883. })
  46884. }
  46885. if p.len == 0 {
  46886. panic("invalid operands for VFMSUB213SD")
  46887. }
  46888. return p
  46889. }
  46890. // VFMSUB213SS performs "Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values".
  46891. //
  46892. // Mnemonic : VFMSUB213SS
  46893. // Supported forms : (5 forms)
  46894. //
  46895. // * VFMSUB213SS xmm, xmm, xmm [FMA3]
  46896. // * VFMSUB213SS m32, xmm, xmm [FMA3]
  46897. // * VFMSUB213SS m32, xmm, xmm{k}{z} [AVX512F]
  46898. // * VFMSUB213SS {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  46899. // * VFMSUB213SS xmm, xmm, xmm{k}{z} [AVX512F]
  46900. //
  46901. func (self *Program) VFMSUB213SS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  46902. var p *Instruction
  46903. switch len(vv) {
  46904. case 0 : p = self.alloc("VFMSUB213SS", 3, Operands { v0, v1, v2 })
  46905. case 1 : p = self.alloc("VFMSUB213SS", 4, Operands { v0, v1, v2, vv[0] })
  46906. default : panic("instruction VFMSUB213SS takes 3 or 4 operands")
  46907. }
  46908. // VFMSUB213SS xmm, xmm, xmm
  46909. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  46910. self.require(ISA_FMA3)
  46911. p.domain = DomainFMA
  46912. p.add(0, func(m *_Encoding, v []interface{}) {
  46913. m.emit(0xc4)
  46914. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  46915. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  46916. m.emit(0xab)
  46917. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46918. })
  46919. }
  46920. // VFMSUB213SS m32, xmm, xmm
  46921. if len(vv) == 0 && isM32(v0) && isXMM(v1) && isXMM(v2) {
  46922. self.require(ISA_FMA3)
  46923. p.domain = DomainFMA
  46924. p.add(0, func(m *_Encoding, v []interface{}) {
  46925. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  46926. m.emit(0xab)
  46927. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  46928. })
  46929. }
  46930. // VFMSUB213SS m32, xmm, xmm{k}{z}
  46931. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  46932. self.require(ISA_AVX512F)
  46933. p.domain = DomainFMA
  46934. p.add(0, func(m *_Encoding, v []interface{}) {
  46935. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  46936. m.emit(0xab)
  46937. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  46938. })
  46939. }
  46940. // VFMSUB213SS {er}, xmm, xmm, xmm{k}{z}
  46941. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  46942. self.require(ISA_AVX512F)
  46943. p.domain = DomainFMA
  46944. p.add(0, func(m *_Encoding, v []interface{}) {
  46945. m.emit(0x62)
  46946. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  46947. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  46948. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  46949. m.emit(0xab)
  46950. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  46951. })
  46952. }
  46953. // VFMSUB213SS xmm, xmm, xmm{k}{z}
  46954. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  46955. self.require(ISA_AVX512F)
  46956. p.domain = DomainFMA
  46957. p.add(0, func(m *_Encoding, v []interface{}) {
  46958. m.emit(0x62)
  46959. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  46960. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  46961. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  46962. m.emit(0xab)
  46963. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  46964. })
  46965. }
  46966. if p.len == 0 {
  46967. panic("invalid operands for VFMSUB213SS")
  46968. }
  46969. return p
  46970. }
  46971. // VFMSUB231PD performs "Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values".
  46972. //
  46973. // Mnemonic : VFMSUB231PD
  46974. // Supported forms : (11 forms)
  46975. //
  46976. // * VFMSUB231PD xmm, xmm, xmm [FMA3]
  46977. // * VFMSUB231PD m128, xmm, xmm [FMA3]
  46978. // * VFMSUB231PD ymm, ymm, ymm [FMA3]
  46979. // * VFMSUB231PD m256, ymm, ymm [FMA3]
  46980. // * VFMSUB231PD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  46981. // * VFMSUB231PD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  46982. // * VFMSUB231PD zmm, zmm, zmm{k}{z} [AVX512F]
  46983. // * VFMSUB231PD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  46984. // * VFMSUB231PD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  46985. // * VFMSUB231PD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  46986. // * VFMSUB231PD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  46987. //
  46988. func (self *Program) VFMSUB231PD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  46989. var p *Instruction
  46990. switch len(vv) {
  46991. case 0 : p = self.alloc("VFMSUB231PD", 3, Operands { v0, v1, v2 })
  46992. case 1 : p = self.alloc("VFMSUB231PD", 4, Operands { v0, v1, v2, vv[0] })
  46993. default : panic("instruction VFMSUB231PD takes 3 or 4 operands")
  46994. }
  46995. // VFMSUB231PD xmm, xmm, xmm
  46996. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  46997. self.require(ISA_FMA3)
  46998. p.domain = DomainFMA
  46999. p.add(0, func(m *_Encoding, v []interface{}) {
  47000. m.emit(0xc4)
  47001. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  47002. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  47003. m.emit(0xba)
  47004. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47005. })
  47006. }
  47007. // VFMSUB231PD m128, xmm, xmm
  47008. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  47009. self.require(ISA_FMA3)
  47010. p.domain = DomainFMA
  47011. p.add(0, func(m *_Encoding, v []interface{}) {
  47012. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  47013. m.emit(0xba)
  47014. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  47015. })
  47016. }
  47017. // VFMSUB231PD ymm, ymm, ymm
  47018. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  47019. self.require(ISA_FMA3)
  47020. p.domain = DomainFMA
  47021. p.add(0, func(m *_Encoding, v []interface{}) {
  47022. m.emit(0xc4)
  47023. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  47024. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  47025. m.emit(0xba)
  47026. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47027. })
  47028. }
  47029. // VFMSUB231PD m256, ymm, ymm
  47030. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  47031. self.require(ISA_FMA3)
  47032. p.domain = DomainFMA
  47033. p.add(0, func(m *_Encoding, v []interface{}) {
  47034. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  47035. m.emit(0xba)
  47036. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  47037. })
  47038. }
  47039. // VFMSUB231PD m512/m64bcst, zmm, zmm{k}{z}
  47040. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  47041. self.require(ISA_AVX512F)
  47042. p.domain = DomainFMA
  47043. p.add(0, func(m *_Encoding, v []interface{}) {
  47044. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  47045. m.emit(0xba)
  47046. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  47047. })
  47048. }
  47049. // VFMSUB231PD {er}, zmm, zmm, zmm{k}{z}
  47050. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  47051. self.require(ISA_AVX512F)
  47052. p.domain = DomainFMA
  47053. p.add(0, func(m *_Encoding, v []interface{}) {
  47054. m.emit(0x62)
  47055. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  47056. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  47057. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  47058. m.emit(0xba)
  47059. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  47060. })
  47061. }
  47062. // VFMSUB231PD zmm, zmm, zmm{k}{z}
  47063. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  47064. self.require(ISA_AVX512F)
  47065. p.domain = DomainFMA
  47066. p.add(0, func(m *_Encoding, v []interface{}) {
  47067. m.emit(0x62)
  47068. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  47069. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  47070. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  47071. m.emit(0xba)
  47072. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47073. })
  47074. }
  47075. // VFMSUB231PD m128/m64bcst, xmm, xmm{k}{z}
  47076. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  47077. self.require(ISA_AVX512VL | ISA_AVX512F)
  47078. p.domain = DomainFMA
  47079. p.add(0, func(m *_Encoding, v []interface{}) {
  47080. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  47081. m.emit(0xba)
  47082. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  47083. })
  47084. }
  47085. // VFMSUB231PD xmm, xmm, xmm{k}{z}
  47086. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  47087. self.require(ISA_AVX512VL | ISA_AVX512F)
  47088. p.domain = DomainFMA
  47089. p.add(0, func(m *_Encoding, v []interface{}) {
  47090. m.emit(0x62)
  47091. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  47092. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  47093. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  47094. m.emit(0xba)
  47095. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47096. })
  47097. }
  47098. // VFMSUB231PD m256/m64bcst, ymm, ymm{k}{z}
  47099. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  47100. self.require(ISA_AVX512VL | ISA_AVX512F)
  47101. p.domain = DomainFMA
  47102. p.add(0, func(m *_Encoding, v []interface{}) {
  47103. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  47104. m.emit(0xba)
  47105. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  47106. })
  47107. }
  47108. // VFMSUB231PD ymm, ymm, ymm{k}{z}
  47109. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  47110. self.require(ISA_AVX512VL | ISA_AVX512F)
  47111. p.domain = DomainFMA
  47112. p.add(0, func(m *_Encoding, v []interface{}) {
  47113. m.emit(0x62)
  47114. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  47115. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  47116. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  47117. m.emit(0xba)
  47118. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47119. })
  47120. }
  47121. if p.len == 0 {
  47122. panic("invalid operands for VFMSUB231PD")
  47123. }
  47124. return p
  47125. }
  47126. // VFMSUB231PS performs "Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values".
  47127. //
  47128. // Mnemonic : VFMSUB231PS
  47129. // Supported forms : (11 forms)
  47130. //
  47131. // * VFMSUB231PS xmm, xmm, xmm [FMA3]
  47132. // * VFMSUB231PS m128, xmm, xmm [FMA3]
  47133. // * VFMSUB231PS ymm, ymm, ymm [FMA3]
  47134. // * VFMSUB231PS m256, ymm, ymm [FMA3]
  47135. // * VFMSUB231PS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  47136. // * VFMSUB231PS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  47137. // * VFMSUB231PS zmm, zmm, zmm{k}{z} [AVX512F]
  47138. // * VFMSUB231PS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  47139. // * VFMSUB231PS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  47140. // * VFMSUB231PS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  47141. // * VFMSUB231PS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  47142. //
  47143. func (self *Program) VFMSUB231PS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  47144. var p *Instruction
  47145. switch len(vv) {
  47146. case 0 : p = self.alloc("VFMSUB231PS", 3, Operands { v0, v1, v2 })
  47147. case 1 : p = self.alloc("VFMSUB231PS", 4, Operands { v0, v1, v2, vv[0] })
  47148. default : panic("instruction VFMSUB231PS takes 3 or 4 operands")
  47149. }
  47150. // VFMSUB231PS xmm, xmm, xmm
  47151. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  47152. self.require(ISA_FMA3)
  47153. p.domain = DomainFMA
  47154. p.add(0, func(m *_Encoding, v []interface{}) {
  47155. m.emit(0xc4)
  47156. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  47157. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  47158. m.emit(0xba)
  47159. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47160. })
  47161. }
  47162. // VFMSUB231PS m128, xmm, xmm
  47163. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  47164. self.require(ISA_FMA3)
  47165. p.domain = DomainFMA
  47166. p.add(0, func(m *_Encoding, v []interface{}) {
  47167. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  47168. m.emit(0xba)
  47169. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  47170. })
  47171. }
  47172. // VFMSUB231PS ymm, ymm, ymm
  47173. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  47174. self.require(ISA_FMA3)
  47175. p.domain = DomainFMA
  47176. p.add(0, func(m *_Encoding, v []interface{}) {
  47177. m.emit(0xc4)
  47178. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  47179. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  47180. m.emit(0xba)
  47181. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47182. })
  47183. }
  47184. // VFMSUB231PS m256, ymm, ymm
  47185. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  47186. self.require(ISA_FMA3)
  47187. p.domain = DomainFMA
  47188. p.add(0, func(m *_Encoding, v []interface{}) {
  47189. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  47190. m.emit(0xba)
  47191. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  47192. })
  47193. }
  47194. // VFMSUB231PS m512/m32bcst, zmm, zmm{k}{z}
  47195. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  47196. self.require(ISA_AVX512F)
  47197. p.domain = DomainFMA
  47198. p.add(0, func(m *_Encoding, v []interface{}) {
  47199. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  47200. m.emit(0xba)
  47201. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  47202. })
  47203. }
  47204. // VFMSUB231PS {er}, zmm, zmm, zmm{k}{z}
  47205. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  47206. self.require(ISA_AVX512F)
  47207. p.domain = DomainFMA
  47208. p.add(0, func(m *_Encoding, v []interface{}) {
  47209. m.emit(0x62)
  47210. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  47211. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  47212. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  47213. m.emit(0xba)
  47214. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  47215. })
  47216. }
  47217. // VFMSUB231PS zmm, zmm, zmm{k}{z}
  47218. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  47219. self.require(ISA_AVX512F)
  47220. p.domain = DomainFMA
  47221. p.add(0, func(m *_Encoding, v []interface{}) {
  47222. m.emit(0x62)
  47223. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  47224. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  47225. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  47226. m.emit(0xba)
  47227. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47228. })
  47229. }
  47230. // VFMSUB231PS m128/m32bcst, xmm, xmm{k}{z}
  47231. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  47232. self.require(ISA_AVX512VL | ISA_AVX512F)
  47233. p.domain = DomainFMA
  47234. p.add(0, func(m *_Encoding, v []interface{}) {
  47235. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  47236. m.emit(0xba)
  47237. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  47238. })
  47239. }
  47240. // VFMSUB231PS xmm, xmm, xmm{k}{z}
  47241. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  47242. self.require(ISA_AVX512VL | ISA_AVX512F)
  47243. p.domain = DomainFMA
  47244. p.add(0, func(m *_Encoding, v []interface{}) {
  47245. m.emit(0x62)
  47246. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  47247. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  47248. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  47249. m.emit(0xba)
  47250. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47251. })
  47252. }
  47253. // VFMSUB231PS m256/m32bcst, ymm, ymm{k}{z}
  47254. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  47255. self.require(ISA_AVX512VL | ISA_AVX512F)
  47256. p.domain = DomainFMA
  47257. p.add(0, func(m *_Encoding, v []interface{}) {
  47258. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  47259. m.emit(0xba)
  47260. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  47261. })
  47262. }
  47263. // VFMSUB231PS ymm, ymm, ymm{k}{z}
  47264. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  47265. self.require(ISA_AVX512VL | ISA_AVX512F)
  47266. p.domain = DomainFMA
  47267. p.add(0, func(m *_Encoding, v []interface{}) {
  47268. m.emit(0x62)
  47269. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  47270. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  47271. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  47272. m.emit(0xba)
  47273. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47274. })
  47275. }
  47276. if p.len == 0 {
  47277. panic("invalid operands for VFMSUB231PS")
  47278. }
  47279. return p
  47280. }
  47281. // VFMSUB231SD performs "Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values".
  47282. //
  47283. // Mnemonic : VFMSUB231SD
  47284. // Supported forms : (5 forms)
  47285. //
  47286. // * VFMSUB231SD xmm, xmm, xmm [FMA3]
  47287. // * VFMSUB231SD m64, xmm, xmm [FMA3]
  47288. // * VFMSUB231SD m64, xmm, xmm{k}{z} [AVX512F]
  47289. // * VFMSUB231SD {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  47290. // * VFMSUB231SD xmm, xmm, xmm{k}{z} [AVX512F]
  47291. //
  47292. func (self *Program) VFMSUB231SD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  47293. var p *Instruction
  47294. switch len(vv) {
  47295. case 0 : p = self.alloc("VFMSUB231SD", 3, Operands { v0, v1, v2 })
  47296. case 1 : p = self.alloc("VFMSUB231SD", 4, Operands { v0, v1, v2, vv[0] })
  47297. default : panic("instruction VFMSUB231SD takes 3 or 4 operands")
  47298. }
  47299. // VFMSUB231SD xmm, xmm, xmm
  47300. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  47301. self.require(ISA_FMA3)
  47302. p.domain = DomainFMA
  47303. p.add(0, func(m *_Encoding, v []interface{}) {
  47304. m.emit(0xc4)
  47305. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  47306. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  47307. m.emit(0xbb)
  47308. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47309. })
  47310. }
  47311. // VFMSUB231SD m64, xmm, xmm
  47312. if len(vv) == 0 && isM64(v0) && isXMM(v1) && isXMM(v2) {
  47313. self.require(ISA_FMA3)
  47314. p.domain = DomainFMA
  47315. p.add(0, func(m *_Encoding, v []interface{}) {
  47316. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  47317. m.emit(0xbb)
  47318. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  47319. })
  47320. }
  47321. // VFMSUB231SD m64, xmm, xmm{k}{z}
  47322. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  47323. self.require(ISA_AVX512F)
  47324. p.domain = DomainFMA
  47325. p.add(0, func(m *_Encoding, v []interface{}) {
  47326. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  47327. m.emit(0xbb)
  47328. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  47329. })
  47330. }
  47331. // VFMSUB231SD {er}, xmm, xmm, xmm{k}{z}
  47332. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  47333. self.require(ISA_AVX512F)
  47334. p.domain = DomainFMA
  47335. p.add(0, func(m *_Encoding, v []interface{}) {
  47336. m.emit(0x62)
  47337. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  47338. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  47339. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  47340. m.emit(0xbb)
  47341. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  47342. })
  47343. }
  47344. // VFMSUB231SD xmm, xmm, xmm{k}{z}
  47345. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  47346. self.require(ISA_AVX512F)
  47347. p.domain = DomainFMA
  47348. p.add(0, func(m *_Encoding, v []interface{}) {
  47349. m.emit(0x62)
  47350. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  47351. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  47352. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  47353. m.emit(0xbb)
  47354. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47355. })
  47356. }
  47357. if p.len == 0 {
  47358. panic("invalid operands for VFMSUB231SD")
  47359. }
  47360. return p
  47361. }
  47362. // VFMSUB231SS performs "Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values".
  47363. //
  47364. // Mnemonic : VFMSUB231SS
  47365. // Supported forms : (5 forms)
  47366. //
  47367. // * VFMSUB231SS xmm, xmm, xmm [FMA3]
  47368. // * VFMSUB231SS m32, xmm, xmm [FMA3]
  47369. // * VFMSUB231SS m32, xmm, xmm{k}{z} [AVX512F]
  47370. // * VFMSUB231SS {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  47371. // * VFMSUB231SS xmm, xmm, xmm{k}{z} [AVX512F]
  47372. //
  47373. func (self *Program) VFMSUB231SS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  47374. var p *Instruction
  47375. switch len(vv) {
  47376. case 0 : p = self.alloc("VFMSUB231SS", 3, Operands { v0, v1, v2 })
  47377. case 1 : p = self.alloc("VFMSUB231SS", 4, Operands { v0, v1, v2, vv[0] })
  47378. default : panic("instruction VFMSUB231SS takes 3 or 4 operands")
  47379. }
  47380. // VFMSUB231SS xmm, xmm, xmm
  47381. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  47382. self.require(ISA_FMA3)
  47383. p.domain = DomainFMA
  47384. p.add(0, func(m *_Encoding, v []interface{}) {
  47385. m.emit(0xc4)
  47386. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  47387. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  47388. m.emit(0xbb)
  47389. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47390. })
  47391. }
  47392. // VFMSUB231SS m32, xmm, xmm
  47393. if len(vv) == 0 && isM32(v0) && isXMM(v1) && isXMM(v2) {
  47394. self.require(ISA_FMA3)
  47395. p.domain = DomainFMA
  47396. p.add(0, func(m *_Encoding, v []interface{}) {
  47397. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  47398. m.emit(0xbb)
  47399. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  47400. })
  47401. }
  47402. // VFMSUB231SS m32, xmm, xmm{k}{z}
  47403. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  47404. self.require(ISA_AVX512F)
  47405. p.domain = DomainFMA
  47406. p.add(0, func(m *_Encoding, v []interface{}) {
  47407. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  47408. m.emit(0xbb)
  47409. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  47410. })
  47411. }
  47412. // VFMSUB231SS {er}, xmm, xmm, xmm{k}{z}
  47413. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  47414. self.require(ISA_AVX512F)
  47415. p.domain = DomainFMA
  47416. p.add(0, func(m *_Encoding, v []interface{}) {
  47417. m.emit(0x62)
  47418. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  47419. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  47420. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  47421. m.emit(0xbb)
  47422. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  47423. })
  47424. }
  47425. // VFMSUB231SS xmm, xmm, xmm{k}{z}
  47426. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  47427. self.require(ISA_AVX512F)
  47428. p.domain = DomainFMA
  47429. p.add(0, func(m *_Encoding, v []interface{}) {
  47430. m.emit(0x62)
  47431. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  47432. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  47433. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  47434. m.emit(0xbb)
  47435. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47436. })
  47437. }
  47438. if p.len == 0 {
  47439. panic("invalid operands for VFMSUB231SS")
  47440. }
  47441. return p
  47442. }
  47443. // VFMSUBADD132PD performs "Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values".
  47444. //
  47445. // Mnemonic : VFMSUBADD132PD
  47446. // Supported forms : (11 forms)
  47447. //
  47448. // * VFMSUBADD132PD xmm, xmm, xmm [FMA3]
  47449. // * VFMSUBADD132PD m128, xmm, xmm [FMA3]
  47450. // * VFMSUBADD132PD ymm, ymm, ymm [FMA3]
  47451. // * VFMSUBADD132PD m256, ymm, ymm [FMA3]
  47452. // * VFMSUBADD132PD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  47453. // * VFMSUBADD132PD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  47454. // * VFMSUBADD132PD zmm, zmm, zmm{k}{z} [AVX512F]
  47455. // * VFMSUBADD132PD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  47456. // * VFMSUBADD132PD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  47457. // * VFMSUBADD132PD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  47458. // * VFMSUBADD132PD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  47459. //
  47460. func (self *Program) VFMSUBADD132PD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  47461. var p *Instruction
  47462. switch len(vv) {
  47463. case 0 : p = self.alloc("VFMSUBADD132PD", 3, Operands { v0, v1, v2 })
  47464. case 1 : p = self.alloc("VFMSUBADD132PD", 4, Operands { v0, v1, v2, vv[0] })
  47465. default : panic("instruction VFMSUBADD132PD takes 3 or 4 operands")
  47466. }
  47467. // VFMSUBADD132PD xmm, xmm, xmm
  47468. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  47469. self.require(ISA_FMA3)
  47470. p.domain = DomainFMA
  47471. p.add(0, func(m *_Encoding, v []interface{}) {
  47472. m.emit(0xc4)
  47473. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  47474. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  47475. m.emit(0x97)
  47476. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47477. })
  47478. }
  47479. // VFMSUBADD132PD m128, xmm, xmm
  47480. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  47481. self.require(ISA_FMA3)
  47482. p.domain = DomainFMA
  47483. p.add(0, func(m *_Encoding, v []interface{}) {
  47484. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  47485. m.emit(0x97)
  47486. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  47487. })
  47488. }
  47489. // VFMSUBADD132PD ymm, ymm, ymm
  47490. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  47491. self.require(ISA_FMA3)
  47492. p.domain = DomainFMA
  47493. p.add(0, func(m *_Encoding, v []interface{}) {
  47494. m.emit(0xc4)
  47495. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  47496. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  47497. m.emit(0x97)
  47498. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47499. })
  47500. }
  47501. // VFMSUBADD132PD m256, ymm, ymm
  47502. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  47503. self.require(ISA_FMA3)
  47504. p.domain = DomainFMA
  47505. p.add(0, func(m *_Encoding, v []interface{}) {
  47506. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  47507. m.emit(0x97)
  47508. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  47509. })
  47510. }
  47511. // VFMSUBADD132PD m512/m64bcst, zmm, zmm{k}{z}
  47512. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  47513. self.require(ISA_AVX512F)
  47514. p.domain = DomainFMA
  47515. p.add(0, func(m *_Encoding, v []interface{}) {
  47516. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  47517. m.emit(0x97)
  47518. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  47519. })
  47520. }
  47521. // VFMSUBADD132PD {er}, zmm, zmm, zmm{k}{z}
  47522. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  47523. self.require(ISA_AVX512F)
  47524. p.domain = DomainFMA
  47525. p.add(0, func(m *_Encoding, v []interface{}) {
  47526. m.emit(0x62)
  47527. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  47528. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  47529. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  47530. m.emit(0x97)
  47531. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  47532. })
  47533. }
  47534. // VFMSUBADD132PD zmm, zmm, zmm{k}{z}
  47535. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  47536. self.require(ISA_AVX512F)
  47537. p.domain = DomainFMA
  47538. p.add(0, func(m *_Encoding, v []interface{}) {
  47539. m.emit(0x62)
  47540. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  47541. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  47542. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  47543. m.emit(0x97)
  47544. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47545. })
  47546. }
  47547. // VFMSUBADD132PD m128/m64bcst, xmm, xmm{k}{z}
  47548. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  47549. self.require(ISA_AVX512VL | ISA_AVX512F)
  47550. p.domain = DomainFMA
  47551. p.add(0, func(m *_Encoding, v []interface{}) {
  47552. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  47553. m.emit(0x97)
  47554. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  47555. })
  47556. }
  47557. // VFMSUBADD132PD xmm, xmm, xmm{k}{z}
  47558. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  47559. self.require(ISA_AVX512VL | ISA_AVX512F)
  47560. p.domain = DomainFMA
  47561. p.add(0, func(m *_Encoding, v []interface{}) {
  47562. m.emit(0x62)
  47563. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  47564. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  47565. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  47566. m.emit(0x97)
  47567. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47568. })
  47569. }
  47570. // VFMSUBADD132PD m256/m64bcst, ymm, ymm{k}{z}
  47571. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  47572. self.require(ISA_AVX512VL | ISA_AVX512F)
  47573. p.domain = DomainFMA
  47574. p.add(0, func(m *_Encoding, v []interface{}) {
  47575. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  47576. m.emit(0x97)
  47577. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  47578. })
  47579. }
  47580. // VFMSUBADD132PD ymm, ymm, ymm{k}{z}
  47581. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  47582. self.require(ISA_AVX512VL | ISA_AVX512F)
  47583. p.domain = DomainFMA
  47584. p.add(0, func(m *_Encoding, v []interface{}) {
  47585. m.emit(0x62)
  47586. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  47587. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  47588. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  47589. m.emit(0x97)
  47590. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47591. })
  47592. }
  47593. if p.len == 0 {
  47594. panic("invalid operands for VFMSUBADD132PD")
  47595. }
  47596. return p
  47597. }
  47598. // VFMSUBADD132PS performs "Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values".
  47599. //
  47600. // Mnemonic : VFMSUBADD132PS
  47601. // Supported forms : (11 forms)
  47602. //
  47603. // * VFMSUBADD132PS xmm, xmm, xmm [FMA3]
  47604. // * VFMSUBADD132PS m128, xmm, xmm [FMA3]
  47605. // * VFMSUBADD132PS ymm, ymm, ymm [FMA3]
  47606. // * VFMSUBADD132PS m256, ymm, ymm [FMA3]
  47607. // * VFMSUBADD132PS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  47608. // * VFMSUBADD132PS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  47609. // * VFMSUBADD132PS zmm, zmm, zmm{k}{z} [AVX512F]
  47610. // * VFMSUBADD132PS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  47611. // * VFMSUBADD132PS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  47612. // * VFMSUBADD132PS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  47613. // * VFMSUBADD132PS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  47614. //
  47615. func (self *Program) VFMSUBADD132PS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  47616. var p *Instruction
  47617. switch len(vv) {
  47618. case 0 : p = self.alloc("VFMSUBADD132PS", 3, Operands { v0, v1, v2 })
  47619. case 1 : p = self.alloc("VFMSUBADD132PS", 4, Operands { v0, v1, v2, vv[0] })
  47620. default : panic("instruction VFMSUBADD132PS takes 3 or 4 operands")
  47621. }
  47622. // VFMSUBADD132PS xmm, xmm, xmm
  47623. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  47624. self.require(ISA_FMA3)
  47625. p.domain = DomainFMA
  47626. p.add(0, func(m *_Encoding, v []interface{}) {
  47627. m.emit(0xc4)
  47628. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  47629. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  47630. m.emit(0x97)
  47631. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47632. })
  47633. }
  47634. // VFMSUBADD132PS m128, xmm, xmm
  47635. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  47636. self.require(ISA_FMA3)
  47637. p.domain = DomainFMA
  47638. p.add(0, func(m *_Encoding, v []interface{}) {
  47639. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  47640. m.emit(0x97)
  47641. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  47642. })
  47643. }
  47644. // VFMSUBADD132PS ymm, ymm, ymm
  47645. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  47646. self.require(ISA_FMA3)
  47647. p.domain = DomainFMA
  47648. p.add(0, func(m *_Encoding, v []interface{}) {
  47649. m.emit(0xc4)
  47650. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  47651. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  47652. m.emit(0x97)
  47653. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47654. })
  47655. }
  47656. // VFMSUBADD132PS m256, ymm, ymm
  47657. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  47658. self.require(ISA_FMA3)
  47659. p.domain = DomainFMA
  47660. p.add(0, func(m *_Encoding, v []interface{}) {
  47661. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  47662. m.emit(0x97)
  47663. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  47664. })
  47665. }
  47666. // VFMSUBADD132PS m512/m32bcst, zmm, zmm{k}{z}
  47667. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  47668. self.require(ISA_AVX512F)
  47669. p.domain = DomainFMA
  47670. p.add(0, func(m *_Encoding, v []interface{}) {
  47671. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  47672. m.emit(0x97)
  47673. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  47674. })
  47675. }
  47676. // VFMSUBADD132PS {er}, zmm, zmm, zmm{k}{z}
  47677. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  47678. self.require(ISA_AVX512F)
  47679. p.domain = DomainFMA
  47680. p.add(0, func(m *_Encoding, v []interface{}) {
  47681. m.emit(0x62)
  47682. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  47683. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  47684. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  47685. m.emit(0x97)
  47686. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  47687. })
  47688. }
  47689. // VFMSUBADD132PS zmm, zmm, zmm{k}{z}
  47690. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  47691. self.require(ISA_AVX512F)
  47692. p.domain = DomainFMA
  47693. p.add(0, func(m *_Encoding, v []interface{}) {
  47694. m.emit(0x62)
  47695. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  47696. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  47697. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  47698. m.emit(0x97)
  47699. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47700. })
  47701. }
  47702. // VFMSUBADD132PS m128/m32bcst, xmm, xmm{k}{z}
  47703. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  47704. self.require(ISA_AVX512VL | ISA_AVX512F)
  47705. p.domain = DomainFMA
  47706. p.add(0, func(m *_Encoding, v []interface{}) {
  47707. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  47708. m.emit(0x97)
  47709. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  47710. })
  47711. }
  47712. // VFMSUBADD132PS xmm, xmm, xmm{k}{z}
  47713. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  47714. self.require(ISA_AVX512VL | ISA_AVX512F)
  47715. p.domain = DomainFMA
  47716. p.add(0, func(m *_Encoding, v []interface{}) {
  47717. m.emit(0x62)
  47718. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  47719. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  47720. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  47721. m.emit(0x97)
  47722. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47723. })
  47724. }
  47725. // VFMSUBADD132PS m256/m32bcst, ymm, ymm{k}{z}
  47726. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  47727. self.require(ISA_AVX512VL | ISA_AVX512F)
  47728. p.domain = DomainFMA
  47729. p.add(0, func(m *_Encoding, v []interface{}) {
  47730. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  47731. m.emit(0x97)
  47732. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  47733. })
  47734. }
  47735. // VFMSUBADD132PS ymm, ymm, ymm{k}{z}
  47736. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  47737. self.require(ISA_AVX512VL | ISA_AVX512F)
  47738. p.domain = DomainFMA
  47739. p.add(0, func(m *_Encoding, v []interface{}) {
  47740. m.emit(0x62)
  47741. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  47742. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  47743. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  47744. m.emit(0x97)
  47745. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47746. })
  47747. }
  47748. if p.len == 0 {
  47749. panic("invalid operands for VFMSUBADD132PS")
  47750. }
  47751. return p
  47752. }
  47753. // VFMSUBADD213PD performs "Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values".
  47754. //
  47755. // Mnemonic : VFMSUBADD213PD
  47756. // Supported forms : (11 forms)
  47757. //
  47758. // * VFMSUBADD213PD xmm, xmm, xmm [FMA3]
  47759. // * VFMSUBADD213PD m128, xmm, xmm [FMA3]
  47760. // * VFMSUBADD213PD ymm, ymm, ymm [FMA3]
  47761. // * VFMSUBADD213PD m256, ymm, ymm [FMA3]
  47762. // * VFMSUBADD213PD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  47763. // * VFMSUBADD213PD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  47764. // * VFMSUBADD213PD zmm, zmm, zmm{k}{z} [AVX512F]
  47765. // * VFMSUBADD213PD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  47766. // * VFMSUBADD213PD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  47767. // * VFMSUBADD213PD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  47768. // * VFMSUBADD213PD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  47769. //
  47770. func (self *Program) VFMSUBADD213PD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  47771. var p *Instruction
  47772. switch len(vv) {
  47773. case 0 : p = self.alloc("VFMSUBADD213PD", 3, Operands { v0, v1, v2 })
  47774. case 1 : p = self.alloc("VFMSUBADD213PD", 4, Operands { v0, v1, v2, vv[0] })
  47775. default : panic("instruction VFMSUBADD213PD takes 3 or 4 operands")
  47776. }
  47777. // VFMSUBADD213PD xmm, xmm, xmm
  47778. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  47779. self.require(ISA_FMA3)
  47780. p.domain = DomainFMA
  47781. p.add(0, func(m *_Encoding, v []interface{}) {
  47782. m.emit(0xc4)
  47783. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  47784. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  47785. m.emit(0xa7)
  47786. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47787. })
  47788. }
  47789. // VFMSUBADD213PD m128, xmm, xmm
  47790. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  47791. self.require(ISA_FMA3)
  47792. p.domain = DomainFMA
  47793. p.add(0, func(m *_Encoding, v []interface{}) {
  47794. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  47795. m.emit(0xa7)
  47796. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  47797. })
  47798. }
  47799. // VFMSUBADD213PD ymm, ymm, ymm
  47800. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  47801. self.require(ISA_FMA3)
  47802. p.domain = DomainFMA
  47803. p.add(0, func(m *_Encoding, v []interface{}) {
  47804. m.emit(0xc4)
  47805. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  47806. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  47807. m.emit(0xa7)
  47808. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47809. })
  47810. }
  47811. // VFMSUBADD213PD m256, ymm, ymm
  47812. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  47813. self.require(ISA_FMA3)
  47814. p.domain = DomainFMA
  47815. p.add(0, func(m *_Encoding, v []interface{}) {
  47816. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  47817. m.emit(0xa7)
  47818. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  47819. })
  47820. }
  47821. // VFMSUBADD213PD m512/m64bcst, zmm, zmm{k}{z}
  47822. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  47823. self.require(ISA_AVX512F)
  47824. p.domain = DomainFMA
  47825. p.add(0, func(m *_Encoding, v []interface{}) {
  47826. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  47827. m.emit(0xa7)
  47828. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  47829. })
  47830. }
  47831. // VFMSUBADD213PD {er}, zmm, zmm, zmm{k}{z}
  47832. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  47833. self.require(ISA_AVX512F)
  47834. p.domain = DomainFMA
  47835. p.add(0, func(m *_Encoding, v []interface{}) {
  47836. m.emit(0x62)
  47837. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  47838. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  47839. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  47840. m.emit(0xa7)
  47841. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  47842. })
  47843. }
  47844. // VFMSUBADD213PD zmm, zmm, zmm{k}{z}
  47845. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  47846. self.require(ISA_AVX512F)
  47847. p.domain = DomainFMA
  47848. p.add(0, func(m *_Encoding, v []interface{}) {
  47849. m.emit(0x62)
  47850. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  47851. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  47852. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  47853. m.emit(0xa7)
  47854. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47855. })
  47856. }
  47857. // VFMSUBADD213PD m128/m64bcst, xmm, xmm{k}{z}
  47858. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  47859. self.require(ISA_AVX512VL | ISA_AVX512F)
  47860. p.domain = DomainFMA
  47861. p.add(0, func(m *_Encoding, v []interface{}) {
  47862. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  47863. m.emit(0xa7)
  47864. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  47865. })
  47866. }
  47867. // VFMSUBADD213PD xmm, xmm, xmm{k}{z}
  47868. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  47869. self.require(ISA_AVX512VL | ISA_AVX512F)
  47870. p.domain = DomainFMA
  47871. p.add(0, func(m *_Encoding, v []interface{}) {
  47872. m.emit(0x62)
  47873. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  47874. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  47875. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  47876. m.emit(0xa7)
  47877. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47878. })
  47879. }
  47880. // VFMSUBADD213PD m256/m64bcst, ymm, ymm{k}{z}
  47881. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  47882. self.require(ISA_AVX512VL | ISA_AVX512F)
  47883. p.domain = DomainFMA
  47884. p.add(0, func(m *_Encoding, v []interface{}) {
  47885. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  47886. m.emit(0xa7)
  47887. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  47888. })
  47889. }
  47890. // VFMSUBADD213PD ymm, ymm, ymm{k}{z}
  47891. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  47892. self.require(ISA_AVX512VL | ISA_AVX512F)
  47893. p.domain = DomainFMA
  47894. p.add(0, func(m *_Encoding, v []interface{}) {
  47895. m.emit(0x62)
  47896. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  47897. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  47898. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  47899. m.emit(0xa7)
  47900. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47901. })
  47902. }
  47903. if p.len == 0 {
  47904. panic("invalid operands for VFMSUBADD213PD")
  47905. }
  47906. return p
  47907. }
  47908. // VFMSUBADD213PS performs "Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values".
  47909. //
  47910. // Mnemonic : VFMSUBADD213PS
  47911. // Supported forms : (11 forms)
  47912. //
  47913. // * VFMSUBADD213PS xmm, xmm, xmm [FMA3]
  47914. // * VFMSUBADD213PS m128, xmm, xmm [FMA3]
  47915. // * VFMSUBADD213PS ymm, ymm, ymm [FMA3]
  47916. // * VFMSUBADD213PS m256, ymm, ymm [FMA3]
  47917. // * VFMSUBADD213PS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  47918. // * VFMSUBADD213PS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  47919. // * VFMSUBADD213PS zmm, zmm, zmm{k}{z} [AVX512F]
  47920. // * VFMSUBADD213PS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  47921. // * VFMSUBADD213PS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  47922. // * VFMSUBADD213PS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  47923. // * VFMSUBADD213PS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  47924. //
  47925. func (self *Program) VFMSUBADD213PS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  47926. var p *Instruction
  47927. switch len(vv) {
  47928. case 0 : p = self.alloc("VFMSUBADD213PS", 3, Operands { v0, v1, v2 })
  47929. case 1 : p = self.alloc("VFMSUBADD213PS", 4, Operands { v0, v1, v2, vv[0] })
  47930. default : panic("instruction VFMSUBADD213PS takes 3 or 4 operands")
  47931. }
  47932. // VFMSUBADD213PS xmm, xmm, xmm
  47933. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  47934. self.require(ISA_FMA3)
  47935. p.domain = DomainFMA
  47936. p.add(0, func(m *_Encoding, v []interface{}) {
  47937. m.emit(0xc4)
  47938. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  47939. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  47940. m.emit(0xa7)
  47941. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47942. })
  47943. }
  47944. // VFMSUBADD213PS m128, xmm, xmm
  47945. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  47946. self.require(ISA_FMA3)
  47947. p.domain = DomainFMA
  47948. p.add(0, func(m *_Encoding, v []interface{}) {
  47949. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  47950. m.emit(0xa7)
  47951. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  47952. })
  47953. }
  47954. // VFMSUBADD213PS ymm, ymm, ymm
  47955. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  47956. self.require(ISA_FMA3)
  47957. p.domain = DomainFMA
  47958. p.add(0, func(m *_Encoding, v []interface{}) {
  47959. m.emit(0xc4)
  47960. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  47961. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  47962. m.emit(0xa7)
  47963. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  47964. })
  47965. }
  47966. // VFMSUBADD213PS m256, ymm, ymm
  47967. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  47968. self.require(ISA_FMA3)
  47969. p.domain = DomainFMA
  47970. p.add(0, func(m *_Encoding, v []interface{}) {
  47971. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  47972. m.emit(0xa7)
  47973. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  47974. })
  47975. }
  47976. // VFMSUBADD213PS m512/m32bcst, zmm, zmm{k}{z}
  47977. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  47978. self.require(ISA_AVX512F)
  47979. p.domain = DomainFMA
  47980. p.add(0, func(m *_Encoding, v []interface{}) {
  47981. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  47982. m.emit(0xa7)
  47983. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  47984. })
  47985. }
  47986. // VFMSUBADD213PS {er}, zmm, zmm, zmm{k}{z}
  47987. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  47988. self.require(ISA_AVX512F)
  47989. p.domain = DomainFMA
  47990. p.add(0, func(m *_Encoding, v []interface{}) {
  47991. m.emit(0x62)
  47992. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  47993. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  47994. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  47995. m.emit(0xa7)
  47996. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  47997. })
  47998. }
  47999. // VFMSUBADD213PS zmm, zmm, zmm{k}{z}
  48000. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  48001. self.require(ISA_AVX512F)
  48002. p.domain = DomainFMA
  48003. p.add(0, func(m *_Encoding, v []interface{}) {
  48004. m.emit(0x62)
  48005. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  48006. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  48007. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  48008. m.emit(0xa7)
  48009. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  48010. })
  48011. }
  48012. // VFMSUBADD213PS m128/m32bcst, xmm, xmm{k}{z}
  48013. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  48014. self.require(ISA_AVX512VL | ISA_AVX512F)
  48015. p.domain = DomainFMA
  48016. p.add(0, func(m *_Encoding, v []interface{}) {
  48017. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  48018. m.emit(0xa7)
  48019. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  48020. })
  48021. }
  48022. // VFMSUBADD213PS xmm, xmm, xmm{k}{z}
  48023. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  48024. self.require(ISA_AVX512VL | ISA_AVX512F)
  48025. p.domain = DomainFMA
  48026. p.add(0, func(m *_Encoding, v []interface{}) {
  48027. m.emit(0x62)
  48028. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  48029. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  48030. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  48031. m.emit(0xa7)
  48032. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  48033. })
  48034. }
  48035. // VFMSUBADD213PS m256/m32bcst, ymm, ymm{k}{z}
  48036. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  48037. self.require(ISA_AVX512VL | ISA_AVX512F)
  48038. p.domain = DomainFMA
  48039. p.add(0, func(m *_Encoding, v []interface{}) {
  48040. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  48041. m.emit(0xa7)
  48042. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  48043. })
  48044. }
  48045. // VFMSUBADD213PS ymm, ymm, ymm{k}{z}
  48046. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  48047. self.require(ISA_AVX512VL | ISA_AVX512F)
  48048. p.domain = DomainFMA
  48049. p.add(0, func(m *_Encoding, v []interface{}) {
  48050. m.emit(0x62)
  48051. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  48052. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  48053. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  48054. m.emit(0xa7)
  48055. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  48056. })
  48057. }
  48058. if p.len == 0 {
  48059. panic("invalid operands for VFMSUBADD213PS")
  48060. }
  48061. return p
  48062. }
  48063. // VFMSUBADD231PD performs "Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values".
  48064. //
  48065. // Mnemonic : VFMSUBADD231PD
  48066. // Supported forms : (11 forms)
  48067. //
  48068. // * VFMSUBADD231PD xmm, xmm, xmm [FMA3]
  48069. // * VFMSUBADD231PD m128, xmm, xmm [FMA3]
  48070. // * VFMSUBADD231PD ymm, ymm, ymm [FMA3]
  48071. // * VFMSUBADD231PD m256, ymm, ymm [FMA3]
  48072. // * VFMSUBADD231PD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  48073. // * VFMSUBADD231PD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  48074. // * VFMSUBADD231PD zmm, zmm, zmm{k}{z} [AVX512F]
  48075. // * VFMSUBADD231PD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  48076. // * VFMSUBADD231PD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  48077. // * VFMSUBADD231PD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  48078. // * VFMSUBADD231PD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  48079. //
  48080. func (self *Program) VFMSUBADD231PD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  48081. var p *Instruction
  48082. switch len(vv) {
  48083. case 0 : p = self.alloc("VFMSUBADD231PD", 3, Operands { v0, v1, v2 })
  48084. case 1 : p = self.alloc("VFMSUBADD231PD", 4, Operands { v0, v1, v2, vv[0] })
  48085. default : panic("instruction VFMSUBADD231PD takes 3 or 4 operands")
  48086. }
  48087. // VFMSUBADD231PD xmm, xmm, xmm
  48088. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  48089. self.require(ISA_FMA3)
  48090. p.domain = DomainFMA
  48091. p.add(0, func(m *_Encoding, v []interface{}) {
  48092. m.emit(0xc4)
  48093. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  48094. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  48095. m.emit(0xb7)
  48096. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  48097. })
  48098. }
  48099. // VFMSUBADD231PD m128, xmm, xmm
  48100. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  48101. self.require(ISA_FMA3)
  48102. p.domain = DomainFMA
  48103. p.add(0, func(m *_Encoding, v []interface{}) {
  48104. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  48105. m.emit(0xb7)
  48106. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  48107. })
  48108. }
  48109. // VFMSUBADD231PD ymm, ymm, ymm
  48110. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  48111. self.require(ISA_FMA3)
  48112. p.domain = DomainFMA
  48113. p.add(0, func(m *_Encoding, v []interface{}) {
  48114. m.emit(0xc4)
  48115. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  48116. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  48117. m.emit(0xb7)
  48118. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  48119. })
  48120. }
  48121. // VFMSUBADD231PD m256, ymm, ymm
  48122. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  48123. self.require(ISA_FMA3)
  48124. p.domain = DomainFMA
  48125. p.add(0, func(m *_Encoding, v []interface{}) {
  48126. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  48127. m.emit(0xb7)
  48128. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  48129. })
  48130. }
  48131. // VFMSUBADD231PD m512/m64bcst, zmm, zmm{k}{z}
  48132. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  48133. self.require(ISA_AVX512F)
  48134. p.domain = DomainFMA
  48135. p.add(0, func(m *_Encoding, v []interface{}) {
  48136. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  48137. m.emit(0xb7)
  48138. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  48139. })
  48140. }
  48141. // VFMSUBADD231PD {er}, zmm, zmm, zmm{k}{z}
  48142. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  48143. self.require(ISA_AVX512F)
  48144. p.domain = DomainFMA
  48145. p.add(0, func(m *_Encoding, v []interface{}) {
  48146. m.emit(0x62)
  48147. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  48148. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  48149. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  48150. m.emit(0xb7)
  48151. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  48152. })
  48153. }
  48154. // VFMSUBADD231PD zmm, zmm, zmm{k}{z}
  48155. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  48156. self.require(ISA_AVX512F)
  48157. p.domain = DomainFMA
  48158. p.add(0, func(m *_Encoding, v []interface{}) {
  48159. m.emit(0x62)
  48160. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  48161. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  48162. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  48163. m.emit(0xb7)
  48164. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  48165. })
  48166. }
  48167. // VFMSUBADD231PD m128/m64bcst, xmm, xmm{k}{z}
  48168. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  48169. self.require(ISA_AVX512VL | ISA_AVX512F)
  48170. p.domain = DomainFMA
  48171. p.add(0, func(m *_Encoding, v []interface{}) {
  48172. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  48173. m.emit(0xb7)
  48174. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  48175. })
  48176. }
  48177. // VFMSUBADD231PD xmm, xmm, xmm{k}{z}
  48178. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  48179. self.require(ISA_AVX512VL | ISA_AVX512F)
  48180. p.domain = DomainFMA
  48181. p.add(0, func(m *_Encoding, v []interface{}) {
  48182. m.emit(0x62)
  48183. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  48184. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  48185. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  48186. m.emit(0xb7)
  48187. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  48188. })
  48189. }
  48190. // VFMSUBADD231PD m256/m64bcst, ymm, ymm{k}{z}
  48191. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  48192. self.require(ISA_AVX512VL | ISA_AVX512F)
  48193. p.domain = DomainFMA
  48194. p.add(0, func(m *_Encoding, v []interface{}) {
  48195. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  48196. m.emit(0xb7)
  48197. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  48198. })
  48199. }
  48200. // VFMSUBADD231PD ymm, ymm, ymm{k}{z}
  48201. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  48202. self.require(ISA_AVX512VL | ISA_AVX512F)
  48203. p.domain = DomainFMA
  48204. p.add(0, func(m *_Encoding, v []interface{}) {
  48205. m.emit(0x62)
  48206. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  48207. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  48208. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  48209. m.emit(0xb7)
  48210. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  48211. })
  48212. }
  48213. if p.len == 0 {
  48214. panic("invalid operands for VFMSUBADD231PD")
  48215. }
  48216. return p
  48217. }
  48218. // VFMSUBADD231PS performs "Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values".
  48219. //
  48220. // Mnemonic : VFMSUBADD231PS
  48221. // Supported forms : (11 forms)
  48222. //
  48223. // * VFMSUBADD231PS xmm, xmm, xmm [FMA3]
  48224. // * VFMSUBADD231PS m128, xmm, xmm [FMA3]
  48225. // * VFMSUBADD231PS ymm, ymm, ymm [FMA3]
  48226. // * VFMSUBADD231PS m256, ymm, ymm [FMA3]
  48227. // * VFMSUBADD231PS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  48228. // * VFMSUBADD231PS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  48229. // * VFMSUBADD231PS zmm, zmm, zmm{k}{z} [AVX512F]
  48230. // * VFMSUBADD231PS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  48231. // * VFMSUBADD231PS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  48232. // * VFMSUBADD231PS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  48233. // * VFMSUBADD231PS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  48234. //
  48235. func (self *Program) VFMSUBADD231PS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  48236. var p *Instruction
  48237. switch len(vv) {
  48238. case 0 : p = self.alloc("VFMSUBADD231PS", 3, Operands { v0, v1, v2 })
  48239. case 1 : p = self.alloc("VFMSUBADD231PS", 4, Operands { v0, v1, v2, vv[0] })
  48240. default : panic("instruction VFMSUBADD231PS takes 3 or 4 operands")
  48241. }
  48242. // VFMSUBADD231PS xmm, xmm, xmm
  48243. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  48244. self.require(ISA_FMA3)
  48245. p.domain = DomainFMA
  48246. p.add(0, func(m *_Encoding, v []interface{}) {
  48247. m.emit(0xc4)
  48248. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  48249. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  48250. m.emit(0xb7)
  48251. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  48252. })
  48253. }
  48254. // VFMSUBADD231PS m128, xmm, xmm
  48255. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  48256. self.require(ISA_FMA3)
  48257. p.domain = DomainFMA
  48258. p.add(0, func(m *_Encoding, v []interface{}) {
  48259. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  48260. m.emit(0xb7)
  48261. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  48262. })
  48263. }
  48264. // VFMSUBADD231PS ymm, ymm, ymm
  48265. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  48266. self.require(ISA_FMA3)
  48267. p.domain = DomainFMA
  48268. p.add(0, func(m *_Encoding, v []interface{}) {
  48269. m.emit(0xc4)
  48270. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  48271. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  48272. m.emit(0xb7)
  48273. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  48274. })
  48275. }
  48276. // VFMSUBADD231PS m256, ymm, ymm
  48277. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  48278. self.require(ISA_FMA3)
  48279. p.domain = DomainFMA
  48280. p.add(0, func(m *_Encoding, v []interface{}) {
  48281. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  48282. m.emit(0xb7)
  48283. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  48284. })
  48285. }
  48286. // VFMSUBADD231PS m512/m32bcst, zmm, zmm{k}{z}
  48287. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  48288. self.require(ISA_AVX512F)
  48289. p.domain = DomainFMA
  48290. p.add(0, func(m *_Encoding, v []interface{}) {
  48291. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  48292. m.emit(0xb7)
  48293. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  48294. })
  48295. }
  48296. // VFMSUBADD231PS {er}, zmm, zmm, zmm{k}{z}
  48297. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  48298. self.require(ISA_AVX512F)
  48299. p.domain = DomainFMA
  48300. p.add(0, func(m *_Encoding, v []interface{}) {
  48301. m.emit(0x62)
  48302. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  48303. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  48304. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  48305. m.emit(0xb7)
  48306. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  48307. })
  48308. }
  48309. // VFMSUBADD231PS zmm, zmm, zmm{k}{z}
  48310. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  48311. self.require(ISA_AVX512F)
  48312. p.domain = DomainFMA
  48313. p.add(0, func(m *_Encoding, v []interface{}) {
  48314. m.emit(0x62)
  48315. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  48316. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  48317. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  48318. m.emit(0xb7)
  48319. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  48320. })
  48321. }
  48322. // VFMSUBADD231PS m128/m32bcst, xmm, xmm{k}{z}
  48323. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  48324. self.require(ISA_AVX512VL | ISA_AVX512F)
  48325. p.domain = DomainFMA
  48326. p.add(0, func(m *_Encoding, v []interface{}) {
  48327. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  48328. m.emit(0xb7)
  48329. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  48330. })
  48331. }
  48332. // VFMSUBADD231PS xmm, xmm, xmm{k}{z}
  48333. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  48334. self.require(ISA_AVX512VL | ISA_AVX512F)
  48335. p.domain = DomainFMA
  48336. p.add(0, func(m *_Encoding, v []interface{}) {
  48337. m.emit(0x62)
  48338. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  48339. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  48340. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  48341. m.emit(0xb7)
  48342. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  48343. })
  48344. }
  48345. // VFMSUBADD231PS m256/m32bcst, ymm, ymm{k}{z}
  48346. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  48347. self.require(ISA_AVX512VL | ISA_AVX512F)
  48348. p.domain = DomainFMA
  48349. p.add(0, func(m *_Encoding, v []interface{}) {
  48350. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  48351. m.emit(0xb7)
  48352. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  48353. })
  48354. }
  48355. // VFMSUBADD231PS ymm, ymm, ymm{k}{z}
  48356. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  48357. self.require(ISA_AVX512VL | ISA_AVX512F)
  48358. p.domain = DomainFMA
  48359. p.add(0, func(m *_Encoding, v []interface{}) {
  48360. m.emit(0x62)
  48361. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  48362. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  48363. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  48364. m.emit(0xb7)
  48365. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  48366. })
  48367. }
  48368. if p.len == 0 {
  48369. panic("invalid operands for VFMSUBADD231PS")
  48370. }
  48371. return p
  48372. }
  48373. // VFMSUBADDPD performs "Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values".
  48374. //
  48375. // Mnemonic : VFMSUBADDPD
  48376. // Supported forms : (6 forms)
  48377. //
  48378. // * VFMSUBADDPD xmm, xmm, xmm, xmm [FMA4]
  48379. // * VFMSUBADDPD m128, xmm, xmm, xmm [FMA4]
  48380. // * VFMSUBADDPD xmm, m128, xmm, xmm [FMA4]
  48381. // * VFMSUBADDPD ymm, ymm, ymm, ymm [FMA4]
  48382. // * VFMSUBADDPD m256, ymm, ymm, ymm [FMA4]
  48383. // * VFMSUBADDPD ymm, m256, ymm, ymm [FMA4]
  48384. //
  48385. func (self *Program) VFMSUBADDPD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  48386. p := self.alloc("VFMSUBADDPD", 4, Operands { v0, v1, v2, v3 })
  48387. // VFMSUBADDPD xmm, xmm, xmm, xmm
  48388. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  48389. self.require(ISA_FMA4)
  48390. p.domain = DomainFMA
  48391. p.add(0, func(m *_Encoding, v []interface{}) {
  48392. m.emit(0xc4)
  48393. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  48394. m.emit(0xf9 ^ (hlcode(v[2]) << 3))
  48395. m.emit(0x5f)
  48396. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  48397. m.emit(hlcode(v[1]) << 4)
  48398. })
  48399. p.add(0, func(m *_Encoding, v []interface{}) {
  48400. m.emit(0xc4)
  48401. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  48402. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  48403. m.emit(0x5f)
  48404. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  48405. m.emit(hlcode(v[0]) << 4)
  48406. })
  48407. }
  48408. // VFMSUBADDPD m128, xmm, xmm, xmm
  48409. if isM128(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  48410. self.require(ISA_FMA4)
  48411. p.domain = DomainFMA
  48412. p.add(0, func(m *_Encoding, v []interface{}) {
  48413. m.vex3(0xc4, 0b11, 0x81, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  48414. m.emit(0x5f)
  48415. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  48416. m.emit(hlcode(v[1]) << 4)
  48417. })
  48418. }
  48419. // VFMSUBADDPD xmm, m128, xmm, xmm
  48420. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  48421. self.require(ISA_FMA4)
  48422. p.domain = DomainFMA
  48423. p.add(0, func(m *_Encoding, v []interface{}) {
  48424. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  48425. m.emit(0x5f)
  48426. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  48427. m.emit(hlcode(v[0]) << 4)
  48428. })
  48429. }
  48430. // VFMSUBADDPD ymm, ymm, ymm, ymm
  48431. if isYMM(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  48432. self.require(ISA_FMA4)
  48433. p.domain = DomainFMA
  48434. p.add(0, func(m *_Encoding, v []interface{}) {
  48435. m.emit(0xc4)
  48436. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  48437. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  48438. m.emit(0x5f)
  48439. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  48440. m.emit(hlcode(v[1]) << 4)
  48441. })
  48442. p.add(0, func(m *_Encoding, v []interface{}) {
  48443. m.emit(0xc4)
  48444. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  48445. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  48446. m.emit(0x5f)
  48447. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  48448. m.emit(hlcode(v[0]) << 4)
  48449. })
  48450. }
  48451. // VFMSUBADDPD m256, ymm, ymm, ymm
  48452. if isM256(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  48453. self.require(ISA_FMA4)
  48454. p.domain = DomainFMA
  48455. p.add(0, func(m *_Encoding, v []interface{}) {
  48456. m.vex3(0xc4, 0b11, 0x85, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  48457. m.emit(0x5f)
  48458. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  48459. m.emit(hlcode(v[1]) << 4)
  48460. })
  48461. }
  48462. // VFMSUBADDPD ymm, m256, ymm, ymm
  48463. if isYMM(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  48464. self.require(ISA_FMA4)
  48465. p.domain = DomainFMA
  48466. p.add(0, func(m *_Encoding, v []interface{}) {
  48467. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  48468. m.emit(0x5f)
  48469. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  48470. m.emit(hlcode(v[0]) << 4)
  48471. })
  48472. }
  48473. if p.len == 0 {
  48474. panic("invalid operands for VFMSUBADDPD")
  48475. }
  48476. return p
  48477. }
  48478. // VFMSUBADDPS performs "Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values".
  48479. //
  48480. // Mnemonic : VFMSUBADDPS
  48481. // Supported forms : (6 forms)
  48482. //
  48483. // * VFMSUBADDPS xmm, xmm, xmm, xmm [FMA4]
  48484. // * VFMSUBADDPS m128, xmm, xmm, xmm [FMA4]
  48485. // * VFMSUBADDPS xmm, m128, xmm, xmm [FMA4]
  48486. // * VFMSUBADDPS ymm, ymm, ymm, ymm [FMA4]
  48487. // * VFMSUBADDPS m256, ymm, ymm, ymm [FMA4]
  48488. // * VFMSUBADDPS ymm, m256, ymm, ymm [FMA4]
  48489. //
  48490. func (self *Program) VFMSUBADDPS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  48491. p := self.alloc("VFMSUBADDPS", 4, Operands { v0, v1, v2, v3 })
  48492. // VFMSUBADDPS xmm, xmm, xmm, xmm
  48493. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  48494. self.require(ISA_FMA4)
  48495. p.domain = DomainFMA
  48496. p.add(0, func(m *_Encoding, v []interface{}) {
  48497. m.emit(0xc4)
  48498. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  48499. m.emit(0xf9 ^ (hlcode(v[2]) << 3))
  48500. m.emit(0x5e)
  48501. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  48502. m.emit(hlcode(v[1]) << 4)
  48503. })
  48504. p.add(0, func(m *_Encoding, v []interface{}) {
  48505. m.emit(0xc4)
  48506. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  48507. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  48508. m.emit(0x5e)
  48509. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  48510. m.emit(hlcode(v[0]) << 4)
  48511. })
  48512. }
  48513. // VFMSUBADDPS m128, xmm, xmm, xmm
  48514. if isM128(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  48515. self.require(ISA_FMA4)
  48516. p.domain = DomainFMA
  48517. p.add(0, func(m *_Encoding, v []interface{}) {
  48518. m.vex3(0xc4, 0b11, 0x81, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  48519. m.emit(0x5e)
  48520. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  48521. m.emit(hlcode(v[1]) << 4)
  48522. })
  48523. }
  48524. // VFMSUBADDPS xmm, m128, xmm, xmm
  48525. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  48526. self.require(ISA_FMA4)
  48527. p.domain = DomainFMA
  48528. p.add(0, func(m *_Encoding, v []interface{}) {
  48529. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  48530. m.emit(0x5e)
  48531. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  48532. m.emit(hlcode(v[0]) << 4)
  48533. })
  48534. }
  48535. // VFMSUBADDPS ymm, ymm, ymm, ymm
  48536. if isYMM(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  48537. self.require(ISA_FMA4)
  48538. p.domain = DomainFMA
  48539. p.add(0, func(m *_Encoding, v []interface{}) {
  48540. m.emit(0xc4)
  48541. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  48542. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  48543. m.emit(0x5e)
  48544. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  48545. m.emit(hlcode(v[1]) << 4)
  48546. })
  48547. p.add(0, func(m *_Encoding, v []interface{}) {
  48548. m.emit(0xc4)
  48549. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  48550. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  48551. m.emit(0x5e)
  48552. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  48553. m.emit(hlcode(v[0]) << 4)
  48554. })
  48555. }
  48556. // VFMSUBADDPS m256, ymm, ymm, ymm
  48557. if isM256(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  48558. self.require(ISA_FMA4)
  48559. p.domain = DomainFMA
  48560. p.add(0, func(m *_Encoding, v []interface{}) {
  48561. m.vex3(0xc4, 0b11, 0x85, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  48562. m.emit(0x5e)
  48563. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  48564. m.emit(hlcode(v[1]) << 4)
  48565. })
  48566. }
  48567. // VFMSUBADDPS ymm, m256, ymm, ymm
  48568. if isYMM(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  48569. self.require(ISA_FMA4)
  48570. p.domain = DomainFMA
  48571. p.add(0, func(m *_Encoding, v []interface{}) {
  48572. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  48573. m.emit(0x5e)
  48574. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  48575. m.emit(hlcode(v[0]) << 4)
  48576. })
  48577. }
  48578. if p.len == 0 {
  48579. panic("invalid operands for VFMSUBADDPS")
  48580. }
  48581. return p
  48582. }
  48583. // VFMSUBPD performs "Fused Multiply-Subtract of Packed Double-Precision Floating-Point Values".
  48584. //
  48585. // Mnemonic : VFMSUBPD
  48586. // Supported forms : (6 forms)
  48587. //
  48588. // * VFMSUBPD xmm, xmm, xmm, xmm [FMA4]
  48589. // * VFMSUBPD m128, xmm, xmm, xmm [FMA4]
  48590. // * VFMSUBPD xmm, m128, xmm, xmm [FMA4]
  48591. // * VFMSUBPD ymm, ymm, ymm, ymm [FMA4]
  48592. // * VFMSUBPD m256, ymm, ymm, ymm [FMA4]
  48593. // * VFMSUBPD ymm, m256, ymm, ymm [FMA4]
  48594. //
  48595. func (self *Program) VFMSUBPD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  48596. p := self.alloc("VFMSUBPD", 4, Operands { v0, v1, v2, v3 })
  48597. // VFMSUBPD xmm, xmm, xmm, xmm
  48598. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  48599. self.require(ISA_FMA4)
  48600. p.domain = DomainFMA
  48601. p.add(0, func(m *_Encoding, v []interface{}) {
  48602. m.emit(0xc4)
  48603. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  48604. m.emit(0xf9 ^ (hlcode(v[2]) << 3))
  48605. m.emit(0x6d)
  48606. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  48607. m.emit(hlcode(v[1]) << 4)
  48608. })
  48609. p.add(0, func(m *_Encoding, v []interface{}) {
  48610. m.emit(0xc4)
  48611. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  48612. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  48613. m.emit(0x6d)
  48614. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  48615. m.emit(hlcode(v[0]) << 4)
  48616. })
  48617. }
  48618. // VFMSUBPD m128, xmm, xmm, xmm
  48619. if isM128(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  48620. self.require(ISA_FMA4)
  48621. p.domain = DomainFMA
  48622. p.add(0, func(m *_Encoding, v []interface{}) {
  48623. m.vex3(0xc4, 0b11, 0x81, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  48624. m.emit(0x6d)
  48625. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  48626. m.emit(hlcode(v[1]) << 4)
  48627. })
  48628. }
  48629. // VFMSUBPD xmm, m128, xmm, xmm
  48630. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  48631. self.require(ISA_FMA4)
  48632. p.domain = DomainFMA
  48633. p.add(0, func(m *_Encoding, v []interface{}) {
  48634. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  48635. m.emit(0x6d)
  48636. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  48637. m.emit(hlcode(v[0]) << 4)
  48638. })
  48639. }
  48640. // VFMSUBPD ymm, ymm, ymm, ymm
  48641. if isYMM(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  48642. self.require(ISA_FMA4)
  48643. p.domain = DomainFMA
  48644. p.add(0, func(m *_Encoding, v []interface{}) {
  48645. m.emit(0xc4)
  48646. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  48647. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  48648. m.emit(0x6d)
  48649. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  48650. m.emit(hlcode(v[1]) << 4)
  48651. })
  48652. p.add(0, func(m *_Encoding, v []interface{}) {
  48653. m.emit(0xc4)
  48654. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  48655. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  48656. m.emit(0x6d)
  48657. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  48658. m.emit(hlcode(v[0]) << 4)
  48659. })
  48660. }
  48661. // VFMSUBPD m256, ymm, ymm, ymm
  48662. if isM256(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  48663. self.require(ISA_FMA4)
  48664. p.domain = DomainFMA
  48665. p.add(0, func(m *_Encoding, v []interface{}) {
  48666. m.vex3(0xc4, 0b11, 0x85, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  48667. m.emit(0x6d)
  48668. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  48669. m.emit(hlcode(v[1]) << 4)
  48670. })
  48671. }
  48672. // VFMSUBPD ymm, m256, ymm, ymm
  48673. if isYMM(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  48674. self.require(ISA_FMA4)
  48675. p.domain = DomainFMA
  48676. p.add(0, func(m *_Encoding, v []interface{}) {
  48677. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  48678. m.emit(0x6d)
  48679. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  48680. m.emit(hlcode(v[0]) << 4)
  48681. })
  48682. }
  48683. if p.len == 0 {
  48684. panic("invalid operands for VFMSUBPD")
  48685. }
  48686. return p
  48687. }
  48688. // VFMSUBPS performs "Fused Multiply-Subtract of Packed Single-Precision Floating-Point Values".
  48689. //
  48690. // Mnemonic : VFMSUBPS
  48691. // Supported forms : (6 forms)
  48692. //
  48693. // * VFMSUBPS xmm, xmm, xmm, xmm [FMA4]
  48694. // * VFMSUBPS m128, xmm, xmm, xmm [FMA4]
  48695. // * VFMSUBPS xmm, m128, xmm, xmm [FMA4]
  48696. // * VFMSUBPS ymm, ymm, ymm, ymm [FMA4]
  48697. // * VFMSUBPS m256, ymm, ymm, ymm [FMA4]
  48698. // * VFMSUBPS ymm, m256, ymm, ymm [FMA4]
  48699. //
  48700. func (self *Program) VFMSUBPS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  48701. p := self.alloc("VFMSUBPS", 4, Operands { v0, v1, v2, v3 })
  48702. // VFMSUBPS xmm, xmm, xmm, xmm
  48703. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  48704. self.require(ISA_FMA4)
  48705. p.domain = DomainFMA
  48706. p.add(0, func(m *_Encoding, v []interface{}) {
  48707. m.emit(0xc4)
  48708. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  48709. m.emit(0xf9 ^ (hlcode(v[2]) << 3))
  48710. m.emit(0x6c)
  48711. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  48712. m.emit(hlcode(v[1]) << 4)
  48713. })
  48714. p.add(0, func(m *_Encoding, v []interface{}) {
  48715. m.emit(0xc4)
  48716. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  48717. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  48718. m.emit(0x6c)
  48719. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  48720. m.emit(hlcode(v[0]) << 4)
  48721. })
  48722. }
  48723. // VFMSUBPS m128, xmm, xmm, xmm
  48724. if isM128(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  48725. self.require(ISA_FMA4)
  48726. p.domain = DomainFMA
  48727. p.add(0, func(m *_Encoding, v []interface{}) {
  48728. m.vex3(0xc4, 0b11, 0x81, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  48729. m.emit(0x6c)
  48730. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  48731. m.emit(hlcode(v[1]) << 4)
  48732. })
  48733. }
  48734. // VFMSUBPS xmm, m128, xmm, xmm
  48735. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  48736. self.require(ISA_FMA4)
  48737. p.domain = DomainFMA
  48738. p.add(0, func(m *_Encoding, v []interface{}) {
  48739. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  48740. m.emit(0x6c)
  48741. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  48742. m.emit(hlcode(v[0]) << 4)
  48743. })
  48744. }
  48745. // VFMSUBPS ymm, ymm, ymm, ymm
  48746. if isYMM(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  48747. self.require(ISA_FMA4)
  48748. p.domain = DomainFMA
  48749. p.add(0, func(m *_Encoding, v []interface{}) {
  48750. m.emit(0xc4)
  48751. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  48752. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  48753. m.emit(0x6c)
  48754. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  48755. m.emit(hlcode(v[1]) << 4)
  48756. })
  48757. p.add(0, func(m *_Encoding, v []interface{}) {
  48758. m.emit(0xc4)
  48759. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  48760. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  48761. m.emit(0x6c)
  48762. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  48763. m.emit(hlcode(v[0]) << 4)
  48764. })
  48765. }
  48766. // VFMSUBPS m256, ymm, ymm, ymm
  48767. if isM256(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  48768. self.require(ISA_FMA4)
  48769. p.domain = DomainFMA
  48770. p.add(0, func(m *_Encoding, v []interface{}) {
  48771. m.vex3(0xc4, 0b11, 0x85, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  48772. m.emit(0x6c)
  48773. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  48774. m.emit(hlcode(v[1]) << 4)
  48775. })
  48776. }
  48777. // VFMSUBPS ymm, m256, ymm, ymm
  48778. if isYMM(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  48779. self.require(ISA_FMA4)
  48780. p.domain = DomainFMA
  48781. p.add(0, func(m *_Encoding, v []interface{}) {
  48782. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  48783. m.emit(0x6c)
  48784. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  48785. m.emit(hlcode(v[0]) << 4)
  48786. })
  48787. }
  48788. if p.len == 0 {
  48789. panic("invalid operands for VFMSUBPS")
  48790. }
  48791. return p
  48792. }
  48793. // VFMSUBSD performs "Fused Multiply-Subtract of Scalar Double-Precision Floating-Point Values".
  48794. //
  48795. // Mnemonic : VFMSUBSD
  48796. // Supported forms : (3 forms)
  48797. //
  48798. // * VFMSUBSD xmm, xmm, xmm, xmm [FMA4]
  48799. // * VFMSUBSD m64, xmm, xmm, xmm [FMA4]
  48800. // * VFMSUBSD xmm, m64, xmm, xmm [FMA4]
  48801. //
  48802. func (self *Program) VFMSUBSD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  48803. p := self.alloc("VFMSUBSD", 4, Operands { v0, v1, v2, v3 })
  48804. // VFMSUBSD xmm, xmm, xmm, xmm
  48805. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  48806. self.require(ISA_FMA4)
  48807. p.domain = DomainFMA
  48808. p.add(0, func(m *_Encoding, v []interface{}) {
  48809. m.emit(0xc4)
  48810. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  48811. m.emit(0xf9 ^ (hlcode(v[2]) << 3))
  48812. m.emit(0x6f)
  48813. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  48814. m.emit(hlcode(v[1]) << 4)
  48815. })
  48816. p.add(0, func(m *_Encoding, v []interface{}) {
  48817. m.emit(0xc4)
  48818. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  48819. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  48820. m.emit(0x6f)
  48821. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  48822. m.emit(hlcode(v[0]) << 4)
  48823. })
  48824. }
  48825. // VFMSUBSD m64, xmm, xmm, xmm
  48826. if isM64(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  48827. self.require(ISA_FMA4)
  48828. p.domain = DomainFMA
  48829. p.add(0, func(m *_Encoding, v []interface{}) {
  48830. m.vex3(0xc4, 0b11, 0x81, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  48831. m.emit(0x6f)
  48832. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  48833. m.emit(hlcode(v[1]) << 4)
  48834. })
  48835. }
  48836. // VFMSUBSD xmm, m64, xmm, xmm
  48837. if isXMM(v0) && isM64(v1) && isXMM(v2) && isXMM(v3) {
  48838. self.require(ISA_FMA4)
  48839. p.domain = DomainFMA
  48840. p.add(0, func(m *_Encoding, v []interface{}) {
  48841. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  48842. m.emit(0x6f)
  48843. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  48844. m.emit(hlcode(v[0]) << 4)
  48845. })
  48846. }
  48847. if p.len == 0 {
  48848. panic("invalid operands for VFMSUBSD")
  48849. }
  48850. return p
  48851. }
  48852. // VFMSUBSS performs "Fused Multiply-Subtract of Scalar Single-Precision Floating-Point Values".
  48853. //
  48854. // Mnemonic : VFMSUBSS
  48855. // Supported forms : (3 forms)
  48856. //
  48857. // * VFMSUBSS xmm, xmm, xmm, xmm [FMA4]
  48858. // * VFMSUBSS m32, xmm, xmm, xmm [FMA4]
  48859. // * VFMSUBSS xmm, m32, xmm, xmm [FMA4]
  48860. //
  48861. func (self *Program) VFMSUBSS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  48862. p := self.alloc("VFMSUBSS", 4, Operands { v0, v1, v2, v3 })
  48863. // VFMSUBSS xmm, xmm, xmm, xmm
  48864. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  48865. self.require(ISA_FMA4)
  48866. p.domain = DomainFMA
  48867. p.add(0, func(m *_Encoding, v []interface{}) {
  48868. m.emit(0xc4)
  48869. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  48870. m.emit(0xf9 ^ (hlcode(v[2]) << 3))
  48871. m.emit(0x6e)
  48872. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  48873. m.emit(hlcode(v[1]) << 4)
  48874. })
  48875. p.add(0, func(m *_Encoding, v []interface{}) {
  48876. m.emit(0xc4)
  48877. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  48878. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  48879. m.emit(0x6e)
  48880. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  48881. m.emit(hlcode(v[0]) << 4)
  48882. })
  48883. }
  48884. // VFMSUBSS m32, xmm, xmm, xmm
  48885. if isM32(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  48886. self.require(ISA_FMA4)
  48887. p.domain = DomainFMA
  48888. p.add(0, func(m *_Encoding, v []interface{}) {
  48889. m.vex3(0xc4, 0b11, 0x81, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  48890. m.emit(0x6e)
  48891. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  48892. m.emit(hlcode(v[1]) << 4)
  48893. })
  48894. }
  48895. // VFMSUBSS xmm, m32, xmm, xmm
  48896. if isXMM(v0) && isM32(v1) && isXMM(v2) && isXMM(v3) {
  48897. self.require(ISA_FMA4)
  48898. p.domain = DomainFMA
  48899. p.add(0, func(m *_Encoding, v []interface{}) {
  48900. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  48901. m.emit(0x6e)
  48902. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  48903. m.emit(hlcode(v[0]) << 4)
  48904. })
  48905. }
  48906. if p.len == 0 {
  48907. panic("invalid operands for VFMSUBSS")
  48908. }
  48909. return p
  48910. }
  48911. // VFNMADD132PD performs "Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values".
  48912. //
  48913. // Mnemonic : VFNMADD132PD
  48914. // Supported forms : (11 forms)
  48915. //
  48916. // * VFNMADD132PD xmm, xmm, xmm [FMA3]
  48917. // * VFNMADD132PD m128, xmm, xmm [FMA3]
  48918. // * VFNMADD132PD ymm, ymm, ymm [FMA3]
  48919. // * VFNMADD132PD m256, ymm, ymm [FMA3]
  48920. // * VFNMADD132PD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  48921. // * VFNMADD132PD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  48922. // * VFNMADD132PD zmm, zmm, zmm{k}{z} [AVX512F]
  48923. // * VFNMADD132PD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  48924. // * VFNMADD132PD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  48925. // * VFNMADD132PD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  48926. // * VFNMADD132PD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  48927. //
  48928. func (self *Program) VFNMADD132PD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  48929. var p *Instruction
  48930. switch len(vv) {
  48931. case 0 : p = self.alloc("VFNMADD132PD", 3, Operands { v0, v1, v2 })
  48932. case 1 : p = self.alloc("VFNMADD132PD", 4, Operands { v0, v1, v2, vv[0] })
  48933. default : panic("instruction VFNMADD132PD takes 3 or 4 operands")
  48934. }
  48935. // VFNMADD132PD xmm, xmm, xmm
  48936. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  48937. self.require(ISA_FMA3)
  48938. p.domain = DomainFMA
  48939. p.add(0, func(m *_Encoding, v []interface{}) {
  48940. m.emit(0xc4)
  48941. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  48942. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  48943. m.emit(0x9c)
  48944. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  48945. })
  48946. }
  48947. // VFNMADD132PD m128, xmm, xmm
  48948. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  48949. self.require(ISA_FMA3)
  48950. p.domain = DomainFMA
  48951. p.add(0, func(m *_Encoding, v []interface{}) {
  48952. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  48953. m.emit(0x9c)
  48954. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  48955. })
  48956. }
  48957. // VFNMADD132PD ymm, ymm, ymm
  48958. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  48959. self.require(ISA_FMA3)
  48960. p.domain = DomainFMA
  48961. p.add(0, func(m *_Encoding, v []interface{}) {
  48962. m.emit(0xc4)
  48963. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  48964. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  48965. m.emit(0x9c)
  48966. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  48967. })
  48968. }
  48969. // VFNMADD132PD m256, ymm, ymm
  48970. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  48971. self.require(ISA_FMA3)
  48972. p.domain = DomainFMA
  48973. p.add(0, func(m *_Encoding, v []interface{}) {
  48974. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  48975. m.emit(0x9c)
  48976. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  48977. })
  48978. }
  48979. // VFNMADD132PD m512/m64bcst, zmm, zmm{k}{z}
  48980. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  48981. self.require(ISA_AVX512F)
  48982. p.domain = DomainFMA
  48983. p.add(0, func(m *_Encoding, v []interface{}) {
  48984. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  48985. m.emit(0x9c)
  48986. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  48987. })
  48988. }
  48989. // VFNMADD132PD {er}, zmm, zmm, zmm{k}{z}
  48990. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  48991. self.require(ISA_AVX512F)
  48992. p.domain = DomainFMA
  48993. p.add(0, func(m *_Encoding, v []interface{}) {
  48994. m.emit(0x62)
  48995. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  48996. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  48997. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  48998. m.emit(0x9c)
  48999. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  49000. })
  49001. }
  49002. // VFNMADD132PD zmm, zmm, zmm{k}{z}
  49003. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  49004. self.require(ISA_AVX512F)
  49005. p.domain = DomainFMA
  49006. p.add(0, func(m *_Encoding, v []interface{}) {
  49007. m.emit(0x62)
  49008. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  49009. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  49010. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  49011. m.emit(0x9c)
  49012. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49013. })
  49014. }
  49015. // VFNMADD132PD m128/m64bcst, xmm, xmm{k}{z}
  49016. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  49017. self.require(ISA_AVX512VL | ISA_AVX512F)
  49018. p.domain = DomainFMA
  49019. p.add(0, func(m *_Encoding, v []interface{}) {
  49020. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  49021. m.emit(0x9c)
  49022. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  49023. })
  49024. }
  49025. // VFNMADD132PD xmm, xmm, xmm{k}{z}
  49026. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  49027. self.require(ISA_AVX512VL | ISA_AVX512F)
  49028. p.domain = DomainFMA
  49029. p.add(0, func(m *_Encoding, v []interface{}) {
  49030. m.emit(0x62)
  49031. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  49032. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  49033. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  49034. m.emit(0x9c)
  49035. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49036. })
  49037. }
  49038. // VFNMADD132PD m256/m64bcst, ymm, ymm{k}{z}
  49039. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  49040. self.require(ISA_AVX512VL | ISA_AVX512F)
  49041. p.domain = DomainFMA
  49042. p.add(0, func(m *_Encoding, v []interface{}) {
  49043. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  49044. m.emit(0x9c)
  49045. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  49046. })
  49047. }
  49048. // VFNMADD132PD ymm, ymm, ymm{k}{z}
  49049. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  49050. self.require(ISA_AVX512VL | ISA_AVX512F)
  49051. p.domain = DomainFMA
  49052. p.add(0, func(m *_Encoding, v []interface{}) {
  49053. m.emit(0x62)
  49054. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  49055. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  49056. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  49057. m.emit(0x9c)
  49058. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49059. })
  49060. }
  49061. if p.len == 0 {
  49062. panic("invalid operands for VFNMADD132PD")
  49063. }
  49064. return p
  49065. }
  49066. // VFNMADD132PS performs "Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values".
  49067. //
  49068. // Mnemonic : VFNMADD132PS
  49069. // Supported forms : (11 forms)
  49070. //
  49071. // * VFNMADD132PS xmm, xmm, xmm [FMA3]
  49072. // * VFNMADD132PS m128, xmm, xmm [FMA3]
  49073. // * VFNMADD132PS ymm, ymm, ymm [FMA3]
  49074. // * VFNMADD132PS m256, ymm, ymm [FMA3]
  49075. // * VFNMADD132PS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  49076. // * VFNMADD132PS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  49077. // * VFNMADD132PS zmm, zmm, zmm{k}{z} [AVX512F]
  49078. // * VFNMADD132PS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  49079. // * VFNMADD132PS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  49080. // * VFNMADD132PS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  49081. // * VFNMADD132PS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  49082. //
  49083. func (self *Program) VFNMADD132PS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  49084. var p *Instruction
  49085. switch len(vv) {
  49086. case 0 : p = self.alloc("VFNMADD132PS", 3, Operands { v0, v1, v2 })
  49087. case 1 : p = self.alloc("VFNMADD132PS", 4, Operands { v0, v1, v2, vv[0] })
  49088. default : panic("instruction VFNMADD132PS takes 3 or 4 operands")
  49089. }
  49090. // VFNMADD132PS xmm, xmm, xmm
  49091. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  49092. self.require(ISA_FMA3)
  49093. p.domain = DomainFMA
  49094. p.add(0, func(m *_Encoding, v []interface{}) {
  49095. m.emit(0xc4)
  49096. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  49097. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  49098. m.emit(0x9c)
  49099. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49100. })
  49101. }
  49102. // VFNMADD132PS m128, xmm, xmm
  49103. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  49104. self.require(ISA_FMA3)
  49105. p.domain = DomainFMA
  49106. p.add(0, func(m *_Encoding, v []interface{}) {
  49107. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  49108. m.emit(0x9c)
  49109. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  49110. })
  49111. }
  49112. // VFNMADD132PS ymm, ymm, ymm
  49113. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  49114. self.require(ISA_FMA3)
  49115. p.domain = DomainFMA
  49116. p.add(0, func(m *_Encoding, v []interface{}) {
  49117. m.emit(0xc4)
  49118. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  49119. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  49120. m.emit(0x9c)
  49121. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49122. })
  49123. }
  49124. // VFNMADD132PS m256, ymm, ymm
  49125. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  49126. self.require(ISA_FMA3)
  49127. p.domain = DomainFMA
  49128. p.add(0, func(m *_Encoding, v []interface{}) {
  49129. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  49130. m.emit(0x9c)
  49131. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  49132. })
  49133. }
  49134. // VFNMADD132PS m512/m32bcst, zmm, zmm{k}{z}
  49135. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  49136. self.require(ISA_AVX512F)
  49137. p.domain = DomainFMA
  49138. p.add(0, func(m *_Encoding, v []interface{}) {
  49139. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  49140. m.emit(0x9c)
  49141. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  49142. })
  49143. }
  49144. // VFNMADD132PS {er}, zmm, zmm, zmm{k}{z}
  49145. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  49146. self.require(ISA_AVX512F)
  49147. p.domain = DomainFMA
  49148. p.add(0, func(m *_Encoding, v []interface{}) {
  49149. m.emit(0x62)
  49150. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  49151. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  49152. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  49153. m.emit(0x9c)
  49154. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  49155. })
  49156. }
  49157. // VFNMADD132PS zmm, zmm, zmm{k}{z}
  49158. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  49159. self.require(ISA_AVX512F)
  49160. p.domain = DomainFMA
  49161. p.add(0, func(m *_Encoding, v []interface{}) {
  49162. m.emit(0x62)
  49163. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  49164. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  49165. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  49166. m.emit(0x9c)
  49167. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49168. })
  49169. }
  49170. // VFNMADD132PS m128/m32bcst, xmm, xmm{k}{z}
  49171. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  49172. self.require(ISA_AVX512VL | ISA_AVX512F)
  49173. p.domain = DomainFMA
  49174. p.add(0, func(m *_Encoding, v []interface{}) {
  49175. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  49176. m.emit(0x9c)
  49177. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  49178. })
  49179. }
  49180. // VFNMADD132PS xmm, xmm, xmm{k}{z}
  49181. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  49182. self.require(ISA_AVX512VL | ISA_AVX512F)
  49183. p.domain = DomainFMA
  49184. p.add(0, func(m *_Encoding, v []interface{}) {
  49185. m.emit(0x62)
  49186. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  49187. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  49188. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  49189. m.emit(0x9c)
  49190. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49191. })
  49192. }
  49193. // VFNMADD132PS m256/m32bcst, ymm, ymm{k}{z}
  49194. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  49195. self.require(ISA_AVX512VL | ISA_AVX512F)
  49196. p.domain = DomainFMA
  49197. p.add(0, func(m *_Encoding, v []interface{}) {
  49198. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  49199. m.emit(0x9c)
  49200. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  49201. })
  49202. }
  49203. // VFNMADD132PS ymm, ymm, ymm{k}{z}
  49204. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  49205. self.require(ISA_AVX512VL | ISA_AVX512F)
  49206. p.domain = DomainFMA
  49207. p.add(0, func(m *_Encoding, v []interface{}) {
  49208. m.emit(0x62)
  49209. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  49210. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  49211. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  49212. m.emit(0x9c)
  49213. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49214. })
  49215. }
  49216. if p.len == 0 {
  49217. panic("invalid operands for VFNMADD132PS")
  49218. }
  49219. return p
  49220. }
  49221. // VFNMADD132SD performs "Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values".
  49222. //
  49223. // Mnemonic : VFNMADD132SD
  49224. // Supported forms : (5 forms)
  49225. //
  49226. // * VFNMADD132SD xmm, xmm, xmm [FMA3]
  49227. // * VFNMADD132SD m64, xmm, xmm [FMA3]
  49228. // * VFNMADD132SD m64, xmm, xmm{k}{z} [AVX512F]
  49229. // * VFNMADD132SD {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  49230. // * VFNMADD132SD xmm, xmm, xmm{k}{z} [AVX512F]
  49231. //
  49232. func (self *Program) VFNMADD132SD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  49233. var p *Instruction
  49234. switch len(vv) {
  49235. case 0 : p = self.alloc("VFNMADD132SD", 3, Operands { v0, v1, v2 })
  49236. case 1 : p = self.alloc("VFNMADD132SD", 4, Operands { v0, v1, v2, vv[0] })
  49237. default : panic("instruction VFNMADD132SD takes 3 or 4 operands")
  49238. }
  49239. // VFNMADD132SD xmm, xmm, xmm
  49240. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  49241. self.require(ISA_FMA3)
  49242. p.domain = DomainFMA
  49243. p.add(0, func(m *_Encoding, v []interface{}) {
  49244. m.emit(0xc4)
  49245. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  49246. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  49247. m.emit(0x9d)
  49248. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49249. })
  49250. }
  49251. // VFNMADD132SD m64, xmm, xmm
  49252. if len(vv) == 0 && isM64(v0) && isXMM(v1) && isXMM(v2) {
  49253. self.require(ISA_FMA3)
  49254. p.domain = DomainFMA
  49255. p.add(0, func(m *_Encoding, v []interface{}) {
  49256. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  49257. m.emit(0x9d)
  49258. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  49259. })
  49260. }
  49261. // VFNMADD132SD m64, xmm, xmm{k}{z}
  49262. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  49263. self.require(ISA_AVX512F)
  49264. p.domain = DomainFMA
  49265. p.add(0, func(m *_Encoding, v []interface{}) {
  49266. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  49267. m.emit(0x9d)
  49268. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  49269. })
  49270. }
  49271. // VFNMADD132SD {er}, xmm, xmm, xmm{k}{z}
  49272. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  49273. self.require(ISA_AVX512F)
  49274. p.domain = DomainFMA
  49275. p.add(0, func(m *_Encoding, v []interface{}) {
  49276. m.emit(0x62)
  49277. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  49278. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  49279. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  49280. m.emit(0x9d)
  49281. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  49282. })
  49283. }
  49284. // VFNMADD132SD xmm, xmm, xmm{k}{z}
  49285. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  49286. self.require(ISA_AVX512F)
  49287. p.domain = DomainFMA
  49288. p.add(0, func(m *_Encoding, v []interface{}) {
  49289. m.emit(0x62)
  49290. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  49291. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  49292. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  49293. m.emit(0x9d)
  49294. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49295. })
  49296. }
  49297. if p.len == 0 {
  49298. panic("invalid operands for VFNMADD132SD")
  49299. }
  49300. return p
  49301. }
  49302. // VFNMADD132SS performs "Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values".
  49303. //
  49304. // Mnemonic : VFNMADD132SS
  49305. // Supported forms : (5 forms)
  49306. //
  49307. // * VFNMADD132SS xmm, xmm, xmm [FMA3]
  49308. // * VFNMADD132SS m32, xmm, xmm [FMA3]
  49309. // * VFNMADD132SS m32, xmm, xmm{k}{z} [AVX512F]
  49310. // * VFNMADD132SS {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  49311. // * VFNMADD132SS xmm, xmm, xmm{k}{z} [AVX512F]
  49312. //
  49313. func (self *Program) VFNMADD132SS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  49314. var p *Instruction
  49315. switch len(vv) {
  49316. case 0 : p = self.alloc("VFNMADD132SS", 3, Operands { v0, v1, v2 })
  49317. case 1 : p = self.alloc("VFNMADD132SS", 4, Operands { v0, v1, v2, vv[0] })
  49318. default : panic("instruction VFNMADD132SS takes 3 or 4 operands")
  49319. }
  49320. // VFNMADD132SS xmm, xmm, xmm
  49321. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  49322. self.require(ISA_FMA3)
  49323. p.domain = DomainFMA
  49324. p.add(0, func(m *_Encoding, v []interface{}) {
  49325. m.emit(0xc4)
  49326. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  49327. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  49328. m.emit(0x9d)
  49329. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49330. })
  49331. }
  49332. // VFNMADD132SS m32, xmm, xmm
  49333. if len(vv) == 0 && isM32(v0) && isXMM(v1) && isXMM(v2) {
  49334. self.require(ISA_FMA3)
  49335. p.domain = DomainFMA
  49336. p.add(0, func(m *_Encoding, v []interface{}) {
  49337. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  49338. m.emit(0x9d)
  49339. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  49340. })
  49341. }
  49342. // VFNMADD132SS m32, xmm, xmm{k}{z}
  49343. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  49344. self.require(ISA_AVX512F)
  49345. p.domain = DomainFMA
  49346. p.add(0, func(m *_Encoding, v []interface{}) {
  49347. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  49348. m.emit(0x9d)
  49349. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  49350. })
  49351. }
  49352. // VFNMADD132SS {er}, xmm, xmm, xmm{k}{z}
  49353. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  49354. self.require(ISA_AVX512F)
  49355. p.domain = DomainFMA
  49356. p.add(0, func(m *_Encoding, v []interface{}) {
  49357. m.emit(0x62)
  49358. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  49359. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  49360. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  49361. m.emit(0x9d)
  49362. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  49363. })
  49364. }
  49365. // VFNMADD132SS xmm, xmm, xmm{k}{z}
  49366. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  49367. self.require(ISA_AVX512F)
  49368. p.domain = DomainFMA
  49369. p.add(0, func(m *_Encoding, v []interface{}) {
  49370. m.emit(0x62)
  49371. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  49372. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  49373. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  49374. m.emit(0x9d)
  49375. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49376. })
  49377. }
  49378. if p.len == 0 {
  49379. panic("invalid operands for VFNMADD132SS")
  49380. }
  49381. return p
  49382. }
  49383. // VFNMADD213PD performs "Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values".
  49384. //
  49385. // Mnemonic : VFNMADD213PD
  49386. // Supported forms : (11 forms)
  49387. //
  49388. // * VFNMADD213PD xmm, xmm, xmm [FMA3]
  49389. // * VFNMADD213PD m128, xmm, xmm [FMA3]
  49390. // * VFNMADD213PD ymm, ymm, ymm [FMA3]
  49391. // * VFNMADD213PD m256, ymm, ymm [FMA3]
  49392. // * VFNMADD213PD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  49393. // * VFNMADD213PD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  49394. // * VFNMADD213PD zmm, zmm, zmm{k}{z} [AVX512F]
  49395. // * VFNMADD213PD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  49396. // * VFNMADD213PD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  49397. // * VFNMADD213PD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  49398. // * VFNMADD213PD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  49399. //
  49400. func (self *Program) VFNMADD213PD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  49401. var p *Instruction
  49402. switch len(vv) {
  49403. case 0 : p = self.alloc("VFNMADD213PD", 3, Operands { v0, v1, v2 })
  49404. case 1 : p = self.alloc("VFNMADD213PD", 4, Operands { v0, v1, v2, vv[0] })
  49405. default : panic("instruction VFNMADD213PD takes 3 or 4 operands")
  49406. }
  49407. // VFNMADD213PD xmm, xmm, xmm
  49408. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  49409. self.require(ISA_FMA3)
  49410. p.domain = DomainFMA
  49411. p.add(0, func(m *_Encoding, v []interface{}) {
  49412. m.emit(0xc4)
  49413. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  49414. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  49415. m.emit(0xac)
  49416. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49417. })
  49418. }
  49419. // VFNMADD213PD m128, xmm, xmm
  49420. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  49421. self.require(ISA_FMA3)
  49422. p.domain = DomainFMA
  49423. p.add(0, func(m *_Encoding, v []interface{}) {
  49424. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  49425. m.emit(0xac)
  49426. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  49427. })
  49428. }
  49429. // VFNMADD213PD ymm, ymm, ymm
  49430. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  49431. self.require(ISA_FMA3)
  49432. p.domain = DomainFMA
  49433. p.add(0, func(m *_Encoding, v []interface{}) {
  49434. m.emit(0xc4)
  49435. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  49436. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  49437. m.emit(0xac)
  49438. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49439. })
  49440. }
  49441. // VFNMADD213PD m256, ymm, ymm
  49442. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  49443. self.require(ISA_FMA3)
  49444. p.domain = DomainFMA
  49445. p.add(0, func(m *_Encoding, v []interface{}) {
  49446. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  49447. m.emit(0xac)
  49448. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  49449. })
  49450. }
  49451. // VFNMADD213PD m512/m64bcst, zmm, zmm{k}{z}
  49452. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  49453. self.require(ISA_AVX512F)
  49454. p.domain = DomainFMA
  49455. p.add(0, func(m *_Encoding, v []interface{}) {
  49456. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  49457. m.emit(0xac)
  49458. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  49459. })
  49460. }
  49461. // VFNMADD213PD {er}, zmm, zmm, zmm{k}{z}
  49462. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  49463. self.require(ISA_AVX512F)
  49464. p.domain = DomainFMA
  49465. p.add(0, func(m *_Encoding, v []interface{}) {
  49466. m.emit(0x62)
  49467. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  49468. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  49469. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  49470. m.emit(0xac)
  49471. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  49472. })
  49473. }
  49474. // VFNMADD213PD zmm, zmm, zmm{k}{z}
  49475. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  49476. self.require(ISA_AVX512F)
  49477. p.domain = DomainFMA
  49478. p.add(0, func(m *_Encoding, v []interface{}) {
  49479. m.emit(0x62)
  49480. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  49481. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  49482. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  49483. m.emit(0xac)
  49484. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49485. })
  49486. }
  49487. // VFNMADD213PD m128/m64bcst, xmm, xmm{k}{z}
  49488. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  49489. self.require(ISA_AVX512VL | ISA_AVX512F)
  49490. p.domain = DomainFMA
  49491. p.add(0, func(m *_Encoding, v []interface{}) {
  49492. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  49493. m.emit(0xac)
  49494. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  49495. })
  49496. }
  49497. // VFNMADD213PD xmm, xmm, xmm{k}{z}
  49498. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  49499. self.require(ISA_AVX512VL | ISA_AVX512F)
  49500. p.domain = DomainFMA
  49501. p.add(0, func(m *_Encoding, v []interface{}) {
  49502. m.emit(0x62)
  49503. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  49504. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  49505. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  49506. m.emit(0xac)
  49507. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49508. })
  49509. }
  49510. // VFNMADD213PD m256/m64bcst, ymm, ymm{k}{z}
  49511. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  49512. self.require(ISA_AVX512VL | ISA_AVX512F)
  49513. p.domain = DomainFMA
  49514. p.add(0, func(m *_Encoding, v []interface{}) {
  49515. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  49516. m.emit(0xac)
  49517. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  49518. })
  49519. }
  49520. // VFNMADD213PD ymm, ymm, ymm{k}{z}
  49521. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  49522. self.require(ISA_AVX512VL | ISA_AVX512F)
  49523. p.domain = DomainFMA
  49524. p.add(0, func(m *_Encoding, v []interface{}) {
  49525. m.emit(0x62)
  49526. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  49527. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  49528. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  49529. m.emit(0xac)
  49530. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49531. })
  49532. }
  49533. if p.len == 0 {
  49534. panic("invalid operands for VFNMADD213PD")
  49535. }
  49536. return p
  49537. }
  49538. // VFNMADD213PS performs "Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values".
  49539. //
  49540. // Mnemonic : VFNMADD213PS
  49541. // Supported forms : (11 forms)
  49542. //
  49543. // * VFNMADD213PS xmm, xmm, xmm [FMA3]
  49544. // * VFNMADD213PS m128, xmm, xmm [FMA3]
  49545. // * VFNMADD213PS ymm, ymm, ymm [FMA3]
  49546. // * VFNMADD213PS m256, ymm, ymm [FMA3]
  49547. // * VFNMADD213PS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  49548. // * VFNMADD213PS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  49549. // * VFNMADD213PS zmm, zmm, zmm{k}{z} [AVX512F]
  49550. // * VFNMADD213PS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  49551. // * VFNMADD213PS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  49552. // * VFNMADD213PS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  49553. // * VFNMADD213PS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  49554. //
  49555. func (self *Program) VFNMADD213PS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  49556. var p *Instruction
  49557. switch len(vv) {
  49558. case 0 : p = self.alloc("VFNMADD213PS", 3, Operands { v0, v1, v2 })
  49559. case 1 : p = self.alloc("VFNMADD213PS", 4, Operands { v0, v1, v2, vv[0] })
  49560. default : panic("instruction VFNMADD213PS takes 3 or 4 operands")
  49561. }
  49562. // VFNMADD213PS xmm, xmm, xmm
  49563. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  49564. self.require(ISA_FMA3)
  49565. p.domain = DomainFMA
  49566. p.add(0, func(m *_Encoding, v []interface{}) {
  49567. m.emit(0xc4)
  49568. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  49569. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  49570. m.emit(0xac)
  49571. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49572. })
  49573. }
  49574. // VFNMADD213PS m128, xmm, xmm
  49575. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  49576. self.require(ISA_FMA3)
  49577. p.domain = DomainFMA
  49578. p.add(0, func(m *_Encoding, v []interface{}) {
  49579. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  49580. m.emit(0xac)
  49581. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  49582. })
  49583. }
  49584. // VFNMADD213PS ymm, ymm, ymm
  49585. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  49586. self.require(ISA_FMA3)
  49587. p.domain = DomainFMA
  49588. p.add(0, func(m *_Encoding, v []interface{}) {
  49589. m.emit(0xc4)
  49590. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  49591. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  49592. m.emit(0xac)
  49593. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49594. })
  49595. }
  49596. // VFNMADD213PS m256, ymm, ymm
  49597. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  49598. self.require(ISA_FMA3)
  49599. p.domain = DomainFMA
  49600. p.add(0, func(m *_Encoding, v []interface{}) {
  49601. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  49602. m.emit(0xac)
  49603. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  49604. })
  49605. }
  49606. // VFNMADD213PS m512/m32bcst, zmm, zmm{k}{z}
  49607. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  49608. self.require(ISA_AVX512F)
  49609. p.domain = DomainFMA
  49610. p.add(0, func(m *_Encoding, v []interface{}) {
  49611. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  49612. m.emit(0xac)
  49613. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  49614. })
  49615. }
  49616. // VFNMADD213PS {er}, zmm, zmm, zmm{k}{z}
  49617. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  49618. self.require(ISA_AVX512F)
  49619. p.domain = DomainFMA
  49620. p.add(0, func(m *_Encoding, v []interface{}) {
  49621. m.emit(0x62)
  49622. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  49623. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  49624. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  49625. m.emit(0xac)
  49626. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  49627. })
  49628. }
  49629. // VFNMADD213PS zmm, zmm, zmm{k}{z}
  49630. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  49631. self.require(ISA_AVX512F)
  49632. p.domain = DomainFMA
  49633. p.add(0, func(m *_Encoding, v []interface{}) {
  49634. m.emit(0x62)
  49635. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  49636. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  49637. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  49638. m.emit(0xac)
  49639. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49640. })
  49641. }
  49642. // VFNMADD213PS m128/m32bcst, xmm, xmm{k}{z}
  49643. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  49644. self.require(ISA_AVX512VL | ISA_AVX512F)
  49645. p.domain = DomainFMA
  49646. p.add(0, func(m *_Encoding, v []interface{}) {
  49647. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  49648. m.emit(0xac)
  49649. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  49650. })
  49651. }
  49652. // VFNMADD213PS xmm, xmm, xmm{k}{z}
  49653. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  49654. self.require(ISA_AVX512VL | ISA_AVX512F)
  49655. p.domain = DomainFMA
  49656. p.add(0, func(m *_Encoding, v []interface{}) {
  49657. m.emit(0x62)
  49658. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  49659. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  49660. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  49661. m.emit(0xac)
  49662. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49663. })
  49664. }
  49665. // VFNMADD213PS m256/m32bcst, ymm, ymm{k}{z}
  49666. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  49667. self.require(ISA_AVX512VL | ISA_AVX512F)
  49668. p.domain = DomainFMA
  49669. p.add(0, func(m *_Encoding, v []interface{}) {
  49670. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  49671. m.emit(0xac)
  49672. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  49673. })
  49674. }
  49675. // VFNMADD213PS ymm, ymm, ymm{k}{z}
  49676. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  49677. self.require(ISA_AVX512VL | ISA_AVX512F)
  49678. p.domain = DomainFMA
  49679. p.add(0, func(m *_Encoding, v []interface{}) {
  49680. m.emit(0x62)
  49681. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  49682. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  49683. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  49684. m.emit(0xac)
  49685. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49686. })
  49687. }
  49688. if p.len == 0 {
  49689. panic("invalid operands for VFNMADD213PS")
  49690. }
  49691. return p
  49692. }
  49693. // VFNMADD213SD performs "Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values".
  49694. //
  49695. // Mnemonic : VFNMADD213SD
  49696. // Supported forms : (5 forms)
  49697. //
  49698. // * VFNMADD213SD xmm, xmm, xmm [FMA3]
  49699. // * VFNMADD213SD m64, xmm, xmm [FMA3]
  49700. // * VFNMADD213SD m64, xmm, xmm{k}{z} [AVX512F]
  49701. // * VFNMADD213SD {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  49702. // * VFNMADD213SD xmm, xmm, xmm{k}{z} [AVX512F]
  49703. //
  49704. func (self *Program) VFNMADD213SD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  49705. var p *Instruction
  49706. switch len(vv) {
  49707. case 0 : p = self.alloc("VFNMADD213SD", 3, Operands { v0, v1, v2 })
  49708. case 1 : p = self.alloc("VFNMADD213SD", 4, Operands { v0, v1, v2, vv[0] })
  49709. default : panic("instruction VFNMADD213SD takes 3 or 4 operands")
  49710. }
  49711. // VFNMADD213SD xmm, xmm, xmm
  49712. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  49713. self.require(ISA_FMA3)
  49714. p.domain = DomainFMA
  49715. p.add(0, func(m *_Encoding, v []interface{}) {
  49716. m.emit(0xc4)
  49717. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  49718. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  49719. m.emit(0xad)
  49720. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49721. })
  49722. }
  49723. // VFNMADD213SD m64, xmm, xmm
  49724. if len(vv) == 0 && isM64(v0) && isXMM(v1) && isXMM(v2) {
  49725. self.require(ISA_FMA3)
  49726. p.domain = DomainFMA
  49727. p.add(0, func(m *_Encoding, v []interface{}) {
  49728. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  49729. m.emit(0xad)
  49730. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  49731. })
  49732. }
  49733. // VFNMADD213SD m64, xmm, xmm{k}{z}
  49734. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  49735. self.require(ISA_AVX512F)
  49736. p.domain = DomainFMA
  49737. p.add(0, func(m *_Encoding, v []interface{}) {
  49738. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  49739. m.emit(0xad)
  49740. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  49741. })
  49742. }
  49743. // VFNMADD213SD {er}, xmm, xmm, xmm{k}{z}
  49744. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  49745. self.require(ISA_AVX512F)
  49746. p.domain = DomainFMA
  49747. p.add(0, func(m *_Encoding, v []interface{}) {
  49748. m.emit(0x62)
  49749. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  49750. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  49751. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  49752. m.emit(0xad)
  49753. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  49754. })
  49755. }
  49756. // VFNMADD213SD xmm, xmm, xmm{k}{z}
  49757. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  49758. self.require(ISA_AVX512F)
  49759. p.domain = DomainFMA
  49760. p.add(0, func(m *_Encoding, v []interface{}) {
  49761. m.emit(0x62)
  49762. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  49763. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  49764. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  49765. m.emit(0xad)
  49766. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49767. })
  49768. }
  49769. if p.len == 0 {
  49770. panic("invalid operands for VFNMADD213SD")
  49771. }
  49772. return p
  49773. }
  49774. // VFNMADD213SS performs "Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values".
  49775. //
  49776. // Mnemonic : VFNMADD213SS
  49777. // Supported forms : (5 forms)
  49778. //
  49779. // * VFNMADD213SS xmm, xmm, xmm [FMA3]
  49780. // * VFNMADD213SS m32, xmm, xmm [FMA3]
  49781. // * VFNMADD213SS m32, xmm, xmm{k}{z} [AVX512F]
  49782. // * VFNMADD213SS {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  49783. // * VFNMADD213SS xmm, xmm, xmm{k}{z} [AVX512F]
  49784. //
  49785. func (self *Program) VFNMADD213SS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  49786. var p *Instruction
  49787. switch len(vv) {
  49788. case 0 : p = self.alloc("VFNMADD213SS", 3, Operands { v0, v1, v2 })
  49789. case 1 : p = self.alloc("VFNMADD213SS", 4, Operands { v0, v1, v2, vv[0] })
  49790. default : panic("instruction VFNMADD213SS takes 3 or 4 operands")
  49791. }
  49792. // VFNMADD213SS xmm, xmm, xmm
  49793. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  49794. self.require(ISA_FMA3)
  49795. p.domain = DomainFMA
  49796. p.add(0, func(m *_Encoding, v []interface{}) {
  49797. m.emit(0xc4)
  49798. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  49799. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  49800. m.emit(0xad)
  49801. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49802. })
  49803. }
  49804. // VFNMADD213SS m32, xmm, xmm
  49805. if len(vv) == 0 && isM32(v0) && isXMM(v1) && isXMM(v2) {
  49806. self.require(ISA_FMA3)
  49807. p.domain = DomainFMA
  49808. p.add(0, func(m *_Encoding, v []interface{}) {
  49809. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  49810. m.emit(0xad)
  49811. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  49812. })
  49813. }
  49814. // VFNMADD213SS m32, xmm, xmm{k}{z}
  49815. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  49816. self.require(ISA_AVX512F)
  49817. p.domain = DomainFMA
  49818. p.add(0, func(m *_Encoding, v []interface{}) {
  49819. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  49820. m.emit(0xad)
  49821. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  49822. })
  49823. }
  49824. // VFNMADD213SS {er}, xmm, xmm, xmm{k}{z}
  49825. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  49826. self.require(ISA_AVX512F)
  49827. p.domain = DomainFMA
  49828. p.add(0, func(m *_Encoding, v []interface{}) {
  49829. m.emit(0x62)
  49830. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  49831. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  49832. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  49833. m.emit(0xad)
  49834. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  49835. })
  49836. }
  49837. // VFNMADD213SS xmm, xmm, xmm{k}{z}
  49838. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  49839. self.require(ISA_AVX512F)
  49840. p.domain = DomainFMA
  49841. p.add(0, func(m *_Encoding, v []interface{}) {
  49842. m.emit(0x62)
  49843. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  49844. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  49845. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  49846. m.emit(0xad)
  49847. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49848. })
  49849. }
  49850. if p.len == 0 {
  49851. panic("invalid operands for VFNMADD213SS")
  49852. }
  49853. return p
  49854. }
  49855. // VFNMADD231PD performs "Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values".
  49856. //
  49857. // Mnemonic : VFNMADD231PD
  49858. // Supported forms : (11 forms)
  49859. //
  49860. // * VFNMADD231PD xmm, xmm, xmm [FMA3]
  49861. // * VFNMADD231PD m128, xmm, xmm [FMA3]
  49862. // * VFNMADD231PD ymm, ymm, ymm [FMA3]
  49863. // * VFNMADD231PD m256, ymm, ymm [FMA3]
  49864. // * VFNMADD231PD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  49865. // * VFNMADD231PD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  49866. // * VFNMADD231PD zmm, zmm, zmm{k}{z} [AVX512F]
  49867. // * VFNMADD231PD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  49868. // * VFNMADD231PD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  49869. // * VFNMADD231PD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  49870. // * VFNMADD231PD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  49871. //
  49872. func (self *Program) VFNMADD231PD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  49873. var p *Instruction
  49874. switch len(vv) {
  49875. case 0 : p = self.alloc("VFNMADD231PD", 3, Operands { v0, v1, v2 })
  49876. case 1 : p = self.alloc("VFNMADD231PD", 4, Operands { v0, v1, v2, vv[0] })
  49877. default : panic("instruction VFNMADD231PD takes 3 or 4 operands")
  49878. }
  49879. // VFNMADD231PD xmm, xmm, xmm
  49880. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  49881. self.require(ISA_FMA3)
  49882. p.domain = DomainFMA
  49883. p.add(0, func(m *_Encoding, v []interface{}) {
  49884. m.emit(0xc4)
  49885. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  49886. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  49887. m.emit(0xbc)
  49888. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49889. })
  49890. }
  49891. // VFNMADD231PD m128, xmm, xmm
  49892. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  49893. self.require(ISA_FMA3)
  49894. p.domain = DomainFMA
  49895. p.add(0, func(m *_Encoding, v []interface{}) {
  49896. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  49897. m.emit(0xbc)
  49898. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  49899. })
  49900. }
  49901. // VFNMADD231PD ymm, ymm, ymm
  49902. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  49903. self.require(ISA_FMA3)
  49904. p.domain = DomainFMA
  49905. p.add(0, func(m *_Encoding, v []interface{}) {
  49906. m.emit(0xc4)
  49907. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  49908. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  49909. m.emit(0xbc)
  49910. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49911. })
  49912. }
  49913. // VFNMADD231PD m256, ymm, ymm
  49914. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  49915. self.require(ISA_FMA3)
  49916. p.domain = DomainFMA
  49917. p.add(0, func(m *_Encoding, v []interface{}) {
  49918. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  49919. m.emit(0xbc)
  49920. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  49921. })
  49922. }
  49923. // VFNMADD231PD m512/m64bcst, zmm, zmm{k}{z}
  49924. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  49925. self.require(ISA_AVX512F)
  49926. p.domain = DomainFMA
  49927. p.add(0, func(m *_Encoding, v []interface{}) {
  49928. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  49929. m.emit(0xbc)
  49930. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  49931. })
  49932. }
  49933. // VFNMADD231PD {er}, zmm, zmm, zmm{k}{z}
  49934. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  49935. self.require(ISA_AVX512F)
  49936. p.domain = DomainFMA
  49937. p.add(0, func(m *_Encoding, v []interface{}) {
  49938. m.emit(0x62)
  49939. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  49940. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  49941. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  49942. m.emit(0xbc)
  49943. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  49944. })
  49945. }
  49946. // VFNMADD231PD zmm, zmm, zmm{k}{z}
  49947. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  49948. self.require(ISA_AVX512F)
  49949. p.domain = DomainFMA
  49950. p.add(0, func(m *_Encoding, v []interface{}) {
  49951. m.emit(0x62)
  49952. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  49953. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  49954. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  49955. m.emit(0xbc)
  49956. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49957. })
  49958. }
  49959. // VFNMADD231PD m128/m64bcst, xmm, xmm{k}{z}
  49960. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  49961. self.require(ISA_AVX512VL | ISA_AVX512F)
  49962. p.domain = DomainFMA
  49963. p.add(0, func(m *_Encoding, v []interface{}) {
  49964. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  49965. m.emit(0xbc)
  49966. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  49967. })
  49968. }
  49969. // VFNMADD231PD xmm, xmm, xmm{k}{z}
  49970. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  49971. self.require(ISA_AVX512VL | ISA_AVX512F)
  49972. p.domain = DomainFMA
  49973. p.add(0, func(m *_Encoding, v []interface{}) {
  49974. m.emit(0x62)
  49975. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  49976. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  49977. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  49978. m.emit(0xbc)
  49979. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  49980. })
  49981. }
  49982. // VFNMADD231PD m256/m64bcst, ymm, ymm{k}{z}
  49983. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  49984. self.require(ISA_AVX512VL | ISA_AVX512F)
  49985. p.domain = DomainFMA
  49986. p.add(0, func(m *_Encoding, v []interface{}) {
  49987. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  49988. m.emit(0xbc)
  49989. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  49990. })
  49991. }
  49992. // VFNMADD231PD ymm, ymm, ymm{k}{z}
  49993. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  49994. self.require(ISA_AVX512VL | ISA_AVX512F)
  49995. p.domain = DomainFMA
  49996. p.add(0, func(m *_Encoding, v []interface{}) {
  49997. m.emit(0x62)
  49998. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  49999. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  50000. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  50001. m.emit(0xbc)
  50002. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  50003. })
  50004. }
  50005. if p.len == 0 {
  50006. panic("invalid operands for VFNMADD231PD")
  50007. }
  50008. return p
  50009. }
  50010. // VFNMADD231PS performs "Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values".
  50011. //
  50012. // Mnemonic : VFNMADD231PS
  50013. // Supported forms : (11 forms)
  50014. //
  50015. // * VFNMADD231PS xmm, xmm, xmm [FMA3]
  50016. // * VFNMADD231PS m128, xmm, xmm [FMA3]
  50017. // * VFNMADD231PS ymm, ymm, ymm [FMA3]
  50018. // * VFNMADD231PS m256, ymm, ymm [FMA3]
  50019. // * VFNMADD231PS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  50020. // * VFNMADD231PS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  50021. // * VFNMADD231PS zmm, zmm, zmm{k}{z} [AVX512F]
  50022. // * VFNMADD231PS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  50023. // * VFNMADD231PS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  50024. // * VFNMADD231PS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  50025. // * VFNMADD231PS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  50026. //
  50027. func (self *Program) VFNMADD231PS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  50028. var p *Instruction
  50029. switch len(vv) {
  50030. case 0 : p = self.alloc("VFNMADD231PS", 3, Operands { v0, v1, v2 })
  50031. case 1 : p = self.alloc("VFNMADD231PS", 4, Operands { v0, v1, v2, vv[0] })
  50032. default : panic("instruction VFNMADD231PS takes 3 or 4 operands")
  50033. }
  50034. // VFNMADD231PS xmm, xmm, xmm
  50035. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  50036. self.require(ISA_FMA3)
  50037. p.domain = DomainFMA
  50038. p.add(0, func(m *_Encoding, v []interface{}) {
  50039. m.emit(0xc4)
  50040. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  50041. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  50042. m.emit(0xbc)
  50043. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  50044. })
  50045. }
  50046. // VFNMADD231PS m128, xmm, xmm
  50047. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  50048. self.require(ISA_FMA3)
  50049. p.domain = DomainFMA
  50050. p.add(0, func(m *_Encoding, v []interface{}) {
  50051. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  50052. m.emit(0xbc)
  50053. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  50054. })
  50055. }
  50056. // VFNMADD231PS ymm, ymm, ymm
  50057. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  50058. self.require(ISA_FMA3)
  50059. p.domain = DomainFMA
  50060. p.add(0, func(m *_Encoding, v []interface{}) {
  50061. m.emit(0xc4)
  50062. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  50063. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  50064. m.emit(0xbc)
  50065. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  50066. })
  50067. }
  50068. // VFNMADD231PS m256, ymm, ymm
  50069. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  50070. self.require(ISA_FMA3)
  50071. p.domain = DomainFMA
  50072. p.add(0, func(m *_Encoding, v []interface{}) {
  50073. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  50074. m.emit(0xbc)
  50075. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  50076. })
  50077. }
  50078. // VFNMADD231PS m512/m32bcst, zmm, zmm{k}{z}
  50079. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  50080. self.require(ISA_AVX512F)
  50081. p.domain = DomainFMA
  50082. p.add(0, func(m *_Encoding, v []interface{}) {
  50083. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  50084. m.emit(0xbc)
  50085. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  50086. })
  50087. }
  50088. // VFNMADD231PS {er}, zmm, zmm, zmm{k}{z}
  50089. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  50090. self.require(ISA_AVX512F)
  50091. p.domain = DomainFMA
  50092. p.add(0, func(m *_Encoding, v []interface{}) {
  50093. m.emit(0x62)
  50094. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  50095. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  50096. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  50097. m.emit(0xbc)
  50098. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  50099. })
  50100. }
  50101. // VFNMADD231PS zmm, zmm, zmm{k}{z}
  50102. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  50103. self.require(ISA_AVX512F)
  50104. p.domain = DomainFMA
  50105. p.add(0, func(m *_Encoding, v []interface{}) {
  50106. m.emit(0x62)
  50107. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  50108. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  50109. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  50110. m.emit(0xbc)
  50111. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  50112. })
  50113. }
  50114. // VFNMADD231PS m128/m32bcst, xmm, xmm{k}{z}
  50115. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  50116. self.require(ISA_AVX512VL | ISA_AVX512F)
  50117. p.domain = DomainFMA
  50118. p.add(0, func(m *_Encoding, v []interface{}) {
  50119. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  50120. m.emit(0xbc)
  50121. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  50122. })
  50123. }
  50124. // VFNMADD231PS xmm, xmm, xmm{k}{z}
  50125. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  50126. self.require(ISA_AVX512VL | ISA_AVX512F)
  50127. p.domain = DomainFMA
  50128. p.add(0, func(m *_Encoding, v []interface{}) {
  50129. m.emit(0x62)
  50130. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  50131. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  50132. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  50133. m.emit(0xbc)
  50134. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  50135. })
  50136. }
  50137. // VFNMADD231PS m256/m32bcst, ymm, ymm{k}{z}
  50138. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  50139. self.require(ISA_AVX512VL | ISA_AVX512F)
  50140. p.domain = DomainFMA
  50141. p.add(0, func(m *_Encoding, v []interface{}) {
  50142. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  50143. m.emit(0xbc)
  50144. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  50145. })
  50146. }
  50147. // VFNMADD231PS ymm, ymm, ymm{k}{z}
  50148. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  50149. self.require(ISA_AVX512VL | ISA_AVX512F)
  50150. p.domain = DomainFMA
  50151. p.add(0, func(m *_Encoding, v []interface{}) {
  50152. m.emit(0x62)
  50153. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  50154. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  50155. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  50156. m.emit(0xbc)
  50157. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  50158. })
  50159. }
  50160. if p.len == 0 {
  50161. panic("invalid operands for VFNMADD231PS")
  50162. }
  50163. return p
  50164. }
  50165. // VFNMADD231SD performs "Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values".
  50166. //
  50167. // Mnemonic : VFNMADD231SD
  50168. // Supported forms : (5 forms)
  50169. //
  50170. // * VFNMADD231SD xmm, xmm, xmm [FMA3]
  50171. // * VFNMADD231SD m64, xmm, xmm [FMA3]
  50172. // * VFNMADD231SD m64, xmm, xmm{k}{z} [AVX512F]
  50173. // * VFNMADD231SD {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  50174. // * VFNMADD231SD xmm, xmm, xmm{k}{z} [AVX512F]
  50175. //
  50176. func (self *Program) VFNMADD231SD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  50177. var p *Instruction
  50178. switch len(vv) {
  50179. case 0 : p = self.alloc("VFNMADD231SD", 3, Operands { v0, v1, v2 })
  50180. case 1 : p = self.alloc("VFNMADD231SD", 4, Operands { v0, v1, v2, vv[0] })
  50181. default : panic("instruction VFNMADD231SD takes 3 or 4 operands")
  50182. }
  50183. // VFNMADD231SD xmm, xmm, xmm
  50184. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  50185. self.require(ISA_FMA3)
  50186. p.domain = DomainFMA
  50187. p.add(0, func(m *_Encoding, v []interface{}) {
  50188. m.emit(0xc4)
  50189. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  50190. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  50191. m.emit(0xbd)
  50192. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  50193. })
  50194. }
  50195. // VFNMADD231SD m64, xmm, xmm
  50196. if len(vv) == 0 && isM64(v0) && isXMM(v1) && isXMM(v2) {
  50197. self.require(ISA_FMA3)
  50198. p.domain = DomainFMA
  50199. p.add(0, func(m *_Encoding, v []interface{}) {
  50200. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  50201. m.emit(0xbd)
  50202. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  50203. })
  50204. }
  50205. // VFNMADD231SD m64, xmm, xmm{k}{z}
  50206. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  50207. self.require(ISA_AVX512F)
  50208. p.domain = DomainFMA
  50209. p.add(0, func(m *_Encoding, v []interface{}) {
  50210. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  50211. m.emit(0xbd)
  50212. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  50213. })
  50214. }
  50215. // VFNMADD231SD {er}, xmm, xmm, xmm{k}{z}
  50216. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  50217. self.require(ISA_AVX512F)
  50218. p.domain = DomainFMA
  50219. p.add(0, func(m *_Encoding, v []interface{}) {
  50220. m.emit(0x62)
  50221. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  50222. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  50223. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  50224. m.emit(0xbd)
  50225. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  50226. })
  50227. }
  50228. // VFNMADD231SD xmm, xmm, xmm{k}{z}
  50229. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  50230. self.require(ISA_AVX512F)
  50231. p.domain = DomainFMA
  50232. p.add(0, func(m *_Encoding, v []interface{}) {
  50233. m.emit(0x62)
  50234. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  50235. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  50236. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  50237. m.emit(0xbd)
  50238. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  50239. })
  50240. }
  50241. if p.len == 0 {
  50242. panic("invalid operands for VFNMADD231SD")
  50243. }
  50244. return p
  50245. }
  50246. // VFNMADD231SS performs "Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values".
  50247. //
  50248. // Mnemonic : VFNMADD231SS
  50249. // Supported forms : (5 forms)
  50250. //
  50251. // * VFNMADD231SS xmm, xmm, xmm [FMA3]
  50252. // * VFNMADD231SS m32, xmm, xmm [FMA3]
  50253. // * VFNMADD231SS m32, xmm, xmm{k}{z} [AVX512F]
  50254. // * VFNMADD231SS {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  50255. // * VFNMADD231SS xmm, xmm, xmm{k}{z} [AVX512F]
  50256. //
  50257. func (self *Program) VFNMADD231SS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  50258. var p *Instruction
  50259. switch len(vv) {
  50260. case 0 : p = self.alloc("VFNMADD231SS", 3, Operands { v0, v1, v2 })
  50261. case 1 : p = self.alloc("VFNMADD231SS", 4, Operands { v0, v1, v2, vv[0] })
  50262. default : panic("instruction VFNMADD231SS takes 3 or 4 operands")
  50263. }
  50264. // VFNMADD231SS xmm, xmm, xmm
  50265. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  50266. self.require(ISA_FMA3)
  50267. p.domain = DomainFMA
  50268. p.add(0, func(m *_Encoding, v []interface{}) {
  50269. m.emit(0xc4)
  50270. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  50271. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  50272. m.emit(0xbd)
  50273. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  50274. })
  50275. }
  50276. // VFNMADD231SS m32, xmm, xmm
  50277. if len(vv) == 0 && isM32(v0) && isXMM(v1) && isXMM(v2) {
  50278. self.require(ISA_FMA3)
  50279. p.domain = DomainFMA
  50280. p.add(0, func(m *_Encoding, v []interface{}) {
  50281. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  50282. m.emit(0xbd)
  50283. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  50284. })
  50285. }
  50286. // VFNMADD231SS m32, xmm, xmm{k}{z}
  50287. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  50288. self.require(ISA_AVX512F)
  50289. p.domain = DomainFMA
  50290. p.add(0, func(m *_Encoding, v []interface{}) {
  50291. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  50292. m.emit(0xbd)
  50293. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  50294. })
  50295. }
  50296. // VFNMADD231SS {er}, xmm, xmm, xmm{k}{z}
  50297. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  50298. self.require(ISA_AVX512F)
  50299. p.domain = DomainFMA
  50300. p.add(0, func(m *_Encoding, v []interface{}) {
  50301. m.emit(0x62)
  50302. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  50303. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  50304. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  50305. m.emit(0xbd)
  50306. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  50307. })
  50308. }
  50309. // VFNMADD231SS xmm, xmm, xmm{k}{z}
  50310. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  50311. self.require(ISA_AVX512F)
  50312. p.domain = DomainFMA
  50313. p.add(0, func(m *_Encoding, v []interface{}) {
  50314. m.emit(0x62)
  50315. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  50316. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  50317. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  50318. m.emit(0xbd)
  50319. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  50320. })
  50321. }
  50322. if p.len == 0 {
  50323. panic("invalid operands for VFNMADD231SS")
  50324. }
  50325. return p
  50326. }
  50327. // VFNMADDPD performs "Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values".
  50328. //
  50329. // Mnemonic : VFNMADDPD
  50330. // Supported forms : (6 forms)
  50331. //
  50332. // * VFNMADDPD xmm, xmm, xmm, xmm [FMA4]
  50333. // * VFNMADDPD m128, xmm, xmm, xmm [FMA4]
  50334. // * VFNMADDPD xmm, m128, xmm, xmm [FMA4]
  50335. // * VFNMADDPD ymm, ymm, ymm, ymm [FMA4]
  50336. // * VFNMADDPD m256, ymm, ymm, ymm [FMA4]
  50337. // * VFNMADDPD ymm, m256, ymm, ymm [FMA4]
  50338. //
  50339. func (self *Program) VFNMADDPD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  50340. p := self.alloc("VFNMADDPD", 4, Operands { v0, v1, v2, v3 })
  50341. // VFNMADDPD xmm, xmm, xmm, xmm
  50342. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  50343. self.require(ISA_FMA4)
  50344. p.domain = DomainFMA
  50345. p.add(0, func(m *_Encoding, v []interface{}) {
  50346. m.emit(0xc4)
  50347. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  50348. m.emit(0xf9 ^ (hlcode(v[2]) << 3))
  50349. m.emit(0x79)
  50350. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  50351. m.emit(hlcode(v[1]) << 4)
  50352. })
  50353. p.add(0, func(m *_Encoding, v []interface{}) {
  50354. m.emit(0xc4)
  50355. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  50356. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  50357. m.emit(0x79)
  50358. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  50359. m.emit(hlcode(v[0]) << 4)
  50360. })
  50361. }
  50362. // VFNMADDPD m128, xmm, xmm, xmm
  50363. if isM128(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  50364. self.require(ISA_FMA4)
  50365. p.domain = DomainFMA
  50366. p.add(0, func(m *_Encoding, v []interface{}) {
  50367. m.vex3(0xc4, 0b11, 0x81, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  50368. m.emit(0x79)
  50369. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  50370. m.emit(hlcode(v[1]) << 4)
  50371. })
  50372. }
  50373. // VFNMADDPD xmm, m128, xmm, xmm
  50374. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  50375. self.require(ISA_FMA4)
  50376. p.domain = DomainFMA
  50377. p.add(0, func(m *_Encoding, v []interface{}) {
  50378. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  50379. m.emit(0x79)
  50380. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  50381. m.emit(hlcode(v[0]) << 4)
  50382. })
  50383. }
  50384. // VFNMADDPD ymm, ymm, ymm, ymm
  50385. if isYMM(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  50386. self.require(ISA_FMA4)
  50387. p.domain = DomainFMA
  50388. p.add(0, func(m *_Encoding, v []interface{}) {
  50389. m.emit(0xc4)
  50390. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  50391. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  50392. m.emit(0x79)
  50393. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  50394. m.emit(hlcode(v[1]) << 4)
  50395. })
  50396. p.add(0, func(m *_Encoding, v []interface{}) {
  50397. m.emit(0xc4)
  50398. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  50399. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  50400. m.emit(0x79)
  50401. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  50402. m.emit(hlcode(v[0]) << 4)
  50403. })
  50404. }
  50405. // VFNMADDPD m256, ymm, ymm, ymm
  50406. if isM256(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  50407. self.require(ISA_FMA4)
  50408. p.domain = DomainFMA
  50409. p.add(0, func(m *_Encoding, v []interface{}) {
  50410. m.vex3(0xc4, 0b11, 0x85, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  50411. m.emit(0x79)
  50412. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  50413. m.emit(hlcode(v[1]) << 4)
  50414. })
  50415. }
  50416. // VFNMADDPD ymm, m256, ymm, ymm
  50417. if isYMM(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  50418. self.require(ISA_FMA4)
  50419. p.domain = DomainFMA
  50420. p.add(0, func(m *_Encoding, v []interface{}) {
  50421. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  50422. m.emit(0x79)
  50423. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  50424. m.emit(hlcode(v[0]) << 4)
  50425. })
  50426. }
  50427. if p.len == 0 {
  50428. panic("invalid operands for VFNMADDPD")
  50429. }
  50430. return p
  50431. }
  50432. // VFNMADDPS performs "Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values".
  50433. //
  50434. // Mnemonic : VFNMADDPS
  50435. // Supported forms : (6 forms)
  50436. //
  50437. // * VFNMADDPS xmm, xmm, xmm, xmm [FMA4]
  50438. // * VFNMADDPS m128, xmm, xmm, xmm [FMA4]
  50439. // * VFNMADDPS xmm, m128, xmm, xmm [FMA4]
  50440. // * VFNMADDPS ymm, ymm, ymm, ymm [FMA4]
  50441. // * VFNMADDPS m256, ymm, ymm, ymm [FMA4]
  50442. // * VFNMADDPS ymm, m256, ymm, ymm [FMA4]
  50443. //
  50444. func (self *Program) VFNMADDPS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  50445. p := self.alloc("VFNMADDPS", 4, Operands { v0, v1, v2, v3 })
  50446. // VFNMADDPS xmm, xmm, xmm, xmm
  50447. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  50448. self.require(ISA_FMA4)
  50449. p.domain = DomainFMA
  50450. p.add(0, func(m *_Encoding, v []interface{}) {
  50451. m.emit(0xc4)
  50452. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  50453. m.emit(0xf9 ^ (hlcode(v[2]) << 3))
  50454. m.emit(0x78)
  50455. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  50456. m.emit(hlcode(v[1]) << 4)
  50457. })
  50458. p.add(0, func(m *_Encoding, v []interface{}) {
  50459. m.emit(0xc4)
  50460. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  50461. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  50462. m.emit(0x78)
  50463. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  50464. m.emit(hlcode(v[0]) << 4)
  50465. })
  50466. }
  50467. // VFNMADDPS m128, xmm, xmm, xmm
  50468. if isM128(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  50469. self.require(ISA_FMA4)
  50470. p.domain = DomainFMA
  50471. p.add(0, func(m *_Encoding, v []interface{}) {
  50472. m.vex3(0xc4, 0b11, 0x81, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  50473. m.emit(0x78)
  50474. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  50475. m.emit(hlcode(v[1]) << 4)
  50476. })
  50477. }
  50478. // VFNMADDPS xmm, m128, xmm, xmm
  50479. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  50480. self.require(ISA_FMA4)
  50481. p.domain = DomainFMA
  50482. p.add(0, func(m *_Encoding, v []interface{}) {
  50483. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  50484. m.emit(0x78)
  50485. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  50486. m.emit(hlcode(v[0]) << 4)
  50487. })
  50488. }
  50489. // VFNMADDPS ymm, ymm, ymm, ymm
  50490. if isYMM(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  50491. self.require(ISA_FMA4)
  50492. p.domain = DomainFMA
  50493. p.add(0, func(m *_Encoding, v []interface{}) {
  50494. m.emit(0xc4)
  50495. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  50496. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  50497. m.emit(0x78)
  50498. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  50499. m.emit(hlcode(v[1]) << 4)
  50500. })
  50501. p.add(0, func(m *_Encoding, v []interface{}) {
  50502. m.emit(0xc4)
  50503. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  50504. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  50505. m.emit(0x78)
  50506. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  50507. m.emit(hlcode(v[0]) << 4)
  50508. })
  50509. }
  50510. // VFNMADDPS m256, ymm, ymm, ymm
  50511. if isM256(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  50512. self.require(ISA_FMA4)
  50513. p.domain = DomainFMA
  50514. p.add(0, func(m *_Encoding, v []interface{}) {
  50515. m.vex3(0xc4, 0b11, 0x85, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  50516. m.emit(0x78)
  50517. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  50518. m.emit(hlcode(v[1]) << 4)
  50519. })
  50520. }
  50521. // VFNMADDPS ymm, m256, ymm, ymm
  50522. if isYMM(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  50523. self.require(ISA_FMA4)
  50524. p.domain = DomainFMA
  50525. p.add(0, func(m *_Encoding, v []interface{}) {
  50526. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  50527. m.emit(0x78)
  50528. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  50529. m.emit(hlcode(v[0]) << 4)
  50530. })
  50531. }
  50532. if p.len == 0 {
  50533. panic("invalid operands for VFNMADDPS")
  50534. }
  50535. return p
  50536. }
  50537. // VFNMADDSD performs "Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values".
  50538. //
  50539. // Mnemonic : VFNMADDSD
  50540. // Supported forms : (3 forms)
  50541. //
  50542. // * VFNMADDSD xmm, xmm, xmm, xmm [FMA4]
  50543. // * VFNMADDSD m64, xmm, xmm, xmm [FMA4]
  50544. // * VFNMADDSD xmm, m64, xmm, xmm [FMA4]
  50545. //
  50546. func (self *Program) VFNMADDSD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  50547. p := self.alloc("VFNMADDSD", 4, Operands { v0, v1, v2, v3 })
  50548. // VFNMADDSD xmm, xmm, xmm, xmm
  50549. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  50550. self.require(ISA_FMA4)
  50551. p.domain = DomainFMA
  50552. p.add(0, func(m *_Encoding, v []interface{}) {
  50553. m.emit(0xc4)
  50554. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  50555. m.emit(0xf9 ^ (hlcode(v[2]) << 3))
  50556. m.emit(0x7b)
  50557. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  50558. m.emit(hlcode(v[1]) << 4)
  50559. })
  50560. p.add(0, func(m *_Encoding, v []interface{}) {
  50561. m.emit(0xc4)
  50562. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  50563. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  50564. m.emit(0x7b)
  50565. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  50566. m.emit(hlcode(v[0]) << 4)
  50567. })
  50568. }
  50569. // VFNMADDSD m64, xmm, xmm, xmm
  50570. if isM64(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  50571. self.require(ISA_FMA4)
  50572. p.domain = DomainFMA
  50573. p.add(0, func(m *_Encoding, v []interface{}) {
  50574. m.vex3(0xc4, 0b11, 0x81, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  50575. m.emit(0x7b)
  50576. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  50577. m.emit(hlcode(v[1]) << 4)
  50578. })
  50579. }
  50580. // VFNMADDSD xmm, m64, xmm, xmm
  50581. if isXMM(v0) && isM64(v1) && isXMM(v2) && isXMM(v3) {
  50582. self.require(ISA_FMA4)
  50583. p.domain = DomainFMA
  50584. p.add(0, func(m *_Encoding, v []interface{}) {
  50585. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  50586. m.emit(0x7b)
  50587. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  50588. m.emit(hlcode(v[0]) << 4)
  50589. })
  50590. }
  50591. if p.len == 0 {
  50592. panic("invalid operands for VFNMADDSD")
  50593. }
  50594. return p
  50595. }
  50596. // VFNMADDSS performs "Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values".
  50597. //
  50598. // Mnemonic : VFNMADDSS
  50599. // Supported forms : (3 forms)
  50600. //
  50601. // * VFNMADDSS xmm, xmm, xmm, xmm [FMA4]
  50602. // * VFNMADDSS m32, xmm, xmm, xmm [FMA4]
  50603. // * VFNMADDSS xmm, m32, xmm, xmm [FMA4]
  50604. //
  50605. func (self *Program) VFNMADDSS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  50606. p := self.alloc("VFNMADDSS", 4, Operands { v0, v1, v2, v3 })
  50607. // VFNMADDSS xmm, xmm, xmm, xmm
  50608. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  50609. self.require(ISA_FMA4)
  50610. p.domain = DomainFMA
  50611. p.add(0, func(m *_Encoding, v []interface{}) {
  50612. m.emit(0xc4)
  50613. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  50614. m.emit(0xf9 ^ (hlcode(v[2]) << 3))
  50615. m.emit(0x7a)
  50616. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  50617. m.emit(hlcode(v[1]) << 4)
  50618. })
  50619. p.add(0, func(m *_Encoding, v []interface{}) {
  50620. m.emit(0xc4)
  50621. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  50622. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  50623. m.emit(0x7a)
  50624. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  50625. m.emit(hlcode(v[0]) << 4)
  50626. })
  50627. }
  50628. // VFNMADDSS m32, xmm, xmm, xmm
  50629. if isM32(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  50630. self.require(ISA_FMA4)
  50631. p.domain = DomainFMA
  50632. p.add(0, func(m *_Encoding, v []interface{}) {
  50633. m.vex3(0xc4, 0b11, 0x81, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  50634. m.emit(0x7a)
  50635. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  50636. m.emit(hlcode(v[1]) << 4)
  50637. })
  50638. }
  50639. // VFNMADDSS xmm, m32, xmm, xmm
  50640. if isXMM(v0) && isM32(v1) && isXMM(v2) && isXMM(v3) {
  50641. self.require(ISA_FMA4)
  50642. p.domain = DomainFMA
  50643. p.add(0, func(m *_Encoding, v []interface{}) {
  50644. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  50645. m.emit(0x7a)
  50646. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  50647. m.emit(hlcode(v[0]) << 4)
  50648. })
  50649. }
  50650. if p.len == 0 {
  50651. panic("invalid operands for VFNMADDSS")
  50652. }
  50653. return p
  50654. }
  50655. // VFNMSUB132PD performs "Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values".
  50656. //
  50657. // Mnemonic : VFNMSUB132PD
  50658. // Supported forms : (11 forms)
  50659. //
  50660. // * VFNMSUB132PD xmm, xmm, xmm [FMA3]
  50661. // * VFNMSUB132PD m128, xmm, xmm [FMA3]
  50662. // * VFNMSUB132PD ymm, ymm, ymm [FMA3]
  50663. // * VFNMSUB132PD m256, ymm, ymm [FMA3]
  50664. // * VFNMSUB132PD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  50665. // * VFNMSUB132PD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  50666. // * VFNMSUB132PD zmm, zmm, zmm{k}{z} [AVX512F]
  50667. // * VFNMSUB132PD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  50668. // * VFNMSUB132PD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  50669. // * VFNMSUB132PD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  50670. // * VFNMSUB132PD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  50671. //
  50672. func (self *Program) VFNMSUB132PD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  50673. var p *Instruction
  50674. switch len(vv) {
  50675. case 0 : p = self.alloc("VFNMSUB132PD", 3, Operands { v0, v1, v2 })
  50676. case 1 : p = self.alloc("VFNMSUB132PD", 4, Operands { v0, v1, v2, vv[0] })
  50677. default : panic("instruction VFNMSUB132PD takes 3 or 4 operands")
  50678. }
  50679. // VFNMSUB132PD xmm, xmm, xmm
  50680. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  50681. self.require(ISA_FMA3)
  50682. p.domain = DomainFMA
  50683. p.add(0, func(m *_Encoding, v []interface{}) {
  50684. m.emit(0xc4)
  50685. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  50686. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  50687. m.emit(0x9e)
  50688. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  50689. })
  50690. }
  50691. // VFNMSUB132PD m128, xmm, xmm
  50692. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  50693. self.require(ISA_FMA3)
  50694. p.domain = DomainFMA
  50695. p.add(0, func(m *_Encoding, v []interface{}) {
  50696. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  50697. m.emit(0x9e)
  50698. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  50699. })
  50700. }
  50701. // VFNMSUB132PD ymm, ymm, ymm
  50702. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  50703. self.require(ISA_FMA3)
  50704. p.domain = DomainFMA
  50705. p.add(0, func(m *_Encoding, v []interface{}) {
  50706. m.emit(0xc4)
  50707. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  50708. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  50709. m.emit(0x9e)
  50710. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  50711. })
  50712. }
  50713. // VFNMSUB132PD m256, ymm, ymm
  50714. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  50715. self.require(ISA_FMA3)
  50716. p.domain = DomainFMA
  50717. p.add(0, func(m *_Encoding, v []interface{}) {
  50718. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  50719. m.emit(0x9e)
  50720. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  50721. })
  50722. }
  50723. // VFNMSUB132PD m512/m64bcst, zmm, zmm{k}{z}
  50724. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  50725. self.require(ISA_AVX512F)
  50726. p.domain = DomainFMA
  50727. p.add(0, func(m *_Encoding, v []interface{}) {
  50728. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  50729. m.emit(0x9e)
  50730. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  50731. })
  50732. }
  50733. // VFNMSUB132PD {er}, zmm, zmm, zmm{k}{z}
  50734. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  50735. self.require(ISA_AVX512F)
  50736. p.domain = DomainFMA
  50737. p.add(0, func(m *_Encoding, v []interface{}) {
  50738. m.emit(0x62)
  50739. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  50740. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  50741. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  50742. m.emit(0x9e)
  50743. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  50744. })
  50745. }
  50746. // VFNMSUB132PD zmm, zmm, zmm{k}{z}
  50747. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  50748. self.require(ISA_AVX512F)
  50749. p.domain = DomainFMA
  50750. p.add(0, func(m *_Encoding, v []interface{}) {
  50751. m.emit(0x62)
  50752. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  50753. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  50754. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  50755. m.emit(0x9e)
  50756. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  50757. })
  50758. }
  50759. // VFNMSUB132PD m128/m64bcst, xmm, xmm{k}{z}
  50760. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  50761. self.require(ISA_AVX512VL | ISA_AVX512F)
  50762. p.domain = DomainFMA
  50763. p.add(0, func(m *_Encoding, v []interface{}) {
  50764. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  50765. m.emit(0x9e)
  50766. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  50767. })
  50768. }
  50769. // VFNMSUB132PD xmm, xmm, xmm{k}{z}
  50770. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  50771. self.require(ISA_AVX512VL | ISA_AVX512F)
  50772. p.domain = DomainFMA
  50773. p.add(0, func(m *_Encoding, v []interface{}) {
  50774. m.emit(0x62)
  50775. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  50776. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  50777. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  50778. m.emit(0x9e)
  50779. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  50780. })
  50781. }
  50782. // VFNMSUB132PD m256/m64bcst, ymm, ymm{k}{z}
  50783. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  50784. self.require(ISA_AVX512VL | ISA_AVX512F)
  50785. p.domain = DomainFMA
  50786. p.add(0, func(m *_Encoding, v []interface{}) {
  50787. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  50788. m.emit(0x9e)
  50789. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  50790. })
  50791. }
  50792. // VFNMSUB132PD ymm, ymm, ymm{k}{z}
  50793. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  50794. self.require(ISA_AVX512VL | ISA_AVX512F)
  50795. p.domain = DomainFMA
  50796. p.add(0, func(m *_Encoding, v []interface{}) {
  50797. m.emit(0x62)
  50798. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  50799. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  50800. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  50801. m.emit(0x9e)
  50802. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  50803. })
  50804. }
  50805. if p.len == 0 {
  50806. panic("invalid operands for VFNMSUB132PD")
  50807. }
  50808. return p
  50809. }
  50810. // VFNMSUB132PS performs "Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values".
  50811. //
  50812. // Mnemonic : VFNMSUB132PS
  50813. // Supported forms : (11 forms)
  50814. //
  50815. // * VFNMSUB132PS xmm, xmm, xmm [FMA3]
  50816. // * VFNMSUB132PS m128, xmm, xmm [FMA3]
  50817. // * VFNMSUB132PS ymm, ymm, ymm [FMA3]
  50818. // * VFNMSUB132PS m256, ymm, ymm [FMA3]
  50819. // * VFNMSUB132PS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  50820. // * VFNMSUB132PS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  50821. // * VFNMSUB132PS zmm, zmm, zmm{k}{z} [AVX512F]
  50822. // * VFNMSUB132PS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  50823. // * VFNMSUB132PS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  50824. // * VFNMSUB132PS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  50825. // * VFNMSUB132PS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  50826. //
  50827. func (self *Program) VFNMSUB132PS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  50828. var p *Instruction
  50829. switch len(vv) {
  50830. case 0 : p = self.alloc("VFNMSUB132PS", 3, Operands { v0, v1, v2 })
  50831. case 1 : p = self.alloc("VFNMSUB132PS", 4, Operands { v0, v1, v2, vv[0] })
  50832. default : panic("instruction VFNMSUB132PS takes 3 or 4 operands")
  50833. }
  50834. // VFNMSUB132PS xmm, xmm, xmm
  50835. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  50836. self.require(ISA_FMA3)
  50837. p.domain = DomainFMA
  50838. p.add(0, func(m *_Encoding, v []interface{}) {
  50839. m.emit(0xc4)
  50840. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  50841. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  50842. m.emit(0x9e)
  50843. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  50844. })
  50845. }
  50846. // VFNMSUB132PS m128, xmm, xmm
  50847. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  50848. self.require(ISA_FMA3)
  50849. p.domain = DomainFMA
  50850. p.add(0, func(m *_Encoding, v []interface{}) {
  50851. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  50852. m.emit(0x9e)
  50853. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  50854. })
  50855. }
  50856. // VFNMSUB132PS ymm, ymm, ymm
  50857. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  50858. self.require(ISA_FMA3)
  50859. p.domain = DomainFMA
  50860. p.add(0, func(m *_Encoding, v []interface{}) {
  50861. m.emit(0xc4)
  50862. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  50863. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  50864. m.emit(0x9e)
  50865. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  50866. })
  50867. }
  50868. // VFNMSUB132PS m256, ymm, ymm
  50869. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  50870. self.require(ISA_FMA3)
  50871. p.domain = DomainFMA
  50872. p.add(0, func(m *_Encoding, v []interface{}) {
  50873. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  50874. m.emit(0x9e)
  50875. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  50876. })
  50877. }
  50878. // VFNMSUB132PS m512/m32bcst, zmm, zmm{k}{z}
  50879. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  50880. self.require(ISA_AVX512F)
  50881. p.domain = DomainFMA
  50882. p.add(0, func(m *_Encoding, v []interface{}) {
  50883. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  50884. m.emit(0x9e)
  50885. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  50886. })
  50887. }
  50888. // VFNMSUB132PS {er}, zmm, zmm, zmm{k}{z}
  50889. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  50890. self.require(ISA_AVX512F)
  50891. p.domain = DomainFMA
  50892. p.add(0, func(m *_Encoding, v []interface{}) {
  50893. m.emit(0x62)
  50894. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  50895. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  50896. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  50897. m.emit(0x9e)
  50898. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  50899. })
  50900. }
  50901. // VFNMSUB132PS zmm, zmm, zmm{k}{z}
  50902. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  50903. self.require(ISA_AVX512F)
  50904. p.domain = DomainFMA
  50905. p.add(0, func(m *_Encoding, v []interface{}) {
  50906. m.emit(0x62)
  50907. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  50908. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  50909. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  50910. m.emit(0x9e)
  50911. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  50912. })
  50913. }
  50914. // VFNMSUB132PS m128/m32bcst, xmm, xmm{k}{z}
  50915. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  50916. self.require(ISA_AVX512VL | ISA_AVX512F)
  50917. p.domain = DomainFMA
  50918. p.add(0, func(m *_Encoding, v []interface{}) {
  50919. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  50920. m.emit(0x9e)
  50921. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  50922. })
  50923. }
  50924. // VFNMSUB132PS xmm, xmm, xmm{k}{z}
  50925. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  50926. self.require(ISA_AVX512VL | ISA_AVX512F)
  50927. p.domain = DomainFMA
  50928. p.add(0, func(m *_Encoding, v []interface{}) {
  50929. m.emit(0x62)
  50930. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  50931. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  50932. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  50933. m.emit(0x9e)
  50934. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  50935. })
  50936. }
  50937. // VFNMSUB132PS m256/m32bcst, ymm, ymm{k}{z}
  50938. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  50939. self.require(ISA_AVX512VL | ISA_AVX512F)
  50940. p.domain = DomainFMA
  50941. p.add(0, func(m *_Encoding, v []interface{}) {
  50942. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  50943. m.emit(0x9e)
  50944. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  50945. })
  50946. }
  50947. // VFNMSUB132PS ymm, ymm, ymm{k}{z}
  50948. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  50949. self.require(ISA_AVX512VL | ISA_AVX512F)
  50950. p.domain = DomainFMA
  50951. p.add(0, func(m *_Encoding, v []interface{}) {
  50952. m.emit(0x62)
  50953. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  50954. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  50955. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  50956. m.emit(0x9e)
  50957. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  50958. })
  50959. }
  50960. if p.len == 0 {
  50961. panic("invalid operands for VFNMSUB132PS")
  50962. }
  50963. return p
  50964. }
  50965. // VFNMSUB132SD performs "Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values".
  50966. //
  50967. // Mnemonic : VFNMSUB132SD
  50968. // Supported forms : (5 forms)
  50969. //
  50970. // * VFNMSUB132SD xmm, xmm, xmm [FMA3]
  50971. // * VFNMSUB132SD m64, xmm, xmm [FMA3]
  50972. // * VFNMSUB132SD m64, xmm, xmm{k}{z} [AVX512F]
  50973. // * VFNMSUB132SD {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  50974. // * VFNMSUB132SD xmm, xmm, xmm{k}{z} [AVX512F]
  50975. //
  50976. func (self *Program) VFNMSUB132SD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  50977. var p *Instruction
  50978. switch len(vv) {
  50979. case 0 : p = self.alloc("VFNMSUB132SD", 3, Operands { v0, v1, v2 })
  50980. case 1 : p = self.alloc("VFNMSUB132SD", 4, Operands { v0, v1, v2, vv[0] })
  50981. default : panic("instruction VFNMSUB132SD takes 3 or 4 operands")
  50982. }
  50983. // VFNMSUB132SD xmm, xmm, xmm
  50984. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  50985. self.require(ISA_FMA3)
  50986. p.domain = DomainFMA
  50987. p.add(0, func(m *_Encoding, v []interface{}) {
  50988. m.emit(0xc4)
  50989. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  50990. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  50991. m.emit(0x9f)
  50992. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  50993. })
  50994. }
  50995. // VFNMSUB132SD m64, xmm, xmm
  50996. if len(vv) == 0 && isM64(v0) && isXMM(v1) && isXMM(v2) {
  50997. self.require(ISA_FMA3)
  50998. p.domain = DomainFMA
  50999. p.add(0, func(m *_Encoding, v []interface{}) {
  51000. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  51001. m.emit(0x9f)
  51002. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  51003. })
  51004. }
  51005. // VFNMSUB132SD m64, xmm, xmm{k}{z}
  51006. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  51007. self.require(ISA_AVX512F)
  51008. p.domain = DomainFMA
  51009. p.add(0, func(m *_Encoding, v []interface{}) {
  51010. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  51011. m.emit(0x9f)
  51012. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  51013. })
  51014. }
  51015. // VFNMSUB132SD {er}, xmm, xmm, xmm{k}{z}
  51016. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  51017. self.require(ISA_AVX512F)
  51018. p.domain = DomainFMA
  51019. p.add(0, func(m *_Encoding, v []interface{}) {
  51020. m.emit(0x62)
  51021. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  51022. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  51023. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  51024. m.emit(0x9f)
  51025. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  51026. })
  51027. }
  51028. // VFNMSUB132SD xmm, xmm, xmm{k}{z}
  51029. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  51030. self.require(ISA_AVX512F)
  51031. p.domain = DomainFMA
  51032. p.add(0, func(m *_Encoding, v []interface{}) {
  51033. m.emit(0x62)
  51034. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  51035. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  51036. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  51037. m.emit(0x9f)
  51038. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51039. })
  51040. }
  51041. if p.len == 0 {
  51042. panic("invalid operands for VFNMSUB132SD")
  51043. }
  51044. return p
  51045. }
  51046. // VFNMSUB132SS performs "Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values".
  51047. //
  51048. // Mnemonic : VFNMSUB132SS
  51049. // Supported forms : (5 forms)
  51050. //
  51051. // * VFNMSUB132SS xmm, xmm, xmm [FMA3]
  51052. // * VFNMSUB132SS m32, xmm, xmm [FMA3]
  51053. // * VFNMSUB132SS m32, xmm, xmm{k}{z} [AVX512F]
  51054. // * VFNMSUB132SS {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  51055. // * VFNMSUB132SS xmm, xmm, xmm{k}{z} [AVX512F]
  51056. //
  51057. func (self *Program) VFNMSUB132SS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  51058. var p *Instruction
  51059. switch len(vv) {
  51060. case 0 : p = self.alloc("VFNMSUB132SS", 3, Operands { v0, v1, v2 })
  51061. case 1 : p = self.alloc("VFNMSUB132SS", 4, Operands { v0, v1, v2, vv[0] })
  51062. default : panic("instruction VFNMSUB132SS takes 3 or 4 operands")
  51063. }
  51064. // VFNMSUB132SS xmm, xmm, xmm
  51065. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  51066. self.require(ISA_FMA3)
  51067. p.domain = DomainFMA
  51068. p.add(0, func(m *_Encoding, v []interface{}) {
  51069. m.emit(0xc4)
  51070. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  51071. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  51072. m.emit(0x9f)
  51073. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51074. })
  51075. }
  51076. // VFNMSUB132SS m32, xmm, xmm
  51077. if len(vv) == 0 && isM32(v0) && isXMM(v1) && isXMM(v2) {
  51078. self.require(ISA_FMA3)
  51079. p.domain = DomainFMA
  51080. p.add(0, func(m *_Encoding, v []interface{}) {
  51081. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  51082. m.emit(0x9f)
  51083. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  51084. })
  51085. }
  51086. // VFNMSUB132SS m32, xmm, xmm{k}{z}
  51087. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  51088. self.require(ISA_AVX512F)
  51089. p.domain = DomainFMA
  51090. p.add(0, func(m *_Encoding, v []interface{}) {
  51091. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  51092. m.emit(0x9f)
  51093. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  51094. })
  51095. }
  51096. // VFNMSUB132SS {er}, xmm, xmm, xmm{k}{z}
  51097. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  51098. self.require(ISA_AVX512F)
  51099. p.domain = DomainFMA
  51100. p.add(0, func(m *_Encoding, v []interface{}) {
  51101. m.emit(0x62)
  51102. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  51103. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  51104. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  51105. m.emit(0x9f)
  51106. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  51107. })
  51108. }
  51109. // VFNMSUB132SS xmm, xmm, xmm{k}{z}
  51110. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  51111. self.require(ISA_AVX512F)
  51112. p.domain = DomainFMA
  51113. p.add(0, func(m *_Encoding, v []interface{}) {
  51114. m.emit(0x62)
  51115. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  51116. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  51117. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  51118. m.emit(0x9f)
  51119. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51120. })
  51121. }
  51122. if p.len == 0 {
  51123. panic("invalid operands for VFNMSUB132SS")
  51124. }
  51125. return p
  51126. }
  51127. // VFNMSUB213PD performs "Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values".
  51128. //
  51129. // Mnemonic : VFNMSUB213PD
  51130. // Supported forms : (11 forms)
  51131. //
  51132. // * VFNMSUB213PD xmm, xmm, xmm [FMA3]
  51133. // * VFNMSUB213PD m128, xmm, xmm [FMA3]
  51134. // * VFNMSUB213PD ymm, ymm, ymm [FMA3]
  51135. // * VFNMSUB213PD m256, ymm, ymm [FMA3]
  51136. // * VFNMSUB213PD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  51137. // * VFNMSUB213PD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  51138. // * VFNMSUB213PD zmm, zmm, zmm{k}{z} [AVX512F]
  51139. // * VFNMSUB213PD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  51140. // * VFNMSUB213PD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  51141. // * VFNMSUB213PD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  51142. // * VFNMSUB213PD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  51143. //
  51144. func (self *Program) VFNMSUB213PD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  51145. var p *Instruction
  51146. switch len(vv) {
  51147. case 0 : p = self.alloc("VFNMSUB213PD", 3, Operands { v0, v1, v2 })
  51148. case 1 : p = self.alloc("VFNMSUB213PD", 4, Operands { v0, v1, v2, vv[0] })
  51149. default : panic("instruction VFNMSUB213PD takes 3 or 4 operands")
  51150. }
  51151. // VFNMSUB213PD xmm, xmm, xmm
  51152. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  51153. self.require(ISA_FMA3)
  51154. p.domain = DomainFMA
  51155. p.add(0, func(m *_Encoding, v []interface{}) {
  51156. m.emit(0xc4)
  51157. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  51158. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  51159. m.emit(0xae)
  51160. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51161. })
  51162. }
  51163. // VFNMSUB213PD m128, xmm, xmm
  51164. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  51165. self.require(ISA_FMA3)
  51166. p.domain = DomainFMA
  51167. p.add(0, func(m *_Encoding, v []interface{}) {
  51168. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  51169. m.emit(0xae)
  51170. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  51171. })
  51172. }
  51173. // VFNMSUB213PD ymm, ymm, ymm
  51174. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  51175. self.require(ISA_FMA3)
  51176. p.domain = DomainFMA
  51177. p.add(0, func(m *_Encoding, v []interface{}) {
  51178. m.emit(0xc4)
  51179. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  51180. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  51181. m.emit(0xae)
  51182. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51183. })
  51184. }
  51185. // VFNMSUB213PD m256, ymm, ymm
  51186. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  51187. self.require(ISA_FMA3)
  51188. p.domain = DomainFMA
  51189. p.add(0, func(m *_Encoding, v []interface{}) {
  51190. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  51191. m.emit(0xae)
  51192. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  51193. })
  51194. }
  51195. // VFNMSUB213PD m512/m64bcst, zmm, zmm{k}{z}
  51196. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  51197. self.require(ISA_AVX512F)
  51198. p.domain = DomainFMA
  51199. p.add(0, func(m *_Encoding, v []interface{}) {
  51200. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  51201. m.emit(0xae)
  51202. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  51203. })
  51204. }
  51205. // VFNMSUB213PD {er}, zmm, zmm, zmm{k}{z}
  51206. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  51207. self.require(ISA_AVX512F)
  51208. p.domain = DomainFMA
  51209. p.add(0, func(m *_Encoding, v []interface{}) {
  51210. m.emit(0x62)
  51211. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  51212. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  51213. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  51214. m.emit(0xae)
  51215. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  51216. })
  51217. }
  51218. // VFNMSUB213PD zmm, zmm, zmm{k}{z}
  51219. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  51220. self.require(ISA_AVX512F)
  51221. p.domain = DomainFMA
  51222. p.add(0, func(m *_Encoding, v []interface{}) {
  51223. m.emit(0x62)
  51224. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  51225. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  51226. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  51227. m.emit(0xae)
  51228. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51229. })
  51230. }
  51231. // VFNMSUB213PD m128/m64bcst, xmm, xmm{k}{z}
  51232. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  51233. self.require(ISA_AVX512VL | ISA_AVX512F)
  51234. p.domain = DomainFMA
  51235. p.add(0, func(m *_Encoding, v []interface{}) {
  51236. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  51237. m.emit(0xae)
  51238. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  51239. })
  51240. }
  51241. // VFNMSUB213PD xmm, xmm, xmm{k}{z}
  51242. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  51243. self.require(ISA_AVX512VL | ISA_AVX512F)
  51244. p.domain = DomainFMA
  51245. p.add(0, func(m *_Encoding, v []interface{}) {
  51246. m.emit(0x62)
  51247. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  51248. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  51249. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  51250. m.emit(0xae)
  51251. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51252. })
  51253. }
  51254. // VFNMSUB213PD m256/m64bcst, ymm, ymm{k}{z}
  51255. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  51256. self.require(ISA_AVX512VL | ISA_AVX512F)
  51257. p.domain = DomainFMA
  51258. p.add(0, func(m *_Encoding, v []interface{}) {
  51259. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  51260. m.emit(0xae)
  51261. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  51262. })
  51263. }
  51264. // VFNMSUB213PD ymm, ymm, ymm{k}{z}
  51265. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  51266. self.require(ISA_AVX512VL | ISA_AVX512F)
  51267. p.domain = DomainFMA
  51268. p.add(0, func(m *_Encoding, v []interface{}) {
  51269. m.emit(0x62)
  51270. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  51271. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  51272. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  51273. m.emit(0xae)
  51274. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51275. })
  51276. }
  51277. if p.len == 0 {
  51278. panic("invalid operands for VFNMSUB213PD")
  51279. }
  51280. return p
  51281. }
  51282. // VFNMSUB213PS performs "Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values".
  51283. //
  51284. // Mnemonic : VFNMSUB213PS
  51285. // Supported forms : (11 forms)
  51286. //
  51287. // * VFNMSUB213PS xmm, xmm, xmm [FMA3]
  51288. // * VFNMSUB213PS m128, xmm, xmm [FMA3]
  51289. // * VFNMSUB213PS ymm, ymm, ymm [FMA3]
  51290. // * VFNMSUB213PS m256, ymm, ymm [FMA3]
  51291. // * VFNMSUB213PS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  51292. // * VFNMSUB213PS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  51293. // * VFNMSUB213PS zmm, zmm, zmm{k}{z} [AVX512F]
  51294. // * VFNMSUB213PS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  51295. // * VFNMSUB213PS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  51296. // * VFNMSUB213PS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  51297. // * VFNMSUB213PS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  51298. //
  51299. func (self *Program) VFNMSUB213PS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  51300. var p *Instruction
  51301. switch len(vv) {
  51302. case 0 : p = self.alloc("VFNMSUB213PS", 3, Operands { v0, v1, v2 })
  51303. case 1 : p = self.alloc("VFNMSUB213PS", 4, Operands { v0, v1, v2, vv[0] })
  51304. default : panic("instruction VFNMSUB213PS takes 3 or 4 operands")
  51305. }
  51306. // VFNMSUB213PS xmm, xmm, xmm
  51307. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  51308. self.require(ISA_FMA3)
  51309. p.domain = DomainFMA
  51310. p.add(0, func(m *_Encoding, v []interface{}) {
  51311. m.emit(0xc4)
  51312. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  51313. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  51314. m.emit(0xae)
  51315. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51316. })
  51317. }
  51318. // VFNMSUB213PS m128, xmm, xmm
  51319. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  51320. self.require(ISA_FMA3)
  51321. p.domain = DomainFMA
  51322. p.add(0, func(m *_Encoding, v []interface{}) {
  51323. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  51324. m.emit(0xae)
  51325. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  51326. })
  51327. }
  51328. // VFNMSUB213PS ymm, ymm, ymm
  51329. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  51330. self.require(ISA_FMA3)
  51331. p.domain = DomainFMA
  51332. p.add(0, func(m *_Encoding, v []interface{}) {
  51333. m.emit(0xc4)
  51334. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  51335. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  51336. m.emit(0xae)
  51337. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51338. })
  51339. }
  51340. // VFNMSUB213PS m256, ymm, ymm
  51341. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  51342. self.require(ISA_FMA3)
  51343. p.domain = DomainFMA
  51344. p.add(0, func(m *_Encoding, v []interface{}) {
  51345. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  51346. m.emit(0xae)
  51347. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  51348. })
  51349. }
  51350. // VFNMSUB213PS m512/m32bcst, zmm, zmm{k}{z}
  51351. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  51352. self.require(ISA_AVX512F)
  51353. p.domain = DomainFMA
  51354. p.add(0, func(m *_Encoding, v []interface{}) {
  51355. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  51356. m.emit(0xae)
  51357. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  51358. })
  51359. }
  51360. // VFNMSUB213PS {er}, zmm, zmm, zmm{k}{z}
  51361. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  51362. self.require(ISA_AVX512F)
  51363. p.domain = DomainFMA
  51364. p.add(0, func(m *_Encoding, v []interface{}) {
  51365. m.emit(0x62)
  51366. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  51367. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  51368. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  51369. m.emit(0xae)
  51370. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  51371. })
  51372. }
  51373. // VFNMSUB213PS zmm, zmm, zmm{k}{z}
  51374. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  51375. self.require(ISA_AVX512F)
  51376. p.domain = DomainFMA
  51377. p.add(0, func(m *_Encoding, v []interface{}) {
  51378. m.emit(0x62)
  51379. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  51380. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  51381. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  51382. m.emit(0xae)
  51383. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51384. })
  51385. }
  51386. // VFNMSUB213PS m128/m32bcst, xmm, xmm{k}{z}
  51387. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  51388. self.require(ISA_AVX512VL | ISA_AVX512F)
  51389. p.domain = DomainFMA
  51390. p.add(0, func(m *_Encoding, v []interface{}) {
  51391. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  51392. m.emit(0xae)
  51393. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  51394. })
  51395. }
  51396. // VFNMSUB213PS xmm, xmm, xmm{k}{z}
  51397. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  51398. self.require(ISA_AVX512VL | ISA_AVX512F)
  51399. p.domain = DomainFMA
  51400. p.add(0, func(m *_Encoding, v []interface{}) {
  51401. m.emit(0x62)
  51402. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  51403. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  51404. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  51405. m.emit(0xae)
  51406. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51407. })
  51408. }
  51409. // VFNMSUB213PS m256/m32bcst, ymm, ymm{k}{z}
  51410. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  51411. self.require(ISA_AVX512VL | ISA_AVX512F)
  51412. p.domain = DomainFMA
  51413. p.add(0, func(m *_Encoding, v []interface{}) {
  51414. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  51415. m.emit(0xae)
  51416. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  51417. })
  51418. }
  51419. // VFNMSUB213PS ymm, ymm, ymm{k}{z}
  51420. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  51421. self.require(ISA_AVX512VL | ISA_AVX512F)
  51422. p.domain = DomainFMA
  51423. p.add(0, func(m *_Encoding, v []interface{}) {
  51424. m.emit(0x62)
  51425. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  51426. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  51427. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  51428. m.emit(0xae)
  51429. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51430. })
  51431. }
  51432. if p.len == 0 {
  51433. panic("invalid operands for VFNMSUB213PS")
  51434. }
  51435. return p
  51436. }
  51437. // VFNMSUB213SD performs "Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values".
  51438. //
  51439. // Mnemonic : VFNMSUB213SD
  51440. // Supported forms : (5 forms)
  51441. //
  51442. // * VFNMSUB213SD xmm, xmm, xmm [FMA3]
  51443. // * VFNMSUB213SD m64, xmm, xmm [FMA3]
  51444. // * VFNMSUB213SD m64, xmm, xmm{k}{z} [AVX512F]
  51445. // * VFNMSUB213SD {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  51446. // * VFNMSUB213SD xmm, xmm, xmm{k}{z} [AVX512F]
  51447. //
  51448. func (self *Program) VFNMSUB213SD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  51449. var p *Instruction
  51450. switch len(vv) {
  51451. case 0 : p = self.alloc("VFNMSUB213SD", 3, Operands { v0, v1, v2 })
  51452. case 1 : p = self.alloc("VFNMSUB213SD", 4, Operands { v0, v1, v2, vv[0] })
  51453. default : panic("instruction VFNMSUB213SD takes 3 or 4 operands")
  51454. }
  51455. // VFNMSUB213SD xmm, xmm, xmm
  51456. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  51457. self.require(ISA_FMA3)
  51458. p.domain = DomainFMA
  51459. p.add(0, func(m *_Encoding, v []interface{}) {
  51460. m.emit(0xc4)
  51461. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  51462. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  51463. m.emit(0xaf)
  51464. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51465. })
  51466. }
  51467. // VFNMSUB213SD m64, xmm, xmm
  51468. if len(vv) == 0 && isM64(v0) && isXMM(v1) && isXMM(v2) {
  51469. self.require(ISA_FMA3)
  51470. p.domain = DomainFMA
  51471. p.add(0, func(m *_Encoding, v []interface{}) {
  51472. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  51473. m.emit(0xaf)
  51474. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  51475. })
  51476. }
  51477. // VFNMSUB213SD m64, xmm, xmm{k}{z}
  51478. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  51479. self.require(ISA_AVX512F)
  51480. p.domain = DomainFMA
  51481. p.add(0, func(m *_Encoding, v []interface{}) {
  51482. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  51483. m.emit(0xaf)
  51484. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  51485. })
  51486. }
  51487. // VFNMSUB213SD {er}, xmm, xmm, xmm{k}{z}
  51488. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  51489. self.require(ISA_AVX512F)
  51490. p.domain = DomainFMA
  51491. p.add(0, func(m *_Encoding, v []interface{}) {
  51492. m.emit(0x62)
  51493. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  51494. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  51495. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  51496. m.emit(0xaf)
  51497. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  51498. })
  51499. }
  51500. // VFNMSUB213SD xmm, xmm, xmm{k}{z}
  51501. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  51502. self.require(ISA_AVX512F)
  51503. p.domain = DomainFMA
  51504. p.add(0, func(m *_Encoding, v []interface{}) {
  51505. m.emit(0x62)
  51506. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  51507. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  51508. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  51509. m.emit(0xaf)
  51510. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51511. })
  51512. }
  51513. if p.len == 0 {
  51514. panic("invalid operands for VFNMSUB213SD")
  51515. }
  51516. return p
  51517. }
  51518. // VFNMSUB213SS performs "Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values".
  51519. //
  51520. // Mnemonic : VFNMSUB213SS
  51521. // Supported forms : (5 forms)
  51522. //
  51523. // * VFNMSUB213SS xmm, xmm, xmm [FMA3]
  51524. // * VFNMSUB213SS m32, xmm, xmm [FMA3]
  51525. // * VFNMSUB213SS m32, xmm, xmm{k}{z} [AVX512F]
  51526. // * VFNMSUB213SS {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  51527. // * VFNMSUB213SS xmm, xmm, xmm{k}{z} [AVX512F]
  51528. //
  51529. func (self *Program) VFNMSUB213SS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  51530. var p *Instruction
  51531. switch len(vv) {
  51532. case 0 : p = self.alloc("VFNMSUB213SS", 3, Operands { v0, v1, v2 })
  51533. case 1 : p = self.alloc("VFNMSUB213SS", 4, Operands { v0, v1, v2, vv[0] })
  51534. default : panic("instruction VFNMSUB213SS takes 3 or 4 operands")
  51535. }
  51536. // VFNMSUB213SS xmm, xmm, xmm
  51537. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  51538. self.require(ISA_FMA3)
  51539. p.domain = DomainFMA
  51540. p.add(0, func(m *_Encoding, v []interface{}) {
  51541. m.emit(0xc4)
  51542. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  51543. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  51544. m.emit(0xaf)
  51545. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51546. })
  51547. }
  51548. // VFNMSUB213SS m32, xmm, xmm
  51549. if len(vv) == 0 && isM32(v0) && isXMM(v1) && isXMM(v2) {
  51550. self.require(ISA_FMA3)
  51551. p.domain = DomainFMA
  51552. p.add(0, func(m *_Encoding, v []interface{}) {
  51553. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  51554. m.emit(0xaf)
  51555. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  51556. })
  51557. }
  51558. // VFNMSUB213SS m32, xmm, xmm{k}{z}
  51559. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  51560. self.require(ISA_AVX512F)
  51561. p.domain = DomainFMA
  51562. p.add(0, func(m *_Encoding, v []interface{}) {
  51563. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  51564. m.emit(0xaf)
  51565. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  51566. })
  51567. }
  51568. // VFNMSUB213SS {er}, xmm, xmm, xmm{k}{z}
  51569. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  51570. self.require(ISA_AVX512F)
  51571. p.domain = DomainFMA
  51572. p.add(0, func(m *_Encoding, v []interface{}) {
  51573. m.emit(0x62)
  51574. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  51575. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  51576. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  51577. m.emit(0xaf)
  51578. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  51579. })
  51580. }
  51581. // VFNMSUB213SS xmm, xmm, xmm{k}{z}
  51582. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  51583. self.require(ISA_AVX512F)
  51584. p.domain = DomainFMA
  51585. p.add(0, func(m *_Encoding, v []interface{}) {
  51586. m.emit(0x62)
  51587. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  51588. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  51589. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  51590. m.emit(0xaf)
  51591. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51592. })
  51593. }
  51594. if p.len == 0 {
  51595. panic("invalid operands for VFNMSUB213SS")
  51596. }
  51597. return p
  51598. }
  51599. // VFNMSUB231PD performs "Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values".
  51600. //
  51601. // Mnemonic : VFNMSUB231PD
  51602. // Supported forms : (11 forms)
  51603. //
  51604. // * VFNMSUB231PD xmm, xmm, xmm [FMA3]
  51605. // * VFNMSUB231PD m128, xmm, xmm [FMA3]
  51606. // * VFNMSUB231PD ymm, ymm, ymm [FMA3]
  51607. // * VFNMSUB231PD m256, ymm, ymm [FMA3]
  51608. // * VFNMSUB231PD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  51609. // * VFNMSUB231PD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  51610. // * VFNMSUB231PD zmm, zmm, zmm{k}{z} [AVX512F]
  51611. // * VFNMSUB231PD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  51612. // * VFNMSUB231PD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  51613. // * VFNMSUB231PD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  51614. // * VFNMSUB231PD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  51615. //
  51616. func (self *Program) VFNMSUB231PD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  51617. var p *Instruction
  51618. switch len(vv) {
  51619. case 0 : p = self.alloc("VFNMSUB231PD", 3, Operands { v0, v1, v2 })
  51620. case 1 : p = self.alloc("VFNMSUB231PD", 4, Operands { v0, v1, v2, vv[0] })
  51621. default : panic("instruction VFNMSUB231PD takes 3 or 4 operands")
  51622. }
  51623. // VFNMSUB231PD xmm, xmm, xmm
  51624. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  51625. self.require(ISA_FMA3)
  51626. p.domain = DomainFMA
  51627. p.add(0, func(m *_Encoding, v []interface{}) {
  51628. m.emit(0xc4)
  51629. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  51630. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  51631. m.emit(0xbe)
  51632. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51633. })
  51634. }
  51635. // VFNMSUB231PD m128, xmm, xmm
  51636. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  51637. self.require(ISA_FMA3)
  51638. p.domain = DomainFMA
  51639. p.add(0, func(m *_Encoding, v []interface{}) {
  51640. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  51641. m.emit(0xbe)
  51642. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  51643. })
  51644. }
  51645. // VFNMSUB231PD ymm, ymm, ymm
  51646. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  51647. self.require(ISA_FMA3)
  51648. p.domain = DomainFMA
  51649. p.add(0, func(m *_Encoding, v []interface{}) {
  51650. m.emit(0xc4)
  51651. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  51652. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  51653. m.emit(0xbe)
  51654. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51655. })
  51656. }
  51657. // VFNMSUB231PD m256, ymm, ymm
  51658. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  51659. self.require(ISA_FMA3)
  51660. p.domain = DomainFMA
  51661. p.add(0, func(m *_Encoding, v []interface{}) {
  51662. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  51663. m.emit(0xbe)
  51664. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  51665. })
  51666. }
  51667. // VFNMSUB231PD m512/m64bcst, zmm, zmm{k}{z}
  51668. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  51669. self.require(ISA_AVX512F)
  51670. p.domain = DomainFMA
  51671. p.add(0, func(m *_Encoding, v []interface{}) {
  51672. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  51673. m.emit(0xbe)
  51674. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  51675. })
  51676. }
  51677. // VFNMSUB231PD {er}, zmm, zmm, zmm{k}{z}
  51678. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  51679. self.require(ISA_AVX512F)
  51680. p.domain = DomainFMA
  51681. p.add(0, func(m *_Encoding, v []interface{}) {
  51682. m.emit(0x62)
  51683. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  51684. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  51685. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  51686. m.emit(0xbe)
  51687. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  51688. })
  51689. }
  51690. // VFNMSUB231PD zmm, zmm, zmm{k}{z}
  51691. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  51692. self.require(ISA_AVX512F)
  51693. p.domain = DomainFMA
  51694. p.add(0, func(m *_Encoding, v []interface{}) {
  51695. m.emit(0x62)
  51696. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  51697. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  51698. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  51699. m.emit(0xbe)
  51700. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51701. })
  51702. }
  51703. // VFNMSUB231PD m128/m64bcst, xmm, xmm{k}{z}
  51704. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  51705. self.require(ISA_AVX512VL | ISA_AVX512F)
  51706. p.domain = DomainFMA
  51707. p.add(0, func(m *_Encoding, v []interface{}) {
  51708. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  51709. m.emit(0xbe)
  51710. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  51711. })
  51712. }
  51713. // VFNMSUB231PD xmm, xmm, xmm{k}{z}
  51714. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  51715. self.require(ISA_AVX512VL | ISA_AVX512F)
  51716. p.domain = DomainFMA
  51717. p.add(0, func(m *_Encoding, v []interface{}) {
  51718. m.emit(0x62)
  51719. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  51720. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  51721. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  51722. m.emit(0xbe)
  51723. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51724. })
  51725. }
  51726. // VFNMSUB231PD m256/m64bcst, ymm, ymm{k}{z}
  51727. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  51728. self.require(ISA_AVX512VL | ISA_AVX512F)
  51729. p.domain = DomainFMA
  51730. p.add(0, func(m *_Encoding, v []interface{}) {
  51731. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  51732. m.emit(0xbe)
  51733. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  51734. })
  51735. }
  51736. // VFNMSUB231PD ymm, ymm, ymm{k}{z}
  51737. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  51738. self.require(ISA_AVX512VL | ISA_AVX512F)
  51739. p.domain = DomainFMA
  51740. p.add(0, func(m *_Encoding, v []interface{}) {
  51741. m.emit(0x62)
  51742. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  51743. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  51744. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  51745. m.emit(0xbe)
  51746. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51747. })
  51748. }
  51749. if p.len == 0 {
  51750. panic("invalid operands for VFNMSUB231PD")
  51751. }
  51752. return p
  51753. }
  51754. // VFNMSUB231PS performs "Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values".
  51755. //
  51756. // Mnemonic : VFNMSUB231PS
  51757. // Supported forms : (11 forms)
  51758. //
  51759. // * VFNMSUB231PS xmm, xmm, xmm [FMA3]
  51760. // * VFNMSUB231PS m128, xmm, xmm [FMA3]
  51761. // * VFNMSUB231PS ymm, ymm, ymm [FMA3]
  51762. // * VFNMSUB231PS m256, ymm, ymm [FMA3]
  51763. // * VFNMSUB231PS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  51764. // * VFNMSUB231PS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  51765. // * VFNMSUB231PS zmm, zmm, zmm{k}{z} [AVX512F]
  51766. // * VFNMSUB231PS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  51767. // * VFNMSUB231PS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  51768. // * VFNMSUB231PS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  51769. // * VFNMSUB231PS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  51770. //
  51771. func (self *Program) VFNMSUB231PS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  51772. var p *Instruction
  51773. switch len(vv) {
  51774. case 0 : p = self.alloc("VFNMSUB231PS", 3, Operands { v0, v1, v2 })
  51775. case 1 : p = self.alloc("VFNMSUB231PS", 4, Operands { v0, v1, v2, vv[0] })
  51776. default : panic("instruction VFNMSUB231PS takes 3 or 4 operands")
  51777. }
  51778. // VFNMSUB231PS xmm, xmm, xmm
  51779. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  51780. self.require(ISA_FMA3)
  51781. p.domain = DomainFMA
  51782. p.add(0, func(m *_Encoding, v []interface{}) {
  51783. m.emit(0xc4)
  51784. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  51785. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  51786. m.emit(0xbe)
  51787. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51788. })
  51789. }
  51790. // VFNMSUB231PS m128, xmm, xmm
  51791. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  51792. self.require(ISA_FMA3)
  51793. p.domain = DomainFMA
  51794. p.add(0, func(m *_Encoding, v []interface{}) {
  51795. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  51796. m.emit(0xbe)
  51797. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  51798. })
  51799. }
  51800. // VFNMSUB231PS ymm, ymm, ymm
  51801. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  51802. self.require(ISA_FMA3)
  51803. p.domain = DomainFMA
  51804. p.add(0, func(m *_Encoding, v []interface{}) {
  51805. m.emit(0xc4)
  51806. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  51807. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  51808. m.emit(0xbe)
  51809. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51810. })
  51811. }
  51812. // VFNMSUB231PS m256, ymm, ymm
  51813. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  51814. self.require(ISA_FMA3)
  51815. p.domain = DomainFMA
  51816. p.add(0, func(m *_Encoding, v []interface{}) {
  51817. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  51818. m.emit(0xbe)
  51819. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  51820. })
  51821. }
  51822. // VFNMSUB231PS m512/m32bcst, zmm, zmm{k}{z}
  51823. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  51824. self.require(ISA_AVX512F)
  51825. p.domain = DomainFMA
  51826. p.add(0, func(m *_Encoding, v []interface{}) {
  51827. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  51828. m.emit(0xbe)
  51829. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  51830. })
  51831. }
  51832. // VFNMSUB231PS {er}, zmm, zmm, zmm{k}{z}
  51833. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  51834. self.require(ISA_AVX512F)
  51835. p.domain = DomainFMA
  51836. p.add(0, func(m *_Encoding, v []interface{}) {
  51837. m.emit(0x62)
  51838. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  51839. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  51840. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  51841. m.emit(0xbe)
  51842. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  51843. })
  51844. }
  51845. // VFNMSUB231PS zmm, zmm, zmm{k}{z}
  51846. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  51847. self.require(ISA_AVX512F)
  51848. p.domain = DomainFMA
  51849. p.add(0, func(m *_Encoding, v []interface{}) {
  51850. m.emit(0x62)
  51851. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  51852. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  51853. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  51854. m.emit(0xbe)
  51855. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51856. })
  51857. }
  51858. // VFNMSUB231PS m128/m32bcst, xmm, xmm{k}{z}
  51859. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  51860. self.require(ISA_AVX512VL | ISA_AVX512F)
  51861. p.domain = DomainFMA
  51862. p.add(0, func(m *_Encoding, v []interface{}) {
  51863. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  51864. m.emit(0xbe)
  51865. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  51866. })
  51867. }
  51868. // VFNMSUB231PS xmm, xmm, xmm{k}{z}
  51869. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  51870. self.require(ISA_AVX512VL | ISA_AVX512F)
  51871. p.domain = DomainFMA
  51872. p.add(0, func(m *_Encoding, v []interface{}) {
  51873. m.emit(0x62)
  51874. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  51875. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  51876. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  51877. m.emit(0xbe)
  51878. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51879. })
  51880. }
  51881. // VFNMSUB231PS m256/m32bcst, ymm, ymm{k}{z}
  51882. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  51883. self.require(ISA_AVX512VL | ISA_AVX512F)
  51884. p.domain = DomainFMA
  51885. p.add(0, func(m *_Encoding, v []interface{}) {
  51886. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  51887. m.emit(0xbe)
  51888. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  51889. })
  51890. }
  51891. // VFNMSUB231PS ymm, ymm, ymm{k}{z}
  51892. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  51893. self.require(ISA_AVX512VL | ISA_AVX512F)
  51894. p.domain = DomainFMA
  51895. p.add(0, func(m *_Encoding, v []interface{}) {
  51896. m.emit(0x62)
  51897. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  51898. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  51899. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  51900. m.emit(0xbe)
  51901. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51902. })
  51903. }
  51904. if p.len == 0 {
  51905. panic("invalid operands for VFNMSUB231PS")
  51906. }
  51907. return p
  51908. }
  51909. // VFNMSUB231SD performs "Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values".
  51910. //
  51911. // Mnemonic : VFNMSUB231SD
  51912. // Supported forms : (5 forms)
  51913. //
  51914. // * VFNMSUB231SD xmm, xmm, xmm [FMA3]
  51915. // * VFNMSUB231SD m64, xmm, xmm [FMA3]
  51916. // * VFNMSUB231SD m64, xmm, xmm{k}{z} [AVX512F]
  51917. // * VFNMSUB231SD {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  51918. // * VFNMSUB231SD xmm, xmm, xmm{k}{z} [AVX512F]
  51919. //
  51920. func (self *Program) VFNMSUB231SD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  51921. var p *Instruction
  51922. switch len(vv) {
  51923. case 0 : p = self.alloc("VFNMSUB231SD", 3, Operands { v0, v1, v2 })
  51924. case 1 : p = self.alloc("VFNMSUB231SD", 4, Operands { v0, v1, v2, vv[0] })
  51925. default : panic("instruction VFNMSUB231SD takes 3 or 4 operands")
  51926. }
  51927. // VFNMSUB231SD xmm, xmm, xmm
  51928. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  51929. self.require(ISA_FMA3)
  51930. p.domain = DomainFMA
  51931. p.add(0, func(m *_Encoding, v []interface{}) {
  51932. m.emit(0xc4)
  51933. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  51934. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  51935. m.emit(0xbf)
  51936. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51937. })
  51938. }
  51939. // VFNMSUB231SD m64, xmm, xmm
  51940. if len(vv) == 0 && isM64(v0) && isXMM(v1) && isXMM(v2) {
  51941. self.require(ISA_FMA3)
  51942. p.domain = DomainFMA
  51943. p.add(0, func(m *_Encoding, v []interface{}) {
  51944. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  51945. m.emit(0xbf)
  51946. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  51947. })
  51948. }
  51949. // VFNMSUB231SD m64, xmm, xmm{k}{z}
  51950. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  51951. self.require(ISA_AVX512F)
  51952. p.domain = DomainFMA
  51953. p.add(0, func(m *_Encoding, v []interface{}) {
  51954. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  51955. m.emit(0xbf)
  51956. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  51957. })
  51958. }
  51959. // VFNMSUB231SD {er}, xmm, xmm, xmm{k}{z}
  51960. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  51961. self.require(ISA_AVX512F)
  51962. p.domain = DomainFMA
  51963. p.add(0, func(m *_Encoding, v []interface{}) {
  51964. m.emit(0x62)
  51965. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  51966. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  51967. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  51968. m.emit(0xbf)
  51969. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  51970. })
  51971. }
  51972. // VFNMSUB231SD xmm, xmm, xmm{k}{z}
  51973. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  51974. self.require(ISA_AVX512F)
  51975. p.domain = DomainFMA
  51976. p.add(0, func(m *_Encoding, v []interface{}) {
  51977. m.emit(0x62)
  51978. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  51979. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  51980. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  51981. m.emit(0xbf)
  51982. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  51983. })
  51984. }
  51985. if p.len == 0 {
  51986. panic("invalid operands for VFNMSUB231SD")
  51987. }
  51988. return p
  51989. }
  51990. // VFNMSUB231SS performs "Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values".
  51991. //
  51992. // Mnemonic : VFNMSUB231SS
  51993. // Supported forms : (5 forms)
  51994. //
  51995. // * VFNMSUB231SS xmm, xmm, xmm [FMA3]
  51996. // * VFNMSUB231SS m32, xmm, xmm [FMA3]
  51997. // * VFNMSUB231SS m32, xmm, xmm{k}{z} [AVX512F]
  51998. // * VFNMSUB231SS {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  51999. // * VFNMSUB231SS xmm, xmm, xmm{k}{z} [AVX512F]
  52000. //
  52001. func (self *Program) VFNMSUB231SS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  52002. var p *Instruction
  52003. switch len(vv) {
  52004. case 0 : p = self.alloc("VFNMSUB231SS", 3, Operands { v0, v1, v2 })
  52005. case 1 : p = self.alloc("VFNMSUB231SS", 4, Operands { v0, v1, v2, vv[0] })
  52006. default : panic("instruction VFNMSUB231SS takes 3 or 4 operands")
  52007. }
  52008. // VFNMSUB231SS xmm, xmm, xmm
  52009. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  52010. self.require(ISA_FMA3)
  52011. p.domain = DomainFMA
  52012. p.add(0, func(m *_Encoding, v []interface{}) {
  52013. m.emit(0xc4)
  52014. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  52015. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  52016. m.emit(0xbf)
  52017. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  52018. })
  52019. }
  52020. // VFNMSUB231SS m32, xmm, xmm
  52021. if len(vv) == 0 && isM32(v0) && isXMM(v1) && isXMM(v2) {
  52022. self.require(ISA_FMA3)
  52023. p.domain = DomainFMA
  52024. p.add(0, func(m *_Encoding, v []interface{}) {
  52025. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  52026. m.emit(0xbf)
  52027. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  52028. })
  52029. }
  52030. // VFNMSUB231SS m32, xmm, xmm{k}{z}
  52031. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  52032. self.require(ISA_AVX512F)
  52033. p.domain = DomainFMA
  52034. p.add(0, func(m *_Encoding, v []interface{}) {
  52035. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  52036. m.emit(0xbf)
  52037. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  52038. })
  52039. }
  52040. // VFNMSUB231SS {er}, xmm, xmm, xmm{k}{z}
  52041. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  52042. self.require(ISA_AVX512F)
  52043. p.domain = DomainFMA
  52044. p.add(0, func(m *_Encoding, v []interface{}) {
  52045. m.emit(0x62)
  52046. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  52047. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  52048. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  52049. m.emit(0xbf)
  52050. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  52051. })
  52052. }
  52053. // VFNMSUB231SS xmm, xmm, xmm{k}{z}
  52054. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  52055. self.require(ISA_AVX512F)
  52056. p.domain = DomainFMA
  52057. p.add(0, func(m *_Encoding, v []interface{}) {
  52058. m.emit(0x62)
  52059. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  52060. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  52061. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  52062. m.emit(0xbf)
  52063. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  52064. })
  52065. }
  52066. if p.len == 0 {
  52067. panic("invalid operands for VFNMSUB231SS")
  52068. }
  52069. return p
  52070. }
  52071. // VFNMSUBPD performs "Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values".
  52072. //
  52073. // Mnemonic : VFNMSUBPD
  52074. // Supported forms : (6 forms)
  52075. //
  52076. // * VFNMSUBPD xmm, xmm, xmm, xmm [FMA4]
  52077. // * VFNMSUBPD m128, xmm, xmm, xmm [FMA4]
  52078. // * VFNMSUBPD xmm, m128, xmm, xmm [FMA4]
  52079. // * VFNMSUBPD ymm, ymm, ymm, ymm [FMA4]
  52080. // * VFNMSUBPD m256, ymm, ymm, ymm [FMA4]
  52081. // * VFNMSUBPD ymm, m256, ymm, ymm [FMA4]
  52082. //
  52083. func (self *Program) VFNMSUBPD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  52084. p := self.alloc("VFNMSUBPD", 4, Operands { v0, v1, v2, v3 })
  52085. // VFNMSUBPD xmm, xmm, xmm, xmm
  52086. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  52087. self.require(ISA_FMA4)
  52088. p.domain = DomainFMA
  52089. p.add(0, func(m *_Encoding, v []interface{}) {
  52090. m.emit(0xc4)
  52091. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  52092. m.emit(0xf9 ^ (hlcode(v[2]) << 3))
  52093. m.emit(0x7d)
  52094. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  52095. m.emit(hlcode(v[1]) << 4)
  52096. })
  52097. p.add(0, func(m *_Encoding, v []interface{}) {
  52098. m.emit(0xc4)
  52099. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  52100. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  52101. m.emit(0x7d)
  52102. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  52103. m.emit(hlcode(v[0]) << 4)
  52104. })
  52105. }
  52106. // VFNMSUBPD m128, xmm, xmm, xmm
  52107. if isM128(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  52108. self.require(ISA_FMA4)
  52109. p.domain = DomainFMA
  52110. p.add(0, func(m *_Encoding, v []interface{}) {
  52111. m.vex3(0xc4, 0b11, 0x81, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  52112. m.emit(0x7d)
  52113. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  52114. m.emit(hlcode(v[1]) << 4)
  52115. })
  52116. }
  52117. // VFNMSUBPD xmm, m128, xmm, xmm
  52118. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  52119. self.require(ISA_FMA4)
  52120. p.domain = DomainFMA
  52121. p.add(0, func(m *_Encoding, v []interface{}) {
  52122. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  52123. m.emit(0x7d)
  52124. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  52125. m.emit(hlcode(v[0]) << 4)
  52126. })
  52127. }
  52128. // VFNMSUBPD ymm, ymm, ymm, ymm
  52129. if isYMM(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  52130. self.require(ISA_FMA4)
  52131. p.domain = DomainFMA
  52132. p.add(0, func(m *_Encoding, v []interface{}) {
  52133. m.emit(0xc4)
  52134. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  52135. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  52136. m.emit(0x7d)
  52137. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  52138. m.emit(hlcode(v[1]) << 4)
  52139. })
  52140. p.add(0, func(m *_Encoding, v []interface{}) {
  52141. m.emit(0xc4)
  52142. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  52143. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  52144. m.emit(0x7d)
  52145. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  52146. m.emit(hlcode(v[0]) << 4)
  52147. })
  52148. }
  52149. // VFNMSUBPD m256, ymm, ymm, ymm
  52150. if isM256(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  52151. self.require(ISA_FMA4)
  52152. p.domain = DomainFMA
  52153. p.add(0, func(m *_Encoding, v []interface{}) {
  52154. m.vex3(0xc4, 0b11, 0x85, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  52155. m.emit(0x7d)
  52156. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  52157. m.emit(hlcode(v[1]) << 4)
  52158. })
  52159. }
  52160. // VFNMSUBPD ymm, m256, ymm, ymm
  52161. if isYMM(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  52162. self.require(ISA_FMA4)
  52163. p.domain = DomainFMA
  52164. p.add(0, func(m *_Encoding, v []interface{}) {
  52165. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  52166. m.emit(0x7d)
  52167. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  52168. m.emit(hlcode(v[0]) << 4)
  52169. })
  52170. }
  52171. if p.len == 0 {
  52172. panic("invalid operands for VFNMSUBPD")
  52173. }
  52174. return p
  52175. }
  52176. // VFNMSUBPS performs "Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values".
  52177. //
  52178. // Mnemonic : VFNMSUBPS
  52179. // Supported forms : (6 forms)
  52180. //
  52181. // * VFNMSUBPS xmm, xmm, xmm, xmm [FMA4]
  52182. // * VFNMSUBPS m128, xmm, xmm, xmm [FMA4]
  52183. // * VFNMSUBPS xmm, m128, xmm, xmm [FMA4]
  52184. // * VFNMSUBPS ymm, ymm, ymm, ymm [FMA4]
  52185. // * VFNMSUBPS m256, ymm, ymm, ymm [FMA4]
  52186. // * VFNMSUBPS ymm, m256, ymm, ymm [FMA4]
  52187. //
  52188. func (self *Program) VFNMSUBPS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  52189. p := self.alloc("VFNMSUBPS", 4, Operands { v0, v1, v2, v3 })
  52190. // VFNMSUBPS xmm, xmm, xmm, xmm
  52191. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  52192. self.require(ISA_FMA4)
  52193. p.domain = DomainFMA
  52194. p.add(0, func(m *_Encoding, v []interface{}) {
  52195. m.emit(0xc4)
  52196. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  52197. m.emit(0xf9 ^ (hlcode(v[2]) << 3))
  52198. m.emit(0x7c)
  52199. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  52200. m.emit(hlcode(v[1]) << 4)
  52201. })
  52202. p.add(0, func(m *_Encoding, v []interface{}) {
  52203. m.emit(0xc4)
  52204. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  52205. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  52206. m.emit(0x7c)
  52207. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  52208. m.emit(hlcode(v[0]) << 4)
  52209. })
  52210. }
  52211. // VFNMSUBPS m128, xmm, xmm, xmm
  52212. if isM128(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  52213. self.require(ISA_FMA4)
  52214. p.domain = DomainFMA
  52215. p.add(0, func(m *_Encoding, v []interface{}) {
  52216. m.vex3(0xc4, 0b11, 0x81, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  52217. m.emit(0x7c)
  52218. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  52219. m.emit(hlcode(v[1]) << 4)
  52220. })
  52221. }
  52222. // VFNMSUBPS xmm, m128, xmm, xmm
  52223. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  52224. self.require(ISA_FMA4)
  52225. p.domain = DomainFMA
  52226. p.add(0, func(m *_Encoding, v []interface{}) {
  52227. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  52228. m.emit(0x7c)
  52229. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  52230. m.emit(hlcode(v[0]) << 4)
  52231. })
  52232. }
  52233. // VFNMSUBPS ymm, ymm, ymm, ymm
  52234. if isYMM(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  52235. self.require(ISA_FMA4)
  52236. p.domain = DomainFMA
  52237. p.add(0, func(m *_Encoding, v []interface{}) {
  52238. m.emit(0xc4)
  52239. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  52240. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  52241. m.emit(0x7c)
  52242. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  52243. m.emit(hlcode(v[1]) << 4)
  52244. })
  52245. p.add(0, func(m *_Encoding, v []interface{}) {
  52246. m.emit(0xc4)
  52247. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  52248. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  52249. m.emit(0x7c)
  52250. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  52251. m.emit(hlcode(v[0]) << 4)
  52252. })
  52253. }
  52254. // VFNMSUBPS m256, ymm, ymm, ymm
  52255. if isM256(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  52256. self.require(ISA_FMA4)
  52257. p.domain = DomainFMA
  52258. p.add(0, func(m *_Encoding, v []interface{}) {
  52259. m.vex3(0xc4, 0b11, 0x85, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  52260. m.emit(0x7c)
  52261. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  52262. m.emit(hlcode(v[1]) << 4)
  52263. })
  52264. }
  52265. // VFNMSUBPS ymm, m256, ymm, ymm
  52266. if isYMM(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  52267. self.require(ISA_FMA4)
  52268. p.domain = DomainFMA
  52269. p.add(0, func(m *_Encoding, v []interface{}) {
  52270. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  52271. m.emit(0x7c)
  52272. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  52273. m.emit(hlcode(v[0]) << 4)
  52274. })
  52275. }
  52276. if p.len == 0 {
  52277. panic("invalid operands for VFNMSUBPS")
  52278. }
  52279. return p
  52280. }
  52281. // VFNMSUBSD performs "Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values".
  52282. //
  52283. // Mnemonic : VFNMSUBSD
  52284. // Supported forms : (3 forms)
  52285. //
  52286. // * VFNMSUBSD xmm, xmm, xmm, xmm [FMA4]
  52287. // * VFNMSUBSD m64, xmm, xmm, xmm [FMA4]
  52288. // * VFNMSUBSD xmm, m64, xmm, xmm [FMA4]
  52289. //
  52290. func (self *Program) VFNMSUBSD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  52291. p := self.alloc("VFNMSUBSD", 4, Operands { v0, v1, v2, v3 })
  52292. // VFNMSUBSD xmm, xmm, xmm, xmm
  52293. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  52294. self.require(ISA_FMA4)
  52295. p.domain = DomainFMA
  52296. p.add(0, func(m *_Encoding, v []interface{}) {
  52297. m.emit(0xc4)
  52298. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  52299. m.emit(0xf9 ^ (hlcode(v[2]) << 3))
  52300. m.emit(0x7f)
  52301. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  52302. m.emit(hlcode(v[1]) << 4)
  52303. })
  52304. p.add(0, func(m *_Encoding, v []interface{}) {
  52305. m.emit(0xc4)
  52306. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  52307. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  52308. m.emit(0x7f)
  52309. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  52310. m.emit(hlcode(v[0]) << 4)
  52311. })
  52312. }
  52313. // VFNMSUBSD m64, xmm, xmm, xmm
  52314. if isM64(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  52315. self.require(ISA_FMA4)
  52316. p.domain = DomainFMA
  52317. p.add(0, func(m *_Encoding, v []interface{}) {
  52318. m.vex3(0xc4, 0b11, 0x81, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  52319. m.emit(0x7f)
  52320. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  52321. m.emit(hlcode(v[1]) << 4)
  52322. })
  52323. }
  52324. // VFNMSUBSD xmm, m64, xmm, xmm
  52325. if isXMM(v0) && isM64(v1) && isXMM(v2) && isXMM(v3) {
  52326. self.require(ISA_FMA4)
  52327. p.domain = DomainFMA
  52328. p.add(0, func(m *_Encoding, v []interface{}) {
  52329. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  52330. m.emit(0x7f)
  52331. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  52332. m.emit(hlcode(v[0]) << 4)
  52333. })
  52334. }
  52335. if p.len == 0 {
  52336. panic("invalid operands for VFNMSUBSD")
  52337. }
  52338. return p
  52339. }
  52340. // VFNMSUBSS performs "Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values".
  52341. //
  52342. // Mnemonic : VFNMSUBSS
  52343. // Supported forms : (3 forms)
  52344. //
  52345. // * VFNMSUBSS xmm, xmm, xmm, xmm [FMA4]
  52346. // * VFNMSUBSS m32, xmm, xmm, xmm [FMA4]
  52347. // * VFNMSUBSS xmm, m32, xmm, xmm [FMA4]
  52348. //
  52349. func (self *Program) VFNMSUBSS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  52350. p := self.alloc("VFNMSUBSS", 4, Operands { v0, v1, v2, v3 })
  52351. // VFNMSUBSS xmm, xmm, xmm, xmm
  52352. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  52353. self.require(ISA_FMA4)
  52354. p.domain = DomainFMA
  52355. p.add(0, func(m *_Encoding, v []interface{}) {
  52356. m.emit(0xc4)
  52357. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  52358. m.emit(0xf9 ^ (hlcode(v[2]) << 3))
  52359. m.emit(0x7e)
  52360. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  52361. m.emit(hlcode(v[1]) << 4)
  52362. })
  52363. p.add(0, func(m *_Encoding, v []interface{}) {
  52364. m.emit(0xc4)
  52365. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  52366. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  52367. m.emit(0x7e)
  52368. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  52369. m.emit(hlcode(v[0]) << 4)
  52370. })
  52371. }
  52372. // VFNMSUBSS m32, xmm, xmm, xmm
  52373. if isM32(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  52374. self.require(ISA_FMA4)
  52375. p.domain = DomainFMA
  52376. p.add(0, func(m *_Encoding, v []interface{}) {
  52377. m.vex3(0xc4, 0b11, 0x81, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  52378. m.emit(0x7e)
  52379. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  52380. m.emit(hlcode(v[1]) << 4)
  52381. })
  52382. }
  52383. // VFNMSUBSS xmm, m32, xmm, xmm
  52384. if isXMM(v0) && isM32(v1) && isXMM(v2) && isXMM(v3) {
  52385. self.require(ISA_FMA4)
  52386. p.domain = DomainFMA
  52387. p.add(0, func(m *_Encoding, v []interface{}) {
  52388. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  52389. m.emit(0x7e)
  52390. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  52391. m.emit(hlcode(v[0]) << 4)
  52392. })
  52393. }
  52394. if p.len == 0 {
  52395. panic("invalid operands for VFNMSUBSS")
  52396. }
  52397. return p
  52398. }
  52399. // VFPCLASSPD performs "Test Class of Packed Double-Precision Floating-Point Values".
  52400. //
  52401. // Mnemonic : VFPCLASSPD
  52402. // Supported forms : (6 forms)
  52403. //
  52404. // * VFPCLASSPD imm8, m512/m64bcst, k{k} [AVX512DQ]
  52405. // * VFPCLASSPD imm8, zmm, k{k} [AVX512DQ]
  52406. // * VFPCLASSPD imm8, m128/m64bcst, k{k} [AVX512DQ,AVX512VL]
  52407. // * VFPCLASSPD imm8, m256/m64bcst, k{k} [AVX512DQ,AVX512VL]
  52408. // * VFPCLASSPD imm8, xmm, k{k} [AVX512DQ,AVX512VL]
  52409. // * VFPCLASSPD imm8, ymm, k{k} [AVX512DQ,AVX512VL]
  52410. //
  52411. func (self *Program) VFPCLASSPD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  52412. p := self.alloc("VFPCLASSPD", 3, Operands { v0, v1, v2 })
  52413. // VFPCLASSPD imm8, m512/m64bcst, k{k}
  52414. if isImm8(v0) && isM512M64bcst(v1) && isKk(v2) {
  52415. self.require(ISA_AVX512DQ)
  52416. p.domain = DomainAVX
  52417. p.add(0, func(m *_Encoding, v []interface{}) {
  52418. m.evex(0b11, 0x85, 0b10, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), 0, bcode(v[1]))
  52419. m.emit(0x66)
  52420. m.mrsd(lcode(v[2]), addr(v[1]), 64)
  52421. m.imm1(toImmAny(v[0]))
  52422. })
  52423. }
  52424. // VFPCLASSPD imm8, zmm, k{k}
  52425. if isImm8(v0) && isZMM(v1) && isKk(v2) {
  52426. self.require(ISA_AVX512DQ)
  52427. p.domain = DomainAVX
  52428. p.add(0, func(m *_Encoding, v []interface{}) {
  52429. m.emit(0x62)
  52430. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  52431. m.emit(0xfd)
  52432. m.emit(kcode(v[2]) | 0x48)
  52433. m.emit(0x66)
  52434. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  52435. m.imm1(toImmAny(v[0]))
  52436. })
  52437. }
  52438. // VFPCLASSPD imm8, m128/m64bcst, k{k}
  52439. if isImm8(v0) && isM128M64bcst(v1) && isKk(v2) {
  52440. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  52441. p.domain = DomainAVX
  52442. p.add(0, func(m *_Encoding, v []interface{}) {
  52443. m.evex(0b11, 0x85, 0b00, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), 0, bcode(v[1]))
  52444. m.emit(0x66)
  52445. m.mrsd(lcode(v[2]), addr(v[1]), 16)
  52446. m.imm1(toImmAny(v[0]))
  52447. })
  52448. }
  52449. // VFPCLASSPD imm8, m256/m64bcst, k{k}
  52450. if isImm8(v0) && isM256M64bcst(v1) && isKk(v2) {
  52451. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  52452. p.domain = DomainAVX
  52453. p.add(0, func(m *_Encoding, v []interface{}) {
  52454. m.evex(0b11, 0x85, 0b01, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), 0, bcode(v[1]))
  52455. m.emit(0x66)
  52456. m.mrsd(lcode(v[2]), addr(v[1]), 32)
  52457. m.imm1(toImmAny(v[0]))
  52458. })
  52459. }
  52460. // VFPCLASSPD imm8, xmm, k{k}
  52461. if isImm8(v0) && isEVEXXMM(v1) && isKk(v2) {
  52462. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  52463. p.domain = DomainAVX
  52464. p.add(0, func(m *_Encoding, v []interface{}) {
  52465. m.emit(0x62)
  52466. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  52467. m.emit(0xfd)
  52468. m.emit(kcode(v[2]) | 0x08)
  52469. m.emit(0x66)
  52470. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  52471. m.imm1(toImmAny(v[0]))
  52472. })
  52473. }
  52474. // VFPCLASSPD imm8, ymm, k{k}
  52475. if isImm8(v0) && isEVEXYMM(v1) && isKk(v2) {
  52476. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  52477. p.domain = DomainAVX
  52478. p.add(0, func(m *_Encoding, v []interface{}) {
  52479. m.emit(0x62)
  52480. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  52481. m.emit(0xfd)
  52482. m.emit(kcode(v[2]) | 0x28)
  52483. m.emit(0x66)
  52484. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  52485. m.imm1(toImmAny(v[0]))
  52486. })
  52487. }
  52488. if p.len == 0 {
  52489. panic("invalid operands for VFPCLASSPD")
  52490. }
  52491. return p
  52492. }
  52493. // VFPCLASSPS performs "Test Class of Packed Single-Precision Floating-Point Values".
  52494. //
  52495. // Mnemonic : VFPCLASSPS
  52496. // Supported forms : (6 forms)
  52497. //
  52498. // * VFPCLASSPS imm8, m512/m32bcst, k{k} [AVX512DQ]
  52499. // * VFPCLASSPS imm8, zmm, k{k} [AVX512DQ]
  52500. // * VFPCLASSPS imm8, m128/m32bcst, k{k} [AVX512DQ,AVX512VL]
  52501. // * VFPCLASSPS imm8, m256/m32bcst, k{k} [AVX512DQ,AVX512VL]
  52502. // * VFPCLASSPS imm8, xmm, k{k} [AVX512DQ,AVX512VL]
  52503. // * VFPCLASSPS imm8, ymm, k{k} [AVX512DQ,AVX512VL]
  52504. //
  52505. func (self *Program) VFPCLASSPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  52506. p := self.alloc("VFPCLASSPS", 3, Operands { v0, v1, v2 })
  52507. // VFPCLASSPS imm8, m512/m32bcst, k{k}
  52508. if isImm8(v0) && isM512M32bcst(v1) && isKk(v2) {
  52509. self.require(ISA_AVX512DQ)
  52510. p.domain = DomainAVX
  52511. p.add(0, func(m *_Encoding, v []interface{}) {
  52512. m.evex(0b11, 0x05, 0b10, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), 0, bcode(v[1]))
  52513. m.emit(0x66)
  52514. m.mrsd(lcode(v[2]), addr(v[1]), 64)
  52515. m.imm1(toImmAny(v[0]))
  52516. })
  52517. }
  52518. // VFPCLASSPS imm8, zmm, k{k}
  52519. if isImm8(v0) && isZMM(v1) && isKk(v2) {
  52520. self.require(ISA_AVX512DQ)
  52521. p.domain = DomainAVX
  52522. p.add(0, func(m *_Encoding, v []interface{}) {
  52523. m.emit(0x62)
  52524. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  52525. m.emit(0x7d)
  52526. m.emit(kcode(v[2]) | 0x48)
  52527. m.emit(0x66)
  52528. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  52529. m.imm1(toImmAny(v[0]))
  52530. })
  52531. }
  52532. // VFPCLASSPS imm8, m128/m32bcst, k{k}
  52533. if isImm8(v0) && isM128M32bcst(v1) && isKk(v2) {
  52534. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  52535. p.domain = DomainAVX
  52536. p.add(0, func(m *_Encoding, v []interface{}) {
  52537. m.evex(0b11, 0x05, 0b00, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), 0, bcode(v[1]))
  52538. m.emit(0x66)
  52539. m.mrsd(lcode(v[2]), addr(v[1]), 16)
  52540. m.imm1(toImmAny(v[0]))
  52541. })
  52542. }
  52543. // VFPCLASSPS imm8, m256/m32bcst, k{k}
  52544. if isImm8(v0) && isM256M32bcst(v1) && isKk(v2) {
  52545. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  52546. p.domain = DomainAVX
  52547. p.add(0, func(m *_Encoding, v []interface{}) {
  52548. m.evex(0b11, 0x05, 0b01, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), 0, bcode(v[1]))
  52549. m.emit(0x66)
  52550. m.mrsd(lcode(v[2]), addr(v[1]), 32)
  52551. m.imm1(toImmAny(v[0]))
  52552. })
  52553. }
  52554. // VFPCLASSPS imm8, xmm, k{k}
  52555. if isImm8(v0) && isEVEXXMM(v1) && isKk(v2) {
  52556. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  52557. p.domain = DomainAVX
  52558. p.add(0, func(m *_Encoding, v []interface{}) {
  52559. m.emit(0x62)
  52560. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  52561. m.emit(0x7d)
  52562. m.emit(kcode(v[2]) | 0x08)
  52563. m.emit(0x66)
  52564. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  52565. m.imm1(toImmAny(v[0]))
  52566. })
  52567. }
  52568. // VFPCLASSPS imm8, ymm, k{k}
  52569. if isImm8(v0) && isEVEXYMM(v1) && isKk(v2) {
  52570. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  52571. p.domain = DomainAVX
  52572. p.add(0, func(m *_Encoding, v []interface{}) {
  52573. m.emit(0x62)
  52574. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  52575. m.emit(0x7d)
  52576. m.emit(kcode(v[2]) | 0x28)
  52577. m.emit(0x66)
  52578. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  52579. m.imm1(toImmAny(v[0]))
  52580. })
  52581. }
  52582. if p.len == 0 {
  52583. panic("invalid operands for VFPCLASSPS")
  52584. }
  52585. return p
  52586. }
  52587. // VFPCLASSSD performs "Test Class of Scalar Double-Precision Floating-Point Value".
  52588. //
  52589. // Mnemonic : VFPCLASSSD
  52590. // Supported forms : (2 forms)
  52591. //
  52592. // * VFPCLASSSD imm8, xmm, k{k} [AVX512DQ]
  52593. // * VFPCLASSSD imm8, m64, k{k} [AVX512DQ]
  52594. //
  52595. func (self *Program) VFPCLASSSD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  52596. p := self.alloc("VFPCLASSSD", 3, Operands { v0, v1, v2 })
  52597. // VFPCLASSSD imm8, xmm, k{k}
  52598. if isImm8(v0) && isEVEXXMM(v1) && isKk(v2) {
  52599. self.require(ISA_AVX512DQ)
  52600. p.domain = DomainAVX
  52601. p.add(0, func(m *_Encoding, v []interface{}) {
  52602. m.emit(0x62)
  52603. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  52604. m.emit(0xfd)
  52605. m.emit(kcode(v[2]) | 0x08)
  52606. m.emit(0x67)
  52607. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  52608. m.imm1(toImmAny(v[0]))
  52609. })
  52610. }
  52611. // VFPCLASSSD imm8, m64, k{k}
  52612. if isImm8(v0) && isM64(v1) && isKk(v2) {
  52613. self.require(ISA_AVX512DQ)
  52614. p.domain = DomainAVX
  52615. p.add(0, func(m *_Encoding, v []interface{}) {
  52616. m.evex(0b11, 0x85, 0b00, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), 0, 0)
  52617. m.emit(0x67)
  52618. m.mrsd(lcode(v[2]), addr(v[1]), 8)
  52619. m.imm1(toImmAny(v[0]))
  52620. })
  52621. }
  52622. if p.len == 0 {
  52623. panic("invalid operands for VFPCLASSSD")
  52624. }
  52625. return p
  52626. }
  52627. // VFPCLASSSS performs "Test Class of Scalar Single-Precision Floating-Point Value".
  52628. //
  52629. // Mnemonic : VFPCLASSSS
  52630. // Supported forms : (2 forms)
  52631. //
  52632. // * VFPCLASSSS imm8, xmm, k{k} [AVX512DQ]
  52633. // * VFPCLASSSS imm8, m32, k{k} [AVX512DQ]
  52634. //
  52635. func (self *Program) VFPCLASSSS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  52636. p := self.alloc("VFPCLASSSS", 3, Operands { v0, v1, v2 })
  52637. // VFPCLASSSS imm8, xmm, k{k}
  52638. if isImm8(v0) && isEVEXXMM(v1) && isKk(v2) {
  52639. self.require(ISA_AVX512DQ)
  52640. p.domain = DomainAVX
  52641. p.add(0, func(m *_Encoding, v []interface{}) {
  52642. m.emit(0x62)
  52643. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  52644. m.emit(0x7d)
  52645. m.emit(kcode(v[2]) | 0x08)
  52646. m.emit(0x67)
  52647. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  52648. m.imm1(toImmAny(v[0]))
  52649. })
  52650. }
  52651. // VFPCLASSSS imm8, m32, k{k}
  52652. if isImm8(v0) && isM32(v1) && isKk(v2) {
  52653. self.require(ISA_AVX512DQ)
  52654. p.domain = DomainAVX
  52655. p.add(0, func(m *_Encoding, v []interface{}) {
  52656. m.evex(0b11, 0x05, 0b00, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), 0, 0)
  52657. m.emit(0x67)
  52658. m.mrsd(lcode(v[2]), addr(v[1]), 4)
  52659. m.imm1(toImmAny(v[0]))
  52660. })
  52661. }
  52662. if p.len == 0 {
  52663. panic("invalid operands for VFPCLASSSS")
  52664. }
  52665. return p
  52666. }
  52667. // VFRCZPD performs "Extract Fraction Packed Double-Precision Floating-Point".
  52668. //
  52669. // Mnemonic : VFRCZPD
  52670. // Supported forms : (4 forms)
  52671. //
  52672. // * VFRCZPD xmm, xmm [XOP]
  52673. // * VFRCZPD m128, xmm [XOP]
  52674. // * VFRCZPD ymm, ymm [XOP]
  52675. // * VFRCZPD m256, ymm [XOP]
  52676. //
  52677. func (self *Program) VFRCZPD(v0 interface{}, v1 interface{}) *Instruction {
  52678. p := self.alloc("VFRCZPD", 2, Operands { v0, v1 })
  52679. // VFRCZPD xmm, xmm
  52680. if isXMM(v0) && isXMM(v1) {
  52681. self.require(ISA_XOP)
  52682. p.domain = DomainAMDSpecific
  52683. p.add(0, func(m *_Encoding, v []interface{}) {
  52684. m.emit(0x8f)
  52685. m.emit(0xe9 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  52686. m.emit(0x78)
  52687. m.emit(0x81)
  52688. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  52689. })
  52690. }
  52691. // VFRCZPD m128, xmm
  52692. if isM128(v0) && isXMM(v1) {
  52693. self.require(ISA_XOP)
  52694. p.domain = DomainAMDSpecific
  52695. p.add(0, func(m *_Encoding, v []interface{}) {
  52696. m.vex3(0x8f, 0b1001, 0x00, hcode(v[1]), addr(v[0]), 0)
  52697. m.emit(0x81)
  52698. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  52699. })
  52700. }
  52701. // VFRCZPD ymm, ymm
  52702. if isYMM(v0) && isYMM(v1) {
  52703. self.require(ISA_XOP)
  52704. p.domain = DomainAMDSpecific
  52705. p.add(0, func(m *_Encoding, v []interface{}) {
  52706. m.emit(0x8f)
  52707. m.emit(0xe9 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  52708. m.emit(0x7c)
  52709. m.emit(0x81)
  52710. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  52711. })
  52712. }
  52713. // VFRCZPD m256, ymm
  52714. if isM256(v0) && isYMM(v1) {
  52715. self.require(ISA_XOP)
  52716. p.domain = DomainAMDSpecific
  52717. p.add(0, func(m *_Encoding, v []interface{}) {
  52718. m.vex3(0x8f, 0b1001, 0x04, hcode(v[1]), addr(v[0]), 0)
  52719. m.emit(0x81)
  52720. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  52721. })
  52722. }
  52723. if p.len == 0 {
  52724. panic("invalid operands for VFRCZPD")
  52725. }
  52726. return p
  52727. }
  52728. // VFRCZPS performs "Extract Fraction Packed Single-Precision Floating-Point".
  52729. //
  52730. // Mnemonic : VFRCZPS
  52731. // Supported forms : (4 forms)
  52732. //
  52733. // * VFRCZPS xmm, xmm [XOP]
  52734. // * VFRCZPS m128, xmm [XOP]
  52735. // * VFRCZPS ymm, ymm [XOP]
  52736. // * VFRCZPS m256, ymm [XOP]
  52737. //
  52738. func (self *Program) VFRCZPS(v0 interface{}, v1 interface{}) *Instruction {
  52739. p := self.alloc("VFRCZPS", 2, Operands { v0, v1 })
  52740. // VFRCZPS xmm, xmm
  52741. if isXMM(v0) && isXMM(v1) {
  52742. self.require(ISA_XOP)
  52743. p.domain = DomainAMDSpecific
  52744. p.add(0, func(m *_Encoding, v []interface{}) {
  52745. m.emit(0x8f)
  52746. m.emit(0xe9 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  52747. m.emit(0x78)
  52748. m.emit(0x80)
  52749. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  52750. })
  52751. }
  52752. // VFRCZPS m128, xmm
  52753. if isM128(v0) && isXMM(v1) {
  52754. self.require(ISA_XOP)
  52755. p.domain = DomainAMDSpecific
  52756. p.add(0, func(m *_Encoding, v []interface{}) {
  52757. m.vex3(0x8f, 0b1001, 0x00, hcode(v[1]), addr(v[0]), 0)
  52758. m.emit(0x80)
  52759. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  52760. })
  52761. }
  52762. // VFRCZPS ymm, ymm
  52763. if isYMM(v0) && isYMM(v1) {
  52764. self.require(ISA_XOP)
  52765. p.domain = DomainAMDSpecific
  52766. p.add(0, func(m *_Encoding, v []interface{}) {
  52767. m.emit(0x8f)
  52768. m.emit(0xe9 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  52769. m.emit(0x7c)
  52770. m.emit(0x80)
  52771. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  52772. })
  52773. }
  52774. // VFRCZPS m256, ymm
  52775. if isM256(v0) && isYMM(v1) {
  52776. self.require(ISA_XOP)
  52777. p.domain = DomainAMDSpecific
  52778. p.add(0, func(m *_Encoding, v []interface{}) {
  52779. m.vex3(0x8f, 0b1001, 0x04, hcode(v[1]), addr(v[0]), 0)
  52780. m.emit(0x80)
  52781. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  52782. })
  52783. }
  52784. if p.len == 0 {
  52785. panic("invalid operands for VFRCZPS")
  52786. }
  52787. return p
  52788. }
  52789. // VFRCZSD performs "Extract Fraction Scalar Double-Precision Floating-Point".
  52790. //
  52791. // Mnemonic : VFRCZSD
  52792. // Supported forms : (2 forms)
  52793. //
  52794. // * VFRCZSD xmm, xmm [XOP]
  52795. // * VFRCZSD m64, xmm [XOP]
  52796. //
  52797. func (self *Program) VFRCZSD(v0 interface{}, v1 interface{}) *Instruction {
  52798. p := self.alloc("VFRCZSD", 2, Operands { v0, v1 })
  52799. // VFRCZSD xmm, xmm
  52800. if isXMM(v0) && isXMM(v1) {
  52801. self.require(ISA_XOP)
  52802. p.domain = DomainAMDSpecific
  52803. p.add(0, func(m *_Encoding, v []interface{}) {
  52804. m.emit(0x8f)
  52805. m.emit(0xe9 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  52806. m.emit(0x78)
  52807. m.emit(0x83)
  52808. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  52809. })
  52810. }
  52811. // VFRCZSD m64, xmm
  52812. if isM64(v0) && isXMM(v1) {
  52813. self.require(ISA_XOP)
  52814. p.domain = DomainAMDSpecific
  52815. p.add(0, func(m *_Encoding, v []interface{}) {
  52816. m.vex3(0x8f, 0b1001, 0x00, hcode(v[1]), addr(v[0]), 0)
  52817. m.emit(0x83)
  52818. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  52819. })
  52820. }
  52821. if p.len == 0 {
  52822. panic("invalid operands for VFRCZSD")
  52823. }
  52824. return p
  52825. }
  52826. // VFRCZSS performs "Extract Fraction Scalar Single-Precision Floating Point".
  52827. //
  52828. // Mnemonic : VFRCZSS
  52829. // Supported forms : (2 forms)
  52830. //
  52831. // * VFRCZSS xmm, xmm [XOP]
  52832. // * VFRCZSS m32, xmm [XOP]
  52833. //
  52834. func (self *Program) VFRCZSS(v0 interface{}, v1 interface{}) *Instruction {
  52835. p := self.alloc("VFRCZSS", 2, Operands { v0, v1 })
  52836. // VFRCZSS xmm, xmm
  52837. if isXMM(v0) && isXMM(v1) {
  52838. self.require(ISA_XOP)
  52839. p.domain = DomainAMDSpecific
  52840. p.add(0, func(m *_Encoding, v []interface{}) {
  52841. m.emit(0x8f)
  52842. m.emit(0xe9 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  52843. m.emit(0x78)
  52844. m.emit(0x82)
  52845. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  52846. })
  52847. }
  52848. // VFRCZSS m32, xmm
  52849. if isM32(v0) && isXMM(v1) {
  52850. self.require(ISA_XOP)
  52851. p.domain = DomainAMDSpecific
  52852. p.add(0, func(m *_Encoding, v []interface{}) {
  52853. m.vex3(0x8f, 0b1001, 0x00, hcode(v[1]), addr(v[0]), 0)
  52854. m.emit(0x82)
  52855. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  52856. })
  52857. }
  52858. if p.len == 0 {
  52859. panic("invalid operands for VFRCZSS")
  52860. }
  52861. return p
  52862. }
  52863. // VGATHERDPD performs "Gather Packed Double-Precision Floating-Point Values Using Signed Doubleword Indices".
  52864. //
  52865. // Mnemonic : VGATHERDPD
  52866. // Supported forms : (5 forms)
  52867. //
  52868. // * VGATHERDPD xmm, vm32x, xmm [AVX2]
  52869. // * VGATHERDPD ymm, vm32x, ymm [AVX2]
  52870. // * VGATHERDPD vm32y, zmm{k} [AVX512F]
  52871. // * VGATHERDPD vm32x, xmm{k} [AVX512F,AVX512VL]
  52872. // * VGATHERDPD vm32x, ymm{k} [AVX512F,AVX512VL]
  52873. //
  52874. func (self *Program) VGATHERDPD(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  52875. var p *Instruction
  52876. switch len(vv) {
  52877. case 0 : p = self.alloc("VGATHERDPD", 2, Operands { v0, v1 })
  52878. case 1 : p = self.alloc("VGATHERDPD", 3, Operands { v0, v1, vv[0] })
  52879. default : panic("instruction VGATHERDPD takes 2 or 3 operands")
  52880. }
  52881. // VGATHERDPD xmm, vm32x, xmm
  52882. if len(vv) == 1 && isXMM(v0) && isVMX(v1) && isXMM(vv[0]) {
  52883. self.require(ISA_AVX2)
  52884. p.domain = DomainAVX
  52885. p.add(0, func(m *_Encoding, v []interface{}) {
  52886. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  52887. m.emit(0x92)
  52888. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  52889. })
  52890. }
  52891. // VGATHERDPD ymm, vm32x, ymm
  52892. if len(vv) == 1 && isYMM(v0) && isVMX(v1) && isYMM(vv[0]) {
  52893. self.require(ISA_AVX2)
  52894. p.domain = DomainAVX
  52895. p.add(0, func(m *_Encoding, v []interface{}) {
  52896. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  52897. m.emit(0x92)
  52898. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  52899. })
  52900. }
  52901. // VGATHERDPD vm32y, zmm{k}
  52902. if len(vv) == 0 && isEVEXVMY(v0) && isZMMk(v1) {
  52903. self.require(ISA_AVX512F)
  52904. p.domain = DomainAVX
  52905. p.add(0, func(m *_Encoding, v []interface{}) {
  52906. m.evex(0b10, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  52907. m.emit(0x92)
  52908. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  52909. })
  52910. }
  52911. // VGATHERDPD vm32x, xmm{k}
  52912. if len(vv) == 0 && isEVEXVMX(v0) && isXMMk(v1) {
  52913. self.require(ISA_AVX512VL | ISA_AVX512F)
  52914. p.domain = DomainAVX
  52915. p.add(0, func(m *_Encoding, v []interface{}) {
  52916. m.evex(0b10, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  52917. m.emit(0x92)
  52918. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  52919. })
  52920. }
  52921. // VGATHERDPD vm32x, ymm{k}
  52922. if len(vv) == 0 && isEVEXVMX(v0) && isYMMk(v1) {
  52923. self.require(ISA_AVX512VL | ISA_AVX512F)
  52924. p.domain = DomainAVX
  52925. p.add(0, func(m *_Encoding, v []interface{}) {
  52926. m.evex(0b10, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  52927. m.emit(0x92)
  52928. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  52929. })
  52930. }
  52931. if p.len == 0 {
  52932. panic("invalid operands for VGATHERDPD")
  52933. }
  52934. return p
  52935. }
  52936. // VGATHERDPS performs "Gather Packed Single-Precision Floating-Point Values Using Signed Doubleword Indices".
  52937. //
  52938. // Mnemonic : VGATHERDPS
  52939. // Supported forms : (5 forms)
  52940. //
  52941. // * VGATHERDPS xmm, vm32x, xmm [AVX2]
  52942. // * VGATHERDPS ymm, vm32y, ymm [AVX2]
  52943. // * VGATHERDPS vm32z, zmm{k} [AVX512F]
  52944. // * VGATHERDPS vm32x, xmm{k} [AVX512F,AVX512VL]
  52945. // * VGATHERDPS vm32y, ymm{k} [AVX512F,AVX512VL]
  52946. //
  52947. func (self *Program) VGATHERDPS(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  52948. var p *Instruction
  52949. switch len(vv) {
  52950. case 0 : p = self.alloc("VGATHERDPS", 2, Operands { v0, v1 })
  52951. case 1 : p = self.alloc("VGATHERDPS", 3, Operands { v0, v1, vv[0] })
  52952. default : panic("instruction VGATHERDPS takes 2 or 3 operands")
  52953. }
  52954. // VGATHERDPS xmm, vm32x, xmm
  52955. if len(vv) == 1 && isXMM(v0) && isVMX(v1) && isXMM(vv[0]) {
  52956. self.require(ISA_AVX2)
  52957. p.domain = DomainAVX
  52958. p.add(0, func(m *_Encoding, v []interface{}) {
  52959. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  52960. m.emit(0x92)
  52961. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  52962. })
  52963. }
  52964. // VGATHERDPS ymm, vm32y, ymm
  52965. if len(vv) == 1 && isYMM(v0) && isVMY(v1) && isYMM(vv[0]) {
  52966. self.require(ISA_AVX2)
  52967. p.domain = DomainAVX
  52968. p.add(0, func(m *_Encoding, v []interface{}) {
  52969. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  52970. m.emit(0x92)
  52971. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  52972. })
  52973. }
  52974. // VGATHERDPS vm32z, zmm{k}
  52975. if len(vv) == 0 && isVMZ(v0) && isZMMk(v1) {
  52976. self.require(ISA_AVX512F)
  52977. p.domain = DomainAVX
  52978. p.add(0, func(m *_Encoding, v []interface{}) {
  52979. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  52980. m.emit(0x92)
  52981. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  52982. })
  52983. }
  52984. // VGATHERDPS vm32x, xmm{k}
  52985. if len(vv) == 0 && isEVEXVMX(v0) && isXMMk(v1) {
  52986. self.require(ISA_AVX512VL | ISA_AVX512F)
  52987. p.domain = DomainAVX
  52988. p.add(0, func(m *_Encoding, v []interface{}) {
  52989. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  52990. m.emit(0x92)
  52991. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  52992. })
  52993. }
  52994. // VGATHERDPS vm32y, ymm{k}
  52995. if len(vv) == 0 && isEVEXVMY(v0) && isYMMk(v1) {
  52996. self.require(ISA_AVX512VL | ISA_AVX512F)
  52997. p.domain = DomainAVX
  52998. p.add(0, func(m *_Encoding, v []interface{}) {
  52999. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  53000. m.emit(0x92)
  53001. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  53002. })
  53003. }
  53004. if p.len == 0 {
  53005. panic("invalid operands for VGATHERDPS")
  53006. }
  53007. return p
  53008. }
  53009. // VGATHERPF0DPD performs "Sparse Prefetch Packed Double-Precision Floating-Point Data Values with Signed Doubleword Indices Using T0 Hint".
  53010. //
  53011. // Mnemonic : VGATHERPF0DPD
  53012. // Supported forms : (1 form)
  53013. //
  53014. // * VGATHERPF0DPD vm32y{k} [AVX512PF]
  53015. //
  53016. func (self *Program) VGATHERPF0DPD(v0 interface{}) *Instruction {
  53017. p := self.alloc("VGATHERPF0DPD", 1, Operands { v0 })
  53018. // VGATHERPF0DPD vm32y{k}
  53019. if isVMYk(v0) {
  53020. self.require(ISA_AVX512PF)
  53021. p.domain = DomainAVX
  53022. p.add(0, func(m *_Encoding, v []interface{}) {
  53023. m.evex(0b10, 0x85, 0b10, 0, addr(v[0]), 0, kcode(v[0]), 0, 0)
  53024. m.emit(0xc6)
  53025. m.mrsd(1, addr(v[0]), 8)
  53026. })
  53027. }
  53028. if p.len == 0 {
  53029. panic("invalid operands for VGATHERPF0DPD")
  53030. }
  53031. return p
  53032. }
  53033. // VGATHERPF0DPS performs "Sparse Prefetch Packed Single-Precision Floating-Point Data Values with Signed Doubleword Indices Using T0 Hint".
  53034. //
  53035. // Mnemonic : VGATHERPF0DPS
  53036. // Supported forms : (1 form)
  53037. //
  53038. // * VGATHERPF0DPS vm32z{k} [AVX512PF]
  53039. //
  53040. func (self *Program) VGATHERPF0DPS(v0 interface{}) *Instruction {
  53041. p := self.alloc("VGATHERPF0DPS", 1, Operands { v0 })
  53042. // VGATHERPF0DPS vm32z{k}
  53043. if isVMZk(v0) {
  53044. self.require(ISA_AVX512PF)
  53045. p.domain = DomainAVX
  53046. p.add(0, func(m *_Encoding, v []interface{}) {
  53047. m.evex(0b10, 0x05, 0b10, 0, addr(v[0]), 0, kcode(v[0]), 0, 0)
  53048. m.emit(0xc6)
  53049. m.mrsd(1, addr(v[0]), 4)
  53050. })
  53051. }
  53052. if p.len == 0 {
  53053. panic("invalid operands for VGATHERPF0DPS")
  53054. }
  53055. return p
  53056. }
  53057. // VGATHERPF0QPD performs "Sparse Prefetch Packed Double-Precision Floating-Point Data Values with Signed Quadword Indices Using T0 Hint".
  53058. //
  53059. // Mnemonic : VGATHERPF0QPD
  53060. // Supported forms : (1 form)
  53061. //
  53062. // * VGATHERPF0QPD vm64z{k} [AVX512PF]
  53063. //
  53064. func (self *Program) VGATHERPF0QPD(v0 interface{}) *Instruction {
  53065. p := self.alloc("VGATHERPF0QPD", 1, Operands { v0 })
  53066. // VGATHERPF0QPD vm64z{k}
  53067. if isVMZk(v0) {
  53068. self.require(ISA_AVX512PF)
  53069. p.domain = DomainAVX
  53070. p.add(0, func(m *_Encoding, v []interface{}) {
  53071. m.evex(0b10, 0x85, 0b10, 0, addr(v[0]), 0, kcode(v[0]), 0, 0)
  53072. m.emit(0xc7)
  53073. m.mrsd(1, addr(v[0]), 8)
  53074. })
  53075. }
  53076. if p.len == 0 {
  53077. panic("invalid operands for VGATHERPF0QPD")
  53078. }
  53079. return p
  53080. }
  53081. // VGATHERPF0QPS performs "Sparse Prefetch Packed Single-Precision Floating-Point Data Values with Signed Quadword Indices Using T0 Hint".
  53082. //
  53083. // Mnemonic : VGATHERPF0QPS
  53084. // Supported forms : (1 form)
  53085. //
  53086. // * VGATHERPF0QPS vm64z{k} [AVX512PF]
  53087. //
  53088. func (self *Program) VGATHERPF0QPS(v0 interface{}) *Instruction {
  53089. p := self.alloc("VGATHERPF0QPS", 1, Operands { v0 })
  53090. // VGATHERPF0QPS vm64z{k}
  53091. if isVMZk(v0) {
  53092. self.require(ISA_AVX512PF)
  53093. p.domain = DomainAVX
  53094. p.add(0, func(m *_Encoding, v []interface{}) {
  53095. m.evex(0b10, 0x05, 0b10, 0, addr(v[0]), 0, kcode(v[0]), 0, 0)
  53096. m.emit(0xc7)
  53097. m.mrsd(1, addr(v[0]), 4)
  53098. })
  53099. }
  53100. if p.len == 0 {
  53101. panic("invalid operands for VGATHERPF0QPS")
  53102. }
  53103. return p
  53104. }
  53105. // VGATHERPF1DPD performs "Sparse Prefetch Packed Double-Precision Floating-Point Data Values with Signed Doubleword Indices Using T1 Hint".
  53106. //
  53107. // Mnemonic : VGATHERPF1DPD
  53108. // Supported forms : (1 form)
  53109. //
  53110. // * VGATHERPF1DPD vm32y{k} [AVX512PF]
  53111. //
  53112. func (self *Program) VGATHERPF1DPD(v0 interface{}) *Instruction {
  53113. p := self.alloc("VGATHERPF1DPD", 1, Operands { v0 })
  53114. // VGATHERPF1DPD vm32y{k}
  53115. if isVMYk(v0) {
  53116. self.require(ISA_AVX512PF)
  53117. p.domain = DomainAVX
  53118. p.add(0, func(m *_Encoding, v []interface{}) {
  53119. m.evex(0b10, 0x85, 0b10, 0, addr(v[0]), 0, kcode(v[0]), 0, 0)
  53120. m.emit(0xc6)
  53121. m.mrsd(2, addr(v[0]), 8)
  53122. })
  53123. }
  53124. if p.len == 0 {
  53125. panic("invalid operands for VGATHERPF1DPD")
  53126. }
  53127. return p
  53128. }
  53129. // VGATHERPF1DPS performs "Sparse Prefetch Packed Single-Precision Floating-Point Data Values with Signed Doubleword Indices Using T1 Hint".
  53130. //
  53131. // Mnemonic : VGATHERPF1DPS
  53132. // Supported forms : (1 form)
  53133. //
  53134. // * VGATHERPF1DPS vm32z{k} [AVX512PF]
  53135. //
  53136. func (self *Program) VGATHERPF1DPS(v0 interface{}) *Instruction {
  53137. p := self.alloc("VGATHERPF1DPS", 1, Operands { v0 })
  53138. // VGATHERPF1DPS vm32z{k}
  53139. if isVMZk(v0) {
  53140. self.require(ISA_AVX512PF)
  53141. p.domain = DomainAVX
  53142. p.add(0, func(m *_Encoding, v []interface{}) {
  53143. m.evex(0b10, 0x05, 0b10, 0, addr(v[0]), 0, kcode(v[0]), 0, 0)
  53144. m.emit(0xc6)
  53145. m.mrsd(2, addr(v[0]), 4)
  53146. })
  53147. }
  53148. if p.len == 0 {
  53149. panic("invalid operands for VGATHERPF1DPS")
  53150. }
  53151. return p
  53152. }
  53153. // VGATHERPF1QPD performs "Sparse Prefetch Packed Double-Precision Floating-Point Data Values with Signed Quadword Indices Using T1 Hint".
  53154. //
  53155. // Mnemonic : VGATHERPF1QPD
  53156. // Supported forms : (1 form)
  53157. //
  53158. // * VGATHERPF1QPD vm64z{k} [AVX512PF]
  53159. //
  53160. func (self *Program) VGATHERPF1QPD(v0 interface{}) *Instruction {
  53161. p := self.alloc("VGATHERPF1QPD", 1, Operands { v0 })
  53162. // VGATHERPF1QPD vm64z{k}
  53163. if isVMZk(v0) {
  53164. self.require(ISA_AVX512PF)
  53165. p.domain = DomainAVX
  53166. p.add(0, func(m *_Encoding, v []interface{}) {
  53167. m.evex(0b10, 0x85, 0b10, 0, addr(v[0]), 0, kcode(v[0]), 0, 0)
  53168. m.emit(0xc7)
  53169. m.mrsd(2, addr(v[0]), 8)
  53170. })
  53171. }
  53172. if p.len == 0 {
  53173. panic("invalid operands for VGATHERPF1QPD")
  53174. }
  53175. return p
  53176. }
  53177. // VGATHERPF1QPS performs "Sparse Prefetch Packed Single-Precision Floating-Point Data Values with Signed Quadword Indices Using T1 Hint".
  53178. //
  53179. // Mnemonic : VGATHERPF1QPS
  53180. // Supported forms : (1 form)
  53181. //
  53182. // * VGATHERPF1QPS vm64z{k} [AVX512PF]
  53183. //
  53184. func (self *Program) VGATHERPF1QPS(v0 interface{}) *Instruction {
  53185. p := self.alloc("VGATHERPF1QPS", 1, Operands { v0 })
  53186. // VGATHERPF1QPS vm64z{k}
  53187. if isVMZk(v0) {
  53188. self.require(ISA_AVX512PF)
  53189. p.domain = DomainAVX
  53190. p.add(0, func(m *_Encoding, v []interface{}) {
  53191. m.evex(0b10, 0x05, 0b10, 0, addr(v[0]), 0, kcode(v[0]), 0, 0)
  53192. m.emit(0xc7)
  53193. m.mrsd(2, addr(v[0]), 4)
  53194. })
  53195. }
  53196. if p.len == 0 {
  53197. panic("invalid operands for VGATHERPF1QPS")
  53198. }
  53199. return p
  53200. }
  53201. // VGATHERQPD performs "Gather Packed Double-Precision Floating-Point Values Using Signed Quadword Indices".
  53202. //
  53203. // Mnemonic : VGATHERQPD
  53204. // Supported forms : (5 forms)
  53205. //
  53206. // * VGATHERQPD xmm, vm64x, xmm [AVX2]
  53207. // * VGATHERQPD ymm, vm64y, ymm [AVX2]
  53208. // * VGATHERQPD vm64z, zmm{k} [AVX512F]
  53209. // * VGATHERQPD vm64x, xmm{k} [AVX512F,AVX512VL]
  53210. // * VGATHERQPD vm64y, ymm{k} [AVX512F,AVX512VL]
  53211. //
  53212. func (self *Program) VGATHERQPD(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  53213. var p *Instruction
  53214. switch len(vv) {
  53215. case 0 : p = self.alloc("VGATHERQPD", 2, Operands { v0, v1 })
  53216. case 1 : p = self.alloc("VGATHERQPD", 3, Operands { v0, v1, vv[0] })
  53217. default : panic("instruction VGATHERQPD takes 2 or 3 operands")
  53218. }
  53219. // VGATHERQPD xmm, vm64x, xmm
  53220. if len(vv) == 1 && isXMM(v0) && isVMX(v1) && isXMM(vv[0]) {
  53221. self.require(ISA_AVX2)
  53222. p.domain = DomainAVX
  53223. p.add(0, func(m *_Encoding, v []interface{}) {
  53224. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  53225. m.emit(0x93)
  53226. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  53227. })
  53228. }
  53229. // VGATHERQPD ymm, vm64y, ymm
  53230. if len(vv) == 1 && isYMM(v0) && isVMY(v1) && isYMM(vv[0]) {
  53231. self.require(ISA_AVX2)
  53232. p.domain = DomainAVX
  53233. p.add(0, func(m *_Encoding, v []interface{}) {
  53234. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  53235. m.emit(0x93)
  53236. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  53237. })
  53238. }
  53239. // VGATHERQPD vm64z, zmm{k}
  53240. if len(vv) == 0 && isVMZ(v0) && isZMMk(v1) {
  53241. self.require(ISA_AVX512F)
  53242. p.domain = DomainAVX
  53243. p.add(0, func(m *_Encoding, v []interface{}) {
  53244. m.evex(0b10, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  53245. m.emit(0x93)
  53246. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  53247. })
  53248. }
  53249. // VGATHERQPD vm64x, xmm{k}
  53250. if len(vv) == 0 && isEVEXVMX(v0) && isXMMk(v1) {
  53251. self.require(ISA_AVX512VL | ISA_AVX512F)
  53252. p.domain = DomainAVX
  53253. p.add(0, func(m *_Encoding, v []interface{}) {
  53254. m.evex(0b10, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  53255. m.emit(0x93)
  53256. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  53257. })
  53258. }
  53259. // VGATHERQPD vm64y, ymm{k}
  53260. if len(vv) == 0 && isEVEXVMY(v0) && isYMMk(v1) {
  53261. self.require(ISA_AVX512VL | ISA_AVX512F)
  53262. p.domain = DomainAVX
  53263. p.add(0, func(m *_Encoding, v []interface{}) {
  53264. m.evex(0b10, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  53265. m.emit(0x93)
  53266. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  53267. })
  53268. }
  53269. if p.len == 0 {
  53270. panic("invalid operands for VGATHERQPD")
  53271. }
  53272. return p
  53273. }
  53274. // VGATHERQPS performs "Gather Packed Single-Precision Floating-Point Values Using Signed Quadword Indices".
  53275. //
  53276. // Mnemonic : VGATHERQPS
  53277. // Supported forms : (5 forms)
  53278. //
  53279. // * VGATHERQPS xmm, vm64x, xmm [AVX2]
  53280. // * VGATHERQPS xmm, vm64y, xmm [AVX2]
  53281. // * VGATHERQPS vm64z, ymm{k} [AVX512F]
  53282. // * VGATHERQPS vm64x, xmm{k} [AVX512F,AVX512VL]
  53283. // * VGATHERQPS vm64y, xmm{k} [AVX512F,AVX512VL]
  53284. //
  53285. func (self *Program) VGATHERQPS(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  53286. var p *Instruction
  53287. switch len(vv) {
  53288. case 0 : p = self.alloc("VGATHERQPS", 2, Operands { v0, v1 })
  53289. case 1 : p = self.alloc("VGATHERQPS", 3, Operands { v0, v1, vv[0] })
  53290. default : panic("instruction VGATHERQPS takes 2 or 3 operands")
  53291. }
  53292. // VGATHERQPS xmm, vm64x, xmm
  53293. if len(vv) == 1 && isXMM(v0) && isVMX(v1) && isXMM(vv[0]) {
  53294. self.require(ISA_AVX2)
  53295. p.domain = DomainAVX
  53296. p.add(0, func(m *_Encoding, v []interface{}) {
  53297. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  53298. m.emit(0x93)
  53299. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  53300. })
  53301. }
  53302. // VGATHERQPS xmm, vm64y, xmm
  53303. if len(vv) == 1 && isXMM(v0) && isVMY(v1) && isXMM(vv[0]) {
  53304. self.require(ISA_AVX2)
  53305. p.domain = DomainAVX
  53306. p.add(0, func(m *_Encoding, v []interface{}) {
  53307. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  53308. m.emit(0x93)
  53309. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  53310. })
  53311. }
  53312. // VGATHERQPS vm64z, ymm{k}
  53313. if len(vv) == 0 && isVMZ(v0) && isYMMk(v1) {
  53314. self.require(ISA_AVX512F)
  53315. p.domain = DomainAVX
  53316. p.add(0, func(m *_Encoding, v []interface{}) {
  53317. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  53318. m.emit(0x93)
  53319. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  53320. })
  53321. }
  53322. // VGATHERQPS vm64x, xmm{k}
  53323. if len(vv) == 0 && isEVEXVMX(v0) && isXMMk(v1) {
  53324. self.require(ISA_AVX512VL | ISA_AVX512F)
  53325. p.domain = DomainAVX
  53326. p.add(0, func(m *_Encoding, v []interface{}) {
  53327. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  53328. m.emit(0x93)
  53329. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  53330. })
  53331. }
  53332. // VGATHERQPS vm64y, xmm{k}
  53333. if len(vv) == 0 && isEVEXVMY(v0) && isXMMk(v1) {
  53334. self.require(ISA_AVX512VL | ISA_AVX512F)
  53335. p.domain = DomainAVX
  53336. p.add(0, func(m *_Encoding, v []interface{}) {
  53337. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  53338. m.emit(0x93)
  53339. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  53340. })
  53341. }
  53342. if p.len == 0 {
  53343. panic("invalid operands for VGATHERQPS")
  53344. }
  53345. return p
  53346. }
  53347. // VGETEXPPD performs "Extract Exponents of Packed Double-Precision Floating-Point Values as Double-Precision Floating-Point Values".
  53348. //
  53349. // Mnemonic : VGETEXPPD
  53350. // Supported forms : (7 forms)
  53351. //
  53352. // * VGETEXPPD m512/m64bcst, zmm{k}{z} [AVX512F]
  53353. // * VGETEXPPD {sae}, zmm, zmm{k}{z} [AVX512F]
  53354. // * VGETEXPPD zmm, zmm{k}{z} [AVX512F]
  53355. // * VGETEXPPD m128/m64bcst, xmm{k}{z} [AVX512F,AVX512VL]
  53356. // * VGETEXPPD m256/m64bcst, ymm{k}{z} [AVX512F,AVX512VL]
  53357. // * VGETEXPPD xmm, xmm{k}{z} [AVX512F,AVX512VL]
  53358. // * VGETEXPPD ymm, ymm{k}{z} [AVX512F,AVX512VL]
  53359. //
  53360. func (self *Program) VGETEXPPD(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  53361. var p *Instruction
  53362. switch len(vv) {
  53363. case 0 : p = self.alloc("VGETEXPPD", 2, Operands { v0, v1 })
  53364. case 1 : p = self.alloc("VGETEXPPD", 3, Operands { v0, v1, vv[0] })
  53365. default : panic("instruction VGETEXPPD takes 2 or 3 operands")
  53366. }
  53367. // VGETEXPPD m512/m64bcst, zmm{k}{z}
  53368. if len(vv) == 0 && isM512M64bcst(v0) && isZMMkz(v1) {
  53369. self.require(ISA_AVX512F)
  53370. p.domain = DomainAVX
  53371. p.add(0, func(m *_Encoding, v []interface{}) {
  53372. m.evex(0b10, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  53373. m.emit(0x42)
  53374. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  53375. })
  53376. }
  53377. // VGETEXPPD {sae}, zmm, zmm{k}{z}
  53378. if len(vv) == 1 && isSAE(v0) && isZMM(v1) && isZMMkz(vv[0]) {
  53379. self.require(ISA_AVX512F)
  53380. p.domain = DomainAVX
  53381. p.add(0, func(m *_Encoding, v []interface{}) {
  53382. m.emit(0x62)
  53383. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  53384. m.emit(0xfd)
  53385. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x18)
  53386. m.emit(0x42)
  53387. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  53388. })
  53389. }
  53390. // VGETEXPPD zmm, zmm{k}{z}
  53391. if len(vv) == 0 && isZMM(v0) && isZMMkz(v1) {
  53392. self.require(ISA_AVX512F)
  53393. p.domain = DomainAVX
  53394. p.add(0, func(m *_Encoding, v []interface{}) {
  53395. m.emit(0x62)
  53396. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  53397. m.emit(0xfd)
  53398. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  53399. m.emit(0x42)
  53400. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  53401. })
  53402. }
  53403. // VGETEXPPD m128/m64bcst, xmm{k}{z}
  53404. if len(vv) == 0 && isM128M64bcst(v0) && isXMMkz(v1) {
  53405. self.require(ISA_AVX512VL | ISA_AVX512F)
  53406. p.domain = DomainAVX
  53407. p.add(0, func(m *_Encoding, v []interface{}) {
  53408. m.evex(0b10, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  53409. m.emit(0x42)
  53410. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  53411. })
  53412. }
  53413. // VGETEXPPD m256/m64bcst, ymm{k}{z}
  53414. if len(vv) == 0 && isM256M64bcst(v0) && isYMMkz(v1) {
  53415. self.require(ISA_AVX512VL | ISA_AVX512F)
  53416. p.domain = DomainAVX
  53417. p.add(0, func(m *_Encoding, v []interface{}) {
  53418. m.evex(0b10, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  53419. m.emit(0x42)
  53420. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  53421. })
  53422. }
  53423. // VGETEXPPD xmm, xmm{k}{z}
  53424. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  53425. self.require(ISA_AVX512VL | ISA_AVX512F)
  53426. p.domain = DomainAVX
  53427. p.add(0, func(m *_Encoding, v []interface{}) {
  53428. m.emit(0x62)
  53429. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  53430. m.emit(0xfd)
  53431. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  53432. m.emit(0x42)
  53433. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  53434. })
  53435. }
  53436. // VGETEXPPD ymm, ymm{k}{z}
  53437. if len(vv) == 0 && isEVEXYMM(v0) && isYMMkz(v1) {
  53438. self.require(ISA_AVX512VL | ISA_AVX512F)
  53439. p.domain = DomainAVX
  53440. p.add(0, func(m *_Encoding, v []interface{}) {
  53441. m.emit(0x62)
  53442. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  53443. m.emit(0xfd)
  53444. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  53445. m.emit(0x42)
  53446. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  53447. })
  53448. }
  53449. if p.len == 0 {
  53450. panic("invalid operands for VGETEXPPD")
  53451. }
  53452. return p
  53453. }
  53454. // VGETEXPPS performs "Extract Exponents of Packed Single-Precision Floating-Point Values as Single-Precision Floating-Point Values".
  53455. //
  53456. // Mnemonic : VGETEXPPS
  53457. // Supported forms : (7 forms)
  53458. //
  53459. // * VGETEXPPS m512/m32bcst, zmm{k}{z} [AVX512F]
  53460. // * VGETEXPPS {sae}, zmm, zmm{k}{z} [AVX512F]
  53461. // * VGETEXPPS zmm, zmm{k}{z} [AVX512F]
  53462. // * VGETEXPPS m128/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  53463. // * VGETEXPPS m256/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  53464. // * VGETEXPPS xmm, xmm{k}{z} [AVX512F,AVX512VL]
  53465. // * VGETEXPPS ymm, ymm{k}{z} [AVX512F,AVX512VL]
  53466. //
  53467. func (self *Program) VGETEXPPS(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  53468. var p *Instruction
  53469. switch len(vv) {
  53470. case 0 : p = self.alloc("VGETEXPPS", 2, Operands { v0, v1 })
  53471. case 1 : p = self.alloc("VGETEXPPS", 3, Operands { v0, v1, vv[0] })
  53472. default : panic("instruction VGETEXPPS takes 2 or 3 operands")
  53473. }
  53474. // VGETEXPPS m512/m32bcst, zmm{k}{z}
  53475. if len(vv) == 0 && isM512M32bcst(v0) && isZMMkz(v1) {
  53476. self.require(ISA_AVX512F)
  53477. p.domain = DomainAVX
  53478. p.add(0, func(m *_Encoding, v []interface{}) {
  53479. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  53480. m.emit(0x42)
  53481. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  53482. })
  53483. }
  53484. // VGETEXPPS {sae}, zmm, zmm{k}{z}
  53485. if len(vv) == 1 && isSAE(v0) && isZMM(v1) && isZMMkz(vv[0]) {
  53486. self.require(ISA_AVX512F)
  53487. p.domain = DomainAVX
  53488. p.add(0, func(m *_Encoding, v []interface{}) {
  53489. m.emit(0x62)
  53490. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  53491. m.emit(0x7d)
  53492. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x18)
  53493. m.emit(0x42)
  53494. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  53495. })
  53496. }
  53497. // VGETEXPPS zmm, zmm{k}{z}
  53498. if len(vv) == 0 && isZMM(v0) && isZMMkz(v1) {
  53499. self.require(ISA_AVX512F)
  53500. p.domain = DomainAVX
  53501. p.add(0, func(m *_Encoding, v []interface{}) {
  53502. m.emit(0x62)
  53503. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  53504. m.emit(0x7d)
  53505. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  53506. m.emit(0x42)
  53507. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  53508. })
  53509. }
  53510. // VGETEXPPS m128/m32bcst, xmm{k}{z}
  53511. if len(vv) == 0 && isM128M32bcst(v0) && isXMMkz(v1) {
  53512. self.require(ISA_AVX512VL | ISA_AVX512F)
  53513. p.domain = DomainAVX
  53514. p.add(0, func(m *_Encoding, v []interface{}) {
  53515. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  53516. m.emit(0x42)
  53517. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  53518. })
  53519. }
  53520. // VGETEXPPS m256/m32bcst, ymm{k}{z}
  53521. if len(vv) == 0 && isM256M32bcst(v0) && isYMMkz(v1) {
  53522. self.require(ISA_AVX512VL | ISA_AVX512F)
  53523. p.domain = DomainAVX
  53524. p.add(0, func(m *_Encoding, v []interface{}) {
  53525. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  53526. m.emit(0x42)
  53527. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  53528. })
  53529. }
  53530. // VGETEXPPS xmm, xmm{k}{z}
  53531. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  53532. self.require(ISA_AVX512VL | ISA_AVX512F)
  53533. p.domain = DomainAVX
  53534. p.add(0, func(m *_Encoding, v []interface{}) {
  53535. m.emit(0x62)
  53536. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  53537. m.emit(0x7d)
  53538. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  53539. m.emit(0x42)
  53540. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  53541. })
  53542. }
  53543. // VGETEXPPS ymm, ymm{k}{z}
  53544. if len(vv) == 0 && isEVEXYMM(v0) && isYMMkz(v1) {
  53545. self.require(ISA_AVX512VL | ISA_AVX512F)
  53546. p.domain = DomainAVX
  53547. p.add(0, func(m *_Encoding, v []interface{}) {
  53548. m.emit(0x62)
  53549. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  53550. m.emit(0x7d)
  53551. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  53552. m.emit(0x42)
  53553. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  53554. })
  53555. }
  53556. if p.len == 0 {
  53557. panic("invalid operands for VGETEXPPS")
  53558. }
  53559. return p
  53560. }
  53561. // VGETEXPSD performs "Extract Exponent of Scalar Double-Precision Floating-Point Value as Double-Precision Floating-Point Value".
  53562. //
  53563. // Mnemonic : VGETEXPSD
  53564. // Supported forms : (3 forms)
  53565. //
  53566. // * VGETEXPSD m64, xmm, xmm{k}{z} [AVX512F]
  53567. // * VGETEXPSD {sae}, xmm, xmm, xmm{k}{z} [AVX512F]
  53568. // * VGETEXPSD xmm, xmm, xmm{k}{z} [AVX512F]
  53569. //
  53570. func (self *Program) VGETEXPSD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  53571. var p *Instruction
  53572. switch len(vv) {
  53573. case 0 : p = self.alloc("VGETEXPSD", 3, Operands { v0, v1, v2 })
  53574. case 1 : p = self.alloc("VGETEXPSD", 4, Operands { v0, v1, v2, vv[0] })
  53575. default : panic("instruction VGETEXPSD takes 3 or 4 operands")
  53576. }
  53577. // VGETEXPSD m64, xmm, xmm{k}{z}
  53578. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  53579. self.require(ISA_AVX512F)
  53580. p.domain = DomainAVX
  53581. p.add(0, func(m *_Encoding, v []interface{}) {
  53582. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  53583. m.emit(0x43)
  53584. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  53585. })
  53586. }
  53587. // VGETEXPSD {sae}, xmm, xmm, xmm{k}{z}
  53588. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  53589. self.require(ISA_AVX512F)
  53590. p.domain = DomainAVX
  53591. p.add(0, func(m *_Encoding, v []interface{}) {
  53592. m.emit(0x62)
  53593. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  53594. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  53595. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  53596. m.emit(0x43)
  53597. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  53598. })
  53599. }
  53600. // VGETEXPSD xmm, xmm, xmm{k}{z}
  53601. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  53602. self.require(ISA_AVX512F)
  53603. p.domain = DomainAVX
  53604. p.add(0, func(m *_Encoding, v []interface{}) {
  53605. m.emit(0x62)
  53606. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  53607. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  53608. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  53609. m.emit(0x43)
  53610. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  53611. })
  53612. }
  53613. if p.len == 0 {
  53614. panic("invalid operands for VGETEXPSD")
  53615. }
  53616. return p
  53617. }
  53618. // VGETEXPSS performs "Extract Exponent of Scalar Single-Precision Floating-Point Value as Single-Precision Floating-Point Value".
  53619. //
  53620. // Mnemonic : VGETEXPSS
  53621. // Supported forms : (3 forms)
  53622. //
  53623. // * VGETEXPSS m32, xmm, xmm{k}{z} [AVX512F]
  53624. // * VGETEXPSS {sae}, xmm, xmm, xmm{k}{z} [AVX512F]
  53625. // * VGETEXPSS xmm, xmm, xmm{k}{z} [AVX512F]
  53626. //
  53627. func (self *Program) VGETEXPSS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  53628. var p *Instruction
  53629. switch len(vv) {
  53630. case 0 : p = self.alloc("VGETEXPSS", 3, Operands { v0, v1, v2 })
  53631. case 1 : p = self.alloc("VGETEXPSS", 4, Operands { v0, v1, v2, vv[0] })
  53632. default : panic("instruction VGETEXPSS takes 3 or 4 operands")
  53633. }
  53634. // VGETEXPSS m32, xmm, xmm{k}{z}
  53635. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  53636. self.require(ISA_AVX512F)
  53637. p.domain = DomainAVX
  53638. p.add(0, func(m *_Encoding, v []interface{}) {
  53639. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  53640. m.emit(0x43)
  53641. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  53642. })
  53643. }
  53644. // VGETEXPSS {sae}, xmm, xmm, xmm{k}{z}
  53645. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  53646. self.require(ISA_AVX512F)
  53647. p.domain = DomainAVX
  53648. p.add(0, func(m *_Encoding, v []interface{}) {
  53649. m.emit(0x62)
  53650. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  53651. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  53652. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  53653. m.emit(0x43)
  53654. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  53655. })
  53656. }
  53657. // VGETEXPSS xmm, xmm, xmm{k}{z}
  53658. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  53659. self.require(ISA_AVX512F)
  53660. p.domain = DomainAVX
  53661. p.add(0, func(m *_Encoding, v []interface{}) {
  53662. m.emit(0x62)
  53663. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  53664. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  53665. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  53666. m.emit(0x43)
  53667. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  53668. })
  53669. }
  53670. if p.len == 0 {
  53671. panic("invalid operands for VGETEXPSS")
  53672. }
  53673. return p
  53674. }
  53675. // VGETMANTPD performs "Extract Normalized Mantissas from Packed Double-Precision Floating-Point Values".
  53676. //
  53677. // Mnemonic : VGETMANTPD
  53678. // Supported forms : (7 forms)
  53679. //
  53680. // * VGETMANTPD imm8, m512/m64bcst, zmm{k}{z} [AVX512F]
  53681. // * VGETMANTPD imm8, {sae}, zmm, zmm{k}{z} [AVX512F]
  53682. // * VGETMANTPD imm8, zmm, zmm{k}{z} [AVX512F]
  53683. // * VGETMANTPD imm8, m128/m64bcst, xmm{k}{z} [AVX512F,AVX512VL]
  53684. // * VGETMANTPD imm8, m256/m64bcst, ymm{k}{z} [AVX512F,AVX512VL]
  53685. // * VGETMANTPD imm8, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  53686. // * VGETMANTPD imm8, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  53687. //
  53688. func (self *Program) VGETMANTPD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  53689. var p *Instruction
  53690. switch len(vv) {
  53691. case 0 : p = self.alloc("VGETMANTPD", 3, Operands { v0, v1, v2 })
  53692. case 1 : p = self.alloc("VGETMANTPD", 4, Operands { v0, v1, v2, vv[0] })
  53693. default : panic("instruction VGETMANTPD takes 3 or 4 operands")
  53694. }
  53695. // VGETMANTPD imm8, m512/m64bcst, zmm{k}{z}
  53696. if len(vv) == 0 && isImm8(v0) && isM512M64bcst(v1) && isZMMkz(v2) {
  53697. self.require(ISA_AVX512F)
  53698. p.domain = DomainAVX
  53699. p.add(0, func(m *_Encoding, v []interface{}) {
  53700. m.evex(0b11, 0x85, 0b10, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  53701. m.emit(0x26)
  53702. m.mrsd(lcode(v[2]), addr(v[1]), 64)
  53703. m.imm1(toImmAny(v[0]))
  53704. })
  53705. }
  53706. // VGETMANTPD imm8, {sae}, zmm, zmm{k}{z}
  53707. if len(vv) == 1 && isImm8(v0) && isSAE(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  53708. self.require(ISA_AVX512F)
  53709. p.domain = DomainAVX
  53710. p.add(0, func(m *_Encoding, v []interface{}) {
  53711. m.emit(0x62)
  53712. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[3]) << 4)))
  53713. m.emit(0xfd)
  53714. m.emit((zcode(v[3]) << 7) | kcode(v[3]) | 0x18)
  53715. m.emit(0x26)
  53716. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[2]))
  53717. m.imm1(toImmAny(v[0]))
  53718. })
  53719. }
  53720. // VGETMANTPD imm8, zmm, zmm{k}{z}
  53721. if len(vv) == 0 && isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  53722. self.require(ISA_AVX512F)
  53723. p.domain = DomainAVX
  53724. p.add(0, func(m *_Encoding, v []interface{}) {
  53725. m.emit(0x62)
  53726. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  53727. m.emit(0xfd)
  53728. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x48)
  53729. m.emit(0x26)
  53730. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  53731. m.imm1(toImmAny(v[0]))
  53732. })
  53733. }
  53734. // VGETMANTPD imm8, m128/m64bcst, xmm{k}{z}
  53735. if len(vv) == 0 && isImm8(v0) && isM128M64bcst(v1) && isXMMkz(v2) {
  53736. self.require(ISA_AVX512VL | ISA_AVX512F)
  53737. p.domain = DomainAVX
  53738. p.add(0, func(m *_Encoding, v []interface{}) {
  53739. m.evex(0b11, 0x85, 0b00, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  53740. m.emit(0x26)
  53741. m.mrsd(lcode(v[2]), addr(v[1]), 16)
  53742. m.imm1(toImmAny(v[0]))
  53743. })
  53744. }
  53745. // VGETMANTPD imm8, m256/m64bcst, ymm{k}{z}
  53746. if len(vv) == 0 && isImm8(v0) && isM256M64bcst(v1) && isYMMkz(v2) {
  53747. self.require(ISA_AVX512VL | ISA_AVX512F)
  53748. p.domain = DomainAVX
  53749. p.add(0, func(m *_Encoding, v []interface{}) {
  53750. m.evex(0b11, 0x85, 0b01, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  53751. m.emit(0x26)
  53752. m.mrsd(lcode(v[2]), addr(v[1]), 32)
  53753. m.imm1(toImmAny(v[0]))
  53754. })
  53755. }
  53756. // VGETMANTPD imm8, xmm, xmm{k}{z}
  53757. if len(vv) == 0 && isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  53758. self.require(ISA_AVX512VL | ISA_AVX512F)
  53759. p.domain = DomainAVX
  53760. p.add(0, func(m *_Encoding, v []interface{}) {
  53761. m.emit(0x62)
  53762. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  53763. m.emit(0xfd)
  53764. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x08)
  53765. m.emit(0x26)
  53766. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  53767. m.imm1(toImmAny(v[0]))
  53768. })
  53769. }
  53770. // VGETMANTPD imm8, ymm, ymm{k}{z}
  53771. if len(vv) == 0 && isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  53772. self.require(ISA_AVX512VL | ISA_AVX512F)
  53773. p.domain = DomainAVX
  53774. p.add(0, func(m *_Encoding, v []interface{}) {
  53775. m.emit(0x62)
  53776. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  53777. m.emit(0xfd)
  53778. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x28)
  53779. m.emit(0x26)
  53780. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  53781. m.imm1(toImmAny(v[0]))
  53782. })
  53783. }
  53784. if p.len == 0 {
  53785. panic("invalid operands for VGETMANTPD")
  53786. }
  53787. return p
  53788. }
  53789. // VGETMANTPS performs "Extract Normalized Mantissas from Packed Single-Precision Floating-Point Values".
  53790. //
  53791. // Mnemonic : VGETMANTPS
  53792. // Supported forms : (7 forms)
  53793. //
  53794. // * VGETMANTPS imm8, m512/m32bcst, zmm{k}{z} [AVX512F]
  53795. // * VGETMANTPS imm8, {sae}, zmm, zmm{k}{z} [AVX512F]
  53796. // * VGETMANTPS imm8, zmm, zmm{k}{z} [AVX512F]
  53797. // * VGETMANTPS imm8, m128/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  53798. // * VGETMANTPS imm8, m256/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  53799. // * VGETMANTPS imm8, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  53800. // * VGETMANTPS imm8, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  53801. //
  53802. func (self *Program) VGETMANTPS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  53803. var p *Instruction
  53804. switch len(vv) {
  53805. case 0 : p = self.alloc("VGETMANTPS", 3, Operands { v0, v1, v2 })
  53806. case 1 : p = self.alloc("VGETMANTPS", 4, Operands { v0, v1, v2, vv[0] })
  53807. default : panic("instruction VGETMANTPS takes 3 or 4 operands")
  53808. }
  53809. // VGETMANTPS imm8, m512/m32bcst, zmm{k}{z}
  53810. if len(vv) == 0 && isImm8(v0) && isM512M32bcst(v1) && isZMMkz(v2) {
  53811. self.require(ISA_AVX512F)
  53812. p.domain = DomainAVX
  53813. p.add(0, func(m *_Encoding, v []interface{}) {
  53814. m.evex(0b11, 0x05, 0b10, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  53815. m.emit(0x26)
  53816. m.mrsd(lcode(v[2]), addr(v[1]), 64)
  53817. m.imm1(toImmAny(v[0]))
  53818. })
  53819. }
  53820. // VGETMANTPS imm8, {sae}, zmm, zmm{k}{z}
  53821. if len(vv) == 1 && isImm8(v0) && isSAE(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  53822. self.require(ISA_AVX512F)
  53823. p.domain = DomainAVX
  53824. p.add(0, func(m *_Encoding, v []interface{}) {
  53825. m.emit(0x62)
  53826. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[3]) << 4)))
  53827. m.emit(0x7d)
  53828. m.emit((zcode(v[3]) << 7) | kcode(v[3]) | 0x18)
  53829. m.emit(0x26)
  53830. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[2]))
  53831. m.imm1(toImmAny(v[0]))
  53832. })
  53833. }
  53834. // VGETMANTPS imm8, zmm, zmm{k}{z}
  53835. if len(vv) == 0 && isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  53836. self.require(ISA_AVX512F)
  53837. p.domain = DomainAVX
  53838. p.add(0, func(m *_Encoding, v []interface{}) {
  53839. m.emit(0x62)
  53840. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  53841. m.emit(0x7d)
  53842. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x48)
  53843. m.emit(0x26)
  53844. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  53845. m.imm1(toImmAny(v[0]))
  53846. })
  53847. }
  53848. // VGETMANTPS imm8, m128/m32bcst, xmm{k}{z}
  53849. if len(vv) == 0 && isImm8(v0) && isM128M32bcst(v1) && isXMMkz(v2) {
  53850. self.require(ISA_AVX512VL | ISA_AVX512F)
  53851. p.domain = DomainAVX
  53852. p.add(0, func(m *_Encoding, v []interface{}) {
  53853. m.evex(0b11, 0x05, 0b00, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  53854. m.emit(0x26)
  53855. m.mrsd(lcode(v[2]), addr(v[1]), 16)
  53856. m.imm1(toImmAny(v[0]))
  53857. })
  53858. }
  53859. // VGETMANTPS imm8, m256/m32bcst, ymm{k}{z}
  53860. if len(vv) == 0 && isImm8(v0) && isM256M32bcst(v1) && isYMMkz(v2) {
  53861. self.require(ISA_AVX512VL | ISA_AVX512F)
  53862. p.domain = DomainAVX
  53863. p.add(0, func(m *_Encoding, v []interface{}) {
  53864. m.evex(0b11, 0x05, 0b01, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  53865. m.emit(0x26)
  53866. m.mrsd(lcode(v[2]), addr(v[1]), 32)
  53867. m.imm1(toImmAny(v[0]))
  53868. })
  53869. }
  53870. // VGETMANTPS imm8, xmm, xmm{k}{z}
  53871. if len(vv) == 0 && isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  53872. self.require(ISA_AVX512VL | ISA_AVX512F)
  53873. p.domain = DomainAVX
  53874. p.add(0, func(m *_Encoding, v []interface{}) {
  53875. m.emit(0x62)
  53876. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  53877. m.emit(0x7d)
  53878. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x08)
  53879. m.emit(0x26)
  53880. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  53881. m.imm1(toImmAny(v[0]))
  53882. })
  53883. }
  53884. // VGETMANTPS imm8, ymm, ymm{k}{z}
  53885. if len(vv) == 0 && isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  53886. self.require(ISA_AVX512VL | ISA_AVX512F)
  53887. p.domain = DomainAVX
  53888. p.add(0, func(m *_Encoding, v []interface{}) {
  53889. m.emit(0x62)
  53890. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  53891. m.emit(0x7d)
  53892. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x28)
  53893. m.emit(0x26)
  53894. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  53895. m.imm1(toImmAny(v[0]))
  53896. })
  53897. }
  53898. if p.len == 0 {
  53899. panic("invalid operands for VGETMANTPS")
  53900. }
  53901. return p
  53902. }
  53903. // VGETMANTSD performs "Extract Normalized Mantissa from Scalar Double-Precision Floating-Point Value".
  53904. //
  53905. // Mnemonic : VGETMANTSD
  53906. // Supported forms : (3 forms)
  53907. //
  53908. // * VGETMANTSD imm8, m64, xmm, xmm{k}{z} [AVX512F]
  53909. // * VGETMANTSD imm8, {sae}, xmm, xmm, xmm{k}{z} [AVX512F]
  53910. // * VGETMANTSD imm8, xmm, xmm, xmm{k}{z} [AVX512F]
  53911. //
  53912. func (self *Program) VGETMANTSD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}, vv ...interface{}) *Instruction {
  53913. var p *Instruction
  53914. switch len(vv) {
  53915. case 0 : p = self.alloc("VGETMANTSD", 4, Operands { v0, v1, v2, v3 })
  53916. case 1 : p = self.alloc("VGETMANTSD", 5, Operands { v0, v1, v2, v3, vv[0] })
  53917. default : panic("instruction VGETMANTSD takes 4 or 5 operands")
  53918. }
  53919. // VGETMANTSD imm8, m64, xmm, xmm{k}{z}
  53920. if len(vv) == 0 && isImm8(v0) && isM64(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  53921. self.require(ISA_AVX512F)
  53922. p.domain = DomainAVX
  53923. p.add(0, func(m *_Encoding, v []interface{}) {
  53924. m.evex(0b11, 0x85, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  53925. m.emit(0x27)
  53926. m.mrsd(lcode(v[3]), addr(v[1]), 8)
  53927. m.imm1(toImmAny(v[0]))
  53928. })
  53929. }
  53930. // VGETMANTSD imm8, {sae}, xmm, xmm, xmm{k}{z}
  53931. if len(vv) == 1 && isImm8(v0) && isSAE(v1) && isEVEXXMM(v2) && isEVEXXMM(v3) && isXMMkz(vv[0]) {
  53932. self.require(ISA_AVX512F)
  53933. p.domain = DomainAVX
  53934. p.add(0, func(m *_Encoding, v []interface{}) {
  53935. m.emit(0x62)
  53936. m.emit(0xf3 ^ ((hcode(v[4]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[4]) << 4)))
  53937. m.emit(0xfd ^ (hlcode(v[3]) << 3))
  53938. m.emit((zcode(v[4]) << 7) | (0x08 ^ (ecode(v[3]) << 3)) | kcode(v[4]) | 0x10)
  53939. m.emit(0x27)
  53940. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[2]))
  53941. m.imm1(toImmAny(v[0]))
  53942. })
  53943. }
  53944. // VGETMANTSD imm8, xmm, xmm, xmm{k}{z}
  53945. if len(vv) == 0 && isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  53946. self.require(ISA_AVX512F)
  53947. p.domain = DomainAVX
  53948. p.add(0, func(m *_Encoding, v []interface{}) {
  53949. m.emit(0x62)
  53950. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  53951. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  53952. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  53953. m.emit(0x27)
  53954. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  53955. m.imm1(toImmAny(v[0]))
  53956. })
  53957. }
  53958. if p.len == 0 {
  53959. panic("invalid operands for VGETMANTSD")
  53960. }
  53961. return p
  53962. }
  53963. // VGETMANTSS performs "Extract Normalized Mantissa from Scalar Single-Precision Floating-Point Value".
  53964. //
  53965. // Mnemonic : VGETMANTSS
  53966. // Supported forms : (3 forms)
  53967. //
  53968. // * VGETMANTSS imm8, m32, xmm, xmm{k}{z} [AVX512F]
  53969. // * VGETMANTSS imm8, {sae}, xmm, xmm, xmm{k}{z} [AVX512F]
  53970. // * VGETMANTSS imm8, xmm, xmm, xmm{k}{z} [AVX512F]
  53971. //
  53972. func (self *Program) VGETMANTSS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}, vv ...interface{}) *Instruction {
  53973. var p *Instruction
  53974. switch len(vv) {
  53975. case 0 : p = self.alloc("VGETMANTSS", 4, Operands { v0, v1, v2, v3 })
  53976. case 1 : p = self.alloc("VGETMANTSS", 5, Operands { v0, v1, v2, v3, vv[0] })
  53977. default : panic("instruction VGETMANTSS takes 4 or 5 operands")
  53978. }
  53979. // VGETMANTSS imm8, m32, xmm, xmm{k}{z}
  53980. if len(vv) == 0 && isImm8(v0) && isM32(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  53981. self.require(ISA_AVX512F)
  53982. p.domain = DomainAVX
  53983. p.add(0, func(m *_Encoding, v []interface{}) {
  53984. m.evex(0b11, 0x05, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  53985. m.emit(0x27)
  53986. m.mrsd(lcode(v[3]), addr(v[1]), 4)
  53987. m.imm1(toImmAny(v[0]))
  53988. })
  53989. }
  53990. // VGETMANTSS imm8, {sae}, xmm, xmm, xmm{k}{z}
  53991. if len(vv) == 1 && isImm8(v0) && isSAE(v1) && isEVEXXMM(v2) && isEVEXXMM(v3) && isXMMkz(vv[0]) {
  53992. self.require(ISA_AVX512F)
  53993. p.domain = DomainAVX
  53994. p.add(0, func(m *_Encoding, v []interface{}) {
  53995. m.emit(0x62)
  53996. m.emit(0xf3 ^ ((hcode(v[4]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[4]) << 4)))
  53997. m.emit(0x7d ^ (hlcode(v[3]) << 3))
  53998. m.emit((zcode(v[4]) << 7) | (0x08 ^ (ecode(v[3]) << 3)) | kcode(v[4]) | 0x10)
  53999. m.emit(0x27)
  54000. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[2]))
  54001. m.imm1(toImmAny(v[0]))
  54002. })
  54003. }
  54004. // VGETMANTSS imm8, xmm, xmm, xmm{k}{z}
  54005. if len(vv) == 0 && isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  54006. self.require(ISA_AVX512F)
  54007. p.domain = DomainAVX
  54008. p.add(0, func(m *_Encoding, v []interface{}) {
  54009. m.emit(0x62)
  54010. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  54011. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  54012. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  54013. m.emit(0x27)
  54014. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  54015. m.imm1(toImmAny(v[0]))
  54016. })
  54017. }
  54018. if p.len == 0 {
  54019. panic("invalid operands for VGETMANTSS")
  54020. }
  54021. return p
  54022. }
  54023. // VHADDPD performs "Packed Double-FP Horizontal Add".
  54024. //
  54025. // Mnemonic : VHADDPD
  54026. // Supported forms : (4 forms)
  54027. //
  54028. // * VHADDPD xmm, xmm, xmm [AVX]
  54029. // * VHADDPD m128, xmm, xmm [AVX]
  54030. // * VHADDPD ymm, ymm, ymm [AVX]
  54031. // * VHADDPD m256, ymm, ymm [AVX]
  54032. //
  54033. func (self *Program) VHADDPD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  54034. p := self.alloc("VHADDPD", 3, Operands { v0, v1, v2 })
  54035. // VHADDPD xmm, xmm, xmm
  54036. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  54037. self.require(ISA_AVX)
  54038. p.domain = DomainAVX
  54039. p.add(0, func(m *_Encoding, v []interface{}) {
  54040. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  54041. m.emit(0x7c)
  54042. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  54043. })
  54044. }
  54045. // VHADDPD m128, xmm, xmm
  54046. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  54047. self.require(ISA_AVX)
  54048. p.domain = DomainAVX
  54049. p.add(0, func(m *_Encoding, v []interface{}) {
  54050. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  54051. m.emit(0x7c)
  54052. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  54053. })
  54054. }
  54055. // VHADDPD ymm, ymm, ymm
  54056. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  54057. self.require(ISA_AVX)
  54058. p.domain = DomainAVX
  54059. p.add(0, func(m *_Encoding, v []interface{}) {
  54060. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  54061. m.emit(0x7c)
  54062. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  54063. })
  54064. }
  54065. // VHADDPD m256, ymm, ymm
  54066. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  54067. self.require(ISA_AVX)
  54068. p.domain = DomainAVX
  54069. p.add(0, func(m *_Encoding, v []interface{}) {
  54070. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  54071. m.emit(0x7c)
  54072. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  54073. })
  54074. }
  54075. if p.len == 0 {
  54076. panic("invalid operands for VHADDPD")
  54077. }
  54078. return p
  54079. }
  54080. // VHADDPS performs "Packed Single-FP Horizontal Add".
  54081. //
  54082. // Mnemonic : VHADDPS
  54083. // Supported forms : (4 forms)
  54084. //
  54085. // * VHADDPS xmm, xmm, xmm [AVX]
  54086. // * VHADDPS m128, xmm, xmm [AVX]
  54087. // * VHADDPS ymm, ymm, ymm [AVX]
  54088. // * VHADDPS m256, ymm, ymm [AVX]
  54089. //
  54090. func (self *Program) VHADDPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  54091. p := self.alloc("VHADDPS", 3, Operands { v0, v1, v2 })
  54092. // VHADDPS xmm, xmm, xmm
  54093. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  54094. self.require(ISA_AVX)
  54095. p.domain = DomainAVX
  54096. p.add(0, func(m *_Encoding, v []interface{}) {
  54097. m.vex2(3, hcode(v[2]), v[0], hlcode(v[1]))
  54098. m.emit(0x7c)
  54099. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  54100. })
  54101. }
  54102. // VHADDPS m128, xmm, xmm
  54103. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  54104. self.require(ISA_AVX)
  54105. p.domain = DomainAVX
  54106. p.add(0, func(m *_Encoding, v []interface{}) {
  54107. m.vex2(3, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  54108. m.emit(0x7c)
  54109. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  54110. })
  54111. }
  54112. // VHADDPS ymm, ymm, ymm
  54113. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  54114. self.require(ISA_AVX)
  54115. p.domain = DomainAVX
  54116. p.add(0, func(m *_Encoding, v []interface{}) {
  54117. m.vex2(7, hcode(v[2]), v[0], hlcode(v[1]))
  54118. m.emit(0x7c)
  54119. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  54120. })
  54121. }
  54122. // VHADDPS m256, ymm, ymm
  54123. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  54124. self.require(ISA_AVX)
  54125. p.domain = DomainAVX
  54126. p.add(0, func(m *_Encoding, v []interface{}) {
  54127. m.vex2(7, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  54128. m.emit(0x7c)
  54129. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  54130. })
  54131. }
  54132. if p.len == 0 {
  54133. panic("invalid operands for VHADDPS")
  54134. }
  54135. return p
  54136. }
  54137. // VHSUBPD performs "Packed Double-FP Horizontal Subtract".
  54138. //
  54139. // Mnemonic : VHSUBPD
  54140. // Supported forms : (4 forms)
  54141. //
  54142. // * VHSUBPD xmm, xmm, xmm [AVX]
  54143. // * VHSUBPD m128, xmm, xmm [AVX]
  54144. // * VHSUBPD ymm, ymm, ymm [AVX]
  54145. // * VHSUBPD m256, ymm, ymm [AVX]
  54146. //
  54147. func (self *Program) VHSUBPD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  54148. p := self.alloc("VHSUBPD", 3, Operands { v0, v1, v2 })
  54149. // VHSUBPD xmm, xmm, xmm
  54150. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  54151. self.require(ISA_AVX)
  54152. p.domain = DomainAVX
  54153. p.add(0, func(m *_Encoding, v []interface{}) {
  54154. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  54155. m.emit(0x7d)
  54156. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  54157. })
  54158. }
  54159. // VHSUBPD m128, xmm, xmm
  54160. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  54161. self.require(ISA_AVX)
  54162. p.domain = DomainAVX
  54163. p.add(0, func(m *_Encoding, v []interface{}) {
  54164. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  54165. m.emit(0x7d)
  54166. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  54167. })
  54168. }
  54169. // VHSUBPD ymm, ymm, ymm
  54170. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  54171. self.require(ISA_AVX)
  54172. p.domain = DomainAVX
  54173. p.add(0, func(m *_Encoding, v []interface{}) {
  54174. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  54175. m.emit(0x7d)
  54176. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  54177. })
  54178. }
  54179. // VHSUBPD m256, ymm, ymm
  54180. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  54181. self.require(ISA_AVX)
  54182. p.domain = DomainAVX
  54183. p.add(0, func(m *_Encoding, v []interface{}) {
  54184. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  54185. m.emit(0x7d)
  54186. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  54187. })
  54188. }
  54189. if p.len == 0 {
  54190. panic("invalid operands for VHSUBPD")
  54191. }
  54192. return p
  54193. }
  54194. // VHSUBPS performs "Packed Single-FP Horizontal Subtract".
  54195. //
  54196. // Mnemonic : VHSUBPS
  54197. // Supported forms : (4 forms)
  54198. //
  54199. // * VHSUBPS xmm, xmm, xmm [AVX]
  54200. // * VHSUBPS m128, xmm, xmm [AVX]
  54201. // * VHSUBPS ymm, ymm, ymm [AVX]
  54202. // * VHSUBPS m256, ymm, ymm [AVX]
  54203. //
  54204. func (self *Program) VHSUBPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  54205. p := self.alloc("VHSUBPS", 3, Operands { v0, v1, v2 })
  54206. // VHSUBPS xmm, xmm, xmm
  54207. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  54208. self.require(ISA_AVX)
  54209. p.domain = DomainAVX
  54210. p.add(0, func(m *_Encoding, v []interface{}) {
  54211. m.vex2(3, hcode(v[2]), v[0], hlcode(v[1]))
  54212. m.emit(0x7d)
  54213. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  54214. })
  54215. }
  54216. // VHSUBPS m128, xmm, xmm
  54217. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  54218. self.require(ISA_AVX)
  54219. p.domain = DomainAVX
  54220. p.add(0, func(m *_Encoding, v []interface{}) {
  54221. m.vex2(3, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  54222. m.emit(0x7d)
  54223. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  54224. })
  54225. }
  54226. // VHSUBPS ymm, ymm, ymm
  54227. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  54228. self.require(ISA_AVX)
  54229. p.domain = DomainAVX
  54230. p.add(0, func(m *_Encoding, v []interface{}) {
  54231. m.vex2(7, hcode(v[2]), v[0], hlcode(v[1]))
  54232. m.emit(0x7d)
  54233. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  54234. })
  54235. }
  54236. // VHSUBPS m256, ymm, ymm
  54237. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  54238. self.require(ISA_AVX)
  54239. p.domain = DomainAVX
  54240. p.add(0, func(m *_Encoding, v []interface{}) {
  54241. m.vex2(7, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  54242. m.emit(0x7d)
  54243. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  54244. })
  54245. }
  54246. if p.len == 0 {
  54247. panic("invalid operands for VHSUBPS")
  54248. }
  54249. return p
  54250. }
  54251. // VINSERTF128 performs "Insert Packed Floating-Point Values".
  54252. //
  54253. // Mnemonic : VINSERTF128
  54254. // Supported forms : (2 forms)
  54255. //
  54256. // * VINSERTF128 imm8, xmm, ymm, ymm [AVX]
  54257. // * VINSERTF128 imm8, m128, ymm, ymm [AVX]
  54258. //
  54259. func (self *Program) VINSERTF128(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  54260. p := self.alloc("VINSERTF128", 4, Operands { v0, v1, v2, v3 })
  54261. // VINSERTF128 imm8, xmm, ymm, ymm
  54262. if isImm8(v0) && isXMM(v1) && isYMM(v2) && isYMM(v3) {
  54263. self.require(ISA_AVX)
  54264. p.domain = DomainAVX
  54265. p.add(0, func(m *_Encoding, v []interface{}) {
  54266. m.emit(0xc4)
  54267. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  54268. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  54269. m.emit(0x18)
  54270. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  54271. m.imm1(toImmAny(v[0]))
  54272. })
  54273. }
  54274. // VINSERTF128 imm8, m128, ymm, ymm
  54275. if isImm8(v0) && isM128(v1) && isYMM(v2) && isYMM(v3) {
  54276. self.require(ISA_AVX)
  54277. p.domain = DomainAVX
  54278. p.add(0, func(m *_Encoding, v []interface{}) {
  54279. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  54280. m.emit(0x18)
  54281. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  54282. m.imm1(toImmAny(v[0]))
  54283. })
  54284. }
  54285. if p.len == 0 {
  54286. panic("invalid operands for VINSERTF128")
  54287. }
  54288. return p
  54289. }
  54290. // VINSERTF32X4 performs "Insert 128 Bits of Packed Single-Precision Floating-Point Values".
  54291. //
  54292. // Mnemonic : VINSERTF32X4
  54293. // Supported forms : (4 forms)
  54294. //
  54295. // * VINSERTF32X4 imm8, xmm, zmm, zmm{k}{z} [AVX512F]
  54296. // * VINSERTF32X4 imm8, m128, zmm, zmm{k}{z} [AVX512F]
  54297. // * VINSERTF32X4 imm8, xmm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  54298. // * VINSERTF32X4 imm8, m128, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  54299. //
  54300. func (self *Program) VINSERTF32X4(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  54301. p := self.alloc("VINSERTF32X4", 4, Operands { v0, v1, v2, v3 })
  54302. // VINSERTF32X4 imm8, xmm, zmm, zmm{k}{z}
  54303. if isImm8(v0) && isEVEXXMM(v1) && isZMM(v2) && isZMMkz(v3) {
  54304. self.require(ISA_AVX512F)
  54305. p.domain = DomainAVX
  54306. p.add(0, func(m *_Encoding, v []interface{}) {
  54307. m.emit(0x62)
  54308. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  54309. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  54310. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  54311. m.emit(0x18)
  54312. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  54313. m.imm1(toImmAny(v[0]))
  54314. })
  54315. }
  54316. // VINSERTF32X4 imm8, m128, zmm, zmm{k}{z}
  54317. if isImm8(v0) && isM128(v1) && isZMM(v2) && isZMMkz(v3) {
  54318. self.require(ISA_AVX512F)
  54319. p.domain = DomainAVX
  54320. p.add(0, func(m *_Encoding, v []interface{}) {
  54321. m.evex(0b11, 0x05, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  54322. m.emit(0x18)
  54323. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  54324. m.imm1(toImmAny(v[0]))
  54325. })
  54326. }
  54327. // VINSERTF32X4 imm8, xmm, ymm, ymm{k}{z}
  54328. if isImm8(v0) && isEVEXXMM(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  54329. self.require(ISA_AVX512VL | ISA_AVX512F)
  54330. p.domain = DomainAVX
  54331. p.add(0, func(m *_Encoding, v []interface{}) {
  54332. m.emit(0x62)
  54333. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  54334. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  54335. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  54336. m.emit(0x18)
  54337. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  54338. m.imm1(toImmAny(v[0]))
  54339. })
  54340. }
  54341. // VINSERTF32X4 imm8, m128, ymm, ymm{k}{z}
  54342. if isImm8(v0) && isM128(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  54343. self.require(ISA_AVX512VL | ISA_AVX512F)
  54344. p.domain = DomainAVX
  54345. p.add(0, func(m *_Encoding, v []interface{}) {
  54346. m.evex(0b11, 0x05, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  54347. m.emit(0x18)
  54348. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  54349. m.imm1(toImmAny(v[0]))
  54350. })
  54351. }
  54352. if p.len == 0 {
  54353. panic("invalid operands for VINSERTF32X4")
  54354. }
  54355. return p
  54356. }
  54357. // VINSERTF32X8 performs "Insert 256 Bits of Packed Single-Precision Floating-Point Values".
  54358. //
  54359. // Mnemonic : VINSERTF32X8
  54360. // Supported forms : (2 forms)
  54361. //
  54362. // * VINSERTF32X8 imm8, ymm, zmm, zmm{k}{z} [AVX512DQ]
  54363. // * VINSERTF32X8 imm8, m256, zmm, zmm{k}{z} [AVX512DQ]
  54364. //
  54365. func (self *Program) VINSERTF32X8(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  54366. p := self.alloc("VINSERTF32X8", 4, Operands { v0, v1, v2, v3 })
  54367. // VINSERTF32X8 imm8, ymm, zmm, zmm{k}{z}
  54368. if isImm8(v0) && isEVEXYMM(v1) && isZMM(v2) && isZMMkz(v3) {
  54369. self.require(ISA_AVX512DQ)
  54370. p.domain = DomainAVX
  54371. p.add(0, func(m *_Encoding, v []interface{}) {
  54372. m.emit(0x62)
  54373. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  54374. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  54375. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  54376. m.emit(0x1a)
  54377. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  54378. m.imm1(toImmAny(v[0]))
  54379. })
  54380. }
  54381. // VINSERTF32X8 imm8, m256, zmm, zmm{k}{z}
  54382. if isImm8(v0) && isM256(v1) && isZMM(v2) && isZMMkz(v3) {
  54383. self.require(ISA_AVX512DQ)
  54384. p.domain = DomainAVX
  54385. p.add(0, func(m *_Encoding, v []interface{}) {
  54386. m.evex(0b11, 0x05, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  54387. m.emit(0x1a)
  54388. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  54389. m.imm1(toImmAny(v[0]))
  54390. })
  54391. }
  54392. if p.len == 0 {
  54393. panic("invalid operands for VINSERTF32X8")
  54394. }
  54395. return p
  54396. }
  54397. // VINSERTF64X2 performs "Insert 128 Bits of Packed Double-Precision Floating-Point Values".
  54398. //
  54399. // Mnemonic : VINSERTF64X2
  54400. // Supported forms : (4 forms)
  54401. //
  54402. // * VINSERTF64X2 imm8, xmm, zmm, zmm{k}{z} [AVX512DQ]
  54403. // * VINSERTF64X2 imm8, m128, zmm, zmm{k}{z} [AVX512DQ]
  54404. // * VINSERTF64X2 imm8, xmm, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  54405. // * VINSERTF64X2 imm8, m128, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  54406. //
  54407. func (self *Program) VINSERTF64X2(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  54408. p := self.alloc("VINSERTF64X2", 4, Operands { v0, v1, v2, v3 })
  54409. // VINSERTF64X2 imm8, xmm, zmm, zmm{k}{z}
  54410. if isImm8(v0) && isEVEXXMM(v1) && isZMM(v2) && isZMMkz(v3) {
  54411. self.require(ISA_AVX512DQ)
  54412. p.domain = DomainAVX
  54413. p.add(0, func(m *_Encoding, v []interface{}) {
  54414. m.emit(0x62)
  54415. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  54416. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  54417. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  54418. m.emit(0x18)
  54419. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  54420. m.imm1(toImmAny(v[0]))
  54421. })
  54422. }
  54423. // VINSERTF64X2 imm8, m128, zmm, zmm{k}{z}
  54424. if isImm8(v0) && isM128(v1) && isZMM(v2) && isZMMkz(v3) {
  54425. self.require(ISA_AVX512DQ)
  54426. p.domain = DomainAVX
  54427. p.add(0, func(m *_Encoding, v []interface{}) {
  54428. m.evex(0b11, 0x85, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  54429. m.emit(0x18)
  54430. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  54431. m.imm1(toImmAny(v[0]))
  54432. })
  54433. }
  54434. // VINSERTF64X2 imm8, xmm, ymm, ymm{k}{z}
  54435. if isImm8(v0) && isEVEXXMM(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  54436. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  54437. p.domain = DomainAVX
  54438. p.add(0, func(m *_Encoding, v []interface{}) {
  54439. m.emit(0x62)
  54440. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  54441. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  54442. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  54443. m.emit(0x18)
  54444. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  54445. m.imm1(toImmAny(v[0]))
  54446. })
  54447. }
  54448. // VINSERTF64X2 imm8, m128, ymm, ymm{k}{z}
  54449. if isImm8(v0) && isM128(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  54450. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  54451. p.domain = DomainAVX
  54452. p.add(0, func(m *_Encoding, v []interface{}) {
  54453. m.evex(0b11, 0x85, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  54454. m.emit(0x18)
  54455. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  54456. m.imm1(toImmAny(v[0]))
  54457. })
  54458. }
  54459. if p.len == 0 {
  54460. panic("invalid operands for VINSERTF64X2")
  54461. }
  54462. return p
  54463. }
  54464. // VINSERTF64X4 performs "Insert 256 Bits of Packed Double-Precision Floating-Point Values".
  54465. //
  54466. // Mnemonic : VINSERTF64X4
  54467. // Supported forms : (2 forms)
  54468. //
  54469. // * VINSERTF64X4 imm8, ymm, zmm, zmm{k}{z} [AVX512F]
  54470. // * VINSERTF64X4 imm8, m256, zmm, zmm{k}{z} [AVX512F]
  54471. //
  54472. func (self *Program) VINSERTF64X4(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  54473. p := self.alloc("VINSERTF64X4", 4, Operands { v0, v1, v2, v3 })
  54474. // VINSERTF64X4 imm8, ymm, zmm, zmm{k}{z}
  54475. if isImm8(v0) && isEVEXYMM(v1) && isZMM(v2) && isZMMkz(v3) {
  54476. self.require(ISA_AVX512F)
  54477. p.domain = DomainAVX
  54478. p.add(0, func(m *_Encoding, v []interface{}) {
  54479. m.emit(0x62)
  54480. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  54481. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  54482. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  54483. m.emit(0x1a)
  54484. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  54485. m.imm1(toImmAny(v[0]))
  54486. })
  54487. }
  54488. // VINSERTF64X4 imm8, m256, zmm, zmm{k}{z}
  54489. if isImm8(v0) && isM256(v1) && isZMM(v2) && isZMMkz(v3) {
  54490. self.require(ISA_AVX512F)
  54491. p.domain = DomainAVX
  54492. p.add(0, func(m *_Encoding, v []interface{}) {
  54493. m.evex(0b11, 0x85, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  54494. m.emit(0x1a)
  54495. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  54496. m.imm1(toImmAny(v[0]))
  54497. })
  54498. }
  54499. if p.len == 0 {
  54500. panic("invalid operands for VINSERTF64X4")
  54501. }
  54502. return p
  54503. }
  54504. // VINSERTI128 performs "Insert Packed Integer Values".
  54505. //
  54506. // Mnemonic : VINSERTI128
  54507. // Supported forms : (2 forms)
  54508. //
  54509. // * VINSERTI128 imm8, xmm, ymm, ymm [AVX2]
  54510. // * VINSERTI128 imm8, m128, ymm, ymm [AVX2]
  54511. //
  54512. func (self *Program) VINSERTI128(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  54513. p := self.alloc("VINSERTI128", 4, Operands { v0, v1, v2, v3 })
  54514. // VINSERTI128 imm8, xmm, ymm, ymm
  54515. if isImm8(v0) && isXMM(v1) && isYMM(v2) && isYMM(v3) {
  54516. self.require(ISA_AVX2)
  54517. p.domain = DomainAVX
  54518. p.add(0, func(m *_Encoding, v []interface{}) {
  54519. m.emit(0xc4)
  54520. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  54521. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  54522. m.emit(0x38)
  54523. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  54524. m.imm1(toImmAny(v[0]))
  54525. })
  54526. }
  54527. // VINSERTI128 imm8, m128, ymm, ymm
  54528. if isImm8(v0) && isM128(v1) && isYMM(v2) && isYMM(v3) {
  54529. self.require(ISA_AVX2)
  54530. p.domain = DomainAVX
  54531. p.add(0, func(m *_Encoding, v []interface{}) {
  54532. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  54533. m.emit(0x38)
  54534. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  54535. m.imm1(toImmAny(v[0]))
  54536. })
  54537. }
  54538. if p.len == 0 {
  54539. panic("invalid operands for VINSERTI128")
  54540. }
  54541. return p
  54542. }
  54543. // VINSERTI32X4 performs "Insert 128 Bits of Packed Doubleword Integer Values".
  54544. //
  54545. // Mnemonic : VINSERTI32X4
  54546. // Supported forms : (4 forms)
  54547. //
  54548. // * VINSERTI32X4 imm8, xmm, zmm, zmm{k}{z} [AVX512F]
  54549. // * VINSERTI32X4 imm8, m128, zmm, zmm{k}{z} [AVX512F]
  54550. // * VINSERTI32X4 imm8, xmm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  54551. // * VINSERTI32X4 imm8, m128, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  54552. //
  54553. func (self *Program) VINSERTI32X4(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  54554. p := self.alloc("VINSERTI32X4", 4, Operands { v0, v1, v2, v3 })
  54555. // VINSERTI32X4 imm8, xmm, zmm, zmm{k}{z}
  54556. if isImm8(v0) && isEVEXXMM(v1) && isZMM(v2) && isZMMkz(v3) {
  54557. self.require(ISA_AVX512F)
  54558. p.domain = DomainAVX
  54559. p.add(0, func(m *_Encoding, v []interface{}) {
  54560. m.emit(0x62)
  54561. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  54562. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  54563. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  54564. m.emit(0x38)
  54565. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  54566. m.imm1(toImmAny(v[0]))
  54567. })
  54568. }
  54569. // VINSERTI32X4 imm8, m128, zmm, zmm{k}{z}
  54570. if isImm8(v0) && isM128(v1) && isZMM(v2) && isZMMkz(v3) {
  54571. self.require(ISA_AVX512F)
  54572. p.domain = DomainAVX
  54573. p.add(0, func(m *_Encoding, v []interface{}) {
  54574. m.evex(0b11, 0x05, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  54575. m.emit(0x38)
  54576. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  54577. m.imm1(toImmAny(v[0]))
  54578. })
  54579. }
  54580. // VINSERTI32X4 imm8, xmm, ymm, ymm{k}{z}
  54581. if isImm8(v0) && isEVEXXMM(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  54582. self.require(ISA_AVX512VL | ISA_AVX512F)
  54583. p.domain = DomainAVX
  54584. p.add(0, func(m *_Encoding, v []interface{}) {
  54585. m.emit(0x62)
  54586. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  54587. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  54588. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  54589. m.emit(0x38)
  54590. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  54591. m.imm1(toImmAny(v[0]))
  54592. })
  54593. }
  54594. // VINSERTI32X4 imm8, m128, ymm, ymm{k}{z}
  54595. if isImm8(v0) && isM128(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  54596. self.require(ISA_AVX512VL | ISA_AVX512F)
  54597. p.domain = DomainAVX
  54598. p.add(0, func(m *_Encoding, v []interface{}) {
  54599. m.evex(0b11, 0x05, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  54600. m.emit(0x38)
  54601. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  54602. m.imm1(toImmAny(v[0]))
  54603. })
  54604. }
  54605. if p.len == 0 {
  54606. panic("invalid operands for VINSERTI32X4")
  54607. }
  54608. return p
  54609. }
  54610. // VINSERTI32X8 performs "Insert 256 Bits of Packed Doubleword Integer Values".
  54611. //
  54612. // Mnemonic : VINSERTI32X8
  54613. // Supported forms : (2 forms)
  54614. //
  54615. // * VINSERTI32X8 imm8, ymm, zmm, zmm{k}{z} [AVX512DQ]
  54616. // * VINSERTI32X8 imm8, m256, zmm, zmm{k}{z} [AVX512DQ]
  54617. //
  54618. func (self *Program) VINSERTI32X8(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  54619. p := self.alloc("VINSERTI32X8", 4, Operands { v0, v1, v2, v3 })
  54620. // VINSERTI32X8 imm8, ymm, zmm, zmm{k}{z}
  54621. if isImm8(v0) && isEVEXYMM(v1) && isZMM(v2) && isZMMkz(v3) {
  54622. self.require(ISA_AVX512DQ)
  54623. p.domain = DomainAVX
  54624. p.add(0, func(m *_Encoding, v []interface{}) {
  54625. m.emit(0x62)
  54626. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  54627. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  54628. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  54629. m.emit(0x3a)
  54630. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  54631. m.imm1(toImmAny(v[0]))
  54632. })
  54633. }
  54634. // VINSERTI32X8 imm8, m256, zmm, zmm{k}{z}
  54635. if isImm8(v0) && isM256(v1) && isZMM(v2) && isZMMkz(v3) {
  54636. self.require(ISA_AVX512DQ)
  54637. p.domain = DomainAVX
  54638. p.add(0, func(m *_Encoding, v []interface{}) {
  54639. m.evex(0b11, 0x05, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  54640. m.emit(0x3a)
  54641. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  54642. m.imm1(toImmAny(v[0]))
  54643. })
  54644. }
  54645. if p.len == 0 {
  54646. panic("invalid operands for VINSERTI32X8")
  54647. }
  54648. return p
  54649. }
  54650. // VINSERTI64X2 performs "Insert 128 Bits of Packed Quadword Integer Values".
  54651. //
  54652. // Mnemonic : VINSERTI64X2
  54653. // Supported forms : (4 forms)
  54654. //
  54655. // * VINSERTI64X2 imm8, xmm, zmm, zmm{k}{z} [AVX512DQ]
  54656. // * VINSERTI64X2 imm8, m128, zmm, zmm{k}{z} [AVX512DQ]
  54657. // * VINSERTI64X2 imm8, xmm, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  54658. // * VINSERTI64X2 imm8, m128, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  54659. //
  54660. func (self *Program) VINSERTI64X2(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  54661. p := self.alloc("VINSERTI64X2", 4, Operands { v0, v1, v2, v3 })
  54662. // VINSERTI64X2 imm8, xmm, zmm, zmm{k}{z}
  54663. if isImm8(v0) && isEVEXXMM(v1) && isZMM(v2) && isZMMkz(v3) {
  54664. self.require(ISA_AVX512DQ)
  54665. p.domain = DomainAVX
  54666. p.add(0, func(m *_Encoding, v []interface{}) {
  54667. m.emit(0x62)
  54668. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  54669. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  54670. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  54671. m.emit(0x38)
  54672. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  54673. m.imm1(toImmAny(v[0]))
  54674. })
  54675. }
  54676. // VINSERTI64X2 imm8, m128, zmm, zmm{k}{z}
  54677. if isImm8(v0) && isM128(v1) && isZMM(v2) && isZMMkz(v3) {
  54678. self.require(ISA_AVX512DQ)
  54679. p.domain = DomainAVX
  54680. p.add(0, func(m *_Encoding, v []interface{}) {
  54681. m.evex(0b11, 0x85, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  54682. m.emit(0x38)
  54683. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  54684. m.imm1(toImmAny(v[0]))
  54685. })
  54686. }
  54687. // VINSERTI64X2 imm8, xmm, ymm, ymm{k}{z}
  54688. if isImm8(v0) && isEVEXXMM(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  54689. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  54690. p.domain = DomainAVX
  54691. p.add(0, func(m *_Encoding, v []interface{}) {
  54692. m.emit(0x62)
  54693. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  54694. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  54695. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  54696. m.emit(0x38)
  54697. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  54698. m.imm1(toImmAny(v[0]))
  54699. })
  54700. }
  54701. // VINSERTI64X2 imm8, m128, ymm, ymm{k}{z}
  54702. if isImm8(v0) && isM128(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  54703. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  54704. p.domain = DomainAVX
  54705. p.add(0, func(m *_Encoding, v []interface{}) {
  54706. m.evex(0b11, 0x85, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  54707. m.emit(0x38)
  54708. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  54709. m.imm1(toImmAny(v[0]))
  54710. })
  54711. }
  54712. if p.len == 0 {
  54713. panic("invalid operands for VINSERTI64X2")
  54714. }
  54715. return p
  54716. }
  54717. // VINSERTI64X4 performs "Insert 256 Bits of Packed Quadword Integer Values".
  54718. //
  54719. // Mnemonic : VINSERTI64X4
  54720. // Supported forms : (2 forms)
  54721. //
  54722. // * VINSERTI64X4 imm8, ymm, zmm, zmm{k}{z} [AVX512F]
  54723. // * VINSERTI64X4 imm8, m256, zmm, zmm{k}{z} [AVX512F]
  54724. //
  54725. func (self *Program) VINSERTI64X4(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  54726. p := self.alloc("VINSERTI64X4", 4, Operands { v0, v1, v2, v3 })
  54727. // VINSERTI64X4 imm8, ymm, zmm, zmm{k}{z}
  54728. if isImm8(v0) && isEVEXYMM(v1) && isZMM(v2) && isZMMkz(v3) {
  54729. self.require(ISA_AVX512F)
  54730. p.domain = DomainAVX
  54731. p.add(0, func(m *_Encoding, v []interface{}) {
  54732. m.emit(0x62)
  54733. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  54734. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  54735. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  54736. m.emit(0x3a)
  54737. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  54738. m.imm1(toImmAny(v[0]))
  54739. })
  54740. }
  54741. // VINSERTI64X4 imm8, m256, zmm, zmm{k}{z}
  54742. if isImm8(v0) && isM256(v1) && isZMM(v2) && isZMMkz(v3) {
  54743. self.require(ISA_AVX512F)
  54744. p.domain = DomainAVX
  54745. p.add(0, func(m *_Encoding, v []interface{}) {
  54746. m.evex(0b11, 0x85, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  54747. m.emit(0x3a)
  54748. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  54749. m.imm1(toImmAny(v[0]))
  54750. })
  54751. }
  54752. if p.len == 0 {
  54753. panic("invalid operands for VINSERTI64X4")
  54754. }
  54755. return p
  54756. }
  54757. // VINSERTPS performs "Insert Packed Single Precision Floating-Point Value".
  54758. //
  54759. // Mnemonic : VINSERTPS
  54760. // Supported forms : (4 forms)
  54761. //
  54762. // * VINSERTPS imm8, xmm, xmm, xmm [AVX]
  54763. // * VINSERTPS imm8, m32, xmm, xmm [AVX]
  54764. // * VINSERTPS imm8, xmm, xmm, xmm [AVX512F]
  54765. // * VINSERTPS imm8, m32, xmm, xmm [AVX512F]
  54766. //
  54767. func (self *Program) VINSERTPS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  54768. p := self.alloc("VINSERTPS", 4, Operands { v0, v1, v2, v3 })
  54769. // VINSERTPS imm8, xmm, xmm, xmm
  54770. if isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  54771. self.require(ISA_AVX)
  54772. p.domain = DomainAVX
  54773. p.add(0, func(m *_Encoding, v []interface{}) {
  54774. m.emit(0xc4)
  54775. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  54776. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  54777. m.emit(0x21)
  54778. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  54779. m.imm1(toImmAny(v[0]))
  54780. })
  54781. }
  54782. // VINSERTPS imm8, m32, xmm, xmm
  54783. if isImm8(v0) && isM32(v1) && isXMM(v2) && isXMM(v3) {
  54784. self.require(ISA_AVX)
  54785. p.domain = DomainAVX
  54786. p.add(0, func(m *_Encoding, v []interface{}) {
  54787. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  54788. m.emit(0x21)
  54789. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  54790. m.imm1(toImmAny(v[0]))
  54791. })
  54792. }
  54793. // VINSERTPS imm8, xmm, xmm, xmm
  54794. if isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isEVEXXMM(v3) {
  54795. self.require(ISA_AVX512F)
  54796. p.domain = DomainAVX
  54797. p.add(0, func(m *_Encoding, v []interface{}) {
  54798. m.emit(0x62)
  54799. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  54800. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  54801. m.emit((0x08 ^ (ecode(v[2]) << 3)) | 0x00)
  54802. m.emit(0x21)
  54803. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  54804. m.imm1(toImmAny(v[0]))
  54805. })
  54806. }
  54807. // VINSERTPS imm8, m32, xmm, xmm
  54808. if isImm8(v0) && isM32(v1) && isEVEXXMM(v2) && isEVEXXMM(v3) {
  54809. self.require(ISA_AVX512F)
  54810. p.domain = DomainAVX
  54811. p.add(0, func(m *_Encoding, v []interface{}) {
  54812. m.evex(0b11, 0x05, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), 0, 0, 0)
  54813. m.emit(0x21)
  54814. m.mrsd(lcode(v[3]), addr(v[1]), 4)
  54815. m.imm1(toImmAny(v[0]))
  54816. })
  54817. }
  54818. if p.len == 0 {
  54819. panic("invalid operands for VINSERTPS")
  54820. }
  54821. return p
  54822. }
  54823. // VLDDQU performs "Load Unaligned Integer 128 Bits".
  54824. //
  54825. // Mnemonic : VLDDQU
  54826. // Supported forms : (2 forms)
  54827. //
  54828. // * VLDDQU m128, xmm [AVX]
  54829. // * VLDDQU m256, ymm [AVX]
  54830. //
  54831. func (self *Program) VLDDQU(v0 interface{}, v1 interface{}) *Instruction {
  54832. p := self.alloc("VLDDQU", 2, Operands { v0, v1 })
  54833. // VLDDQU m128, xmm
  54834. if isM128(v0) && isXMM(v1) {
  54835. self.require(ISA_AVX)
  54836. p.domain = DomainAVX
  54837. p.add(0, func(m *_Encoding, v []interface{}) {
  54838. m.vex2(3, hcode(v[1]), addr(v[0]), 0)
  54839. m.emit(0xf0)
  54840. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  54841. })
  54842. }
  54843. // VLDDQU m256, ymm
  54844. if isM256(v0) && isYMM(v1) {
  54845. self.require(ISA_AVX)
  54846. p.domain = DomainAVX
  54847. p.add(0, func(m *_Encoding, v []interface{}) {
  54848. m.vex2(7, hcode(v[1]), addr(v[0]), 0)
  54849. m.emit(0xf0)
  54850. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  54851. })
  54852. }
  54853. if p.len == 0 {
  54854. panic("invalid operands for VLDDQU")
  54855. }
  54856. return p
  54857. }
  54858. // VLDMXCSR performs "Load MXCSR Register".
  54859. //
  54860. // Mnemonic : VLDMXCSR
  54861. // Supported forms : (1 form)
  54862. //
  54863. // * VLDMXCSR m32 [AVX]
  54864. //
  54865. func (self *Program) VLDMXCSR(v0 interface{}) *Instruction {
  54866. p := self.alloc("VLDMXCSR", 1, Operands { v0 })
  54867. // VLDMXCSR m32
  54868. if isM32(v0) {
  54869. self.require(ISA_AVX)
  54870. p.domain = DomainAVX
  54871. p.add(0, func(m *_Encoding, v []interface{}) {
  54872. m.vex2(0, 0, addr(v[0]), 0)
  54873. m.emit(0xae)
  54874. m.mrsd(2, addr(v[0]), 1)
  54875. })
  54876. }
  54877. if p.len == 0 {
  54878. panic("invalid operands for VLDMXCSR")
  54879. }
  54880. return p
  54881. }
  54882. // VMASKMOVDQU performs "Store Selected Bytes of Double Quadword".
  54883. //
  54884. // Mnemonic : VMASKMOVDQU
  54885. // Supported forms : (1 form)
  54886. //
  54887. // * VMASKMOVDQU xmm, xmm [AVX]
  54888. //
  54889. func (self *Program) VMASKMOVDQU(v0 interface{}, v1 interface{}) *Instruction {
  54890. p := self.alloc("VMASKMOVDQU", 2, Operands { v0, v1 })
  54891. // VMASKMOVDQU xmm, xmm
  54892. if isXMM(v0) && isXMM(v1) {
  54893. self.require(ISA_AVX)
  54894. p.domain = DomainAVX
  54895. p.add(0, func(m *_Encoding, v []interface{}) {
  54896. m.vex2(1, hcode(v[1]), v[0], 0)
  54897. m.emit(0xf7)
  54898. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  54899. })
  54900. }
  54901. if p.len == 0 {
  54902. panic("invalid operands for VMASKMOVDQU")
  54903. }
  54904. return p
  54905. }
  54906. // VMASKMOVPD performs "Conditional Move Packed Double-Precision Floating-Point Values".
  54907. //
  54908. // Mnemonic : VMASKMOVPD
  54909. // Supported forms : (4 forms)
  54910. //
  54911. // * VMASKMOVPD m128, xmm, xmm [AVX]
  54912. // * VMASKMOVPD m256, ymm, ymm [AVX]
  54913. // * VMASKMOVPD xmm, xmm, m128 [AVX]
  54914. // * VMASKMOVPD ymm, ymm, m256 [AVX]
  54915. //
  54916. func (self *Program) VMASKMOVPD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  54917. p := self.alloc("VMASKMOVPD", 3, Operands { v0, v1, v2 })
  54918. // VMASKMOVPD m128, xmm, xmm
  54919. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  54920. self.require(ISA_AVX)
  54921. p.domain = DomainAVX
  54922. p.add(0, func(m *_Encoding, v []interface{}) {
  54923. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  54924. m.emit(0x2d)
  54925. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  54926. })
  54927. }
  54928. // VMASKMOVPD m256, ymm, ymm
  54929. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  54930. self.require(ISA_AVX)
  54931. p.domain = DomainAVX
  54932. p.add(0, func(m *_Encoding, v []interface{}) {
  54933. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  54934. m.emit(0x2d)
  54935. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  54936. })
  54937. }
  54938. // VMASKMOVPD xmm, xmm, m128
  54939. if isXMM(v0) && isXMM(v1) && isM128(v2) {
  54940. self.require(ISA_AVX)
  54941. p.domain = DomainAVX
  54942. p.add(0, func(m *_Encoding, v []interface{}) {
  54943. m.vex3(0xc4, 0b10, 0x01, hcode(v[0]), addr(v[2]), hlcode(v[1]))
  54944. m.emit(0x2f)
  54945. m.mrsd(lcode(v[0]), addr(v[2]), 1)
  54946. })
  54947. }
  54948. // VMASKMOVPD ymm, ymm, m256
  54949. if isYMM(v0) && isYMM(v1) && isM256(v2) {
  54950. self.require(ISA_AVX)
  54951. p.domain = DomainAVX
  54952. p.add(0, func(m *_Encoding, v []interface{}) {
  54953. m.vex3(0xc4, 0b10, 0x05, hcode(v[0]), addr(v[2]), hlcode(v[1]))
  54954. m.emit(0x2f)
  54955. m.mrsd(lcode(v[0]), addr(v[2]), 1)
  54956. })
  54957. }
  54958. if p.len == 0 {
  54959. panic("invalid operands for VMASKMOVPD")
  54960. }
  54961. return p
  54962. }
  54963. // VMASKMOVPS performs "Conditional Move Packed Single-Precision Floating-Point Values".
  54964. //
  54965. // Mnemonic : VMASKMOVPS
  54966. // Supported forms : (4 forms)
  54967. //
  54968. // * VMASKMOVPS m128, xmm, xmm [AVX]
  54969. // * VMASKMOVPS m256, ymm, ymm [AVX]
  54970. // * VMASKMOVPS xmm, xmm, m128 [AVX]
  54971. // * VMASKMOVPS ymm, ymm, m256 [AVX]
  54972. //
  54973. func (self *Program) VMASKMOVPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  54974. p := self.alloc("VMASKMOVPS", 3, Operands { v0, v1, v2 })
  54975. // VMASKMOVPS m128, xmm, xmm
  54976. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  54977. self.require(ISA_AVX)
  54978. p.domain = DomainAVX
  54979. p.add(0, func(m *_Encoding, v []interface{}) {
  54980. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  54981. m.emit(0x2c)
  54982. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  54983. })
  54984. }
  54985. // VMASKMOVPS m256, ymm, ymm
  54986. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  54987. self.require(ISA_AVX)
  54988. p.domain = DomainAVX
  54989. p.add(0, func(m *_Encoding, v []interface{}) {
  54990. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  54991. m.emit(0x2c)
  54992. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  54993. })
  54994. }
  54995. // VMASKMOVPS xmm, xmm, m128
  54996. if isXMM(v0) && isXMM(v1) && isM128(v2) {
  54997. self.require(ISA_AVX)
  54998. p.domain = DomainAVX
  54999. p.add(0, func(m *_Encoding, v []interface{}) {
  55000. m.vex3(0xc4, 0b10, 0x01, hcode(v[0]), addr(v[2]), hlcode(v[1]))
  55001. m.emit(0x2e)
  55002. m.mrsd(lcode(v[0]), addr(v[2]), 1)
  55003. })
  55004. }
  55005. // VMASKMOVPS ymm, ymm, m256
  55006. if isYMM(v0) && isYMM(v1) && isM256(v2) {
  55007. self.require(ISA_AVX)
  55008. p.domain = DomainAVX
  55009. p.add(0, func(m *_Encoding, v []interface{}) {
  55010. m.vex3(0xc4, 0b10, 0x05, hcode(v[0]), addr(v[2]), hlcode(v[1]))
  55011. m.emit(0x2e)
  55012. m.mrsd(lcode(v[0]), addr(v[2]), 1)
  55013. })
  55014. }
  55015. if p.len == 0 {
  55016. panic("invalid operands for VMASKMOVPS")
  55017. }
  55018. return p
  55019. }
  55020. // VMAXPD performs "Return Maximum Packed Double-Precision Floating-Point Values".
  55021. //
  55022. // Mnemonic : VMAXPD
  55023. // Supported forms : (11 forms)
  55024. //
  55025. // * VMAXPD xmm, xmm, xmm [AVX]
  55026. // * VMAXPD m128, xmm, xmm [AVX]
  55027. // * VMAXPD ymm, ymm, ymm [AVX]
  55028. // * VMAXPD m256, ymm, ymm [AVX]
  55029. // * VMAXPD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  55030. // * VMAXPD {sae}, zmm, zmm, zmm{k}{z} [AVX512F]
  55031. // * VMAXPD zmm, zmm, zmm{k}{z} [AVX512F]
  55032. // * VMAXPD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  55033. // * VMAXPD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  55034. // * VMAXPD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  55035. // * VMAXPD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  55036. //
  55037. func (self *Program) VMAXPD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  55038. var p *Instruction
  55039. switch len(vv) {
  55040. case 0 : p = self.alloc("VMAXPD", 3, Operands { v0, v1, v2 })
  55041. case 1 : p = self.alloc("VMAXPD", 4, Operands { v0, v1, v2, vv[0] })
  55042. default : panic("instruction VMAXPD takes 3 or 4 operands")
  55043. }
  55044. // VMAXPD xmm, xmm, xmm
  55045. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  55046. self.require(ISA_AVX)
  55047. p.domain = DomainAVX
  55048. p.add(0, func(m *_Encoding, v []interface{}) {
  55049. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  55050. m.emit(0x5f)
  55051. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55052. })
  55053. }
  55054. // VMAXPD m128, xmm, xmm
  55055. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  55056. self.require(ISA_AVX)
  55057. p.domain = DomainAVX
  55058. p.add(0, func(m *_Encoding, v []interface{}) {
  55059. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  55060. m.emit(0x5f)
  55061. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  55062. })
  55063. }
  55064. // VMAXPD ymm, ymm, ymm
  55065. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  55066. self.require(ISA_AVX)
  55067. p.domain = DomainAVX
  55068. p.add(0, func(m *_Encoding, v []interface{}) {
  55069. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  55070. m.emit(0x5f)
  55071. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55072. })
  55073. }
  55074. // VMAXPD m256, ymm, ymm
  55075. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  55076. self.require(ISA_AVX)
  55077. p.domain = DomainAVX
  55078. p.add(0, func(m *_Encoding, v []interface{}) {
  55079. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  55080. m.emit(0x5f)
  55081. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  55082. })
  55083. }
  55084. // VMAXPD m512/m64bcst, zmm, zmm{k}{z}
  55085. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  55086. self.require(ISA_AVX512F)
  55087. p.domain = DomainAVX
  55088. p.add(0, func(m *_Encoding, v []interface{}) {
  55089. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  55090. m.emit(0x5f)
  55091. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  55092. })
  55093. }
  55094. // VMAXPD {sae}, zmm, zmm, zmm{k}{z}
  55095. if len(vv) == 1 && isSAE(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  55096. self.require(ISA_AVX512F)
  55097. p.domain = DomainAVX
  55098. p.add(0, func(m *_Encoding, v []interface{}) {
  55099. m.emit(0x62)
  55100. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  55101. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  55102. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  55103. m.emit(0x5f)
  55104. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  55105. })
  55106. }
  55107. // VMAXPD zmm, zmm, zmm{k}{z}
  55108. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  55109. self.require(ISA_AVX512F)
  55110. p.domain = DomainAVX
  55111. p.add(0, func(m *_Encoding, v []interface{}) {
  55112. m.emit(0x62)
  55113. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  55114. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  55115. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  55116. m.emit(0x5f)
  55117. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55118. })
  55119. }
  55120. // VMAXPD m128/m64bcst, xmm, xmm{k}{z}
  55121. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  55122. self.require(ISA_AVX512VL | ISA_AVX512F)
  55123. p.domain = DomainAVX
  55124. p.add(0, func(m *_Encoding, v []interface{}) {
  55125. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  55126. m.emit(0x5f)
  55127. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  55128. })
  55129. }
  55130. // VMAXPD xmm, xmm, xmm{k}{z}
  55131. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  55132. self.require(ISA_AVX512VL | ISA_AVX512F)
  55133. p.domain = DomainAVX
  55134. p.add(0, func(m *_Encoding, v []interface{}) {
  55135. m.emit(0x62)
  55136. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  55137. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  55138. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  55139. m.emit(0x5f)
  55140. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55141. })
  55142. }
  55143. // VMAXPD m256/m64bcst, ymm, ymm{k}{z}
  55144. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  55145. self.require(ISA_AVX512VL | ISA_AVX512F)
  55146. p.domain = DomainAVX
  55147. p.add(0, func(m *_Encoding, v []interface{}) {
  55148. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  55149. m.emit(0x5f)
  55150. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  55151. })
  55152. }
  55153. // VMAXPD ymm, ymm, ymm{k}{z}
  55154. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  55155. self.require(ISA_AVX512VL | ISA_AVX512F)
  55156. p.domain = DomainAVX
  55157. p.add(0, func(m *_Encoding, v []interface{}) {
  55158. m.emit(0x62)
  55159. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  55160. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  55161. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  55162. m.emit(0x5f)
  55163. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55164. })
  55165. }
  55166. if p.len == 0 {
  55167. panic("invalid operands for VMAXPD")
  55168. }
  55169. return p
  55170. }
  55171. // VMAXPS performs "Return Maximum Packed Single-Precision Floating-Point Values".
  55172. //
  55173. // Mnemonic : VMAXPS
  55174. // Supported forms : (11 forms)
  55175. //
  55176. // * VMAXPS xmm, xmm, xmm [AVX]
  55177. // * VMAXPS m128, xmm, xmm [AVX]
  55178. // * VMAXPS ymm, ymm, ymm [AVX]
  55179. // * VMAXPS m256, ymm, ymm [AVX]
  55180. // * VMAXPS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  55181. // * VMAXPS {sae}, zmm, zmm, zmm{k}{z} [AVX512F]
  55182. // * VMAXPS zmm, zmm, zmm{k}{z} [AVX512F]
  55183. // * VMAXPS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  55184. // * VMAXPS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  55185. // * VMAXPS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  55186. // * VMAXPS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  55187. //
  55188. func (self *Program) VMAXPS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  55189. var p *Instruction
  55190. switch len(vv) {
  55191. case 0 : p = self.alloc("VMAXPS", 3, Operands { v0, v1, v2 })
  55192. case 1 : p = self.alloc("VMAXPS", 4, Operands { v0, v1, v2, vv[0] })
  55193. default : panic("instruction VMAXPS takes 3 or 4 operands")
  55194. }
  55195. // VMAXPS xmm, xmm, xmm
  55196. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  55197. self.require(ISA_AVX)
  55198. p.domain = DomainAVX
  55199. p.add(0, func(m *_Encoding, v []interface{}) {
  55200. m.vex2(0, hcode(v[2]), v[0], hlcode(v[1]))
  55201. m.emit(0x5f)
  55202. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55203. })
  55204. }
  55205. // VMAXPS m128, xmm, xmm
  55206. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  55207. self.require(ISA_AVX)
  55208. p.domain = DomainAVX
  55209. p.add(0, func(m *_Encoding, v []interface{}) {
  55210. m.vex2(0, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  55211. m.emit(0x5f)
  55212. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  55213. })
  55214. }
  55215. // VMAXPS ymm, ymm, ymm
  55216. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  55217. self.require(ISA_AVX)
  55218. p.domain = DomainAVX
  55219. p.add(0, func(m *_Encoding, v []interface{}) {
  55220. m.vex2(4, hcode(v[2]), v[0], hlcode(v[1]))
  55221. m.emit(0x5f)
  55222. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55223. })
  55224. }
  55225. // VMAXPS m256, ymm, ymm
  55226. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  55227. self.require(ISA_AVX)
  55228. p.domain = DomainAVX
  55229. p.add(0, func(m *_Encoding, v []interface{}) {
  55230. m.vex2(4, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  55231. m.emit(0x5f)
  55232. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  55233. })
  55234. }
  55235. // VMAXPS m512/m32bcst, zmm, zmm{k}{z}
  55236. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  55237. self.require(ISA_AVX512F)
  55238. p.domain = DomainAVX
  55239. p.add(0, func(m *_Encoding, v []interface{}) {
  55240. m.evex(0b01, 0x04, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  55241. m.emit(0x5f)
  55242. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  55243. })
  55244. }
  55245. // VMAXPS {sae}, zmm, zmm, zmm{k}{z}
  55246. if len(vv) == 1 && isSAE(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  55247. self.require(ISA_AVX512F)
  55248. p.domain = DomainAVX
  55249. p.add(0, func(m *_Encoding, v []interface{}) {
  55250. m.emit(0x62)
  55251. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  55252. m.emit(0x7c ^ (hlcode(v[2]) << 3))
  55253. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  55254. m.emit(0x5f)
  55255. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  55256. })
  55257. }
  55258. // VMAXPS zmm, zmm, zmm{k}{z}
  55259. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  55260. self.require(ISA_AVX512F)
  55261. p.domain = DomainAVX
  55262. p.add(0, func(m *_Encoding, v []interface{}) {
  55263. m.emit(0x62)
  55264. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  55265. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  55266. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  55267. m.emit(0x5f)
  55268. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55269. })
  55270. }
  55271. // VMAXPS m128/m32bcst, xmm, xmm{k}{z}
  55272. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  55273. self.require(ISA_AVX512VL | ISA_AVX512F)
  55274. p.domain = DomainAVX
  55275. p.add(0, func(m *_Encoding, v []interface{}) {
  55276. m.evex(0b01, 0x04, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  55277. m.emit(0x5f)
  55278. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  55279. })
  55280. }
  55281. // VMAXPS xmm, xmm, xmm{k}{z}
  55282. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  55283. self.require(ISA_AVX512VL | ISA_AVX512F)
  55284. p.domain = DomainAVX
  55285. p.add(0, func(m *_Encoding, v []interface{}) {
  55286. m.emit(0x62)
  55287. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  55288. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  55289. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  55290. m.emit(0x5f)
  55291. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55292. })
  55293. }
  55294. // VMAXPS m256/m32bcst, ymm, ymm{k}{z}
  55295. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  55296. self.require(ISA_AVX512VL | ISA_AVX512F)
  55297. p.domain = DomainAVX
  55298. p.add(0, func(m *_Encoding, v []interface{}) {
  55299. m.evex(0b01, 0x04, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  55300. m.emit(0x5f)
  55301. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  55302. })
  55303. }
  55304. // VMAXPS ymm, ymm, ymm{k}{z}
  55305. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  55306. self.require(ISA_AVX512VL | ISA_AVX512F)
  55307. p.domain = DomainAVX
  55308. p.add(0, func(m *_Encoding, v []interface{}) {
  55309. m.emit(0x62)
  55310. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  55311. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  55312. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  55313. m.emit(0x5f)
  55314. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55315. })
  55316. }
  55317. if p.len == 0 {
  55318. panic("invalid operands for VMAXPS")
  55319. }
  55320. return p
  55321. }
  55322. // VMAXSD performs "Return Maximum Scalar Double-Precision Floating-Point Value".
  55323. //
  55324. // Mnemonic : VMAXSD
  55325. // Supported forms : (5 forms)
  55326. //
  55327. // * VMAXSD xmm, xmm, xmm [AVX]
  55328. // * VMAXSD m64, xmm, xmm [AVX]
  55329. // * VMAXSD m64, xmm, xmm{k}{z} [AVX512F]
  55330. // * VMAXSD {sae}, xmm, xmm, xmm{k}{z} [AVX512F]
  55331. // * VMAXSD xmm, xmm, xmm{k}{z} [AVX512F]
  55332. //
  55333. func (self *Program) VMAXSD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  55334. var p *Instruction
  55335. switch len(vv) {
  55336. case 0 : p = self.alloc("VMAXSD", 3, Operands { v0, v1, v2 })
  55337. case 1 : p = self.alloc("VMAXSD", 4, Operands { v0, v1, v2, vv[0] })
  55338. default : panic("instruction VMAXSD takes 3 or 4 operands")
  55339. }
  55340. // VMAXSD xmm, xmm, xmm
  55341. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  55342. self.require(ISA_AVX)
  55343. p.domain = DomainAVX
  55344. p.add(0, func(m *_Encoding, v []interface{}) {
  55345. m.vex2(3, hcode(v[2]), v[0], hlcode(v[1]))
  55346. m.emit(0x5f)
  55347. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55348. })
  55349. }
  55350. // VMAXSD m64, xmm, xmm
  55351. if len(vv) == 0 && isM64(v0) && isXMM(v1) && isXMM(v2) {
  55352. self.require(ISA_AVX)
  55353. p.domain = DomainAVX
  55354. p.add(0, func(m *_Encoding, v []interface{}) {
  55355. m.vex2(3, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  55356. m.emit(0x5f)
  55357. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  55358. })
  55359. }
  55360. // VMAXSD m64, xmm, xmm{k}{z}
  55361. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  55362. self.require(ISA_AVX512F)
  55363. p.domain = DomainAVX
  55364. p.add(0, func(m *_Encoding, v []interface{}) {
  55365. m.evex(0b01, 0x87, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  55366. m.emit(0x5f)
  55367. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  55368. })
  55369. }
  55370. // VMAXSD {sae}, xmm, xmm, xmm{k}{z}
  55371. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  55372. self.require(ISA_AVX512F)
  55373. p.domain = DomainAVX
  55374. p.add(0, func(m *_Encoding, v []interface{}) {
  55375. m.emit(0x62)
  55376. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  55377. m.emit(0xff ^ (hlcode(v[2]) << 3))
  55378. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  55379. m.emit(0x5f)
  55380. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  55381. })
  55382. }
  55383. // VMAXSD xmm, xmm, xmm{k}{z}
  55384. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  55385. self.require(ISA_AVX512F)
  55386. p.domain = DomainAVX
  55387. p.add(0, func(m *_Encoding, v []interface{}) {
  55388. m.emit(0x62)
  55389. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  55390. m.emit(0xff ^ (hlcode(v[1]) << 3))
  55391. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  55392. m.emit(0x5f)
  55393. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55394. })
  55395. }
  55396. if p.len == 0 {
  55397. panic("invalid operands for VMAXSD")
  55398. }
  55399. return p
  55400. }
  55401. // VMAXSS performs "Return Maximum Scalar Single-Precision Floating-Point Value".
  55402. //
  55403. // Mnemonic : VMAXSS
  55404. // Supported forms : (5 forms)
  55405. //
  55406. // * VMAXSS xmm, xmm, xmm [AVX]
  55407. // * VMAXSS m32, xmm, xmm [AVX]
  55408. // * VMAXSS m32, xmm, xmm{k}{z} [AVX512F]
  55409. // * VMAXSS {sae}, xmm, xmm, xmm{k}{z} [AVX512F]
  55410. // * VMAXSS xmm, xmm, xmm{k}{z} [AVX512F]
  55411. //
  55412. func (self *Program) VMAXSS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  55413. var p *Instruction
  55414. switch len(vv) {
  55415. case 0 : p = self.alloc("VMAXSS", 3, Operands { v0, v1, v2 })
  55416. case 1 : p = self.alloc("VMAXSS", 4, Operands { v0, v1, v2, vv[0] })
  55417. default : panic("instruction VMAXSS takes 3 or 4 operands")
  55418. }
  55419. // VMAXSS xmm, xmm, xmm
  55420. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  55421. self.require(ISA_AVX)
  55422. p.domain = DomainAVX
  55423. p.add(0, func(m *_Encoding, v []interface{}) {
  55424. m.vex2(2, hcode(v[2]), v[0], hlcode(v[1]))
  55425. m.emit(0x5f)
  55426. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55427. })
  55428. }
  55429. // VMAXSS m32, xmm, xmm
  55430. if len(vv) == 0 && isM32(v0) && isXMM(v1) && isXMM(v2) {
  55431. self.require(ISA_AVX)
  55432. p.domain = DomainAVX
  55433. p.add(0, func(m *_Encoding, v []interface{}) {
  55434. m.vex2(2, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  55435. m.emit(0x5f)
  55436. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  55437. })
  55438. }
  55439. // VMAXSS m32, xmm, xmm{k}{z}
  55440. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  55441. self.require(ISA_AVX512F)
  55442. p.domain = DomainAVX
  55443. p.add(0, func(m *_Encoding, v []interface{}) {
  55444. m.evex(0b01, 0x06, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  55445. m.emit(0x5f)
  55446. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  55447. })
  55448. }
  55449. // VMAXSS {sae}, xmm, xmm, xmm{k}{z}
  55450. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  55451. self.require(ISA_AVX512F)
  55452. p.domain = DomainAVX
  55453. p.add(0, func(m *_Encoding, v []interface{}) {
  55454. m.emit(0x62)
  55455. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  55456. m.emit(0x7e ^ (hlcode(v[2]) << 3))
  55457. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  55458. m.emit(0x5f)
  55459. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  55460. })
  55461. }
  55462. // VMAXSS xmm, xmm, xmm{k}{z}
  55463. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  55464. self.require(ISA_AVX512F)
  55465. p.domain = DomainAVX
  55466. p.add(0, func(m *_Encoding, v []interface{}) {
  55467. m.emit(0x62)
  55468. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  55469. m.emit(0x7e ^ (hlcode(v[1]) << 3))
  55470. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  55471. m.emit(0x5f)
  55472. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55473. })
  55474. }
  55475. if p.len == 0 {
  55476. panic("invalid operands for VMAXSS")
  55477. }
  55478. return p
  55479. }
  55480. // VMINPD performs "Return Minimum Packed Double-Precision Floating-Point Values".
  55481. //
  55482. // Mnemonic : VMINPD
  55483. // Supported forms : (11 forms)
  55484. //
  55485. // * VMINPD xmm, xmm, xmm [AVX]
  55486. // * VMINPD m128, xmm, xmm [AVX]
  55487. // * VMINPD ymm, ymm, ymm [AVX]
  55488. // * VMINPD m256, ymm, ymm [AVX]
  55489. // * VMINPD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  55490. // * VMINPD {sae}, zmm, zmm, zmm{k}{z} [AVX512F]
  55491. // * VMINPD zmm, zmm, zmm{k}{z} [AVX512F]
  55492. // * VMINPD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  55493. // * VMINPD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  55494. // * VMINPD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  55495. // * VMINPD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  55496. //
  55497. func (self *Program) VMINPD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  55498. var p *Instruction
  55499. switch len(vv) {
  55500. case 0 : p = self.alloc("VMINPD", 3, Operands { v0, v1, v2 })
  55501. case 1 : p = self.alloc("VMINPD", 4, Operands { v0, v1, v2, vv[0] })
  55502. default : panic("instruction VMINPD takes 3 or 4 operands")
  55503. }
  55504. // VMINPD xmm, xmm, xmm
  55505. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  55506. self.require(ISA_AVX)
  55507. p.domain = DomainAVX
  55508. p.add(0, func(m *_Encoding, v []interface{}) {
  55509. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  55510. m.emit(0x5d)
  55511. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55512. })
  55513. }
  55514. // VMINPD m128, xmm, xmm
  55515. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  55516. self.require(ISA_AVX)
  55517. p.domain = DomainAVX
  55518. p.add(0, func(m *_Encoding, v []interface{}) {
  55519. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  55520. m.emit(0x5d)
  55521. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  55522. })
  55523. }
  55524. // VMINPD ymm, ymm, ymm
  55525. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  55526. self.require(ISA_AVX)
  55527. p.domain = DomainAVX
  55528. p.add(0, func(m *_Encoding, v []interface{}) {
  55529. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  55530. m.emit(0x5d)
  55531. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55532. })
  55533. }
  55534. // VMINPD m256, ymm, ymm
  55535. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  55536. self.require(ISA_AVX)
  55537. p.domain = DomainAVX
  55538. p.add(0, func(m *_Encoding, v []interface{}) {
  55539. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  55540. m.emit(0x5d)
  55541. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  55542. })
  55543. }
  55544. // VMINPD m512/m64bcst, zmm, zmm{k}{z}
  55545. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  55546. self.require(ISA_AVX512F)
  55547. p.domain = DomainAVX
  55548. p.add(0, func(m *_Encoding, v []interface{}) {
  55549. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  55550. m.emit(0x5d)
  55551. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  55552. })
  55553. }
  55554. // VMINPD {sae}, zmm, zmm, zmm{k}{z}
  55555. if len(vv) == 1 && isSAE(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  55556. self.require(ISA_AVX512F)
  55557. p.domain = DomainAVX
  55558. p.add(0, func(m *_Encoding, v []interface{}) {
  55559. m.emit(0x62)
  55560. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  55561. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  55562. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  55563. m.emit(0x5d)
  55564. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  55565. })
  55566. }
  55567. // VMINPD zmm, zmm, zmm{k}{z}
  55568. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  55569. self.require(ISA_AVX512F)
  55570. p.domain = DomainAVX
  55571. p.add(0, func(m *_Encoding, v []interface{}) {
  55572. m.emit(0x62)
  55573. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  55574. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  55575. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  55576. m.emit(0x5d)
  55577. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55578. })
  55579. }
  55580. // VMINPD m128/m64bcst, xmm, xmm{k}{z}
  55581. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  55582. self.require(ISA_AVX512VL | ISA_AVX512F)
  55583. p.domain = DomainAVX
  55584. p.add(0, func(m *_Encoding, v []interface{}) {
  55585. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  55586. m.emit(0x5d)
  55587. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  55588. })
  55589. }
  55590. // VMINPD xmm, xmm, xmm{k}{z}
  55591. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  55592. self.require(ISA_AVX512VL | ISA_AVX512F)
  55593. p.domain = DomainAVX
  55594. p.add(0, func(m *_Encoding, v []interface{}) {
  55595. m.emit(0x62)
  55596. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  55597. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  55598. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  55599. m.emit(0x5d)
  55600. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55601. })
  55602. }
  55603. // VMINPD m256/m64bcst, ymm, ymm{k}{z}
  55604. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  55605. self.require(ISA_AVX512VL | ISA_AVX512F)
  55606. p.domain = DomainAVX
  55607. p.add(0, func(m *_Encoding, v []interface{}) {
  55608. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  55609. m.emit(0x5d)
  55610. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  55611. })
  55612. }
  55613. // VMINPD ymm, ymm, ymm{k}{z}
  55614. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  55615. self.require(ISA_AVX512VL | ISA_AVX512F)
  55616. p.domain = DomainAVX
  55617. p.add(0, func(m *_Encoding, v []interface{}) {
  55618. m.emit(0x62)
  55619. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  55620. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  55621. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  55622. m.emit(0x5d)
  55623. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55624. })
  55625. }
  55626. if p.len == 0 {
  55627. panic("invalid operands for VMINPD")
  55628. }
  55629. return p
  55630. }
  55631. // VMINPS performs "Return Minimum Packed Single-Precision Floating-Point Values".
  55632. //
  55633. // Mnemonic : VMINPS
  55634. // Supported forms : (11 forms)
  55635. //
  55636. // * VMINPS xmm, xmm, xmm [AVX]
  55637. // * VMINPS m128, xmm, xmm [AVX]
  55638. // * VMINPS ymm, ymm, ymm [AVX]
  55639. // * VMINPS m256, ymm, ymm [AVX]
  55640. // * VMINPS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  55641. // * VMINPS {sae}, zmm, zmm, zmm{k}{z} [AVX512F]
  55642. // * VMINPS zmm, zmm, zmm{k}{z} [AVX512F]
  55643. // * VMINPS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  55644. // * VMINPS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  55645. // * VMINPS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  55646. // * VMINPS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  55647. //
  55648. func (self *Program) VMINPS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  55649. var p *Instruction
  55650. switch len(vv) {
  55651. case 0 : p = self.alloc("VMINPS", 3, Operands { v0, v1, v2 })
  55652. case 1 : p = self.alloc("VMINPS", 4, Operands { v0, v1, v2, vv[0] })
  55653. default : panic("instruction VMINPS takes 3 or 4 operands")
  55654. }
  55655. // VMINPS xmm, xmm, xmm
  55656. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  55657. self.require(ISA_AVX)
  55658. p.domain = DomainAVX
  55659. p.add(0, func(m *_Encoding, v []interface{}) {
  55660. m.vex2(0, hcode(v[2]), v[0], hlcode(v[1]))
  55661. m.emit(0x5d)
  55662. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55663. })
  55664. }
  55665. // VMINPS m128, xmm, xmm
  55666. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  55667. self.require(ISA_AVX)
  55668. p.domain = DomainAVX
  55669. p.add(0, func(m *_Encoding, v []interface{}) {
  55670. m.vex2(0, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  55671. m.emit(0x5d)
  55672. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  55673. })
  55674. }
  55675. // VMINPS ymm, ymm, ymm
  55676. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  55677. self.require(ISA_AVX)
  55678. p.domain = DomainAVX
  55679. p.add(0, func(m *_Encoding, v []interface{}) {
  55680. m.vex2(4, hcode(v[2]), v[0], hlcode(v[1]))
  55681. m.emit(0x5d)
  55682. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55683. })
  55684. }
  55685. // VMINPS m256, ymm, ymm
  55686. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  55687. self.require(ISA_AVX)
  55688. p.domain = DomainAVX
  55689. p.add(0, func(m *_Encoding, v []interface{}) {
  55690. m.vex2(4, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  55691. m.emit(0x5d)
  55692. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  55693. })
  55694. }
  55695. // VMINPS m512/m32bcst, zmm, zmm{k}{z}
  55696. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  55697. self.require(ISA_AVX512F)
  55698. p.domain = DomainAVX
  55699. p.add(0, func(m *_Encoding, v []interface{}) {
  55700. m.evex(0b01, 0x04, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  55701. m.emit(0x5d)
  55702. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  55703. })
  55704. }
  55705. // VMINPS {sae}, zmm, zmm, zmm{k}{z}
  55706. if len(vv) == 1 && isSAE(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  55707. self.require(ISA_AVX512F)
  55708. p.domain = DomainAVX
  55709. p.add(0, func(m *_Encoding, v []interface{}) {
  55710. m.emit(0x62)
  55711. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  55712. m.emit(0x7c ^ (hlcode(v[2]) << 3))
  55713. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  55714. m.emit(0x5d)
  55715. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  55716. })
  55717. }
  55718. // VMINPS zmm, zmm, zmm{k}{z}
  55719. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  55720. self.require(ISA_AVX512F)
  55721. p.domain = DomainAVX
  55722. p.add(0, func(m *_Encoding, v []interface{}) {
  55723. m.emit(0x62)
  55724. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  55725. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  55726. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  55727. m.emit(0x5d)
  55728. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55729. })
  55730. }
  55731. // VMINPS m128/m32bcst, xmm, xmm{k}{z}
  55732. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  55733. self.require(ISA_AVX512VL | ISA_AVX512F)
  55734. p.domain = DomainAVX
  55735. p.add(0, func(m *_Encoding, v []interface{}) {
  55736. m.evex(0b01, 0x04, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  55737. m.emit(0x5d)
  55738. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  55739. })
  55740. }
  55741. // VMINPS xmm, xmm, xmm{k}{z}
  55742. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  55743. self.require(ISA_AVX512VL | ISA_AVX512F)
  55744. p.domain = DomainAVX
  55745. p.add(0, func(m *_Encoding, v []interface{}) {
  55746. m.emit(0x62)
  55747. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  55748. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  55749. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  55750. m.emit(0x5d)
  55751. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55752. })
  55753. }
  55754. // VMINPS m256/m32bcst, ymm, ymm{k}{z}
  55755. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  55756. self.require(ISA_AVX512VL | ISA_AVX512F)
  55757. p.domain = DomainAVX
  55758. p.add(0, func(m *_Encoding, v []interface{}) {
  55759. m.evex(0b01, 0x04, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  55760. m.emit(0x5d)
  55761. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  55762. })
  55763. }
  55764. // VMINPS ymm, ymm, ymm{k}{z}
  55765. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  55766. self.require(ISA_AVX512VL | ISA_AVX512F)
  55767. p.domain = DomainAVX
  55768. p.add(0, func(m *_Encoding, v []interface{}) {
  55769. m.emit(0x62)
  55770. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  55771. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  55772. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  55773. m.emit(0x5d)
  55774. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55775. })
  55776. }
  55777. if p.len == 0 {
  55778. panic("invalid operands for VMINPS")
  55779. }
  55780. return p
  55781. }
  55782. // VMINSD performs "Return Minimum Scalar Double-Precision Floating-Point Value".
  55783. //
  55784. // Mnemonic : VMINSD
  55785. // Supported forms : (5 forms)
  55786. //
  55787. // * VMINSD xmm, xmm, xmm [AVX]
  55788. // * VMINSD m64, xmm, xmm [AVX]
  55789. // * VMINSD m64, xmm, xmm{k}{z} [AVX512F]
  55790. // * VMINSD {sae}, xmm, xmm, xmm{k}{z} [AVX512F]
  55791. // * VMINSD xmm, xmm, xmm{k}{z} [AVX512F]
  55792. //
  55793. func (self *Program) VMINSD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  55794. var p *Instruction
  55795. switch len(vv) {
  55796. case 0 : p = self.alloc("VMINSD", 3, Operands { v0, v1, v2 })
  55797. case 1 : p = self.alloc("VMINSD", 4, Operands { v0, v1, v2, vv[0] })
  55798. default : panic("instruction VMINSD takes 3 or 4 operands")
  55799. }
  55800. // VMINSD xmm, xmm, xmm
  55801. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  55802. self.require(ISA_AVX)
  55803. p.domain = DomainAVX
  55804. p.add(0, func(m *_Encoding, v []interface{}) {
  55805. m.vex2(3, hcode(v[2]), v[0], hlcode(v[1]))
  55806. m.emit(0x5d)
  55807. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55808. })
  55809. }
  55810. // VMINSD m64, xmm, xmm
  55811. if len(vv) == 0 && isM64(v0) && isXMM(v1) && isXMM(v2) {
  55812. self.require(ISA_AVX)
  55813. p.domain = DomainAVX
  55814. p.add(0, func(m *_Encoding, v []interface{}) {
  55815. m.vex2(3, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  55816. m.emit(0x5d)
  55817. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  55818. })
  55819. }
  55820. // VMINSD m64, xmm, xmm{k}{z}
  55821. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  55822. self.require(ISA_AVX512F)
  55823. p.domain = DomainAVX
  55824. p.add(0, func(m *_Encoding, v []interface{}) {
  55825. m.evex(0b01, 0x87, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  55826. m.emit(0x5d)
  55827. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  55828. })
  55829. }
  55830. // VMINSD {sae}, xmm, xmm, xmm{k}{z}
  55831. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  55832. self.require(ISA_AVX512F)
  55833. p.domain = DomainAVX
  55834. p.add(0, func(m *_Encoding, v []interface{}) {
  55835. m.emit(0x62)
  55836. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  55837. m.emit(0xff ^ (hlcode(v[2]) << 3))
  55838. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  55839. m.emit(0x5d)
  55840. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  55841. })
  55842. }
  55843. // VMINSD xmm, xmm, xmm{k}{z}
  55844. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  55845. self.require(ISA_AVX512F)
  55846. p.domain = DomainAVX
  55847. p.add(0, func(m *_Encoding, v []interface{}) {
  55848. m.emit(0x62)
  55849. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  55850. m.emit(0xff ^ (hlcode(v[1]) << 3))
  55851. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  55852. m.emit(0x5d)
  55853. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55854. })
  55855. }
  55856. if p.len == 0 {
  55857. panic("invalid operands for VMINSD")
  55858. }
  55859. return p
  55860. }
  55861. // VMINSS performs "Return Minimum Scalar Single-Precision Floating-Point Value".
  55862. //
  55863. // Mnemonic : VMINSS
  55864. // Supported forms : (5 forms)
  55865. //
  55866. // * VMINSS xmm, xmm, xmm [AVX]
  55867. // * VMINSS m32, xmm, xmm [AVX]
  55868. // * VMINSS m32, xmm, xmm{k}{z} [AVX512F]
  55869. // * VMINSS {sae}, xmm, xmm, xmm{k}{z} [AVX512F]
  55870. // * VMINSS xmm, xmm, xmm{k}{z} [AVX512F]
  55871. //
  55872. func (self *Program) VMINSS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  55873. var p *Instruction
  55874. switch len(vv) {
  55875. case 0 : p = self.alloc("VMINSS", 3, Operands { v0, v1, v2 })
  55876. case 1 : p = self.alloc("VMINSS", 4, Operands { v0, v1, v2, vv[0] })
  55877. default : panic("instruction VMINSS takes 3 or 4 operands")
  55878. }
  55879. // VMINSS xmm, xmm, xmm
  55880. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  55881. self.require(ISA_AVX)
  55882. p.domain = DomainAVX
  55883. p.add(0, func(m *_Encoding, v []interface{}) {
  55884. m.vex2(2, hcode(v[2]), v[0], hlcode(v[1]))
  55885. m.emit(0x5d)
  55886. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55887. })
  55888. }
  55889. // VMINSS m32, xmm, xmm
  55890. if len(vv) == 0 && isM32(v0) && isXMM(v1) && isXMM(v2) {
  55891. self.require(ISA_AVX)
  55892. p.domain = DomainAVX
  55893. p.add(0, func(m *_Encoding, v []interface{}) {
  55894. m.vex2(2, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  55895. m.emit(0x5d)
  55896. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  55897. })
  55898. }
  55899. // VMINSS m32, xmm, xmm{k}{z}
  55900. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  55901. self.require(ISA_AVX512F)
  55902. p.domain = DomainAVX
  55903. p.add(0, func(m *_Encoding, v []interface{}) {
  55904. m.evex(0b01, 0x06, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  55905. m.emit(0x5d)
  55906. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  55907. })
  55908. }
  55909. // VMINSS {sae}, xmm, xmm, xmm{k}{z}
  55910. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  55911. self.require(ISA_AVX512F)
  55912. p.domain = DomainAVX
  55913. p.add(0, func(m *_Encoding, v []interface{}) {
  55914. m.emit(0x62)
  55915. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  55916. m.emit(0x7e ^ (hlcode(v[2]) << 3))
  55917. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  55918. m.emit(0x5d)
  55919. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  55920. })
  55921. }
  55922. // VMINSS xmm, xmm, xmm{k}{z}
  55923. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  55924. self.require(ISA_AVX512F)
  55925. p.domain = DomainAVX
  55926. p.add(0, func(m *_Encoding, v []interface{}) {
  55927. m.emit(0x62)
  55928. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  55929. m.emit(0x7e ^ (hlcode(v[1]) << 3))
  55930. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  55931. m.emit(0x5d)
  55932. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  55933. })
  55934. }
  55935. if p.len == 0 {
  55936. panic("invalid operands for VMINSS")
  55937. }
  55938. return p
  55939. }
  55940. // VMOVAPD performs "Move Aligned Packed Double-Precision Floating-Point Values".
  55941. //
  55942. // Mnemonic : VMOVAPD
  55943. // Supported forms : (15 forms)
  55944. //
  55945. // * VMOVAPD xmm, xmm [AVX]
  55946. // * VMOVAPD m128, xmm [AVX]
  55947. // * VMOVAPD ymm, ymm [AVX]
  55948. // * VMOVAPD m256, ymm [AVX]
  55949. // * VMOVAPD xmm, m128 [AVX]
  55950. // * VMOVAPD ymm, m256 [AVX]
  55951. // * VMOVAPD zmm, m512{k}{z} [AVX512F]
  55952. // * VMOVAPD zmm, zmm{k}{z} [AVX512F]
  55953. // * VMOVAPD m512, zmm{k}{z} [AVX512F]
  55954. // * VMOVAPD xmm, m128{k}{z} [AVX512F,AVX512VL]
  55955. // * VMOVAPD xmm, xmm{k}{z} [AVX512F,AVX512VL]
  55956. // * VMOVAPD ymm, m256{k}{z} [AVX512F,AVX512VL]
  55957. // * VMOVAPD ymm, ymm{k}{z} [AVX512F,AVX512VL]
  55958. // * VMOVAPD m128, xmm{k}{z} [AVX512F,AVX512VL]
  55959. // * VMOVAPD m256, ymm{k}{z} [AVX512F,AVX512VL]
  55960. //
  55961. func (self *Program) VMOVAPD(v0 interface{}, v1 interface{}) *Instruction {
  55962. p := self.alloc("VMOVAPD", 2, Operands { v0, v1 })
  55963. // VMOVAPD xmm, xmm
  55964. if isXMM(v0) && isXMM(v1) {
  55965. self.require(ISA_AVX)
  55966. p.domain = DomainAVX
  55967. p.add(0, func(m *_Encoding, v []interface{}) {
  55968. m.vex2(1, hcode(v[1]), v[0], 0)
  55969. m.emit(0x28)
  55970. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  55971. })
  55972. p.add(0, func(m *_Encoding, v []interface{}) {
  55973. m.vex2(1, hcode(v[0]), v[1], 0)
  55974. m.emit(0x29)
  55975. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  55976. })
  55977. }
  55978. // VMOVAPD m128, xmm
  55979. if isM128(v0) && isXMM(v1) {
  55980. self.require(ISA_AVX)
  55981. p.domain = DomainAVX
  55982. p.add(0, func(m *_Encoding, v []interface{}) {
  55983. m.vex2(1, hcode(v[1]), addr(v[0]), 0)
  55984. m.emit(0x28)
  55985. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  55986. })
  55987. }
  55988. // VMOVAPD ymm, ymm
  55989. if isYMM(v0) && isYMM(v1) {
  55990. self.require(ISA_AVX)
  55991. p.domain = DomainAVX
  55992. p.add(0, func(m *_Encoding, v []interface{}) {
  55993. m.vex2(5, hcode(v[1]), v[0], 0)
  55994. m.emit(0x28)
  55995. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  55996. })
  55997. p.add(0, func(m *_Encoding, v []interface{}) {
  55998. m.vex2(5, hcode(v[0]), v[1], 0)
  55999. m.emit(0x29)
  56000. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  56001. })
  56002. }
  56003. // VMOVAPD m256, ymm
  56004. if isM256(v0) && isYMM(v1) {
  56005. self.require(ISA_AVX)
  56006. p.domain = DomainAVX
  56007. p.add(0, func(m *_Encoding, v []interface{}) {
  56008. m.vex2(5, hcode(v[1]), addr(v[0]), 0)
  56009. m.emit(0x28)
  56010. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  56011. })
  56012. }
  56013. // VMOVAPD xmm, m128
  56014. if isXMM(v0) && isM128(v1) {
  56015. self.require(ISA_AVX)
  56016. p.domain = DomainAVX
  56017. p.add(0, func(m *_Encoding, v []interface{}) {
  56018. m.vex2(1, hcode(v[0]), addr(v[1]), 0)
  56019. m.emit(0x29)
  56020. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  56021. })
  56022. }
  56023. // VMOVAPD ymm, m256
  56024. if isYMM(v0) && isM256(v1) {
  56025. self.require(ISA_AVX)
  56026. p.domain = DomainAVX
  56027. p.add(0, func(m *_Encoding, v []interface{}) {
  56028. m.vex2(5, hcode(v[0]), addr(v[1]), 0)
  56029. m.emit(0x29)
  56030. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  56031. })
  56032. }
  56033. // VMOVAPD zmm, m512{k}{z}
  56034. if isZMM(v0) && isM512kz(v1) {
  56035. self.require(ISA_AVX512F)
  56036. p.domain = DomainAVX
  56037. p.add(0, func(m *_Encoding, v []interface{}) {
  56038. m.evex(0b01, 0x85, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  56039. m.emit(0x29)
  56040. m.mrsd(lcode(v[0]), addr(v[1]), 64)
  56041. })
  56042. }
  56043. // VMOVAPD zmm, zmm{k}{z}
  56044. if isZMM(v0) && isZMMkz(v1) {
  56045. self.require(ISA_AVX512F)
  56046. p.domain = DomainAVX
  56047. p.add(0, func(m *_Encoding, v []interface{}) {
  56048. m.emit(0x62)
  56049. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  56050. m.emit(0xfd)
  56051. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  56052. m.emit(0x28)
  56053. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56054. })
  56055. p.add(0, func(m *_Encoding, v []interface{}) {
  56056. m.emit(0x62)
  56057. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  56058. m.emit(0xfd)
  56059. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  56060. m.emit(0x29)
  56061. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  56062. })
  56063. }
  56064. // VMOVAPD m512, zmm{k}{z}
  56065. if isM512(v0) && isZMMkz(v1) {
  56066. self.require(ISA_AVX512F)
  56067. p.domain = DomainAVX
  56068. p.add(0, func(m *_Encoding, v []interface{}) {
  56069. m.evex(0b01, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  56070. m.emit(0x28)
  56071. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  56072. })
  56073. }
  56074. // VMOVAPD xmm, m128{k}{z}
  56075. if isEVEXXMM(v0) && isM128kz(v1) {
  56076. self.require(ISA_AVX512VL | ISA_AVX512F)
  56077. p.domain = DomainAVX
  56078. p.add(0, func(m *_Encoding, v []interface{}) {
  56079. m.evex(0b01, 0x85, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  56080. m.emit(0x29)
  56081. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  56082. })
  56083. }
  56084. // VMOVAPD xmm, xmm{k}{z}
  56085. if isEVEXXMM(v0) && isXMMkz(v1) {
  56086. self.require(ISA_AVX512VL | ISA_AVX512F)
  56087. p.domain = DomainAVX
  56088. p.add(0, func(m *_Encoding, v []interface{}) {
  56089. m.emit(0x62)
  56090. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  56091. m.emit(0xfd)
  56092. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  56093. m.emit(0x28)
  56094. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56095. })
  56096. p.add(0, func(m *_Encoding, v []interface{}) {
  56097. m.emit(0x62)
  56098. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  56099. m.emit(0xfd)
  56100. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  56101. m.emit(0x29)
  56102. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  56103. })
  56104. }
  56105. // VMOVAPD ymm, m256{k}{z}
  56106. if isEVEXYMM(v0) && isM256kz(v1) {
  56107. self.require(ISA_AVX512VL | ISA_AVX512F)
  56108. p.domain = DomainAVX
  56109. p.add(0, func(m *_Encoding, v []interface{}) {
  56110. m.evex(0b01, 0x85, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  56111. m.emit(0x29)
  56112. m.mrsd(lcode(v[0]), addr(v[1]), 32)
  56113. })
  56114. }
  56115. // VMOVAPD ymm, ymm{k}{z}
  56116. if isEVEXYMM(v0) && isYMMkz(v1) {
  56117. self.require(ISA_AVX512VL | ISA_AVX512F)
  56118. p.domain = DomainAVX
  56119. p.add(0, func(m *_Encoding, v []interface{}) {
  56120. m.emit(0x62)
  56121. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  56122. m.emit(0xfd)
  56123. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  56124. m.emit(0x28)
  56125. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56126. })
  56127. p.add(0, func(m *_Encoding, v []interface{}) {
  56128. m.emit(0x62)
  56129. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  56130. m.emit(0xfd)
  56131. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  56132. m.emit(0x29)
  56133. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  56134. })
  56135. }
  56136. // VMOVAPD m128, xmm{k}{z}
  56137. if isM128(v0) && isXMMkz(v1) {
  56138. self.require(ISA_AVX512VL | ISA_AVX512F)
  56139. p.domain = DomainAVX
  56140. p.add(0, func(m *_Encoding, v []interface{}) {
  56141. m.evex(0b01, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  56142. m.emit(0x28)
  56143. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  56144. })
  56145. }
  56146. // VMOVAPD m256, ymm{k}{z}
  56147. if isM256(v0) && isYMMkz(v1) {
  56148. self.require(ISA_AVX512VL | ISA_AVX512F)
  56149. p.domain = DomainAVX
  56150. p.add(0, func(m *_Encoding, v []interface{}) {
  56151. m.evex(0b01, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  56152. m.emit(0x28)
  56153. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  56154. })
  56155. }
  56156. if p.len == 0 {
  56157. panic("invalid operands for VMOVAPD")
  56158. }
  56159. return p
  56160. }
  56161. // VMOVAPS performs "Move Aligned Packed Single-Precision Floating-Point Values".
  56162. //
  56163. // Mnemonic : VMOVAPS
  56164. // Supported forms : (15 forms)
  56165. //
  56166. // * VMOVAPS xmm, xmm [AVX]
  56167. // * VMOVAPS m128, xmm [AVX]
  56168. // * VMOVAPS ymm, ymm [AVX]
  56169. // * VMOVAPS m256, ymm [AVX]
  56170. // * VMOVAPS xmm, m128 [AVX]
  56171. // * VMOVAPS ymm, m256 [AVX]
  56172. // * VMOVAPS zmm, m512{k}{z} [AVX512F]
  56173. // * VMOVAPS zmm, zmm{k}{z} [AVX512F]
  56174. // * VMOVAPS m512, zmm{k}{z} [AVX512F]
  56175. // * VMOVAPS xmm, m128{k}{z} [AVX512F,AVX512VL]
  56176. // * VMOVAPS xmm, xmm{k}{z} [AVX512F,AVX512VL]
  56177. // * VMOVAPS ymm, m256{k}{z} [AVX512F,AVX512VL]
  56178. // * VMOVAPS ymm, ymm{k}{z} [AVX512F,AVX512VL]
  56179. // * VMOVAPS m128, xmm{k}{z} [AVX512F,AVX512VL]
  56180. // * VMOVAPS m256, ymm{k}{z} [AVX512F,AVX512VL]
  56181. //
  56182. func (self *Program) VMOVAPS(v0 interface{}, v1 interface{}) *Instruction {
  56183. p := self.alloc("VMOVAPS", 2, Operands { v0, v1 })
  56184. // VMOVAPS xmm, xmm
  56185. if isXMM(v0) && isXMM(v1) {
  56186. self.require(ISA_AVX)
  56187. p.domain = DomainAVX
  56188. p.add(0, func(m *_Encoding, v []interface{}) {
  56189. m.vex2(0, hcode(v[1]), v[0], 0)
  56190. m.emit(0x28)
  56191. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56192. })
  56193. p.add(0, func(m *_Encoding, v []interface{}) {
  56194. m.vex2(0, hcode(v[0]), v[1], 0)
  56195. m.emit(0x29)
  56196. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  56197. })
  56198. }
  56199. // VMOVAPS m128, xmm
  56200. if isM128(v0) && isXMM(v1) {
  56201. self.require(ISA_AVX)
  56202. p.domain = DomainAVX
  56203. p.add(0, func(m *_Encoding, v []interface{}) {
  56204. m.vex2(0, hcode(v[1]), addr(v[0]), 0)
  56205. m.emit(0x28)
  56206. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  56207. })
  56208. }
  56209. // VMOVAPS ymm, ymm
  56210. if isYMM(v0) && isYMM(v1) {
  56211. self.require(ISA_AVX)
  56212. p.domain = DomainAVX
  56213. p.add(0, func(m *_Encoding, v []interface{}) {
  56214. m.vex2(4, hcode(v[1]), v[0], 0)
  56215. m.emit(0x28)
  56216. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56217. })
  56218. p.add(0, func(m *_Encoding, v []interface{}) {
  56219. m.vex2(4, hcode(v[0]), v[1], 0)
  56220. m.emit(0x29)
  56221. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  56222. })
  56223. }
  56224. // VMOVAPS m256, ymm
  56225. if isM256(v0) && isYMM(v1) {
  56226. self.require(ISA_AVX)
  56227. p.domain = DomainAVX
  56228. p.add(0, func(m *_Encoding, v []interface{}) {
  56229. m.vex2(4, hcode(v[1]), addr(v[0]), 0)
  56230. m.emit(0x28)
  56231. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  56232. })
  56233. }
  56234. // VMOVAPS xmm, m128
  56235. if isXMM(v0) && isM128(v1) {
  56236. self.require(ISA_AVX)
  56237. p.domain = DomainAVX
  56238. p.add(0, func(m *_Encoding, v []interface{}) {
  56239. m.vex2(0, hcode(v[0]), addr(v[1]), 0)
  56240. m.emit(0x29)
  56241. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  56242. })
  56243. }
  56244. // VMOVAPS ymm, m256
  56245. if isYMM(v0) && isM256(v1) {
  56246. self.require(ISA_AVX)
  56247. p.domain = DomainAVX
  56248. p.add(0, func(m *_Encoding, v []interface{}) {
  56249. m.vex2(4, hcode(v[0]), addr(v[1]), 0)
  56250. m.emit(0x29)
  56251. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  56252. })
  56253. }
  56254. // VMOVAPS zmm, m512{k}{z}
  56255. if isZMM(v0) && isM512kz(v1) {
  56256. self.require(ISA_AVX512F)
  56257. p.domain = DomainAVX
  56258. p.add(0, func(m *_Encoding, v []interface{}) {
  56259. m.evex(0b01, 0x04, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  56260. m.emit(0x29)
  56261. m.mrsd(lcode(v[0]), addr(v[1]), 64)
  56262. })
  56263. }
  56264. // VMOVAPS zmm, zmm{k}{z}
  56265. if isZMM(v0) && isZMMkz(v1) {
  56266. self.require(ISA_AVX512F)
  56267. p.domain = DomainAVX
  56268. p.add(0, func(m *_Encoding, v []interface{}) {
  56269. m.emit(0x62)
  56270. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  56271. m.emit(0x7c)
  56272. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  56273. m.emit(0x28)
  56274. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56275. })
  56276. p.add(0, func(m *_Encoding, v []interface{}) {
  56277. m.emit(0x62)
  56278. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  56279. m.emit(0x7c)
  56280. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  56281. m.emit(0x29)
  56282. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  56283. })
  56284. }
  56285. // VMOVAPS m512, zmm{k}{z}
  56286. if isM512(v0) && isZMMkz(v1) {
  56287. self.require(ISA_AVX512F)
  56288. p.domain = DomainAVX
  56289. p.add(0, func(m *_Encoding, v []interface{}) {
  56290. m.evex(0b01, 0x04, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  56291. m.emit(0x28)
  56292. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  56293. })
  56294. }
  56295. // VMOVAPS xmm, m128{k}{z}
  56296. if isEVEXXMM(v0) && isM128kz(v1) {
  56297. self.require(ISA_AVX512VL | ISA_AVX512F)
  56298. p.domain = DomainAVX
  56299. p.add(0, func(m *_Encoding, v []interface{}) {
  56300. m.evex(0b01, 0x04, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  56301. m.emit(0x29)
  56302. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  56303. })
  56304. }
  56305. // VMOVAPS xmm, xmm{k}{z}
  56306. if isEVEXXMM(v0) && isXMMkz(v1) {
  56307. self.require(ISA_AVX512VL | ISA_AVX512F)
  56308. p.domain = DomainAVX
  56309. p.add(0, func(m *_Encoding, v []interface{}) {
  56310. m.emit(0x62)
  56311. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  56312. m.emit(0x7c)
  56313. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  56314. m.emit(0x28)
  56315. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56316. })
  56317. p.add(0, func(m *_Encoding, v []interface{}) {
  56318. m.emit(0x62)
  56319. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  56320. m.emit(0x7c)
  56321. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  56322. m.emit(0x29)
  56323. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  56324. })
  56325. }
  56326. // VMOVAPS ymm, m256{k}{z}
  56327. if isEVEXYMM(v0) && isM256kz(v1) {
  56328. self.require(ISA_AVX512VL | ISA_AVX512F)
  56329. p.domain = DomainAVX
  56330. p.add(0, func(m *_Encoding, v []interface{}) {
  56331. m.evex(0b01, 0x04, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  56332. m.emit(0x29)
  56333. m.mrsd(lcode(v[0]), addr(v[1]), 32)
  56334. })
  56335. }
  56336. // VMOVAPS ymm, ymm{k}{z}
  56337. if isEVEXYMM(v0) && isYMMkz(v1) {
  56338. self.require(ISA_AVX512VL | ISA_AVX512F)
  56339. p.domain = DomainAVX
  56340. p.add(0, func(m *_Encoding, v []interface{}) {
  56341. m.emit(0x62)
  56342. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  56343. m.emit(0x7c)
  56344. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  56345. m.emit(0x28)
  56346. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56347. })
  56348. p.add(0, func(m *_Encoding, v []interface{}) {
  56349. m.emit(0x62)
  56350. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  56351. m.emit(0x7c)
  56352. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  56353. m.emit(0x29)
  56354. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  56355. })
  56356. }
  56357. // VMOVAPS m128, xmm{k}{z}
  56358. if isM128(v0) && isXMMkz(v1) {
  56359. self.require(ISA_AVX512VL | ISA_AVX512F)
  56360. p.domain = DomainAVX
  56361. p.add(0, func(m *_Encoding, v []interface{}) {
  56362. m.evex(0b01, 0x04, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  56363. m.emit(0x28)
  56364. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  56365. })
  56366. }
  56367. // VMOVAPS m256, ymm{k}{z}
  56368. if isM256(v0) && isYMMkz(v1) {
  56369. self.require(ISA_AVX512VL | ISA_AVX512F)
  56370. p.domain = DomainAVX
  56371. p.add(0, func(m *_Encoding, v []interface{}) {
  56372. m.evex(0b01, 0x04, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  56373. m.emit(0x28)
  56374. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  56375. })
  56376. }
  56377. if p.len == 0 {
  56378. panic("invalid operands for VMOVAPS")
  56379. }
  56380. return p
  56381. }
  56382. // VMOVD performs "Move Doubleword".
  56383. //
  56384. // Mnemonic : VMOVD
  56385. // Supported forms : (8 forms)
  56386. //
  56387. // * VMOVD xmm, r32 [AVX]
  56388. // * VMOVD r32, xmm [AVX]
  56389. // * VMOVD m32, xmm [AVX]
  56390. // * VMOVD xmm, m32 [AVX]
  56391. // * VMOVD xmm, r32 [AVX512F]
  56392. // * VMOVD r32, xmm [AVX512F]
  56393. // * VMOVD m32, xmm [AVX512F]
  56394. // * VMOVD xmm, m32 [AVX512F]
  56395. //
  56396. func (self *Program) VMOVD(v0 interface{}, v1 interface{}) *Instruction {
  56397. p := self.alloc("VMOVD", 2, Operands { v0, v1 })
  56398. // VMOVD xmm, r32
  56399. if isXMM(v0) && isReg32(v1) {
  56400. self.require(ISA_AVX)
  56401. p.domain = DomainAVX
  56402. p.add(0, func(m *_Encoding, v []interface{}) {
  56403. m.vex2(1, hcode(v[0]), v[1], 0)
  56404. m.emit(0x7e)
  56405. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  56406. })
  56407. }
  56408. // VMOVD r32, xmm
  56409. if isReg32(v0) && isXMM(v1) {
  56410. self.require(ISA_AVX)
  56411. p.domain = DomainAVX
  56412. p.add(0, func(m *_Encoding, v []interface{}) {
  56413. m.vex2(1, hcode(v[1]), v[0], 0)
  56414. m.emit(0x6e)
  56415. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56416. })
  56417. }
  56418. // VMOVD m32, xmm
  56419. if isM32(v0) && isXMM(v1) {
  56420. self.require(ISA_AVX)
  56421. p.domain = DomainAVX
  56422. p.add(0, func(m *_Encoding, v []interface{}) {
  56423. m.vex2(1, hcode(v[1]), addr(v[0]), 0)
  56424. m.emit(0x6e)
  56425. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  56426. })
  56427. }
  56428. // VMOVD xmm, m32
  56429. if isXMM(v0) && isM32(v1) {
  56430. self.require(ISA_AVX)
  56431. p.domain = DomainAVX
  56432. p.add(0, func(m *_Encoding, v []interface{}) {
  56433. m.vex2(1, hcode(v[0]), addr(v[1]), 0)
  56434. m.emit(0x7e)
  56435. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  56436. })
  56437. }
  56438. // VMOVD xmm, r32
  56439. if isEVEXXMM(v0) && isReg32(v1) {
  56440. self.require(ISA_AVX512F)
  56441. p.domain = DomainAVX
  56442. p.add(0, func(m *_Encoding, v []interface{}) {
  56443. m.emit(0x62)
  56444. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  56445. m.emit(0x7d)
  56446. m.emit(0x08)
  56447. m.emit(0x7e)
  56448. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  56449. })
  56450. }
  56451. // VMOVD r32, xmm
  56452. if isReg32(v0) && isEVEXXMM(v1) {
  56453. self.require(ISA_AVX512F)
  56454. p.domain = DomainAVX
  56455. p.add(0, func(m *_Encoding, v []interface{}) {
  56456. m.emit(0x62)
  56457. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  56458. m.emit(0x7d)
  56459. m.emit(0x08)
  56460. m.emit(0x6e)
  56461. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56462. })
  56463. }
  56464. // VMOVD m32, xmm
  56465. if isM32(v0) && isEVEXXMM(v1) {
  56466. self.require(ISA_AVX512F)
  56467. p.domain = DomainAVX
  56468. p.add(0, func(m *_Encoding, v []interface{}) {
  56469. m.evex(0b01, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  56470. m.emit(0x6e)
  56471. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  56472. })
  56473. }
  56474. // VMOVD xmm, m32
  56475. if isEVEXXMM(v0) && isM32(v1) {
  56476. self.require(ISA_AVX512F)
  56477. p.domain = DomainAVX
  56478. p.add(0, func(m *_Encoding, v []interface{}) {
  56479. m.evex(0b01, 0x05, 0b00, ehcode(v[0]), addr(v[1]), 0, 0, 0, 0)
  56480. m.emit(0x7e)
  56481. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  56482. })
  56483. }
  56484. if p.len == 0 {
  56485. panic("invalid operands for VMOVD")
  56486. }
  56487. return p
  56488. }
  56489. // VMOVDDUP performs "Move One Double-FP and Duplicate".
  56490. //
  56491. // Mnemonic : VMOVDDUP
  56492. // Supported forms : (10 forms)
  56493. //
  56494. // * VMOVDDUP xmm, xmm [AVX]
  56495. // * VMOVDDUP m64, xmm [AVX]
  56496. // * VMOVDDUP ymm, ymm [AVX]
  56497. // * VMOVDDUP m256, ymm [AVX]
  56498. // * VMOVDDUP zmm, zmm{k}{z} [AVX512F]
  56499. // * VMOVDDUP m512, zmm{k}{z} [AVX512F]
  56500. // * VMOVDDUP xmm, xmm{k}{z} [AVX512F,AVX512VL]
  56501. // * VMOVDDUP ymm, ymm{k}{z} [AVX512F,AVX512VL]
  56502. // * VMOVDDUP m64, xmm{k}{z} [AVX512F,AVX512VL]
  56503. // * VMOVDDUP m256, ymm{k}{z} [AVX512F,AVX512VL]
  56504. //
  56505. func (self *Program) VMOVDDUP(v0 interface{}, v1 interface{}) *Instruction {
  56506. p := self.alloc("VMOVDDUP", 2, Operands { v0, v1 })
  56507. // VMOVDDUP xmm, xmm
  56508. if isXMM(v0) && isXMM(v1) {
  56509. self.require(ISA_AVX)
  56510. p.domain = DomainAVX
  56511. p.add(0, func(m *_Encoding, v []interface{}) {
  56512. m.vex2(3, hcode(v[1]), v[0], 0)
  56513. m.emit(0x12)
  56514. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56515. })
  56516. }
  56517. // VMOVDDUP m64, xmm
  56518. if isM64(v0) && isXMM(v1) {
  56519. self.require(ISA_AVX)
  56520. p.domain = DomainAVX
  56521. p.add(0, func(m *_Encoding, v []interface{}) {
  56522. m.vex2(3, hcode(v[1]), addr(v[0]), 0)
  56523. m.emit(0x12)
  56524. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  56525. })
  56526. }
  56527. // VMOVDDUP ymm, ymm
  56528. if isYMM(v0) && isYMM(v1) {
  56529. self.require(ISA_AVX)
  56530. p.domain = DomainAVX
  56531. p.add(0, func(m *_Encoding, v []interface{}) {
  56532. m.vex2(7, hcode(v[1]), v[0], 0)
  56533. m.emit(0x12)
  56534. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56535. })
  56536. }
  56537. // VMOVDDUP m256, ymm
  56538. if isM256(v0) && isYMM(v1) {
  56539. self.require(ISA_AVX)
  56540. p.domain = DomainAVX
  56541. p.add(0, func(m *_Encoding, v []interface{}) {
  56542. m.vex2(7, hcode(v[1]), addr(v[0]), 0)
  56543. m.emit(0x12)
  56544. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  56545. })
  56546. }
  56547. // VMOVDDUP zmm, zmm{k}{z}
  56548. if isZMM(v0) && isZMMkz(v1) {
  56549. self.require(ISA_AVX512F)
  56550. p.domain = DomainAVX
  56551. p.add(0, func(m *_Encoding, v []interface{}) {
  56552. m.emit(0x62)
  56553. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  56554. m.emit(0xff)
  56555. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  56556. m.emit(0x12)
  56557. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56558. })
  56559. }
  56560. // VMOVDDUP m512, zmm{k}{z}
  56561. if isM512(v0) && isZMMkz(v1) {
  56562. self.require(ISA_AVX512F)
  56563. p.domain = DomainAVX
  56564. p.add(0, func(m *_Encoding, v []interface{}) {
  56565. m.evex(0b01, 0x87, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  56566. m.emit(0x12)
  56567. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  56568. })
  56569. }
  56570. // VMOVDDUP xmm, xmm{k}{z}
  56571. if isEVEXXMM(v0) && isXMMkz(v1) {
  56572. self.require(ISA_AVX512VL | ISA_AVX512F)
  56573. p.domain = DomainAVX
  56574. p.add(0, func(m *_Encoding, v []interface{}) {
  56575. m.emit(0x62)
  56576. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  56577. m.emit(0xff)
  56578. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  56579. m.emit(0x12)
  56580. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56581. })
  56582. }
  56583. // VMOVDDUP ymm, ymm{k}{z}
  56584. if isEVEXYMM(v0) && isYMMkz(v1) {
  56585. self.require(ISA_AVX512VL | ISA_AVX512F)
  56586. p.domain = DomainAVX
  56587. p.add(0, func(m *_Encoding, v []interface{}) {
  56588. m.emit(0x62)
  56589. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  56590. m.emit(0xff)
  56591. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  56592. m.emit(0x12)
  56593. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56594. })
  56595. }
  56596. // VMOVDDUP m64, xmm{k}{z}
  56597. if isM64(v0) && isXMMkz(v1) {
  56598. self.require(ISA_AVX512VL | ISA_AVX512F)
  56599. p.domain = DomainAVX
  56600. p.add(0, func(m *_Encoding, v []interface{}) {
  56601. m.evex(0b01, 0x87, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  56602. m.emit(0x12)
  56603. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  56604. })
  56605. }
  56606. // VMOVDDUP m256, ymm{k}{z}
  56607. if isM256(v0) && isYMMkz(v1) {
  56608. self.require(ISA_AVX512VL | ISA_AVX512F)
  56609. p.domain = DomainAVX
  56610. p.add(0, func(m *_Encoding, v []interface{}) {
  56611. m.evex(0b01, 0x87, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  56612. m.emit(0x12)
  56613. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  56614. })
  56615. }
  56616. if p.len == 0 {
  56617. panic("invalid operands for VMOVDDUP")
  56618. }
  56619. return p
  56620. }
  56621. // VMOVDQA performs "Move Aligned Double Quadword".
  56622. //
  56623. // Mnemonic : VMOVDQA
  56624. // Supported forms : (6 forms)
  56625. //
  56626. // * VMOVDQA xmm, xmm [AVX]
  56627. // * VMOVDQA m128, xmm [AVX]
  56628. // * VMOVDQA ymm, ymm [AVX]
  56629. // * VMOVDQA m256, ymm [AVX]
  56630. // * VMOVDQA xmm, m128 [AVX]
  56631. // * VMOVDQA ymm, m256 [AVX]
  56632. //
  56633. func (self *Program) VMOVDQA(v0 interface{}, v1 interface{}) *Instruction {
  56634. p := self.alloc("VMOVDQA", 2, Operands { v0, v1 })
  56635. // VMOVDQA xmm, xmm
  56636. if isXMM(v0) && isXMM(v1) {
  56637. self.require(ISA_AVX)
  56638. p.domain = DomainAVX
  56639. p.add(0, func(m *_Encoding, v []interface{}) {
  56640. m.vex2(1, hcode(v[1]), v[0], 0)
  56641. m.emit(0x6f)
  56642. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56643. })
  56644. p.add(0, func(m *_Encoding, v []interface{}) {
  56645. m.vex2(1, hcode(v[0]), v[1], 0)
  56646. m.emit(0x7f)
  56647. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  56648. })
  56649. }
  56650. // VMOVDQA m128, xmm
  56651. if isM128(v0) && isXMM(v1) {
  56652. self.require(ISA_AVX)
  56653. p.domain = DomainAVX
  56654. p.add(0, func(m *_Encoding, v []interface{}) {
  56655. m.vex2(1, hcode(v[1]), addr(v[0]), 0)
  56656. m.emit(0x6f)
  56657. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  56658. })
  56659. }
  56660. // VMOVDQA ymm, ymm
  56661. if isYMM(v0) && isYMM(v1) {
  56662. self.require(ISA_AVX)
  56663. p.domain = DomainAVX
  56664. p.add(0, func(m *_Encoding, v []interface{}) {
  56665. m.vex2(5, hcode(v[1]), v[0], 0)
  56666. m.emit(0x6f)
  56667. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56668. })
  56669. p.add(0, func(m *_Encoding, v []interface{}) {
  56670. m.vex2(5, hcode(v[0]), v[1], 0)
  56671. m.emit(0x7f)
  56672. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  56673. })
  56674. }
  56675. // VMOVDQA m256, ymm
  56676. if isM256(v0) && isYMM(v1) {
  56677. self.require(ISA_AVX)
  56678. p.domain = DomainAVX
  56679. p.add(0, func(m *_Encoding, v []interface{}) {
  56680. m.vex2(5, hcode(v[1]), addr(v[0]), 0)
  56681. m.emit(0x6f)
  56682. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  56683. })
  56684. }
  56685. // VMOVDQA xmm, m128
  56686. if isXMM(v0) && isM128(v1) {
  56687. self.require(ISA_AVX)
  56688. p.domain = DomainAVX
  56689. p.add(0, func(m *_Encoding, v []interface{}) {
  56690. m.vex2(1, hcode(v[0]), addr(v[1]), 0)
  56691. m.emit(0x7f)
  56692. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  56693. })
  56694. }
  56695. // VMOVDQA ymm, m256
  56696. if isYMM(v0) && isM256(v1) {
  56697. self.require(ISA_AVX)
  56698. p.domain = DomainAVX
  56699. p.add(0, func(m *_Encoding, v []interface{}) {
  56700. m.vex2(5, hcode(v[0]), addr(v[1]), 0)
  56701. m.emit(0x7f)
  56702. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  56703. })
  56704. }
  56705. if p.len == 0 {
  56706. panic("invalid operands for VMOVDQA")
  56707. }
  56708. return p
  56709. }
  56710. // VMOVDQA32 performs "Move Aligned Doubleword Values".
  56711. //
  56712. // Mnemonic : VMOVDQA32
  56713. // Supported forms : (9 forms)
  56714. //
  56715. // * VMOVDQA32 zmm, m512{k}{z} [AVX512F]
  56716. // * VMOVDQA32 zmm, zmm{k}{z} [AVX512F]
  56717. // * VMOVDQA32 m512, zmm{k}{z} [AVX512F]
  56718. // * VMOVDQA32 xmm, m128{k}{z} [AVX512F,AVX512VL]
  56719. // * VMOVDQA32 xmm, xmm{k}{z} [AVX512F,AVX512VL]
  56720. // * VMOVDQA32 ymm, m256{k}{z} [AVX512F,AVX512VL]
  56721. // * VMOVDQA32 ymm, ymm{k}{z} [AVX512F,AVX512VL]
  56722. // * VMOVDQA32 m128, xmm{k}{z} [AVX512F,AVX512VL]
  56723. // * VMOVDQA32 m256, ymm{k}{z} [AVX512F,AVX512VL]
  56724. //
  56725. func (self *Program) VMOVDQA32(v0 interface{}, v1 interface{}) *Instruction {
  56726. p := self.alloc("VMOVDQA32", 2, Operands { v0, v1 })
  56727. // VMOVDQA32 zmm, m512{k}{z}
  56728. if isZMM(v0) && isM512kz(v1) {
  56729. self.require(ISA_AVX512F)
  56730. p.domain = DomainAVX
  56731. p.add(0, func(m *_Encoding, v []interface{}) {
  56732. m.evex(0b01, 0x05, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  56733. m.emit(0x7f)
  56734. m.mrsd(lcode(v[0]), addr(v[1]), 64)
  56735. })
  56736. }
  56737. // VMOVDQA32 zmm, zmm{k}{z}
  56738. if isZMM(v0) && isZMMkz(v1) {
  56739. self.require(ISA_AVX512F)
  56740. p.domain = DomainAVX
  56741. p.add(0, func(m *_Encoding, v []interface{}) {
  56742. m.emit(0x62)
  56743. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  56744. m.emit(0x7d)
  56745. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  56746. m.emit(0x6f)
  56747. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56748. })
  56749. p.add(0, func(m *_Encoding, v []interface{}) {
  56750. m.emit(0x62)
  56751. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  56752. m.emit(0x7d)
  56753. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  56754. m.emit(0x7f)
  56755. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  56756. })
  56757. }
  56758. // VMOVDQA32 m512, zmm{k}{z}
  56759. if isM512(v0) && isZMMkz(v1) {
  56760. self.require(ISA_AVX512F)
  56761. p.domain = DomainAVX
  56762. p.add(0, func(m *_Encoding, v []interface{}) {
  56763. m.evex(0b01, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  56764. m.emit(0x6f)
  56765. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  56766. })
  56767. }
  56768. // VMOVDQA32 xmm, m128{k}{z}
  56769. if isEVEXXMM(v0) && isM128kz(v1) {
  56770. self.require(ISA_AVX512VL | ISA_AVX512F)
  56771. p.domain = DomainAVX
  56772. p.add(0, func(m *_Encoding, v []interface{}) {
  56773. m.evex(0b01, 0x05, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  56774. m.emit(0x7f)
  56775. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  56776. })
  56777. }
  56778. // VMOVDQA32 xmm, xmm{k}{z}
  56779. if isEVEXXMM(v0) && isXMMkz(v1) {
  56780. self.require(ISA_AVX512VL | ISA_AVX512F)
  56781. p.domain = DomainAVX
  56782. p.add(0, func(m *_Encoding, v []interface{}) {
  56783. m.emit(0x62)
  56784. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  56785. m.emit(0x7d)
  56786. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  56787. m.emit(0x6f)
  56788. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56789. })
  56790. p.add(0, func(m *_Encoding, v []interface{}) {
  56791. m.emit(0x62)
  56792. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  56793. m.emit(0x7d)
  56794. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  56795. m.emit(0x7f)
  56796. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  56797. })
  56798. }
  56799. // VMOVDQA32 ymm, m256{k}{z}
  56800. if isEVEXYMM(v0) && isM256kz(v1) {
  56801. self.require(ISA_AVX512VL | ISA_AVX512F)
  56802. p.domain = DomainAVX
  56803. p.add(0, func(m *_Encoding, v []interface{}) {
  56804. m.evex(0b01, 0x05, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  56805. m.emit(0x7f)
  56806. m.mrsd(lcode(v[0]), addr(v[1]), 32)
  56807. })
  56808. }
  56809. // VMOVDQA32 ymm, ymm{k}{z}
  56810. if isEVEXYMM(v0) && isYMMkz(v1) {
  56811. self.require(ISA_AVX512VL | ISA_AVX512F)
  56812. p.domain = DomainAVX
  56813. p.add(0, func(m *_Encoding, v []interface{}) {
  56814. m.emit(0x62)
  56815. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  56816. m.emit(0x7d)
  56817. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  56818. m.emit(0x6f)
  56819. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56820. })
  56821. p.add(0, func(m *_Encoding, v []interface{}) {
  56822. m.emit(0x62)
  56823. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  56824. m.emit(0x7d)
  56825. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  56826. m.emit(0x7f)
  56827. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  56828. })
  56829. }
  56830. // VMOVDQA32 m128, xmm{k}{z}
  56831. if isM128(v0) && isXMMkz(v1) {
  56832. self.require(ISA_AVX512VL | ISA_AVX512F)
  56833. p.domain = DomainAVX
  56834. p.add(0, func(m *_Encoding, v []interface{}) {
  56835. m.evex(0b01, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  56836. m.emit(0x6f)
  56837. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  56838. })
  56839. }
  56840. // VMOVDQA32 m256, ymm{k}{z}
  56841. if isM256(v0) && isYMMkz(v1) {
  56842. self.require(ISA_AVX512VL | ISA_AVX512F)
  56843. p.domain = DomainAVX
  56844. p.add(0, func(m *_Encoding, v []interface{}) {
  56845. m.evex(0b01, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  56846. m.emit(0x6f)
  56847. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  56848. })
  56849. }
  56850. if p.len == 0 {
  56851. panic("invalid operands for VMOVDQA32")
  56852. }
  56853. return p
  56854. }
  56855. // VMOVDQA64 performs "Move Aligned Quadword Values".
  56856. //
  56857. // Mnemonic : VMOVDQA64
  56858. // Supported forms : (9 forms)
  56859. //
  56860. // * VMOVDQA64 zmm, m512{k}{z} [AVX512F]
  56861. // * VMOVDQA64 zmm, zmm{k}{z} [AVX512F]
  56862. // * VMOVDQA64 m512, zmm{k}{z} [AVX512F]
  56863. // * VMOVDQA64 xmm, m128{k}{z} [AVX512F,AVX512VL]
  56864. // * VMOVDQA64 xmm, xmm{k}{z} [AVX512F,AVX512VL]
  56865. // * VMOVDQA64 ymm, m256{k}{z} [AVX512F,AVX512VL]
  56866. // * VMOVDQA64 ymm, ymm{k}{z} [AVX512F,AVX512VL]
  56867. // * VMOVDQA64 m128, xmm{k}{z} [AVX512F,AVX512VL]
  56868. // * VMOVDQA64 m256, ymm{k}{z} [AVX512F,AVX512VL]
  56869. //
  56870. func (self *Program) VMOVDQA64(v0 interface{}, v1 interface{}) *Instruction {
  56871. p := self.alloc("VMOVDQA64", 2, Operands { v0, v1 })
  56872. // VMOVDQA64 zmm, m512{k}{z}
  56873. if isZMM(v0) && isM512kz(v1) {
  56874. self.require(ISA_AVX512F)
  56875. p.domain = DomainAVX
  56876. p.add(0, func(m *_Encoding, v []interface{}) {
  56877. m.evex(0b01, 0x85, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  56878. m.emit(0x7f)
  56879. m.mrsd(lcode(v[0]), addr(v[1]), 64)
  56880. })
  56881. }
  56882. // VMOVDQA64 zmm, zmm{k}{z}
  56883. if isZMM(v0) && isZMMkz(v1) {
  56884. self.require(ISA_AVX512F)
  56885. p.domain = DomainAVX
  56886. p.add(0, func(m *_Encoding, v []interface{}) {
  56887. m.emit(0x62)
  56888. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  56889. m.emit(0xfd)
  56890. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  56891. m.emit(0x6f)
  56892. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56893. })
  56894. p.add(0, func(m *_Encoding, v []interface{}) {
  56895. m.emit(0x62)
  56896. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  56897. m.emit(0xfd)
  56898. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  56899. m.emit(0x7f)
  56900. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  56901. })
  56902. }
  56903. // VMOVDQA64 m512, zmm{k}{z}
  56904. if isM512(v0) && isZMMkz(v1) {
  56905. self.require(ISA_AVX512F)
  56906. p.domain = DomainAVX
  56907. p.add(0, func(m *_Encoding, v []interface{}) {
  56908. m.evex(0b01, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  56909. m.emit(0x6f)
  56910. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  56911. })
  56912. }
  56913. // VMOVDQA64 xmm, m128{k}{z}
  56914. if isEVEXXMM(v0) && isM128kz(v1) {
  56915. self.require(ISA_AVX512VL | ISA_AVX512F)
  56916. p.domain = DomainAVX
  56917. p.add(0, func(m *_Encoding, v []interface{}) {
  56918. m.evex(0b01, 0x85, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  56919. m.emit(0x7f)
  56920. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  56921. })
  56922. }
  56923. // VMOVDQA64 xmm, xmm{k}{z}
  56924. if isEVEXXMM(v0) && isXMMkz(v1) {
  56925. self.require(ISA_AVX512VL | ISA_AVX512F)
  56926. p.domain = DomainAVX
  56927. p.add(0, func(m *_Encoding, v []interface{}) {
  56928. m.emit(0x62)
  56929. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  56930. m.emit(0xfd)
  56931. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  56932. m.emit(0x6f)
  56933. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56934. })
  56935. p.add(0, func(m *_Encoding, v []interface{}) {
  56936. m.emit(0x62)
  56937. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  56938. m.emit(0xfd)
  56939. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  56940. m.emit(0x7f)
  56941. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  56942. })
  56943. }
  56944. // VMOVDQA64 ymm, m256{k}{z}
  56945. if isEVEXYMM(v0) && isM256kz(v1) {
  56946. self.require(ISA_AVX512VL | ISA_AVX512F)
  56947. p.domain = DomainAVX
  56948. p.add(0, func(m *_Encoding, v []interface{}) {
  56949. m.evex(0b01, 0x85, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  56950. m.emit(0x7f)
  56951. m.mrsd(lcode(v[0]), addr(v[1]), 32)
  56952. })
  56953. }
  56954. // VMOVDQA64 ymm, ymm{k}{z}
  56955. if isEVEXYMM(v0) && isYMMkz(v1) {
  56956. self.require(ISA_AVX512VL | ISA_AVX512F)
  56957. p.domain = DomainAVX
  56958. p.add(0, func(m *_Encoding, v []interface{}) {
  56959. m.emit(0x62)
  56960. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  56961. m.emit(0xfd)
  56962. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  56963. m.emit(0x6f)
  56964. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  56965. })
  56966. p.add(0, func(m *_Encoding, v []interface{}) {
  56967. m.emit(0x62)
  56968. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  56969. m.emit(0xfd)
  56970. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  56971. m.emit(0x7f)
  56972. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  56973. })
  56974. }
  56975. // VMOVDQA64 m128, xmm{k}{z}
  56976. if isM128(v0) && isXMMkz(v1) {
  56977. self.require(ISA_AVX512VL | ISA_AVX512F)
  56978. p.domain = DomainAVX
  56979. p.add(0, func(m *_Encoding, v []interface{}) {
  56980. m.evex(0b01, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  56981. m.emit(0x6f)
  56982. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  56983. })
  56984. }
  56985. // VMOVDQA64 m256, ymm{k}{z}
  56986. if isM256(v0) && isYMMkz(v1) {
  56987. self.require(ISA_AVX512VL | ISA_AVX512F)
  56988. p.domain = DomainAVX
  56989. p.add(0, func(m *_Encoding, v []interface{}) {
  56990. m.evex(0b01, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  56991. m.emit(0x6f)
  56992. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  56993. })
  56994. }
  56995. if p.len == 0 {
  56996. panic("invalid operands for VMOVDQA64")
  56997. }
  56998. return p
  56999. }
  57000. // VMOVDQU performs "Move Unaligned Double Quadword".
  57001. //
  57002. // Mnemonic : VMOVDQU
  57003. // Supported forms : (6 forms)
  57004. //
  57005. // * VMOVDQU xmm, xmm [AVX]
  57006. // * VMOVDQU m128, xmm [AVX]
  57007. // * VMOVDQU ymm, ymm [AVX]
  57008. // * VMOVDQU m256, ymm [AVX]
  57009. // * VMOVDQU xmm, m128 [AVX]
  57010. // * VMOVDQU ymm, m256 [AVX]
  57011. //
  57012. func (self *Program) VMOVDQU(v0 interface{}, v1 interface{}) *Instruction {
  57013. p := self.alloc("VMOVDQU", 2, Operands { v0, v1 })
  57014. // VMOVDQU xmm, xmm
  57015. if isXMM(v0) && isXMM(v1) {
  57016. self.require(ISA_AVX)
  57017. p.domain = DomainAVX
  57018. p.add(0, func(m *_Encoding, v []interface{}) {
  57019. m.vex2(2, hcode(v[1]), v[0], 0)
  57020. m.emit(0x6f)
  57021. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  57022. })
  57023. p.add(0, func(m *_Encoding, v []interface{}) {
  57024. m.vex2(2, hcode(v[0]), v[1], 0)
  57025. m.emit(0x7f)
  57026. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  57027. })
  57028. }
  57029. // VMOVDQU m128, xmm
  57030. if isM128(v0) && isXMM(v1) {
  57031. self.require(ISA_AVX)
  57032. p.domain = DomainAVX
  57033. p.add(0, func(m *_Encoding, v []interface{}) {
  57034. m.vex2(2, hcode(v[1]), addr(v[0]), 0)
  57035. m.emit(0x6f)
  57036. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  57037. })
  57038. }
  57039. // VMOVDQU ymm, ymm
  57040. if isYMM(v0) && isYMM(v1) {
  57041. self.require(ISA_AVX)
  57042. p.domain = DomainAVX
  57043. p.add(0, func(m *_Encoding, v []interface{}) {
  57044. m.vex2(6, hcode(v[1]), v[0], 0)
  57045. m.emit(0x6f)
  57046. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  57047. })
  57048. p.add(0, func(m *_Encoding, v []interface{}) {
  57049. m.vex2(6, hcode(v[0]), v[1], 0)
  57050. m.emit(0x7f)
  57051. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  57052. })
  57053. }
  57054. // VMOVDQU m256, ymm
  57055. if isM256(v0) && isYMM(v1) {
  57056. self.require(ISA_AVX)
  57057. p.domain = DomainAVX
  57058. p.add(0, func(m *_Encoding, v []interface{}) {
  57059. m.vex2(6, hcode(v[1]), addr(v[0]), 0)
  57060. m.emit(0x6f)
  57061. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  57062. })
  57063. }
  57064. // VMOVDQU xmm, m128
  57065. if isXMM(v0) && isM128(v1) {
  57066. self.require(ISA_AVX)
  57067. p.domain = DomainAVX
  57068. p.add(0, func(m *_Encoding, v []interface{}) {
  57069. m.vex2(2, hcode(v[0]), addr(v[1]), 0)
  57070. m.emit(0x7f)
  57071. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  57072. })
  57073. }
  57074. // VMOVDQU ymm, m256
  57075. if isYMM(v0) && isM256(v1) {
  57076. self.require(ISA_AVX)
  57077. p.domain = DomainAVX
  57078. p.add(0, func(m *_Encoding, v []interface{}) {
  57079. m.vex2(6, hcode(v[0]), addr(v[1]), 0)
  57080. m.emit(0x7f)
  57081. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  57082. })
  57083. }
  57084. if p.len == 0 {
  57085. panic("invalid operands for VMOVDQU")
  57086. }
  57087. return p
  57088. }
  57089. // VMOVDQU16 performs "Move Unaligned Word Values".
  57090. //
  57091. // Mnemonic : VMOVDQU16
  57092. // Supported forms : (9 forms)
  57093. //
  57094. // * VMOVDQU16 zmm, m512{k}{z} [AVX512BW]
  57095. // * VMOVDQU16 zmm, zmm{k}{z} [AVX512BW]
  57096. // * VMOVDQU16 m512, zmm{k}{z} [AVX512BW]
  57097. // * VMOVDQU16 xmm, m128{k}{z} [AVX512BW,AVX512VL]
  57098. // * VMOVDQU16 xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  57099. // * VMOVDQU16 ymm, m256{k}{z} [AVX512BW,AVX512VL]
  57100. // * VMOVDQU16 ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  57101. // * VMOVDQU16 m128, xmm{k}{z} [AVX512BW,AVX512VL]
  57102. // * VMOVDQU16 m256, ymm{k}{z} [AVX512BW,AVX512VL]
  57103. //
  57104. func (self *Program) VMOVDQU16(v0 interface{}, v1 interface{}) *Instruction {
  57105. p := self.alloc("VMOVDQU16", 2, Operands { v0, v1 })
  57106. // VMOVDQU16 zmm, m512{k}{z}
  57107. if isZMM(v0) && isM512kz(v1) {
  57108. self.require(ISA_AVX512BW)
  57109. p.domain = DomainAVX
  57110. p.add(0, func(m *_Encoding, v []interface{}) {
  57111. m.evex(0b01, 0x87, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  57112. m.emit(0x7f)
  57113. m.mrsd(lcode(v[0]), addr(v[1]), 64)
  57114. })
  57115. }
  57116. // VMOVDQU16 zmm, zmm{k}{z}
  57117. if isZMM(v0) && isZMMkz(v1) {
  57118. self.require(ISA_AVX512BW)
  57119. p.domain = DomainAVX
  57120. p.add(0, func(m *_Encoding, v []interface{}) {
  57121. m.emit(0x62)
  57122. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  57123. m.emit(0xff)
  57124. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  57125. m.emit(0x6f)
  57126. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  57127. })
  57128. p.add(0, func(m *_Encoding, v []interface{}) {
  57129. m.emit(0x62)
  57130. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  57131. m.emit(0xff)
  57132. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  57133. m.emit(0x7f)
  57134. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  57135. })
  57136. }
  57137. // VMOVDQU16 m512, zmm{k}{z}
  57138. if isM512(v0) && isZMMkz(v1) {
  57139. self.require(ISA_AVX512BW)
  57140. p.domain = DomainAVX
  57141. p.add(0, func(m *_Encoding, v []interface{}) {
  57142. m.evex(0b01, 0x87, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  57143. m.emit(0x6f)
  57144. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  57145. })
  57146. }
  57147. // VMOVDQU16 xmm, m128{k}{z}
  57148. if isEVEXXMM(v0) && isM128kz(v1) {
  57149. self.require(ISA_AVX512VL | ISA_AVX512BW)
  57150. p.domain = DomainAVX
  57151. p.add(0, func(m *_Encoding, v []interface{}) {
  57152. m.evex(0b01, 0x87, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  57153. m.emit(0x7f)
  57154. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  57155. })
  57156. }
  57157. // VMOVDQU16 xmm, xmm{k}{z}
  57158. if isEVEXXMM(v0) && isXMMkz(v1) {
  57159. self.require(ISA_AVX512VL | ISA_AVX512BW)
  57160. p.domain = DomainAVX
  57161. p.add(0, func(m *_Encoding, v []interface{}) {
  57162. m.emit(0x62)
  57163. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  57164. m.emit(0xff)
  57165. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  57166. m.emit(0x6f)
  57167. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  57168. })
  57169. p.add(0, func(m *_Encoding, v []interface{}) {
  57170. m.emit(0x62)
  57171. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  57172. m.emit(0xff)
  57173. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  57174. m.emit(0x7f)
  57175. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  57176. })
  57177. }
  57178. // VMOVDQU16 ymm, m256{k}{z}
  57179. if isEVEXYMM(v0) && isM256kz(v1) {
  57180. self.require(ISA_AVX512VL | ISA_AVX512BW)
  57181. p.domain = DomainAVX
  57182. p.add(0, func(m *_Encoding, v []interface{}) {
  57183. m.evex(0b01, 0x87, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  57184. m.emit(0x7f)
  57185. m.mrsd(lcode(v[0]), addr(v[1]), 32)
  57186. })
  57187. }
  57188. // VMOVDQU16 ymm, ymm{k}{z}
  57189. if isEVEXYMM(v0) && isYMMkz(v1) {
  57190. self.require(ISA_AVX512VL | ISA_AVX512BW)
  57191. p.domain = DomainAVX
  57192. p.add(0, func(m *_Encoding, v []interface{}) {
  57193. m.emit(0x62)
  57194. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  57195. m.emit(0xff)
  57196. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  57197. m.emit(0x6f)
  57198. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  57199. })
  57200. p.add(0, func(m *_Encoding, v []interface{}) {
  57201. m.emit(0x62)
  57202. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  57203. m.emit(0xff)
  57204. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  57205. m.emit(0x7f)
  57206. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  57207. })
  57208. }
  57209. // VMOVDQU16 m128, xmm{k}{z}
  57210. if isM128(v0) && isXMMkz(v1) {
  57211. self.require(ISA_AVX512VL | ISA_AVX512BW)
  57212. p.domain = DomainAVX
  57213. p.add(0, func(m *_Encoding, v []interface{}) {
  57214. m.evex(0b01, 0x87, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  57215. m.emit(0x6f)
  57216. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  57217. })
  57218. }
  57219. // VMOVDQU16 m256, ymm{k}{z}
  57220. if isM256(v0) && isYMMkz(v1) {
  57221. self.require(ISA_AVX512VL | ISA_AVX512BW)
  57222. p.domain = DomainAVX
  57223. p.add(0, func(m *_Encoding, v []interface{}) {
  57224. m.evex(0b01, 0x87, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  57225. m.emit(0x6f)
  57226. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  57227. })
  57228. }
  57229. if p.len == 0 {
  57230. panic("invalid operands for VMOVDQU16")
  57231. }
  57232. return p
  57233. }
  57234. // VMOVDQU32 performs "Move Unaligned Doubleword Values".
  57235. //
  57236. // Mnemonic : VMOVDQU32
  57237. // Supported forms : (9 forms)
  57238. //
  57239. // * VMOVDQU32 zmm, m512{k}{z} [AVX512F]
  57240. // * VMOVDQU32 zmm, zmm{k}{z} [AVX512F]
  57241. // * VMOVDQU32 m512, zmm{k}{z} [AVX512F]
  57242. // * VMOVDQU32 xmm, m128{k}{z} [AVX512F,AVX512VL]
  57243. // * VMOVDQU32 xmm, xmm{k}{z} [AVX512F,AVX512VL]
  57244. // * VMOVDQU32 ymm, m256{k}{z} [AVX512F,AVX512VL]
  57245. // * VMOVDQU32 ymm, ymm{k}{z} [AVX512F,AVX512VL]
  57246. // * VMOVDQU32 m128, xmm{k}{z} [AVX512F,AVX512VL]
  57247. // * VMOVDQU32 m256, ymm{k}{z} [AVX512F,AVX512VL]
  57248. //
  57249. func (self *Program) VMOVDQU32(v0 interface{}, v1 interface{}) *Instruction {
  57250. p := self.alloc("VMOVDQU32", 2, Operands { v0, v1 })
  57251. // VMOVDQU32 zmm, m512{k}{z}
  57252. if isZMM(v0) && isM512kz(v1) {
  57253. self.require(ISA_AVX512F)
  57254. p.domain = DomainAVX
  57255. p.add(0, func(m *_Encoding, v []interface{}) {
  57256. m.evex(0b01, 0x06, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  57257. m.emit(0x7f)
  57258. m.mrsd(lcode(v[0]), addr(v[1]), 64)
  57259. })
  57260. }
  57261. // VMOVDQU32 zmm, zmm{k}{z}
  57262. if isZMM(v0) && isZMMkz(v1) {
  57263. self.require(ISA_AVX512F)
  57264. p.domain = DomainAVX
  57265. p.add(0, func(m *_Encoding, v []interface{}) {
  57266. m.emit(0x62)
  57267. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  57268. m.emit(0x7e)
  57269. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  57270. m.emit(0x6f)
  57271. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  57272. })
  57273. p.add(0, func(m *_Encoding, v []interface{}) {
  57274. m.emit(0x62)
  57275. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  57276. m.emit(0x7e)
  57277. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  57278. m.emit(0x7f)
  57279. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  57280. })
  57281. }
  57282. // VMOVDQU32 m512, zmm{k}{z}
  57283. if isM512(v0) && isZMMkz(v1) {
  57284. self.require(ISA_AVX512F)
  57285. p.domain = DomainAVX
  57286. p.add(0, func(m *_Encoding, v []interface{}) {
  57287. m.evex(0b01, 0x06, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  57288. m.emit(0x6f)
  57289. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  57290. })
  57291. }
  57292. // VMOVDQU32 xmm, m128{k}{z}
  57293. if isEVEXXMM(v0) && isM128kz(v1) {
  57294. self.require(ISA_AVX512VL | ISA_AVX512F)
  57295. p.domain = DomainAVX
  57296. p.add(0, func(m *_Encoding, v []interface{}) {
  57297. m.evex(0b01, 0x06, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  57298. m.emit(0x7f)
  57299. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  57300. })
  57301. }
  57302. // VMOVDQU32 xmm, xmm{k}{z}
  57303. if isEVEXXMM(v0) && isXMMkz(v1) {
  57304. self.require(ISA_AVX512VL | ISA_AVX512F)
  57305. p.domain = DomainAVX
  57306. p.add(0, func(m *_Encoding, v []interface{}) {
  57307. m.emit(0x62)
  57308. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  57309. m.emit(0x7e)
  57310. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  57311. m.emit(0x6f)
  57312. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  57313. })
  57314. p.add(0, func(m *_Encoding, v []interface{}) {
  57315. m.emit(0x62)
  57316. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  57317. m.emit(0x7e)
  57318. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  57319. m.emit(0x7f)
  57320. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  57321. })
  57322. }
  57323. // VMOVDQU32 ymm, m256{k}{z}
  57324. if isEVEXYMM(v0) && isM256kz(v1) {
  57325. self.require(ISA_AVX512VL | ISA_AVX512F)
  57326. p.domain = DomainAVX
  57327. p.add(0, func(m *_Encoding, v []interface{}) {
  57328. m.evex(0b01, 0x06, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  57329. m.emit(0x7f)
  57330. m.mrsd(lcode(v[0]), addr(v[1]), 32)
  57331. })
  57332. }
  57333. // VMOVDQU32 ymm, ymm{k}{z}
  57334. if isEVEXYMM(v0) && isYMMkz(v1) {
  57335. self.require(ISA_AVX512VL | ISA_AVX512F)
  57336. p.domain = DomainAVX
  57337. p.add(0, func(m *_Encoding, v []interface{}) {
  57338. m.emit(0x62)
  57339. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  57340. m.emit(0x7e)
  57341. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  57342. m.emit(0x6f)
  57343. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  57344. })
  57345. p.add(0, func(m *_Encoding, v []interface{}) {
  57346. m.emit(0x62)
  57347. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  57348. m.emit(0x7e)
  57349. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  57350. m.emit(0x7f)
  57351. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  57352. })
  57353. }
  57354. // VMOVDQU32 m128, xmm{k}{z}
  57355. if isM128(v0) && isXMMkz(v1) {
  57356. self.require(ISA_AVX512VL | ISA_AVX512F)
  57357. p.domain = DomainAVX
  57358. p.add(0, func(m *_Encoding, v []interface{}) {
  57359. m.evex(0b01, 0x06, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  57360. m.emit(0x6f)
  57361. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  57362. })
  57363. }
  57364. // VMOVDQU32 m256, ymm{k}{z}
  57365. if isM256(v0) && isYMMkz(v1) {
  57366. self.require(ISA_AVX512VL | ISA_AVX512F)
  57367. p.domain = DomainAVX
  57368. p.add(0, func(m *_Encoding, v []interface{}) {
  57369. m.evex(0b01, 0x06, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  57370. m.emit(0x6f)
  57371. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  57372. })
  57373. }
  57374. if p.len == 0 {
  57375. panic("invalid operands for VMOVDQU32")
  57376. }
  57377. return p
  57378. }
  57379. // VMOVDQU64 performs "Move Unaligned Quadword Values".
  57380. //
  57381. // Mnemonic : VMOVDQU64
  57382. // Supported forms : (9 forms)
  57383. //
  57384. // * VMOVDQU64 zmm, m512{k}{z} [AVX512F]
  57385. // * VMOVDQU64 zmm, zmm{k}{z} [AVX512F]
  57386. // * VMOVDQU64 m512, zmm{k}{z} [AVX512F]
  57387. // * VMOVDQU64 xmm, m128{k}{z} [AVX512F,AVX512VL]
  57388. // * VMOVDQU64 xmm, xmm{k}{z} [AVX512F,AVX512VL]
  57389. // * VMOVDQU64 ymm, m256{k}{z} [AVX512F,AVX512VL]
  57390. // * VMOVDQU64 ymm, ymm{k}{z} [AVX512F,AVX512VL]
  57391. // * VMOVDQU64 m128, xmm{k}{z} [AVX512F,AVX512VL]
  57392. // * VMOVDQU64 m256, ymm{k}{z} [AVX512F,AVX512VL]
  57393. //
  57394. func (self *Program) VMOVDQU64(v0 interface{}, v1 interface{}) *Instruction {
  57395. p := self.alloc("VMOVDQU64", 2, Operands { v0, v1 })
  57396. // VMOVDQU64 zmm, m512{k}{z}
  57397. if isZMM(v0) && isM512kz(v1) {
  57398. self.require(ISA_AVX512F)
  57399. p.domain = DomainAVX
  57400. p.add(0, func(m *_Encoding, v []interface{}) {
  57401. m.evex(0b01, 0x86, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  57402. m.emit(0x7f)
  57403. m.mrsd(lcode(v[0]), addr(v[1]), 64)
  57404. })
  57405. }
  57406. // VMOVDQU64 zmm, zmm{k}{z}
  57407. if isZMM(v0) && isZMMkz(v1) {
  57408. self.require(ISA_AVX512F)
  57409. p.domain = DomainAVX
  57410. p.add(0, func(m *_Encoding, v []interface{}) {
  57411. m.emit(0x62)
  57412. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  57413. m.emit(0xfe)
  57414. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  57415. m.emit(0x6f)
  57416. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  57417. })
  57418. p.add(0, func(m *_Encoding, v []interface{}) {
  57419. m.emit(0x62)
  57420. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  57421. m.emit(0xfe)
  57422. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  57423. m.emit(0x7f)
  57424. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  57425. })
  57426. }
  57427. // VMOVDQU64 m512, zmm{k}{z}
  57428. if isM512(v0) && isZMMkz(v1) {
  57429. self.require(ISA_AVX512F)
  57430. p.domain = DomainAVX
  57431. p.add(0, func(m *_Encoding, v []interface{}) {
  57432. m.evex(0b01, 0x86, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  57433. m.emit(0x6f)
  57434. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  57435. })
  57436. }
  57437. // VMOVDQU64 xmm, m128{k}{z}
  57438. if isEVEXXMM(v0) && isM128kz(v1) {
  57439. self.require(ISA_AVX512VL | ISA_AVX512F)
  57440. p.domain = DomainAVX
  57441. p.add(0, func(m *_Encoding, v []interface{}) {
  57442. m.evex(0b01, 0x86, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  57443. m.emit(0x7f)
  57444. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  57445. })
  57446. }
  57447. // VMOVDQU64 xmm, xmm{k}{z}
  57448. if isEVEXXMM(v0) && isXMMkz(v1) {
  57449. self.require(ISA_AVX512VL | ISA_AVX512F)
  57450. p.domain = DomainAVX
  57451. p.add(0, func(m *_Encoding, v []interface{}) {
  57452. m.emit(0x62)
  57453. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  57454. m.emit(0xfe)
  57455. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  57456. m.emit(0x6f)
  57457. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  57458. })
  57459. p.add(0, func(m *_Encoding, v []interface{}) {
  57460. m.emit(0x62)
  57461. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  57462. m.emit(0xfe)
  57463. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  57464. m.emit(0x7f)
  57465. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  57466. })
  57467. }
  57468. // VMOVDQU64 ymm, m256{k}{z}
  57469. if isEVEXYMM(v0) && isM256kz(v1) {
  57470. self.require(ISA_AVX512VL | ISA_AVX512F)
  57471. p.domain = DomainAVX
  57472. p.add(0, func(m *_Encoding, v []interface{}) {
  57473. m.evex(0b01, 0x86, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  57474. m.emit(0x7f)
  57475. m.mrsd(lcode(v[0]), addr(v[1]), 32)
  57476. })
  57477. }
  57478. // VMOVDQU64 ymm, ymm{k}{z}
  57479. if isEVEXYMM(v0) && isYMMkz(v1) {
  57480. self.require(ISA_AVX512VL | ISA_AVX512F)
  57481. p.domain = DomainAVX
  57482. p.add(0, func(m *_Encoding, v []interface{}) {
  57483. m.emit(0x62)
  57484. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  57485. m.emit(0xfe)
  57486. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  57487. m.emit(0x6f)
  57488. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  57489. })
  57490. p.add(0, func(m *_Encoding, v []interface{}) {
  57491. m.emit(0x62)
  57492. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  57493. m.emit(0xfe)
  57494. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  57495. m.emit(0x7f)
  57496. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  57497. })
  57498. }
  57499. // VMOVDQU64 m128, xmm{k}{z}
  57500. if isM128(v0) && isXMMkz(v1) {
  57501. self.require(ISA_AVX512VL | ISA_AVX512F)
  57502. p.domain = DomainAVX
  57503. p.add(0, func(m *_Encoding, v []interface{}) {
  57504. m.evex(0b01, 0x86, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  57505. m.emit(0x6f)
  57506. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  57507. })
  57508. }
  57509. // VMOVDQU64 m256, ymm{k}{z}
  57510. if isM256(v0) && isYMMkz(v1) {
  57511. self.require(ISA_AVX512VL | ISA_AVX512F)
  57512. p.domain = DomainAVX
  57513. p.add(0, func(m *_Encoding, v []interface{}) {
  57514. m.evex(0b01, 0x86, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  57515. m.emit(0x6f)
  57516. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  57517. })
  57518. }
  57519. if p.len == 0 {
  57520. panic("invalid operands for VMOVDQU64")
  57521. }
  57522. return p
  57523. }
  57524. // VMOVDQU8 performs "Move Unaligned Byte Values".
  57525. //
  57526. // Mnemonic : VMOVDQU8
  57527. // Supported forms : (9 forms)
  57528. //
  57529. // * VMOVDQU8 zmm, m512{k}{z} [AVX512BW]
  57530. // * VMOVDQU8 zmm, zmm{k}{z} [AVX512BW]
  57531. // * VMOVDQU8 m512, zmm{k}{z} [AVX512BW]
  57532. // * VMOVDQU8 xmm, m128{k}{z} [AVX512BW,AVX512VL]
  57533. // * VMOVDQU8 xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  57534. // * VMOVDQU8 ymm, m256{k}{z} [AVX512BW,AVX512VL]
  57535. // * VMOVDQU8 ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  57536. // * VMOVDQU8 m128, xmm{k}{z} [AVX512BW,AVX512VL]
  57537. // * VMOVDQU8 m256, ymm{k}{z} [AVX512BW,AVX512VL]
  57538. //
  57539. func (self *Program) VMOVDQU8(v0 interface{}, v1 interface{}) *Instruction {
  57540. p := self.alloc("VMOVDQU8", 2, Operands { v0, v1 })
  57541. // VMOVDQU8 zmm, m512{k}{z}
  57542. if isZMM(v0) && isM512kz(v1) {
  57543. self.require(ISA_AVX512BW)
  57544. p.domain = DomainAVX
  57545. p.add(0, func(m *_Encoding, v []interface{}) {
  57546. m.evex(0b01, 0x07, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  57547. m.emit(0x7f)
  57548. m.mrsd(lcode(v[0]), addr(v[1]), 64)
  57549. })
  57550. }
  57551. // VMOVDQU8 zmm, zmm{k}{z}
  57552. if isZMM(v0) && isZMMkz(v1) {
  57553. self.require(ISA_AVX512BW)
  57554. p.domain = DomainAVX
  57555. p.add(0, func(m *_Encoding, v []interface{}) {
  57556. m.emit(0x62)
  57557. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  57558. m.emit(0x7f)
  57559. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  57560. m.emit(0x6f)
  57561. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  57562. })
  57563. p.add(0, func(m *_Encoding, v []interface{}) {
  57564. m.emit(0x62)
  57565. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  57566. m.emit(0x7f)
  57567. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  57568. m.emit(0x7f)
  57569. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  57570. })
  57571. }
  57572. // VMOVDQU8 m512, zmm{k}{z}
  57573. if isM512(v0) && isZMMkz(v1) {
  57574. self.require(ISA_AVX512BW)
  57575. p.domain = DomainAVX
  57576. p.add(0, func(m *_Encoding, v []interface{}) {
  57577. m.evex(0b01, 0x07, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  57578. m.emit(0x6f)
  57579. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  57580. })
  57581. }
  57582. // VMOVDQU8 xmm, m128{k}{z}
  57583. if isEVEXXMM(v0) && isM128kz(v1) {
  57584. self.require(ISA_AVX512VL | ISA_AVX512BW)
  57585. p.domain = DomainAVX
  57586. p.add(0, func(m *_Encoding, v []interface{}) {
  57587. m.evex(0b01, 0x07, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  57588. m.emit(0x7f)
  57589. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  57590. })
  57591. }
  57592. // VMOVDQU8 xmm, xmm{k}{z}
  57593. if isEVEXXMM(v0) && isXMMkz(v1) {
  57594. self.require(ISA_AVX512VL | ISA_AVX512BW)
  57595. p.domain = DomainAVX
  57596. p.add(0, func(m *_Encoding, v []interface{}) {
  57597. m.emit(0x62)
  57598. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  57599. m.emit(0x7f)
  57600. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  57601. m.emit(0x6f)
  57602. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  57603. })
  57604. p.add(0, func(m *_Encoding, v []interface{}) {
  57605. m.emit(0x62)
  57606. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  57607. m.emit(0x7f)
  57608. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  57609. m.emit(0x7f)
  57610. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  57611. })
  57612. }
  57613. // VMOVDQU8 ymm, m256{k}{z}
  57614. if isEVEXYMM(v0) && isM256kz(v1) {
  57615. self.require(ISA_AVX512VL | ISA_AVX512BW)
  57616. p.domain = DomainAVX
  57617. p.add(0, func(m *_Encoding, v []interface{}) {
  57618. m.evex(0b01, 0x07, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  57619. m.emit(0x7f)
  57620. m.mrsd(lcode(v[0]), addr(v[1]), 32)
  57621. })
  57622. }
  57623. // VMOVDQU8 ymm, ymm{k}{z}
  57624. if isEVEXYMM(v0) && isYMMkz(v1) {
  57625. self.require(ISA_AVX512VL | ISA_AVX512BW)
  57626. p.domain = DomainAVX
  57627. p.add(0, func(m *_Encoding, v []interface{}) {
  57628. m.emit(0x62)
  57629. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  57630. m.emit(0x7f)
  57631. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  57632. m.emit(0x6f)
  57633. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  57634. })
  57635. p.add(0, func(m *_Encoding, v []interface{}) {
  57636. m.emit(0x62)
  57637. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  57638. m.emit(0x7f)
  57639. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  57640. m.emit(0x7f)
  57641. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  57642. })
  57643. }
  57644. // VMOVDQU8 m128, xmm{k}{z}
  57645. if isM128(v0) && isXMMkz(v1) {
  57646. self.require(ISA_AVX512VL | ISA_AVX512BW)
  57647. p.domain = DomainAVX
  57648. p.add(0, func(m *_Encoding, v []interface{}) {
  57649. m.evex(0b01, 0x07, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  57650. m.emit(0x6f)
  57651. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  57652. })
  57653. }
  57654. // VMOVDQU8 m256, ymm{k}{z}
  57655. if isM256(v0) && isYMMkz(v1) {
  57656. self.require(ISA_AVX512VL | ISA_AVX512BW)
  57657. p.domain = DomainAVX
  57658. p.add(0, func(m *_Encoding, v []interface{}) {
  57659. m.evex(0b01, 0x07, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  57660. m.emit(0x6f)
  57661. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  57662. })
  57663. }
  57664. if p.len == 0 {
  57665. panic("invalid operands for VMOVDQU8")
  57666. }
  57667. return p
  57668. }
  57669. // VMOVHLPS performs "Move Packed Single-Precision Floating-Point Values High to Low".
  57670. //
  57671. // Mnemonic : VMOVHLPS
  57672. // Supported forms : (2 forms)
  57673. //
  57674. // * VMOVHLPS xmm, xmm, xmm [AVX]
  57675. // * VMOVHLPS xmm, xmm, xmm [AVX512F]
  57676. //
  57677. func (self *Program) VMOVHLPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  57678. p := self.alloc("VMOVHLPS", 3, Operands { v0, v1, v2 })
  57679. // VMOVHLPS xmm, xmm, xmm
  57680. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  57681. self.require(ISA_AVX)
  57682. p.domain = DomainAVX
  57683. p.add(0, func(m *_Encoding, v []interface{}) {
  57684. m.vex2(0, hcode(v[2]), v[0], hlcode(v[1]))
  57685. m.emit(0x12)
  57686. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  57687. })
  57688. }
  57689. // VMOVHLPS xmm, xmm, xmm
  57690. if isEVEXXMM(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) {
  57691. self.require(ISA_AVX512F)
  57692. p.domain = DomainAVX
  57693. p.add(0, func(m *_Encoding, v []interface{}) {
  57694. m.emit(0x62)
  57695. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  57696. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  57697. m.emit((0x08 ^ (ecode(v[1]) << 3)) | 0x00)
  57698. m.emit(0x12)
  57699. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  57700. })
  57701. }
  57702. if p.len == 0 {
  57703. panic("invalid operands for VMOVHLPS")
  57704. }
  57705. return p
  57706. }
  57707. // VMOVHPD performs "Move High Packed Double-Precision Floating-Point Value".
  57708. //
  57709. // Mnemonic : VMOVHPD
  57710. // Supported forms : (4 forms)
  57711. //
  57712. // * VMOVHPD xmm, m64 [AVX]
  57713. // * VMOVHPD m64, xmm, xmm [AVX]
  57714. // * VMOVHPD xmm, m64 [AVX512F]
  57715. // * VMOVHPD m64, xmm, xmm [AVX512F]
  57716. //
  57717. func (self *Program) VMOVHPD(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  57718. var p *Instruction
  57719. switch len(vv) {
  57720. case 0 : p = self.alloc("VMOVHPD", 2, Operands { v0, v1 })
  57721. case 1 : p = self.alloc("VMOVHPD", 3, Operands { v0, v1, vv[0] })
  57722. default : panic("instruction VMOVHPD takes 2 or 3 operands")
  57723. }
  57724. // VMOVHPD xmm, m64
  57725. if len(vv) == 0 && isXMM(v0) && isM64(v1) {
  57726. self.require(ISA_AVX)
  57727. p.domain = DomainAVX
  57728. p.add(0, func(m *_Encoding, v []interface{}) {
  57729. m.vex2(1, hcode(v[0]), addr(v[1]), 0)
  57730. m.emit(0x17)
  57731. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  57732. })
  57733. }
  57734. // VMOVHPD m64, xmm, xmm
  57735. if len(vv) == 1 && isM64(v0) && isXMM(v1) && isXMM(vv[0]) {
  57736. self.require(ISA_AVX)
  57737. p.domain = DomainAVX
  57738. p.add(0, func(m *_Encoding, v []interface{}) {
  57739. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  57740. m.emit(0x16)
  57741. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  57742. })
  57743. }
  57744. // VMOVHPD xmm, m64
  57745. if len(vv) == 0 && isEVEXXMM(v0) && isM64(v1) {
  57746. self.require(ISA_AVX512F)
  57747. p.domain = DomainAVX
  57748. p.add(0, func(m *_Encoding, v []interface{}) {
  57749. m.evex(0b01, 0x85, 0b00, ehcode(v[0]), addr(v[1]), 0, 0, 0, 0)
  57750. m.emit(0x17)
  57751. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  57752. })
  57753. }
  57754. // VMOVHPD m64, xmm, xmm
  57755. if len(vv) == 1 && isM64(v0) && isEVEXXMM(v1) && isEVEXXMM(vv[0]) {
  57756. self.require(ISA_AVX512F)
  57757. p.domain = DomainAVX
  57758. p.add(0, func(m *_Encoding, v []interface{}) {
  57759. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), 0, 0, 0)
  57760. m.emit(0x16)
  57761. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  57762. })
  57763. }
  57764. if p.len == 0 {
  57765. panic("invalid operands for VMOVHPD")
  57766. }
  57767. return p
  57768. }
  57769. // VMOVHPS performs "Move High Packed Single-Precision Floating-Point Values".
  57770. //
  57771. // Mnemonic : VMOVHPS
  57772. // Supported forms : (4 forms)
  57773. //
  57774. // * VMOVHPS xmm, m64 [AVX]
  57775. // * VMOVHPS m64, xmm, xmm [AVX]
  57776. // * VMOVHPS xmm, m64 [AVX512F]
  57777. // * VMOVHPS m64, xmm, xmm [AVX512F]
  57778. //
  57779. func (self *Program) VMOVHPS(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  57780. var p *Instruction
  57781. switch len(vv) {
  57782. case 0 : p = self.alloc("VMOVHPS", 2, Operands { v0, v1 })
  57783. case 1 : p = self.alloc("VMOVHPS", 3, Operands { v0, v1, vv[0] })
  57784. default : panic("instruction VMOVHPS takes 2 or 3 operands")
  57785. }
  57786. // VMOVHPS xmm, m64
  57787. if len(vv) == 0 && isXMM(v0) && isM64(v1) {
  57788. self.require(ISA_AVX)
  57789. p.domain = DomainAVX
  57790. p.add(0, func(m *_Encoding, v []interface{}) {
  57791. m.vex2(0, hcode(v[0]), addr(v[1]), 0)
  57792. m.emit(0x17)
  57793. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  57794. })
  57795. }
  57796. // VMOVHPS m64, xmm, xmm
  57797. if len(vv) == 1 && isM64(v0) && isXMM(v1) && isXMM(vv[0]) {
  57798. self.require(ISA_AVX)
  57799. p.domain = DomainAVX
  57800. p.add(0, func(m *_Encoding, v []interface{}) {
  57801. m.vex2(0, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  57802. m.emit(0x16)
  57803. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  57804. })
  57805. }
  57806. // VMOVHPS xmm, m64
  57807. if len(vv) == 0 && isEVEXXMM(v0) && isM64(v1) {
  57808. self.require(ISA_AVX512F)
  57809. p.domain = DomainAVX
  57810. p.add(0, func(m *_Encoding, v []interface{}) {
  57811. m.evex(0b01, 0x04, 0b00, ehcode(v[0]), addr(v[1]), 0, 0, 0, 0)
  57812. m.emit(0x17)
  57813. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  57814. })
  57815. }
  57816. // VMOVHPS m64, xmm, xmm
  57817. if len(vv) == 1 && isM64(v0) && isEVEXXMM(v1) && isEVEXXMM(vv[0]) {
  57818. self.require(ISA_AVX512F)
  57819. p.domain = DomainAVX
  57820. p.add(0, func(m *_Encoding, v []interface{}) {
  57821. m.evex(0b01, 0x04, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), 0, 0, 0)
  57822. m.emit(0x16)
  57823. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  57824. })
  57825. }
  57826. if p.len == 0 {
  57827. panic("invalid operands for VMOVHPS")
  57828. }
  57829. return p
  57830. }
  57831. // VMOVLHPS performs "Move Packed Single-Precision Floating-Point Values Low to High".
  57832. //
  57833. // Mnemonic : VMOVLHPS
  57834. // Supported forms : (2 forms)
  57835. //
  57836. // * VMOVLHPS xmm, xmm, xmm [AVX]
  57837. // * VMOVLHPS xmm, xmm, xmm [AVX512F]
  57838. //
  57839. func (self *Program) VMOVLHPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  57840. p := self.alloc("VMOVLHPS", 3, Operands { v0, v1, v2 })
  57841. // VMOVLHPS xmm, xmm, xmm
  57842. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  57843. self.require(ISA_AVX)
  57844. p.domain = DomainAVX
  57845. p.add(0, func(m *_Encoding, v []interface{}) {
  57846. m.vex2(0, hcode(v[2]), v[0], hlcode(v[1]))
  57847. m.emit(0x16)
  57848. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  57849. })
  57850. }
  57851. // VMOVLHPS xmm, xmm, xmm
  57852. if isEVEXXMM(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) {
  57853. self.require(ISA_AVX512F)
  57854. p.domain = DomainAVX
  57855. p.add(0, func(m *_Encoding, v []interface{}) {
  57856. m.emit(0x62)
  57857. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  57858. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  57859. m.emit((0x08 ^ (ecode(v[1]) << 3)) | 0x00)
  57860. m.emit(0x16)
  57861. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  57862. })
  57863. }
  57864. if p.len == 0 {
  57865. panic("invalid operands for VMOVLHPS")
  57866. }
  57867. return p
  57868. }
  57869. // VMOVLPD performs "Move Low Packed Double-Precision Floating-Point Value".
  57870. //
  57871. // Mnemonic : VMOVLPD
  57872. // Supported forms : (4 forms)
  57873. //
  57874. // * VMOVLPD xmm, m64 [AVX]
  57875. // * VMOVLPD m64, xmm, xmm [AVX]
  57876. // * VMOVLPD xmm, m64 [AVX512F]
  57877. // * VMOVLPD m64, xmm, xmm [AVX512F]
  57878. //
  57879. func (self *Program) VMOVLPD(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  57880. var p *Instruction
  57881. switch len(vv) {
  57882. case 0 : p = self.alloc("VMOVLPD", 2, Operands { v0, v1 })
  57883. case 1 : p = self.alloc("VMOVLPD", 3, Operands { v0, v1, vv[0] })
  57884. default : panic("instruction VMOVLPD takes 2 or 3 operands")
  57885. }
  57886. // VMOVLPD xmm, m64
  57887. if len(vv) == 0 && isXMM(v0) && isM64(v1) {
  57888. self.require(ISA_AVX)
  57889. p.domain = DomainAVX
  57890. p.add(0, func(m *_Encoding, v []interface{}) {
  57891. m.vex2(1, hcode(v[0]), addr(v[1]), 0)
  57892. m.emit(0x13)
  57893. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  57894. })
  57895. }
  57896. // VMOVLPD m64, xmm, xmm
  57897. if len(vv) == 1 && isM64(v0) && isXMM(v1) && isXMM(vv[0]) {
  57898. self.require(ISA_AVX)
  57899. p.domain = DomainAVX
  57900. p.add(0, func(m *_Encoding, v []interface{}) {
  57901. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  57902. m.emit(0x12)
  57903. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  57904. })
  57905. }
  57906. // VMOVLPD xmm, m64
  57907. if len(vv) == 0 && isEVEXXMM(v0) && isM64(v1) {
  57908. self.require(ISA_AVX512F)
  57909. p.domain = DomainAVX
  57910. p.add(0, func(m *_Encoding, v []interface{}) {
  57911. m.evex(0b01, 0x85, 0b00, ehcode(v[0]), addr(v[1]), 0, 0, 0, 0)
  57912. m.emit(0x13)
  57913. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  57914. })
  57915. }
  57916. // VMOVLPD m64, xmm, xmm
  57917. if len(vv) == 1 && isM64(v0) && isEVEXXMM(v1) && isEVEXXMM(vv[0]) {
  57918. self.require(ISA_AVX512F)
  57919. p.domain = DomainAVX
  57920. p.add(0, func(m *_Encoding, v []interface{}) {
  57921. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), 0, 0, 0)
  57922. m.emit(0x12)
  57923. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  57924. })
  57925. }
  57926. if p.len == 0 {
  57927. panic("invalid operands for VMOVLPD")
  57928. }
  57929. return p
  57930. }
  57931. // VMOVLPS performs "Move Low Packed Single-Precision Floating-Point Values".
  57932. //
  57933. // Mnemonic : VMOVLPS
  57934. // Supported forms : (4 forms)
  57935. //
  57936. // * VMOVLPS xmm, m64 [AVX]
  57937. // * VMOVLPS m64, xmm, xmm [AVX]
  57938. // * VMOVLPS xmm, m64 [AVX512F]
  57939. // * VMOVLPS m64, xmm, xmm [AVX512F]
  57940. //
  57941. func (self *Program) VMOVLPS(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  57942. var p *Instruction
  57943. switch len(vv) {
  57944. case 0 : p = self.alloc("VMOVLPS", 2, Operands { v0, v1 })
  57945. case 1 : p = self.alloc("VMOVLPS", 3, Operands { v0, v1, vv[0] })
  57946. default : panic("instruction VMOVLPS takes 2 or 3 operands")
  57947. }
  57948. // VMOVLPS xmm, m64
  57949. if len(vv) == 0 && isXMM(v0) && isM64(v1) {
  57950. self.require(ISA_AVX)
  57951. p.domain = DomainAVX
  57952. p.add(0, func(m *_Encoding, v []interface{}) {
  57953. m.vex2(0, hcode(v[0]), addr(v[1]), 0)
  57954. m.emit(0x13)
  57955. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  57956. })
  57957. }
  57958. // VMOVLPS m64, xmm, xmm
  57959. if len(vv) == 1 && isM64(v0) && isXMM(v1) && isXMM(vv[0]) {
  57960. self.require(ISA_AVX)
  57961. p.domain = DomainAVX
  57962. p.add(0, func(m *_Encoding, v []interface{}) {
  57963. m.vex2(0, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  57964. m.emit(0x12)
  57965. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  57966. })
  57967. }
  57968. // VMOVLPS xmm, m64
  57969. if len(vv) == 0 && isEVEXXMM(v0) && isM64(v1) {
  57970. self.require(ISA_AVX512F)
  57971. p.domain = DomainAVX
  57972. p.add(0, func(m *_Encoding, v []interface{}) {
  57973. m.evex(0b01, 0x04, 0b00, ehcode(v[0]), addr(v[1]), 0, 0, 0, 0)
  57974. m.emit(0x13)
  57975. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  57976. })
  57977. }
  57978. // VMOVLPS m64, xmm, xmm
  57979. if len(vv) == 1 && isM64(v0) && isEVEXXMM(v1) && isEVEXXMM(vv[0]) {
  57980. self.require(ISA_AVX512F)
  57981. p.domain = DomainAVX
  57982. p.add(0, func(m *_Encoding, v []interface{}) {
  57983. m.evex(0b01, 0x04, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), 0, 0, 0)
  57984. m.emit(0x12)
  57985. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  57986. })
  57987. }
  57988. if p.len == 0 {
  57989. panic("invalid operands for VMOVLPS")
  57990. }
  57991. return p
  57992. }
  57993. // VMOVMSKPD performs "Extract Packed Double-Precision Floating-Point Sign Mask".
  57994. //
  57995. // Mnemonic : VMOVMSKPD
  57996. // Supported forms : (2 forms)
  57997. //
  57998. // * VMOVMSKPD xmm, r32 [AVX]
  57999. // * VMOVMSKPD ymm, r32 [AVX]
  58000. //
  58001. func (self *Program) VMOVMSKPD(v0 interface{}, v1 interface{}) *Instruction {
  58002. p := self.alloc("VMOVMSKPD", 2, Operands { v0, v1 })
  58003. // VMOVMSKPD xmm, r32
  58004. if isXMM(v0) && isReg32(v1) {
  58005. self.require(ISA_AVX)
  58006. p.domain = DomainAVX
  58007. p.add(0, func(m *_Encoding, v []interface{}) {
  58008. m.vex2(1, hcode(v[1]), v[0], 0)
  58009. m.emit(0x50)
  58010. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  58011. })
  58012. }
  58013. // VMOVMSKPD ymm, r32
  58014. if isYMM(v0) && isReg32(v1) {
  58015. self.require(ISA_AVX)
  58016. p.domain = DomainAVX
  58017. p.add(0, func(m *_Encoding, v []interface{}) {
  58018. m.vex2(5, hcode(v[1]), v[0], 0)
  58019. m.emit(0x50)
  58020. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  58021. })
  58022. }
  58023. if p.len == 0 {
  58024. panic("invalid operands for VMOVMSKPD")
  58025. }
  58026. return p
  58027. }
  58028. // VMOVMSKPS performs "Extract Packed Single-Precision Floating-Point Sign Mask".
  58029. //
  58030. // Mnemonic : VMOVMSKPS
  58031. // Supported forms : (2 forms)
  58032. //
  58033. // * VMOVMSKPS xmm, r32 [AVX]
  58034. // * VMOVMSKPS ymm, r32 [AVX]
  58035. //
  58036. func (self *Program) VMOVMSKPS(v0 interface{}, v1 interface{}) *Instruction {
  58037. p := self.alloc("VMOVMSKPS", 2, Operands { v0, v1 })
  58038. // VMOVMSKPS xmm, r32
  58039. if isXMM(v0) && isReg32(v1) {
  58040. self.require(ISA_AVX)
  58041. p.domain = DomainAVX
  58042. p.add(0, func(m *_Encoding, v []interface{}) {
  58043. m.vex2(0, hcode(v[1]), v[0], 0)
  58044. m.emit(0x50)
  58045. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  58046. })
  58047. }
  58048. // VMOVMSKPS ymm, r32
  58049. if isYMM(v0) && isReg32(v1) {
  58050. self.require(ISA_AVX)
  58051. p.domain = DomainAVX
  58052. p.add(0, func(m *_Encoding, v []interface{}) {
  58053. m.vex2(4, hcode(v[1]), v[0], 0)
  58054. m.emit(0x50)
  58055. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  58056. })
  58057. }
  58058. if p.len == 0 {
  58059. panic("invalid operands for VMOVMSKPS")
  58060. }
  58061. return p
  58062. }
  58063. // VMOVNTDQ performs "Store Double Quadword Using Non-Temporal Hint".
  58064. //
  58065. // Mnemonic : VMOVNTDQ
  58066. // Supported forms : (5 forms)
  58067. //
  58068. // * VMOVNTDQ xmm, m128 [AVX]
  58069. // * VMOVNTDQ ymm, m256 [AVX]
  58070. // * VMOVNTDQ zmm, m512 [AVX512F]
  58071. // * VMOVNTDQ xmm, m128 [AVX512F,AVX512VL]
  58072. // * VMOVNTDQ ymm, m256 [AVX512F,AVX512VL]
  58073. //
  58074. func (self *Program) VMOVNTDQ(v0 interface{}, v1 interface{}) *Instruction {
  58075. p := self.alloc("VMOVNTDQ", 2, Operands { v0, v1 })
  58076. // VMOVNTDQ xmm, m128
  58077. if isXMM(v0) && isM128(v1) {
  58078. self.require(ISA_AVX)
  58079. p.domain = DomainAVX
  58080. p.add(0, func(m *_Encoding, v []interface{}) {
  58081. m.vex2(1, hcode(v[0]), addr(v[1]), 0)
  58082. m.emit(0xe7)
  58083. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  58084. })
  58085. }
  58086. // VMOVNTDQ ymm, m256
  58087. if isYMM(v0) && isM256(v1) {
  58088. self.require(ISA_AVX)
  58089. p.domain = DomainAVX
  58090. p.add(0, func(m *_Encoding, v []interface{}) {
  58091. m.vex2(5, hcode(v[0]), addr(v[1]), 0)
  58092. m.emit(0xe7)
  58093. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  58094. })
  58095. }
  58096. // VMOVNTDQ zmm, m512
  58097. if isZMM(v0) && isM512(v1) {
  58098. self.require(ISA_AVX512F)
  58099. p.domain = DomainAVX
  58100. p.add(0, func(m *_Encoding, v []interface{}) {
  58101. m.evex(0b01, 0x05, 0b10, ehcode(v[0]), addr(v[1]), 0, 0, 0, 0)
  58102. m.emit(0xe7)
  58103. m.mrsd(lcode(v[0]), addr(v[1]), 64)
  58104. })
  58105. }
  58106. // VMOVNTDQ xmm, m128
  58107. if isEVEXXMM(v0) && isM128(v1) {
  58108. self.require(ISA_AVX512VL | ISA_AVX512F)
  58109. p.domain = DomainAVX
  58110. p.add(0, func(m *_Encoding, v []interface{}) {
  58111. m.evex(0b01, 0x05, 0b00, ehcode(v[0]), addr(v[1]), 0, 0, 0, 0)
  58112. m.emit(0xe7)
  58113. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  58114. })
  58115. }
  58116. // VMOVNTDQ ymm, m256
  58117. if isEVEXYMM(v0) && isM256(v1) {
  58118. self.require(ISA_AVX512VL | ISA_AVX512F)
  58119. p.domain = DomainAVX
  58120. p.add(0, func(m *_Encoding, v []interface{}) {
  58121. m.evex(0b01, 0x05, 0b01, ehcode(v[0]), addr(v[1]), 0, 0, 0, 0)
  58122. m.emit(0xe7)
  58123. m.mrsd(lcode(v[0]), addr(v[1]), 32)
  58124. })
  58125. }
  58126. if p.len == 0 {
  58127. panic("invalid operands for VMOVNTDQ")
  58128. }
  58129. return p
  58130. }
  58131. // VMOVNTDQA performs "Load Double Quadword Non-Temporal Aligned Hint".
  58132. //
  58133. // Mnemonic : VMOVNTDQA
  58134. // Supported forms : (5 forms)
  58135. //
  58136. // * VMOVNTDQA m128, xmm [AVX]
  58137. // * VMOVNTDQA m256, ymm [AVX2]
  58138. // * VMOVNTDQA m512, zmm [AVX512F]
  58139. // * VMOVNTDQA m128, xmm [AVX512F,AVX512VL]
  58140. // * VMOVNTDQA m256, ymm [AVX512F,AVX512VL]
  58141. //
  58142. func (self *Program) VMOVNTDQA(v0 interface{}, v1 interface{}) *Instruction {
  58143. p := self.alloc("VMOVNTDQA", 2, Operands { v0, v1 })
  58144. // VMOVNTDQA m128, xmm
  58145. if isM128(v0) && isXMM(v1) {
  58146. self.require(ISA_AVX)
  58147. p.domain = DomainAVX
  58148. p.add(0, func(m *_Encoding, v []interface{}) {
  58149. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  58150. m.emit(0x2a)
  58151. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  58152. })
  58153. }
  58154. // VMOVNTDQA m256, ymm
  58155. if isM256(v0) && isYMM(v1) {
  58156. self.require(ISA_AVX2)
  58157. p.domain = DomainAVX
  58158. p.add(0, func(m *_Encoding, v []interface{}) {
  58159. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  58160. m.emit(0x2a)
  58161. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  58162. })
  58163. }
  58164. // VMOVNTDQA m512, zmm
  58165. if isM512(v0) && isZMM(v1) {
  58166. self.require(ISA_AVX512F)
  58167. p.domain = DomainAVX
  58168. p.add(0, func(m *_Encoding, v []interface{}) {
  58169. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  58170. m.emit(0x2a)
  58171. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  58172. })
  58173. }
  58174. // VMOVNTDQA m128, xmm
  58175. if isM128(v0) && isEVEXXMM(v1) {
  58176. self.require(ISA_AVX512VL | ISA_AVX512F)
  58177. p.domain = DomainAVX
  58178. p.add(0, func(m *_Encoding, v []interface{}) {
  58179. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  58180. m.emit(0x2a)
  58181. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  58182. })
  58183. }
  58184. // VMOVNTDQA m256, ymm
  58185. if isM256(v0) && isEVEXYMM(v1) {
  58186. self.require(ISA_AVX512VL | ISA_AVX512F)
  58187. p.domain = DomainAVX
  58188. p.add(0, func(m *_Encoding, v []interface{}) {
  58189. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  58190. m.emit(0x2a)
  58191. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  58192. })
  58193. }
  58194. if p.len == 0 {
  58195. panic("invalid operands for VMOVNTDQA")
  58196. }
  58197. return p
  58198. }
  58199. // VMOVNTPD performs "Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint".
  58200. //
  58201. // Mnemonic : VMOVNTPD
  58202. // Supported forms : (5 forms)
  58203. //
  58204. // * VMOVNTPD xmm, m128 [AVX]
  58205. // * VMOVNTPD ymm, m256 [AVX]
  58206. // * VMOVNTPD zmm, m512 [AVX512F]
  58207. // * VMOVNTPD xmm, m128 [AVX512F,AVX512VL]
  58208. // * VMOVNTPD ymm, m256 [AVX512F,AVX512VL]
  58209. //
  58210. func (self *Program) VMOVNTPD(v0 interface{}, v1 interface{}) *Instruction {
  58211. p := self.alloc("VMOVNTPD", 2, Operands { v0, v1 })
  58212. // VMOVNTPD xmm, m128
  58213. if isXMM(v0) && isM128(v1) {
  58214. self.require(ISA_AVX)
  58215. p.domain = DomainAVX
  58216. p.add(0, func(m *_Encoding, v []interface{}) {
  58217. m.vex2(1, hcode(v[0]), addr(v[1]), 0)
  58218. m.emit(0x2b)
  58219. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  58220. })
  58221. }
  58222. // VMOVNTPD ymm, m256
  58223. if isYMM(v0) && isM256(v1) {
  58224. self.require(ISA_AVX)
  58225. p.domain = DomainAVX
  58226. p.add(0, func(m *_Encoding, v []interface{}) {
  58227. m.vex2(5, hcode(v[0]), addr(v[1]), 0)
  58228. m.emit(0x2b)
  58229. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  58230. })
  58231. }
  58232. // VMOVNTPD zmm, m512
  58233. if isZMM(v0) && isM512(v1) {
  58234. self.require(ISA_AVX512F)
  58235. p.domain = DomainAVX
  58236. p.add(0, func(m *_Encoding, v []interface{}) {
  58237. m.evex(0b01, 0x85, 0b10, ehcode(v[0]), addr(v[1]), 0, 0, 0, 0)
  58238. m.emit(0x2b)
  58239. m.mrsd(lcode(v[0]), addr(v[1]), 64)
  58240. })
  58241. }
  58242. // VMOVNTPD xmm, m128
  58243. if isEVEXXMM(v0) && isM128(v1) {
  58244. self.require(ISA_AVX512VL | ISA_AVX512F)
  58245. p.domain = DomainAVX
  58246. p.add(0, func(m *_Encoding, v []interface{}) {
  58247. m.evex(0b01, 0x85, 0b00, ehcode(v[0]), addr(v[1]), 0, 0, 0, 0)
  58248. m.emit(0x2b)
  58249. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  58250. })
  58251. }
  58252. // VMOVNTPD ymm, m256
  58253. if isEVEXYMM(v0) && isM256(v1) {
  58254. self.require(ISA_AVX512VL | ISA_AVX512F)
  58255. p.domain = DomainAVX
  58256. p.add(0, func(m *_Encoding, v []interface{}) {
  58257. m.evex(0b01, 0x85, 0b01, ehcode(v[0]), addr(v[1]), 0, 0, 0, 0)
  58258. m.emit(0x2b)
  58259. m.mrsd(lcode(v[0]), addr(v[1]), 32)
  58260. })
  58261. }
  58262. if p.len == 0 {
  58263. panic("invalid operands for VMOVNTPD")
  58264. }
  58265. return p
  58266. }
  58267. // VMOVNTPS performs "Store Packed Single-Precision Floating-Point Values Using Non-Temporal Hint".
  58268. //
  58269. // Mnemonic : VMOVNTPS
  58270. // Supported forms : (5 forms)
  58271. //
  58272. // * VMOVNTPS xmm, m128 [AVX]
  58273. // * VMOVNTPS ymm, m256 [AVX]
  58274. // * VMOVNTPS zmm, m512 [AVX512F]
  58275. // * VMOVNTPS xmm, m128 [AVX512F,AVX512VL]
  58276. // * VMOVNTPS ymm, m256 [AVX512F,AVX512VL]
  58277. //
  58278. func (self *Program) VMOVNTPS(v0 interface{}, v1 interface{}) *Instruction {
  58279. p := self.alloc("VMOVNTPS", 2, Operands { v0, v1 })
  58280. // VMOVNTPS xmm, m128
  58281. if isXMM(v0) && isM128(v1) {
  58282. self.require(ISA_AVX)
  58283. p.domain = DomainAVX
  58284. p.add(0, func(m *_Encoding, v []interface{}) {
  58285. m.vex2(0, hcode(v[0]), addr(v[1]), 0)
  58286. m.emit(0x2b)
  58287. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  58288. })
  58289. }
  58290. // VMOVNTPS ymm, m256
  58291. if isYMM(v0) && isM256(v1) {
  58292. self.require(ISA_AVX)
  58293. p.domain = DomainAVX
  58294. p.add(0, func(m *_Encoding, v []interface{}) {
  58295. m.vex2(4, hcode(v[0]), addr(v[1]), 0)
  58296. m.emit(0x2b)
  58297. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  58298. })
  58299. }
  58300. // VMOVNTPS zmm, m512
  58301. if isZMM(v0) && isM512(v1) {
  58302. self.require(ISA_AVX512F)
  58303. p.domain = DomainAVX
  58304. p.add(0, func(m *_Encoding, v []interface{}) {
  58305. m.evex(0b01, 0x04, 0b10, ehcode(v[0]), addr(v[1]), 0, 0, 0, 0)
  58306. m.emit(0x2b)
  58307. m.mrsd(lcode(v[0]), addr(v[1]), 64)
  58308. })
  58309. }
  58310. // VMOVNTPS xmm, m128
  58311. if isEVEXXMM(v0) && isM128(v1) {
  58312. self.require(ISA_AVX512VL | ISA_AVX512F)
  58313. p.domain = DomainAVX
  58314. p.add(0, func(m *_Encoding, v []interface{}) {
  58315. m.evex(0b01, 0x05, 0b00, ehcode(v[0]), addr(v[1]), 0, 0, 0, 0)
  58316. m.emit(0x2b)
  58317. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  58318. })
  58319. }
  58320. // VMOVNTPS ymm, m256
  58321. if isEVEXYMM(v0) && isM256(v1) {
  58322. self.require(ISA_AVX512VL | ISA_AVX512F)
  58323. p.domain = DomainAVX
  58324. p.add(0, func(m *_Encoding, v []interface{}) {
  58325. m.evex(0b01, 0x05, 0b01, ehcode(v[0]), addr(v[1]), 0, 0, 0, 0)
  58326. m.emit(0x2b)
  58327. m.mrsd(lcode(v[0]), addr(v[1]), 32)
  58328. })
  58329. }
  58330. if p.len == 0 {
  58331. panic("invalid operands for VMOVNTPS")
  58332. }
  58333. return p
  58334. }
  58335. // VMOVQ performs "Move Quadword".
  58336. //
  58337. // Mnemonic : VMOVQ
  58338. // Supported forms : (10 forms)
  58339. //
  58340. // * VMOVQ xmm, r64 [AVX]
  58341. // * VMOVQ r64, xmm [AVX]
  58342. // * VMOVQ xmm, xmm [AVX]
  58343. // * VMOVQ m64, xmm [AVX]
  58344. // * VMOVQ xmm, m64 [AVX]
  58345. // * VMOVQ xmm, r64 [AVX512F]
  58346. // * VMOVQ r64, xmm [AVX512F]
  58347. // * VMOVQ xmm, xmm [AVX512F]
  58348. // * VMOVQ m64, xmm [AVX512F]
  58349. // * VMOVQ xmm, m64 [AVX512F]
  58350. //
  58351. func (self *Program) VMOVQ(v0 interface{}, v1 interface{}) *Instruction {
  58352. p := self.alloc("VMOVQ", 2, Operands { v0, v1 })
  58353. // VMOVQ xmm, r64
  58354. if isXMM(v0) && isReg64(v1) {
  58355. self.require(ISA_AVX)
  58356. p.domain = DomainAVX
  58357. p.add(0, func(m *_Encoding, v []interface{}) {
  58358. m.emit(0xc4)
  58359. m.emit(0xe1 ^ (hcode(v[0]) << 7) ^ (hcode(v[1]) << 5))
  58360. m.emit(0xf9)
  58361. m.emit(0x7e)
  58362. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  58363. })
  58364. }
  58365. // VMOVQ r64, xmm
  58366. if isReg64(v0) && isXMM(v1) {
  58367. self.require(ISA_AVX)
  58368. p.domain = DomainAVX
  58369. p.add(0, func(m *_Encoding, v []interface{}) {
  58370. m.emit(0xc4)
  58371. m.emit(0xe1 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  58372. m.emit(0xf9)
  58373. m.emit(0x6e)
  58374. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  58375. })
  58376. }
  58377. // VMOVQ xmm, xmm
  58378. if isXMM(v0) && isXMM(v1) {
  58379. self.require(ISA_AVX)
  58380. p.domain = DomainAVX
  58381. p.add(0, func(m *_Encoding, v []interface{}) {
  58382. m.vex2(2, hcode(v[1]), v[0], 0)
  58383. m.emit(0x7e)
  58384. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  58385. })
  58386. p.add(0, func(m *_Encoding, v []interface{}) {
  58387. m.vex2(1, hcode(v[0]), v[1], 0)
  58388. m.emit(0xd6)
  58389. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  58390. })
  58391. }
  58392. // VMOVQ m64, xmm
  58393. if isM64(v0) && isXMM(v1) {
  58394. self.require(ISA_AVX)
  58395. p.domain = DomainAVX
  58396. p.add(0, func(m *_Encoding, v []interface{}) {
  58397. m.vex2(2, hcode(v[1]), addr(v[0]), 0)
  58398. m.emit(0x7e)
  58399. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  58400. })
  58401. p.add(0, func(m *_Encoding, v []interface{}) {
  58402. m.vex3(0xc4, 0b1, 0x81, hcode(v[1]), addr(v[0]), 0)
  58403. m.emit(0x6e)
  58404. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  58405. })
  58406. }
  58407. // VMOVQ xmm, m64
  58408. if isXMM(v0) && isM64(v1) {
  58409. self.require(ISA_AVX)
  58410. p.domain = DomainAVX
  58411. p.add(0, func(m *_Encoding, v []interface{}) {
  58412. m.vex2(1, hcode(v[0]), addr(v[1]), 0)
  58413. m.emit(0xd6)
  58414. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  58415. })
  58416. p.add(0, func(m *_Encoding, v []interface{}) {
  58417. m.vex3(0xc4, 0b1, 0x81, hcode(v[0]), addr(v[1]), 0)
  58418. m.emit(0x7e)
  58419. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  58420. })
  58421. }
  58422. // VMOVQ xmm, r64
  58423. if isEVEXXMM(v0) && isReg64(v1) {
  58424. self.require(ISA_AVX512F)
  58425. p.domain = DomainAVX
  58426. p.add(0, func(m *_Encoding, v []interface{}) {
  58427. m.emit(0x62)
  58428. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  58429. m.emit(0xfd)
  58430. m.emit(0x08)
  58431. m.emit(0x7e)
  58432. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  58433. })
  58434. }
  58435. // VMOVQ r64, xmm
  58436. if isReg64(v0) && isEVEXXMM(v1) {
  58437. self.require(ISA_AVX512F)
  58438. p.domain = DomainAVX
  58439. p.add(0, func(m *_Encoding, v []interface{}) {
  58440. m.emit(0x62)
  58441. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  58442. m.emit(0xfd)
  58443. m.emit(0x08)
  58444. m.emit(0x6e)
  58445. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  58446. })
  58447. }
  58448. // VMOVQ xmm, xmm
  58449. if isEVEXXMM(v0) && isEVEXXMM(v1) {
  58450. self.require(ISA_AVX512F)
  58451. p.domain = DomainAVX
  58452. p.add(0, func(m *_Encoding, v []interface{}) {
  58453. m.emit(0x62)
  58454. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  58455. m.emit(0xfe)
  58456. m.emit(0x08)
  58457. m.emit(0x7e)
  58458. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  58459. })
  58460. p.add(0, func(m *_Encoding, v []interface{}) {
  58461. m.emit(0x62)
  58462. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  58463. m.emit(0xfd)
  58464. m.emit(0x08)
  58465. m.emit(0xd6)
  58466. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  58467. })
  58468. }
  58469. // VMOVQ m64, xmm
  58470. if isM64(v0) && isEVEXXMM(v1) {
  58471. self.require(ISA_AVX512F)
  58472. p.domain = DomainAVX
  58473. p.add(0, func(m *_Encoding, v []interface{}) {
  58474. m.evex(0b01, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  58475. m.emit(0x6e)
  58476. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  58477. })
  58478. p.add(0, func(m *_Encoding, v []interface{}) {
  58479. m.evex(0b01, 0x86, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  58480. m.emit(0x7e)
  58481. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  58482. })
  58483. }
  58484. // VMOVQ xmm, m64
  58485. if isEVEXXMM(v0) && isM64(v1) {
  58486. self.require(ISA_AVX512F)
  58487. p.domain = DomainAVX
  58488. p.add(0, func(m *_Encoding, v []interface{}) {
  58489. m.evex(0b01, 0x85, 0b00, ehcode(v[0]), addr(v[1]), 0, 0, 0, 0)
  58490. m.emit(0x7e)
  58491. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  58492. })
  58493. p.add(0, func(m *_Encoding, v []interface{}) {
  58494. m.evex(0b01, 0x85, 0b00, ehcode(v[0]), addr(v[1]), 0, 0, 0, 0)
  58495. m.emit(0xd6)
  58496. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  58497. })
  58498. }
  58499. if p.len == 0 {
  58500. panic("invalid operands for VMOVQ")
  58501. }
  58502. return p
  58503. }
  58504. // VMOVSD performs "Move Scalar Double-Precision Floating-Point Value".
  58505. //
  58506. // Mnemonic : VMOVSD
  58507. // Supported forms : (6 forms)
  58508. //
  58509. // * VMOVSD m64, xmm [AVX]
  58510. // * VMOVSD xmm, m64 [AVX]
  58511. // * VMOVSD xmm, xmm, xmm [AVX]
  58512. // * VMOVSD xmm, m64{k} [AVX512F]
  58513. // * VMOVSD m64, xmm{k}{z} [AVX512F]
  58514. // * VMOVSD xmm, xmm, xmm{k}{z} [AVX512F]
  58515. //
  58516. func (self *Program) VMOVSD(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  58517. var p *Instruction
  58518. switch len(vv) {
  58519. case 0 : p = self.alloc("VMOVSD", 2, Operands { v0, v1 })
  58520. case 1 : p = self.alloc("VMOVSD", 3, Operands { v0, v1, vv[0] })
  58521. default : panic("instruction VMOVSD takes 2 or 3 operands")
  58522. }
  58523. // VMOVSD m64, xmm
  58524. if len(vv) == 0 && isM64(v0) && isXMM(v1) {
  58525. self.require(ISA_AVX)
  58526. p.domain = DomainAVX
  58527. p.add(0, func(m *_Encoding, v []interface{}) {
  58528. m.vex2(3, hcode(v[1]), addr(v[0]), 0)
  58529. m.emit(0x10)
  58530. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  58531. })
  58532. }
  58533. // VMOVSD xmm, m64
  58534. if len(vv) == 0 && isXMM(v0) && isM64(v1) {
  58535. self.require(ISA_AVX)
  58536. p.domain = DomainAVX
  58537. p.add(0, func(m *_Encoding, v []interface{}) {
  58538. m.vex2(3, hcode(v[0]), addr(v[1]), 0)
  58539. m.emit(0x11)
  58540. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  58541. })
  58542. }
  58543. // VMOVSD xmm, xmm, xmm
  58544. if len(vv) == 1 && isXMM(v0) && isXMM(v1) && isXMM(vv[0]) {
  58545. self.require(ISA_AVX)
  58546. p.domain = DomainAVX
  58547. p.add(0, func(m *_Encoding, v []interface{}) {
  58548. m.vex2(3, hcode(v[2]), v[0], hlcode(v[1]))
  58549. m.emit(0x10)
  58550. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  58551. })
  58552. p.add(0, func(m *_Encoding, v []interface{}) {
  58553. m.vex2(3, hcode(v[0]), v[2], hlcode(v[1]))
  58554. m.emit(0x11)
  58555. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[2]))
  58556. })
  58557. }
  58558. // VMOVSD xmm, m64{k}
  58559. if len(vv) == 0 && isEVEXXMM(v0) && isM64k(v1) {
  58560. self.require(ISA_AVX512F)
  58561. p.domain = DomainAVX
  58562. p.add(0, func(m *_Encoding, v []interface{}) {
  58563. m.evex(0b01, 0x87, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  58564. m.emit(0x11)
  58565. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  58566. })
  58567. }
  58568. // VMOVSD m64, xmm{k}{z}
  58569. if len(vv) == 0 && isM64(v0) && isXMMkz(v1) {
  58570. self.require(ISA_AVX512F)
  58571. p.domain = DomainAVX
  58572. p.add(0, func(m *_Encoding, v []interface{}) {
  58573. m.evex(0b01, 0x87, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  58574. m.emit(0x10)
  58575. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  58576. })
  58577. }
  58578. // VMOVSD xmm, xmm, xmm{k}{z}
  58579. if len(vv) == 1 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(vv[0]) {
  58580. self.require(ISA_AVX512F)
  58581. p.domain = DomainAVX
  58582. p.add(0, func(m *_Encoding, v []interface{}) {
  58583. m.emit(0x62)
  58584. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  58585. m.emit(0xff ^ (hlcode(v[1]) << 3))
  58586. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  58587. m.emit(0x10)
  58588. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  58589. })
  58590. p.add(0, func(m *_Encoding, v []interface{}) {
  58591. m.emit(0x62)
  58592. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[0]) << 4)))
  58593. m.emit(0xff ^ (hlcode(v[1]) << 3))
  58594. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  58595. m.emit(0x11)
  58596. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[2]))
  58597. })
  58598. }
  58599. if p.len == 0 {
  58600. panic("invalid operands for VMOVSD")
  58601. }
  58602. return p
  58603. }
  58604. // VMOVSHDUP performs "Move Packed Single-FP High and Duplicate".
  58605. //
  58606. // Mnemonic : VMOVSHDUP
  58607. // Supported forms : (10 forms)
  58608. //
  58609. // * VMOVSHDUP xmm, xmm [AVX]
  58610. // * VMOVSHDUP m128, xmm [AVX]
  58611. // * VMOVSHDUP ymm, ymm [AVX]
  58612. // * VMOVSHDUP m256, ymm [AVX]
  58613. // * VMOVSHDUP zmm, zmm{k}{z} [AVX512F]
  58614. // * VMOVSHDUP m512, zmm{k}{z} [AVX512F]
  58615. // * VMOVSHDUP xmm, xmm{k}{z} [AVX512F,AVX512VL]
  58616. // * VMOVSHDUP ymm, ymm{k}{z} [AVX512F,AVX512VL]
  58617. // * VMOVSHDUP m128, xmm{k}{z} [AVX512F,AVX512VL]
  58618. // * VMOVSHDUP m256, ymm{k}{z} [AVX512F,AVX512VL]
  58619. //
  58620. func (self *Program) VMOVSHDUP(v0 interface{}, v1 interface{}) *Instruction {
  58621. p := self.alloc("VMOVSHDUP", 2, Operands { v0, v1 })
  58622. // VMOVSHDUP xmm, xmm
  58623. if isXMM(v0) && isXMM(v1) {
  58624. self.require(ISA_AVX)
  58625. p.domain = DomainAVX
  58626. p.add(0, func(m *_Encoding, v []interface{}) {
  58627. m.vex2(2, hcode(v[1]), v[0], 0)
  58628. m.emit(0x16)
  58629. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  58630. })
  58631. }
  58632. // VMOVSHDUP m128, xmm
  58633. if isM128(v0) && isXMM(v1) {
  58634. self.require(ISA_AVX)
  58635. p.domain = DomainAVX
  58636. p.add(0, func(m *_Encoding, v []interface{}) {
  58637. m.vex2(2, hcode(v[1]), addr(v[0]), 0)
  58638. m.emit(0x16)
  58639. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  58640. })
  58641. }
  58642. // VMOVSHDUP ymm, ymm
  58643. if isYMM(v0) && isYMM(v1) {
  58644. self.require(ISA_AVX)
  58645. p.domain = DomainAVX
  58646. p.add(0, func(m *_Encoding, v []interface{}) {
  58647. m.vex2(6, hcode(v[1]), v[0], 0)
  58648. m.emit(0x16)
  58649. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  58650. })
  58651. }
  58652. // VMOVSHDUP m256, ymm
  58653. if isM256(v0) && isYMM(v1) {
  58654. self.require(ISA_AVX)
  58655. p.domain = DomainAVX
  58656. p.add(0, func(m *_Encoding, v []interface{}) {
  58657. m.vex2(6, hcode(v[1]), addr(v[0]), 0)
  58658. m.emit(0x16)
  58659. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  58660. })
  58661. }
  58662. // VMOVSHDUP zmm, zmm{k}{z}
  58663. if isZMM(v0) && isZMMkz(v1) {
  58664. self.require(ISA_AVX512F)
  58665. p.domain = DomainAVX
  58666. p.add(0, func(m *_Encoding, v []interface{}) {
  58667. m.emit(0x62)
  58668. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  58669. m.emit(0x7e)
  58670. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  58671. m.emit(0x16)
  58672. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  58673. })
  58674. }
  58675. // VMOVSHDUP m512, zmm{k}{z}
  58676. if isM512(v0) && isZMMkz(v1) {
  58677. self.require(ISA_AVX512F)
  58678. p.domain = DomainAVX
  58679. p.add(0, func(m *_Encoding, v []interface{}) {
  58680. m.evex(0b01, 0x06, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  58681. m.emit(0x16)
  58682. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  58683. })
  58684. }
  58685. // VMOVSHDUP xmm, xmm{k}{z}
  58686. if isEVEXXMM(v0) && isXMMkz(v1) {
  58687. self.require(ISA_AVX512VL | ISA_AVX512F)
  58688. p.domain = DomainAVX
  58689. p.add(0, func(m *_Encoding, v []interface{}) {
  58690. m.emit(0x62)
  58691. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  58692. m.emit(0x7e)
  58693. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  58694. m.emit(0x16)
  58695. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  58696. })
  58697. }
  58698. // VMOVSHDUP ymm, ymm{k}{z}
  58699. if isEVEXYMM(v0) && isYMMkz(v1) {
  58700. self.require(ISA_AVX512VL | ISA_AVX512F)
  58701. p.domain = DomainAVX
  58702. p.add(0, func(m *_Encoding, v []interface{}) {
  58703. m.emit(0x62)
  58704. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  58705. m.emit(0x7e)
  58706. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  58707. m.emit(0x16)
  58708. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  58709. })
  58710. }
  58711. // VMOVSHDUP m128, xmm{k}{z}
  58712. if isM128(v0) && isXMMkz(v1) {
  58713. self.require(ISA_AVX512VL | ISA_AVX512F)
  58714. p.domain = DomainAVX
  58715. p.add(0, func(m *_Encoding, v []interface{}) {
  58716. m.evex(0b01, 0x06, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  58717. m.emit(0x16)
  58718. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  58719. })
  58720. }
  58721. // VMOVSHDUP m256, ymm{k}{z}
  58722. if isM256(v0) && isYMMkz(v1) {
  58723. self.require(ISA_AVX512VL | ISA_AVX512F)
  58724. p.domain = DomainAVX
  58725. p.add(0, func(m *_Encoding, v []interface{}) {
  58726. m.evex(0b01, 0x06, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  58727. m.emit(0x16)
  58728. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  58729. })
  58730. }
  58731. if p.len == 0 {
  58732. panic("invalid operands for VMOVSHDUP")
  58733. }
  58734. return p
  58735. }
  58736. // VMOVSLDUP performs "Move Packed Single-FP Low and Duplicate".
  58737. //
  58738. // Mnemonic : VMOVSLDUP
  58739. // Supported forms : (10 forms)
  58740. //
  58741. // * VMOVSLDUP xmm, xmm [AVX]
  58742. // * VMOVSLDUP m128, xmm [AVX]
  58743. // * VMOVSLDUP ymm, ymm [AVX]
  58744. // * VMOVSLDUP m256, ymm [AVX]
  58745. // * VMOVSLDUP zmm, zmm{k}{z} [AVX512F]
  58746. // * VMOVSLDUP m512, zmm{k}{z} [AVX512F]
  58747. // * VMOVSLDUP xmm, xmm{k}{z} [AVX512F,AVX512VL]
  58748. // * VMOVSLDUP ymm, ymm{k}{z} [AVX512F,AVX512VL]
  58749. // * VMOVSLDUP m128, xmm{k}{z} [AVX512F,AVX512VL]
  58750. // * VMOVSLDUP m256, ymm{k}{z} [AVX512F,AVX512VL]
  58751. //
  58752. func (self *Program) VMOVSLDUP(v0 interface{}, v1 interface{}) *Instruction {
  58753. p := self.alloc("VMOVSLDUP", 2, Operands { v0, v1 })
  58754. // VMOVSLDUP xmm, xmm
  58755. if isXMM(v0) && isXMM(v1) {
  58756. self.require(ISA_AVX)
  58757. p.domain = DomainAVX
  58758. p.add(0, func(m *_Encoding, v []interface{}) {
  58759. m.vex2(2, hcode(v[1]), v[0], 0)
  58760. m.emit(0x12)
  58761. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  58762. })
  58763. }
  58764. // VMOVSLDUP m128, xmm
  58765. if isM128(v0) && isXMM(v1) {
  58766. self.require(ISA_AVX)
  58767. p.domain = DomainAVX
  58768. p.add(0, func(m *_Encoding, v []interface{}) {
  58769. m.vex2(2, hcode(v[1]), addr(v[0]), 0)
  58770. m.emit(0x12)
  58771. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  58772. })
  58773. }
  58774. // VMOVSLDUP ymm, ymm
  58775. if isYMM(v0) && isYMM(v1) {
  58776. self.require(ISA_AVX)
  58777. p.domain = DomainAVX
  58778. p.add(0, func(m *_Encoding, v []interface{}) {
  58779. m.vex2(6, hcode(v[1]), v[0], 0)
  58780. m.emit(0x12)
  58781. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  58782. })
  58783. }
  58784. // VMOVSLDUP m256, ymm
  58785. if isM256(v0) && isYMM(v1) {
  58786. self.require(ISA_AVX)
  58787. p.domain = DomainAVX
  58788. p.add(0, func(m *_Encoding, v []interface{}) {
  58789. m.vex2(6, hcode(v[1]), addr(v[0]), 0)
  58790. m.emit(0x12)
  58791. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  58792. })
  58793. }
  58794. // VMOVSLDUP zmm, zmm{k}{z}
  58795. if isZMM(v0) && isZMMkz(v1) {
  58796. self.require(ISA_AVX512F)
  58797. p.domain = DomainAVX
  58798. p.add(0, func(m *_Encoding, v []interface{}) {
  58799. m.emit(0x62)
  58800. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  58801. m.emit(0x7e)
  58802. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  58803. m.emit(0x12)
  58804. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  58805. })
  58806. }
  58807. // VMOVSLDUP m512, zmm{k}{z}
  58808. if isM512(v0) && isZMMkz(v1) {
  58809. self.require(ISA_AVX512F)
  58810. p.domain = DomainAVX
  58811. p.add(0, func(m *_Encoding, v []interface{}) {
  58812. m.evex(0b01, 0x06, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  58813. m.emit(0x12)
  58814. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  58815. })
  58816. }
  58817. // VMOVSLDUP xmm, xmm{k}{z}
  58818. if isEVEXXMM(v0) && isXMMkz(v1) {
  58819. self.require(ISA_AVX512VL | ISA_AVX512F)
  58820. p.domain = DomainAVX
  58821. p.add(0, func(m *_Encoding, v []interface{}) {
  58822. m.emit(0x62)
  58823. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  58824. m.emit(0x7e)
  58825. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  58826. m.emit(0x12)
  58827. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  58828. })
  58829. }
  58830. // VMOVSLDUP ymm, ymm{k}{z}
  58831. if isEVEXYMM(v0) && isYMMkz(v1) {
  58832. self.require(ISA_AVX512VL | ISA_AVX512F)
  58833. p.domain = DomainAVX
  58834. p.add(0, func(m *_Encoding, v []interface{}) {
  58835. m.emit(0x62)
  58836. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  58837. m.emit(0x7e)
  58838. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  58839. m.emit(0x12)
  58840. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  58841. })
  58842. }
  58843. // VMOVSLDUP m128, xmm{k}{z}
  58844. if isM128(v0) && isXMMkz(v1) {
  58845. self.require(ISA_AVX512VL | ISA_AVX512F)
  58846. p.domain = DomainAVX
  58847. p.add(0, func(m *_Encoding, v []interface{}) {
  58848. m.evex(0b01, 0x06, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  58849. m.emit(0x12)
  58850. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  58851. })
  58852. }
  58853. // VMOVSLDUP m256, ymm{k}{z}
  58854. if isM256(v0) && isYMMkz(v1) {
  58855. self.require(ISA_AVX512VL | ISA_AVX512F)
  58856. p.domain = DomainAVX
  58857. p.add(0, func(m *_Encoding, v []interface{}) {
  58858. m.evex(0b01, 0x06, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  58859. m.emit(0x12)
  58860. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  58861. })
  58862. }
  58863. if p.len == 0 {
  58864. panic("invalid operands for VMOVSLDUP")
  58865. }
  58866. return p
  58867. }
  58868. // VMOVSS performs "Move Scalar Single-Precision Floating-Point Values".
  58869. //
  58870. // Mnemonic : VMOVSS
  58871. // Supported forms : (6 forms)
  58872. //
  58873. // * VMOVSS m32, xmm [AVX]
  58874. // * VMOVSS xmm, m32 [AVX]
  58875. // * VMOVSS xmm, xmm, xmm [AVX]
  58876. // * VMOVSS xmm, m32{k} [AVX512F]
  58877. // * VMOVSS m32, xmm{k}{z} [AVX512F]
  58878. // * VMOVSS xmm, xmm, xmm{k}{z} [AVX512F]
  58879. //
  58880. func (self *Program) VMOVSS(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  58881. var p *Instruction
  58882. switch len(vv) {
  58883. case 0 : p = self.alloc("VMOVSS", 2, Operands { v0, v1 })
  58884. case 1 : p = self.alloc("VMOVSS", 3, Operands { v0, v1, vv[0] })
  58885. default : panic("instruction VMOVSS takes 2 or 3 operands")
  58886. }
  58887. // VMOVSS m32, xmm
  58888. if len(vv) == 0 && isM32(v0) && isXMM(v1) {
  58889. self.require(ISA_AVX)
  58890. p.domain = DomainAVX
  58891. p.add(0, func(m *_Encoding, v []interface{}) {
  58892. m.vex2(2, hcode(v[1]), addr(v[0]), 0)
  58893. m.emit(0x10)
  58894. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  58895. })
  58896. }
  58897. // VMOVSS xmm, m32
  58898. if len(vv) == 0 && isXMM(v0) && isM32(v1) {
  58899. self.require(ISA_AVX)
  58900. p.domain = DomainAVX
  58901. p.add(0, func(m *_Encoding, v []interface{}) {
  58902. m.vex2(2, hcode(v[0]), addr(v[1]), 0)
  58903. m.emit(0x11)
  58904. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  58905. })
  58906. }
  58907. // VMOVSS xmm, xmm, xmm
  58908. if len(vv) == 1 && isXMM(v0) && isXMM(v1) && isXMM(vv[0]) {
  58909. self.require(ISA_AVX)
  58910. p.domain = DomainAVX
  58911. p.add(0, func(m *_Encoding, v []interface{}) {
  58912. m.vex2(2, hcode(v[2]), v[0], hlcode(v[1]))
  58913. m.emit(0x10)
  58914. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  58915. })
  58916. p.add(0, func(m *_Encoding, v []interface{}) {
  58917. m.vex2(2, hcode(v[0]), v[2], hlcode(v[1]))
  58918. m.emit(0x11)
  58919. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[2]))
  58920. })
  58921. }
  58922. // VMOVSS xmm, m32{k}
  58923. if len(vv) == 0 && isEVEXXMM(v0) && isM32k(v1) {
  58924. self.require(ISA_AVX512F)
  58925. p.domain = DomainAVX
  58926. p.add(0, func(m *_Encoding, v []interface{}) {
  58927. m.evex(0b01, 0x06, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  58928. m.emit(0x11)
  58929. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  58930. })
  58931. }
  58932. // VMOVSS m32, xmm{k}{z}
  58933. if len(vv) == 0 && isM32(v0) && isXMMkz(v1) {
  58934. self.require(ISA_AVX512F)
  58935. p.domain = DomainAVX
  58936. p.add(0, func(m *_Encoding, v []interface{}) {
  58937. m.evex(0b01, 0x06, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  58938. m.emit(0x10)
  58939. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  58940. })
  58941. }
  58942. // VMOVSS xmm, xmm, xmm{k}{z}
  58943. if len(vv) == 1 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(vv[0]) {
  58944. self.require(ISA_AVX512F)
  58945. p.domain = DomainAVX
  58946. p.add(0, func(m *_Encoding, v []interface{}) {
  58947. m.emit(0x62)
  58948. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  58949. m.emit(0x7e ^ (hlcode(v[1]) << 3))
  58950. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  58951. m.emit(0x10)
  58952. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  58953. })
  58954. p.add(0, func(m *_Encoding, v []interface{}) {
  58955. m.emit(0x62)
  58956. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[0]) << 4)))
  58957. m.emit(0x7e ^ (hlcode(v[1]) << 3))
  58958. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  58959. m.emit(0x11)
  58960. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[2]))
  58961. })
  58962. }
  58963. if p.len == 0 {
  58964. panic("invalid operands for VMOVSS")
  58965. }
  58966. return p
  58967. }
  58968. // VMOVUPD performs "Move Unaligned Packed Double-Precision Floating-Point Values".
  58969. //
  58970. // Mnemonic : VMOVUPD
  58971. // Supported forms : (15 forms)
  58972. //
  58973. // * VMOVUPD xmm, xmm [AVX]
  58974. // * VMOVUPD m128, xmm [AVX]
  58975. // * VMOVUPD ymm, ymm [AVX]
  58976. // * VMOVUPD m256, ymm [AVX]
  58977. // * VMOVUPD xmm, m128 [AVX]
  58978. // * VMOVUPD ymm, m256 [AVX]
  58979. // * VMOVUPD zmm, m512{k}{z} [AVX512F]
  58980. // * VMOVUPD zmm, zmm{k}{z} [AVX512F]
  58981. // * VMOVUPD m512, zmm{k}{z} [AVX512F]
  58982. // * VMOVUPD xmm, m128{k}{z} [AVX512F,AVX512VL]
  58983. // * VMOVUPD xmm, xmm{k}{z} [AVX512F,AVX512VL]
  58984. // * VMOVUPD ymm, m256{k}{z} [AVX512F,AVX512VL]
  58985. // * VMOVUPD ymm, ymm{k}{z} [AVX512F,AVX512VL]
  58986. // * VMOVUPD m128, xmm{k}{z} [AVX512F,AVX512VL]
  58987. // * VMOVUPD m256, ymm{k}{z} [AVX512F,AVX512VL]
  58988. //
  58989. func (self *Program) VMOVUPD(v0 interface{}, v1 interface{}) *Instruction {
  58990. p := self.alloc("VMOVUPD", 2, Operands { v0, v1 })
  58991. // VMOVUPD xmm, xmm
  58992. if isXMM(v0) && isXMM(v1) {
  58993. self.require(ISA_AVX)
  58994. p.domain = DomainAVX
  58995. p.add(0, func(m *_Encoding, v []interface{}) {
  58996. m.vex2(1, hcode(v[1]), v[0], 0)
  58997. m.emit(0x10)
  58998. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  58999. })
  59000. p.add(0, func(m *_Encoding, v []interface{}) {
  59001. m.vex2(1, hcode(v[0]), v[1], 0)
  59002. m.emit(0x11)
  59003. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  59004. })
  59005. }
  59006. // VMOVUPD m128, xmm
  59007. if isM128(v0) && isXMM(v1) {
  59008. self.require(ISA_AVX)
  59009. p.domain = DomainAVX
  59010. p.add(0, func(m *_Encoding, v []interface{}) {
  59011. m.vex2(1, hcode(v[1]), addr(v[0]), 0)
  59012. m.emit(0x10)
  59013. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  59014. })
  59015. }
  59016. // VMOVUPD ymm, ymm
  59017. if isYMM(v0) && isYMM(v1) {
  59018. self.require(ISA_AVX)
  59019. p.domain = DomainAVX
  59020. p.add(0, func(m *_Encoding, v []interface{}) {
  59021. m.vex2(5, hcode(v[1]), v[0], 0)
  59022. m.emit(0x10)
  59023. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  59024. })
  59025. p.add(0, func(m *_Encoding, v []interface{}) {
  59026. m.vex2(5, hcode(v[0]), v[1], 0)
  59027. m.emit(0x11)
  59028. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  59029. })
  59030. }
  59031. // VMOVUPD m256, ymm
  59032. if isM256(v0) && isYMM(v1) {
  59033. self.require(ISA_AVX)
  59034. p.domain = DomainAVX
  59035. p.add(0, func(m *_Encoding, v []interface{}) {
  59036. m.vex2(5, hcode(v[1]), addr(v[0]), 0)
  59037. m.emit(0x10)
  59038. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  59039. })
  59040. }
  59041. // VMOVUPD xmm, m128
  59042. if isXMM(v0) && isM128(v1) {
  59043. self.require(ISA_AVX)
  59044. p.domain = DomainAVX
  59045. p.add(0, func(m *_Encoding, v []interface{}) {
  59046. m.vex2(1, hcode(v[0]), addr(v[1]), 0)
  59047. m.emit(0x11)
  59048. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  59049. })
  59050. }
  59051. // VMOVUPD ymm, m256
  59052. if isYMM(v0) && isM256(v1) {
  59053. self.require(ISA_AVX)
  59054. p.domain = DomainAVX
  59055. p.add(0, func(m *_Encoding, v []interface{}) {
  59056. m.vex2(5, hcode(v[0]), addr(v[1]), 0)
  59057. m.emit(0x11)
  59058. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  59059. })
  59060. }
  59061. // VMOVUPD zmm, m512{k}{z}
  59062. if isZMM(v0) && isM512kz(v1) {
  59063. self.require(ISA_AVX512F)
  59064. p.domain = DomainAVX
  59065. p.add(0, func(m *_Encoding, v []interface{}) {
  59066. m.evex(0b01, 0x85, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  59067. m.emit(0x11)
  59068. m.mrsd(lcode(v[0]), addr(v[1]), 64)
  59069. })
  59070. }
  59071. // VMOVUPD zmm, zmm{k}{z}
  59072. if isZMM(v0) && isZMMkz(v1) {
  59073. self.require(ISA_AVX512F)
  59074. p.domain = DomainAVX
  59075. p.add(0, func(m *_Encoding, v []interface{}) {
  59076. m.emit(0x62)
  59077. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  59078. m.emit(0xfd)
  59079. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  59080. m.emit(0x10)
  59081. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  59082. })
  59083. p.add(0, func(m *_Encoding, v []interface{}) {
  59084. m.emit(0x62)
  59085. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  59086. m.emit(0xfd)
  59087. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  59088. m.emit(0x11)
  59089. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  59090. })
  59091. }
  59092. // VMOVUPD m512, zmm{k}{z}
  59093. if isM512(v0) && isZMMkz(v1) {
  59094. self.require(ISA_AVX512F)
  59095. p.domain = DomainAVX
  59096. p.add(0, func(m *_Encoding, v []interface{}) {
  59097. m.evex(0b01, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  59098. m.emit(0x10)
  59099. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  59100. })
  59101. }
  59102. // VMOVUPD xmm, m128{k}{z}
  59103. if isEVEXXMM(v0) && isM128kz(v1) {
  59104. self.require(ISA_AVX512VL | ISA_AVX512F)
  59105. p.domain = DomainAVX
  59106. p.add(0, func(m *_Encoding, v []interface{}) {
  59107. m.evex(0b01, 0x85, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  59108. m.emit(0x11)
  59109. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  59110. })
  59111. }
  59112. // VMOVUPD xmm, xmm{k}{z}
  59113. if isEVEXXMM(v0) && isXMMkz(v1) {
  59114. self.require(ISA_AVX512VL | ISA_AVX512F)
  59115. p.domain = DomainAVX
  59116. p.add(0, func(m *_Encoding, v []interface{}) {
  59117. m.emit(0x62)
  59118. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  59119. m.emit(0xfd)
  59120. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  59121. m.emit(0x10)
  59122. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  59123. })
  59124. p.add(0, func(m *_Encoding, v []interface{}) {
  59125. m.emit(0x62)
  59126. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  59127. m.emit(0xfd)
  59128. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  59129. m.emit(0x11)
  59130. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  59131. })
  59132. }
  59133. // VMOVUPD ymm, m256{k}{z}
  59134. if isEVEXYMM(v0) && isM256kz(v1) {
  59135. self.require(ISA_AVX512VL | ISA_AVX512F)
  59136. p.domain = DomainAVX
  59137. p.add(0, func(m *_Encoding, v []interface{}) {
  59138. m.evex(0b01, 0x85, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  59139. m.emit(0x11)
  59140. m.mrsd(lcode(v[0]), addr(v[1]), 32)
  59141. })
  59142. }
  59143. // VMOVUPD ymm, ymm{k}{z}
  59144. if isEVEXYMM(v0) && isYMMkz(v1) {
  59145. self.require(ISA_AVX512VL | ISA_AVX512F)
  59146. p.domain = DomainAVX
  59147. p.add(0, func(m *_Encoding, v []interface{}) {
  59148. m.emit(0x62)
  59149. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  59150. m.emit(0xfd)
  59151. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  59152. m.emit(0x10)
  59153. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  59154. })
  59155. p.add(0, func(m *_Encoding, v []interface{}) {
  59156. m.emit(0x62)
  59157. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  59158. m.emit(0xfd)
  59159. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  59160. m.emit(0x11)
  59161. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  59162. })
  59163. }
  59164. // VMOVUPD m128, xmm{k}{z}
  59165. if isM128(v0) && isXMMkz(v1) {
  59166. self.require(ISA_AVX512VL | ISA_AVX512F)
  59167. p.domain = DomainAVX
  59168. p.add(0, func(m *_Encoding, v []interface{}) {
  59169. m.evex(0b01, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  59170. m.emit(0x10)
  59171. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  59172. })
  59173. }
  59174. // VMOVUPD m256, ymm{k}{z}
  59175. if isM256(v0) && isYMMkz(v1) {
  59176. self.require(ISA_AVX512VL | ISA_AVX512F)
  59177. p.domain = DomainAVX
  59178. p.add(0, func(m *_Encoding, v []interface{}) {
  59179. m.evex(0b01, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  59180. m.emit(0x10)
  59181. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  59182. })
  59183. }
  59184. if p.len == 0 {
  59185. panic("invalid operands for VMOVUPD")
  59186. }
  59187. return p
  59188. }
  59189. // VMOVUPS performs "Move Unaligned Packed Single-Precision Floating-Point Values".
  59190. //
  59191. // Mnemonic : VMOVUPS
  59192. // Supported forms : (15 forms)
  59193. //
  59194. // * VMOVUPS xmm, xmm [AVX]
  59195. // * VMOVUPS m128, xmm [AVX]
  59196. // * VMOVUPS ymm, ymm [AVX]
  59197. // * VMOVUPS m256, ymm [AVX]
  59198. // * VMOVUPS xmm, m128 [AVX]
  59199. // * VMOVUPS ymm, m256 [AVX]
  59200. // * VMOVUPS zmm, m512{k}{z} [AVX512F]
  59201. // * VMOVUPS zmm, zmm{k}{z} [AVX512F]
  59202. // * VMOVUPS m512, zmm{k}{z} [AVX512F]
  59203. // * VMOVUPS xmm, m128{k}{z} [AVX512F,AVX512VL]
  59204. // * VMOVUPS xmm, xmm{k}{z} [AVX512F,AVX512VL]
  59205. // * VMOVUPS ymm, m256{k}{z} [AVX512F,AVX512VL]
  59206. // * VMOVUPS ymm, ymm{k}{z} [AVX512F,AVX512VL]
  59207. // * VMOVUPS m128, xmm{k}{z} [AVX512F,AVX512VL]
  59208. // * VMOVUPS m256, ymm{k}{z} [AVX512F,AVX512VL]
  59209. //
  59210. func (self *Program) VMOVUPS(v0 interface{}, v1 interface{}) *Instruction {
  59211. p := self.alloc("VMOVUPS", 2, Operands { v0, v1 })
  59212. // VMOVUPS xmm, xmm
  59213. if isXMM(v0) && isXMM(v1) {
  59214. self.require(ISA_AVX)
  59215. p.domain = DomainAVX
  59216. p.add(0, func(m *_Encoding, v []interface{}) {
  59217. m.vex2(0, hcode(v[1]), v[0], 0)
  59218. m.emit(0x10)
  59219. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  59220. })
  59221. p.add(0, func(m *_Encoding, v []interface{}) {
  59222. m.vex2(0, hcode(v[0]), v[1], 0)
  59223. m.emit(0x11)
  59224. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  59225. })
  59226. }
  59227. // VMOVUPS m128, xmm
  59228. if isM128(v0) && isXMM(v1) {
  59229. self.require(ISA_AVX)
  59230. p.domain = DomainAVX
  59231. p.add(0, func(m *_Encoding, v []interface{}) {
  59232. m.vex2(0, hcode(v[1]), addr(v[0]), 0)
  59233. m.emit(0x10)
  59234. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  59235. })
  59236. }
  59237. // VMOVUPS ymm, ymm
  59238. if isYMM(v0) && isYMM(v1) {
  59239. self.require(ISA_AVX)
  59240. p.domain = DomainAVX
  59241. p.add(0, func(m *_Encoding, v []interface{}) {
  59242. m.vex2(4, hcode(v[1]), v[0], 0)
  59243. m.emit(0x10)
  59244. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  59245. })
  59246. p.add(0, func(m *_Encoding, v []interface{}) {
  59247. m.vex2(4, hcode(v[0]), v[1], 0)
  59248. m.emit(0x11)
  59249. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  59250. })
  59251. }
  59252. // VMOVUPS m256, ymm
  59253. if isM256(v0) && isYMM(v1) {
  59254. self.require(ISA_AVX)
  59255. p.domain = DomainAVX
  59256. p.add(0, func(m *_Encoding, v []interface{}) {
  59257. m.vex2(4, hcode(v[1]), addr(v[0]), 0)
  59258. m.emit(0x10)
  59259. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  59260. })
  59261. }
  59262. // VMOVUPS xmm, m128
  59263. if isXMM(v0) && isM128(v1) {
  59264. self.require(ISA_AVX)
  59265. p.domain = DomainAVX
  59266. p.add(0, func(m *_Encoding, v []interface{}) {
  59267. m.vex2(0, hcode(v[0]), addr(v[1]), 0)
  59268. m.emit(0x11)
  59269. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  59270. })
  59271. }
  59272. // VMOVUPS ymm, m256
  59273. if isYMM(v0) && isM256(v1) {
  59274. self.require(ISA_AVX)
  59275. p.domain = DomainAVX
  59276. p.add(0, func(m *_Encoding, v []interface{}) {
  59277. m.vex2(4, hcode(v[0]), addr(v[1]), 0)
  59278. m.emit(0x11)
  59279. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  59280. })
  59281. }
  59282. // VMOVUPS zmm, m512{k}{z}
  59283. if isZMM(v0) && isM512kz(v1) {
  59284. self.require(ISA_AVX512F)
  59285. p.domain = DomainAVX
  59286. p.add(0, func(m *_Encoding, v []interface{}) {
  59287. m.evex(0b01, 0x04, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  59288. m.emit(0x11)
  59289. m.mrsd(lcode(v[0]), addr(v[1]), 64)
  59290. })
  59291. }
  59292. // VMOVUPS zmm, zmm{k}{z}
  59293. if isZMM(v0) && isZMMkz(v1) {
  59294. self.require(ISA_AVX512F)
  59295. p.domain = DomainAVX
  59296. p.add(0, func(m *_Encoding, v []interface{}) {
  59297. m.emit(0x62)
  59298. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  59299. m.emit(0x7c)
  59300. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  59301. m.emit(0x10)
  59302. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  59303. })
  59304. p.add(0, func(m *_Encoding, v []interface{}) {
  59305. m.emit(0x62)
  59306. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  59307. m.emit(0x7c)
  59308. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  59309. m.emit(0x11)
  59310. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  59311. })
  59312. }
  59313. // VMOVUPS m512, zmm{k}{z}
  59314. if isM512(v0) && isZMMkz(v1) {
  59315. self.require(ISA_AVX512F)
  59316. p.domain = DomainAVX
  59317. p.add(0, func(m *_Encoding, v []interface{}) {
  59318. m.evex(0b01, 0x04, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  59319. m.emit(0x10)
  59320. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  59321. })
  59322. }
  59323. // VMOVUPS xmm, m128{k}{z}
  59324. if isEVEXXMM(v0) && isM128kz(v1) {
  59325. self.require(ISA_AVX512VL | ISA_AVX512F)
  59326. p.domain = DomainAVX
  59327. p.add(0, func(m *_Encoding, v []interface{}) {
  59328. m.evex(0b01, 0x04, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  59329. m.emit(0x11)
  59330. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  59331. })
  59332. }
  59333. // VMOVUPS xmm, xmm{k}{z}
  59334. if isEVEXXMM(v0) && isXMMkz(v1) {
  59335. self.require(ISA_AVX512VL | ISA_AVX512F)
  59336. p.domain = DomainAVX
  59337. p.add(0, func(m *_Encoding, v []interface{}) {
  59338. m.emit(0x62)
  59339. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  59340. m.emit(0x7c)
  59341. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  59342. m.emit(0x10)
  59343. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  59344. })
  59345. p.add(0, func(m *_Encoding, v []interface{}) {
  59346. m.emit(0x62)
  59347. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  59348. m.emit(0x7c)
  59349. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  59350. m.emit(0x11)
  59351. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  59352. })
  59353. }
  59354. // VMOVUPS ymm, m256{k}{z}
  59355. if isEVEXYMM(v0) && isM256kz(v1) {
  59356. self.require(ISA_AVX512VL | ISA_AVX512F)
  59357. p.domain = DomainAVX
  59358. p.add(0, func(m *_Encoding, v []interface{}) {
  59359. m.evex(0b01, 0x04, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  59360. m.emit(0x11)
  59361. m.mrsd(lcode(v[0]), addr(v[1]), 32)
  59362. })
  59363. }
  59364. // VMOVUPS ymm, ymm{k}{z}
  59365. if isEVEXYMM(v0) && isYMMkz(v1) {
  59366. self.require(ISA_AVX512VL | ISA_AVX512F)
  59367. p.domain = DomainAVX
  59368. p.add(0, func(m *_Encoding, v []interface{}) {
  59369. m.emit(0x62)
  59370. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  59371. m.emit(0x7c)
  59372. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  59373. m.emit(0x10)
  59374. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  59375. })
  59376. p.add(0, func(m *_Encoding, v []interface{}) {
  59377. m.emit(0x62)
  59378. m.emit(0xf1 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  59379. m.emit(0x7c)
  59380. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  59381. m.emit(0x11)
  59382. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  59383. })
  59384. }
  59385. // VMOVUPS m128, xmm{k}{z}
  59386. if isM128(v0) && isXMMkz(v1) {
  59387. self.require(ISA_AVX512VL | ISA_AVX512F)
  59388. p.domain = DomainAVX
  59389. p.add(0, func(m *_Encoding, v []interface{}) {
  59390. m.evex(0b01, 0x04, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  59391. m.emit(0x10)
  59392. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  59393. })
  59394. }
  59395. // VMOVUPS m256, ymm{k}{z}
  59396. if isM256(v0) && isYMMkz(v1) {
  59397. self.require(ISA_AVX512VL | ISA_AVX512F)
  59398. p.domain = DomainAVX
  59399. p.add(0, func(m *_Encoding, v []interface{}) {
  59400. m.evex(0b01, 0x04, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  59401. m.emit(0x10)
  59402. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  59403. })
  59404. }
  59405. if p.len == 0 {
  59406. panic("invalid operands for VMOVUPS")
  59407. }
  59408. return p
  59409. }
  59410. // VMPSADBW performs "Compute Multiple Packed Sums of Absolute Difference".
  59411. //
  59412. // Mnemonic : VMPSADBW
  59413. // Supported forms : (4 forms)
  59414. //
  59415. // * VMPSADBW imm8, xmm, xmm, xmm [AVX]
  59416. // * VMPSADBW imm8, m128, xmm, xmm [AVX]
  59417. // * VMPSADBW imm8, ymm, ymm, ymm [AVX2]
  59418. // * VMPSADBW imm8, m256, ymm, ymm [AVX2]
  59419. //
  59420. func (self *Program) VMPSADBW(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  59421. p := self.alloc("VMPSADBW", 4, Operands { v0, v1, v2, v3 })
  59422. // VMPSADBW imm8, xmm, xmm, xmm
  59423. if isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  59424. self.require(ISA_AVX)
  59425. p.domain = DomainAVX
  59426. p.add(0, func(m *_Encoding, v []interface{}) {
  59427. m.emit(0xc4)
  59428. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  59429. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  59430. m.emit(0x42)
  59431. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  59432. m.imm1(toImmAny(v[0]))
  59433. })
  59434. }
  59435. // VMPSADBW imm8, m128, xmm, xmm
  59436. if isImm8(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  59437. self.require(ISA_AVX)
  59438. p.domain = DomainAVX
  59439. p.add(0, func(m *_Encoding, v []interface{}) {
  59440. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  59441. m.emit(0x42)
  59442. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  59443. m.imm1(toImmAny(v[0]))
  59444. })
  59445. }
  59446. // VMPSADBW imm8, ymm, ymm, ymm
  59447. if isImm8(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  59448. self.require(ISA_AVX2)
  59449. p.domain = DomainAVX
  59450. p.add(0, func(m *_Encoding, v []interface{}) {
  59451. m.emit(0xc4)
  59452. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  59453. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  59454. m.emit(0x42)
  59455. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  59456. m.imm1(toImmAny(v[0]))
  59457. })
  59458. }
  59459. // VMPSADBW imm8, m256, ymm, ymm
  59460. if isImm8(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  59461. self.require(ISA_AVX2)
  59462. p.domain = DomainAVX
  59463. p.add(0, func(m *_Encoding, v []interface{}) {
  59464. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  59465. m.emit(0x42)
  59466. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  59467. m.imm1(toImmAny(v[0]))
  59468. })
  59469. }
  59470. if p.len == 0 {
  59471. panic("invalid operands for VMPSADBW")
  59472. }
  59473. return p
  59474. }
  59475. // VMULPD performs "Multiply Packed Double-Precision Floating-Point Values".
  59476. //
  59477. // Mnemonic : VMULPD
  59478. // Supported forms : (11 forms)
  59479. //
  59480. // * VMULPD xmm, xmm, xmm [AVX]
  59481. // * VMULPD m128, xmm, xmm [AVX]
  59482. // * VMULPD ymm, ymm, ymm [AVX]
  59483. // * VMULPD m256, ymm, ymm [AVX]
  59484. // * VMULPD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  59485. // * VMULPD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  59486. // * VMULPD zmm, zmm, zmm{k}{z} [AVX512F]
  59487. // * VMULPD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  59488. // * VMULPD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  59489. // * VMULPD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  59490. // * VMULPD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  59491. //
  59492. func (self *Program) VMULPD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  59493. var p *Instruction
  59494. switch len(vv) {
  59495. case 0 : p = self.alloc("VMULPD", 3, Operands { v0, v1, v2 })
  59496. case 1 : p = self.alloc("VMULPD", 4, Operands { v0, v1, v2, vv[0] })
  59497. default : panic("instruction VMULPD takes 3 or 4 operands")
  59498. }
  59499. // VMULPD xmm, xmm, xmm
  59500. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  59501. self.require(ISA_AVX)
  59502. p.domain = DomainAVX
  59503. p.add(0, func(m *_Encoding, v []interface{}) {
  59504. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  59505. m.emit(0x59)
  59506. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  59507. })
  59508. }
  59509. // VMULPD m128, xmm, xmm
  59510. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  59511. self.require(ISA_AVX)
  59512. p.domain = DomainAVX
  59513. p.add(0, func(m *_Encoding, v []interface{}) {
  59514. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  59515. m.emit(0x59)
  59516. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  59517. })
  59518. }
  59519. // VMULPD ymm, ymm, ymm
  59520. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  59521. self.require(ISA_AVX)
  59522. p.domain = DomainAVX
  59523. p.add(0, func(m *_Encoding, v []interface{}) {
  59524. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  59525. m.emit(0x59)
  59526. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  59527. })
  59528. }
  59529. // VMULPD m256, ymm, ymm
  59530. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  59531. self.require(ISA_AVX)
  59532. p.domain = DomainAVX
  59533. p.add(0, func(m *_Encoding, v []interface{}) {
  59534. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  59535. m.emit(0x59)
  59536. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  59537. })
  59538. }
  59539. // VMULPD m512/m64bcst, zmm, zmm{k}{z}
  59540. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  59541. self.require(ISA_AVX512F)
  59542. p.domain = DomainAVX
  59543. p.add(0, func(m *_Encoding, v []interface{}) {
  59544. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  59545. m.emit(0x59)
  59546. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  59547. })
  59548. }
  59549. // VMULPD {er}, zmm, zmm, zmm{k}{z}
  59550. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  59551. self.require(ISA_AVX512F)
  59552. p.domain = DomainAVX
  59553. p.add(0, func(m *_Encoding, v []interface{}) {
  59554. m.emit(0x62)
  59555. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  59556. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  59557. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  59558. m.emit(0x59)
  59559. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  59560. })
  59561. }
  59562. // VMULPD zmm, zmm, zmm{k}{z}
  59563. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  59564. self.require(ISA_AVX512F)
  59565. p.domain = DomainAVX
  59566. p.add(0, func(m *_Encoding, v []interface{}) {
  59567. m.emit(0x62)
  59568. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  59569. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  59570. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  59571. m.emit(0x59)
  59572. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  59573. })
  59574. }
  59575. // VMULPD m128/m64bcst, xmm, xmm{k}{z}
  59576. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  59577. self.require(ISA_AVX512VL | ISA_AVX512F)
  59578. p.domain = DomainAVX
  59579. p.add(0, func(m *_Encoding, v []interface{}) {
  59580. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  59581. m.emit(0x59)
  59582. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  59583. })
  59584. }
  59585. // VMULPD xmm, xmm, xmm{k}{z}
  59586. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  59587. self.require(ISA_AVX512VL | ISA_AVX512F)
  59588. p.domain = DomainAVX
  59589. p.add(0, func(m *_Encoding, v []interface{}) {
  59590. m.emit(0x62)
  59591. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  59592. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  59593. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  59594. m.emit(0x59)
  59595. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  59596. })
  59597. }
  59598. // VMULPD m256/m64bcst, ymm, ymm{k}{z}
  59599. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  59600. self.require(ISA_AVX512VL | ISA_AVX512F)
  59601. p.domain = DomainAVX
  59602. p.add(0, func(m *_Encoding, v []interface{}) {
  59603. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  59604. m.emit(0x59)
  59605. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  59606. })
  59607. }
  59608. // VMULPD ymm, ymm, ymm{k}{z}
  59609. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  59610. self.require(ISA_AVX512VL | ISA_AVX512F)
  59611. p.domain = DomainAVX
  59612. p.add(0, func(m *_Encoding, v []interface{}) {
  59613. m.emit(0x62)
  59614. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  59615. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  59616. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  59617. m.emit(0x59)
  59618. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  59619. })
  59620. }
  59621. if p.len == 0 {
  59622. panic("invalid operands for VMULPD")
  59623. }
  59624. return p
  59625. }
  59626. // VMULPS performs "Multiply Packed Single-Precision Floating-Point Values".
  59627. //
  59628. // Mnemonic : VMULPS
  59629. // Supported forms : (11 forms)
  59630. //
  59631. // * VMULPS xmm, xmm, xmm [AVX]
  59632. // * VMULPS m128, xmm, xmm [AVX]
  59633. // * VMULPS ymm, ymm, ymm [AVX]
  59634. // * VMULPS m256, ymm, ymm [AVX]
  59635. // * VMULPS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  59636. // * VMULPS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  59637. // * VMULPS zmm, zmm, zmm{k}{z} [AVX512F]
  59638. // * VMULPS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  59639. // * VMULPS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  59640. // * VMULPS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  59641. // * VMULPS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  59642. //
  59643. func (self *Program) VMULPS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  59644. var p *Instruction
  59645. switch len(vv) {
  59646. case 0 : p = self.alloc("VMULPS", 3, Operands { v0, v1, v2 })
  59647. case 1 : p = self.alloc("VMULPS", 4, Operands { v0, v1, v2, vv[0] })
  59648. default : panic("instruction VMULPS takes 3 or 4 operands")
  59649. }
  59650. // VMULPS xmm, xmm, xmm
  59651. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  59652. self.require(ISA_AVX)
  59653. p.domain = DomainAVX
  59654. p.add(0, func(m *_Encoding, v []interface{}) {
  59655. m.vex2(0, hcode(v[2]), v[0], hlcode(v[1]))
  59656. m.emit(0x59)
  59657. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  59658. })
  59659. }
  59660. // VMULPS m128, xmm, xmm
  59661. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  59662. self.require(ISA_AVX)
  59663. p.domain = DomainAVX
  59664. p.add(0, func(m *_Encoding, v []interface{}) {
  59665. m.vex2(0, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  59666. m.emit(0x59)
  59667. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  59668. })
  59669. }
  59670. // VMULPS ymm, ymm, ymm
  59671. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  59672. self.require(ISA_AVX)
  59673. p.domain = DomainAVX
  59674. p.add(0, func(m *_Encoding, v []interface{}) {
  59675. m.vex2(4, hcode(v[2]), v[0], hlcode(v[1]))
  59676. m.emit(0x59)
  59677. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  59678. })
  59679. }
  59680. // VMULPS m256, ymm, ymm
  59681. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  59682. self.require(ISA_AVX)
  59683. p.domain = DomainAVX
  59684. p.add(0, func(m *_Encoding, v []interface{}) {
  59685. m.vex2(4, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  59686. m.emit(0x59)
  59687. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  59688. })
  59689. }
  59690. // VMULPS m512/m32bcst, zmm, zmm{k}{z}
  59691. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  59692. self.require(ISA_AVX512F)
  59693. p.domain = DomainAVX
  59694. p.add(0, func(m *_Encoding, v []interface{}) {
  59695. m.evex(0b01, 0x04, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  59696. m.emit(0x59)
  59697. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  59698. })
  59699. }
  59700. // VMULPS {er}, zmm, zmm, zmm{k}{z}
  59701. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  59702. self.require(ISA_AVX512F)
  59703. p.domain = DomainAVX
  59704. p.add(0, func(m *_Encoding, v []interface{}) {
  59705. m.emit(0x62)
  59706. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  59707. m.emit(0x7c ^ (hlcode(v[2]) << 3))
  59708. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  59709. m.emit(0x59)
  59710. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  59711. })
  59712. }
  59713. // VMULPS zmm, zmm, zmm{k}{z}
  59714. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  59715. self.require(ISA_AVX512F)
  59716. p.domain = DomainAVX
  59717. p.add(0, func(m *_Encoding, v []interface{}) {
  59718. m.emit(0x62)
  59719. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  59720. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  59721. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  59722. m.emit(0x59)
  59723. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  59724. })
  59725. }
  59726. // VMULPS m128/m32bcst, xmm, xmm{k}{z}
  59727. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  59728. self.require(ISA_AVX512VL | ISA_AVX512F)
  59729. p.domain = DomainAVX
  59730. p.add(0, func(m *_Encoding, v []interface{}) {
  59731. m.evex(0b01, 0x04, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  59732. m.emit(0x59)
  59733. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  59734. })
  59735. }
  59736. // VMULPS xmm, xmm, xmm{k}{z}
  59737. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  59738. self.require(ISA_AVX512VL | ISA_AVX512F)
  59739. p.domain = DomainAVX
  59740. p.add(0, func(m *_Encoding, v []interface{}) {
  59741. m.emit(0x62)
  59742. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  59743. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  59744. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  59745. m.emit(0x59)
  59746. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  59747. })
  59748. }
  59749. // VMULPS m256/m32bcst, ymm, ymm{k}{z}
  59750. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  59751. self.require(ISA_AVX512VL | ISA_AVX512F)
  59752. p.domain = DomainAVX
  59753. p.add(0, func(m *_Encoding, v []interface{}) {
  59754. m.evex(0b01, 0x04, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  59755. m.emit(0x59)
  59756. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  59757. })
  59758. }
  59759. // VMULPS ymm, ymm, ymm{k}{z}
  59760. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  59761. self.require(ISA_AVX512VL | ISA_AVX512F)
  59762. p.domain = DomainAVX
  59763. p.add(0, func(m *_Encoding, v []interface{}) {
  59764. m.emit(0x62)
  59765. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  59766. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  59767. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  59768. m.emit(0x59)
  59769. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  59770. })
  59771. }
  59772. if p.len == 0 {
  59773. panic("invalid operands for VMULPS")
  59774. }
  59775. return p
  59776. }
  59777. // VMULSD performs "Multiply Scalar Double-Precision Floating-Point Values".
  59778. //
  59779. // Mnemonic : VMULSD
  59780. // Supported forms : (5 forms)
  59781. //
  59782. // * VMULSD xmm, xmm, xmm [AVX]
  59783. // * VMULSD m64, xmm, xmm [AVX]
  59784. // * VMULSD m64, xmm, xmm{k}{z} [AVX512F]
  59785. // * VMULSD {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  59786. // * VMULSD xmm, xmm, xmm{k}{z} [AVX512F]
  59787. //
  59788. func (self *Program) VMULSD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  59789. var p *Instruction
  59790. switch len(vv) {
  59791. case 0 : p = self.alloc("VMULSD", 3, Operands { v0, v1, v2 })
  59792. case 1 : p = self.alloc("VMULSD", 4, Operands { v0, v1, v2, vv[0] })
  59793. default : panic("instruction VMULSD takes 3 or 4 operands")
  59794. }
  59795. // VMULSD xmm, xmm, xmm
  59796. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  59797. self.require(ISA_AVX)
  59798. p.domain = DomainAVX
  59799. p.add(0, func(m *_Encoding, v []interface{}) {
  59800. m.vex2(3, hcode(v[2]), v[0], hlcode(v[1]))
  59801. m.emit(0x59)
  59802. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  59803. })
  59804. }
  59805. // VMULSD m64, xmm, xmm
  59806. if len(vv) == 0 && isM64(v0) && isXMM(v1) && isXMM(v2) {
  59807. self.require(ISA_AVX)
  59808. p.domain = DomainAVX
  59809. p.add(0, func(m *_Encoding, v []interface{}) {
  59810. m.vex2(3, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  59811. m.emit(0x59)
  59812. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  59813. })
  59814. }
  59815. // VMULSD m64, xmm, xmm{k}{z}
  59816. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  59817. self.require(ISA_AVX512F)
  59818. p.domain = DomainAVX
  59819. p.add(0, func(m *_Encoding, v []interface{}) {
  59820. m.evex(0b01, 0x87, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  59821. m.emit(0x59)
  59822. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  59823. })
  59824. }
  59825. // VMULSD {er}, xmm, xmm, xmm{k}{z}
  59826. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  59827. self.require(ISA_AVX512F)
  59828. p.domain = DomainAVX
  59829. p.add(0, func(m *_Encoding, v []interface{}) {
  59830. m.emit(0x62)
  59831. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  59832. m.emit(0xff ^ (hlcode(v[2]) << 3))
  59833. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  59834. m.emit(0x59)
  59835. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  59836. })
  59837. }
  59838. // VMULSD xmm, xmm, xmm{k}{z}
  59839. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  59840. self.require(ISA_AVX512F)
  59841. p.domain = DomainAVX
  59842. p.add(0, func(m *_Encoding, v []interface{}) {
  59843. m.emit(0x62)
  59844. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  59845. m.emit(0xff ^ (hlcode(v[1]) << 3))
  59846. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  59847. m.emit(0x59)
  59848. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  59849. })
  59850. }
  59851. if p.len == 0 {
  59852. panic("invalid operands for VMULSD")
  59853. }
  59854. return p
  59855. }
  59856. // VMULSS performs "Multiply Scalar Single-Precision Floating-Point Values".
  59857. //
  59858. // Mnemonic : VMULSS
  59859. // Supported forms : (5 forms)
  59860. //
  59861. // * VMULSS xmm, xmm, xmm [AVX]
  59862. // * VMULSS m32, xmm, xmm [AVX]
  59863. // * VMULSS m32, xmm, xmm{k}{z} [AVX512F]
  59864. // * VMULSS {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  59865. // * VMULSS xmm, xmm, xmm{k}{z} [AVX512F]
  59866. //
  59867. func (self *Program) VMULSS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  59868. var p *Instruction
  59869. switch len(vv) {
  59870. case 0 : p = self.alloc("VMULSS", 3, Operands { v0, v1, v2 })
  59871. case 1 : p = self.alloc("VMULSS", 4, Operands { v0, v1, v2, vv[0] })
  59872. default : panic("instruction VMULSS takes 3 or 4 operands")
  59873. }
  59874. // VMULSS xmm, xmm, xmm
  59875. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  59876. self.require(ISA_AVX)
  59877. p.domain = DomainAVX
  59878. p.add(0, func(m *_Encoding, v []interface{}) {
  59879. m.vex2(2, hcode(v[2]), v[0], hlcode(v[1]))
  59880. m.emit(0x59)
  59881. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  59882. })
  59883. }
  59884. // VMULSS m32, xmm, xmm
  59885. if len(vv) == 0 && isM32(v0) && isXMM(v1) && isXMM(v2) {
  59886. self.require(ISA_AVX)
  59887. p.domain = DomainAVX
  59888. p.add(0, func(m *_Encoding, v []interface{}) {
  59889. m.vex2(2, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  59890. m.emit(0x59)
  59891. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  59892. })
  59893. }
  59894. // VMULSS m32, xmm, xmm{k}{z}
  59895. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  59896. self.require(ISA_AVX512F)
  59897. p.domain = DomainAVX
  59898. p.add(0, func(m *_Encoding, v []interface{}) {
  59899. m.evex(0b01, 0x06, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  59900. m.emit(0x59)
  59901. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  59902. })
  59903. }
  59904. // VMULSS {er}, xmm, xmm, xmm{k}{z}
  59905. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  59906. self.require(ISA_AVX512F)
  59907. p.domain = DomainAVX
  59908. p.add(0, func(m *_Encoding, v []interface{}) {
  59909. m.emit(0x62)
  59910. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  59911. m.emit(0x7e ^ (hlcode(v[2]) << 3))
  59912. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  59913. m.emit(0x59)
  59914. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  59915. })
  59916. }
  59917. // VMULSS xmm, xmm, xmm{k}{z}
  59918. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  59919. self.require(ISA_AVX512F)
  59920. p.domain = DomainAVX
  59921. p.add(0, func(m *_Encoding, v []interface{}) {
  59922. m.emit(0x62)
  59923. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  59924. m.emit(0x7e ^ (hlcode(v[1]) << 3))
  59925. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  59926. m.emit(0x59)
  59927. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  59928. })
  59929. }
  59930. if p.len == 0 {
  59931. panic("invalid operands for VMULSS")
  59932. }
  59933. return p
  59934. }
  59935. // VORPD performs "Bitwise Logical OR of Double-Precision Floating-Point Values".
  59936. //
  59937. // Mnemonic : VORPD
  59938. // Supported forms : (10 forms)
  59939. //
  59940. // * VORPD xmm, xmm, xmm [AVX]
  59941. // * VORPD m128, xmm, xmm [AVX]
  59942. // * VORPD ymm, ymm, ymm [AVX]
  59943. // * VORPD m256, ymm, ymm [AVX]
  59944. // * VORPD m512/m64bcst, zmm, zmm{k}{z} [AVX512DQ]
  59945. // * VORPD zmm, zmm, zmm{k}{z} [AVX512DQ]
  59946. // * VORPD m128/m64bcst, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  59947. // * VORPD xmm, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  59948. // * VORPD m256/m64bcst, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  59949. // * VORPD ymm, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  59950. //
  59951. func (self *Program) VORPD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  59952. p := self.alloc("VORPD", 3, Operands { v0, v1, v2 })
  59953. // VORPD xmm, xmm, xmm
  59954. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  59955. self.require(ISA_AVX)
  59956. p.domain = DomainAVX
  59957. p.add(0, func(m *_Encoding, v []interface{}) {
  59958. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  59959. m.emit(0x56)
  59960. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  59961. })
  59962. }
  59963. // VORPD m128, xmm, xmm
  59964. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  59965. self.require(ISA_AVX)
  59966. p.domain = DomainAVX
  59967. p.add(0, func(m *_Encoding, v []interface{}) {
  59968. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  59969. m.emit(0x56)
  59970. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  59971. })
  59972. }
  59973. // VORPD ymm, ymm, ymm
  59974. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  59975. self.require(ISA_AVX)
  59976. p.domain = DomainAVX
  59977. p.add(0, func(m *_Encoding, v []interface{}) {
  59978. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  59979. m.emit(0x56)
  59980. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  59981. })
  59982. }
  59983. // VORPD m256, ymm, ymm
  59984. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  59985. self.require(ISA_AVX)
  59986. p.domain = DomainAVX
  59987. p.add(0, func(m *_Encoding, v []interface{}) {
  59988. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  59989. m.emit(0x56)
  59990. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  59991. })
  59992. }
  59993. // VORPD m512/m64bcst, zmm, zmm{k}{z}
  59994. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  59995. self.require(ISA_AVX512DQ)
  59996. p.domain = DomainAVX
  59997. p.add(0, func(m *_Encoding, v []interface{}) {
  59998. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  59999. m.emit(0x56)
  60000. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  60001. })
  60002. }
  60003. // VORPD zmm, zmm, zmm{k}{z}
  60004. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  60005. self.require(ISA_AVX512DQ)
  60006. p.domain = DomainAVX
  60007. p.add(0, func(m *_Encoding, v []interface{}) {
  60008. m.emit(0x62)
  60009. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  60010. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  60011. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  60012. m.emit(0x56)
  60013. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  60014. })
  60015. }
  60016. // VORPD m128/m64bcst, xmm, xmm{k}{z}
  60017. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  60018. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  60019. p.domain = DomainAVX
  60020. p.add(0, func(m *_Encoding, v []interface{}) {
  60021. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  60022. m.emit(0x56)
  60023. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  60024. })
  60025. }
  60026. // VORPD xmm, xmm, xmm{k}{z}
  60027. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  60028. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  60029. p.domain = DomainAVX
  60030. p.add(0, func(m *_Encoding, v []interface{}) {
  60031. m.emit(0x62)
  60032. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  60033. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  60034. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  60035. m.emit(0x56)
  60036. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  60037. })
  60038. }
  60039. // VORPD m256/m64bcst, ymm, ymm{k}{z}
  60040. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  60041. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  60042. p.domain = DomainAVX
  60043. p.add(0, func(m *_Encoding, v []interface{}) {
  60044. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  60045. m.emit(0x56)
  60046. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  60047. })
  60048. }
  60049. // VORPD ymm, ymm, ymm{k}{z}
  60050. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  60051. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  60052. p.domain = DomainAVX
  60053. p.add(0, func(m *_Encoding, v []interface{}) {
  60054. m.emit(0x62)
  60055. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  60056. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  60057. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  60058. m.emit(0x56)
  60059. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  60060. })
  60061. }
  60062. if p.len == 0 {
  60063. panic("invalid operands for VORPD")
  60064. }
  60065. return p
  60066. }
  60067. // VORPS performs "Bitwise Logical OR of Single-Precision Floating-Point Values".
  60068. //
  60069. // Mnemonic : VORPS
  60070. // Supported forms : (10 forms)
  60071. //
  60072. // * VORPS xmm, xmm, xmm [AVX]
  60073. // * VORPS m128, xmm, xmm [AVX]
  60074. // * VORPS ymm, ymm, ymm [AVX]
  60075. // * VORPS m256, ymm, ymm [AVX]
  60076. // * VORPS m512/m32bcst, zmm, zmm{k}{z} [AVX512DQ]
  60077. // * VORPS zmm, zmm, zmm{k}{z} [AVX512DQ]
  60078. // * VORPS m128/m32bcst, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  60079. // * VORPS xmm, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  60080. // * VORPS m256/m32bcst, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  60081. // * VORPS ymm, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  60082. //
  60083. func (self *Program) VORPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  60084. p := self.alloc("VORPS", 3, Operands { v0, v1, v2 })
  60085. // VORPS xmm, xmm, xmm
  60086. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  60087. self.require(ISA_AVX)
  60088. p.domain = DomainAVX
  60089. p.add(0, func(m *_Encoding, v []interface{}) {
  60090. m.vex2(0, hcode(v[2]), v[0], hlcode(v[1]))
  60091. m.emit(0x56)
  60092. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  60093. })
  60094. }
  60095. // VORPS m128, xmm, xmm
  60096. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  60097. self.require(ISA_AVX)
  60098. p.domain = DomainAVX
  60099. p.add(0, func(m *_Encoding, v []interface{}) {
  60100. m.vex2(0, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  60101. m.emit(0x56)
  60102. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  60103. })
  60104. }
  60105. // VORPS ymm, ymm, ymm
  60106. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  60107. self.require(ISA_AVX)
  60108. p.domain = DomainAVX
  60109. p.add(0, func(m *_Encoding, v []interface{}) {
  60110. m.vex2(4, hcode(v[2]), v[0], hlcode(v[1]))
  60111. m.emit(0x56)
  60112. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  60113. })
  60114. }
  60115. // VORPS m256, ymm, ymm
  60116. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  60117. self.require(ISA_AVX)
  60118. p.domain = DomainAVX
  60119. p.add(0, func(m *_Encoding, v []interface{}) {
  60120. m.vex2(4, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  60121. m.emit(0x56)
  60122. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  60123. })
  60124. }
  60125. // VORPS m512/m32bcst, zmm, zmm{k}{z}
  60126. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  60127. self.require(ISA_AVX512DQ)
  60128. p.domain = DomainAVX
  60129. p.add(0, func(m *_Encoding, v []interface{}) {
  60130. m.evex(0b01, 0x04, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  60131. m.emit(0x56)
  60132. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  60133. })
  60134. }
  60135. // VORPS zmm, zmm, zmm{k}{z}
  60136. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  60137. self.require(ISA_AVX512DQ)
  60138. p.domain = DomainAVX
  60139. p.add(0, func(m *_Encoding, v []interface{}) {
  60140. m.emit(0x62)
  60141. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  60142. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  60143. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  60144. m.emit(0x56)
  60145. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  60146. })
  60147. }
  60148. // VORPS m128/m32bcst, xmm, xmm{k}{z}
  60149. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  60150. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  60151. p.domain = DomainAVX
  60152. p.add(0, func(m *_Encoding, v []interface{}) {
  60153. m.evex(0b01, 0x04, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  60154. m.emit(0x56)
  60155. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  60156. })
  60157. }
  60158. // VORPS xmm, xmm, xmm{k}{z}
  60159. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  60160. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  60161. p.domain = DomainAVX
  60162. p.add(0, func(m *_Encoding, v []interface{}) {
  60163. m.emit(0x62)
  60164. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  60165. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  60166. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  60167. m.emit(0x56)
  60168. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  60169. })
  60170. }
  60171. // VORPS m256/m32bcst, ymm, ymm{k}{z}
  60172. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  60173. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  60174. p.domain = DomainAVX
  60175. p.add(0, func(m *_Encoding, v []interface{}) {
  60176. m.evex(0b01, 0x04, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  60177. m.emit(0x56)
  60178. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  60179. })
  60180. }
  60181. // VORPS ymm, ymm, ymm{k}{z}
  60182. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  60183. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  60184. p.domain = DomainAVX
  60185. p.add(0, func(m *_Encoding, v []interface{}) {
  60186. m.emit(0x62)
  60187. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  60188. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  60189. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  60190. m.emit(0x56)
  60191. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  60192. })
  60193. }
  60194. if p.len == 0 {
  60195. panic("invalid operands for VORPS")
  60196. }
  60197. return p
  60198. }
  60199. // VPABSB performs "Packed Absolute Value of Byte Integers".
  60200. //
  60201. // Mnemonic : VPABSB
  60202. // Supported forms : (10 forms)
  60203. //
  60204. // * VPABSB xmm, xmm [AVX]
  60205. // * VPABSB m128, xmm [AVX]
  60206. // * VPABSB ymm, ymm [AVX2]
  60207. // * VPABSB m256, ymm [AVX2]
  60208. // * VPABSB zmm, zmm{k}{z} [AVX512BW]
  60209. // * VPABSB m512, zmm{k}{z} [AVX512BW]
  60210. // * VPABSB xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  60211. // * VPABSB ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  60212. // * VPABSB m128, xmm{k}{z} [AVX512BW,AVX512VL]
  60213. // * VPABSB m256, ymm{k}{z} [AVX512BW,AVX512VL]
  60214. //
  60215. func (self *Program) VPABSB(v0 interface{}, v1 interface{}) *Instruction {
  60216. p := self.alloc("VPABSB", 2, Operands { v0, v1 })
  60217. // VPABSB xmm, xmm
  60218. if isXMM(v0) && isXMM(v1) {
  60219. self.require(ISA_AVX)
  60220. p.domain = DomainAVX
  60221. p.add(0, func(m *_Encoding, v []interface{}) {
  60222. m.emit(0xc4)
  60223. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  60224. m.emit(0x79)
  60225. m.emit(0x1c)
  60226. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  60227. })
  60228. }
  60229. // VPABSB m128, xmm
  60230. if isM128(v0) && isXMM(v1) {
  60231. self.require(ISA_AVX)
  60232. p.domain = DomainAVX
  60233. p.add(0, func(m *_Encoding, v []interface{}) {
  60234. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  60235. m.emit(0x1c)
  60236. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  60237. })
  60238. }
  60239. // VPABSB ymm, ymm
  60240. if isYMM(v0) && isYMM(v1) {
  60241. self.require(ISA_AVX2)
  60242. p.domain = DomainAVX
  60243. p.add(0, func(m *_Encoding, v []interface{}) {
  60244. m.emit(0xc4)
  60245. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  60246. m.emit(0x7d)
  60247. m.emit(0x1c)
  60248. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  60249. })
  60250. }
  60251. // VPABSB m256, ymm
  60252. if isM256(v0) && isYMM(v1) {
  60253. self.require(ISA_AVX2)
  60254. p.domain = DomainAVX
  60255. p.add(0, func(m *_Encoding, v []interface{}) {
  60256. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  60257. m.emit(0x1c)
  60258. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  60259. })
  60260. }
  60261. // VPABSB zmm, zmm{k}{z}
  60262. if isZMM(v0) && isZMMkz(v1) {
  60263. self.require(ISA_AVX512BW)
  60264. p.domain = DomainAVX
  60265. p.add(0, func(m *_Encoding, v []interface{}) {
  60266. m.emit(0x62)
  60267. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  60268. m.emit(0x7d)
  60269. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  60270. m.emit(0x1c)
  60271. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  60272. })
  60273. }
  60274. // VPABSB m512, zmm{k}{z}
  60275. if isM512(v0) && isZMMkz(v1) {
  60276. self.require(ISA_AVX512BW)
  60277. p.domain = DomainAVX
  60278. p.add(0, func(m *_Encoding, v []interface{}) {
  60279. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  60280. m.emit(0x1c)
  60281. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  60282. })
  60283. }
  60284. // VPABSB xmm, xmm{k}{z}
  60285. if isEVEXXMM(v0) && isXMMkz(v1) {
  60286. self.require(ISA_AVX512VL | ISA_AVX512BW)
  60287. p.domain = DomainAVX
  60288. p.add(0, func(m *_Encoding, v []interface{}) {
  60289. m.emit(0x62)
  60290. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  60291. m.emit(0x7d)
  60292. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  60293. m.emit(0x1c)
  60294. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  60295. })
  60296. }
  60297. // VPABSB ymm, ymm{k}{z}
  60298. if isEVEXYMM(v0) && isYMMkz(v1) {
  60299. self.require(ISA_AVX512VL | ISA_AVX512BW)
  60300. p.domain = DomainAVX
  60301. p.add(0, func(m *_Encoding, v []interface{}) {
  60302. m.emit(0x62)
  60303. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  60304. m.emit(0x7d)
  60305. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  60306. m.emit(0x1c)
  60307. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  60308. })
  60309. }
  60310. // VPABSB m128, xmm{k}{z}
  60311. if isM128(v0) && isXMMkz(v1) {
  60312. self.require(ISA_AVX512VL | ISA_AVX512BW)
  60313. p.domain = DomainAVX
  60314. p.add(0, func(m *_Encoding, v []interface{}) {
  60315. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  60316. m.emit(0x1c)
  60317. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  60318. })
  60319. }
  60320. // VPABSB m256, ymm{k}{z}
  60321. if isM256(v0) && isYMMkz(v1) {
  60322. self.require(ISA_AVX512VL | ISA_AVX512BW)
  60323. p.domain = DomainAVX
  60324. p.add(0, func(m *_Encoding, v []interface{}) {
  60325. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  60326. m.emit(0x1c)
  60327. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  60328. })
  60329. }
  60330. if p.len == 0 {
  60331. panic("invalid operands for VPABSB")
  60332. }
  60333. return p
  60334. }
  60335. // VPABSD performs "Packed Absolute Value of Doubleword Integers".
  60336. //
  60337. // Mnemonic : VPABSD
  60338. // Supported forms : (10 forms)
  60339. //
  60340. // * VPABSD xmm, xmm [AVX]
  60341. // * VPABSD m128, xmm [AVX]
  60342. // * VPABSD ymm, ymm [AVX2]
  60343. // * VPABSD m256, ymm [AVX2]
  60344. // * VPABSD m512/m32bcst, zmm{k}{z} [AVX512F]
  60345. // * VPABSD zmm, zmm{k}{z} [AVX512F]
  60346. // * VPABSD m128/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  60347. // * VPABSD m256/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  60348. // * VPABSD xmm, xmm{k}{z} [AVX512F,AVX512VL]
  60349. // * VPABSD ymm, ymm{k}{z} [AVX512F,AVX512VL]
  60350. //
  60351. func (self *Program) VPABSD(v0 interface{}, v1 interface{}) *Instruction {
  60352. p := self.alloc("VPABSD", 2, Operands { v0, v1 })
  60353. // VPABSD xmm, xmm
  60354. if isXMM(v0) && isXMM(v1) {
  60355. self.require(ISA_AVX)
  60356. p.domain = DomainAVX
  60357. p.add(0, func(m *_Encoding, v []interface{}) {
  60358. m.emit(0xc4)
  60359. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  60360. m.emit(0x79)
  60361. m.emit(0x1e)
  60362. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  60363. })
  60364. }
  60365. // VPABSD m128, xmm
  60366. if isM128(v0) && isXMM(v1) {
  60367. self.require(ISA_AVX)
  60368. p.domain = DomainAVX
  60369. p.add(0, func(m *_Encoding, v []interface{}) {
  60370. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  60371. m.emit(0x1e)
  60372. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  60373. })
  60374. }
  60375. // VPABSD ymm, ymm
  60376. if isYMM(v0) && isYMM(v1) {
  60377. self.require(ISA_AVX2)
  60378. p.domain = DomainAVX
  60379. p.add(0, func(m *_Encoding, v []interface{}) {
  60380. m.emit(0xc4)
  60381. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  60382. m.emit(0x7d)
  60383. m.emit(0x1e)
  60384. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  60385. })
  60386. }
  60387. // VPABSD m256, ymm
  60388. if isM256(v0) && isYMM(v1) {
  60389. self.require(ISA_AVX2)
  60390. p.domain = DomainAVX
  60391. p.add(0, func(m *_Encoding, v []interface{}) {
  60392. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  60393. m.emit(0x1e)
  60394. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  60395. })
  60396. }
  60397. // VPABSD m512/m32bcst, zmm{k}{z}
  60398. if isM512M32bcst(v0) && isZMMkz(v1) {
  60399. self.require(ISA_AVX512F)
  60400. p.domain = DomainAVX
  60401. p.add(0, func(m *_Encoding, v []interface{}) {
  60402. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  60403. m.emit(0x1e)
  60404. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  60405. })
  60406. }
  60407. // VPABSD zmm, zmm{k}{z}
  60408. if isZMM(v0) && isZMMkz(v1) {
  60409. self.require(ISA_AVX512F)
  60410. p.domain = DomainAVX
  60411. p.add(0, func(m *_Encoding, v []interface{}) {
  60412. m.emit(0x62)
  60413. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  60414. m.emit(0x7d)
  60415. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  60416. m.emit(0x1e)
  60417. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  60418. })
  60419. }
  60420. // VPABSD m128/m32bcst, xmm{k}{z}
  60421. if isM128M32bcst(v0) && isXMMkz(v1) {
  60422. self.require(ISA_AVX512VL | ISA_AVX512F)
  60423. p.domain = DomainAVX
  60424. p.add(0, func(m *_Encoding, v []interface{}) {
  60425. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  60426. m.emit(0x1e)
  60427. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  60428. })
  60429. }
  60430. // VPABSD m256/m32bcst, ymm{k}{z}
  60431. if isM256M32bcst(v0) && isYMMkz(v1) {
  60432. self.require(ISA_AVX512VL | ISA_AVX512F)
  60433. p.domain = DomainAVX
  60434. p.add(0, func(m *_Encoding, v []interface{}) {
  60435. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  60436. m.emit(0x1e)
  60437. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  60438. })
  60439. }
  60440. // VPABSD xmm, xmm{k}{z}
  60441. if isEVEXXMM(v0) && isXMMkz(v1) {
  60442. self.require(ISA_AVX512VL | ISA_AVX512F)
  60443. p.domain = DomainAVX
  60444. p.add(0, func(m *_Encoding, v []interface{}) {
  60445. m.emit(0x62)
  60446. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  60447. m.emit(0x7d)
  60448. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  60449. m.emit(0x1e)
  60450. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  60451. })
  60452. }
  60453. // VPABSD ymm, ymm{k}{z}
  60454. if isEVEXYMM(v0) && isYMMkz(v1) {
  60455. self.require(ISA_AVX512VL | ISA_AVX512F)
  60456. p.domain = DomainAVX
  60457. p.add(0, func(m *_Encoding, v []interface{}) {
  60458. m.emit(0x62)
  60459. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  60460. m.emit(0x7d)
  60461. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  60462. m.emit(0x1e)
  60463. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  60464. })
  60465. }
  60466. if p.len == 0 {
  60467. panic("invalid operands for VPABSD")
  60468. }
  60469. return p
  60470. }
  60471. // VPABSQ performs "Packed Absolute Value of Quadword Integers".
  60472. //
  60473. // Mnemonic : VPABSQ
  60474. // Supported forms : (6 forms)
  60475. //
  60476. // * VPABSQ m512/m64bcst, zmm{k}{z} [AVX512F]
  60477. // * VPABSQ zmm, zmm{k}{z} [AVX512F]
  60478. // * VPABSQ m128/m64bcst, xmm{k}{z} [AVX512F,AVX512VL]
  60479. // * VPABSQ m256/m64bcst, ymm{k}{z} [AVX512F,AVX512VL]
  60480. // * VPABSQ xmm, xmm{k}{z} [AVX512F,AVX512VL]
  60481. // * VPABSQ ymm, ymm{k}{z} [AVX512F,AVX512VL]
  60482. //
  60483. func (self *Program) VPABSQ(v0 interface{}, v1 interface{}) *Instruction {
  60484. p := self.alloc("VPABSQ", 2, Operands { v0, v1 })
  60485. // VPABSQ m512/m64bcst, zmm{k}{z}
  60486. if isM512M64bcst(v0) && isZMMkz(v1) {
  60487. self.require(ISA_AVX512F)
  60488. p.domain = DomainAVX
  60489. p.add(0, func(m *_Encoding, v []interface{}) {
  60490. m.evex(0b10, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  60491. m.emit(0x1f)
  60492. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  60493. })
  60494. }
  60495. // VPABSQ zmm, zmm{k}{z}
  60496. if isZMM(v0) && isZMMkz(v1) {
  60497. self.require(ISA_AVX512F)
  60498. p.domain = DomainAVX
  60499. p.add(0, func(m *_Encoding, v []interface{}) {
  60500. m.emit(0x62)
  60501. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  60502. m.emit(0xfd)
  60503. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  60504. m.emit(0x1f)
  60505. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  60506. })
  60507. }
  60508. // VPABSQ m128/m64bcst, xmm{k}{z}
  60509. if isM128M64bcst(v0) && isXMMkz(v1) {
  60510. self.require(ISA_AVX512VL | ISA_AVX512F)
  60511. p.domain = DomainAVX
  60512. p.add(0, func(m *_Encoding, v []interface{}) {
  60513. m.evex(0b10, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  60514. m.emit(0x1f)
  60515. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  60516. })
  60517. }
  60518. // VPABSQ m256/m64bcst, ymm{k}{z}
  60519. if isM256M64bcst(v0) && isYMMkz(v1) {
  60520. self.require(ISA_AVX512VL | ISA_AVX512F)
  60521. p.domain = DomainAVX
  60522. p.add(0, func(m *_Encoding, v []interface{}) {
  60523. m.evex(0b10, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  60524. m.emit(0x1f)
  60525. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  60526. })
  60527. }
  60528. // VPABSQ xmm, xmm{k}{z}
  60529. if isEVEXXMM(v0) && isXMMkz(v1) {
  60530. self.require(ISA_AVX512VL | ISA_AVX512F)
  60531. p.domain = DomainAVX
  60532. p.add(0, func(m *_Encoding, v []interface{}) {
  60533. m.emit(0x62)
  60534. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  60535. m.emit(0xfd)
  60536. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  60537. m.emit(0x1f)
  60538. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  60539. })
  60540. }
  60541. // VPABSQ ymm, ymm{k}{z}
  60542. if isEVEXYMM(v0) && isYMMkz(v1) {
  60543. self.require(ISA_AVX512VL | ISA_AVX512F)
  60544. p.domain = DomainAVX
  60545. p.add(0, func(m *_Encoding, v []interface{}) {
  60546. m.emit(0x62)
  60547. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  60548. m.emit(0xfd)
  60549. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  60550. m.emit(0x1f)
  60551. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  60552. })
  60553. }
  60554. if p.len == 0 {
  60555. panic("invalid operands for VPABSQ")
  60556. }
  60557. return p
  60558. }
  60559. // VPABSW performs "Packed Absolute Value of Word Integers".
  60560. //
  60561. // Mnemonic : VPABSW
  60562. // Supported forms : (10 forms)
  60563. //
  60564. // * VPABSW xmm, xmm [AVX]
  60565. // * VPABSW m128, xmm [AVX]
  60566. // * VPABSW ymm, ymm [AVX2]
  60567. // * VPABSW m256, ymm [AVX2]
  60568. // * VPABSW zmm, zmm{k}{z} [AVX512BW]
  60569. // * VPABSW m512, zmm{k}{z} [AVX512BW]
  60570. // * VPABSW xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  60571. // * VPABSW ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  60572. // * VPABSW m128, xmm{k}{z} [AVX512BW,AVX512VL]
  60573. // * VPABSW m256, ymm{k}{z} [AVX512BW,AVX512VL]
  60574. //
  60575. func (self *Program) VPABSW(v0 interface{}, v1 interface{}) *Instruction {
  60576. p := self.alloc("VPABSW", 2, Operands { v0, v1 })
  60577. // VPABSW xmm, xmm
  60578. if isXMM(v0) && isXMM(v1) {
  60579. self.require(ISA_AVX)
  60580. p.domain = DomainAVX
  60581. p.add(0, func(m *_Encoding, v []interface{}) {
  60582. m.emit(0xc4)
  60583. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  60584. m.emit(0x79)
  60585. m.emit(0x1d)
  60586. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  60587. })
  60588. }
  60589. // VPABSW m128, xmm
  60590. if isM128(v0) && isXMM(v1) {
  60591. self.require(ISA_AVX)
  60592. p.domain = DomainAVX
  60593. p.add(0, func(m *_Encoding, v []interface{}) {
  60594. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  60595. m.emit(0x1d)
  60596. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  60597. })
  60598. }
  60599. // VPABSW ymm, ymm
  60600. if isYMM(v0) && isYMM(v1) {
  60601. self.require(ISA_AVX2)
  60602. p.domain = DomainAVX
  60603. p.add(0, func(m *_Encoding, v []interface{}) {
  60604. m.emit(0xc4)
  60605. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  60606. m.emit(0x7d)
  60607. m.emit(0x1d)
  60608. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  60609. })
  60610. }
  60611. // VPABSW m256, ymm
  60612. if isM256(v0) && isYMM(v1) {
  60613. self.require(ISA_AVX2)
  60614. p.domain = DomainAVX
  60615. p.add(0, func(m *_Encoding, v []interface{}) {
  60616. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  60617. m.emit(0x1d)
  60618. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  60619. })
  60620. }
  60621. // VPABSW zmm, zmm{k}{z}
  60622. if isZMM(v0) && isZMMkz(v1) {
  60623. self.require(ISA_AVX512BW)
  60624. p.domain = DomainAVX
  60625. p.add(0, func(m *_Encoding, v []interface{}) {
  60626. m.emit(0x62)
  60627. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  60628. m.emit(0x7d)
  60629. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  60630. m.emit(0x1d)
  60631. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  60632. })
  60633. }
  60634. // VPABSW m512, zmm{k}{z}
  60635. if isM512(v0) && isZMMkz(v1) {
  60636. self.require(ISA_AVX512BW)
  60637. p.domain = DomainAVX
  60638. p.add(0, func(m *_Encoding, v []interface{}) {
  60639. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  60640. m.emit(0x1d)
  60641. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  60642. })
  60643. }
  60644. // VPABSW xmm, xmm{k}{z}
  60645. if isEVEXXMM(v0) && isXMMkz(v1) {
  60646. self.require(ISA_AVX512VL | ISA_AVX512BW)
  60647. p.domain = DomainAVX
  60648. p.add(0, func(m *_Encoding, v []interface{}) {
  60649. m.emit(0x62)
  60650. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  60651. m.emit(0x7d)
  60652. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  60653. m.emit(0x1d)
  60654. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  60655. })
  60656. }
  60657. // VPABSW ymm, ymm{k}{z}
  60658. if isEVEXYMM(v0) && isYMMkz(v1) {
  60659. self.require(ISA_AVX512VL | ISA_AVX512BW)
  60660. p.domain = DomainAVX
  60661. p.add(0, func(m *_Encoding, v []interface{}) {
  60662. m.emit(0x62)
  60663. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  60664. m.emit(0x7d)
  60665. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  60666. m.emit(0x1d)
  60667. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  60668. })
  60669. }
  60670. // VPABSW m128, xmm{k}{z}
  60671. if isM128(v0) && isXMMkz(v1) {
  60672. self.require(ISA_AVX512VL | ISA_AVX512BW)
  60673. p.domain = DomainAVX
  60674. p.add(0, func(m *_Encoding, v []interface{}) {
  60675. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  60676. m.emit(0x1d)
  60677. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  60678. })
  60679. }
  60680. // VPABSW m256, ymm{k}{z}
  60681. if isM256(v0) && isYMMkz(v1) {
  60682. self.require(ISA_AVX512VL | ISA_AVX512BW)
  60683. p.domain = DomainAVX
  60684. p.add(0, func(m *_Encoding, v []interface{}) {
  60685. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  60686. m.emit(0x1d)
  60687. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  60688. })
  60689. }
  60690. if p.len == 0 {
  60691. panic("invalid operands for VPABSW")
  60692. }
  60693. return p
  60694. }
  60695. // VPACKSSDW performs "Pack Doublewords into Words with Signed Saturation".
  60696. //
  60697. // Mnemonic : VPACKSSDW
  60698. // Supported forms : (10 forms)
  60699. //
  60700. // * VPACKSSDW xmm, xmm, xmm [AVX]
  60701. // * VPACKSSDW m128, xmm, xmm [AVX]
  60702. // * VPACKSSDW ymm, ymm, ymm [AVX2]
  60703. // * VPACKSSDW m256, ymm, ymm [AVX2]
  60704. // * VPACKSSDW m512/m32bcst, zmm, zmm{k}{z} [AVX512BW]
  60705. // * VPACKSSDW zmm, zmm, zmm{k}{z} [AVX512BW]
  60706. // * VPACKSSDW m128/m32bcst, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  60707. // * VPACKSSDW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  60708. // * VPACKSSDW m256/m32bcst, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  60709. // * VPACKSSDW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  60710. //
  60711. func (self *Program) VPACKSSDW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  60712. p := self.alloc("VPACKSSDW", 3, Operands { v0, v1, v2 })
  60713. // VPACKSSDW xmm, xmm, xmm
  60714. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  60715. self.require(ISA_AVX)
  60716. p.domain = DomainAVX
  60717. p.add(0, func(m *_Encoding, v []interface{}) {
  60718. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  60719. m.emit(0x6b)
  60720. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  60721. })
  60722. }
  60723. // VPACKSSDW m128, xmm, xmm
  60724. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  60725. self.require(ISA_AVX)
  60726. p.domain = DomainAVX
  60727. p.add(0, func(m *_Encoding, v []interface{}) {
  60728. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  60729. m.emit(0x6b)
  60730. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  60731. })
  60732. }
  60733. // VPACKSSDW ymm, ymm, ymm
  60734. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  60735. self.require(ISA_AVX2)
  60736. p.domain = DomainAVX
  60737. p.add(0, func(m *_Encoding, v []interface{}) {
  60738. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  60739. m.emit(0x6b)
  60740. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  60741. })
  60742. }
  60743. // VPACKSSDW m256, ymm, ymm
  60744. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  60745. self.require(ISA_AVX2)
  60746. p.domain = DomainAVX
  60747. p.add(0, func(m *_Encoding, v []interface{}) {
  60748. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  60749. m.emit(0x6b)
  60750. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  60751. })
  60752. }
  60753. // VPACKSSDW m512/m32bcst, zmm, zmm{k}{z}
  60754. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  60755. self.require(ISA_AVX512BW)
  60756. p.domain = DomainAVX
  60757. p.add(0, func(m *_Encoding, v []interface{}) {
  60758. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  60759. m.emit(0x6b)
  60760. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  60761. })
  60762. }
  60763. // VPACKSSDW zmm, zmm, zmm{k}{z}
  60764. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  60765. self.require(ISA_AVX512BW)
  60766. p.domain = DomainAVX
  60767. p.add(0, func(m *_Encoding, v []interface{}) {
  60768. m.emit(0x62)
  60769. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  60770. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  60771. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  60772. m.emit(0x6b)
  60773. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  60774. })
  60775. }
  60776. // VPACKSSDW m128/m32bcst, xmm, xmm{k}{z}
  60777. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  60778. self.require(ISA_AVX512VL | ISA_AVX512BW)
  60779. p.domain = DomainAVX
  60780. p.add(0, func(m *_Encoding, v []interface{}) {
  60781. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  60782. m.emit(0x6b)
  60783. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  60784. })
  60785. }
  60786. // VPACKSSDW xmm, xmm, xmm{k}{z}
  60787. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  60788. self.require(ISA_AVX512VL | ISA_AVX512BW)
  60789. p.domain = DomainAVX
  60790. p.add(0, func(m *_Encoding, v []interface{}) {
  60791. m.emit(0x62)
  60792. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  60793. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  60794. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  60795. m.emit(0x6b)
  60796. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  60797. })
  60798. }
  60799. // VPACKSSDW m256/m32bcst, ymm, ymm{k}{z}
  60800. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  60801. self.require(ISA_AVX512VL | ISA_AVX512BW)
  60802. p.domain = DomainAVX
  60803. p.add(0, func(m *_Encoding, v []interface{}) {
  60804. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  60805. m.emit(0x6b)
  60806. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  60807. })
  60808. }
  60809. // VPACKSSDW ymm, ymm, ymm{k}{z}
  60810. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  60811. self.require(ISA_AVX512VL | ISA_AVX512BW)
  60812. p.domain = DomainAVX
  60813. p.add(0, func(m *_Encoding, v []interface{}) {
  60814. m.emit(0x62)
  60815. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  60816. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  60817. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  60818. m.emit(0x6b)
  60819. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  60820. })
  60821. }
  60822. if p.len == 0 {
  60823. panic("invalid operands for VPACKSSDW")
  60824. }
  60825. return p
  60826. }
  60827. // VPACKSSWB performs "Pack Words into Bytes with Signed Saturation".
  60828. //
  60829. // Mnemonic : VPACKSSWB
  60830. // Supported forms : (10 forms)
  60831. //
  60832. // * VPACKSSWB xmm, xmm, xmm [AVX]
  60833. // * VPACKSSWB m128, xmm, xmm [AVX]
  60834. // * VPACKSSWB ymm, ymm, ymm [AVX2]
  60835. // * VPACKSSWB m256, ymm, ymm [AVX2]
  60836. // * VPACKSSWB zmm, zmm, zmm{k}{z} [AVX512BW]
  60837. // * VPACKSSWB m512, zmm, zmm{k}{z} [AVX512BW]
  60838. // * VPACKSSWB xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  60839. // * VPACKSSWB m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  60840. // * VPACKSSWB ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  60841. // * VPACKSSWB m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  60842. //
  60843. func (self *Program) VPACKSSWB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  60844. p := self.alloc("VPACKSSWB", 3, Operands { v0, v1, v2 })
  60845. // VPACKSSWB xmm, xmm, xmm
  60846. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  60847. self.require(ISA_AVX)
  60848. p.domain = DomainAVX
  60849. p.add(0, func(m *_Encoding, v []interface{}) {
  60850. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  60851. m.emit(0x63)
  60852. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  60853. })
  60854. }
  60855. // VPACKSSWB m128, xmm, xmm
  60856. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  60857. self.require(ISA_AVX)
  60858. p.domain = DomainAVX
  60859. p.add(0, func(m *_Encoding, v []interface{}) {
  60860. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  60861. m.emit(0x63)
  60862. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  60863. })
  60864. }
  60865. // VPACKSSWB ymm, ymm, ymm
  60866. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  60867. self.require(ISA_AVX2)
  60868. p.domain = DomainAVX
  60869. p.add(0, func(m *_Encoding, v []interface{}) {
  60870. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  60871. m.emit(0x63)
  60872. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  60873. })
  60874. }
  60875. // VPACKSSWB m256, ymm, ymm
  60876. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  60877. self.require(ISA_AVX2)
  60878. p.domain = DomainAVX
  60879. p.add(0, func(m *_Encoding, v []interface{}) {
  60880. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  60881. m.emit(0x63)
  60882. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  60883. })
  60884. }
  60885. // VPACKSSWB zmm, zmm, zmm{k}{z}
  60886. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  60887. self.require(ISA_AVX512BW)
  60888. p.domain = DomainAVX
  60889. p.add(0, func(m *_Encoding, v []interface{}) {
  60890. m.emit(0x62)
  60891. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  60892. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  60893. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  60894. m.emit(0x63)
  60895. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  60896. })
  60897. }
  60898. // VPACKSSWB m512, zmm, zmm{k}{z}
  60899. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  60900. self.require(ISA_AVX512BW)
  60901. p.domain = DomainAVX
  60902. p.add(0, func(m *_Encoding, v []interface{}) {
  60903. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  60904. m.emit(0x63)
  60905. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  60906. })
  60907. }
  60908. // VPACKSSWB xmm, xmm, xmm{k}{z}
  60909. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  60910. self.require(ISA_AVX512VL | ISA_AVX512BW)
  60911. p.domain = DomainAVX
  60912. p.add(0, func(m *_Encoding, v []interface{}) {
  60913. m.emit(0x62)
  60914. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  60915. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  60916. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  60917. m.emit(0x63)
  60918. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  60919. })
  60920. }
  60921. // VPACKSSWB m128, xmm, xmm{k}{z}
  60922. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  60923. self.require(ISA_AVX512VL | ISA_AVX512BW)
  60924. p.domain = DomainAVX
  60925. p.add(0, func(m *_Encoding, v []interface{}) {
  60926. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  60927. m.emit(0x63)
  60928. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  60929. })
  60930. }
  60931. // VPACKSSWB ymm, ymm, ymm{k}{z}
  60932. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  60933. self.require(ISA_AVX512VL | ISA_AVX512BW)
  60934. p.domain = DomainAVX
  60935. p.add(0, func(m *_Encoding, v []interface{}) {
  60936. m.emit(0x62)
  60937. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  60938. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  60939. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  60940. m.emit(0x63)
  60941. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  60942. })
  60943. }
  60944. // VPACKSSWB m256, ymm, ymm{k}{z}
  60945. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  60946. self.require(ISA_AVX512VL | ISA_AVX512BW)
  60947. p.domain = DomainAVX
  60948. p.add(0, func(m *_Encoding, v []interface{}) {
  60949. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  60950. m.emit(0x63)
  60951. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  60952. })
  60953. }
  60954. if p.len == 0 {
  60955. panic("invalid operands for VPACKSSWB")
  60956. }
  60957. return p
  60958. }
  60959. // VPACKUSDW performs "Pack Doublewords into Words with Unsigned Saturation".
  60960. //
  60961. // Mnemonic : VPACKUSDW
  60962. // Supported forms : (10 forms)
  60963. //
  60964. // * VPACKUSDW xmm, xmm, xmm [AVX]
  60965. // * VPACKUSDW m128, xmm, xmm [AVX]
  60966. // * VPACKUSDW ymm, ymm, ymm [AVX2]
  60967. // * VPACKUSDW m256, ymm, ymm [AVX2]
  60968. // * VPACKUSDW m512/m32bcst, zmm, zmm{k}{z} [AVX512BW]
  60969. // * VPACKUSDW zmm, zmm, zmm{k}{z} [AVX512BW]
  60970. // * VPACKUSDW m128/m32bcst, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  60971. // * VPACKUSDW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  60972. // * VPACKUSDW m256/m32bcst, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  60973. // * VPACKUSDW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  60974. //
  60975. func (self *Program) VPACKUSDW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  60976. p := self.alloc("VPACKUSDW", 3, Operands { v0, v1, v2 })
  60977. // VPACKUSDW xmm, xmm, xmm
  60978. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  60979. self.require(ISA_AVX)
  60980. p.domain = DomainAVX
  60981. p.add(0, func(m *_Encoding, v []interface{}) {
  60982. m.emit(0xc4)
  60983. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  60984. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  60985. m.emit(0x2b)
  60986. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  60987. })
  60988. }
  60989. // VPACKUSDW m128, xmm, xmm
  60990. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  60991. self.require(ISA_AVX)
  60992. p.domain = DomainAVX
  60993. p.add(0, func(m *_Encoding, v []interface{}) {
  60994. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  60995. m.emit(0x2b)
  60996. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  60997. })
  60998. }
  60999. // VPACKUSDW ymm, ymm, ymm
  61000. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  61001. self.require(ISA_AVX2)
  61002. p.domain = DomainAVX
  61003. p.add(0, func(m *_Encoding, v []interface{}) {
  61004. m.emit(0xc4)
  61005. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  61006. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  61007. m.emit(0x2b)
  61008. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61009. })
  61010. }
  61011. // VPACKUSDW m256, ymm, ymm
  61012. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  61013. self.require(ISA_AVX2)
  61014. p.domain = DomainAVX
  61015. p.add(0, func(m *_Encoding, v []interface{}) {
  61016. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  61017. m.emit(0x2b)
  61018. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  61019. })
  61020. }
  61021. // VPACKUSDW m512/m32bcst, zmm, zmm{k}{z}
  61022. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  61023. self.require(ISA_AVX512BW)
  61024. p.domain = DomainAVX
  61025. p.add(0, func(m *_Encoding, v []interface{}) {
  61026. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  61027. m.emit(0x2b)
  61028. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  61029. })
  61030. }
  61031. // VPACKUSDW zmm, zmm, zmm{k}{z}
  61032. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  61033. self.require(ISA_AVX512BW)
  61034. p.domain = DomainAVX
  61035. p.add(0, func(m *_Encoding, v []interface{}) {
  61036. m.emit(0x62)
  61037. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61038. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  61039. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  61040. m.emit(0x2b)
  61041. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61042. })
  61043. }
  61044. // VPACKUSDW m128/m32bcst, xmm, xmm{k}{z}
  61045. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  61046. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61047. p.domain = DomainAVX
  61048. p.add(0, func(m *_Encoding, v []interface{}) {
  61049. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  61050. m.emit(0x2b)
  61051. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  61052. })
  61053. }
  61054. // VPACKUSDW xmm, xmm, xmm{k}{z}
  61055. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  61056. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61057. p.domain = DomainAVX
  61058. p.add(0, func(m *_Encoding, v []interface{}) {
  61059. m.emit(0x62)
  61060. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61061. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  61062. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  61063. m.emit(0x2b)
  61064. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61065. })
  61066. }
  61067. // VPACKUSDW m256/m32bcst, ymm, ymm{k}{z}
  61068. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  61069. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61070. p.domain = DomainAVX
  61071. p.add(0, func(m *_Encoding, v []interface{}) {
  61072. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  61073. m.emit(0x2b)
  61074. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  61075. })
  61076. }
  61077. // VPACKUSDW ymm, ymm, ymm{k}{z}
  61078. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  61079. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61080. p.domain = DomainAVX
  61081. p.add(0, func(m *_Encoding, v []interface{}) {
  61082. m.emit(0x62)
  61083. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61084. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  61085. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  61086. m.emit(0x2b)
  61087. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61088. })
  61089. }
  61090. if p.len == 0 {
  61091. panic("invalid operands for VPACKUSDW")
  61092. }
  61093. return p
  61094. }
  61095. // VPACKUSWB performs "Pack Words into Bytes with Unsigned Saturation".
  61096. //
  61097. // Mnemonic : VPACKUSWB
  61098. // Supported forms : (10 forms)
  61099. //
  61100. // * VPACKUSWB xmm, xmm, xmm [AVX]
  61101. // * VPACKUSWB m128, xmm, xmm [AVX]
  61102. // * VPACKUSWB ymm, ymm, ymm [AVX2]
  61103. // * VPACKUSWB m256, ymm, ymm [AVX2]
  61104. // * VPACKUSWB zmm, zmm, zmm{k}{z} [AVX512BW]
  61105. // * VPACKUSWB m512, zmm, zmm{k}{z} [AVX512BW]
  61106. // * VPACKUSWB xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  61107. // * VPACKUSWB m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  61108. // * VPACKUSWB ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  61109. // * VPACKUSWB m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  61110. //
  61111. func (self *Program) VPACKUSWB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  61112. p := self.alloc("VPACKUSWB", 3, Operands { v0, v1, v2 })
  61113. // VPACKUSWB xmm, xmm, xmm
  61114. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  61115. self.require(ISA_AVX)
  61116. p.domain = DomainAVX
  61117. p.add(0, func(m *_Encoding, v []interface{}) {
  61118. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  61119. m.emit(0x67)
  61120. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61121. })
  61122. }
  61123. // VPACKUSWB m128, xmm, xmm
  61124. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  61125. self.require(ISA_AVX)
  61126. p.domain = DomainAVX
  61127. p.add(0, func(m *_Encoding, v []interface{}) {
  61128. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  61129. m.emit(0x67)
  61130. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  61131. })
  61132. }
  61133. // VPACKUSWB ymm, ymm, ymm
  61134. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  61135. self.require(ISA_AVX2)
  61136. p.domain = DomainAVX
  61137. p.add(0, func(m *_Encoding, v []interface{}) {
  61138. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  61139. m.emit(0x67)
  61140. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61141. })
  61142. }
  61143. // VPACKUSWB m256, ymm, ymm
  61144. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  61145. self.require(ISA_AVX2)
  61146. p.domain = DomainAVX
  61147. p.add(0, func(m *_Encoding, v []interface{}) {
  61148. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  61149. m.emit(0x67)
  61150. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  61151. })
  61152. }
  61153. // VPACKUSWB zmm, zmm, zmm{k}{z}
  61154. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  61155. self.require(ISA_AVX512BW)
  61156. p.domain = DomainAVX
  61157. p.add(0, func(m *_Encoding, v []interface{}) {
  61158. m.emit(0x62)
  61159. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61160. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  61161. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  61162. m.emit(0x67)
  61163. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61164. })
  61165. }
  61166. // VPACKUSWB m512, zmm, zmm{k}{z}
  61167. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  61168. self.require(ISA_AVX512BW)
  61169. p.domain = DomainAVX
  61170. p.add(0, func(m *_Encoding, v []interface{}) {
  61171. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  61172. m.emit(0x67)
  61173. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  61174. })
  61175. }
  61176. // VPACKUSWB xmm, xmm, xmm{k}{z}
  61177. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  61178. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61179. p.domain = DomainAVX
  61180. p.add(0, func(m *_Encoding, v []interface{}) {
  61181. m.emit(0x62)
  61182. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61183. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  61184. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  61185. m.emit(0x67)
  61186. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61187. })
  61188. }
  61189. // VPACKUSWB m128, xmm, xmm{k}{z}
  61190. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  61191. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61192. p.domain = DomainAVX
  61193. p.add(0, func(m *_Encoding, v []interface{}) {
  61194. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  61195. m.emit(0x67)
  61196. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  61197. })
  61198. }
  61199. // VPACKUSWB ymm, ymm, ymm{k}{z}
  61200. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  61201. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61202. p.domain = DomainAVX
  61203. p.add(0, func(m *_Encoding, v []interface{}) {
  61204. m.emit(0x62)
  61205. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61206. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  61207. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  61208. m.emit(0x67)
  61209. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61210. })
  61211. }
  61212. // VPACKUSWB m256, ymm, ymm{k}{z}
  61213. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  61214. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61215. p.domain = DomainAVX
  61216. p.add(0, func(m *_Encoding, v []interface{}) {
  61217. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  61218. m.emit(0x67)
  61219. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  61220. })
  61221. }
  61222. if p.len == 0 {
  61223. panic("invalid operands for VPACKUSWB")
  61224. }
  61225. return p
  61226. }
  61227. // VPADDB performs "Add Packed Byte Integers".
  61228. //
  61229. // Mnemonic : VPADDB
  61230. // Supported forms : (10 forms)
  61231. //
  61232. // * VPADDB xmm, xmm, xmm [AVX]
  61233. // * VPADDB m128, xmm, xmm [AVX]
  61234. // * VPADDB ymm, ymm, ymm [AVX2]
  61235. // * VPADDB m256, ymm, ymm [AVX2]
  61236. // * VPADDB zmm, zmm, zmm{k}{z} [AVX512BW]
  61237. // * VPADDB m512, zmm, zmm{k}{z} [AVX512BW]
  61238. // * VPADDB xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  61239. // * VPADDB m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  61240. // * VPADDB ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  61241. // * VPADDB m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  61242. //
  61243. func (self *Program) VPADDB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  61244. p := self.alloc("VPADDB", 3, Operands { v0, v1, v2 })
  61245. // VPADDB xmm, xmm, xmm
  61246. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  61247. self.require(ISA_AVX)
  61248. p.domain = DomainAVX
  61249. p.add(0, func(m *_Encoding, v []interface{}) {
  61250. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  61251. m.emit(0xfc)
  61252. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61253. })
  61254. }
  61255. // VPADDB m128, xmm, xmm
  61256. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  61257. self.require(ISA_AVX)
  61258. p.domain = DomainAVX
  61259. p.add(0, func(m *_Encoding, v []interface{}) {
  61260. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  61261. m.emit(0xfc)
  61262. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  61263. })
  61264. }
  61265. // VPADDB ymm, ymm, ymm
  61266. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  61267. self.require(ISA_AVX2)
  61268. p.domain = DomainAVX
  61269. p.add(0, func(m *_Encoding, v []interface{}) {
  61270. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  61271. m.emit(0xfc)
  61272. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61273. })
  61274. }
  61275. // VPADDB m256, ymm, ymm
  61276. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  61277. self.require(ISA_AVX2)
  61278. p.domain = DomainAVX
  61279. p.add(0, func(m *_Encoding, v []interface{}) {
  61280. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  61281. m.emit(0xfc)
  61282. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  61283. })
  61284. }
  61285. // VPADDB zmm, zmm, zmm{k}{z}
  61286. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  61287. self.require(ISA_AVX512BW)
  61288. p.domain = DomainAVX
  61289. p.add(0, func(m *_Encoding, v []interface{}) {
  61290. m.emit(0x62)
  61291. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61292. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  61293. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  61294. m.emit(0xfc)
  61295. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61296. })
  61297. }
  61298. // VPADDB m512, zmm, zmm{k}{z}
  61299. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  61300. self.require(ISA_AVX512BW)
  61301. p.domain = DomainAVX
  61302. p.add(0, func(m *_Encoding, v []interface{}) {
  61303. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  61304. m.emit(0xfc)
  61305. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  61306. })
  61307. }
  61308. // VPADDB xmm, xmm, xmm{k}{z}
  61309. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  61310. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61311. p.domain = DomainAVX
  61312. p.add(0, func(m *_Encoding, v []interface{}) {
  61313. m.emit(0x62)
  61314. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61315. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  61316. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  61317. m.emit(0xfc)
  61318. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61319. })
  61320. }
  61321. // VPADDB m128, xmm, xmm{k}{z}
  61322. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  61323. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61324. p.domain = DomainAVX
  61325. p.add(0, func(m *_Encoding, v []interface{}) {
  61326. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  61327. m.emit(0xfc)
  61328. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  61329. })
  61330. }
  61331. // VPADDB ymm, ymm, ymm{k}{z}
  61332. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  61333. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61334. p.domain = DomainAVX
  61335. p.add(0, func(m *_Encoding, v []interface{}) {
  61336. m.emit(0x62)
  61337. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61338. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  61339. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  61340. m.emit(0xfc)
  61341. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61342. })
  61343. }
  61344. // VPADDB m256, ymm, ymm{k}{z}
  61345. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  61346. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61347. p.domain = DomainAVX
  61348. p.add(0, func(m *_Encoding, v []interface{}) {
  61349. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  61350. m.emit(0xfc)
  61351. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  61352. })
  61353. }
  61354. if p.len == 0 {
  61355. panic("invalid operands for VPADDB")
  61356. }
  61357. return p
  61358. }
  61359. // VPADDD performs "Add Packed Doubleword Integers".
  61360. //
  61361. // Mnemonic : VPADDD
  61362. // Supported forms : (10 forms)
  61363. //
  61364. // * VPADDD xmm, xmm, xmm [AVX]
  61365. // * VPADDD m128, xmm, xmm [AVX]
  61366. // * VPADDD ymm, ymm, ymm [AVX2]
  61367. // * VPADDD m256, ymm, ymm [AVX2]
  61368. // * VPADDD m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  61369. // * VPADDD zmm, zmm, zmm{k}{z} [AVX512F]
  61370. // * VPADDD m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  61371. // * VPADDD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  61372. // * VPADDD m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  61373. // * VPADDD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  61374. //
  61375. func (self *Program) VPADDD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  61376. p := self.alloc("VPADDD", 3, Operands { v0, v1, v2 })
  61377. // VPADDD xmm, xmm, xmm
  61378. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  61379. self.require(ISA_AVX)
  61380. p.domain = DomainAVX
  61381. p.add(0, func(m *_Encoding, v []interface{}) {
  61382. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  61383. m.emit(0xfe)
  61384. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61385. })
  61386. }
  61387. // VPADDD m128, xmm, xmm
  61388. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  61389. self.require(ISA_AVX)
  61390. p.domain = DomainAVX
  61391. p.add(0, func(m *_Encoding, v []interface{}) {
  61392. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  61393. m.emit(0xfe)
  61394. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  61395. })
  61396. }
  61397. // VPADDD ymm, ymm, ymm
  61398. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  61399. self.require(ISA_AVX2)
  61400. p.domain = DomainAVX
  61401. p.add(0, func(m *_Encoding, v []interface{}) {
  61402. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  61403. m.emit(0xfe)
  61404. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61405. })
  61406. }
  61407. // VPADDD m256, ymm, ymm
  61408. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  61409. self.require(ISA_AVX2)
  61410. p.domain = DomainAVX
  61411. p.add(0, func(m *_Encoding, v []interface{}) {
  61412. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  61413. m.emit(0xfe)
  61414. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  61415. })
  61416. }
  61417. // VPADDD m512/m32bcst, zmm, zmm{k}{z}
  61418. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  61419. self.require(ISA_AVX512F)
  61420. p.domain = DomainAVX
  61421. p.add(0, func(m *_Encoding, v []interface{}) {
  61422. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  61423. m.emit(0xfe)
  61424. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  61425. })
  61426. }
  61427. // VPADDD zmm, zmm, zmm{k}{z}
  61428. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  61429. self.require(ISA_AVX512F)
  61430. p.domain = DomainAVX
  61431. p.add(0, func(m *_Encoding, v []interface{}) {
  61432. m.emit(0x62)
  61433. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61434. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  61435. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  61436. m.emit(0xfe)
  61437. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61438. })
  61439. }
  61440. // VPADDD m128/m32bcst, xmm, xmm{k}{z}
  61441. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  61442. self.require(ISA_AVX512VL | ISA_AVX512F)
  61443. p.domain = DomainAVX
  61444. p.add(0, func(m *_Encoding, v []interface{}) {
  61445. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  61446. m.emit(0xfe)
  61447. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  61448. })
  61449. }
  61450. // VPADDD xmm, xmm, xmm{k}{z}
  61451. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  61452. self.require(ISA_AVX512VL | ISA_AVX512F)
  61453. p.domain = DomainAVX
  61454. p.add(0, func(m *_Encoding, v []interface{}) {
  61455. m.emit(0x62)
  61456. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61457. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  61458. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  61459. m.emit(0xfe)
  61460. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61461. })
  61462. }
  61463. // VPADDD m256/m32bcst, ymm, ymm{k}{z}
  61464. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  61465. self.require(ISA_AVX512VL | ISA_AVX512F)
  61466. p.domain = DomainAVX
  61467. p.add(0, func(m *_Encoding, v []interface{}) {
  61468. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  61469. m.emit(0xfe)
  61470. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  61471. })
  61472. }
  61473. // VPADDD ymm, ymm, ymm{k}{z}
  61474. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  61475. self.require(ISA_AVX512VL | ISA_AVX512F)
  61476. p.domain = DomainAVX
  61477. p.add(0, func(m *_Encoding, v []interface{}) {
  61478. m.emit(0x62)
  61479. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61480. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  61481. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  61482. m.emit(0xfe)
  61483. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61484. })
  61485. }
  61486. if p.len == 0 {
  61487. panic("invalid operands for VPADDD")
  61488. }
  61489. return p
  61490. }
  61491. // VPADDQ performs "Add Packed Quadword Integers".
  61492. //
  61493. // Mnemonic : VPADDQ
  61494. // Supported forms : (10 forms)
  61495. //
  61496. // * VPADDQ xmm, xmm, xmm [AVX]
  61497. // * VPADDQ m128, xmm, xmm [AVX]
  61498. // * VPADDQ ymm, ymm, ymm [AVX2]
  61499. // * VPADDQ m256, ymm, ymm [AVX2]
  61500. // * VPADDQ m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  61501. // * VPADDQ zmm, zmm, zmm{k}{z} [AVX512F]
  61502. // * VPADDQ m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  61503. // * VPADDQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  61504. // * VPADDQ m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  61505. // * VPADDQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  61506. //
  61507. func (self *Program) VPADDQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  61508. p := self.alloc("VPADDQ", 3, Operands { v0, v1, v2 })
  61509. // VPADDQ xmm, xmm, xmm
  61510. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  61511. self.require(ISA_AVX)
  61512. p.domain = DomainAVX
  61513. p.add(0, func(m *_Encoding, v []interface{}) {
  61514. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  61515. m.emit(0xd4)
  61516. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61517. })
  61518. }
  61519. // VPADDQ m128, xmm, xmm
  61520. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  61521. self.require(ISA_AVX)
  61522. p.domain = DomainAVX
  61523. p.add(0, func(m *_Encoding, v []interface{}) {
  61524. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  61525. m.emit(0xd4)
  61526. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  61527. })
  61528. }
  61529. // VPADDQ ymm, ymm, ymm
  61530. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  61531. self.require(ISA_AVX2)
  61532. p.domain = DomainAVX
  61533. p.add(0, func(m *_Encoding, v []interface{}) {
  61534. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  61535. m.emit(0xd4)
  61536. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61537. })
  61538. }
  61539. // VPADDQ m256, ymm, ymm
  61540. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  61541. self.require(ISA_AVX2)
  61542. p.domain = DomainAVX
  61543. p.add(0, func(m *_Encoding, v []interface{}) {
  61544. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  61545. m.emit(0xd4)
  61546. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  61547. })
  61548. }
  61549. // VPADDQ m512/m64bcst, zmm, zmm{k}{z}
  61550. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  61551. self.require(ISA_AVX512F)
  61552. p.domain = DomainAVX
  61553. p.add(0, func(m *_Encoding, v []interface{}) {
  61554. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  61555. m.emit(0xd4)
  61556. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  61557. })
  61558. }
  61559. // VPADDQ zmm, zmm, zmm{k}{z}
  61560. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  61561. self.require(ISA_AVX512F)
  61562. p.domain = DomainAVX
  61563. p.add(0, func(m *_Encoding, v []interface{}) {
  61564. m.emit(0x62)
  61565. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61566. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  61567. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  61568. m.emit(0xd4)
  61569. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61570. })
  61571. }
  61572. // VPADDQ m128/m64bcst, xmm, xmm{k}{z}
  61573. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  61574. self.require(ISA_AVX512VL | ISA_AVX512F)
  61575. p.domain = DomainAVX
  61576. p.add(0, func(m *_Encoding, v []interface{}) {
  61577. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  61578. m.emit(0xd4)
  61579. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  61580. })
  61581. }
  61582. // VPADDQ xmm, xmm, xmm{k}{z}
  61583. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  61584. self.require(ISA_AVX512VL | ISA_AVX512F)
  61585. p.domain = DomainAVX
  61586. p.add(0, func(m *_Encoding, v []interface{}) {
  61587. m.emit(0x62)
  61588. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61589. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  61590. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  61591. m.emit(0xd4)
  61592. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61593. })
  61594. }
  61595. // VPADDQ m256/m64bcst, ymm, ymm{k}{z}
  61596. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  61597. self.require(ISA_AVX512VL | ISA_AVX512F)
  61598. p.domain = DomainAVX
  61599. p.add(0, func(m *_Encoding, v []interface{}) {
  61600. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  61601. m.emit(0xd4)
  61602. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  61603. })
  61604. }
  61605. // VPADDQ ymm, ymm, ymm{k}{z}
  61606. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  61607. self.require(ISA_AVX512VL | ISA_AVX512F)
  61608. p.domain = DomainAVX
  61609. p.add(0, func(m *_Encoding, v []interface{}) {
  61610. m.emit(0x62)
  61611. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61612. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  61613. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  61614. m.emit(0xd4)
  61615. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61616. })
  61617. }
  61618. if p.len == 0 {
  61619. panic("invalid operands for VPADDQ")
  61620. }
  61621. return p
  61622. }
  61623. // VPADDSB performs "Add Packed Signed Byte Integers with Signed Saturation".
  61624. //
  61625. // Mnemonic : VPADDSB
  61626. // Supported forms : (10 forms)
  61627. //
  61628. // * VPADDSB xmm, xmm, xmm [AVX]
  61629. // * VPADDSB m128, xmm, xmm [AVX]
  61630. // * VPADDSB ymm, ymm, ymm [AVX2]
  61631. // * VPADDSB m256, ymm, ymm [AVX2]
  61632. // * VPADDSB zmm, zmm, zmm{k}{z} [AVX512BW]
  61633. // * VPADDSB m512, zmm, zmm{k}{z} [AVX512BW]
  61634. // * VPADDSB xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  61635. // * VPADDSB m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  61636. // * VPADDSB ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  61637. // * VPADDSB m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  61638. //
  61639. func (self *Program) VPADDSB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  61640. p := self.alloc("VPADDSB", 3, Operands { v0, v1, v2 })
  61641. // VPADDSB xmm, xmm, xmm
  61642. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  61643. self.require(ISA_AVX)
  61644. p.domain = DomainAVX
  61645. p.add(0, func(m *_Encoding, v []interface{}) {
  61646. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  61647. m.emit(0xec)
  61648. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61649. })
  61650. }
  61651. // VPADDSB m128, xmm, xmm
  61652. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  61653. self.require(ISA_AVX)
  61654. p.domain = DomainAVX
  61655. p.add(0, func(m *_Encoding, v []interface{}) {
  61656. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  61657. m.emit(0xec)
  61658. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  61659. })
  61660. }
  61661. // VPADDSB ymm, ymm, ymm
  61662. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  61663. self.require(ISA_AVX2)
  61664. p.domain = DomainAVX
  61665. p.add(0, func(m *_Encoding, v []interface{}) {
  61666. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  61667. m.emit(0xec)
  61668. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61669. })
  61670. }
  61671. // VPADDSB m256, ymm, ymm
  61672. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  61673. self.require(ISA_AVX2)
  61674. p.domain = DomainAVX
  61675. p.add(0, func(m *_Encoding, v []interface{}) {
  61676. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  61677. m.emit(0xec)
  61678. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  61679. })
  61680. }
  61681. // VPADDSB zmm, zmm, zmm{k}{z}
  61682. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  61683. self.require(ISA_AVX512BW)
  61684. p.domain = DomainAVX
  61685. p.add(0, func(m *_Encoding, v []interface{}) {
  61686. m.emit(0x62)
  61687. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61688. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  61689. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  61690. m.emit(0xec)
  61691. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61692. })
  61693. }
  61694. // VPADDSB m512, zmm, zmm{k}{z}
  61695. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  61696. self.require(ISA_AVX512BW)
  61697. p.domain = DomainAVX
  61698. p.add(0, func(m *_Encoding, v []interface{}) {
  61699. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  61700. m.emit(0xec)
  61701. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  61702. })
  61703. }
  61704. // VPADDSB xmm, xmm, xmm{k}{z}
  61705. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  61706. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61707. p.domain = DomainAVX
  61708. p.add(0, func(m *_Encoding, v []interface{}) {
  61709. m.emit(0x62)
  61710. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61711. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  61712. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  61713. m.emit(0xec)
  61714. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61715. })
  61716. }
  61717. // VPADDSB m128, xmm, xmm{k}{z}
  61718. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  61719. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61720. p.domain = DomainAVX
  61721. p.add(0, func(m *_Encoding, v []interface{}) {
  61722. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  61723. m.emit(0xec)
  61724. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  61725. })
  61726. }
  61727. // VPADDSB ymm, ymm, ymm{k}{z}
  61728. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  61729. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61730. p.domain = DomainAVX
  61731. p.add(0, func(m *_Encoding, v []interface{}) {
  61732. m.emit(0x62)
  61733. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61734. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  61735. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  61736. m.emit(0xec)
  61737. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61738. })
  61739. }
  61740. // VPADDSB m256, ymm, ymm{k}{z}
  61741. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  61742. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61743. p.domain = DomainAVX
  61744. p.add(0, func(m *_Encoding, v []interface{}) {
  61745. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  61746. m.emit(0xec)
  61747. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  61748. })
  61749. }
  61750. if p.len == 0 {
  61751. panic("invalid operands for VPADDSB")
  61752. }
  61753. return p
  61754. }
  61755. // VPADDSW performs "Add Packed Signed Word Integers with Signed Saturation".
  61756. //
  61757. // Mnemonic : VPADDSW
  61758. // Supported forms : (10 forms)
  61759. //
  61760. // * VPADDSW xmm, xmm, xmm [AVX]
  61761. // * VPADDSW m128, xmm, xmm [AVX]
  61762. // * VPADDSW ymm, ymm, ymm [AVX2]
  61763. // * VPADDSW m256, ymm, ymm [AVX2]
  61764. // * VPADDSW zmm, zmm, zmm{k}{z} [AVX512BW]
  61765. // * VPADDSW m512, zmm, zmm{k}{z} [AVX512BW]
  61766. // * VPADDSW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  61767. // * VPADDSW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  61768. // * VPADDSW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  61769. // * VPADDSW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  61770. //
  61771. func (self *Program) VPADDSW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  61772. p := self.alloc("VPADDSW", 3, Operands { v0, v1, v2 })
  61773. // VPADDSW xmm, xmm, xmm
  61774. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  61775. self.require(ISA_AVX)
  61776. p.domain = DomainAVX
  61777. p.add(0, func(m *_Encoding, v []interface{}) {
  61778. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  61779. m.emit(0xed)
  61780. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61781. })
  61782. }
  61783. // VPADDSW m128, xmm, xmm
  61784. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  61785. self.require(ISA_AVX)
  61786. p.domain = DomainAVX
  61787. p.add(0, func(m *_Encoding, v []interface{}) {
  61788. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  61789. m.emit(0xed)
  61790. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  61791. })
  61792. }
  61793. // VPADDSW ymm, ymm, ymm
  61794. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  61795. self.require(ISA_AVX2)
  61796. p.domain = DomainAVX
  61797. p.add(0, func(m *_Encoding, v []interface{}) {
  61798. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  61799. m.emit(0xed)
  61800. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61801. })
  61802. }
  61803. // VPADDSW m256, ymm, ymm
  61804. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  61805. self.require(ISA_AVX2)
  61806. p.domain = DomainAVX
  61807. p.add(0, func(m *_Encoding, v []interface{}) {
  61808. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  61809. m.emit(0xed)
  61810. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  61811. })
  61812. }
  61813. // VPADDSW zmm, zmm, zmm{k}{z}
  61814. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  61815. self.require(ISA_AVX512BW)
  61816. p.domain = DomainAVX
  61817. p.add(0, func(m *_Encoding, v []interface{}) {
  61818. m.emit(0x62)
  61819. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61820. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  61821. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  61822. m.emit(0xed)
  61823. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61824. })
  61825. }
  61826. // VPADDSW m512, zmm, zmm{k}{z}
  61827. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  61828. self.require(ISA_AVX512BW)
  61829. p.domain = DomainAVX
  61830. p.add(0, func(m *_Encoding, v []interface{}) {
  61831. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  61832. m.emit(0xed)
  61833. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  61834. })
  61835. }
  61836. // VPADDSW xmm, xmm, xmm{k}{z}
  61837. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  61838. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61839. p.domain = DomainAVX
  61840. p.add(0, func(m *_Encoding, v []interface{}) {
  61841. m.emit(0x62)
  61842. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61843. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  61844. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  61845. m.emit(0xed)
  61846. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61847. })
  61848. }
  61849. // VPADDSW m128, xmm, xmm{k}{z}
  61850. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  61851. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61852. p.domain = DomainAVX
  61853. p.add(0, func(m *_Encoding, v []interface{}) {
  61854. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  61855. m.emit(0xed)
  61856. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  61857. })
  61858. }
  61859. // VPADDSW ymm, ymm, ymm{k}{z}
  61860. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  61861. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61862. p.domain = DomainAVX
  61863. p.add(0, func(m *_Encoding, v []interface{}) {
  61864. m.emit(0x62)
  61865. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61866. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  61867. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  61868. m.emit(0xed)
  61869. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61870. })
  61871. }
  61872. // VPADDSW m256, ymm, ymm{k}{z}
  61873. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  61874. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61875. p.domain = DomainAVX
  61876. p.add(0, func(m *_Encoding, v []interface{}) {
  61877. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  61878. m.emit(0xed)
  61879. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  61880. })
  61881. }
  61882. if p.len == 0 {
  61883. panic("invalid operands for VPADDSW")
  61884. }
  61885. return p
  61886. }
  61887. // VPADDUSB performs "Add Packed Unsigned Byte Integers with Unsigned Saturation".
  61888. //
  61889. // Mnemonic : VPADDUSB
  61890. // Supported forms : (10 forms)
  61891. //
  61892. // * VPADDUSB xmm, xmm, xmm [AVX]
  61893. // * VPADDUSB m128, xmm, xmm [AVX]
  61894. // * VPADDUSB ymm, ymm, ymm [AVX2]
  61895. // * VPADDUSB m256, ymm, ymm [AVX2]
  61896. // * VPADDUSB zmm, zmm, zmm{k}{z} [AVX512BW]
  61897. // * VPADDUSB m512, zmm, zmm{k}{z} [AVX512BW]
  61898. // * VPADDUSB xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  61899. // * VPADDUSB m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  61900. // * VPADDUSB ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  61901. // * VPADDUSB m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  61902. //
  61903. func (self *Program) VPADDUSB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  61904. p := self.alloc("VPADDUSB", 3, Operands { v0, v1, v2 })
  61905. // VPADDUSB xmm, xmm, xmm
  61906. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  61907. self.require(ISA_AVX)
  61908. p.domain = DomainAVX
  61909. p.add(0, func(m *_Encoding, v []interface{}) {
  61910. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  61911. m.emit(0xdc)
  61912. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61913. })
  61914. }
  61915. // VPADDUSB m128, xmm, xmm
  61916. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  61917. self.require(ISA_AVX)
  61918. p.domain = DomainAVX
  61919. p.add(0, func(m *_Encoding, v []interface{}) {
  61920. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  61921. m.emit(0xdc)
  61922. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  61923. })
  61924. }
  61925. // VPADDUSB ymm, ymm, ymm
  61926. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  61927. self.require(ISA_AVX2)
  61928. p.domain = DomainAVX
  61929. p.add(0, func(m *_Encoding, v []interface{}) {
  61930. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  61931. m.emit(0xdc)
  61932. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61933. })
  61934. }
  61935. // VPADDUSB m256, ymm, ymm
  61936. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  61937. self.require(ISA_AVX2)
  61938. p.domain = DomainAVX
  61939. p.add(0, func(m *_Encoding, v []interface{}) {
  61940. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  61941. m.emit(0xdc)
  61942. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  61943. })
  61944. }
  61945. // VPADDUSB zmm, zmm, zmm{k}{z}
  61946. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  61947. self.require(ISA_AVX512BW)
  61948. p.domain = DomainAVX
  61949. p.add(0, func(m *_Encoding, v []interface{}) {
  61950. m.emit(0x62)
  61951. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61952. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  61953. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  61954. m.emit(0xdc)
  61955. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61956. })
  61957. }
  61958. // VPADDUSB m512, zmm, zmm{k}{z}
  61959. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  61960. self.require(ISA_AVX512BW)
  61961. p.domain = DomainAVX
  61962. p.add(0, func(m *_Encoding, v []interface{}) {
  61963. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  61964. m.emit(0xdc)
  61965. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  61966. })
  61967. }
  61968. // VPADDUSB xmm, xmm, xmm{k}{z}
  61969. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  61970. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61971. p.domain = DomainAVX
  61972. p.add(0, func(m *_Encoding, v []interface{}) {
  61973. m.emit(0x62)
  61974. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61975. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  61976. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  61977. m.emit(0xdc)
  61978. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  61979. })
  61980. }
  61981. // VPADDUSB m128, xmm, xmm{k}{z}
  61982. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  61983. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61984. p.domain = DomainAVX
  61985. p.add(0, func(m *_Encoding, v []interface{}) {
  61986. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  61987. m.emit(0xdc)
  61988. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  61989. })
  61990. }
  61991. // VPADDUSB ymm, ymm, ymm{k}{z}
  61992. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  61993. self.require(ISA_AVX512VL | ISA_AVX512BW)
  61994. p.domain = DomainAVX
  61995. p.add(0, func(m *_Encoding, v []interface{}) {
  61996. m.emit(0x62)
  61997. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  61998. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  61999. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  62000. m.emit(0xdc)
  62001. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62002. })
  62003. }
  62004. // VPADDUSB m256, ymm, ymm{k}{z}
  62005. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  62006. self.require(ISA_AVX512VL | ISA_AVX512BW)
  62007. p.domain = DomainAVX
  62008. p.add(0, func(m *_Encoding, v []interface{}) {
  62009. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  62010. m.emit(0xdc)
  62011. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  62012. })
  62013. }
  62014. if p.len == 0 {
  62015. panic("invalid operands for VPADDUSB")
  62016. }
  62017. return p
  62018. }
  62019. // VPADDUSW performs "Add Packed Unsigned Word Integers with Unsigned Saturation".
  62020. //
  62021. // Mnemonic : VPADDUSW
  62022. // Supported forms : (10 forms)
  62023. //
  62024. // * VPADDUSW xmm, xmm, xmm [AVX]
  62025. // * VPADDUSW m128, xmm, xmm [AVX]
  62026. // * VPADDUSW ymm, ymm, ymm [AVX2]
  62027. // * VPADDUSW m256, ymm, ymm [AVX2]
  62028. // * VPADDUSW zmm, zmm, zmm{k}{z} [AVX512BW]
  62029. // * VPADDUSW m512, zmm, zmm{k}{z} [AVX512BW]
  62030. // * VPADDUSW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  62031. // * VPADDUSW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  62032. // * VPADDUSW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  62033. // * VPADDUSW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  62034. //
  62035. func (self *Program) VPADDUSW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  62036. p := self.alloc("VPADDUSW", 3, Operands { v0, v1, v2 })
  62037. // VPADDUSW xmm, xmm, xmm
  62038. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  62039. self.require(ISA_AVX)
  62040. p.domain = DomainAVX
  62041. p.add(0, func(m *_Encoding, v []interface{}) {
  62042. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  62043. m.emit(0xdd)
  62044. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62045. })
  62046. }
  62047. // VPADDUSW m128, xmm, xmm
  62048. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  62049. self.require(ISA_AVX)
  62050. p.domain = DomainAVX
  62051. p.add(0, func(m *_Encoding, v []interface{}) {
  62052. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  62053. m.emit(0xdd)
  62054. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  62055. })
  62056. }
  62057. // VPADDUSW ymm, ymm, ymm
  62058. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  62059. self.require(ISA_AVX2)
  62060. p.domain = DomainAVX
  62061. p.add(0, func(m *_Encoding, v []interface{}) {
  62062. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  62063. m.emit(0xdd)
  62064. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62065. })
  62066. }
  62067. // VPADDUSW m256, ymm, ymm
  62068. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  62069. self.require(ISA_AVX2)
  62070. p.domain = DomainAVX
  62071. p.add(0, func(m *_Encoding, v []interface{}) {
  62072. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  62073. m.emit(0xdd)
  62074. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  62075. })
  62076. }
  62077. // VPADDUSW zmm, zmm, zmm{k}{z}
  62078. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  62079. self.require(ISA_AVX512BW)
  62080. p.domain = DomainAVX
  62081. p.add(0, func(m *_Encoding, v []interface{}) {
  62082. m.emit(0x62)
  62083. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  62084. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  62085. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  62086. m.emit(0xdd)
  62087. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62088. })
  62089. }
  62090. // VPADDUSW m512, zmm, zmm{k}{z}
  62091. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  62092. self.require(ISA_AVX512BW)
  62093. p.domain = DomainAVX
  62094. p.add(0, func(m *_Encoding, v []interface{}) {
  62095. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  62096. m.emit(0xdd)
  62097. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  62098. })
  62099. }
  62100. // VPADDUSW xmm, xmm, xmm{k}{z}
  62101. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  62102. self.require(ISA_AVX512VL | ISA_AVX512BW)
  62103. p.domain = DomainAVX
  62104. p.add(0, func(m *_Encoding, v []interface{}) {
  62105. m.emit(0x62)
  62106. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  62107. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  62108. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  62109. m.emit(0xdd)
  62110. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62111. })
  62112. }
  62113. // VPADDUSW m128, xmm, xmm{k}{z}
  62114. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  62115. self.require(ISA_AVX512VL | ISA_AVX512BW)
  62116. p.domain = DomainAVX
  62117. p.add(0, func(m *_Encoding, v []interface{}) {
  62118. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  62119. m.emit(0xdd)
  62120. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  62121. })
  62122. }
  62123. // VPADDUSW ymm, ymm, ymm{k}{z}
  62124. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  62125. self.require(ISA_AVX512VL | ISA_AVX512BW)
  62126. p.domain = DomainAVX
  62127. p.add(0, func(m *_Encoding, v []interface{}) {
  62128. m.emit(0x62)
  62129. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  62130. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  62131. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  62132. m.emit(0xdd)
  62133. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62134. })
  62135. }
  62136. // VPADDUSW m256, ymm, ymm{k}{z}
  62137. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  62138. self.require(ISA_AVX512VL | ISA_AVX512BW)
  62139. p.domain = DomainAVX
  62140. p.add(0, func(m *_Encoding, v []interface{}) {
  62141. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  62142. m.emit(0xdd)
  62143. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  62144. })
  62145. }
  62146. if p.len == 0 {
  62147. panic("invalid operands for VPADDUSW")
  62148. }
  62149. return p
  62150. }
  62151. // VPADDW performs "Add Packed Word Integers".
  62152. //
  62153. // Mnemonic : VPADDW
  62154. // Supported forms : (10 forms)
  62155. //
  62156. // * VPADDW xmm, xmm, xmm [AVX]
  62157. // * VPADDW m128, xmm, xmm [AVX]
  62158. // * VPADDW ymm, ymm, ymm [AVX2]
  62159. // * VPADDW m256, ymm, ymm [AVX2]
  62160. // * VPADDW zmm, zmm, zmm{k}{z} [AVX512BW]
  62161. // * VPADDW m512, zmm, zmm{k}{z} [AVX512BW]
  62162. // * VPADDW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  62163. // * VPADDW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  62164. // * VPADDW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  62165. // * VPADDW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  62166. //
  62167. func (self *Program) VPADDW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  62168. p := self.alloc("VPADDW", 3, Operands { v0, v1, v2 })
  62169. // VPADDW xmm, xmm, xmm
  62170. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  62171. self.require(ISA_AVX)
  62172. p.domain = DomainAVX
  62173. p.add(0, func(m *_Encoding, v []interface{}) {
  62174. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  62175. m.emit(0xfd)
  62176. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62177. })
  62178. }
  62179. // VPADDW m128, xmm, xmm
  62180. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  62181. self.require(ISA_AVX)
  62182. p.domain = DomainAVX
  62183. p.add(0, func(m *_Encoding, v []interface{}) {
  62184. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  62185. m.emit(0xfd)
  62186. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  62187. })
  62188. }
  62189. // VPADDW ymm, ymm, ymm
  62190. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  62191. self.require(ISA_AVX2)
  62192. p.domain = DomainAVX
  62193. p.add(0, func(m *_Encoding, v []interface{}) {
  62194. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  62195. m.emit(0xfd)
  62196. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62197. })
  62198. }
  62199. // VPADDW m256, ymm, ymm
  62200. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  62201. self.require(ISA_AVX2)
  62202. p.domain = DomainAVX
  62203. p.add(0, func(m *_Encoding, v []interface{}) {
  62204. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  62205. m.emit(0xfd)
  62206. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  62207. })
  62208. }
  62209. // VPADDW zmm, zmm, zmm{k}{z}
  62210. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  62211. self.require(ISA_AVX512BW)
  62212. p.domain = DomainAVX
  62213. p.add(0, func(m *_Encoding, v []interface{}) {
  62214. m.emit(0x62)
  62215. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  62216. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  62217. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  62218. m.emit(0xfd)
  62219. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62220. })
  62221. }
  62222. // VPADDW m512, zmm, zmm{k}{z}
  62223. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  62224. self.require(ISA_AVX512BW)
  62225. p.domain = DomainAVX
  62226. p.add(0, func(m *_Encoding, v []interface{}) {
  62227. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  62228. m.emit(0xfd)
  62229. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  62230. })
  62231. }
  62232. // VPADDW xmm, xmm, xmm{k}{z}
  62233. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  62234. self.require(ISA_AVX512VL | ISA_AVX512BW)
  62235. p.domain = DomainAVX
  62236. p.add(0, func(m *_Encoding, v []interface{}) {
  62237. m.emit(0x62)
  62238. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  62239. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  62240. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  62241. m.emit(0xfd)
  62242. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62243. })
  62244. }
  62245. // VPADDW m128, xmm, xmm{k}{z}
  62246. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  62247. self.require(ISA_AVX512VL | ISA_AVX512BW)
  62248. p.domain = DomainAVX
  62249. p.add(0, func(m *_Encoding, v []interface{}) {
  62250. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  62251. m.emit(0xfd)
  62252. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  62253. })
  62254. }
  62255. // VPADDW ymm, ymm, ymm{k}{z}
  62256. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  62257. self.require(ISA_AVX512VL | ISA_AVX512BW)
  62258. p.domain = DomainAVX
  62259. p.add(0, func(m *_Encoding, v []interface{}) {
  62260. m.emit(0x62)
  62261. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  62262. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  62263. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  62264. m.emit(0xfd)
  62265. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62266. })
  62267. }
  62268. // VPADDW m256, ymm, ymm{k}{z}
  62269. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  62270. self.require(ISA_AVX512VL | ISA_AVX512BW)
  62271. p.domain = DomainAVX
  62272. p.add(0, func(m *_Encoding, v []interface{}) {
  62273. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  62274. m.emit(0xfd)
  62275. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  62276. })
  62277. }
  62278. if p.len == 0 {
  62279. panic("invalid operands for VPADDW")
  62280. }
  62281. return p
  62282. }
  62283. // VPALIGNR performs "Packed Align Right".
  62284. //
  62285. // Mnemonic : VPALIGNR
  62286. // Supported forms : (10 forms)
  62287. //
  62288. // * VPALIGNR imm8, xmm, xmm, xmm [AVX]
  62289. // * VPALIGNR imm8, m128, xmm, xmm [AVX]
  62290. // * VPALIGNR imm8, ymm, ymm, ymm [AVX2]
  62291. // * VPALIGNR imm8, m256, ymm, ymm [AVX2]
  62292. // * VPALIGNR imm8, zmm, zmm, zmm{k}{z} [AVX512BW]
  62293. // * VPALIGNR imm8, m512, zmm, zmm{k}{z} [AVX512BW]
  62294. // * VPALIGNR imm8, xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  62295. // * VPALIGNR imm8, m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  62296. // * VPALIGNR imm8, ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  62297. // * VPALIGNR imm8, m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  62298. //
  62299. func (self *Program) VPALIGNR(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  62300. p := self.alloc("VPALIGNR", 4, Operands { v0, v1, v2, v3 })
  62301. // VPALIGNR imm8, xmm, xmm, xmm
  62302. if isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  62303. self.require(ISA_AVX)
  62304. p.domain = DomainAVX
  62305. p.add(0, func(m *_Encoding, v []interface{}) {
  62306. m.emit(0xc4)
  62307. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  62308. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  62309. m.emit(0x0f)
  62310. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  62311. m.imm1(toImmAny(v[0]))
  62312. })
  62313. }
  62314. // VPALIGNR imm8, m128, xmm, xmm
  62315. if isImm8(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  62316. self.require(ISA_AVX)
  62317. p.domain = DomainAVX
  62318. p.add(0, func(m *_Encoding, v []interface{}) {
  62319. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  62320. m.emit(0x0f)
  62321. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  62322. m.imm1(toImmAny(v[0]))
  62323. })
  62324. }
  62325. // VPALIGNR imm8, ymm, ymm, ymm
  62326. if isImm8(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  62327. self.require(ISA_AVX2)
  62328. p.domain = DomainAVX
  62329. p.add(0, func(m *_Encoding, v []interface{}) {
  62330. m.emit(0xc4)
  62331. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  62332. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  62333. m.emit(0x0f)
  62334. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  62335. m.imm1(toImmAny(v[0]))
  62336. })
  62337. }
  62338. // VPALIGNR imm8, m256, ymm, ymm
  62339. if isImm8(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  62340. self.require(ISA_AVX2)
  62341. p.domain = DomainAVX
  62342. p.add(0, func(m *_Encoding, v []interface{}) {
  62343. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  62344. m.emit(0x0f)
  62345. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  62346. m.imm1(toImmAny(v[0]))
  62347. })
  62348. }
  62349. // VPALIGNR imm8, zmm, zmm, zmm{k}{z}
  62350. if isImm8(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(v3) {
  62351. self.require(ISA_AVX512BW)
  62352. p.domain = DomainAVX
  62353. p.add(0, func(m *_Encoding, v []interface{}) {
  62354. m.emit(0x62)
  62355. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  62356. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  62357. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  62358. m.emit(0x0f)
  62359. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  62360. m.imm1(toImmAny(v[0]))
  62361. })
  62362. }
  62363. // VPALIGNR imm8, m512, zmm, zmm{k}{z}
  62364. if isImm8(v0) && isM512(v1) && isZMM(v2) && isZMMkz(v3) {
  62365. self.require(ISA_AVX512BW)
  62366. p.domain = DomainAVX
  62367. p.add(0, func(m *_Encoding, v []interface{}) {
  62368. m.evex(0b11, 0x05, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  62369. m.emit(0x0f)
  62370. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  62371. m.imm1(toImmAny(v[0]))
  62372. })
  62373. }
  62374. // VPALIGNR imm8, xmm, xmm, xmm{k}{z}
  62375. if isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  62376. self.require(ISA_AVX512VL | ISA_AVX512BW)
  62377. p.domain = DomainAVX
  62378. p.add(0, func(m *_Encoding, v []interface{}) {
  62379. m.emit(0x62)
  62380. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  62381. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  62382. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  62383. m.emit(0x0f)
  62384. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  62385. m.imm1(toImmAny(v[0]))
  62386. })
  62387. }
  62388. // VPALIGNR imm8, m128, xmm, xmm{k}{z}
  62389. if isImm8(v0) && isM128(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  62390. self.require(ISA_AVX512VL | ISA_AVX512BW)
  62391. p.domain = DomainAVX
  62392. p.add(0, func(m *_Encoding, v []interface{}) {
  62393. m.evex(0b11, 0x05, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  62394. m.emit(0x0f)
  62395. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  62396. m.imm1(toImmAny(v[0]))
  62397. })
  62398. }
  62399. // VPALIGNR imm8, ymm, ymm, ymm{k}{z}
  62400. if isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  62401. self.require(ISA_AVX512VL | ISA_AVX512BW)
  62402. p.domain = DomainAVX
  62403. p.add(0, func(m *_Encoding, v []interface{}) {
  62404. m.emit(0x62)
  62405. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  62406. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  62407. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  62408. m.emit(0x0f)
  62409. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  62410. m.imm1(toImmAny(v[0]))
  62411. })
  62412. }
  62413. // VPALIGNR imm8, m256, ymm, ymm{k}{z}
  62414. if isImm8(v0) && isM256(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  62415. self.require(ISA_AVX512VL | ISA_AVX512BW)
  62416. p.domain = DomainAVX
  62417. p.add(0, func(m *_Encoding, v []interface{}) {
  62418. m.evex(0b11, 0x05, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  62419. m.emit(0x0f)
  62420. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  62421. m.imm1(toImmAny(v[0]))
  62422. })
  62423. }
  62424. if p.len == 0 {
  62425. panic("invalid operands for VPALIGNR")
  62426. }
  62427. return p
  62428. }
  62429. // VPAND performs "Packed Bitwise Logical AND".
  62430. //
  62431. // Mnemonic : VPAND
  62432. // Supported forms : (4 forms)
  62433. //
  62434. // * VPAND xmm, xmm, xmm [AVX]
  62435. // * VPAND m128, xmm, xmm [AVX]
  62436. // * VPAND ymm, ymm, ymm [AVX2]
  62437. // * VPAND m256, ymm, ymm [AVX2]
  62438. //
  62439. func (self *Program) VPAND(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  62440. p := self.alloc("VPAND", 3, Operands { v0, v1, v2 })
  62441. // VPAND xmm, xmm, xmm
  62442. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  62443. self.require(ISA_AVX)
  62444. p.domain = DomainAVX
  62445. p.add(0, func(m *_Encoding, v []interface{}) {
  62446. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  62447. m.emit(0xdb)
  62448. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62449. })
  62450. }
  62451. // VPAND m128, xmm, xmm
  62452. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  62453. self.require(ISA_AVX)
  62454. p.domain = DomainAVX
  62455. p.add(0, func(m *_Encoding, v []interface{}) {
  62456. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  62457. m.emit(0xdb)
  62458. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  62459. })
  62460. }
  62461. // VPAND ymm, ymm, ymm
  62462. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  62463. self.require(ISA_AVX2)
  62464. p.domain = DomainAVX
  62465. p.add(0, func(m *_Encoding, v []interface{}) {
  62466. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  62467. m.emit(0xdb)
  62468. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62469. })
  62470. }
  62471. // VPAND m256, ymm, ymm
  62472. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  62473. self.require(ISA_AVX2)
  62474. p.domain = DomainAVX
  62475. p.add(0, func(m *_Encoding, v []interface{}) {
  62476. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  62477. m.emit(0xdb)
  62478. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  62479. })
  62480. }
  62481. if p.len == 0 {
  62482. panic("invalid operands for VPAND")
  62483. }
  62484. return p
  62485. }
  62486. // VPANDD performs "Bitwise Logical AND of Packed Doubleword Integers".
  62487. //
  62488. // Mnemonic : VPANDD
  62489. // Supported forms : (6 forms)
  62490. //
  62491. // * VPANDD m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  62492. // * VPANDD zmm, zmm, zmm{k}{z} [AVX512F]
  62493. // * VPANDD m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  62494. // * VPANDD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  62495. // * VPANDD m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  62496. // * VPANDD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  62497. //
  62498. func (self *Program) VPANDD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  62499. p := self.alloc("VPANDD", 3, Operands { v0, v1, v2 })
  62500. // VPANDD m512/m32bcst, zmm, zmm{k}{z}
  62501. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  62502. self.require(ISA_AVX512F)
  62503. p.domain = DomainAVX
  62504. p.add(0, func(m *_Encoding, v []interface{}) {
  62505. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  62506. m.emit(0xdb)
  62507. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  62508. })
  62509. }
  62510. // VPANDD zmm, zmm, zmm{k}{z}
  62511. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  62512. self.require(ISA_AVX512F)
  62513. p.domain = DomainAVX
  62514. p.add(0, func(m *_Encoding, v []interface{}) {
  62515. m.emit(0x62)
  62516. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  62517. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  62518. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  62519. m.emit(0xdb)
  62520. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62521. })
  62522. }
  62523. // VPANDD m128/m32bcst, xmm, xmm{k}{z}
  62524. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  62525. self.require(ISA_AVX512VL | ISA_AVX512F)
  62526. p.domain = DomainAVX
  62527. p.add(0, func(m *_Encoding, v []interface{}) {
  62528. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  62529. m.emit(0xdb)
  62530. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  62531. })
  62532. }
  62533. // VPANDD xmm, xmm, xmm{k}{z}
  62534. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  62535. self.require(ISA_AVX512VL | ISA_AVX512F)
  62536. p.domain = DomainAVX
  62537. p.add(0, func(m *_Encoding, v []interface{}) {
  62538. m.emit(0x62)
  62539. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  62540. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  62541. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  62542. m.emit(0xdb)
  62543. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62544. })
  62545. }
  62546. // VPANDD m256/m32bcst, ymm, ymm{k}{z}
  62547. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  62548. self.require(ISA_AVX512VL | ISA_AVX512F)
  62549. p.domain = DomainAVX
  62550. p.add(0, func(m *_Encoding, v []interface{}) {
  62551. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  62552. m.emit(0xdb)
  62553. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  62554. })
  62555. }
  62556. // VPANDD ymm, ymm, ymm{k}{z}
  62557. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  62558. self.require(ISA_AVX512VL | ISA_AVX512F)
  62559. p.domain = DomainAVX
  62560. p.add(0, func(m *_Encoding, v []interface{}) {
  62561. m.emit(0x62)
  62562. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  62563. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  62564. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  62565. m.emit(0xdb)
  62566. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62567. })
  62568. }
  62569. if p.len == 0 {
  62570. panic("invalid operands for VPANDD")
  62571. }
  62572. return p
  62573. }
  62574. // VPANDN performs "Packed Bitwise Logical AND NOT".
  62575. //
  62576. // Mnemonic : VPANDN
  62577. // Supported forms : (4 forms)
  62578. //
  62579. // * VPANDN xmm, xmm, xmm [AVX]
  62580. // * VPANDN m128, xmm, xmm [AVX]
  62581. // * VPANDN ymm, ymm, ymm [AVX2]
  62582. // * VPANDN m256, ymm, ymm [AVX2]
  62583. //
  62584. func (self *Program) VPANDN(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  62585. p := self.alloc("VPANDN", 3, Operands { v0, v1, v2 })
  62586. // VPANDN xmm, xmm, xmm
  62587. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  62588. self.require(ISA_AVX)
  62589. p.domain = DomainAVX
  62590. p.add(0, func(m *_Encoding, v []interface{}) {
  62591. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  62592. m.emit(0xdf)
  62593. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62594. })
  62595. }
  62596. // VPANDN m128, xmm, xmm
  62597. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  62598. self.require(ISA_AVX)
  62599. p.domain = DomainAVX
  62600. p.add(0, func(m *_Encoding, v []interface{}) {
  62601. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  62602. m.emit(0xdf)
  62603. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  62604. })
  62605. }
  62606. // VPANDN ymm, ymm, ymm
  62607. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  62608. self.require(ISA_AVX2)
  62609. p.domain = DomainAVX
  62610. p.add(0, func(m *_Encoding, v []interface{}) {
  62611. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  62612. m.emit(0xdf)
  62613. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62614. })
  62615. }
  62616. // VPANDN m256, ymm, ymm
  62617. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  62618. self.require(ISA_AVX2)
  62619. p.domain = DomainAVX
  62620. p.add(0, func(m *_Encoding, v []interface{}) {
  62621. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  62622. m.emit(0xdf)
  62623. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  62624. })
  62625. }
  62626. if p.len == 0 {
  62627. panic("invalid operands for VPANDN")
  62628. }
  62629. return p
  62630. }
  62631. // VPANDND performs "Bitwise Logical AND NOT of Packed Doubleword Integers".
  62632. //
  62633. // Mnemonic : VPANDND
  62634. // Supported forms : (6 forms)
  62635. //
  62636. // * VPANDND m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  62637. // * VPANDND zmm, zmm, zmm{k}{z} [AVX512F]
  62638. // * VPANDND m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  62639. // * VPANDND xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  62640. // * VPANDND m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  62641. // * VPANDND ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  62642. //
  62643. func (self *Program) VPANDND(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  62644. p := self.alloc("VPANDND", 3, Operands { v0, v1, v2 })
  62645. // VPANDND m512/m32bcst, zmm, zmm{k}{z}
  62646. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  62647. self.require(ISA_AVX512F)
  62648. p.domain = DomainAVX
  62649. p.add(0, func(m *_Encoding, v []interface{}) {
  62650. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  62651. m.emit(0xdf)
  62652. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  62653. })
  62654. }
  62655. // VPANDND zmm, zmm, zmm{k}{z}
  62656. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  62657. self.require(ISA_AVX512F)
  62658. p.domain = DomainAVX
  62659. p.add(0, func(m *_Encoding, v []interface{}) {
  62660. m.emit(0x62)
  62661. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  62662. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  62663. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  62664. m.emit(0xdf)
  62665. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62666. })
  62667. }
  62668. // VPANDND m128/m32bcst, xmm, xmm{k}{z}
  62669. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  62670. self.require(ISA_AVX512VL | ISA_AVX512F)
  62671. p.domain = DomainAVX
  62672. p.add(0, func(m *_Encoding, v []interface{}) {
  62673. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  62674. m.emit(0xdf)
  62675. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  62676. })
  62677. }
  62678. // VPANDND xmm, xmm, xmm{k}{z}
  62679. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  62680. self.require(ISA_AVX512VL | ISA_AVX512F)
  62681. p.domain = DomainAVX
  62682. p.add(0, func(m *_Encoding, v []interface{}) {
  62683. m.emit(0x62)
  62684. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  62685. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  62686. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  62687. m.emit(0xdf)
  62688. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62689. })
  62690. }
  62691. // VPANDND m256/m32bcst, ymm, ymm{k}{z}
  62692. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  62693. self.require(ISA_AVX512VL | ISA_AVX512F)
  62694. p.domain = DomainAVX
  62695. p.add(0, func(m *_Encoding, v []interface{}) {
  62696. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  62697. m.emit(0xdf)
  62698. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  62699. })
  62700. }
  62701. // VPANDND ymm, ymm, ymm{k}{z}
  62702. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  62703. self.require(ISA_AVX512VL | ISA_AVX512F)
  62704. p.domain = DomainAVX
  62705. p.add(0, func(m *_Encoding, v []interface{}) {
  62706. m.emit(0x62)
  62707. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  62708. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  62709. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  62710. m.emit(0xdf)
  62711. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62712. })
  62713. }
  62714. if p.len == 0 {
  62715. panic("invalid operands for VPANDND")
  62716. }
  62717. return p
  62718. }
  62719. // VPANDNQ performs "Bitwise Logical AND NOT of Packed Quadword Integers".
  62720. //
  62721. // Mnemonic : VPANDNQ
  62722. // Supported forms : (6 forms)
  62723. //
  62724. // * VPANDNQ m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  62725. // * VPANDNQ zmm, zmm, zmm{k}{z} [AVX512F]
  62726. // * VPANDNQ m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  62727. // * VPANDNQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  62728. // * VPANDNQ m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  62729. // * VPANDNQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  62730. //
  62731. func (self *Program) VPANDNQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  62732. p := self.alloc("VPANDNQ", 3, Operands { v0, v1, v2 })
  62733. // VPANDNQ m512/m64bcst, zmm, zmm{k}{z}
  62734. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  62735. self.require(ISA_AVX512F)
  62736. p.domain = DomainAVX
  62737. p.add(0, func(m *_Encoding, v []interface{}) {
  62738. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  62739. m.emit(0xdf)
  62740. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  62741. })
  62742. }
  62743. // VPANDNQ zmm, zmm, zmm{k}{z}
  62744. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  62745. self.require(ISA_AVX512F)
  62746. p.domain = DomainAVX
  62747. p.add(0, func(m *_Encoding, v []interface{}) {
  62748. m.emit(0x62)
  62749. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  62750. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  62751. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  62752. m.emit(0xdf)
  62753. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62754. })
  62755. }
  62756. // VPANDNQ m128/m64bcst, xmm, xmm{k}{z}
  62757. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  62758. self.require(ISA_AVX512VL | ISA_AVX512F)
  62759. p.domain = DomainAVX
  62760. p.add(0, func(m *_Encoding, v []interface{}) {
  62761. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  62762. m.emit(0xdf)
  62763. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  62764. })
  62765. }
  62766. // VPANDNQ xmm, xmm, xmm{k}{z}
  62767. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  62768. self.require(ISA_AVX512VL | ISA_AVX512F)
  62769. p.domain = DomainAVX
  62770. p.add(0, func(m *_Encoding, v []interface{}) {
  62771. m.emit(0x62)
  62772. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  62773. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  62774. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  62775. m.emit(0xdf)
  62776. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62777. })
  62778. }
  62779. // VPANDNQ m256/m64bcst, ymm, ymm{k}{z}
  62780. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  62781. self.require(ISA_AVX512VL | ISA_AVX512F)
  62782. p.domain = DomainAVX
  62783. p.add(0, func(m *_Encoding, v []interface{}) {
  62784. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  62785. m.emit(0xdf)
  62786. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  62787. })
  62788. }
  62789. // VPANDNQ ymm, ymm, ymm{k}{z}
  62790. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  62791. self.require(ISA_AVX512VL | ISA_AVX512F)
  62792. p.domain = DomainAVX
  62793. p.add(0, func(m *_Encoding, v []interface{}) {
  62794. m.emit(0x62)
  62795. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  62796. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  62797. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  62798. m.emit(0xdf)
  62799. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62800. })
  62801. }
  62802. if p.len == 0 {
  62803. panic("invalid operands for VPANDNQ")
  62804. }
  62805. return p
  62806. }
  62807. // VPANDQ performs "Bitwise Logical AND of Packed Quadword Integers".
  62808. //
  62809. // Mnemonic : VPANDQ
  62810. // Supported forms : (6 forms)
  62811. //
  62812. // * VPANDQ m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  62813. // * VPANDQ zmm, zmm, zmm{k}{z} [AVX512F]
  62814. // * VPANDQ m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  62815. // * VPANDQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  62816. // * VPANDQ m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  62817. // * VPANDQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  62818. //
  62819. func (self *Program) VPANDQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  62820. p := self.alloc("VPANDQ", 3, Operands { v0, v1, v2 })
  62821. // VPANDQ m512/m64bcst, zmm, zmm{k}{z}
  62822. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  62823. self.require(ISA_AVX512F)
  62824. p.domain = DomainAVX
  62825. p.add(0, func(m *_Encoding, v []interface{}) {
  62826. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  62827. m.emit(0xdb)
  62828. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  62829. })
  62830. }
  62831. // VPANDQ zmm, zmm, zmm{k}{z}
  62832. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  62833. self.require(ISA_AVX512F)
  62834. p.domain = DomainAVX
  62835. p.add(0, func(m *_Encoding, v []interface{}) {
  62836. m.emit(0x62)
  62837. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  62838. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  62839. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  62840. m.emit(0xdb)
  62841. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62842. })
  62843. }
  62844. // VPANDQ m128/m64bcst, xmm, xmm{k}{z}
  62845. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  62846. self.require(ISA_AVX512VL | ISA_AVX512F)
  62847. p.domain = DomainAVX
  62848. p.add(0, func(m *_Encoding, v []interface{}) {
  62849. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  62850. m.emit(0xdb)
  62851. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  62852. })
  62853. }
  62854. // VPANDQ xmm, xmm, xmm{k}{z}
  62855. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  62856. self.require(ISA_AVX512VL | ISA_AVX512F)
  62857. p.domain = DomainAVX
  62858. p.add(0, func(m *_Encoding, v []interface{}) {
  62859. m.emit(0x62)
  62860. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  62861. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  62862. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  62863. m.emit(0xdb)
  62864. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62865. })
  62866. }
  62867. // VPANDQ m256/m64bcst, ymm, ymm{k}{z}
  62868. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  62869. self.require(ISA_AVX512VL | ISA_AVX512F)
  62870. p.domain = DomainAVX
  62871. p.add(0, func(m *_Encoding, v []interface{}) {
  62872. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  62873. m.emit(0xdb)
  62874. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  62875. })
  62876. }
  62877. // VPANDQ ymm, ymm, ymm{k}{z}
  62878. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  62879. self.require(ISA_AVX512VL | ISA_AVX512F)
  62880. p.domain = DomainAVX
  62881. p.add(0, func(m *_Encoding, v []interface{}) {
  62882. m.emit(0x62)
  62883. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  62884. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  62885. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  62886. m.emit(0xdb)
  62887. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62888. })
  62889. }
  62890. if p.len == 0 {
  62891. panic("invalid operands for VPANDQ")
  62892. }
  62893. return p
  62894. }
  62895. // VPAVGB performs "Average Packed Byte Integers".
  62896. //
  62897. // Mnemonic : VPAVGB
  62898. // Supported forms : (10 forms)
  62899. //
  62900. // * VPAVGB xmm, xmm, xmm [AVX]
  62901. // * VPAVGB m128, xmm, xmm [AVX]
  62902. // * VPAVGB ymm, ymm, ymm [AVX2]
  62903. // * VPAVGB m256, ymm, ymm [AVX2]
  62904. // * VPAVGB zmm, zmm, zmm{k}{z} [AVX512BW]
  62905. // * VPAVGB m512, zmm, zmm{k}{z} [AVX512BW]
  62906. // * VPAVGB xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  62907. // * VPAVGB m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  62908. // * VPAVGB ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  62909. // * VPAVGB m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  62910. //
  62911. func (self *Program) VPAVGB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  62912. p := self.alloc("VPAVGB", 3, Operands { v0, v1, v2 })
  62913. // VPAVGB xmm, xmm, xmm
  62914. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  62915. self.require(ISA_AVX)
  62916. p.domain = DomainAVX
  62917. p.add(0, func(m *_Encoding, v []interface{}) {
  62918. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  62919. m.emit(0xe0)
  62920. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62921. })
  62922. }
  62923. // VPAVGB m128, xmm, xmm
  62924. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  62925. self.require(ISA_AVX)
  62926. p.domain = DomainAVX
  62927. p.add(0, func(m *_Encoding, v []interface{}) {
  62928. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  62929. m.emit(0xe0)
  62930. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  62931. })
  62932. }
  62933. // VPAVGB ymm, ymm, ymm
  62934. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  62935. self.require(ISA_AVX2)
  62936. p.domain = DomainAVX
  62937. p.add(0, func(m *_Encoding, v []interface{}) {
  62938. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  62939. m.emit(0xe0)
  62940. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62941. })
  62942. }
  62943. // VPAVGB m256, ymm, ymm
  62944. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  62945. self.require(ISA_AVX2)
  62946. p.domain = DomainAVX
  62947. p.add(0, func(m *_Encoding, v []interface{}) {
  62948. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  62949. m.emit(0xe0)
  62950. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  62951. })
  62952. }
  62953. // VPAVGB zmm, zmm, zmm{k}{z}
  62954. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  62955. self.require(ISA_AVX512BW)
  62956. p.domain = DomainAVX
  62957. p.add(0, func(m *_Encoding, v []interface{}) {
  62958. m.emit(0x62)
  62959. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  62960. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  62961. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  62962. m.emit(0xe0)
  62963. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62964. })
  62965. }
  62966. // VPAVGB m512, zmm, zmm{k}{z}
  62967. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  62968. self.require(ISA_AVX512BW)
  62969. p.domain = DomainAVX
  62970. p.add(0, func(m *_Encoding, v []interface{}) {
  62971. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  62972. m.emit(0xe0)
  62973. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  62974. })
  62975. }
  62976. // VPAVGB xmm, xmm, xmm{k}{z}
  62977. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  62978. self.require(ISA_AVX512VL | ISA_AVX512BW)
  62979. p.domain = DomainAVX
  62980. p.add(0, func(m *_Encoding, v []interface{}) {
  62981. m.emit(0x62)
  62982. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  62983. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  62984. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  62985. m.emit(0xe0)
  62986. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  62987. })
  62988. }
  62989. // VPAVGB m128, xmm, xmm{k}{z}
  62990. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  62991. self.require(ISA_AVX512VL | ISA_AVX512BW)
  62992. p.domain = DomainAVX
  62993. p.add(0, func(m *_Encoding, v []interface{}) {
  62994. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  62995. m.emit(0xe0)
  62996. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  62997. })
  62998. }
  62999. // VPAVGB ymm, ymm, ymm{k}{z}
  63000. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  63001. self.require(ISA_AVX512VL | ISA_AVX512BW)
  63002. p.domain = DomainAVX
  63003. p.add(0, func(m *_Encoding, v []interface{}) {
  63004. m.emit(0x62)
  63005. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  63006. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  63007. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  63008. m.emit(0xe0)
  63009. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  63010. })
  63011. }
  63012. // VPAVGB m256, ymm, ymm{k}{z}
  63013. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  63014. self.require(ISA_AVX512VL | ISA_AVX512BW)
  63015. p.domain = DomainAVX
  63016. p.add(0, func(m *_Encoding, v []interface{}) {
  63017. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  63018. m.emit(0xe0)
  63019. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  63020. })
  63021. }
  63022. if p.len == 0 {
  63023. panic("invalid operands for VPAVGB")
  63024. }
  63025. return p
  63026. }
  63027. // VPAVGW performs "Average Packed Word Integers".
  63028. //
  63029. // Mnemonic : VPAVGW
  63030. // Supported forms : (10 forms)
  63031. //
  63032. // * VPAVGW xmm, xmm, xmm [AVX]
  63033. // * VPAVGW m128, xmm, xmm [AVX]
  63034. // * VPAVGW ymm, ymm, ymm [AVX2]
  63035. // * VPAVGW m256, ymm, ymm [AVX2]
  63036. // * VPAVGW zmm, zmm, zmm{k}{z} [AVX512BW]
  63037. // * VPAVGW m512, zmm, zmm{k}{z} [AVX512BW]
  63038. // * VPAVGW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  63039. // * VPAVGW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  63040. // * VPAVGW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  63041. // * VPAVGW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  63042. //
  63043. func (self *Program) VPAVGW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  63044. p := self.alloc("VPAVGW", 3, Operands { v0, v1, v2 })
  63045. // VPAVGW xmm, xmm, xmm
  63046. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  63047. self.require(ISA_AVX)
  63048. p.domain = DomainAVX
  63049. p.add(0, func(m *_Encoding, v []interface{}) {
  63050. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  63051. m.emit(0xe3)
  63052. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  63053. })
  63054. }
  63055. // VPAVGW m128, xmm, xmm
  63056. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  63057. self.require(ISA_AVX)
  63058. p.domain = DomainAVX
  63059. p.add(0, func(m *_Encoding, v []interface{}) {
  63060. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  63061. m.emit(0xe3)
  63062. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  63063. })
  63064. }
  63065. // VPAVGW ymm, ymm, ymm
  63066. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  63067. self.require(ISA_AVX2)
  63068. p.domain = DomainAVX
  63069. p.add(0, func(m *_Encoding, v []interface{}) {
  63070. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  63071. m.emit(0xe3)
  63072. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  63073. })
  63074. }
  63075. // VPAVGW m256, ymm, ymm
  63076. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  63077. self.require(ISA_AVX2)
  63078. p.domain = DomainAVX
  63079. p.add(0, func(m *_Encoding, v []interface{}) {
  63080. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  63081. m.emit(0xe3)
  63082. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  63083. })
  63084. }
  63085. // VPAVGW zmm, zmm, zmm{k}{z}
  63086. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  63087. self.require(ISA_AVX512BW)
  63088. p.domain = DomainAVX
  63089. p.add(0, func(m *_Encoding, v []interface{}) {
  63090. m.emit(0x62)
  63091. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  63092. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  63093. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  63094. m.emit(0xe3)
  63095. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  63096. })
  63097. }
  63098. // VPAVGW m512, zmm, zmm{k}{z}
  63099. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  63100. self.require(ISA_AVX512BW)
  63101. p.domain = DomainAVX
  63102. p.add(0, func(m *_Encoding, v []interface{}) {
  63103. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  63104. m.emit(0xe3)
  63105. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  63106. })
  63107. }
  63108. // VPAVGW xmm, xmm, xmm{k}{z}
  63109. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  63110. self.require(ISA_AVX512VL | ISA_AVX512BW)
  63111. p.domain = DomainAVX
  63112. p.add(0, func(m *_Encoding, v []interface{}) {
  63113. m.emit(0x62)
  63114. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  63115. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  63116. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  63117. m.emit(0xe3)
  63118. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  63119. })
  63120. }
  63121. // VPAVGW m128, xmm, xmm{k}{z}
  63122. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  63123. self.require(ISA_AVX512VL | ISA_AVX512BW)
  63124. p.domain = DomainAVX
  63125. p.add(0, func(m *_Encoding, v []interface{}) {
  63126. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  63127. m.emit(0xe3)
  63128. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  63129. })
  63130. }
  63131. // VPAVGW ymm, ymm, ymm{k}{z}
  63132. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  63133. self.require(ISA_AVX512VL | ISA_AVX512BW)
  63134. p.domain = DomainAVX
  63135. p.add(0, func(m *_Encoding, v []interface{}) {
  63136. m.emit(0x62)
  63137. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  63138. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  63139. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  63140. m.emit(0xe3)
  63141. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  63142. })
  63143. }
  63144. // VPAVGW m256, ymm, ymm{k}{z}
  63145. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  63146. self.require(ISA_AVX512VL | ISA_AVX512BW)
  63147. p.domain = DomainAVX
  63148. p.add(0, func(m *_Encoding, v []interface{}) {
  63149. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  63150. m.emit(0xe3)
  63151. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  63152. })
  63153. }
  63154. if p.len == 0 {
  63155. panic("invalid operands for VPAVGW")
  63156. }
  63157. return p
  63158. }
  63159. // VPBLENDD performs "Blend Packed Doublewords".
  63160. //
  63161. // Mnemonic : VPBLENDD
  63162. // Supported forms : (4 forms)
  63163. //
  63164. // * VPBLENDD imm8, xmm, xmm, xmm [AVX2]
  63165. // * VPBLENDD imm8, m128, xmm, xmm [AVX2]
  63166. // * VPBLENDD imm8, ymm, ymm, ymm [AVX2]
  63167. // * VPBLENDD imm8, m256, ymm, ymm [AVX2]
  63168. //
  63169. func (self *Program) VPBLENDD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  63170. p := self.alloc("VPBLENDD", 4, Operands { v0, v1, v2, v3 })
  63171. // VPBLENDD imm8, xmm, xmm, xmm
  63172. if isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  63173. self.require(ISA_AVX2)
  63174. p.domain = DomainAVX
  63175. p.add(0, func(m *_Encoding, v []interface{}) {
  63176. m.emit(0xc4)
  63177. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  63178. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  63179. m.emit(0x02)
  63180. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  63181. m.imm1(toImmAny(v[0]))
  63182. })
  63183. }
  63184. // VPBLENDD imm8, m128, xmm, xmm
  63185. if isImm8(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  63186. self.require(ISA_AVX2)
  63187. p.domain = DomainAVX
  63188. p.add(0, func(m *_Encoding, v []interface{}) {
  63189. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  63190. m.emit(0x02)
  63191. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  63192. m.imm1(toImmAny(v[0]))
  63193. })
  63194. }
  63195. // VPBLENDD imm8, ymm, ymm, ymm
  63196. if isImm8(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  63197. self.require(ISA_AVX2)
  63198. p.domain = DomainAVX
  63199. p.add(0, func(m *_Encoding, v []interface{}) {
  63200. m.emit(0xc4)
  63201. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  63202. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  63203. m.emit(0x02)
  63204. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  63205. m.imm1(toImmAny(v[0]))
  63206. })
  63207. }
  63208. // VPBLENDD imm8, m256, ymm, ymm
  63209. if isImm8(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  63210. self.require(ISA_AVX2)
  63211. p.domain = DomainAVX
  63212. p.add(0, func(m *_Encoding, v []interface{}) {
  63213. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  63214. m.emit(0x02)
  63215. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  63216. m.imm1(toImmAny(v[0]))
  63217. })
  63218. }
  63219. if p.len == 0 {
  63220. panic("invalid operands for VPBLENDD")
  63221. }
  63222. return p
  63223. }
  63224. // VPBLENDMB performs "Blend Byte Vectors Using an OpMask Control".
  63225. //
  63226. // Mnemonic : VPBLENDMB
  63227. // Supported forms : (6 forms)
  63228. //
  63229. // * VPBLENDMB zmm, zmm, zmm{k}{z} [AVX512BW]
  63230. // * VPBLENDMB m512, zmm, zmm{k}{z} [AVX512BW]
  63231. // * VPBLENDMB xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  63232. // * VPBLENDMB m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  63233. // * VPBLENDMB ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  63234. // * VPBLENDMB m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  63235. //
  63236. func (self *Program) VPBLENDMB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  63237. p := self.alloc("VPBLENDMB", 3, Operands { v0, v1, v2 })
  63238. // VPBLENDMB zmm, zmm, zmm{k}{z}
  63239. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  63240. self.require(ISA_AVX512BW)
  63241. p.domain = DomainAVX
  63242. p.add(0, func(m *_Encoding, v []interface{}) {
  63243. m.emit(0x62)
  63244. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  63245. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  63246. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  63247. m.emit(0x66)
  63248. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  63249. })
  63250. }
  63251. // VPBLENDMB m512, zmm, zmm{k}{z}
  63252. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  63253. self.require(ISA_AVX512BW)
  63254. p.domain = DomainAVX
  63255. p.add(0, func(m *_Encoding, v []interface{}) {
  63256. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  63257. m.emit(0x66)
  63258. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  63259. })
  63260. }
  63261. // VPBLENDMB xmm, xmm, xmm{k}{z}
  63262. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  63263. self.require(ISA_AVX512VL | ISA_AVX512BW)
  63264. p.domain = DomainAVX
  63265. p.add(0, func(m *_Encoding, v []interface{}) {
  63266. m.emit(0x62)
  63267. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  63268. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  63269. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  63270. m.emit(0x66)
  63271. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  63272. })
  63273. }
  63274. // VPBLENDMB m128, xmm, xmm{k}{z}
  63275. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  63276. self.require(ISA_AVX512VL | ISA_AVX512BW)
  63277. p.domain = DomainAVX
  63278. p.add(0, func(m *_Encoding, v []interface{}) {
  63279. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  63280. m.emit(0x66)
  63281. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  63282. })
  63283. }
  63284. // VPBLENDMB ymm, ymm, ymm{k}{z}
  63285. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  63286. self.require(ISA_AVX512VL | ISA_AVX512BW)
  63287. p.domain = DomainAVX
  63288. p.add(0, func(m *_Encoding, v []interface{}) {
  63289. m.emit(0x62)
  63290. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  63291. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  63292. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  63293. m.emit(0x66)
  63294. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  63295. })
  63296. }
  63297. // VPBLENDMB m256, ymm, ymm{k}{z}
  63298. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  63299. self.require(ISA_AVX512VL | ISA_AVX512BW)
  63300. p.domain = DomainAVX
  63301. p.add(0, func(m *_Encoding, v []interface{}) {
  63302. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  63303. m.emit(0x66)
  63304. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  63305. })
  63306. }
  63307. if p.len == 0 {
  63308. panic("invalid operands for VPBLENDMB")
  63309. }
  63310. return p
  63311. }
  63312. // VPBLENDMD performs "Blend Doubleword Vectors Using an OpMask Control".
  63313. //
  63314. // Mnemonic : VPBLENDMD
  63315. // Supported forms : (6 forms)
  63316. //
  63317. // * VPBLENDMD m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  63318. // * VPBLENDMD zmm, zmm, zmm{k}{z} [AVX512F]
  63319. // * VPBLENDMD m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  63320. // * VPBLENDMD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  63321. // * VPBLENDMD m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  63322. // * VPBLENDMD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  63323. //
  63324. func (self *Program) VPBLENDMD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  63325. p := self.alloc("VPBLENDMD", 3, Operands { v0, v1, v2 })
  63326. // VPBLENDMD m512/m32bcst, zmm, zmm{k}{z}
  63327. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  63328. self.require(ISA_AVX512F)
  63329. p.domain = DomainAVX
  63330. p.add(0, func(m *_Encoding, v []interface{}) {
  63331. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  63332. m.emit(0x64)
  63333. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  63334. })
  63335. }
  63336. // VPBLENDMD zmm, zmm, zmm{k}{z}
  63337. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  63338. self.require(ISA_AVX512F)
  63339. p.domain = DomainAVX
  63340. p.add(0, func(m *_Encoding, v []interface{}) {
  63341. m.emit(0x62)
  63342. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  63343. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  63344. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  63345. m.emit(0x64)
  63346. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  63347. })
  63348. }
  63349. // VPBLENDMD m128/m32bcst, xmm, xmm{k}{z}
  63350. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  63351. self.require(ISA_AVX512VL | ISA_AVX512F)
  63352. p.domain = DomainAVX
  63353. p.add(0, func(m *_Encoding, v []interface{}) {
  63354. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  63355. m.emit(0x64)
  63356. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  63357. })
  63358. }
  63359. // VPBLENDMD xmm, xmm, xmm{k}{z}
  63360. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  63361. self.require(ISA_AVX512VL | ISA_AVX512F)
  63362. p.domain = DomainAVX
  63363. p.add(0, func(m *_Encoding, v []interface{}) {
  63364. m.emit(0x62)
  63365. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  63366. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  63367. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  63368. m.emit(0x64)
  63369. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  63370. })
  63371. }
  63372. // VPBLENDMD m256/m32bcst, ymm, ymm{k}{z}
  63373. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  63374. self.require(ISA_AVX512VL | ISA_AVX512F)
  63375. p.domain = DomainAVX
  63376. p.add(0, func(m *_Encoding, v []interface{}) {
  63377. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  63378. m.emit(0x64)
  63379. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  63380. })
  63381. }
  63382. // VPBLENDMD ymm, ymm, ymm{k}{z}
  63383. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  63384. self.require(ISA_AVX512VL | ISA_AVX512F)
  63385. p.domain = DomainAVX
  63386. p.add(0, func(m *_Encoding, v []interface{}) {
  63387. m.emit(0x62)
  63388. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  63389. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  63390. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  63391. m.emit(0x64)
  63392. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  63393. })
  63394. }
  63395. if p.len == 0 {
  63396. panic("invalid operands for VPBLENDMD")
  63397. }
  63398. return p
  63399. }
  63400. // VPBLENDMQ performs "Blend Quadword Vectors Using an OpMask Control".
  63401. //
  63402. // Mnemonic : VPBLENDMQ
  63403. // Supported forms : (6 forms)
  63404. //
  63405. // * VPBLENDMQ m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  63406. // * VPBLENDMQ zmm, zmm, zmm{k}{z} [AVX512F]
  63407. // * VPBLENDMQ m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  63408. // * VPBLENDMQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  63409. // * VPBLENDMQ m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  63410. // * VPBLENDMQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  63411. //
  63412. func (self *Program) VPBLENDMQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  63413. p := self.alloc("VPBLENDMQ", 3, Operands { v0, v1, v2 })
  63414. // VPBLENDMQ m512/m64bcst, zmm, zmm{k}{z}
  63415. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  63416. self.require(ISA_AVX512F)
  63417. p.domain = DomainAVX
  63418. p.add(0, func(m *_Encoding, v []interface{}) {
  63419. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  63420. m.emit(0x64)
  63421. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  63422. })
  63423. }
  63424. // VPBLENDMQ zmm, zmm, zmm{k}{z}
  63425. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  63426. self.require(ISA_AVX512F)
  63427. p.domain = DomainAVX
  63428. p.add(0, func(m *_Encoding, v []interface{}) {
  63429. m.emit(0x62)
  63430. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  63431. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  63432. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  63433. m.emit(0x64)
  63434. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  63435. })
  63436. }
  63437. // VPBLENDMQ m128/m64bcst, xmm, xmm{k}{z}
  63438. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  63439. self.require(ISA_AVX512VL | ISA_AVX512F)
  63440. p.domain = DomainAVX
  63441. p.add(0, func(m *_Encoding, v []interface{}) {
  63442. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  63443. m.emit(0x64)
  63444. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  63445. })
  63446. }
  63447. // VPBLENDMQ xmm, xmm, xmm{k}{z}
  63448. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  63449. self.require(ISA_AVX512VL | ISA_AVX512F)
  63450. p.domain = DomainAVX
  63451. p.add(0, func(m *_Encoding, v []interface{}) {
  63452. m.emit(0x62)
  63453. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  63454. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  63455. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  63456. m.emit(0x64)
  63457. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  63458. })
  63459. }
  63460. // VPBLENDMQ m256/m64bcst, ymm, ymm{k}{z}
  63461. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  63462. self.require(ISA_AVX512VL | ISA_AVX512F)
  63463. p.domain = DomainAVX
  63464. p.add(0, func(m *_Encoding, v []interface{}) {
  63465. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  63466. m.emit(0x64)
  63467. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  63468. })
  63469. }
  63470. // VPBLENDMQ ymm, ymm, ymm{k}{z}
  63471. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  63472. self.require(ISA_AVX512VL | ISA_AVX512F)
  63473. p.domain = DomainAVX
  63474. p.add(0, func(m *_Encoding, v []interface{}) {
  63475. m.emit(0x62)
  63476. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  63477. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  63478. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  63479. m.emit(0x64)
  63480. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  63481. })
  63482. }
  63483. if p.len == 0 {
  63484. panic("invalid operands for VPBLENDMQ")
  63485. }
  63486. return p
  63487. }
  63488. // VPBLENDMW performs "Blend Word Vectors Using an OpMask Control".
  63489. //
  63490. // Mnemonic : VPBLENDMW
  63491. // Supported forms : (6 forms)
  63492. //
  63493. // * VPBLENDMW zmm, zmm, zmm{k}{z} [AVX512BW]
  63494. // * VPBLENDMW m512, zmm, zmm{k}{z} [AVX512BW]
  63495. // * VPBLENDMW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  63496. // * VPBLENDMW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  63497. // * VPBLENDMW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  63498. // * VPBLENDMW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  63499. //
  63500. func (self *Program) VPBLENDMW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  63501. p := self.alloc("VPBLENDMW", 3, Operands { v0, v1, v2 })
  63502. // VPBLENDMW zmm, zmm, zmm{k}{z}
  63503. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  63504. self.require(ISA_AVX512BW)
  63505. p.domain = DomainAVX
  63506. p.add(0, func(m *_Encoding, v []interface{}) {
  63507. m.emit(0x62)
  63508. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  63509. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  63510. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  63511. m.emit(0x66)
  63512. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  63513. })
  63514. }
  63515. // VPBLENDMW m512, zmm, zmm{k}{z}
  63516. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  63517. self.require(ISA_AVX512BW)
  63518. p.domain = DomainAVX
  63519. p.add(0, func(m *_Encoding, v []interface{}) {
  63520. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  63521. m.emit(0x66)
  63522. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  63523. })
  63524. }
  63525. // VPBLENDMW xmm, xmm, xmm{k}{z}
  63526. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  63527. self.require(ISA_AVX512VL | ISA_AVX512BW)
  63528. p.domain = DomainAVX
  63529. p.add(0, func(m *_Encoding, v []interface{}) {
  63530. m.emit(0x62)
  63531. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  63532. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  63533. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  63534. m.emit(0x66)
  63535. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  63536. })
  63537. }
  63538. // VPBLENDMW m128, xmm, xmm{k}{z}
  63539. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  63540. self.require(ISA_AVX512VL | ISA_AVX512BW)
  63541. p.domain = DomainAVX
  63542. p.add(0, func(m *_Encoding, v []interface{}) {
  63543. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  63544. m.emit(0x66)
  63545. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  63546. })
  63547. }
  63548. // VPBLENDMW ymm, ymm, ymm{k}{z}
  63549. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  63550. self.require(ISA_AVX512VL | ISA_AVX512BW)
  63551. p.domain = DomainAVX
  63552. p.add(0, func(m *_Encoding, v []interface{}) {
  63553. m.emit(0x62)
  63554. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  63555. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  63556. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  63557. m.emit(0x66)
  63558. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  63559. })
  63560. }
  63561. // VPBLENDMW m256, ymm, ymm{k}{z}
  63562. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  63563. self.require(ISA_AVX512VL | ISA_AVX512BW)
  63564. p.domain = DomainAVX
  63565. p.add(0, func(m *_Encoding, v []interface{}) {
  63566. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  63567. m.emit(0x66)
  63568. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  63569. })
  63570. }
  63571. if p.len == 0 {
  63572. panic("invalid operands for VPBLENDMW")
  63573. }
  63574. return p
  63575. }
  63576. // VPBLENDVB performs "Variable Blend Packed Bytes".
  63577. //
  63578. // Mnemonic : VPBLENDVB
  63579. // Supported forms : (4 forms)
  63580. //
  63581. // * VPBLENDVB xmm, xmm, xmm, xmm [AVX]
  63582. // * VPBLENDVB xmm, m128, xmm, xmm [AVX]
  63583. // * VPBLENDVB ymm, ymm, ymm, ymm [AVX2]
  63584. // * VPBLENDVB ymm, m256, ymm, ymm [AVX2]
  63585. //
  63586. func (self *Program) VPBLENDVB(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  63587. p := self.alloc("VPBLENDVB", 4, Operands { v0, v1, v2, v3 })
  63588. // VPBLENDVB xmm, xmm, xmm, xmm
  63589. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  63590. self.require(ISA_AVX)
  63591. p.domain = DomainAVX
  63592. p.add(0, func(m *_Encoding, v []interface{}) {
  63593. m.emit(0xc4)
  63594. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  63595. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  63596. m.emit(0x4c)
  63597. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  63598. m.emit(hlcode(v[0]) << 4)
  63599. })
  63600. }
  63601. // VPBLENDVB xmm, m128, xmm, xmm
  63602. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  63603. self.require(ISA_AVX)
  63604. p.domain = DomainAVX
  63605. p.add(0, func(m *_Encoding, v []interface{}) {
  63606. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  63607. m.emit(0x4c)
  63608. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  63609. m.emit(hlcode(v[0]) << 4)
  63610. })
  63611. }
  63612. // VPBLENDVB ymm, ymm, ymm, ymm
  63613. if isYMM(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  63614. self.require(ISA_AVX2)
  63615. p.domain = DomainAVX
  63616. p.add(0, func(m *_Encoding, v []interface{}) {
  63617. m.emit(0xc4)
  63618. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  63619. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  63620. m.emit(0x4c)
  63621. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  63622. m.emit(hlcode(v[0]) << 4)
  63623. })
  63624. }
  63625. // VPBLENDVB ymm, m256, ymm, ymm
  63626. if isYMM(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  63627. self.require(ISA_AVX2)
  63628. p.domain = DomainAVX
  63629. p.add(0, func(m *_Encoding, v []interface{}) {
  63630. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  63631. m.emit(0x4c)
  63632. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  63633. m.emit(hlcode(v[0]) << 4)
  63634. })
  63635. }
  63636. if p.len == 0 {
  63637. panic("invalid operands for VPBLENDVB")
  63638. }
  63639. return p
  63640. }
  63641. // VPBLENDW performs "Blend Packed Words".
  63642. //
  63643. // Mnemonic : VPBLENDW
  63644. // Supported forms : (4 forms)
  63645. //
  63646. // * VPBLENDW imm8, xmm, xmm, xmm [AVX]
  63647. // * VPBLENDW imm8, m128, xmm, xmm [AVX]
  63648. // * VPBLENDW imm8, ymm, ymm, ymm [AVX2]
  63649. // * VPBLENDW imm8, m256, ymm, ymm [AVX2]
  63650. //
  63651. func (self *Program) VPBLENDW(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  63652. p := self.alloc("VPBLENDW", 4, Operands { v0, v1, v2, v3 })
  63653. // VPBLENDW imm8, xmm, xmm, xmm
  63654. if isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  63655. self.require(ISA_AVX)
  63656. p.domain = DomainAVX
  63657. p.add(0, func(m *_Encoding, v []interface{}) {
  63658. m.emit(0xc4)
  63659. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  63660. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  63661. m.emit(0x0e)
  63662. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  63663. m.imm1(toImmAny(v[0]))
  63664. })
  63665. }
  63666. // VPBLENDW imm8, m128, xmm, xmm
  63667. if isImm8(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  63668. self.require(ISA_AVX)
  63669. p.domain = DomainAVX
  63670. p.add(0, func(m *_Encoding, v []interface{}) {
  63671. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  63672. m.emit(0x0e)
  63673. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  63674. m.imm1(toImmAny(v[0]))
  63675. })
  63676. }
  63677. // VPBLENDW imm8, ymm, ymm, ymm
  63678. if isImm8(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  63679. self.require(ISA_AVX2)
  63680. p.domain = DomainAVX
  63681. p.add(0, func(m *_Encoding, v []interface{}) {
  63682. m.emit(0xc4)
  63683. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  63684. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  63685. m.emit(0x0e)
  63686. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  63687. m.imm1(toImmAny(v[0]))
  63688. })
  63689. }
  63690. // VPBLENDW imm8, m256, ymm, ymm
  63691. if isImm8(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  63692. self.require(ISA_AVX2)
  63693. p.domain = DomainAVX
  63694. p.add(0, func(m *_Encoding, v []interface{}) {
  63695. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  63696. m.emit(0x0e)
  63697. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  63698. m.imm1(toImmAny(v[0]))
  63699. })
  63700. }
  63701. if p.len == 0 {
  63702. panic("invalid operands for VPBLENDW")
  63703. }
  63704. return p
  63705. }
  63706. // VPBROADCASTB performs "Broadcast Byte Integer".
  63707. //
  63708. // Mnemonic : VPBROADCASTB
  63709. // Supported forms : (13 forms)
  63710. //
  63711. // * VPBROADCASTB xmm, xmm [AVX2]
  63712. // * VPBROADCASTB m8, xmm [AVX2]
  63713. // * VPBROADCASTB xmm, ymm [AVX2]
  63714. // * VPBROADCASTB m8, ymm [AVX2]
  63715. // * VPBROADCASTB r32, zmm{k}{z} [AVX512BW]
  63716. // * VPBROADCASTB xmm, zmm{k}{z} [AVX512BW]
  63717. // * VPBROADCASTB m8, zmm{k}{z} [AVX512BW]
  63718. // * VPBROADCASTB r32, xmm{k}{z} [AVX512BW,AVX512VL]
  63719. // * VPBROADCASTB r32, ymm{k}{z} [AVX512BW,AVX512VL]
  63720. // * VPBROADCASTB xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  63721. // * VPBROADCASTB xmm, ymm{k}{z} [AVX512BW,AVX512VL]
  63722. // * VPBROADCASTB m8, xmm{k}{z} [AVX512BW,AVX512VL]
  63723. // * VPBROADCASTB m8, ymm{k}{z} [AVX512BW,AVX512VL]
  63724. //
  63725. func (self *Program) VPBROADCASTB(v0 interface{}, v1 interface{}) *Instruction {
  63726. p := self.alloc("VPBROADCASTB", 2, Operands { v0, v1 })
  63727. // VPBROADCASTB xmm, xmm
  63728. if isXMM(v0) && isXMM(v1) {
  63729. self.require(ISA_AVX2)
  63730. p.domain = DomainAVX
  63731. p.add(0, func(m *_Encoding, v []interface{}) {
  63732. m.emit(0xc4)
  63733. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  63734. m.emit(0x79)
  63735. m.emit(0x78)
  63736. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  63737. })
  63738. }
  63739. // VPBROADCASTB m8, xmm
  63740. if isM8(v0) && isXMM(v1) {
  63741. self.require(ISA_AVX2)
  63742. p.domain = DomainAVX
  63743. p.add(0, func(m *_Encoding, v []interface{}) {
  63744. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  63745. m.emit(0x78)
  63746. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  63747. })
  63748. }
  63749. // VPBROADCASTB xmm, ymm
  63750. if isXMM(v0) && isYMM(v1) {
  63751. self.require(ISA_AVX2)
  63752. p.domain = DomainAVX
  63753. p.add(0, func(m *_Encoding, v []interface{}) {
  63754. m.emit(0xc4)
  63755. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  63756. m.emit(0x7d)
  63757. m.emit(0x78)
  63758. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  63759. })
  63760. }
  63761. // VPBROADCASTB m8, ymm
  63762. if isM8(v0) && isYMM(v1) {
  63763. self.require(ISA_AVX2)
  63764. p.domain = DomainAVX
  63765. p.add(0, func(m *_Encoding, v []interface{}) {
  63766. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  63767. m.emit(0x78)
  63768. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  63769. })
  63770. }
  63771. // VPBROADCASTB r32, zmm{k}{z}
  63772. if isReg32(v0) && isZMMkz(v1) {
  63773. self.require(ISA_AVX512BW)
  63774. p.domain = DomainAVX
  63775. p.add(0, func(m *_Encoding, v []interface{}) {
  63776. m.emit(0x62)
  63777. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  63778. m.emit(0x7d)
  63779. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  63780. m.emit(0x7a)
  63781. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  63782. })
  63783. }
  63784. // VPBROADCASTB xmm, zmm{k}{z}
  63785. if isEVEXXMM(v0) && isZMMkz(v1) {
  63786. self.require(ISA_AVX512BW)
  63787. p.domain = DomainAVX
  63788. p.add(0, func(m *_Encoding, v []interface{}) {
  63789. m.emit(0x62)
  63790. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  63791. m.emit(0x7d)
  63792. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  63793. m.emit(0x78)
  63794. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  63795. })
  63796. }
  63797. // VPBROADCASTB m8, zmm{k}{z}
  63798. if isM8(v0) && isZMMkz(v1) {
  63799. self.require(ISA_AVX512BW)
  63800. p.domain = DomainAVX
  63801. p.add(0, func(m *_Encoding, v []interface{}) {
  63802. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  63803. m.emit(0x78)
  63804. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  63805. })
  63806. }
  63807. // VPBROADCASTB r32, xmm{k}{z}
  63808. if isReg32(v0) && isXMMkz(v1) {
  63809. self.require(ISA_AVX512VL | ISA_AVX512BW)
  63810. p.domain = DomainAVX
  63811. p.add(0, func(m *_Encoding, v []interface{}) {
  63812. m.emit(0x62)
  63813. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  63814. m.emit(0x7d)
  63815. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  63816. m.emit(0x7a)
  63817. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  63818. })
  63819. }
  63820. // VPBROADCASTB r32, ymm{k}{z}
  63821. if isReg32(v0) && isYMMkz(v1) {
  63822. self.require(ISA_AVX512VL | ISA_AVX512BW)
  63823. p.domain = DomainAVX
  63824. p.add(0, func(m *_Encoding, v []interface{}) {
  63825. m.emit(0x62)
  63826. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  63827. m.emit(0x7d)
  63828. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  63829. m.emit(0x7a)
  63830. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  63831. })
  63832. }
  63833. // VPBROADCASTB xmm, xmm{k}{z}
  63834. if isEVEXXMM(v0) && isXMMkz(v1) {
  63835. self.require(ISA_AVX512VL | ISA_AVX512BW)
  63836. p.domain = DomainAVX
  63837. p.add(0, func(m *_Encoding, v []interface{}) {
  63838. m.emit(0x62)
  63839. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  63840. m.emit(0x7d)
  63841. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  63842. m.emit(0x78)
  63843. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  63844. })
  63845. }
  63846. // VPBROADCASTB xmm, ymm{k}{z}
  63847. if isEVEXXMM(v0) && isYMMkz(v1) {
  63848. self.require(ISA_AVX512VL | ISA_AVX512BW)
  63849. p.domain = DomainAVX
  63850. p.add(0, func(m *_Encoding, v []interface{}) {
  63851. m.emit(0x62)
  63852. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  63853. m.emit(0x7d)
  63854. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  63855. m.emit(0x78)
  63856. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  63857. })
  63858. }
  63859. // VPBROADCASTB m8, xmm{k}{z}
  63860. if isM8(v0) && isXMMkz(v1) {
  63861. self.require(ISA_AVX512VL | ISA_AVX512BW)
  63862. p.domain = DomainAVX
  63863. p.add(0, func(m *_Encoding, v []interface{}) {
  63864. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  63865. m.emit(0x78)
  63866. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  63867. })
  63868. }
  63869. // VPBROADCASTB m8, ymm{k}{z}
  63870. if isM8(v0) && isYMMkz(v1) {
  63871. self.require(ISA_AVX512VL | ISA_AVX512BW)
  63872. p.domain = DomainAVX
  63873. p.add(0, func(m *_Encoding, v []interface{}) {
  63874. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  63875. m.emit(0x78)
  63876. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  63877. })
  63878. }
  63879. if p.len == 0 {
  63880. panic("invalid operands for VPBROADCASTB")
  63881. }
  63882. return p
  63883. }
  63884. // VPBROADCASTD performs "Broadcast Doubleword Integer".
  63885. //
  63886. // Mnemonic : VPBROADCASTD
  63887. // Supported forms : (13 forms)
  63888. //
  63889. // * VPBROADCASTD xmm, xmm [AVX2]
  63890. // * VPBROADCASTD m32, xmm [AVX2]
  63891. // * VPBROADCASTD xmm, ymm [AVX2]
  63892. // * VPBROADCASTD m32, ymm [AVX2]
  63893. // * VPBROADCASTD r32, zmm{k}{z} [AVX512F]
  63894. // * VPBROADCASTD xmm, zmm{k}{z} [AVX512F]
  63895. // * VPBROADCASTD m32, zmm{k}{z} [AVX512F]
  63896. // * VPBROADCASTD r32, xmm{k}{z} [AVX512F,AVX512VL]
  63897. // * VPBROADCASTD r32, ymm{k}{z} [AVX512F,AVX512VL]
  63898. // * VPBROADCASTD xmm, xmm{k}{z} [AVX512F,AVX512VL]
  63899. // * VPBROADCASTD xmm, ymm{k}{z} [AVX512F,AVX512VL]
  63900. // * VPBROADCASTD m32, xmm{k}{z} [AVX512F,AVX512VL]
  63901. // * VPBROADCASTD m32, ymm{k}{z} [AVX512F,AVX512VL]
  63902. //
  63903. func (self *Program) VPBROADCASTD(v0 interface{}, v1 interface{}) *Instruction {
  63904. p := self.alloc("VPBROADCASTD", 2, Operands { v0, v1 })
  63905. // VPBROADCASTD xmm, xmm
  63906. if isXMM(v0) && isXMM(v1) {
  63907. self.require(ISA_AVX2)
  63908. p.domain = DomainAVX
  63909. p.add(0, func(m *_Encoding, v []interface{}) {
  63910. m.emit(0xc4)
  63911. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  63912. m.emit(0x79)
  63913. m.emit(0x58)
  63914. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  63915. })
  63916. }
  63917. // VPBROADCASTD m32, xmm
  63918. if isM32(v0) && isXMM(v1) {
  63919. self.require(ISA_AVX2)
  63920. p.domain = DomainAVX
  63921. p.add(0, func(m *_Encoding, v []interface{}) {
  63922. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  63923. m.emit(0x58)
  63924. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  63925. })
  63926. }
  63927. // VPBROADCASTD xmm, ymm
  63928. if isXMM(v0) && isYMM(v1) {
  63929. self.require(ISA_AVX2)
  63930. p.domain = DomainAVX
  63931. p.add(0, func(m *_Encoding, v []interface{}) {
  63932. m.emit(0xc4)
  63933. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  63934. m.emit(0x7d)
  63935. m.emit(0x58)
  63936. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  63937. })
  63938. }
  63939. // VPBROADCASTD m32, ymm
  63940. if isM32(v0) && isYMM(v1) {
  63941. self.require(ISA_AVX2)
  63942. p.domain = DomainAVX
  63943. p.add(0, func(m *_Encoding, v []interface{}) {
  63944. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  63945. m.emit(0x58)
  63946. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  63947. })
  63948. }
  63949. // VPBROADCASTD r32, zmm{k}{z}
  63950. if isReg32(v0) && isZMMkz(v1) {
  63951. self.require(ISA_AVX512F)
  63952. p.domain = DomainAVX
  63953. p.add(0, func(m *_Encoding, v []interface{}) {
  63954. m.emit(0x62)
  63955. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  63956. m.emit(0x7d)
  63957. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  63958. m.emit(0x7c)
  63959. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  63960. })
  63961. }
  63962. // VPBROADCASTD xmm, zmm{k}{z}
  63963. if isEVEXXMM(v0) && isZMMkz(v1) {
  63964. self.require(ISA_AVX512F)
  63965. p.domain = DomainAVX
  63966. p.add(0, func(m *_Encoding, v []interface{}) {
  63967. m.emit(0x62)
  63968. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  63969. m.emit(0x7d)
  63970. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  63971. m.emit(0x58)
  63972. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  63973. })
  63974. }
  63975. // VPBROADCASTD m32, zmm{k}{z}
  63976. if isM32(v0) && isZMMkz(v1) {
  63977. self.require(ISA_AVX512F)
  63978. p.domain = DomainAVX
  63979. p.add(0, func(m *_Encoding, v []interface{}) {
  63980. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  63981. m.emit(0x58)
  63982. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  63983. })
  63984. }
  63985. // VPBROADCASTD r32, xmm{k}{z}
  63986. if isReg32(v0) && isXMMkz(v1) {
  63987. self.require(ISA_AVX512VL | ISA_AVX512F)
  63988. p.domain = DomainAVX
  63989. p.add(0, func(m *_Encoding, v []interface{}) {
  63990. m.emit(0x62)
  63991. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  63992. m.emit(0x7d)
  63993. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  63994. m.emit(0x7c)
  63995. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  63996. })
  63997. }
  63998. // VPBROADCASTD r32, ymm{k}{z}
  63999. if isReg32(v0) && isYMMkz(v1) {
  64000. self.require(ISA_AVX512VL | ISA_AVX512F)
  64001. p.domain = DomainAVX
  64002. p.add(0, func(m *_Encoding, v []interface{}) {
  64003. m.emit(0x62)
  64004. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  64005. m.emit(0x7d)
  64006. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  64007. m.emit(0x7c)
  64008. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64009. })
  64010. }
  64011. // VPBROADCASTD xmm, xmm{k}{z}
  64012. if isEVEXXMM(v0) && isXMMkz(v1) {
  64013. self.require(ISA_AVX512VL | ISA_AVX512F)
  64014. p.domain = DomainAVX
  64015. p.add(0, func(m *_Encoding, v []interface{}) {
  64016. m.emit(0x62)
  64017. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  64018. m.emit(0x7d)
  64019. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  64020. m.emit(0x58)
  64021. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64022. })
  64023. }
  64024. // VPBROADCASTD xmm, ymm{k}{z}
  64025. if isEVEXXMM(v0) && isYMMkz(v1) {
  64026. self.require(ISA_AVX512VL | ISA_AVX512F)
  64027. p.domain = DomainAVX
  64028. p.add(0, func(m *_Encoding, v []interface{}) {
  64029. m.emit(0x62)
  64030. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  64031. m.emit(0x7d)
  64032. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  64033. m.emit(0x58)
  64034. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64035. })
  64036. }
  64037. // VPBROADCASTD m32, xmm{k}{z}
  64038. if isM32(v0) && isXMMkz(v1) {
  64039. self.require(ISA_AVX512VL | ISA_AVX512F)
  64040. p.domain = DomainAVX
  64041. p.add(0, func(m *_Encoding, v []interface{}) {
  64042. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  64043. m.emit(0x58)
  64044. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  64045. })
  64046. }
  64047. // VPBROADCASTD m32, ymm{k}{z}
  64048. if isM32(v0) && isYMMkz(v1) {
  64049. self.require(ISA_AVX512VL | ISA_AVX512F)
  64050. p.domain = DomainAVX
  64051. p.add(0, func(m *_Encoding, v []interface{}) {
  64052. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  64053. m.emit(0x58)
  64054. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  64055. })
  64056. }
  64057. if p.len == 0 {
  64058. panic("invalid operands for VPBROADCASTD")
  64059. }
  64060. return p
  64061. }
  64062. // VPBROADCASTMB2Q performs "Broadcast Low Byte of Mask Register to Packed Quadword Values".
  64063. //
  64064. // Mnemonic : VPBROADCASTMB2Q
  64065. // Supported forms : (3 forms)
  64066. //
  64067. // * VPBROADCASTMB2Q k, xmm [AVX512CD,AVX512VL]
  64068. // * VPBROADCASTMB2Q k, ymm [AVX512CD,AVX512VL]
  64069. // * VPBROADCASTMB2Q k, zmm [AVX512CD]
  64070. //
  64071. func (self *Program) VPBROADCASTMB2Q(v0 interface{}, v1 interface{}) *Instruction {
  64072. p := self.alloc("VPBROADCASTMB2Q", 2, Operands { v0, v1 })
  64073. // VPBROADCASTMB2Q k, xmm
  64074. if isK(v0) && isEVEXXMM(v1) {
  64075. self.require(ISA_AVX512VL | ISA_AVX512CD)
  64076. p.domain = DomainAVX
  64077. p.add(0, func(m *_Encoding, v []interface{}) {
  64078. m.emit(0x62)
  64079. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  64080. m.emit(0xfe)
  64081. m.emit(0x08)
  64082. m.emit(0x2a)
  64083. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64084. })
  64085. }
  64086. // VPBROADCASTMB2Q k, ymm
  64087. if isK(v0) && isEVEXYMM(v1) {
  64088. self.require(ISA_AVX512VL | ISA_AVX512CD)
  64089. p.domain = DomainAVX
  64090. p.add(0, func(m *_Encoding, v []interface{}) {
  64091. m.emit(0x62)
  64092. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  64093. m.emit(0xfe)
  64094. m.emit(0x28)
  64095. m.emit(0x2a)
  64096. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64097. })
  64098. }
  64099. // VPBROADCASTMB2Q k, zmm
  64100. if isK(v0) && isZMM(v1) {
  64101. self.require(ISA_AVX512CD)
  64102. p.domain = DomainAVX
  64103. p.add(0, func(m *_Encoding, v []interface{}) {
  64104. m.emit(0x62)
  64105. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  64106. m.emit(0xfe)
  64107. m.emit(0x48)
  64108. m.emit(0x2a)
  64109. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64110. })
  64111. }
  64112. if p.len == 0 {
  64113. panic("invalid operands for VPBROADCASTMB2Q")
  64114. }
  64115. return p
  64116. }
  64117. // VPBROADCASTMW2D performs "Broadcast Low Word of Mask Register to Packed Doubleword Values".
  64118. //
  64119. // Mnemonic : VPBROADCASTMW2D
  64120. // Supported forms : (3 forms)
  64121. //
  64122. // * VPBROADCASTMW2D k, xmm [AVX512CD,AVX512VL]
  64123. // * VPBROADCASTMW2D k, ymm [AVX512CD,AVX512VL]
  64124. // * VPBROADCASTMW2D k, zmm [AVX512CD]
  64125. //
  64126. func (self *Program) VPBROADCASTMW2D(v0 interface{}, v1 interface{}) *Instruction {
  64127. p := self.alloc("VPBROADCASTMW2D", 2, Operands { v0, v1 })
  64128. // VPBROADCASTMW2D k, xmm
  64129. if isK(v0) && isEVEXXMM(v1) {
  64130. self.require(ISA_AVX512VL | ISA_AVX512CD)
  64131. p.domain = DomainAVX
  64132. p.add(0, func(m *_Encoding, v []interface{}) {
  64133. m.emit(0x62)
  64134. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  64135. m.emit(0x7e)
  64136. m.emit(0x08)
  64137. m.emit(0x3a)
  64138. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64139. })
  64140. }
  64141. // VPBROADCASTMW2D k, ymm
  64142. if isK(v0) && isEVEXYMM(v1) {
  64143. self.require(ISA_AVX512VL | ISA_AVX512CD)
  64144. p.domain = DomainAVX
  64145. p.add(0, func(m *_Encoding, v []interface{}) {
  64146. m.emit(0x62)
  64147. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  64148. m.emit(0x7e)
  64149. m.emit(0x28)
  64150. m.emit(0x3a)
  64151. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64152. })
  64153. }
  64154. // VPBROADCASTMW2D k, zmm
  64155. if isK(v0) && isZMM(v1) {
  64156. self.require(ISA_AVX512CD)
  64157. p.domain = DomainAVX
  64158. p.add(0, func(m *_Encoding, v []interface{}) {
  64159. m.emit(0x62)
  64160. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  64161. m.emit(0x7e)
  64162. m.emit(0x48)
  64163. m.emit(0x3a)
  64164. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64165. })
  64166. }
  64167. if p.len == 0 {
  64168. panic("invalid operands for VPBROADCASTMW2D")
  64169. }
  64170. return p
  64171. }
  64172. // VPBROADCASTQ performs "Broadcast Quadword Integer".
  64173. //
  64174. // Mnemonic : VPBROADCASTQ
  64175. // Supported forms : (13 forms)
  64176. //
  64177. // * VPBROADCASTQ xmm, xmm [AVX2]
  64178. // * VPBROADCASTQ m64, xmm [AVX2]
  64179. // * VPBROADCASTQ xmm, ymm [AVX2]
  64180. // * VPBROADCASTQ m64, ymm [AVX2]
  64181. // * VPBROADCASTQ r64, zmm{k}{z} [AVX512F]
  64182. // * VPBROADCASTQ xmm, zmm{k}{z} [AVX512F]
  64183. // * VPBROADCASTQ m64, zmm{k}{z} [AVX512F]
  64184. // * VPBROADCASTQ r64, xmm{k}{z} [AVX512F,AVX512VL]
  64185. // * VPBROADCASTQ r64, ymm{k}{z} [AVX512F,AVX512VL]
  64186. // * VPBROADCASTQ xmm, xmm{k}{z} [AVX512F,AVX512VL]
  64187. // * VPBROADCASTQ xmm, ymm{k}{z} [AVX512F,AVX512VL]
  64188. // * VPBROADCASTQ m64, xmm{k}{z} [AVX512F,AVX512VL]
  64189. // * VPBROADCASTQ m64, ymm{k}{z} [AVX512F,AVX512VL]
  64190. //
  64191. func (self *Program) VPBROADCASTQ(v0 interface{}, v1 interface{}) *Instruction {
  64192. p := self.alloc("VPBROADCASTQ", 2, Operands { v0, v1 })
  64193. // VPBROADCASTQ xmm, xmm
  64194. if isXMM(v0) && isXMM(v1) {
  64195. self.require(ISA_AVX2)
  64196. p.domain = DomainAVX
  64197. p.add(0, func(m *_Encoding, v []interface{}) {
  64198. m.emit(0xc4)
  64199. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  64200. m.emit(0x79)
  64201. m.emit(0x59)
  64202. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64203. })
  64204. }
  64205. // VPBROADCASTQ m64, xmm
  64206. if isM64(v0) && isXMM(v1) {
  64207. self.require(ISA_AVX2)
  64208. p.domain = DomainAVX
  64209. p.add(0, func(m *_Encoding, v []interface{}) {
  64210. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  64211. m.emit(0x59)
  64212. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  64213. })
  64214. }
  64215. // VPBROADCASTQ xmm, ymm
  64216. if isXMM(v0) && isYMM(v1) {
  64217. self.require(ISA_AVX2)
  64218. p.domain = DomainAVX
  64219. p.add(0, func(m *_Encoding, v []interface{}) {
  64220. m.emit(0xc4)
  64221. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  64222. m.emit(0x7d)
  64223. m.emit(0x59)
  64224. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64225. })
  64226. }
  64227. // VPBROADCASTQ m64, ymm
  64228. if isM64(v0) && isYMM(v1) {
  64229. self.require(ISA_AVX2)
  64230. p.domain = DomainAVX
  64231. p.add(0, func(m *_Encoding, v []interface{}) {
  64232. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  64233. m.emit(0x59)
  64234. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  64235. })
  64236. }
  64237. // VPBROADCASTQ r64, zmm{k}{z}
  64238. if isReg64(v0) && isZMMkz(v1) {
  64239. self.require(ISA_AVX512F)
  64240. p.domain = DomainAVX
  64241. p.add(0, func(m *_Encoding, v []interface{}) {
  64242. m.emit(0x62)
  64243. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  64244. m.emit(0xfd)
  64245. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  64246. m.emit(0x7c)
  64247. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64248. })
  64249. }
  64250. // VPBROADCASTQ xmm, zmm{k}{z}
  64251. if isEVEXXMM(v0) && isZMMkz(v1) {
  64252. self.require(ISA_AVX512F)
  64253. p.domain = DomainAVX
  64254. p.add(0, func(m *_Encoding, v []interface{}) {
  64255. m.emit(0x62)
  64256. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  64257. m.emit(0xfd)
  64258. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  64259. m.emit(0x59)
  64260. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64261. })
  64262. }
  64263. // VPBROADCASTQ m64, zmm{k}{z}
  64264. if isM64(v0) && isZMMkz(v1) {
  64265. self.require(ISA_AVX512F)
  64266. p.domain = DomainAVX
  64267. p.add(0, func(m *_Encoding, v []interface{}) {
  64268. m.evex(0b10, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  64269. m.emit(0x59)
  64270. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  64271. })
  64272. }
  64273. // VPBROADCASTQ r64, xmm{k}{z}
  64274. if isReg64(v0) && isXMMkz(v1) {
  64275. self.require(ISA_AVX512VL | ISA_AVX512F)
  64276. p.domain = DomainAVX
  64277. p.add(0, func(m *_Encoding, v []interface{}) {
  64278. m.emit(0x62)
  64279. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  64280. m.emit(0xfd)
  64281. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  64282. m.emit(0x7c)
  64283. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64284. })
  64285. }
  64286. // VPBROADCASTQ r64, ymm{k}{z}
  64287. if isReg64(v0) && isYMMkz(v1) {
  64288. self.require(ISA_AVX512VL | ISA_AVX512F)
  64289. p.domain = DomainAVX
  64290. p.add(0, func(m *_Encoding, v []interface{}) {
  64291. m.emit(0x62)
  64292. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  64293. m.emit(0xfd)
  64294. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  64295. m.emit(0x7c)
  64296. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64297. })
  64298. }
  64299. // VPBROADCASTQ xmm, xmm{k}{z}
  64300. if isEVEXXMM(v0) && isXMMkz(v1) {
  64301. self.require(ISA_AVX512VL | ISA_AVX512F)
  64302. p.domain = DomainAVX
  64303. p.add(0, func(m *_Encoding, v []interface{}) {
  64304. m.emit(0x62)
  64305. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  64306. m.emit(0xfd)
  64307. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  64308. m.emit(0x59)
  64309. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64310. })
  64311. }
  64312. // VPBROADCASTQ xmm, ymm{k}{z}
  64313. if isEVEXXMM(v0) && isYMMkz(v1) {
  64314. self.require(ISA_AVX512VL | ISA_AVX512F)
  64315. p.domain = DomainAVX
  64316. p.add(0, func(m *_Encoding, v []interface{}) {
  64317. m.emit(0x62)
  64318. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  64319. m.emit(0xfd)
  64320. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  64321. m.emit(0x59)
  64322. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64323. })
  64324. }
  64325. // VPBROADCASTQ m64, xmm{k}{z}
  64326. if isM64(v0) && isXMMkz(v1) {
  64327. self.require(ISA_AVX512VL | ISA_AVX512F)
  64328. p.domain = DomainAVX
  64329. p.add(0, func(m *_Encoding, v []interface{}) {
  64330. m.evex(0b10, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  64331. m.emit(0x59)
  64332. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  64333. })
  64334. }
  64335. // VPBROADCASTQ m64, ymm{k}{z}
  64336. if isM64(v0) && isYMMkz(v1) {
  64337. self.require(ISA_AVX512VL | ISA_AVX512F)
  64338. p.domain = DomainAVX
  64339. p.add(0, func(m *_Encoding, v []interface{}) {
  64340. m.evex(0b10, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  64341. m.emit(0x59)
  64342. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  64343. })
  64344. }
  64345. if p.len == 0 {
  64346. panic("invalid operands for VPBROADCASTQ")
  64347. }
  64348. return p
  64349. }
  64350. // VPBROADCASTW performs "Broadcast Word Integer".
  64351. //
  64352. // Mnemonic : VPBROADCASTW
  64353. // Supported forms : (13 forms)
  64354. //
  64355. // * VPBROADCASTW xmm, xmm [AVX2]
  64356. // * VPBROADCASTW m16, xmm [AVX2]
  64357. // * VPBROADCASTW xmm, ymm [AVX2]
  64358. // * VPBROADCASTW m16, ymm [AVX2]
  64359. // * VPBROADCASTW r32, zmm{k}{z} [AVX512BW]
  64360. // * VPBROADCASTW xmm, zmm{k}{z} [AVX512BW]
  64361. // * VPBROADCASTW m16, zmm{k}{z} [AVX512BW]
  64362. // * VPBROADCASTW r32, xmm{k}{z} [AVX512BW,AVX512VL]
  64363. // * VPBROADCASTW r32, ymm{k}{z} [AVX512BW,AVX512VL]
  64364. // * VPBROADCASTW xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  64365. // * VPBROADCASTW xmm, ymm{k}{z} [AVX512BW,AVX512VL]
  64366. // * VPBROADCASTW m16, xmm{k}{z} [AVX512BW,AVX512VL]
  64367. // * VPBROADCASTW m16, ymm{k}{z} [AVX512BW,AVX512VL]
  64368. //
  64369. func (self *Program) VPBROADCASTW(v0 interface{}, v1 interface{}) *Instruction {
  64370. p := self.alloc("VPBROADCASTW", 2, Operands { v0, v1 })
  64371. // VPBROADCASTW xmm, xmm
  64372. if isXMM(v0) && isXMM(v1) {
  64373. self.require(ISA_AVX2)
  64374. p.domain = DomainAVX
  64375. p.add(0, func(m *_Encoding, v []interface{}) {
  64376. m.emit(0xc4)
  64377. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  64378. m.emit(0x79)
  64379. m.emit(0x79)
  64380. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64381. })
  64382. }
  64383. // VPBROADCASTW m16, xmm
  64384. if isM16(v0) && isXMM(v1) {
  64385. self.require(ISA_AVX2)
  64386. p.domain = DomainAVX
  64387. p.add(0, func(m *_Encoding, v []interface{}) {
  64388. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  64389. m.emit(0x79)
  64390. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  64391. })
  64392. }
  64393. // VPBROADCASTW xmm, ymm
  64394. if isXMM(v0) && isYMM(v1) {
  64395. self.require(ISA_AVX2)
  64396. p.domain = DomainAVX
  64397. p.add(0, func(m *_Encoding, v []interface{}) {
  64398. m.emit(0xc4)
  64399. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  64400. m.emit(0x7d)
  64401. m.emit(0x79)
  64402. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64403. })
  64404. }
  64405. // VPBROADCASTW m16, ymm
  64406. if isM16(v0) && isYMM(v1) {
  64407. self.require(ISA_AVX2)
  64408. p.domain = DomainAVX
  64409. p.add(0, func(m *_Encoding, v []interface{}) {
  64410. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  64411. m.emit(0x79)
  64412. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  64413. })
  64414. }
  64415. // VPBROADCASTW r32, zmm{k}{z}
  64416. if isReg32(v0) && isZMMkz(v1) {
  64417. self.require(ISA_AVX512BW)
  64418. p.domain = DomainAVX
  64419. p.add(0, func(m *_Encoding, v []interface{}) {
  64420. m.emit(0x62)
  64421. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  64422. m.emit(0x7d)
  64423. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  64424. m.emit(0x7b)
  64425. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64426. })
  64427. }
  64428. // VPBROADCASTW xmm, zmm{k}{z}
  64429. if isEVEXXMM(v0) && isZMMkz(v1) {
  64430. self.require(ISA_AVX512BW)
  64431. p.domain = DomainAVX
  64432. p.add(0, func(m *_Encoding, v []interface{}) {
  64433. m.emit(0x62)
  64434. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  64435. m.emit(0x7d)
  64436. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  64437. m.emit(0x79)
  64438. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64439. })
  64440. }
  64441. // VPBROADCASTW m16, zmm{k}{z}
  64442. if isM16(v0) && isZMMkz(v1) {
  64443. self.require(ISA_AVX512BW)
  64444. p.domain = DomainAVX
  64445. p.add(0, func(m *_Encoding, v []interface{}) {
  64446. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  64447. m.emit(0x79)
  64448. m.mrsd(lcode(v[1]), addr(v[0]), 2)
  64449. })
  64450. }
  64451. // VPBROADCASTW r32, xmm{k}{z}
  64452. if isReg32(v0) && isXMMkz(v1) {
  64453. self.require(ISA_AVX512VL | ISA_AVX512BW)
  64454. p.domain = DomainAVX
  64455. p.add(0, func(m *_Encoding, v []interface{}) {
  64456. m.emit(0x62)
  64457. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  64458. m.emit(0x7d)
  64459. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  64460. m.emit(0x7b)
  64461. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64462. })
  64463. }
  64464. // VPBROADCASTW r32, ymm{k}{z}
  64465. if isReg32(v0) && isYMMkz(v1) {
  64466. self.require(ISA_AVX512VL | ISA_AVX512BW)
  64467. p.domain = DomainAVX
  64468. p.add(0, func(m *_Encoding, v []interface{}) {
  64469. m.emit(0x62)
  64470. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  64471. m.emit(0x7d)
  64472. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  64473. m.emit(0x7b)
  64474. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64475. })
  64476. }
  64477. // VPBROADCASTW xmm, xmm{k}{z}
  64478. if isEVEXXMM(v0) && isXMMkz(v1) {
  64479. self.require(ISA_AVX512VL | ISA_AVX512BW)
  64480. p.domain = DomainAVX
  64481. p.add(0, func(m *_Encoding, v []interface{}) {
  64482. m.emit(0x62)
  64483. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  64484. m.emit(0x7d)
  64485. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  64486. m.emit(0x79)
  64487. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64488. })
  64489. }
  64490. // VPBROADCASTW xmm, ymm{k}{z}
  64491. if isEVEXXMM(v0) && isYMMkz(v1) {
  64492. self.require(ISA_AVX512VL | ISA_AVX512BW)
  64493. p.domain = DomainAVX
  64494. p.add(0, func(m *_Encoding, v []interface{}) {
  64495. m.emit(0x62)
  64496. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  64497. m.emit(0x7d)
  64498. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  64499. m.emit(0x79)
  64500. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  64501. })
  64502. }
  64503. // VPBROADCASTW m16, xmm{k}{z}
  64504. if isM16(v0) && isXMMkz(v1) {
  64505. self.require(ISA_AVX512VL | ISA_AVX512BW)
  64506. p.domain = DomainAVX
  64507. p.add(0, func(m *_Encoding, v []interface{}) {
  64508. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  64509. m.emit(0x79)
  64510. m.mrsd(lcode(v[1]), addr(v[0]), 2)
  64511. })
  64512. }
  64513. // VPBROADCASTW m16, ymm{k}{z}
  64514. if isM16(v0) && isYMMkz(v1) {
  64515. self.require(ISA_AVX512VL | ISA_AVX512BW)
  64516. p.domain = DomainAVX
  64517. p.add(0, func(m *_Encoding, v []interface{}) {
  64518. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  64519. m.emit(0x79)
  64520. m.mrsd(lcode(v[1]), addr(v[0]), 2)
  64521. })
  64522. }
  64523. if p.len == 0 {
  64524. panic("invalid operands for VPBROADCASTW")
  64525. }
  64526. return p
  64527. }
  64528. // VPCLMULQDQ performs "Carry-Less Quadword Multiplication".
  64529. //
  64530. // Mnemonic : VPCLMULQDQ
  64531. // Supported forms : (2 forms)
  64532. //
  64533. // * VPCLMULQDQ imm8, xmm, xmm, xmm [AVX,PCLMULQDQ]
  64534. // * VPCLMULQDQ imm8, m128, xmm, xmm [AVX,PCLMULQDQ]
  64535. //
  64536. func (self *Program) VPCLMULQDQ(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  64537. p := self.alloc("VPCLMULQDQ", 4, Operands { v0, v1, v2, v3 })
  64538. // VPCLMULQDQ imm8, xmm, xmm, xmm
  64539. if isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  64540. self.require(ISA_AVX | ISA_PCLMULQDQ)
  64541. p.domain = DomainCrypto
  64542. p.add(0, func(m *_Encoding, v []interface{}) {
  64543. m.emit(0xc4)
  64544. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  64545. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  64546. m.emit(0x44)
  64547. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  64548. m.imm1(toImmAny(v[0]))
  64549. })
  64550. }
  64551. // VPCLMULQDQ imm8, m128, xmm, xmm
  64552. if isImm8(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  64553. self.require(ISA_AVX | ISA_PCLMULQDQ)
  64554. p.domain = DomainCrypto
  64555. p.add(0, func(m *_Encoding, v []interface{}) {
  64556. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  64557. m.emit(0x44)
  64558. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  64559. m.imm1(toImmAny(v[0]))
  64560. })
  64561. }
  64562. if p.len == 0 {
  64563. panic("invalid operands for VPCLMULQDQ")
  64564. }
  64565. return p
  64566. }
  64567. // VPCMOV performs "Packed Conditional Move".
  64568. //
  64569. // Mnemonic : VPCMOV
  64570. // Supported forms : (6 forms)
  64571. //
  64572. // * VPCMOV xmm, xmm, xmm, xmm [XOP]
  64573. // * VPCMOV m128, xmm, xmm, xmm [XOP]
  64574. // * VPCMOV xmm, m128, xmm, xmm [XOP]
  64575. // * VPCMOV ymm, ymm, ymm, ymm [XOP]
  64576. // * VPCMOV m256, ymm, ymm, ymm [XOP]
  64577. // * VPCMOV ymm, m256, ymm, ymm [XOP]
  64578. //
  64579. func (self *Program) VPCMOV(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  64580. p := self.alloc("VPCMOV", 4, Operands { v0, v1, v2, v3 })
  64581. // VPCMOV xmm, xmm, xmm, xmm
  64582. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  64583. self.require(ISA_XOP)
  64584. p.domain = DomainAMDSpecific
  64585. p.add(0, func(m *_Encoding, v []interface{}) {
  64586. m.emit(0x8f)
  64587. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  64588. m.emit(0x78 ^ (hlcode(v[2]) << 3))
  64589. m.emit(0xa2)
  64590. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  64591. m.emit(hlcode(v[0]) << 4)
  64592. })
  64593. p.add(0, func(m *_Encoding, v []interface{}) {
  64594. m.emit(0x8f)
  64595. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  64596. m.emit(0xf8 ^ (hlcode(v[2]) << 3))
  64597. m.emit(0xa2)
  64598. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  64599. m.emit(hlcode(v[1]) << 4)
  64600. })
  64601. }
  64602. // VPCMOV m128, xmm, xmm, xmm
  64603. if isM128(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  64604. self.require(ISA_XOP)
  64605. p.domain = DomainAMDSpecific
  64606. p.add(0, func(m *_Encoding, v []interface{}) {
  64607. m.vex3(0x8f, 0b1000, 0x80, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  64608. m.emit(0xa2)
  64609. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  64610. m.emit(hlcode(v[1]) << 4)
  64611. })
  64612. }
  64613. // VPCMOV xmm, m128, xmm, xmm
  64614. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  64615. self.require(ISA_XOP)
  64616. p.domain = DomainAMDSpecific
  64617. p.add(0, func(m *_Encoding, v []interface{}) {
  64618. m.vex3(0x8f, 0b1000, 0x00, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  64619. m.emit(0xa2)
  64620. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  64621. m.emit(hlcode(v[0]) << 4)
  64622. })
  64623. }
  64624. // VPCMOV ymm, ymm, ymm, ymm
  64625. if isYMM(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  64626. self.require(ISA_XOP)
  64627. p.domain = DomainAMDSpecific
  64628. p.add(0, func(m *_Encoding, v []interface{}) {
  64629. m.emit(0x8f)
  64630. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  64631. m.emit(0x7c ^ (hlcode(v[2]) << 3))
  64632. m.emit(0xa2)
  64633. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  64634. m.emit(hlcode(v[0]) << 4)
  64635. })
  64636. p.add(0, func(m *_Encoding, v []interface{}) {
  64637. m.emit(0x8f)
  64638. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  64639. m.emit(0xfc ^ (hlcode(v[2]) << 3))
  64640. m.emit(0xa2)
  64641. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  64642. m.emit(hlcode(v[1]) << 4)
  64643. })
  64644. }
  64645. // VPCMOV m256, ymm, ymm, ymm
  64646. if isM256(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  64647. self.require(ISA_XOP)
  64648. p.domain = DomainAMDSpecific
  64649. p.add(0, func(m *_Encoding, v []interface{}) {
  64650. m.vex3(0x8f, 0b1000, 0x84, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  64651. m.emit(0xa2)
  64652. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  64653. m.emit(hlcode(v[1]) << 4)
  64654. })
  64655. }
  64656. // VPCMOV ymm, m256, ymm, ymm
  64657. if isYMM(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  64658. self.require(ISA_XOP)
  64659. p.domain = DomainAMDSpecific
  64660. p.add(0, func(m *_Encoding, v []interface{}) {
  64661. m.vex3(0x8f, 0b1000, 0x04, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  64662. m.emit(0xa2)
  64663. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  64664. m.emit(hlcode(v[0]) << 4)
  64665. })
  64666. }
  64667. if p.len == 0 {
  64668. panic("invalid operands for VPCMOV")
  64669. }
  64670. return p
  64671. }
  64672. // VPCMPB performs "Compare Packed Signed Byte Values".
  64673. //
  64674. // Mnemonic : VPCMPB
  64675. // Supported forms : (6 forms)
  64676. //
  64677. // * VPCMPB imm8, zmm, zmm, k{k} [AVX512BW]
  64678. // * VPCMPB imm8, m512, zmm, k{k} [AVX512BW]
  64679. // * VPCMPB imm8, xmm, xmm, k{k} [AVX512BW,AVX512VL]
  64680. // * VPCMPB imm8, m128, xmm, k{k} [AVX512BW,AVX512VL]
  64681. // * VPCMPB imm8, ymm, ymm, k{k} [AVX512BW,AVX512VL]
  64682. // * VPCMPB imm8, m256, ymm, k{k} [AVX512BW,AVX512VL]
  64683. //
  64684. func (self *Program) VPCMPB(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  64685. p := self.alloc("VPCMPB", 4, Operands { v0, v1, v2, v3 })
  64686. // VPCMPB imm8, zmm, zmm, k{k}
  64687. if isImm8(v0) && isZMM(v1) && isZMM(v2) && isKk(v3) {
  64688. self.require(ISA_AVX512BW)
  64689. p.domain = DomainAVX
  64690. p.add(0, func(m *_Encoding, v []interface{}) {
  64691. m.emit(0x62)
  64692. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  64693. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  64694. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  64695. m.emit(0x3f)
  64696. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  64697. m.imm1(toImmAny(v[0]))
  64698. })
  64699. }
  64700. // VPCMPB imm8, m512, zmm, k{k}
  64701. if isImm8(v0) && isM512(v1) && isZMM(v2) && isKk(v3) {
  64702. self.require(ISA_AVX512BW)
  64703. p.domain = DomainAVX
  64704. p.add(0, func(m *_Encoding, v []interface{}) {
  64705. m.evex(0b11, 0x05, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, 0)
  64706. m.emit(0x3f)
  64707. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  64708. m.imm1(toImmAny(v[0]))
  64709. })
  64710. }
  64711. // VPCMPB imm8, xmm, xmm, k{k}
  64712. if isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isKk(v3) {
  64713. self.require(ISA_AVX512VL | ISA_AVX512BW)
  64714. p.domain = DomainAVX
  64715. p.add(0, func(m *_Encoding, v []interface{}) {
  64716. m.emit(0x62)
  64717. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  64718. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  64719. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  64720. m.emit(0x3f)
  64721. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  64722. m.imm1(toImmAny(v[0]))
  64723. })
  64724. }
  64725. // VPCMPB imm8, m128, xmm, k{k}
  64726. if isImm8(v0) && isM128(v1) && isEVEXXMM(v2) && isKk(v3) {
  64727. self.require(ISA_AVX512VL | ISA_AVX512BW)
  64728. p.domain = DomainAVX
  64729. p.add(0, func(m *_Encoding, v []interface{}) {
  64730. m.evex(0b11, 0x05, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, 0)
  64731. m.emit(0x3f)
  64732. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  64733. m.imm1(toImmAny(v[0]))
  64734. })
  64735. }
  64736. // VPCMPB imm8, ymm, ymm, k{k}
  64737. if isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isKk(v3) {
  64738. self.require(ISA_AVX512VL | ISA_AVX512BW)
  64739. p.domain = DomainAVX
  64740. p.add(0, func(m *_Encoding, v []interface{}) {
  64741. m.emit(0x62)
  64742. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  64743. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  64744. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  64745. m.emit(0x3f)
  64746. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  64747. m.imm1(toImmAny(v[0]))
  64748. })
  64749. }
  64750. // VPCMPB imm8, m256, ymm, k{k}
  64751. if isImm8(v0) && isM256(v1) && isEVEXYMM(v2) && isKk(v3) {
  64752. self.require(ISA_AVX512VL | ISA_AVX512BW)
  64753. p.domain = DomainAVX
  64754. p.add(0, func(m *_Encoding, v []interface{}) {
  64755. m.evex(0b11, 0x05, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, 0)
  64756. m.emit(0x3f)
  64757. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  64758. m.imm1(toImmAny(v[0]))
  64759. })
  64760. }
  64761. if p.len == 0 {
  64762. panic("invalid operands for VPCMPB")
  64763. }
  64764. return p
  64765. }
  64766. // VPCMPD performs "Compare Packed Signed Doubleword Values".
  64767. //
  64768. // Mnemonic : VPCMPD
  64769. // Supported forms : (6 forms)
  64770. //
  64771. // * VPCMPD imm8, m512/m32bcst, zmm, k{k} [AVX512F]
  64772. // * VPCMPD imm8, zmm, zmm, k{k} [AVX512F]
  64773. // * VPCMPD imm8, m128/m32bcst, xmm, k{k} [AVX512F,AVX512VL]
  64774. // * VPCMPD imm8, xmm, xmm, k{k} [AVX512F,AVX512VL]
  64775. // * VPCMPD imm8, m256/m32bcst, ymm, k{k} [AVX512F,AVX512VL]
  64776. // * VPCMPD imm8, ymm, ymm, k{k} [AVX512F,AVX512VL]
  64777. //
  64778. func (self *Program) VPCMPD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  64779. p := self.alloc("VPCMPD", 4, Operands { v0, v1, v2, v3 })
  64780. // VPCMPD imm8, m512/m32bcst, zmm, k{k}
  64781. if isImm8(v0) && isM512M32bcst(v1) && isZMM(v2) && isKk(v3) {
  64782. self.require(ISA_AVX512F)
  64783. p.domain = DomainAVX
  64784. p.add(0, func(m *_Encoding, v []interface{}) {
  64785. m.evex(0b11, 0x05, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, bcode(v[1]))
  64786. m.emit(0x1f)
  64787. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  64788. m.imm1(toImmAny(v[0]))
  64789. })
  64790. }
  64791. // VPCMPD imm8, zmm, zmm, k{k}
  64792. if isImm8(v0) && isZMM(v1) && isZMM(v2) && isKk(v3) {
  64793. self.require(ISA_AVX512F)
  64794. p.domain = DomainAVX
  64795. p.add(0, func(m *_Encoding, v []interface{}) {
  64796. m.emit(0x62)
  64797. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  64798. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  64799. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  64800. m.emit(0x1f)
  64801. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  64802. m.imm1(toImmAny(v[0]))
  64803. })
  64804. }
  64805. // VPCMPD imm8, m128/m32bcst, xmm, k{k}
  64806. if isImm8(v0) && isM128M32bcst(v1) && isEVEXXMM(v2) && isKk(v3) {
  64807. self.require(ISA_AVX512VL | ISA_AVX512F)
  64808. p.domain = DomainAVX
  64809. p.add(0, func(m *_Encoding, v []interface{}) {
  64810. m.evex(0b11, 0x05, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, bcode(v[1]))
  64811. m.emit(0x1f)
  64812. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  64813. m.imm1(toImmAny(v[0]))
  64814. })
  64815. }
  64816. // VPCMPD imm8, xmm, xmm, k{k}
  64817. if isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isKk(v3) {
  64818. self.require(ISA_AVX512VL | ISA_AVX512F)
  64819. p.domain = DomainAVX
  64820. p.add(0, func(m *_Encoding, v []interface{}) {
  64821. m.emit(0x62)
  64822. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  64823. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  64824. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  64825. m.emit(0x1f)
  64826. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  64827. m.imm1(toImmAny(v[0]))
  64828. })
  64829. }
  64830. // VPCMPD imm8, m256/m32bcst, ymm, k{k}
  64831. if isImm8(v0) && isM256M32bcst(v1) && isEVEXYMM(v2) && isKk(v3) {
  64832. self.require(ISA_AVX512VL | ISA_AVX512F)
  64833. p.domain = DomainAVX
  64834. p.add(0, func(m *_Encoding, v []interface{}) {
  64835. m.evex(0b11, 0x05, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, bcode(v[1]))
  64836. m.emit(0x1f)
  64837. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  64838. m.imm1(toImmAny(v[0]))
  64839. })
  64840. }
  64841. // VPCMPD imm8, ymm, ymm, k{k}
  64842. if isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isKk(v3) {
  64843. self.require(ISA_AVX512VL | ISA_AVX512F)
  64844. p.domain = DomainAVX
  64845. p.add(0, func(m *_Encoding, v []interface{}) {
  64846. m.emit(0x62)
  64847. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  64848. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  64849. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  64850. m.emit(0x1f)
  64851. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  64852. m.imm1(toImmAny(v[0]))
  64853. })
  64854. }
  64855. if p.len == 0 {
  64856. panic("invalid operands for VPCMPD")
  64857. }
  64858. return p
  64859. }
  64860. // VPCMPEQB performs "Compare Packed Byte Data for Equality".
  64861. //
  64862. // Mnemonic : VPCMPEQB
  64863. // Supported forms : (10 forms)
  64864. //
  64865. // * VPCMPEQB xmm, xmm, xmm [AVX]
  64866. // * VPCMPEQB m128, xmm, xmm [AVX]
  64867. // * VPCMPEQB ymm, ymm, ymm [AVX2]
  64868. // * VPCMPEQB m256, ymm, ymm [AVX2]
  64869. // * VPCMPEQB zmm, zmm, k{k} [AVX512BW]
  64870. // * VPCMPEQB m512, zmm, k{k} [AVX512BW]
  64871. // * VPCMPEQB xmm, xmm, k{k} [AVX512BW,AVX512VL]
  64872. // * VPCMPEQB m128, xmm, k{k} [AVX512BW,AVX512VL]
  64873. // * VPCMPEQB ymm, ymm, k{k} [AVX512BW,AVX512VL]
  64874. // * VPCMPEQB m256, ymm, k{k} [AVX512BW,AVX512VL]
  64875. //
  64876. func (self *Program) VPCMPEQB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  64877. p := self.alloc("VPCMPEQB", 3, Operands { v0, v1, v2 })
  64878. // VPCMPEQB xmm, xmm, xmm
  64879. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  64880. self.require(ISA_AVX)
  64881. p.domain = DomainAVX
  64882. p.add(0, func(m *_Encoding, v []interface{}) {
  64883. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  64884. m.emit(0x74)
  64885. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  64886. })
  64887. }
  64888. // VPCMPEQB m128, xmm, xmm
  64889. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  64890. self.require(ISA_AVX)
  64891. p.domain = DomainAVX
  64892. p.add(0, func(m *_Encoding, v []interface{}) {
  64893. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  64894. m.emit(0x74)
  64895. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  64896. })
  64897. }
  64898. // VPCMPEQB ymm, ymm, ymm
  64899. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  64900. self.require(ISA_AVX2)
  64901. p.domain = DomainAVX
  64902. p.add(0, func(m *_Encoding, v []interface{}) {
  64903. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  64904. m.emit(0x74)
  64905. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  64906. })
  64907. }
  64908. // VPCMPEQB m256, ymm, ymm
  64909. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  64910. self.require(ISA_AVX2)
  64911. p.domain = DomainAVX
  64912. p.add(0, func(m *_Encoding, v []interface{}) {
  64913. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  64914. m.emit(0x74)
  64915. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  64916. })
  64917. }
  64918. // VPCMPEQB zmm, zmm, k{k}
  64919. if isZMM(v0) && isZMM(v1) && isKk(v2) {
  64920. self.require(ISA_AVX512BW)
  64921. p.domain = DomainAVX
  64922. p.add(0, func(m *_Encoding, v []interface{}) {
  64923. m.emit(0x62)
  64924. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  64925. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  64926. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  64927. m.emit(0x74)
  64928. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  64929. })
  64930. }
  64931. // VPCMPEQB m512, zmm, k{k}
  64932. if isM512(v0) && isZMM(v1) && isKk(v2) {
  64933. self.require(ISA_AVX512BW)
  64934. p.domain = DomainAVX
  64935. p.add(0, func(m *_Encoding, v []interface{}) {
  64936. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  64937. m.emit(0x74)
  64938. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  64939. })
  64940. }
  64941. // VPCMPEQB xmm, xmm, k{k}
  64942. if isEVEXXMM(v0) && isEVEXXMM(v1) && isKk(v2) {
  64943. self.require(ISA_AVX512VL | ISA_AVX512BW)
  64944. p.domain = DomainAVX
  64945. p.add(0, func(m *_Encoding, v []interface{}) {
  64946. m.emit(0x62)
  64947. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  64948. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  64949. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  64950. m.emit(0x74)
  64951. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  64952. })
  64953. }
  64954. // VPCMPEQB m128, xmm, k{k}
  64955. if isM128(v0) && isEVEXXMM(v1) && isKk(v2) {
  64956. self.require(ISA_AVX512VL | ISA_AVX512BW)
  64957. p.domain = DomainAVX
  64958. p.add(0, func(m *_Encoding, v []interface{}) {
  64959. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  64960. m.emit(0x74)
  64961. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  64962. })
  64963. }
  64964. // VPCMPEQB ymm, ymm, k{k}
  64965. if isEVEXYMM(v0) && isEVEXYMM(v1) && isKk(v2) {
  64966. self.require(ISA_AVX512VL | ISA_AVX512BW)
  64967. p.domain = DomainAVX
  64968. p.add(0, func(m *_Encoding, v []interface{}) {
  64969. m.emit(0x62)
  64970. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  64971. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  64972. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  64973. m.emit(0x74)
  64974. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  64975. })
  64976. }
  64977. // VPCMPEQB m256, ymm, k{k}
  64978. if isM256(v0) && isEVEXYMM(v1) && isKk(v2) {
  64979. self.require(ISA_AVX512VL | ISA_AVX512BW)
  64980. p.domain = DomainAVX
  64981. p.add(0, func(m *_Encoding, v []interface{}) {
  64982. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  64983. m.emit(0x74)
  64984. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  64985. })
  64986. }
  64987. if p.len == 0 {
  64988. panic("invalid operands for VPCMPEQB")
  64989. }
  64990. return p
  64991. }
  64992. // VPCMPEQD performs "Compare Packed Doubleword Data for Equality".
  64993. //
  64994. // Mnemonic : VPCMPEQD
  64995. // Supported forms : (10 forms)
  64996. //
  64997. // * VPCMPEQD xmm, xmm, xmm [AVX]
  64998. // * VPCMPEQD m128, xmm, xmm [AVX]
  64999. // * VPCMPEQD ymm, ymm, ymm [AVX2]
  65000. // * VPCMPEQD m256, ymm, ymm [AVX2]
  65001. // * VPCMPEQD m512/m32bcst, zmm, k{k} [AVX512F]
  65002. // * VPCMPEQD zmm, zmm, k{k} [AVX512F]
  65003. // * VPCMPEQD m128/m32bcst, xmm, k{k} [AVX512F,AVX512VL]
  65004. // * VPCMPEQD xmm, xmm, k{k} [AVX512F,AVX512VL]
  65005. // * VPCMPEQD m256/m32bcst, ymm, k{k} [AVX512F,AVX512VL]
  65006. // * VPCMPEQD ymm, ymm, k{k} [AVX512F,AVX512VL]
  65007. //
  65008. func (self *Program) VPCMPEQD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  65009. p := self.alloc("VPCMPEQD", 3, Operands { v0, v1, v2 })
  65010. // VPCMPEQD xmm, xmm, xmm
  65011. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  65012. self.require(ISA_AVX)
  65013. p.domain = DomainAVX
  65014. p.add(0, func(m *_Encoding, v []interface{}) {
  65015. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  65016. m.emit(0x76)
  65017. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65018. })
  65019. }
  65020. // VPCMPEQD m128, xmm, xmm
  65021. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  65022. self.require(ISA_AVX)
  65023. p.domain = DomainAVX
  65024. p.add(0, func(m *_Encoding, v []interface{}) {
  65025. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  65026. m.emit(0x76)
  65027. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  65028. })
  65029. }
  65030. // VPCMPEQD ymm, ymm, ymm
  65031. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  65032. self.require(ISA_AVX2)
  65033. p.domain = DomainAVX
  65034. p.add(0, func(m *_Encoding, v []interface{}) {
  65035. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  65036. m.emit(0x76)
  65037. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65038. })
  65039. }
  65040. // VPCMPEQD m256, ymm, ymm
  65041. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  65042. self.require(ISA_AVX2)
  65043. p.domain = DomainAVX
  65044. p.add(0, func(m *_Encoding, v []interface{}) {
  65045. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  65046. m.emit(0x76)
  65047. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  65048. })
  65049. }
  65050. // VPCMPEQD m512/m32bcst, zmm, k{k}
  65051. if isM512M32bcst(v0) && isZMM(v1) && isKk(v2) {
  65052. self.require(ISA_AVX512F)
  65053. p.domain = DomainAVX
  65054. p.add(0, func(m *_Encoding, v []interface{}) {
  65055. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  65056. m.emit(0x76)
  65057. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  65058. })
  65059. }
  65060. // VPCMPEQD zmm, zmm, k{k}
  65061. if isZMM(v0) && isZMM(v1) && isKk(v2) {
  65062. self.require(ISA_AVX512F)
  65063. p.domain = DomainAVX
  65064. p.add(0, func(m *_Encoding, v []interface{}) {
  65065. m.emit(0x62)
  65066. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  65067. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  65068. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  65069. m.emit(0x76)
  65070. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65071. })
  65072. }
  65073. // VPCMPEQD m128/m32bcst, xmm, k{k}
  65074. if isM128M32bcst(v0) && isEVEXXMM(v1) && isKk(v2) {
  65075. self.require(ISA_AVX512VL | ISA_AVX512F)
  65076. p.domain = DomainAVX
  65077. p.add(0, func(m *_Encoding, v []interface{}) {
  65078. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  65079. m.emit(0x76)
  65080. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  65081. })
  65082. }
  65083. // VPCMPEQD xmm, xmm, k{k}
  65084. if isEVEXXMM(v0) && isEVEXXMM(v1) && isKk(v2) {
  65085. self.require(ISA_AVX512VL | ISA_AVX512F)
  65086. p.domain = DomainAVX
  65087. p.add(0, func(m *_Encoding, v []interface{}) {
  65088. m.emit(0x62)
  65089. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  65090. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  65091. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  65092. m.emit(0x76)
  65093. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65094. })
  65095. }
  65096. // VPCMPEQD m256/m32bcst, ymm, k{k}
  65097. if isM256M32bcst(v0) && isEVEXYMM(v1) && isKk(v2) {
  65098. self.require(ISA_AVX512VL | ISA_AVX512F)
  65099. p.domain = DomainAVX
  65100. p.add(0, func(m *_Encoding, v []interface{}) {
  65101. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  65102. m.emit(0x76)
  65103. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  65104. })
  65105. }
  65106. // VPCMPEQD ymm, ymm, k{k}
  65107. if isEVEXYMM(v0) && isEVEXYMM(v1) && isKk(v2) {
  65108. self.require(ISA_AVX512VL | ISA_AVX512F)
  65109. p.domain = DomainAVX
  65110. p.add(0, func(m *_Encoding, v []interface{}) {
  65111. m.emit(0x62)
  65112. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  65113. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  65114. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  65115. m.emit(0x76)
  65116. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65117. })
  65118. }
  65119. if p.len == 0 {
  65120. panic("invalid operands for VPCMPEQD")
  65121. }
  65122. return p
  65123. }
  65124. // VPCMPEQQ performs "Compare Packed Quadword Data for Equality".
  65125. //
  65126. // Mnemonic : VPCMPEQQ
  65127. // Supported forms : (10 forms)
  65128. //
  65129. // * VPCMPEQQ xmm, xmm, xmm [AVX]
  65130. // * VPCMPEQQ m128, xmm, xmm [AVX]
  65131. // * VPCMPEQQ ymm, ymm, ymm [AVX2]
  65132. // * VPCMPEQQ m256, ymm, ymm [AVX2]
  65133. // * VPCMPEQQ m512/m64bcst, zmm, k{k} [AVX512F]
  65134. // * VPCMPEQQ zmm, zmm, k{k} [AVX512F]
  65135. // * VPCMPEQQ m128/m64bcst, xmm, k{k} [AVX512F,AVX512VL]
  65136. // * VPCMPEQQ xmm, xmm, k{k} [AVX512F,AVX512VL]
  65137. // * VPCMPEQQ m256/m64bcst, ymm, k{k} [AVX512F,AVX512VL]
  65138. // * VPCMPEQQ ymm, ymm, k{k} [AVX512F,AVX512VL]
  65139. //
  65140. func (self *Program) VPCMPEQQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  65141. p := self.alloc("VPCMPEQQ", 3, Operands { v0, v1, v2 })
  65142. // VPCMPEQQ xmm, xmm, xmm
  65143. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  65144. self.require(ISA_AVX)
  65145. p.domain = DomainAVX
  65146. p.add(0, func(m *_Encoding, v []interface{}) {
  65147. m.emit(0xc4)
  65148. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  65149. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  65150. m.emit(0x29)
  65151. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65152. })
  65153. }
  65154. // VPCMPEQQ m128, xmm, xmm
  65155. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  65156. self.require(ISA_AVX)
  65157. p.domain = DomainAVX
  65158. p.add(0, func(m *_Encoding, v []interface{}) {
  65159. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  65160. m.emit(0x29)
  65161. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  65162. })
  65163. }
  65164. // VPCMPEQQ ymm, ymm, ymm
  65165. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  65166. self.require(ISA_AVX2)
  65167. p.domain = DomainAVX
  65168. p.add(0, func(m *_Encoding, v []interface{}) {
  65169. m.emit(0xc4)
  65170. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  65171. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  65172. m.emit(0x29)
  65173. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65174. })
  65175. }
  65176. // VPCMPEQQ m256, ymm, ymm
  65177. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  65178. self.require(ISA_AVX2)
  65179. p.domain = DomainAVX
  65180. p.add(0, func(m *_Encoding, v []interface{}) {
  65181. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  65182. m.emit(0x29)
  65183. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  65184. })
  65185. }
  65186. // VPCMPEQQ m512/m64bcst, zmm, k{k}
  65187. if isM512M64bcst(v0) && isZMM(v1) && isKk(v2) {
  65188. self.require(ISA_AVX512F)
  65189. p.domain = DomainAVX
  65190. p.add(0, func(m *_Encoding, v []interface{}) {
  65191. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  65192. m.emit(0x29)
  65193. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  65194. })
  65195. }
  65196. // VPCMPEQQ zmm, zmm, k{k}
  65197. if isZMM(v0) && isZMM(v1) && isKk(v2) {
  65198. self.require(ISA_AVX512F)
  65199. p.domain = DomainAVX
  65200. p.add(0, func(m *_Encoding, v []interface{}) {
  65201. m.emit(0x62)
  65202. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  65203. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  65204. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  65205. m.emit(0x29)
  65206. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65207. })
  65208. }
  65209. // VPCMPEQQ m128/m64bcst, xmm, k{k}
  65210. if isM128M64bcst(v0) && isEVEXXMM(v1) && isKk(v2) {
  65211. self.require(ISA_AVX512VL | ISA_AVX512F)
  65212. p.domain = DomainAVX
  65213. p.add(0, func(m *_Encoding, v []interface{}) {
  65214. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  65215. m.emit(0x29)
  65216. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  65217. })
  65218. }
  65219. // VPCMPEQQ xmm, xmm, k{k}
  65220. if isEVEXXMM(v0) && isEVEXXMM(v1) && isKk(v2) {
  65221. self.require(ISA_AVX512VL | ISA_AVX512F)
  65222. p.domain = DomainAVX
  65223. p.add(0, func(m *_Encoding, v []interface{}) {
  65224. m.emit(0x62)
  65225. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  65226. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  65227. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  65228. m.emit(0x29)
  65229. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65230. })
  65231. }
  65232. // VPCMPEQQ m256/m64bcst, ymm, k{k}
  65233. if isM256M64bcst(v0) && isEVEXYMM(v1) && isKk(v2) {
  65234. self.require(ISA_AVX512VL | ISA_AVX512F)
  65235. p.domain = DomainAVX
  65236. p.add(0, func(m *_Encoding, v []interface{}) {
  65237. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  65238. m.emit(0x29)
  65239. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  65240. })
  65241. }
  65242. // VPCMPEQQ ymm, ymm, k{k}
  65243. if isEVEXYMM(v0) && isEVEXYMM(v1) && isKk(v2) {
  65244. self.require(ISA_AVX512VL | ISA_AVX512F)
  65245. p.domain = DomainAVX
  65246. p.add(0, func(m *_Encoding, v []interface{}) {
  65247. m.emit(0x62)
  65248. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  65249. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  65250. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  65251. m.emit(0x29)
  65252. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65253. })
  65254. }
  65255. if p.len == 0 {
  65256. panic("invalid operands for VPCMPEQQ")
  65257. }
  65258. return p
  65259. }
  65260. // VPCMPEQW performs "Compare Packed Word Data for Equality".
  65261. //
  65262. // Mnemonic : VPCMPEQW
  65263. // Supported forms : (10 forms)
  65264. //
  65265. // * VPCMPEQW xmm, xmm, xmm [AVX]
  65266. // * VPCMPEQW m128, xmm, xmm [AVX]
  65267. // * VPCMPEQW ymm, ymm, ymm [AVX2]
  65268. // * VPCMPEQW m256, ymm, ymm [AVX2]
  65269. // * VPCMPEQW zmm, zmm, k{k} [AVX512BW]
  65270. // * VPCMPEQW m512, zmm, k{k} [AVX512BW]
  65271. // * VPCMPEQW xmm, xmm, k{k} [AVX512BW,AVX512VL]
  65272. // * VPCMPEQW m128, xmm, k{k} [AVX512BW,AVX512VL]
  65273. // * VPCMPEQW ymm, ymm, k{k} [AVX512BW,AVX512VL]
  65274. // * VPCMPEQW m256, ymm, k{k} [AVX512BW,AVX512VL]
  65275. //
  65276. func (self *Program) VPCMPEQW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  65277. p := self.alloc("VPCMPEQW", 3, Operands { v0, v1, v2 })
  65278. // VPCMPEQW xmm, xmm, xmm
  65279. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  65280. self.require(ISA_AVX)
  65281. p.domain = DomainAVX
  65282. p.add(0, func(m *_Encoding, v []interface{}) {
  65283. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  65284. m.emit(0x75)
  65285. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65286. })
  65287. }
  65288. // VPCMPEQW m128, xmm, xmm
  65289. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  65290. self.require(ISA_AVX)
  65291. p.domain = DomainAVX
  65292. p.add(0, func(m *_Encoding, v []interface{}) {
  65293. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  65294. m.emit(0x75)
  65295. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  65296. })
  65297. }
  65298. // VPCMPEQW ymm, ymm, ymm
  65299. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  65300. self.require(ISA_AVX2)
  65301. p.domain = DomainAVX
  65302. p.add(0, func(m *_Encoding, v []interface{}) {
  65303. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  65304. m.emit(0x75)
  65305. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65306. })
  65307. }
  65308. // VPCMPEQW m256, ymm, ymm
  65309. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  65310. self.require(ISA_AVX2)
  65311. p.domain = DomainAVX
  65312. p.add(0, func(m *_Encoding, v []interface{}) {
  65313. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  65314. m.emit(0x75)
  65315. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  65316. })
  65317. }
  65318. // VPCMPEQW zmm, zmm, k{k}
  65319. if isZMM(v0) && isZMM(v1) && isKk(v2) {
  65320. self.require(ISA_AVX512BW)
  65321. p.domain = DomainAVX
  65322. p.add(0, func(m *_Encoding, v []interface{}) {
  65323. m.emit(0x62)
  65324. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  65325. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  65326. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  65327. m.emit(0x75)
  65328. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65329. })
  65330. }
  65331. // VPCMPEQW m512, zmm, k{k}
  65332. if isM512(v0) && isZMM(v1) && isKk(v2) {
  65333. self.require(ISA_AVX512BW)
  65334. p.domain = DomainAVX
  65335. p.add(0, func(m *_Encoding, v []interface{}) {
  65336. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  65337. m.emit(0x75)
  65338. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  65339. })
  65340. }
  65341. // VPCMPEQW xmm, xmm, k{k}
  65342. if isEVEXXMM(v0) && isEVEXXMM(v1) && isKk(v2) {
  65343. self.require(ISA_AVX512VL | ISA_AVX512BW)
  65344. p.domain = DomainAVX
  65345. p.add(0, func(m *_Encoding, v []interface{}) {
  65346. m.emit(0x62)
  65347. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  65348. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  65349. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  65350. m.emit(0x75)
  65351. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65352. })
  65353. }
  65354. // VPCMPEQW m128, xmm, k{k}
  65355. if isM128(v0) && isEVEXXMM(v1) && isKk(v2) {
  65356. self.require(ISA_AVX512VL | ISA_AVX512BW)
  65357. p.domain = DomainAVX
  65358. p.add(0, func(m *_Encoding, v []interface{}) {
  65359. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  65360. m.emit(0x75)
  65361. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  65362. })
  65363. }
  65364. // VPCMPEQW ymm, ymm, k{k}
  65365. if isEVEXYMM(v0) && isEVEXYMM(v1) && isKk(v2) {
  65366. self.require(ISA_AVX512VL | ISA_AVX512BW)
  65367. p.domain = DomainAVX
  65368. p.add(0, func(m *_Encoding, v []interface{}) {
  65369. m.emit(0x62)
  65370. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  65371. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  65372. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  65373. m.emit(0x75)
  65374. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65375. })
  65376. }
  65377. // VPCMPEQW m256, ymm, k{k}
  65378. if isM256(v0) && isEVEXYMM(v1) && isKk(v2) {
  65379. self.require(ISA_AVX512VL | ISA_AVX512BW)
  65380. p.domain = DomainAVX
  65381. p.add(0, func(m *_Encoding, v []interface{}) {
  65382. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  65383. m.emit(0x75)
  65384. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  65385. })
  65386. }
  65387. if p.len == 0 {
  65388. panic("invalid operands for VPCMPEQW")
  65389. }
  65390. return p
  65391. }
  65392. // VPCMPESTRI performs "Packed Compare Explicit Length Strings, Return Index".
  65393. //
  65394. // Mnemonic : VPCMPESTRI
  65395. // Supported forms : (2 forms)
  65396. //
  65397. // * VPCMPESTRI imm8, xmm, xmm [AVX]
  65398. // * VPCMPESTRI imm8, m128, xmm [AVX]
  65399. //
  65400. func (self *Program) VPCMPESTRI(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  65401. p := self.alloc("VPCMPESTRI", 3, Operands { v0, v1, v2 })
  65402. // VPCMPESTRI imm8, xmm, xmm
  65403. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  65404. self.require(ISA_AVX)
  65405. p.domain = DomainAVX
  65406. p.add(0, func(m *_Encoding, v []interface{}) {
  65407. m.emit(0xc4)
  65408. m.emit(0xe3 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  65409. m.emit(0x79)
  65410. m.emit(0x61)
  65411. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  65412. m.imm1(toImmAny(v[0]))
  65413. })
  65414. }
  65415. // VPCMPESTRI imm8, m128, xmm
  65416. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  65417. self.require(ISA_AVX)
  65418. p.domain = DomainAVX
  65419. p.add(0, func(m *_Encoding, v []interface{}) {
  65420. m.vex3(0xc4, 0b11, 0x01, hcode(v[2]), addr(v[1]), 0)
  65421. m.emit(0x61)
  65422. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  65423. m.imm1(toImmAny(v[0]))
  65424. })
  65425. }
  65426. if p.len == 0 {
  65427. panic("invalid operands for VPCMPESTRI")
  65428. }
  65429. return p
  65430. }
  65431. // VPCMPESTRM performs "Packed Compare Explicit Length Strings, Return Mask".
  65432. //
  65433. // Mnemonic : VPCMPESTRM
  65434. // Supported forms : (2 forms)
  65435. //
  65436. // * VPCMPESTRM imm8, xmm, xmm [AVX]
  65437. // * VPCMPESTRM imm8, m128, xmm [AVX]
  65438. //
  65439. func (self *Program) VPCMPESTRM(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  65440. p := self.alloc("VPCMPESTRM", 3, Operands { v0, v1, v2 })
  65441. // VPCMPESTRM imm8, xmm, xmm
  65442. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  65443. self.require(ISA_AVX)
  65444. p.domain = DomainAVX
  65445. p.add(0, func(m *_Encoding, v []interface{}) {
  65446. m.emit(0xc4)
  65447. m.emit(0xe3 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  65448. m.emit(0x79)
  65449. m.emit(0x60)
  65450. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  65451. m.imm1(toImmAny(v[0]))
  65452. })
  65453. }
  65454. // VPCMPESTRM imm8, m128, xmm
  65455. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  65456. self.require(ISA_AVX)
  65457. p.domain = DomainAVX
  65458. p.add(0, func(m *_Encoding, v []interface{}) {
  65459. m.vex3(0xc4, 0b11, 0x01, hcode(v[2]), addr(v[1]), 0)
  65460. m.emit(0x60)
  65461. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  65462. m.imm1(toImmAny(v[0]))
  65463. })
  65464. }
  65465. if p.len == 0 {
  65466. panic("invalid operands for VPCMPESTRM")
  65467. }
  65468. return p
  65469. }
  65470. // VPCMPGTB performs "Compare Packed Signed Byte Integers for Greater Than".
  65471. //
  65472. // Mnemonic : VPCMPGTB
  65473. // Supported forms : (10 forms)
  65474. //
  65475. // * VPCMPGTB xmm, xmm, xmm [AVX]
  65476. // * VPCMPGTB m128, xmm, xmm [AVX]
  65477. // * VPCMPGTB ymm, ymm, ymm [AVX2]
  65478. // * VPCMPGTB m256, ymm, ymm [AVX2]
  65479. // * VPCMPGTB zmm, zmm, k{k} [AVX512BW]
  65480. // * VPCMPGTB m512, zmm, k{k} [AVX512BW]
  65481. // * VPCMPGTB xmm, xmm, k{k} [AVX512BW,AVX512VL]
  65482. // * VPCMPGTB m128, xmm, k{k} [AVX512BW,AVX512VL]
  65483. // * VPCMPGTB ymm, ymm, k{k} [AVX512BW,AVX512VL]
  65484. // * VPCMPGTB m256, ymm, k{k} [AVX512BW,AVX512VL]
  65485. //
  65486. func (self *Program) VPCMPGTB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  65487. p := self.alloc("VPCMPGTB", 3, Operands { v0, v1, v2 })
  65488. // VPCMPGTB xmm, xmm, xmm
  65489. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  65490. self.require(ISA_AVX)
  65491. p.domain = DomainAVX
  65492. p.add(0, func(m *_Encoding, v []interface{}) {
  65493. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  65494. m.emit(0x64)
  65495. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65496. })
  65497. }
  65498. // VPCMPGTB m128, xmm, xmm
  65499. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  65500. self.require(ISA_AVX)
  65501. p.domain = DomainAVX
  65502. p.add(0, func(m *_Encoding, v []interface{}) {
  65503. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  65504. m.emit(0x64)
  65505. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  65506. })
  65507. }
  65508. // VPCMPGTB ymm, ymm, ymm
  65509. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  65510. self.require(ISA_AVX2)
  65511. p.domain = DomainAVX
  65512. p.add(0, func(m *_Encoding, v []interface{}) {
  65513. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  65514. m.emit(0x64)
  65515. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65516. })
  65517. }
  65518. // VPCMPGTB m256, ymm, ymm
  65519. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  65520. self.require(ISA_AVX2)
  65521. p.domain = DomainAVX
  65522. p.add(0, func(m *_Encoding, v []interface{}) {
  65523. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  65524. m.emit(0x64)
  65525. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  65526. })
  65527. }
  65528. // VPCMPGTB zmm, zmm, k{k}
  65529. if isZMM(v0) && isZMM(v1) && isKk(v2) {
  65530. self.require(ISA_AVX512BW)
  65531. p.domain = DomainAVX
  65532. p.add(0, func(m *_Encoding, v []interface{}) {
  65533. m.emit(0x62)
  65534. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  65535. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  65536. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  65537. m.emit(0x64)
  65538. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65539. })
  65540. }
  65541. // VPCMPGTB m512, zmm, k{k}
  65542. if isM512(v0) && isZMM(v1) && isKk(v2) {
  65543. self.require(ISA_AVX512BW)
  65544. p.domain = DomainAVX
  65545. p.add(0, func(m *_Encoding, v []interface{}) {
  65546. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  65547. m.emit(0x64)
  65548. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  65549. })
  65550. }
  65551. // VPCMPGTB xmm, xmm, k{k}
  65552. if isEVEXXMM(v0) && isEVEXXMM(v1) && isKk(v2) {
  65553. self.require(ISA_AVX512VL | ISA_AVX512BW)
  65554. p.domain = DomainAVX
  65555. p.add(0, func(m *_Encoding, v []interface{}) {
  65556. m.emit(0x62)
  65557. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  65558. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  65559. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  65560. m.emit(0x64)
  65561. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65562. })
  65563. }
  65564. // VPCMPGTB m128, xmm, k{k}
  65565. if isM128(v0) && isEVEXXMM(v1) && isKk(v2) {
  65566. self.require(ISA_AVX512VL | ISA_AVX512BW)
  65567. p.domain = DomainAVX
  65568. p.add(0, func(m *_Encoding, v []interface{}) {
  65569. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  65570. m.emit(0x64)
  65571. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  65572. })
  65573. }
  65574. // VPCMPGTB ymm, ymm, k{k}
  65575. if isEVEXYMM(v0) && isEVEXYMM(v1) && isKk(v2) {
  65576. self.require(ISA_AVX512VL | ISA_AVX512BW)
  65577. p.domain = DomainAVX
  65578. p.add(0, func(m *_Encoding, v []interface{}) {
  65579. m.emit(0x62)
  65580. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  65581. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  65582. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  65583. m.emit(0x64)
  65584. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65585. })
  65586. }
  65587. // VPCMPGTB m256, ymm, k{k}
  65588. if isM256(v0) && isEVEXYMM(v1) && isKk(v2) {
  65589. self.require(ISA_AVX512VL | ISA_AVX512BW)
  65590. p.domain = DomainAVX
  65591. p.add(0, func(m *_Encoding, v []interface{}) {
  65592. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  65593. m.emit(0x64)
  65594. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  65595. })
  65596. }
  65597. if p.len == 0 {
  65598. panic("invalid operands for VPCMPGTB")
  65599. }
  65600. return p
  65601. }
  65602. // VPCMPGTD performs "Compare Packed Signed Doubleword Integers for Greater Than".
  65603. //
  65604. // Mnemonic : VPCMPGTD
  65605. // Supported forms : (10 forms)
  65606. //
  65607. // * VPCMPGTD xmm, xmm, xmm [AVX]
  65608. // * VPCMPGTD m128, xmm, xmm [AVX]
  65609. // * VPCMPGTD ymm, ymm, ymm [AVX2]
  65610. // * VPCMPGTD m256, ymm, ymm [AVX2]
  65611. // * VPCMPGTD m512/m32bcst, zmm, k{k} [AVX512F]
  65612. // * VPCMPGTD zmm, zmm, k{k} [AVX512F]
  65613. // * VPCMPGTD m128/m32bcst, xmm, k{k} [AVX512F,AVX512VL]
  65614. // * VPCMPGTD xmm, xmm, k{k} [AVX512F,AVX512VL]
  65615. // * VPCMPGTD m256/m32bcst, ymm, k{k} [AVX512F,AVX512VL]
  65616. // * VPCMPGTD ymm, ymm, k{k} [AVX512F,AVX512VL]
  65617. //
  65618. func (self *Program) VPCMPGTD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  65619. p := self.alloc("VPCMPGTD", 3, Operands { v0, v1, v2 })
  65620. // VPCMPGTD xmm, xmm, xmm
  65621. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  65622. self.require(ISA_AVX)
  65623. p.domain = DomainAVX
  65624. p.add(0, func(m *_Encoding, v []interface{}) {
  65625. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  65626. m.emit(0x66)
  65627. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65628. })
  65629. }
  65630. // VPCMPGTD m128, xmm, xmm
  65631. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  65632. self.require(ISA_AVX)
  65633. p.domain = DomainAVX
  65634. p.add(0, func(m *_Encoding, v []interface{}) {
  65635. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  65636. m.emit(0x66)
  65637. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  65638. })
  65639. }
  65640. // VPCMPGTD ymm, ymm, ymm
  65641. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  65642. self.require(ISA_AVX2)
  65643. p.domain = DomainAVX
  65644. p.add(0, func(m *_Encoding, v []interface{}) {
  65645. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  65646. m.emit(0x66)
  65647. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65648. })
  65649. }
  65650. // VPCMPGTD m256, ymm, ymm
  65651. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  65652. self.require(ISA_AVX2)
  65653. p.domain = DomainAVX
  65654. p.add(0, func(m *_Encoding, v []interface{}) {
  65655. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  65656. m.emit(0x66)
  65657. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  65658. })
  65659. }
  65660. // VPCMPGTD m512/m32bcst, zmm, k{k}
  65661. if isM512M32bcst(v0) && isZMM(v1) && isKk(v2) {
  65662. self.require(ISA_AVX512F)
  65663. p.domain = DomainAVX
  65664. p.add(0, func(m *_Encoding, v []interface{}) {
  65665. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  65666. m.emit(0x66)
  65667. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  65668. })
  65669. }
  65670. // VPCMPGTD zmm, zmm, k{k}
  65671. if isZMM(v0) && isZMM(v1) && isKk(v2) {
  65672. self.require(ISA_AVX512F)
  65673. p.domain = DomainAVX
  65674. p.add(0, func(m *_Encoding, v []interface{}) {
  65675. m.emit(0x62)
  65676. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  65677. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  65678. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  65679. m.emit(0x66)
  65680. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65681. })
  65682. }
  65683. // VPCMPGTD m128/m32bcst, xmm, k{k}
  65684. if isM128M32bcst(v0) && isEVEXXMM(v1) && isKk(v2) {
  65685. self.require(ISA_AVX512VL | ISA_AVX512F)
  65686. p.domain = DomainAVX
  65687. p.add(0, func(m *_Encoding, v []interface{}) {
  65688. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  65689. m.emit(0x66)
  65690. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  65691. })
  65692. }
  65693. // VPCMPGTD xmm, xmm, k{k}
  65694. if isEVEXXMM(v0) && isEVEXXMM(v1) && isKk(v2) {
  65695. self.require(ISA_AVX512VL | ISA_AVX512F)
  65696. p.domain = DomainAVX
  65697. p.add(0, func(m *_Encoding, v []interface{}) {
  65698. m.emit(0x62)
  65699. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  65700. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  65701. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  65702. m.emit(0x66)
  65703. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65704. })
  65705. }
  65706. // VPCMPGTD m256/m32bcst, ymm, k{k}
  65707. if isM256M32bcst(v0) && isEVEXYMM(v1) && isKk(v2) {
  65708. self.require(ISA_AVX512VL | ISA_AVX512F)
  65709. p.domain = DomainAVX
  65710. p.add(0, func(m *_Encoding, v []interface{}) {
  65711. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  65712. m.emit(0x66)
  65713. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  65714. })
  65715. }
  65716. // VPCMPGTD ymm, ymm, k{k}
  65717. if isEVEXYMM(v0) && isEVEXYMM(v1) && isKk(v2) {
  65718. self.require(ISA_AVX512VL | ISA_AVX512F)
  65719. p.domain = DomainAVX
  65720. p.add(0, func(m *_Encoding, v []interface{}) {
  65721. m.emit(0x62)
  65722. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  65723. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  65724. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  65725. m.emit(0x66)
  65726. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65727. })
  65728. }
  65729. if p.len == 0 {
  65730. panic("invalid operands for VPCMPGTD")
  65731. }
  65732. return p
  65733. }
  65734. // VPCMPGTQ performs "Compare Packed Data for Greater Than".
  65735. //
  65736. // Mnemonic : VPCMPGTQ
  65737. // Supported forms : (10 forms)
  65738. //
  65739. // * VPCMPGTQ xmm, xmm, xmm [AVX]
  65740. // * VPCMPGTQ m128, xmm, xmm [AVX]
  65741. // * VPCMPGTQ ymm, ymm, ymm [AVX2]
  65742. // * VPCMPGTQ m256, ymm, ymm [AVX2]
  65743. // * VPCMPGTQ m512/m64bcst, zmm, k{k} [AVX512F]
  65744. // * VPCMPGTQ zmm, zmm, k{k} [AVX512F]
  65745. // * VPCMPGTQ m128/m64bcst, xmm, k{k} [AVX512F,AVX512VL]
  65746. // * VPCMPGTQ xmm, xmm, k{k} [AVX512F,AVX512VL]
  65747. // * VPCMPGTQ m256/m64bcst, ymm, k{k} [AVX512F,AVX512VL]
  65748. // * VPCMPGTQ ymm, ymm, k{k} [AVX512F,AVX512VL]
  65749. //
  65750. func (self *Program) VPCMPGTQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  65751. p := self.alloc("VPCMPGTQ", 3, Operands { v0, v1, v2 })
  65752. // VPCMPGTQ xmm, xmm, xmm
  65753. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  65754. self.require(ISA_AVX)
  65755. p.domain = DomainAVX
  65756. p.add(0, func(m *_Encoding, v []interface{}) {
  65757. m.emit(0xc4)
  65758. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  65759. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  65760. m.emit(0x37)
  65761. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65762. })
  65763. }
  65764. // VPCMPGTQ m128, xmm, xmm
  65765. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  65766. self.require(ISA_AVX)
  65767. p.domain = DomainAVX
  65768. p.add(0, func(m *_Encoding, v []interface{}) {
  65769. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  65770. m.emit(0x37)
  65771. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  65772. })
  65773. }
  65774. // VPCMPGTQ ymm, ymm, ymm
  65775. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  65776. self.require(ISA_AVX2)
  65777. p.domain = DomainAVX
  65778. p.add(0, func(m *_Encoding, v []interface{}) {
  65779. m.emit(0xc4)
  65780. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  65781. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  65782. m.emit(0x37)
  65783. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65784. })
  65785. }
  65786. // VPCMPGTQ m256, ymm, ymm
  65787. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  65788. self.require(ISA_AVX2)
  65789. p.domain = DomainAVX
  65790. p.add(0, func(m *_Encoding, v []interface{}) {
  65791. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  65792. m.emit(0x37)
  65793. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  65794. })
  65795. }
  65796. // VPCMPGTQ m512/m64bcst, zmm, k{k}
  65797. if isM512M64bcst(v0) && isZMM(v1) && isKk(v2) {
  65798. self.require(ISA_AVX512F)
  65799. p.domain = DomainAVX
  65800. p.add(0, func(m *_Encoding, v []interface{}) {
  65801. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  65802. m.emit(0x37)
  65803. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  65804. })
  65805. }
  65806. // VPCMPGTQ zmm, zmm, k{k}
  65807. if isZMM(v0) && isZMM(v1) && isKk(v2) {
  65808. self.require(ISA_AVX512F)
  65809. p.domain = DomainAVX
  65810. p.add(0, func(m *_Encoding, v []interface{}) {
  65811. m.emit(0x62)
  65812. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  65813. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  65814. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  65815. m.emit(0x37)
  65816. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65817. })
  65818. }
  65819. // VPCMPGTQ m128/m64bcst, xmm, k{k}
  65820. if isM128M64bcst(v0) && isEVEXXMM(v1) && isKk(v2) {
  65821. self.require(ISA_AVX512VL | ISA_AVX512F)
  65822. p.domain = DomainAVX
  65823. p.add(0, func(m *_Encoding, v []interface{}) {
  65824. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  65825. m.emit(0x37)
  65826. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  65827. })
  65828. }
  65829. // VPCMPGTQ xmm, xmm, k{k}
  65830. if isEVEXXMM(v0) && isEVEXXMM(v1) && isKk(v2) {
  65831. self.require(ISA_AVX512VL | ISA_AVX512F)
  65832. p.domain = DomainAVX
  65833. p.add(0, func(m *_Encoding, v []interface{}) {
  65834. m.emit(0x62)
  65835. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  65836. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  65837. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  65838. m.emit(0x37)
  65839. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65840. })
  65841. }
  65842. // VPCMPGTQ m256/m64bcst, ymm, k{k}
  65843. if isM256M64bcst(v0) && isEVEXYMM(v1) && isKk(v2) {
  65844. self.require(ISA_AVX512VL | ISA_AVX512F)
  65845. p.domain = DomainAVX
  65846. p.add(0, func(m *_Encoding, v []interface{}) {
  65847. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  65848. m.emit(0x37)
  65849. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  65850. })
  65851. }
  65852. // VPCMPGTQ ymm, ymm, k{k}
  65853. if isEVEXYMM(v0) && isEVEXYMM(v1) && isKk(v2) {
  65854. self.require(ISA_AVX512VL | ISA_AVX512F)
  65855. p.domain = DomainAVX
  65856. p.add(0, func(m *_Encoding, v []interface{}) {
  65857. m.emit(0x62)
  65858. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  65859. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  65860. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  65861. m.emit(0x37)
  65862. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65863. })
  65864. }
  65865. if p.len == 0 {
  65866. panic("invalid operands for VPCMPGTQ")
  65867. }
  65868. return p
  65869. }
  65870. // VPCMPGTW performs "Compare Packed Signed Word Integers for Greater Than".
  65871. //
  65872. // Mnemonic : VPCMPGTW
  65873. // Supported forms : (10 forms)
  65874. //
  65875. // * VPCMPGTW xmm, xmm, xmm [AVX]
  65876. // * VPCMPGTW m128, xmm, xmm [AVX]
  65877. // * VPCMPGTW ymm, ymm, ymm [AVX2]
  65878. // * VPCMPGTW m256, ymm, ymm [AVX2]
  65879. // * VPCMPGTW zmm, zmm, k{k} [AVX512BW]
  65880. // * VPCMPGTW m512, zmm, k{k} [AVX512BW]
  65881. // * VPCMPGTW xmm, xmm, k{k} [AVX512BW,AVX512VL]
  65882. // * VPCMPGTW m128, xmm, k{k} [AVX512BW,AVX512VL]
  65883. // * VPCMPGTW ymm, ymm, k{k} [AVX512BW,AVX512VL]
  65884. // * VPCMPGTW m256, ymm, k{k} [AVX512BW,AVX512VL]
  65885. //
  65886. func (self *Program) VPCMPGTW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  65887. p := self.alloc("VPCMPGTW", 3, Operands { v0, v1, v2 })
  65888. // VPCMPGTW xmm, xmm, xmm
  65889. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  65890. self.require(ISA_AVX)
  65891. p.domain = DomainAVX
  65892. p.add(0, func(m *_Encoding, v []interface{}) {
  65893. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  65894. m.emit(0x65)
  65895. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65896. })
  65897. }
  65898. // VPCMPGTW m128, xmm, xmm
  65899. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  65900. self.require(ISA_AVX)
  65901. p.domain = DomainAVX
  65902. p.add(0, func(m *_Encoding, v []interface{}) {
  65903. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  65904. m.emit(0x65)
  65905. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  65906. })
  65907. }
  65908. // VPCMPGTW ymm, ymm, ymm
  65909. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  65910. self.require(ISA_AVX2)
  65911. p.domain = DomainAVX
  65912. p.add(0, func(m *_Encoding, v []interface{}) {
  65913. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  65914. m.emit(0x65)
  65915. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65916. })
  65917. }
  65918. // VPCMPGTW m256, ymm, ymm
  65919. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  65920. self.require(ISA_AVX2)
  65921. p.domain = DomainAVX
  65922. p.add(0, func(m *_Encoding, v []interface{}) {
  65923. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  65924. m.emit(0x65)
  65925. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  65926. })
  65927. }
  65928. // VPCMPGTW zmm, zmm, k{k}
  65929. if isZMM(v0) && isZMM(v1) && isKk(v2) {
  65930. self.require(ISA_AVX512BW)
  65931. p.domain = DomainAVX
  65932. p.add(0, func(m *_Encoding, v []interface{}) {
  65933. m.emit(0x62)
  65934. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  65935. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  65936. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  65937. m.emit(0x65)
  65938. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65939. })
  65940. }
  65941. // VPCMPGTW m512, zmm, k{k}
  65942. if isM512(v0) && isZMM(v1) && isKk(v2) {
  65943. self.require(ISA_AVX512BW)
  65944. p.domain = DomainAVX
  65945. p.add(0, func(m *_Encoding, v []interface{}) {
  65946. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  65947. m.emit(0x65)
  65948. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  65949. })
  65950. }
  65951. // VPCMPGTW xmm, xmm, k{k}
  65952. if isEVEXXMM(v0) && isEVEXXMM(v1) && isKk(v2) {
  65953. self.require(ISA_AVX512VL | ISA_AVX512BW)
  65954. p.domain = DomainAVX
  65955. p.add(0, func(m *_Encoding, v []interface{}) {
  65956. m.emit(0x62)
  65957. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  65958. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  65959. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  65960. m.emit(0x65)
  65961. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65962. })
  65963. }
  65964. // VPCMPGTW m128, xmm, k{k}
  65965. if isM128(v0) && isEVEXXMM(v1) && isKk(v2) {
  65966. self.require(ISA_AVX512VL | ISA_AVX512BW)
  65967. p.domain = DomainAVX
  65968. p.add(0, func(m *_Encoding, v []interface{}) {
  65969. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  65970. m.emit(0x65)
  65971. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  65972. })
  65973. }
  65974. // VPCMPGTW ymm, ymm, k{k}
  65975. if isEVEXYMM(v0) && isEVEXYMM(v1) && isKk(v2) {
  65976. self.require(ISA_AVX512VL | ISA_AVX512BW)
  65977. p.domain = DomainAVX
  65978. p.add(0, func(m *_Encoding, v []interface{}) {
  65979. m.emit(0x62)
  65980. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  65981. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  65982. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  65983. m.emit(0x65)
  65984. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  65985. })
  65986. }
  65987. // VPCMPGTW m256, ymm, k{k}
  65988. if isM256(v0) && isEVEXYMM(v1) && isKk(v2) {
  65989. self.require(ISA_AVX512VL | ISA_AVX512BW)
  65990. p.domain = DomainAVX
  65991. p.add(0, func(m *_Encoding, v []interface{}) {
  65992. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  65993. m.emit(0x65)
  65994. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  65995. })
  65996. }
  65997. if p.len == 0 {
  65998. panic("invalid operands for VPCMPGTW")
  65999. }
  66000. return p
  66001. }
  66002. // VPCMPISTRI performs "Packed Compare Implicit Length Strings, Return Index".
  66003. //
  66004. // Mnemonic : VPCMPISTRI
  66005. // Supported forms : (2 forms)
  66006. //
  66007. // * VPCMPISTRI imm8, xmm, xmm [AVX]
  66008. // * VPCMPISTRI imm8, m128, xmm [AVX]
  66009. //
  66010. func (self *Program) VPCMPISTRI(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  66011. p := self.alloc("VPCMPISTRI", 3, Operands { v0, v1, v2 })
  66012. // VPCMPISTRI imm8, xmm, xmm
  66013. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  66014. self.require(ISA_AVX)
  66015. p.domain = DomainAVX
  66016. p.add(0, func(m *_Encoding, v []interface{}) {
  66017. m.emit(0xc4)
  66018. m.emit(0xe3 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  66019. m.emit(0x79)
  66020. m.emit(0x63)
  66021. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  66022. m.imm1(toImmAny(v[0]))
  66023. })
  66024. }
  66025. // VPCMPISTRI imm8, m128, xmm
  66026. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  66027. self.require(ISA_AVX)
  66028. p.domain = DomainAVX
  66029. p.add(0, func(m *_Encoding, v []interface{}) {
  66030. m.vex3(0xc4, 0b11, 0x01, hcode(v[2]), addr(v[1]), 0)
  66031. m.emit(0x63)
  66032. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  66033. m.imm1(toImmAny(v[0]))
  66034. })
  66035. }
  66036. if p.len == 0 {
  66037. panic("invalid operands for VPCMPISTRI")
  66038. }
  66039. return p
  66040. }
  66041. // VPCMPISTRM performs "Packed Compare Implicit Length Strings, Return Mask".
  66042. //
  66043. // Mnemonic : VPCMPISTRM
  66044. // Supported forms : (2 forms)
  66045. //
  66046. // * VPCMPISTRM imm8, xmm, xmm [AVX]
  66047. // * VPCMPISTRM imm8, m128, xmm [AVX]
  66048. //
  66049. func (self *Program) VPCMPISTRM(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  66050. p := self.alloc("VPCMPISTRM", 3, Operands { v0, v1, v2 })
  66051. // VPCMPISTRM imm8, xmm, xmm
  66052. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  66053. self.require(ISA_AVX)
  66054. p.domain = DomainAVX
  66055. p.add(0, func(m *_Encoding, v []interface{}) {
  66056. m.emit(0xc4)
  66057. m.emit(0xe3 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  66058. m.emit(0x79)
  66059. m.emit(0x62)
  66060. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  66061. m.imm1(toImmAny(v[0]))
  66062. })
  66063. }
  66064. // VPCMPISTRM imm8, m128, xmm
  66065. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  66066. self.require(ISA_AVX)
  66067. p.domain = DomainAVX
  66068. p.add(0, func(m *_Encoding, v []interface{}) {
  66069. m.vex3(0xc4, 0b11, 0x01, hcode(v[2]), addr(v[1]), 0)
  66070. m.emit(0x62)
  66071. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  66072. m.imm1(toImmAny(v[0]))
  66073. })
  66074. }
  66075. if p.len == 0 {
  66076. panic("invalid operands for VPCMPISTRM")
  66077. }
  66078. return p
  66079. }
  66080. // VPCMPQ performs "Compare Packed Signed Quadword Values".
  66081. //
  66082. // Mnemonic : VPCMPQ
  66083. // Supported forms : (6 forms)
  66084. //
  66085. // * VPCMPQ imm8, m512/m64bcst, zmm, k{k} [AVX512F]
  66086. // * VPCMPQ imm8, zmm, zmm, k{k} [AVX512F]
  66087. // * VPCMPQ imm8, m128/m64bcst, xmm, k{k} [AVX512F,AVX512VL]
  66088. // * VPCMPQ imm8, xmm, xmm, k{k} [AVX512F,AVX512VL]
  66089. // * VPCMPQ imm8, m256/m64bcst, ymm, k{k} [AVX512F,AVX512VL]
  66090. // * VPCMPQ imm8, ymm, ymm, k{k} [AVX512F,AVX512VL]
  66091. //
  66092. func (self *Program) VPCMPQ(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  66093. p := self.alloc("VPCMPQ", 4, Operands { v0, v1, v2, v3 })
  66094. // VPCMPQ imm8, m512/m64bcst, zmm, k{k}
  66095. if isImm8(v0) && isM512M64bcst(v1) && isZMM(v2) && isKk(v3) {
  66096. self.require(ISA_AVX512F)
  66097. p.domain = DomainAVX
  66098. p.add(0, func(m *_Encoding, v []interface{}) {
  66099. m.evex(0b11, 0x85, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, bcode(v[1]))
  66100. m.emit(0x1f)
  66101. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  66102. m.imm1(toImmAny(v[0]))
  66103. })
  66104. }
  66105. // VPCMPQ imm8, zmm, zmm, k{k}
  66106. if isImm8(v0) && isZMM(v1) && isZMM(v2) && isKk(v3) {
  66107. self.require(ISA_AVX512F)
  66108. p.domain = DomainAVX
  66109. p.add(0, func(m *_Encoding, v []interface{}) {
  66110. m.emit(0x62)
  66111. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  66112. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  66113. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  66114. m.emit(0x1f)
  66115. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66116. m.imm1(toImmAny(v[0]))
  66117. })
  66118. }
  66119. // VPCMPQ imm8, m128/m64bcst, xmm, k{k}
  66120. if isImm8(v0) && isM128M64bcst(v1) && isEVEXXMM(v2) && isKk(v3) {
  66121. self.require(ISA_AVX512VL | ISA_AVX512F)
  66122. p.domain = DomainAVX
  66123. p.add(0, func(m *_Encoding, v []interface{}) {
  66124. m.evex(0b11, 0x85, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, bcode(v[1]))
  66125. m.emit(0x1f)
  66126. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  66127. m.imm1(toImmAny(v[0]))
  66128. })
  66129. }
  66130. // VPCMPQ imm8, xmm, xmm, k{k}
  66131. if isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isKk(v3) {
  66132. self.require(ISA_AVX512VL | ISA_AVX512F)
  66133. p.domain = DomainAVX
  66134. p.add(0, func(m *_Encoding, v []interface{}) {
  66135. m.emit(0x62)
  66136. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  66137. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  66138. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  66139. m.emit(0x1f)
  66140. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66141. m.imm1(toImmAny(v[0]))
  66142. })
  66143. }
  66144. // VPCMPQ imm8, m256/m64bcst, ymm, k{k}
  66145. if isImm8(v0) && isM256M64bcst(v1) && isEVEXYMM(v2) && isKk(v3) {
  66146. self.require(ISA_AVX512VL | ISA_AVX512F)
  66147. p.domain = DomainAVX
  66148. p.add(0, func(m *_Encoding, v []interface{}) {
  66149. m.evex(0b11, 0x85, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, bcode(v[1]))
  66150. m.emit(0x1f)
  66151. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  66152. m.imm1(toImmAny(v[0]))
  66153. })
  66154. }
  66155. // VPCMPQ imm8, ymm, ymm, k{k}
  66156. if isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isKk(v3) {
  66157. self.require(ISA_AVX512VL | ISA_AVX512F)
  66158. p.domain = DomainAVX
  66159. p.add(0, func(m *_Encoding, v []interface{}) {
  66160. m.emit(0x62)
  66161. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  66162. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  66163. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  66164. m.emit(0x1f)
  66165. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66166. m.imm1(toImmAny(v[0]))
  66167. })
  66168. }
  66169. if p.len == 0 {
  66170. panic("invalid operands for VPCMPQ")
  66171. }
  66172. return p
  66173. }
  66174. // VPCMPUB performs "Compare Packed Unsigned Byte Values".
  66175. //
  66176. // Mnemonic : VPCMPUB
  66177. // Supported forms : (6 forms)
  66178. //
  66179. // * VPCMPUB imm8, zmm, zmm, k{k} [AVX512BW]
  66180. // * VPCMPUB imm8, m512, zmm, k{k} [AVX512BW]
  66181. // * VPCMPUB imm8, xmm, xmm, k{k} [AVX512BW,AVX512VL]
  66182. // * VPCMPUB imm8, m128, xmm, k{k} [AVX512BW,AVX512VL]
  66183. // * VPCMPUB imm8, ymm, ymm, k{k} [AVX512BW,AVX512VL]
  66184. // * VPCMPUB imm8, m256, ymm, k{k} [AVX512BW,AVX512VL]
  66185. //
  66186. func (self *Program) VPCMPUB(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  66187. p := self.alloc("VPCMPUB", 4, Operands { v0, v1, v2, v3 })
  66188. // VPCMPUB imm8, zmm, zmm, k{k}
  66189. if isImm8(v0) && isZMM(v1) && isZMM(v2) && isKk(v3) {
  66190. self.require(ISA_AVX512BW)
  66191. p.domain = DomainAVX
  66192. p.add(0, func(m *_Encoding, v []interface{}) {
  66193. m.emit(0x62)
  66194. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  66195. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  66196. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  66197. m.emit(0x3e)
  66198. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66199. m.imm1(toImmAny(v[0]))
  66200. })
  66201. }
  66202. // VPCMPUB imm8, m512, zmm, k{k}
  66203. if isImm8(v0) && isM512(v1) && isZMM(v2) && isKk(v3) {
  66204. self.require(ISA_AVX512BW)
  66205. p.domain = DomainAVX
  66206. p.add(0, func(m *_Encoding, v []interface{}) {
  66207. m.evex(0b11, 0x05, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, 0)
  66208. m.emit(0x3e)
  66209. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  66210. m.imm1(toImmAny(v[0]))
  66211. })
  66212. }
  66213. // VPCMPUB imm8, xmm, xmm, k{k}
  66214. if isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isKk(v3) {
  66215. self.require(ISA_AVX512VL | ISA_AVX512BW)
  66216. p.domain = DomainAVX
  66217. p.add(0, func(m *_Encoding, v []interface{}) {
  66218. m.emit(0x62)
  66219. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  66220. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  66221. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  66222. m.emit(0x3e)
  66223. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66224. m.imm1(toImmAny(v[0]))
  66225. })
  66226. }
  66227. // VPCMPUB imm8, m128, xmm, k{k}
  66228. if isImm8(v0) && isM128(v1) && isEVEXXMM(v2) && isKk(v3) {
  66229. self.require(ISA_AVX512VL | ISA_AVX512BW)
  66230. p.domain = DomainAVX
  66231. p.add(0, func(m *_Encoding, v []interface{}) {
  66232. m.evex(0b11, 0x05, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, 0)
  66233. m.emit(0x3e)
  66234. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  66235. m.imm1(toImmAny(v[0]))
  66236. })
  66237. }
  66238. // VPCMPUB imm8, ymm, ymm, k{k}
  66239. if isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isKk(v3) {
  66240. self.require(ISA_AVX512VL | ISA_AVX512BW)
  66241. p.domain = DomainAVX
  66242. p.add(0, func(m *_Encoding, v []interface{}) {
  66243. m.emit(0x62)
  66244. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  66245. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  66246. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  66247. m.emit(0x3e)
  66248. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66249. m.imm1(toImmAny(v[0]))
  66250. })
  66251. }
  66252. // VPCMPUB imm8, m256, ymm, k{k}
  66253. if isImm8(v0) && isM256(v1) && isEVEXYMM(v2) && isKk(v3) {
  66254. self.require(ISA_AVX512VL | ISA_AVX512BW)
  66255. p.domain = DomainAVX
  66256. p.add(0, func(m *_Encoding, v []interface{}) {
  66257. m.evex(0b11, 0x05, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, 0)
  66258. m.emit(0x3e)
  66259. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  66260. m.imm1(toImmAny(v[0]))
  66261. })
  66262. }
  66263. if p.len == 0 {
  66264. panic("invalid operands for VPCMPUB")
  66265. }
  66266. return p
  66267. }
  66268. // VPCMPUD performs "Compare Packed Unsigned Doubleword Values".
  66269. //
  66270. // Mnemonic : VPCMPUD
  66271. // Supported forms : (6 forms)
  66272. //
  66273. // * VPCMPUD imm8, m512/m32bcst, zmm, k{k} [AVX512F]
  66274. // * VPCMPUD imm8, zmm, zmm, k{k} [AVX512F]
  66275. // * VPCMPUD imm8, m128/m32bcst, xmm, k{k} [AVX512F,AVX512VL]
  66276. // * VPCMPUD imm8, xmm, xmm, k{k} [AVX512F,AVX512VL]
  66277. // * VPCMPUD imm8, m256/m32bcst, ymm, k{k} [AVX512F,AVX512VL]
  66278. // * VPCMPUD imm8, ymm, ymm, k{k} [AVX512F,AVX512VL]
  66279. //
  66280. func (self *Program) VPCMPUD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  66281. p := self.alloc("VPCMPUD", 4, Operands { v0, v1, v2, v3 })
  66282. // VPCMPUD imm8, m512/m32bcst, zmm, k{k}
  66283. if isImm8(v0) && isM512M32bcst(v1) && isZMM(v2) && isKk(v3) {
  66284. self.require(ISA_AVX512F)
  66285. p.domain = DomainAVX
  66286. p.add(0, func(m *_Encoding, v []interface{}) {
  66287. m.evex(0b11, 0x05, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, bcode(v[1]))
  66288. m.emit(0x1e)
  66289. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  66290. m.imm1(toImmAny(v[0]))
  66291. })
  66292. }
  66293. // VPCMPUD imm8, zmm, zmm, k{k}
  66294. if isImm8(v0) && isZMM(v1) && isZMM(v2) && isKk(v3) {
  66295. self.require(ISA_AVX512F)
  66296. p.domain = DomainAVX
  66297. p.add(0, func(m *_Encoding, v []interface{}) {
  66298. m.emit(0x62)
  66299. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  66300. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  66301. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  66302. m.emit(0x1e)
  66303. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66304. m.imm1(toImmAny(v[0]))
  66305. })
  66306. }
  66307. // VPCMPUD imm8, m128/m32bcst, xmm, k{k}
  66308. if isImm8(v0) && isM128M32bcst(v1) && isEVEXXMM(v2) && isKk(v3) {
  66309. self.require(ISA_AVX512VL | ISA_AVX512F)
  66310. p.domain = DomainAVX
  66311. p.add(0, func(m *_Encoding, v []interface{}) {
  66312. m.evex(0b11, 0x05, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, bcode(v[1]))
  66313. m.emit(0x1e)
  66314. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  66315. m.imm1(toImmAny(v[0]))
  66316. })
  66317. }
  66318. // VPCMPUD imm8, xmm, xmm, k{k}
  66319. if isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isKk(v3) {
  66320. self.require(ISA_AVX512VL | ISA_AVX512F)
  66321. p.domain = DomainAVX
  66322. p.add(0, func(m *_Encoding, v []interface{}) {
  66323. m.emit(0x62)
  66324. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  66325. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  66326. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  66327. m.emit(0x1e)
  66328. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66329. m.imm1(toImmAny(v[0]))
  66330. })
  66331. }
  66332. // VPCMPUD imm8, m256/m32bcst, ymm, k{k}
  66333. if isImm8(v0) && isM256M32bcst(v1) && isEVEXYMM(v2) && isKk(v3) {
  66334. self.require(ISA_AVX512VL | ISA_AVX512F)
  66335. p.domain = DomainAVX
  66336. p.add(0, func(m *_Encoding, v []interface{}) {
  66337. m.evex(0b11, 0x05, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, bcode(v[1]))
  66338. m.emit(0x1e)
  66339. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  66340. m.imm1(toImmAny(v[0]))
  66341. })
  66342. }
  66343. // VPCMPUD imm8, ymm, ymm, k{k}
  66344. if isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isKk(v3) {
  66345. self.require(ISA_AVX512VL | ISA_AVX512F)
  66346. p.domain = DomainAVX
  66347. p.add(0, func(m *_Encoding, v []interface{}) {
  66348. m.emit(0x62)
  66349. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  66350. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  66351. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  66352. m.emit(0x1e)
  66353. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66354. m.imm1(toImmAny(v[0]))
  66355. })
  66356. }
  66357. if p.len == 0 {
  66358. panic("invalid operands for VPCMPUD")
  66359. }
  66360. return p
  66361. }
  66362. // VPCMPUQ performs "Compare Packed Unsigned Quadword Values".
  66363. //
  66364. // Mnemonic : VPCMPUQ
  66365. // Supported forms : (6 forms)
  66366. //
  66367. // * VPCMPUQ imm8, m512/m64bcst, zmm, k{k} [AVX512F]
  66368. // * VPCMPUQ imm8, zmm, zmm, k{k} [AVX512F]
  66369. // * VPCMPUQ imm8, m128/m64bcst, xmm, k{k} [AVX512F,AVX512VL]
  66370. // * VPCMPUQ imm8, xmm, xmm, k{k} [AVX512F,AVX512VL]
  66371. // * VPCMPUQ imm8, m256/m64bcst, ymm, k{k} [AVX512F,AVX512VL]
  66372. // * VPCMPUQ imm8, ymm, ymm, k{k} [AVX512F,AVX512VL]
  66373. //
  66374. func (self *Program) VPCMPUQ(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  66375. p := self.alloc("VPCMPUQ", 4, Operands { v0, v1, v2, v3 })
  66376. // VPCMPUQ imm8, m512/m64bcst, zmm, k{k}
  66377. if isImm8(v0) && isM512M64bcst(v1) && isZMM(v2) && isKk(v3) {
  66378. self.require(ISA_AVX512F)
  66379. p.domain = DomainAVX
  66380. p.add(0, func(m *_Encoding, v []interface{}) {
  66381. m.evex(0b11, 0x85, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, bcode(v[1]))
  66382. m.emit(0x1e)
  66383. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  66384. m.imm1(toImmAny(v[0]))
  66385. })
  66386. }
  66387. // VPCMPUQ imm8, zmm, zmm, k{k}
  66388. if isImm8(v0) && isZMM(v1) && isZMM(v2) && isKk(v3) {
  66389. self.require(ISA_AVX512F)
  66390. p.domain = DomainAVX
  66391. p.add(0, func(m *_Encoding, v []interface{}) {
  66392. m.emit(0x62)
  66393. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  66394. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  66395. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  66396. m.emit(0x1e)
  66397. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66398. m.imm1(toImmAny(v[0]))
  66399. })
  66400. }
  66401. // VPCMPUQ imm8, m128/m64bcst, xmm, k{k}
  66402. if isImm8(v0) && isM128M64bcst(v1) && isEVEXXMM(v2) && isKk(v3) {
  66403. self.require(ISA_AVX512VL | ISA_AVX512F)
  66404. p.domain = DomainAVX
  66405. p.add(0, func(m *_Encoding, v []interface{}) {
  66406. m.evex(0b11, 0x85, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, bcode(v[1]))
  66407. m.emit(0x1e)
  66408. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  66409. m.imm1(toImmAny(v[0]))
  66410. })
  66411. }
  66412. // VPCMPUQ imm8, xmm, xmm, k{k}
  66413. if isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isKk(v3) {
  66414. self.require(ISA_AVX512VL | ISA_AVX512F)
  66415. p.domain = DomainAVX
  66416. p.add(0, func(m *_Encoding, v []interface{}) {
  66417. m.emit(0x62)
  66418. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  66419. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  66420. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  66421. m.emit(0x1e)
  66422. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66423. m.imm1(toImmAny(v[0]))
  66424. })
  66425. }
  66426. // VPCMPUQ imm8, m256/m64bcst, ymm, k{k}
  66427. if isImm8(v0) && isM256M64bcst(v1) && isEVEXYMM(v2) && isKk(v3) {
  66428. self.require(ISA_AVX512VL | ISA_AVX512F)
  66429. p.domain = DomainAVX
  66430. p.add(0, func(m *_Encoding, v []interface{}) {
  66431. m.evex(0b11, 0x85, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, bcode(v[1]))
  66432. m.emit(0x1e)
  66433. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  66434. m.imm1(toImmAny(v[0]))
  66435. })
  66436. }
  66437. // VPCMPUQ imm8, ymm, ymm, k{k}
  66438. if isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isKk(v3) {
  66439. self.require(ISA_AVX512VL | ISA_AVX512F)
  66440. p.domain = DomainAVX
  66441. p.add(0, func(m *_Encoding, v []interface{}) {
  66442. m.emit(0x62)
  66443. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  66444. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  66445. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  66446. m.emit(0x1e)
  66447. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66448. m.imm1(toImmAny(v[0]))
  66449. })
  66450. }
  66451. if p.len == 0 {
  66452. panic("invalid operands for VPCMPUQ")
  66453. }
  66454. return p
  66455. }
  66456. // VPCMPUW performs "Compare Packed Unsigned Word Values".
  66457. //
  66458. // Mnemonic : VPCMPUW
  66459. // Supported forms : (6 forms)
  66460. //
  66461. // * VPCMPUW imm8, zmm, zmm, k{k} [AVX512BW]
  66462. // * VPCMPUW imm8, m512, zmm, k{k} [AVX512BW]
  66463. // * VPCMPUW imm8, xmm, xmm, k{k} [AVX512BW,AVX512VL]
  66464. // * VPCMPUW imm8, m128, xmm, k{k} [AVX512BW,AVX512VL]
  66465. // * VPCMPUW imm8, ymm, ymm, k{k} [AVX512BW,AVX512VL]
  66466. // * VPCMPUW imm8, m256, ymm, k{k} [AVX512BW,AVX512VL]
  66467. //
  66468. func (self *Program) VPCMPUW(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  66469. p := self.alloc("VPCMPUW", 4, Operands { v0, v1, v2, v3 })
  66470. // VPCMPUW imm8, zmm, zmm, k{k}
  66471. if isImm8(v0) && isZMM(v1) && isZMM(v2) && isKk(v3) {
  66472. self.require(ISA_AVX512BW)
  66473. p.domain = DomainAVX
  66474. p.add(0, func(m *_Encoding, v []interface{}) {
  66475. m.emit(0x62)
  66476. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  66477. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  66478. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  66479. m.emit(0x3e)
  66480. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66481. m.imm1(toImmAny(v[0]))
  66482. })
  66483. }
  66484. // VPCMPUW imm8, m512, zmm, k{k}
  66485. if isImm8(v0) && isM512(v1) && isZMM(v2) && isKk(v3) {
  66486. self.require(ISA_AVX512BW)
  66487. p.domain = DomainAVX
  66488. p.add(0, func(m *_Encoding, v []interface{}) {
  66489. m.evex(0b11, 0x85, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, 0)
  66490. m.emit(0x3e)
  66491. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  66492. m.imm1(toImmAny(v[0]))
  66493. })
  66494. }
  66495. // VPCMPUW imm8, xmm, xmm, k{k}
  66496. if isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isKk(v3) {
  66497. self.require(ISA_AVX512VL | ISA_AVX512BW)
  66498. p.domain = DomainAVX
  66499. p.add(0, func(m *_Encoding, v []interface{}) {
  66500. m.emit(0x62)
  66501. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  66502. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  66503. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  66504. m.emit(0x3e)
  66505. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66506. m.imm1(toImmAny(v[0]))
  66507. })
  66508. }
  66509. // VPCMPUW imm8, m128, xmm, k{k}
  66510. if isImm8(v0) && isM128(v1) && isEVEXXMM(v2) && isKk(v3) {
  66511. self.require(ISA_AVX512VL | ISA_AVX512BW)
  66512. p.domain = DomainAVX
  66513. p.add(0, func(m *_Encoding, v []interface{}) {
  66514. m.evex(0b11, 0x85, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, 0)
  66515. m.emit(0x3e)
  66516. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  66517. m.imm1(toImmAny(v[0]))
  66518. })
  66519. }
  66520. // VPCMPUW imm8, ymm, ymm, k{k}
  66521. if isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isKk(v3) {
  66522. self.require(ISA_AVX512VL | ISA_AVX512BW)
  66523. p.domain = DomainAVX
  66524. p.add(0, func(m *_Encoding, v []interface{}) {
  66525. m.emit(0x62)
  66526. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  66527. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  66528. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  66529. m.emit(0x3e)
  66530. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66531. m.imm1(toImmAny(v[0]))
  66532. })
  66533. }
  66534. // VPCMPUW imm8, m256, ymm, k{k}
  66535. if isImm8(v0) && isM256(v1) && isEVEXYMM(v2) && isKk(v3) {
  66536. self.require(ISA_AVX512VL | ISA_AVX512BW)
  66537. p.domain = DomainAVX
  66538. p.add(0, func(m *_Encoding, v []interface{}) {
  66539. m.evex(0b11, 0x85, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, 0)
  66540. m.emit(0x3e)
  66541. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  66542. m.imm1(toImmAny(v[0]))
  66543. })
  66544. }
  66545. if p.len == 0 {
  66546. panic("invalid operands for VPCMPUW")
  66547. }
  66548. return p
  66549. }
  66550. // VPCMPW performs "Compare Packed Signed Word Values".
  66551. //
  66552. // Mnemonic : VPCMPW
  66553. // Supported forms : (6 forms)
  66554. //
  66555. // * VPCMPW imm8, zmm, zmm, k{k} [AVX512BW]
  66556. // * VPCMPW imm8, m512, zmm, k{k} [AVX512BW]
  66557. // * VPCMPW imm8, xmm, xmm, k{k} [AVX512BW,AVX512VL]
  66558. // * VPCMPW imm8, m128, xmm, k{k} [AVX512BW,AVX512VL]
  66559. // * VPCMPW imm8, ymm, ymm, k{k} [AVX512BW,AVX512VL]
  66560. // * VPCMPW imm8, m256, ymm, k{k} [AVX512BW,AVX512VL]
  66561. //
  66562. func (self *Program) VPCMPW(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  66563. p := self.alloc("VPCMPW", 4, Operands { v0, v1, v2, v3 })
  66564. // VPCMPW imm8, zmm, zmm, k{k}
  66565. if isImm8(v0) && isZMM(v1) && isZMM(v2) && isKk(v3) {
  66566. self.require(ISA_AVX512BW)
  66567. p.domain = DomainAVX
  66568. p.add(0, func(m *_Encoding, v []interface{}) {
  66569. m.emit(0x62)
  66570. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  66571. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  66572. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  66573. m.emit(0x3f)
  66574. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66575. m.imm1(toImmAny(v[0]))
  66576. })
  66577. }
  66578. // VPCMPW imm8, m512, zmm, k{k}
  66579. if isImm8(v0) && isM512(v1) && isZMM(v2) && isKk(v3) {
  66580. self.require(ISA_AVX512BW)
  66581. p.domain = DomainAVX
  66582. p.add(0, func(m *_Encoding, v []interface{}) {
  66583. m.evex(0b11, 0x85, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, 0)
  66584. m.emit(0x3f)
  66585. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  66586. m.imm1(toImmAny(v[0]))
  66587. })
  66588. }
  66589. // VPCMPW imm8, xmm, xmm, k{k}
  66590. if isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isKk(v3) {
  66591. self.require(ISA_AVX512VL | ISA_AVX512BW)
  66592. p.domain = DomainAVX
  66593. p.add(0, func(m *_Encoding, v []interface{}) {
  66594. m.emit(0x62)
  66595. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  66596. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  66597. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  66598. m.emit(0x3f)
  66599. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66600. m.imm1(toImmAny(v[0]))
  66601. })
  66602. }
  66603. // VPCMPW imm8, m128, xmm, k{k}
  66604. if isImm8(v0) && isM128(v1) && isEVEXXMM(v2) && isKk(v3) {
  66605. self.require(ISA_AVX512VL | ISA_AVX512BW)
  66606. p.domain = DomainAVX
  66607. p.add(0, func(m *_Encoding, v []interface{}) {
  66608. m.evex(0b11, 0x85, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, 0)
  66609. m.emit(0x3f)
  66610. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  66611. m.imm1(toImmAny(v[0]))
  66612. })
  66613. }
  66614. // VPCMPW imm8, ymm, ymm, k{k}
  66615. if isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isKk(v3) {
  66616. self.require(ISA_AVX512VL | ISA_AVX512BW)
  66617. p.domain = DomainAVX
  66618. p.add(0, func(m *_Encoding, v []interface{}) {
  66619. m.emit(0x62)
  66620. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  66621. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  66622. m.emit((0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  66623. m.emit(0x3f)
  66624. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66625. m.imm1(toImmAny(v[0]))
  66626. })
  66627. }
  66628. // VPCMPW imm8, m256, ymm, k{k}
  66629. if isImm8(v0) && isM256(v1) && isEVEXYMM(v2) && isKk(v3) {
  66630. self.require(ISA_AVX512VL | ISA_AVX512BW)
  66631. p.domain = DomainAVX
  66632. p.add(0, func(m *_Encoding, v []interface{}) {
  66633. m.evex(0b11, 0x85, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), 0, 0)
  66634. m.emit(0x3f)
  66635. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  66636. m.imm1(toImmAny(v[0]))
  66637. })
  66638. }
  66639. if p.len == 0 {
  66640. panic("invalid operands for VPCMPW")
  66641. }
  66642. return p
  66643. }
  66644. // VPCOMB performs "Compare Packed Signed Byte Integers".
  66645. //
  66646. // Mnemonic : VPCOMB
  66647. // Supported forms : (2 forms)
  66648. //
  66649. // * VPCOMB imm8, xmm, xmm, xmm [XOP]
  66650. // * VPCOMB imm8, m128, xmm, xmm [XOP]
  66651. //
  66652. func (self *Program) VPCOMB(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  66653. p := self.alloc("VPCOMB", 4, Operands { v0, v1, v2, v3 })
  66654. // VPCOMB imm8, xmm, xmm, xmm
  66655. if isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  66656. self.require(ISA_XOP)
  66657. p.domain = DomainAMDSpecific
  66658. p.add(0, func(m *_Encoding, v []interface{}) {
  66659. m.emit(0x8f)
  66660. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  66661. m.emit(0x78 ^ (hlcode(v[2]) << 3))
  66662. m.emit(0xcc)
  66663. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66664. m.imm1(toImmAny(v[0]))
  66665. })
  66666. }
  66667. // VPCOMB imm8, m128, xmm, xmm
  66668. if isImm8(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  66669. self.require(ISA_XOP)
  66670. p.domain = DomainAMDSpecific
  66671. p.add(0, func(m *_Encoding, v []interface{}) {
  66672. m.vex3(0x8f, 0b1000, 0x00, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  66673. m.emit(0xcc)
  66674. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  66675. m.imm1(toImmAny(v[0]))
  66676. })
  66677. }
  66678. if p.len == 0 {
  66679. panic("invalid operands for VPCOMB")
  66680. }
  66681. return p
  66682. }
  66683. // VPCOMD performs "Compare Packed Signed Doubleword Integers".
  66684. //
  66685. // Mnemonic : VPCOMD
  66686. // Supported forms : (2 forms)
  66687. //
  66688. // * VPCOMD imm8, xmm, xmm, xmm [XOP]
  66689. // * VPCOMD imm8, m128, xmm, xmm [XOP]
  66690. //
  66691. func (self *Program) VPCOMD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  66692. p := self.alloc("VPCOMD", 4, Operands { v0, v1, v2, v3 })
  66693. // VPCOMD imm8, xmm, xmm, xmm
  66694. if isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  66695. self.require(ISA_XOP)
  66696. p.domain = DomainAMDSpecific
  66697. p.add(0, func(m *_Encoding, v []interface{}) {
  66698. m.emit(0x8f)
  66699. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  66700. m.emit(0x78 ^ (hlcode(v[2]) << 3))
  66701. m.emit(0xce)
  66702. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66703. m.imm1(toImmAny(v[0]))
  66704. })
  66705. }
  66706. // VPCOMD imm8, m128, xmm, xmm
  66707. if isImm8(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  66708. self.require(ISA_XOP)
  66709. p.domain = DomainAMDSpecific
  66710. p.add(0, func(m *_Encoding, v []interface{}) {
  66711. m.vex3(0x8f, 0b1000, 0x00, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  66712. m.emit(0xce)
  66713. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  66714. m.imm1(toImmAny(v[0]))
  66715. })
  66716. }
  66717. if p.len == 0 {
  66718. panic("invalid operands for VPCOMD")
  66719. }
  66720. return p
  66721. }
  66722. // VPCOMPRESSD performs "Store Sparse Packed Doubleword Integer Values into Dense Memory/Register".
  66723. //
  66724. // Mnemonic : VPCOMPRESSD
  66725. // Supported forms : (6 forms)
  66726. //
  66727. // * VPCOMPRESSD zmm, zmm{k}{z} [AVX512F]
  66728. // * VPCOMPRESSD zmm, m512{k}{z} [AVX512F]
  66729. // * VPCOMPRESSD xmm, xmm{k}{z} [AVX512F,AVX512VL]
  66730. // * VPCOMPRESSD xmm, m128{k}{z} [AVX512F,AVX512VL]
  66731. // * VPCOMPRESSD ymm, ymm{k}{z} [AVX512F,AVX512VL]
  66732. // * VPCOMPRESSD ymm, m256{k}{z} [AVX512F,AVX512VL]
  66733. //
  66734. func (self *Program) VPCOMPRESSD(v0 interface{}, v1 interface{}) *Instruction {
  66735. p := self.alloc("VPCOMPRESSD", 2, Operands { v0, v1 })
  66736. // VPCOMPRESSD zmm, zmm{k}{z}
  66737. if isZMM(v0) && isZMMkz(v1) {
  66738. self.require(ISA_AVX512F)
  66739. p.domain = DomainAVX
  66740. p.add(0, func(m *_Encoding, v []interface{}) {
  66741. m.emit(0x62)
  66742. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  66743. m.emit(0x7d)
  66744. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  66745. m.emit(0x8b)
  66746. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  66747. })
  66748. }
  66749. // VPCOMPRESSD zmm, m512{k}{z}
  66750. if isZMM(v0) && isM512kz(v1) {
  66751. self.require(ISA_AVX512F)
  66752. p.domain = DomainAVX
  66753. p.add(0, func(m *_Encoding, v []interface{}) {
  66754. m.evex(0b10, 0x05, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  66755. m.emit(0x8b)
  66756. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  66757. })
  66758. }
  66759. // VPCOMPRESSD xmm, xmm{k}{z}
  66760. if isEVEXXMM(v0) && isXMMkz(v1) {
  66761. self.require(ISA_AVX512VL | ISA_AVX512F)
  66762. p.domain = DomainAVX
  66763. p.add(0, func(m *_Encoding, v []interface{}) {
  66764. m.emit(0x62)
  66765. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  66766. m.emit(0x7d)
  66767. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  66768. m.emit(0x8b)
  66769. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  66770. })
  66771. }
  66772. // VPCOMPRESSD xmm, m128{k}{z}
  66773. if isEVEXXMM(v0) && isM128kz(v1) {
  66774. self.require(ISA_AVX512VL | ISA_AVX512F)
  66775. p.domain = DomainAVX
  66776. p.add(0, func(m *_Encoding, v []interface{}) {
  66777. m.evex(0b10, 0x05, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  66778. m.emit(0x8b)
  66779. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  66780. })
  66781. }
  66782. // VPCOMPRESSD ymm, ymm{k}{z}
  66783. if isEVEXYMM(v0) && isYMMkz(v1) {
  66784. self.require(ISA_AVX512VL | ISA_AVX512F)
  66785. p.domain = DomainAVX
  66786. p.add(0, func(m *_Encoding, v []interface{}) {
  66787. m.emit(0x62)
  66788. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  66789. m.emit(0x7d)
  66790. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  66791. m.emit(0x8b)
  66792. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  66793. })
  66794. }
  66795. // VPCOMPRESSD ymm, m256{k}{z}
  66796. if isEVEXYMM(v0) && isM256kz(v1) {
  66797. self.require(ISA_AVX512VL | ISA_AVX512F)
  66798. p.domain = DomainAVX
  66799. p.add(0, func(m *_Encoding, v []interface{}) {
  66800. m.evex(0b10, 0x05, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  66801. m.emit(0x8b)
  66802. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  66803. })
  66804. }
  66805. if p.len == 0 {
  66806. panic("invalid operands for VPCOMPRESSD")
  66807. }
  66808. return p
  66809. }
  66810. // VPCOMPRESSQ performs "Store Sparse Packed Quadword Integer Values into Dense Memory/Register".
  66811. //
  66812. // Mnemonic : VPCOMPRESSQ
  66813. // Supported forms : (6 forms)
  66814. //
  66815. // * VPCOMPRESSQ zmm, zmm{k}{z} [AVX512F]
  66816. // * VPCOMPRESSQ zmm, m512{k}{z} [AVX512F]
  66817. // * VPCOMPRESSQ xmm, xmm{k}{z} [AVX512F,AVX512VL]
  66818. // * VPCOMPRESSQ xmm, m128{k}{z} [AVX512F,AVX512VL]
  66819. // * VPCOMPRESSQ ymm, ymm{k}{z} [AVX512F,AVX512VL]
  66820. // * VPCOMPRESSQ ymm, m256{k}{z} [AVX512F,AVX512VL]
  66821. //
  66822. func (self *Program) VPCOMPRESSQ(v0 interface{}, v1 interface{}) *Instruction {
  66823. p := self.alloc("VPCOMPRESSQ", 2, Operands { v0, v1 })
  66824. // VPCOMPRESSQ zmm, zmm{k}{z}
  66825. if isZMM(v0) && isZMMkz(v1) {
  66826. self.require(ISA_AVX512F)
  66827. p.domain = DomainAVX
  66828. p.add(0, func(m *_Encoding, v []interface{}) {
  66829. m.emit(0x62)
  66830. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  66831. m.emit(0xfd)
  66832. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  66833. m.emit(0x8b)
  66834. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  66835. })
  66836. }
  66837. // VPCOMPRESSQ zmm, m512{k}{z}
  66838. if isZMM(v0) && isM512kz(v1) {
  66839. self.require(ISA_AVX512F)
  66840. p.domain = DomainAVX
  66841. p.add(0, func(m *_Encoding, v []interface{}) {
  66842. m.evex(0b10, 0x85, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  66843. m.emit(0x8b)
  66844. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  66845. })
  66846. }
  66847. // VPCOMPRESSQ xmm, xmm{k}{z}
  66848. if isEVEXXMM(v0) && isXMMkz(v1) {
  66849. self.require(ISA_AVX512VL | ISA_AVX512F)
  66850. p.domain = DomainAVX
  66851. p.add(0, func(m *_Encoding, v []interface{}) {
  66852. m.emit(0x62)
  66853. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  66854. m.emit(0xfd)
  66855. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  66856. m.emit(0x8b)
  66857. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  66858. })
  66859. }
  66860. // VPCOMPRESSQ xmm, m128{k}{z}
  66861. if isEVEXXMM(v0) && isM128kz(v1) {
  66862. self.require(ISA_AVX512VL | ISA_AVX512F)
  66863. p.domain = DomainAVX
  66864. p.add(0, func(m *_Encoding, v []interface{}) {
  66865. m.evex(0b10, 0x85, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  66866. m.emit(0x8b)
  66867. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  66868. })
  66869. }
  66870. // VPCOMPRESSQ ymm, ymm{k}{z}
  66871. if isEVEXYMM(v0) && isYMMkz(v1) {
  66872. self.require(ISA_AVX512VL | ISA_AVX512F)
  66873. p.domain = DomainAVX
  66874. p.add(0, func(m *_Encoding, v []interface{}) {
  66875. m.emit(0x62)
  66876. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  66877. m.emit(0xfd)
  66878. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  66879. m.emit(0x8b)
  66880. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  66881. })
  66882. }
  66883. // VPCOMPRESSQ ymm, m256{k}{z}
  66884. if isEVEXYMM(v0) && isM256kz(v1) {
  66885. self.require(ISA_AVX512VL | ISA_AVX512F)
  66886. p.domain = DomainAVX
  66887. p.add(0, func(m *_Encoding, v []interface{}) {
  66888. m.evex(0b10, 0x85, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  66889. m.emit(0x8b)
  66890. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  66891. })
  66892. }
  66893. if p.len == 0 {
  66894. panic("invalid operands for VPCOMPRESSQ")
  66895. }
  66896. return p
  66897. }
  66898. // VPCOMQ performs "Compare Packed Signed Quadword Integers".
  66899. //
  66900. // Mnemonic : VPCOMQ
  66901. // Supported forms : (2 forms)
  66902. //
  66903. // * VPCOMQ imm8, xmm, xmm, xmm [XOP]
  66904. // * VPCOMQ imm8, m128, xmm, xmm [XOP]
  66905. //
  66906. func (self *Program) VPCOMQ(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  66907. p := self.alloc("VPCOMQ", 4, Operands { v0, v1, v2, v3 })
  66908. // VPCOMQ imm8, xmm, xmm, xmm
  66909. if isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  66910. self.require(ISA_XOP)
  66911. p.domain = DomainAMDSpecific
  66912. p.add(0, func(m *_Encoding, v []interface{}) {
  66913. m.emit(0x8f)
  66914. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  66915. m.emit(0x78 ^ (hlcode(v[2]) << 3))
  66916. m.emit(0xcf)
  66917. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66918. m.imm1(toImmAny(v[0]))
  66919. })
  66920. }
  66921. // VPCOMQ imm8, m128, xmm, xmm
  66922. if isImm8(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  66923. self.require(ISA_XOP)
  66924. p.domain = DomainAMDSpecific
  66925. p.add(0, func(m *_Encoding, v []interface{}) {
  66926. m.vex3(0x8f, 0b1000, 0x00, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  66927. m.emit(0xcf)
  66928. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  66929. m.imm1(toImmAny(v[0]))
  66930. })
  66931. }
  66932. if p.len == 0 {
  66933. panic("invalid operands for VPCOMQ")
  66934. }
  66935. return p
  66936. }
  66937. // VPCOMUB performs "Compare Packed Unsigned Byte Integers".
  66938. //
  66939. // Mnemonic : VPCOMUB
  66940. // Supported forms : (2 forms)
  66941. //
  66942. // * VPCOMUB imm8, xmm, xmm, xmm [XOP]
  66943. // * VPCOMUB imm8, m128, xmm, xmm [XOP]
  66944. //
  66945. func (self *Program) VPCOMUB(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  66946. p := self.alloc("VPCOMUB", 4, Operands { v0, v1, v2, v3 })
  66947. // VPCOMUB imm8, xmm, xmm, xmm
  66948. if isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  66949. self.require(ISA_XOP)
  66950. p.domain = DomainAMDSpecific
  66951. p.add(0, func(m *_Encoding, v []interface{}) {
  66952. m.emit(0x8f)
  66953. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  66954. m.emit(0x78 ^ (hlcode(v[2]) << 3))
  66955. m.emit(0xec)
  66956. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66957. m.imm1(toImmAny(v[0]))
  66958. })
  66959. }
  66960. // VPCOMUB imm8, m128, xmm, xmm
  66961. if isImm8(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  66962. self.require(ISA_XOP)
  66963. p.domain = DomainAMDSpecific
  66964. p.add(0, func(m *_Encoding, v []interface{}) {
  66965. m.vex3(0x8f, 0b1000, 0x00, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  66966. m.emit(0xec)
  66967. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  66968. m.imm1(toImmAny(v[0]))
  66969. })
  66970. }
  66971. if p.len == 0 {
  66972. panic("invalid operands for VPCOMUB")
  66973. }
  66974. return p
  66975. }
  66976. // VPCOMUD performs "Compare Packed Unsigned Doubleword Integers".
  66977. //
  66978. // Mnemonic : VPCOMUD
  66979. // Supported forms : (2 forms)
  66980. //
  66981. // * VPCOMUD imm8, xmm, xmm, xmm [XOP]
  66982. // * VPCOMUD imm8, m128, xmm, xmm [XOP]
  66983. //
  66984. func (self *Program) VPCOMUD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  66985. p := self.alloc("VPCOMUD", 4, Operands { v0, v1, v2, v3 })
  66986. // VPCOMUD imm8, xmm, xmm, xmm
  66987. if isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  66988. self.require(ISA_XOP)
  66989. p.domain = DomainAMDSpecific
  66990. p.add(0, func(m *_Encoding, v []interface{}) {
  66991. m.emit(0x8f)
  66992. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  66993. m.emit(0x78 ^ (hlcode(v[2]) << 3))
  66994. m.emit(0xee)
  66995. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  66996. m.imm1(toImmAny(v[0]))
  66997. })
  66998. }
  66999. // VPCOMUD imm8, m128, xmm, xmm
  67000. if isImm8(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  67001. self.require(ISA_XOP)
  67002. p.domain = DomainAMDSpecific
  67003. p.add(0, func(m *_Encoding, v []interface{}) {
  67004. m.vex3(0x8f, 0b1000, 0x00, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  67005. m.emit(0xee)
  67006. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  67007. m.imm1(toImmAny(v[0]))
  67008. })
  67009. }
  67010. if p.len == 0 {
  67011. panic("invalid operands for VPCOMUD")
  67012. }
  67013. return p
  67014. }
  67015. // VPCOMUQ performs "Compare Packed Unsigned Quadword Integers".
  67016. //
  67017. // Mnemonic : VPCOMUQ
  67018. // Supported forms : (2 forms)
  67019. //
  67020. // * VPCOMUQ imm8, xmm, xmm, xmm [XOP]
  67021. // * VPCOMUQ imm8, m128, xmm, xmm [XOP]
  67022. //
  67023. func (self *Program) VPCOMUQ(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  67024. p := self.alloc("VPCOMUQ", 4, Operands { v0, v1, v2, v3 })
  67025. // VPCOMUQ imm8, xmm, xmm, xmm
  67026. if isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  67027. self.require(ISA_XOP)
  67028. p.domain = DomainAMDSpecific
  67029. p.add(0, func(m *_Encoding, v []interface{}) {
  67030. m.emit(0x8f)
  67031. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  67032. m.emit(0x78 ^ (hlcode(v[2]) << 3))
  67033. m.emit(0xef)
  67034. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  67035. m.imm1(toImmAny(v[0]))
  67036. })
  67037. }
  67038. // VPCOMUQ imm8, m128, xmm, xmm
  67039. if isImm8(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  67040. self.require(ISA_XOP)
  67041. p.domain = DomainAMDSpecific
  67042. p.add(0, func(m *_Encoding, v []interface{}) {
  67043. m.vex3(0x8f, 0b1000, 0x00, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  67044. m.emit(0xef)
  67045. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  67046. m.imm1(toImmAny(v[0]))
  67047. })
  67048. }
  67049. if p.len == 0 {
  67050. panic("invalid operands for VPCOMUQ")
  67051. }
  67052. return p
  67053. }
  67054. // VPCOMUW performs "Compare Packed Unsigned Word Integers".
  67055. //
  67056. // Mnemonic : VPCOMUW
  67057. // Supported forms : (2 forms)
  67058. //
  67059. // * VPCOMUW imm8, xmm, xmm, xmm [XOP]
  67060. // * VPCOMUW imm8, m128, xmm, xmm [XOP]
  67061. //
  67062. func (self *Program) VPCOMUW(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  67063. p := self.alloc("VPCOMUW", 4, Operands { v0, v1, v2, v3 })
  67064. // VPCOMUW imm8, xmm, xmm, xmm
  67065. if isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  67066. self.require(ISA_XOP)
  67067. p.domain = DomainAMDSpecific
  67068. p.add(0, func(m *_Encoding, v []interface{}) {
  67069. m.emit(0x8f)
  67070. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  67071. m.emit(0x78 ^ (hlcode(v[2]) << 3))
  67072. m.emit(0xed)
  67073. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  67074. m.imm1(toImmAny(v[0]))
  67075. })
  67076. }
  67077. // VPCOMUW imm8, m128, xmm, xmm
  67078. if isImm8(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  67079. self.require(ISA_XOP)
  67080. p.domain = DomainAMDSpecific
  67081. p.add(0, func(m *_Encoding, v []interface{}) {
  67082. m.vex3(0x8f, 0b1000, 0x00, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  67083. m.emit(0xed)
  67084. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  67085. m.imm1(toImmAny(v[0]))
  67086. })
  67087. }
  67088. if p.len == 0 {
  67089. panic("invalid operands for VPCOMUW")
  67090. }
  67091. return p
  67092. }
  67093. // VPCOMW performs "Compare Packed Signed Word Integers".
  67094. //
  67095. // Mnemonic : VPCOMW
  67096. // Supported forms : (2 forms)
  67097. //
  67098. // * VPCOMW imm8, xmm, xmm, xmm [XOP]
  67099. // * VPCOMW imm8, m128, xmm, xmm [XOP]
  67100. //
  67101. func (self *Program) VPCOMW(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  67102. p := self.alloc("VPCOMW", 4, Operands { v0, v1, v2, v3 })
  67103. // VPCOMW imm8, xmm, xmm, xmm
  67104. if isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  67105. self.require(ISA_XOP)
  67106. p.domain = DomainAMDSpecific
  67107. p.add(0, func(m *_Encoding, v []interface{}) {
  67108. m.emit(0x8f)
  67109. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  67110. m.emit(0x78 ^ (hlcode(v[2]) << 3))
  67111. m.emit(0xcd)
  67112. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  67113. m.imm1(toImmAny(v[0]))
  67114. })
  67115. }
  67116. // VPCOMW imm8, m128, xmm, xmm
  67117. if isImm8(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  67118. self.require(ISA_XOP)
  67119. p.domain = DomainAMDSpecific
  67120. p.add(0, func(m *_Encoding, v []interface{}) {
  67121. m.vex3(0x8f, 0b1000, 0x00, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  67122. m.emit(0xcd)
  67123. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  67124. m.imm1(toImmAny(v[0]))
  67125. })
  67126. }
  67127. if p.len == 0 {
  67128. panic("invalid operands for VPCOMW")
  67129. }
  67130. return p
  67131. }
  67132. // VPCONFLICTD performs "Detect Conflicts Within a Vector of Packed Doubleword Values into Dense Memory/Register".
  67133. //
  67134. // Mnemonic : VPCONFLICTD
  67135. // Supported forms : (6 forms)
  67136. //
  67137. // * VPCONFLICTD m128/m32bcst, xmm{k}{z} [AVX512CD,AVX512VL]
  67138. // * VPCONFLICTD m256/m32bcst, ymm{k}{z} [AVX512CD,AVX512VL]
  67139. // * VPCONFLICTD m512/m32bcst, zmm{k}{z} [AVX512CD]
  67140. // * VPCONFLICTD xmm, xmm{k}{z} [AVX512CD,AVX512VL]
  67141. // * VPCONFLICTD ymm, ymm{k}{z} [AVX512CD,AVX512VL]
  67142. // * VPCONFLICTD zmm, zmm{k}{z} [AVX512CD]
  67143. //
  67144. func (self *Program) VPCONFLICTD(v0 interface{}, v1 interface{}) *Instruction {
  67145. p := self.alloc("VPCONFLICTD", 2, Operands { v0, v1 })
  67146. // VPCONFLICTD m128/m32bcst, xmm{k}{z}
  67147. if isM128M32bcst(v0) && isXMMkz(v1) {
  67148. self.require(ISA_AVX512VL | ISA_AVX512CD)
  67149. p.domain = DomainAVX
  67150. p.add(0, func(m *_Encoding, v []interface{}) {
  67151. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  67152. m.emit(0xc4)
  67153. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  67154. })
  67155. }
  67156. // VPCONFLICTD m256/m32bcst, ymm{k}{z}
  67157. if isM256M32bcst(v0) && isYMMkz(v1) {
  67158. self.require(ISA_AVX512VL | ISA_AVX512CD)
  67159. p.domain = DomainAVX
  67160. p.add(0, func(m *_Encoding, v []interface{}) {
  67161. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  67162. m.emit(0xc4)
  67163. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  67164. })
  67165. }
  67166. // VPCONFLICTD m512/m32bcst, zmm{k}{z}
  67167. if isM512M32bcst(v0) && isZMMkz(v1) {
  67168. self.require(ISA_AVX512CD)
  67169. p.domain = DomainAVX
  67170. p.add(0, func(m *_Encoding, v []interface{}) {
  67171. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  67172. m.emit(0xc4)
  67173. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  67174. })
  67175. }
  67176. // VPCONFLICTD xmm, xmm{k}{z}
  67177. if isEVEXXMM(v0) && isXMMkz(v1) {
  67178. self.require(ISA_AVX512VL | ISA_AVX512CD)
  67179. p.domain = DomainAVX
  67180. p.add(0, func(m *_Encoding, v []interface{}) {
  67181. m.emit(0x62)
  67182. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  67183. m.emit(0x7d)
  67184. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  67185. m.emit(0xc4)
  67186. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  67187. })
  67188. }
  67189. // VPCONFLICTD ymm, ymm{k}{z}
  67190. if isEVEXYMM(v0) && isYMMkz(v1) {
  67191. self.require(ISA_AVX512VL | ISA_AVX512CD)
  67192. p.domain = DomainAVX
  67193. p.add(0, func(m *_Encoding, v []interface{}) {
  67194. m.emit(0x62)
  67195. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  67196. m.emit(0x7d)
  67197. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  67198. m.emit(0xc4)
  67199. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  67200. })
  67201. }
  67202. // VPCONFLICTD zmm, zmm{k}{z}
  67203. if isZMM(v0) && isZMMkz(v1) {
  67204. self.require(ISA_AVX512CD)
  67205. p.domain = DomainAVX
  67206. p.add(0, func(m *_Encoding, v []interface{}) {
  67207. m.emit(0x62)
  67208. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  67209. m.emit(0x7d)
  67210. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  67211. m.emit(0xc4)
  67212. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  67213. })
  67214. }
  67215. if p.len == 0 {
  67216. panic("invalid operands for VPCONFLICTD")
  67217. }
  67218. return p
  67219. }
  67220. // VPCONFLICTQ performs "Detect Conflicts Within a Vector of Packed Quadword Values into Dense Memory/Register".
  67221. //
  67222. // Mnemonic : VPCONFLICTQ
  67223. // Supported forms : (6 forms)
  67224. //
  67225. // * VPCONFLICTQ m128/m64bcst, xmm{k}{z} [AVX512CD,AVX512VL]
  67226. // * VPCONFLICTQ m256/m64bcst, ymm{k}{z} [AVX512CD,AVX512VL]
  67227. // * VPCONFLICTQ m512/m64bcst, zmm{k}{z} [AVX512CD]
  67228. // * VPCONFLICTQ xmm, xmm{k}{z} [AVX512CD,AVX512VL]
  67229. // * VPCONFLICTQ ymm, ymm{k}{z} [AVX512CD,AVX512VL]
  67230. // * VPCONFLICTQ zmm, zmm{k}{z} [AVX512CD]
  67231. //
  67232. func (self *Program) VPCONFLICTQ(v0 interface{}, v1 interface{}) *Instruction {
  67233. p := self.alloc("VPCONFLICTQ", 2, Operands { v0, v1 })
  67234. // VPCONFLICTQ m128/m64bcst, xmm{k}{z}
  67235. if isM128M64bcst(v0) && isXMMkz(v1) {
  67236. self.require(ISA_AVX512VL | ISA_AVX512CD)
  67237. p.domain = DomainAVX
  67238. p.add(0, func(m *_Encoding, v []interface{}) {
  67239. m.evex(0b10, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  67240. m.emit(0xc4)
  67241. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  67242. })
  67243. }
  67244. // VPCONFLICTQ m256/m64bcst, ymm{k}{z}
  67245. if isM256M64bcst(v0) && isYMMkz(v1) {
  67246. self.require(ISA_AVX512VL | ISA_AVX512CD)
  67247. p.domain = DomainAVX
  67248. p.add(0, func(m *_Encoding, v []interface{}) {
  67249. m.evex(0b10, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  67250. m.emit(0xc4)
  67251. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  67252. })
  67253. }
  67254. // VPCONFLICTQ m512/m64bcst, zmm{k}{z}
  67255. if isM512M64bcst(v0) && isZMMkz(v1) {
  67256. self.require(ISA_AVX512CD)
  67257. p.domain = DomainAVX
  67258. p.add(0, func(m *_Encoding, v []interface{}) {
  67259. m.evex(0b10, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  67260. m.emit(0xc4)
  67261. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  67262. })
  67263. }
  67264. // VPCONFLICTQ xmm, xmm{k}{z}
  67265. if isEVEXXMM(v0) && isXMMkz(v1) {
  67266. self.require(ISA_AVX512VL | ISA_AVX512CD)
  67267. p.domain = DomainAVX
  67268. p.add(0, func(m *_Encoding, v []interface{}) {
  67269. m.emit(0x62)
  67270. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  67271. m.emit(0xfd)
  67272. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  67273. m.emit(0xc4)
  67274. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  67275. })
  67276. }
  67277. // VPCONFLICTQ ymm, ymm{k}{z}
  67278. if isEVEXYMM(v0) && isYMMkz(v1) {
  67279. self.require(ISA_AVX512VL | ISA_AVX512CD)
  67280. p.domain = DomainAVX
  67281. p.add(0, func(m *_Encoding, v []interface{}) {
  67282. m.emit(0x62)
  67283. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  67284. m.emit(0xfd)
  67285. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  67286. m.emit(0xc4)
  67287. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  67288. })
  67289. }
  67290. // VPCONFLICTQ zmm, zmm{k}{z}
  67291. if isZMM(v0) && isZMMkz(v1) {
  67292. self.require(ISA_AVX512CD)
  67293. p.domain = DomainAVX
  67294. p.add(0, func(m *_Encoding, v []interface{}) {
  67295. m.emit(0x62)
  67296. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  67297. m.emit(0xfd)
  67298. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  67299. m.emit(0xc4)
  67300. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  67301. })
  67302. }
  67303. if p.len == 0 {
  67304. panic("invalid operands for VPCONFLICTQ")
  67305. }
  67306. return p
  67307. }
  67308. // VPERM2F128 performs "Permute Floating-Point Values".
  67309. //
  67310. // Mnemonic : VPERM2F128
  67311. // Supported forms : (2 forms)
  67312. //
  67313. // * VPERM2F128 imm8, ymm, ymm, ymm [AVX]
  67314. // * VPERM2F128 imm8, m256, ymm, ymm [AVX]
  67315. //
  67316. func (self *Program) VPERM2F128(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  67317. p := self.alloc("VPERM2F128", 4, Operands { v0, v1, v2, v3 })
  67318. // VPERM2F128 imm8, ymm, ymm, ymm
  67319. if isImm8(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  67320. self.require(ISA_AVX)
  67321. p.domain = DomainAVX
  67322. p.add(0, func(m *_Encoding, v []interface{}) {
  67323. m.emit(0xc4)
  67324. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  67325. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  67326. m.emit(0x06)
  67327. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  67328. m.imm1(toImmAny(v[0]))
  67329. })
  67330. }
  67331. // VPERM2F128 imm8, m256, ymm, ymm
  67332. if isImm8(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  67333. self.require(ISA_AVX)
  67334. p.domain = DomainAVX
  67335. p.add(0, func(m *_Encoding, v []interface{}) {
  67336. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  67337. m.emit(0x06)
  67338. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  67339. m.imm1(toImmAny(v[0]))
  67340. })
  67341. }
  67342. if p.len == 0 {
  67343. panic("invalid operands for VPERM2F128")
  67344. }
  67345. return p
  67346. }
  67347. // VPERM2I128 performs "Permute 128-Bit Integer Values".
  67348. //
  67349. // Mnemonic : VPERM2I128
  67350. // Supported forms : (2 forms)
  67351. //
  67352. // * VPERM2I128 imm8, ymm, ymm, ymm [AVX2]
  67353. // * VPERM2I128 imm8, m256, ymm, ymm [AVX2]
  67354. //
  67355. func (self *Program) VPERM2I128(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  67356. p := self.alloc("VPERM2I128", 4, Operands { v0, v1, v2, v3 })
  67357. // VPERM2I128 imm8, ymm, ymm, ymm
  67358. if isImm8(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  67359. self.require(ISA_AVX2)
  67360. p.domain = DomainAVX
  67361. p.add(0, func(m *_Encoding, v []interface{}) {
  67362. m.emit(0xc4)
  67363. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  67364. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  67365. m.emit(0x46)
  67366. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  67367. m.imm1(toImmAny(v[0]))
  67368. })
  67369. }
  67370. // VPERM2I128 imm8, m256, ymm, ymm
  67371. if isImm8(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  67372. self.require(ISA_AVX2)
  67373. p.domain = DomainAVX
  67374. p.add(0, func(m *_Encoding, v []interface{}) {
  67375. m.vex3(0xc4, 0b11, 0x05, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  67376. m.emit(0x46)
  67377. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  67378. m.imm1(toImmAny(v[0]))
  67379. })
  67380. }
  67381. if p.len == 0 {
  67382. panic("invalid operands for VPERM2I128")
  67383. }
  67384. return p
  67385. }
  67386. // VPERMB performs "Permute Byte Integers".
  67387. //
  67388. // Mnemonic : VPERMB
  67389. // Supported forms : (6 forms)
  67390. //
  67391. // * VPERMB xmm, xmm, xmm{k}{z} [AVX512VBMI,AVX512VL]
  67392. // * VPERMB m128, xmm, xmm{k}{z} [AVX512VBMI,AVX512VL]
  67393. // * VPERMB ymm, ymm, ymm{k}{z} [AVX512VBMI,AVX512VL]
  67394. // * VPERMB m256, ymm, ymm{k}{z} [AVX512VBMI,AVX512VL]
  67395. // * VPERMB zmm, zmm, zmm{k}{z} [AVX512VBMI]
  67396. // * VPERMB m512, zmm, zmm{k}{z} [AVX512VBMI]
  67397. //
  67398. func (self *Program) VPERMB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  67399. p := self.alloc("VPERMB", 3, Operands { v0, v1, v2 })
  67400. // VPERMB xmm, xmm, xmm{k}{z}
  67401. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  67402. self.require(ISA_AVX512VL | ISA_AVX512VBMI)
  67403. p.domain = DomainAVX
  67404. p.add(0, func(m *_Encoding, v []interface{}) {
  67405. m.emit(0x62)
  67406. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  67407. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  67408. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  67409. m.emit(0x8d)
  67410. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  67411. })
  67412. }
  67413. // VPERMB m128, xmm, xmm{k}{z}
  67414. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  67415. self.require(ISA_AVX512VL | ISA_AVX512VBMI)
  67416. p.domain = DomainAVX
  67417. p.add(0, func(m *_Encoding, v []interface{}) {
  67418. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  67419. m.emit(0x8d)
  67420. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  67421. })
  67422. }
  67423. // VPERMB ymm, ymm, ymm{k}{z}
  67424. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  67425. self.require(ISA_AVX512VL | ISA_AVX512VBMI)
  67426. p.domain = DomainAVX
  67427. p.add(0, func(m *_Encoding, v []interface{}) {
  67428. m.emit(0x62)
  67429. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  67430. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  67431. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  67432. m.emit(0x8d)
  67433. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  67434. })
  67435. }
  67436. // VPERMB m256, ymm, ymm{k}{z}
  67437. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  67438. self.require(ISA_AVX512VL | ISA_AVX512VBMI)
  67439. p.domain = DomainAVX
  67440. p.add(0, func(m *_Encoding, v []interface{}) {
  67441. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  67442. m.emit(0x8d)
  67443. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  67444. })
  67445. }
  67446. // VPERMB zmm, zmm, zmm{k}{z}
  67447. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  67448. self.require(ISA_AVX512VBMI)
  67449. p.domain = DomainAVX
  67450. p.add(0, func(m *_Encoding, v []interface{}) {
  67451. m.emit(0x62)
  67452. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  67453. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  67454. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  67455. m.emit(0x8d)
  67456. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  67457. })
  67458. }
  67459. // VPERMB m512, zmm, zmm{k}{z}
  67460. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  67461. self.require(ISA_AVX512VBMI)
  67462. p.domain = DomainAVX
  67463. p.add(0, func(m *_Encoding, v []interface{}) {
  67464. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  67465. m.emit(0x8d)
  67466. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  67467. })
  67468. }
  67469. if p.len == 0 {
  67470. panic("invalid operands for VPERMB")
  67471. }
  67472. return p
  67473. }
  67474. // VPERMD performs "Permute Doubleword Integers".
  67475. //
  67476. // Mnemonic : VPERMD
  67477. // Supported forms : (6 forms)
  67478. //
  67479. // * VPERMD ymm, ymm, ymm [AVX2]
  67480. // * VPERMD m256, ymm, ymm [AVX2]
  67481. // * VPERMD m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  67482. // * VPERMD zmm, zmm, zmm{k}{z} [AVX512F]
  67483. // * VPERMD m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  67484. // * VPERMD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  67485. //
  67486. func (self *Program) VPERMD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  67487. p := self.alloc("VPERMD", 3, Operands { v0, v1, v2 })
  67488. // VPERMD ymm, ymm, ymm
  67489. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  67490. self.require(ISA_AVX2)
  67491. p.domain = DomainAVX
  67492. p.add(0, func(m *_Encoding, v []interface{}) {
  67493. m.emit(0xc4)
  67494. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  67495. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  67496. m.emit(0x36)
  67497. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  67498. })
  67499. }
  67500. // VPERMD m256, ymm, ymm
  67501. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  67502. self.require(ISA_AVX2)
  67503. p.domain = DomainAVX
  67504. p.add(0, func(m *_Encoding, v []interface{}) {
  67505. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  67506. m.emit(0x36)
  67507. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  67508. })
  67509. }
  67510. // VPERMD m512/m32bcst, zmm, zmm{k}{z}
  67511. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  67512. self.require(ISA_AVX512F)
  67513. p.domain = DomainAVX
  67514. p.add(0, func(m *_Encoding, v []interface{}) {
  67515. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  67516. m.emit(0x36)
  67517. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  67518. })
  67519. }
  67520. // VPERMD zmm, zmm, zmm{k}{z}
  67521. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  67522. self.require(ISA_AVX512F)
  67523. p.domain = DomainAVX
  67524. p.add(0, func(m *_Encoding, v []interface{}) {
  67525. m.emit(0x62)
  67526. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  67527. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  67528. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  67529. m.emit(0x36)
  67530. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  67531. })
  67532. }
  67533. // VPERMD m256/m32bcst, ymm, ymm{k}{z}
  67534. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  67535. self.require(ISA_AVX512VL | ISA_AVX512F)
  67536. p.domain = DomainAVX
  67537. p.add(0, func(m *_Encoding, v []interface{}) {
  67538. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  67539. m.emit(0x36)
  67540. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  67541. })
  67542. }
  67543. // VPERMD ymm, ymm, ymm{k}{z}
  67544. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  67545. self.require(ISA_AVX512VL | ISA_AVX512F)
  67546. p.domain = DomainAVX
  67547. p.add(0, func(m *_Encoding, v []interface{}) {
  67548. m.emit(0x62)
  67549. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  67550. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  67551. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  67552. m.emit(0x36)
  67553. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  67554. })
  67555. }
  67556. if p.len == 0 {
  67557. panic("invalid operands for VPERMD")
  67558. }
  67559. return p
  67560. }
  67561. // VPERMI2B performs "Full Permute of Bytes From Two Tables Overwriting the Index".
  67562. //
  67563. // Mnemonic : VPERMI2B
  67564. // Supported forms : (6 forms)
  67565. //
  67566. // * VPERMI2B xmm, xmm, xmm{k}{z} [AVX512VBMI,AVX512VL]
  67567. // * VPERMI2B m128, xmm, xmm{k}{z} [AVX512VBMI,AVX512VL]
  67568. // * VPERMI2B ymm, ymm, ymm{k}{z} [AVX512VBMI,AVX512VL]
  67569. // * VPERMI2B m256, ymm, ymm{k}{z} [AVX512VBMI,AVX512VL]
  67570. // * VPERMI2B zmm, zmm, zmm{k}{z} [AVX512VBMI]
  67571. // * VPERMI2B m512, zmm, zmm{k}{z} [AVX512VBMI]
  67572. //
  67573. func (self *Program) VPERMI2B(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  67574. p := self.alloc("VPERMI2B", 3, Operands { v0, v1, v2 })
  67575. // VPERMI2B xmm, xmm, xmm{k}{z}
  67576. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  67577. self.require(ISA_AVX512VL | ISA_AVX512VBMI)
  67578. p.domain = DomainAVX
  67579. p.add(0, func(m *_Encoding, v []interface{}) {
  67580. m.emit(0x62)
  67581. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  67582. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  67583. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  67584. m.emit(0x75)
  67585. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  67586. })
  67587. }
  67588. // VPERMI2B m128, xmm, xmm{k}{z}
  67589. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  67590. self.require(ISA_AVX512VL | ISA_AVX512VBMI)
  67591. p.domain = DomainAVX
  67592. p.add(0, func(m *_Encoding, v []interface{}) {
  67593. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  67594. m.emit(0x75)
  67595. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  67596. })
  67597. }
  67598. // VPERMI2B ymm, ymm, ymm{k}{z}
  67599. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  67600. self.require(ISA_AVX512VL | ISA_AVX512VBMI)
  67601. p.domain = DomainAVX
  67602. p.add(0, func(m *_Encoding, v []interface{}) {
  67603. m.emit(0x62)
  67604. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  67605. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  67606. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  67607. m.emit(0x75)
  67608. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  67609. })
  67610. }
  67611. // VPERMI2B m256, ymm, ymm{k}{z}
  67612. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  67613. self.require(ISA_AVX512VL | ISA_AVX512VBMI)
  67614. p.domain = DomainAVX
  67615. p.add(0, func(m *_Encoding, v []interface{}) {
  67616. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  67617. m.emit(0x75)
  67618. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  67619. })
  67620. }
  67621. // VPERMI2B zmm, zmm, zmm{k}{z}
  67622. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  67623. self.require(ISA_AVX512VBMI)
  67624. p.domain = DomainAVX
  67625. p.add(0, func(m *_Encoding, v []interface{}) {
  67626. m.emit(0x62)
  67627. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  67628. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  67629. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  67630. m.emit(0x75)
  67631. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  67632. })
  67633. }
  67634. // VPERMI2B m512, zmm, zmm{k}{z}
  67635. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  67636. self.require(ISA_AVX512VBMI)
  67637. p.domain = DomainAVX
  67638. p.add(0, func(m *_Encoding, v []interface{}) {
  67639. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  67640. m.emit(0x75)
  67641. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  67642. })
  67643. }
  67644. if p.len == 0 {
  67645. panic("invalid operands for VPERMI2B")
  67646. }
  67647. return p
  67648. }
  67649. // VPERMI2D performs "Full Permute of Doublewords From Two Tables Overwriting the Index".
  67650. //
  67651. // Mnemonic : VPERMI2D
  67652. // Supported forms : (6 forms)
  67653. //
  67654. // * VPERMI2D m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  67655. // * VPERMI2D zmm, zmm, zmm{k}{z} [AVX512F]
  67656. // * VPERMI2D m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  67657. // * VPERMI2D xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  67658. // * VPERMI2D m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  67659. // * VPERMI2D ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  67660. //
  67661. func (self *Program) VPERMI2D(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  67662. p := self.alloc("VPERMI2D", 3, Operands { v0, v1, v2 })
  67663. // VPERMI2D m512/m32bcst, zmm, zmm{k}{z}
  67664. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  67665. self.require(ISA_AVX512F)
  67666. p.domain = DomainAVX
  67667. p.add(0, func(m *_Encoding, v []interface{}) {
  67668. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  67669. m.emit(0x76)
  67670. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  67671. })
  67672. }
  67673. // VPERMI2D zmm, zmm, zmm{k}{z}
  67674. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  67675. self.require(ISA_AVX512F)
  67676. p.domain = DomainAVX
  67677. p.add(0, func(m *_Encoding, v []interface{}) {
  67678. m.emit(0x62)
  67679. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  67680. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  67681. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  67682. m.emit(0x76)
  67683. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  67684. })
  67685. }
  67686. // VPERMI2D m128/m32bcst, xmm, xmm{k}{z}
  67687. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  67688. self.require(ISA_AVX512VL | ISA_AVX512F)
  67689. p.domain = DomainAVX
  67690. p.add(0, func(m *_Encoding, v []interface{}) {
  67691. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  67692. m.emit(0x76)
  67693. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  67694. })
  67695. }
  67696. // VPERMI2D xmm, xmm, xmm{k}{z}
  67697. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  67698. self.require(ISA_AVX512VL | ISA_AVX512F)
  67699. p.domain = DomainAVX
  67700. p.add(0, func(m *_Encoding, v []interface{}) {
  67701. m.emit(0x62)
  67702. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  67703. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  67704. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  67705. m.emit(0x76)
  67706. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  67707. })
  67708. }
  67709. // VPERMI2D m256/m32bcst, ymm, ymm{k}{z}
  67710. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  67711. self.require(ISA_AVX512VL | ISA_AVX512F)
  67712. p.domain = DomainAVX
  67713. p.add(0, func(m *_Encoding, v []interface{}) {
  67714. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  67715. m.emit(0x76)
  67716. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  67717. })
  67718. }
  67719. // VPERMI2D ymm, ymm, ymm{k}{z}
  67720. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  67721. self.require(ISA_AVX512VL | ISA_AVX512F)
  67722. p.domain = DomainAVX
  67723. p.add(0, func(m *_Encoding, v []interface{}) {
  67724. m.emit(0x62)
  67725. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  67726. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  67727. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  67728. m.emit(0x76)
  67729. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  67730. })
  67731. }
  67732. if p.len == 0 {
  67733. panic("invalid operands for VPERMI2D")
  67734. }
  67735. return p
  67736. }
  67737. // VPERMI2PD performs "Full Permute of Double-Precision Floating-Point Values From Two Tables Overwriting the Index".
  67738. //
  67739. // Mnemonic : VPERMI2PD
  67740. // Supported forms : (6 forms)
  67741. //
  67742. // * VPERMI2PD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  67743. // * VPERMI2PD zmm, zmm, zmm{k}{z} [AVX512F]
  67744. // * VPERMI2PD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  67745. // * VPERMI2PD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  67746. // * VPERMI2PD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  67747. // * VPERMI2PD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  67748. //
  67749. func (self *Program) VPERMI2PD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  67750. p := self.alloc("VPERMI2PD", 3, Operands { v0, v1, v2 })
  67751. // VPERMI2PD m512/m64bcst, zmm, zmm{k}{z}
  67752. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  67753. self.require(ISA_AVX512F)
  67754. p.domain = DomainAVX
  67755. p.add(0, func(m *_Encoding, v []interface{}) {
  67756. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  67757. m.emit(0x77)
  67758. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  67759. })
  67760. }
  67761. // VPERMI2PD zmm, zmm, zmm{k}{z}
  67762. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  67763. self.require(ISA_AVX512F)
  67764. p.domain = DomainAVX
  67765. p.add(0, func(m *_Encoding, v []interface{}) {
  67766. m.emit(0x62)
  67767. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  67768. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  67769. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  67770. m.emit(0x77)
  67771. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  67772. })
  67773. }
  67774. // VPERMI2PD m128/m64bcst, xmm, xmm{k}{z}
  67775. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  67776. self.require(ISA_AVX512VL | ISA_AVX512F)
  67777. p.domain = DomainAVX
  67778. p.add(0, func(m *_Encoding, v []interface{}) {
  67779. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  67780. m.emit(0x77)
  67781. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  67782. })
  67783. }
  67784. // VPERMI2PD xmm, xmm, xmm{k}{z}
  67785. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  67786. self.require(ISA_AVX512VL | ISA_AVX512F)
  67787. p.domain = DomainAVX
  67788. p.add(0, func(m *_Encoding, v []interface{}) {
  67789. m.emit(0x62)
  67790. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  67791. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  67792. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  67793. m.emit(0x77)
  67794. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  67795. })
  67796. }
  67797. // VPERMI2PD m256/m64bcst, ymm, ymm{k}{z}
  67798. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  67799. self.require(ISA_AVX512VL | ISA_AVX512F)
  67800. p.domain = DomainAVX
  67801. p.add(0, func(m *_Encoding, v []interface{}) {
  67802. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  67803. m.emit(0x77)
  67804. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  67805. })
  67806. }
  67807. // VPERMI2PD ymm, ymm, ymm{k}{z}
  67808. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  67809. self.require(ISA_AVX512VL | ISA_AVX512F)
  67810. p.domain = DomainAVX
  67811. p.add(0, func(m *_Encoding, v []interface{}) {
  67812. m.emit(0x62)
  67813. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  67814. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  67815. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  67816. m.emit(0x77)
  67817. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  67818. })
  67819. }
  67820. if p.len == 0 {
  67821. panic("invalid operands for VPERMI2PD")
  67822. }
  67823. return p
  67824. }
  67825. // VPERMI2PS performs "Full Permute of Single-Precision Floating-Point Values From Two Tables Overwriting the Index".
  67826. //
  67827. // Mnemonic : VPERMI2PS
  67828. // Supported forms : (6 forms)
  67829. //
  67830. // * VPERMI2PS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  67831. // * VPERMI2PS zmm, zmm, zmm{k}{z} [AVX512F]
  67832. // * VPERMI2PS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  67833. // * VPERMI2PS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  67834. // * VPERMI2PS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  67835. // * VPERMI2PS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  67836. //
  67837. func (self *Program) VPERMI2PS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  67838. p := self.alloc("VPERMI2PS", 3, Operands { v0, v1, v2 })
  67839. // VPERMI2PS m512/m32bcst, zmm, zmm{k}{z}
  67840. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  67841. self.require(ISA_AVX512F)
  67842. p.domain = DomainAVX
  67843. p.add(0, func(m *_Encoding, v []interface{}) {
  67844. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  67845. m.emit(0x77)
  67846. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  67847. })
  67848. }
  67849. // VPERMI2PS zmm, zmm, zmm{k}{z}
  67850. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  67851. self.require(ISA_AVX512F)
  67852. p.domain = DomainAVX
  67853. p.add(0, func(m *_Encoding, v []interface{}) {
  67854. m.emit(0x62)
  67855. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  67856. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  67857. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  67858. m.emit(0x77)
  67859. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  67860. })
  67861. }
  67862. // VPERMI2PS m128/m32bcst, xmm, xmm{k}{z}
  67863. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  67864. self.require(ISA_AVX512VL | ISA_AVX512F)
  67865. p.domain = DomainAVX
  67866. p.add(0, func(m *_Encoding, v []interface{}) {
  67867. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  67868. m.emit(0x77)
  67869. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  67870. })
  67871. }
  67872. // VPERMI2PS xmm, xmm, xmm{k}{z}
  67873. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  67874. self.require(ISA_AVX512VL | ISA_AVX512F)
  67875. p.domain = DomainAVX
  67876. p.add(0, func(m *_Encoding, v []interface{}) {
  67877. m.emit(0x62)
  67878. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  67879. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  67880. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  67881. m.emit(0x77)
  67882. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  67883. })
  67884. }
  67885. // VPERMI2PS m256/m32bcst, ymm, ymm{k}{z}
  67886. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  67887. self.require(ISA_AVX512VL | ISA_AVX512F)
  67888. p.domain = DomainAVX
  67889. p.add(0, func(m *_Encoding, v []interface{}) {
  67890. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  67891. m.emit(0x77)
  67892. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  67893. })
  67894. }
  67895. // VPERMI2PS ymm, ymm, ymm{k}{z}
  67896. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  67897. self.require(ISA_AVX512VL | ISA_AVX512F)
  67898. p.domain = DomainAVX
  67899. p.add(0, func(m *_Encoding, v []interface{}) {
  67900. m.emit(0x62)
  67901. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  67902. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  67903. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  67904. m.emit(0x77)
  67905. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  67906. })
  67907. }
  67908. if p.len == 0 {
  67909. panic("invalid operands for VPERMI2PS")
  67910. }
  67911. return p
  67912. }
  67913. // VPERMI2Q performs "Full Permute of Quadwords From Two Tables Overwriting the Index".
  67914. //
  67915. // Mnemonic : VPERMI2Q
  67916. // Supported forms : (6 forms)
  67917. //
  67918. // * VPERMI2Q m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  67919. // * VPERMI2Q zmm, zmm, zmm{k}{z} [AVX512F]
  67920. // * VPERMI2Q m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  67921. // * VPERMI2Q xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  67922. // * VPERMI2Q m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  67923. // * VPERMI2Q ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  67924. //
  67925. func (self *Program) VPERMI2Q(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  67926. p := self.alloc("VPERMI2Q", 3, Operands { v0, v1, v2 })
  67927. // VPERMI2Q m512/m64bcst, zmm, zmm{k}{z}
  67928. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  67929. self.require(ISA_AVX512F)
  67930. p.domain = DomainAVX
  67931. p.add(0, func(m *_Encoding, v []interface{}) {
  67932. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  67933. m.emit(0x76)
  67934. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  67935. })
  67936. }
  67937. // VPERMI2Q zmm, zmm, zmm{k}{z}
  67938. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  67939. self.require(ISA_AVX512F)
  67940. p.domain = DomainAVX
  67941. p.add(0, func(m *_Encoding, v []interface{}) {
  67942. m.emit(0x62)
  67943. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  67944. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  67945. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  67946. m.emit(0x76)
  67947. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  67948. })
  67949. }
  67950. // VPERMI2Q m128/m64bcst, xmm, xmm{k}{z}
  67951. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  67952. self.require(ISA_AVX512VL | ISA_AVX512F)
  67953. p.domain = DomainAVX
  67954. p.add(0, func(m *_Encoding, v []interface{}) {
  67955. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  67956. m.emit(0x76)
  67957. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  67958. })
  67959. }
  67960. // VPERMI2Q xmm, xmm, xmm{k}{z}
  67961. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  67962. self.require(ISA_AVX512VL | ISA_AVX512F)
  67963. p.domain = DomainAVX
  67964. p.add(0, func(m *_Encoding, v []interface{}) {
  67965. m.emit(0x62)
  67966. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  67967. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  67968. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  67969. m.emit(0x76)
  67970. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  67971. })
  67972. }
  67973. // VPERMI2Q m256/m64bcst, ymm, ymm{k}{z}
  67974. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  67975. self.require(ISA_AVX512VL | ISA_AVX512F)
  67976. p.domain = DomainAVX
  67977. p.add(0, func(m *_Encoding, v []interface{}) {
  67978. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  67979. m.emit(0x76)
  67980. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  67981. })
  67982. }
  67983. // VPERMI2Q ymm, ymm, ymm{k}{z}
  67984. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  67985. self.require(ISA_AVX512VL | ISA_AVX512F)
  67986. p.domain = DomainAVX
  67987. p.add(0, func(m *_Encoding, v []interface{}) {
  67988. m.emit(0x62)
  67989. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  67990. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  67991. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  67992. m.emit(0x76)
  67993. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  67994. })
  67995. }
  67996. if p.len == 0 {
  67997. panic("invalid operands for VPERMI2Q")
  67998. }
  67999. return p
  68000. }
  68001. // VPERMI2W performs "Full Permute of Words From Two Tables Overwriting the Index".
  68002. //
  68003. // Mnemonic : VPERMI2W
  68004. // Supported forms : (6 forms)
  68005. //
  68006. // * VPERMI2W zmm, zmm, zmm{k}{z} [AVX512BW]
  68007. // * VPERMI2W m512, zmm, zmm{k}{z} [AVX512BW]
  68008. // * VPERMI2W xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  68009. // * VPERMI2W m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  68010. // * VPERMI2W ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  68011. // * VPERMI2W m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  68012. //
  68013. func (self *Program) VPERMI2W(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  68014. p := self.alloc("VPERMI2W", 3, Operands { v0, v1, v2 })
  68015. // VPERMI2W zmm, zmm, zmm{k}{z}
  68016. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  68017. self.require(ISA_AVX512BW)
  68018. p.domain = DomainAVX
  68019. p.add(0, func(m *_Encoding, v []interface{}) {
  68020. m.emit(0x62)
  68021. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  68022. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  68023. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  68024. m.emit(0x75)
  68025. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  68026. })
  68027. }
  68028. // VPERMI2W m512, zmm, zmm{k}{z}
  68029. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  68030. self.require(ISA_AVX512BW)
  68031. p.domain = DomainAVX
  68032. p.add(0, func(m *_Encoding, v []interface{}) {
  68033. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  68034. m.emit(0x75)
  68035. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  68036. })
  68037. }
  68038. // VPERMI2W xmm, xmm, xmm{k}{z}
  68039. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  68040. self.require(ISA_AVX512VL | ISA_AVX512BW)
  68041. p.domain = DomainAVX
  68042. p.add(0, func(m *_Encoding, v []interface{}) {
  68043. m.emit(0x62)
  68044. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  68045. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  68046. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  68047. m.emit(0x75)
  68048. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  68049. })
  68050. }
  68051. // VPERMI2W m128, xmm, xmm{k}{z}
  68052. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  68053. self.require(ISA_AVX512VL | ISA_AVX512BW)
  68054. p.domain = DomainAVX
  68055. p.add(0, func(m *_Encoding, v []interface{}) {
  68056. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  68057. m.emit(0x75)
  68058. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  68059. })
  68060. }
  68061. // VPERMI2W ymm, ymm, ymm{k}{z}
  68062. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  68063. self.require(ISA_AVX512VL | ISA_AVX512BW)
  68064. p.domain = DomainAVX
  68065. p.add(0, func(m *_Encoding, v []interface{}) {
  68066. m.emit(0x62)
  68067. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  68068. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  68069. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  68070. m.emit(0x75)
  68071. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  68072. })
  68073. }
  68074. // VPERMI2W m256, ymm, ymm{k}{z}
  68075. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  68076. self.require(ISA_AVX512VL | ISA_AVX512BW)
  68077. p.domain = DomainAVX
  68078. p.add(0, func(m *_Encoding, v []interface{}) {
  68079. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  68080. m.emit(0x75)
  68081. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  68082. })
  68083. }
  68084. if p.len == 0 {
  68085. panic("invalid operands for VPERMI2W")
  68086. }
  68087. return p
  68088. }
  68089. // VPERMIL2PD performs "Permute Two-Source Double-Precision Floating-Point Vectors".
  68090. //
  68091. // Mnemonic : VPERMIL2PD
  68092. // Supported forms : (6 forms)
  68093. //
  68094. // * VPERMIL2PD imm4, xmm, xmm, xmm, xmm [XOP]
  68095. // * VPERMIL2PD imm4, m128, xmm, xmm, xmm [XOP]
  68096. // * VPERMIL2PD imm4, xmm, m128, xmm, xmm [XOP]
  68097. // * VPERMIL2PD imm4, ymm, ymm, ymm, ymm [XOP]
  68098. // * VPERMIL2PD imm4, m256, ymm, ymm, ymm [XOP]
  68099. // * VPERMIL2PD imm4, ymm, m256, ymm, ymm [XOP]
  68100. //
  68101. func (self *Program) VPERMIL2PD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}, v4 interface{}) *Instruction {
  68102. p := self.alloc("VPERMIL2PD", 5, Operands { v0, v1, v2, v3, v4 })
  68103. // VPERMIL2PD imm4, xmm, xmm, xmm, xmm
  68104. if isImm4(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) && isXMM(v4) {
  68105. self.require(ISA_XOP)
  68106. p.domain = DomainAMDSpecific
  68107. p.add(0, func(m *_Encoding, v []interface{}) {
  68108. m.emit(0xc4)
  68109. m.emit(0xe3 ^ (hcode(v[4]) << 7) ^ (hcode(v[2]) << 5))
  68110. m.emit(0x79 ^ (hlcode(v[3]) << 3))
  68111. m.emit(0x49)
  68112. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[2]))
  68113. m.emit((hlcode(v[1]) << 4) | imml(v[0]))
  68114. })
  68115. p.add(0, func(m *_Encoding, v []interface{}) {
  68116. m.emit(0xc4)
  68117. m.emit(0xe3 ^ (hcode(v[4]) << 7) ^ (hcode(v[1]) << 5))
  68118. m.emit(0xf9 ^ (hlcode(v[3]) << 3))
  68119. m.emit(0x49)
  68120. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[1]))
  68121. m.emit((hlcode(v[2]) << 4) | imml(v[0]))
  68122. })
  68123. }
  68124. // VPERMIL2PD imm4, m128, xmm, xmm, xmm
  68125. if isImm4(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) && isXMM(v4) {
  68126. self.require(ISA_XOP)
  68127. p.domain = DomainAMDSpecific
  68128. p.add(0, func(m *_Encoding, v []interface{}) {
  68129. m.vex3(0xc4, 0b11, 0x81, hcode(v[4]), addr(v[1]), hlcode(v[3]))
  68130. m.emit(0x49)
  68131. m.mrsd(lcode(v[4]), addr(v[1]), 1)
  68132. m.emit((hlcode(v[2]) << 4) | imml(v[0]))
  68133. })
  68134. }
  68135. // VPERMIL2PD imm4, xmm, m128, xmm, xmm
  68136. if isImm4(v0) && isXMM(v1) && isM128(v2) && isXMM(v3) && isXMM(v4) {
  68137. self.require(ISA_XOP)
  68138. p.domain = DomainAMDSpecific
  68139. p.add(0, func(m *_Encoding, v []interface{}) {
  68140. m.vex3(0xc4, 0b11, 0x01, hcode(v[4]), addr(v[2]), hlcode(v[3]))
  68141. m.emit(0x49)
  68142. m.mrsd(lcode(v[4]), addr(v[2]), 1)
  68143. m.emit((hlcode(v[1]) << 4) | imml(v[0]))
  68144. })
  68145. }
  68146. // VPERMIL2PD imm4, ymm, ymm, ymm, ymm
  68147. if isImm4(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) && isYMM(v4) {
  68148. self.require(ISA_XOP)
  68149. p.domain = DomainAMDSpecific
  68150. p.add(0, func(m *_Encoding, v []interface{}) {
  68151. m.emit(0xc4)
  68152. m.emit(0xe3 ^ (hcode(v[4]) << 7) ^ (hcode(v[2]) << 5))
  68153. m.emit(0x7d ^ (hlcode(v[3]) << 3))
  68154. m.emit(0x49)
  68155. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[2]))
  68156. m.emit((hlcode(v[1]) << 4) | imml(v[0]))
  68157. })
  68158. p.add(0, func(m *_Encoding, v []interface{}) {
  68159. m.emit(0xc4)
  68160. m.emit(0xe3 ^ (hcode(v[4]) << 7) ^ (hcode(v[1]) << 5))
  68161. m.emit(0xfd ^ (hlcode(v[3]) << 3))
  68162. m.emit(0x49)
  68163. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[1]))
  68164. m.emit((hlcode(v[2]) << 4) | imml(v[0]))
  68165. })
  68166. }
  68167. // VPERMIL2PD imm4, m256, ymm, ymm, ymm
  68168. if isImm4(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) && isYMM(v4) {
  68169. self.require(ISA_XOP)
  68170. p.domain = DomainAMDSpecific
  68171. p.add(0, func(m *_Encoding, v []interface{}) {
  68172. m.vex3(0xc4, 0b11, 0x85, hcode(v[4]), addr(v[1]), hlcode(v[3]))
  68173. m.emit(0x49)
  68174. m.mrsd(lcode(v[4]), addr(v[1]), 1)
  68175. m.emit((hlcode(v[2]) << 4) | imml(v[0]))
  68176. })
  68177. }
  68178. // VPERMIL2PD imm4, ymm, m256, ymm, ymm
  68179. if isImm4(v0) && isYMM(v1) && isM256(v2) && isYMM(v3) && isYMM(v4) {
  68180. self.require(ISA_XOP)
  68181. p.domain = DomainAMDSpecific
  68182. p.add(0, func(m *_Encoding, v []interface{}) {
  68183. m.vex3(0xc4, 0b11, 0x05, hcode(v[4]), addr(v[2]), hlcode(v[3]))
  68184. m.emit(0x49)
  68185. m.mrsd(lcode(v[4]), addr(v[2]), 1)
  68186. m.emit((hlcode(v[1]) << 4) | imml(v[0]))
  68187. })
  68188. }
  68189. if p.len == 0 {
  68190. panic("invalid operands for VPERMIL2PD")
  68191. }
  68192. return p
  68193. }
  68194. // VPERMIL2PS performs "Permute Two-Source Single-Precision Floating-Point Vectors".
  68195. //
  68196. // Mnemonic : VPERMIL2PS
  68197. // Supported forms : (6 forms)
  68198. //
  68199. // * VPERMIL2PS imm4, xmm, xmm, xmm, xmm [XOP]
  68200. // * VPERMIL2PS imm4, m128, xmm, xmm, xmm [XOP]
  68201. // * VPERMIL2PS imm4, xmm, m128, xmm, xmm [XOP]
  68202. // * VPERMIL2PS imm4, ymm, ymm, ymm, ymm [XOP]
  68203. // * VPERMIL2PS imm4, m256, ymm, ymm, ymm [XOP]
  68204. // * VPERMIL2PS imm4, ymm, m256, ymm, ymm [XOP]
  68205. //
  68206. func (self *Program) VPERMIL2PS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}, v4 interface{}) *Instruction {
  68207. p := self.alloc("VPERMIL2PS", 5, Operands { v0, v1, v2, v3, v4 })
  68208. // VPERMIL2PS imm4, xmm, xmm, xmm, xmm
  68209. if isImm4(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) && isXMM(v4) {
  68210. self.require(ISA_XOP)
  68211. p.domain = DomainAMDSpecific
  68212. p.add(0, func(m *_Encoding, v []interface{}) {
  68213. m.emit(0xc4)
  68214. m.emit(0xe3 ^ (hcode(v[4]) << 7) ^ (hcode(v[2]) << 5))
  68215. m.emit(0x79 ^ (hlcode(v[3]) << 3))
  68216. m.emit(0x48)
  68217. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[2]))
  68218. m.emit((hlcode(v[1]) << 4) | imml(v[0]))
  68219. })
  68220. p.add(0, func(m *_Encoding, v []interface{}) {
  68221. m.emit(0xc4)
  68222. m.emit(0xe3 ^ (hcode(v[4]) << 7) ^ (hcode(v[1]) << 5))
  68223. m.emit(0xf9 ^ (hlcode(v[3]) << 3))
  68224. m.emit(0x48)
  68225. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[1]))
  68226. m.emit((hlcode(v[2]) << 4) | imml(v[0]))
  68227. })
  68228. }
  68229. // VPERMIL2PS imm4, m128, xmm, xmm, xmm
  68230. if isImm4(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) && isXMM(v4) {
  68231. self.require(ISA_XOP)
  68232. p.domain = DomainAMDSpecific
  68233. p.add(0, func(m *_Encoding, v []interface{}) {
  68234. m.vex3(0xc4, 0b11, 0x81, hcode(v[4]), addr(v[1]), hlcode(v[3]))
  68235. m.emit(0x48)
  68236. m.mrsd(lcode(v[4]), addr(v[1]), 1)
  68237. m.emit((hlcode(v[2]) << 4) | imml(v[0]))
  68238. })
  68239. }
  68240. // VPERMIL2PS imm4, xmm, m128, xmm, xmm
  68241. if isImm4(v0) && isXMM(v1) && isM128(v2) && isXMM(v3) && isXMM(v4) {
  68242. self.require(ISA_XOP)
  68243. p.domain = DomainAMDSpecific
  68244. p.add(0, func(m *_Encoding, v []interface{}) {
  68245. m.vex3(0xc4, 0b11, 0x01, hcode(v[4]), addr(v[2]), hlcode(v[3]))
  68246. m.emit(0x48)
  68247. m.mrsd(lcode(v[4]), addr(v[2]), 1)
  68248. m.emit((hlcode(v[1]) << 4) | imml(v[0]))
  68249. })
  68250. }
  68251. // VPERMIL2PS imm4, ymm, ymm, ymm, ymm
  68252. if isImm4(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) && isYMM(v4) {
  68253. self.require(ISA_XOP)
  68254. p.domain = DomainAMDSpecific
  68255. p.add(0, func(m *_Encoding, v []interface{}) {
  68256. m.emit(0xc4)
  68257. m.emit(0xe3 ^ (hcode(v[4]) << 7) ^ (hcode(v[2]) << 5))
  68258. m.emit(0x7d ^ (hlcode(v[3]) << 3))
  68259. m.emit(0x48)
  68260. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[2]))
  68261. m.emit((hlcode(v[1]) << 4) | imml(v[0]))
  68262. })
  68263. p.add(0, func(m *_Encoding, v []interface{}) {
  68264. m.emit(0xc4)
  68265. m.emit(0xe3 ^ (hcode(v[4]) << 7) ^ (hcode(v[1]) << 5))
  68266. m.emit(0xfd ^ (hlcode(v[3]) << 3))
  68267. m.emit(0x48)
  68268. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[1]))
  68269. m.emit((hlcode(v[2]) << 4) | imml(v[0]))
  68270. })
  68271. }
  68272. // VPERMIL2PS imm4, m256, ymm, ymm, ymm
  68273. if isImm4(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) && isYMM(v4) {
  68274. self.require(ISA_XOP)
  68275. p.domain = DomainAMDSpecific
  68276. p.add(0, func(m *_Encoding, v []interface{}) {
  68277. m.vex3(0xc4, 0b11, 0x85, hcode(v[4]), addr(v[1]), hlcode(v[3]))
  68278. m.emit(0x48)
  68279. m.mrsd(lcode(v[4]), addr(v[1]), 1)
  68280. m.emit((hlcode(v[2]) << 4) | imml(v[0]))
  68281. })
  68282. }
  68283. // VPERMIL2PS imm4, ymm, m256, ymm, ymm
  68284. if isImm4(v0) && isYMM(v1) && isM256(v2) && isYMM(v3) && isYMM(v4) {
  68285. self.require(ISA_XOP)
  68286. p.domain = DomainAMDSpecific
  68287. p.add(0, func(m *_Encoding, v []interface{}) {
  68288. m.vex3(0xc4, 0b11, 0x05, hcode(v[4]), addr(v[2]), hlcode(v[3]))
  68289. m.emit(0x48)
  68290. m.mrsd(lcode(v[4]), addr(v[2]), 1)
  68291. m.emit((hlcode(v[1]) << 4) | imml(v[0]))
  68292. })
  68293. }
  68294. if p.len == 0 {
  68295. panic("invalid operands for VPERMIL2PS")
  68296. }
  68297. return p
  68298. }
  68299. // VPERMILPD performs "Permute Double-Precision Floating-Point Values".
  68300. //
  68301. // Mnemonic : VPERMILPD
  68302. // Supported forms : (20 forms)
  68303. //
  68304. // * VPERMILPD imm8, xmm, xmm [AVX]
  68305. // * VPERMILPD xmm, xmm, xmm [AVX]
  68306. // * VPERMILPD m128, xmm, xmm [AVX]
  68307. // * VPERMILPD imm8, m128, xmm [AVX]
  68308. // * VPERMILPD imm8, ymm, ymm [AVX]
  68309. // * VPERMILPD ymm, ymm, ymm [AVX]
  68310. // * VPERMILPD m256, ymm, ymm [AVX]
  68311. // * VPERMILPD imm8, m256, ymm [AVX]
  68312. // * VPERMILPD imm8, m512/m64bcst, zmm{k}{z} [AVX512F]
  68313. // * VPERMILPD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  68314. // * VPERMILPD imm8, zmm, zmm{k}{z} [AVX512F]
  68315. // * VPERMILPD zmm, zmm, zmm{k}{z} [AVX512F]
  68316. // * VPERMILPD imm8, m128/m64bcst, xmm{k}{z} [AVX512F,AVX512VL]
  68317. // * VPERMILPD imm8, m256/m64bcst, ymm{k}{z} [AVX512F,AVX512VL]
  68318. // * VPERMILPD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  68319. // * VPERMILPD imm8, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  68320. // * VPERMILPD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  68321. // * VPERMILPD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  68322. // * VPERMILPD imm8, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  68323. // * VPERMILPD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  68324. //
  68325. func (self *Program) VPERMILPD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  68326. p := self.alloc("VPERMILPD", 3, Operands { v0, v1, v2 })
  68327. // VPERMILPD imm8, xmm, xmm
  68328. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  68329. self.require(ISA_AVX)
  68330. p.domain = DomainAVX
  68331. p.add(0, func(m *_Encoding, v []interface{}) {
  68332. m.emit(0xc4)
  68333. m.emit(0xe3 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  68334. m.emit(0x79)
  68335. m.emit(0x05)
  68336. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  68337. m.imm1(toImmAny(v[0]))
  68338. })
  68339. }
  68340. // VPERMILPD xmm, xmm, xmm
  68341. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  68342. self.require(ISA_AVX)
  68343. p.domain = DomainAVX
  68344. p.add(0, func(m *_Encoding, v []interface{}) {
  68345. m.emit(0xc4)
  68346. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  68347. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  68348. m.emit(0x0d)
  68349. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  68350. })
  68351. }
  68352. // VPERMILPD m128, xmm, xmm
  68353. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  68354. self.require(ISA_AVX)
  68355. p.domain = DomainAVX
  68356. p.add(0, func(m *_Encoding, v []interface{}) {
  68357. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  68358. m.emit(0x0d)
  68359. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  68360. })
  68361. }
  68362. // VPERMILPD imm8, m128, xmm
  68363. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  68364. self.require(ISA_AVX)
  68365. p.domain = DomainAVX
  68366. p.add(0, func(m *_Encoding, v []interface{}) {
  68367. m.vex3(0xc4, 0b11, 0x01, hcode(v[2]), addr(v[1]), 0)
  68368. m.emit(0x05)
  68369. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  68370. m.imm1(toImmAny(v[0]))
  68371. })
  68372. }
  68373. // VPERMILPD imm8, ymm, ymm
  68374. if isImm8(v0) && isYMM(v1) && isYMM(v2) {
  68375. self.require(ISA_AVX)
  68376. p.domain = DomainAVX
  68377. p.add(0, func(m *_Encoding, v []interface{}) {
  68378. m.emit(0xc4)
  68379. m.emit(0xe3 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  68380. m.emit(0x7d)
  68381. m.emit(0x05)
  68382. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  68383. m.imm1(toImmAny(v[0]))
  68384. })
  68385. }
  68386. // VPERMILPD ymm, ymm, ymm
  68387. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  68388. self.require(ISA_AVX)
  68389. p.domain = DomainAVX
  68390. p.add(0, func(m *_Encoding, v []interface{}) {
  68391. m.emit(0xc4)
  68392. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  68393. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  68394. m.emit(0x0d)
  68395. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  68396. })
  68397. }
  68398. // VPERMILPD m256, ymm, ymm
  68399. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  68400. self.require(ISA_AVX)
  68401. p.domain = DomainAVX
  68402. p.add(0, func(m *_Encoding, v []interface{}) {
  68403. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  68404. m.emit(0x0d)
  68405. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  68406. })
  68407. }
  68408. // VPERMILPD imm8, m256, ymm
  68409. if isImm8(v0) && isM256(v1) && isYMM(v2) {
  68410. self.require(ISA_AVX)
  68411. p.domain = DomainAVX
  68412. p.add(0, func(m *_Encoding, v []interface{}) {
  68413. m.vex3(0xc4, 0b11, 0x05, hcode(v[2]), addr(v[1]), 0)
  68414. m.emit(0x05)
  68415. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  68416. m.imm1(toImmAny(v[0]))
  68417. })
  68418. }
  68419. // VPERMILPD imm8, m512/m64bcst, zmm{k}{z}
  68420. if isImm8(v0) && isM512M64bcst(v1) && isZMMkz(v2) {
  68421. self.require(ISA_AVX512F)
  68422. p.domain = DomainAVX
  68423. p.add(0, func(m *_Encoding, v []interface{}) {
  68424. m.evex(0b11, 0x85, 0b10, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  68425. m.emit(0x05)
  68426. m.mrsd(lcode(v[2]), addr(v[1]), 64)
  68427. m.imm1(toImmAny(v[0]))
  68428. })
  68429. }
  68430. // VPERMILPD m512/m64bcst, zmm, zmm{k}{z}
  68431. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  68432. self.require(ISA_AVX512F)
  68433. p.domain = DomainAVX
  68434. p.add(0, func(m *_Encoding, v []interface{}) {
  68435. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  68436. m.emit(0x0d)
  68437. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  68438. })
  68439. }
  68440. // VPERMILPD imm8, zmm, zmm{k}{z}
  68441. if isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  68442. self.require(ISA_AVX512F)
  68443. p.domain = DomainAVX
  68444. p.add(0, func(m *_Encoding, v []interface{}) {
  68445. m.emit(0x62)
  68446. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  68447. m.emit(0xfd)
  68448. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x48)
  68449. m.emit(0x05)
  68450. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  68451. m.imm1(toImmAny(v[0]))
  68452. })
  68453. }
  68454. // VPERMILPD zmm, zmm, zmm{k}{z}
  68455. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  68456. self.require(ISA_AVX512F)
  68457. p.domain = DomainAVX
  68458. p.add(0, func(m *_Encoding, v []interface{}) {
  68459. m.emit(0x62)
  68460. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  68461. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  68462. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  68463. m.emit(0x0d)
  68464. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  68465. })
  68466. }
  68467. // VPERMILPD imm8, m128/m64bcst, xmm{k}{z}
  68468. if isImm8(v0) && isM128M64bcst(v1) && isXMMkz(v2) {
  68469. self.require(ISA_AVX512VL | ISA_AVX512F)
  68470. p.domain = DomainAVX
  68471. p.add(0, func(m *_Encoding, v []interface{}) {
  68472. m.evex(0b11, 0x85, 0b00, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  68473. m.emit(0x05)
  68474. m.mrsd(lcode(v[2]), addr(v[1]), 16)
  68475. m.imm1(toImmAny(v[0]))
  68476. })
  68477. }
  68478. // VPERMILPD imm8, m256/m64bcst, ymm{k}{z}
  68479. if isImm8(v0) && isM256M64bcst(v1) && isYMMkz(v2) {
  68480. self.require(ISA_AVX512VL | ISA_AVX512F)
  68481. p.domain = DomainAVX
  68482. p.add(0, func(m *_Encoding, v []interface{}) {
  68483. m.evex(0b11, 0x85, 0b01, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  68484. m.emit(0x05)
  68485. m.mrsd(lcode(v[2]), addr(v[1]), 32)
  68486. m.imm1(toImmAny(v[0]))
  68487. })
  68488. }
  68489. // VPERMILPD m128/m64bcst, xmm, xmm{k}{z}
  68490. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  68491. self.require(ISA_AVX512VL | ISA_AVX512F)
  68492. p.domain = DomainAVX
  68493. p.add(0, func(m *_Encoding, v []interface{}) {
  68494. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  68495. m.emit(0x0d)
  68496. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  68497. })
  68498. }
  68499. // VPERMILPD imm8, xmm, xmm{k}{z}
  68500. if isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  68501. self.require(ISA_AVX512VL | ISA_AVX512F)
  68502. p.domain = DomainAVX
  68503. p.add(0, func(m *_Encoding, v []interface{}) {
  68504. m.emit(0x62)
  68505. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  68506. m.emit(0xfd)
  68507. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x08)
  68508. m.emit(0x05)
  68509. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  68510. m.imm1(toImmAny(v[0]))
  68511. })
  68512. }
  68513. // VPERMILPD xmm, xmm, xmm{k}{z}
  68514. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  68515. self.require(ISA_AVX512VL | ISA_AVX512F)
  68516. p.domain = DomainAVX
  68517. p.add(0, func(m *_Encoding, v []interface{}) {
  68518. m.emit(0x62)
  68519. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  68520. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  68521. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  68522. m.emit(0x0d)
  68523. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  68524. })
  68525. }
  68526. // VPERMILPD m256/m64bcst, ymm, ymm{k}{z}
  68527. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  68528. self.require(ISA_AVX512VL | ISA_AVX512F)
  68529. p.domain = DomainAVX
  68530. p.add(0, func(m *_Encoding, v []interface{}) {
  68531. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  68532. m.emit(0x0d)
  68533. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  68534. })
  68535. }
  68536. // VPERMILPD imm8, ymm, ymm{k}{z}
  68537. if isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  68538. self.require(ISA_AVX512VL | ISA_AVX512F)
  68539. p.domain = DomainAVX
  68540. p.add(0, func(m *_Encoding, v []interface{}) {
  68541. m.emit(0x62)
  68542. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  68543. m.emit(0xfd)
  68544. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x28)
  68545. m.emit(0x05)
  68546. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  68547. m.imm1(toImmAny(v[0]))
  68548. })
  68549. }
  68550. // VPERMILPD ymm, ymm, ymm{k}{z}
  68551. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  68552. self.require(ISA_AVX512VL | ISA_AVX512F)
  68553. p.domain = DomainAVX
  68554. p.add(0, func(m *_Encoding, v []interface{}) {
  68555. m.emit(0x62)
  68556. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  68557. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  68558. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  68559. m.emit(0x0d)
  68560. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  68561. })
  68562. }
  68563. if p.len == 0 {
  68564. panic("invalid operands for VPERMILPD")
  68565. }
  68566. return p
  68567. }
  68568. // VPERMILPS performs "Permute Single-Precision Floating-Point Values".
  68569. //
  68570. // Mnemonic : VPERMILPS
  68571. // Supported forms : (20 forms)
  68572. //
  68573. // * VPERMILPS imm8, xmm, xmm [AVX]
  68574. // * VPERMILPS xmm, xmm, xmm [AVX]
  68575. // * VPERMILPS m128, xmm, xmm [AVX]
  68576. // * VPERMILPS imm8, m128, xmm [AVX]
  68577. // * VPERMILPS imm8, ymm, ymm [AVX]
  68578. // * VPERMILPS ymm, ymm, ymm [AVX]
  68579. // * VPERMILPS m256, ymm, ymm [AVX]
  68580. // * VPERMILPS imm8, m256, ymm [AVX]
  68581. // * VPERMILPS imm8, m512/m32bcst, zmm{k}{z} [AVX512F]
  68582. // * VPERMILPS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  68583. // * VPERMILPS imm8, zmm, zmm{k}{z} [AVX512F]
  68584. // * VPERMILPS zmm, zmm, zmm{k}{z} [AVX512F]
  68585. // * VPERMILPS imm8, m128/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  68586. // * VPERMILPS imm8, m256/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  68587. // * VPERMILPS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  68588. // * VPERMILPS imm8, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  68589. // * VPERMILPS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  68590. // * VPERMILPS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  68591. // * VPERMILPS imm8, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  68592. // * VPERMILPS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  68593. //
  68594. func (self *Program) VPERMILPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  68595. p := self.alloc("VPERMILPS", 3, Operands { v0, v1, v2 })
  68596. // VPERMILPS imm8, xmm, xmm
  68597. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  68598. self.require(ISA_AVX)
  68599. p.domain = DomainAVX
  68600. p.add(0, func(m *_Encoding, v []interface{}) {
  68601. m.emit(0xc4)
  68602. m.emit(0xe3 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  68603. m.emit(0x79)
  68604. m.emit(0x04)
  68605. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  68606. m.imm1(toImmAny(v[0]))
  68607. })
  68608. }
  68609. // VPERMILPS xmm, xmm, xmm
  68610. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  68611. self.require(ISA_AVX)
  68612. p.domain = DomainAVX
  68613. p.add(0, func(m *_Encoding, v []interface{}) {
  68614. m.emit(0xc4)
  68615. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  68616. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  68617. m.emit(0x0c)
  68618. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  68619. })
  68620. }
  68621. // VPERMILPS m128, xmm, xmm
  68622. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  68623. self.require(ISA_AVX)
  68624. p.domain = DomainAVX
  68625. p.add(0, func(m *_Encoding, v []interface{}) {
  68626. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  68627. m.emit(0x0c)
  68628. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  68629. })
  68630. }
  68631. // VPERMILPS imm8, m128, xmm
  68632. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  68633. self.require(ISA_AVX)
  68634. p.domain = DomainAVX
  68635. p.add(0, func(m *_Encoding, v []interface{}) {
  68636. m.vex3(0xc4, 0b11, 0x01, hcode(v[2]), addr(v[1]), 0)
  68637. m.emit(0x04)
  68638. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  68639. m.imm1(toImmAny(v[0]))
  68640. })
  68641. }
  68642. // VPERMILPS imm8, ymm, ymm
  68643. if isImm8(v0) && isYMM(v1) && isYMM(v2) {
  68644. self.require(ISA_AVX)
  68645. p.domain = DomainAVX
  68646. p.add(0, func(m *_Encoding, v []interface{}) {
  68647. m.emit(0xc4)
  68648. m.emit(0xe3 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  68649. m.emit(0x7d)
  68650. m.emit(0x04)
  68651. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  68652. m.imm1(toImmAny(v[0]))
  68653. })
  68654. }
  68655. // VPERMILPS ymm, ymm, ymm
  68656. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  68657. self.require(ISA_AVX)
  68658. p.domain = DomainAVX
  68659. p.add(0, func(m *_Encoding, v []interface{}) {
  68660. m.emit(0xc4)
  68661. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  68662. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  68663. m.emit(0x0c)
  68664. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  68665. })
  68666. }
  68667. // VPERMILPS m256, ymm, ymm
  68668. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  68669. self.require(ISA_AVX)
  68670. p.domain = DomainAVX
  68671. p.add(0, func(m *_Encoding, v []interface{}) {
  68672. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  68673. m.emit(0x0c)
  68674. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  68675. })
  68676. }
  68677. // VPERMILPS imm8, m256, ymm
  68678. if isImm8(v0) && isM256(v1) && isYMM(v2) {
  68679. self.require(ISA_AVX)
  68680. p.domain = DomainAVX
  68681. p.add(0, func(m *_Encoding, v []interface{}) {
  68682. m.vex3(0xc4, 0b11, 0x05, hcode(v[2]), addr(v[1]), 0)
  68683. m.emit(0x04)
  68684. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  68685. m.imm1(toImmAny(v[0]))
  68686. })
  68687. }
  68688. // VPERMILPS imm8, m512/m32bcst, zmm{k}{z}
  68689. if isImm8(v0) && isM512M32bcst(v1) && isZMMkz(v2) {
  68690. self.require(ISA_AVX512F)
  68691. p.domain = DomainAVX
  68692. p.add(0, func(m *_Encoding, v []interface{}) {
  68693. m.evex(0b11, 0x05, 0b10, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  68694. m.emit(0x04)
  68695. m.mrsd(lcode(v[2]), addr(v[1]), 64)
  68696. m.imm1(toImmAny(v[0]))
  68697. })
  68698. }
  68699. // VPERMILPS m512/m32bcst, zmm, zmm{k}{z}
  68700. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  68701. self.require(ISA_AVX512F)
  68702. p.domain = DomainAVX
  68703. p.add(0, func(m *_Encoding, v []interface{}) {
  68704. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  68705. m.emit(0x0c)
  68706. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  68707. })
  68708. }
  68709. // VPERMILPS imm8, zmm, zmm{k}{z}
  68710. if isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  68711. self.require(ISA_AVX512F)
  68712. p.domain = DomainAVX
  68713. p.add(0, func(m *_Encoding, v []interface{}) {
  68714. m.emit(0x62)
  68715. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  68716. m.emit(0x7d)
  68717. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x48)
  68718. m.emit(0x04)
  68719. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  68720. m.imm1(toImmAny(v[0]))
  68721. })
  68722. }
  68723. // VPERMILPS zmm, zmm, zmm{k}{z}
  68724. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  68725. self.require(ISA_AVX512F)
  68726. p.domain = DomainAVX
  68727. p.add(0, func(m *_Encoding, v []interface{}) {
  68728. m.emit(0x62)
  68729. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  68730. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  68731. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  68732. m.emit(0x0c)
  68733. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  68734. })
  68735. }
  68736. // VPERMILPS imm8, m128/m32bcst, xmm{k}{z}
  68737. if isImm8(v0) && isM128M32bcst(v1) && isXMMkz(v2) {
  68738. self.require(ISA_AVX512VL | ISA_AVX512F)
  68739. p.domain = DomainAVX
  68740. p.add(0, func(m *_Encoding, v []interface{}) {
  68741. m.evex(0b11, 0x05, 0b00, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  68742. m.emit(0x04)
  68743. m.mrsd(lcode(v[2]), addr(v[1]), 16)
  68744. m.imm1(toImmAny(v[0]))
  68745. })
  68746. }
  68747. // VPERMILPS imm8, m256/m32bcst, ymm{k}{z}
  68748. if isImm8(v0) && isM256M32bcst(v1) && isYMMkz(v2) {
  68749. self.require(ISA_AVX512VL | ISA_AVX512F)
  68750. p.domain = DomainAVX
  68751. p.add(0, func(m *_Encoding, v []interface{}) {
  68752. m.evex(0b11, 0x05, 0b01, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  68753. m.emit(0x04)
  68754. m.mrsd(lcode(v[2]), addr(v[1]), 32)
  68755. m.imm1(toImmAny(v[0]))
  68756. })
  68757. }
  68758. // VPERMILPS m128/m32bcst, xmm, xmm{k}{z}
  68759. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  68760. self.require(ISA_AVX512VL | ISA_AVX512F)
  68761. p.domain = DomainAVX
  68762. p.add(0, func(m *_Encoding, v []interface{}) {
  68763. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  68764. m.emit(0x0c)
  68765. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  68766. })
  68767. }
  68768. // VPERMILPS imm8, xmm, xmm{k}{z}
  68769. if isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  68770. self.require(ISA_AVX512VL | ISA_AVX512F)
  68771. p.domain = DomainAVX
  68772. p.add(0, func(m *_Encoding, v []interface{}) {
  68773. m.emit(0x62)
  68774. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  68775. m.emit(0x7d)
  68776. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x08)
  68777. m.emit(0x04)
  68778. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  68779. m.imm1(toImmAny(v[0]))
  68780. })
  68781. }
  68782. // VPERMILPS xmm, xmm, xmm{k}{z}
  68783. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  68784. self.require(ISA_AVX512VL | ISA_AVX512F)
  68785. p.domain = DomainAVX
  68786. p.add(0, func(m *_Encoding, v []interface{}) {
  68787. m.emit(0x62)
  68788. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  68789. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  68790. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  68791. m.emit(0x0c)
  68792. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  68793. })
  68794. }
  68795. // VPERMILPS m256/m32bcst, ymm, ymm{k}{z}
  68796. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  68797. self.require(ISA_AVX512VL | ISA_AVX512F)
  68798. p.domain = DomainAVX
  68799. p.add(0, func(m *_Encoding, v []interface{}) {
  68800. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  68801. m.emit(0x0c)
  68802. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  68803. })
  68804. }
  68805. // VPERMILPS imm8, ymm, ymm{k}{z}
  68806. if isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  68807. self.require(ISA_AVX512VL | ISA_AVX512F)
  68808. p.domain = DomainAVX
  68809. p.add(0, func(m *_Encoding, v []interface{}) {
  68810. m.emit(0x62)
  68811. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  68812. m.emit(0x7d)
  68813. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x28)
  68814. m.emit(0x04)
  68815. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  68816. m.imm1(toImmAny(v[0]))
  68817. })
  68818. }
  68819. // VPERMILPS ymm, ymm, ymm{k}{z}
  68820. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  68821. self.require(ISA_AVX512VL | ISA_AVX512F)
  68822. p.domain = DomainAVX
  68823. p.add(0, func(m *_Encoding, v []interface{}) {
  68824. m.emit(0x62)
  68825. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  68826. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  68827. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  68828. m.emit(0x0c)
  68829. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  68830. })
  68831. }
  68832. if p.len == 0 {
  68833. panic("invalid operands for VPERMILPS")
  68834. }
  68835. return p
  68836. }
  68837. // VPERMPD performs "Permute Double-Precision Floating-Point Elements".
  68838. //
  68839. // Mnemonic : VPERMPD
  68840. // Supported forms : (10 forms)
  68841. //
  68842. // * VPERMPD imm8, ymm, ymm [AVX2]
  68843. // * VPERMPD imm8, m256, ymm [AVX2]
  68844. // * VPERMPD imm8, m512/m64bcst, zmm{k}{z} [AVX512F]
  68845. // * VPERMPD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  68846. // * VPERMPD imm8, zmm, zmm{k}{z} [AVX512F]
  68847. // * VPERMPD zmm, zmm, zmm{k}{z} [AVX512F]
  68848. // * VPERMPD imm8, m256/m64bcst, ymm{k}{z} [AVX512F,AVX512VL]
  68849. // * VPERMPD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  68850. // * VPERMPD imm8, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  68851. // * VPERMPD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  68852. //
  68853. func (self *Program) VPERMPD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  68854. p := self.alloc("VPERMPD", 3, Operands { v0, v1, v2 })
  68855. // VPERMPD imm8, ymm, ymm
  68856. if isImm8(v0) && isYMM(v1) && isYMM(v2) {
  68857. self.require(ISA_AVX2)
  68858. p.domain = DomainAVX
  68859. p.add(0, func(m *_Encoding, v []interface{}) {
  68860. m.emit(0xc4)
  68861. m.emit(0xe3 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  68862. m.emit(0xfd)
  68863. m.emit(0x01)
  68864. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  68865. m.imm1(toImmAny(v[0]))
  68866. })
  68867. }
  68868. // VPERMPD imm8, m256, ymm
  68869. if isImm8(v0) && isM256(v1) && isYMM(v2) {
  68870. self.require(ISA_AVX2)
  68871. p.domain = DomainAVX
  68872. p.add(0, func(m *_Encoding, v []interface{}) {
  68873. m.vex3(0xc4, 0b11, 0x85, hcode(v[2]), addr(v[1]), 0)
  68874. m.emit(0x01)
  68875. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  68876. m.imm1(toImmAny(v[0]))
  68877. })
  68878. }
  68879. // VPERMPD imm8, m512/m64bcst, zmm{k}{z}
  68880. if isImm8(v0) && isM512M64bcst(v1) && isZMMkz(v2) {
  68881. self.require(ISA_AVX512F)
  68882. p.domain = DomainAVX
  68883. p.add(0, func(m *_Encoding, v []interface{}) {
  68884. m.evex(0b11, 0x85, 0b10, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  68885. m.emit(0x01)
  68886. m.mrsd(lcode(v[2]), addr(v[1]), 64)
  68887. m.imm1(toImmAny(v[0]))
  68888. })
  68889. }
  68890. // VPERMPD m512/m64bcst, zmm, zmm{k}{z}
  68891. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  68892. self.require(ISA_AVX512F)
  68893. p.domain = DomainAVX
  68894. p.add(0, func(m *_Encoding, v []interface{}) {
  68895. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  68896. m.emit(0x16)
  68897. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  68898. })
  68899. }
  68900. // VPERMPD imm8, zmm, zmm{k}{z}
  68901. if isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  68902. self.require(ISA_AVX512F)
  68903. p.domain = DomainAVX
  68904. p.add(0, func(m *_Encoding, v []interface{}) {
  68905. m.emit(0x62)
  68906. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  68907. m.emit(0xfd)
  68908. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x48)
  68909. m.emit(0x01)
  68910. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  68911. m.imm1(toImmAny(v[0]))
  68912. })
  68913. }
  68914. // VPERMPD zmm, zmm, zmm{k}{z}
  68915. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  68916. self.require(ISA_AVX512F)
  68917. p.domain = DomainAVX
  68918. p.add(0, func(m *_Encoding, v []interface{}) {
  68919. m.emit(0x62)
  68920. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  68921. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  68922. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  68923. m.emit(0x16)
  68924. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  68925. })
  68926. }
  68927. // VPERMPD imm8, m256/m64bcst, ymm{k}{z}
  68928. if isImm8(v0) && isM256M64bcst(v1) && isYMMkz(v2) {
  68929. self.require(ISA_AVX512VL | ISA_AVX512F)
  68930. p.domain = DomainAVX
  68931. p.add(0, func(m *_Encoding, v []interface{}) {
  68932. m.evex(0b11, 0x85, 0b01, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  68933. m.emit(0x01)
  68934. m.mrsd(lcode(v[2]), addr(v[1]), 32)
  68935. m.imm1(toImmAny(v[0]))
  68936. })
  68937. }
  68938. // VPERMPD m256/m64bcst, ymm, ymm{k}{z}
  68939. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  68940. self.require(ISA_AVX512VL | ISA_AVX512F)
  68941. p.domain = DomainAVX
  68942. p.add(0, func(m *_Encoding, v []interface{}) {
  68943. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  68944. m.emit(0x16)
  68945. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  68946. })
  68947. }
  68948. // VPERMPD imm8, ymm, ymm{k}{z}
  68949. if isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  68950. self.require(ISA_AVX512VL | ISA_AVX512F)
  68951. p.domain = DomainAVX
  68952. p.add(0, func(m *_Encoding, v []interface{}) {
  68953. m.emit(0x62)
  68954. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  68955. m.emit(0xfd)
  68956. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x28)
  68957. m.emit(0x01)
  68958. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  68959. m.imm1(toImmAny(v[0]))
  68960. })
  68961. }
  68962. // VPERMPD ymm, ymm, ymm{k}{z}
  68963. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  68964. self.require(ISA_AVX512VL | ISA_AVX512F)
  68965. p.domain = DomainAVX
  68966. p.add(0, func(m *_Encoding, v []interface{}) {
  68967. m.emit(0x62)
  68968. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  68969. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  68970. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  68971. m.emit(0x16)
  68972. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  68973. })
  68974. }
  68975. if p.len == 0 {
  68976. panic("invalid operands for VPERMPD")
  68977. }
  68978. return p
  68979. }
  68980. // VPERMPS performs "Permute Single-Precision Floating-Point Elements".
  68981. //
  68982. // Mnemonic : VPERMPS
  68983. // Supported forms : (6 forms)
  68984. //
  68985. // * VPERMPS ymm, ymm, ymm [AVX2]
  68986. // * VPERMPS m256, ymm, ymm [AVX2]
  68987. // * VPERMPS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  68988. // * VPERMPS zmm, zmm, zmm{k}{z} [AVX512F]
  68989. // * VPERMPS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  68990. // * VPERMPS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  68991. //
  68992. func (self *Program) VPERMPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  68993. p := self.alloc("VPERMPS", 3, Operands { v0, v1, v2 })
  68994. // VPERMPS ymm, ymm, ymm
  68995. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  68996. self.require(ISA_AVX2)
  68997. p.domain = DomainAVX
  68998. p.add(0, func(m *_Encoding, v []interface{}) {
  68999. m.emit(0xc4)
  69000. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  69001. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  69002. m.emit(0x16)
  69003. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69004. })
  69005. }
  69006. // VPERMPS m256, ymm, ymm
  69007. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  69008. self.require(ISA_AVX2)
  69009. p.domain = DomainAVX
  69010. p.add(0, func(m *_Encoding, v []interface{}) {
  69011. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  69012. m.emit(0x16)
  69013. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  69014. })
  69015. }
  69016. // VPERMPS m512/m32bcst, zmm, zmm{k}{z}
  69017. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  69018. self.require(ISA_AVX512F)
  69019. p.domain = DomainAVX
  69020. p.add(0, func(m *_Encoding, v []interface{}) {
  69021. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  69022. m.emit(0x16)
  69023. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  69024. })
  69025. }
  69026. // VPERMPS zmm, zmm, zmm{k}{z}
  69027. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  69028. self.require(ISA_AVX512F)
  69029. p.domain = DomainAVX
  69030. p.add(0, func(m *_Encoding, v []interface{}) {
  69031. m.emit(0x62)
  69032. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69033. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  69034. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  69035. m.emit(0x16)
  69036. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69037. })
  69038. }
  69039. // VPERMPS m256/m32bcst, ymm, ymm{k}{z}
  69040. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  69041. self.require(ISA_AVX512VL | ISA_AVX512F)
  69042. p.domain = DomainAVX
  69043. p.add(0, func(m *_Encoding, v []interface{}) {
  69044. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  69045. m.emit(0x16)
  69046. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  69047. })
  69048. }
  69049. // VPERMPS ymm, ymm, ymm{k}{z}
  69050. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  69051. self.require(ISA_AVX512VL | ISA_AVX512F)
  69052. p.domain = DomainAVX
  69053. p.add(0, func(m *_Encoding, v []interface{}) {
  69054. m.emit(0x62)
  69055. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69056. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  69057. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  69058. m.emit(0x16)
  69059. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69060. })
  69061. }
  69062. if p.len == 0 {
  69063. panic("invalid operands for VPERMPS")
  69064. }
  69065. return p
  69066. }
  69067. // VPERMQ performs "Permute Quadword Integers".
  69068. //
  69069. // Mnemonic : VPERMQ
  69070. // Supported forms : (10 forms)
  69071. //
  69072. // * VPERMQ imm8, ymm, ymm [AVX2]
  69073. // * VPERMQ imm8, m256, ymm [AVX2]
  69074. // * VPERMQ imm8, m512/m64bcst, zmm{k}{z} [AVX512F]
  69075. // * VPERMQ m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  69076. // * VPERMQ imm8, zmm, zmm{k}{z} [AVX512F]
  69077. // * VPERMQ zmm, zmm, zmm{k}{z} [AVX512F]
  69078. // * VPERMQ imm8, m256/m64bcst, ymm{k}{z} [AVX512F,AVX512VL]
  69079. // * VPERMQ m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  69080. // * VPERMQ imm8, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  69081. // * VPERMQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  69082. //
  69083. func (self *Program) VPERMQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  69084. p := self.alloc("VPERMQ", 3, Operands { v0, v1, v2 })
  69085. // VPERMQ imm8, ymm, ymm
  69086. if isImm8(v0) && isYMM(v1) && isYMM(v2) {
  69087. self.require(ISA_AVX2)
  69088. p.domain = DomainAVX
  69089. p.add(0, func(m *_Encoding, v []interface{}) {
  69090. m.emit(0xc4)
  69091. m.emit(0xe3 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  69092. m.emit(0xfd)
  69093. m.emit(0x00)
  69094. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  69095. m.imm1(toImmAny(v[0]))
  69096. })
  69097. }
  69098. // VPERMQ imm8, m256, ymm
  69099. if isImm8(v0) && isM256(v1) && isYMM(v2) {
  69100. self.require(ISA_AVX2)
  69101. p.domain = DomainAVX
  69102. p.add(0, func(m *_Encoding, v []interface{}) {
  69103. m.vex3(0xc4, 0b11, 0x85, hcode(v[2]), addr(v[1]), 0)
  69104. m.emit(0x00)
  69105. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  69106. m.imm1(toImmAny(v[0]))
  69107. })
  69108. }
  69109. // VPERMQ imm8, m512/m64bcst, zmm{k}{z}
  69110. if isImm8(v0) && isM512M64bcst(v1) && isZMMkz(v2) {
  69111. self.require(ISA_AVX512F)
  69112. p.domain = DomainAVX
  69113. p.add(0, func(m *_Encoding, v []interface{}) {
  69114. m.evex(0b11, 0x85, 0b10, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  69115. m.emit(0x00)
  69116. m.mrsd(lcode(v[2]), addr(v[1]), 64)
  69117. m.imm1(toImmAny(v[0]))
  69118. })
  69119. }
  69120. // VPERMQ m512/m64bcst, zmm, zmm{k}{z}
  69121. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  69122. self.require(ISA_AVX512F)
  69123. p.domain = DomainAVX
  69124. p.add(0, func(m *_Encoding, v []interface{}) {
  69125. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  69126. m.emit(0x36)
  69127. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  69128. })
  69129. }
  69130. // VPERMQ imm8, zmm, zmm{k}{z}
  69131. if isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  69132. self.require(ISA_AVX512F)
  69133. p.domain = DomainAVX
  69134. p.add(0, func(m *_Encoding, v []interface{}) {
  69135. m.emit(0x62)
  69136. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  69137. m.emit(0xfd)
  69138. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x48)
  69139. m.emit(0x00)
  69140. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  69141. m.imm1(toImmAny(v[0]))
  69142. })
  69143. }
  69144. // VPERMQ zmm, zmm, zmm{k}{z}
  69145. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  69146. self.require(ISA_AVX512F)
  69147. p.domain = DomainAVX
  69148. p.add(0, func(m *_Encoding, v []interface{}) {
  69149. m.emit(0x62)
  69150. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69151. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  69152. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  69153. m.emit(0x36)
  69154. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69155. })
  69156. }
  69157. // VPERMQ imm8, m256/m64bcst, ymm{k}{z}
  69158. if isImm8(v0) && isM256M64bcst(v1) && isYMMkz(v2) {
  69159. self.require(ISA_AVX512VL | ISA_AVX512F)
  69160. p.domain = DomainAVX
  69161. p.add(0, func(m *_Encoding, v []interface{}) {
  69162. m.evex(0b11, 0x85, 0b01, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  69163. m.emit(0x00)
  69164. m.mrsd(lcode(v[2]), addr(v[1]), 32)
  69165. m.imm1(toImmAny(v[0]))
  69166. })
  69167. }
  69168. // VPERMQ m256/m64bcst, ymm, ymm{k}{z}
  69169. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  69170. self.require(ISA_AVX512VL | ISA_AVX512F)
  69171. p.domain = DomainAVX
  69172. p.add(0, func(m *_Encoding, v []interface{}) {
  69173. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  69174. m.emit(0x36)
  69175. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  69176. })
  69177. }
  69178. // VPERMQ imm8, ymm, ymm{k}{z}
  69179. if isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  69180. self.require(ISA_AVX512VL | ISA_AVX512F)
  69181. p.domain = DomainAVX
  69182. p.add(0, func(m *_Encoding, v []interface{}) {
  69183. m.emit(0x62)
  69184. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  69185. m.emit(0xfd)
  69186. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x28)
  69187. m.emit(0x00)
  69188. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  69189. m.imm1(toImmAny(v[0]))
  69190. })
  69191. }
  69192. // VPERMQ ymm, ymm, ymm{k}{z}
  69193. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  69194. self.require(ISA_AVX512VL | ISA_AVX512F)
  69195. p.domain = DomainAVX
  69196. p.add(0, func(m *_Encoding, v []interface{}) {
  69197. m.emit(0x62)
  69198. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69199. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  69200. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  69201. m.emit(0x36)
  69202. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69203. })
  69204. }
  69205. if p.len == 0 {
  69206. panic("invalid operands for VPERMQ")
  69207. }
  69208. return p
  69209. }
  69210. // VPERMT2B performs "Full Permute of Bytes From Two Tables Overwriting a Table".
  69211. //
  69212. // Mnemonic : VPERMT2B
  69213. // Supported forms : (6 forms)
  69214. //
  69215. // * VPERMT2B xmm, xmm, xmm{k}{z} [AVX512VBMI,AVX512VL]
  69216. // * VPERMT2B m128, xmm, xmm{k}{z} [AVX512VBMI,AVX512VL]
  69217. // * VPERMT2B ymm, ymm, ymm{k}{z} [AVX512VBMI,AVX512VL]
  69218. // * VPERMT2B m256, ymm, ymm{k}{z} [AVX512VBMI,AVX512VL]
  69219. // * VPERMT2B zmm, zmm, zmm{k}{z} [AVX512VBMI]
  69220. // * VPERMT2B m512, zmm, zmm{k}{z} [AVX512VBMI]
  69221. //
  69222. func (self *Program) VPERMT2B(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  69223. p := self.alloc("VPERMT2B", 3, Operands { v0, v1, v2 })
  69224. // VPERMT2B xmm, xmm, xmm{k}{z}
  69225. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  69226. self.require(ISA_AVX512VL | ISA_AVX512VBMI)
  69227. p.domain = DomainAVX
  69228. p.add(0, func(m *_Encoding, v []interface{}) {
  69229. m.emit(0x62)
  69230. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69231. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  69232. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  69233. m.emit(0x7d)
  69234. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69235. })
  69236. }
  69237. // VPERMT2B m128, xmm, xmm{k}{z}
  69238. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  69239. self.require(ISA_AVX512VL | ISA_AVX512VBMI)
  69240. p.domain = DomainAVX
  69241. p.add(0, func(m *_Encoding, v []interface{}) {
  69242. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  69243. m.emit(0x7d)
  69244. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  69245. })
  69246. }
  69247. // VPERMT2B ymm, ymm, ymm{k}{z}
  69248. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  69249. self.require(ISA_AVX512VL | ISA_AVX512VBMI)
  69250. p.domain = DomainAVX
  69251. p.add(0, func(m *_Encoding, v []interface{}) {
  69252. m.emit(0x62)
  69253. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69254. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  69255. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  69256. m.emit(0x7d)
  69257. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69258. })
  69259. }
  69260. // VPERMT2B m256, ymm, ymm{k}{z}
  69261. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  69262. self.require(ISA_AVX512VL | ISA_AVX512VBMI)
  69263. p.domain = DomainAVX
  69264. p.add(0, func(m *_Encoding, v []interface{}) {
  69265. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  69266. m.emit(0x7d)
  69267. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  69268. })
  69269. }
  69270. // VPERMT2B zmm, zmm, zmm{k}{z}
  69271. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  69272. self.require(ISA_AVX512VBMI)
  69273. p.domain = DomainAVX
  69274. p.add(0, func(m *_Encoding, v []interface{}) {
  69275. m.emit(0x62)
  69276. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69277. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  69278. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  69279. m.emit(0x7d)
  69280. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69281. })
  69282. }
  69283. // VPERMT2B m512, zmm, zmm{k}{z}
  69284. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  69285. self.require(ISA_AVX512VBMI)
  69286. p.domain = DomainAVX
  69287. p.add(0, func(m *_Encoding, v []interface{}) {
  69288. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  69289. m.emit(0x7d)
  69290. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  69291. })
  69292. }
  69293. if p.len == 0 {
  69294. panic("invalid operands for VPERMT2B")
  69295. }
  69296. return p
  69297. }
  69298. // VPERMT2D performs "Full Permute of Doublewords From Two Tables Overwriting a Table".
  69299. //
  69300. // Mnemonic : VPERMT2D
  69301. // Supported forms : (6 forms)
  69302. //
  69303. // * VPERMT2D m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  69304. // * VPERMT2D zmm, zmm, zmm{k}{z} [AVX512F]
  69305. // * VPERMT2D m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  69306. // * VPERMT2D xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  69307. // * VPERMT2D m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  69308. // * VPERMT2D ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  69309. //
  69310. func (self *Program) VPERMT2D(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  69311. p := self.alloc("VPERMT2D", 3, Operands { v0, v1, v2 })
  69312. // VPERMT2D m512/m32bcst, zmm, zmm{k}{z}
  69313. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  69314. self.require(ISA_AVX512F)
  69315. p.domain = DomainAVX
  69316. p.add(0, func(m *_Encoding, v []interface{}) {
  69317. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  69318. m.emit(0x7e)
  69319. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  69320. })
  69321. }
  69322. // VPERMT2D zmm, zmm, zmm{k}{z}
  69323. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  69324. self.require(ISA_AVX512F)
  69325. p.domain = DomainAVX
  69326. p.add(0, func(m *_Encoding, v []interface{}) {
  69327. m.emit(0x62)
  69328. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69329. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  69330. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  69331. m.emit(0x7e)
  69332. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69333. })
  69334. }
  69335. // VPERMT2D m128/m32bcst, xmm, xmm{k}{z}
  69336. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  69337. self.require(ISA_AVX512VL | ISA_AVX512F)
  69338. p.domain = DomainAVX
  69339. p.add(0, func(m *_Encoding, v []interface{}) {
  69340. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  69341. m.emit(0x7e)
  69342. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  69343. })
  69344. }
  69345. // VPERMT2D xmm, xmm, xmm{k}{z}
  69346. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  69347. self.require(ISA_AVX512VL | ISA_AVX512F)
  69348. p.domain = DomainAVX
  69349. p.add(0, func(m *_Encoding, v []interface{}) {
  69350. m.emit(0x62)
  69351. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69352. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  69353. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  69354. m.emit(0x7e)
  69355. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69356. })
  69357. }
  69358. // VPERMT2D m256/m32bcst, ymm, ymm{k}{z}
  69359. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  69360. self.require(ISA_AVX512VL | ISA_AVX512F)
  69361. p.domain = DomainAVX
  69362. p.add(0, func(m *_Encoding, v []interface{}) {
  69363. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  69364. m.emit(0x7e)
  69365. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  69366. })
  69367. }
  69368. // VPERMT2D ymm, ymm, ymm{k}{z}
  69369. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  69370. self.require(ISA_AVX512VL | ISA_AVX512F)
  69371. p.domain = DomainAVX
  69372. p.add(0, func(m *_Encoding, v []interface{}) {
  69373. m.emit(0x62)
  69374. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69375. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  69376. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  69377. m.emit(0x7e)
  69378. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69379. })
  69380. }
  69381. if p.len == 0 {
  69382. panic("invalid operands for VPERMT2D")
  69383. }
  69384. return p
  69385. }
  69386. // VPERMT2PD performs "Full Permute of Double-Precision Floating-Point Values From Two Tables Overwriting a Table".
  69387. //
  69388. // Mnemonic : VPERMT2PD
  69389. // Supported forms : (6 forms)
  69390. //
  69391. // * VPERMT2PD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  69392. // * VPERMT2PD zmm, zmm, zmm{k}{z} [AVX512F]
  69393. // * VPERMT2PD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  69394. // * VPERMT2PD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  69395. // * VPERMT2PD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  69396. // * VPERMT2PD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  69397. //
  69398. func (self *Program) VPERMT2PD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  69399. p := self.alloc("VPERMT2PD", 3, Operands { v0, v1, v2 })
  69400. // VPERMT2PD m512/m64bcst, zmm, zmm{k}{z}
  69401. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  69402. self.require(ISA_AVX512F)
  69403. p.domain = DomainAVX
  69404. p.add(0, func(m *_Encoding, v []interface{}) {
  69405. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  69406. m.emit(0x7f)
  69407. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  69408. })
  69409. }
  69410. // VPERMT2PD zmm, zmm, zmm{k}{z}
  69411. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  69412. self.require(ISA_AVX512F)
  69413. p.domain = DomainAVX
  69414. p.add(0, func(m *_Encoding, v []interface{}) {
  69415. m.emit(0x62)
  69416. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69417. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  69418. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  69419. m.emit(0x7f)
  69420. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69421. })
  69422. }
  69423. // VPERMT2PD m128/m64bcst, xmm, xmm{k}{z}
  69424. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  69425. self.require(ISA_AVX512VL | ISA_AVX512F)
  69426. p.domain = DomainAVX
  69427. p.add(0, func(m *_Encoding, v []interface{}) {
  69428. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  69429. m.emit(0x7f)
  69430. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  69431. })
  69432. }
  69433. // VPERMT2PD xmm, xmm, xmm{k}{z}
  69434. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  69435. self.require(ISA_AVX512VL | ISA_AVX512F)
  69436. p.domain = DomainAVX
  69437. p.add(0, func(m *_Encoding, v []interface{}) {
  69438. m.emit(0x62)
  69439. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69440. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  69441. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  69442. m.emit(0x7f)
  69443. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69444. })
  69445. }
  69446. // VPERMT2PD m256/m64bcst, ymm, ymm{k}{z}
  69447. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  69448. self.require(ISA_AVX512VL | ISA_AVX512F)
  69449. p.domain = DomainAVX
  69450. p.add(0, func(m *_Encoding, v []interface{}) {
  69451. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  69452. m.emit(0x7f)
  69453. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  69454. })
  69455. }
  69456. // VPERMT2PD ymm, ymm, ymm{k}{z}
  69457. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  69458. self.require(ISA_AVX512VL | ISA_AVX512F)
  69459. p.domain = DomainAVX
  69460. p.add(0, func(m *_Encoding, v []interface{}) {
  69461. m.emit(0x62)
  69462. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69463. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  69464. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  69465. m.emit(0x7f)
  69466. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69467. })
  69468. }
  69469. if p.len == 0 {
  69470. panic("invalid operands for VPERMT2PD")
  69471. }
  69472. return p
  69473. }
  69474. // VPERMT2PS performs "Full Permute of Single-Precision Floating-Point Values From Two Tables Overwriting a Table".
  69475. //
  69476. // Mnemonic : VPERMT2PS
  69477. // Supported forms : (6 forms)
  69478. //
  69479. // * VPERMT2PS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  69480. // * VPERMT2PS zmm, zmm, zmm{k}{z} [AVX512F]
  69481. // * VPERMT2PS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  69482. // * VPERMT2PS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  69483. // * VPERMT2PS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  69484. // * VPERMT2PS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  69485. //
  69486. func (self *Program) VPERMT2PS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  69487. p := self.alloc("VPERMT2PS", 3, Operands { v0, v1, v2 })
  69488. // VPERMT2PS m512/m32bcst, zmm, zmm{k}{z}
  69489. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  69490. self.require(ISA_AVX512F)
  69491. p.domain = DomainAVX
  69492. p.add(0, func(m *_Encoding, v []interface{}) {
  69493. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  69494. m.emit(0x7f)
  69495. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  69496. })
  69497. }
  69498. // VPERMT2PS zmm, zmm, zmm{k}{z}
  69499. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  69500. self.require(ISA_AVX512F)
  69501. p.domain = DomainAVX
  69502. p.add(0, func(m *_Encoding, v []interface{}) {
  69503. m.emit(0x62)
  69504. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69505. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  69506. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  69507. m.emit(0x7f)
  69508. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69509. })
  69510. }
  69511. // VPERMT2PS m128/m32bcst, xmm, xmm{k}{z}
  69512. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  69513. self.require(ISA_AVX512VL | ISA_AVX512F)
  69514. p.domain = DomainAVX
  69515. p.add(0, func(m *_Encoding, v []interface{}) {
  69516. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  69517. m.emit(0x7f)
  69518. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  69519. })
  69520. }
  69521. // VPERMT2PS xmm, xmm, xmm{k}{z}
  69522. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  69523. self.require(ISA_AVX512VL | ISA_AVX512F)
  69524. p.domain = DomainAVX
  69525. p.add(0, func(m *_Encoding, v []interface{}) {
  69526. m.emit(0x62)
  69527. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69528. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  69529. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  69530. m.emit(0x7f)
  69531. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69532. })
  69533. }
  69534. // VPERMT2PS m256/m32bcst, ymm, ymm{k}{z}
  69535. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  69536. self.require(ISA_AVX512VL | ISA_AVX512F)
  69537. p.domain = DomainAVX
  69538. p.add(0, func(m *_Encoding, v []interface{}) {
  69539. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  69540. m.emit(0x7f)
  69541. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  69542. })
  69543. }
  69544. // VPERMT2PS ymm, ymm, ymm{k}{z}
  69545. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  69546. self.require(ISA_AVX512VL | ISA_AVX512F)
  69547. p.domain = DomainAVX
  69548. p.add(0, func(m *_Encoding, v []interface{}) {
  69549. m.emit(0x62)
  69550. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69551. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  69552. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  69553. m.emit(0x7f)
  69554. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69555. })
  69556. }
  69557. if p.len == 0 {
  69558. panic("invalid operands for VPERMT2PS")
  69559. }
  69560. return p
  69561. }
  69562. // VPERMT2Q performs "Full Permute of Quadwords From Two Tables Overwriting a Table".
  69563. //
  69564. // Mnemonic : VPERMT2Q
  69565. // Supported forms : (6 forms)
  69566. //
  69567. // * VPERMT2Q m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  69568. // * VPERMT2Q zmm, zmm, zmm{k}{z} [AVX512F]
  69569. // * VPERMT2Q m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  69570. // * VPERMT2Q xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  69571. // * VPERMT2Q m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  69572. // * VPERMT2Q ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  69573. //
  69574. func (self *Program) VPERMT2Q(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  69575. p := self.alloc("VPERMT2Q", 3, Operands { v0, v1, v2 })
  69576. // VPERMT2Q m512/m64bcst, zmm, zmm{k}{z}
  69577. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  69578. self.require(ISA_AVX512F)
  69579. p.domain = DomainAVX
  69580. p.add(0, func(m *_Encoding, v []interface{}) {
  69581. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  69582. m.emit(0x7e)
  69583. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  69584. })
  69585. }
  69586. // VPERMT2Q zmm, zmm, zmm{k}{z}
  69587. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  69588. self.require(ISA_AVX512F)
  69589. p.domain = DomainAVX
  69590. p.add(0, func(m *_Encoding, v []interface{}) {
  69591. m.emit(0x62)
  69592. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69593. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  69594. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  69595. m.emit(0x7e)
  69596. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69597. })
  69598. }
  69599. // VPERMT2Q m128/m64bcst, xmm, xmm{k}{z}
  69600. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  69601. self.require(ISA_AVX512VL | ISA_AVX512F)
  69602. p.domain = DomainAVX
  69603. p.add(0, func(m *_Encoding, v []interface{}) {
  69604. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  69605. m.emit(0x7e)
  69606. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  69607. })
  69608. }
  69609. // VPERMT2Q xmm, xmm, xmm{k}{z}
  69610. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  69611. self.require(ISA_AVX512VL | ISA_AVX512F)
  69612. p.domain = DomainAVX
  69613. p.add(0, func(m *_Encoding, v []interface{}) {
  69614. m.emit(0x62)
  69615. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69616. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  69617. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  69618. m.emit(0x7e)
  69619. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69620. })
  69621. }
  69622. // VPERMT2Q m256/m64bcst, ymm, ymm{k}{z}
  69623. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  69624. self.require(ISA_AVX512VL | ISA_AVX512F)
  69625. p.domain = DomainAVX
  69626. p.add(0, func(m *_Encoding, v []interface{}) {
  69627. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  69628. m.emit(0x7e)
  69629. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  69630. })
  69631. }
  69632. // VPERMT2Q ymm, ymm, ymm{k}{z}
  69633. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  69634. self.require(ISA_AVX512VL | ISA_AVX512F)
  69635. p.domain = DomainAVX
  69636. p.add(0, func(m *_Encoding, v []interface{}) {
  69637. m.emit(0x62)
  69638. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69639. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  69640. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  69641. m.emit(0x7e)
  69642. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69643. })
  69644. }
  69645. if p.len == 0 {
  69646. panic("invalid operands for VPERMT2Q")
  69647. }
  69648. return p
  69649. }
  69650. // VPERMT2W performs "Full Permute of Words From Two Tables Overwriting a Table".
  69651. //
  69652. // Mnemonic : VPERMT2W
  69653. // Supported forms : (6 forms)
  69654. //
  69655. // * VPERMT2W zmm, zmm, zmm{k}{z} [AVX512BW]
  69656. // * VPERMT2W m512, zmm, zmm{k}{z} [AVX512BW]
  69657. // * VPERMT2W xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  69658. // * VPERMT2W m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  69659. // * VPERMT2W ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  69660. // * VPERMT2W m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  69661. //
  69662. func (self *Program) VPERMT2W(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  69663. p := self.alloc("VPERMT2W", 3, Operands { v0, v1, v2 })
  69664. // VPERMT2W zmm, zmm, zmm{k}{z}
  69665. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  69666. self.require(ISA_AVX512BW)
  69667. p.domain = DomainAVX
  69668. p.add(0, func(m *_Encoding, v []interface{}) {
  69669. m.emit(0x62)
  69670. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69671. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  69672. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  69673. m.emit(0x7d)
  69674. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69675. })
  69676. }
  69677. // VPERMT2W m512, zmm, zmm{k}{z}
  69678. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  69679. self.require(ISA_AVX512BW)
  69680. p.domain = DomainAVX
  69681. p.add(0, func(m *_Encoding, v []interface{}) {
  69682. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  69683. m.emit(0x7d)
  69684. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  69685. })
  69686. }
  69687. // VPERMT2W xmm, xmm, xmm{k}{z}
  69688. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  69689. self.require(ISA_AVX512VL | ISA_AVX512BW)
  69690. p.domain = DomainAVX
  69691. p.add(0, func(m *_Encoding, v []interface{}) {
  69692. m.emit(0x62)
  69693. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69694. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  69695. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  69696. m.emit(0x7d)
  69697. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69698. })
  69699. }
  69700. // VPERMT2W m128, xmm, xmm{k}{z}
  69701. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  69702. self.require(ISA_AVX512VL | ISA_AVX512BW)
  69703. p.domain = DomainAVX
  69704. p.add(0, func(m *_Encoding, v []interface{}) {
  69705. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  69706. m.emit(0x7d)
  69707. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  69708. })
  69709. }
  69710. // VPERMT2W ymm, ymm, ymm{k}{z}
  69711. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  69712. self.require(ISA_AVX512VL | ISA_AVX512BW)
  69713. p.domain = DomainAVX
  69714. p.add(0, func(m *_Encoding, v []interface{}) {
  69715. m.emit(0x62)
  69716. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69717. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  69718. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  69719. m.emit(0x7d)
  69720. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69721. })
  69722. }
  69723. // VPERMT2W m256, ymm, ymm{k}{z}
  69724. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  69725. self.require(ISA_AVX512VL | ISA_AVX512BW)
  69726. p.domain = DomainAVX
  69727. p.add(0, func(m *_Encoding, v []interface{}) {
  69728. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  69729. m.emit(0x7d)
  69730. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  69731. })
  69732. }
  69733. if p.len == 0 {
  69734. panic("invalid operands for VPERMT2W")
  69735. }
  69736. return p
  69737. }
  69738. // VPERMW performs "Permute Word Integers".
  69739. //
  69740. // Mnemonic : VPERMW
  69741. // Supported forms : (6 forms)
  69742. //
  69743. // * VPERMW zmm, zmm, zmm{k}{z} [AVX512BW]
  69744. // * VPERMW m512, zmm, zmm{k}{z} [AVX512BW]
  69745. // * VPERMW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  69746. // * VPERMW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  69747. // * VPERMW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  69748. // * VPERMW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  69749. //
  69750. func (self *Program) VPERMW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  69751. p := self.alloc("VPERMW", 3, Operands { v0, v1, v2 })
  69752. // VPERMW zmm, zmm, zmm{k}{z}
  69753. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  69754. self.require(ISA_AVX512BW)
  69755. p.domain = DomainAVX
  69756. p.add(0, func(m *_Encoding, v []interface{}) {
  69757. m.emit(0x62)
  69758. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69759. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  69760. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  69761. m.emit(0x8d)
  69762. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69763. })
  69764. }
  69765. // VPERMW m512, zmm, zmm{k}{z}
  69766. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  69767. self.require(ISA_AVX512BW)
  69768. p.domain = DomainAVX
  69769. p.add(0, func(m *_Encoding, v []interface{}) {
  69770. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  69771. m.emit(0x8d)
  69772. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  69773. })
  69774. }
  69775. // VPERMW xmm, xmm, xmm{k}{z}
  69776. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  69777. self.require(ISA_AVX512VL | ISA_AVX512BW)
  69778. p.domain = DomainAVX
  69779. p.add(0, func(m *_Encoding, v []interface{}) {
  69780. m.emit(0x62)
  69781. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69782. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  69783. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  69784. m.emit(0x8d)
  69785. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69786. })
  69787. }
  69788. // VPERMW m128, xmm, xmm{k}{z}
  69789. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  69790. self.require(ISA_AVX512VL | ISA_AVX512BW)
  69791. p.domain = DomainAVX
  69792. p.add(0, func(m *_Encoding, v []interface{}) {
  69793. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  69794. m.emit(0x8d)
  69795. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  69796. })
  69797. }
  69798. // VPERMW ymm, ymm, ymm{k}{z}
  69799. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  69800. self.require(ISA_AVX512VL | ISA_AVX512BW)
  69801. p.domain = DomainAVX
  69802. p.add(0, func(m *_Encoding, v []interface{}) {
  69803. m.emit(0x62)
  69804. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  69805. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  69806. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  69807. m.emit(0x8d)
  69808. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  69809. })
  69810. }
  69811. // VPERMW m256, ymm, ymm{k}{z}
  69812. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  69813. self.require(ISA_AVX512VL | ISA_AVX512BW)
  69814. p.domain = DomainAVX
  69815. p.add(0, func(m *_Encoding, v []interface{}) {
  69816. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  69817. m.emit(0x8d)
  69818. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  69819. })
  69820. }
  69821. if p.len == 0 {
  69822. panic("invalid operands for VPERMW")
  69823. }
  69824. return p
  69825. }
  69826. // VPEXPANDD performs "Load Sparse Packed Doubleword Integer Values from Dense Memory/Register".
  69827. //
  69828. // Mnemonic : VPEXPANDD
  69829. // Supported forms : (6 forms)
  69830. //
  69831. // * VPEXPANDD zmm, zmm{k}{z} [AVX512F]
  69832. // * VPEXPANDD m512, zmm{k}{z} [AVX512F]
  69833. // * VPEXPANDD xmm, xmm{k}{z} [AVX512F,AVX512VL]
  69834. // * VPEXPANDD ymm, ymm{k}{z} [AVX512F,AVX512VL]
  69835. // * VPEXPANDD m128, xmm{k}{z} [AVX512F,AVX512VL]
  69836. // * VPEXPANDD m256, ymm{k}{z} [AVX512F,AVX512VL]
  69837. //
  69838. func (self *Program) VPEXPANDD(v0 interface{}, v1 interface{}) *Instruction {
  69839. p := self.alloc("VPEXPANDD", 2, Operands { v0, v1 })
  69840. // VPEXPANDD zmm, zmm{k}{z}
  69841. if isZMM(v0) && isZMMkz(v1) {
  69842. self.require(ISA_AVX512F)
  69843. p.domain = DomainAVX
  69844. p.add(0, func(m *_Encoding, v []interface{}) {
  69845. m.emit(0x62)
  69846. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  69847. m.emit(0x7d)
  69848. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  69849. m.emit(0x89)
  69850. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  69851. })
  69852. }
  69853. // VPEXPANDD m512, zmm{k}{z}
  69854. if isM512(v0) && isZMMkz(v1) {
  69855. self.require(ISA_AVX512F)
  69856. p.domain = DomainAVX
  69857. p.add(0, func(m *_Encoding, v []interface{}) {
  69858. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  69859. m.emit(0x89)
  69860. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  69861. })
  69862. }
  69863. // VPEXPANDD xmm, xmm{k}{z}
  69864. if isEVEXXMM(v0) && isXMMkz(v1) {
  69865. self.require(ISA_AVX512VL | ISA_AVX512F)
  69866. p.domain = DomainAVX
  69867. p.add(0, func(m *_Encoding, v []interface{}) {
  69868. m.emit(0x62)
  69869. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  69870. m.emit(0x7d)
  69871. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  69872. m.emit(0x89)
  69873. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  69874. })
  69875. }
  69876. // VPEXPANDD ymm, ymm{k}{z}
  69877. if isEVEXYMM(v0) && isYMMkz(v1) {
  69878. self.require(ISA_AVX512VL | ISA_AVX512F)
  69879. p.domain = DomainAVX
  69880. p.add(0, func(m *_Encoding, v []interface{}) {
  69881. m.emit(0x62)
  69882. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  69883. m.emit(0x7d)
  69884. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  69885. m.emit(0x89)
  69886. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  69887. })
  69888. }
  69889. // VPEXPANDD m128, xmm{k}{z}
  69890. if isM128(v0) && isXMMkz(v1) {
  69891. self.require(ISA_AVX512VL | ISA_AVX512F)
  69892. p.domain = DomainAVX
  69893. p.add(0, func(m *_Encoding, v []interface{}) {
  69894. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  69895. m.emit(0x89)
  69896. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  69897. })
  69898. }
  69899. // VPEXPANDD m256, ymm{k}{z}
  69900. if isM256(v0) && isYMMkz(v1) {
  69901. self.require(ISA_AVX512VL | ISA_AVX512F)
  69902. p.domain = DomainAVX
  69903. p.add(0, func(m *_Encoding, v []interface{}) {
  69904. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  69905. m.emit(0x89)
  69906. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  69907. })
  69908. }
  69909. if p.len == 0 {
  69910. panic("invalid operands for VPEXPANDD")
  69911. }
  69912. return p
  69913. }
  69914. // VPEXPANDQ performs "Load Sparse Packed Quadword Integer Values from Dense Memory/Register".
  69915. //
  69916. // Mnemonic : VPEXPANDQ
  69917. // Supported forms : (6 forms)
  69918. //
  69919. // * VPEXPANDQ zmm, zmm{k}{z} [AVX512F]
  69920. // * VPEXPANDQ m512, zmm{k}{z} [AVX512F]
  69921. // * VPEXPANDQ xmm, xmm{k}{z} [AVX512F,AVX512VL]
  69922. // * VPEXPANDQ ymm, ymm{k}{z} [AVX512F,AVX512VL]
  69923. // * VPEXPANDQ m128, xmm{k}{z} [AVX512F,AVX512VL]
  69924. // * VPEXPANDQ m256, ymm{k}{z} [AVX512F,AVX512VL]
  69925. //
  69926. func (self *Program) VPEXPANDQ(v0 interface{}, v1 interface{}) *Instruction {
  69927. p := self.alloc("VPEXPANDQ", 2, Operands { v0, v1 })
  69928. // VPEXPANDQ zmm, zmm{k}{z}
  69929. if isZMM(v0) && isZMMkz(v1) {
  69930. self.require(ISA_AVX512F)
  69931. p.domain = DomainAVX
  69932. p.add(0, func(m *_Encoding, v []interface{}) {
  69933. m.emit(0x62)
  69934. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  69935. m.emit(0xfd)
  69936. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  69937. m.emit(0x89)
  69938. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  69939. })
  69940. }
  69941. // VPEXPANDQ m512, zmm{k}{z}
  69942. if isM512(v0) && isZMMkz(v1) {
  69943. self.require(ISA_AVX512F)
  69944. p.domain = DomainAVX
  69945. p.add(0, func(m *_Encoding, v []interface{}) {
  69946. m.evex(0b10, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  69947. m.emit(0x89)
  69948. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  69949. })
  69950. }
  69951. // VPEXPANDQ xmm, xmm{k}{z}
  69952. if isEVEXXMM(v0) && isXMMkz(v1) {
  69953. self.require(ISA_AVX512VL | ISA_AVX512F)
  69954. p.domain = DomainAVX
  69955. p.add(0, func(m *_Encoding, v []interface{}) {
  69956. m.emit(0x62)
  69957. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  69958. m.emit(0xfd)
  69959. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  69960. m.emit(0x89)
  69961. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  69962. })
  69963. }
  69964. // VPEXPANDQ ymm, ymm{k}{z}
  69965. if isEVEXYMM(v0) && isYMMkz(v1) {
  69966. self.require(ISA_AVX512VL | ISA_AVX512F)
  69967. p.domain = DomainAVX
  69968. p.add(0, func(m *_Encoding, v []interface{}) {
  69969. m.emit(0x62)
  69970. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  69971. m.emit(0xfd)
  69972. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  69973. m.emit(0x89)
  69974. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  69975. })
  69976. }
  69977. // VPEXPANDQ m128, xmm{k}{z}
  69978. if isM128(v0) && isXMMkz(v1) {
  69979. self.require(ISA_AVX512VL | ISA_AVX512F)
  69980. p.domain = DomainAVX
  69981. p.add(0, func(m *_Encoding, v []interface{}) {
  69982. m.evex(0b10, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  69983. m.emit(0x89)
  69984. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  69985. })
  69986. }
  69987. // VPEXPANDQ m256, ymm{k}{z}
  69988. if isM256(v0) && isYMMkz(v1) {
  69989. self.require(ISA_AVX512VL | ISA_AVX512F)
  69990. p.domain = DomainAVX
  69991. p.add(0, func(m *_Encoding, v []interface{}) {
  69992. m.evex(0b10, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  69993. m.emit(0x89)
  69994. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  69995. })
  69996. }
  69997. if p.len == 0 {
  69998. panic("invalid operands for VPEXPANDQ")
  69999. }
  70000. return p
  70001. }
  70002. // VPEXTRB performs "Extract Byte".
  70003. //
  70004. // Mnemonic : VPEXTRB
  70005. // Supported forms : (4 forms)
  70006. //
  70007. // * VPEXTRB imm8, xmm, r32 [AVX]
  70008. // * VPEXTRB imm8, xmm, m8 [AVX]
  70009. // * VPEXTRB imm8, xmm, r32 [AVX512BW]
  70010. // * VPEXTRB imm8, xmm, m8 [AVX512BW]
  70011. //
  70012. func (self *Program) VPEXTRB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  70013. p := self.alloc("VPEXTRB", 3, Operands { v0, v1, v2 })
  70014. // VPEXTRB imm8, xmm, r32
  70015. if isImm8(v0) && isXMM(v1) && isReg32(v2) {
  70016. self.require(ISA_AVX)
  70017. p.domain = DomainAVX
  70018. p.add(0, func(m *_Encoding, v []interface{}) {
  70019. m.emit(0xc4)
  70020. m.emit(0xe3 ^ (hcode(v[1]) << 7) ^ (hcode(v[2]) << 5))
  70021. m.emit(0x79)
  70022. m.emit(0x14)
  70023. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  70024. m.imm1(toImmAny(v[0]))
  70025. })
  70026. }
  70027. // VPEXTRB imm8, xmm, m8
  70028. if isImm8(v0) && isXMM(v1) && isM8(v2) {
  70029. self.require(ISA_AVX)
  70030. p.domain = DomainAVX
  70031. p.add(0, func(m *_Encoding, v []interface{}) {
  70032. m.vex3(0xc4, 0b11, 0x01, hcode(v[1]), addr(v[2]), 0)
  70033. m.emit(0x14)
  70034. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  70035. m.imm1(toImmAny(v[0]))
  70036. })
  70037. }
  70038. // VPEXTRB imm8, xmm, r32
  70039. if isImm8(v0) && isEVEXXMM(v1) && isReg32(v2) {
  70040. self.require(ISA_AVX512BW)
  70041. p.domain = DomainAVX
  70042. p.add(0, func(m *_Encoding, v []interface{}) {
  70043. m.emit(0x62)
  70044. m.emit(0xf3 ^ ((hcode(v[1]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[1]) << 4)))
  70045. m.emit(0x7d)
  70046. m.emit(0x08)
  70047. m.emit(0x14)
  70048. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  70049. m.imm1(toImmAny(v[0]))
  70050. })
  70051. }
  70052. // VPEXTRB imm8, xmm, m8
  70053. if isImm8(v0) && isEVEXXMM(v1) && isM8(v2) {
  70054. self.require(ISA_AVX512BW)
  70055. p.domain = DomainAVX
  70056. p.add(0, func(m *_Encoding, v []interface{}) {
  70057. m.evex(0b11, 0x05, 0b00, ehcode(v[1]), addr(v[2]), 0, 0, 0, 0)
  70058. m.emit(0x14)
  70059. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  70060. m.imm1(toImmAny(v[0]))
  70061. })
  70062. }
  70063. if p.len == 0 {
  70064. panic("invalid operands for VPEXTRB")
  70065. }
  70066. return p
  70067. }
  70068. // VPEXTRD performs "Extract Doubleword".
  70069. //
  70070. // Mnemonic : VPEXTRD
  70071. // Supported forms : (4 forms)
  70072. //
  70073. // * VPEXTRD imm8, xmm, r32 [AVX]
  70074. // * VPEXTRD imm8, xmm, m32 [AVX]
  70075. // * VPEXTRD imm8, xmm, r32 [AVX512DQ]
  70076. // * VPEXTRD imm8, xmm, m32 [AVX512DQ]
  70077. //
  70078. func (self *Program) VPEXTRD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  70079. p := self.alloc("VPEXTRD", 3, Operands { v0, v1, v2 })
  70080. // VPEXTRD imm8, xmm, r32
  70081. if isImm8(v0) && isXMM(v1) && isReg32(v2) {
  70082. self.require(ISA_AVX)
  70083. p.domain = DomainAVX
  70084. p.add(0, func(m *_Encoding, v []interface{}) {
  70085. m.emit(0xc4)
  70086. m.emit(0xe3 ^ (hcode(v[1]) << 7) ^ (hcode(v[2]) << 5))
  70087. m.emit(0x79)
  70088. m.emit(0x16)
  70089. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  70090. m.imm1(toImmAny(v[0]))
  70091. })
  70092. }
  70093. // VPEXTRD imm8, xmm, m32
  70094. if isImm8(v0) && isXMM(v1) && isM32(v2) {
  70095. self.require(ISA_AVX)
  70096. p.domain = DomainAVX
  70097. p.add(0, func(m *_Encoding, v []interface{}) {
  70098. m.vex3(0xc4, 0b11, 0x01, hcode(v[1]), addr(v[2]), 0)
  70099. m.emit(0x16)
  70100. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  70101. m.imm1(toImmAny(v[0]))
  70102. })
  70103. }
  70104. // VPEXTRD imm8, xmm, r32
  70105. if isImm8(v0) && isEVEXXMM(v1) && isReg32(v2) {
  70106. self.require(ISA_AVX512DQ)
  70107. p.domain = DomainAVX
  70108. p.add(0, func(m *_Encoding, v []interface{}) {
  70109. m.emit(0x62)
  70110. m.emit(0xf3 ^ ((hcode(v[1]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[1]) << 4)))
  70111. m.emit(0x7d)
  70112. m.emit(0x08)
  70113. m.emit(0x16)
  70114. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  70115. m.imm1(toImmAny(v[0]))
  70116. })
  70117. }
  70118. // VPEXTRD imm8, xmm, m32
  70119. if isImm8(v0) && isEVEXXMM(v1) && isM32(v2) {
  70120. self.require(ISA_AVX512DQ)
  70121. p.domain = DomainAVX
  70122. p.add(0, func(m *_Encoding, v []interface{}) {
  70123. m.evex(0b11, 0x05, 0b00, ehcode(v[1]), addr(v[2]), 0, 0, 0, 0)
  70124. m.emit(0x16)
  70125. m.mrsd(lcode(v[1]), addr(v[2]), 4)
  70126. m.imm1(toImmAny(v[0]))
  70127. })
  70128. }
  70129. if p.len == 0 {
  70130. panic("invalid operands for VPEXTRD")
  70131. }
  70132. return p
  70133. }
  70134. // VPEXTRQ performs "Extract Quadword".
  70135. //
  70136. // Mnemonic : VPEXTRQ
  70137. // Supported forms : (4 forms)
  70138. //
  70139. // * VPEXTRQ imm8, xmm, r64 [AVX]
  70140. // * VPEXTRQ imm8, xmm, m64 [AVX]
  70141. // * VPEXTRQ imm8, xmm, r64 [AVX512DQ]
  70142. // * VPEXTRQ imm8, xmm, m64 [AVX512DQ]
  70143. //
  70144. func (self *Program) VPEXTRQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  70145. p := self.alloc("VPEXTRQ", 3, Operands { v0, v1, v2 })
  70146. // VPEXTRQ imm8, xmm, r64
  70147. if isImm8(v0) && isXMM(v1) && isReg64(v2) {
  70148. self.require(ISA_AVX)
  70149. p.domain = DomainAVX
  70150. p.add(0, func(m *_Encoding, v []interface{}) {
  70151. m.emit(0xc4)
  70152. m.emit(0xe3 ^ (hcode(v[1]) << 7) ^ (hcode(v[2]) << 5))
  70153. m.emit(0xf9)
  70154. m.emit(0x16)
  70155. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  70156. m.imm1(toImmAny(v[0]))
  70157. })
  70158. }
  70159. // VPEXTRQ imm8, xmm, m64
  70160. if isImm8(v0) && isXMM(v1) && isM64(v2) {
  70161. self.require(ISA_AVX)
  70162. p.domain = DomainAVX
  70163. p.add(0, func(m *_Encoding, v []interface{}) {
  70164. m.vex3(0xc4, 0b11, 0x81, hcode(v[1]), addr(v[2]), 0)
  70165. m.emit(0x16)
  70166. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  70167. m.imm1(toImmAny(v[0]))
  70168. })
  70169. }
  70170. // VPEXTRQ imm8, xmm, r64
  70171. if isImm8(v0) && isEVEXXMM(v1) && isReg64(v2) {
  70172. self.require(ISA_AVX512DQ)
  70173. p.domain = DomainAVX
  70174. p.add(0, func(m *_Encoding, v []interface{}) {
  70175. m.emit(0x62)
  70176. m.emit(0xf3 ^ ((hcode(v[1]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[1]) << 4)))
  70177. m.emit(0xfd)
  70178. m.emit(0x08)
  70179. m.emit(0x16)
  70180. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  70181. m.imm1(toImmAny(v[0]))
  70182. })
  70183. }
  70184. // VPEXTRQ imm8, xmm, m64
  70185. if isImm8(v0) && isEVEXXMM(v1) && isM64(v2) {
  70186. self.require(ISA_AVX512DQ)
  70187. p.domain = DomainAVX
  70188. p.add(0, func(m *_Encoding, v []interface{}) {
  70189. m.evex(0b11, 0x85, 0b00, ehcode(v[1]), addr(v[2]), 0, 0, 0, 0)
  70190. m.emit(0x16)
  70191. m.mrsd(lcode(v[1]), addr(v[2]), 8)
  70192. m.imm1(toImmAny(v[0]))
  70193. })
  70194. }
  70195. if p.len == 0 {
  70196. panic("invalid operands for VPEXTRQ")
  70197. }
  70198. return p
  70199. }
  70200. // VPEXTRW performs "Extract Word".
  70201. //
  70202. // Mnemonic : VPEXTRW
  70203. // Supported forms : (4 forms)
  70204. //
  70205. // * VPEXTRW imm8, xmm, r32 [AVX]
  70206. // * VPEXTRW imm8, xmm, m16 [AVX]
  70207. // * VPEXTRW imm8, xmm, r32 [AVX512BW]
  70208. // * VPEXTRW imm8, xmm, m16 [AVX512BW]
  70209. //
  70210. func (self *Program) VPEXTRW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  70211. p := self.alloc("VPEXTRW", 3, Operands { v0, v1, v2 })
  70212. // VPEXTRW imm8, xmm, r32
  70213. if isImm8(v0) && isXMM(v1) && isReg32(v2) {
  70214. self.require(ISA_AVX)
  70215. p.domain = DomainAVX
  70216. p.add(0, func(m *_Encoding, v []interface{}) {
  70217. m.vex2(1, hcode(v[2]), v[1], 0)
  70218. m.emit(0xc5)
  70219. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  70220. m.imm1(toImmAny(v[0]))
  70221. })
  70222. p.add(0, func(m *_Encoding, v []interface{}) {
  70223. m.emit(0xc4)
  70224. m.emit(0xe3 ^ (hcode(v[1]) << 7) ^ (hcode(v[2]) << 5))
  70225. m.emit(0x79)
  70226. m.emit(0x15)
  70227. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  70228. m.imm1(toImmAny(v[0]))
  70229. })
  70230. }
  70231. // VPEXTRW imm8, xmm, m16
  70232. if isImm8(v0) && isXMM(v1) && isM16(v2) {
  70233. self.require(ISA_AVX)
  70234. p.domain = DomainAVX
  70235. p.add(0, func(m *_Encoding, v []interface{}) {
  70236. m.vex3(0xc4, 0b11, 0x01, hcode(v[1]), addr(v[2]), 0)
  70237. m.emit(0x15)
  70238. m.mrsd(lcode(v[1]), addr(v[2]), 1)
  70239. m.imm1(toImmAny(v[0]))
  70240. })
  70241. }
  70242. // VPEXTRW imm8, xmm, r32
  70243. if isImm8(v0) && isEVEXXMM(v1) && isReg32(v2) {
  70244. self.require(ISA_AVX512BW)
  70245. p.domain = DomainAVX
  70246. p.add(0, func(m *_Encoding, v []interface{}) {
  70247. m.emit(0x62)
  70248. m.emit(0xf3 ^ ((hcode(v[1]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[1]) << 4)))
  70249. m.emit(0x7d)
  70250. m.emit(0x08)
  70251. m.emit(0x15)
  70252. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[2]))
  70253. m.imm1(toImmAny(v[0]))
  70254. })
  70255. p.add(0, func(m *_Encoding, v []interface{}) {
  70256. m.emit(0x62)
  70257. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  70258. m.emit(0x7d)
  70259. m.emit(0x08)
  70260. m.emit(0xc5)
  70261. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  70262. m.imm1(toImmAny(v[0]))
  70263. })
  70264. }
  70265. // VPEXTRW imm8, xmm, m16
  70266. if isImm8(v0) && isEVEXXMM(v1) && isM16(v2) {
  70267. self.require(ISA_AVX512BW)
  70268. p.domain = DomainAVX
  70269. p.add(0, func(m *_Encoding, v []interface{}) {
  70270. m.evex(0b11, 0x05, 0b00, ehcode(v[1]), addr(v[2]), 0, 0, 0, 0)
  70271. m.emit(0x15)
  70272. m.mrsd(lcode(v[1]), addr(v[2]), 2)
  70273. m.imm1(toImmAny(v[0]))
  70274. })
  70275. }
  70276. if p.len == 0 {
  70277. panic("invalid operands for VPEXTRW")
  70278. }
  70279. return p
  70280. }
  70281. // VPGATHERDD performs "Gather Packed Doubleword Values Using Signed Doubleword Indices".
  70282. //
  70283. // Mnemonic : VPGATHERDD
  70284. // Supported forms : (5 forms)
  70285. //
  70286. // * VPGATHERDD xmm, vm32x, xmm [AVX2]
  70287. // * VPGATHERDD ymm, vm32y, ymm [AVX2]
  70288. // * VPGATHERDD vm32z, zmm{k} [AVX512F]
  70289. // * VPGATHERDD vm32x, xmm{k} [AVX512F,AVX512VL]
  70290. // * VPGATHERDD vm32y, ymm{k} [AVX512F,AVX512VL]
  70291. //
  70292. func (self *Program) VPGATHERDD(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  70293. var p *Instruction
  70294. switch len(vv) {
  70295. case 0 : p = self.alloc("VPGATHERDD", 2, Operands { v0, v1 })
  70296. case 1 : p = self.alloc("VPGATHERDD", 3, Operands { v0, v1, vv[0] })
  70297. default : panic("instruction VPGATHERDD takes 2 or 3 operands")
  70298. }
  70299. // VPGATHERDD xmm, vm32x, xmm
  70300. if len(vv) == 1 && isXMM(v0) && isVMX(v1) && isXMM(vv[0]) {
  70301. self.require(ISA_AVX2)
  70302. p.domain = DomainAVX
  70303. p.add(0, func(m *_Encoding, v []interface{}) {
  70304. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  70305. m.emit(0x90)
  70306. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  70307. })
  70308. }
  70309. // VPGATHERDD ymm, vm32y, ymm
  70310. if len(vv) == 1 && isYMM(v0) && isVMY(v1) && isYMM(vv[0]) {
  70311. self.require(ISA_AVX2)
  70312. p.domain = DomainAVX
  70313. p.add(0, func(m *_Encoding, v []interface{}) {
  70314. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  70315. m.emit(0x90)
  70316. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  70317. })
  70318. }
  70319. // VPGATHERDD vm32z, zmm{k}
  70320. if len(vv) == 0 && isVMZ(v0) && isZMMk(v1) {
  70321. self.require(ISA_AVX512F)
  70322. p.domain = DomainAVX
  70323. p.add(0, func(m *_Encoding, v []interface{}) {
  70324. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  70325. m.emit(0x90)
  70326. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  70327. })
  70328. }
  70329. // VPGATHERDD vm32x, xmm{k}
  70330. if len(vv) == 0 && isEVEXVMX(v0) && isXMMk(v1) {
  70331. self.require(ISA_AVX512VL | ISA_AVX512F)
  70332. p.domain = DomainAVX
  70333. p.add(0, func(m *_Encoding, v []interface{}) {
  70334. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  70335. m.emit(0x90)
  70336. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  70337. })
  70338. }
  70339. // VPGATHERDD vm32y, ymm{k}
  70340. if len(vv) == 0 && isEVEXVMY(v0) && isYMMk(v1) {
  70341. self.require(ISA_AVX512VL | ISA_AVX512F)
  70342. p.domain = DomainAVX
  70343. p.add(0, func(m *_Encoding, v []interface{}) {
  70344. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  70345. m.emit(0x90)
  70346. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  70347. })
  70348. }
  70349. if p.len == 0 {
  70350. panic("invalid operands for VPGATHERDD")
  70351. }
  70352. return p
  70353. }
  70354. // VPGATHERDQ performs "Gather Packed Quadword Values Using Signed Doubleword Indices".
  70355. //
  70356. // Mnemonic : VPGATHERDQ
  70357. // Supported forms : (5 forms)
  70358. //
  70359. // * VPGATHERDQ xmm, vm32x, xmm [AVX2]
  70360. // * VPGATHERDQ ymm, vm32x, ymm [AVX2]
  70361. // * VPGATHERDQ vm32y, zmm{k} [AVX512F]
  70362. // * VPGATHERDQ vm32x, xmm{k} [AVX512F,AVX512VL]
  70363. // * VPGATHERDQ vm32x, ymm{k} [AVX512F,AVX512VL]
  70364. //
  70365. func (self *Program) VPGATHERDQ(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  70366. var p *Instruction
  70367. switch len(vv) {
  70368. case 0 : p = self.alloc("VPGATHERDQ", 2, Operands { v0, v1 })
  70369. case 1 : p = self.alloc("VPGATHERDQ", 3, Operands { v0, v1, vv[0] })
  70370. default : panic("instruction VPGATHERDQ takes 2 or 3 operands")
  70371. }
  70372. // VPGATHERDQ xmm, vm32x, xmm
  70373. if len(vv) == 1 && isXMM(v0) && isVMX(v1) && isXMM(vv[0]) {
  70374. self.require(ISA_AVX2)
  70375. p.domain = DomainAVX
  70376. p.add(0, func(m *_Encoding, v []interface{}) {
  70377. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  70378. m.emit(0x90)
  70379. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  70380. })
  70381. }
  70382. // VPGATHERDQ ymm, vm32x, ymm
  70383. if len(vv) == 1 && isYMM(v0) && isVMX(v1) && isYMM(vv[0]) {
  70384. self.require(ISA_AVX2)
  70385. p.domain = DomainAVX
  70386. p.add(0, func(m *_Encoding, v []interface{}) {
  70387. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  70388. m.emit(0x90)
  70389. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  70390. })
  70391. }
  70392. // VPGATHERDQ vm32y, zmm{k}
  70393. if len(vv) == 0 && isEVEXVMY(v0) && isZMMk(v1) {
  70394. self.require(ISA_AVX512F)
  70395. p.domain = DomainAVX
  70396. p.add(0, func(m *_Encoding, v []interface{}) {
  70397. m.evex(0b10, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  70398. m.emit(0x90)
  70399. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  70400. })
  70401. }
  70402. // VPGATHERDQ vm32x, xmm{k}
  70403. if len(vv) == 0 && isEVEXVMX(v0) && isXMMk(v1) {
  70404. self.require(ISA_AVX512VL | ISA_AVX512F)
  70405. p.domain = DomainAVX
  70406. p.add(0, func(m *_Encoding, v []interface{}) {
  70407. m.evex(0b10, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  70408. m.emit(0x90)
  70409. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  70410. })
  70411. }
  70412. // VPGATHERDQ vm32x, ymm{k}
  70413. if len(vv) == 0 && isEVEXVMX(v0) && isYMMk(v1) {
  70414. self.require(ISA_AVX512VL | ISA_AVX512F)
  70415. p.domain = DomainAVX
  70416. p.add(0, func(m *_Encoding, v []interface{}) {
  70417. m.evex(0b10, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  70418. m.emit(0x90)
  70419. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  70420. })
  70421. }
  70422. if p.len == 0 {
  70423. panic("invalid operands for VPGATHERDQ")
  70424. }
  70425. return p
  70426. }
  70427. // VPGATHERQD performs "Gather Packed Doubleword Values Using Signed Quadword Indices".
  70428. //
  70429. // Mnemonic : VPGATHERQD
  70430. // Supported forms : (5 forms)
  70431. //
  70432. // * VPGATHERQD xmm, vm64x, xmm [AVX2]
  70433. // * VPGATHERQD xmm, vm64y, xmm [AVX2]
  70434. // * VPGATHERQD vm64z, ymm{k} [AVX512F]
  70435. // * VPGATHERQD vm64x, xmm{k} [AVX512F,AVX512VL]
  70436. // * VPGATHERQD vm64y, xmm{k} [AVX512F,AVX512VL]
  70437. //
  70438. func (self *Program) VPGATHERQD(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  70439. var p *Instruction
  70440. switch len(vv) {
  70441. case 0 : p = self.alloc("VPGATHERQD", 2, Operands { v0, v1 })
  70442. case 1 : p = self.alloc("VPGATHERQD", 3, Operands { v0, v1, vv[0] })
  70443. default : panic("instruction VPGATHERQD takes 2 or 3 operands")
  70444. }
  70445. // VPGATHERQD xmm, vm64x, xmm
  70446. if len(vv) == 1 && isXMM(v0) && isVMX(v1) && isXMM(vv[0]) {
  70447. self.require(ISA_AVX2)
  70448. p.domain = DomainAVX
  70449. p.add(0, func(m *_Encoding, v []interface{}) {
  70450. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  70451. m.emit(0x91)
  70452. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  70453. })
  70454. }
  70455. // VPGATHERQD xmm, vm64y, xmm
  70456. if len(vv) == 1 && isXMM(v0) && isVMY(v1) && isXMM(vv[0]) {
  70457. self.require(ISA_AVX2)
  70458. p.domain = DomainAVX
  70459. p.add(0, func(m *_Encoding, v []interface{}) {
  70460. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  70461. m.emit(0x91)
  70462. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  70463. })
  70464. }
  70465. // VPGATHERQD vm64z, ymm{k}
  70466. if len(vv) == 0 && isVMZ(v0) && isYMMk(v1) {
  70467. self.require(ISA_AVX512F)
  70468. p.domain = DomainAVX
  70469. p.add(0, func(m *_Encoding, v []interface{}) {
  70470. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  70471. m.emit(0x91)
  70472. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  70473. })
  70474. }
  70475. // VPGATHERQD vm64x, xmm{k}
  70476. if len(vv) == 0 && isEVEXVMX(v0) && isXMMk(v1) {
  70477. self.require(ISA_AVX512VL | ISA_AVX512F)
  70478. p.domain = DomainAVX
  70479. p.add(0, func(m *_Encoding, v []interface{}) {
  70480. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  70481. m.emit(0x91)
  70482. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  70483. })
  70484. }
  70485. // VPGATHERQD vm64y, xmm{k}
  70486. if len(vv) == 0 && isEVEXVMY(v0) && isXMMk(v1) {
  70487. self.require(ISA_AVX512VL | ISA_AVX512F)
  70488. p.domain = DomainAVX
  70489. p.add(0, func(m *_Encoding, v []interface{}) {
  70490. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  70491. m.emit(0x91)
  70492. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  70493. })
  70494. }
  70495. if p.len == 0 {
  70496. panic("invalid operands for VPGATHERQD")
  70497. }
  70498. return p
  70499. }
  70500. // VPGATHERQQ performs "Gather Packed Quadword Values Using Signed Quadword Indices".
  70501. //
  70502. // Mnemonic : VPGATHERQQ
  70503. // Supported forms : (5 forms)
  70504. //
  70505. // * VPGATHERQQ xmm, vm64x, xmm [AVX2]
  70506. // * VPGATHERQQ ymm, vm64y, ymm [AVX2]
  70507. // * VPGATHERQQ vm64z, zmm{k} [AVX512F]
  70508. // * VPGATHERQQ vm64x, xmm{k} [AVX512F,AVX512VL]
  70509. // * VPGATHERQQ vm64y, ymm{k} [AVX512F,AVX512VL]
  70510. //
  70511. func (self *Program) VPGATHERQQ(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  70512. var p *Instruction
  70513. switch len(vv) {
  70514. case 0 : p = self.alloc("VPGATHERQQ", 2, Operands { v0, v1 })
  70515. case 1 : p = self.alloc("VPGATHERQQ", 3, Operands { v0, v1, vv[0] })
  70516. default : panic("instruction VPGATHERQQ takes 2 or 3 operands")
  70517. }
  70518. // VPGATHERQQ xmm, vm64x, xmm
  70519. if len(vv) == 1 && isXMM(v0) && isVMX(v1) && isXMM(vv[0]) {
  70520. self.require(ISA_AVX2)
  70521. p.domain = DomainAVX
  70522. p.add(0, func(m *_Encoding, v []interface{}) {
  70523. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  70524. m.emit(0x91)
  70525. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  70526. })
  70527. }
  70528. // VPGATHERQQ ymm, vm64y, ymm
  70529. if len(vv) == 1 && isYMM(v0) && isVMY(v1) && isYMM(vv[0]) {
  70530. self.require(ISA_AVX2)
  70531. p.domain = DomainAVX
  70532. p.add(0, func(m *_Encoding, v []interface{}) {
  70533. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  70534. m.emit(0x91)
  70535. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  70536. })
  70537. }
  70538. // VPGATHERQQ vm64z, zmm{k}
  70539. if len(vv) == 0 && isVMZ(v0) && isZMMk(v1) {
  70540. self.require(ISA_AVX512F)
  70541. p.domain = DomainAVX
  70542. p.add(0, func(m *_Encoding, v []interface{}) {
  70543. m.evex(0b10, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  70544. m.emit(0x91)
  70545. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  70546. })
  70547. }
  70548. // VPGATHERQQ vm64x, xmm{k}
  70549. if len(vv) == 0 && isEVEXVMX(v0) && isXMMk(v1) {
  70550. self.require(ISA_AVX512VL | ISA_AVX512F)
  70551. p.domain = DomainAVX
  70552. p.add(0, func(m *_Encoding, v []interface{}) {
  70553. m.evex(0b10, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  70554. m.emit(0x91)
  70555. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  70556. })
  70557. }
  70558. // VPGATHERQQ vm64y, ymm{k}
  70559. if len(vv) == 0 && isEVEXVMY(v0) && isYMMk(v1) {
  70560. self.require(ISA_AVX512VL | ISA_AVX512F)
  70561. p.domain = DomainAVX
  70562. p.add(0, func(m *_Encoding, v []interface{}) {
  70563. m.evex(0b10, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), 0, 0)
  70564. m.emit(0x91)
  70565. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  70566. })
  70567. }
  70568. if p.len == 0 {
  70569. panic("invalid operands for VPGATHERQQ")
  70570. }
  70571. return p
  70572. }
  70573. // VPHADDBD performs "Packed Horizontal Add Signed Byte to Signed Doubleword".
  70574. //
  70575. // Mnemonic : VPHADDBD
  70576. // Supported forms : (2 forms)
  70577. //
  70578. // * VPHADDBD xmm, xmm [XOP]
  70579. // * VPHADDBD m128, xmm [XOP]
  70580. //
  70581. func (self *Program) VPHADDBD(v0 interface{}, v1 interface{}) *Instruction {
  70582. p := self.alloc("VPHADDBD", 2, Operands { v0, v1 })
  70583. // VPHADDBD xmm, xmm
  70584. if isXMM(v0) && isXMM(v1) {
  70585. self.require(ISA_XOP)
  70586. p.domain = DomainAMDSpecific
  70587. p.add(0, func(m *_Encoding, v []interface{}) {
  70588. m.emit(0x8f)
  70589. m.emit(0xe9 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  70590. m.emit(0x78)
  70591. m.emit(0xc2)
  70592. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  70593. })
  70594. }
  70595. // VPHADDBD m128, xmm
  70596. if isM128(v0) && isXMM(v1) {
  70597. self.require(ISA_XOP)
  70598. p.domain = DomainAMDSpecific
  70599. p.add(0, func(m *_Encoding, v []interface{}) {
  70600. m.vex3(0x8f, 0b1001, 0x00, hcode(v[1]), addr(v[0]), 0)
  70601. m.emit(0xc2)
  70602. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  70603. })
  70604. }
  70605. if p.len == 0 {
  70606. panic("invalid operands for VPHADDBD")
  70607. }
  70608. return p
  70609. }
  70610. // VPHADDBQ performs "Packed Horizontal Add Signed Byte to Signed Quadword".
  70611. //
  70612. // Mnemonic : VPHADDBQ
  70613. // Supported forms : (2 forms)
  70614. //
  70615. // * VPHADDBQ xmm, xmm [XOP]
  70616. // * VPHADDBQ m128, xmm [XOP]
  70617. //
  70618. func (self *Program) VPHADDBQ(v0 interface{}, v1 interface{}) *Instruction {
  70619. p := self.alloc("VPHADDBQ", 2, Operands { v0, v1 })
  70620. // VPHADDBQ xmm, xmm
  70621. if isXMM(v0) && isXMM(v1) {
  70622. self.require(ISA_XOP)
  70623. p.domain = DomainAMDSpecific
  70624. p.add(0, func(m *_Encoding, v []interface{}) {
  70625. m.emit(0x8f)
  70626. m.emit(0xe9 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  70627. m.emit(0x78)
  70628. m.emit(0xc3)
  70629. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  70630. })
  70631. }
  70632. // VPHADDBQ m128, xmm
  70633. if isM128(v0) && isXMM(v1) {
  70634. self.require(ISA_XOP)
  70635. p.domain = DomainAMDSpecific
  70636. p.add(0, func(m *_Encoding, v []interface{}) {
  70637. m.vex3(0x8f, 0b1001, 0x00, hcode(v[1]), addr(v[0]), 0)
  70638. m.emit(0xc3)
  70639. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  70640. })
  70641. }
  70642. if p.len == 0 {
  70643. panic("invalid operands for VPHADDBQ")
  70644. }
  70645. return p
  70646. }
  70647. // VPHADDBW performs "Packed Horizontal Add Signed Byte to Signed Word".
  70648. //
  70649. // Mnemonic : VPHADDBW
  70650. // Supported forms : (2 forms)
  70651. //
  70652. // * VPHADDBW xmm, xmm [XOP]
  70653. // * VPHADDBW m128, xmm [XOP]
  70654. //
  70655. func (self *Program) VPHADDBW(v0 interface{}, v1 interface{}) *Instruction {
  70656. p := self.alloc("VPHADDBW", 2, Operands { v0, v1 })
  70657. // VPHADDBW xmm, xmm
  70658. if isXMM(v0) && isXMM(v1) {
  70659. self.require(ISA_XOP)
  70660. p.domain = DomainAMDSpecific
  70661. p.add(0, func(m *_Encoding, v []interface{}) {
  70662. m.emit(0x8f)
  70663. m.emit(0xe9 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  70664. m.emit(0x78)
  70665. m.emit(0xc1)
  70666. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  70667. })
  70668. }
  70669. // VPHADDBW m128, xmm
  70670. if isM128(v0) && isXMM(v1) {
  70671. self.require(ISA_XOP)
  70672. p.domain = DomainAMDSpecific
  70673. p.add(0, func(m *_Encoding, v []interface{}) {
  70674. m.vex3(0x8f, 0b1001, 0x00, hcode(v[1]), addr(v[0]), 0)
  70675. m.emit(0xc1)
  70676. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  70677. })
  70678. }
  70679. if p.len == 0 {
  70680. panic("invalid operands for VPHADDBW")
  70681. }
  70682. return p
  70683. }
  70684. // VPHADDD performs "Packed Horizontal Add Doubleword Integer".
  70685. //
  70686. // Mnemonic : VPHADDD
  70687. // Supported forms : (4 forms)
  70688. //
  70689. // * VPHADDD xmm, xmm, xmm [AVX]
  70690. // * VPHADDD m128, xmm, xmm [AVX]
  70691. // * VPHADDD ymm, ymm, ymm [AVX2]
  70692. // * VPHADDD m256, ymm, ymm [AVX2]
  70693. //
  70694. func (self *Program) VPHADDD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  70695. p := self.alloc("VPHADDD", 3, Operands { v0, v1, v2 })
  70696. // VPHADDD xmm, xmm, xmm
  70697. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  70698. self.require(ISA_AVX)
  70699. p.domain = DomainAVX
  70700. p.add(0, func(m *_Encoding, v []interface{}) {
  70701. m.emit(0xc4)
  70702. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  70703. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  70704. m.emit(0x02)
  70705. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  70706. })
  70707. }
  70708. // VPHADDD m128, xmm, xmm
  70709. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  70710. self.require(ISA_AVX)
  70711. p.domain = DomainAVX
  70712. p.add(0, func(m *_Encoding, v []interface{}) {
  70713. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  70714. m.emit(0x02)
  70715. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  70716. })
  70717. }
  70718. // VPHADDD ymm, ymm, ymm
  70719. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  70720. self.require(ISA_AVX2)
  70721. p.domain = DomainAVX
  70722. p.add(0, func(m *_Encoding, v []interface{}) {
  70723. m.emit(0xc4)
  70724. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  70725. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  70726. m.emit(0x02)
  70727. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  70728. })
  70729. }
  70730. // VPHADDD m256, ymm, ymm
  70731. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  70732. self.require(ISA_AVX2)
  70733. p.domain = DomainAVX
  70734. p.add(0, func(m *_Encoding, v []interface{}) {
  70735. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  70736. m.emit(0x02)
  70737. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  70738. })
  70739. }
  70740. if p.len == 0 {
  70741. panic("invalid operands for VPHADDD")
  70742. }
  70743. return p
  70744. }
  70745. // VPHADDDQ performs "Packed Horizontal Add Signed Doubleword to Signed Quadword".
  70746. //
  70747. // Mnemonic : VPHADDDQ
  70748. // Supported forms : (2 forms)
  70749. //
  70750. // * VPHADDDQ xmm, xmm [XOP]
  70751. // * VPHADDDQ m128, xmm [XOP]
  70752. //
  70753. func (self *Program) VPHADDDQ(v0 interface{}, v1 interface{}) *Instruction {
  70754. p := self.alloc("VPHADDDQ", 2, Operands { v0, v1 })
  70755. // VPHADDDQ xmm, xmm
  70756. if isXMM(v0) && isXMM(v1) {
  70757. self.require(ISA_XOP)
  70758. p.domain = DomainAMDSpecific
  70759. p.add(0, func(m *_Encoding, v []interface{}) {
  70760. m.emit(0x8f)
  70761. m.emit(0xe9 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  70762. m.emit(0x78)
  70763. m.emit(0xcb)
  70764. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  70765. })
  70766. }
  70767. // VPHADDDQ m128, xmm
  70768. if isM128(v0) && isXMM(v1) {
  70769. self.require(ISA_XOP)
  70770. p.domain = DomainAMDSpecific
  70771. p.add(0, func(m *_Encoding, v []interface{}) {
  70772. m.vex3(0x8f, 0b1001, 0x00, hcode(v[1]), addr(v[0]), 0)
  70773. m.emit(0xcb)
  70774. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  70775. })
  70776. }
  70777. if p.len == 0 {
  70778. panic("invalid operands for VPHADDDQ")
  70779. }
  70780. return p
  70781. }
  70782. // VPHADDSW performs "Packed Horizontal Add Signed Word Integers with Signed Saturation".
  70783. //
  70784. // Mnemonic : VPHADDSW
  70785. // Supported forms : (4 forms)
  70786. //
  70787. // * VPHADDSW xmm, xmm, xmm [AVX]
  70788. // * VPHADDSW m128, xmm, xmm [AVX]
  70789. // * VPHADDSW ymm, ymm, ymm [AVX2]
  70790. // * VPHADDSW m256, ymm, ymm [AVX2]
  70791. //
  70792. func (self *Program) VPHADDSW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  70793. p := self.alloc("VPHADDSW", 3, Operands { v0, v1, v2 })
  70794. // VPHADDSW xmm, xmm, xmm
  70795. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  70796. self.require(ISA_AVX)
  70797. p.domain = DomainAVX
  70798. p.add(0, func(m *_Encoding, v []interface{}) {
  70799. m.emit(0xc4)
  70800. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  70801. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  70802. m.emit(0x03)
  70803. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  70804. })
  70805. }
  70806. // VPHADDSW m128, xmm, xmm
  70807. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  70808. self.require(ISA_AVX)
  70809. p.domain = DomainAVX
  70810. p.add(0, func(m *_Encoding, v []interface{}) {
  70811. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  70812. m.emit(0x03)
  70813. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  70814. })
  70815. }
  70816. // VPHADDSW ymm, ymm, ymm
  70817. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  70818. self.require(ISA_AVX2)
  70819. p.domain = DomainAVX
  70820. p.add(0, func(m *_Encoding, v []interface{}) {
  70821. m.emit(0xc4)
  70822. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  70823. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  70824. m.emit(0x03)
  70825. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  70826. })
  70827. }
  70828. // VPHADDSW m256, ymm, ymm
  70829. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  70830. self.require(ISA_AVX2)
  70831. p.domain = DomainAVX
  70832. p.add(0, func(m *_Encoding, v []interface{}) {
  70833. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  70834. m.emit(0x03)
  70835. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  70836. })
  70837. }
  70838. if p.len == 0 {
  70839. panic("invalid operands for VPHADDSW")
  70840. }
  70841. return p
  70842. }
  70843. // VPHADDUBD performs "Packed Horizontal Add Unsigned Byte to Doubleword".
  70844. //
  70845. // Mnemonic : VPHADDUBD
  70846. // Supported forms : (2 forms)
  70847. //
  70848. // * VPHADDUBD xmm, xmm [XOP]
  70849. // * VPHADDUBD m128, xmm [XOP]
  70850. //
  70851. func (self *Program) VPHADDUBD(v0 interface{}, v1 interface{}) *Instruction {
  70852. p := self.alloc("VPHADDUBD", 2, Operands { v0, v1 })
  70853. // VPHADDUBD xmm, xmm
  70854. if isXMM(v0) && isXMM(v1) {
  70855. self.require(ISA_XOP)
  70856. p.domain = DomainAMDSpecific
  70857. p.add(0, func(m *_Encoding, v []interface{}) {
  70858. m.emit(0x8f)
  70859. m.emit(0xe9 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  70860. m.emit(0x78)
  70861. m.emit(0xd2)
  70862. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  70863. })
  70864. }
  70865. // VPHADDUBD m128, xmm
  70866. if isM128(v0) && isXMM(v1) {
  70867. self.require(ISA_XOP)
  70868. p.domain = DomainAMDSpecific
  70869. p.add(0, func(m *_Encoding, v []interface{}) {
  70870. m.vex3(0x8f, 0b1001, 0x00, hcode(v[1]), addr(v[0]), 0)
  70871. m.emit(0xd2)
  70872. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  70873. })
  70874. }
  70875. if p.len == 0 {
  70876. panic("invalid operands for VPHADDUBD")
  70877. }
  70878. return p
  70879. }
  70880. // VPHADDUBQ performs "Packed Horizontal Add Unsigned Byte to Quadword".
  70881. //
  70882. // Mnemonic : VPHADDUBQ
  70883. // Supported forms : (2 forms)
  70884. //
  70885. // * VPHADDUBQ xmm, xmm [XOP]
  70886. // * VPHADDUBQ m128, xmm [XOP]
  70887. //
  70888. func (self *Program) VPHADDUBQ(v0 interface{}, v1 interface{}) *Instruction {
  70889. p := self.alloc("VPHADDUBQ", 2, Operands { v0, v1 })
  70890. // VPHADDUBQ xmm, xmm
  70891. if isXMM(v0) && isXMM(v1) {
  70892. self.require(ISA_XOP)
  70893. p.domain = DomainAMDSpecific
  70894. p.add(0, func(m *_Encoding, v []interface{}) {
  70895. m.emit(0x8f)
  70896. m.emit(0xe9 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  70897. m.emit(0x78)
  70898. m.emit(0xd3)
  70899. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  70900. })
  70901. }
  70902. // VPHADDUBQ m128, xmm
  70903. if isM128(v0) && isXMM(v1) {
  70904. self.require(ISA_XOP)
  70905. p.domain = DomainAMDSpecific
  70906. p.add(0, func(m *_Encoding, v []interface{}) {
  70907. m.vex3(0x8f, 0b1001, 0x00, hcode(v[1]), addr(v[0]), 0)
  70908. m.emit(0xd3)
  70909. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  70910. })
  70911. }
  70912. if p.len == 0 {
  70913. panic("invalid operands for VPHADDUBQ")
  70914. }
  70915. return p
  70916. }
  70917. // VPHADDUBW performs "Packed Horizontal Add Unsigned Byte to Word".
  70918. //
  70919. // Mnemonic : VPHADDUBW
  70920. // Supported forms : (2 forms)
  70921. //
  70922. // * VPHADDUBW xmm, xmm [XOP]
  70923. // * VPHADDUBW m128, xmm [XOP]
  70924. //
  70925. func (self *Program) VPHADDUBW(v0 interface{}, v1 interface{}) *Instruction {
  70926. p := self.alloc("VPHADDUBW", 2, Operands { v0, v1 })
  70927. // VPHADDUBW xmm, xmm
  70928. if isXMM(v0) && isXMM(v1) {
  70929. self.require(ISA_XOP)
  70930. p.domain = DomainAMDSpecific
  70931. p.add(0, func(m *_Encoding, v []interface{}) {
  70932. m.emit(0x8f)
  70933. m.emit(0xe9 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  70934. m.emit(0x78)
  70935. m.emit(0xd1)
  70936. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  70937. })
  70938. }
  70939. // VPHADDUBW m128, xmm
  70940. if isM128(v0) && isXMM(v1) {
  70941. self.require(ISA_XOP)
  70942. p.domain = DomainAMDSpecific
  70943. p.add(0, func(m *_Encoding, v []interface{}) {
  70944. m.vex3(0x8f, 0b1001, 0x00, hcode(v[1]), addr(v[0]), 0)
  70945. m.emit(0xd1)
  70946. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  70947. })
  70948. }
  70949. if p.len == 0 {
  70950. panic("invalid operands for VPHADDUBW")
  70951. }
  70952. return p
  70953. }
  70954. // VPHADDUDQ performs "Packed Horizontal Add Unsigned Doubleword to Quadword".
  70955. //
  70956. // Mnemonic : VPHADDUDQ
  70957. // Supported forms : (2 forms)
  70958. //
  70959. // * VPHADDUDQ xmm, xmm [XOP]
  70960. // * VPHADDUDQ m128, xmm [XOP]
  70961. //
  70962. func (self *Program) VPHADDUDQ(v0 interface{}, v1 interface{}) *Instruction {
  70963. p := self.alloc("VPHADDUDQ", 2, Operands { v0, v1 })
  70964. // VPHADDUDQ xmm, xmm
  70965. if isXMM(v0) && isXMM(v1) {
  70966. self.require(ISA_XOP)
  70967. p.domain = DomainAMDSpecific
  70968. p.add(0, func(m *_Encoding, v []interface{}) {
  70969. m.emit(0x8f)
  70970. m.emit(0xe9 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  70971. m.emit(0x78)
  70972. m.emit(0xdb)
  70973. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  70974. })
  70975. }
  70976. // VPHADDUDQ m128, xmm
  70977. if isM128(v0) && isXMM(v1) {
  70978. self.require(ISA_XOP)
  70979. p.domain = DomainAMDSpecific
  70980. p.add(0, func(m *_Encoding, v []interface{}) {
  70981. m.vex3(0x8f, 0b1001, 0x00, hcode(v[1]), addr(v[0]), 0)
  70982. m.emit(0xdb)
  70983. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  70984. })
  70985. }
  70986. if p.len == 0 {
  70987. panic("invalid operands for VPHADDUDQ")
  70988. }
  70989. return p
  70990. }
  70991. // VPHADDUWD performs "Packed Horizontal Add Unsigned Word to Doubleword".
  70992. //
  70993. // Mnemonic : VPHADDUWD
  70994. // Supported forms : (2 forms)
  70995. //
  70996. // * VPHADDUWD xmm, xmm [XOP]
  70997. // * VPHADDUWD m128, xmm [XOP]
  70998. //
  70999. func (self *Program) VPHADDUWD(v0 interface{}, v1 interface{}) *Instruction {
  71000. p := self.alloc("VPHADDUWD", 2, Operands { v0, v1 })
  71001. // VPHADDUWD xmm, xmm
  71002. if isXMM(v0) && isXMM(v1) {
  71003. self.require(ISA_XOP)
  71004. p.domain = DomainAMDSpecific
  71005. p.add(0, func(m *_Encoding, v []interface{}) {
  71006. m.emit(0x8f)
  71007. m.emit(0xe9 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  71008. m.emit(0x78)
  71009. m.emit(0xd6)
  71010. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  71011. })
  71012. }
  71013. // VPHADDUWD m128, xmm
  71014. if isM128(v0) && isXMM(v1) {
  71015. self.require(ISA_XOP)
  71016. p.domain = DomainAMDSpecific
  71017. p.add(0, func(m *_Encoding, v []interface{}) {
  71018. m.vex3(0x8f, 0b1001, 0x00, hcode(v[1]), addr(v[0]), 0)
  71019. m.emit(0xd6)
  71020. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  71021. })
  71022. }
  71023. if p.len == 0 {
  71024. panic("invalid operands for VPHADDUWD")
  71025. }
  71026. return p
  71027. }
  71028. // VPHADDUWQ performs "Packed Horizontal Add Unsigned Word to Quadword".
  71029. //
  71030. // Mnemonic : VPHADDUWQ
  71031. // Supported forms : (2 forms)
  71032. //
  71033. // * VPHADDUWQ xmm, xmm [XOP]
  71034. // * VPHADDUWQ m128, xmm [XOP]
  71035. //
  71036. func (self *Program) VPHADDUWQ(v0 interface{}, v1 interface{}) *Instruction {
  71037. p := self.alloc("VPHADDUWQ", 2, Operands { v0, v1 })
  71038. // VPHADDUWQ xmm, xmm
  71039. if isXMM(v0) && isXMM(v1) {
  71040. self.require(ISA_XOP)
  71041. p.domain = DomainAMDSpecific
  71042. p.add(0, func(m *_Encoding, v []interface{}) {
  71043. m.emit(0x8f)
  71044. m.emit(0xe9 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  71045. m.emit(0x78)
  71046. m.emit(0xd7)
  71047. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  71048. })
  71049. }
  71050. // VPHADDUWQ m128, xmm
  71051. if isM128(v0) && isXMM(v1) {
  71052. self.require(ISA_XOP)
  71053. p.domain = DomainAMDSpecific
  71054. p.add(0, func(m *_Encoding, v []interface{}) {
  71055. m.vex3(0x8f, 0b1001, 0x00, hcode(v[1]), addr(v[0]), 0)
  71056. m.emit(0xd7)
  71057. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  71058. })
  71059. }
  71060. if p.len == 0 {
  71061. panic("invalid operands for VPHADDUWQ")
  71062. }
  71063. return p
  71064. }
  71065. // VPHADDW performs "Packed Horizontal Add Word Integers".
  71066. //
  71067. // Mnemonic : VPHADDW
  71068. // Supported forms : (4 forms)
  71069. //
  71070. // * VPHADDW xmm, xmm, xmm [AVX]
  71071. // * VPHADDW m128, xmm, xmm [AVX]
  71072. // * VPHADDW ymm, ymm, ymm [AVX2]
  71073. // * VPHADDW m256, ymm, ymm [AVX2]
  71074. //
  71075. func (self *Program) VPHADDW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  71076. p := self.alloc("VPHADDW", 3, Operands { v0, v1, v2 })
  71077. // VPHADDW xmm, xmm, xmm
  71078. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  71079. self.require(ISA_AVX)
  71080. p.domain = DomainAVX
  71081. p.add(0, func(m *_Encoding, v []interface{}) {
  71082. m.emit(0xc4)
  71083. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  71084. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  71085. m.emit(0x01)
  71086. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  71087. })
  71088. }
  71089. // VPHADDW m128, xmm, xmm
  71090. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  71091. self.require(ISA_AVX)
  71092. p.domain = DomainAVX
  71093. p.add(0, func(m *_Encoding, v []interface{}) {
  71094. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  71095. m.emit(0x01)
  71096. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  71097. })
  71098. }
  71099. // VPHADDW ymm, ymm, ymm
  71100. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  71101. self.require(ISA_AVX2)
  71102. p.domain = DomainAVX
  71103. p.add(0, func(m *_Encoding, v []interface{}) {
  71104. m.emit(0xc4)
  71105. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  71106. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  71107. m.emit(0x01)
  71108. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  71109. })
  71110. }
  71111. // VPHADDW m256, ymm, ymm
  71112. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  71113. self.require(ISA_AVX2)
  71114. p.domain = DomainAVX
  71115. p.add(0, func(m *_Encoding, v []interface{}) {
  71116. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  71117. m.emit(0x01)
  71118. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  71119. })
  71120. }
  71121. if p.len == 0 {
  71122. panic("invalid operands for VPHADDW")
  71123. }
  71124. return p
  71125. }
  71126. // VPHADDWD performs "Packed Horizontal Add Signed Word to Signed Doubleword".
  71127. //
  71128. // Mnemonic : VPHADDWD
  71129. // Supported forms : (2 forms)
  71130. //
  71131. // * VPHADDWD xmm, xmm [XOP]
  71132. // * VPHADDWD m128, xmm [XOP]
  71133. //
  71134. func (self *Program) VPHADDWD(v0 interface{}, v1 interface{}) *Instruction {
  71135. p := self.alloc("VPHADDWD", 2, Operands { v0, v1 })
  71136. // VPHADDWD xmm, xmm
  71137. if isXMM(v0) && isXMM(v1) {
  71138. self.require(ISA_XOP)
  71139. p.domain = DomainAMDSpecific
  71140. p.add(0, func(m *_Encoding, v []interface{}) {
  71141. m.emit(0x8f)
  71142. m.emit(0xe9 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  71143. m.emit(0x78)
  71144. m.emit(0xc6)
  71145. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  71146. })
  71147. }
  71148. // VPHADDWD m128, xmm
  71149. if isM128(v0) && isXMM(v1) {
  71150. self.require(ISA_XOP)
  71151. p.domain = DomainAMDSpecific
  71152. p.add(0, func(m *_Encoding, v []interface{}) {
  71153. m.vex3(0x8f, 0b1001, 0x00, hcode(v[1]), addr(v[0]), 0)
  71154. m.emit(0xc6)
  71155. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  71156. })
  71157. }
  71158. if p.len == 0 {
  71159. panic("invalid operands for VPHADDWD")
  71160. }
  71161. return p
  71162. }
  71163. // VPHADDWQ performs "Packed Horizontal Add Signed Word to Signed Quadword".
  71164. //
  71165. // Mnemonic : VPHADDWQ
  71166. // Supported forms : (2 forms)
  71167. //
  71168. // * VPHADDWQ xmm, xmm [XOP]
  71169. // * VPHADDWQ m128, xmm [XOP]
  71170. //
  71171. func (self *Program) VPHADDWQ(v0 interface{}, v1 interface{}) *Instruction {
  71172. p := self.alloc("VPHADDWQ", 2, Operands { v0, v1 })
  71173. // VPHADDWQ xmm, xmm
  71174. if isXMM(v0) && isXMM(v1) {
  71175. self.require(ISA_XOP)
  71176. p.domain = DomainAMDSpecific
  71177. p.add(0, func(m *_Encoding, v []interface{}) {
  71178. m.emit(0x8f)
  71179. m.emit(0xe9 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  71180. m.emit(0x78)
  71181. m.emit(0xc7)
  71182. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  71183. })
  71184. }
  71185. // VPHADDWQ m128, xmm
  71186. if isM128(v0) && isXMM(v1) {
  71187. self.require(ISA_XOP)
  71188. p.domain = DomainAMDSpecific
  71189. p.add(0, func(m *_Encoding, v []interface{}) {
  71190. m.vex3(0x8f, 0b1001, 0x00, hcode(v[1]), addr(v[0]), 0)
  71191. m.emit(0xc7)
  71192. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  71193. })
  71194. }
  71195. if p.len == 0 {
  71196. panic("invalid operands for VPHADDWQ")
  71197. }
  71198. return p
  71199. }
  71200. // VPHMINPOSUW performs "Packed Horizontal Minimum of Unsigned Word Integers".
  71201. //
  71202. // Mnemonic : VPHMINPOSUW
  71203. // Supported forms : (2 forms)
  71204. //
  71205. // * VPHMINPOSUW xmm, xmm [AVX]
  71206. // * VPHMINPOSUW m128, xmm [AVX]
  71207. //
  71208. func (self *Program) VPHMINPOSUW(v0 interface{}, v1 interface{}) *Instruction {
  71209. p := self.alloc("VPHMINPOSUW", 2, Operands { v0, v1 })
  71210. // VPHMINPOSUW xmm, xmm
  71211. if isXMM(v0) && isXMM(v1) {
  71212. self.require(ISA_AVX)
  71213. p.domain = DomainAVX
  71214. p.add(0, func(m *_Encoding, v []interface{}) {
  71215. m.emit(0xc4)
  71216. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  71217. m.emit(0x79)
  71218. m.emit(0x41)
  71219. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  71220. })
  71221. }
  71222. // VPHMINPOSUW m128, xmm
  71223. if isM128(v0) && isXMM(v1) {
  71224. self.require(ISA_AVX)
  71225. p.domain = DomainAVX
  71226. p.add(0, func(m *_Encoding, v []interface{}) {
  71227. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  71228. m.emit(0x41)
  71229. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  71230. })
  71231. }
  71232. if p.len == 0 {
  71233. panic("invalid operands for VPHMINPOSUW")
  71234. }
  71235. return p
  71236. }
  71237. // VPHSUBBW performs "Packed Horizontal Subtract Signed Byte to Signed Word".
  71238. //
  71239. // Mnemonic : VPHSUBBW
  71240. // Supported forms : (2 forms)
  71241. //
  71242. // * VPHSUBBW xmm, xmm [XOP]
  71243. // * VPHSUBBW m128, xmm [XOP]
  71244. //
  71245. func (self *Program) VPHSUBBW(v0 interface{}, v1 interface{}) *Instruction {
  71246. p := self.alloc("VPHSUBBW", 2, Operands { v0, v1 })
  71247. // VPHSUBBW xmm, xmm
  71248. if isXMM(v0) && isXMM(v1) {
  71249. self.require(ISA_XOP)
  71250. p.domain = DomainAMDSpecific
  71251. p.add(0, func(m *_Encoding, v []interface{}) {
  71252. m.emit(0x8f)
  71253. m.emit(0xe9 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  71254. m.emit(0x78)
  71255. m.emit(0xe1)
  71256. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  71257. })
  71258. }
  71259. // VPHSUBBW m128, xmm
  71260. if isM128(v0) && isXMM(v1) {
  71261. self.require(ISA_XOP)
  71262. p.domain = DomainAMDSpecific
  71263. p.add(0, func(m *_Encoding, v []interface{}) {
  71264. m.vex3(0x8f, 0b1001, 0x00, hcode(v[1]), addr(v[0]), 0)
  71265. m.emit(0xe1)
  71266. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  71267. })
  71268. }
  71269. if p.len == 0 {
  71270. panic("invalid operands for VPHSUBBW")
  71271. }
  71272. return p
  71273. }
  71274. // VPHSUBD performs "Packed Horizontal Subtract Doubleword Integers".
  71275. //
  71276. // Mnemonic : VPHSUBD
  71277. // Supported forms : (4 forms)
  71278. //
  71279. // * VPHSUBD xmm, xmm, xmm [AVX]
  71280. // * VPHSUBD m128, xmm, xmm [AVX]
  71281. // * VPHSUBD ymm, ymm, ymm [AVX2]
  71282. // * VPHSUBD m256, ymm, ymm [AVX2]
  71283. //
  71284. func (self *Program) VPHSUBD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  71285. p := self.alloc("VPHSUBD", 3, Operands { v0, v1, v2 })
  71286. // VPHSUBD xmm, xmm, xmm
  71287. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  71288. self.require(ISA_AVX)
  71289. p.domain = DomainAVX
  71290. p.add(0, func(m *_Encoding, v []interface{}) {
  71291. m.emit(0xc4)
  71292. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  71293. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  71294. m.emit(0x06)
  71295. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  71296. })
  71297. }
  71298. // VPHSUBD m128, xmm, xmm
  71299. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  71300. self.require(ISA_AVX)
  71301. p.domain = DomainAVX
  71302. p.add(0, func(m *_Encoding, v []interface{}) {
  71303. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  71304. m.emit(0x06)
  71305. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  71306. })
  71307. }
  71308. // VPHSUBD ymm, ymm, ymm
  71309. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  71310. self.require(ISA_AVX2)
  71311. p.domain = DomainAVX
  71312. p.add(0, func(m *_Encoding, v []interface{}) {
  71313. m.emit(0xc4)
  71314. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  71315. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  71316. m.emit(0x06)
  71317. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  71318. })
  71319. }
  71320. // VPHSUBD m256, ymm, ymm
  71321. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  71322. self.require(ISA_AVX2)
  71323. p.domain = DomainAVX
  71324. p.add(0, func(m *_Encoding, v []interface{}) {
  71325. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  71326. m.emit(0x06)
  71327. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  71328. })
  71329. }
  71330. if p.len == 0 {
  71331. panic("invalid operands for VPHSUBD")
  71332. }
  71333. return p
  71334. }
  71335. // VPHSUBDQ performs "Packed Horizontal Subtract Signed Doubleword to Signed Quadword".
  71336. //
  71337. // Mnemonic : VPHSUBDQ
  71338. // Supported forms : (2 forms)
  71339. //
  71340. // * VPHSUBDQ xmm, xmm [XOP]
  71341. // * VPHSUBDQ m128, xmm [XOP]
  71342. //
  71343. func (self *Program) VPHSUBDQ(v0 interface{}, v1 interface{}) *Instruction {
  71344. p := self.alloc("VPHSUBDQ", 2, Operands { v0, v1 })
  71345. // VPHSUBDQ xmm, xmm
  71346. if isXMM(v0) && isXMM(v1) {
  71347. self.require(ISA_XOP)
  71348. p.domain = DomainAMDSpecific
  71349. p.add(0, func(m *_Encoding, v []interface{}) {
  71350. m.emit(0x8f)
  71351. m.emit(0xe9 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  71352. m.emit(0x78)
  71353. m.emit(0xe3)
  71354. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  71355. })
  71356. }
  71357. // VPHSUBDQ m128, xmm
  71358. if isM128(v0) && isXMM(v1) {
  71359. self.require(ISA_XOP)
  71360. p.domain = DomainAMDSpecific
  71361. p.add(0, func(m *_Encoding, v []interface{}) {
  71362. m.vex3(0x8f, 0b1001, 0x00, hcode(v[1]), addr(v[0]), 0)
  71363. m.emit(0xe3)
  71364. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  71365. })
  71366. }
  71367. if p.len == 0 {
  71368. panic("invalid operands for VPHSUBDQ")
  71369. }
  71370. return p
  71371. }
  71372. // VPHSUBSW performs "Packed Horizontal Subtract Signed Word Integers with Signed Saturation".
  71373. //
  71374. // Mnemonic : VPHSUBSW
  71375. // Supported forms : (4 forms)
  71376. //
  71377. // * VPHSUBSW xmm, xmm, xmm [AVX]
  71378. // * VPHSUBSW m128, xmm, xmm [AVX]
  71379. // * VPHSUBSW ymm, ymm, ymm [AVX2]
  71380. // * VPHSUBSW m256, ymm, ymm [AVX2]
  71381. //
  71382. func (self *Program) VPHSUBSW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  71383. p := self.alloc("VPHSUBSW", 3, Operands { v0, v1, v2 })
  71384. // VPHSUBSW xmm, xmm, xmm
  71385. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  71386. self.require(ISA_AVX)
  71387. p.domain = DomainAVX
  71388. p.add(0, func(m *_Encoding, v []interface{}) {
  71389. m.emit(0xc4)
  71390. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  71391. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  71392. m.emit(0x07)
  71393. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  71394. })
  71395. }
  71396. // VPHSUBSW m128, xmm, xmm
  71397. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  71398. self.require(ISA_AVX)
  71399. p.domain = DomainAVX
  71400. p.add(0, func(m *_Encoding, v []interface{}) {
  71401. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  71402. m.emit(0x07)
  71403. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  71404. })
  71405. }
  71406. // VPHSUBSW ymm, ymm, ymm
  71407. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  71408. self.require(ISA_AVX2)
  71409. p.domain = DomainAVX
  71410. p.add(0, func(m *_Encoding, v []interface{}) {
  71411. m.emit(0xc4)
  71412. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  71413. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  71414. m.emit(0x07)
  71415. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  71416. })
  71417. }
  71418. // VPHSUBSW m256, ymm, ymm
  71419. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  71420. self.require(ISA_AVX2)
  71421. p.domain = DomainAVX
  71422. p.add(0, func(m *_Encoding, v []interface{}) {
  71423. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  71424. m.emit(0x07)
  71425. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  71426. })
  71427. }
  71428. if p.len == 0 {
  71429. panic("invalid operands for VPHSUBSW")
  71430. }
  71431. return p
  71432. }
  71433. // VPHSUBW performs "Packed Horizontal Subtract Word Integers".
  71434. //
  71435. // Mnemonic : VPHSUBW
  71436. // Supported forms : (4 forms)
  71437. //
  71438. // * VPHSUBW xmm, xmm, xmm [AVX]
  71439. // * VPHSUBW m128, xmm, xmm [AVX]
  71440. // * VPHSUBW ymm, ymm, ymm [AVX2]
  71441. // * VPHSUBW m256, ymm, ymm [AVX2]
  71442. //
  71443. func (self *Program) VPHSUBW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  71444. p := self.alloc("VPHSUBW", 3, Operands { v0, v1, v2 })
  71445. // VPHSUBW xmm, xmm, xmm
  71446. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  71447. self.require(ISA_AVX)
  71448. p.domain = DomainAVX
  71449. p.add(0, func(m *_Encoding, v []interface{}) {
  71450. m.emit(0xc4)
  71451. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  71452. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  71453. m.emit(0x05)
  71454. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  71455. })
  71456. }
  71457. // VPHSUBW m128, xmm, xmm
  71458. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  71459. self.require(ISA_AVX)
  71460. p.domain = DomainAVX
  71461. p.add(0, func(m *_Encoding, v []interface{}) {
  71462. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  71463. m.emit(0x05)
  71464. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  71465. })
  71466. }
  71467. // VPHSUBW ymm, ymm, ymm
  71468. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  71469. self.require(ISA_AVX2)
  71470. p.domain = DomainAVX
  71471. p.add(0, func(m *_Encoding, v []interface{}) {
  71472. m.emit(0xc4)
  71473. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  71474. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  71475. m.emit(0x05)
  71476. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  71477. })
  71478. }
  71479. // VPHSUBW m256, ymm, ymm
  71480. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  71481. self.require(ISA_AVX2)
  71482. p.domain = DomainAVX
  71483. p.add(0, func(m *_Encoding, v []interface{}) {
  71484. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  71485. m.emit(0x05)
  71486. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  71487. })
  71488. }
  71489. if p.len == 0 {
  71490. panic("invalid operands for VPHSUBW")
  71491. }
  71492. return p
  71493. }
  71494. // VPHSUBWD performs "Packed Horizontal Subtract Signed Word to Signed Doubleword".
  71495. //
  71496. // Mnemonic : VPHSUBWD
  71497. // Supported forms : (2 forms)
  71498. //
  71499. // * VPHSUBWD xmm, xmm [XOP]
  71500. // * VPHSUBWD m128, xmm [XOP]
  71501. //
  71502. func (self *Program) VPHSUBWD(v0 interface{}, v1 interface{}) *Instruction {
  71503. p := self.alloc("VPHSUBWD", 2, Operands { v0, v1 })
  71504. // VPHSUBWD xmm, xmm
  71505. if isXMM(v0) && isXMM(v1) {
  71506. self.require(ISA_XOP)
  71507. p.domain = DomainAMDSpecific
  71508. p.add(0, func(m *_Encoding, v []interface{}) {
  71509. m.emit(0x8f)
  71510. m.emit(0xe9 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  71511. m.emit(0x78)
  71512. m.emit(0xe2)
  71513. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  71514. })
  71515. }
  71516. // VPHSUBWD m128, xmm
  71517. if isM128(v0) && isXMM(v1) {
  71518. self.require(ISA_XOP)
  71519. p.domain = DomainAMDSpecific
  71520. p.add(0, func(m *_Encoding, v []interface{}) {
  71521. m.vex3(0x8f, 0b1001, 0x00, hcode(v[1]), addr(v[0]), 0)
  71522. m.emit(0xe2)
  71523. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  71524. })
  71525. }
  71526. if p.len == 0 {
  71527. panic("invalid operands for VPHSUBWD")
  71528. }
  71529. return p
  71530. }
  71531. // VPINSRB performs "Insert Byte".
  71532. //
  71533. // Mnemonic : VPINSRB
  71534. // Supported forms : (4 forms)
  71535. //
  71536. // * VPINSRB imm8, r32, xmm, xmm [AVX]
  71537. // * VPINSRB imm8, m8, xmm, xmm [AVX]
  71538. // * VPINSRB imm8, r32, xmm, xmm [AVX512BW]
  71539. // * VPINSRB imm8, m8, xmm, xmm [AVX512BW]
  71540. //
  71541. func (self *Program) VPINSRB(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  71542. p := self.alloc("VPINSRB", 4, Operands { v0, v1, v2, v3 })
  71543. // VPINSRB imm8, r32, xmm, xmm
  71544. if isImm8(v0) && isReg32(v1) && isXMM(v2) && isXMM(v3) {
  71545. self.require(ISA_AVX)
  71546. p.domain = DomainAVX
  71547. p.add(0, func(m *_Encoding, v []interface{}) {
  71548. m.emit(0xc4)
  71549. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  71550. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  71551. m.emit(0x20)
  71552. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  71553. m.imm1(toImmAny(v[0]))
  71554. })
  71555. }
  71556. // VPINSRB imm8, m8, xmm, xmm
  71557. if isImm8(v0) && isM8(v1) && isXMM(v2) && isXMM(v3) {
  71558. self.require(ISA_AVX)
  71559. p.domain = DomainAVX
  71560. p.add(0, func(m *_Encoding, v []interface{}) {
  71561. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  71562. m.emit(0x20)
  71563. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  71564. m.imm1(toImmAny(v[0]))
  71565. })
  71566. }
  71567. // VPINSRB imm8, r32, xmm, xmm
  71568. if isImm8(v0) && isReg32(v1) && isEVEXXMM(v2) && isEVEXXMM(v3) {
  71569. self.require(ISA_AVX512BW)
  71570. p.domain = DomainAVX
  71571. p.add(0, func(m *_Encoding, v []interface{}) {
  71572. m.emit(0x62)
  71573. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  71574. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  71575. m.emit((0x08 ^ (ecode(v[2]) << 3)) | 0x00)
  71576. m.emit(0x20)
  71577. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  71578. m.imm1(toImmAny(v[0]))
  71579. })
  71580. }
  71581. // VPINSRB imm8, m8, xmm, xmm
  71582. if isImm8(v0) && isM8(v1) && isEVEXXMM(v2) && isEVEXXMM(v3) {
  71583. self.require(ISA_AVX512BW)
  71584. p.domain = DomainAVX
  71585. p.add(0, func(m *_Encoding, v []interface{}) {
  71586. m.evex(0b11, 0x05, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), 0, 0, 0)
  71587. m.emit(0x20)
  71588. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  71589. m.imm1(toImmAny(v[0]))
  71590. })
  71591. }
  71592. if p.len == 0 {
  71593. panic("invalid operands for VPINSRB")
  71594. }
  71595. return p
  71596. }
  71597. // VPINSRD performs "Insert Doubleword".
  71598. //
  71599. // Mnemonic : VPINSRD
  71600. // Supported forms : (4 forms)
  71601. //
  71602. // * VPINSRD imm8, r32, xmm, xmm [AVX]
  71603. // * VPINSRD imm8, m32, xmm, xmm [AVX]
  71604. // * VPINSRD imm8, r32, xmm, xmm [AVX512DQ]
  71605. // * VPINSRD imm8, m32, xmm, xmm [AVX512DQ]
  71606. //
  71607. func (self *Program) VPINSRD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  71608. p := self.alloc("VPINSRD", 4, Operands { v0, v1, v2, v3 })
  71609. // VPINSRD imm8, r32, xmm, xmm
  71610. if isImm8(v0) && isReg32(v1) && isXMM(v2) && isXMM(v3) {
  71611. self.require(ISA_AVX)
  71612. p.domain = DomainAVX
  71613. p.add(0, func(m *_Encoding, v []interface{}) {
  71614. m.emit(0xc4)
  71615. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  71616. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  71617. m.emit(0x22)
  71618. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  71619. m.imm1(toImmAny(v[0]))
  71620. })
  71621. }
  71622. // VPINSRD imm8, m32, xmm, xmm
  71623. if isImm8(v0) && isM32(v1) && isXMM(v2) && isXMM(v3) {
  71624. self.require(ISA_AVX)
  71625. p.domain = DomainAVX
  71626. p.add(0, func(m *_Encoding, v []interface{}) {
  71627. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  71628. m.emit(0x22)
  71629. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  71630. m.imm1(toImmAny(v[0]))
  71631. })
  71632. }
  71633. // VPINSRD imm8, r32, xmm, xmm
  71634. if isImm8(v0) && isReg32(v1) && isEVEXXMM(v2) && isEVEXXMM(v3) {
  71635. self.require(ISA_AVX512DQ)
  71636. p.domain = DomainAVX
  71637. p.add(0, func(m *_Encoding, v []interface{}) {
  71638. m.emit(0x62)
  71639. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  71640. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  71641. m.emit((0x08 ^ (ecode(v[2]) << 3)) | 0x00)
  71642. m.emit(0x22)
  71643. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  71644. m.imm1(toImmAny(v[0]))
  71645. })
  71646. }
  71647. // VPINSRD imm8, m32, xmm, xmm
  71648. if isImm8(v0) && isM32(v1) && isEVEXXMM(v2) && isEVEXXMM(v3) {
  71649. self.require(ISA_AVX512DQ)
  71650. p.domain = DomainAVX
  71651. p.add(0, func(m *_Encoding, v []interface{}) {
  71652. m.evex(0b11, 0x05, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), 0, 0, 0)
  71653. m.emit(0x22)
  71654. m.mrsd(lcode(v[3]), addr(v[1]), 4)
  71655. m.imm1(toImmAny(v[0]))
  71656. })
  71657. }
  71658. if p.len == 0 {
  71659. panic("invalid operands for VPINSRD")
  71660. }
  71661. return p
  71662. }
  71663. // VPINSRQ performs "Insert Quadword".
  71664. //
  71665. // Mnemonic : VPINSRQ
  71666. // Supported forms : (4 forms)
  71667. //
  71668. // * VPINSRQ imm8, r64, xmm, xmm [AVX]
  71669. // * VPINSRQ imm8, m64, xmm, xmm [AVX]
  71670. // * VPINSRQ imm8, r64, xmm, xmm [AVX512DQ]
  71671. // * VPINSRQ imm8, m64, xmm, xmm [AVX512DQ]
  71672. //
  71673. func (self *Program) VPINSRQ(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  71674. p := self.alloc("VPINSRQ", 4, Operands { v0, v1, v2, v3 })
  71675. // VPINSRQ imm8, r64, xmm, xmm
  71676. if isImm8(v0) && isReg64(v1) && isXMM(v2) && isXMM(v3) {
  71677. self.require(ISA_AVX)
  71678. p.domain = DomainAVX
  71679. p.add(0, func(m *_Encoding, v []interface{}) {
  71680. m.emit(0xc4)
  71681. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  71682. m.emit(0xf9 ^ (hlcode(v[2]) << 3))
  71683. m.emit(0x22)
  71684. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  71685. m.imm1(toImmAny(v[0]))
  71686. })
  71687. }
  71688. // VPINSRQ imm8, m64, xmm, xmm
  71689. if isImm8(v0) && isM64(v1) && isXMM(v2) && isXMM(v3) {
  71690. self.require(ISA_AVX)
  71691. p.domain = DomainAVX
  71692. p.add(0, func(m *_Encoding, v []interface{}) {
  71693. m.vex3(0xc4, 0b11, 0x81, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  71694. m.emit(0x22)
  71695. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  71696. m.imm1(toImmAny(v[0]))
  71697. })
  71698. }
  71699. // VPINSRQ imm8, r64, xmm, xmm
  71700. if isImm8(v0) && isReg64(v1) && isEVEXXMM(v2) && isEVEXXMM(v3) {
  71701. self.require(ISA_AVX512DQ)
  71702. p.domain = DomainAVX
  71703. p.add(0, func(m *_Encoding, v []interface{}) {
  71704. m.emit(0x62)
  71705. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  71706. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  71707. m.emit((0x08 ^ (ecode(v[2]) << 3)) | 0x00)
  71708. m.emit(0x22)
  71709. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  71710. m.imm1(toImmAny(v[0]))
  71711. })
  71712. }
  71713. // VPINSRQ imm8, m64, xmm, xmm
  71714. if isImm8(v0) && isM64(v1) && isEVEXXMM(v2) && isEVEXXMM(v3) {
  71715. self.require(ISA_AVX512DQ)
  71716. p.domain = DomainAVX
  71717. p.add(0, func(m *_Encoding, v []interface{}) {
  71718. m.evex(0b11, 0x85, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), 0, 0, 0)
  71719. m.emit(0x22)
  71720. m.mrsd(lcode(v[3]), addr(v[1]), 8)
  71721. m.imm1(toImmAny(v[0]))
  71722. })
  71723. }
  71724. if p.len == 0 {
  71725. panic("invalid operands for VPINSRQ")
  71726. }
  71727. return p
  71728. }
  71729. // VPINSRW performs "Insert Word".
  71730. //
  71731. // Mnemonic : VPINSRW
  71732. // Supported forms : (4 forms)
  71733. //
  71734. // * VPINSRW imm8, r32, xmm, xmm [AVX]
  71735. // * VPINSRW imm8, m16, xmm, xmm [AVX]
  71736. // * VPINSRW imm8, r32, xmm, xmm [AVX512BW]
  71737. // * VPINSRW imm8, m16, xmm, xmm [AVX512BW]
  71738. //
  71739. func (self *Program) VPINSRW(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  71740. p := self.alloc("VPINSRW", 4, Operands { v0, v1, v2, v3 })
  71741. // VPINSRW imm8, r32, xmm, xmm
  71742. if isImm8(v0) && isReg32(v1) && isXMM(v2) && isXMM(v3) {
  71743. self.require(ISA_AVX)
  71744. p.domain = DomainAVX
  71745. p.add(0, func(m *_Encoding, v []interface{}) {
  71746. m.vex2(1, hcode(v[3]), v[1], hlcode(v[2]))
  71747. m.emit(0xc4)
  71748. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  71749. m.imm1(toImmAny(v[0]))
  71750. })
  71751. }
  71752. // VPINSRW imm8, m16, xmm, xmm
  71753. if isImm8(v0) && isM16(v1) && isXMM(v2) && isXMM(v3) {
  71754. self.require(ISA_AVX)
  71755. p.domain = DomainAVX
  71756. p.add(0, func(m *_Encoding, v []interface{}) {
  71757. m.vex2(1, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  71758. m.emit(0xc4)
  71759. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  71760. m.imm1(toImmAny(v[0]))
  71761. })
  71762. }
  71763. // VPINSRW imm8, r32, xmm, xmm
  71764. if isImm8(v0) && isReg32(v1) && isEVEXXMM(v2) && isEVEXXMM(v3) {
  71765. self.require(ISA_AVX512BW)
  71766. p.domain = DomainAVX
  71767. p.add(0, func(m *_Encoding, v []interface{}) {
  71768. m.emit(0x62)
  71769. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  71770. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  71771. m.emit((0x08 ^ (ecode(v[2]) << 3)) | 0x00)
  71772. m.emit(0xc4)
  71773. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  71774. m.imm1(toImmAny(v[0]))
  71775. })
  71776. }
  71777. // VPINSRW imm8, m16, xmm, xmm
  71778. if isImm8(v0) && isM16(v1) && isEVEXXMM(v2) && isEVEXXMM(v3) {
  71779. self.require(ISA_AVX512BW)
  71780. p.domain = DomainAVX
  71781. p.add(0, func(m *_Encoding, v []interface{}) {
  71782. m.evex(0b01, 0x05, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), 0, 0, 0)
  71783. m.emit(0xc4)
  71784. m.mrsd(lcode(v[3]), addr(v[1]), 2)
  71785. m.imm1(toImmAny(v[0]))
  71786. })
  71787. }
  71788. if p.len == 0 {
  71789. panic("invalid operands for VPINSRW")
  71790. }
  71791. return p
  71792. }
  71793. // VPLZCNTD performs "Count the Number of Leading Zero Bits for Packed Doubleword Values".
  71794. //
  71795. // Mnemonic : VPLZCNTD
  71796. // Supported forms : (6 forms)
  71797. //
  71798. // * VPLZCNTD m128/m32bcst, xmm{k}{z} [AVX512CD,AVX512VL]
  71799. // * VPLZCNTD m256/m32bcst, ymm{k}{z} [AVX512CD,AVX512VL]
  71800. // * VPLZCNTD m512/m32bcst, zmm{k}{z} [AVX512CD]
  71801. // * VPLZCNTD xmm, xmm{k}{z} [AVX512CD,AVX512VL]
  71802. // * VPLZCNTD ymm, ymm{k}{z} [AVX512CD,AVX512VL]
  71803. // * VPLZCNTD zmm, zmm{k}{z} [AVX512CD]
  71804. //
  71805. func (self *Program) VPLZCNTD(v0 interface{}, v1 interface{}) *Instruction {
  71806. p := self.alloc("VPLZCNTD", 2, Operands { v0, v1 })
  71807. // VPLZCNTD m128/m32bcst, xmm{k}{z}
  71808. if isM128M32bcst(v0) && isXMMkz(v1) {
  71809. self.require(ISA_AVX512VL | ISA_AVX512CD)
  71810. p.domain = DomainAVX
  71811. p.add(0, func(m *_Encoding, v []interface{}) {
  71812. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  71813. m.emit(0x44)
  71814. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  71815. })
  71816. }
  71817. // VPLZCNTD m256/m32bcst, ymm{k}{z}
  71818. if isM256M32bcst(v0) && isYMMkz(v1) {
  71819. self.require(ISA_AVX512VL | ISA_AVX512CD)
  71820. p.domain = DomainAVX
  71821. p.add(0, func(m *_Encoding, v []interface{}) {
  71822. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  71823. m.emit(0x44)
  71824. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  71825. })
  71826. }
  71827. // VPLZCNTD m512/m32bcst, zmm{k}{z}
  71828. if isM512M32bcst(v0) && isZMMkz(v1) {
  71829. self.require(ISA_AVX512CD)
  71830. p.domain = DomainAVX
  71831. p.add(0, func(m *_Encoding, v []interface{}) {
  71832. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  71833. m.emit(0x44)
  71834. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  71835. })
  71836. }
  71837. // VPLZCNTD xmm, xmm{k}{z}
  71838. if isEVEXXMM(v0) && isXMMkz(v1) {
  71839. self.require(ISA_AVX512VL | ISA_AVX512CD)
  71840. p.domain = DomainAVX
  71841. p.add(0, func(m *_Encoding, v []interface{}) {
  71842. m.emit(0x62)
  71843. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  71844. m.emit(0x7d)
  71845. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  71846. m.emit(0x44)
  71847. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  71848. })
  71849. }
  71850. // VPLZCNTD ymm, ymm{k}{z}
  71851. if isEVEXYMM(v0) && isYMMkz(v1) {
  71852. self.require(ISA_AVX512VL | ISA_AVX512CD)
  71853. p.domain = DomainAVX
  71854. p.add(0, func(m *_Encoding, v []interface{}) {
  71855. m.emit(0x62)
  71856. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  71857. m.emit(0x7d)
  71858. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  71859. m.emit(0x44)
  71860. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  71861. })
  71862. }
  71863. // VPLZCNTD zmm, zmm{k}{z}
  71864. if isZMM(v0) && isZMMkz(v1) {
  71865. self.require(ISA_AVX512CD)
  71866. p.domain = DomainAVX
  71867. p.add(0, func(m *_Encoding, v []interface{}) {
  71868. m.emit(0x62)
  71869. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  71870. m.emit(0x7d)
  71871. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  71872. m.emit(0x44)
  71873. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  71874. })
  71875. }
  71876. if p.len == 0 {
  71877. panic("invalid operands for VPLZCNTD")
  71878. }
  71879. return p
  71880. }
  71881. // VPLZCNTQ performs "Count the Number of Leading Zero Bits for Packed Quadword Values".
  71882. //
  71883. // Mnemonic : VPLZCNTQ
  71884. // Supported forms : (6 forms)
  71885. //
  71886. // * VPLZCNTQ m128/m64bcst, xmm{k}{z} [AVX512CD,AVX512VL]
  71887. // * VPLZCNTQ m256/m64bcst, ymm{k}{z} [AVX512CD,AVX512VL]
  71888. // * VPLZCNTQ m512/m64bcst, zmm{k}{z} [AVX512CD]
  71889. // * VPLZCNTQ xmm, xmm{k}{z} [AVX512CD,AVX512VL]
  71890. // * VPLZCNTQ ymm, ymm{k}{z} [AVX512CD,AVX512VL]
  71891. // * VPLZCNTQ zmm, zmm{k}{z} [AVX512CD]
  71892. //
  71893. func (self *Program) VPLZCNTQ(v0 interface{}, v1 interface{}) *Instruction {
  71894. p := self.alloc("VPLZCNTQ", 2, Operands { v0, v1 })
  71895. // VPLZCNTQ m128/m64bcst, xmm{k}{z}
  71896. if isM128M64bcst(v0) && isXMMkz(v1) {
  71897. self.require(ISA_AVX512VL | ISA_AVX512CD)
  71898. p.domain = DomainAVX
  71899. p.add(0, func(m *_Encoding, v []interface{}) {
  71900. m.evex(0b10, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  71901. m.emit(0x44)
  71902. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  71903. })
  71904. }
  71905. // VPLZCNTQ m256/m64bcst, ymm{k}{z}
  71906. if isM256M64bcst(v0) && isYMMkz(v1) {
  71907. self.require(ISA_AVX512VL | ISA_AVX512CD)
  71908. p.domain = DomainAVX
  71909. p.add(0, func(m *_Encoding, v []interface{}) {
  71910. m.evex(0b10, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  71911. m.emit(0x44)
  71912. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  71913. })
  71914. }
  71915. // VPLZCNTQ m512/m64bcst, zmm{k}{z}
  71916. if isM512M64bcst(v0) && isZMMkz(v1) {
  71917. self.require(ISA_AVX512CD)
  71918. p.domain = DomainAVX
  71919. p.add(0, func(m *_Encoding, v []interface{}) {
  71920. m.evex(0b10, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  71921. m.emit(0x44)
  71922. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  71923. })
  71924. }
  71925. // VPLZCNTQ xmm, xmm{k}{z}
  71926. if isEVEXXMM(v0) && isXMMkz(v1) {
  71927. self.require(ISA_AVX512VL | ISA_AVX512CD)
  71928. p.domain = DomainAVX
  71929. p.add(0, func(m *_Encoding, v []interface{}) {
  71930. m.emit(0x62)
  71931. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  71932. m.emit(0xfd)
  71933. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  71934. m.emit(0x44)
  71935. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  71936. })
  71937. }
  71938. // VPLZCNTQ ymm, ymm{k}{z}
  71939. if isEVEXYMM(v0) && isYMMkz(v1) {
  71940. self.require(ISA_AVX512VL | ISA_AVX512CD)
  71941. p.domain = DomainAVX
  71942. p.add(0, func(m *_Encoding, v []interface{}) {
  71943. m.emit(0x62)
  71944. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  71945. m.emit(0xfd)
  71946. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  71947. m.emit(0x44)
  71948. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  71949. })
  71950. }
  71951. // VPLZCNTQ zmm, zmm{k}{z}
  71952. if isZMM(v0) && isZMMkz(v1) {
  71953. self.require(ISA_AVX512CD)
  71954. p.domain = DomainAVX
  71955. p.add(0, func(m *_Encoding, v []interface{}) {
  71956. m.emit(0x62)
  71957. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  71958. m.emit(0xfd)
  71959. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  71960. m.emit(0x44)
  71961. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  71962. })
  71963. }
  71964. if p.len == 0 {
  71965. panic("invalid operands for VPLZCNTQ")
  71966. }
  71967. return p
  71968. }
  71969. // VPMACSDD performs "Packed Multiply Accumulate Signed Doubleword to Signed Doubleword".
  71970. //
  71971. // Mnemonic : VPMACSDD
  71972. // Supported forms : (2 forms)
  71973. //
  71974. // * VPMACSDD xmm, xmm, xmm, xmm [XOP]
  71975. // * VPMACSDD xmm, m128, xmm, xmm [XOP]
  71976. //
  71977. func (self *Program) VPMACSDD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  71978. p := self.alloc("VPMACSDD", 4, Operands { v0, v1, v2, v3 })
  71979. // VPMACSDD xmm, xmm, xmm, xmm
  71980. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  71981. self.require(ISA_XOP)
  71982. p.domain = DomainAMDSpecific
  71983. p.add(0, func(m *_Encoding, v []interface{}) {
  71984. m.emit(0x8f)
  71985. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  71986. m.emit(0x78 ^ (hlcode(v[2]) << 3))
  71987. m.emit(0x9e)
  71988. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  71989. m.emit(hlcode(v[0]) << 4)
  71990. })
  71991. }
  71992. // VPMACSDD xmm, m128, xmm, xmm
  71993. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  71994. self.require(ISA_XOP)
  71995. p.domain = DomainAMDSpecific
  71996. p.add(0, func(m *_Encoding, v []interface{}) {
  71997. m.vex3(0x8f, 0b1000, 0x00, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  71998. m.emit(0x9e)
  71999. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  72000. m.emit(hlcode(v[0]) << 4)
  72001. })
  72002. }
  72003. if p.len == 0 {
  72004. panic("invalid operands for VPMACSDD")
  72005. }
  72006. return p
  72007. }
  72008. // VPMACSDQH performs "Packed Multiply Accumulate Signed High Doubleword to Signed Quadword".
  72009. //
  72010. // Mnemonic : VPMACSDQH
  72011. // Supported forms : (2 forms)
  72012. //
  72013. // * VPMACSDQH xmm, xmm, xmm, xmm [XOP]
  72014. // * VPMACSDQH xmm, m128, xmm, xmm [XOP]
  72015. //
  72016. func (self *Program) VPMACSDQH(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  72017. p := self.alloc("VPMACSDQH", 4, Operands { v0, v1, v2, v3 })
  72018. // VPMACSDQH xmm, xmm, xmm, xmm
  72019. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  72020. self.require(ISA_XOP)
  72021. p.domain = DomainAMDSpecific
  72022. p.add(0, func(m *_Encoding, v []interface{}) {
  72023. m.emit(0x8f)
  72024. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  72025. m.emit(0x78 ^ (hlcode(v[2]) << 3))
  72026. m.emit(0x9f)
  72027. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  72028. m.emit(hlcode(v[0]) << 4)
  72029. })
  72030. }
  72031. // VPMACSDQH xmm, m128, xmm, xmm
  72032. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  72033. self.require(ISA_XOP)
  72034. p.domain = DomainAMDSpecific
  72035. p.add(0, func(m *_Encoding, v []interface{}) {
  72036. m.vex3(0x8f, 0b1000, 0x00, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  72037. m.emit(0x9f)
  72038. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  72039. m.emit(hlcode(v[0]) << 4)
  72040. })
  72041. }
  72042. if p.len == 0 {
  72043. panic("invalid operands for VPMACSDQH")
  72044. }
  72045. return p
  72046. }
  72047. // VPMACSDQL performs "Packed Multiply Accumulate Signed Low Doubleword to Signed Quadword".
  72048. //
  72049. // Mnemonic : VPMACSDQL
  72050. // Supported forms : (2 forms)
  72051. //
  72052. // * VPMACSDQL xmm, xmm, xmm, xmm [XOP]
  72053. // * VPMACSDQL xmm, m128, xmm, xmm [XOP]
  72054. //
  72055. func (self *Program) VPMACSDQL(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  72056. p := self.alloc("VPMACSDQL", 4, Operands { v0, v1, v2, v3 })
  72057. // VPMACSDQL xmm, xmm, xmm, xmm
  72058. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  72059. self.require(ISA_XOP)
  72060. p.domain = DomainAMDSpecific
  72061. p.add(0, func(m *_Encoding, v []interface{}) {
  72062. m.emit(0x8f)
  72063. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  72064. m.emit(0x78 ^ (hlcode(v[2]) << 3))
  72065. m.emit(0x97)
  72066. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  72067. m.emit(hlcode(v[0]) << 4)
  72068. })
  72069. }
  72070. // VPMACSDQL xmm, m128, xmm, xmm
  72071. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  72072. self.require(ISA_XOP)
  72073. p.domain = DomainAMDSpecific
  72074. p.add(0, func(m *_Encoding, v []interface{}) {
  72075. m.vex3(0x8f, 0b1000, 0x00, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  72076. m.emit(0x97)
  72077. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  72078. m.emit(hlcode(v[0]) << 4)
  72079. })
  72080. }
  72081. if p.len == 0 {
  72082. panic("invalid operands for VPMACSDQL")
  72083. }
  72084. return p
  72085. }
  72086. // VPMACSSDD performs "Packed Multiply Accumulate with Saturation Signed Doubleword to Signed Doubleword".
  72087. //
  72088. // Mnemonic : VPMACSSDD
  72089. // Supported forms : (2 forms)
  72090. //
  72091. // * VPMACSSDD xmm, xmm, xmm, xmm [XOP]
  72092. // * VPMACSSDD xmm, m128, xmm, xmm [XOP]
  72093. //
  72094. func (self *Program) VPMACSSDD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  72095. p := self.alloc("VPMACSSDD", 4, Operands { v0, v1, v2, v3 })
  72096. // VPMACSSDD xmm, xmm, xmm, xmm
  72097. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  72098. self.require(ISA_XOP)
  72099. p.domain = DomainAMDSpecific
  72100. p.add(0, func(m *_Encoding, v []interface{}) {
  72101. m.emit(0x8f)
  72102. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  72103. m.emit(0x78 ^ (hlcode(v[2]) << 3))
  72104. m.emit(0x8e)
  72105. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  72106. m.emit(hlcode(v[0]) << 4)
  72107. })
  72108. }
  72109. // VPMACSSDD xmm, m128, xmm, xmm
  72110. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  72111. self.require(ISA_XOP)
  72112. p.domain = DomainAMDSpecific
  72113. p.add(0, func(m *_Encoding, v []interface{}) {
  72114. m.vex3(0x8f, 0b1000, 0x00, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  72115. m.emit(0x8e)
  72116. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  72117. m.emit(hlcode(v[0]) << 4)
  72118. })
  72119. }
  72120. if p.len == 0 {
  72121. panic("invalid operands for VPMACSSDD")
  72122. }
  72123. return p
  72124. }
  72125. // VPMACSSDQH performs "Packed Multiply Accumulate with Saturation Signed High Doubleword to Signed Quadword".
  72126. //
  72127. // Mnemonic : VPMACSSDQH
  72128. // Supported forms : (2 forms)
  72129. //
  72130. // * VPMACSSDQH xmm, xmm, xmm, xmm [XOP]
  72131. // * VPMACSSDQH xmm, m128, xmm, xmm [XOP]
  72132. //
  72133. func (self *Program) VPMACSSDQH(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  72134. p := self.alloc("VPMACSSDQH", 4, Operands { v0, v1, v2, v3 })
  72135. // VPMACSSDQH xmm, xmm, xmm, xmm
  72136. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  72137. self.require(ISA_XOP)
  72138. p.domain = DomainAMDSpecific
  72139. p.add(0, func(m *_Encoding, v []interface{}) {
  72140. m.emit(0x8f)
  72141. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  72142. m.emit(0x78 ^ (hlcode(v[2]) << 3))
  72143. m.emit(0x8f)
  72144. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  72145. m.emit(hlcode(v[0]) << 4)
  72146. })
  72147. }
  72148. // VPMACSSDQH xmm, m128, xmm, xmm
  72149. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  72150. self.require(ISA_XOP)
  72151. p.domain = DomainAMDSpecific
  72152. p.add(0, func(m *_Encoding, v []interface{}) {
  72153. m.vex3(0x8f, 0b1000, 0x00, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  72154. m.emit(0x8f)
  72155. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  72156. m.emit(hlcode(v[0]) << 4)
  72157. })
  72158. }
  72159. if p.len == 0 {
  72160. panic("invalid operands for VPMACSSDQH")
  72161. }
  72162. return p
  72163. }
  72164. // VPMACSSDQL performs "Packed Multiply Accumulate with Saturation Signed Low Doubleword to Signed Quadword".
  72165. //
  72166. // Mnemonic : VPMACSSDQL
  72167. // Supported forms : (2 forms)
  72168. //
  72169. // * VPMACSSDQL xmm, xmm, xmm, xmm [XOP]
  72170. // * VPMACSSDQL xmm, m128, xmm, xmm [XOP]
  72171. //
  72172. func (self *Program) VPMACSSDQL(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  72173. p := self.alloc("VPMACSSDQL", 4, Operands { v0, v1, v2, v3 })
  72174. // VPMACSSDQL xmm, xmm, xmm, xmm
  72175. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  72176. self.require(ISA_XOP)
  72177. p.domain = DomainAMDSpecific
  72178. p.add(0, func(m *_Encoding, v []interface{}) {
  72179. m.emit(0x8f)
  72180. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  72181. m.emit(0x78 ^ (hlcode(v[2]) << 3))
  72182. m.emit(0x87)
  72183. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  72184. m.emit(hlcode(v[0]) << 4)
  72185. })
  72186. }
  72187. // VPMACSSDQL xmm, m128, xmm, xmm
  72188. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  72189. self.require(ISA_XOP)
  72190. p.domain = DomainAMDSpecific
  72191. p.add(0, func(m *_Encoding, v []interface{}) {
  72192. m.vex3(0x8f, 0b1000, 0x00, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  72193. m.emit(0x87)
  72194. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  72195. m.emit(hlcode(v[0]) << 4)
  72196. })
  72197. }
  72198. if p.len == 0 {
  72199. panic("invalid operands for VPMACSSDQL")
  72200. }
  72201. return p
  72202. }
  72203. // VPMACSSWD performs "Packed Multiply Accumulate with Saturation Signed Word to Signed Doubleword".
  72204. //
  72205. // Mnemonic : VPMACSSWD
  72206. // Supported forms : (2 forms)
  72207. //
  72208. // * VPMACSSWD xmm, xmm, xmm, xmm [XOP]
  72209. // * VPMACSSWD xmm, m128, xmm, xmm [XOP]
  72210. //
  72211. func (self *Program) VPMACSSWD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  72212. p := self.alloc("VPMACSSWD", 4, Operands { v0, v1, v2, v3 })
  72213. // VPMACSSWD xmm, xmm, xmm, xmm
  72214. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  72215. self.require(ISA_XOP)
  72216. p.domain = DomainAMDSpecific
  72217. p.add(0, func(m *_Encoding, v []interface{}) {
  72218. m.emit(0x8f)
  72219. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  72220. m.emit(0x78 ^ (hlcode(v[2]) << 3))
  72221. m.emit(0x86)
  72222. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  72223. m.emit(hlcode(v[0]) << 4)
  72224. })
  72225. }
  72226. // VPMACSSWD xmm, m128, xmm, xmm
  72227. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  72228. self.require(ISA_XOP)
  72229. p.domain = DomainAMDSpecific
  72230. p.add(0, func(m *_Encoding, v []interface{}) {
  72231. m.vex3(0x8f, 0b1000, 0x00, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  72232. m.emit(0x86)
  72233. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  72234. m.emit(hlcode(v[0]) << 4)
  72235. })
  72236. }
  72237. if p.len == 0 {
  72238. panic("invalid operands for VPMACSSWD")
  72239. }
  72240. return p
  72241. }
  72242. // VPMACSSWW performs "Packed Multiply Accumulate with Saturation Signed Word to Signed Word".
  72243. //
  72244. // Mnemonic : VPMACSSWW
  72245. // Supported forms : (2 forms)
  72246. //
  72247. // * VPMACSSWW xmm, xmm, xmm, xmm [XOP]
  72248. // * VPMACSSWW xmm, m128, xmm, xmm [XOP]
  72249. //
  72250. func (self *Program) VPMACSSWW(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  72251. p := self.alloc("VPMACSSWW", 4, Operands { v0, v1, v2, v3 })
  72252. // VPMACSSWW xmm, xmm, xmm, xmm
  72253. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  72254. self.require(ISA_XOP)
  72255. p.domain = DomainAMDSpecific
  72256. p.add(0, func(m *_Encoding, v []interface{}) {
  72257. m.emit(0x8f)
  72258. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  72259. m.emit(0x78 ^ (hlcode(v[2]) << 3))
  72260. m.emit(0x85)
  72261. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  72262. m.emit(hlcode(v[0]) << 4)
  72263. })
  72264. }
  72265. // VPMACSSWW xmm, m128, xmm, xmm
  72266. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  72267. self.require(ISA_XOP)
  72268. p.domain = DomainAMDSpecific
  72269. p.add(0, func(m *_Encoding, v []interface{}) {
  72270. m.vex3(0x8f, 0b1000, 0x00, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  72271. m.emit(0x85)
  72272. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  72273. m.emit(hlcode(v[0]) << 4)
  72274. })
  72275. }
  72276. if p.len == 0 {
  72277. panic("invalid operands for VPMACSSWW")
  72278. }
  72279. return p
  72280. }
  72281. // VPMACSWD performs "Packed Multiply Accumulate Signed Word to Signed Doubleword".
  72282. //
  72283. // Mnemonic : VPMACSWD
  72284. // Supported forms : (2 forms)
  72285. //
  72286. // * VPMACSWD xmm, xmm, xmm, xmm [XOP]
  72287. // * VPMACSWD xmm, m128, xmm, xmm [XOP]
  72288. //
  72289. func (self *Program) VPMACSWD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  72290. p := self.alloc("VPMACSWD", 4, Operands { v0, v1, v2, v3 })
  72291. // VPMACSWD xmm, xmm, xmm, xmm
  72292. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  72293. self.require(ISA_XOP)
  72294. p.domain = DomainAMDSpecific
  72295. p.add(0, func(m *_Encoding, v []interface{}) {
  72296. m.emit(0x8f)
  72297. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  72298. m.emit(0x78 ^ (hlcode(v[2]) << 3))
  72299. m.emit(0x96)
  72300. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  72301. m.emit(hlcode(v[0]) << 4)
  72302. })
  72303. }
  72304. // VPMACSWD xmm, m128, xmm, xmm
  72305. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  72306. self.require(ISA_XOP)
  72307. p.domain = DomainAMDSpecific
  72308. p.add(0, func(m *_Encoding, v []interface{}) {
  72309. m.vex3(0x8f, 0b1000, 0x00, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  72310. m.emit(0x96)
  72311. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  72312. m.emit(hlcode(v[0]) << 4)
  72313. })
  72314. }
  72315. if p.len == 0 {
  72316. panic("invalid operands for VPMACSWD")
  72317. }
  72318. return p
  72319. }
  72320. // VPMACSWW performs "Packed Multiply Accumulate Signed Word to Signed Word".
  72321. //
  72322. // Mnemonic : VPMACSWW
  72323. // Supported forms : (2 forms)
  72324. //
  72325. // * VPMACSWW xmm, xmm, xmm, xmm [XOP]
  72326. // * VPMACSWW xmm, m128, xmm, xmm [XOP]
  72327. //
  72328. func (self *Program) VPMACSWW(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  72329. p := self.alloc("VPMACSWW", 4, Operands { v0, v1, v2, v3 })
  72330. // VPMACSWW xmm, xmm, xmm, xmm
  72331. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  72332. self.require(ISA_XOP)
  72333. p.domain = DomainAMDSpecific
  72334. p.add(0, func(m *_Encoding, v []interface{}) {
  72335. m.emit(0x8f)
  72336. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  72337. m.emit(0x78 ^ (hlcode(v[2]) << 3))
  72338. m.emit(0x95)
  72339. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  72340. m.emit(hlcode(v[0]) << 4)
  72341. })
  72342. }
  72343. // VPMACSWW xmm, m128, xmm, xmm
  72344. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  72345. self.require(ISA_XOP)
  72346. p.domain = DomainAMDSpecific
  72347. p.add(0, func(m *_Encoding, v []interface{}) {
  72348. m.vex3(0x8f, 0b1000, 0x00, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  72349. m.emit(0x95)
  72350. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  72351. m.emit(hlcode(v[0]) << 4)
  72352. })
  72353. }
  72354. if p.len == 0 {
  72355. panic("invalid operands for VPMACSWW")
  72356. }
  72357. return p
  72358. }
  72359. // VPMADCSSWD performs "Packed Multiply Add Accumulate with Saturation Signed Word to Signed Doubleword".
  72360. //
  72361. // Mnemonic : VPMADCSSWD
  72362. // Supported forms : (2 forms)
  72363. //
  72364. // * VPMADCSSWD xmm, xmm, xmm, xmm [XOP]
  72365. // * VPMADCSSWD xmm, m128, xmm, xmm [XOP]
  72366. //
  72367. func (self *Program) VPMADCSSWD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  72368. p := self.alloc("VPMADCSSWD", 4, Operands { v0, v1, v2, v3 })
  72369. // VPMADCSSWD xmm, xmm, xmm, xmm
  72370. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  72371. self.require(ISA_XOP)
  72372. p.domain = DomainAMDSpecific
  72373. p.add(0, func(m *_Encoding, v []interface{}) {
  72374. m.emit(0x8f)
  72375. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  72376. m.emit(0x78 ^ (hlcode(v[2]) << 3))
  72377. m.emit(0xa6)
  72378. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  72379. m.emit(hlcode(v[0]) << 4)
  72380. })
  72381. }
  72382. // VPMADCSSWD xmm, m128, xmm, xmm
  72383. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  72384. self.require(ISA_XOP)
  72385. p.domain = DomainAMDSpecific
  72386. p.add(0, func(m *_Encoding, v []interface{}) {
  72387. m.vex3(0x8f, 0b1000, 0x00, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  72388. m.emit(0xa6)
  72389. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  72390. m.emit(hlcode(v[0]) << 4)
  72391. })
  72392. }
  72393. if p.len == 0 {
  72394. panic("invalid operands for VPMADCSSWD")
  72395. }
  72396. return p
  72397. }
  72398. // VPMADCSWD performs "Packed Multiply Add Accumulate Signed Word to Signed Doubleword".
  72399. //
  72400. // Mnemonic : VPMADCSWD
  72401. // Supported forms : (2 forms)
  72402. //
  72403. // * VPMADCSWD xmm, xmm, xmm, xmm [XOP]
  72404. // * VPMADCSWD xmm, m128, xmm, xmm [XOP]
  72405. //
  72406. func (self *Program) VPMADCSWD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  72407. p := self.alloc("VPMADCSWD", 4, Operands { v0, v1, v2, v3 })
  72408. // VPMADCSWD xmm, xmm, xmm, xmm
  72409. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  72410. self.require(ISA_XOP)
  72411. p.domain = DomainAMDSpecific
  72412. p.add(0, func(m *_Encoding, v []interface{}) {
  72413. m.emit(0x8f)
  72414. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  72415. m.emit(0x78 ^ (hlcode(v[2]) << 3))
  72416. m.emit(0xb6)
  72417. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  72418. m.emit(hlcode(v[0]) << 4)
  72419. })
  72420. }
  72421. // VPMADCSWD xmm, m128, xmm, xmm
  72422. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  72423. self.require(ISA_XOP)
  72424. p.domain = DomainAMDSpecific
  72425. p.add(0, func(m *_Encoding, v []interface{}) {
  72426. m.vex3(0x8f, 0b1000, 0x00, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  72427. m.emit(0xb6)
  72428. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  72429. m.emit(hlcode(v[0]) << 4)
  72430. })
  72431. }
  72432. if p.len == 0 {
  72433. panic("invalid operands for VPMADCSWD")
  72434. }
  72435. return p
  72436. }
  72437. // VPMADD52HUQ performs "Packed Multiply of Unsigned 52-bit Unsigned Integers and Add High 52-bit Products to Quadword Accumulators".
  72438. //
  72439. // Mnemonic : VPMADD52HUQ
  72440. // Supported forms : (6 forms)
  72441. //
  72442. // * VPMADD52HUQ m128/m64bcst, xmm, xmm{k}{z} [AVX512IFMA,AVX512VL]
  72443. // * VPMADD52HUQ xmm, xmm, xmm{k}{z} [AVX512IFMA,AVX512VL]
  72444. // * VPMADD52HUQ m256/m64bcst, ymm, ymm{k}{z} [AVX512IFMA,AVX512VL]
  72445. // * VPMADD52HUQ ymm, ymm, ymm{k}{z} [AVX512IFMA,AVX512VL]
  72446. // * VPMADD52HUQ m512/m64bcst, zmm, zmm{k}{z} [AVX512IFMA]
  72447. // * VPMADD52HUQ zmm, zmm, zmm{k}{z} [AVX512IFMA]
  72448. //
  72449. func (self *Program) VPMADD52HUQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  72450. p := self.alloc("VPMADD52HUQ", 3, Operands { v0, v1, v2 })
  72451. // VPMADD52HUQ m128/m64bcst, xmm, xmm{k}{z}
  72452. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  72453. self.require(ISA_AVX512IFMA | ISA_AVX512VL)
  72454. p.domain = DomainAVX
  72455. p.add(0, func(m *_Encoding, v []interface{}) {
  72456. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  72457. m.emit(0xb5)
  72458. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  72459. })
  72460. }
  72461. // VPMADD52HUQ xmm, xmm, xmm{k}{z}
  72462. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  72463. self.require(ISA_AVX512IFMA | ISA_AVX512VL)
  72464. p.domain = DomainAVX
  72465. p.add(0, func(m *_Encoding, v []interface{}) {
  72466. m.emit(0x62)
  72467. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  72468. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  72469. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  72470. m.emit(0xb5)
  72471. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  72472. })
  72473. }
  72474. // VPMADD52HUQ m256/m64bcst, ymm, ymm{k}{z}
  72475. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  72476. self.require(ISA_AVX512IFMA | ISA_AVX512VL)
  72477. p.domain = DomainAVX
  72478. p.add(0, func(m *_Encoding, v []interface{}) {
  72479. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  72480. m.emit(0xb5)
  72481. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  72482. })
  72483. }
  72484. // VPMADD52HUQ ymm, ymm, ymm{k}{z}
  72485. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  72486. self.require(ISA_AVX512IFMA | ISA_AVX512VL)
  72487. p.domain = DomainAVX
  72488. p.add(0, func(m *_Encoding, v []interface{}) {
  72489. m.emit(0x62)
  72490. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  72491. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  72492. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  72493. m.emit(0xb5)
  72494. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  72495. })
  72496. }
  72497. // VPMADD52HUQ m512/m64bcst, zmm, zmm{k}{z}
  72498. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  72499. self.require(ISA_AVX512IFMA)
  72500. p.domain = DomainAVX
  72501. p.add(0, func(m *_Encoding, v []interface{}) {
  72502. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  72503. m.emit(0xb5)
  72504. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  72505. })
  72506. }
  72507. // VPMADD52HUQ zmm, zmm, zmm{k}{z}
  72508. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  72509. self.require(ISA_AVX512IFMA)
  72510. p.domain = DomainAVX
  72511. p.add(0, func(m *_Encoding, v []interface{}) {
  72512. m.emit(0x62)
  72513. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  72514. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  72515. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  72516. m.emit(0xb5)
  72517. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  72518. })
  72519. }
  72520. if p.len == 0 {
  72521. panic("invalid operands for VPMADD52HUQ")
  72522. }
  72523. return p
  72524. }
  72525. // VPMADD52LUQ performs "Packed Multiply of Unsigned 52-bit Integers and Add the Low 52-bit Products to Quadword Accumulators".
  72526. //
  72527. // Mnemonic : VPMADD52LUQ
  72528. // Supported forms : (6 forms)
  72529. //
  72530. // * VPMADD52LUQ m128/m64bcst, xmm, xmm{k}{z} [AVX512IFMA,AVX512VL]
  72531. // * VPMADD52LUQ xmm, xmm, xmm{k}{z} [AVX512IFMA,AVX512VL]
  72532. // * VPMADD52LUQ m256/m64bcst, ymm, ymm{k}{z} [AVX512IFMA,AVX512VL]
  72533. // * VPMADD52LUQ ymm, ymm, ymm{k}{z} [AVX512IFMA,AVX512VL]
  72534. // * VPMADD52LUQ m512/m64bcst, zmm, zmm{k}{z} [AVX512IFMA]
  72535. // * VPMADD52LUQ zmm, zmm, zmm{k}{z} [AVX512IFMA]
  72536. //
  72537. func (self *Program) VPMADD52LUQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  72538. p := self.alloc("VPMADD52LUQ", 3, Operands { v0, v1, v2 })
  72539. // VPMADD52LUQ m128/m64bcst, xmm, xmm{k}{z}
  72540. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  72541. self.require(ISA_AVX512IFMA | ISA_AVX512VL)
  72542. p.domain = DomainAVX
  72543. p.add(0, func(m *_Encoding, v []interface{}) {
  72544. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  72545. m.emit(0xb4)
  72546. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  72547. })
  72548. }
  72549. // VPMADD52LUQ xmm, xmm, xmm{k}{z}
  72550. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  72551. self.require(ISA_AVX512IFMA | ISA_AVX512VL)
  72552. p.domain = DomainAVX
  72553. p.add(0, func(m *_Encoding, v []interface{}) {
  72554. m.emit(0x62)
  72555. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  72556. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  72557. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  72558. m.emit(0xb4)
  72559. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  72560. })
  72561. }
  72562. // VPMADD52LUQ m256/m64bcst, ymm, ymm{k}{z}
  72563. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  72564. self.require(ISA_AVX512IFMA | ISA_AVX512VL)
  72565. p.domain = DomainAVX
  72566. p.add(0, func(m *_Encoding, v []interface{}) {
  72567. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  72568. m.emit(0xb4)
  72569. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  72570. })
  72571. }
  72572. // VPMADD52LUQ ymm, ymm, ymm{k}{z}
  72573. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  72574. self.require(ISA_AVX512IFMA | ISA_AVX512VL)
  72575. p.domain = DomainAVX
  72576. p.add(0, func(m *_Encoding, v []interface{}) {
  72577. m.emit(0x62)
  72578. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  72579. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  72580. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  72581. m.emit(0xb4)
  72582. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  72583. })
  72584. }
  72585. // VPMADD52LUQ m512/m64bcst, zmm, zmm{k}{z}
  72586. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  72587. self.require(ISA_AVX512IFMA)
  72588. p.domain = DomainAVX
  72589. p.add(0, func(m *_Encoding, v []interface{}) {
  72590. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  72591. m.emit(0xb4)
  72592. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  72593. })
  72594. }
  72595. // VPMADD52LUQ zmm, zmm, zmm{k}{z}
  72596. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  72597. self.require(ISA_AVX512IFMA)
  72598. p.domain = DomainAVX
  72599. p.add(0, func(m *_Encoding, v []interface{}) {
  72600. m.emit(0x62)
  72601. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  72602. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  72603. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  72604. m.emit(0xb4)
  72605. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  72606. })
  72607. }
  72608. if p.len == 0 {
  72609. panic("invalid operands for VPMADD52LUQ")
  72610. }
  72611. return p
  72612. }
  72613. // VPMADDUBSW performs "Multiply and Add Packed Signed and Unsigned Byte Integers".
  72614. //
  72615. // Mnemonic : VPMADDUBSW
  72616. // Supported forms : (10 forms)
  72617. //
  72618. // * VPMADDUBSW xmm, xmm, xmm [AVX]
  72619. // * VPMADDUBSW m128, xmm, xmm [AVX]
  72620. // * VPMADDUBSW ymm, ymm, ymm [AVX2]
  72621. // * VPMADDUBSW m256, ymm, ymm [AVX2]
  72622. // * VPMADDUBSW zmm, zmm, zmm{k}{z} [AVX512BW]
  72623. // * VPMADDUBSW m512, zmm, zmm{k}{z} [AVX512BW]
  72624. // * VPMADDUBSW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  72625. // * VPMADDUBSW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  72626. // * VPMADDUBSW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  72627. // * VPMADDUBSW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  72628. //
  72629. func (self *Program) VPMADDUBSW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  72630. p := self.alloc("VPMADDUBSW", 3, Operands { v0, v1, v2 })
  72631. // VPMADDUBSW xmm, xmm, xmm
  72632. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  72633. self.require(ISA_AVX)
  72634. p.domain = DomainAVX
  72635. p.add(0, func(m *_Encoding, v []interface{}) {
  72636. m.emit(0xc4)
  72637. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  72638. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  72639. m.emit(0x04)
  72640. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  72641. })
  72642. }
  72643. // VPMADDUBSW m128, xmm, xmm
  72644. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  72645. self.require(ISA_AVX)
  72646. p.domain = DomainAVX
  72647. p.add(0, func(m *_Encoding, v []interface{}) {
  72648. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  72649. m.emit(0x04)
  72650. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  72651. })
  72652. }
  72653. // VPMADDUBSW ymm, ymm, ymm
  72654. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  72655. self.require(ISA_AVX2)
  72656. p.domain = DomainAVX
  72657. p.add(0, func(m *_Encoding, v []interface{}) {
  72658. m.emit(0xc4)
  72659. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  72660. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  72661. m.emit(0x04)
  72662. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  72663. })
  72664. }
  72665. // VPMADDUBSW m256, ymm, ymm
  72666. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  72667. self.require(ISA_AVX2)
  72668. p.domain = DomainAVX
  72669. p.add(0, func(m *_Encoding, v []interface{}) {
  72670. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  72671. m.emit(0x04)
  72672. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  72673. })
  72674. }
  72675. // VPMADDUBSW zmm, zmm, zmm{k}{z}
  72676. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  72677. self.require(ISA_AVX512BW)
  72678. p.domain = DomainAVX
  72679. p.add(0, func(m *_Encoding, v []interface{}) {
  72680. m.emit(0x62)
  72681. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  72682. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  72683. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  72684. m.emit(0x04)
  72685. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  72686. })
  72687. }
  72688. // VPMADDUBSW m512, zmm, zmm{k}{z}
  72689. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  72690. self.require(ISA_AVX512BW)
  72691. p.domain = DomainAVX
  72692. p.add(0, func(m *_Encoding, v []interface{}) {
  72693. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  72694. m.emit(0x04)
  72695. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  72696. })
  72697. }
  72698. // VPMADDUBSW xmm, xmm, xmm{k}{z}
  72699. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  72700. self.require(ISA_AVX512VL | ISA_AVX512BW)
  72701. p.domain = DomainAVX
  72702. p.add(0, func(m *_Encoding, v []interface{}) {
  72703. m.emit(0x62)
  72704. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  72705. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  72706. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  72707. m.emit(0x04)
  72708. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  72709. })
  72710. }
  72711. // VPMADDUBSW m128, xmm, xmm{k}{z}
  72712. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  72713. self.require(ISA_AVX512VL | ISA_AVX512BW)
  72714. p.domain = DomainAVX
  72715. p.add(0, func(m *_Encoding, v []interface{}) {
  72716. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  72717. m.emit(0x04)
  72718. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  72719. })
  72720. }
  72721. // VPMADDUBSW ymm, ymm, ymm{k}{z}
  72722. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  72723. self.require(ISA_AVX512VL | ISA_AVX512BW)
  72724. p.domain = DomainAVX
  72725. p.add(0, func(m *_Encoding, v []interface{}) {
  72726. m.emit(0x62)
  72727. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  72728. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  72729. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  72730. m.emit(0x04)
  72731. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  72732. })
  72733. }
  72734. // VPMADDUBSW m256, ymm, ymm{k}{z}
  72735. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  72736. self.require(ISA_AVX512VL | ISA_AVX512BW)
  72737. p.domain = DomainAVX
  72738. p.add(0, func(m *_Encoding, v []interface{}) {
  72739. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  72740. m.emit(0x04)
  72741. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  72742. })
  72743. }
  72744. if p.len == 0 {
  72745. panic("invalid operands for VPMADDUBSW")
  72746. }
  72747. return p
  72748. }
  72749. // VPMADDWD performs "Multiply and Add Packed Signed Word Integers".
  72750. //
  72751. // Mnemonic : VPMADDWD
  72752. // Supported forms : (10 forms)
  72753. //
  72754. // * VPMADDWD xmm, xmm, xmm [AVX]
  72755. // * VPMADDWD m128, xmm, xmm [AVX]
  72756. // * VPMADDWD ymm, ymm, ymm [AVX2]
  72757. // * VPMADDWD m256, ymm, ymm [AVX2]
  72758. // * VPMADDWD zmm, zmm, zmm{k}{z} [AVX512BW]
  72759. // * VPMADDWD m512, zmm, zmm{k}{z} [AVX512BW]
  72760. // * VPMADDWD xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  72761. // * VPMADDWD m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  72762. // * VPMADDWD ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  72763. // * VPMADDWD m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  72764. //
  72765. func (self *Program) VPMADDWD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  72766. p := self.alloc("VPMADDWD", 3, Operands { v0, v1, v2 })
  72767. // VPMADDWD xmm, xmm, xmm
  72768. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  72769. self.require(ISA_AVX)
  72770. p.domain = DomainAVX
  72771. p.add(0, func(m *_Encoding, v []interface{}) {
  72772. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  72773. m.emit(0xf5)
  72774. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  72775. })
  72776. }
  72777. // VPMADDWD m128, xmm, xmm
  72778. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  72779. self.require(ISA_AVX)
  72780. p.domain = DomainAVX
  72781. p.add(0, func(m *_Encoding, v []interface{}) {
  72782. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  72783. m.emit(0xf5)
  72784. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  72785. })
  72786. }
  72787. // VPMADDWD ymm, ymm, ymm
  72788. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  72789. self.require(ISA_AVX2)
  72790. p.domain = DomainAVX
  72791. p.add(0, func(m *_Encoding, v []interface{}) {
  72792. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  72793. m.emit(0xf5)
  72794. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  72795. })
  72796. }
  72797. // VPMADDWD m256, ymm, ymm
  72798. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  72799. self.require(ISA_AVX2)
  72800. p.domain = DomainAVX
  72801. p.add(0, func(m *_Encoding, v []interface{}) {
  72802. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  72803. m.emit(0xf5)
  72804. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  72805. })
  72806. }
  72807. // VPMADDWD zmm, zmm, zmm{k}{z}
  72808. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  72809. self.require(ISA_AVX512BW)
  72810. p.domain = DomainAVX
  72811. p.add(0, func(m *_Encoding, v []interface{}) {
  72812. m.emit(0x62)
  72813. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  72814. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  72815. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  72816. m.emit(0xf5)
  72817. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  72818. })
  72819. }
  72820. // VPMADDWD m512, zmm, zmm{k}{z}
  72821. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  72822. self.require(ISA_AVX512BW)
  72823. p.domain = DomainAVX
  72824. p.add(0, func(m *_Encoding, v []interface{}) {
  72825. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  72826. m.emit(0xf5)
  72827. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  72828. })
  72829. }
  72830. // VPMADDWD xmm, xmm, xmm{k}{z}
  72831. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  72832. self.require(ISA_AVX512VL | ISA_AVX512BW)
  72833. p.domain = DomainAVX
  72834. p.add(0, func(m *_Encoding, v []interface{}) {
  72835. m.emit(0x62)
  72836. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  72837. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  72838. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  72839. m.emit(0xf5)
  72840. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  72841. })
  72842. }
  72843. // VPMADDWD m128, xmm, xmm{k}{z}
  72844. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  72845. self.require(ISA_AVX512VL | ISA_AVX512BW)
  72846. p.domain = DomainAVX
  72847. p.add(0, func(m *_Encoding, v []interface{}) {
  72848. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  72849. m.emit(0xf5)
  72850. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  72851. })
  72852. }
  72853. // VPMADDWD ymm, ymm, ymm{k}{z}
  72854. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  72855. self.require(ISA_AVX512VL | ISA_AVX512BW)
  72856. p.domain = DomainAVX
  72857. p.add(0, func(m *_Encoding, v []interface{}) {
  72858. m.emit(0x62)
  72859. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  72860. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  72861. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  72862. m.emit(0xf5)
  72863. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  72864. })
  72865. }
  72866. // VPMADDWD m256, ymm, ymm{k}{z}
  72867. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  72868. self.require(ISA_AVX512VL | ISA_AVX512BW)
  72869. p.domain = DomainAVX
  72870. p.add(0, func(m *_Encoding, v []interface{}) {
  72871. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  72872. m.emit(0xf5)
  72873. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  72874. })
  72875. }
  72876. if p.len == 0 {
  72877. panic("invalid operands for VPMADDWD")
  72878. }
  72879. return p
  72880. }
  72881. // VPMASKMOVD performs "Conditional Move Packed Doubleword Integers".
  72882. //
  72883. // Mnemonic : VPMASKMOVD
  72884. // Supported forms : (4 forms)
  72885. //
  72886. // * VPMASKMOVD m128, xmm, xmm [AVX2]
  72887. // * VPMASKMOVD m256, ymm, ymm [AVX2]
  72888. // * VPMASKMOVD xmm, xmm, m128 [AVX2]
  72889. // * VPMASKMOVD ymm, ymm, m256 [AVX2]
  72890. //
  72891. func (self *Program) VPMASKMOVD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  72892. p := self.alloc("VPMASKMOVD", 3, Operands { v0, v1, v2 })
  72893. // VPMASKMOVD m128, xmm, xmm
  72894. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  72895. self.require(ISA_AVX2)
  72896. p.domain = DomainAVX
  72897. p.add(0, func(m *_Encoding, v []interface{}) {
  72898. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  72899. m.emit(0x8c)
  72900. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  72901. })
  72902. }
  72903. // VPMASKMOVD m256, ymm, ymm
  72904. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  72905. self.require(ISA_AVX2)
  72906. p.domain = DomainAVX
  72907. p.add(0, func(m *_Encoding, v []interface{}) {
  72908. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  72909. m.emit(0x8c)
  72910. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  72911. })
  72912. }
  72913. // VPMASKMOVD xmm, xmm, m128
  72914. if isXMM(v0) && isXMM(v1) && isM128(v2) {
  72915. self.require(ISA_AVX2)
  72916. p.domain = DomainAVX
  72917. p.add(0, func(m *_Encoding, v []interface{}) {
  72918. m.vex3(0xc4, 0b10, 0x01, hcode(v[0]), addr(v[2]), hlcode(v[1]))
  72919. m.emit(0x8e)
  72920. m.mrsd(lcode(v[0]), addr(v[2]), 1)
  72921. })
  72922. }
  72923. // VPMASKMOVD ymm, ymm, m256
  72924. if isYMM(v0) && isYMM(v1) && isM256(v2) {
  72925. self.require(ISA_AVX2)
  72926. p.domain = DomainAVX
  72927. p.add(0, func(m *_Encoding, v []interface{}) {
  72928. m.vex3(0xc4, 0b10, 0x05, hcode(v[0]), addr(v[2]), hlcode(v[1]))
  72929. m.emit(0x8e)
  72930. m.mrsd(lcode(v[0]), addr(v[2]), 1)
  72931. })
  72932. }
  72933. if p.len == 0 {
  72934. panic("invalid operands for VPMASKMOVD")
  72935. }
  72936. return p
  72937. }
  72938. // VPMASKMOVQ performs "Conditional Move Packed Quadword Integers".
  72939. //
  72940. // Mnemonic : VPMASKMOVQ
  72941. // Supported forms : (4 forms)
  72942. //
  72943. // * VPMASKMOVQ m128, xmm, xmm [AVX2]
  72944. // * VPMASKMOVQ m256, ymm, ymm [AVX2]
  72945. // * VPMASKMOVQ xmm, xmm, m128 [AVX2]
  72946. // * VPMASKMOVQ ymm, ymm, m256 [AVX2]
  72947. //
  72948. func (self *Program) VPMASKMOVQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  72949. p := self.alloc("VPMASKMOVQ", 3, Operands { v0, v1, v2 })
  72950. // VPMASKMOVQ m128, xmm, xmm
  72951. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  72952. self.require(ISA_AVX2)
  72953. p.domain = DomainAVX
  72954. p.add(0, func(m *_Encoding, v []interface{}) {
  72955. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  72956. m.emit(0x8c)
  72957. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  72958. })
  72959. }
  72960. // VPMASKMOVQ m256, ymm, ymm
  72961. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  72962. self.require(ISA_AVX2)
  72963. p.domain = DomainAVX
  72964. p.add(0, func(m *_Encoding, v []interface{}) {
  72965. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  72966. m.emit(0x8c)
  72967. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  72968. })
  72969. }
  72970. // VPMASKMOVQ xmm, xmm, m128
  72971. if isXMM(v0) && isXMM(v1) && isM128(v2) {
  72972. self.require(ISA_AVX2)
  72973. p.domain = DomainAVX
  72974. p.add(0, func(m *_Encoding, v []interface{}) {
  72975. m.vex3(0xc4, 0b10, 0x81, hcode(v[0]), addr(v[2]), hlcode(v[1]))
  72976. m.emit(0x8e)
  72977. m.mrsd(lcode(v[0]), addr(v[2]), 1)
  72978. })
  72979. }
  72980. // VPMASKMOVQ ymm, ymm, m256
  72981. if isYMM(v0) && isYMM(v1) && isM256(v2) {
  72982. self.require(ISA_AVX2)
  72983. p.domain = DomainAVX
  72984. p.add(0, func(m *_Encoding, v []interface{}) {
  72985. m.vex3(0xc4, 0b10, 0x85, hcode(v[0]), addr(v[2]), hlcode(v[1]))
  72986. m.emit(0x8e)
  72987. m.mrsd(lcode(v[0]), addr(v[2]), 1)
  72988. })
  72989. }
  72990. if p.len == 0 {
  72991. panic("invalid operands for VPMASKMOVQ")
  72992. }
  72993. return p
  72994. }
  72995. // VPMAXSB performs "Maximum of Packed Signed Byte Integers".
  72996. //
  72997. // Mnemonic : VPMAXSB
  72998. // Supported forms : (10 forms)
  72999. //
  73000. // * VPMAXSB xmm, xmm, xmm [AVX]
  73001. // * VPMAXSB m128, xmm, xmm [AVX]
  73002. // * VPMAXSB ymm, ymm, ymm [AVX2]
  73003. // * VPMAXSB m256, ymm, ymm [AVX2]
  73004. // * VPMAXSB zmm, zmm, zmm{k}{z} [AVX512BW]
  73005. // * VPMAXSB m512, zmm, zmm{k}{z} [AVX512BW]
  73006. // * VPMAXSB xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  73007. // * VPMAXSB m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  73008. // * VPMAXSB ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  73009. // * VPMAXSB m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  73010. //
  73011. func (self *Program) VPMAXSB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  73012. p := self.alloc("VPMAXSB", 3, Operands { v0, v1, v2 })
  73013. // VPMAXSB xmm, xmm, xmm
  73014. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  73015. self.require(ISA_AVX)
  73016. p.domain = DomainAVX
  73017. p.add(0, func(m *_Encoding, v []interface{}) {
  73018. m.emit(0xc4)
  73019. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  73020. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  73021. m.emit(0x3c)
  73022. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73023. })
  73024. }
  73025. // VPMAXSB m128, xmm, xmm
  73026. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  73027. self.require(ISA_AVX)
  73028. p.domain = DomainAVX
  73029. p.add(0, func(m *_Encoding, v []interface{}) {
  73030. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  73031. m.emit(0x3c)
  73032. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  73033. })
  73034. }
  73035. // VPMAXSB ymm, ymm, ymm
  73036. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  73037. self.require(ISA_AVX2)
  73038. p.domain = DomainAVX
  73039. p.add(0, func(m *_Encoding, v []interface{}) {
  73040. m.emit(0xc4)
  73041. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  73042. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  73043. m.emit(0x3c)
  73044. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73045. })
  73046. }
  73047. // VPMAXSB m256, ymm, ymm
  73048. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  73049. self.require(ISA_AVX2)
  73050. p.domain = DomainAVX
  73051. p.add(0, func(m *_Encoding, v []interface{}) {
  73052. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  73053. m.emit(0x3c)
  73054. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  73055. })
  73056. }
  73057. // VPMAXSB zmm, zmm, zmm{k}{z}
  73058. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  73059. self.require(ISA_AVX512BW)
  73060. p.domain = DomainAVX
  73061. p.add(0, func(m *_Encoding, v []interface{}) {
  73062. m.emit(0x62)
  73063. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73064. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  73065. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  73066. m.emit(0x3c)
  73067. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73068. })
  73069. }
  73070. // VPMAXSB m512, zmm, zmm{k}{z}
  73071. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  73072. self.require(ISA_AVX512BW)
  73073. p.domain = DomainAVX
  73074. p.add(0, func(m *_Encoding, v []interface{}) {
  73075. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  73076. m.emit(0x3c)
  73077. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  73078. })
  73079. }
  73080. // VPMAXSB xmm, xmm, xmm{k}{z}
  73081. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  73082. self.require(ISA_AVX512VL | ISA_AVX512BW)
  73083. p.domain = DomainAVX
  73084. p.add(0, func(m *_Encoding, v []interface{}) {
  73085. m.emit(0x62)
  73086. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73087. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  73088. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  73089. m.emit(0x3c)
  73090. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73091. })
  73092. }
  73093. // VPMAXSB m128, xmm, xmm{k}{z}
  73094. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  73095. self.require(ISA_AVX512VL | ISA_AVX512BW)
  73096. p.domain = DomainAVX
  73097. p.add(0, func(m *_Encoding, v []interface{}) {
  73098. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  73099. m.emit(0x3c)
  73100. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  73101. })
  73102. }
  73103. // VPMAXSB ymm, ymm, ymm{k}{z}
  73104. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  73105. self.require(ISA_AVX512VL | ISA_AVX512BW)
  73106. p.domain = DomainAVX
  73107. p.add(0, func(m *_Encoding, v []interface{}) {
  73108. m.emit(0x62)
  73109. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73110. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  73111. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  73112. m.emit(0x3c)
  73113. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73114. })
  73115. }
  73116. // VPMAXSB m256, ymm, ymm{k}{z}
  73117. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  73118. self.require(ISA_AVX512VL | ISA_AVX512BW)
  73119. p.domain = DomainAVX
  73120. p.add(0, func(m *_Encoding, v []interface{}) {
  73121. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  73122. m.emit(0x3c)
  73123. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  73124. })
  73125. }
  73126. if p.len == 0 {
  73127. panic("invalid operands for VPMAXSB")
  73128. }
  73129. return p
  73130. }
  73131. // VPMAXSD performs "Maximum of Packed Signed Doubleword Integers".
  73132. //
  73133. // Mnemonic : VPMAXSD
  73134. // Supported forms : (10 forms)
  73135. //
  73136. // * VPMAXSD xmm, xmm, xmm [AVX]
  73137. // * VPMAXSD m128, xmm, xmm [AVX]
  73138. // * VPMAXSD ymm, ymm, ymm [AVX2]
  73139. // * VPMAXSD m256, ymm, ymm [AVX2]
  73140. // * VPMAXSD m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  73141. // * VPMAXSD zmm, zmm, zmm{k}{z} [AVX512F]
  73142. // * VPMAXSD m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  73143. // * VPMAXSD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  73144. // * VPMAXSD m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  73145. // * VPMAXSD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  73146. //
  73147. func (self *Program) VPMAXSD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  73148. p := self.alloc("VPMAXSD", 3, Operands { v0, v1, v2 })
  73149. // VPMAXSD xmm, xmm, xmm
  73150. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  73151. self.require(ISA_AVX)
  73152. p.domain = DomainAVX
  73153. p.add(0, func(m *_Encoding, v []interface{}) {
  73154. m.emit(0xc4)
  73155. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  73156. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  73157. m.emit(0x3d)
  73158. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73159. })
  73160. }
  73161. // VPMAXSD m128, xmm, xmm
  73162. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  73163. self.require(ISA_AVX)
  73164. p.domain = DomainAVX
  73165. p.add(0, func(m *_Encoding, v []interface{}) {
  73166. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  73167. m.emit(0x3d)
  73168. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  73169. })
  73170. }
  73171. // VPMAXSD ymm, ymm, ymm
  73172. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  73173. self.require(ISA_AVX2)
  73174. p.domain = DomainAVX
  73175. p.add(0, func(m *_Encoding, v []interface{}) {
  73176. m.emit(0xc4)
  73177. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  73178. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  73179. m.emit(0x3d)
  73180. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73181. })
  73182. }
  73183. // VPMAXSD m256, ymm, ymm
  73184. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  73185. self.require(ISA_AVX2)
  73186. p.domain = DomainAVX
  73187. p.add(0, func(m *_Encoding, v []interface{}) {
  73188. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  73189. m.emit(0x3d)
  73190. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  73191. })
  73192. }
  73193. // VPMAXSD m512/m32bcst, zmm, zmm{k}{z}
  73194. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  73195. self.require(ISA_AVX512F)
  73196. p.domain = DomainAVX
  73197. p.add(0, func(m *_Encoding, v []interface{}) {
  73198. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  73199. m.emit(0x3d)
  73200. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  73201. })
  73202. }
  73203. // VPMAXSD zmm, zmm, zmm{k}{z}
  73204. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  73205. self.require(ISA_AVX512F)
  73206. p.domain = DomainAVX
  73207. p.add(0, func(m *_Encoding, v []interface{}) {
  73208. m.emit(0x62)
  73209. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73210. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  73211. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  73212. m.emit(0x3d)
  73213. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73214. })
  73215. }
  73216. // VPMAXSD m128/m32bcst, xmm, xmm{k}{z}
  73217. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  73218. self.require(ISA_AVX512VL | ISA_AVX512F)
  73219. p.domain = DomainAVX
  73220. p.add(0, func(m *_Encoding, v []interface{}) {
  73221. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  73222. m.emit(0x3d)
  73223. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  73224. })
  73225. }
  73226. // VPMAXSD xmm, xmm, xmm{k}{z}
  73227. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  73228. self.require(ISA_AVX512VL | ISA_AVX512F)
  73229. p.domain = DomainAVX
  73230. p.add(0, func(m *_Encoding, v []interface{}) {
  73231. m.emit(0x62)
  73232. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73233. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  73234. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  73235. m.emit(0x3d)
  73236. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73237. })
  73238. }
  73239. // VPMAXSD m256/m32bcst, ymm, ymm{k}{z}
  73240. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  73241. self.require(ISA_AVX512VL | ISA_AVX512F)
  73242. p.domain = DomainAVX
  73243. p.add(0, func(m *_Encoding, v []interface{}) {
  73244. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  73245. m.emit(0x3d)
  73246. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  73247. })
  73248. }
  73249. // VPMAXSD ymm, ymm, ymm{k}{z}
  73250. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  73251. self.require(ISA_AVX512VL | ISA_AVX512F)
  73252. p.domain = DomainAVX
  73253. p.add(0, func(m *_Encoding, v []interface{}) {
  73254. m.emit(0x62)
  73255. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73256. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  73257. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  73258. m.emit(0x3d)
  73259. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73260. })
  73261. }
  73262. if p.len == 0 {
  73263. panic("invalid operands for VPMAXSD")
  73264. }
  73265. return p
  73266. }
  73267. // VPMAXSQ performs "Maximum of Packed Signed Quadword Integers".
  73268. //
  73269. // Mnemonic : VPMAXSQ
  73270. // Supported forms : (6 forms)
  73271. //
  73272. // * VPMAXSQ m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  73273. // * VPMAXSQ zmm, zmm, zmm{k}{z} [AVX512F]
  73274. // * VPMAXSQ m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  73275. // * VPMAXSQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  73276. // * VPMAXSQ m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  73277. // * VPMAXSQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  73278. //
  73279. func (self *Program) VPMAXSQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  73280. p := self.alloc("VPMAXSQ", 3, Operands { v0, v1, v2 })
  73281. // VPMAXSQ m512/m64bcst, zmm, zmm{k}{z}
  73282. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  73283. self.require(ISA_AVX512F)
  73284. p.domain = DomainAVX
  73285. p.add(0, func(m *_Encoding, v []interface{}) {
  73286. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  73287. m.emit(0x3d)
  73288. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  73289. })
  73290. }
  73291. // VPMAXSQ zmm, zmm, zmm{k}{z}
  73292. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  73293. self.require(ISA_AVX512F)
  73294. p.domain = DomainAVX
  73295. p.add(0, func(m *_Encoding, v []interface{}) {
  73296. m.emit(0x62)
  73297. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73298. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  73299. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  73300. m.emit(0x3d)
  73301. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73302. })
  73303. }
  73304. // VPMAXSQ m128/m64bcst, xmm, xmm{k}{z}
  73305. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  73306. self.require(ISA_AVX512VL | ISA_AVX512F)
  73307. p.domain = DomainAVX
  73308. p.add(0, func(m *_Encoding, v []interface{}) {
  73309. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  73310. m.emit(0x3d)
  73311. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  73312. })
  73313. }
  73314. // VPMAXSQ xmm, xmm, xmm{k}{z}
  73315. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  73316. self.require(ISA_AVX512VL | ISA_AVX512F)
  73317. p.domain = DomainAVX
  73318. p.add(0, func(m *_Encoding, v []interface{}) {
  73319. m.emit(0x62)
  73320. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73321. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  73322. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  73323. m.emit(0x3d)
  73324. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73325. })
  73326. }
  73327. // VPMAXSQ m256/m64bcst, ymm, ymm{k}{z}
  73328. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  73329. self.require(ISA_AVX512VL | ISA_AVX512F)
  73330. p.domain = DomainAVX
  73331. p.add(0, func(m *_Encoding, v []interface{}) {
  73332. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  73333. m.emit(0x3d)
  73334. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  73335. })
  73336. }
  73337. // VPMAXSQ ymm, ymm, ymm{k}{z}
  73338. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  73339. self.require(ISA_AVX512VL | ISA_AVX512F)
  73340. p.domain = DomainAVX
  73341. p.add(0, func(m *_Encoding, v []interface{}) {
  73342. m.emit(0x62)
  73343. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73344. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  73345. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  73346. m.emit(0x3d)
  73347. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73348. })
  73349. }
  73350. if p.len == 0 {
  73351. panic("invalid operands for VPMAXSQ")
  73352. }
  73353. return p
  73354. }
  73355. // VPMAXSW performs "Maximum of Packed Signed Word Integers".
  73356. //
  73357. // Mnemonic : VPMAXSW
  73358. // Supported forms : (10 forms)
  73359. //
  73360. // * VPMAXSW xmm, xmm, xmm [AVX]
  73361. // * VPMAXSW m128, xmm, xmm [AVX]
  73362. // * VPMAXSW ymm, ymm, ymm [AVX2]
  73363. // * VPMAXSW m256, ymm, ymm [AVX2]
  73364. // * VPMAXSW zmm, zmm, zmm{k}{z} [AVX512BW]
  73365. // * VPMAXSW m512, zmm, zmm{k}{z} [AVX512BW]
  73366. // * VPMAXSW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  73367. // * VPMAXSW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  73368. // * VPMAXSW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  73369. // * VPMAXSW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  73370. //
  73371. func (self *Program) VPMAXSW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  73372. p := self.alloc("VPMAXSW", 3, Operands { v0, v1, v2 })
  73373. // VPMAXSW xmm, xmm, xmm
  73374. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  73375. self.require(ISA_AVX)
  73376. p.domain = DomainAVX
  73377. p.add(0, func(m *_Encoding, v []interface{}) {
  73378. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  73379. m.emit(0xee)
  73380. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73381. })
  73382. }
  73383. // VPMAXSW m128, xmm, xmm
  73384. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  73385. self.require(ISA_AVX)
  73386. p.domain = DomainAVX
  73387. p.add(0, func(m *_Encoding, v []interface{}) {
  73388. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  73389. m.emit(0xee)
  73390. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  73391. })
  73392. }
  73393. // VPMAXSW ymm, ymm, ymm
  73394. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  73395. self.require(ISA_AVX2)
  73396. p.domain = DomainAVX
  73397. p.add(0, func(m *_Encoding, v []interface{}) {
  73398. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  73399. m.emit(0xee)
  73400. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73401. })
  73402. }
  73403. // VPMAXSW m256, ymm, ymm
  73404. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  73405. self.require(ISA_AVX2)
  73406. p.domain = DomainAVX
  73407. p.add(0, func(m *_Encoding, v []interface{}) {
  73408. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  73409. m.emit(0xee)
  73410. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  73411. })
  73412. }
  73413. // VPMAXSW zmm, zmm, zmm{k}{z}
  73414. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  73415. self.require(ISA_AVX512BW)
  73416. p.domain = DomainAVX
  73417. p.add(0, func(m *_Encoding, v []interface{}) {
  73418. m.emit(0x62)
  73419. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73420. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  73421. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  73422. m.emit(0xee)
  73423. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73424. })
  73425. }
  73426. // VPMAXSW m512, zmm, zmm{k}{z}
  73427. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  73428. self.require(ISA_AVX512BW)
  73429. p.domain = DomainAVX
  73430. p.add(0, func(m *_Encoding, v []interface{}) {
  73431. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  73432. m.emit(0xee)
  73433. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  73434. })
  73435. }
  73436. // VPMAXSW xmm, xmm, xmm{k}{z}
  73437. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  73438. self.require(ISA_AVX512VL | ISA_AVX512BW)
  73439. p.domain = DomainAVX
  73440. p.add(0, func(m *_Encoding, v []interface{}) {
  73441. m.emit(0x62)
  73442. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73443. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  73444. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  73445. m.emit(0xee)
  73446. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73447. })
  73448. }
  73449. // VPMAXSW m128, xmm, xmm{k}{z}
  73450. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  73451. self.require(ISA_AVX512VL | ISA_AVX512BW)
  73452. p.domain = DomainAVX
  73453. p.add(0, func(m *_Encoding, v []interface{}) {
  73454. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  73455. m.emit(0xee)
  73456. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  73457. })
  73458. }
  73459. // VPMAXSW ymm, ymm, ymm{k}{z}
  73460. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  73461. self.require(ISA_AVX512VL | ISA_AVX512BW)
  73462. p.domain = DomainAVX
  73463. p.add(0, func(m *_Encoding, v []interface{}) {
  73464. m.emit(0x62)
  73465. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73466. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  73467. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  73468. m.emit(0xee)
  73469. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73470. })
  73471. }
  73472. // VPMAXSW m256, ymm, ymm{k}{z}
  73473. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  73474. self.require(ISA_AVX512VL | ISA_AVX512BW)
  73475. p.domain = DomainAVX
  73476. p.add(0, func(m *_Encoding, v []interface{}) {
  73477. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  73478. m.emit(0xee)
  73479. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  73480. })
  73481. }
  73482. if p.len == 0 {
  73483. panic("invalid operands for VPMAXSW")
  73484. }
  73485. return p
  73486. }
  73487. // VPMAXUB performs "Maximum of Packed Unsigned Byte Integers".
  73488. //
  73489. // Mnemonic : VPMAXUB
  73490. // Supported forms : (10 forms)
  73491. //
  73492. // * VPMAXUB xmm, xmm, xmm [AVX]
  73493. // * VPMAXUB m128, xmm, xmm [AVX]
  73494. // * VPMAXUB ymm, ymm, ymm [AVX2]
  73495. // * VPMAXUB m256, ymm, ymm [AVX2]
  73496. // * VPMAXUB zmm, zmm, zmm{k}{z} [AVX512BW]
  73497. // * VPMAXUB m512, zmm, zmm{k}{z} [AVX512BW]
  73498. // * VPMAXUB xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  73499. // * VPMAXUB m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  73500. // * VPMAXUB ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  73501. // * VPMAXUB m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  73502. //
  73503. func (self *Program) VPMAXUB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  73504. p := self.alloc("VPMAXUB", 3, Operands { v0, v1, v2 })
  73505. // VPMAXUB xmm, xmm, xmm
  73506. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  73507. self.require(ISA_AVX)
  73508. p.domain = DomainAVX
  73509. p.add(0, func(m *_Encoding, v []interface{}) {
  73510. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  73511. m.emit(0xde)
  73512. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73513. })
  73514. }
  73515. // VPMAXUB m128, xmm, xmm
  73516. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  73517. self.require(ISA_AVX)
  73518. p.domain = DomainAVX
  73519. p.add(0, func(m *_Encoding, v []interface{}) {
  73520. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  73521. m.emit(0xde)
  73522. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  73523. })
  73524. }
  73525. // VPMAXUB ymm, ymm, ymm
  73526. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  73527. self.require(ISA_AVX2)
  73528. p.domain = DomainAVX
  73529. p.add(0, func(m *_Encoding, v []interface{}) {
  73530. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  73531. m.emit(0xde)
  73532. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73533. })
  73534. }
  73535. // VPMAXUB m256, ymm, ymm
  73536. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  73537. self.require(ISA_AVX2)
  73538. p.domain = DomainAVX
  73539. p.add(0, func(m *_Encoding, v []interface{}) {
  73540. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  73541. m.emit(0xde)
  73542. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  73543. })
  73544. }
  73545. // VPMAXUB zmm, zmm, zmm{k}{z}
  73546. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  73547. self.require(ISA_AVX512BW)
  73548. p.domain = DomainAVX
  73549. p.add(0, func(m *_Encoding, v []interface{}) {
  73550. m.emit(0x62)
  73551. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73552. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  73553. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  73554. m.emit(0xde)
  73555. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73556. })
  73557. }
  73558. // VPMAXUB m512, zmm, zmm{k}{z}
  73559. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  73560. self.require(ISA_AVX512BW)
  73561. p.domain = DomainAVX
  73562. p.add(0, func(m *_Encoding, v []interface{}) {
  73563. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  73564. m.emit(0xde)
  73565. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  73566. })
  73567. }
  73568. // VPMAXUB xmm, xmm, xmm{k}{z}
  73569. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  73570. self.require(ISA_AVX512VL | ISA_AVX512BW)
  73571. p.domain = DomainAVX
  73572. p.add(0, func(m *_Encoding, v []interface{}) {
  73573. m.emit(0x62)
  73574. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73575. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  73576. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  73577. m.emit(0xde)
  73578. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73579. })
  73580. }
  73581. // VPMAXUB m128, xmm, xmm{k}{z}
  73582. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  73583. self.require(ISA_AVX512VL | ISA_AVX512BW)
  73584. p.domain = DomainAVX
  73585. p.add(0, func(m *_Encoding, v []interface{}) {
  73586. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  73587. m.emit(0xde)
  73588. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  73589. })
  73590. }
  73591. // VPMAXUB ymm, ymm, ymm{k}{z}
  73592. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  73593. self.require(ISA_AVX512VL | ISA_AVX512BW)
  73594. p.domain = DomainAVX
  73595. p.add(0, func(m *_Encoding, v []interface{}) {
  73596. m.emit(0x62)
  73597. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73598. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  73599. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  73600. m.emit(0xde)
  73601. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73602. })
  73603. }
  73604. // VPMAXUB m256, ymm, ymm{k}{z}
  73605. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  73606. self.require(ISA_AVX512VL | ISA_AVX512BW)
  73607. p.domain = DomainAVX
  73608. p.add(0, func(m *_Encoding, v []interface{}) {
  73609. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  73610. m.emit(0xde)
  73611. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  73612. })
  73613. }
  73614. if p.len == 0 {
  73615. panic("invalid operands for VPMAXUB")
  73616. }
  73617. return p
  73618. }
  73619. // VPMAXUD performs "Maximum of Packed Unsigned Doubleword Integers".
  73620. //
  73621. // Mnemonic : VPMAXUD
  73622. // Supported forms : (10 forms)
  73623. //
  73624. // * VPMAXUD xmm, xmm, xmm [AVX]
  73625. // * VPMAXUD m128, xmm, xmm [AVX]
  73626. // * VPMAXUD ymm, ymm, ymm [AVX2]
  73627. // * VPMAXUD m256, ymm, ymm [AVX2]
  73628. // * VPMAXUD m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  73629. // * VPMAXUD zmm, zmm, zmm{k}{z} [AVX512F]
  73630. // * VPMAXUD m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  73631. // * VPMAXUD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  73632. // * VPMAXUD m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  73633. // * VPMAXUD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  73634. //
  73635. func (self *Program) VPMAXUD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  73636. p := self.alloc("VPMAXUD", 3, Operands { v0, v1, v2 })
  73637. // VPMAXUD xmm, xmm, xmm
  73638. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  73639. self.require(ISA_AVX)
  73640. p.domain = DomainAVX
  73641. p.add(0, func(m *_Encoding, v []interface{}) {
  73642. m.emit(0xc4)
  73643. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  73644. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  73645. m.emit(0x3f)
  73646. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73647. })
  73648. }
  73649. // VPMAXUD m128, xmm, xmm
  73650. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  73651. self.require(ISA_AVX)
  73652. p.domain = DomainAVX
  73653. p.add(0, func(m *_Encoding, v []interface{}) {
  73654. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  73655. m.emit(0x3f)
  73656. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  73657. })
  73658. }
  73659. // VPMAXUD ymm, ymm, ymm
  73660. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  73661. self.require(ISA_AVX2)
  73662. p.domain = DomainAVX
  73663. p.add(0, func(m *_Encoding, v []interface{}) {
  73664. m.emit(0xc4)
  73665. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  73666. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  73667. m.emit(0x3f)
  73668. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73669. })
  73670. }
  73671. // VPMAXUD m256, ymm, ymm
  73672. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  73673. self.require(ISA_AVX2)
  73674. p.domain = DomainAVX
  73675. p.add(0, func(m *_Encoding, v []interface{}) {
  73676. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  73677. m.emit(0x3f)
  73678. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  73679. })
  73680. }
  73681. // VPMAXUD m512/m32bcst, zmm, zmm{k}{z}
  73682. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  73683. self.require(ISA_AVX512F)
  73684. p.domain = DomainAVX
  73685. p.add(0, func(m *_Encoding, v []interface{}) {
  73686. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  73687. m.emit(0x3f)
  73688. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  73689. })
  73690. }
  73691. // VPMAXUD zmm, zmm, zmm{k}{z}
  73692. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  73693. self.require(ISA_AVX512F)
  73694. p.domain = DomainAVX
  73695. p.add(0, func(m *_Encoding, v []interface{}) {
  73696. m.emit(0x62)
  73697. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73698. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  73699. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  73700. m.emit(0x3f)
  73701. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73702. })
  73703. }
  73704. // VPMAXUD m128/m32bcst, xmm, xmm{k}{z}
  73705. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  73706. self.require(ISA_AVX512VL | ISA_AVX512F)
  73707. p.domain = DomainAVX
  73708. p.add(0, func(m *_Encoding, v []interface{}) {
  73709. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  73710. m.emit(0x3f)
  73711. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  73712. })
  73713. }
  73714. // VPMAXUD xmm, xmm, xmm{k}{z}
  73715. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  73716. self.require(ISA_AVX512VL | ISA_AVX512F)
  73717. p.domain = DomainAVX
  73718. p.add(0, func(m *_Encoding, v []interface{}) {
  73719. m.emit(0x62)
  73720. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73721. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  73722. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  73723. m.emit(0x3f)
  73724. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73725. })
  73726. }
  73727. // VPMAXUD m256/m32bcst, ymm, ymm{k}{z}
  73728. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  73729. self.require(ISA_AVX512VL | ISA_AVX512F)
  73730. p.domain = DomainAVX
  73731. p.add(0, func(m *_Encoding, v []interface{}) {
  73732. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  73733. m.emit(0x3f)
  73734. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  73735. })
  73736. }
  73737. // VPMAXUD ymm, ymm, ymm{k}{z}
  73738. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  73739. self.require(ISA_AVX512VL | ISA_AVX512F)
  73740. p.domain = DomainAVX
  73741. p.add(0, func(m *_Encoding, v []interface{}) {
  73742. m.emit(0x62)
  73743. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73744. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  73745. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  73746. m.emit(0x3f)
  73747. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73748. })
  73749. }
  73750. if p.len == 0 {
  73751. panic("invalid operands for VPMAXUD")
  73752. }
  73753. return p
  73754. }
  73755. // VPMAXUQ performs "Maximum of Packed Unsigned Quadword Integers".
  73756. //
  73757. // Mnemonic : VPMAXUQ
  73758. // Supported forms : (6 forms)
  73759. //
  73760. // * VPMAXUQ m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  73761. // * VPMAXUQ zmm, zmm, zmm{k}{z} [AVX512F]
  73762. // * VPMAXUQ m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  73763. // * VPMAXUQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  73764. // * VPMAXUQ m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  73765. // * VPMAXUQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  73766. //
  73767. func (self *Program) VPMAXUQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  73768. p := self.alloc("VPMAXUQ", 3, Operands { v0, v1, v2 })
  73769. // VPMAXUQ m512/m64bcst, zmm, zmm{k}{z}
  73770. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  73771. self.require(ISA_AVX512F)
  73772. p.domain = DomainAVX
  73773. p.add(0, func(m *_Encoding, v []interface{}) {
  73774. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  73775. m.emit(0x3f)
  73776. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  73777. })
  73778. }
  73779. // VPMAXUQ zmm, zmm, zmm{k}{z}
  73780. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  73781. self.require(ISA_AVX512F)
  73782. p.domain = DomainAVX
  73783. p.add(0, func(m *_Encoding, v []interface{}) {
  73784. m.emit(0x62)
  73785. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73786. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  73787. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  73788. m.emit(0x3f)
  73789. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73790. })
  73791. }
  73792. // VPMAXUQ m128/m64bcst, xmm, xmm{k}{z}
  73793. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  73794. self.require(ISA_AVX512VL | ISA_AVX512F)
  73795. p.domain = DomainAVX
  73796. p.add(0, func(m *_Encoding, v []interface{}) {
  73797. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  73798. m.emit(0x3f)
  73799. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  73800. })
  73801. }
  73802. // VPMAXUQ xmm, xmm, xmm{k}{z}
  73803. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  73804. self.require(ISA_AVX512VL | ISA_AVX512F)
  73805. p.domain = DomainAVX
  73806. p.add(0, func(m *_Encoding, v []interface{}) {
  73807. m.emit(0x62)
  73808. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73809. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  73810. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  73811. m.emit(0x3f)
  73812. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73813. })
  73814. }
  73815. // VPMAXUQ m256/m64bcst, ymm, ymm{k}{z}
  73816. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  73817. self.require(ISA_AVX512VL | ISA_AVX512F)
  73818. p.domain = DomainAVX
  73819. p.add(0, func(m *_Encoding, v []interface{}) {
  73820. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  73821. m.emit(0x3f)
  73822. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  73823. })
  73824. }
  73825. // VPMAXUQ ymm, ymm, ymm{k}{z}
  73826. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  73827. self.require(ISA_AVX512VL | ISA_AVX512F)
  73828. p.domain = DomainAVX
  73829. p.add(0, func(m *_Encoding, v []interface{}) {
  73830. m.emit(0x62)
  73831. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73832. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  73833. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  73834. m.emit(0x3f)
  73835. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73836. })
  73837. }
  73838. if p.len == 0 {
  73839. panic("invalid operands for VPMAXUQ")
  73840. }
  73841. return p
  73842. }
  73843. // VPMAXUW performs "Maximum of Packed Unsigned Word Integers".
  73844. //
  73845. // Mnemonic : VPMAXUW
  73846. // Supported forms : (10 forms)
  73847. //
  73848. // * VPMAXUW xmm, xmm, xmm [AVX]
  73849. // * VPMAXUW m128, xmm, xmm [AVX]
  73850. // * VPMAXUW ymm, ymm, ymm [AVX2]
  73851. // * VPMAXUW m256, ymm, ymm [AVX2]
  73852. // * VPMAXUW zmm, zmm, zmm{k}{z} [AVX512BW]
  73853. // * VPMAXUW m512, zmm, zmm{k}{z} [AVX512BW]
  73854. // * VPMAXUW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  73855. // * VPMAXUW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  73856. // * VPMAXUW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  73857. // * VPMAXUW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  73858. //
  73859. func (self *Program) VPMAXUW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  73860. p := self.alloc("VPMAXUW", 3, Operands { v0, v1, v2 })
  73861. // VPMAXUW xmm, xmm, xmm
  73862. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  73863. self.require(ISA_AVX)
  73864. p.domain = DomainAVX
  73865. p.add(0, func(m *_Encoding, v []interface{}) {
  73866. m.emit(0xc4)
  73867. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  73868. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  73869. m.emit(0x3e)
  73870. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73871. })
  73872. }
  73873. // VPMAXUW m128, xmm, xmm
  73874. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  73875. self.require(ISA_AVX)
  73876. p.domain = DomainAVX
  73877. p.add(0, func(m *_Encoding, v []interface{}) {
  73878. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  73879. m.emit(0x3e)
  73880. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  73881. })
  73882. }
  73883. // VPMAXUW ymm, ymm, ymm
  73884. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  73885. self.require(ISA_AVX2)
  73886. p.domain = DomainAVX
  73887. p.add(0, func(m *_Encoding, v []interface{}) {
  73888. m.emit(0xc4)
  73889. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  73890. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  73891. m.emit(0x3e)
  73892. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73893. })
  73894. }
  73895. // VPMAXUW m256, ymm, ymm
  73896. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  73897. self.require(ISA_AVX2)
  73898. p.domain = DomainAVX
  73899. p.add(0, func(m *_Encoding, v []interface{}) {
  73900. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  73901. m.emit(0x3e)
  73902. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  73903. })
  73904. }
  73905. // VPMAXUW zmm, zmm, zmm{k}{z}
  73906. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  73907. self.require(ISA_AVX512BW)
  73908. p.domain = DomainAVX
  73909. p.add(0, func(m *_Encoding, v []interface{}) {
  73910. m.emit(0x62)
  73911. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73912. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  73913. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  73914. m.emit(0x3e)
  73915. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73916. })
  73917. }
  73918. // VPMAXUW m512, zmm, zmm{k}{z}
  73919. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  73920. self.require(ISA_AVX512BW)
  73921. p.domain = DomainAVX
  73922. p.add(0, func(m *_Encoding, v []interface{}) {
  73923. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  73924. m.emit(0x3e)
  73925. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  73926. })
  73927. }
  73928. // VPMAXUW xmm, xmm, xmm{k}{z}
  73929. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  73930. self.require(ISA_AVX512VL | ISA_AVX512BW)
  73931. p.domain = DomainAVX
  73932. p.add(0, func(m *_Encoding, v []interface{}) {
  73933. m.emit(0x62)
  73934. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73935. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  73936. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  73937. m.emit(0x3e)
  73938. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73939. })
  73940. }
  73941. // VPMAXUW m128, xmm, xmm{k}{z}
  73942. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  73943. self.require(ISA_AVX512VL | ISA_AVX512BW)
  73944. p.domain = DomainAVX
  73945. p.add(0, func(m *_Encoding, v []interface{}) {
  73946. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  73947. m.emit(0x3e)
  73948. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  73949. })
  73950. }
  73951. // VPMAXUW ymm, ymm, ymm{k}{z}
  73952. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  73953. self.require(ISA_AVX512VL | ISA_AVX512BW)
  73954. p.domain = DomainAVX
  73955. p.add(0, func(m *_Encoding, v []interface{}) {
  73956. m.emit(0x62)
  73957. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  73958. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  73959. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  73960. m.emit(0x3e)
  73961. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  73962. })
  73963. }
  73964. // VPMAXUW m256, ymm, ymm{k}{z}
  73965. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  73966. self.require(ISA_AVX512VL | ISA_AVX512BW)
  73967. p.domain = DomainAVX
  73968. p.add(0, func(m *_Encoding, v []interface{}) {
  73969. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  73970. m.emit(0x3e)
  73971. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  73972. })
  73973. }
  73974. if p.len == 0 {
  73975. panic("invalid operands for VPMAXUW")
  73976. }
  73977. return p
  73978. }
  73979. // VPMINSB performs "Minimum of Packed Signed Byte Integers".
  73980. //
  73981. // Mnemonic : VPMINSB
  73982. // Supported forms : (10 forms)
  73983. //
  73984. // * VPMINSB xmm, xmm, xmm [AVX]
  73985. // * VPMINSB m128, xmm, xmm [AVX]
  73986. // * VPMINSB ymm, ymm, ymm [AVX2]
  73987. // * VPMINSB m256, ymm, ymm [AVX2]
  73988. // * VPMINSB zmm, zmm, zmm{k}{z} [AVX512BW]
  73989. // * VPMINSB m512, zmm, zmm{k}{z} [AVX512BW]
  73990. // * VPMINSB xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  73991. // * VPMINSB m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  73992. // * VPMINSB ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  73993. // * VPMINSB m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  73994. //
  73995. func (self *Program) VPMINSB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  73996. p := self.alloc("VPMINSB", 3, Operands { v0, v1, v2 })
  73997. // VPMINSB xmm, xmm, xmm
  73998. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  73999. self.require(ISA_AVX)
  74000. p.domain = DomainAVX
  74001. p.add(0, func(m *_Encoding, v []interface{}) {
  74002. m.emit(0xc4)
  74003. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  74004. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  74005. m.emit(0x38)
  74006. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74007. })
  74008. }
  74009. // VPMINSB m128, xmm, xmm
  74010. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  74011. self.require(ISA_AVX)
  74012. p.domain = DomainAVX
  74013. p.add(0, func(m *_Encoding, v []interface{}) {
  74014. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  74015. m.emit(0x38)
  74016. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  74017. })
  74018. }
  74019. // VPMINSB ymm, ymm, ymm
  74020. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  74021. self.require(ISA_AVX2)
  74022. p.domain = DomainAVX
  74023. p.add(0, func(m *_Encoding, v []interface{}) {
  74024. m.emit(0xc4)
  74025. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  74026. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  74027. m.emit(0x38)
  74028. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74029. })
  74030. }
  74031. // VPMINSB m256, ymm, ymm
  74032. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  74033. self.require(ISA_AVX2)
  74034. p.domain = DomainAVX
  74035. p.add(0, func(m *_Encoding, v []interface{}) {
  74036. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  74037. m.emit(0x38)
  74038. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  74039. })
  74040. }
  74041. // VPMINSB zmm, zmm, zmm{k}{z}
  74042. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  74043. self.require(ISA_AVX512BW)
  74044. p.domain = DomainAVX
  74045. p.add(0, func(m *_Encoding, v []interface{}) {
  74046. m.emit(0x62)
  74047. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74048. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  74049. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  74050. m.emit(0x38)
  74051. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74052. })
  74053. }
  74054. // VPMINSB m512, zmm, zmm{k}{z}
  74055. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  74056. self.require(ISA_AVX512BW)
  74057. p.domain = DomainAVX
  74058. p.add(0, func(m *_Encoding, v []interface{}) {
  74059. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  74060. m.emit(0x38)
  74061. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  74062. })
  74063. }
  74064. // VPMINSB xmm, xmm, xmm{k}{z}
  74065. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  74066. self.require(ISA_AVX512VL | ISA_AVX512BW)
  74067. p.domain = DomainAVX
  74068. p.add(0, func(m *_Encoding, v []interface{}) {
  74069. m.emit(0x62)
  74070. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74071. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  74072. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  74073. m.emit(0x38)
  74074. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74075. })
  74076. }
  74077. // VPMINSB m128, xmm, xmm{k}{z}
  74078. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  74079. self.require(ISA_AVX512VL | ISA_AVX512BW)
  74080. p.domain = DomainAVX
  74081. p.add(0, func(m *_Encoding, v []interface{}) {
  74082. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  74083. m.emit(0x38)
  74084. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  74085. })
  74086. }
  74087. // VPMINSB ymm, ymm, ymm{k}{z}
  74088. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  74089. self.require(ISA_AVX512VL | ISA_AVX512BW)
  74090. p.domain = DomainAVX
  74091. p.add(0, func(m *_Encoding, v []interface{}) {
  74092. m.emit(0x62)
  74093. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74094. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  74095. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  74096. m.emit(0x38)
  74097. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74098. })
  74099. }
  74100. // VPMINSB m256, ymm, ymm{k}{z}
  74101. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  74102. self.require(ISA_AVX512VL | ISA_AVX512BW)
  74103. p.domain = DomainAVX
  74104. p.add(0, func(m *_Encoding, v []interface{}) {
  74105. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  74106. m.emit(0x38)
  74107. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  74108. })
  74109. }
  74110. if p.len == 0 {
  74111. panic("invalid operands for VPMINSB")
  74112. }
  74113. return p
  74114. }
  74115. // VPMINSD performs "Minimum of Packed Signed Doubleword Integers".
  74116. //
  74117. // Mnemonic : VPMINSD
  74118. // Supported forms : (10 forms)
  74119. //
  74120. // * VPMINSD xmm, xmm, xmm [AVX]
  74121. // * VPMINSD m128, xmm, xmm [AVX]
  74122. // * VPMINSD ymm, ymm, ymm [AVX2]
  74123. // * VPMINSD m256, ymm, ymm [AVX2]
  74124. // * VPMINSD m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  74125. // * VPMINSD zmm, zmm, zmm{k}{z} [AVX512F]
  74126. // * VPMINSD m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  74127. // * VPMINSD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  74128. // * VPMINSD m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  74129. // * VPMINSD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  74130. //
  74131. func (self *Program) VPMINSD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  74132. p := self.alloc("VPMINSD", 3, Operands { v0, v1, v2 })
  74133. // VPMINSD xmm, xmm, xmm
  74134. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  74135. self.require(ISA_AVX)
  74136. p.domain = DomainAVX
  74137. p.add(0, func(m *_Encoding, v []interface{}) {
  74138. m.emit(0xc4)
  74139. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  74140. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  74141. m.emit(0x39)
  74142. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74143. })
  74144. }
  74145. // VPMINSD m128, xmm, xmm
  74146. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  74147. self.require(ISA_AVX)
  74148. p.domain = DomainAVX
  74149. p.add(0, func(m *_Encoding, v []interface{}) {
  74150. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  74151. m.emit(0x39)
  74152. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  74153. })
  74154. }
  74155. // VPMINSD ymm, ymm, ymm
  74156. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  74157. self.require(ISA_AVX2)
  74158. p.domain = DomainAVX
  74159. p.add(0, func(m *_Encoding, v []interface{}) {
  74160. m.emit(0xc4)
  74161. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  74162. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  74163. m.emit(0x39)
  74164. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74165. })
  74166. }
  74167. // VPMINSD m256, ymm, ymm
  74168. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  74169. self.require(ISA_AVX2)
  74170. p.domain = DomainAVX
  74171. p.add(0, func(m *_Encoding, v []interface{}) {
  74172. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  74173. m.emit(0x39)
  74174. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  74175. })
  74176. }
  74177. // VPMINSD m512/m32bcst, zmm, zmm{k}{z}
  74178. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  74179. self.require(ISA_AVX512F)
  74180. p.domain = DomainAVX
  74181. p.add(0, func(m *_Encoding, v []interface{}) {
  74182. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  74183. m.emit(0x39)
  74184. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  74185. })
  74186. }
  74187. // VPMINSD zmm, zmm, zmm{k}{z}
  74188. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  74189. self.require(ISA_AVX512F)
  74190. p.domain = DomainAVX
  74191. p.add(0, func(m *_Encoding, v []interface{}) {
  74192. m.emit(0x62)
  74193. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74194. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  74195. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  74196. m.emit(0x39)
  74197. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74198. })
  74199. }
  74200. // VPMINSD m128/m32bcst, xmm, xmm{k}{z}
  74201. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  74202. self.require(ISA_AVX512VL | ISA_AVX512F)
  74203. p.domain = DomainAVX
  74204. p.add(0, func(m *_Encoding, v []interface{}) {
  74205. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  74206. m.emit(0x39)
  74207. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  74208. })
  74209. }
  74210. // VPMINSD xmm, xmm, xmm{k}{z}
  74211. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  74212. self.require(ISA_AVX512VL | ISA_AVX512F)
  74213. p.domain = DomainAVX
  74214. p.add(0, func(m *_Encoding, v []interface{}) {
  74215. m.emit(0x62)
  74216. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74217. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  74218. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  74219. m.emit(0x39)
  74220. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74221. })
  74222. }
  74223. // VPMINSD m256/m32bcst, ymm, ymm{k}{z}
  74224. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  74225. self.require(ISA_AVX512VL | ISA_AVX512F)
  74226. p.domain = DomainAVX
  74227. p.add(0, func(m *_Encoding, v []interface{}) {
  74228. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  74229. m.emit(0x39)
  74230. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  74231. })
  74232. }
  74233. // VPMINSD ymm, ymm, ymm{k}{z}
  74234. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  74235. self.require(ISA_AVX512VL | ISA_AVX512F)
  74236. p.domain = DomainAVX
  74237. p.add(0, func(m *_Encoding, v []interface{}) {
  74238. m.emit(0x62)
  74239. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74240. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  74241. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  74242. m.emit(0x39)
  74243. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74244. })
  74245. }
  74246. if p.len == 0 {
  74247. panic("invalid operands for VPMINSD")
  74248. }
  74249. return p
  74250. }
  74251. // VPMINSQ performs "Minimum of Packed Signed Quadword Integers".
  74252. //
  74253. // Mnemonic : VPMINSQ
  74254. // Supported forms : (6 forms)
  74255. //
  74256. // * VPMINSQ m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  74257. // * VPMINSQ zmm, zmm, zmm{k}{z} [AVX512F]
  74258. // * VPMINSQ m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  74259. // * VPMINSQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  74260. // * VPMINSQ m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  74261. // * VPMINSQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  74262. //
  74263. func (self *Program) VPMINSQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  74264. p := self.alloc("VPMINSQ", 3, Operands { v0, v1, v2 })
  74265. // VPMINSQ m512/m64bcst, zmm, zmm{k}{z}
  74266. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  74267. self.require(ISA_AVX512F)
  74268. p.domain = DomainAVX
  74269. p.add(0, func(m *_Encoding, v []interface{}) {
  74270. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  74271. m.emit(0x39)
  74272. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  74273. })
  74274. }
  74275. // VPMINSQ zmm, zmm, zmm{k}{z}
  74276. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  74277. self.require(ISA_AVX512F)
  74278. p.domain = DomainAVX
  74279. p.add(0, func(m *_Encoding, v []interface{}) {
  74280. m.emit(0x62)
  74281. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74282. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  74283. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  74284. m.emit(0x39)
  74285. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74286. })
  74287. }
  74288. // VPMINSQ m128/m64bcst, xmm, xmm{k}{z}
  74289. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  74290. self.require(ISA_AVX512VL | ISA_AVX512F)
  74291. p.domain = DomainAVX
  74292. p.add(0, func(m *_Encoding, v []interface{}) {
  74293. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  74294. m.emit(0x39)
  74295. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  74296. })
  74297. }
  74298. // VPMINSQ xmm, xmm, xmm{k}{z}
  74299. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  74300. self.require(ISA_AVX512VL | ISA_AVX512F)
  74301. p.domain = DomainAVX
  74302. p.add(0, func(m *_Encoding, v []interface{}) {
  74303. m.emit(0x62)
  74304. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74305. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  74306. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  74307. m.emit(0x39)
  74308. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74309. })
  74310. }
  74311. // VPMINSQ m256/m64bcst, ymm, ymm{k}{z}
  74312. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  74313. self.require(ISA_AVX512VL | ISA_AVX512F)
  74314. p.domain = DomainAVX
  74315. p.add(0, func(m *_Encoding, v []interface{}) {
  74316. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  74317. m.emit(0x39)
  74318. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  74319. })
  74320. }
  74321. // VPMINSQ ymm, ymm, ymm{k}{z}
  74322. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  74323. self.require(ISA_AVX512VL | ISA_AVX512F)
  74324. p.domain = DomainAVX
  74325. p.add(0, func(m *_Encoding, v []interface{}) {
  74326. m.emit(0x62)
  74327. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74328. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  74329. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  74330. m.emit(0x39)
  74331. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74332. })
  74333. }
  74334. if p.len == 0 {
  74335. panic("invalid operands for VPMINSQ")
  74336. }
  74337. return p
  74338. }
  74339. // VPMINSW performs "Minimum of Packed Signed Word Integers".
  74340. //
  74341. // Mnemonic : VPMINSW
  74342. // Supported forms : (10 forms)
  74343. //
  74344. // * VPMINSW xmm, xmm, xmm [AVX]
  74345. // * VPMINSW m128, xmm, xmm [AVX]
  74346. // * VPMINSW ymm, ymm, ymm [AVX2]
  74347. // * VPMINSW m256, ymm, ymm [AVX2]
  74348. // * VPMINSW zmm, zmm, zmm{k}{z} [AVX512BW]
  74349. // * VPMINSW m512, zmm, zmm{k}{z} [AVX512BW]
  74350. // * VPMINSW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  74351. // * VPMINSW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  74352. // * VPMINSW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  74353. // * VPMINSW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  74354. //
  74355. func (self *Program) VPMINSW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  74356. p := self.alloc("VPMINSW", 3, Operands { v0, v1, v2 })
  74357. // VPMINSW xmm, xmm, xmm
  74358. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  74359. self.require(ISA_AVX)
  74360. p.domain = DomainAVX
  74361. p.add(0, func(m *_Encoding, v []interface{}) {
  74362. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  74363. m.emit(0xea)
  74364. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74365. })
  74366. }
  74367. // VPMINSW m128, xmm, xmm
  74368. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  74369. self.require(ISA_AVX)
  74370. p.domain = DomainAVX
  74371. p.add(0, func(m *_Encoding, v []interface{}) {
  74372. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  74373. m.emit(0xea)
  74374. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  74375. })
  74376. }
  74377. // VPMINSW ymm, ymm, ymm
  74378. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  74379. self.require(ISA_AVX2)
  74380. p.domain = DomainAVX
  74381. p.add(0, func(m *_Encoding, v []interface{}) {
  74382. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  74383. m.emit(0xea)
  74384. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74385. })
  74386. }
  74387. // VPMINSW m256, ymm, ymm
  74388. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  74389. self.require(ISA_AVX2)
  74390. p.domain = DomainAVX
  74391. p.add(0, func(m *_Encoding, v []interface{}) {
  74392. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  74393. m.emit(0xea)
  74394. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  74395. })
  74396. }
  74397. // VPMINSW zmm, zmm, zmm{k}{z}
  74398. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  74399. self.require(ISA_AVX512BW)
  74400. p.domain = DomainAVX
  74401. p.add(0, func(m *_Encoding, v []interface{}) {
  74402. m.emit(0x62)
  74403. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74404. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  74405. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  74406. m.emit(0xea)
  74407. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74408. })
  74409. }
  74410. // VPMINSW m512, zmm, zmm{k}{z}
  74411. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  74412. self.require(ISA_AVX512BW)
  74413. p.domain = DomainAVX
  74414. p.add(0, func(m *_Encoding, v []interface{}) {
  74415. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  74416. m.emit(0xea)
  74417. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  74418. })
  74419. }
  74420. // VPMINSW xmm, xmm, xmm{k}{z}
  74421. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  74422. self.require(ISA_AVX512VL | ISA_AVX512BW)
  74423. p.domain = DomainAVX
  74424. p.add(0, func(m *_Encoding, v []interface{}) {
  74425. m.emit(0x62)
  74426. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74427. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  74428. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  74429. m.emit(0xea)
  74430. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74431. })
  74432. }
  74433. // VPMINSW m128, xmm, xmm{k}{z}
  74434. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  74435. self.require(ISA_AVX512VL | ISA_AVX512BW)
  74436. p.domain = DomainAVX
  74437. p.add(0, func(m *_Encoding, v []interface{}) {
  74438. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  74439. m.emit(0xea)
  74440. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  74441. })
  74442. }
  74443. // VPMINSW ymm, ymm, ymm{k}{z}
  74444. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  74445. self.require(ISA_AVX512VL | ISA_AVX512BW)
  74446. p.domain = DomainAVX
  74447. p.add(0, func(m *_Encoding, v []interface{}) {
  74448. m.emit(0x62)
  74449. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74450. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  74451. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  74452. m.emit(0xea)
  74453. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74454. })
  74455. }
  74456. // VPMINSW m256, ymm, ymm{k}{z}
  74457. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  74458. self.require(ISA_AVX512VL | ISA_AVX512BW)
  74459. p.domain = DomainAVX
  74460. p.add(0, func(m *_Encoding, v []interface{}) {
  74461. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  74462. m.emit(0xea)
  74463. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  74464. })
  74465. }
  74466. if p.len == 0 {
  74467. panic("invalid operands for VPMINSW")
  74468. }
  74469. return p
  74470. }
  74471. // VPMINUB performs "Minimum of Packed Unsigned Byte Integers".
  74472. //
  74473. // Mnemonic : VPMINUB
  74474. // Supported forms : (10 forms)
  74475. //
  74476. // * VPMINUB xmm, xmm, xmm [AVX]
  74477. // * VPMINUB m128, xmm, xmm [AVX]
  74478. // * VPMINUB ymm, ymm, ymm [AVX2]
  74479. // * VPMINUB m256, ymm, ymm [AVX2]
  74480. // * VPMINUB zmm, zmm, zmm{k}{z} [AVX512BW]
  74481. // * VPMINUB m512, zmm, zmm{k}{z} [AVX512BW]
  74482. // * VPMINUB xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  74483. // * VPMINUB m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  74484. // * VPMINUB ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  74485. // * VPMINUB m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  74486. //
  74487. func (self *Program) VPMINUB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  74488. p := self.alloc("VPMINUB", 3, Operands { v0, v1, v2 })
  74489. // VPMINUB xmm, xmm, xmm
  74490. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  74491. self.require(ISA_AVX)
  74492. p.domain = DomainAVX
  74493. p.add(0, func(m *_Encoding, v []interface{}) {
  74494. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  74495. m.emit(0xda)
  74496. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74497. })
  74498. }
  74499. // VPMINUB m128, xmm, xmm
  74500. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  74501. self.require(ISA_AVX)
  74502. p.domain = DomainAVX
  74503. p.add(0, func(m *_Encoding, v []interface{}) {
  74504. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  74505. m.emit(0xda)
  74506. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  74507. })
  74508. }
  74509. // VPMINUB ymm, ymm, ymm
  74510. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  74511. self.require(ISA_AVX2)
  74512. p.domain = DomainAVX
  74513. p.add(0, func(m *_Encoding, v []interface{}) {
  74514. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  74515. m.emit(0xda)
  74516. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74517. })
  74518. }
  74519. // VPMINUB m256, ymm, ymm
  74520. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  74521. self.require(ISA_AVX2)
  74522. p.domain = DomainAVX
  74523. p.add(0, func(m *_Encoding, v []interface{}) {
  74524. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  74525. m.emit(0xda)
  74526. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  74527. })
  74528. }
  74529. // VPMINUB zmm, zmm, zmm{k}{z}
  74530. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  74531. self.require(ISA_AVX512BW)
  74532. p.domain = DomainAVX
  74533. p.add(0, func(m *_Encoding, v []interface{}) {
  74534. m.emit(0x62)
  74535. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74536. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  74537. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  74538. m.emit(0xda)
  74539. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74540. })
  74541. }
  74542. // VPMINUB m512, zmm, zmm{k}{z}
  74543. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  74544. self.require(ISA_AVX512BW)
  74545. p.domain = DomainAVX
  74546. p.add(0, func(m *_Encoding, v []interface{}) {
  74547. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  74548. m.emit(0xda)
  74549. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  74550. })
  74551. }
  74552. // VPMINUB xmm, xmm, xmm{k}{z}
  74553. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  74554. self.require(ISA_AVX512VL | ISA_AVX512BW)
  74555. p.domain = DomainAVX
  74556. p.add(0, func(m *_Encoding, v []interface{}) {
  74557. m.emit(0x62)
  74558. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74559. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  74560. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  74561. m.emit(0xda)
  74562. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74563. })
  74564. }
  74565. // VPMINUB m128, xmm, xmm{k}{z}
  74566. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  74567. self.require(ISA_AVX512VL | ISA_AVX512BW)
  74568. p.domain = DomainAVX
  74569. p.add(0, func(m *_Encoding, v []interface{}) {
  74570. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  74571. m.emit(0xda)
  74572. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  74573. })
  74574. }
  74575. // VPMINUB ymm, ymm, ymm{k}{z}
  74576. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  74577. self.require(ISA_AVX512VL | ISA_AVX512BW)
  74578. p.domain = DomainAVX
  74579. p.add(0, func(m *_Encoding, v []interface{}) {
  74580. m.emit(0x62)
  74581. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74582. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  74583. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  74584. m.emit(0xda)
  74585. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74586. })
  74587. }
  74588. // VPMINUB m256, ymm, ymm{k}{z}
  74589. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  74590. self.require(ISA_AVX512VL | ISA_AVX512BW)
  74591. p.domain = DomainAVX
  74592. p.add(0, func(m *_Encoding, v []interface{}) {
  74593. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  74594. m.emit(0xda)
  74595. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  74596. })
  74597. }
  74598. if p.len == 0 {
  74599. panic("invalid operands for VPMINUB")
  74600. }
  74601. return p
  74602. }
  74603. // VPMINUD performs "Minimum of Packed Unsigned Doubleword Integers".
  74604. //
  74605. // Mnemonic : VPMINUD
  74606. // Supported forms : (10 forms)
  74607. //
  74608. // * VPMINUD xmm, xmm, xmm [AVX]
  74609. // * VPMINUD m128, xmm, xmm [AVX]
  74610. // * VPMINUD ymm, ymm, ymm [AVX2]
  74611. // * VPMINUD m256, ymm, ymm [AVX2]
  74612. // * VPMINUD m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  74613. // * VPMINUD zmm, zmm, zmm{k}{z} [AVX512F]
  74614. // * VPMINUD m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  74615. // * VPMINUD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  74616. // * VPMINUD m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  74617. // * VPMINUD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  74618. //
  74619. func (self *Program) VPMINUD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  74620. p := self.alloc("VPMINUD", 3, Operands { v0, v1, v2 })
  74621. // VPMINUD xmm, xmm, xmm
  74622. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  74623. self.require(ISA_AVX)
  74624. p.domain = DomainAVX
  74625. p.add(0, func(m *_Encoding, v []interface{}) {
  74626. m.emit(0xc4)
  74627. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  74628. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  74629. m.emit(0x3b)
  74630. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74631. })
  74632. }
  74633. // VPMINUD m128, xmm, xmm
  74634. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  74635. self.require(ISA_AVX)
  74636. p.domain = DomainAVX
  74637. p.add(0, func(m *_Encoding, v []interface{}) {
  74638. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  74639. m.emit(0x3b)
  74640. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  74641. })
  74642. }
  74643. // VPMINUD ymm, ymm, ymm
  74644. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  74645. self.require(ISA_AVX2)
  74646. p.domain = DomainAVX
  74647. p.add(0, func(m *_Encoding, v []interface{}) {
  74648. m.emit(0xc4)
  74649. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  74650. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  74651. m.emit(0x3b)
  74652. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74653. })
  74654. }
  74655. // VPMINUD m256, ymm, ymm
  74656. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  74657. self.require(ISA_AVX2)
  74658. p.domain = DomainAVX
  74659. p.add(0, func(m *_Encoding, v []interface{}) {
  74660. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  74661. m.emit(0x3b)
  74662. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  74663. })
  74664. }
  74665. // VPMINUD m512/m32bcst, zmm, zmm{k}{z}
  74666. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  74667. self.require(ISA_AVX512F)
  74668. p.domain = DomainAVX
  74669. p.add(0, func(m *_Encoding, v []interface{}) {
  74670. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  74671. m.emit(0x3b)
  74672. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  74673. })
  74674. }
  74675. // VPMINUD zmm, zmm, zmm{k}{z}
  74676. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  74677. self.require(ISA_AVX512F)
  74678. p.domain = DomainAVX
  74679. p.add(0, func(m *_Encoding, v []interface{}) {
  74680. m.emit(0x62)
  74681. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74682. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  74683. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  74684. m.emit(0x3b)
  74685. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74686. })
  74687. }
  74688. // VPMINUD m128/m32bcst, xmm, xmm{k}{z}
  74689. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  74690. self.require(ISA_AVX512VL | ISA_AVX512F)
  74691. p.domain = DomainAVX
  74692. p.add(0, func(m *_Encoding, v []interface{}) {
  74693. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  74694. m.emit(0x3b)
  74695. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  74696. })
  74697. }
  74698. // VPMINUD xmm, xmm, xmm{k}{z}
  74699. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  74700. self.require(ISA_AVX512VL | ISA_AVX512F)
  74701. p.domain = DomainAVX
  74702. p.add(0, func(m *_Encoding, v []interface{}) {
  74703. m.emit(0x62)
  74704. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74705. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  74706. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  74707. m.emit(0x3b)
  74708. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74709. })
  74710. }
  74711. // VPMINUD m256/m32bcst, ymm, ymm{k}{z}
  74712. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  74713. self.require(ISA_AVX512VL | ISA_AVX512F)
  74714. p.domain = DomainAVX
  74715. p.add(0, func(m *_Encoding, v []interface{}) {
  74716. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  74717. m.emit(0x3b)
  74718. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  74719. })
  74720. }
  74721. // VPMINUD ymm, ymm, ymm{k}{z}
  74722. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  74723. self.require(ISA_AVX512VL | ISA_AVX512F)
  74724. p.domain = DomainAVX
  74725. p.add(0, func(m *_Encoding, v []interface{}) {
  74726. m.emit(0x62)
  74727. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74728. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  74729. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  74730. m.emit(0x3b)
  74731. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74732. })
  74733. }
  74734. if p.len == 0 {
  74735. panic("invalid operands for VPMINUD")
  74736. }
  74737. return p
  74738. }
  74739. // VPMINUQ performs "Minimum of Packed Unsigned Quadword Integers".
  74740. //
  74741. // Mnemonic : VPMINUQ
  74742. // Supported forms : (6 forms)
  74743. //
  74744. // * VPMINUQ m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  74745. // * VPMINUQ zmm, zmm, zmm{k}{z} [AVX512F]
  74746. // * VPMINUQ m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  74747. // * VPMINUQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  74748. // * VPMINUQ m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  74749. // * VPMINUQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  74750. //
  74751. func (self *Program) VPMINUQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  74752. p := self.alloc("VPMINUQ", 3, Operands { v0, v1, v2 })
  74753. // VPMINUQ m512/m64bcst, zmm, zmm{k}{z}
  74754. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  74755. self.require(ISA_AVX512F)
  74756. p.domain = DomainAVX
  74757. p.add(0, func(m *_Encoding, v []interface{}) {
  74758. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  74759. m.emit(0x3b)
  74760. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  74761. })
  74762. }
  74763. // VPMINUQ zmm, zmm, zmm{k}{z}
  74764. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  74765. self.require(ISA_AVX512F)
  74766. p.domain = DomainAVX
  74767. p.add(0, func(m *_Encoding, v []interface{}) {
  74768. m.emit(0x62)
  74769. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74770. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  74771. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  74772. m.emit(0x3b)
  74773. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74774. })
  74775. }
  74776. // VPMINUQ m128/m64bcst, xmm, xmm{k}{z}
  74777. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  74778. self.require(ISA_AVX512VL | ISA_AVX512F)
  74779. p.domain = DomainAVX
  74780. p.add(0, func(m *_Encoding, v []interface{}) {
  74781. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  74782. m.emit(0x3b)
  74783. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  74784. })
  74785. }
  74786. // VPMINUQ xmm, xmm, xmm{k}{z}
  74787. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  74788. self.require(ISA_AVX512VL | ISA_AVX512F)
  74789. p.domain = DomainAVX
  74790. p.add(0, func(m *_Encoding, v []interface{}) {
  74791. m.emit(0x62)
  74792. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74793. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  74794. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  74795. m.emit(0x3b)
  74796. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74797. })
  74798. }
  74799. // VPMINUQ m256/m64bcst, ymm, ymm{k}{z}
  74800. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  74801. self.require(ISA_AVX512VL | ISA_AVX512F)
  74802. p.domain = DomainAVX
  74803. p.add(0, func(m *_Encoding, v []interface{}) {
  74804. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  74805. m.emit(0x3b)
  74806. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  74807. })
  74808. }
  74809. // VPMINUQ ymm, ymm, ymm{k}{z}
  74810. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  74811. self.require(ISA_AVX512VL | ISA_AVX512F)
  74812. p.domain = DomainAVX
  74813. p.add(0, func(m *_Encoding, v []interface{}) {
  74814. m.emit(0x62)
  74815. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74816. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  74817. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  74818. m.emit(0x3b)
  74819. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74820. })
  74821. }
  74822. if p.len == 0 {
  74823. panic("invalid operands for VPMINUQ")
  74824. }
  74825. return p
  74826. }
  74827. // VPMINUW performs "Minimum of Packed Unsigned Word Integers".
  74828. //
  74829. // Mnemonic : VPMINUW
  74830. // Supported forms : (10 forms)
  74831. //
  74832. // * VPMINUW xmm, xmm, xmm [AVX]
  74833. // * VPMINUW m128, xmm, xmm [AVX]
  74834. // * VPMINUW ymm, ymm, ymm [AVX2]
  74835. // * VPMINUW m256, ymm, ymm [AVX2]
  74836. // * VPMINUW zmm, zmm, zmm{k}{z} [AVX512BW]
  74837. // * VPMINUW m512, zmm, zmm{k}{z} [AVX512BW]
  74838. // * VPMINUW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  74839. // * VPMINUW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  74840. // * VPMINUW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  74841. // * VPMINUW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  74842. //
  74843. func (self *Program) VPMINUW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  74844. p := self.alloc("VPMINUW", 3, Operands { v0, v1, v2 })
  74845. // VPMINUW xmm, xmm, xmm
  74846. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  74847. self.require(ISA_AVX)
  74848. p.domain = DomainAVX
  74849. p.add(0, func(m *_Encoding, v []interface{}) {
  74850. m.emit(0xc4)
  74851. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  74852. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  74853. m.emit(0x3a)
  74854. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74855. })
  74856. }
  74857. // VPMINUW m128, xmm, xmm
  74858. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  74859. self.require(ISA_AVX)
  74860. p.domain = DomainAVX
  74861. p.add(0, func(m *_Encoding, v []interface{}) {
  74862. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  74863. m.emit(0x3a)
  74864. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  74865. })
  74866. }
  74867. // VPMINUW ymm, ymm, ymm
  74868. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  74869. self.require(ISA_AVX2)
  74870. p.domain = DomainAVX
  74871. p.add(0, func(m *_Encoding, v []interface{}) {
  74872. m.emit(0xc4)
  74873. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  74874. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  74875. m.emit(0x3a)
  74876. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74877. })
  74878. }
  74879. // VPMINUW m256, ymm, ymm
  74880. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  74881. self.require(ISA_AVX2)
  74882. p.domain = DomainAVX
  74883. p.add(0, func(m *_Encoding, v []interface{}) {
  74884. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  74885. m.emit(0x3a)
  74886. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  74887. })
  74888. }
  74889. // VPMINUW zmm, zmm, zmm{k}{z}
  74890. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  74891. self.require(ISA_AVX512BW)
  74892. p.domain = DomainAVX
  74893. p.add(0, func(m *_Encoding, v []interface{}) {
  74894. m.emit(0x62)
  74895. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74896. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  74897. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  74898. m.emit(0x3a)
  74899. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74900. })
  74901. }
  74902. // VPMINUW m512, zmm, zmm{k}{z}
  74903. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  74904. self.require(ISA_AVX512BW)
  74905. p.domain = DomainAVX
  74906. p.add(0, func(m *_Encoding, v []interface{}) {
  74907. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  74908. m.emit(0x3a)
  74909. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  74910. })
  74911. }
  74912. // VPMINUW xmm, xmm, xmm{k}{z}
  74913. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  74914. self.require(ISA_AVX512VL | ISA_AVX512BW)
  74915. p.domain = DomainAVX
  74916. p.add(0, func(m *_Encoding, v []interface{}) {
  74917. m.emit(0x62)
  74918. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74919. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  74920. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  74921. m.emit(0x3a)
  74922. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74923. })
  74924. }
  74925. // VPMINUW m128, xmm, xmm{k}{z}
  74926. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  74927. self.require(ISA_AVX512VL | ISA_AVX512BW)
  74928. p.domain = DomainAVX
  74929. p.add(0, func(m *_Encoding, v []interface{}) {
  74930. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  74931. m.emit(0x3a)
  74932. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  74933. })
  74934. }
  74935. // VPMINUW ymm, ymm, ymm{k}{z}
  74936. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  74937. self.require(ISA_AVX512VL | ISA_AVX512BW)
  74938. p.domain = DomainAVX
  74939. p.add(0, func(m *_Encoding, v []interface{}) {
  74940. m.emit(0x62)
  74941. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  74942. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  74943. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  74944. m.emit(0x3a)
  74945. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  74946. })
  74947. }
  74948. // VPMINUW m256, ymm, ymm{k}{z}
  74949. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  74950. self.require(ISA_AVX512VL | ISA_AVX512BW)
  74951. p.domain = DomainAVX
  74952. p.add(0, func(m *_Encoding, v []interface{}) {
  74953. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  74954. m.emit(0x3a)
  74955. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  74956. })
  74957. }
  74958. if p.len == 0 {
  74959. panic("invalid operands for VPMINUW")
  74960. }
  74961. return p
  74962. }
  74963. // VPMOVB2M performs "Move Signs of Packed Byte Integers to Mask Register".
  74964. //
  74965. // Mnemonic : VPMOVB2M
  74966. // Supported forms : (3 forms)
  74967. //
  74968. // * VPMOVB2M zmm, k [AVX512BW]
  74969. // * VPMOVB2M xmm, k [AVX512BW,AVX512VL]
  74970. // * VPMOVB2M ymm, k [AVX512BW,AVX512VL]
  74971. //
  74972. func (self *Program) VPMOVB2M(v0 interface{}, v1 interface{}) *Instruction {
  74973. p := self.alloc("VPMOVB2M", 2, Operands { v0, v1 })
  74974. // VPMOVB2M zmm, k
  74975. if isZMM(v0) && isK(v1) {
  74976. self.require(ISA_AVX512BW)
  74977. p.domain = DomainAVX
  74978. p.add(0, func(m *_Encoding, v []interface{}) {
  74979. m.emit(0x62)
  74980. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  74981. m.emit(0x7e)
  74982. m.emit(0x48)
  74983. m.emit(0x29)
  74984. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  74985. })
  74986. }
  74987. // VPMOVB2M xmm, k
  74988. if isEVEXXMM(v0) && isK(v1) {
  74989. self.require(ISA_AVX512VL | ISA_AVX512BW)
  74990. p.domain = DomainAVX
  74991. p.add(0, func(m *_Encoding, v []interface{}) {
  74992. m.emit(0x62)
  74993. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  74994. m.emit(0x7e)
  74995. m.emit(0x08)
  74996. m.emit(0x29)
  74997. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  74998. })
  74999. }
  75000. // VPMOVB2M ymm, k
  75001. if isEVEXYMM(v0) && isK(v1) {
  75002. self.require(ISA_AVX512VL | ISA_AVX512BW)
  75003. p.domain = DomainAVX
  75004. p.add(0, func(m *_Encoding, v []interface{}) {
  75005. m.emit(0x62)
  75006. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  75007. m.emit(0x7e)
  75008. m.emit(0x28)
  75009. m.emit(0x29)
  75010. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  75011. })
  75012. }
  75013. if p.len == 0 {
  75014. panic("invalid operands for VPMOVB2M")
  75015. }
  75016. return p
  75017. }
  75018. // VPMOVD2M performs "Move Signs of Packed Doubleword Integers to Mask Register".
  75019. //
  75020. // Mnemonic : VPMOVD2M
  75021. // Supported forms : (3 forms)
  75022. //
  75023. // * VPMOVD2M zmm, k [AVX512DQ]
  75024. // * VPMOVD2M xmm, k [AVX512DQ,AVX512VL]
  75025. // * VPMOVD2M ymm, k [AVX512DQ,AVX512VL]
  75026. //
  75027. func (self *Program) VPMOVD2M(v0 interface{}, v1 interface{}) *Instruction {
  75028. p := self.alloc("VPMOVD2M", 2, Operands { v0, v1 })
  75029. // VPMOVD2M zmm, k
  75030. if isZMM(v0) && isK(v1) {
  75031. self.require(ISA_AVX512DQ)
  75032. p.domain = DomainAVX
  75033. p.add(0, func(m *_Encoding, v []interface{}) {
  75034. m.emit(0x62)
  75035. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  75036. m.emit(0x7e)
  75037. m.emit(0x48)
  75038. m.emit(0x39)
  75039. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  75040. })
  75041. }
  75042. // VPMOVD2M xmm, k
  75043. if isEVEXXMM(v0) && isK(v1) {
  75044. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  75045. p.domain = DomainAVX
  75046. p.add(0, func(m *_Encoding, v []interface{}) {
  75047. m.emit(0x62)
  75048. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  75049. m.emit(0x7e)
  75050. m.emit(0x08)
  75051. m.emit(0x39)
  75052. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  75053. })
  75054. }
  75055. // VPMOVD2M ymm, k
  75056. if isEVEXYMM(v0) && isK(v1) {
  75057. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  75058. p.domain = DomainAVX
  75059. p.add(0, func(m *_Encoding, v []interface{}) {
  75060. m.emit(0x62)
  75061. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  75062. m.emit(0x7e)
  75063. m.emit(0x28)
  75064. m.emit(0x39)
  75065. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  75066. })
  75067. }
  75068. if p.len == 0 {
  75069. panic("invalid operands for VPMOVD2M")
  75070. }
  75071. return p
  75072. }
  75073. // VPMOVDB performs "Down Convert Packed Doubleword Values to Byte Values with Truncation".
  75074. //
  75075. // Mnemonic : VPMOVDB
  75076. // Supported forms : (6 forms)
  75077. //
  75078. // * VPMOVDB zmm, xmm{k}{z} [AVX512F]
  75079. // * VPMOVDB zmm, m128{k}{z} [AVX512F]
  75080. // * VPMOVDB xmm, xmm{k}{z} [AVX512F,AVX512VL]
  75081. // * VPMOVDB xmm, m32{k}{z} [AVX512F,AVX512VL]
  75082. // * VPMOVDB ymm, xmm{k}{z} [AVX512F,AVX512VL]
  75083. // * VPMOVDB ymm, m64{k}{z} [AVX512F,AVX512VL]
  75084. //
  75085. func (self *Program) VPMOVDB(v0 interface{}, v1 interface{}) *Instruction {
  75086. p := self.alloc("VPMOVDB", 2, Operands { v0, v1 })
  75087. // VPMOVDB zmm, xmm{k}{z}
  75088. if isZMM(v0) && isXMMkz(v1) {
  75089. self.require(ISA_AVX512F)
  75090. p.domain = DomainAVX
  75091. p.add(0, func(m *_Encoding, v []interface{}) {
  75092. m.emit(0x62)
  75093. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  75094. m.emit(0x7e)
  75095. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  75096. m.emit(0x31)
  75097. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  75098. })
  75099. }
  75100. // VPMOVDB zmm, m128{k}{z}
  75101. if isZMM(v0) && isM128kz(v1) {
  75102. self.require(ISA_AVX512F)
  75103. p.domain = DomainAVX
  75104. p.add(0, func(m *_Encoding, v []interface{}) {
  75105. m.evex(0b10, 0x06, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  75106. m.emit(0x31)
  75107. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  75108. })
  75109. }
  75110. // VPMOVDB xmm, xmm{k}{z}
  75111. if isEVEXXMM(v0) && isXMMkz(v1) {
  75112. self.require(ISA_AVX512VL | ISA_AVX512F)
  75113. p.domain = DomainAVX
  75114. p.add(0, func(m *_Encoding, v []interface{}) {
  75115. m.emit(0x62)
  75116. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  75117. m.emit(0x7e)
  75118. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  75119. m.emit(0x31)
  75120. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  75121. })
  75122. }
  75123. // VPMOVDB xmm, m32{k}{z}
  75124. if isEVEXXMM(v0) && isM32kz(v1) {
  75125. self.require(ISA_AVX512VL | ISA_AVX512F)
  75126. p.domain = DomainAVX
  75127. p.add(0, func(m *_Encoding, v []interface{}) {
  75128. m.evex(0b10, 0x06, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  75129. m.emit(0x31)
  75130. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  75131. })
  75132. }
  75133. // VPMOVDB ymm, xmm{k}{z}
  75134. if isEVEXYMM(v0) && isXMMkz(v1) {
  75135. self.require(ISA_AVX512VL | ISA_AVX512F)
  75136. p.domain = DomainAVX
  75137. p.add(0, func(m *_Encoding, v []interface{}) {
  75138. m.emit(0x62)
  75139. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  75140. m.emit(0x7e)
  75141. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  75142. m.emit(0x31)
  75143. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  75144. })
  75145. }
  75146. // VPMOVDB ymm, m64{k}{z}
  75147. if isEVEXYMM(v0) && isM64kz(v1) {
  75148. self.require(ISA_AVX512VL | ISA_AVX512F)
  75149. p.domain = DomainAVX
  75150. p.add(0, func(m *_Encoding, v []interface{}) {
  75151. m.evex(0b10, 0x06, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  75152. m.emit(0x31)
  75153. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  75154. })
  75155. }
  75156. if p.len == 0 {
  75157. panic("invalid operands for VPMOVDB")
  75158. }
  75159. return p
  75160. }
  75161. // VPMOVDW performs "Down Convert Packed Doubleword Values to Word Values with Truncation".
  75162. //
  75163. // Mnemonic : VPMOVDW
  75164. // Supported forms : (6 forms)
  75165. //
  75166. // * VPMOVDW zmm, ymm{k}{z} [AVX512F]
  75167. // * VPMOVDW zmm, m256{k}{z} [AVX512F]
  75168. // * VPMOVDW xmm, xmm{k}{z} [AVX512F,AVX512VL]
  75169. // * VPMOVDW xmm, m64{k}{z} [AVX512F,AVX512VL]
  75170. // * VPMOVDW ymm, xmm{k}{z} [AVX512F,AVX512VL]
  75171. // * VPMOVDW ymm, m128{k}{z} [AVX512F,AVX512VL]
  75172. //
  75173. func (self *Program) VPMOVDW(v0 interface{}, v1 interface{}) *Instruction {
  75174. p := self.alloc("VPMOVDW", 2, Operands { v0, v1 })
  75175. // VPMOVDW zmm, ymm{k}{z}
  75176. if isZMM(v0) && isYMMkz(v1) {
  75177. self.require(ISA_AVX512F)
  75178. p.domain = DomainAVX
  75179. p.add(0, func(m *_Encoding, v []interface{}) {
  75180. m.emit(0x62)
  75181. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  75182. m.emit(0x7e)
  75183. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  75184. m.emit(0x33)
  75185. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  75186. })
  75187. }
  75188. // VPMOVDW zmm, m256{k}{z}
  75189. if isZMM(v0) && isM256kz(v1) {
  75190. self.require(ISA_AVX512F)
  75191. p.domain = DomainAVX
  75192. p.add(0, func(m *_Encoding, v []interface{}) {
  75193. m.evex(0b10, 0x06, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  75194. m.emit(0x33)
  75195. m.mrsd(lcode(v[0]), addr(v[1]), 32)
  75196. })
  75197. }
  75198. // VPMOVDW xmm, xmm{k}{z}
  75199. if isEVEXXMM(v0) && isXMMkz(v1) {
  75200. self.require(ISA_AVX512VL | ISA_AVX512F)
  75201. p.domain = DomainAVX
  75202. p.add(0, func(m *_Encoding, v []interface{}) {
  75203. m.emit(0x62)
  75204. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  75205. m.emit(0x7e)
  75206. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  75207. m.emit(0x33)
  75208. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  75209. })
  75210. }
  75211. // VPMOVDW xmm, m64{k}{z}
  75212. if isEVEXXMM(v0) && isM64kz(v1) {
  75213. self.require(ISA_AVX512VL | ISA_AVX512F)
  75214. p.domain = DomainAVX
  75215. p.add(0, func(m *_Encoding, v []interface{}) {
  75216. m.evex(0b10, 0x06, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  75217. m.emit(0x33)
  75218. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  75219. })
  75220. }
  75221. // VPMOVDW ymm, xmm{k}{z}
  75222. if isEVEXYMM(v0) && isXMMkz(v1) {
  75223. self.require(ISA_AVX512VL | ISA_AVX512F)
  75224. p.domain = DomainAVX
  75225. p.add(0, func(m *_Encoding, v []interface{}) {
  75226. m.emit(0x62)
  75227. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  75228. m.emit(0x7e)
  75229. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  75230. m.emit(0x33)
  75231. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  75232. })
  75233. }
  75234. // VPMOVDW ymm, m128{k}{z}
  75235. if isEVEXYMM(v0) && isM128kz(v1) {
  75236. self.require(ISA_AVX512VL | ISA_AVX512F)
  75237. p.domain = DomainAVX
  75238. p.add(0, func(m *_Encoding, v []interface{}) {
  75239. m.evex(0b10, 0x06, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  75240. m.emit(0x33)
  75241. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  75242. })
  75243. }
  75244. if p.len == 0 {
  75245. panic("invalid operands for VPMOVDW")
  75246. }
  75247. return p
  75248. }
  75249. // VPMOVM2B performs "Expand Bits of Mask Register to Packed Byte Integers".
  75250. //
  75251. // Mnemonic : VPMOVM2B
  75252. // Supported forms : (3 forms)
  75253. //
  75254. // * VPMOVM2B k, zmm [AVX512BW]
  75255. // * VPMOVM2B k, xmm [AVX512BW,AVX512VL]
  75256. // * VPMOVM2B k, ymm [AVX512BW,AVX512VL]
  75257. //
  75258. func (self *Program) VPMOVM2B(v0 interface{}, v1 interface{}) *Instruction {
  75259. p := self.alloc("VPMOVM2B", 2, Operands { v0, v1 })
  75260. // VPMOVM2B k, zmm
  75261. if isK(v0) && isZMM(v1) {
  75262. self.require(ISA_AVX512BW)
  75263. p.domain = DomainAVX
  75264. p.add(0, func(m *_Encoding, v []interface{}) {
  75265. m.emit(0x62)
  75266. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  75267. m.emit(0x7e)
  75268. m.emit(0x48)
  75269. m.emit(0x28)
  75270. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  75271. })
  75272. }
  75273. // VPMOVM2B k, xmm
  75274. if isK(v0) && isEVEXXMM(v1) {
  75275. self.require(ISA_AVX512VL | ISA_AVX512BW)
  75276. p.domain = DomainAVX
  75277. p.add(0, func(m *_Encoding, v []interface{}) {
  75278. m.emit(0x62)
  75279. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  75280. m.emit(0x7e)
  75281. m.emit(0x08)
  75282. m.emit(0x28)
  75283. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  75284. })
  75285. }
  75286. // VPMOVM2B k, ymm
  75287. if isK(v0) && isEVEXYMM(v1) {
  75288. self.require(ISA_AVX512VL | ISA_AVX512BW)
  75289. p.domain = DomainAVX
  75290. p.add(0, func(m *_Encoding, v []interface{}) {
  75291. m.emit(0x62)
  75292. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  75293. m.emit(0x7e)
  75294. m.emit(0x28)
  75295. m.emit(0x28)
  75296. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  75297. })
  75298. }
  75299. if p.len == 0 {
  75300. panic("invalid operands for VPMOVM2B")
  75301. }
  75302. return p
  75303. }
  75304. // VPMOVM2D performs "Expand Bits of Mask Register to Packed Doubleword Integers".
  75305. //
  75306. // Mnemonic : VPMOVM2D
  75307. // Supported forms : (3 forms)
  75308. //
  75309. // * VPMOVM2D k, zmm [AVX512DQ]
  75310. // * VPMOVM2D k, xmm [AVX512DQ,AVX512VL]
  75311. // * VPMOVM2D k, ymm [AVX512DQ,AVX512VL]
  75312. //
  75313. func (self *Program) VPMOVM2D(v0 interface{}, v1 interface{}) *Instruction {
  75314. p := self.alloc("VPMOVM2D", 2, Operands { v0, v1 })
  75315. // VPMOVM2D k, zmm
  75316. if isK(v0) && isZMM(v1) {
  75317. self.require(ISA_AVX512DQ)
  75318. p.domain = DomainAVX
  75319. p.add(0, func(m *_Encoding, v []interface{}) {
  75320. m.emit(0x62)
  75321. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  75322. m.emit(0x7e)
  75323. m.emit(0x48)
  75324. m.emit(0x38)
  75325. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  75326. })
  75327. }
  75328. // VPMOVM2D k, xmm
  75329. if isK(v0) && isEVEXXMM(v1) {
  75330. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  75331. p.domain = DomainAVX
  75332. p.add(0, func(m *_Encoding, v []interface{}) {
  75333. m.emit(0x62)
  75334. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  75335. m.emit(0x7e)
  75336. m.emit(0x08)
  75337. m.emit(0x38)
  75338. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  75339. })
  75340. }
  75341. // VPMOVM2D k, ymm
  75342. if isK(v0) && isEVEXYMM(v1) {
  75343. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  75344. p.domain = DomainAVX
  75345. p.add(0, func(m *_Encoding, v []interface{}) {
  75346. m.emit(0x62)
  75347. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  75348. m.emit(0x7e)
  75349. m.emit(0x28)
  75350. m.emit(0x38)
  75351. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  75352. })
  75353. }
  75354. if p.len == 0 {
  75355. panic("invalid operands for VPMOVM2D")
  75356. }
  75357. return p
  75358. }
  75359. // VPMOVM2Q performs "Expand Bits of Mask Register to Packed Quadword Integers".
  75360. //
  75361. // Mnemonic : VPMOVM2Q
  75362. // Supported forms : (3 forms)
  75363. //
  75364. // * VPMOVM2Q k, zmm [AVX512DQ]
  75365. // * VPMOVM2Q k, xmm [AVX512DQ,AVX512VL]
  75366. // * VPMOVM2Q k, ymm [AVX512DQ,AVX512VL]
  75367. //
  75368. func (self *Program) VPMOVM2Q(v0 interface{}, v1 interface{}) *Instruction {
  75369. p := self.alloc("VPMOVM2Q", 2, Operands { v0, v1 })
  75370. // VPMOVM2Q k, zmm
  75371. if isK(v0) && isZMM(v1) {
  75372. self.require(ISA_AVX512DQ)
  75373. p.domain = DomainAVX
  75374. p.add(0, func(m *_Encoding, v []interface{}) {
  75375. m.emit(0x62)
  75376. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  75377. m.emit(0xfe)
  75378. m.emit(0x48)
  75379. m.emit(0x38)
  75380. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  75381. })
  75382. }
  75383. // VPMOVM2Q k, xmm
  75384. if isK(v0) && isEVEXXMM(v1) {
  75385. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  75386. p.domain = DomainAVX
  75387. p.add(0, func(m *_Encoding, v []interface{}) {
  75388. m.emit(0x62)
  75389. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  75390. m.emit(0xfe)
  75391. m.emit(0x08)
  75392. m.emit(0x38)
  75393. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  75394. })
  75395. }
  75396. // VPMOVM2Q k, ymm
  75397. if isK(v0) && isEVEXYMM(v1) {
  75398. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  75399. p.domain = DomainAVX
  75400. p.add(0, func(m *_Encoding, v []interface{}) {
  75401. m.emit(0x62)
  75402. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  75403. m.emit(0xfe)
  75404. m.emit(0x28)
  75405. m.emit(0x38)
  75406. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  75407. })
  75408. }
  75409. if p.len == 0 {
  75410. panic("invalid operands for VPMOVM2Q")
  75411. }
  75412. return p
  75413. }
  75414. // VPMOVM2W performs "Expand Bits of Mask Register to Packed Word Integers".
  75415. //
  75416. // Mnemonic : VPMOVM2W
  75417. // Supported forms : (3 forms)
  75418. //
  75419. // * VPMOVM2W k, zmm [AVX512BW]
  75420. // * VPMOVM2W k, xmm [AVX512BW,AVX512VL]
  75421. // * VPMOVM2W k, ymm [AVX512BW,AVX512VL]
  75422. //
  75423. func (self *Program) VPMOVM2W(v0 interface{}, v1 interface{}) *Instruction {
  75424. p := self.alloc("VPMOVM2W", 2, Operands { v0, v1 })
  75425. // VPMOVM2W k, zmm
  75426. if isK(v0) && isZMM(v1) {
  75427. self.require(ISA_AVX512BW)
  75428. p.domain = DomainAVX
  75429. p.add(0, func(m *_Encoding, v []interface{}) {
  75430. m.emit(0x62)
  75431. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  75432. m.emit(0xfe)
  75433. m.emit(0x48)
  75434. m.emit(0x28)
  75435. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  75436. })
  75437. }
  75438. // VPMOVM2W k, xmm
  75439. if isK(v0) && isEVEXXMM(v1) {
  75440. self.require(ISA_AVX512VL | ISA_AVX512BW)
  75441. p.domain = DomainAVX
  75442. p.add(0, func(m *_Encoding, v []interface{}) {
  75443. m.emit(0x62)
  75444. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  75445. m.emit(0xfe)
  75446. m.emit(0x08)
  75447. m.emit(0x28)
  75448. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  75449. })
  75450. }
  75451. // VPMOVM2W k, ymm
  75452. if isK(v0) && isEVEXYMM(v1) {
  75453. self.require(ISA_AVX512VL | ISA_AVX512BW)
  75454. p.domain = DomainAVX
  75455. p.add(0, func(m *_Encoding, v []interface{}) {
  75456. m.emit(0x62)
  75457. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  75458. m.emit(0xfe)
  75459. m.emit(0x28)
  75460. m.emit(0x28)
  75461. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  75462. })
  75463. }
  75464. if p.len == 0 {
  75465. panic("invalid operands for VPMOVM2W")
  75466. }
  75467. return p
  75468. }
  75469. // VPMOVMSKB performs "Move Byte Mask".
  75470. //
  75471. // Mnemonic : VPMOVMSKB
  75472. // Supported forms : (2 forms)
  75473. //
  75474. // * VPMOVMSKB xmm, r32 [AVX]
  75475. // * VPMOVMSKB ymm, r32 [AVX2]
  75476. //
  75477. func (self *Program) VPMOVMSKB(v0 interface{}, v1 interface{}) *Instruction {
  75478. p := self.alloc("VPMOVMSKB", 2, Operands { v0, v1 })
  75479. // VPMOVMSKB xmm, r32
  75480. if isXMM(v0) && isReg32(v1) {
  75481. self.require(ISA_AVX)
  75482. p.domain = DomainAVX
  75483. p.add(0, func(m *_Encoding, v []interface{}) {
  75484. m.vex2(1, hcode(v[1]), v[0], 0)
  75485. m.emit(0xd7)
  75486. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  75487. })
  75488. }
  75489. // VPMOVMSKB ymm, r32
  75490. if isYMM(v0) && isReg32(v1) {
  75491. self.require(ISA_AVX2)
  75492. p.domain = DomainAVX
  75493. p.add(0, func(m *_Encoding, v []interface{}) {
  75494. m.vex2(5, hcode(v[1]), v[0], 0)
  75495. m.emit(0xd7)
  75496. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  75497. })
  75498. }
  75499. if p.len == 0 {
  75500. panic("invalid operands for VPMOVMSKB")
  75501. }
  75502. return p
  75503. }
  75504. // VPMOVQ2M performs "Move Signs of Packed Quadword Integers to Mask Register".
  75505. //
  75506. // Mnemonic : VPMOVQ2M
  75507. // Supported forms : (3 forms)
  75508. //
  75509. // * VPMOVQ2M zmm, k [AVX512DQ]
  75510. // * VPMOVQ2M xmm, k [AVX512DQ,AVX512VL]
  75511. // * VPMOVQ2M ymm, k [AVX512DQ,AVX512VL]
  75512. //
  75513. func (self *Program) VPMOVQ2M(v0 interface{}, v1 interface{}) *Instruction {
  75514. p := self.alloc("VPMOVQ2M", 2, Operands { v0, v1 })
  75515. // VPMOVQ2M zmm, k
  75516. if isZMM(v0) && isK(v1) {
  75517. self.require(ISA_AVX512DQ)
  75518. p.domain = DomainAVX
  75519. p.add(0, func(m *_Encoding, v []interface{}) {
  75520. m.emit(0x62)
  75521. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  75522. m.emit(0xfe)
  75523. m.emit(0x48)
  75524. m.emit(0x39)
  75525. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  75526. })
  75527. }
  75528. // VPMOVQ2M xmm, k
  75529. if isEVEXXMM(v0) && isK(v1) {
  75530. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  75531. p.domain = DomainAVX
  75532. p.add(0, func(m *_Encoding, v []interface{}) {
  75533. m.emit(0x62)
  75534. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  75535. m.emit(0xfe)
  75536. m.emit(0x08)
  75537. m.emit(0x39)
  75538. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  75539. })
  75540. }
  75541. // VPMOVQ2M ymm, k
  75542. if isEVEXYMM(v0) && isK(v1) {
  75543. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  75544. p.domain = DomainAVX
  75545. p.add(0, func(m *_Encoding, v []interface{}) {
  75546. m.emit(0x62)
  75547. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  75548. m.emit(0xfe)
  75549. m.emit(0x28)
  75550. m.emit(0x39)
  75551. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  75552. })
  75553. }
  75554. if p.len == 0 {
  75555. panic("invalid operands for VPMOVQ2M")
  75556. }
  75557. return p
  75558. }
  75559. // VPMOVQB performs "Down Convert Packed Quadword Values to Byte Values with Truncation".
  75560. //
  75561. // Mnemonic : VPMOVQB
  75562. // Supported forms : (6 forms)
  75563. //
  75564. // * VPMOVQB zmm, xmm{k}{z} [AVX512F]
  75565. // * VPMOVQB zmm, m64{k}{z} [AVX512F]
  75566. // * VPMOVQB xmm, xmm{k}{z} [AVX512F,AVX512VL]
  75567. // * VPMOVQB xmm, m16{k}{z} [AVX512F,AVX512VL]
  75568. // * VPMOVQB ymm, xmm{k}{z} [AVX512F,AVX512VL]
  75569. // * VPMOVQB ymm, m32{k}{z} [AVX512F,AVX512VL]
  75570. //
  75571. func (self *Program) VPMOVQB(v0 interface{}, v1 interface{}) *Instruction {
  75572. p := self.alloc("VPMOVQB", 2, Operands { v0, v1 })
  75573. // VPMOVQB zmm, xmm{k}{z}
  75574. if isZMM(v0) && isXMMkz(v1) {
  75575. self.require(ISA_AVX512F)
  75576. p.domain = DomainAVX
  75577. p.add(0, func(m *_Encoding, v []interface{}) {
  75578. m.emit(0x62)
  75579. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  75580. m.emit(0x7e)
  75581. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  75582. m.emit(0x32)
  75583. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  75584. })
  75585. }
  75586. // VPMOVQB zmm, m64{k}{z}
  75587. if isZMM(v0) && isM64kz(v1) {
  75588. self.require(ISA_AVX512F)
  75589. p.domain = DomainAVX
  75590. p.add(0, func(m *_Encoding, v []interface{}) {
  75591. m.evex(0b10, 0x06, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  75592. m.emit(0x32)
  75593. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  75594. })
  75595. }
  75596. // VPMOVQB xmm, xmm{k}{z}
  75597. if isEVEXXMM(v0) && isXMMkz(v1) {
  75598. self.require(ISA_AVX512VL | ISA_AVX512F)
  75599. p.domain = DomainAVX
  75600. p.add(0, func(m *_Encoding, v []interface{}) {
  75601. m.emit(0x62)
  75602. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  75603. m.emit(0x7e)
  75604. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  75605. m.emit(0x32)
  75606. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  75607. })
  75608. }
  75609. // VPMOVQB xmm, m16{k}{z}
  75610. if isEVEXXMM(v0) && isM16kz(v1) {
  75611. self.require(ISA_AVX512VL | ISA_AVX512F)
  75612. p.domain = DomainAVX
  75613. p.add(0, func(m *_Encoding, v []interface{}) {
  75614. m.evex(0b10, 0x06, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  75615. m.emit(0x32)
  75616. m.mrsd(lcode(v[0]), addr(v[1]), 2)
  75617. })
  75618. }
  75619. // VPMOVQB ymm, xmm{k}{z}
  75620. if isEVEXYMM(v0) && isXMMkz(v1) {
  75621. self.require(ISA_AVX512VL | ISA_AVX512F)
  75622. p.domain = DomainAVX
  75623. p.add(0, func(m *_Encoding, v []interface{}) {
  75624. m.emit(0x62)
  75625. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  75626. m.emit(0x7e)
  75627. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  75628. m.emit(0x32)
  75629. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  75630. })
  75631. }
  75632. // VPMOVQB ymm, m32{k}{z}
  75633. if isEVEXYMM(v0) && isM32kz(v1) {
  75634. self.require(ISA_AVX512VL | ISA_AVX512F)
  75635. p.domain = DomainAVX
  75636. p.add(0, func(m *_Encoding, v []interface{}) {
  75637. m.evex(0b10, 0x06, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  75638. m.emit(0x32)
  75639. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  75640. })
  75641. }
  75642. if p.len == 0 {
  75643. panic("invalid operands for VPMOVQB")
  75644. }
  75645. return p
  75646. }
  75647. // VPMOVQD performs "Down Convert Packed Quadword Values to Doubleword Values with Truncation".
  75648. //
  75649. // Mnemonic : VPMOVQD
  75650. // Supported forms : (6 forms)
  75651. //
  75652. // * VPMOVQD zmm, ymm{k}{z} [AVX512F]
  75653. // * VPMOVQD zmm, m256{k}{z} [AVX512F]
  75654. // * VPMOVQD xmm, xmm{k}{z} [AVX512F,AVX512VL]
  75655. // * VPMOVQD xmm, m64{k}{z} [AVX512F,AVX512VL]
  75656. // * VPMOVQD ymm, xmm{k}{z} [AVX512F,AVX512VL]
  75657. // * VPMOVQD ymm, m128{k}{z} [AVX512F,AVX512VL]
  75658. //
  75659. func (self *Program) VPMOVQD(v0 interface{}, v1 interface{}) *Instruction {
  75660. p := self.alloc("VPMOVQD", 2, Operands { v0, v1 })
  75661. // VPMOVQD zmm, ymm{k}{z}
  75662. if isZMM(v0) && isYMMkz(v1) {
  75663. self.require(ISA_AVX512F)
  75664. p.domain = DomainAVX
  75665. p.add(0, func(m *_Encoding, v []interface{}) {
  75666. m.emit(0x62)
  75667. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  75668. m.emit(0x7e)
  75669. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  75670. m.emit(0x35)
  75671. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  75672. })
  75673. }
  75674. // VPMOVQD zmm, m256{k}{z}
  75675. if isZMM(v0) && isM256kz(v1) {
  75676. self.require(ISA_AVX512F)
  75677. p.domain = DomainAVX
  75678. p.add(0, func(m *_Encoding, v []interface{}) {
  75679. m.evex(0b10, 0x06, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  75680. m.emit(0x35)
  75681. m.mrsd(lcode(v[0]), addr(v[1]), 32)
  75682. })
  75683. }
  75684. // VPMOVQD xmm, xmm{k}{z}
  75685. if isEVEXXMM(v0) && isXMMkz(v1) {
  75686. self.require(ISA_AVX512VL | ISA_AVX512F)
  75687. p.domain = DomainAVX
  75688. p.add(0, func(m *_Encoding, v []interface{}) {
  75689. m.emit(0x62)
  75690. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  75691. m.emit(0x7e)
  75692. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  75693. m.emit(0x35)
  75694. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  75695. })
  75696. }
  75697. // VPMOVQD xmm, m64{k}{z}
  75698. if isEVEXXMM(v0) && isM64kz(v1) {
  75699. self.require(ISA_AVX512VL | ISA_AVX512F)
  75700. p.domain = DomainAVX
  75701. p.add(0, func(m *_Encoding, v []interface{}) {
  75702. m.evex(0b10, 0x06, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  75703. m.emit(0x35)
  75704. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  75705. })
  75706. }
  75707. // VPMOVQD ymm, xmm{k}{z}
  75708. if isEVEXYMM(v0) && isXMMkz(v1) {
  75709. self.require(ISA_AVX512VL | ISA_AVX512F)
  75710. p.domain = DomainAVX
  75711. p.add(0, func(m *_Encoding, v []interface{}) {
  75712. m.emit(0x62)
  75713. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  75714. m.emit(0x7e)
  75715. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  75716. m.emit(0x35)
  75717. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  75718. })
  75719. }
  75720. // VPMOVQD ymm, m128{k}{z}
  75721. if isEVEXYMM(v0) && isM128kz(v1) {
  75722. self.require(ISA_AVX512VL | ISA_AVX512F)
  75723. p.domain = DomainAVX
  75724. p.add(0, func(m *_Encoding, v []interface{}) {
  75725. m.evex(0b10, 0x06, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  75726. m.emit(0x35)
  75727. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  75728. })
  75729. }
  75730. if p.len == 0 {
  75731. panic("invalid operands for VPMOVQD")
  75732. }
  75733. return p
  75734. }
  75735. // VPMOVQW performs "Down Convert Packed Quadword Values to Word Values with Truncation".
  75736. //
  75737. // Mnemonic : VPMOVQW
  75738. // Supported forms : (6 forms)
  75739. //
  75740. // * VPMOVQW zmm, xmm{k}{z} [AVX512F]
  75741. // * VPMOVQW zmm, m128{k}{z} [AVX512F]
  75742. // * VPMOVQW xmm, xmm{k}{z} [AVX512F,AVX512VL]
  75743. // * VPMOVQW xmm, m32{k}{z} [AVX512F,AVX512VL]
  75744. // * VPMOVQW ymm, xmm{k}{z} [AVX512F,AVX512VL]
  75745. // * VPMOVQW ymm, m64{k}{z} [AVX512F,AVX512VL]
  75746. //
  75747. func (self *Program) VPMOVQW(v0 interface{}, v1 interface{}) *Instruction {
  75748. p := self.alloc("VPMOVQW", 2, Operands { v0, v1 })
  75749. // VPMOVQW zmm, xmm{k}{z}
  75750. if isZMM(v0) && isXMMkz(v1) {
  75751. self.require(ISA_AVX512F)
  75752. p.domain = DomainAVX
  75753. p.add(0, func(m *_Encoding, v []interface{}) {
  75754. m.emit(0x62)
  75755. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  75756. m.emit(0x7e)
  75757. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  75758. m.emit(0x34)
  75759. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  75760. })
  75761. }
  75762. // VPMOVQW zmm, m128{k}{z}
  75763. if isZMM(v0) && isM128kz(v1) {
  75764. self.require(ISA_AVX512F)
  75765. p.domain = DomainAVX
  75766. p.add(0, func(m *_Encoding, v []interface{}) {
  75767. m.evex(0b10, 0x06, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  75768. m.emit(0x34)
  75769. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  75770. })
  75771. }
  75772. // VPMOVQW xmm, xmm{k}{z}
  75773. if isEVEXXMM(v0) && isXMMkz(v1) {
  75774. self.require(ISA_AVX512VL | ISA_AVX512F)
  75775. p.domain = DomainAVX
  75776. p.add(0, func(m *_Encoding, v []interface{}) {
  75777. m.emit(0x62)
  75778. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  75779. m.emit(0x7e)
  75780. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  75781. m.emit(0x34)
  75782. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  75783. })
  75784. }
  75785. // VPMOVQW xmm, m32{k}{z}
  75786. if isEVEXXMM(v0) && isM32kz(v1) {
  75787. self.require(ISA_AVX512VL | ISA_AVX512F)
  75788. p.domain = DomainAVX
  75789. p.add(0, func(m *_Encoding, v []interface{}) {
  75790. m.evex(0b10, 0x06, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  75791. m.emit(0x34)
  75792. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  75793. })
  75794. }
  75795. // VPMOVQW ymm, xmm{k}{z}
  75796. if isEVEXYMM(v0) && isXMMkz(v1) {
  75797. self.require(ISA_AVX512VL | ISA_AVX512F)
  75798. p.domain = DomainAVX
  75799. p.add(0, func(m *_Encoding, v []interface{}) {
  75800. m.emit(0x62)
  75801. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  75802. m.emit(0x7e)
  75803. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  75804. m.emit(0x34)
  75805. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  75806. })
  75807. }
  75808. // VPMOVQW ymm, m64{k}{z}
  75809. if isEVEXYMM(v0) && isM64kz(v1) {
  75810. self.require(ISA_AVX512VL | ISA_AVX512F)
  75811. p.domain = DomainAVX
  75812. p.add(0, func(m *_Encoding, v []interface{}) {
  75813. m.evex(0b10, 0x06, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  75814. m.emit(0x34)
  75815. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  75816. })
  75817. }
  75818. if p.len == 0 {
  75819. panic("invalid operands for VPMOVQW")
  75820. }
  75821. return p
  75822. }
  75823. // VPMOVSDB performs "Down Convert Packed Doubleword Values to Byte Values with Signed Saturation".
  75824. //
  75825. // Mnemonic : VPMOVSDB
  75826. // Supported forms : (6 forms)
  75827. //
  75828. // * VPMOVSDB zmm, xmm{k}{z} [AVX512F]
  75829. // * VPMOVSDB zmm, m128{k}{z} [AVX512F]
  75830. // * VPMOVSDB xmm, xmm{k}{z} [AVX512F,AVX512VL]
  75831. // * VPMOVSDB xmm, m32{k}{z} [AVX512F,AVX512VL]
  75832. // * VPMOVSDB ymm, xmm{k}{z} [AVX512F,AVX512VL]
  75833. // * VPMOVSDB ymm, m64{k}{z} [AVX512F,AVX512VL]
  75834. //
  75835. func (self *Program) VPMOVSDB(v0 interface{}, v1 interface{}) *Instruction {
  75836. p := self.alloc("VPMOVSDB", 2, Operands { v0, v1 })
  75837. // VPMOVSDB zmm, xmm{k}{z}
  75838. if isZMM(v0) && isXMMkz(v1) {
  75839. self.require(ISA_AVX512F)
  75840. p.domain = DomainAVX
  75841. p.add(0, func(m *_Encoding, v []interface{}) {
  75842. m.emit(0x62)
  75843. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  75844. m.emit(0x7e)
  75845. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  75846. m.emit(0x21)
  75847. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  75848. })
  75849. }
  75850. // VPMOVSDB zmm, m128{k}{z}
  75851. if isZMM(v0) && isM128kz(v1) {
  75852. self.require(ISA_AVX512F)
  75853. p.domain = DomainAVX
  75854. p.add(0, func(m *_Encoding, v []interface{}) {
  75855. m.evex(0b10, 0x06, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  75856. m.emit(0x21)
  75857. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  75858. })
  75859. }
  75860. // VPMOVSDB xmm, xmm{k}{z}
  75861. if isEVEXXMM(v0) && isXMMkz(v1) {
  75862. self.require(ISA_AVX512VL | ISA_AVX512F)
  75863. p.domain = DomainAVX
  75864. p.add(0, func(m *_Encoding, v []interface{}) {
  75865. m.emit(0x62)
  75866. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  75867. m.emit(0x7e)
  75868. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  75869. m.emit(0x21)
  75870. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  75871. })
  75872. }
  75873. // VPMOVSDB xmm, m32{k}{z}
  75874. if isEVEXXMM(v0) && isM32kz(v1) {
  75875. self.require(ISA_AVX512VL | ISA_AVX512F)
  75876. p.domain = DomainAVX
  75877. p.add(0, func(m *_Encoding, v []interface{}) {
  75878. m.evex(0b10, 0x06, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  75879. m.emit(0x21)
  75880. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  75881. })
  75882. }
  75883. // VPMOVSDB ymm, xmm{k}{z}
  75884. if isEVEXYMM(v0) && isXMMkz(v1) {
  75885. self.require(ISA_AVX512VL | ISA_AVX512F)
  75886. p.domain = DomainAVX
  75887. p.add(0, func(m *_Encoding, v []interface{}) {
  75888. m.emit(0x62)
  75889. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  75890. m.emit(0x7e)
  75891. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  75892. m.emit(0x21)
  75893. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  75894. })
  75895. }
  75896. // VPMOVSDB ymm, m64{k}{z}
  75897. if isEVEXYMM(v0) && isM64kz(v1) {
  75898. self.require(ISA_AVX512VL | ISA_AVX512F)
  75899. p.domain = DomainAVX
  75900. p.add(0, func(m *_Encoding, v []interface{}) {
  75901. m.evex(0b10, 0x06, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  75902. m.emit(0x21)
  75903. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  75904. })
  75905. }
  75906. if p.len == 0 {
  75907. panic("invalid operands for VPMOVSDB")
  75908. }
  75909. return p
  75910. }
  75911. // VPMOVSDW performs "Down Convert Packed Doubleword Values to Word Values with Signed Saturation".
  75912. //
  75913. // Mnemonic : VPMOVSDW
  75914. // Supported forms : (6 forms)
  75915. //
  75916. // * VPMOVSDW zmm, ymm{k}{z} [AVX512F]
  75917. // * VPMOVSDW zmm, m256{k}{z} [AVX512F]
  75918. // * VPMOVSDW xmm, xmm{k}{z} [AVX512F,AVX512VL]
  75919. // * VPMOVSDW xmm, m64{k}{z} [AVX512F,AVX512VL]
  75920. // * VPMOVSDW ymm, xmm{k}{z} [AVX512F,AVX512VL]
  75921. // * VPMOVSDW ymm, m128{k}{z} [AVX512F,AVX512VL]
  75922. //
  75923. func (self *Program) VPMOVSDW(v0 interface{}, v1 interface{}) *Instruction {
  75924. p := self.alloc("VPMOVSDW", 2, Operands { v0, v1 })
  75925. // VPMOVSDW zmm, ymm{k}{z}
  75926. if isZMM(v0) && isYMMkz(v1) {
  75927. self.require(ISA_AVX512F)
  75928. p.domain = DomainAVX
  75929. p.add(0, func(m *_Encoding, v []interface{}) {
  75930. m.emit(0x62)
  75931. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  75932. m.emit(0x7e)
  75933. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  75934. m.emit(0x23)
  75935. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  75936. })
  75937. }
  75938. // VPMOVSDW zmm, m256{k}{z}
  75939. if isZMM(v0) && isM256kz(v1) {
  75940. self.require(ISA_AVX512F)
  75941. p.domain = DomainAVX
  75942. p.add(0, func(m *_Encoding, v []interface{}) {
  75943. m.evex(0b10, 0x06, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  75944. m.emit(0x23)
  75945. m.mrsd(lcode(v[0]), addr(v[1]), 32)
  75946. })
  75947. }
  75948. // VPMOVSDW xmm, xmm{k}{z}
  75949. if isEVEXXMM(v0) && isXMMkz(v1) {
  75950. self.require(ISA_AVX512VL | ISA_AVX512F)
  75951. p.domain = DomainAVX
  75952. p.add(0, func(m *_Encoding, v []interface{}) {
  75953. m.emit(0x62)
  75954. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  75955. m.emit(0x7e)
  75956. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  75957. m.emit(0x23)
  75958. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  75959. })
  75960. }
  75961. // VPMOVSDW xmm, m64{k}{z}
  75962. if isEVEXXMM(v0) && isM64kz(v1) {
  75963. self.require(ISA_AVX512VL | ISA_AVX512F)
  75964. p.domain = DomainAVX
  75965. p.add(0, func(m *_Encoding, v []interface{}) {
  75966. m.evex(0b10, 0x06, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  75967. m.emit(0x23)
  75968. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  75969. })
  75970. }
  75971. // VPMOVSDW ymm, xmm{k}{z}
  75972. if isEVEXYMM(v0) && isXMMkz(v1) {
  75973. self.require(ISA_AVX512VL | ISA_AVX512F)
  75974. p.domain = DomainAVX
  75975. p.add(0, func(m *_Encoding, v []interface{}) {
  75976. m.emit(0x62)
  75977. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  75978. m.emit(0x7e)
  75979. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  75980. m.emit(0x23)
  75981. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  75982. })
  75983. }
  75984. // VPMOVSDW ymm, m128{k}{z}
  75985. if isEVEXYMM(v0) && isM128kz(v1) {
  75986. self.require(ISA_AVX512VL | ISA_AVX512F)
  75987. p.domain = DomainAVX
  75988. p.add(0, func(m *_Encoding, v []interface{}) {
  75989. m.evex(0b10, 0x06, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  75990. m.emit(0x23)
  75991. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  75992. })
  75993. }
  75994. if p.len == 0 {
  75995. panic("invalid operands for VPMOVSDW")
  75996. }
  75997. return p
  75998. }
  75999. // VPMOVSQB performs "Down Convert Packed Quadword Values to Byte Values with Signed Saturation".
  76000. //
  76001. // Mnemonic : VPMOVSQB
  76002. // Supported forms : (6 forms)
  76003. //
  76004. // * VPMOVSQB zmm, xmm{k}{z} [AVX512F]
  76005. // * VPMOVSQB zmm, m64{k}{z} [AVX512F]
  76006. // * VPMOVSQB xmm, xmm{k}{z} [AVX512F,AVX512VL]
  76007. // * VPMOVSQB xmm, m16{k}{z} [AVX512F,AVX512VL]
  76008. // * VPMOVSQB ymm, xmm{k}{z} [AVX512F,AVX512VL]
  76009. // * VPMOVSQB ymm, m32{k}{z} [AVX512F,AVX512VL]
  76010. //
  76011. func (self *Program) VPMOVSQB(v0 interface{}, v1 interface{}) *Instruction {
  76012. p := self.alloc("VPMOVSQB", 2, Operands { v0, v1 })
  76013. // VPMOVSQB zmm, xmm{k}{z}
  76014. if isZMM(v0) && isXMMkz(v1) {
  76015. self.require(ISA_AVX512F)
  76016. p.domain = DomainAVX
  76017. p.add(0, func(m *_Encoding, v []interface{}) {
  76018. m.emit(0x62)
  76019. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  76020. m.emit(0x7e)
  76021. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  76022. m.emit(0x22)
  76023. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  76024. })
  76025. }
  76026. // VPMOVSQB zmm, m64{k}{z}
  76027. if isZMM(v0) && isM64kz(v1) {
  76028. self.require(ISA_AVX512F)
  76029. p.domain = DomainAVX
  76030. p.add(0, func(m *_Encoding, v []interface{}) {
  76031. m.evex(0b10, 0x06, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  76032. m.emit(0x22)
  76033. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  76034. })
  76035. }
  76036. // VPMOVSQB xmm, xmm{k}{z}
  76037. if isEVEXXMM(v0) && isXMMkz(v1) {
  76038. self.require(ISA_AVX512VL | ISA_AVX512F)
  76039. p.domain = DomainAVX
  76040. p.add(0, func(m *_Encoding, v []interface{}) {
  76041. m.emit(0x62)
  76042. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  76043. m.emit(0x7e)
  76044. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  76045. m.emit(0x22)
  76046. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  76047. })
  76048. }
  76049. // VPMOVSQB xmm, m16{k}{z}
  76050. if isEVEXXMM(v0) && isM16kz(v1) {
  76051. self.require(ISA_AVX512VL | ISA_AVX512F)
  76052. p.domain = DomainAVX
  76053. p.add(0, func(m *_Encoding, v []interface{}) {
  76054. m.evex(0b10, 0x06, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  76055. m.emit(0x22)
  76056. m.mrsd(lcode(v[0]), addr(v[1]), 2)
  76057. })
  76058. }
  76059. // VPMOVSQB ymm, xmm{k}{z}
  76060. if isEVEXYMM(v0) && isXMMkz(v1) {
  76061. self.require(ISA_AVX512VL | ISA_AVX512F)
  76062. p.domain = DomainAVX
  76063. p.add(0, func(m *_Encoding, v []interface{}) {
  76064. m.emit(0x62)
  76065. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  76066. m.emit(0x7e)
  76067. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  76068. m.emit(0x22)
  76069. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  76070. })
  76071. }
  76072. // VPMOVSQB ymm, m32{k}{z}
  76073. if isEVEXYMM(v0) && isM32kz(v1) {
  76074. self.require(ISA_AVX512VL | ISA_AVX512F)
  76075. p.domain = DomainAVX
  76076. p.add(0, func(m *_Encoding, v []interface{}) {
  76077. m.evex(0b10, 0x06, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  76078. m.emit(0x22)
  76079. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  76080. })
  76081. }
  76082. if p.len == 0 {
  76083. panic("invalid operands for VPMOVSQB")
  76084. }
  76085. return p
  76086. }
  76087. // VPMOVSQD performs "Down Convert Packed Quadword Values to Doubleword Values with Signed Saturation".
  76088. //
  76089. // Mnemonic : VPMOVSQD
  76090. // Supported forms : (6 forms)
  76091. //
  76092. // * VPMOVSQD zmm, ymm{k}{z} [AVX512F]
  76093. // * VPMOVSQD zmm, m256{k}{z} [AVX512F]
  76094. // * VPMOVSQD xmm, xmm{k}{z} [AVX512F,AVX512VL]
  76095. // * VPMOVSQD xmm, m64{k}{z} [AVX512F,AVX512VL]
  76096. // * VPMOVSQD ymm, xmm{k}{z} [AVX512F,AVX512VL]
  76097. // * VPMOVSQD ymm, m128{k}{z} [AVX512F,AVX512VL]
  76098. //
  76099. func (self *Program) VPMOVSQD(v0 interface{}, v1 interface{}) *Instruction {
  76100. p := self.alloc("VPMOVSQD", 2, Operands { v0, v1 })
  76101. // VPMOVSQD zmm, ymm{k}{z}
  76102. if isZMM(v0) && isYMMkz(v1) {
  76103. self.require(ISA_AVX512F)
  76104. p.domain = DomainAVX
  76105. p.add(0, func(m *_Encoding, v []interface{}) {
  76106. m.emit(0x62)
  76107. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  76108. m.emit(0x7e)
  76109. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  76110. m.emit(0x25)
  76111. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  76112. })
  76113. }
  76114. // VPMOVSQD zmm, m256{k}{z}
  76115. if isZMM(v0) && isM256kz(v1) {
  76116. self.require(ISA_AVX512F)
  76117. p.domain = DomainAVX
  76118. p.add(0, func(m *_Encoding, v []interface{}) {
  76119. m.evex(0b10, 0x06, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  76120. m.emit(0x25)
  76121. m.mrsd(lcode(v[0]), addr(v[1]), 32)
  76122. })
  76123. }
  76124. // VPMOVSQD xmm, xmm{k}{z}
  76125. if isEVEXXMM(v0) && isXMMkz(v1) {
  76126. self.require(ISA_AVX512VL | ISA_AVX512F)
  76127. p.domain = DomainAVX
  76128. p.add(0, func(m *_Encoding, v []interface{}) {
  76129. m.emit(0x62)
  76130. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  76131. m.emit(0x7e)
  76132. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  76133. m.emit(0x25)
  76134. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  76135. })
  76136. }
  76137. // VPMOVSQD xmm, m64{k}{z}
  76138. if isEVEXXMM(v0) && isM64kz(v1) {
  76139. self.require(ISA_AVX512VL | ISA_AVX512F)
  76140. p.domain = DomainAVX
  76141. p.add(0, func(m *_Encoding, v []interface{}) {
  76142. m.evex(0b10, 0x06, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  76143. m.emit(0x25)
  76144. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  76145. })
  76146. }
  76147. // VPMOVSQD ymm, xmm{k}{z}
  76148. if isEVEXYMM(v0) && isXMMkz(v1) {
  76149. self.require(ISA_AVX512VL | ISA_AVX512F)
  76150. p.domain = DomainAVX
  76151. p.add(0, func(m *_Encoding, v []interface{}) {
  76152. m.emit(0x62)
  76153. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  76154. m.emit(0x7e)
  76155. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  76156. m.emit(0x25)
  76157. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  76158. })
  76159. }
  76160. // VPMOVSQD ymm, m128{k}{z}
  76161. if isEVEXYMM(v0) && isM128kz(v1) {
  76162. self.require(ISA_AVX512VL | ISA_AVX512F)
  76163. p.domain = DomainAVX
  76164. p.add(0, func(m *_Encoding, v []interface{}) {
  76165. m.evex(0b10, 0x06, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  76166. m.emit(0x25)
  76167. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  76168. })
  76169. }
  76170. if p.len == 0 {
  76171. panic("invalid operands for VPMOVSQD")
  76172. }
  76173. return p
  76174. }
  76175. // VPMOVSQW performs "Down Convert Packed Quadword Values to Word Values with Signed Saturation".
  76176. //
  76177. // Mnemonic : VPMOVSQW
  76178. // Supported forms : (6 forms)
  76179. //
  76180. // * VPMOVSQW zmm, xmm{k}{z} [AVX512F]
  76181. // * VPMOVSQW zmm, m128{k}{z} [AVX512F]
  76182. // * VPMOVSQW xmm, xmm{k}{z} [AVX512F,AVX512VL]
  76183. // * VPMOVSQW xmm, m32{k}{z} [AVX512F,AVX512VL]
  76184. // * VPMOVSQW ymm, xmm{k}{z} [AVX512F,AVX512VL]
  76185. // * VPMOVSQW ymm, m64{k}{z} [AVX512F,AVX512VL]
  76186. //
  76187. func (self *Program) VPMOVSQW(v0 interface{}, v1 interface{}) *Instruction {
  76188. p := self.alloc("VPMOVSQW", 2, Operands { v0, v1 })
  76189. // VPMOVSQW zmm, xmm{k}{z}
  76190. if isZMM(v0) && isXMMkz(v1) {
  76191. self.require(ISA_AVX512F)
  76192. p.domain = DomainAVX
  76193. p.add(0, func(m *_Encoding, v []interface{}) {
  76194. m.emit(0x62)
  76195. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  76196. m.emit(0x7e)
  76197. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  76198. m.emit(0x24)
  76199. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  76200. })
  76201. }
  76202. // VPMOVSQW zmm, m128{k}{z}
  76203. if isZMM(v0) && isM128kz(v1) {
  76204. self.require(ISA_AVX512F)
  76205. p.domain = DomainAVX
  76206. p.add(0, func(m *_Encoding, v []interface{}) {
  76207. m.evex(0b10, 0x06, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  76208. m.emit(0x24)
  76209. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  76210. })
  76211. }
  76212. // VPMOVSQW xmm, xmm{k}{z}
  76213. if isEVEXXMM(v0) && isXMMkz(v1) {
  76214. self.require(ISA_AVX512VL | ISA_AVX512F)
  76215. p.domain = DomainAVX
  76216. p.add(0, func(m *_Encoding, v []interface{}) {
  76217. m.emit(0x62)
  76218. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  76219. m.emit(0x7e)
  76220. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  76221. m.emit(0x24)
  76222. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  76223. })
  76224. }
  76225. // VPMOVSQW xmm, m32{k}{z}
  76226. if isEVEXXMM(v0) && isM32kz(v1) {
  76227. self.require(ISA_AVX512VL | ISA_AVX512F)
  76228. p.domain = DomainAVX
  76229. p.add(0, func(m *_Encoding, v []interface{}) {
  76230. m.evex(0b10, 0x06, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  76231. m.emit(0x24)
  76232. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  76233. })
  76234. }
  76235. // VPMOVSQW ymm, xmm{k}{z}
  76236. if isEVEXYMM(v0) && isXMMkz(v1) {
  76237. self.require(ISA_AVX512VL | ISA_AVX512F)
  76238. p.domain = DomainAVX
  76239. p.add(0, func(m *_Encoding, v []interface{}) {
  76240. m.emit(0x62)
  76241. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  76242. m.emit(0x7e)
  76243. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  76244. m.emit(0x24)
  76245. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  76246. })
  76247. }
  76248. // VPMOVSQW ymm, m64{k}{z}
  76249. if isEVEXYMM(v0) && isM64kz(v1) {
  76250. self.require(ISA_AVX512VL | ISA_AVX512F)
  76251. p.domain = DomainAVX
  76252. p.add(0, func(m *_Encoding, v []interface{}) {
  76253. m.evex(0b10, 0x06, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  76254. m.emit(0x24)
  76255. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  76256. })
  76257. }
  76258. if p.len == 0 {
  76259. panic("invalid operands for VPMOVSQW")
  76260. }
  76261. return p
  76262. }
  76263. // VPMOVSWB performs "Down Convert Packed Word Values to Byte Values with Signed Saturation".
  76264. //
  76265. // Mnemonic : VPMOVSWB
  76266. // Supported forms : (6 forms)
  76267. //
  76268. // * VPMOVSWB zmm, ymm{k}{z} [AVX512BW]
  76269. // * VPMOVSWB zmm, m256{k}{z} [AVX512BW]
  76270. // * VPMOVSWB xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  76271. // * VPMOVSWB xmm, m64{k}{z} [AVX512BW,AVX512VL]
  76272. // * VPMOVSWB ymm, xmm{k}{z} [AVX512BW,AVX512VL]
  76273. // * VPMOVSWB ymm, m128{k}{z} [AVX512BW,AVX512VL]
  76274. //
  76275. func (self *Program) VPMOVSWB(v0 interface{}, v1 interface{}) *Instruction {
  76276. p := self.alloc("VPMOVSWB", 2, Operands { v0, v1 })
  76277. // VPMOVSWB zmm, ymm{k}{z}
  76278. if isZMM(v0) && isYMMkz(v1) {
  76279. self.require(ISA_AVX512BW)
  76280. p.domain = DomainAVX
  76281. p.add(0, func(m *_Encoding, v []interface{}) {
  76282. m.emit(0x62)
  76283. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  76284. m.emit(0x7e)
  76285. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  76286. m.emit(0x20)
  76287. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  76288. })
  76289. }
  76290. // VPMOVSWB zmm, m256{k}{z}
  76291. if isZMM(v0) && isM256kz(v1) {
  76292. self.require(ISA_AVX512BW)
  76293. p.domain = DomainAVX
  76294. p.add(0, func(m *_Encoding, v []interface{}) {
  76295. m.evex(0b10, 0x06, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  76296. m.emit(0x20)
  76297. m.mrsd(lcode(v[0]), addr(v[1]), 32)
  76298. })
  76299. }
  76300. // VPMOVSWB xmm, xmm{k}{z}
  76301. if isEVEXXMM(v0) && isXMMkz(v1) {
  76302. self.require(ISA_AVX512VL | ISA_AVX512BW)
  76303. p.domain = DomainAVX
  76304. p.add(0, func(m *_Encoding, v []interface{}) {
  76305. m.emit(0x62)
  76306. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  76307. m.emit(0x7e)
  76308. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  76309. m.emit(0x20)
  76310. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  76311. })
  76312. }
  76313. // VPMOVSWB xmm, m64{k}{z}
  76314. if isEVEXXMM(v0) && isM64kz(v1) {
  76315. self.require(ISA_AVX512VL | ISA_AVX512BW)
  76316. p.domain = DomainAVX
  76317. p.add(0, func(m *_Encoding, v []interface{}) {
  76318. m.evex(0b10, 0x06, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  76319. m.emit(0x20)
  76320. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  76321. })
  76322. }
  76323. // VPMOVSWB ymm, xmm{k}{z}
  76324. if isEVEXYMM(v0) && isXMMkz(v1) {
  76325. self.require(ISA_AVX512VL | ISA_AVX512BW)
  76326. p.domain = DomainAVX
  76327. p.add(0, func(m *_Encoding, v []interface{}) {
  76328. m.emit(0x62)
  76329. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  76330. m.emit(0x7e)
  76331. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  76332. m.emit(0x20)
  76333. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  76334. })
  76335. }
  76336. // VPMOVSWB ymm, m128{k}{z}
  76337. if isEVEXYMM(v0) && isM128kz(v1) {
  76338. self.require(ISA_AVX512VL | ISA_AVX512BW)
  76339. p.domain = DomainAVX
  76340. p.add(0, func(m *_Encoding, v []interface{}) {
  76341. m.evex(0b10, 0x06, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  76342. m.emit(0x20)
  76343. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  76344. })
  76345. }
  76346. if p.len == 0 {
  76347. panic("invalid operands for VPMOVSWB")
  76348. }
  76349. return p
  76350. }
  76351. // VPMOVSXBD performs "Move Packed Byte Integers to Doubleword Integers with Sign Extension".
  76352. //
  76353. // Mnemonic : VPMOVSXBD
  76354. // Supported forms : (10 forms)
  76355. //
  76356. // * VPMOVSXBD xmm, xmm [AVX]
  76357. // * VPMOVSXBD m32, xmm [AVX]
  76358. // * VPMOVSXBD xmm, ymm [AVX2]
  76359. // * VPMOVSXBD m64, ymm [AVX2]
  76360. // * VPMOVSXBD xmm, zmm{k}{z} [AVX512F]
  76361. // * VPMOVSXBD m128, zmm{k}{z} [AVX512F]
  76362. // * VPMOVSXBD xmm, xmm{k}{z} [AVX512F,AVX512VL]
  76363. // * VPMOVSXBD xmm, ymm{k}{z} [AVX512F,AVX512VL]
  76364. // * VPMOVSXBD m32, xmm{k}{z} [AVX512F,AVX512VL]
  76365. // * VPMOVSXBD m64, ymm{k}{z} [AVX512F,AVX512VL]
  76366. //
  76367. func (self *Program) VPMOVSXBD(v0 interface{}, v1 interface{}) *Instruction {
  76368. p := self.alloc("VPMOVSXBD", 2, Operands { v0, v1 })
  76369. // VPMOVSXBD xmm, xmm
  76370. if isXMM(v0) && isXMM(v1) {
  76371. self.require(ISA_AVX)
  76372. p.domain = DomainAVX
  76373. p.add(0, func(m *_Encoding, v []interface{}) {
  76374. m.emit(0xc4)
  76375. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  76376. m.emit(0x79)
  76377. m.emit(0x21)
  76378. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76379. })
  76380. }
  76381. // VPMOVSXBD m32, xmm
  76382. if isM32(v0) && isXMM(v1) {
  76383. self.require(ISA_AVX)
  76384. p.domain = DomainAVX
  76385. p.add(0, func(m *_Encoding, v []interface{}) {
  76386. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  76387. m.emit(0x21)
  76388. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  76389. })
  76390. }
  76391. // VPMOVSXBD xmm, ymm
  76392. if isXMM(v0) && isYMM(v1) {
  76393. self.require(ISA_AVX2)
  76394. p.domain = DomainAVX
  76395. p.add(0, func(m *_Encoding, v []interface{}) {
  76396. m.emit(0xc4)
  76397. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  76398. m.emit(0x7d)
  76399. m.emit(0x21)
  76400. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76401. })
  76402. }
  76403. // VPMOVSXBD m64, ymm
  76404. if isM64(v0) && isYMM(v1) {
  76405. self.require(ISA_AVX2)
  76406. p.domain = DomainAVX
  76407. p.add(0, func(m *_Encoding, v []interface{}) {
  76408. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  76409. m.emit(0x21)
  76410. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  76411. })
  76412. }
  76413. // VPMOVSXBD xmm, zmm{k}{z}
  76414. if isEVEXXMM(v0) && isZMMkz(v1) {
  76415. self.require(ISA_AVX512F)
  76416. p.domain = DomainAVX
  76417. p.add(0, func(m *_Encoding, v []interface{}) {
  76418. m.emit(0x62)
  76419. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  76420. m.emit(0x7d)
  76421. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  76422. m.emit(0x21)
  76423. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76424. })
  76425. }
  76426. // VPMOVSXBD m128, zmm{k}{z}
  76427. if isM128(v0) && isZMMkz(v1) {
  76428. self.require(ISA_AVX512F)
  76429. p.domain = DomainAVX
  76430. p.add(0, func(m *_Encoding, v []interface{}) {
  76431. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  76432. m.emit(0x21)
  76433. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  76434. })
  76435. }
  76436. // VPMOVSXBD xmm, xmm{k}{z}
  76437. if isEVEXXMM(v0) && isXMMkz(v1) {
  76438. self.require(ISA_AVX512VL | ISA_AVX512F)
  76439. p.domain = DomainAVX
  76440. p.add(0, func(m *_Encoding, v []interface{}) {
  76441. m.emit(0x62)
  76442. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  76443. m.emit(0x7d)
  76444. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  76445. m.emit(0x21)
  76446. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76447. })
  76448. }
  76449. // VPMOVSXBD xmm, ymm{k}{z}
  76450. if isEVEXXMM(v0) && isYMMkz(v1) {
  76451. self.require(ISA_AVX512VL | ISA_AVX512F)
  76452. p.domain = DomainAVX
  76453. p.add(0, func(m *_Encoding, v []interface{}) {
  76454. m.emit(0x62)
  76455. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  76456. m.emit(0x7d)
  76457. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  76458. m.emit(0x21)
  76459. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76460. })
  76461. }
  76462. // VPMOVSXBD m32, xmm{k}{z}
  76463. if isM32(v0) && isXMMkz(v1) {
  76464. self.require(ISA_AVX512VL | ISA_AVX512F)
  76465. p.domain = DomainAVX
  76466. p.add(0, func(m *_Encoding, v []interface{}) {
  76467. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  76468. m.emit(0x21)
  76469. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  76470. })
  76471. }
  76472. // VPMOVSXBD m64, ymm{k}{z}
  76473. if isM64(v0) && isYMMkz(v1) {
  76474. self.require(ISA_AVX512VL | ISA_AVX512F)
  76475. p.domain = DomainAVX
  76476. p.add(0, func(m *_Encoding, v []interface{}) {
  76477. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  76478. m.emit(0x21)
  76479. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  76480. })
  76481. }
  76482. if p.len == 0 {
  76483. panic("invalid operands for VPMOVSXBD")
  76484. }
  76485. return p
  76486. }
  76487. // VPMOVSXBQ performs "Move Packed Byte Integers to Quadword Integers with Sign Extension".
  76488. //
  76489. // Mnemonic : VPMOVSXBQ
  76490. // Supported forms : (10 forms)
  76491. //
  76492. // * VPMOVSXBQ xmm, xmm [AVX]
  76493. // * VPMOVSXBQ m16, xmm [AVX]
  76494. // * VPMOVSXBQ xmm, ymm [AVX2]
  76495. // * VPMOVSXBQ m32, ymm [AVX2]
  76496. // * VPMOVSXBQ xmm, zmm{k}{z} [AVX512F]
  76497. // * VPMOVSXBQ m64, zmm{k}{z} [AVX512F]
  76498. // * VPMOVSXBQ xmm, xmm{k}{z} [AVX512F,AVX512VL]
  76499. // * VPMOVSXBQ xmm, ymm{k}{z} [AVX512F,AVX512VL]
  76500. // * VPMOVSXBQ m16, xmm{k}{z} [AVX512F,AVX512VL]
  76501. // * VPMOVSXBQ m32, ymm{k}{z} [AVX512F,AVX512VL]
  76502. //
  76503. func (self *Program) VPMOVSXBQ(v0 interface{}, v1 interface{}) *Instruction {
  76504. p := self.alloc("VPMOVSXBQ", 2, Operands { v0, v1 })
  76505. // VPMOVSXBQ xmm, xmm
  76506. if isXMM(v0) && isXMM(v1) {
  76507. self.require(ISA_AVX)
  76508. p.domain = DomainAVX
  76509. p.add(0, func(m *_Encoding, v []interface{}) {
  76510. m.emit(0xc4)
  76511. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  76512. m.emit(0x79)
  76513. m.emit(0x22)
  76514. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76515. })
  76516. }
  76517. // VPMOVSXBQ m16, xmm
  76518. if isM16(v0) && isXMM(v1) {
  76519. self.require(ISA_AVX)
  76520. p.domain = DomainAVX
  76521. p.add(0, func(m *_Encoding, v []interface{}) {
  76522. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  76523. m.emit(0x22)
  76524. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  76525. })
  76526. }
  76527. // VPMOVSXBQ xmm, ymm
  76528. if isXMM(v0) && isYMM(v1) {
  76529. self.require(ISA_AVX2)
  76530. p.domain = DomainAVX
  76531. p.add(0, func(m *_Encoding, v []interface{}) {
  76532. m.emit(0xc4)
  76533. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  76534. m.emit(0x7d)
  76535. m.emit(0x22)
  76536. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76537. })
  76538. }
  76539. // VPMOVSXBQ m32, ymm
  76540. if isM32(v0) && isYMM(v1) {
  76541. self.require(ISA_AVX2)
  76542. p.domain = DomainAVX
  76543. p.add(0, func(m *_Encoding, v []interface{}) {
  76544. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  76545. m.emit(0x22)
  76546. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  76547. })
  76548. }
  76549. // VPMOVSXBQ xmm, zmm{k}{z}
  76550. if isEVEXXMM(v0) && isZMMkz(v1) {
  76551. self.require(ISA_AVX512F)
  76552. p.domain = DomainAVX
  76553. p.add(0, func(m *_Encoding, v []interface{}) {
  76554. m.emit(0x62)
  76555. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  76556. m.emit(0x7d)
  76557. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  76558. m.emit(0x22)
  76559. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76560. })
  76561. }
  76562. // VPMOVSXBQ m64, zmm{k}{z}
  76563. if isM64(v0) && isZMMkz(v1) {
  76564. self.require(ISA_AVX512F)
  76565. p.domain = DomainAVX
  76566. p.add(0, func(m *_Encoding, v []interface{}) {
  76567. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  76568. m.emit(0x22)
  76569. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  76570. })
  76571. }
  76572. // VPMOVSXBQ xmm, xmm{k}{z}
  76573. if isEVEXXMM(v0) && isXMMkz(v1) {
  76574. self.require(ISA_AVX512VL | ISA_AVX512F)
  76575. p.domain = DomainAVX
  76576. p.add(0, func(m *_Encoding, v []interface{}) {
  76577. m.emit(0x62)
  76578. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  76579. m.emit(0x7d)
  76580. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  76581. m.emit(0x22)
  76582. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76583. })
  76584. }
  76585. // VPMOVSXBQ xmm, ymm{k}{z}
  76586. if isEVEXXMM(v0) && isYMMkz(v1) {
  76587. self.require(ISA_AVX512VL | ISA_AVX512F)
  76588. p.domain = DomainAVX
  76589. p.add(0, func(m *_Encoding, v []interface{}) {
  76590. m.emit(0x62)
  76591. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  76592. m.emit(0x7d)
  76593. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  76594. m.emit(0x22)
  76595. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76596. })
  76597. }
  76598. // VPMOVSXBQ m16, xmm{k}{z}
  76599. if isM16(v0) && isXMMkz(v1) {
  76600. self.require(ISA_AVX512VL | ISA_AVX512F)
  76601. p.domain = DomainAVX
  76602. p.add(0, func(m *_Encoding, v []interface{}) {
  76603. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  76604. m.emit(0x22)
  76605. m.mrsd(lcode(v[1]), addr(v[0]), 2)
  76606. })
  76607. }
  76608. // VPMOVSXBQ m32, ymm{k}{z}
  76609. if isM32(v0) && isYMMkz(v1) {
  76610. self.require(ISA_AVX512VL | ISA_AVX512F)
  76611. p.domain = DomainAVX
  76612. p.add(0, func(m *_Encoding, v []interface{}) {
  76613. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  76614. m.emit(0x22)
  76615. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  76616. })
  76617. }
  76618. if p.len == 0 {
  76619. panic("invalid operands for VPMOVSXBQ")
  76620. }
  76621. return p
  76622. }
  76623. // VPMOVSXBW performs "Move Packed Byte Integers to Word Integers with Sign Extension".
  76624. //
  76625. // Mnemonic : VPMOVSXBW
  76626. // Supported forms : (10 forms)
  76627. //
  76628. // * VPMOVSXBW xmm, xmm [AVX]
  76629. // * VPMOVSXBW m64, xmm [AVX]
  76630. // * VPMOVSXBW xmm, ymm [AVX2]
  76631. // * VPMOVSXBW m128, ymm [AVX2]
  76632. // * VPMOVSXBW ymm, zmm{k}{z} [AVX512BW]
  76633. // * VPMOVSXBW m256, zmm{k}{z} [AVX512BW]
  76634. // * VPMOVSXBW xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  76635. // * VPMOVSXBW xmm, ymm{k}{z} [AVX512BW,AVX512VL]
  76636. // * VPMOVSXBW m64, xmm{k}{z} [AVX512BW,AVX512VL]
  76637. // * VPMOVSXBW m128, ymm{k}{z} [AVX512BW,AVX512VL]
  76638. //
  76639. func (self *Program) VPMOVSXBW(v0 interface{}, v1 interface{}) *Instruction {
  76640. p := self.alloc("VPMOVSXBW", 2, Operands { v0, v1 })
  76641. // VPMOVSXBW xmm, xmm
  76642. if isXMM(v0) && isXMM(v1) {
  76643. self.require(ISA_AVX)
  76644. p.domain = DomainAVX
  76645. p.add(0, func(m *_Encoding, v []interface{}) {
  76646. m.emit(0xc4)
  76647. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  76648. m.emit(0x79)
  76649. m.emit(0x20)
  76650. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76651. })
  76652. }
  76653. // VPMOVSXBW m64, xmm
  76654. if isM64(v0) && isXMM(v1) {
  76655. self.require(ISA_AVX)
  76656. p.domain = DomainAVX
  76657. p.add(0, func(m *_Encoding, v []interface{}) {
  76658. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  76659. m.emit(0x20)
  76660. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  76661. })
  76662. }
  76663. // VPMOVSXBW xmm, ymm
  76664. if isXMM(v0) && isYMM(v1) {
  76665. self.require(ISA_AVX2)
  76666. p.domain = DomainAVX
  76667. p.add(0, func(m *_Encoding, v []interface{}) {
  76668. m.emit(0xc4)
  76669. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  76670. m.emit(0x7d)
  76671. m.emit(0x20)
  76672. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76673. })
  76674. }
  76675. // VPMOVSXBW m128, ymm
  76676. if isM128(v0) && isYMM(v1) {
  76677. self.require(ISA_AVX2)
  76678. p.domain = DomainAVX
  76679. p.add(0, func(m *_Encoding, v []interface{}) {
  76680. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  76681. m.emit(0x20)
  76682. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  76683. })
  76684. }
  76685. // VPMOVSXBW ymm, zmm{k}{z}
  76686. if isEVEXYMM(v0) && isZMMkz(v1) {
  76687. self.require(ISA_AVX512BW)
  76688. p.domain = DomainAVX
  76689. p.add(0, func(m *_Encoding, v []interface{}) {
  76690. m.emit(0x62)
  76691. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  76692. m.emit(0x7d)
  76693. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  76694. m.emit(0x20)
  76695. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76696. })
  76697. }
  76698. // VPMOVSXBW m256, zmm{k}{z}
  76699. if isM256(v0) && isZMMkz(v1) {
  76700. self.require(ISA_AVX512BW)
  76701. p.domain = DomainAVX
  76702. p.add(0, func(m *_Encoding, v []interface{}) {
  76703. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  76704. m.emit(0x20)
  76705. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  76706. })
  76707. }
  76708. // VPMOVSXBW xmm, xmm{k}{z}
  76709. if isEVEXXMM(v0) && isXMMkz(v1) {
  76710. self.require(ISA_AVX512VL | ISA_AVX512BW)
  76711. p.domain = DomainAVX
  76712. p.add(0, func(m *_Encoding, v []interface{}) {
  76713. m.emit(0x62)
  76714. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  76715. m.emit(0x7d)
  76716. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  76717. m.emit(0x20)
  76718. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76719. })
  76720. }
  76721. // VPMOVSXBW xmm, ymm{k}{z}
  76722. if isEVEXXMM(v0) && isYMMkz(v1) {
  76723. self.require(ISA_AVX512VL | ISA_AVX512BW)
  76724. p.domain = DomainAVX
  76725. p.add(0, func(m *_Encoding, v []interface{}) {
  76726. m.emit(0x62)
  76727. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  76728. m.emit(0x7d)
  76729. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  76730. m.emit(0x20)
  76731. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76732. })
  76733. }
  76734. // VPMOVSXBW m64, xmm{k}{z}
  76735. if isM64(v0) && isXMMkz(v1) {
  76736. self.require(ISA_AVX512VL | ISA_AVX512BW)
  76737. p.domain = DomainAVX
  76738. p.add(0, func(m *_Encoding, v []interface{}) {
  76739. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  76740. m.emit(0x20)
  76741. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  76742. })
  76743. }
  76744. // VPMOVSXBW m128, ymm{k}{z}
  76745. if isM128(v0) && isYMMkz(v1) {
  76746. self.require(ISA_AVX512VL | ISA_AVX512BW)
  76747. p.domain = DomainAVX
  76748. p.add(0, func(m *_Encoding, v []interface{}) {
  76749. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  76750. m.emit(0x20)
  76751. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  76752. })
  76753. }
  76754. if p.len == 0 {
  76755. panic("invalid operands for VPMOVSXBW")
  76756. }
  76757. return p
  76758. }
  76759. // VPMOVSXDQ performs "Move Packed Doubleword Integers to Quadword Integers with Sign Extension".
  76760. //
  76761. // Mnemonic : VPMOVSXDQ
  76762. // Supported forms : (10 forms)
  76763. //
  76764. // * VPMOVSXDQ xmm, xmm [AVX]
  76765. // * VPMOVSXDQ m64, xmm [AVX]
  76766. // * VPMOVSXDQ xmm, ymm [AVX2]
  76767. // * VPMOVSXDQ m128, ymm [AVX2]
  76768. // * VPMOVSXDQ ymm, zmm{k}{z} [AVX512F]
  76769. // * VPMOVSXDQ m256, zmm{k}{z} [AVX512F]
  76770. // * VPMOVSXDQ xmm, xmm{k}{z} [AVX512F,AVX512VL]
  76771. // * VPMOVSXDQ xmm, ymm{k}{z} [AVX512F,AVX512VL]
  76772. // * VPMOVSXDQ m64, xmm{k}{z} [AVX512F,AVX512VL]
  76773. // * VPMOVSXDQ m128, ymm{k}{z} [AVX512F,AVX512VL]
  76774. //
  76775. func (self *Program) VPMOVSXDQ(v0 interface{}, v1 interface{}) *Instruction {
  76776. p := self.alloc("VPMOVSXDQ", 2, Operands { v0, v1 })
  76777. // VPMOVSXDQ xmm, xmm
  76778. if isXMM(v0) && isXMM(v1) {
  76779. self.require(ISA_AVX)
  76780. p.domain = DomainAVX
  76781. p.add(0, func(m *_Encoding, v []interface{}) {
  76782. m.emit(0xc4)
  76783. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  76784. m.emit(0x79)
  76785. m.emit(0x25)
  76786. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76787. })
  76788. }
  76789. // VPMOVSXDQ m64, xmm
  76790. if isM64(v0) && isXMM(v1) {
  76791. self.require(ISA_AVX)
  76792. p.domain = DomainAVX
  76793. p.add(0, func(m *_Encoding, v []interface{}) {
  76794. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  76795. m.emit(0x25)
  76796. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  76797. })
  76798. }
  76799. // VPMOVSXDQ xmm, ymm
  76800. if isXMM(v0) && isYMM(v1) {
  76801. self.require(ISA_AVX2)
  76802. p.domain = DomainAVX
  76803. p.add(0, func(m *_Encoding, v []interface{}) {
  76804. m.emit(0xc4)
  76805. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  76806. m.emit(0x7d)
  76807. m.emit(0x25)
  76808. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76809. })
  76810. }
  76811. // VPMOVSXDQ m128, ymm
  76812. if isM128(v0) && isYMM(v1) {
  76813. self.require(ISA_AVX2)
  76814. p.domain = DomainAVX
  76815. p.add(0, func(m *_Encoding, v []interface{}) {
  76816. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  76817. m.emit(0x25)
  76818. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  76819. })
  76820. }
  76821. // VPMOVSXDQ ymm, zmm{k}{z}
  76822. if isEVEXYMM(v0) && isZMMkz(v1) {
  76823. self.require(ISA_AVX512F)
  76824. p.domain = DomainAVX
  76825. p.add(0, func(m *_Encoding, v []interface{}) {
  76826. m.emit(0x62)
  76827. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  76828. m.emit(0x7d)
  76829. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  76830. m.emit(0x25)
  76831. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76832. })
  76833. }
  76834. // VPMOVSXDQ m256, zmm{k}{z}
  76835. if isM256(v0) && isZMMkz(v1) {
  76836. self.require(ISA_AVX512F)
  76837. p.domain = DomainAVX
  76838. p.add(0, func(m *_Encoding, v []interface{}) {
  76839. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  76840. m.emit(0x25)
  76841. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  76842. })
  76843. }
  76844. // VPMOVSXDQ xmm, xmm{k}{z}
  76845. if isEVEXXMM(v0) && isXMMkz(v1) {
  76846. self.require(ISA_AVX512VL | ISA_AVX512F)
  76847. p.domain = DomainAVX
  76848. p.add(0, func(m *_Encoding, v []interface{}) {
  76849. m.emit(0x62)
  76850. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  76851. m.emit(0x7d)
  76852. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  76853. m.emit(0x25)
  76854. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76855. })
  76856. }
  76857. // VPMOVSXDQ xmm, ymm{k}{z}
  76858. if isEVEXXMM(v0) && isYMMkz(v1) {
  76859. self.require(ISA_AVX512VL | ISA_AVX512F)
  76860. p.domain = DomainAVX
  76861. p.add(0, func(m *_Encoding, v []interface{}) {
  76862. m.emit(0x62)
  76863. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  76864. m.emit(0x7d)
  76865. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  76866. m.emit(0x25)
  76867. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76868. })
  76869. }
  76870. // VPMOVSXDQ m64, xmm{k}{z}
  76871. if isM64(v0) && isXMMkz(v1) {
  76872. self.require(ISA_AVX512VL | ISA_AVX512F)
  76873. p.domain = DomainAVX
  76874. p.add(0, func(m *_Encoding, v []interface{}) {
  76875. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  76876. m.emit(0x25)
  76877. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  76878. })
  76879. }
  76880. // VPMOVSXDQ m128, ymm{k}{z}
  76881. if isM128(v0) && isYMMkz(v1) {
  76882. self.require(ISA_AVX512VL | ISA_AVX512F)
  76883. p.domain = DomainAVX
  76884. p.add(0, func(m *_Encoding, v []interface{}) {
  76885. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  76886. m.emit(0x25)
  76887. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  76888. })
  76889. }
  76890. if p.len == 0 {
  76891. panic("invalid operands for VPMOVSXDQ")
  76892. }
  76893. return p
  76894. }
  76895. // VPMOVSXWD performs "Move Packed Word Integers to Doubleword Integers with Sign Extension".
  76896. //
  76897. // Mnemonic : VPMOVSXWD
  76898. // Supported forms : (10 forms)
  76899. //
  76900. // * VPMOVSXWD xmm, xmm [AVX]
  76901. // * VPMOVSXWD m64, xmm [AVX]
  76902. // * VPMOVSXWD xmm, ymm [AVX2]
  76903. // * VPMOVSXWD m128, ymm [AVX2]
  76904. // * VPMOVSXWD ymm, zmm{k}{z} [AVX512F]
  76905. // * VPMOVSXWD m256, zmm{k}{z} [AVX512F]
  76906. // * VPMOVSXWD xmm, xmm{k}{z} [AVX512F,AVX512VL]
  76907. // * VPMOVSXWD xmm, ymm{k}{z} [AVX512F,AVX512VL]
  76908. // * VPMOVSXWD m64, xmm{k}{z} [AVX512F,AVX512VL]
  76909. // * VPMOVSXWD m128, ymm{k}{z} [AVX512F,AVX512VL]
  76910. //
  76911. func (self *Program) VPMOVSXWD(v0 interface{}, v1 interface{}) *Instruction {
  76912. p := self.alloc("VPMOVSXWD", 2, Operands { v0, v1 })
  76913. // VPMOVSXWD xmm, xmm
  76914. if isXMM(v0) && isXMM(v1) {
  76915. self.require(ISA_AVX)
  76916. p.domain = DomainAVX
  76917. p.add(0, func(m *_Encoding, v []interface{}) {
  76918. m.emit(0xc4)
  76919. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  76920. m.emit(0x79)
  76921. m.emit(0x23)
  76922. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76923. })
  76924. }
  76925. // VPMOVSXWD m64, xmm
  76926. if isM64(v0) && isXMM(v1) {
  76927. self.require(ISA_AVX)
  76928. p.domain = DomainAVX
  76929. p.add(0, func(m *_Encoding, v []interface{}) {
  76930. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  76931. m.emit(0x23)
  76932. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  76933. })
  76934. }
  76935. // VPMOVSXWD xmm, ymm
  76936. if isXMM(v0) && isYMM(v1) {
  76937. self.require(ISA_AVX2)
  76938. p.domain = DomainAVX
  76939. p.add(0, func(m *_Encoding, v []interface{}) {
  76940. m.emit(0xc4)
  76941. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  76942. m.emit(0x7d)
  76943. m.emit(0x23)
  76944. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76945. })
  76946. }
  76947. // VPMOVSXWD m128, ymm
  76948. if isM128(v0) && isYMM(v1) {
  76949. self.require(ISA_AVX2)
  76950. p.domain = DomainAVX
  76951. p.add(0, func(m *_Encoding, v []interface{}) {
  76952. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  76953. m.emit(0x23)
  76954. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  76955. })
  76956. }
  76957. // VPMOVSXWD ymm, zmm{k}{z}
  76958. if isEVEXYMM(v0) && isZMMkz(v1) {
  76959. self.require(ISA_AVX512F)
  76960. p.domain = DomainAVX
  76961. p.add(0, func(m *_Encoding, v []interface{}) {
  76962. m.emit(0x62)
  76963. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  76964. m.emit(0x7d)
  76965. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  76966. m.emit(0x23)
  76967. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76968. })
  76969. }
  76970. // VPMOVSXWD m256, zmm{k}{z}
  76971. if isM256(v0) && isZMMkz(v1) {
  76972. self.require(ISA_AVX512F)
  76973. p.domain = DomainAVX
  76974. p.add(0, func(m *_Encoding, v []interface{}) {
  76975. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  76976. m.emit(0x23)
  76977. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  76978. })
  76979. }
  76980. // VPMOVSXWD xmm, xmm{k}{z}
  76981. if isEVEXXMM(v0) && isXMMkz(v1) {
  76982. self.require(ISA_AVX512VL | ISA_AVX512F)
  76983. p.domain = DomainAVX
  76984. p.add(0, func(m *_Encoding, v []interface{}) {
  76985. m.emit(0x62)
  76986. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  76987. m.emit(0x7d)
  76988. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  76989. m.emit(0x23)
  76990. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  76991. })
  76992. }
  76993. // VPMOVSXWD xmm, ymm{k}{z}
  76994. if isEVEXXMM(v0) && isYMMkz(v1) {
  76995. self.require(ISA_AVX512VL | ISA_AVX512F)
  76996. p.domain = DomainAVX
  76997. p.add(0, func(m *_Encoding, v []interface{}) {
  76998. m.emit(0x62)
  76999. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  77000. m.emit(0x7d)
  77001. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  77002. m.emit(0x23)
  77003. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  77004. })
  77005. }
  77006. // VPMOVSXWD m64, xmm{k}{z}
  77007. if isM64(v0) && isXMMkz(v1) {
  77008. self.require(ISA_AVX512VL | ISA_AVX512F)
  77009. p.domain = DomainAVX
  77010. p.add(0, func(m *_Encoding, v []interface{}) {
  77011. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  77012. m.emit(0x23)
  77013. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  77014. })
  77015. }
  77016. // VPMOVSXWD m128, ymm{k}{z}
  77017. if isM128(v0) && isYMMkz(v1) {
  77018. self.require(ISA_AVX512VL | ISA_AVX512F)
  77019. p.domain = DomainAVX
  77020. p.add(0, func(m *_Encoding, v []interface{}) {
  77021. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  77022. m.emit(0x23)
  77023. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  77024. })
  77025. }
  77026. if p.len == 0 {
  77027. panic("invalid operands for VPMOVSXWD")
  77028. }
  77029. return p
  77030. }
  77031. // VPMOVSXWQ performs "Move Packed Word Integers to Quadword Integers with Sign Extension".
  77032. //
  77033. // Mnemonic : VPMOVSXWQ
  77034. // Supported forms : (10 forms)
  77035. //
  77036. // * VPMOVSXWQ xmm, xmm [AVX]
  77037. // * VPMOVSXWQ m32, xmm [AVX]
  77038. // * VPMOVSXWQ xmm, ymm [AVX2]
  77039. // * VPMOVSXWQ m64, ymm [AVX2]
  77040. // * VPMOVSXWQ xmm, zmm{k}{z} [AVX512F]
  77041. // * VPMOVSXWQ m128, zmm{k}{z} [AVX512F]
  77042. // * VPMOVSXWQ xmm, xmm{k}{z} [AVX512F,AVX512VL]
  77043. // * VPMOVSXWQ xmm, ymm{k}{z} [AVX512F,AVX512VL]
  77044. // * VPMOVSXWQ m32, xmm{k}{z} [AVX512F,AVX512VL]
  77045. // * VPMOVSXWQ m64, ymm{k}{z} [AVX512F,AVX512VL]
  77046. //
  77047. func (self *Program) VPMOVSXWQ(v0 interface{}, v1 interface{}) *Instruction {
  77048. p := self.alloc("VPMOVSXWQ", 2, Operands { v0, v1 })
  77049. // VPMOVSXWQ xmm, xmm
  77050. if isXMM(v0) && isXMM(v1) {
  77051. self.require(ISA_AVX)
  77052. p.domain = DomainAVX
  77053. p.add(0, func(m *_Encoding, v []interface{}) {
  77054. m.emit(0xc4)
  77055. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  77056. m.emit(0x79)
  77057. m.emit(0x24)
  77058. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  77059. })
  77060. }
  77061. // VPMOVSXWQ m32, xmm
  77062. if isM32(v0) && isXMM(v1) {
  77063. self.require(ISA_AVX)
  77064. p.domain = DomainAVX
  77065. p.add(0, func(m *_Encoding, v []interface{}) {
  77066. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  77067. m.emit(0x24)
  77068. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  77069. })
  77070. }
  77071. // VPMOVSXWQ xmm, ymm
  77072. if isXMM(v0) && isYMM(v1) {
  77073. self.require(ISA_AVX2)
  77074. p.domain = DomainAVX
  77075. p.add(0, func(m *_Encoding, v []interface{}) {
  77076. m.emit(0xc4)
  77077. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  77078. m.emit(0x7d)
  77079. m.emit(0x24)
  77080. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  77081. })
  77082. }
  77083. // VPMOVSXWQ m64, ymm
  77084. if isM64(v0) && isYMM(v1) {
  77085. self.require(ISA_AVX2)
  77086. p.domain = DomainAVX
  77087. p.add(0, func(m *_Encoding, v []interface{}) {
  77088. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  77089. m.emit(0x24)
  77090. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  77091. })
  77092. }
  77093. // VPMOVSXWQ xmm, zmm{k}{z}
  77094. if isEVEXXMM(v0) && isZMMkz(v1) {
  77095. self.require(ISA_AVX512F)
  77096. p.domain = DomainAVX
  77097. p.add(0, func(m *_Encoding, v []interface{}) {
  77098. m.emit(0x62)
  77099. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  77100. m.emit(0x7d)
  77101. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  77102. m.emit(0x24)
  77103. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  77104. })
  77105. }
  77106. // VPMOVSXWQ m128, zmm{k}{z}
  77107. if isM128(v0) && isZMMkz(v1) {
  77108. self.require(ISA_AVX512F)
  77109. p.domain = DomainAVX
  77110. p.add(0, func(m *_Encoding, v []interface{}) {
  77111. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  77112. m.emit(0x24)
  77113. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  77114. })
  77115. }
  77116. // VPMOVSXWQ xmm, xmm{k}{z}
  77117. if isEVEXXMM(v0) && isXMMkz(v1) {
  77118. self.require(ISA_AVX512VL | ISA_AVX512F)
  77119. p.domain = DomainAVX
  77120. p.add(0, func(m *_Encoding, v []interface{}) {
  77121. m.emit(0x62)
  77122. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  77123. m.emit(0x7d)
  77124. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  77125. m.emit(0x24)
  77126. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  77127. })
  77128. }
  77129. // VPMOVSXWQ xmm, ymm{k}{z}
  77130. if isEVEXXMM(v0) && isYMMkz(v1) {
  77131. self.require(ISA_AVX512VL | ISA_AVX512F)
  77132. p.domain = DomainAVX
  77133. p.add(0, func(m *_Encoding, v []interface{}) {
  77134. m.emit(0x62)
  77135. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  77136. m.emit(0x7d)
  77137. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  77138. m.emit(0x24)
  77139. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  77140. })
  77141. }
  77142. // VPMOVSXWQ m32, xmm{k}{z}
  77143. if isM32(v0) && isXMMkz(v1) {
  77144. self.require(ISA_AVX512VL | ISA_AVX512F)
  77145. p.domain = DomainAVX
  77146. p.add(0, func(m *_Encoding, v []interface{}) {
  77147. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  77148. m.emit(0x24)
  77149. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  77150. })
  77151. }
  77152. // VPMOVSXWQ m64, ymm{k}{z}
  77153. if isM64(v0) && isYMMkz(v1) {
  77154. self.require(ISA_AVX512VL | ISA_AVX512F)
  77155. p.domain = DomainAVX
  77156. p.add(0, func(m *_Encoding, v []interface{}) {
  77157. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  77158. m.emit(0x24)
  77159. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  77160. })
  77161. }
  77162. if p.len == 0 {
  77163. panic("invalid operands for VPMOVSXWQ")
  77164. }
  77165. return p
  77166. }
  77167. // VPMOVUSDB performs "Down Convert Packed Doubleword Values to Byte Values with Unsigned Saturation".
  77168. //
  77169. // Mnemonic : VPMOVUSDB
  77170. // Supported forms : (6 forms)
  77171. //
  77172. // * VPMOVUSDB zmm, xmm{k}{z} [AVX512F]
  77173. // * VPMOVUSDB zmm, m128{k}{z} [AVX512F]
  77174. // * VPMOVUSDB xmm, xmm{k}{z} [AVX512F,AVX512VL]
  77175. // * VPMOVUSDB xmm, m32{k}{z} [AVX512F,AVX512VL]
  77176. // * VPMOVUSDB ymm, xmm{k}{z} [AVX512F,AVX512VL]
  77177. // * VPMOVUSDB ymm, m64{k}{z} [AVX512F,AVX512VL]
  77178. //
  77179. func (self *Program) VPMOVUSDB(v0 interface{}, v1 interface{}) *Instruction {
  77180. p := self.alloc("VPMOVUSDB", 2, Operands { v0, v1 })
  77181. // VPMOVUSDB zmm, xmm{k}{z}
  77182. if isZMM(v0) && isXMMkz(v1) {
  77183. self.require(ISA_AVX512F)
  77184. p.domain = DomainAVX
  77185. p.add(0, func(m *_Encoding, v []interface{}) {
  77186. m.emit(0x62)
  77187. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  77188. m.emit(0x7e)
  77189. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  77190. m.emit(0x11)
  77191. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  77192. })
  77193. }
  77194. // VPMOVUSDB zmm, m128{k}{z}
  77195. if isZMM(v0) && isM128kz(v1) {
  77196. self.require(ISA_AVX512F)
  77197. p.domain = DomainAVX
  77198. p.add(0, func(m *_Encoding, v []interface{}) {
  77199. m.evex(0b10, 0x06, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  77200. m.emit(0x11)
  77201. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  77202. })
  77203. }
  77204. // VPMOVUSDB xmm, xmm{k}{z}
  77205. if isEVEXXMM(v0) && isXMMkz(v1) {
  77206. self.require(ISA_AVX512VL | ISA_AVX512F)
  77207. p.domain = DomainAVX
  77208. p.add(0, func(m *_Encoding, v []interface{}) {
  77209. m.emit(0x62)
  77210. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  77211. m.emit(0x7e)
  77212. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  77213. m.emit(0x11)
  77214. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  77215. })
  77216. }
  77217. // VPMOVUSDB xmm, m32{k}{z}
  77218. if isEVEXXMM(v0) && isM32kz(v1) {
  77219. self.require(ISA_AVX512VL | ISA_AVX512F)
  77220. p.domain = DomainAVX
  77221. p.add(0, func(m *_Encoding, v []interface{}) {
  77222. m.evex(0b10, 0x06, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  77223. m.emit(0x11)
  77224. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  77225. })
  77226. }
  77227. // VPMOVUSDB ymm, xmm{k}{z}
  77228. if isEVEXYMM(v0) && isXMMkz(v1) {
  77229. self.require(ISA_AVX512VL | ISA_AVX512F)
  77230. p.domain = DomainAVX
  77231. p.add(0, func(m *_Encoding, v []interface{}) {
  77232. m.emit(0x62)
  77233. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  77234. m.emit(0x7e)
  77235. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  77236. m.emit(0x11)
  77237. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  77238. })
  77239. }
  77240. // VPMOVUSDB ymm, m64{k}{z}
  77241. if isEVEXYMM(v0) && isM64kz(v1) {
  77242. self.require(ISA_AVX512VL | ISA_AVX512F)
  77243. p.domain = DomainAVX
  77244. p.add(0, func(m *_Encoding, v []interface{}) {
  77245. m.evex(0b10, 0x06, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  77246. m.emit(0x11)
  77247. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  77248. })
  77249. }
  77250. if p.len == 0 {
  77251. panic("invalid operands for VPMOVUSDB")
  77252. }
  77253. return p
  77254. }
  77255. // VPMOVUSDW performs "Down Convert Packed Doubleword Values to Word Values with Unsigned Saturation".
  77256. //
  77257. // Mnemonic : VPMOVUSDW
  77258. // Supported forms : (6 forms)
  77259. //
  77260. // * VPMOVUSDW zmm, ymm{k}{z} [AVX512F]
  77261. // * VPMOVUSDW zmm, m256{k}{z} [AVX512F]
  77262. // * VPMOVUSDW xmm, xmm{k}{z} [AVX512F,AVX512VL]
  77263. // * VPMOVUSDW xmm, m64{k}{z} [AVX512F,AVX512VL]
  77264. // * VPMOVUSDW ymm, xmm{k}{z} [AVX512F,AVX512VL]
  77265. // * VPMOVUSDW ymm, m128{k}{z} [AVX512F,AVX512VL]
  77266. //
  77267. func (self *Program) VPMOVUSDW(v0 interface{}, v1 interface{}) *Instruction {
  77268. p := self.alloc("VPMOVUSDW", 2, Operands { v0, v1 })
  77269. // VPMOVUSDW zmm, ymm{k}{z}
  77270. if isZMM(v0) && isYMMkz(v1) {
  77271. self.require(ISA_AVX512F)
  77272. p.domain = DomainAVX
  77273. p.add(0, func(m *_Encoding, v []interface{}) {
  77274. m.emit(0x62)
  77275. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  77276. m.emit(0x7e)
  77277. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  77278. m.emit(0x13)
  77279. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  77280. })
  77281. }
  77282. // VPMOVUSDW zmm, m256{k}{z}
  77283. if isZMM(v0) && isM256kz(v1) {
  77284. self.require(ISA_AVX512F)
  77285. p.domain = DomainAVX
  77286. p.add(0, func(m *_Encoding, v []interface{}) {
  77287. m.evex(0b10, 0x06, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  77288. m.emit(0x13)
  77289. m.mrsd(lcode(v[0]), addr(v[1]), 32)
  77290. })
  77291. }
  77292. // VPMOVUSDW xmm, xmm{k}{z}
  77293. if isEVEXXMM(v0) && isXMMkz(v1) {
  77294. self.require(ISA_AVX512VL | ISA_AVX512F)
  77295. p.domain = DomainAVX
  77296. p.add(0, func(m *_Encoding, v []interface{}) {
  77297. m.emit(0x62)
  77298. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  77299. m.emit(0x7e)
  77300. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  77301. m.emit(0x13)
  77302. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  77303. })
  77304. }
  77305. // VPMOVUSDW xmm, m64{k}{z}
  77306. if isEVEXXMM(v0) && isM64kz(v1) {
  77307. self.require(ISA_AVX512VL | ISA_AVX512F)
  77308. p.domain = DomainAVX
  77309. p.add(0, func(m *_Encoding, v []interface{}) {
  77310. m.evex(0b10, 0x06, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  77311. m.emit(0x13)
  77312. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  77313. })
  77314. }
  77315. // VPMOVUSDW ymm, xmm{k}{z}
  77316. if isEVEXYMM(v0) && isXMMkz(v1) {
  77317. self.require(ISA_AVX512VL | ISA_AVX512F)
  77318. p.domain = DomainAVX
  77319. p.add(0, func(m *_Encoding, v []interface{}) {
  77320. m.emit(0x62)
  77321. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  77322. m.emit(0x7e)
  77323. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  77324. m.emit(0x13)
  77325. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  77326. })
  77327. }
  77328. // VPMOVUSDW ymm, m128{k}{z}
  77329. if isEVEXYMM(v0) && isM128kz(v1) {
  77330. self.require(ISA_AVX512VL | ISA_AVX512F)
  77331. p.domain = DomainAVX
  77332. p.add(0, func(m *_Encoding, v []interface{}) {
  77333. m.evex(0b10, 0x06, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  77334. m.emit(0x13)
  77335. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  77336. })
  77337. }
  77338. if p.len == 0 {
  77339. panic("invalid operands for VPMOVUSDW")
  77340. }
  77341. return p
  77342. }
  77343. // VPMOVUSQB performs "Down Convert Packed Quadword Values to Byte Values with Unsigned Saturation".
  77344. //
  77345. // Mnemonic : VPMOVUSQB
  77346. // Supported forms : (6 forms)
  77347. //
  77348. // * VPMOVUSQB zmm, xmm{k}{z} [AVX512F]
  77349. // * VPMOVUSQB zmm, m64{k}{z} [AVX512F]
  77350. // * VPMOVUSQB xmm, xmm{k}{z} [AVX512F,AVX512VL]
  77351. // * VPMOVUSQB xmm, m16{k}{z} [AVX512F,AVX512VL]
  77352. // * VPMOVUSQB ymm, xmm{k}{z} [AVX512F,AVX512VL]
  77353. // * VPMOVUSQB ymm, m32{k}{z} [AVX512F,AVX512VL]
  77354. //
  77355. func (self *Program) VPMOVUSQB(v0 interface{}, v1 interface{}) *Instruction {
  77356. p := self.alloc("VPMOVUSQB", 2, Operands { v0, v1 })
  77357. // VPMOVUSQB zmm, xmm{k}{z}
  77358. if isZMM(v0) && isXMMkz(v1) {
  77359. self.require(ISA_AVX512F)
  77360. p.domain = DomainAVX
  77361. p.add(0, func(m *_Encoding, v []interface{}) {
  77362. m.emit(0x62)
  77363. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  77364. m.emit(0x7e)
  77365. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  77366. m.emit(0x12)
  77367. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  77368. })
  77369. }
  77370. // VPMOVUSQB zmm, m64{k}{z}
  77371. if isZMM(v0) && isM64kz(v1) {
  77372. self.require(ISA_AVX512F)
  77373. p.domain = DomainAVX
  77374. p.add(0, func(m *_Encoding, v []interface{}) {
  77375. m.evex(0b10, 0x06, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  77376. m.emit(0x12)
  77377. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  77378. })
  77379. }
  77380. // VPMOVUSQB xmm, xmm{k}{z}
  77381. if isEVEXXMM(v0) && isXMMkz(v1) {
  77382. self.require(ISA_AVX512VL | ISA_AVX512F)
  77383. p.domain = DomainAVX
  77384. p.add(0, func(m *_Encoding, v []interface{}) {
  77385. m.emit(0x62)
  77386. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  77387. m.emit(0x7e)
  77388. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  77389. m.emit(0x12)
  77390. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  77391. })
  77392. }
  77393. // VPMOVUSQB xmm, m16{k}{z}
  77394. if isEVEXXMM(v0) && isM16kz(v1) {
  77395. self.require(ISA_AVX512VL | ISA_AVX512F)
  77396. p.domain = DomainAVX
  77397. p.add(0, func(m *_Encoding, v []interface{}) {
  77398. m.evex(0b10, 0x06, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  77399. m.emit(0x12)
  77400. m.mrsd(lcode(v[0]), addr(v[1]), 2)
  77401. })
  77402. }
  77403. // VPMOVUSQB ymm, xmm{k}{z}
  77404. if isEVEXYMM(v0) && isXMMkz(v1) {
  77405. self.require(ISA_AVX512VL | ISA_AVX512F)
  77406. p.domain = DomainAVX
  77407. p.add(0, func(m *_Encoding, v []interface{}) {
  77408. m.emit(0x62)
  77409. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  77410. m.emit(0x7e)
  77411. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  77412. m.emit(0x12)
  77413. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  77414. })
  77415. }
  77416. // VPMOVUSQB ymm, m32{k}{z}
  77417. if isEVEXYMM(v0) && isM32kz(v1) {
  77418. self.require(ISA_AVX512VL | ISA_AVX512F)
  77419. p.domain = DomainAVX
  77420. p.add(0, func(m *_Encoding, v []interface{}) {
  77421. m.evex(0b10, 0x06, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  77422. m.emit(0x12)
  77423. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  77424. })
  77425. }
  77426. if p.len == 0 {
  77427. panic("invalid operands for VPMOVUSQB")
  77428. }
  77429. return p
  77430. }
  77431. // VPMOVUSQD performs "Down Convert Packed Quadword Values to Doubleword Values with Unsigned Saturation".
  77432. //
  77433. // Mnemonic : VPMOVUSQD
  77434. // Supported forms : (6 forms)
  77435. //
  77436. // * VPMOVUSQD zmm, ymm{k}{z} [AVX512F]
  77437. // * VPMOVUSQD zmm, m256{k}{z} [AVX512F]
  77438. // * VPMOVUSQD xmm, xmm{k}{z} [AVX512F,AVX512VL]
  77439. // * VPMOVUSQD xmm, m64{k}{z} [AVX512F,AVX512VL]
  77440. // * VPMOVUSQD ymm, xmm{k}{z} [AVX512F,AVX512VL]
  77441. // * VPMOVUSQD ymm, m128{k}{z} [AVX512F,AVX512VL]
  77442. //
  77443. func (self *Program) VPMOVUSQD(v0 interface{}, v1 interface{}) *Instruction {
  77444. p := self.alloc("VPMOVUSQD", 2, Operands { v0, v1 })
  77445. // VPMOVUSQD zmm, ymm{k}{z}
  77446. if isZMM(v0) && isYMMkz(v1) {
  77447. self.require(ISA_AVX512F)
  77448. p.domain = DomainAVX
  77449. p.add(0, func(m *_Encoding, v []interface{}) {
  77450. m.emit(0x62)
  77451. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  77452. m.emit(0x7e)
  77453. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  77454. m.emit(0x15)
  77455. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  77456. })
  77457. }
  77458. // VPMOVUSQD zmm, m256{k}{z}
  77459. if isZMM(v0) && isM256kz(v1) {
  77460. self.require(ISA_AVX512F)
  77461. p.domain = DomainAVX
  77462. p.add(0, func(m *_Encoding, v []interface{}) {
  77463. m.evex(0b10, 0x06, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  77464. m.emit(0x15)
  77465. m.mrsd(lcode(v[0]), addr(v[1]), 32)
  77466. })
  77467. }
  77468. // VPMOVUSQD xmm, xmm{k}{z}
  77469. if isEVEXXMM(v0) && isXMMkz(v1) {
  77470. self.require(ISA_AVX512VL | ISA_AVX512F)
  77471. p.domain = DomainAVX
  77472. p.add(0, func(m *_Encoding, v []interface{}) {
  77473. m.emit(0x62)
  77474. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  77475. m.emit(0x7e)
  77476. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  77477. m.emit(0x15)
  77478. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  77479. })
  77480. }
  77481. // VPMOVUSQD xmm, m64{k}{z}
  77482. if isEVEXXMM(v0) && isM64kz(v1) {
  77483. self.require(ISA_AVX512VL | ISA_AVX512F)
  77484. p.domain = DomainAVX
  77485. p.add(0, func(m *_Encoding, v []interface{}) {
  77486. m.evex(0b10, 0x06, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  77487. m.emit(0x15)
  77488. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  77489. })
  77490. }
  77491. // VPMOVUSQD ymm, xmm{k}{z}
  77492. if isEVEXYMM(v0) && isXMMkz(v1) {
  77493. self.require(ISA_AVX512VL | ISA_AVX512F)
  77494. p.domain = DomainAVX
  77495. p.add(0, func(m *_Encoding, v []interface{}) {
  77496. m.emit(0x62)
  77497. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  77498. m.emit(0x7e)
  77499. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  77500. m.emit(0x15)
  77501. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  77502. })
  77503. }
  77504. // VPMOVUSQD ymm, m128{k}{z}
  77505. if isEVEXYMM(v0) && isM128kz(v1) {
  77506. self.require(ISA_AVX512VL | ISA_AVX512F)
  77507. p.domain = DomainAVX
  77508. p.add(0, func(m *_Encoding, v []interface{}) {
  77509. m.evex(0b10, 0x06, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  77510. m.emit(0x15)
  77511. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  77512. })
  77513. }
  77514. if p.len == 0 {
  77515. panic("invalid operands for VPMOVUSQD")
  77516. }
  77517. return p
  77518. }
  77519. // VPMOVUSQW performs "Down Convert Packed Quadword Values to Word Values with Unsigned Saturation".
  77520. //
  77521. // Mnemonic : VPMOVUSQW
  77522. // Supported forms : (6 forms)
  77523. //
  77524. // * VPMOVUSQW zmm, xmm{k}{z} [AVX512F]
  77525. // * VPMOVUSQW zmm, m128{k}{z} [AVX512F]
  77526. // * VPMOVUSQW xmm, xmm{k}{z} [AVX512F,AVX512VL]
  77527. // * VPMOVUSQW xmm, m32{k}{z} [AVX512F,AVX512VL]
  77528. // * VPMOVUSQW ymm, xmm{k}{z} [AVX512F,AVX512VL]
  77529. // * VPMOVUSQW ymm, m64{k}{z} [AVX512F,AVX512VL]
  77530. //
  77531. func (self *Program) VPMOVUSQW(v0 interface{}, v1 interface{}) *Instruction {
  77532. p := self.alloc("VPMOVUSQW", 2, Operands { v0, v1 })
  77533. // VPMOVUSQW zmm, xmm{k}{z}
  77534. if isZMM(v0) && isXMMkz(v1) {
  77535. self.require(ISA_AVX512F)
  77536. p.domain = DomainAVX
  77537. p.add(0, func(m *_Encoding, v []interface{}) {
  77538. m.emit(0x62)
  77539. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  77540. m.emit(0x7e)
  77541. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  77542. m.emit(0x14)
  77543. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  77544. })
  77545. }
  77546. // VPMOVUSQW zmm, m128{k}{z}
  77547. if isZMM(v0) && isM128kz(v1) {
  77548. self.require(ISA_AVX512F)
  77549. p.domain = DomainAVX
  77550. p.add(0, func(m *_Encoding, v []interface{}) {
  77551. m.evex(0b10, 0x06, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  77552. m.emit(0x14)
  77553. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  77554. })
  77555. }
  77556. // VPMOVUSQW xmm, xmm{k}{z}
  77557. if isEVEXXMM(v0) && isXMMkz(v1) {
  77558. self.require(ISA_AVX512VL | ISA_AVX512F)
  77559. p.domain = DomainAVX
  77560. p.add(0, func(m *_Encoding, v []interface{}) {
  77561. m.emit(0x62)
  77562. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  77563. m.emit(0x7e)
  77564. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  77565. m.emit(0x14)
  77566. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  77567. })
  77568. }
  77569. // VPMOVUSQW xmm, m32{k}{z}
  77570. if isEVEXXMM(v0) && isM32kz(v1) {
  77571. self.require(ISA_AVX512VL | ISA_AVX512F)
  77572. p.domain = DomainAVX
  77573. p.add(0, func(m *_Encoding, v []interface{}) {
  77574. m.evex(0b10, 0x06, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  77575. m.emit(0x14)
  77576. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  77577. })
  77578. }
  77579. // VPMOVUSQW ymm, xmm{k}{z}
  77580. if isEVEXYMM(v0) && isXMMkz(v1) {
  77581. self.require(ISA_AVX512VL | ISA_AVX512F)
  77582. p.domain = DomainAVX
  77583. p.add(0, func(m *_Encoding, v []interface{}) {
  77584. m.emit(0x62)
  77585. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  77586. m.emit(0x7e)
  77587. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  77588. m.emit(0x14)
  77589. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  77590. })
  77591. }
  77592. // VPMOVUSQW ymm, m64{k}{z}
  77593. if isEVEXYMM(v0) && isM64kz(v1) {
  77594. self.require(ISA_AVX512VL | ISA_AVX512F)
  77595. p.domain = DomainAVX
  77596. p.add(0, func(m *_Encoding, v []interface{}) {
  77597. m.evex(0b10, 0x06, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  77598. m.emit(0x14)
  77599. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  77600. })
  77601. }
  77602. if p.len == 0 {
  77603. panic("invalid operands for VPMOVUSQW")
  77604. }
  77605. return p
  77606. }
  77607. // VPMOVUSWB performs "Down Convert Packed Word Values to Byte Values with Unsigned Saturation".
  77608. //
  77609. // Mnemonic : VPMOVUSWB
  77610. // Supported forms : (6 forms)
  77611. //
  77612. // * VPMOVUSWB zmm, ymm{k}{z} [AVX512BW]
  77613. // * VPMOVUSWB zmm, m256{k}{z} [AVX512BW]
  77614. // * VPMOVUSWB xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  77615. // * VPMOVUSWB xmm, m64{k}{z} [AVX512BW,AVX512VL]
  77616. // * VPMOVUSWB ymm, xmm{k}{z} [AVX512BW,AVX512VL]
  77617. // * VPMOVUSWB ymm, m128{k}{z} [AVX512BW,AVX512VL]
  77618. //
  77619. func (self *Program) VPMOVUSWB(v0 interface{}, v1 interface{}) *Instruction {
  77620. p := self.alloc("VPMOVUSWB", 2, Operands { v0, v1 })
  77621. // VPMOVUSWB zmm, ymm{k}{z}
  77622. if isZMM(v0) && isYMMkz(v1) {
  77623. self.require(ISA_AVX512BW)
  77624. p.domain = DomainAVX
  77625. p.add(0, func(m *_Encoding, v []interface{}) {
  77626. m.emit(0x62)
  77627. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  77628. m.emit(0x7e)
  77629. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  77630. m.emit(0x10)
  77631. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  77632. })
  77633. }
  77634. // VPMOVUSWB zmm, m256{k}{z}
  77635. if isZMM(v0) && isM256kz(v1) {
  77636. self.require(ISA_AVX512BW)
  77637. p.domain = DomainAVX
  77638. p.add(0, func(m *_Encoding, v []interface{}) {
  77639. m.evex(0b10, 0x06, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  77640. m.emit(0x10)
  77641. m.mrsd(lcode(v[0]), addr(v[1]), 32)
  77642. })
  77643. }
  77644. // VPMOVUSWB xmm, xmm{k}{z}
  77645. if isEVEXXMM(v0) && isXMMkz(v1) {
  77646. self.require(ISA_AVX512VL | ISA_AVX512BW)
  77647. p.domain = DomainAVX
  77648. p.add(0, func(m *_Encoding, v []interface{}) {
  77649. m.emit(0x62)
  77650. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  77651. m.emit(0x7e)
  77652. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  77653. m.emit(0x10)
  77654. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  77655. })
  77656. }
  77657. // VPMOVUSWB xmm, m64{k}{z}
  77658. if isEVEXXMM(v0) && isM64kz(v1) {
  77659. self.require(ISA_AVX512VL | ISA_AVX512BW)
  77660. p.domain = DomainAVX
  77661. p.add(0, func(m *_Encoding, v []interface{}) {
  77662. m.evex(0b10, 0x06, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  77663. m.emit(0x10)
  77664. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  77665. })
  77666. }
  77667. // VPMOVUSWB ymm, xmm{k}{z}
  77668. if isEVEXYMM(v0) && isXMMkz(v1) {
  77669. self.require(ISA_AVX512VL | ISA_AVX512BW)
  77670. p.domain = DomainAVX
  77671. p.add(0, func(m *_Encoding, v []interface{}) {
  77672. m.emit(0x62)
  77673. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  77674. m.emit(0x7e)
  77675. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  77676. m.emit(0x10)
  77677. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  77678. })
  77679. }
  77680. // VPMOVUSWB ymm, m128{k}{z}
  77681. if isEVEXYMM(v0) && isM128kz(v1) {
  77682. self.require(ISA_AVX512VL | ISA_AVX512BW)
  77683. p.domain = DomainAVX
  77684. p.add(0, func(m *_Encoding, v []interface{}) {
  77685. m.evex(0b10, 0x06, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  77686. m.emit(0x10)
  77687. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  77688. })
  77689. }
  77690. if p.len == 0 {
  77691. panic("invalid operands for VPMOVUSWB")
  77692. }
  77693. return p
  77694. }
  77695. // VPMOVW2M performs "Move Signs of Packed Word Integers to Mask Register".
  77696. //
  77697. // Mnemonic : VPMOVW2M
  77698. // Supported forms : (3 forms)
  77699. //
  77700. // * VPMOVW2M zmm, k [AVX512BW]
  77701. // * VPMOVW2M xmm, k [AVX512BW,AVX512VL]
  77702. // * VPMOVW2M ymm, k [AVX512BW,AVX512VL]
  77703. //
  77704. func (self *Program) VPMOVW2M(v0 interface{}, v1 interface{}) *Instruction {
  77705. p := self.alloc("VPMOVW2M", 2, Operands { v0, v1 })
  77706. // VPMOVW2M zmm, k
  77707. if isZMM(v0) && isK(v1) {
  77708. self.require(ISA_AVX512BW)
  77709. p.domain = DomainAVX
  77710. p.add(0, func(m *_Encoding, v []interface{}) {
  77711. m.emit(0x62)
  77712. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  77713. m.emit(0xfe)
  77714. m.emit(0x48)
  77715. m.emit(0x29)
  77716. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  77717. })
  77718. }
  77719. // VPMOVW2M xmm, k
  77720. if isEVEXXMM(v0) && isK(v1) {
  77721. self.require(ISA_AVX512VL | ISA_AVX512BW)
  77722. p.domain = DomainAVX
  77723. p.add(0, func(m *_Encoding, v []interface{}) {
  77724. m.emit(0x62)
  77725. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  77726. m.emit(0xfe)
  77727. m.emit(0x08)
  77728. m.emit(0x29)
  77729. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  77730. })
  77731. }
  77732. // VPMOVW2M ymm, k
  77733. if isEVEXYMM(v0) && isK(v1) {
  77734. self.require(ISA_AVX512VL | ISA_AVX512BW)
  77735. p.domain = DomainAVX
  77736. p.add(0, func(m *_Encoding, v []interface{}) {
  77737. m.emit(0x62)
  77738. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  77739. m.emit(0xfe)
  77740. m.emit(0x28)
  77741. m.emit(0x29)
  77742. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  77743. })
  77744. }
  77745. if p.len == 0 {
  77746. panic("invalid operands for VPMOVW2M")
  77747. }
  77748. return p
  77749. }
  77750. // VPMOVWB performs "Down Convert Packed Word Values to Byte Values with Truncation".
  77751. //
  77752. // Mnemonic : VPMOVWB
  77753. // Supported forms : (6 forms)
  77754. //
  77755. // * VPMOVWB zmm, ymm{k}{z} [AVX512BW]
  77756. // * VPMOVWB zmm, m256{k}{z} [AVX512BW]
  77757. // * VPMOVWB xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  77758. // * VPMOVWB xmm, m64{k}{z} [AVX512BW,AVX512VL]
  77759. // * VPMOVWB ymm, xmm{k}{z} [AVX512BW,AVX512VL]
  77760. // * VPMOVWB ymm, m128{k}{z} [AVX512BW,AVX512VL]
  77761. //
  77762. func (self *Program) VPMOVWB(v0 interface{}, v1 interface{}) *Instruction {
  77763. p := self.alloc("VPMOVWB", 2, Operands { v0, v1 })
  77764. // VPMOVWB zmm, ymm{k}{z}
  77765. if isZMM(v0) && isYMMkz(v1) {
  77766. self.require(ISA_AVX512BW)
  77767. p.domain = DomainAVX
  77768. p.add(0, func(m *_Encoding, v []interface{}) {
  77769. m.emit(0x62)
  77770. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  77771. m.emit(0x7e)
  77772. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  77773. m.emit(0x30)
  77774. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  77775. })
  77776. }
  77777. // VPMOVWB zmm, m256{k}{z}
  77778. if isZMM(v0) && isM256kz(v1) {
  77779. self.require(ISA_AVX512BW)
  77780. p.domain = DomainAVX
  77781. p.add(0, func(m *_Encoding, v []interface{}) {
  77782. m.evex(0b10, 0x06, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  77783. m.emit(0x30)
  77784. m.mrsd(lcode(v[0]), addr(v[1]), 32)
  77785. })
  77786. }
  77787. // VPMOVWB xmm, xmm{k}{z}
  77788. if isEVEXXMM(v0) && isXMMkz(v1) {
  77789. self.require(ISA_AVX512VL | ISA_AVX512BW)
  77790. p.domain = DomainAVX
  77791. p.add(0, func(m *_Encoding, v []interface{}) {
  77792. m.emit(0x62)
  77793. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  77794. m.emit(0x7e)
  77795. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  77796. m.emit(0x30)
  77797. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  77798. })
  77799. }
  77800. // VPMOVWB xmm, m64{k}{z}
  77801. if isEVEXXMM(v0) && isM64kz(v1) {
  77802. self.require(ISA_AVX512VL | ISA_AVX512BW)
  77803. p.domain = DomainAVX
  77804. p.add(0, func(m *_Encoding, v []interface{}) {
  77805. m.evex(0b10, 0x06, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  77806. m.emit(0x30)
  77807. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  77808. })
  77809. }
  77810. // VPMOVWB ymm, xmm{k}{z}
  77811. if isEVEXYMM(v0) && isXMMkz(v1) {
  77812. self.require(ISA_AVX512VL | ISA_AVX512BW)
  77813. p.domain = DomainAVX
  77814. p.add(0, func(m *_Encoding, v []interface{}) {
  77815. m.emit(0x62)
  77816. m.emit(0xf2 ^ ((hcode(v[0]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[0]) << 4)))
  77817. m.emit(0x7e)
  77818. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  77819. m.emit(0x30)
  77820. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  77821. })
  77822. }
  77823. // VPMOVWB ymm, m128{k}{z}
  77824. if isEVEXYMM(v0) && isM128kz(v1) {
  77825. self.require(ISA_AVX512VL | ISA_AVX512BW)
  77826. p.domain = DomainAVX
  77827. p.add(0, func(m *_Encoding, v []interface{}) {
  77828. m.evex(0b10, 0x06, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), zcode(v[1]), 0)
  77829. m.emit(0x30)
  77830. m.mrsd(lcode(v[0]), addr(v[1]), 16)
  77831. })
  77832. }
  77833. if p.len == 0 {
  77834. panic("invalid operands for VPMOVWB")
  77835. }
  77836. return p
  77837. }
  77838. // VPMOVZXBD performs "Move Packed Byte Integers to Doubleword Integers with Zero Extension".
  77839. //
  77840. // Mnemonic : VPMOVZXBD
  77841. // Supported forms : (10 forms)
  77842. //
  77843. // * VPMOVZXBD xmm, xmm [AVX]
  77844. // * VPMOVZXBD m32, xmm [AVX]
  77845. // * VPMOVZXBD xmm, ymm [AVX2]
  77846. // * VPMOVZXBD m64, ymm [AVX2]
  77847. // * VPMOVZXBD xmm, zmm{k}{z} [AVX512F]
  77848. // * VPMOVZXBD m128, zmm{k}{z} [AVX512F]
  77849. // * VPMOVZXBD xmm, xmm{k}{z} [AVX512F,AVX512VL]
  77850. // * VPMOVZXBD xmm, ymm{k}{z} [AVX512F,AVX512VL]
  77851. // * VPMOVZXBD m32, xmm{k}{z} [AVX512F,AVX512VL]
  77852. // * VPMOVZXBD m64, ymm{k}{z} [AVX512F,AVX512VL]
  77853. //
  77854. func (self *Program) VPMOVZXBD(v0 interface{}, v1 interface{}) *Instruction {
  77855. p := self.alloc("VPMOVZXBD", 2, Operands { v0, v1 })
  77856. // VPMOVZXBD xmm, xmm
  77857. if isXMM(v0) && isXMM(v1) {
  77858. self.require(ISA_AVX)
  77859. p.domain = DomainAVX
  77860. p.add(0, func(m *_Encoding, v []interface{}) {
  77861. m.emit(0xc4)
  77862. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  77863. m.emit(0x79)
  77864. m.emit(0x31)
  77865. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  77866. })
  77867. }
  77868. // VPMOVZXBD m32, xmm
  77869. if isM32(v0) && isXMM(v1) {
  77870. self.require(ISA_AVX)
  77871. p.domain = DomainAVX
  77872. p.add(0, func(m *_Encoding, v []interface{}) {
  77873. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  77874. m.emit(0x31)
  77875. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  77876. })
  77877. }
  77878. // VPMOVZXBD xmm, ymm
  77879. if isXMM(v0) && isYMM(v1) {
  77880. self.require(ISA_AVX2)
  77881. p.domain = DomainAVX
  77882. p.add(0, func(m *_Encoding, v []interface{}) {
  77883. m.emit(0xc4)
  77884. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  77885. m.emit(0x7d)
  77886. m.emit(0x31)
  77887. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  77888. })
  77889. }
  77890. // VPMOVZXBD m64, ymm
  77891. if isM64(v0) && isYMM(v1) {
  77892. self.require(ISA_AVX2)
  77893. p.domain = DomainAVX
  77894. p.add(0, func(m *_Encoding, v []interface{}) {
  77895. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  77896. m.emit(0x31)
  77897. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  77898. })
  77899. }
  77900. // VPMOVZXBD xmm, zmm{k}{z}
  77901. if isEVEXXMM(v0) && isZMMkz(v1) {
  77902. self.require(ISA_AVX512F)
  77903. p.domain = DomainAVX
  77904. p.add(0, func(m *_Encoding, v []interface{}) {
  77905. m.emit(0x62)
  77906. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  77907. m.emit(0x7d)
  77908. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  77909. m.emit(0x31)
  77910. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  77911. })
  77912. }
  77913. // VPMOVZXBD m128, zmm{k}{z}
  77914. if isM128(v0) && isZMMkz(v1) {
  77915. self.require(ISA_AVX512F)
  77916. p.domain = DomainAVX
  77917. p.add(0, func(m *_Encoding, v []interface{}) {
  77918. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  77919. m.emit(0x31)
  77920. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  77921. })
  77922. }
  77923. // VPMOVZXBD xmm, xmm{k}{z}
  77924. if isEVEXXMM(v0) && isXMMkz(v1) {
  77925. self.require(ISA_AVX512VL | ISA_AVX512F)
  77926. p.domain = DomainAVX
  77927. p.add(0, func(m *_Encoding, v []interface{}) {
  77928. m.emit(0x62)
  77929. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  77930. m.emit(0x7d)
  77931. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  77932. m.emit(0x31)
  77933. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  77934. })
  77935. }
  77936. // VPMOVZXBD xmm, ymm{k}{z}
  77937. if isEVEXXMM(v0) && isYMMkz(v1) {
  77938. self.require(ISA_AVX512VL | ISA_AVX512F)
  77939. p.domain = DomainAVX
  77940. p.add(0, func(m *_Encoding, v []interface{}) {
  77941. m.emit(0x62)
  77942. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  77943. m.emit(0x7d)
  77944. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  77945. m.emit(0x31)
  77946. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  77947. })
  77948. }
  77949. // VPMOVZXBD m32, xmm{k}{z}
  77950. if isM32(v0) && isXMMkz(v1) {
  77951. self.require(ISA_AVX512VL | ISA_AVX512F)
  77952. p.domain = DomainAVX
  77953. p.add(0, func(m *_Encoding, v []interface{}) {
  77954. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  77955. m.emit(0x31)
  77956. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  77957. })
  77958. }
  77959. // VPMOVZXBD m64, ymm{k}{z}
  77960. if isM64(v0) && isYMMkz(v1) {
  77961. self.require(ISA_AVX512VL | ISA_AVX512F)
  77962. p.domain = DomainAVX
  77963. p.add(0, func(m *_Encoding, v []interface{}) {
  77964. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  77965. m.emit(0x31)
  77966. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  77967. })
  77968. }
  77969. if p.len == 0 {
  77970. panic("invalid operands for VPMOVZXBD")
  77971. }
  77972. return p
  77973. }
  77974. // VPMOVZXBQ performs "Move Packed Byte Integers to Quadword Integers with Zero Extension".
  77975. //
  77976. // Mnemonic : VPMOVZXBQ
  77977. // Supported forms : (10 forms)
  77978. //
  77979. // * VPMOVZXBQ xmm, xmm [AVX]
  77980. // * VPMOVZXBQ m16, xmm [AVX]
  77981. // * VPMOVZXBQ xmm, ymm [AVX2]
  77982. // * VPMOVZXBQ m32, ymm [AVX2]
  77983. // * VPMOVZXBQ xmm, zmm{k}{z} [AVX512F]
  77984. // * VPMOVZXBQ m64, zmm{k}{z} [AVX512F]
  77985. // * VPMOVZXBQ xmm, xmm{k}{z} [AVX512F,AVX512VL]
  77986. // * VPMOVZXBQ xmm, ymm{k}{z} [AVX512F,AVX512VL]
  77987. // * VPMOVZXBQ m16, xmm{k}{z} [AVX512F,AVX512VL]
  77988. // * VPMOVZXBQ m32, ymm{k}{z} [AVX512F,AVX512VL]
  77989. //
  77990. func (self *Program) VPMOVZXBQ(v0 interface{}, v1 interface{}) *Instruction {
  77991. p := self.alloc("VPMOVZXBQ", 2, Operands { v0, v1 })
  77992. // VPMOVZXBQ xmm, xmm
  77993. if isXMM(v0) && isXMM(v1) {
  77994. self.require(ISA_AVX)
  77995. p.domain = DomainAVX
  77996. p.add(0, func(m *_Encoding, v []interface{}) {
  77997. m.emit(0xc4)
  77998. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  77999. m.emit(0x79)
  78000. m.emit(0x32)
  78001. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78002. })
  78003. }
  78004. // VPMOVZXBQ m16, xmm
  78005. if isM16(v0) && isXMM(v1) {
  78006. self.require(ISA_AVX)
  78007. p.domain = DomainAVX
  78008. p.add(0, func(m *_Encoding, v []interface{}) {
  78009. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  78010. m.emit(0x32)
  78011. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  78012. })
  78013. }
  78014. // VPMOVZXBQ xmm, ymm
  78015. if isXMM(v0) && isYMM(v1) {
  78016. self.require(ISA_AVX2)
  78017. p.domain = DomainAVX
  78018. p.add(0, func(m *_Encoding, v []interface{}) {
  78019. m.emit(0xc4)
  78020. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  78021. m.emit(0x7d)
  78022. m.emit(0x32)
  78023. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78024. })
  78025. }
  78026. // VPMOVZXBQ m32, ymm
  78027. if isM32(v0) && isYMM(v1) {
  78028. self.require(ISA_AVX2)
  78029. p.domain = DomainAVX
  78030. p.add(0, func(m *_Encoding, v []interface{}) {
  78031. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  78032. m.emit(0x32)
  78033. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  78034. })
  78035. }
  78036. // VPMOVZXBQ xmm, zmm{k}{z}
  78037. if isEVEXXMM(v0) && isZMMkz(v1) {
  78038. self.require(ISA_AVX512F)
  78039. p.domain = DomainAVX
  78040. p.add(0, func(m *_Encoding, v []interface{}) {
  78041. m.emit(0x62)
  78042. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  78043. m.emit(0x7d)
  78044. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  78045. m.emit(0x32)
  78046. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78047. })
  78048. }
  78049. // VPMOVZXBQ m64, zmm{k}{z}
  78050. if isM64(v0) && isZMMkz(v1) {
  78051. self.require(ISA_AVX512F)
  78052. p.domain = DomainAVX
  78053. p.add(0, func(m *_Encoding, v []interface{}) {
  78054. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  78055. m.emit(0x32)
  78056. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  78057. })
  78058. }
  78059. // VPMOVZXBQ xmm, xmm{k}{z}
  78060. if isEVEXXMM(v0) && isXMMkz(v1) {
  78061. self.require(ISA_AVX512VL | ISA_AVX512F)
  78062. p.domain = DomainAVX
  78063. p.add(0, func(m *_Encoding, v []interface{}) {
  78064. m.emit(0x62)
  78065. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  78066. m.emit(0x7d)
  78067. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  78068. m.emit(0x32)
  78069. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78070. })
  78071. }
  78072. // VPMOVZXBQ xmm, ymm{k}{z}
  78073. if isEVEXXMM(v0) && isYMMkz(v1) {
  78074. self.require(ISA_AVX512VL | ISA_AVX512F)
  78075. p.domain = DomainAVX
  78076. p.add(0, func(m *_Encoding, v []interface{}) {
  78077. m.emit(0x62)
  78078. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  78079. m.emit(0x7d)
  78080. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  78081. m.emit(0x32)
  78082. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78083. })
  78084. }
  78085. // VPMOVZXBQ m16, xmm{k}{z}
  78086. if isM16(v0) && isXMMkz(v1) {
  78087. self.require(ISA_AVX512VL | ISA_AVX512F)
  78088. p.domain = DomainAVX
  78089. p.add(0, func(m *_Encoding, v []interface{}) {
  78090. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  78091. m.emit(0x32)
  78092. m.mrsd(lcode(v[1]), addr(v[0]), 2)
  78093. })
  78094. }
  78095. // VPMOVZXBQ m32, ymm{k}{z}
  78096. if isM32(v0) && isYMMkz(v1) {
  78097. self.require(ISA_AVX512VL | ISA_AVX512F)
  78098. p.domain = DomainAVX
  78099. p.add(0, func(m *_Encoding, v []interface{}) {
  78100. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  78101. m.emit(0x32)
  78102. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  78103. })
  78104. }
  78105. if p.len == 0 {
  78106. panic("invalid operands for VPMOVZXBQ")
  78107. }
  78108. return p
  78109. }
  78110. // VPMOVZXBW performs "Move Packed Byte Integers to Word Integers with Zero Extension".
  78111. //
  78112. // Mnemonic : VPMOVZXBW
  78113. // Supported forms : (10 forms)
  78114. //
  78115. // * VPMOVZXBW xmm, xmm [AVX]
  78116. // * VPMOVZXBW m64, xmm [AVX]
  78117. // * VPMOVZXBW xmm, ymm [AVX2]
  78118. // * VPMOVZXBW m128, ymm [AVX2]
  78119. // * VPMOVZXBW ymm, zmm{k}{z} [AVX512BW]
  78120. // * VPMOVZXBW m256, zmm{k}{z} [AVX512BW]
  78121. // * VPMOVZXBW xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  78122. // * VPMOVZXBW xmm, ymm{k}{z} [AVX512BW,AVX512VL]
  78123. // * VPMOVZXBW m64, xmm{k}{z} [AVX512BW,AVX512VL]
  78124. // * VPMOVZXBW m128, ymm{k}{z} [AVX512BW,AVX512VL]
  78125. //
  78126. func (self *Program) VPMOVZXBW(v0 interface{}, v1 interface{}) *Instruction {
  78127. p := self.alloc("VPMOVZXBW", 2, Operands { v0, v1 })
  78128. // VPMOVZXBW xmm, xmm
  78129. if isXMM(v0) && isXMM(v1) {
  78130. self.require(ISA_AVX)
  78131. p.domain = DomainAVX
  78132. p.add(0, func(m *_Encoding, v []interface{}) {
  78133. m.emit(0xc4)
  78134. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  78135. m.emit(0x79)
  78136. m.emit(0x30)
  78137. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78138. })
  78139. }
  78140. // VPMOVZXBW m64, xmm
  78141. if isM64(v0) && isXMM(v1) {
  78142. self.require(ISA_AVX)
  78143. p.domain = DomainAVX
  78144. p.add(0, func(m *_Encoding, v []interface{}) {
  78145. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  78146. m.emit(0x30)
  78147. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  78148. })
  78149. }
  78150. // VPMOVZXBW xmm, ymm
  78151. if isXMM(v0) && isYMM(v1) {
  78152. self.require(ISA_AVX2)
  78153. p.domain = DomainAVX
  78154. p.add(0, func(m *_Encoding, v []interface{}) {
  78155. m.emit(0xc4)
  78156. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  78157. m.emit(0x7d)
  78158. m.emit(0x30)
  78159. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78160. })
  78161. }
  78162. // VPMOVZXBW m128, ymm
  78163. if isM128(v0) && isYMM(v1) {
  78164. self.require(ISA_AVX2)
  78165. p.domain = DomainAVX
  78166. p.add(0, func(m *_Encoding, v []interface{}) {
  78167. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  78168. m.emit(0x30)
  78169. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  78170. })
  78171. }
  78172. // VPMOVZXBW ymm, zmm{k}{z}
  78173. if isEVEXYMM(v0) && isZMMkz(v1) {
  78174. self.require(ISA_AVX512BW)
  78175. p.domain = DomainAVX
  78176. p.add(0, func(m *_Encoding, v []interface{}) {
  78177. m.emit(0x62)
  78178. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  78179. m.emit(0x7d)
  78180. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  78181. m.emit(0x30)
  78182. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78183. })
  78184. }
  78185. // VPMOVZXBW m256, zmm{k}{z}
  78186. if isM256(v0) && isZMMkz(v1) {
  78187. self.require(ISA_AVX512BW)
  78188. p.domain = DomainAVX
  78189. p.add(0, func(m *_Encoding, v []interface{}) {
  78190. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  78191. m.emit(0x30)
  78192. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  78193. })
  78194. }
  78195. // VPMOVZXBW xmm, xmm{k}{z}
  78196. if isEVEXXMM(v0) && isXMMkz(v1) {
  78197. self.require(ISA_AVX512VL | ISA_AVX512BW)
  78198. p.domain = DomainAVX
  78199. p.add(0, func(m *_Encoding, v []interface{}) {
  78200. m.emit(0x62)
  78201. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  78202. m.emit(0x7d)
  78203. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  78204. m.emit(0x30)
  78205. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78206. })
  78207. }
  78208. // VPMOVZXBW xmm, ymm{k}{z}
  78209. if isEVEXXMM(v0) && isYMMkz(v1) {
  78210. self.require(ISA_AVX512VL | ISA_AVX512BW)
  78211. p.domain = DomainAVX
  78212. p.add(0, func(m *_Encoding, v []interface{}) {
  78213. m.emit(0x62)
  78214. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  78215. m.emit(0x7d)
  78216. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  78217. m.emit(0x30)
  78218. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78219. })
  78220. }
  78221. // VPMOVZXBW m64, xmm{k}{z}
  78222. if isM64(v0) && isXMMkz(v1) {
  78223. self.require(ISA_AVX512VL | ISA_AVX512BW)
  78224. p.domain = DomainAVX
  78225. p.add(0, func(m *_Encoding, v []interface{}) {
  78226. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  78227. m.emit(0x30)
  78228. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  78229. })
  78230. }
  78231. // VPMOVZXBW m128, ymm{k}{z}
  78232. if isM128(v0) && isYMMkz(v1) {
  78233. self.require(ISA_AVX512VL | ISA_AVX512BW)
  78234. p.domain = DomainAVX
  78235. p.add(0, func(m *_Encoding, v []interface{}) {
  78236. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  78237. m.emit(0x30)
  78238. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  78239. })
  78240. }
  78241. if p.len == 0 {
  78242. panic("invalid operands for VPMOVZXBW")
  78243. }
  78244. return p
  78245. }
  78246. // VPMOVZXDQ performs "Move Packed Doubleword Integers to Quadword Integers with Zero Extension".
  78247. //
  78248. // Mnemonic : VPMOVZXDQ
  78249. // Supported forms : (10 forms)
  78250. //
  78251. // * VPMOVZXDQ xmm, xmm [AVX]
  78252. // * VPMOVZXDQ m64, xmm [AVX]
  78253. // * VPMOVZXDQ xmm, ymm [AVX2]
  78254. // * VPMOVZXDQ m128, ymm [AVX2]
  78255. // * VPMOVZXDQ ymm, zmm{k}{z} [AVX512F]
  78256. // * VPMOVZXDQ m256, zmm{k}{z} [AVX512F]
  78257. // * VPMOVZXDQ xmm, xmm{k}{z} [AVX512F,AVX512VL]
  78258. // * VPMOVZXDQ xmm, ymm{k}{z} [AVX512F,AVX512VL]
  78259. // * VPMOVZXDQ m64, xmm{k}{z} [AVX512F,AVX512VL]
  78260. // * VPMOVZXDQ m128, ymm{k}{z} [AVX512F,AVX512VL]
  78261. //
  78262. func (self *Program) VPMOVZXDQ(v0 interface{}, v1 interface{}) *Instruction {
  78263. p := self.alloc("VPMOVZXDQ", 2, Operands { v0, v1 })
  78264. // VPMOVZXDQ xmm, xmm
  78265. if isXMM(v0) && isXMM(v1) {
  78266. self.require(ISA_AVX)
  78267. p.domain = DomainAVX
  78268. p.add(0, func(m *_Encoding, v []interface{}) {
  78269. m.emit(0xc4)
  78270. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  78271. m.emit(0x79)
  78272. m.emit(0x35)
  78273. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78274. })
  78275. }
  78276. // VPMOVZXDQ m64, xmm
  78277. if isM64(v0) && isXMM(v1) {
  78278. self.require(ISA_AVX)
  78279. p.domain = DomainAVX
  78280. p.add(0, func(m *_Encoding, v []interface{}) {
  78281. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  78282. m.emit(0x35)
  78283. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  78284. })
  78285. }
  78286. // VPMOVZXDQ xmm, ymm
  78287. if isXMM(v0) && isYMM(v1) {
  78288. self.require(ISA_AVX2)
  78289. p.domain = DomainAVX
  78290. p.add(0, func(m *_Encoding, v []interface{}) {
  78291. m.emit(0xc4)
  78292. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  78293. m.emit(0x7d)
  78294. m.emit(0x35)
  78295. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78296. })
  78297. }
  78298. // VPMOVZXDQ m128, ymm
  78299. if isM128(v0) && isYMM(v1) {
  78300. self.require(ISA_AVX2)
  78301. p.domain = DomainAVX
  78302. p.add(0, func(m *_Encoding, v []interface{}) {
  78303. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  78304. m.emit(0x35)
  78305. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  78306. })
  78307. }
  78308. // VPMOVZXDQ ymm, zmm{k}{z}
  78309. if isEVEXYMM(v0) && isZMMkz(v1) {
  78310. self.require(ISA_AVX512F)
  78311. p.domain = DomainAVX
  78312. p.add(0, func(m *_Encoding, v []interface{}) {
  78313. m.emit(0x62)
  78314. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  78315. m.emit(0x7d)
  78316. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  78317. m.emit(0x35)
  78318. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78319. })
  78320. }
  78321. // VPMOVZXDQ m256, zmm{k}{z}
  78322. if isM256(v0) && isZMMkz(v1) {
  78323. self.require(ISA_AVX512F)
  78324. p.domain = DomainAVX
  78325. p.add(0, func(m *_Encoding, v []interface{}) {
  78326. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  78327. m.emit(0x35)
  78328. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  78329. })
  78330. }
  78331. // VPMOVZXDQ xmm, xmm{k}{z}
  78332. if isEVEXXMM(v0) && isXMMkz(v1) {
  78333. self.require(ISA_AVX512VL | ISA_AVX512F)
  78334. p.domain = DomainAVX
  78335. p.add(0, func(m *_Encoding, v []interface{}) {
  78336. m.emit(0x62)
  78337. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  78338. m.emit(0x7d)
  78339. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  78340. m.emit(0x35)
  78341. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78342. })
  78343. }
  78344. // VPMOVZXDQ xmm, ymm{k}{z}
  78345. if isEVEXXMM(v0) && isYMMkz(v1) {
  78346. self.require(ISA_AVX512VL | ISA_AVX512F)
  78347. p.domain = DomainAVX
  78348. p.add(0, func(m *_Encoding, v []interface{}) {
  78349. m.emit(0x62)
  78350. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  78351. m.emit(0x7d)
  78352. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  78353. m.emit(0x35)
  78354. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78355. })
  78356. }
  78357. // VPMOVZXDQ m64, xmm{k}{z}
  78358. if isM64(v0) && isXMMkz(v1) {
  78359. self.require(ISA_AVX512VL | ISA_AVX512F)
  78360. p.domain = DomainAVX
  78361. p.add(0, func(m *_Encoding, v []interface{}) {
  78362. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  78363. m.emit(0x35)
  78364. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  78365. })
  78366. }
  78367. // VPMOVZXDQ m128, ymm{k}{z}
  78368. if isM128(v0) && isYMMkz(v1) {
  78369. self.require(ISA_AVX512VL | ISA_AVX512F)
  78370. p.domain = DomainAVX
  78371. p.add(0, func(m *_Encoding, v []interface{}) {
  78372. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  78373. m.emit(0x35)
  78374. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  78375. })
  78376. }
  78377. if p.len == 0 {
  78378. panic("invalid operands for VPMOVZXDQ")
  78379. }
  78380. return p
  78381. }
  78382. // VPMOVZXWD performs "Move Packed Word Integers to Doubleword Integers with Zero Extension".
  78383. //
  78384. // Mnemonic : VPMOVZXWD
  78385. // Supported forms : (10 forms)
  78386. //
  78387. // * VPMOVZXWD xmm, xmm [AVX]
  78388. // * VPMOVZXWD m64, xmm [AVX]
  78389. // * VPMOVZXWD xmm, ymm [AVX2]
  78390. // * VPMOVZXWD m128, ymm [AVX2]
  78391. // * VPMOVZXWD ymm, zmm{k}{z} [AVX512F]
  78392. // * VPMOVZXWD m256, zmm{k}{z} [AVX512F]
  78393. // * VPMOVZXWD xmm, xmm{k}{z} [AVX512F,AVX512VL]
  78394. // * VPMOVZXWD xmm, ymm{k}{z} [AVX512F,AVX512VL]
  78395. // * VPMOVZXWD m64, xmm{k}{z} [AVX512F,AVX512VL]
  78396. // * VPMOVZXWD m128, ymm{k}{z} [AVX512F,AVX512VL]
  78397. //
  78398. func (self *Program) VPMOVZXWD(v0 interface{}, v1 interface{}) *Instruction {
  78399. p := self.alloc("VPMOVZXWD", 2, Operands { v0, v1 })
  78400. // VPMOVZXWD xmm, xmm
  78401. if isXMM(v0) && isXMM(v1) {
  78402. self.require(ISA_AVX)
  78403. p.domain = DomainAVX
  78404. p.add(0, func(m *_Encoding, v []interface{}) {
  78405. m.emit(0xc4)
  78406. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  78407. m.emit(0x79)
  78408. m.emit(0x33)
  78409. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78410. })
  78411. }
  78412. // VPMOVZXWD m64, xmm
  78413. if isM64(v0) && isXMM(v1) {
  78414. self.require(ISA_AVX)
  78415. p.domain = DomainAVX
  78416. p.add(0, func(m *_Encoding, v []interface{}) {
  78417. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  78418. m.emit(0x33)
  78419. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  78420. })
  78421. }
  78422. // VPMOVZXWD xmm, ymm
  78423. if isXMM(v0) && isYMM(v1) {
  78424. self.require(ISA_AVX2)
  78425. p.domain = DomainAVX
  78426. p.add(0, func(m *_Encoding, v []interface{}) {
  78427. m.emit(0xc4)
  78428. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  78429. m.emit(0x7d)
  78430. m.emit(0x33)
  78431. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78432. })
  78433. }
  78434. // VPMOVZXWD m128, ymm
  78435. if isM128(v0) && isYMM(v1) {
  78436. self.require(ISA_AVX2)
  78437. p.domain = DomainAVX
  78438. p.add(0, func(m *_Encoding, v []interface{}) {
  78439. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  78440. m.emit(0x33)
  78441. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  78442. })
  78443. }
  78444. // VPMOVZXWD ymm, zmm{k}{z}
  78445. if isEVEXYMM(v0) && isZMMkz(v1) {
  78446. self.require(ISA_AVX512F)
  78447. p.domain = DomainAVX
  78448. p.add(0, func(m *_Encoding, v []interface{}) {
  78449. m.emit(0x62)
  78450. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  78451. m.emit(0x7d)
  78452. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  78453. m.emit(0x33)
  78454. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78455. })
  78456. }
  78457. // VPMOVZXWD m256, zmm{k}{z}
  78458. if isM256(v0) && isZMMkz(v1) {
  78459. self.require(ISA_AVX512F)
  78460. p.domain = DomainAVX
  78461. p.add(0, func(m *_Encoding, v []interface{}) {
  78462. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  78463. m.emit(0x33)
  78464. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  78465. })
  78466. }
  78467. // VPMOVZXWD xmm, xmm{k}{z}
  78468. if isEVEXXMM(v0) && isXMMkz(v1) {
  78469. self.require(ISA_AVX512VL | ISA_AVX512F)
  78470. p.domain = DomainAVX
  78471. p.add(0, func(m *_Encoding, v []interface{}) {
  78472. m.emit(0x62)
  78473. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  78474. m.emit(0x7d)
  78475. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  78476. m.emit(0x33)
  78477. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78478. })
  78479. }
  78480. // VPMOVZXWD xmm, ymm{k}{z}
  78481. if isEVEXXMM(v0) && isYMMkz(v1) {
  78482. self.require(ISA_AVX512VL | ISA_AVX512F)
  78483. p.domain = DomainAVX
  78484. p.add(0, func(m *_Encoding, v []interface{}) {
  78485. m.emit(0x62)
  78486. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  78487. m.emit(0x7d)
  78488. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  78489. m.emit(0x33)
  78490. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78491. })
  78492. }
  78493. // VPMOVZXWD m64, xmm{k}{z}
  78494. if isM64(v0) && isXMMkz(v1) {
  78495. self.require(ISA_AVX512VL | ISA_AVX512F)
  78496. p.domain = DomainAVX
  78497. p.add(0, func(m *_Encoding, v []interface{}) {
  78498. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  78499. m.emit(0x33)
  78500. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  78501. })
  78502. }
  78503. // VPMOVZXWD m128, ymm{k}{z}
  78504. if isM128(v0) && isYMMkz(v1) {
  78505. self.require(ISA_AVX512VL | ISA_AVX512F)
  78506. p.domain = DomainAVX
  78507. p.add(0, func(m *_Encoding, v []interface{}) {
  78508. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  78509. m.emit(0x33)
  78510. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  78511. })
  78512. }
  78513. if p.len == 0 {
  78514. panic("invalid operands for VPMOVZXWD")
  78515. }
  78516. return p
  78517. }
  78518. // VPMOVZXWQ performs "Move Packed Word Integers to Quadword Integers with Zero Extension".
  78519. //
  78520. // Mnemonic : VPMOVZXWQ
  78521. // Supported forms : (10 forms)
  78522. //
  78523. // * VPMOVZXWQ xmm, xmm [AVX]
  78524. // * VPMOVZXWQ m32, xmm [AVX]
  78525. // * VPMOVZXWQ xmm, ymm [AVX2]
  78526. // * VPMOVZXWQ m64, ymm [AVX2]
  78527. // * VPMOVZXWQ xmm, zmm{k}{z} [AVX512F]
  78528. // * VPMOVZXWQ m128, zmm{k}{z} [AVX512F]
  78529. // * VPMOVZXWQ xmm, xmm{k}{z} [AVX512F,AVX512VL]
  78530. // * VPMOVZXWQ xmm, ymm{k}{z} [AVX512F,AVX512VL]
  78531. // * VPMOVZXWQ m32, xmm{k}{z} [AVX512F,AVX512VL]
  78532. // * VPMOVZXWQ m64, ymm{k}{z} [AVX512F,AVX512VL]
  78533. //
  78534. func (self *Program) VPMOVZXWQ(v0 interface{}, v1 interface{}) *Instruction {
  78535. p := self.alloc("VPMOVZXWQ", 2, Operands { v0, v1 })
  78536. // VPMOVZXWQ xmm, xmm
  78537. if isXMM(v0) && isXMM(v1) {
  78538. self.require(ISA_AVX)
  78539. p.domain = DomainAVX
  78540. p.add(0, func(m *_Encoding, v []interface{}) {
  78541. m.emit(0xc4)
  78542. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  78543. m.emit(0x79)
  78544. m.emit(0x34)
  78545. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78546. })
  78547. }
  78548. // VPMOVZXWQ m32, xmm
  78549. if isM32(v0) && isXMM(v1) {
  78550. self.require(ISA_AVX)
  78551. p.domain = DomainAVX
  78552. p.add(0, func(m *_Encoding, v []interface{}) {
  78553. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  78554. m.emit(0x34)
  78555. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  78556. })
  78557. }
  78558. // VPMOVZXWQ xmm, ymm
  78559. if isXMM(v0) && isYMM(v1) {
  78560. self.require(ISA_AVX2)
  78561. p.domain = DomainAVX
  78562. p.add(0, func(m *_Encoding, v []interface{}) {
  78563. m.emit(0xc4)
  78564. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  78565. m.emit(0x7d)
  78566. m.emit(0x34)
  78567. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78568. })
  78569. }
  78570. // VPMOVZXWQ m64, ymm
  78571. if isM64(v0) && isYMM(v1) {
  78572. self.require(ISA_AVX2)
  78573. p.domain = DomainAVX
  78574. p.add(0, func(m *_Encoding, v []interface{}) {
  78575. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  78576. m.emit(0x34)
  78577. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  78578. })
  78579. }
  78580. // VPMOVZXWQ xmm, zmm{k}{z}
  78581. if isEVEXXMM(v0) && isZMMkz(v1) {
  78582. self.require(ISA_AVX512F)
  78583. p.domain = DomainAVX
  78584. p.add(0, func(m *_Encoding, v []interface{}) {
  78585. m.emit(0x62)
  78586. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  78587. m.emit(0x7d)
  78588. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  78589. m.emit(0x34)
  78590. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78591. })
  78592. }
  78593. // VPMOVZXWQ m128, zmm{k}{z}
  78594. if isM128(v0) && isZMMkz(v1) {
  78595. self.require(ISA_AVX512F)
  78596. p.domain = DomainAVX
  78597. p.add(0, func(m *_Encoding, v []interface{}) {
  78598. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  78599. m.emit(0x34)
  78600. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  78601. })
  78602. }
  78603. // VPMOVZXWQ xmm, xmm{k}{z}
  78604. if isEVEXXMM(v0) && isXMMkz(v1) {
  78605. self.require(ISA_AVX512VL | ISA_AVX512F)
  78606. p.domain = DomainAVX
  78607. p.add(0, func(m *_Encoding, v []interface{}) {
  78608. m.emit(0x62)
  78609. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  78610. m.emit(0x7d)
  78611. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  78612. m.emit(0x34)
  78613. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78614. })
  78615. }
  78616. // VPMOVZXWQ xmm, ymm{k}{z}
  78617. if isEVEXXMM(v0) && isYMMkz(v1) {
  78618. self.require(ISA_AVX512VL | ISA_AVX512F)
  78619. p.domain = DomainAVX
  78620. p.add(0, func(m *_Encoding, v []interface{}) {
  78621. m.emit(0x62)
  78622. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  78623. m.emit(0x7d)
  78624. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  78625. m.emit(0x34)
  78626. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  78627. })
  78628. }
  78629. // VPMOVZXWQ m32, xmm{k}{z}
  78630. if isM32(v0) && isXMMkz(v1) {
  78631. self.require(ISA_AVX512VL | ISA_AVX512F)
  78632. p.domain = DomainAVX
  78633. p.add(0, func(m *_Encoding, v []interface{}) {
  78634. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  78635. m.emit(0x34)
  78636. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  78637. })
  78638. }
  78639. // VPMOVZXWQ m64, ymm{k}{z}
  78640. if isM64(v0) && isYMMkz(v1) {
  78641. self.require(ISA_AVX512VL | ISA_AVX512F)
  78642. p.domain = DomainAVX
  78643. p.add(0, func(m *_Encoding, v []interface{}) {
  78644. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), 0)
  78645. m.emit(0x34)
  78646. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  78647. })
  78648. }
  78649. if p.len == 0 {
  78650. panic("invalid operands for VPMOVZXWQ")
  78651. }
  78652. return p
  78653. }
  78654. // VPMULDQ performs "Multiply Packed Signed Doubleword Integers and Store Quadword Result".
  78655. //
  78656. // Mnemonic : VPMULDQ
  78657. // Supported forms : (10 forms)
  78658. //
  78659. // * VPMULDQ xmm, xmm, xmm [AVX]
  78660. // * VPMULDQ m128, xmm, xmm [AVX]
  78661. // * VPMULDQ ymm, ymm, ymm [AVX2]
  78662. // * VPMULDQ m256, ymm, ymm [AVX2]
  78663. // * VPMULDQ m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  78664. // * VPMULDQ zmm, zmm, zmm{k}{z} [AVX512F]
  78665. // * VPMULDQ m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  78666. // * VPMULDQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  78667. // * VPMULDQ m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  78668. // * VPMULDQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  78669. //
  78670. func (self *Program) VPMULDQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  78671. p := self.alloc("VPMULDQ", 3, Operands { v0, v1, v2 })
  78672. // VPMULDQ xmm, xmm, xmm
  78673. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  78674. self.require(ISA_AVX)
  78675. p.domain = DomainAVX
  78676. p.add(0, func(m *_Encoding, v []interface{}) {
  78677. m.emit(0xc4)
  78678. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  78679. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  78680. m.emit(0x28)
  78681. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  78682. })
  78683. }
  78684. // VPMULDQ m128, xmm, xmm
  78685. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  78686. self.require(ISA_AVX)
  78687. p.domain = DomainAVX
  78688. p.add(0, func(m *_Encoding, v []interface{}) {
  78689. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  78690. m.emit(0x28)
  78691. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  78692. })
  78693. }
  78694. // VPMULDQ ymm, ymm, ymm
  78695. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  78696. self.require(ISA_AVX2)
  78697. p.domain = DomainAVX
  78698. p.add(0, func(m *_Encoding, v []interface{}) {
  78699. m.emit(0xc4)
  78700. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  78701. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  78702. m.emit(0x28)
  78703. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  78704. })
  78705. }
  78706. // VPMULDQ m256, ymm, ymm
  78707. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  78708. self.require(ISA_AVX2)
  78709. p.domain = DomainAVX
  78710. p.add(0, func(m *_Encoding, v []interface{}) {
  78711. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  78712. m.emit(0x28)
  78713. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  78714. })
  78715. }
  78716. // VPMULDQ m512/m64bcst, zmm, zmm{k}{z}
  78717. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  78718. self.require(ISA_AVX512F)
  78719. p.domain = DomainAVX
  78720. p.add(0, func(m *_Encoding, v []interface{}) {
  78721. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  78722. m.emit(0x28)
  78723. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  78724. })
  78725. }
  78726. // VPMULDQ zmm, zmm, zmm{k}{z}
  78727. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  78728. self.require(ISA_AVX512F)
  78729. p.domain = DomainAVX
  78730. p.add(0, func(m *_Encoding, v []interface{}) {
  78731. m.emit(0x62)
  78732. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  78733. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  78734. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  78735. m.emit(0x28)
  78736. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  78737. })
  78738. }
  78739. // VPMULDQ m128/m64bcst, xmm, xmm{k}{z}
  78740. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  78741. self.require(ISA_AVX512VL | ISA_AVX512F)
  78742. p.domain = DomainAVX
  78743. p.add(0, func(m *_Encoding, v []interface{}) {
  78744. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  78745. m.emit(0x28)
  78746. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  78747. })
  78748. }
  78749. // VPMULDQ xmm, xmm, xmm{k}{z}
  78750. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  78751. self.require(ISA_AVX512VL | ISA_AVX512F)
  78752. p.domain = DomainAVX
  78753. p.add(0, func(m *_Encoding, v []interface{}) {
  78754. m.emit(0x62)
  78755. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  78756. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  78757. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  78758. m.emit(0x28)
  78759. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  78760. })
  78761. }
  78762. // VPMULDQ m256/m64bcst, ymm, ymm{k}{z}
  78763. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  78764. self.require(ISA_AVX512VL | ISA_AVX512F)
  78765. p.domain = DomainAVX
  78766. p.add(0, func(m *_Encoding, v []interface{}) {
  78767. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  78768. m.emit(0x28)
  78769. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  78770. })
  78771. }
  78772. // VPMULDQ ymm, ymm, ymm{k}{z}
  78773. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  78774. self.require(ISA_AVX512VL | ISA_AVX512F)
  78775. p.domain = DomainAVX
  78776. p.add(0, func(m *_Encoding, v []interface{}) {
  78777. m.emit(0x62)
  78778. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  78779. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  78780. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  78781. m.emit(0x28)
  78782. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  78783. })
  78784. }
  78785. if p.len == 0 {
  78786. panic("invalid operands for VPMULDQ")
  78787. }
  78788. return p
  78789. }
  78790. // VPMULHRSW performs "Packed Multiply Signed Word Integers and Store High Result with Round and Scale".
  78791. //
  78792. // Mnemonic : VPMULHRSW
  78793. // Supported forms : (10 forms)
  78794. //
  78795. // * VPMULHRSW xmm, xmm, xmm [AVX]
  78796. // * VPMULHRSW m128, xmm, xmm [AVX]
  78797. // * VPMULHRSW ymm, ymm, ymm [AVX2]
  78798. // * VPMULHRSW m256, ymm, ymm [AVX2]
  78799. // * VPMULHRSW zmm, zmm, zmm{k}{z} [AVX512BW]
  78800. // * VPMULHRSW m512, zmm, zmm{k}{z} [AVX512BW]
  78801. // * VPMULHRSW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  78802. // * VPMULHRSW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  78803. // * VPMULHRSW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  78804. // * VPMULHRSW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  78805. //
  78806. func (self *Program) VPMULHRSW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  78807. p := self.alloc("VPMULHRSW", 3, Operands { v0, v1, v2 })
  78808. // VPMULHRSW xmm, xmm, xmm
  78809. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  78810. self.require(ISA_AVX)
  78811. p.domain = DomainAVX
  78812. p.add(0, func(m *_Encoding, v []interface{}) {
  78813. m.emit(0xc4)
  78814. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  78815. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  78816. m.emit(0x0b)
  78817. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  78818. })
  78819. }
  78820. // VPMULHRSW m128, xmm, xmm
  78821. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  78822. self.require(ISA_AVX)
  78823. p.domain = DomainAVX
  78824. p.add(0, func(m *_Encoding, v []interface{}) {
  78825. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  78826. m.emit(0x0b)
  78827. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  78828. })
  78829. }
  78830. // VPMULHRSW ymm, ymm, ymm
  78831. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  78832. self.require(ISA_AVX2)
  78833. p.domain = DomainAVX
  78834. p.add(0, func(m *_Encoding, v []interface{}) {
  78835. m.emit(0xc4)
  78836. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  78837. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  78838. m.emit(0x0b)
  78839. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  78840. })
  78841. }
  78842. // VPMULHRSW m256, ymm, ymm
  78843. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  78844. self.require(ISA_AVX2)
  78845. p.domain = DomainAVX
  78846. p.add(0, func(m *_Encoding, v []interface{}) {
  78847. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  78848. m.emit(0x0b)
  78849. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  78850. })
  78851. }
  78852. // VPMULHRSW zmm, zmm, zmm{k}{z}
  78853. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  78854. self.require(ISA_AVX512BW)
  78855. p.domain = DomainAVX
  78856. p.add(0, func(m *_Encoding, v []interface{}) {
  78857. m.emit(0x62)
  78858. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  78859. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  78860. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  78861. m.emit(0x0b)
  78862. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  78863. })
  78864. }
  78865. // VPMULHRSW m512, zmm, zmm{k}{z}
  78866. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  78867. self.require(ISA_AVX512BW)
  78868. p.domain = DomainAVX
  78869. p.add(0, func(m *_Encoding, v []interface{}) {
  78870. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  78871. m.emit(0x0b)
  78872. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  78873. })
  78874. }
  78875. // VPMULHRSW xmm, xmm, xmm{k}{z}
  78876. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  78877. self.require(ISA_AVX512VL | ISA_AVX512BW)
  78878. p.domain = DomainAVX
  78879. p.add(0, func(m *_Encoding, v []interface{}) {
  78880. m.emit(0x62)
  78881. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  78882. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  78883. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  78884. m.emit(0x0b)
  78885. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  78886. })
  78887. }
  78888. // VPMULHRSW m128, xmm, xmm{k}{z}
  78889. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  78890. self.require(ISA_AVX512VL | ISA_AVX512BW)
  78891. p.domain = DomainAVX
  78892. p.add(0, func(m *_Encoding, v []interface{}) {
  78893. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  78894. m.emit(0x0b)
  78895. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  78896. })
  78897. }
  78898. // VPMULHRSW ymm, ymm, ymm{k}{z}
  78899. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  78900. self.require(ISA_AVX512VL | ISA_AVX512BW)
  78901. p.domain = DomainAVX
  78902. p.add(0, func(m *_Encoding, v []interface{}) {
  78903. m.emit(0x62)
  78904. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  78905. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  78906. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  78907. m.emit(0x0b)
  78908. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  78909. })
  78910. }
  78911. // VPMULHRSW m256, ymm, ymm{k}{z}
  78912. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  78913. self.require(ISA_AVX512VL | ISA_AVX512BW)
  78914. p.domain = DomainAVX
  78915. p.add(0, func(m *_Encoding, v []interface{}) {
  78916. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  78917. m.emit(0x0b)
  78918. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  78919. })
  78920. }
  78921. if p.len == 0 {
  78922. panic("invalid operands for VPMULHRSW")
  78923. }
  78924. return p
  78925. }
  78926. // VPMULHUW performs "Multiply Packed Unsigned Word Integers and Store High Result".
  78927. //
  78928. // Mnemonic : VPMULHUW
  78929. // Supported forms : (10 forms)
  78930. //
  78931. // * VPMULHUW xmm, xmm, xmm [AVX]
  78932. // * VPMULHUW m128, xmm, xmm [AVX]
  78933. // * VPMULHUW ymm, ymm, ymm [AVX2]
  78934. // * VPMULHUW m256, ymm, ymm [AVX2]
  78935. // * VPMULHUW zmm, zmm, zmm{k}{z} [AVX512BW]
  78936. // * VPMULHUW m512, zmm, zmm{k}{z} [AVX512BW]
  78937. // * VPMULHUW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  78938. // * VPMULHUW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  78939. // * VPMULHUW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  78940. // * VPMULHUW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  78941. //
  78942. func (self *Program) VPMULHUW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  78943. p := self.alloc("VPMULHUW", 3, Operands { v0, v1, v2 })
  78944. // VPMULHUW xmm, xmm, xmm
  78945. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  78946. self.require(ISA_AVX)
  78947. p.domain = DomainAVX
  78948. p.add(0, func(m *_Encoding, v []interface{}) {
  78949. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  78950. m.emit(0xe4)
  78951. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  78952. })
  78953. }
  78954. // VPMULHUW m128, xmm, xmm
  78955. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  78956. self.require(ISA_AVX)
  78957. p.domain = DomainAVX
  78958. p.add(0, func(m *_Encoding, v []interface{}) {
  78959. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  78960. m.emit(0xe4)
  78961. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  78962. })
  78963. }
  78964. // VPMULHUW ymm, ymm, ymm
  78965. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  78966. self.require(ISA_AVX2)
  78967. p.domain = DomainAVX
  78968. p.add(0, func(m *_Encoding, v []interface{}) {
  78969. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  78970. m.emit(0xe4)
  78971. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  78972. })
  78973. }
  78974. // VPMULHUW m256, ymm, ymm
  78975. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  78976. self.require(ISA_AVX2)
  78977. p.domain = DomainAVX
  78978. p.add(0, func(m *_Encoding, v []interface{}) {
  78979. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  78980. m.emit(0xe4)
  78981. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  78982. })
  78983. }
  78984. // VPMULHUW zmm, zmm, zmm{k}{z}
  78985. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  78986. self.require(ISA_AVX512BW)
  78987. p.domain = DomainAVX
  78988. p.add(0, func(m *_Encoding, v []interface{}) {
  78989. m.emit(0x62)
  78990. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  78991. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  78992. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  78993. m.emit(0xe4)
  78994. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  78995. })
  78996. }
  78997. // VPMULHUW m512, zmm, zmm{k}{z}
  78998. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  78999. self.require(ISA_AVX512BW)
  79000. p.domain = DomainAVX
  79001. p.add(0, func(m *_Encoding, v []interface{}) {
  79002. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  79003. m.emit(0xe4)
  79004. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  79005. })
  79006. }
  79007. // VPMULHUW xmm, xmm, xmm{k}{z}
  79008. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  79009. self.require(ISA_AVX512VL | ISA_AVX512BW)
  79010. p.domain = DomainAVX
  79011. p.add(0, func(m *_Encoding, v []interface{}) {
  79012. m.emit(0x62)
  79013. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79014. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  79015. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  79016. m.emit(0xe4)
  79017. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79018. })
  79019. }
  79020. // VPMULHUW m128, xmm, xmm{k}{z}
  79021. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  79022. self.require(ISA_AVX512VL | ISA_AVX512BW)
  79023. p.domain = DomainAVX
  79024. p.add(0, func(m *_Encoding, v []interface{}) {
  79025. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  79026. m.emit(0xe4)
  79027. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  79028. })
  79029. }
  79030. // VPMULHUW ymm, ymm, ymm{k}{z}
  79031. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  79032. self.require(ISA_AVX512VL | ISA_AVX512BW)
  79033. p.domain = DomainAVX
  79034. p.add(0, func(m *_Encoding, v []interface{}) {
  79035. m.emit(0x62)
  79036. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79037. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  79038. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  79039. m.emit(0xe4)
  79040. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79041. })
  79042. }
  79043. // VPMULHUW m256, ymm, ymm{k}{z}
  79044. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  79045. self.require(ISA_AVX512VL | ISA_AVX512BW)
  79046. p.domain = DomainAVX
  79047. p.add(0, func(m *_Encoding, v []interface{}) {
  79048. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  79049. m.emit(0xe4)
  79050. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  79051. })
  79052. }
  79053. if p.len == 0 {
  79054. panic("invalid operands for VPMULHUW")
  79055. }
  79056. return p
  79057. }
  79058. // VPMULHW performs "Multiply Packed Signed Word Integers and Store High Result".
  79059. //
  79060. // Mnemonic : VPMULHW
  79061. // Supported forms : (10 forms)
  79062. //
  79063. // * VPMULHW xmm, xmm, xmm [AVX]
  79064. // * VPMULHW m128, xmm, xmm [AVX]
  79065. // * VPMULHW ymm, ymm, ymm [AVX2]
  79066. // * VPMULHW m256, ymm, ymm [AVX2]
  79067. // * VPMULHW zmm, zmm, zmm{k}{z} [AVX512BW]
  79068. // * VPMULHW m512, zmm, zmm{k}{z} [AVX512BW]
  79069. // * VPMULHW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  79070. // * VPMULHW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  79071. // * VPMULHW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  79072. // * VPMULHW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  79073. //
  79074. func (self *Program) VPMULHW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  79075. p := self.alloc("VPMULHW", 3, Operands { v0, v1, v2 })
  79076. // VPMULHW xmm, xmm, xmm
  79077. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  79078. self.require(ISA_AVX)
  79079. p.domain = DomainAVX
  79080. p.add(0, func(m *_Encoding, v []interface{}) {
  79081. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  79082. m.emit(0xe5)
  79083. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79084. })
  79085. }
  79086. // VPMULHW m128, xmm, xmm
  79087. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  79088. self.require(ISA_AVX)
  79089. p.domain = DomainAVX
  79090. p.add(0, func(m *_Encoding, v []interface{}) {
  79091. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  79092. m.emit(0xe5)
  79093. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  79094. })
  79095. }
  79096. // VPMULHW ymm, ymm, ymm
  79097. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  79098. self.require(ISA_AVX2)
  79099. p.domain = DomainAVX
  79100. p.add(0, func(m *_Encoding, v []interface{}) {
  79101. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  79102. m.emit(0xe5)
  79103. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79104. })
  79105. }
  79106. // VPMULHW m256, ymm, ymm
  79107. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  79108. self.require(ISA_AVX2)
  79109. p.domain = DomainAVX
  79110. p.add(0, func(m *_Encoding, v []interface{}) {
  79111. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  79112. m.emit(0xe5)
  79113. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  79114. })
  79115. }
  79116. // VPMULHW zmm, zmm, zmm{k}{z}
  79117. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  79118. self.require(ISA_AVX512BW)
  79119. p.domain = DomainAVX
  79120. p.add(0, func(m *_Encoding, v []interface{}) {
  79121. m.emit(0x62)
  79122. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79123. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  79124. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  79125. m.emit(0xe5)
  79126. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79127. })
  79128. }
  79129. // VPMULHW m512, zmm, zmm{k}{z}
  79130. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  79131. self.require(ISA_AVX512BW)
  79132. p.domain = DomainAVX
  79133. p.add(0, func(m *_Encoding, v []interface{}) {
  79134. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  79135. m.emit(0xe5)
  79136. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  79137. })
  79138. }
  79139. // VPMULHW xmm, xmm, xmm{k}{z}
  79140. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  79141. self.require(ISA_AVX512VL | ISA_AVX512BW)
  79142. p.domain = DomainAVX
  79143. p.add(0, func(m *_Encoding, v []interface{}) {
  79144. m.emit(0x62)
  79145. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79146. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  79147. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  79148. m.emit(0xe5)
  79149. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79150. })
  79151. }
  79152. // VPMULHW m128, xmm, xmm{k}{z}
  79153. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  79154. self.require(ISA_AVX512VL | ISA_AVX512BW)
  79155. p.domain = DomainAVX
  79156. p.add(0, func(m *_Encoding, v []interface{}) {
  79157. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  79158. m.emit(0xe5)
  79159. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  79160. })
  79161. }
  79162. // VPMULHW ymm, ymm, ymm{k}{z}
  79163. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  79164. self.require(ISA_AVX512VL | ISA_AVX512BW)
  79165. p.domain = DomainAVX
  79166. p.add(0, func(m *_Encoding, v []interface{}) {
  79167. m.emit(0x62)
  79168. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79169. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  79170. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  79171. m.emit(0xe5)
  79172. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79173. })
  79174. }
  79175. // VPMULHW m256, ymm, ymm{k}{z}
  79176. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  79177. self.require(ISA_AVX512VL | ISA_AVX512BW)
  79178. p.domain = DomainAVX
  79179. p.add(0, func(m *_Encoding, v []interface{}) {
  79180. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  79181. m.emit(0xe5)
  79182. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  79183. })
  79184. }
  79185. if p.len == 0 {
  79186. panic("invalid operands for VPMULHW")
  79187. }
  79188. return p
  79189. }
  79190. // VPMULLD performs "Multiply Packed Signed Doubleword Integers and Store Low Result".
  79191. //
  79192. // Mnemonic : VPMULLD
  79193. // Supported forms : (10 forms)
  79194. //
  79195. // * VPMULLD xmm, xmm, xmm [AVX]
  79196. // * VPMULLD m128, xmm, xmm [AVX]
  79197. // * VPMULLD ymm, ymm, ymm [AVX2]
  79198. // * VPMULLD m256, ymm, ymm [AVX2]
  79199. // * VPMULLD m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  79200. // * VPMULLD zmm, zmm, zmm{k}{z} [AVX512F]
  79201. // * VPMULLD m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  79202. // * VPMULLD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  79203. // * VPMULLD m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  79204. // * VPMULLD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  79205. //
  79206. func (self *Program) VPMULLD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  79207. p := self.alloc("VPMULLD", 3, Operands { v0, v1, v2 })
  79208. // VPMULLD xmm, xmm, xmm
  79209. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  79210. self.require(ISA_AVX)
  79211. p.domain = DomainAVX
  79212. p.add(0, func(m *_Encoding, v []interface{}) {
  79213. m.emit(0xc4)
  79214. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  79215. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  79216. m.emit(0x40)
  79217. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79218. })
  79219. }
  79220. // VPMULLD m128, xmm, xmm
  79221. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  79222. self.require(ISA_AVX)
  79223. p.domain = DomainAVX
  79224. p.add(0, func(m *_Encoding, v []interface{}) {
  79225. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  79226. m.emit(0x40)
  79227. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  79228. })
  79229. }
  79230. // VPMULLD ymm, ymm, ymm
  79231. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  79232. self.require(ISA_AVX2)
  79233. p.domain = DomainAVX
  79234. p.add(0, func(m *_Encoding, v []interface{}) {
  79235. m.emit(0xc4)
  79236. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  79237. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  79238. m.emit(0x40)
  79239. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79240. })
  79241. }
  79242. // VPMULLD m256, ymm, ymm
  79243. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  79244. self.require(ISA_AVX2)
  79245. p.domain = DomainAVX
  79246. p.add(0, func(m *_Encoding, v []interface{}) {
  79247. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  79248. m.emit(0x40)
  79249. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  79250. })
  79251. }
  79252. // VPMULLD m512/m32bcst, zmm, zmm{k}{z}
  79253. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  79254. self.require(ISA_AVX512F)
  79255. p.domain = DomainAVX
  79256. p.add(0, func(m *_Encoding, v []interface{}) {
  79257. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  79258. m.emit(0x40)
  79259. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  79260. })
  79261. }
  79262. // VPMULLD zmm, zmm, zmm{k}{z}
  79263. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  79264. self.require(ISA_AVX512F)
  79265. p.domain = DomainAVX
  79266. p.add(0, func(m *_Encoding, v []interface{}) {
  79267. m.emit(0x62)
  79268. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79269. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  79270. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  79271. m.emit(0x40)
  79272. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79273. })
  79274. }
  79275. // VPMULLD m128/m32bcst, xmm, xmm{k}{z}
  79276. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  79277. self.require(ISA_AVX512VL | ISA_AVX512F)
  79278. p.domain = DomainAVX
  79279. p.add(0, func(m *_Encoding, v []interface{}) {
  79280. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  79281. m.emit(0x40)
  79282. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  79283. })
  79284. }
  79285. // VPMULLD xmm, xmm, xmm{k}{z}
  79286. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  79287. self.require(ISA_AVX512VL | ISA_AVX512F)
  79288. p.domain = DomainAVX
  79289. p.add(0, func(m *_Encoding, v []interface{}) {
  79290. m.emit(0x62)
  79291. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79292. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  79293. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  79294. m.emit(0x40)
  79295. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79296. })
  79297. }
  79298. // VPMULLD m256/m32bcst, ymm, ymm{k}{z}
  79299. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  79300. self.require(ISA_AVX512VL | ISA_AVX512F)
  79301. p.domain = DomainAVX
  79302. p.add(0, func(m *_Encoding, v []interface{}) {
  79303. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  79304. m.emit(0x40)
  79305. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  79306. })
  79307. }
  79308. // VPMULLD ymm, ymm, ymm{k}{z}
  79309. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  79310. self.require(ISA_AVX512VL | ISA_AVX512F)
  79311. p.domain = DomainAVX
  79312. p.add(0, func(m *_Encoding, v []interface{}) {
  79313. m.emit(0x62)
  79314. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79315. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  79316. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  79317. m.emit(0x40)
  79318. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79319. })
  79320. }
  79321. if p.len == 0 {
  79322. panic("invalid operands for VPMULLD")
  79323. }
  79324. return p
  79325. }
  79326. // VPMULLQ performs "Multiply Packed Signed Quadword Integers and Store Low Result".
  79327. //
  79328. // Mnemonic : VPMULLQ
  79329. // Supported forms : (6 forms)
  79330. //
  79331. // * VPMULLQ m512/m64bcst, zmm, zmm{k}{z} [AVX512DQ]
  79332. // * VPMULLQ zmm, zmm, zmm{k}{z} [AVX512DQ]
  79333. // * VPMULLQ m128/m64bcst, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  79334. // * VPMULLQ xmm, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  79335. // * VPMULLQ m256/m64bcst, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  79336. // * VPMULLQ ymm, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  79337. //
  79338. func (self *Program) VPMULLQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  79339. p := self.alloc("VPMULLQ", 3, Operands { v0, v1, v2 })
  79340. // VPMULLQ m512/m64bcst, zmm, zmm{k}{z}
  79341. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  79342. self.require(ISA_AVX512DQ)
  79343. p.domain = DomainAVX
  79344. p.add(0, func(m *_Encoding, v []interface{}) {
  79345. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  79346. m.emit(0x40)
  79347. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  79348. })
  79349. }
  79350. // VPMULLQ zmm, zmm, zmm{k}{z}
  79351. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  79352. self.require(ISA_AVX512DQ)
  79353. p.domain = DomainAVX
  79354. p.add(0, func(m *_Encoding, v []interface{}) {
  79355. m.emit(0x62)
  79356. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79357. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  79358. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  79359. m.emit(0x40)
  79360. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79361. })
  79362. }
  79363. // VPMULLQ m128/m64bcst, xmm, xmm{k}{z}
  79364. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  79365. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  79366. p.domain = DomainAVX
  79367. p.add(0, func(m *_Encoding, v []interface{}) {
  79368. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  79369. m.emit(0x40)
  79370. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  79371. })
  79372. }
  79373. // VPMULLQ xmm, xmm, xmm{k}{z}
  79374. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  79375. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  79376. p.domain = DomainAVX
  79377. p.add(0, func(m *_Encoding, v []interface{}) {
  79378. m.emit(0x62)
  79379. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79380. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  79381. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  79382. m.emit(0x40)
  79383. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79384. })
  79385. }
  79386. // VPMULLQ m256/m64bcst, ymm, ymm{k}{z}
  79387. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  79388. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  79389. p.domain = DomainAVX
  79390. p.add(0, func(m *_Encoding, v []interface{}) {
  79391. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  79392. m.emit(0x40)
  79393. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  79394. })
  79395. }
  79396. // VPMULLQ ymm, ymm, ymm{k}{z}
  79397. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  79398. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  79399. p.domain = DomainAVX
  79400. p.add(0, func(m *_Encoding, v []interface{}) {
  79401. m.emit(0x62)
  79402. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79403. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  79404. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  79405. m.emit(0x40)
  79406. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79407. })
  79408. }
  79409. if p.len == 0 {
  79410. panic("invalid operands for VPMULLQ")
  79411. }
  79412. return p
  79413. }
  79414. // VPMULLW performs "Multiply Packed Signed Word Integers and Store Low Result".
  79415. //
  79416. // Mnemonic : VPMULLW
  79417. // Supported forms : (10 forms)
  79418. //
  79419. // * VPMULLW xmm, xmm, xmm [AVX]
  79420. // * VPMULLW m128, xmm, xmm [AVX]
  79421. // * VPMULLW ymm, ymm, ymm [AVX2]
  79422. // * VPMULLW m256, ymm, ymm [AVX2]
  79423. // * VPMULLW zmm, zmm, zmm{k}{z} [AVX512BW]
  79424. // * VPMULLW m512, zmm, zmm{k}{z} [AVX512BW]
  79425. // * VPMULLW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  79426. // * VPMULLW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  79427. // * VPMULLW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  79428. // * VPMULLW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  79429. //
  79430. func (self *Program) VPMULLW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  79431. p := self.alloc("VPMULLW", 3, Operands { v0, v1, v2 })
  79432. // VPMULLW xmm, xmm, xmm
  79433. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  79434. self.require(ISA_AVX)
  79435. p.domain = DomainAVX
  79436. p.add(0, func(m *_Encoding, v []interface{}) {
  79437. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  79438. m.emit(0xd5)
  79439. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79440. })
  79441. }
  79442. // VPMULLW m128, xmm, xmm
  79443. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  79444. self.require(ISA_AVX)
  79445. p.domain = DomainAVX
  79446. p.add(0, func(m *_Encoding, v []interface{}) {
  79447. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  79448. m.emit(0xd5)
  79449. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  79450. })
  79451. }
  79452. // VPMULLW ymm, ymm, ymm
  79453. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  79454. self.require(ISA_AVX2)
  79455. p.domain = DomainAVX
  79456. p.add(0, func(m *_Encoding, v []interface{}) {
  79457. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  79458. m.emit(0xd5)
  79459. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79460. })
  79461. }
  79462. // VPMULLW m256, ymm, ymm
  79463. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  79464. self.require(ISA_AVX2)
  79465. p.domain = DomainAVX
  79466. p.add(0, func(m *_Encoding, v []interface{}) {
  79467. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  79468. m.emit(0xd5)
  79469. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  79470. })
  79471. }
  79472. // VPMULLW zmm, zmm, zmm{k}{z}
  79473. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  79474. self.require(ISA_AVX512BW)
  79475. p.domain = DomainAVX
  79476. p.add(0, func(m *_Encoding, v []interface{}) {
  79477. m.emit(0x62)
  79478. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79479. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  79480. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  79481. m.emit(0xd5)
  79482. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79483. })
  79484. }
  79485. // VPMULLW m512, zmm, zmm{k}{z}
  79486. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  79487. self.require(ISA_AVX512BW)
  79488. p.domain = DomainAVX
  79489. p.add(0, func(m *_Encoding, v []interface{}) {
  79490. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  79491. m.emit(0xd5)
  79492. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  79493. })
  79494. }
  79495. // VPMULLW xmm, xmm, xmm{k}{z}
  79496. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  79497. self.require(ISA_AVX512VL | ISA_AVX512BW)
  79498. p.domain = DomainAVX
  79499. p.add(0, func(m *_Encoding, v []interface{}) {
  79500. m.emit(0x62)
  79501. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79502. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  79503. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  79504. m.emit(0xd5)
  79505. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79506. })
  79507. }
  79508. // VPMULLW m128, xmm, xmm{k}{z}
  79509. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  79510. self.require(ISA_AVX512VL | ISA_AVX512BW)
  79511. p.domain = DomainAVX
  79512. p.add(0, func(m *_Encoding, v []interface{}) {
  79513. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  79514. m.emit(0xd5)
  79515. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  79516. })
  79517. }
  79518. // VPMULLW ymm, ymm, ymm{k}{z}
  79519. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  79520. self.require(ISA_AVX512VL | ISA_AVX512BW)
  79521. p.domain = DomainAVX
  79522. p.add(0, func(m *_Encoding, v []interface{}) {
  79523. m.emit(0x62)
  79524. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79525. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  79526. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  79527. m.emit(0xd5)
  79528. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79529. })
  79530. }
  79531. // VPMULLW m256, ymm, ymm{k}{z}
  79532. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  79533. self.require(ISA_AVX512VL | ISA_AVX512BW)
  79534. p.domain = DomainAVX
  79535. p.add(0, func(m *_Encoding, v []interface{}) {
  79536. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  79537. m.emit(0xd5)
  79538. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  79539. })
  79540. }
  79541. if p.len == 0 {
  79542. panic("invalid operands for VPMULLW")
  79543. }
  79544. return p
  79545. }
  79546. // VPMULTISHIFTQB performs "Select Packed Unaligned Bytes from Quadword Sources".
  79547. //
  79548. // Mnemonic : VPMULTISHIFTQB
  79549. // Supported forms : (6 forms)
  79550. //
  79551. // * VPMULTISHIFTQB m128/m64bcst, xmm, xmm{k}{z} [AVX512VBMI,AVX512VL]
  79552. // * VPMULTISHIFTQB xmm, xmm, xmm{k}{z} [AVX512VBMI,AVX512VL]
  79553. // * VPMULTISHIFTQB m256/m64bcst, ymm, ymm{k}{z} [AVX512VBMI,AVX512VL]
  79554. // * VPMULTISHIFTQB ymm, ymm, ymm{k}{z} [AVX512VBMI,AVX512VL]
  79555. // * VPMULTISHIFTQB m512/m64bcst, zmm, zmm{k}{z} [AVX512VBMI]
  79556. // * VPMULTISHIFTQB zmm, zmm, zmm{k}{z} [AVX512VBMI]
  79557. //
  79558. func (self *Program) VPMULTISHIFTQB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  79559. p := self.alloc("VPMULTISHIFTQB", 3, Operands { v0, v1, v2 })
  79560. // VPMULTISHIFTQB m128/m64bcst, xmm, xmm{k}{z}
  79561. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  79562. self.require(ISA_AVX512VBMI | ISA_AVX512VL)
  79563. p.domain = DomainAVX
  79564. p.add(0, func(m *_Encoding, v []interface{}) {
  79565. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  79566. m.emit(0x83)
  79567. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  79568. })
  79569. }
  79570. // VPMULTISHIFTQB xmm, xmm, xmm{k}{z}
  79571. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  79572. self.require(ISA_AVX512VBMI | ISA_AVX512VL)
  79573. p.domain = DomainAVX
  79574. p.add(0, func(m *_Encoding, v []interface{}) {
  79575. m.emit(0x62)
  79576. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79577. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  79578. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  79579. m.emit(0x83)
  79580. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79581. })
  79582. }
  79583. // VPMULTISHIFTQB m256/m64bcst, ymm, ymm{k}{z}
  79584. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  79585. self.require(ISA_AVX512VBMI | ISA_AVX512VL)
  79586. p.domain = DomainAVX
  79587. p.add(0, func(m *_Encoding, v []interface{}) {
  79588. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  79589. m.emit(0x83)
  79590. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  79591. })
  79592. }
  79593. // VPMULTISHIFTQB ymm, ymm, ymm{k}{z}
  79594. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  79595. self.require(ISA_AVX512VBMI | ISA_AVX512VL)
  79596. p.domain = DomainAVX
  79597. p.add(0, func(m *_Encoding, v []interface{}) {
  79598. m.emit(0x62)
  79599. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79600. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  79601. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  79602. m.emit(0x83)
  79603. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79604. })
  79605. }
  79606. // VPMULTISHIFTQB m512/m64bcst, zmm, zmm{k}{z}
  79607. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  79608. self.require(ISA_AVX512VBMI)
  79609. p.domain = DomainAVX
  79610. p.add(0, func(m *_Encoding, v []interface{}) {
  79611. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  79612. m.emit(0x83)
  79613. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  79614. })
  79615. }
  79616. // VPMULTISHIFTQB zmm, zmm, zmm{k}{z}
  79617. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  79618. self.require(ISA_AVX512VBMI)
  79619. p.domain = DomainAVX
  79620. p.add(0, func(m *_Encoding, v []interface{}) {
  79621. m.emit(0x62)
  79622. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79623. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  79624. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  79625. m.emit(0x83)
  79626. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79627. })
  79628. }
  79629. if p.len == 0 {
  79630. panic("invalid operands for VPMULTISHIFTQB")
  79631. }
  79632. return p
  79633. }
  79634. // VPMULUDQ performs "Multiply Packed Unsigned Doubleword Integers".
  79635. //
  79636. // Mnemonic : VPMULUDQ
  79637. // Supported forms : (10 forms)
  79638. //
  79639. // * VPMULUDQ xmm, xmm, xmm [AVX]
  79640. // * VPMULUDQ m128, xmm, xmm [AVX]
  79641. // * VPMULUDQ ymm, ymm, ymm [AVX2]
  79642. // * VPMULUDQ m256, ymm, ymm [AVX2]
  79643. // * VPMULUDQ m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  79644. // * VPMULUDQ zmm, zmm, zmm{k}{z} [AVX512F]
  79645. // * VPMULUDQ m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  79646. // * VPMULUDQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  79647. // * VPMULUDQ m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  79648. // * VPMULUDQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  79649. //
  79650. func (self *Program) VPMULUDQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  79651. p := self.alloc("VPMULUDQ", 3, Operands { v0, v1, v2 })
  79652. // VPMULUDQ xmm, xmm, xmm
  79653. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  79654. self.require(ISA_AVX)
  79655. p.domain = DomainAVX
  79656. p.add(0, func(m *_Encoding, v []interface{}) {
  79657. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  79658. m.emit(0xf4)
  79659. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79660. })
  79661. }
  79662. // VPMULUDQ m128, xmm, xmm
  79663. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  79664. self.require(ISA_AVX)
  79665. p.domain = DomainAVX
  79666. p.add(0, func(m *_Encoding, v []interface{}) {
  79667. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  79668. m.emit(0xf4)
  79669. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  79670. })
  79671. }
  79672. // VPMULUDQ ymm, ymm, ymm
  79673. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  79674. self.require(ISA_AVX2)
  79675. p.domain = DomainAVX
  79676. p.add(0, func(m *_Encoding, v []interface{}) {
  79677. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  79678. m.emit(0xf4)
  79679. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79680. })
  79681. }
  79682. // VPMULUDQ m256, ymm, ymm
  79683. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  79684. self.require(ISA_AVX2)
  79685. p.domain = DomainAVX
  79686. p.add(0, func(m *_Encoding, v []interface{}) {
  79687. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  79688. m.emit(0xf4)
  79689. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  79690. })
  79691. }
  79692. // VPMULUDQ m512/m64bcst, zmm, zmm{k}{z}
  79693. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  79694. self.require(ISA_AVX512F)
  79695. p.domain = DomainAVX
  79696. p.add(0, func(m *_Encoding, v []interface{}) {
  79697. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  79698. m.emit(0xf4)
  79699. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  79700. })
  79701. }
  79702. // VPMULUDQ zmm, zmm, zmm{k}{z}
  79703. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  79704. self.require(ISA_AVX512F)
  79705. p.domain = DomainAVX
  79706. p.add(0, func(m *_Encoding, v []interface{}) {
  79707. m.emit(0x62)
  79708. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79709. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  79710. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  79711. m.emit(0xf4)
  79712. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79713. })
  79714. }
  79715. // VPMULUDQ m128/m64bcst, xmm, xmm{k}{z}
  79716. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  79717. self.require(ISA_AVX512VL | ISA_AVX512F)
  79718. p.domain = DomainAVX
  79719. p.add(0, func(m *_Encoding, v []interface{}) {
  79720. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  79721. m.emit(0xf4)
  79722. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  79723. })
  79724. }
  79725. // VPMULUDQ xmm, xmm, xmm{k}{z}
  79726. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  79727. self.require(ISA_AVX512VL | ISA_AVX512F)
  79728. p.domain = DomainAVX
  79729. p.add(0, func(m *_Encoding, v []interface{}) {
  79730. m.emit(0x62)
  79731. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79732. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  79733. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  79734. m.emit(0xf4)
  79735. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79736. })
  79737. }
  79738. // VPMULUDQ m256/m64bcst, ymm, ymm{k}{z}
  79739. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  79740. self.require(ISA_AVX512VL | ISA_AVX512F)
  79741. p.domain = DomainAVX
  79742. p.add(0, func(m *_Encoding, v []interface{}) {
  79743. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  79744. m.emit(0xf4)
  79745. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  79746. })
  79747. }
  79748. // VPMULUDQ ymm, ymm, ymm{k}{z}
  79749. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  79750. self.require(ISA_AVX512VL | ISA_AVX512F)
  79751. p.domain = DomainAVX
  79752. p.add(0, func(m *_Encoding, v []interface{}) {
  79753. m.emit(0x62)
  79754. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79755. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  79756. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  79757. m.emit(0xf4)
  79758. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79759. })
  79760. }
  79761. if p.len == 0 {
  79762. panic("invalid operands for VPMULUDQ")
  79763. }
  79764. return p
  79765. }
  79766. // VPOPCNTD performs "Packed Population Count for Doubleword Integers".
  79767. //
  79768. // Mnemonic : VPOPCNTD
  79769. // Supported forms : (2 forms)
  79770. //
  79771. // * VPOPCNTD m512/m32bcst, zmm{k}{z} [AVX512VPOPCNTDQ]
  79772. // * VPOPCNTD zmm, zmm{k}{z} [AVX512VPOPCNTDQ]
  79773. //
  79774. func (self *Program) VPOPCNTD(v0 interface{}, v1 interface{}) *Instruction {
  79775. p := self.alloc("VPOPCNTD", 2, Operands { v0, v1 })
  79776. // VPOPCNTD m512/m32bcst, zmm{k}{z}
  79777. if isM512M32bcst(v0) && isZMMkz(v1) {
  79778. self.require(ISA_AVX512VPOPCNTDQ)
  79779. p.domain = DomainAVX
  79780. p.add(0, func(m *_Encoding, v []interface{}) {
  79781. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  79782. m.emit(0x55)
  79783. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  79784. })
  79785. }
  79786. // VPOPCNTD zmm, zmm{k}{z}
  79787. if isZMM(v0) && isZMMkz(v1) {
  79788. self.require(ISA_AVX512VPOPCNTDQ)
  79789. p.domain = DomainAVX
  79790. p.add(0, func(m *_Encoding, v []interface{}) {
  79791. m.emit(0x62)
  79792. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  79793. m.emit(0x7d)
  79794. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  79795. m.emit(0x55)
  79796. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  79797. })
  79798. }
  79799. if p.len == 0 {
  79800. panic("invalid operands for VPOPCNTD")
  79801. }
  79802. return p
  79803. }
  79804. // VPOPCNTQ performs "Packed Population Count for Quadword Integers".
  79805. //
  79806. // Mnemonic : VPOPCNTQ
  79807. // Supported forms : (2 forms)
  79808. //
  79809. // * VPOPCNTQ m512/m64bcst, zmm{k}{z} [AVX512VPOPCNTDQ]
  79810. // * VPOPCNTQ zmm, zmm{k}{z} [AVX512VPOPCNTDQ]
  79811. //
  79812. func (self *Program) VPOPCNTQ(v0 interface{}, v1 interface{}) *Instruction {
  79813. p := self.alloc("VPOPCNTQ", 2, Operands { v0, v1 })
  79814. // VPOPCNTQ m512/m64bcst, zmm{k}{z}
  79815. if isM512M64bcst(v0) && isZMMkz(v1) {
  79816. self.require(ISA_AVX512VPOPCNTDQ)
  79817. p.domain = DomainAVX
  79818. p.add(0, func(m *_Encoding, v []interface{}) {
  79819. m.evex(0b10, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  79820. m.emit(0x55)
  79821. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  79822. })
  79823. }
  79824. // VPOPCNTQ zmm, zmm{k}{z}
  79825. if isZMM(v0) && isZMMkz(v1) {
  79826. self.require(ISA_AVX512VPOPCNTDQ)
  79827. p.domain = DomainAVX
  79828. p.add(0, func(m *_Encoding, v []interface{}) {
  79829. m.emit(0x62)
  79830. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  79831. m.emit(0xfd)
  79832. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  79833. m.emit(0x55)
  79834. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  79835. })
  79836. }
  79837. if p.len == 0 {
  79838. panic("invalid operands for VPOPCNTQ")
  79839. }
  79840. return p
  79841. }
  79842. // VPOR performs "Packed Bitwise Logical OR".
  79843. //
  79844. // Mnemonic : VPOR
  79845. // Supported forms : (4 forms)
  79846. //
  79847. // * VPOR xmm, xmm, xmm [AVX]
  79848. // * VPOR m128, xmm, xmm [AVX]
  79849. // * VPOR ymm, ymm, ymm [AVX2]
  79850. // * VPOR m256, ymm, ymm [AVX2]
  79851. //
  79852. func (self *Program) VPOR(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  79853. p := self.alloc("VPOR", 3, Operands { v0, v1, v2 })
  79854. // VPOR xmm, xmm, xmm
  79855. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  79856. self.require(ISA_AVX)
  79857. p.domain = DomainAVX
  79858. p.add(0, func(m *_Encoding, v []interface{}) {
  79859. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  79860. m.emit(0xeb)
  79861. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79862. })
  79863. }
  79864. // VPOR m128, xmm, xmm
  79865. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  79866. self.require(ISA_AVX)
  79867. p.domain = DomainAVX
  79868. p.add(0, func(m *_Encoding, v []interface{}) {
  79869. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  79870. m.emit(0xeb)
  79871. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  79872. })
  79873. }
  79874. // VPOR ymm, ymm, ymm
  79875. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  79876. self.require(ISA_AVX2)
  79877. p.domain = DomainAVX
  79878. p.add(0, func(m *_Encoding, v []interface{}) {
  79879. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  79880. m.emit(0xeb)
  79881. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79882. })
  79883. }
  79884. // VPOR m256, ymm, ymm
  79885. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  79886. self.require(ISA_AVX2)
  79887. p.domain = DomainAVX
  79888. p.add(0, func(m *_Encoding, v []interface{}) {
  79889. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  79890. m.emit(0xeb)
  79891. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  79892. })
  79893. }
  79894. if p.len == 0 {
  79895. panic("invalid operands for VPOR")
  79896. }
  79897. return p
  79898. }
  79899. // VPORD performs "Bitwise Logical OR of Packed Doubleword Integers".
  79900. //
  79901. // Mnemonic : VPORD
  79902. // Supported forms : (6 forms)
  79903. //
  79904. // * VPORD m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  79905. // * VPORD zmm, zmm, zmm{k}{z} [AVX512F]
  79906. // * VPORD m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  79907. // * VPORD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  79908. // * VPORD m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  79909. // * VPORD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  79910. //
  79911. func (self *Program) VPORD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  79912. p := self.alloc("VPORD", 3, Operands { v0, v1, v2 })
  79913. // VPORD m512/m32bcst, zmm, zmm{k}{z}
  79914. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  79915. self.require(ISA_AVX512F)
  79916. p.domain = DomainAVX
  79917. p.add(0, func(m *_Encoding, v []interface{}) {
  79918. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  79919. m.emit(0xeb)
  79920. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  79921. })
  79922. }
  79923. // VPORD zmm, zmm, zmm{k}{z}
  79924. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  79925. self.require(ISA_AVX512F)
  79926. p.domain = DomainAVX
  79927. p.add(0, func(m *_Encoding, v []interface{}) {
  79928. m.emit(0x62)
  79929. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79930. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  79931. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  79932. m.emit(0xeb)
  79933. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79934. })
  79935. }
  79936. // VPORD m128/m32bcst, xmm, xmm{k}{z}
  79937. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  79938. self.require(ISA_AVX512VL | ISA_AVX512F)
  79939. p.domain = DomainAVX
  79940. p.add(0, func(m *_Encoding, v []interface{}) {
  79941. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  79942. m.emit(0xeb)
  79943. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  79944. })
  79945. }
  79946. // VPORD xmm, xmm, xmm{k}{z}
  79947. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  79948. self.require(ISA_AVX512VL | ISA_AVX512F)
  79949. p.domain = DomainAVX
  79950. p.add(0, func(m *_Encoding, v []interface{}) {
  79951. m.emit(0x62)
  79952. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79953. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  79954. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  79955. m.emit(0xeb)
  79956. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79957. })
  79958. }
  79959. // VPORD m256/m32bcst, ymm, ymm{k}{z}
  79960. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  79961. self.require(ISA_AVX512VL | ISA_AVX512F)
  79962. p.domain = DomainAVX
  79963. p.add(0, func(m *_Encoding, v []interface{}) {
  79964. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  79965. m.emit(0xeb)
  79966. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  79967. })
  79968. }
  79969. // VPORD ymm, ymm, ymm{k}{z}
  79970. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  79971. self.require(ISA_AVX512VL | ISA_AVX512F)
  79972. p.domain = DomainAVX
  79973. p.add(0, func(m *_Encoding, v []interface{}) {
  79974. m.emit(0x62)
  79975. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  79976. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  79977. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  79978. m.emit(0xeb)
  79979. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  79980. })
  79981. }
  79982. if p.len == 0 {
  79983. panic("invalid operands for VPORD")
  79984. }
  79985. return p
  79986. }
  79987. // VPORQ performs "Bitwise Logical OR of Packed Quadword Integers".
  79988. //
  79989. // Mnemonic : VPORQ
  79990. // Supported forms : (6 forms)
  79991. //
  79992. // * VPORQ m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  79993. // * VPORQ zmm, zmm, zmm{k}{z} [AVX512F]
  79994. // * VPORQ m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  79995. // * VPORQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  79996. // * VPORQ m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  79997. // * VPORQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  79998. //
  79999. func (self *Program) VPORQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  80000. p := self.alloc("VPORQ", 3, Operands { v0, v1, v2 })
  80001. // VPORQ m512/m64bcst, zmm, zmm{k}{z}
  80002. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  80003. self.require(ISA_AVX512F)
  80004. p.domain = DomainAVX
  80005. p.add(0, func(m *_Encoding, v []interface{}) {
  80006. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  80007. m.emit(0xeb)
  80008. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  80009. })
  80010. }
  80011. // VPORQ zmm, zmm, zmm{k}{z}
  80012. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  80013. self.require(ISA_AVX512F)
  80014. p.domain = DomainAVX
  80015. p.add(0, func(m *_Encoding, v []interface{}) {
  80016. m.emit(0x62)
  80017. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  80018. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  80019. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  80020. m.emit(0xeb)
  80021. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  80022. })
  80023. }
  80024. // VPORQ m128/m64bcst, xmm, xmm{k}{z}
  80025. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  80026. self.require(ISA_AVX512VL | ISA_AVX512F)
  80027. p.domain = DomainAVX
  80028. p.add(0, func(m *_Encoding, v []interface{}) {
  80029. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  80030. m.emit(0xeb)
  80031. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  80032. })
  80033. }
  80034. // VPORQ xmm, xmm, xmm{k}{z}
  80035. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  80036. self.require(ISA_AVX512VL | ISA_AVX512F)
  80037. p.domain = DomainAVX
  80038. p.add(0, func(m *_Encoding, v []interface{}) {
  80039. m.emit(0x62)
  80040. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  80041. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  80042. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  80043. m.emit(0xeb)
  80044. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  80045. })
  80046. }
  80047. // VPORQ m256/m64bcst, ymm, ymm{k}{z}
  80048. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  80049. self.require(ISA_AVX512VL | ISA_AVX512F)
  80050. p.domain = DomainAVX
  80051. p.add(0, func(m *_Encoding, v []interface{}) {
  80052. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  80053. m.emit(0xeb)
  80054. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  80055. })
  80056. }
  80057. // VPORQ ymm, ymm, ymm{k}{z}
  80058. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  80059. self.require(ISA_AVX512VL | ISA_AVX512F)
  80060. p.domain = DomainAVX
  80061. p.add(0, func(m *_Encoding, v []interface{}) {
  80062. m.emit(0x62)
  80063. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  80064. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  80065. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  80066. m.emit(0xeb)
  80067. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  80068. })
  80069. }
  80070. if p.len == 0 {
  80071. panic("invalid operands for VPORQ")
  80072. }
  80073. return p
  80074. }
  80075. // VPPERM performs "Packed Permute Bytes".
  80076. //
  80077. // Mnemonic : VPPERM
  80078. // Supported forms : (3 forms)
  80079. //
  80080. // * VPPERM xmm, xmm, xmm, xmm [XOP]
  80081. // * VPPERM m128, xmm, xmm, xmm [XOP]
  80082. // * VPPERM xmm, m128, xmm, xmm [XOP]
  80083. //
  80084. func (self *Program) VPPERM(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  80085. p := self.alloc("VPPERM", 4, Operands { v0, v1, v2, v3 })
  80086. // VPPERM xmm, xmm, xmm, xmm
  80087. if isXMM(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  80088. self.require(ISA_XOP)
  80089. p.domain = DomainAMDSpecific
  80090. p.add(0, func(m *_Encoding, v []interface{}) {
  80091. m.emit(0x8f)
  80092. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  80093. m.emit(0x78 ^ (hlcode(v[2]) << 3))
  80094. m.emit(0xa3)
  80095. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  80096. m.emit(hlcode(v[0]) << 4)
  80097. })
  80098. p.add(0, func(m *_Encoding, v []interface{}) {
  80099. m.emit(0x8f)
  80100. m.emit(0xe8 ^ (hcode(v[3]) << 7) ^ (hcode(v[0]) << 5))
  80101. m.emit(0xf8 ^ (hlcode(v[2]) << 3))
  80102. m.emit(0xa3)
  80103. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[0]))
  80104. m.emit(hlcode(v[1]) << 4)
  80105. })
  80106. }
  80107. // VPPERM m128, xmm, xmm, xmm
  80108. if isM128(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  80109. self.require(ISA_XOP)
  80110. p.domain = DomainAMDSpecific
  80111. p.add(0, func(m *_Encoding, v []interface{}) {
  80112. m.vex3(0x8f, 0b1000, 0x80, hcode(v[3]), addr(v[0]), hlcode(v[2]))
  80113. m.emit(0xa3)
  80114. m.mrsd(lcode(v[3]), addr(v[0]), 1)
  80115. m.emit(hlcode(v[1]) << 4)
  80116. })
  80117. }
  80118. // VPPERM xmm, m128, xmm, xmm
  80119. if isXMM(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  80120. self.require(ISA_XOP)
  80121. p.domain = DomainAMDSpecific
  80122. p.add(0, func(m *_Encoding, v []interface{}) {
  80123. m.vex3(0x8f, 0b1000, 0x00, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  80124. m.emit(0xa3)
  80125. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  80126. m.emit(hlcode(v[0]) << 4)
  80127. })
  80128. }
  80129. if p.len == 0 {
  80130. panic("invalid operands for VPPERM")
  80131. }
  80132. return p
  80133. }
  80134. // VPROLD performs "Rotate Packed Doubleword Left".
  80135. //
  80136. // Mnemonic : VPROLD
  80137. // Supported forms : (6 forms)
  80138. //
  80139. // * VPROLD imm8, m512/m32bcst, zmm{k}{z} [AVX512F]
  80140. // * VPROLD imm8, zmm, zmm{k}{z} [AVX512F]
  80141. // * VPROLD imm8, m128/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  80142. // * VPROLD imm8, m256/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  80143. // * VPROLD imm8, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  80144. // * VPROLD imm8, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  80145. //
  80146. func (self *Program) VPROLD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  80147. p := self.alloc("VPROLD", 3, Operands { v0, v1, v2 })
  80148. // VPROLD imm8, m512/m32bcst, zmm{k}{z}
  80149. if isImm8(v0) && isM512M32bcst(v1) && isZMMkz(v2) {
  80150. self.require(ISA_AVX512F)
  80151. p.domain = DomainAVX
  80152. p.add(0, func(m *_Encoding, v []interface{}) {
  80153. m.evex(0b01, 0x05, 0b10, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  80154. m.emit(0x72)
  80155. m.mrsd(1, addr(v[1]), 64)
  80156. m.imm1(toImmAny(v[0]))
  80157. })
  80158. }
  80159. // VPROLD imm8, zmm, zmm{k}{z}
  80160. if isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  80161. self.require(ISA_AVX512F)
  80162. p.domain = DomainAVX
  80163. p.add(0, func(m *_Encoding, v []interface{}) {
  80164. m.emit(0x62)
  80165. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  80166. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  80167. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x40)
  80168. m.emit(0x72)
  80169. m.emit(0xc8 | lcode(v[1]))
  80170. m.imm1(toImmAny(v[0]))
  80171. })
  80172. }
  80173. // VPROLD imm8, m128/m32bcst, xmm{k}{z}
  80174. if isImm8(v0) && isM128M32bcst(v1) && isXMMkz(v2) {
  80175. self.require(ISA_AVX512VL | ISA_AVX512F)
  80176. p.domain = DomainAVX
  80177. p.add(0, func(m *_Encoding, v []interface{}) {
  80178. m.evex(0b01, 0x05, 0b00, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  80179. m.emit(0x72)
  80180. m.mrsd(1, addr(v[1]), 16)
  80181. m.imm1(toImmAny(v[0]))
  80182. })
  80183. }
  80184. // VPROLD imm8, m256/m32bcst, ymm{k}{z}
  80185. if isImm8(v0) && isM256M32bcst(v1) && isYMMkz(v2) {
  80186. self.require(ISA_AVX512VL | ISA_AVX512F)
  80187. p.domain = DomainAVX
  80188. p.add(0, func(m *_Encoding, v []interface{}) {
  80189. m.evex(0b01, 0x05, 0b01, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  80190. m.emit(0x72)
  80191. m.mrsd(1, addr(v[1]), 32)
  80192. m.imm1(toImmAny(v[0]))
  80193. })
  80194. }
  80195. // VPROLD imm8, xmm, xmm{k}{z}
  80196. if isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  80197. self.require(ISA_AVX512VL | ISA_AVX512F)
  80198. p.domain = DomainAVX
  80199. p.add(0, func(m *_Encoding, v []interface{}) {
  80200. m.emit(0x62)
  80201. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  80202. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  80203. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x00)
  80204. m.emit(0x72)
  80205. m.emit(0xc8 | lcode(v[1]))
  80206. m.imm1(toImmAny(v[0]))
  80207. })
  80208. }
  80209. // VPROLD imm8, ymm, ymm{k}{z}
  80210. if isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  80211. self.require(ISA_AVX512VL | ISA_AVX512F)
  80212. p.domain = DomainAVX
  80213. p.add(0, func(m *_Encoding, v []interface{}) {
  80214. m.emit(0x62)
  80215. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  80216. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  80217. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x20)
  80218. m.emit(0x72)
  80219. m.emit(0xc8 | lcode(v[1]))
  80220. m.imm1(toImmAny(v[0]))
  80221. })
  80222. }
  80223. if p.len == 0 {
  80224. panic("invalid operands for VPROLD")
  80225. }
  80226. return p
  80227. }
  80228. // VPROLQ performs "Rotate Packed Quadword Left".
  80229. //
  80230. // Mnemonic : VPROLQ
  80231. // Supported forms : (6 forms)
  80232. //
  80233. // * VPROLQ imm8, m512/m64bcst, zmm{k}{z} [AVX512F]
  80234. // * VPROLQ imm8, zmm, zmm{k}{z} [AVX512F]
  80235. // * VPROLQ imm8, m128/m64bcst, xmm{k}{z} [AVX512F,AVX512VL]
  80236. // * VPROLQ imm8, m256/m64bcst, ymm{k}{z} [AVX512F,AVX512VL]
  80237. // * VPROLQ imm8, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  80238. // * VPROLQ imm8, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  80239. //
  80240. func (self *Program) VPROLQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  80241. p := self.alloc("VPROLQ", 3, Operands { v0, v1, v2 })
  80242. // VPROLQ imm8, m512/m64bcst, zmm{k}{z}
  80243. if isImm8(v0) && isM512M64bcst(v1) && isZMMkz(v2) {
  80244. self.require(ISA_AVX512F)
  80245. p.domain = DomainAVX
  80246. p.add(0, func(m *_Encoding, v []interface{}) {
  80247. m.evex(0b01, 0x85, 0b10, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  80248. m.emit(0x72)
  80249. m.mrsd(1, addr(v[1]), 64)
  80250. m.imm1(toImmAny(v[0]))
  80251. })
  80252. }
  80253. // VPROLQ imm8, zmm, zmm{k}{z}
  80254. if isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  80255. self.require(ISA_AVX512F)
  80256. p.domain = DomainAVX
  80257. p.add(0, func(m *_Encoding, v []interface{}) {
  80258. m.emit(0x62)
  80259. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  80260. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  80261. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x40)
  80262. m.emit(0x72)
  80263. m.emit(0xc8 | lcode(v[1]))
  80264. m.imm1(toImmAny(v[0]))
  80265. })
  80266. }
  80267. // VPROLQ imm8, m128/m64bcst, xmm{k}{z}
  80268. if isImm8(v0) && isM128M64bcst(v1) && isXMMkz(v2) {
  80269. self.require(ISA_AVX512VL | ISA_AVX512F)
  80270. p.domain = DomainAVX
  80271. p.add(0, func(m *_Encoding, v []interface{}) {
  80272. m.evex(0b01, 0x85, 0b00, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  80273. m.emit(0x72)
  80274. m.mrsd(1, addr(v[1]), 16)
  80275. m.imm1(toImmAny(v[0]))
  80276. })
  80277. }
  80278. // VPROLQ imm8, m256/m64bcst, ymm{k}{z}
  80279. if isImm8(v0) && isM256M64bcst(v1) && isYMMkz(v2) {
  80280. self.require(ISA_AVX512VL | ISA_AVX512F)
  80281. p.domain = DomainAVX
  80282. p.add(0, func(m *_Encoding, v []interface{}) {
  80283. m.evex(0b01, 0x85, 0b01, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  80284. m.emit(0x72)
  80285. m.mrsd(1, addr(v[1]), 32)
  80286. m.imm1(toImmAny(v[0]))
  80287. })
  80288. }
  80289. // VPROLQ imm8, xmm, xmm{k}{z}
  80290. if isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  80291. self.require(ISA_AVX512VL | ISA_AVX512F)
  80292. p.domain = DomainAVX
  80293. p.add(0, func(m *_Encoding, v []interface{}) {
  80294. m.emit(0x62)
  80295. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  80296. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  80297. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x00)
  80298. m.emit(0x72)
  80299. m.emit(0xc8 | lcode(v[1]))
  80300. m.imm1(toImmAny(v[0]))
  80301. })
  80302. }
  80303. // VPROLQ imm8, ymm, ymm{k}{z}
  80304. if isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  80305. self.require(ISA_AVX512VL | ISA_AVX512F)
  80306. p.domain = DomainAVX
  80307. p.add(0, func(m *_Encoding, v []interface{}) {
  80308. m.emit(0x62)
  80309. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  80310. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  80311. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x20)
  80312. m.emit(0x72)
  80313. m.emit(0xc8 | lcode(v[1]))
  80314. m.imm1(toImmAny(v[0]))
  80315. })
  80316. }
  80317. if p.len == 0 {
  80318. panic("invalid operands for VPROLQ")
  80319. }
  80320. return p
  80321. }
  80322. // VPROLVD performs "Variable Rotate Packed Doubleword Left".
  80323. //
  80324. // Mnemonic : VPROLVD
  80325. // Supported forms : (6 forms)
  80326. //
  80327. // * VPROLVD m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  80328. // * VPROLVD zmm, zmm, zmm{k}{z} [AVX512F]
  80329. // * VPROLVD m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  80330. // * VPROLVD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  80331. // * VPROLVD m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  80332. // * VPROLVD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  80333. //
  80334. func (self *Program) VPROLVD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  80335. p := self.alloc("VPROLVD", 3, Operands { v0, v1, v2 })
  80336. // VPROLVD m512/m32bcst, zmm, zmm{k}{z}
  80337. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  80338. self.require(ISA_AVX512F)
  80339. p.domain = DomainAVX
  80340. p.add(0, func(m *_Encoding, v []interface{}) {
  80341. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  80342. m.emit(0x15)
  80343. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  80344. })
  80345. }
  80346. // VPROLVD zmm, zmm, zmm{k}{z}
  80347. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  80348. self.require(ISA_AVX512F)
  80349. p.domain = DomainAVX
  80350. p.add(0, func(m *_Encoding, v []interface{}) {
  80351. m.emit(0x62)
  80352. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  80353. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  80354. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  80355. m.emit(0x15)
  80356. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  80357. })
  80358. }
  80359. // VPROLVD m128/m32bcst, xmm, xmm{k}{z}
  80360. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  80361. self.require(ISA_AVX512VL | ISA_AVX512F)
  80362. p.domain = DomainAVX
  80363. p.add(0, func(m *_Encoding, v []interface{}) {
  80364. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  80365. m.emit(0x15)
  80366. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  80367. })
  80368. }
  80369. // VPROLVD xmm, xmm, xmm{k}{z}
  80370. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  80371. self.require(ISA_AVX512VL | ISA_AVX512F)
  80372. p.domain = DomainAVX
  80373. p.add(0, func(m *_Encoding, v []interface{}) {
  80374. m.emit(0x62)
  80375. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  80376. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  80377. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  80378. m.emit(0x15)
  80379. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  80380. })
  80381. }
  80382. // VPROLVD m256/m32bcst, ymm, ymm{k}{z}
  80383. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  80384. self.require(ISA_AVX512VL | ISA_AVX512F)
  80385. p.domain = DomainAVX
  80386. p.add(0, func(m *_Encoding, v []interface{}) {
  80387. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  80388. m.emit(0x15)
  80389. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  80390. })
  80391. }
  80392. // VPROLVD ymm, ymm, ymm{k}{z}
  80393. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  80394. self.require(ISA_AVX512VL | ISA_AVX512F)
  80395. p.domain = DomainAVX
  80396. p.add(0, func(m *_Encoding, v []interface{}) {
  80397. m.emit(0x62)
  80398. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  80399. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  80400. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  80401. m.emit(0x15)
  80402. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  80403. })
  80404. }
  80405. if p.len == 0 {
  80406. panic("invalid operands for VPROLVD")
  80407. }
  80408. return p
  80409. }
  80410. // VPROLVQ performs "Variable Rotate Packed Quadword Left".
  80411. //
  80412. // Mnemonic : VPROLVQ
  80413. // Supported forms : (6 forms)
  80414. //
  80415. // * VPROLVQ m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  80416. // * VPROLVQ zmm, zmm, zmm{k}{z} [AVX512F]
  80417. // * VPROLVQ m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  80418. // * VPROLVQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  80419. // * VPROLVQ m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  80420. // * VPROLVQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  80421. //
  80422. func (self *Program) VPROLVQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  80423. p := self.alloc("VPROLVQ", 3, Operands { v0, v1, v2 })
  80424. // VPROLVQ m512/m64bcst, zmm, zmm{k}{z}
  80425. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  80426. self.require(ISA_AVX512F)
  80427. p.domain = DomainAVX
  80428. p.add(0, func(m *_Encoding, v []interface{}) {
  80429. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  80430. m.emit(0x15)
  80431. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  80432. })
  80433. }
  80434. // VPROLVQ zmm, zmm, zmm{k}{z}
  80435. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  80436. self.require(ISA_AVX512F)
  80437. p.domain = DomainAVX
  80438. p.add(0, func(m *_Encoding, v []interface{}) {
  80439. m.emit(0x62)
  80440. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  80441. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  80442. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  80443. m.emit(0x15)
  80444. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  80445. })
  80446. }
  80447. // VPROLVQ m128/m64bcst, xmm, xmm{k}{z}
  80448. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  80449. self.require(ISA_AVX512VL | ISA_AVX512F)
  80450. p.domain = DomainAVX
  80451. p.add(0, func(m *_Encoding, v []interface{}) {
  80452. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  80453. m.emit(0x15)
  80454. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  80455. })
  80456. }
  80457. // VPROLVQ xmm, xmm, xmm{k}{z}
  80458. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  80459. self.require(ISA_AVX512VL | ISA_AVX512F)
  80460. p.domain = DomainAVX
  80461. p.add(0, func(m *_Encoding, v []interface{}) {
  80462. m.emit(0x62)
  80463. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  80464. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  80465. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  80466. m.emit(0x15)
  80467. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  80468. })
  80469. }
  80470. // VPROLVQ m256/m64bcst, ymm, ymm{k}{z}
  80471. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  80472. self.require(ISA_AVX512VL | ISA_AVX512F)
  80473. p.domain = DomainAVX
  80474. p.add(0, func(m *_Encoding, v []interface{}) {
  80475. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  80476. m.emit(0x15)
  80477. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  80478. })
  80479. }
  80480. // VPROLVQ ymm, ymm, ymm{k}{z}
  80481. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  80482. self.require(ISA_AVX512VL | ISA_AVX512F)
  80483. p.domain = DomainAVX
  80484. p.add(0, func(m *_Encoding, v []interface{}) {
  80485. m.emit(0x62)
  80486. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  80487. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  80488. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  80489. m.emit(0x15)
  80490. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  80491. })
  80492. }
  80493. if p.len == 0 {
  80494. panic("invalid operands for VPROLVQ")
  80495. }
  80496. return p
  80497. }
  80498. // VPRORD performs "Rotate Packed Doubleword Right".
  80499. //
  80500. // Mnemonic : VPRORD
  80501. // Supported forms : (6 forms)
  80502. //
  80503. // * VPRORD imm8, m512/m32bcst, zmm{k}{z} [AVX512F]
  80504. // * VPRORD imm8, zmm, zmm{k}{z} [AVX512F]
  80505. // * VPRORD imm8, m128/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  80506. // * VPRORD imm8, m256/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  80507. // * VPRORD imm8, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  80508. // * VPRORD imm8, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  80509. //
  80510. func (self *Program) VPRORD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  80511. p := self.alloc("VPRORD", 3, Operands { v0, v1, v2 })
  80512. // VPRORD imm8, m512/m32bcst, zmm{k}{z}
  80513. if isImm8(v0) && isM512M32bcst(v1) && isZMMkz(v2) {
  80514. self.require(ISA_AVX512F)
  80515. p.domain = DomainAVX
  80516. p.add(0, func(m *_Encoding, v []interface{}) {
  80517. m.evex(0b01, 0x05, 0b10, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  80518. m.emit(0x72)
  80519. m.mrsd(0, addr(v[1]), 64)
  80520. m.imm1(toImmAny(v[0]))
  80521. })
  80522. }
  80523. // VPRORD imm8, zmm, zmm{k}{z}
  80524. if isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  80525. self.require(ISA_AVX512F)
  80526. p.domain = DomainAVX
  80527. p.add(0, func(m *_Encoding, v []interface{}) {
  80528. m.emit(0x62)
  80529. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  80530. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  80531. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x40)
  80532. m.emit(0x72)
  80533. m.emit(0xc0 | lcode(v[1]))
  80534. m.imm1(toImmAny(v[0]))
  80535. })
  80536. }
  80537. // VPRORD imm8, m128/m32bcst, xmm{k}{z}
  80538. if isImm8(v0) && isM128M32bcst(v1) && isXMMkz(v2) {
  80539. self.require(ISA_AVX512VL | ISA_AVX512F)
  80540. p.domain = DomainAVX
  80541. p.add(0, func(m *_Encoding, v []interface{}) {
  80542. m.evex(0b01, 0x05, 0b00, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  80543. m.emit(0x72)
  80544. m.mrsd(0, addr(v[1]), 16)
  80545. m.imm1(toImmAny(v[0]))
  80546. })
  80547. }
  80548. // VPRORD imm8, m256/m32bcst, ymm{k}{z}
  80549. if isImm8(v0) && isM256M32bcst(v1) && isYMMkz(v2) {
  80550. self.require(ISA_AVX512VL | ISA_AVX512F)
  80551. p.domain = DomainAVX
  80552. p.add(0, func(m *_Encoding, v []interface{}) {
  80553. m.evex(0b01, 0x05, 0b01, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  80554. m.emit(0x72)
  80555. m.mrsd(0, addr(v[1]), 32)
  80556. m.imm1(toImmAny(v[0]))
  80557. })
  80558. }
  80559. // VPRORD imm8, xmm, xmm{k}{z}
  80560. if isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  80561. self.require(ISA_AVX512VL | ISA_AVX512F)
  80562. p.domain = DomainAVX
  80563. p.add(0, func(m *_Encoding, v []interface{}) {
  80564. m.emit(0x62)
  80565. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  80566. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  80567. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x00)
  80568. m.emit(0x72)
  80569. m.emit(0xc0 | lcode(v[1]))
  80570. m.imm1(toImmAny(v[0]))
  80571. })
  80572. }
  80573. // VPRORD imm8, ymm, ymm{k}{z}
  80574. if isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  80575. self.require(ISA_AVX512VL | ISA_AVX512F)
  80576. p.domain = DomainAVX
  80577. p.add(0, func(m *_Encoding, v []interface{}) {
  80578. m.emit(0x62)
  80579. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  80580. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  80581. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x20)
  80582. m.emit(0x72)
  80583. m.emit(0xc0 | lcode(v[1]))
  80584. m.imm1(toImmAny(v[0]))
  80585. })
  80586. }
  80587. if p.len == 0 {
  80588. panic("invalid operands for VPRORD")
  80589. }
  80590. return p
  80591. }
  80592. // VPRORQ performs "Rotate Packed Quadword Right".
  80593. //
  80594. // Mnemonic : VPRORQ
  80595. // Supported forms : (6 forms)
  80596. //
  80597. // * VPRORQ imm8, m512/m64bcst, zmm{k}{z} [AVX512F]
  80598. // * VPRORQ imm8, zmm, zmm{k}{z} [AVX512F]
  80599. // * VPRORQ imm8, m128/m64bcst, xmm{k}{z} [AVX512F,AVX512VL]
  80600. // * VPRORQ imm8, m256/m64bcst, ymm{k}{z} [AVX512F,AVX512VL]
  80601. // * VPRORQ imm8, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  80602. // * VPRORQ imm8, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  80603. //
  80604. func (self *Program) VPRORQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  80605. p := self.alloc("VPRORQ", 3, Operands { v0, v1, v2 })
  80606. // VPRORQ imm8, m512/m64bcst, zmm{k}{z}
  80607. if isImm8(v0) && isM512M64bcst(v1) && isZMMkz(v2) {
  80608. self.require(ISA_AVX512F)
  80609. p.domain = DomainAVX
  80610. p.add(0, func(m *_Encoding, v []interface{}) {
  80611. m.evex(0b01, 0x85, 0b10, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  80612. m.emit(0x72)
  80613. m.mrsd(0, addr(v[1]), 64)
  80614. m.imm1(toImmAny(v[0]))
  80615. })
  80616. }
  80617. // VPRORQ imm8, zmm, zmm{k}{z}
  80618. if isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  80619. self.require(ISA_AVX512F)
  80620. p.domain = DomainAVX
  80621. p.add(0, func(m *_Encoding, v []interface{}) {
  80622. m.emit(0x62)
  80623. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  80624. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  80625. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x40)
  80626. m.emit(0x72)
  80627. m.emit(0xc0 | lcode(v[1]))
  80628. m.imm1(toImmAny(v[0]))
  80629. })
  80630. }
  80631. // VPRORQ imm8, m128/m64bcst, xmm{k}{z}
  80632. if isImm8(v0) && isM128M64bcst(v1) && isXMMkz(v2) {
  80633. self.require(ISA_AVX512VL | ISA_AVX512F)
  80634. p.domain = DomainAVX
  80635. p.add(0, func(m *_Encoding, v []interface{}) {
  80636. m.evex(0b01, 0x85, 0b00, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  80637. m.emit(0x72)
  80638. m.mrsd(0, addr(v[1]), 16)
  80639. m.imm1(toImmAny(v[0]))
  80640. })
  80641. }
  80642. // VPRORQ imm8, m256/m64bcst, ymm{k}{z}
  80643. if isImm8(v0) && isM256M64bcst(v1) && isYMMkz(v2) {
  80644. self.require(ISA_AVX512VL | ISA_AVX512F)
  80645. p.domain = DomainAVX
  80646. p.add(0, func(m *_Encoding, v []interface{}) {
  80647. m.evex(0b01, 0x85, 0b01, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  80648. m.emit(0x72)
  80649. m.mrsd(0, addr(v[1]), 32)
  80650. m.imm1(toImmAny(v[0]))
  80651. })
  80652. }
  80653. // VPRORQ imm8, xmm, xmm{k}{z}
  80654. if isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  80655. self.require(ISA_AVX512VL | ISA_AVX512F)
  80656. p.domain = DomainAVX
  80657. p.add(0, func(m *_Encoding, v []interface{}) {
  80658. m.emit(0x62)
  80659. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  80660. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  80661. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x00)
  80662. m.emit(0x72)
  80663. m.emit(0xc0 | lcode(v[1]))
  80664. m.imm1(toImmAny(v[0]))
  80665. })
  80666. }
  80667. // VPRORQ imm8, ymm, ymm{k}{z}
  80668. if isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  80669. self.require(ISA_AVX512VL | ISA_AVX512F)
  80670. p.domain = DomainAVX
  80671. p.add(0, func(m *_Encoding, v []interface{}) {
  80672. m.emit(0x62)
  80673. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  80674. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  80675. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x20)
  80676. m.emit(0x72)
  80677. m.emit(0xc0 | lcode(v[1]))
  80678. m.imm1(toImmAny(v[0]))
  80679. })
  80680. }
  80681. if p.len == 0 {
  80682. panic("invalid operands for VPRORQ")
  80683. }
  80684. return p
  80685. }
  80686. // VPRORVD performs "Variable Rotate Packed Doubleword Right".
  80687. //
  80688. // Mnemonic : VPRORVD
  80689. // Supported forms : (6 forms)
  80690. //
  80691. // * VPRORVD m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  80692. // * VPRORVD zmm, zmm, zmm{k}{z} [AVX512F]
  80693. // * VPRORVD m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  80694. // * VPRORVD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  80695. // * VPRORVD m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  80696. // * VPRORVD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  80697. //
  80698. func (self *Program) VPRORVD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  80699. p := self.alloc("VPRORVD", 3, Operands { v0, v1, v2 })
  80700. // VPRORVD m512/m32bcst, zmm, zmm{k}{z}
  80701. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  80702. self.require(ISA_AVX512F)
  80703. p.domain = DomainAVX
  80704. p.add(0, func(m *_Encoding, v []interface{}) {
  80705. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  80706. m.emit(0x14)
  80707. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  80708. })
  80709. }
  80710. // VPRORVD zmm, zmm, zmm{k}{z}
  80711. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  80712. self.require(ISA_AVX512F)
  80713. p.domain = DomainAVX
  80714. p.add(0, func(m *_Encoding, v []interface{}) {
  80715. m.emit(0x62)
  80716. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  80717. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  80718. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  80719. m.emit(0x14)
  80720. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  80721. })
  80722. }
  80723. // VPRORVD m128/m32bcst, xmm, xmm{k}{z}
  80724. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  80725. self.require(ISA_AVX512VL | ISA_AVX512F)
  80726. p.domain = DomainAVX
  80727. p.add(0, func(m *_Encoding, v []interface{}) {
  80728. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  80729. m.emit(0x14)
  80730. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  80731. })
  80732. }
  80733. // VPRORVD xmm, xmm, xmm{k}{z}
  80734. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  80735. self.require(ISA_AVX512VL | ISA_AVX512F)
  80736. p.domain = DomainAVX
  80737. p.add(0, func(m *_Encoding, v []interface{}) {
  80738. m.emit(0x62)
  80739. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  80740. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  80741. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  80742. m.emit(0x14)
  80743. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  80744. })
  80745. }
  80746. // VPRORVD m256/m32bcst, ymm, ymm{k}{z}
  80747. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  80748. self.require(ISA_AVX512VL | ISA_AVX512F)
  80749. p.domain = DomainAVX
  80750. p.add(0, func(m *_Encoding, v []interface{}) {
  80751. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  80752. m.emit(0x14)
  80753. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  80754. })
  80755. }
  80756. // VPRORVD ymm, ymm, ymm{k}{z}
  80757. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  80758. self.require(ISA_AVX512VL | ISA_AVX512F)
  80759. p.domain = DomainAVX
  80760. p.add(0, func(m *_Encoding, v []interface{}) {
  80761. m.emit(0x62)
  80762. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  80763. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  80764. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  80765. m.emit(0x14)
  80766. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  80767. })
  80768. }
  80769. if p.len == 0 {
  80770. panic("invalid operands for VPRORVD")
  80771. }
  80772. return p
  80773. }
  80774. // VPRORVQ performs "Variable Rotate Packed Quadword Right".
  80775. //
  80776. // Mnemonic : VPRORVQ
  80777. // Supported forms : (6 forms)
  80778. //
  80779. // * VPRORVQ m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  80780. // * VPRORVQ zmm, zmm, zmm{k}{z} [AVX512F]
  80781. // * VPRORVQ m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  80782. // * VPRORVQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  80783. // * VPRORVQ m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  80784. // * VPRORVQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  80785. //
  80786. func (self *Program) VPRORVQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  80787. p := self.alloc("VPRORVQ", 3, Operands { v0, v1, v2 })
  80788. // VPRORVQ m512/m64bcst, zmm, zmm{k}{z}
  80789. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  80790. self.require(ISA_AVX512F)
  80791. p.domain = DomainAVX
  80792. p.add(0, func(m *_Encoding, v []interface{}) {
  80793. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  80794. m.emit(0x14)
  80795. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  80796. })
  80797. }
  80798. // VPRORVQ zmm, zmm, zmm{k}{z}
  80799. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  80800. self.require(ISA_AVX512F)
  80801. p.domain = DomainAVX
  80802. p.add(0, func(m *_Encoding, v []interface{}) {
  80803. m.emit(0x62)
  80804. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  80805. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  80806. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  80807. m.emit(0x14)
  80808. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  80809. })
  80810. }
  80811. // VPRORVQ m128/m64bcst, xmm, xmm{k}{z}
  80812. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  80813. self.require(ISA_AVX512VL | ISA_AVX512F)
  80814. p.domain = DomainAVX
  80815. p.add(0, func(m *_Encoding, v []interface{}) {
  80816. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  80817. m.emit(0x14)
  80818. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  80819. })
  80820. }
  80821. // VPRORVQ xmm, xmm, xmm{k}{z}
  80822. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  80823. self.require(ISA_AVX512VL | ISA_AVX512F)
  80824. p.domain = DomainAVX
  80825. p.add(0, func(m *_Encoding, v []interface{}) {
  80826. m.emit(0x62)
  80827. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  80828. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  80829. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  80830. m.emit(0x14)
  80831. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  80832. })
  80833. }
  80834. // VPRORVQ m256/m64bcst, ymm, ymm{k}{z}
  80835. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  80836. self.require(ISA_AVX512VL | ISA_AVX512F)
  80837. p.domain = DomainAVX
  80838. p.add(0, func(m *_Encoding, v []interface{}) {
  80839. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  80840. m.emit(0x14)
  80841. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  80842. })
  80843. }
  80844. // VPRORVQ ymm, ymm, ymm{k}{z}
  80845. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  80846. self.require(ISA_AVX512VL | ISA_AVX512F)
  80847. p.domain = DomainAVX
  80848. p.add(0, func(m *_Encoding, v []interface{}) {
  80849. m.emit(0x62)
  80850. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  80851. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  80852. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  80853. m.emit(0x14)
  80854. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  80855. })
  80856. }
  80857. if p.len == 0 {
  80858. panic("invalid operands for VPRORVQ")
  80859. }
  80860. return p
  80861. }
  80862. // VPROTB performs "Packed Rotate Bytes".
  80863. //
  80864. // Mnemonic : VPROTB
  80865. // Supported forms : (5 forms)
  80866. //
  80867. // * VPROTB imm8, xmm, xmm [XOP]
  80868. // * VPROTB xmm, xmm, xmm [XOP]
  80869. // * VPROTB m128, xmm, xmm [XOP]
  80870. // * VPROTB imm8, m128, xmm [XOP]
  80871. // * VPROTB xmm, m128, xmm [XOP]
  80872. //
  80873. func (self *Program) VPROTB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  80874. p := self.alloc("VPROTB", 3, Operands { v0, v1, v2 })
  80875. // VPROTB imm8, xmm, xmm
  80876. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  80877. self.require(ISA_XOP)
  80878. p.domain = DomainAMDSpecific
  80879. p.add(0, func(m *_Encoding, v []interface{}) {
  80880. m.emit(0x8f)
  80881. m.emit(0xe8 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  80882. m.emit(0x78)
  80883. m.emit(0xc0)
  80884. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  80885. m.imm1(toImmAny(v[0]))
  80886. })
  80887. }
  80888. // VPROTB xmm, xmm, xmm
  80889. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  80890. self.require(ISA_XOP)
  80891. p.domain = DomainAMDSpecific
  80892. p.add(0, func(m *_Encoding, v []interface{}) {
  80893. m.emit(0x8f)
  80894. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  80895. m.emit(0x78 ^ (hlcode(v[0]) << 3))
  80896. m.emit(0x90)
  80897. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  80898. })
  80899. p.add(0, func(m *_Encoding, v []interface{}) {
  80900. m.emit(0x8f)
  80901. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  80902. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  80903. m.emit(0x90)
  80904. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  80905. })
  80906. }
  80907. // VPROTB m128, xmm, xmm
  80908. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  80909. self.require(ISA_XOP)
  80910. p.domain = DomainAMDSpecific
  80911. p.add(0, func(m *_Encoding, v []interface{}) {
  80912. m.vex3(0x8f, 0b1001, 0x80, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  80913. m.emit(0x90)
  80914. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  80915. })
  80916. }
  80917. // VPROTB imm8, m128, xmm
  80918. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  80919. self.require(ISA_XOP)
  80920. p.domain = DomainAMDSpecific
  80921. p.add(0, func(m *_Encoding, v []interface{}) {
  80922. m.vex3(0x8f, 0b1000, 0x00, hcode(v[2]), addr(v[1]), 0)
  80923. m.emit(0xc0)
  80924. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  80925. m.imm1(toImmAny(v[0]))
  80926. })
  80927. }
  80928. // VPROTB xmm, m128, xmm
  80929. if isXMM(v0) && isM128(v1) && isXMM(v2) {
  80930. self.require(ISA_XOP)
  80931. p.domain = DomainAMDSpecific
  80932. p.add(0, func(m *_Encoding, v []interface{}) {
  80933. m.vex3(0x8f, 0b1001, 0x00, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  80934. m.emit(0x90)
  80935. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  80936. })
  80937. }
  80938. if p.len == 0 {
  80939. panic("invalid operands for VPROTB")
  80940. }
  80941. return p
  80942. }
  80943. // VPROTD performs "Packed Rotate Doublewords".
  80944. //
  80945. // Mnemonic : VPROTD
  80946. // Supported forms : (5 forms)
  80947. //
  80948. // * VPROTD imm8, xmm, xmm [XOP]
  80949. // * VPROTD xmm, xmm, xmm [XOP]
  80950. // * VPROTD m128, xmm, xmm [XOP]
  80951. // * VPROTD imm8, m128, xmm [XOP]
  80952. // * VPROTD xmm, m128, xmm [XOP]
  80953. //
  80954. func (self *Program) VPROTD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  80955. p := self.alloc("VPROTD", 3, Operands { v0, v1, v2 })
  80956. // VPROTD imm8, xmm, xmm
  80957. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  80958. self.require(ISA_XOP)
  80959. p.domain = DomainAMDSpecific
  80960. p.add(0, func(m *_Encoding, v []interface{}) {
  80961. m.emit(0x8f)
  80962. m.emit(0xe8 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  80963. m.emit(0x78)
  80964. m.emit(0xc2)
  80965. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  80966. m.imm1(toImmAny(v[0]))
  80967. })
  80968. }
  80969. // VPROTD xmm, xmm, xmm
  80970. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  80971. self.require(ISA_XOP)
  80972. p.domain = DomainAMDSpecific
  80973. p.add(0, func(m *_Encoding, v []interface{}) {
  80974. m.emit(0x8f)
  80975. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  80976. m.emit(0x78 ^ (hlcode(v[0]) << 3))
  80977. m.emit(0x92)
  80978. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  80979. })
  80980. p.add(0, func(m *_Encoding, v []interface{}) {
  80981. m.emit(0x8f)
  80982. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  80983. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  80984. m.emit(0x92)
  80985. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  80986. })
  80987. }
  80988. // VPROTD m128, xmm, xmm
  80989. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  80990. self.require(ISA_XOP)
  80991. p.domain = DomainAMDSpecific
  80992. p.add(0, func(m *_Encoding, v []interface{}) {
  80993. m.vex3(0x8f, 0b1001, 0x80, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  80994. m.emit(0x92)
  80995. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  80996. })
  80997. }
  80998. // VPROTD imm8, m128, xmm
  80999. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  81000. self.require(ISA_XOP)
  81001. p.domain = DomainAMDSpecific
  81002. p.add(0, func(m *_Encoding, v []interface{}) {
  81003. m.vex3(0x8f, 0b1000, 0x00, hcode(v[2]), addr(v[1]), 0)
  81004. m.emit(0xc2)
  81005. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  81006. m.imm1(toImmAny(v[0]))
  81007. })
  81008. }
  81009. // VPROTD xmm, m128, xmm
  81010. if isXMM(v0) && isM128(v1) && isXMM(v2) {
  81011. self.require(ISA_XOP)
  81012. p.domain = DomainAMDSpecific
  81013. p.add(0, func(m *_Encoding, v []interface{}) {
  81014. m.vex3(0x8f, 0b1001, 0x00, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  81015. m.emit(0x92)
  81016. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  81017. })
  81018. }
  81019. if p.len == 0 {
  81020. panic("invalid operands for VPROTD")
  81021. }
  81022. return p
  81023. }
  81024. // VPROTQ performs "Packed Rotate Quadwords".
  81025. //
  81026. // Mnemonic : VPROTQ
  81027. // Supported forms : (5 forms)
  81028. //
  81029. // * VPROTQ imm8, xmm, xmm [XOP]
  81030. // * VPROTQ xmm, xmm, xmm [XOP]
  81031. // * VPROTQ m128, xmm, xmm [XOP]
  81032. // * VPROTQ imm8, m128, xmm [XOP]
  81033. // * VPROTQ xmm, m128, xmm [XOP]
  81034. //
  81035. func (self *Program) VPROTQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  81036. p := self.alloc("VPROTQ", 3, Operands { v0, v1, v2 })
  81037. // VPROTQ imm8, xmm, xmm
  81038. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  81039. self.require(ISA_XOP)
  81040. p.domain = DomainAMDSpecific
  81041. p.add(0, func(m *_Encoding, v []interface{}) {
  81042. m.emit(0x8f)
  81043. m.emit(0xe8 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  81044. m.emit(0x78)
  81045. m.emit(0xc3)
  81046. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  81047. m.imm1(toImmAny(v[0]))
  81048. })
  81049. }
  81050. // VPROTQ xmm, xmm, xmm
  81051. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  81052. self.require(ISA_XOP)
  81053. p.domain = DomainAMDSpecific
  81054. p.add(0, func(m *_Encoding, v []interface{}) {
  81055. m.emit(0x8f)
  81056. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  81057. m.emit(0x78 ^ (hlcode(v[0]) << 3))
  81058. m.emit(0x93)
  81059. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  81060. })
  81061. p.add(0, func(m *_Encoding, v []interface{}) {
  81062. m.emit(0x8f)
  81063. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  81064. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  81065. m.emit(0x93)
  81066. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  81067. })
  81068. }
  81069. // VPROTQ m128, xmm, xmm
  81070. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  81071. self.require(ISA_XOP)
  81072. p.domain = DomainAMDSpecific
  81073. p.add(0, func(m *_Encoding, v []interface{}) {
  81074. m.vex3(0x8f, 0b1001, 0x80, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  81075. m.emit(0x93)
  81076. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  81077. })
  81078. }
  81079. // VPROTQ imm8, m128, xmm
  81080. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  81081. self.require(ISA_XOP)
  81082. p.domain = DomainAMDSpecific
  81083. p.add(0, func(m *_Encoding, v []interface{}) {
  81084. m.vex3(0x8f, 0b1000, 0x00, hcode(v[2]), addr(v[1]), 0)
  81085. m.emit(0xc3)
  81086. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  81087. m.imm1(toImmAny(v[0]))
  81088. })
  81089. }
  81090. // VPROTQ xmm, m128, xmm
  81091. if isXMM(v0) && isM128(v1) && isXMM(v2) {
  81092. self.require(ISA_XOP)
  81093. p.domain = DomainAMDSpecific
  81094. p.add(0, func(m *_Encoding, v []interface{}) {
  81095. m.vex3(0x8f, 0b1001, 0x00, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  81096. m.emit(0x93)
  81097. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  81098. })
  81099. }
  81100. if p.len == 0 {
  81101. panic("invalid operands for VPROTQ")
  81102. }
  81103. return p
  81104. }
  81105. // VPROTW performs "Packed Rotate Words".
  81106. //
  81107. // Mnemonic : VPROTW
  81108. // Supported forms : (5 forms)
  81109. //
  81110. // * VPROTW imm8, xmm, xmm [XOP]
  81111. // * VPROTW xmm, xmm, xmm [XOP]
  81112. // * VPROTW m128, xmm, xmm [XOP]
  81113. // * VPROTW imm8, m128, xmm [XOP]
  81114. // * VPROTW xmm, m128, xmm [XOP]
  81115. //
  81116. func (self *Program) VPROTW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  81117. p := self.alloc("VPROTW", 3, Operands { v0, v1, v2 })
  81118. // VPROTW imm8, xmm, xmm
  81119. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  81120. self.require(ISA_XOP)
  81121. p.domain = DomainAMDSpecific
  81122. p.add(0, func(m *_Encoding, v []interface{}) {
  81123. m.emit(0x8f)
  81124. m.emit(0xe8 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  81125. m.emit(0x78)
  81126. m.emit(0xc1)
  81127. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  81128. m.imm1(toImmAny(v[0]))
  81129. })
  81130. }
  81131. // VPROTW xmm, xmm, xmm
  81132. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  81133. self.require(ISA_XOP)
  81134. p.domain = DomainAMDSpecific
  81135. p.add(0, func(m *_Encoding, v []interface{}) {
  81136. m.emit(0x8f)
  81137. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  81138. m.emit(0x78 ^ (hlcode(v[0]) << 3))
  81139. m.emit(0x91)
  81140. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  81141. })
  81142. p.add(0, func(m *_Encoding, v []interface{}) {
  81143. m.emit(0x8f)
  81144. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  81145. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  81146. m.emit(0x91)
  81147. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  81148. })
  81149. }
  81150. // VPROTW m128, xmm, xmm
  81151. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  81152. self.require(ISA_XOP)
  81153. p.domain = DomainAMDSpecific
  81154. p.add(0, func(m *_Encoding, v []interface{}) {
  81155. m.vex3(0x8f, 0b1001, 0x80, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  81156. m.emit(0x91)
  81157. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  81158. })
  81159. }
  81160. // VPROTW imm8, m128, xmm
  81161. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  81162. self.require(ISA_XOP)
  81163. p.domain = DomainAMDSpecific
  81164. p.add(0, func(m *_Encoding, v []interface{}) {
  81165. m.vex3(0x8f, 0b1000, 0x00, hcode(v[2]), addr(v[1]), 0)
  81166. m.emit(0xc1)
  81167. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  81168. m.imm1(toImmAny(v[0]))
  81169. })
  81170. }
  81171. // VPROTW xmm, m128, xmm
  81172. if isXMM(v0) && isM128(v1) && isXMM(v2) {
  81173. self.require(ISA_XOP)
  81174. p.domain = DomainAMDSpecific
  81175. p.add(0, func(m *_Encoding, v []interface{}) {
  81176. m.vex3(0x8f, 0b1001, 0x00, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  81177. m.emit(0x91)
  81178. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  81179. })
  81180. }
  81181. if p.len == 0 {
  81182. panic("invalid operands for VPROTW")
  81183. }
  81184. return p
  81185. }
  81186. // VPSADBW performs "Compute Sum of Absolute Differences".
  81187. //
  81188. // Mnemonic : VPSADBW
  81189. // Supported forms : (10 forms)
  81190. //
  81191. // * VPSADBW xmm, xmm, xmm [AVX]
  81192. // * VPSADBW m128, xmm, xmm [AVX]
  81193. // * VPSADBW ymm, ymm, ymm [AVX2]
  81194. // * VPSADBW m256, ymm, ymm [AVX2]
  81195. // * VPSADBW zmm, zmm, zmm [AVX512BW]
  81196. // * VPSADBW m512, zmm, zmm [AVX512BW]
  81197. // * VPSADBW xmm, xmm, xmm [AVX512BW,AVX512VL]
  81198. // * VPSADBW m128, xmm, xmm [AVX512BW,AVX512VL]
  81199. // * VPSADBW ymm, ymm, ymm [AVX512BW,AVX512VL]
  81200. // * VPSADBW m256, ymm, ymm [AVX512BW,AVX512VL]
  81201. //
  81202. func (self *Program) VPSADBW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  81203. p := self.alloc("VPSADBW", 3, Operands { v0, v1, v2 })
  81204. // VPSADBW xmm, xmm, xmm
  81205. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  81206. self.require(ISA_AVX)
  81207. p.domain = DomainAVX
  81208. p.add(0, func(m *_Encoding, v []interface{}) {
  81209. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  81210. m.emit(0xf6)
  81211. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  81212. })
  81213. }
  81214. // VPSADBW m128, xmm, xmm
  81215. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  81216. self.require(ISA_AVX)
  81217. p.domain = DomainAVX
  81218. p.add(0, func(m *_Encoding, v []interface{}) {
  81219. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  81220. m.emit(0xf6)
  81221. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  81222. })
  81223. }
  81224. // VPSADBW ymm, ymm, ymm
  81225. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  81226. self.require(ISA_AVX2)
  81227. p.domain = DomainAVX
  81228. p.add(0, func(m *_Encoding, v []interface{}) {
  81229. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  81230. m.emit(0xf6)
  81231. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  81232. })
  81233. }
  81234. // VPSADBW m256, ymm, ymm
  81235. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  81236. self.require(ISA_AVX2)
  81237. p.domain = DomainAVX
  81238. p.add(0, func(m *_Encoding, v []interface{}) {
  81239. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  81240. m.emit(0xf6)
  81241. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  81242. })
  81243. }
  81244. // VPSADBW zmm, zmm, zmm
  81245. if isZMM(v0) && isZMM(v1) && isZMM(v2) {
  81246. self.require(ISA_AVX512BW)
  81247. p.domain = DomainAVX
  81248. p.add(0, func(m *_Encoding, v []interface{}) {
  81249. m.emit(0x62)
  81250. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  81251. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  81252. m.emit((0x08 ^ (ecode(v[1]) << 3)) | 0x40)
  81253. m.emit(0xf6)
  81254. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  81255. })
  81256. }
  81257. // VPSADBW m512, zmm, zmm
  81258. if isM512(v0) && isZMM(v1) && isZMM(v2) {
  81259. self.require(ISA_AVX512BW)
  81260. p.domain = DomainAVX
  81261. p.add(0, func(m *_Encoding, v []interface{}) {
  81262. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), 0, 0, 0)
  81263. m.emit(0xf6)
  81264. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  81265. })
  81266. }
  81267. // VPSADBW xmm, xmm, xmm
  81268. if isEVEXXMM(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) {
  81269. self.require(ISA_AVX512VL | ISA_AVX512BW)
  81270. p.domain = DomainAVX
  81271. p.add(0, func(m *_Encoding, v []interface{}) {
  81272. m.emit(0x62)
  81273. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  81274. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  81275. m.emit((0x08 ^ (ecode(v[1]) << 3)) | 0x00)
  81276. m.emit(0xf6)
  81277. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  81278. })
  81279. }
  81280. // VPSADBW m128, xmm, xmm
  81281. if isM128(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) {
  81282. self.require(ISA_AVX512VL | ISA_AVX512BW)
  81283. p.domain = DomainAVX
  81284. p.add(0, func(m *_Encoding, v []interface{}) {
  81285. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), 0, 0, 0)
  81286. m.emit(0xf6)
  81287. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  81288. })
  81289. }
  81290. // VPSADBW ymm, ymm, ymm
  81291. if isEVEXYMM(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) {
  81292. self.require(ISA_AVX512VL | ISA_AVX512BW)
  81293. p.domain = DomainAVX
  81294. p.add(0, func(m *_Encoding, v []interface{}) {
  81295. m.emit(0x62)
  81296. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  81297. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  81298. m.emit((0x08 ^ (ecode(v[1]) << 3)) | 0x20)
  81299. m.emit(0xf6)
  81300. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  81301. })
  81302. }
  81303. // VPSADBW m256, ymm, ymm
  81304. if isM256(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) {
  81305. self.require(ISA_AVX512VL | ISA_AVX512BW)
  81306. p.domain = DomainAVX
  81307. p.add(0, func(m *_Encoding, v []interface{}) {
  81308. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), 0, 0, 0)
  81309. m.emit(0xf6)
  81310. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  81311. })
  81312. }
  81313. if p.len == 0 {
  81314. panic("invalid operands for VPSADBW")
  81315. }
  81316. return p
  81317. }
  81318. // VPSCATTERDD performs "Scatter Packed Doubleword Values with Signed Doubleword Indices".
  81319. //
  81320. // Mnemonic : VPSCATTERDD
  81321. // Supported forms : (3 forms)
  81322. //
  81323. // * VPSCATTERDD zmm, vm32z{k} [AVX512F]
  81324. // * VPSCATTERDD xmm, vm32x{k} [AVX512F,AVX512VL]
  81325. // * VPSCATTERDD ymm, vm32y{k} [AVX512F,AVX512VL]
  81326. //
  81327. func (self *Program) VPSCATTERDD(v0 interface{}, v1 interface{}) *Instruction {
  81328. p := self.alloc("VPSCATTERDD", 2, Operands { v0, v1 })
  81329. // VPSCATTERDD zmm, vm32z{k}
  81330. if isZMM(v0) && isVMZk(v1) {
  81331. self.require(ISA_AVX512F)
  81332. p.domain = DomainAVX
  81333. p.add(0, func(m *_Encoding, v []interface{}) {
  81334. m.evex(0b10, 0x05, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  81335. m.emit(0xa0)
  81336. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  81337. })
  81338. }
  81339. // VPSCATTERDD xmm, vm32x{k}
  81340. if isEVEXXMM(v0) && isVMXk(v1) {
  81341. self.require(ISA_AVX512VL | ISA_AVX512F)
  81342. p.domain = DomainAVX
  81343. p.add(0, func(m *_Encoding, v []interface{}) {
  81344. m.evex(0b10, 0x05, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  81345. m.emit(0xa0)
  81346. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  81347. })
  81348. }
  81349. // VPSCATTERDD ymm, vm32y{k}
  81350. if isEVEXYMM(v0) && isVMYk(v1) {
  81351. self.require(ISA_AVX512VL | ISA_AVX512F)
  81352. p.domain = DomainAVX
  81353. p.add(0, func(m *_Encoding, v []interface{}) {
  81354. m.evex(0b10, 0x05, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  81355. m.emit(0xa0)
  81356. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  81357. })
  81358. }
  81359. if p.len == 0 {
  81360. panic("invalid operands for VPSCATTERDD")
  81361. }
  81362. return p
  81363. }
  81364. // VPSCATTERDQ performs "Scatter Packed Quadword Values with Signed Doubleword Indices".
  81365. //
  81366. // Mnemonic : VPSCATTERDQ
  81367. // Supported forms : (3 forms)
  81368. //
  81369. // * VPSCATTERDQ zmm, vm32y{k} [AVX512F]
  81370. // * VPSCATTERDQ xmm, vm32x{k} [AVX512F,AVX512VL]
  81371. // * VPSCATTERDQ ymm, vm32x{k} [AVX512F,AVX512VL]
  81372. //
  81373. func (self *Program) VPSCATTERDQ(v0 interface{}, v1 interface{}) *Instruction {
  81374. p := self.alloc("VPSCATTERDQ", 2, Operands { v0, v1 })
  81375. // VPSCATTERDQ zmm, vm32y{k}
  81376. if isZMM(v0) && isVMYk(v1) {
  81377. self.require(ISA_AVX512F)
  81378. p.domain = DomainAVX
  81379. p.add(0, func(m *_Encoding, v []interface{}) {
  81380. m.evex(0b10, 0x85, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  81381. m.emit(0xa0)
  81382. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  81383. })
  81384. }
  81385. // VPSCATTERDQ xmm, vm32x{k}
  81386. if isEVEXXMM(v0) && isVMXk(v1) {
  81387. self.require(ISA_AVX512VL | ISA_AVX512F)
  81388. p.domain = DomainAVX
  81389. p.add(0, func(m *_Encoding, v []interface{}) {
  81390. m.evex(0b10, 0x85, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  81391. m.emit(0xa0)
  81392. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  81393. })
  81394. }
  81395. // VPSCATTERDQ ymm, vm32x{k}
  81396. if isEVEXYMM(v0) && isVMXk(v1) {
  81397. self.require(ISA_AVX512VL | ISA_AVX512F)
  81398. p.domain = DomainAVX
  81399. p.add(0, func(m *_Encoding, v []interface{}) {
  81400. m.evex(0b10, 0x85, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  81401. m.emit(0xa0)
  81402. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  81403. })
  81404. }
  81405. if p.len == 0 {
  81406. panic("invalid operands for VPSCATTERDQ")
  81407. }
  81408. return p
  81409. }
  81410. // VPSCATTERQD performs "Scatter Packed Doubleword Values with Signed Quadword Indices".
  81411. //
  81412. // Mnemonic : VPSCATTERQD
  81413. // Supported forms : (3 forms)
  81414. //
  81415. // * VPSCATTERQD ymm, vm64z{k} [AVX512F]
  81416. // * VPSCATTERQD xmm, vm64x{k} [AVX512F,AVX512VL]
  81417. // * VPSCATTERQD xmm, vm64y{k} [AVX512F,AVX512VL]
  81418. //
  81419. func (self *Program) VPSCATTERQD(v0 interface{}, v1 interface{}) *Instruction {
  81420. p := self.alloc("VPSCATTERQD", 2, Operands { v0, v1 })
  81421. // VPSCATTERQD ymm, vm64z{k}
  81422. if isEVEXYMM(v0) && isVMZk(v1) {
  81423. self.require(ISA_AVX512F)
  81424. p.domain = DomainAVX
  81425. p.add(0, func(m *_Encoding, v []interface{}) {
  81426. m.evex(0b10, 0x05, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  81427. m.emit(0xa1)
  81428. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  81429. })
  81430. }
  81431. // VPSCATTERQD xmm, vm64x{k}
  81432. if isEVEXXMM(v0) && isVMXk(v1) {
  81433. self.require(ISA_AVX512VL | ISA_AVX512F)
  81434. p.domain = DomainAVX
  81435. p.add(0, func(m *_Encoding, v []interface{}) {
  81436. m.evex(0b10, 0x05, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  81437. m.emit(0xa1)
  81438. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  81439. })
  81440. }
  81441. // VPSCATTERQD xmm, vm64y{k}
  81442. if isEVEXXMM(v0) && isVMYk(v1) {
  81443. self.require(ISA_AVX512VL | ISA_AVX512F)
  81444. p.domain = DomainAVX
  81445. p.add(0, func(m *_Encoding, v []interface{}) {
  81446. m.evex(0b10, 0x05, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  81447. m.emit(0xa1)
  81448. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  81449. })
  81450. }
  81451. if p.len == 0 {
  81452. panic("invalid operands for VPSCATTERQD")
  81453. }
  81454. return p
  81455. }
  81456. // VPSCATTERQQ performs "Scatter Packed Quadword Values with Signed Quadword Indices".
  81457. //
  81458. // Mnemonic : VPSCATTERQQ
  81459. // Supported forms : (3 forms)
  81460. //
  81461. // * VPSCATTERQQ zmm, vm64z{k} [AVX512F]
  81462. // * VPSCATTERQQ xmm, vm64x{k} [AVX512F,AVX512VL]
  81463. // * VPSCATTERQQ ymm, vm64y{k} [AVX512F,AVX512VL]
  81464. //
  81465. func (self *Program) VPSCATTERQQ(v0 interface{}, v1 interface{}) *Instruction {
  81466. p := self.alloc("VPSCATTERQQ", 2, Operands { v0, v1 })
  81467. // VPSCATTERQQ zmm, vm64z{k}
  81468. if isZMM(v0) && isVMZk(v1) {
  81469. self.require(ISA_AVX512F)
  81470. p.domain = DomainAVX
  81471. p.add(0, func(m *_Encoding, v []interface{}) {
  81472. m.evex(0b10, 0x85, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  81473. m.emit(0xa1)
  81474. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  81475. })
  81476. }
  81477. // VPSCATTERQQ xmm, vm64x{k}
  81478. if isEVEXXMM(v0) && isVMXk(v1) {
  81479. self.require(ISA_AVX512VL | ISA_AVX512F)
  81480. p.domain = DomainAVX
  81481. p.add(0, func(m *_Encoding, v []interface{}) {
  81482. m.evex(0b10, 0x85, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  81483. m.emit(0xa1)
  81484. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  81485. })
  81486. }
  81487. // VPSCATTERQQ ymm, vm64y{k}
  81488. if isEVEXYMM(v0) && isVMYk(v1) {
  81489. self.require(ISA_AVX512VL | ISA_AVX512F)
  81490. p.domain = DomainAVX
  81491. p.add(0, func(m *_Encoding, v []interface{}) {
  81492. m.evex(0b10, 0x85, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  81493. m.emit(0xa1)
  81494. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  81495. })
  81496. }
  81497. if p.len == 0 {
  81498. panic("invalid operands for VPSCATTERQQ")
  81499. }
  81500. return p
  81501. }
  81502. // VPSHAB performs "Packed Shift Arithmetic Bytes".
  81503. //
  81504. // Mnemonic : VPSHAB
  81505. // Supported forms : (3 forms)
  81506. //
  81507. // * VPSHAB xmm, xmm, xmm [XOP]
  81508. // * VPSHAB m128, xmm, xmm [XOP]
  81509. // * VPSHAB xmm, m128, xmm [XOP]
  81510. //
  81511. func (self *Program) VPSHAB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  81512. p := self.alloc("VPSHAB", 3, Operands { v0, v1, v2 })
  81513. // VPSHAB xmm, xmm, xmm
  81514. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  81515. self.require(ISA_XOP)
  81516. p.domain = DomainAMDSpecific
  81517. p.add(0, func(m *_Encoding, v []interface{}) {
  81518. m.emit(0x8f)
  81519. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  81520. m.emit(0x78 ^ (hlcode(v[0]) << 3))
  81521. m.emit(0x98)
  81522. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  81523. })
  81524. p.add(0, func(m *_Encoding, v []interface{}) {
  81525. m.emit(0x8f)
  81526. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  81527. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  81528. m.emit(0x98)
  81529. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  81530. })
  81531. }
  81532. // VPSHAB m128, xmm, xmm
  81533. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  81534. self.require(ISA_XOP)
  81535. p.domain = DomainAMDSpecific
  81536. p.add(0, func(m *_Encoding, v []interface{}) {
  81537. m.vex3(0x8f, 0b1001, 0x80, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  81538. m.emit(0x98)
  81539. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  81540. })
  81541. }
  81542. // VPSHAB xmm, m128, xmm
  81543. if isXMM(v0) && isM128(v1) && isXMM(v2) {
  81544. self.require(ISA_XOP)
  81545. p.domain = DomainAMDSpecific
  81546. p.add(0, func(m *_Encoding, v []interface{}) {
  81547. m.vex3(0x8f, 0b1001, 0x00, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  81548. m.emit(0x98)
  81549. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  81550. })
  81551. }
  81552. if p.len == 0 {
  81553. panic("invalid operands for VPSHAB")
  81554. }
  81555. return p
  81556. }
  81557. // VPSHAD performs "Packed Shift Arithmetic Doublewords".
  81558. //
  81559. // Mnemonic : VPSHAD
  81560. // Supported forms : (3 forms)
  81561. //
  81562. // * VPSHAD xmm, xmm, xmm [XOP]
  81563. // * VPSHAD m128, xmm, xmm [XOP]
  81564. // * VPSHAD xmm, m128, xmm [XOP]
  81565. //
  81566. func (self *Program) VPSHAD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  81567. p := self.alloc("VPSHAD", 3, Operands { v0, v1, v2 })
  81568. // VPSHAD xmm, xmm, xmm
  81569. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  81570. self.require(ISA_XOP)
  81571. p.domain = DomainAMDSpecific
  81572. p.add(0, func(m *_Encoding, v []interface{}) {
  81573. m.emit(0x8f)
  81574. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  81575. m.emit(0x78 ^ (hlcode(v[0]) << 3))
  81576. m.emit(0x9a)
  81577. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  81578. })
  81579. p.add(0, func(m *_Encoding, v []interface{}) {
  81580. m.emit(0x8f)
  81581. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  81582. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  81583. m.emit(0x9a)
  81584. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  81585. })
  81586. }
  81587. // VPSHAD m128, xmm, xmm
  81588. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  81589. self.require(ISA_XOP)
  81590. p.domain = DomainAMDSpecific
  81591. p.add(0, func(m *_Encoding, v []interface{}) {
  81592. m.vex3(0x8f, 0b1001, 0x80, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  81593. m.emit(0x9a)
  81594. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  81595. })
  81596. }
  81597. // VPSHAD xmm, m128, xmm
  81598. if isXMM(v0) && isM128(v1) && isXMM(v2) {
  81599. self.require(ISA_XOP)
  81600. p.domain = DomainAMDSpecific
  81601. p.add(0, func(m *_Encoding, v []interface{}) {
  81602. m.vex3(0x8f, 0b1001, 0x00, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  81603. m.emit(0x9a)
  81604. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  81605. })
  81606. }
  81607. if p.len == 0 {
  81608. panic("invalid operands for VPSHAD")
  81609. }
  81610. return p
  81611. }
  81612. // VPSHAQ performs "Packed Shift Arithmetic Quadwords".
  81613. //
  81614. // Mnemonic : VPSHAQ
  81615. // Supported forms : (3 forms)
  81616. //
  81617. // * VPSHAQ xmm, xmm, xmm [XOP]
  81618. // * VPSHAQ m128, xmm, xmm [XOP]
  81619. // * VPSHAQ xmm, m128, xmm [XOP]
  81620. //
  81621. func (self *Program) VPSHAQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  81622. p := self.alloc("VPSHAQ", 3, Operands { v0, v1, v2 })
  81623. // VPSHAQ xmm, xmm, xmm
  81624. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  81625. self.require(ISA_XOP)
  81626. p.domain = DomainAMDSpecific
  81627. p.add(0, func(m *_Encoding, v []interface{}) {
  81628. m.emit(0x8f)
  81629. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  81630. m.emit(0x78 ^ (hlcode(v[0]) << 3))
  81631. m.emit(0x9b)
  81632. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  81633. })
  81634. p.add(0, func(m *_Encoding, v []interface{}) {
  81635. m.emit(0x8f)
  81636. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  81637. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  81638. m.emit(0x9b)
  81639. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  81640. })
  81641. }
  81642. // VPSHAQ m128, xmm, xmm
  81643. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  81644. self.require(ISA_XOP)
  81645. p.domain = DomainAMDSpecific
  81646. p.add(0, func(m *_Encoding, v []interface{}) {
  81647. m.vex3(0x8f, 0b1001, 0x80, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  81648. m.emit(0x9b)
  81649. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  81650. })
  81651. }
  81652. // VPSHAQ xmm, m128, xmm
  81653. if isXMM(v0) && isM128(v1) && isXMM(v2) {
  81654. self.require(ISA_XOP)
  81655. p.domain = DomainAMDSpecific
  81656. p.add(0, func(m *_Encoding, v []interface{}) {
  81657. m.vex3(0x8f, 0b1001, 0x00, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  81658. m.emit(0x9b)
  81659. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  81660. })
  81661. }
  81662. if p.len == 0 {
  81663. panic("invalid operands for VPSHAQ")
  81664. }
  81665. return p
  81666. }
  81667. // VPSHAW performs "Packed Shift Arithmetic Words".
  81668. //
  81669. // Mnemonic : VPSHAW
  81670. // Supported forms : (3 forms)
  81671. //
  81672. // * VPSHAW xmm, xmm, xmm [XOP]
  81673. // * VPSHAW m128, xmm, xmm [XOP]
  81674. // * VPSHAW xmm, m128, xmm [XOP]
  81675. //
  81676. func (self *Program) VPSHAW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  81677. p := self.alloc("VPSHAW", 3, Operands { v0, v1, v2 })
  81678. // VPSHAW xmm, xmm, xmm
  81679. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  81680. self.require(ISA_XOP)
  81681. p.domain = DomainAMDSpecific
  81682. p.add(0, func(m *_Encoding, v []interface{}) {
  81683. m.emit(0x8f)
  81684. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  81685. m.emit(0x78 ^ (hlcode(v[0]) << 3))
  81686. m.emit(0x99)
  81687. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  81688. })
  81689. p.add(0, func(m *_Encoding, v []interface{}) {
  81690. m.emit(0x8f)
  81691. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  81692. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  81693. m.emit(0x99)
  81694. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  81695. })
  81696. }
  81697. // VPSHAW m128, xmm, xmm
  81698. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  81699. self.require(ISA_XOP)
  81700. p.domain = DomainAMDSpecific
  81701. p.add(0, func(m *_Encoding, v []interface{}) {
  81702. m.vex3(0x8f, 0b1001, 0x80, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  81703. m.emit(0x99)
  81704. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  81705. })
  81706. }
  81707. // VPSHAW xmm, m128, xmm
  81708. if isXMM(v0) && isM128(v1) && isXMM(v2) {
  81709. self.require(ISA_XOP)
  81710. p.domain = DomainAMDSpecific
  81711. p.add(0, func(m *_Encoding, v []interface{}) {
  81712. m.vex3(0x8f, 0b1001, 0x00, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  81713. m.emit(0x99)
  81714. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  81715. })
  81716. }
  81717. if p.len == 0 {
  81718. panic("invalid operands for VPSHAW")
  81719. }
  81720. return p
  81721. }
  81722. // VPSHLB performs "Packed Shift Logical Bytes".
  81723. //
  81724. // Mnemonic : VPSHLB
  81725. // Supported forms : (3 forms)
  81726. //
  81727. // * VPSHLB xmm, xmm, xmm [XOP]
  81728. // * VPSHLB m128, xmm, xmm [XOP]
  81729. // * VPSHLB xmm, m128, xmm [XOP]
  81730. //
  81731. func (self *Program) VPSHLB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  81732. p := self.alloc("VPSHLB", 3, Operands { v0, v1, v2 })
  81733. // VPSHLB xmm, xmm, xmm
  81734. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  81735. self.require(ISA_XOP)
  81736. p.domain = DomainAMDSpecific
  81737. p.add(0, func(m *_Encoding, v []interface{}) {
  81738. m.emit(0x8f)
  81739. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  81740. m.emit(0x78 ^ (hlcode(v[0]) << 3))
  81741. m.emit(0x94)
  81742. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  81743. })
  81744. p.add(0, func(m *_Encoding, v []interface{}) {
  81745. m.emit(0x8f)
  81746. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  81747. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  81748. m.emit(0x94)
  81749. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  81750. })
  81751. }
  81752. // VPSHLB m128, xmm, xmm
  81753. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  81754. self.require(ISA_XOP)
  81755. p.domain = DomainAMDSpecific
  81756. p.add(0, func(m *_Encoding, v []interface{}) {
  81757. m.vex3(0x8f, 0b1001, 0x80, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  81758. m.emit(0x94)
  81759. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  81760. })
  81761. }
  81762. // VPSHLB xmm, m128, xmm
  81763. if isXMM(v0) && isM128(v1) && isXMM(v2) {
  81764. self.require(ISA_XOP)
  81765. p.domain = DomainAMDSpecific
  81766. p.add(0, func(m *_Encoding, v []interface{}) {
  81767. m.vex3(0x8f, 0b1001, 0x00, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  81768. m.emit(0x94)
  81769. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  81770. })
  81771. }
  81772. if p.len == 0 {
  81773. panic("invalid operands for VPSHLB")
  81774. }
  81775. return p
  81776. }
  81777. // VPSHLD performs "Packed Shift Logical Doublewords".
  81778. //
  81779. // Mnemonic : VPSHLD
  81780. // Supported forms : (3 forms)
  81781. //
  81782. // * VPSHLD xmm, xmm, xmm [XOP]
  81783. // * VPSHLD m128, xmm, xmm [XOP]
  81784. // * VPSHLD xmm, m128, xmm [XOP]
  81785. //
  81786. func (self *Program) VPSHLD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  81787. p := self.alloc("VPSHLD", 3, Operands { v0, v1, v2 })
  81788. // VPSHLD xmm, xmm, xmm
  81789. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  81790. self.require(ISA_XOP)
  81791. p.domain = DomainAMDSpecific
  81792. p.add(0, func(m *_Encoding, v []interface{}) {
  81793. m.emit(0x8f)
  81794. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  81795. m.emit(0x78 ^ (hlcode(v[0]) << 3))
  81796. m.emit(0x96)
  81797. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  81798. })
  81799. p.add(0, func(m *_Encoding, v []interface{}) {
  81800. m.emit(0x8f)
  81801. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  81802. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  81803. m.emit(0x96)
  81804. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  81805. })
  81806. }
  81807. // VPSHLD m128, xmm, xmm
  81808. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  81809. self.require(ISA_XOP)
  81810. p.domain = DomainAMDSpecific
  81811. p.add(0, func(m *_Encoding, v []interface{}) {
  81812. m.vex3(0x8f, 0b1001, 0x80, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  81813. m.emit(0x96)
  81814. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  81815. })
  81816. }
  81817. // VPSHLD xmm, m128, xmm
  81818. if isXMM(v0) && isM128(v1) && isXMM(v2) {
  81819. self.require(ISA_XOP)
  81820. p.domain = DomainAMDSpecific
  81821. p.add(0, func(m *_Encoding, v []interface{}) {
  81822. m.vex3(0x8f, 0b1001, 0x00, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  81823. m.emit(0x96)
  81824. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  81825. })
  81826. }
  81827. if p.len == 0 {
  81828. panic("invalid operands for VPSHLD")
  81829. }
  81830. return p
  81831. }
  81832. // VPSHLQ performs "Packed Shift Logical Quadwords".
  81833. //
  81834. // Mnemonic : VPSHLQ
  81835. // Supported forms : (3 forms)
  81836. //
  81837. // * VPSHLQ xmm, xmm, xmm [XOP]
  81838. // * VPSHLQ m128, xmm, xmm [XOP]
  81839. // * VPSHLQ xmm, m128, xmm [XOP]
  81840. //
  81841. func (self *Program) VPSHLQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  81842. p := self.alloc("VPSHLQ", 3, Operands { v0, v1, v2 })
  81843. // VPSHLQ xmm, xmm, xmm
  81844. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  81845. self.require(ISA_XOP)
  81846. p.domain = DomainAMDSpecific
  81847. p.add(0, func(m *_Encoding, v []interface{}) {
  81848. m.emit(0x8f)
  81849. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  81850. m.emit(0x78 ^ (hlcode(v[0]) << 3))
  81851. m.emit(0x97)
  81852. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  81853. })
  81854. p.add(0, func(m *_Encoding, v []interface{}) {
  81855. m.emit(0x8f)
  81856. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  81857. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  81858. m.emit(0x97)
  81859. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  81860. })
  81861. }
  81862. // VPSHLQ m128, xmm, xmm
  81863. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  81864. self.require(ISA_XOP)
  81865. p.domain = DomainAMDSpecific
  81866. p.add(0, func(m *_Encoding, v []interface{}) {
  81867. m.vex3(0x8f, 0b1001, 0x80, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  81868. m.emit(0x97)
  81869. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  81870. })
  81871. }
  81872. // VPSHLQ xmm, m128, xmm
  81873. if isXMM(v0) && isM128(v1) && isXMM(v2) {
  81874. self.require(ISA_XOP)
  81875. p.domain = DomainAMDSpecific
  81876. p.add(0, func(m *_Encoding, v []interface{}) {
  81877. m.vex3(0x8f, 0b1001, 0x00, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  81878. m.emit(0x97)
  81879. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  81880. })
  81881. }
  81882. if p.len == 0 {
  81883. panic("invalid operands for VPSHLQ")
  81884. }
  81885. return p
  81886. }
  81887. // VPSHLW performs "Packed Shift Logical Words".
  81888. //
  81889. // Mnemonic : VPSHLW
  81890. // Supported forms : (3 forms)
  81891. //
  81892. // * VPSHLW xmm, xmm, xmm [XOP]
  81893. // * VPSHLW m128, xmm, xmm [XOP]
  81894. // * VPSHLW xmm, m128, xmm [XOP]
  81895. //
  81896. func (self *Program) VPSHLW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  81897. p := self.alloc("VPSHLW", 3, Operands { v0, v1, v2 })
  81898. // VPSHLW xmm, xmm, xmm
  81899. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  81900. self.require(ISA_XOP)
  81901. p.domain = DomainAMDSpecific
  81902. p.add(0, func(m *_Encoding, v []interface{}) {
  81903. m.emit(0x8f)
  81904. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  81905. m.emit(0x78 ^ (hlcode(v[0]) << 3))
  81906. m.emit(0x95)
  81907. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  81908. })
  81909. p.add(0, func(m *_Encoding, v []interface{}) {
  81910. m.emit(0x8f)
  81911. m.emit(0xe9 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  81912. m.emit(0xf8 ^ (hlcode(v[1]) << 3))
  81913. m.emit(0x95)
  81914. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  81915. })
  81916. }
  81917. // VPSHLW m128, xmm, xmm
  81918. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  81919. self.require(ISA_XOP)
  81920. p.domain = DomainAMDSpecific
  81921. p.add(0, func(m *_Encoding, v []interface{}) {
  81922. m.vex3(0x8f, 0b1001, 0x80, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  81923. m.emit(0x95)
  81924. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  81925. })
  81926. }
  81927. // VPSHLW xmm, m128, xmm
  81928. if isXMM(v0) && isM128(v1) && isXMM(v2) {
  81929. self.require(ISA_XOP)
  81930. p.domain = DomainAMDSpecific
  81931. p.add(0, func(m *_Encoding, v []interface{}) {
  81932. m.vex3(0x8f, 0b1001, 0x00, hcode(v[2]), addr(v[1]), hlcode(v[0]))
  81933. m.emit(0x95)
  81934. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  81935. })
  81936. }
  81937. if p.len == 0 {
  81938. panic("invalid operands for VPSHLW")
  81939. }
  81940. return p
  81941. }
  81942. // VPSHUFB performs "Packed Shuffle Bytes".
  81943. //
  81944. // Mnemonic : VPSHUFB
  81945. // Supported forms : (10 forms)
  81946. //
  81947. // * VPSHUFB xmm, xmm, xmm [AVX]
  81948. // * VPSHUFB m128, xmm, xmm [AVX]
  81949. // * VPSHUFB ymm, ymm, ymm [AVX2]
  81950. // * VPSHUFB m256, ymm, ymm [AVX2]
  81951. // * VPSHUFB zmm, zmm, zmm{k}{z} [AVX512BW]
  81952. // * VPSHUFB m512, zmm, zmm{k}{z} [AVX512BW]
  81953. // * VPSHUFB xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  81954. // * VPSHUFB m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  81955. // * VPSHUFB ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  81956. // * VPSHUFB m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  81957. //
  81958. func (self *Program) VPSHUFB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  81959. p := self.alloc("VPSHUFB", 3, Operands { v0, v1, v2 })
  81960. // VPSHUFB xmm, xmm, xmm
  81961. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  81962. self.require(ISA_AVX)
  81963. p.domain = DomainAVX
  81964. p.add(0, func(m *_Encoding, v []interface{}) {
  81965. m.emit(0xc4)
  81966. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  81967. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  81968. m.emit(0x00)
  81969. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  81970. })
  81971. }
  81972. // VPSHUFB m128, xmm, xmm
  81973. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  81974. self.require(ISA_AVX)
  81975. p.domain = DomainAVX
  81976. p.add(0, func(m *_Encoding, v []interface{}) {
  81977. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  81978. m.emit(0x00)
  81979. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  81980. })
  81981. }
  81982. // VPSHUFB ymm, ymm, ymm
  81983. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  81984. self.require(ISA_AVX2)
  81985. p.domain = DomainAVX
  81986. p.add(0, func(m *_Encoding, v []interface{}) {
  81987. m.emit(0xc4)
  81988. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  81989. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  81990. m.emit(0x00)
  81991. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  81992. })
  81993. }
  81994. // VPSHUFB m256, ymm, ymm
  81995. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  81996. self.require(ISA_AVX2)
  81997. p.domain = DomainAVX
  81998. p.add(0, func(m *_Encoding, v []interface{}) {
  81999. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  82000. m.emit(0x00)
  82001. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  82002. })
  82003. }
  82004. // VPSHUFB zmm, zmm, zmm{k}{z}
  82005. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  82006. self.require(ISA_AVX512BW)
  82007. p.domain = DomainAVX
  82008. p.add(0, func(m *_Encoding, v []interface{}) {
  82009. m.emit(0x62)
  82010. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  82011. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  82012. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  82013. m.emit(0x00)
  82014. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  82015. })
  82016. }
  82017. // VPSHUFB m512, zmm, zmm{k}{z}
  82018. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  82019. self.require(ISA_AVX512BW)
  82020. p.domain = DomainAVX
  82021. p.add(0, func(m *_Encoding, v []interface{}) {
  82022. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  82023. m.emit(0x00)
  82024. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  82025. })
  82026. }
  82027. // VPSHUFB xmm, xmm, xmm{k}{z}
  82028. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  82029. self.require(ISA_AVX512VL | ISA_AVX512BW)
  82030. p.domain = DomainAVX
  82031. p.add(0, func(m *_Encoding, v []interface{}) {
  82032. m.emit(0x62)
  82033. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  82034. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  82035. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  82036. m.emit(0x00)
  82037. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  82038. })
  82039. }
  82040. // VPSHUFB m128, xmm, xmm{k}{z}
  82041. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  82042. self.require(ISA_AVX512VL | ISA_AVX512BW)
  82043. p.domain = DomainAVX
  82044. p.add(0, func(m *_Encoding, v []interface{}) {
  82045. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  82046. m.emit(0x00)
  82047. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  82048. })
  82049. }
  82050. // VPSHUFB ymm, ymm, ymm{k}{z}
  82051. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  82052. self.require(ISA_AVX512VL | ISA_AVX512BW)
  82053. p.domain = DomainAVX
  82054. p.add(0, func(m *_Encoding, v []interface{}) {
  82055. m.emit(0x62)
  82056. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  82057. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  82058. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  82059. m.emit(0x00)
  82060. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  82061. })
  82062. }
  82063. // VPSHUFB m256, ymm, ymm{k}{z}
  82064. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  82065. self.require(ISA_AVX512VL | ISA_AVX512BW)
  82066. p.domain = DomainAVX
  82067. p.add(0, func(m *_Encoding, v []interface{}) {
  82068. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  82069. m.emit(0x00)
  82070. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  82071. })
  82072. }
  82073. if p.len == 0 {
  82074. panic("invalid operands for VPSHUFB")
  82075. }
  82076. return p
  82077. }
  82078. // VPSHUFD performs "Shuffle Packed Doublewords".
  82079. //
  82080. // Mnemonic : VPSHUFD
  82081. // Supported forms : (10 forms)
  82082. //
  82083. // * VPSHUFD imm8, xmm, xmm [AVX]
  82084. // * VPSHUFD imm8, m128, xmm [AVX]
  82085. // * VPSHUFD imm8, ymm, ymm [AVX2]
  82086. // * VPSHUFD imm8, m256, ymm [AVX2]
  82087. // * VPSHUFD imm8, m512/m32bcst, zmm{k}{z} [AVX512F]
  82088. // * VPSHUFD imm8, zmm, zmm{k}{z} [AVX512F]
  82089. // * VPSHUFD imm8, m128/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  82090. // * VPSHUFD imm8, m256/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  82091. // * VPSHUFD imm8, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  82092. // * VPSHUFD imm8, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  82093. //
  82094. func (self *Program) VPSHUFD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  82095. p := self.alloc("VPSHUFD", 3, Operands { v0, v1, v2 })
  82096. // VPSHUFD imm8, xmm, xmm
  82097. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  82098. self.require(ISA_AVX)
  82099. p.domain = DomainAVX
  82100. p.add(0, func(m *_Encoding, v []interface{}) {
  82101. m.vex2(1, hcode(v[2]), v[1], 0)
  82102. m.emit(0x70)
  82103. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  82104. m.imm1(toImmAny(v[0]))
  82105. })
  82106. }
  82107. // VPSHUFD imm8, m128, xmm
  82108. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  82109. self.require(ISA_AVX)
  82110. p.domain = DomainAVX
  82111. p.add(0, func(m *_Encoding, v []interface{}) {
  82112. m.vex2(1, hcode(v[2]), addr(v[1]), 0)
  82113. m.emit(0x70)
  82114. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  82115. m.imm1(toImmAny(v[0]))
  82116. })
  82117. }
  82118. // VPSHUFD imm8, ymm, ymm
  82119. if isImm8(v0) && isYMM(v1) && isYMM(v2) {
  82120. self.require(ISA_AVX2)
  82121. p.domain = DomainAVX
  82122. p.add(0, func(m *_Encoding, v []interface{}) {
  82123. m.vex2(5, hcode(v[2]), v[1], 0)
  82124. m.emit(0x70)
  82125. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  82126. m.imm1(toImmAny(v[0]))
  82127. })
  82128. }
  82129. // VPSHUFD imm8, m256, ymm
  82130. if isImm8(v0) && isM256(v1) && isYMM(v2) {
  82131. self.require(ISA_AVX2)
  82132. p.domain = DomainAVX
  82133. p.add(0, func(m *_Encoding, v []interface{}) {
  82134. m.vex2(5, hcode(v[2]), addr(v[1]), 0)
  82135. m.emit(0x70)
  82136. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  82137. m.imm1(toImmAny(v[0]))
  82138. })
  82139. }
  82140. // VPSHUFD imm8, m512/m32bcst, zmm{k}{z}
  82141. if isImm8(v0) && isM512M32bcst(v1) && isZMMkz(v2) {
  82142. self.require(ISA_AVX512F)
  82143. p.domain = DomainAVX
  82144. p.add(0, func(m *_Encoding, v []interface{}) {
  82145. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  82146. m.emit(0x70)
  82147. m.mrsd(lcode(v[2]), addr(v[1]), 64)
  82148. m.imm1(toImmAny(v[0]))
  82149. })
  82150. }
  82151. // VPSHUFD imm8, zmm, zmm{k}{z}
  82152. if isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  82153. self.require(ISA_AVX512F)
  82154. p.domain = DomainAVX
  82155. p.add(0, func(m *_Encoding, v []interface{}) {
  82156. m.emit(0x62)
  82157. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  82158. m.emit(0x7d)
  82159. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x48)
  82160. m.emit(0x70)
  82161. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  82162. m.imm1(toImmAny(v[0]))
  82163. })
  82164. }
  82165. // VPSHUFD imm8, m128/m32bcst, xmm{k}{z}
  82166. if isImm8(v0) && isM128M32bcst(v1) && isXMMkz(v2) {
  82167. self.require(ISA_AVX512VL | ISA_AVX512F)
  82168. p.domain = DomainAVX
  82169. p.add(0, func(m *_Encoding, v []interface{}) {
  82170. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  82171. m.emit(0x70)
  82172. m.mrsd(lcode(v[2]), addr(v[1]), 16)
  82173. m.imm1(toImmAny(v[0]))
  82174. })
  82175. }
  82176. // VPSHUFD imm8, m256/m32bcst, ymm{k}{z}
  82177. if isImm8(v0) && isM256M32bcst(v1) && isYMMkz(v2) {
  82178. self.require(ISA_AVX512VL | ISA_AVX512F)
  82179. p.domain = DomainAVX
  82180. p.add(0, func(m *_Encoding, v []interface{}) {
  82181. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  82182. m.emit(0x70)
  82183. m.mrsd(lcode(v[2]), addr(v[1]), 32)
  82184. m.imm1(toImmAny(v[0]))
  82185. })
  82186. }
  82187. // VPSHUFD imm8, xmm, xmm{k}{z}
  82188. if isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  82189. self.require(ISA_AVX512VL | ISA_AVX512F)
  82190. p.domain = DomainAVX
  82191. p.add(0, func(m *_Encoding, v []interface{}) {
  82192. m.emit(0x62)
  82193. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  82194. m.emit(0x7d)
  82195. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x08)
  82196. m.emit(0x70)
  82197. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  82198. m.imm1(toImmAny(v[0]))
  82199. })
  82200. }
  82201. // VPSHUFD imm8, ymm, ymm{k}{z}
  82202. if isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  82203. self.require(ISA_AVX512VL | ISA_AVX512F)
  82204. p.domain = DomainAVX
  82205. p.add(0, func(m *_Encoding, v []interface{}) {
  82206. m.emit(0x62)
  82207. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  82208. m.emit(0x7d)
  82209. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x28)
  82210. m.emit(0x70)
  82211. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  82212. m.imm1(toImmAny(v[0]))
  82213. })
  82214. }
  82215. if p.len == 0 {
  82216. panic("invalid operands for VPSHUFD")
  82217. }
  82218. return p
  82219. }
  82220. // VPSHUFHW performs "Shuffle Packed High Words".
  82221. //
  82222. // Mnemonic : VPSHUFHW
  82223. // Supported forms : (10 forms)
  82224. //
  82225. // * VPSHUFHW imm8, xmm, xmm [AVX]
  82226. // * VPSHUFHW imm8, m128, xmm [AVX]
  82227. // * VPSHUFHW imm8, ymm, ymm [AVX2]
  82228. // * VPSHUFHW imm8, m256, ymm [AVX2]
  82229. // * VPSHUFHW imm8, zmm, zmm{k}{z} [AVX512BW]
  82230. // * VPSHUFHW imm8, m512, zmm{k}{z} [AVX512BW]
  82231. // * VPSHUFHW imm8, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  82232. // * VPSHUFHW imm8, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  82233. // * VPSHUFHW imm8, m128, xmm{k}{z} [AVX512BW,AVX512VL]
  82234. // * VPSHUFHW imm8, m256, ymm{k}{z} [AVX512BW,AVX512VL]
  82235. //
  82236. func (self *Program) VPSHUFHW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  82237. p := self.alloc("VPSHUFHW", 3, Operands { v0, v1, v2 })
  82238. // VPSHUFHW imm8, xmm, xmm
  82239. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  82240. self.require(ISA_AVX)
  82241. p.domain = DomainAVX
  82242. p.add(0, func(m *_Encoding, v []interface{}) {
  82243. m.vex2(2, hcode(v[2]), v[1], 0)
  82244. m.emit(0x70)
  82245. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  82246. m.imm1(toImmAny(v[0]))
  82247. })
  82248. }
  82249. // VPSHUFHW imm8, m128, xmm
  82250. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  82251. self.require(ISA_AVX)
  82252. p.domain = DomainAVX
  82253. p.add(0, func(m *_Encoding, v []interface{}) {
  82254. m.vex2(2, hcode(v[2]), addr(v[1]), 0)
  82255. m.emit(0x70)
  82256. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  82257. m.imm1(toImmAny(v[0]))
  82258. })
  82259. }
  82260. // VPSHUFHW imm8, ymm, ymm
  82261. if isImm8(v0) && isYMM(v1) && isYMM(v2) {
  82262. self.require(ISA_AVX2)
  82263. p.domain = DomainAVX
  82264. p.add(0, func(m *_Encoding, v []interface{}) {
  82265. m.vex2(6, hcode(v[2]), v[1], 0)
  82266. m.emit(0x70)
  82267. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  82268. m.imm1(toImmAny(v[0]))
  82269. })
  82270. }
  82271. // VPSHUFHW imm8, m256, ymm
  82272. if isImm8(v0) && isM256(v1) && isYMM(v2) {
  82273. self.require(ISA_AVX2)
  82274. p.domain = DomainAVX
  82275. p.add(0, func(m *_Encoding, v []interface{}) {
  82276. m.vex2(6, hcode(v[2]), addr(v[1]), 0)
  82277. m.emit(0x70)
  82278. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  82279. m.imm1(toImmAny(v[0]))
  82280. })
  82281. }
  82282. // VPSHUFHW imm8, zmm, zmm{k}{z}
  82283. if isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  82284. self.require(ISA_AVX512BW)
  82285. p.domain = DomainAVX
  82286. p.add(0, func(m *_Encoding, v []interface{}) {
  82287. m.emit(0x62)
  82288. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  82289. m.emit(0x7e)
  82290. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x48)
  82291. m.emit(0x70)
  82292. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  82293. m.imm1(toImmAny(v[0]))
  82294. })
  82295. }
  82296. // VPSHUFHW imm8, m512, zmm{k}{z}
  82297. if isImm8(v0) && isM512(v1) && isZMMkz(v2) {
  82298. self.require(ISA_AVX512BW)
  82299. p.domain = DomainAVX
  82300. p.add(0, func(m *_Encoding, v []interface{}) {
  82301. m.evex(0b01, 0x06, 0b10, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), 0)
  82302. m.emit(0x70)
  82303. m.mrsd(lcode(v[2]), addr(v[1]), 64)
  82304. m.imm1(toImmAny(v[0]))
  82305. })
  82306. }
  82307. // VPSHUFHW imm8, xmm, xmm{k}{z}
  82308. if isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  82309. self.require(ISA_AVX512VL | ISA_AVX512BW)
  82310. p.domain = DomainAVX
  82311. p.add(0, func(m *_Encoding, v []interface{}) {
  82312. m.emit(0x62)
  82313. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  82314. m.emit(0x7e)
  82315. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x08)
  82316. m.emit(0x70)
  82317. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  82318. m.imm1(toImmAny(v[0]))
  82319. })
  82320. }
  82321. // VPSHUFHW imm8, ymm, ymm{k}{z}
  82322. if isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  82323. self.require(ISA_AVX512VL | ISA_AVX512BW)
  82324. p.domain = DomainAVX
  82325. p.add(0, func(m *_Encoding, v []interface{}) {
  82326. m.emit(0x62)
  82327. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  82328. m.emit(0x7e)
  82329. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x28)
  82330. m.emit(0x70)
  82331. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  82332. m.imm1(toImmAny(v[0]))
  82333. })
  82334. }
  82335. // VPSHUFHW imm8, m128, xmm{k}{z}
  82336. if isImm8(v0) && isM128(v1) && isXMMkz(v2) {
  82337. self.require(ISA_AVX512VL | ISA_AVX512BW)
  82338. p.domain = DomainAVX
  82339. p.add(0, func(m *_Encoding, v []interface{}) {
  82340. m.evex(0b01, 0x06, 0b00, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), 0)
  82341. m.emit(0x70)
  82342. m.mrsd(lcode(v[2]), addr(v[1]), 16)
  82343. m.imm1(toImmAny(v[0]))
  82344. })
  82345. }
  82346. // VPSHUFHW imm8, m256, ymm{k}{z}
  82347. if isImm8(v0) && isM256(v1) && isYMMkz(v2) {
  82348. self.require(ISA_AVX512VL | ISA_AVX512BW)
  82349. p.domain = DomainAVX
  82350. p.add(0, func(m *_Encoding, v []interface{}) {
  82351. m.evex(0b01, 0x06, 0b01, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), 0)
  82352. m.emit(0x70)
  82353. m.mrsd(lcode(v[2]), addr(v[1]), 32)
  82354. m.imm1(toImmAny(v[0]))
  82355. })
  82356. }
  82357. if p.len == 0 {
  82358. panic("invalid operands for VPSHUFHW")
  82359. }
  82360. return p
  82361. }
  82362. // VPSHUFLW performs "Shuffle Packed Low Words".
  82363. //
  82364. // Mnemonic : VPSHUFLW
  82365. // Supported forms : (10 forms)
  82366. //
  82367. // * VPSHUFLW imm8, xmm, xmm [AVX]
  82368. // * VPSHUFLW imm8, m128, xmm [AVX]
  82369. // * VPSHUFLW imm8, ymm, ymm [AVX2]
  82370. // * VPSHUFLW imm8, m256, ymm [AVX2]
  82371. // * VPSHUFLW imm8, zmm, zmm{k}{z} [AVX512BW]
  82372. // * VPSHUFLW imm8, m512, zmm{k}{z} [AVX512BW]
  82373. // * VPSHUFLW imm8, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  82374. // * VPSHUFLW imm8, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  82375. // * VPSHUFLW imm8, m128, xmm{k}{z} [AVX512BW,AVX512VL]
  82376. // * VPSHUFLW imm8, m256, ymm{k}{z} [AVX512BW,AVX512VL]
  82377. //
  82378. func (self *Program) VPSHUFLW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  82379. p := self.alloc("VPSHUFLW", 3, Operands { v0, v1, v2 })
  82380. // VPSHUFLW imm8, xmm, xmm
  82381. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  82382. self.require(ISA_AVX)
  82383. p.domain = DomainAVX
  82384. p.add(0, func(m *_Encoding, v []interface{}) {
  82385. m.vex2(3, hcode(v[2]), v[1], 0)
  82386. m.emit(0x70)
  82387. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  82388. m.imm1(toImmAny(v[0]))
  82389. })
  82390. }
  82391. // VPSHUFLW imm8, m128, xmm
  82392. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  82393. self.require(ISA_AVX)
  82394. p.domain = DomainAVX
  82395. p.add(0, func(m *_Encoding, v []interface{}) {
  82396. m.vex2(3, hcode(v[2]), addr(v[1]), 0)
  82397. m.emit(0x70)
  82398. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  82399. m.imm1(toImmAny(v[0]))
  82400. })
  82401. }
  82402. // VPSHUFLW imm8, ymm, ymm
  82403. if isImm8(v0) && isYMM(v1) && isYMM(v2) {
  82404. self.require(ISA_AVX2)
  82405. p.domain = DomainAVX
  82406. p.add(0, func(m *_Encoding, v []interface{}) {
  82407. m.vex2(7, hcode(v[2]), v[1], 0)
  82408. m.emit(0x70)
  82409. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  82410. m.imm1(toImmAny(v[0]))
  82411. })
  82412. }
  82413. // VPSHUFLW imm8, m256, ymm
  82414. if isImm8(v0) && isM256(v1) && isYMM(v2) {
  82415. self.require(ISA_AVX2)
  82416. p.domain = DomainAVX
  82417. p.add(0, func(m *_Encoding, v []interface{}) {
  82418. m.vex2(7, hcode(v[2]), addr(v[1]), 0)
  82419. m.emit(0x70)
  82420. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  82421. m.imm1(toImmAny(v[0]))
  82422. })
  82423. }
  82424. // VPSHUFLW imm8, zmm, zmm{k}{z}
  82425. if isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  82426. self.require(ISA_AVX512BW)
  82427. p.domain = DomainAVX
  82428. p.add(0, func(m *_Encoding, v []interface{}) {
  82429. m.emit(0x62)
  82430. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  82431. m.emit(0x7f)
  82432. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x48)
  82433. m.emit(0x70)
  82434. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  82435. m.imm1(toImmAny(v[0]))
  82436. })
  82437. }
  82438. // VPSHUFLW imm8, m512, zmm{k}{z}
  82439. if isImm8(v0) && isM512(v1) && isZMMkz(v2) {
  82440. self.require(ISA_AVX512BW)
  82441. p.domain = DomainAVX
  82442. p.add(0, func(m *_Encoding, v []interface{}) {
  82443. m.evex(0b01, 0x07, 0b10, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), 0)
  82444. m.emit(0x70)
  82445. m.mrsd(lcode(v[2]), addr(v[1]), 64)
  82446. m.imm1(toImmAny(v[0]))
  82447. })
  82448. }
  82449. // VPSHUFLW imm8, xmm, xmm{k}{z}
  82450. if isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  82451. self.require(ISA_AVX512VL | ISA_AVX512BW)
  82452. p.domain = DomainAVX
  82453. p.add(0, func(m *_Encoding, v []interface{}) {
  82454. m.emit(0x62)
  82455. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  82456. m.emit(0x7f)
  82457. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x08)
  82458. m.emit(0x70)
  82459. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  82460. m.imm1(toImmAny(v[0]))
  82461. })
  82462. }
  82463. // VPSHUFLW imm8, ymm, ymm{k}{z}
  82464. if isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  82465. self.require(ISA_AVX512VL | ISA_AVX512BW)
  82466. p.domain = DomainAVX
  82467. p.add(0, func(m *_Encoding, v []interface{}) {
  82468. m.emit(0x62)
  82469. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  82470. m.emit(0x7f)
  82471. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x28)
  82472. m.emit(0x70)
  82473. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  82474. m.imm1(toImmAny(v[0]))
  82475. })
  82476. }
  82477. // VPSHUFLW imm8, m128, xmm{k}{z}
  82478. if isImm8(v0) && isM128(v1) && isXMMkz(v2) {
  82479. self.require(ISA_AVX512VL | ISA_AVX512BW)
  82480. p.domain = DomainAVX
  82481. p.add(0, func(m *_Encoding, v []interface{}) {
  82482. m.evex(0b01, 0x07, 0b00, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), 0)
  82483. m.emit(0x70)
  82484. m.mrsd(lcode(v[2]), addr(v[1]), 16)
  82485. m.imm1(toImmAny(v[0]))
  82486. })
  82487. }
  82488. // VPSHUFLW imm8, m256, ymm{k}{z}
  82489. if isImm8(v0) && isM256(v1) && isYMMkz(v2) {
  82490. self.require(ISA_AVX512VL | ISA_AVX512BW)
  82491. p.domain = DomainAVX
  82492. p.add(0, func(m *_Encoding, v []interface{}) {
  82493. m.evex(0b01, 0x07, 0b01, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), 0)
  82494. m.emit(0x70)
  82495. m.mrsd(lcode(v[2]), addr(v[1]), 32)
  82496. m.imm1(toImmAny(v[0]))
  82497. })
  82498. }
  82499. if p.len == 0 {
  82500. panic("invalid operands for VPSHUFLW")
  82501. }
  82502. return p
  82503. }
  82504. // VPSIGNB performs "Packed Sign of Byte Integers".
  82505. //
  82506. // Mnemonic : VPSIGNB
  82507. // Supported forms : (4 forms)
  82508. //
  82509. // * VPSIGNB xmm, xmm, xmm [AVX]
  82510. // * VPSIGNB m128, xmm, xmm [AVX]
  82511. // * VPSIGNB ymm, ymm, ymm [AVX2]
  82512. // * VPSIGNB m256, ymm, ymm [AVX2]
  82513. //
  82514. func (self *Program) VPSIGNB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  82515. p := self.alloc("VPSIGNB", 3, Operands { v0, v1, v2 })
  82516. // VPSIGNB xmm, xmm, xmm
  82517. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  82518. self.require(ISA_AVX)
  82519. p.domain = DomainAVX
  82520. p.add(0, func(m *_Encoding, v []interface{}) {
  82521. m.emit(0xc4)
  82522. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  82523. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  82524. m.emit(0x08)
  82525. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  82526. })
  82527. }
  82528. // VPSIGNB m128, xmm, xmm
  82529. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  82530. self.require(ISA_AVX)
  82531. p.domain = DomainAVX
  82532. p.add(0, func(m *_Encoding, v []interface{}) {
  82533. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  82534. m.emit(0x08)
  82535. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  82536. })
  82537. }
  82538. // VPSIGNB ymm, ymm, ymm
  82539. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  82540. self.require(ISA_AVX2)
  82541. p.domain = DomainAVX
  82542. p.add(0, func(m *_Encoding, v []interface{}) {
  82543. m.emit(0xc4)
  82544. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  82545. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  82546. m.emit(0x08)
  82547. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  82548. })
  82549. }
  82550. // VPSIGNB m256, ymm, ymm
  82551. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  82552. self.require(ISA_AVX2)
  82553. p.domain = DomainAVX
  82554. p.add(0, func(m *_Encoding, v []interface{}) {
  82555. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  82556. m.emit(0x08)
  82557. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  82558. })
  82559. }
  82560. if p.len == 0 {
  82561. panic("invalid operands for VPSIGNB")
  82562. }
  82563. return p
  82564. }
  82565. // VPSIGND performs "Packed Sign of Doubleword Integers".
  82566. //
  82567. // Mnemonic : VPSIGND
  82568. // Supported forms : (4 forms)
  82569. //
  82570. // * VPSIGND xmm, xmm, xmm [AVX]
  82571. // * VPSIGND m128, xmm, xmm [AVX]
  82572. // * VPSIGND ymm, ymm, ymm [AVX2]
  82573. // * VPSIGND m256, ymm, ymm [AVX2]
  82574. //
  82575. func (self *Program) VPSIGND(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  82576. p := self.alloc("VPSIGND", 3, Operands { v0, v1, v2 })
  82577. // VPSIGND xmm, xmm, xmm
  82578. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  82579. self.require(ISA_AVX)
  82580. p.domain = DomainAVX
  82581. p.add(0, func(m *_Encoding, v []interface{}) {
  82582. m.emit(0xc4)
  82583. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  82584. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  82585. m.emit(0x0a)
  82586. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  82587. })
  82588. }
  82589. // VPSIGND m128, xmm, xmm
  82590. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  82591. self.require(ISA_AVX)
  82592. p.domain = DomainAVX
  82593. p.add(0, func(m *_Encoding, v []interface{}) {
  82594. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  82595. m.emit(0x0a)
  82596. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  82597. })
  82598. }
  82599. // VPSIGND ymm, ymm, ymm
  82600. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  82601. self.require(ISA_AVX2)
  82602. p.domain = DomainAVX
  82603. p.add(0, func(m *_Encoding, v []interface{}) {
  82604. m.emit(0xc4)
  82605. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  82606. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  82607. m.emit(0x0a)
  82608. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  82609. })
  82610. }
  82611. // VPSIGND m256, ymm, ymm
  82612. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  82613. self.require(ISA_AVX2)
  82614. p.domain = DomainAVX
  82615. p.add(0, func(m *_Encoding, v []interface{}) {
  82616. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  82617. m.emit(0x0a)
  82618. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  82619. })
  82620. }
  82621. if p.len == 0 {
  82622. panic("invalid operands for VPSIGND")
  82623. }
  82624. return p
  82625. }
  82626. // VPSIGNW performs "Packed Sign of Word Integers".
  82627. //
  82628. // Mnemonic : VPSIGNW
  82629. // Supported forms : (4 forms)
  82630. //
  82631. // * VPSIGNW xmm, xmm, xmm [AVX]
  82632. // * VPSIGNW m128, xmm, xmm [AVX]
  82633. // * VPSIGNW ymm, ymm, ymm [AVX2]
  82634. // * VPSIGNW m256, ymm, ymm [AVX2]
  82635. //
  82636. func (self *Program) VPSIGNW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  82637. p := self.alloc("VPSIGNW", 3, Operands { v0, v1, v2 })
  82638. // VPSIGNW xmm, xmm, xmm
  82639. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  82640. self.require(ISA_AVX)
  82641. p.domain = DomainAVX
  82642. p.add(0, func(m *_Encoding, v []interface{}) {
  82643. m.emit(0xc4)
  82644. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  82645. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  82646. m.emit(0x09)
  82647. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  82648. })
  82649. }
  82650. // VPSIGNW m128, xmm, xmm
  82651. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  82652. self.require(ISA_AVX)
  82653. p.domain = DomainAVX
  82654. p.add(0, func(m *_Encoding, v []interface{}) {
  82655. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  82656. m.emit(0x09)
  82657. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  82658. })
  82659. }
  82660. // VPSIGNW ymm, ymm, ymm
  82661. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  82662. self.require(ISA_AVX2)
  82663. p.domain = DomainAVX
  82664. p.add(0, func(m *_Encoding, v []interface{}) {
  82665. m.emit(0xc4)
  82666. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  82667. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  82668. m.emit(0x09)
  82669. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  82670. })
  82671. }
  82672. // VPSIGNW m256, ymm, ymm
  82673. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  82674. self.require(ISA_AVX2)
  82675. p.domain = DomainAVX
  82676. p.add(0, func(m *_Encoding, v []interface{}) {
  82677. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  82678. m.emit(0x09)
  82679. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  82680. })
  82681. }
  82682. if p.len == 0 {
  82683. panic("invalid operands for VPSIGNW")
  82684. }
  82685. return p
  82686. }
  82687. // VPSLLD performs "Shift Packed Doubleword Data Left Logical".
  82688. //
  82689. // Mnemonic : VPSLLD
  82690. // Supported forms : (18 forms)
  82691. //
  82692. // * VPSLLD imm8, xmm, xmm [AVX]
  82693. // * VPSLLD xmm, xmm, xmm [AVX]
  82694. // * VPSLLD m128, xmm, xmm [AVX]
  82695. // * VPSLLD imm8, ymm, ymm [AVX2]
  82696. // * VPSLLD xmm, ymm, ymm [AVX2]
  82697. // * VPSLLD m128, ymm, ymm [AVX2]
  82698. // * VPSLLD imm8, m512/m32bcst, zmm{k}{z} [AVX512F]
  82699. // * VPSLLD imm8, zmm, zmm{k}{z} [AVX512F]
  82700. // * VPSLLD xmm, zmm, zmm{k}{z} [AVX512F]
  82701. // * VPSLLD m128, zmm, zmm{k}{z} [AVX512F]
  82702. // * VPSLLD imm8, m128/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  82703. // * VPSLLD imm8, m256/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  82704. // * VPSLLD imm8, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  82705. // * VPSLLD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  82706. // * VPSLLD m128, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  82707. // * VPSLLD imm8, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  82708. // * VPSLLD xmm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  82709. // * VPSLLD m128, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  82710. //
  82711. func (self *Program) VPSLLD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  82712. p := self.alloc("VPSLLD", 3, Operands { v0, v1, v2 })
  82713. // VPSLLD imm8, xmm, xmm
  82714. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  82715. self.require(ISA_AVX)
  82716. p.domain = DomainAVX
  82717. p.add(0, func(m *_Encoding, v []interface{}) {
  82718. m.vex2(1, 0, v[1], hlcode(v[2]))
  82719. m.emit(0x72)
  82720. m.emit(0xf0 | lcode(v[1]))
  82721. m.imm1(toImmAny(v[0]))
  82722. })
  82723. }
  82724. // VPSLLD xmm, xmm, xmm
  82725. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  82726. self.require(ISA_AVX)
  82727. p.domain = DomainAVX
  82728. p.add(0, func(m *_Encoding, v []interface{}) {
  82729. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  82730. m.emit(0xf2)
  82731. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  82732. })
  82733. }
  82734. // VPSLLD m128, xmm, xmm
  82735. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  82736. self.require(ISA_AVX)
  82737. p.domain = DomainAVX
  82738. p.add(0, func(m *_Encoding, v []interface{}) {
  82739. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  82740. m.emit(0xf2)
  82741. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  82742. })
  82743. }
  82744. // VPSLLD imm8, ymm, ymm
  82745. if isImm8(v0) && isYMM(v1) && isYMM(v2) {
  82746. self.require(ISA_AVX2)
  82747. p.domain = DomainAVX
  82748. p.add(0, func(m *_Encoding, v []interface{}) {
  82749. m.vex2(5, 0, v[1], hlcode(v[2]))
  82750. m.emit(0x72)
  82751. m.emit(0xf0 | lcode(v[1]))
  82752. m.imm1(toImmAny(v[0]))
  82753. })
  82754. }
  82755. // VPSLLD xmm, ymm, ymm
  82756. if isXMM(v0) && isYMM(v1) && isYMM(v2) {
  82757. self.require(ISA_AVX2)
  82758. p.domain = DomainAVX
  82759. p.add(0, func(m *_Encoding, v []interface{}) {
  82760. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  82761. m.emit(0xf2)
  82762. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  82763. })
  82764. }
  82765. // VPSLLD m128, ymm, ymm
  82766. if isM128(v0) && isYMM(v1) && isYMM(v2) {
  82767. self.require(ISA_AVX2)
  82768. p.domain = DomainAVX
  82769. p.add(0, func(m *_Encoding, v []interface{}) {
  82770. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  82771. m.emit(0xf2)
  82772. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  82773. })
  82774. }
  82775. // VPSLLD imm8, m512/m32bcst, zmm{k}{z}
  82776. if isImm8(v0) && isM512M32bcst(v1) && isZMMkz(v2) {
  82777. self.require(ISA_AVX512F)
  82778. p.domain = DomainAVX
  82779. p.add(0, func(m *_Encoding, v []interface{}) {
  82780. m.evex(0b01, 0x05, 0b10, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  82781. m.emit(0x72)
  82782. m.mrsd(6, addr(v[1]), 64)
  82783. m.imm1(toImmAny(v[0]))
  82784. })
  82785. }
  82786. // VPSLLD imm8, zmm, zmm{k}{z}
  82787. if isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  82788. self.require(ISA_AVX512F)
  82789. p.domain = DomainAVX
  82790. p.add(0, func(m *_Encoding, v []interface{}) {
  82791. m.emit(0x62)
  82792. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  82793. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  82794. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x40)
  82795. m.emit(0x72)
  82796. m.emit(0xf0 | lcode(v[1]))
  82797. m.imm1(toImmAny(v[0]))
  82798. })
  82799. }
  82800. // VPSLLD xmm, zmm, zmm{k}{z}
  82801. if isEVEXXMM(v0) && isZMM(v1) && isZMMkz(v2) {
  82802. self.require(ISA_AVX512F)
  82803. p.domain = DomainAVX
  82804. p.add(0, func(m *_Encoding, v []interface{}) {
  82805. m.emit(0x62)
  82806. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  82807. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  82808. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  82809. m.emit(0xf2)
  82810. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  82811. })
  82812. }
  82813. // VPSLLD m128, zmm, zmm{k}{z}
  82814. if isM128(v0) && isZMM(v1) && isZMMkz(v2) {
  82815. self.require(ISA_AVX512F)
  82816. p.domain = DomainAVX
  82817. p.add(0, func(m *_Encoding, v []interface{}) {
  82818. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  82819. m.emit(0xf2)
  82820. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  82821. })
  82822. }
  82823. // VPSLLD imm8, m128/m32bcst, xmm{k}{z}
  82824. if isImm8(v0) && isM128M32bcst(v1) && isXMMkz(v2) {
  82825. self.require(ISA_AVX512VL | ISA_AVX512F)
  82826. p.domain = DomainAVX
  82827. p.add(0, func(m *_Encoding, v []interface{}) {
  82828. m.evex(0b01, 0x05, 0b00, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  82829. m.emit(0x72)
  82830. m.mrsd(6, addr(v[1]), 16)
  82831. m.imm1(toImmAny(v[0]))
  82832. })
  82833. }
  82834. // VPSLLD imm8, m256/m32bcst, ymm{k}{z}
  82835. if isImm8(v0) && isM256M32bcst(v1) && isYMMkz(v2) {
  82836. self.require(ISA_AVX512VL | ISA_AVX512F)
  82837. p.domain = DomainAVX
  82838. p.add(0, func(m *_Encoding, v []interface{}) {
  82839. m.evex(0b01, 0x05, 0b01, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  82840. m.emit(0x72)
  82841. m.mrsd(6, addr(v[1]), 32)
  82842. m.imm1(toImmAny(v[0]))
  82843. })
  82844. }
  82845. // VPSLLD imm8, xmm, xmm{k}{z}
  82846. if isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  82847. self.require(ISA_AVX512VL | ISA_AVX512F)
  82848. p.domain = DomainAVX
  82849. p.add(0, func(m *_Encoding, v []interface{}) {
  82850. m.emit(0x62)
  82851. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  82852. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  82853. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x00)
  82854. m.emit(0x72)
  82855. m.emit(0xf0 | lcode(v[1]))
  82856. m.imm1(toImmAny(v[0]))
  82857. })
  82858. }
  82859. // VPSLLD xmm, xmm, xmm{k}{z}
  82860. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  82861. self.require(ISA_AVX512VL | ISA_AVX512F)
  82862. p.domain = DomainAVX
  82863. p.add(0, func(m *_Encoding, v []interface{}) {
  82864. m.emit(0x62)
  82865. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  82866. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  82867. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  82868. m.emit(0xf2)
  82869. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  82870. })
  82871. }
  82872. // VPSLLD m128, xmm, xmm{k}{z}
  82873. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  82874. self.require(ISA_AVX512VL | ISA_AVX512F)
  82875. p.domain = DomainAVX
  82876. p.add(0, func(m *_Encoding, v []interface{}) {
  82877. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  82878. m.emit(0xf2)
  82879. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  82880. })
  82881. }
  82882. // VPSLLD imm8, ymm, ymm{k}{z}
  82883. if isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  82884. self.require(ISA_AVX512VL | ISA_AVX512F)
  82885. p.domain = DomainAVX
  82886. p.add(0, func(m *_Encoding, v []interface{}) {
  82887. m.emit(0x62)
  82888. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  82889. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  82890. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x20)
  82891. m.emit(0x72)
  82892. m.emit(0xf0 | lcode(v[1]))
  82893. m.imm1(toImmAny(v[0]))
  82894. })
  82895. }
  82896. // VPSLLD xmm, ymm, ymm{k}{z}
  82897. if isEVEXXMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  82898. self.require(ISA_AVX512VL | ISA_AVX512F)
  82899. p.domain = DomainAVX
  82900. p.add(0, func(m *_Encoding, v []interface{}) {
  82901. m.emit(0x62)
  82902. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  82903. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  82904. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  82905. m.emit(0xf2)
  82906. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  82907. })
  82908. }
  82909. // VPSLLD m128, ymm, ymm{k}{z}
  82910. if isM128(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  82911. self.require(ISA_AVX512VL | ISA_AVX512F)
  82912. p.domain = DomainAVX
  82913. p.add(0, func(m *_Encoding, v []interface{}) {
  82914. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  82915. m.emit(0xf2)
  82916. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  82917. })
  82918. }
  82919. if p.len == 0 {
  82920. panic("invalid operands for VPSLLD")
  82921. }
  82922. return p
  82923. }
  82924. // VPSLLDQ performs "Shift Packed Double Quadword Left Logical".
  82925. //
  82926. // Mnemonic : VPSLLDQ
  82927. // Supported forms : (8 forms)
  82928. //
  82929. // * VPSLLDQ imm8, xmm, xmm [AVX]
  82930. // * VPSLLDQ imm8, ymm, ymm [AVX2]
  82931. // * VPSLLDQ imm8, zmm, zmm [AVX512BW]
  82932. // * VPSLLDQ imm8, m512, zmm [AVX512BW]
  82933. // * VPSLLDQ imm8, xmm, xmm [AVX512BW,AVX512VL]
  82934. // * VPSLLDQ imm8, m128, xmm [AVX512BW,AVX512VL]
  82935. // * VPSLLDQ imm8, ymm, ymm [AVX512BW,AVX512VL]
  82936. // * VPSLLDQ imm8, m256, ymm [AVX512BW,AVX512VL]
  82937. //
  82938. func (self *Program) VPSLLDQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  82939. p := self.alloc("VPSLLDQ", 3, Operands { v0, v1, v2 })
  82940. // VPSLLDQ imm8, xmm, xmm
  82941. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  82942. self.require(ISA_AVX)
  82943. p.domain = DomainAVX
  82944. p.add(0, func(m *_Encoding, v []interface{}) {
  82945. m.vex2(1, 0, v[1], hlcode(v[2]))
  82946. m.emit(0x73)
  82947. m.emit(0xf8 | lcode(v[1]))
  82948. m.imm1(toImmAny(v[0]))
  82949. })
  82950. }
  82951. // VPSLLDQ imm8, ymm, ymm
  82952. if isImm8(v0) && isYMM(v1) && isYMM(v2) {
  82953. self.require(ISA_AVX2)
  82954. p.domain = DomainAVX
  82955. p.add(0, func(m *_Encoding, v []interface{}) {
  82956. m.vex2(5, 0, v[1], hlcode(v[2]))
  82957. m.emit(0x73)
  82958. m.emit(0xf8 | lcode(v[1]))
  82959. m.imm1(toImmAny(v[0]))
  82960. })
  82961. }
  82962. // VPSLLDQ imm8, zmm, zmm
  82963. if isImm8(v0) && isZMM(v1) && isZMM(v2) {
  82964. self.require(ISA_AVX512BW)
  82965. p.domain = DomainAVX
  82966. p.add(0, func(m *_Encoding, v []interface{}) {
  82967. m.emit(0x62)
  82968. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  82969. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  82970. m.emit((0x08 ^ (ecode(v[2]) << 3)) | 0x40)
  82971. m.emit(0x73)
  82972. m.emit(0xf8 | lcode(v[1]))
  82973. m.imm1(toImmAny(v[0]))
  82974. })
  82975. }
  82976. // VPSLLDQ imm8, m512, zmm
  82977. if isImm8(v0) && isM512(v1) && isZMM(v2) {
  82978. self.require(ISA_AVX512BW)
  82979. p.domain = DomainAVX
  82980. p.add(0, func(m *_Encoding, v []interface{}) {
  82981. m.evex(0b01, 0x05, 0b10, 0, addr(v[1]), vcode(v[2]), 0, 0, 0)
  82982. m.emit(0x73)
  82983. m.mrsd(7, addr(v[1]), 64)
  82984. m.imm1(toImmAny(v[0]))
  82985. })
  82986. }
  82987. // VPSLLDQ imm8, xmm, xmm
  82988. if isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) {
  82989. self.require(ISA_AVX512VL | ISA_AVX512BW)
  82990. p.domain = DomainAVX
  82991. p.add(0, func(m *_Encoding, v []interface{}) {
  82992. m.emit(0x62)
  82993. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  82994. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  82995. m.emit((0x08 ^ (ecode(v[2]) << 3)) | 0x00)
  82996. m.emit(0x73)
  82997. m.emit(0xf8 | lcode(v[1]))
  82998. m.imm1(toImmAny(v[0]))
  82999. })
  83000. }
  83001. // VPSLLDQ imm8, m128, xmm
  83002. if isImm8(v0) && isM128(v1) && isEVEXXMM(v2) {
  83003. self.require(ISA_AVX512VL | ISA_AVX512BW)
  83004. p.domain = DomainAVX
  83005. p.add(0, func(m *_Encoding, v []interface{}) {
  83006. m.evex(0b01, 0x05, 0b00, 0, addr(v[1]), vcode(v[2]), 0, 0, 0)
  83007. m.emit(0x73)
  83008. m.mrsd(7, addr(v[1]), 16)
  83009. m.imm1(toImmAny(v[0]))
  83010. })
  83011. }
  83012. // VPSLLDQ imm8, ymm, ymm
  83013. if isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) {
  83014. self.require(ISA_AVX512VL | ISA_AVX512BW)
  83015. p.domain = DomainAVX
  83016. p.add(0, func(m *_Encoding, v []interface{}) {
  83017. m.emit(0x62)
  83018. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  83019. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  83020. m.emit((0x08 ^ (ecode(v[2]) << 3)) | 0x20)
  83021. m.emit(0x73)
  83022. m.emit(0xf8 | lcode(v[1]))
  83023. m.imm1(toImmAny(v[0]))
  83024. })
  83025. }
  83026. // VPSLLDQ imm8, m256, ymm
  83027. if isImm8(v0) && isM256(v1) && isEVEXYMM(v2) {
  83028. self.require(ISA_AVX512VL | ISA_AVX512BW)
  83029. p.domain = DomainAVX
  83030. p.add(0, func(m *_Encoding, v []interface{}) {
  83031. m.evex(0b01, 0x05, 0b01, 0, addr(v[1]), vcode(v[2]), 0, 0, 0)
  83032. m.emit(0x73)
  83033. m.mrsd(7, addr(v[1]), 32)
  83034. m.imm1(toImmAny(v[0]))
  83035. })
  83036. }
  83037. if p.len == 0 {
  83038. panic("invalid operands for VPSLLDQ")
  83039. }
  83040. return p
  83041. }
  83042. // VPSLLQ performs "Shift Packed Quadword Data Left Logical".
  83043. //
  83044. // Mnemonic : VPSLLQ
  83045. // Supported forms : (18 forms)
  83046. //
  83047. // * VPSLLQ imm8, xmm, xmm [AVX]
  83048. // * VPSLLQ xmm, xmm, xmm [AVX]
  83049. // * VPSLLQ m128, xmm, xmm [AVX]
  83050. // * VPSLLQ imm8, ymm, ymm [AVX2]
  83051. // * VPSLLQ xmm, ymm, ymm [AVX2]
  83052. // * VPSLLQ m128, ymm, ymm [AVX2]
  83053. // * VPSLLQ imm8, m512/m64bcst, zmm{k}{z} [AVX512F]
  83054. // * VPSLLQ imm8, zmm, zmm{k}{z} [AVX512F]
  83055. // * VPSLLQ xmm, zmm, zmm{k}{z} [AVX512F]
  83056. // * VPSLLQ m128, zmm, zmm{k}{z} [AVX512F]
  83057. // * VPSLLQ imm8, m128/m64bcst, xmm{k}{z} [AVX512F,AVX512VL]
  83058. // * VPSLLQ imm8, m256/m64bcst, ymm{k}{z} [AVX512F,AVX512VL]
  83059. // * VPSLLQ imm8, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  83060. // * VPSLLQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  83061. // * VPSLLQ m128, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  83062. // * VPSLLQ imm8, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  83063. // * VPSLLQ xmm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  83064. // * VPSLLQ m128, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  83065. //
  83066. func (self *Program) VPSLLQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  83067. p := self.alloc("VPSLLQ", 3, Operands { v0, v1, v2 })
  83068. // VPSLLQ imm8, xmm, xmm
  83069. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  83070. self.require(ISA_AVX)
  83071. p.domain = DomainAVX
  83072. p.add(0, func(m *_Encoding, v []interface{}) {
  83073. m.vex2(1, 0, v[1], hlcode(v[2]))
  83074. m.emit(0x73)
  83075. m.emit(0xf0 | lcode(v[1]))
  83076. m.imm1(toImmAny(v[0]))
  83077. })
  83078. }
  83079. // VPSLLQ xmm, xmm, xmm
  83080. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  83081. self.require(ISA_AVX)
  83082. p.domain = DomainAVX
  83083. p.add(0, func(m *_Encoding, v []interface{}) {
  83084. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  83085. m.emit(0xf3)
  83086. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83087. })
  83088. }
  83089. // VPSLLQ m128, xmm, xmm
  83090. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  83091. self.require(ISA_AVX)
  83092. p.domain = DomainAVX
  83093. p.add(0, func(m *_Encoding, v []interface{}) {
  83094. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  83095. m.emit(0xf3)
  83096. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  83097. })
  83098. }
  83099. // VPSLLQ imm8, ymm, ymm
  83100. if isImm8(v0) && isYMM(v1) && isYMM(v2) {
  83101. self.require(ISA_AVX2)
  83102. p.domain = DomainAVX
  83103. p.add(0, func(m *_Encoding, v []interface{}) {
  83104. m.vex2(5, 0, v[1], hlcode(v[2]))
  83105. m.emit(0x73)
  83106. m.emit(0xf0 | lcode(v[1]))
  83107. m.imm1(toImmAny(v[0]))
  83108. })
  83109. }
  83110. // VPSLLQ xmm, ymm, ymm
  83111. if isXMM(v0) && isYMM(v1) && isYMM(v2) {
  83112. self.require(ISA_AVX2)
  83113. p.domain = DomainAVX
  83114. p.add(0, func(m *_Encoding, v []interface{}) {
  83115. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  83116. m.emit(0xf3)
  83117. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83118. })
  83119. }
  83120. // VPSLLQ m128, ymm, ymm
  83121. if isM128(v0) && isYMM(v1) && isYMM(v2) {
  83122. self.require(ISA_AVX2)
  83123. p.domain = DomainAVX
  83124. p.add(0, func(m *_Encoding, v []interface{}) {
  83125. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  83126. m.emit(0xf3)
  83127. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  83128. })
  83129. }
  83130. // VPSLLQ imm8, m512/m64bcst, zmm{k}{z}
  83131. if isImm8(v0) && isM512M64bcst(v1) && isZMMkz(v2) {
  83132. self.require(ISA_AVX512F)
  83133. p.domain = DomainAVX
  83134. p.add(0, func(m *_Encoding, v []interface{}) {
  83135. m.evex(0b01, 0x85, 0b10, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  83136. m.emit(0x73)
  83137. m.mrsd(6, addr(v[1]), 64)
  83138. m.imm1(toImmAny(v[0]))
  83139. })
  83140. }
  83141. // VPSLLQ imm8, zmm, zmm{k}{z}
  83142. if isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  83143. self.require(ISA_AVX512F)
  83144. p.domain = DomainAVX
  83145. p.add(0, func(m *_Encoding, v []interface{}) {
  83146. m.emit(0x62)
  83147. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  83148. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  83149. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x40)
  83150. m.emit(0x73)
  83151. m.emit(0xf0 | lcode(v[1]))
  83152. m.imm1(toImmAny(v[0]))
  83153. })
  83154. }
  83155. // VPSLLQ xmm, zmm, zmm{k}{z}
  83156. if isEVEXXMM(v0) && isZMM(v1) && isZMMkz(v2) {
  83157. self.require(ISA_AVX512F)
  83158. p.domain = DomainAVX
  83159. p.add(0, func(m *_Encoding, v []interface{}) {
  83160. m.emit(0x62)
  83161. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  83162. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  83163. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  83164. m.emit(0xf3)
  83165. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83166. })
  83167. }
  83168. // VPSLLQ m128, zmm, zmm{k}{z}
  83169. if isM128(v0) && isZMM(v1) && isZMMkz(v2) {
  83170. self.require(ISA_AVX512F)
  83171. p.domain = DomainAVX
  83172. p.add(0, func(m *_Encoding, v []interface{}) {
  83173. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  83174. m.emit(0xf3)
  83175. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  83176. })
  83177. }
  83178. // VPSLLQ imm8, m128/m64bcst, xmm{k}{z}
  83179. if isImm8(v0) && isM128M64bcst(v1) && isXMMkz(v2) {
  83180. self.require(ISA_AVX512VL | ISA_AVX512F)
  83181. p.domain = DomainAVX
  83182. p.add(0, func(m *_Encoding, v []interface{}) {
  83183. m.evex(0b01, 0x85, 0b00, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  83184. m.emit(0x73)
  83185. m.mrsd(6, addr(v[1]), 16)
  83186. m.imm1(toImmAny(v[0]))
  83187. })
  83188. }
  83189. // VPSLLQ imm8, m256/m64bcst, ymm{k}{z}
  83190. if isImm8(v0) && isM256M64bcst(v1) && isYMMkz(v2) {
  83191. self.require(ISA_AVX512VL | ISA_AVX512F)
  83192. p.domain = DomainAVX
  83193. p.add(0, func(m *_Encoding, v []interface{}) {
  83194. m.evex(0b01, 0x85, 0b01, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  83195. m.emit(0x73)
  83196. m.mrsd(6, addr(v[1]), 32)
  83197. m.imm1(toImmAny(v[0]))
  83198. })
  83199. }
  83200. // VPSLLQ imm8, xmm, xmm{k}{z}
  83201. if isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  83202. self.require(ISA_AVX512VL | ISA_AVX512F)
  83203. p.domain = DomainAVX
  83204. p.add(0, func(m *_Encoding, v []interface{}) {
  83205. m.emit(0x62)
  83206. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  83207. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  83208. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x00)
  83209. m.emit(0x73)
  83210. m.emit(0xf0 | lcode(v[1]))
  83211. m.imm1(toImmAny(v[0]))
  83212. })
  83213. }
  83214. // VPSLLQ xmm, xmm, xmm{k}{z}
  83215. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  83216. self.require(ISA_AVX512VL | ISA_AVX512F)
  83217. p.domain = DomainAVX
  83218. p.add(0, func(m *_Encoding, v []interface{}) {
  83219. m.emit(0x62)
  83220. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  83221. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  83222. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  83223. m.emit(0xf3)
  83224. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83225. })
  83226. }
  83227. // VPSLLQ m128, xmm, xmm{k}{z}
  83228. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  83229. self.require(ISA_AVX512VL | ISA_AVX512F)
  83230. p.domain = DomainAVX
  83231. p.add(0, func(m *_Encoding, v []interface{}) {
  83232. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  83233. m.emit(0xf3)
  83234. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  83235. })
  83236. }
  83237. // VPSLLQ imm8, ymm, ymm{k}{z}
  83238. if isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  83239. self.require(ISA_AVX512VL | ISA_AVX512F)
  83240. p.domain = DomainAVX
  83241. p.add(0, func(m *_Encoding, v []interface{}) {
  83242. m.emit(0x62)
  83243. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  83244. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  83245. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x20)
  83246. m.emit(0x73)
  83247. m.emit(0xf0 | lcode(v[1]))
  83248. m.imm1(toImmAny(v[0]))
  83249. })
  83250. }
  83251. // VPSLLQ xmm, ymm, ymm{k}{z}
  83252. if isEVEXXMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  83253. self.require(ISA_AVX512VL | ISA_AVX512F)
  83254. p.domain = DomainAVX
  83255. p.add(0, func(m *_Encoding, v []interface{}) {
  83256. m.emit(0x62)
  83257. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  83258. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  83259. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  83260. m.emit(0xf3)
  83261. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83262. })
  83263. }
  83264. // VPSLLQ m128, ymm, ymm{k}{z}
  83265. if isM128(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  83266. self.require(ISA_AVX512VL | ISA_AVX512F)
  83267. p.domain = DomainAVX
  83268. p.add(0, func(m *_Encoding, v []interface{}) {
  83269. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  83270. m.emit(0xf3)
  83271. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  83272. })
  83273. }
  83274. if p.len == 0 {
  83275. panic("invalid operands for VPSLLQ")
  83276. }
  83277. return p
  83278. }
  83279. // VPSLLVD performs "Variable Shift Packed Doubleword Data Left Logical".
  83280. //
  83281. // Mnemonic : VPSLLVD
  83282. // Supported forms : (10 forms)
  83283. //
  83284. // * VPSLLVD xmm, xmm, xmm [AVX2]
  83285. // * VPSLLVD m128, xmm, xmm [AVX2]
  83286. // * VPSLLVD ymm, ymm, ymm [AVX2]
  83287. // * VPSLLVD m256, ymm, ymm [AVX2]
  83288. // * VPSLLVD m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  83289. // * VPSLLVD zmm, zmm, zmm{k}{z} [AVX512F]
  83290. // * VPSLLVD m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  83291. // * VPSLLVD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  83292. // * VPSLLVD m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  83293. // * VPSLLVD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  83294. //
  83295. func (self *Program) VPSLLVD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  83296. p := self.alloc("VPSLLVD", 3, Operands { v0, v1, v2 })
  83297. // VPSLLVD xmm, xmm, xmm
  83298. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  83299. self.require(ISA_AVX2)
  83300. p.domain = DomainAVX
  83301. p.add(0, func(m *_Encoding, v []interface{}) {
  83302. m.emit(0xc4)
  83303. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  83304. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  83305. m.emit(0x47)
  83306. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83307. })
  83308. }
  83309. // VPSLLVD m128, xmm, xmm
  83310. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  83311. self.require(ISA_AVX2)
  83312. p.domain = DomainAVX
  83313. p.add(0, func(m *_Encoding, v []interface{}) {
  83314. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  83315. m.emit(0x47)
  83316. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  83317. })
  83318. }
  83319. // VPSLLVD ymm, ymm, ymm
  83320. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  83321. self.require(ISA_AVX2)
  83322. p.domain = DomainAVX
  83323. p.add(0, func(m *_Encoding, v []interface{}) {
  83324. m.emit(0xc4)
  83325. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  83326. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  83327. m.emit(0x47)
  83328. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83329. })
  83330. }
  83331. // VPSLLVD m256, ymm, ymm
  83332. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  83333. self.require(ISA_AVX2)
  83334. p.domain = DomainAVX
  83335. p.add(0, func(m *_Encoding, v []interface{}) {
  83336. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  83337. m.emit(0x47)
  83338. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  83339. })
  83340. }
  83341. // VPSLLVD m512/m32bcst, zmm, zmm{k}{z}
  83342. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  83343. self.require(ISA_AVX512F)
  83344. p.domain = DomainAVX
  83345. p.add(0, func(m *_Encoding, v []interface{}) {
  83346. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  83347. m.emit(0x47)
  83348. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  83349. })
  83350. }
  83351. // VPSLLVD zmm, zmm, zmm{k}{z}
  83352. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  83353. self.require(ISA_AVX512F)
  83354. p.domain = DomainAVX
  83355. p.add(0, func(m *_Encoding, v []interface{}) {
  83356. m.emit(0x62)
  83357. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  83358. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  83359. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  83360. m.emit(0x47)
  83361. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83362. })
  83363. }
  83364. // VPSLLVD m128/m32bcst, xmm, xmm{k}{z}
  83365. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  83366. self.require(ISA_AVX512VL | ISA_AVX512F)
  83367. p.domain = DomainAVX
  83368. p.add(0, func(m *_Encoding, v []interface{}) {
  83369. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  83370. m.emit(0x47)
  83371. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  83372. })
  83373. }
  83374. // VPSLLVD xmm, xmm, xmm{k}{z}
  83375. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  83376. self.require(ISA_AVX512VL | ISA_AVX512F)
  83377. p.domain = DomainAVX
  83378. p.add(0, func(m *_Encoding, v []interface{}) {
  83379. m.emit(0x62)
  83380. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  83381. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  83382. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  83383. m.emit(0x47)
  83384. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83385. })
  83386. }
  83387. // VPSLLVD m256/m32bcst, ymm, ymm{k}{z}
  83388. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  83389. self.require(ISA_AVX512VL | ISA_AVX512F)
  83390. p.domain = DomainAVX
  83391. p.add(0, func(m *_Encoding, v []interface{}) {
  83392. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  83393. m.emit(0x47)
  83394. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  83395. })
  83396. }
  83397. // VPSLLVD ymm, ymm, ymm{k}{z}
  83398. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  83399. self.require(ISA_AVX512VL | ISA_AVX512F)
  83400. p.domain = DomainAVX
  83401. p.add(0, func(m *_Encoding, v []interface{}) {
  83402. m.emit(0x62)
  83403. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  83404. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  83405. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  83406. m.emit(0x47)
  83407. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83408. })
  83409. }
  83410. if p.len == 0 {
  83411. panic("invalid operands for VPSLLVD")
  83412. }
  83413. return p
  83414. }
  83415. // VPSLLVQ performs "Variable Shift Packed Quadword Data Left Logical".
  83416. //
  83417. // Mnemonic : VPSLLVQ
  83418. // Supported forms : (10 forms)
  83419. //
  83420. // * VPSLLVQ xmm, xmm, xmm [AVX2]
  83421. // * VPSLLVQ m128, xmm, xmm [AVX2]
  83422. // * VPSLLVQ ymm, ymm, ymm [AVX2]
  83423. // * VPSLLVQ m256, ymm, ymm [AVX2]
  83424. // * VPSLLVQ m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  83425. // * VPSLLVQ zmm, zmm, zmm{k}{z} [AVX512F]
  83426. // * VPSLLVQ m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  83427. // * VPSLLVQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  83428. // * VPSLLVQ m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  83429. // * VPSLLVQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  83430. //
  83431. func (self *Program) VPSLLVQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  83432. p := self.alloc("VPSLLVQ", 3, Operands { v0, v1, v2 })
  83433. // VPSLLVQ xmm, xmm, xmm
  83434. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  83435. self.require(ISA_AVX2)
  83436. p.domain = DomainAVX
  83437. p.add(0, func(m *_Encoding, v []interface{}) {
  83438. m.emit(0xc4)
  83439. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  83440. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  83441. m.emit(0x47)
  83442. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83443. })
  83444. }
  83445. // VPSLLVQ m128, xmm, xmm
  83446. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  83447. self.require(ISA_AVX2)
  83448. p.domain = DomainAVX
  83449. p.add(0, func(m *_Encoding, v []interface{}) {
  83450. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  83451. m.emit(0x47)
  83452. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  83453. })
  83454. }
  83455. // VPSLLVQ ymm, ymm, ymm
  83456. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  83457. self.require(ISA_AVX2)
  83458. p.domain = DomainAVX
  83459. p.add(0, func(m *_Encoding, v []interface{}) {
  83460. m.emit(0xc4)
  83461. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  83462. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  83463. m.emit(0x47)
  83464. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83465. })
  83466. }
  83467. // VPSLLVQ m256, ymm, ymm
  83468. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  83469. self.require(ISA_AVX2)
  83470. p.domain = DomainAVX
  83471. p.add(0, func(m *_Encoding, v []interface{}) {
  83472. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  83473. m.emit(0x47)
  83474. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  83475. })
  83476. }
  83477. // VPSLLVQ m512/m64bcst, zmm, zmm{k}{z}
  83478. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  83479. self.require(ISA_AVX512F)
  83480. p.domain = DomainAVX
  83481. p.add(0, func(m *_Encoding, v []interface{}) {
  83482. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  83483. m.emit(0x47)
  83484. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  83485. })
  83486. }
  83487. // VPSLLVQ zmm, zmm, zmm{k}{z}
  83488. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  83489. self.require(ISA_AVX512F)
  83490. p.domain = DomainAVX
  83491. p.add(0, func(m *_Encoding, v []interface{}) {
  83492. m.emit(0x62)
  83493. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  83494. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  83495. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  83496. m.emit(0x47)
  83497. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83498. })
  83499. }
  83500. // VPSLLVQ m128/m64bcst, xmm, xmm{k}{z}
  83501. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  83502. self.require(ISA_AVX512VL | ISA_AVX512F)
  83503. p.domain = DomainAVX
  83504. p.add(0, func(m *_Encoding, v []interface{}) {
  83505. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  83506. m.emit(0x47)
  83507. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  83508. })
  83509. }
  83510. // VPSLLVQ xmm, xmm, xmm{k}{z}
  83511. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  83512. self.require(ISA_AVX512VL | ISA_AVX512F)
  83513. p.domain = DomainAVX
  83514. p.add(0, func(m *_Encoding, v []interface{}) {
  83515. m.emit(0x62)
  83516. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  83517. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  83518. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  83519. m.emit(0x47)
  83520. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83521. })
  83522. }
  83523. // VPSLLVQ m256/m64bcst, ymm, ymm{k}{z}
  83524. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  83525. self.require(ISA_AVX512VL | ISA_AVX512F)
  83526. p.domain = DomainAVX
  83527. p.add(0, func(m *_Encoding, v []interface{}) {
  83528. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  83529. m.emit(0x47)
  83530. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  83531. })
  83532. }
  83533. // VPSLLVQ ymm, ymm, ymm{k}{z}
  83534. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  83535. self.require(ISA_AVX512VL | ISA_AVX512F)
  83536. p.domain = DomainAVX
  83537. p.add(0, func(m *_Encoding, v []interface{}) {
  83538. m.emit(0x62)
  83539. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  83540. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  83541. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  83542. m.emit(0x47)
  83543. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83544. })
  83545. }
  83546. if p.len == 0 {
  83547. panic("invalid operands for VPSLLVQ")
  83548. }
  83549. return p
  83550. }
  83551. // VPSLLVW performs "Variable Shift Packed Word Data Left Logical".
  83552. //
  83553. // Mnemonic : VPSLLVW
  83554. // Supported forms : (6 forms)
  83555. //
  83556. // * VPSLLVW zmm, zmm, zmm{k}{z} [AVX512BW]
  83557. // * VPSLLVW m512, zmm, zmm{k}{z} [AVX512BW]
  83558. // * VPSLLVW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  83559. // * VPSLLVW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  83560. // * VPSLLVW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  83561. // * VPSLLVW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  83562. //
  83563. func (self *Program) VPSLLVW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  83564. p := self.alloc("VPSLLVW", 3, Operands { v0, v1, v2 })
  83565. // VPSLLVW zmm, zmm, zmm{k}{z}
  83566. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  83567. self.require(ISA_AVX512BW)
  83568. p.domain = DomainAVX
  83569. p.add(0, func(m *_Encoding, v []interface{}) {
  83570. m.emit(0x62)
  83571. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  83572. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  83573. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  83574. m.emit(0x12)
  83575. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83576. })
  83577. }
  83578. // VPSLLVW m512, zmm, zmm{k}{z}
  83579. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  83580. self.require(ISA_AVX512BW)
  83581. p.domain = DomainAVX
  83582. p.add(0, func(m *_Encoding, v []interface{}) {
  83583. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  83584. m.emit(0x12)
  83585. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  83586. })
  83587. }
  83588. // VPSLLVW xmm, xmm, xmm{k}{z}
  83589. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  83590. self.require(ISA_AVX512VL | ISA_AVX512BW)
  83591. p.domain = DomainAVX
  83592. p.add(0, func(m *_Encoding, v []interface{}) {
  83593. m.emit(0x62)
  83594. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  83595. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  83596. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  83597. m.emit(0x12)
  83598. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83599. })
  83600. }
  83601. // VPSLLVW m128, xmm, xmm{k}{z}
  83602. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  83603. self.require(ISA_AVX512VL | ISA_AVX512BW)
  83604. p.domain = DomainAVX
  83605. p.add(0, func(m *_Encoding, v []interface{}) {
  83606. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  83607. m.emit(0x12)
  83608. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  83609. })
  83610. }
  83611. // VPSLLVW ymm, ymm, ymm{k}{z}
  83612. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  83613. self.require(ISA_AVX512VL | ISA_AVX512BW)
  83614. p.domain = DomainAVX
  83615. p.add(0, func(m *_Encoding, v []interface{}) {
  83616. m.emit(0x62)
  83617. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  83618. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  83619. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  83620. m.emit(0x12)
  83621. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83622. })
  83623. }
  83624. // VPSLLVW m256, ymm, ymm{k}{z}
  83625. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  83626. self.require(ISA_AVX512VL | ISA_AVX512BW)
  83627. p.domain = DomainAVX
  83628. p.add(0, func(m *_Encoding, v []interface{}) {
  83629. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  83630. m.emit(0x12)
  83631. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  83632. })
  83633. }
  83634. if p.len == 0 {
  83635. panic("invalid operands for VPSLLVW")
  83636. }
  83637. return p
  83638. }
  83639. // VPSLLW performs "Shift Packed Word Data Left Logical".
  83640. //
  83641. // Mnemonic : VPSLLW
  83642. // Supported forms : (18 forms)
  83643. //
  83644. // * VPSLLW imm8, xmm, xmm [AVX]
  83645. // * VPSLLW xmm, xmm, xmm [AVX]
  83646. // * VPSLLW m128, xmm, xmm [AVX]
  83647. // * VPSLLW imm8, ymm, ymm [AVX2]
  83648. // * VPSLLW xmm, ymm, ymm [AVX2]
  83649. // * VPSLLW m128, ymm, ymm [AVX2]
  83650. // * VPSLLW imm8, zmm, zmm{k}{z} [AVX512BW]
  83651. // * VPSLLW xmm, zmm, zmm{k}{z} [AVX512BW]
  83652. // * VPSLLW m128, zmm, zmm{k}{z} [AVX512BW]
  83653. // * VPSLLW imm8, m512, zmm{k}{z} [AVX512BW]
  83654. // * VPSLLW imm8, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  83655. // * VPSLLW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  83656. // * VPSLLW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  83657. // * VPSLLW imm8, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  83658. // * VPSLLW xmm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  83659. // * VPSLLW m128, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  83660. // * VPSLLW imm8, m128, xmm{k}{z} [AVX512BW,AVX512VL]
  83661. // * VPSLLW imm8, m256, ymm{k}{z} [AVX512BW,AVX512VL]
  83662. //
  83663. func (self *Program) VPSLLW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  83664. p := self.alloc("VPSLLW", 3, Operands { v0, v1, v2 })
  83665. // VPSLLW imm8, xmm, xmm
  83666. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  83667. self.require(ISA_AVX)
  83668. p.domain = DomainAVX
  83669. p.add(0, func(m *_Encoding, v []interface{}) {
  83670. m.vex2(1, 0, v[1], hlcode(v[2]))
  83671. m.emit(0x71)
  83672. m.emit(0xf0 | lcode(v[1]))
  83673. m.imm1(toImmAny(v[0]))
  83674. })
  83675. }
  83676. // VPSLLW xmm, xmm, xmm
  83677. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  83678. self.require(ISA_AVX)
  83679. p.domain = DomainAVX
  83680. p.add(0, func(m *_Encoding, v []interface{}) {
  83681. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  83682. m.emit(0xf1)
  83683. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83684. })
  83685. }
  83686. // VPSLLW m128, xmm, xmm
  83687. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  83688. self.require(ISA_AVX)
  83689. p.domain = DomainAVX
  83690. p.add(0, func(m *_Encoding, v []interface{}) {
  83691. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  83692. m.emit(0xf1)
  83693. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  83694. })
  83695. }
  83696. // VPSLLW imm8, ymm, ymm
  83697. if isImm8(v0) && isYMM(v1) && isYMM(v2) {
  83698. self.require(ISA_AVX2)
  83699. p.domain = DomainAVX
  83700. p.add(0, func(m *_Encoding, v []interface{}) {
  83701. m.vex2(5, 0, v[1], hlcode(v[2]))
  83702. m.emit(0x71)
  83703. m.emit(0xf0 | lcode(v[1]))
  83704. m.imm1(toImmAny(v[0]))
  83705. })
  83706. }
  83707. // VPSLLW xmm, ymm, ymm
  83708. if isXMM(v0) && isYMM(v1) && isYMM(v2) {
  83709. self.require(ISA_AVX2)
  83710. p.domain = DomainAVX
  83711. p.add(0, func(m *_Encoding, v []interface{}) {
  83712. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  83713. m.emit(0xf1)
  83714. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83715. })
  83716. }
  83717. // VPSLLW m128, ymm, ymm
  83718. if isM128(v0) && isYMM(v1) && isYMM(v2) {
  83719. self.require(ISA_AVX2)
  83720. p.domain = DomainAVX
  83721. p.add(0, func(m *_Encoding, v []interface{}) {
  83722. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  83723. m.emit(0xf1)
  83724. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  83725. })
  83726. }
  83727. // VPSLLW imm8, zmm, zmm{k}{z}
  83728. if isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  83729. self.require(ISA_AVX512BW)
  83730. p.domain = DomainAVX
  83731. p.add(0, func(m *_Encoding, v []interface{}) {
  83732. m.emit(0x62)
  83733. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  83734. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  83735. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x40)
  83736. m.emit(0x71)
  83737. m.emit(0xf0 | lcode(v[1]))
  83738. m.imm1(toImmAny(v[0]))
  83739. })
  83740. }
  83741. // VPSLLW xmm, zmm, zmm{k}{z}
  83742. if isEVEXXMM(v0) && isZMM(v1) && isZMMkz(v2) {
  83743. self.require(ISA_AVX512BW)
  83744. p.domain = DomainAVX
  83745. p.add(0, func(m *_Encoding, v []interface{}) {
  83746. m.emit(0x62)
  83747. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  83748. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  83749. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  83750. m.emit(0xf1)
  83751. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83752. })
  83753. }
  83754. // VPSLLW m128, zmm, zmm{k}{z}
  83755. if isM128(v0) && isZMM(v1) && isZMMkz(v2) {
  83756. self.require(ISA_AVX512BW)
  83757. p.domain = DomainAVX
  83758. p.add(0, func(m *_Encoding, v []interface{}) {
  83759. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  83760. m.emit(0xf1)
  83761. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  83762. })
  83763. }
  83764. // VPSLLW imm8, m512, zmm{k}{z}
  83765. if isImm8(v0) && isM512(v1) && isZMMkz(v2) {
  83766. self.require(ISA_AVX512BW)
  83767. p.domain = DomainAVX
  83768. p.add(0, func(m *_Encoding, v []interface{}) {
  83769. m.evex(0b01, 0x05, 0b10, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), 0)
  83770. m.emit(0x71)
  83771. m.mrsd(6, addr(v[1]), 64)
  83772. m.imm1(toImmAny(v[0]))
  83773. })
  83774. }
  83775. // VPSLLW imm8, xmm, xmm{k}{z}
  83776. if isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  83777. self.require(ISA_AVX512VL | ISA_AVX512BW)
  83778. p.domain = DomainAVX
  83779. p.add(0, func(m *_Encoding, v []interface{}) {
  83780. m.emit(0x62)
  83781. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  83782. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  83783. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x00)
  83784. m.emit(0x71)
  83785. m.emit(0xf0 | lcode(v[1]))
  83786. m.imm1(toImmAny(v[0]))
  83787. })
  83788. }
  83789. // VPSLLW xmm, xmm, xmm{k}{z}
  83790. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  83791. self.require(ISA_AVX512VL | ISA_AVX512BW)
  83792. p.domain = DomainAVX
  83793. p.add(0, func(m *_Encoding, v []interface{}) {
  83794. m.emit(0x62)
  83795. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  83796. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  83797. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  83798. m.emit(0xf1)
  83799. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83800. })
  83801. }
  83802. // VPSLLW m128, xmm, xmm{k}{z}
  83803. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  83804. self.require(ISA_AVX512VL | ISA_AVX512BW)
  83805. p.domain = DomainAVX
  83806. p.add(0, func(m *_Encoding, v []interface{}) {
  83807. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  83808. m.emit(0xf1)
  83809. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  83810. })
  83811. }
  83812. // VPSLLW imm8, ymm, ymm{k}{z}
  83813. if isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  83814. self.require(ISA_AVX512VL | ISA_AVX512BW)
  83815. p.domain = DomainAVX
  83816. p.add(0, func(m *_Encoding, v []interface{}) {
  83817. m.emit(0x62)
  83818. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  83819. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  83820. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x20)
  83821. m.emit(0x71)
  83822. m.emit(0xf0 | lcode(v[1]))
  83823. m.imm1(toImmAny(v[0]))
  83824. })
  83825. }
  83826. // VPSLLW xmm, ymm, ymm{k}{z}
  83827. if isEVEXXMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  83828. self.require(ISA_AVX512VL | ISA_AVX512BW)
  83829. p.domain = DomainAVX
  83830. p.add(0, func(m *_Encoding, v []interface{}) {
  83831. m.emit(0x62)
  83832. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  83833. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  83834. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  83835. m.emit(0xf1)
  83836. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83837. })
  83838. }
  83839. // VPSLLW m128, ymm, ymm{k}{z}
  83840. if isM128(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  83841. self.require(ISA_AVX512VL | ISA_AVX512BW)
  83842. p.domain = DomainAVX
  83843. p.add(0, func(m *_Encoding, v []interface{}) {
  83844. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  83845. m.emit(0xf1)
  83846. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  83847. })
  83848. }
  83849. // VPSLLW imm8, m128, xmm{k}{z}
  83850. if isImm8(v0) && isM128(v1) && isXMMkz(v2) {
  83851. self.require(ISA_AVX512VL | ISA_AVX512BW)
  83852. p.domain = DomainAVX
  83853. p.add(0, func(m *_Encoding, v []interface{}) {
  83854. m.evex(0b01, 0x05, 0b00, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), 0)
  83855. m.emit(0x71)
  83856. m.mrsd(6, addr(v[1]), 16)
  83857. m.imm1(toImmAny(v[0]))
  83858. })
  83859. }
  83860. // VPSLLW imm8, m256, ymm{k}{z}
  83861. if isImm8(v0) && isM256(v1) && isYMMkz(v2) {
  83862. self.require(ISA_AVX512VL | ISA_AVX512BW)
  83863. p.domain = DomainAVX
  83864. p.add(0, func(m *_Encoding, v []interface{}) {
  83865. m.evex(0b01, 0x05, 0b01, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), 0)
  83866. m.emit(0x71)
  83867. m.mrsd(6, addr(v[1]), 32)
  83868. m.imm1(toImmAny(v[0]))
  83869. })
  83870. }
  83871. if p.len == 0 {
  83872. panic("invalid operands for VPSLLW")
  83873. }
  83874. return p
  83875. }
  83876. // VPSRAD performs "Shift Packed Doubleword Data Right Arithmetic".
  83877. //
  83878. // Mnemonic : VPSRAD
  83879. // Supported forms : (18 forms)
  83880. //
  83881. // * VPSRAD imm8, xmm, xmm [AVX]
  83882. // * VPSRAD xmm, xmm, xmm [AVX]
  83883. // * VPSRAD m128, xmm, xmm [AVX]
  83884. // * VPSRAD imm8, ymm, ymm [AVX2]
  83885. // * VPSRAD xmm, ymm, ymm [AVX2]
  83886. // * VPSRAD m128, ymm, ymm [AVX2]
  83887. // * VPSRAD imm8, m512/m32bcst, zmm{k}{z} [AVX512F]
  83888. // * VPSRAD imm8, zmm, zmm{k}{z} [AVX512F]
  83889. // * VPSRAD xmm, zmm, zmm{k}{z} [AVX512F]
  83890. // * VPSRAD m128, zmm, zmm{k}{z} [AVX512F]
  83891. // * VPSRAD imm8, m128/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  83892. // * VPSRAD imm8, m256/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  83893. // * VPSRAD imm8, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  83894. // * VPSRAD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  83895. // * VPSRAD m128, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  83896. // * VPSRAD imm8, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  83897. // * VPSRAD xmm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  83898. // * VPSRAD m128, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  83899. //
  83900. func (self *Program) VPSRAD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  83901. p := self.alloc("VPSRAD", 3, Operands { v0, v1, v2 })
  83902. // VPSRAD imm8, xmm, xmm
  83903. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  83904. self.require(ISA_AVX)
  83905. p.domain = DomainAVX
  83906. p.add(0, func(m *_Encoding, v []interface{}) {
  83907. m.vex2(1, 0, v[1], hlcode(v[2]))
  83908. m.emit(0x72)
  83909. m.emit(0xe0 | lcode(v[1]))
  83910. m.imm1(toImmAny(v[0]))
  83911. })
  83912. }
  83913. // VPSRAD xmm, xmm, xmm
  83914. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  83915. self.require(ISA_AVX)
  83916. p.domain = DomainAVX
  83917. p.add(0, func(m *_Encoding, v []interface{}) {
  83918. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  83919. m.emit(0xe2)
  83920. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83921. })
  83922. }
  83923. // VPSRAD m128, xmm, xmm
  83924. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  83925. self.require(ISA_AVX)
  83926. p.domain = DomainAVX
  83927. p.add(0, func(m *_Encoding, v []interface{}) {
  83928. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  83929. m.emit(0xe2)
  83930. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  83931. })
  83932. }
  83933. // VPSRAD imm8, ymm, ymm
  83934. if isImm8(v0) && isYMM(v1) && isYMM(v2) {
  83935. self.require(ISA_AVX2)
  83936. p.domain = DomainAVX
  83937. p.add(0, func(m *_Encoding, v []interface{}) {
  83938. m.vex2(5, 0, v[1], hlcode(v[2]))
  83939. m.emit(0x72)
  83940. m.emit(0xe0 | lcode(v[1]))
  83941. m.imm1(toImmAny(v[0]))
  83942. })
  83943. }
  83944. // VPSRAD xmm, ymm, ymm
  83945. if isXMM(v0) && isYMM(v1) && isYMM(v2) {
  83946. self.require(ISA_AVX2)
  83947. p.domain = DomainAVX
  83948. p.add(0, func(m *_Encoding, v []interface{}) {
  83949. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  83950. m.emit(0xe2)
  83951. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  83952. })
  83953. }
  83954. // VPSRAD m128, ymm, ymm
  83955. if isM128(v0) && isYMM(v1) && isYMM(v2) {
  83956. self.require(ISA_AVX2)
  83957. p.domain = DomainAVX
  83958. p.add(0, func(m *_Encoding, v []interface{}) {
  83959. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  83960. m.emit(0xe2)
  83961. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  83962. })
  83963. }
  83964. // VPSRAD imm8, m512/m32bcst, zmm{k}{z}
  83965. if isImm8(v0) && isM512M32bcst(v1) && isZMMkz(v2) {
  83966. self.require(ISA_AVX512F)
  83967. p.domain = DomainAVX
  83968. p.add(0, func(m *_Encoding, v []interface{}) {
  83969. m.evex(0b01, 0x05, 0b10, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  83970. m.emit(0x72)
  83971. m.mrsd(4, addr(v[1]), 64)
  83972. m.imm1(toImmAny(v[0]))
  83973. })
  83974. }
  83975. // VPSRAD imm8, zmm, zmm{k}{z}
  83976. if isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  83977. self.require(ISA_AVX512F)
  83978. p.domain = DomainAVX
  83979. p.add(0, func(m *_Encoding, v []interface{}) {
  83980. m.emit(0x62)
  83981. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  83982. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  83983. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x40)
  83984. m.emit(0x72)
  83985. m.emit(0xe0 | lcode(v[1]))
  83986. m.imm1(toImmAny(v[0]))
  83987. })
  83988. }
  83989. // VPSRAD xmm, zmm, zmm{k}{z}
  83990. if isEVEXXMM(v0) && isZMM(v1) && isZMMkz(v2) {
  83991. self.require(ISA_AVX512F)
  83992. p.domain = DomainAVX
  83993. p.add(0, func(m *_Encoding, v []interface{}) {
  83994. m.emit(0x62)
  83995. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  83996. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  83997. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  83998. m.emit(0xe2)
  83999. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84000. })
  84001. }
  84002. // VPSRAD m128, zmm, zmm{k}{z}
  84003. if isM128(v0) && isZMM(v1) && isZMMkz(v2) {
  84004. self.require(ISA_AVX512F)
  84005. p.domain = DomainAVX
  84006. p.add(0, func(m *_Encoding, v []interface{}) {
  84007. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  84008. m.emit(0xe2)
  84009. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  84010. })
  84011. }
  84012. // VPSRAD imm8, m128/m32bcst, xmm{k}{z}
  84013. if isImm8(v0) && isM128M32bcst(v1) && isXMMkz(v2) {
  84014. self.require(ISA_AVX512VL | ISA_AVX512F)
  84015. p.domain = DomainAVX
  84016. p.add(0, func(m *_Encoding, v []interface{}) {
  84017. m.evex(0b01, 0x05, 0b00, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  84018. m.emit(0x72)
  84019. m.mrsd(4, addr(v[1]), 16)
  84020. m.imm1(toImmAny(v[0]))
  84021. })
  84022. }
  84023. // VPSRAD imm8, m256/m32bcst, ymm{k}{z}
  84024. if isImm8(v0) && isM256M32bcst(v1) && isYMMkz(v2) {
  84025. self.require(ISA_AVX512VL | ISA_AVX512F)
  84026. p.domain = DomainAVX
  84027. p.add(0, func(m *_Encoding, v []interface{}) {
  84028. m.evex(0b01, 0x05, 0b01, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  84029. m.emit(0x72)
  84030. m.mrsd(4, addr(v[1]), 32)
  84031. m.imm1(toImmAny(v[0]))
  84032. })
  84033. }
  84034. // VPSRAD imm8, xmm, xmm{k}{z}
  84035. if isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  84036. self.require(ISA_AVX512VL | ISA_AVX512F)
  84037. p.domain = DomainAVX
  84038. p.add(0, func(m *_Encoding, v []interface{}) {
  84039. m.emit(0x62)
  84040. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  84041. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  84042. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x00)
  84043. m.emit(0x72)
  84044. m.emit(0xe0 | lcode(v[1]))
  84045. m.imm1(toImmAny(v[0]))
  84046. })
  84047. }
  84048. // VPSRAD xmm, xmm, xmm{k}{z}
  84049. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  84050. self.require(ISA_AVX512VL | ISA_AVX512F)
  84051. p.domain = DomainAVX
  84052. p.add(0, func(m *_Encoding, v []interface{}) {
  84053. m.emit(0x62)
  84054. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  84055. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  84056. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  84057. m.emit(0xe2)
  84058. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84059. })
  84060. }
  84061. // VPSRAD m128, xmm, xmm{k}{z}
  84062. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  84063. self.require(ISA_AVX512VL | ISA_AVX512F)
  84064. p.domain = DomainAVX
  84065. p.add(0, func(m *_Encoding, v []interface{}) {
  84066. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  84067. m.emit(0xe2)
  84068. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  84069. })
  84070. }
  84071. // VPSRAD imm8, ymm, ymm{k}{z}
  84072. if isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  84073. self.require(ISA_AVX512VL | ISA_AVX512F)
  84074. p.domain = DomainAVX
  84075. p.add(0, func(m *_Encoding, v []interface{}) {
  84076. m.emit(0x62)
  84077. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  84078. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  84079. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x20)
  84080. m.emit(0x72)
  84081. m.emit(0xe0 | lcode(v[1]))
  84082. m.imm1(toImmAny(v[0]))
  84083. })
  84084. }
  84085. // VPSRAD xmm, ymm, ymm{k}{z}
  84086. if isEVEXXMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  84087. self.require(ISA_AVX512VL | ISA_AVX512F)
  84088. p.domain = DomainAVX
  84089. p.add(0, func(m *_Encoding, v []interface{}) {
  84090. m.emit(0x62)
  84091. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  84092. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  84093. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  84094. m.emit(0xe2)
  84095. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84096. })
  84097. }
  84098. // VPSRAD m128, ymm, ymm{k}{z}
  84099. if isM128(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  84100. self.require(ISA_AVX512VL | ISA_AVX512F)
  84101. p.domain = DomainAVX
  84102. p.add(0, func(m *_Encoding, v []interface{}) {
  84103. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  84104. m.emit(0xe2)
  84105. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  84106. })
  84107. }
  84108. if p.len == 0 {
  84109. panic("invalid operands for VPSRAD")
  84110. }
  84111. return p
  84112. }
  84113. // VPSRAQ performs "Shift Packed Quadword Data Right Arithmetic".
  84114. //
  84115. // Mnemonic : VPSRAQ
  84116. // Supported forms : (12 forms)
  84117. //
  84118. // * VPSRAQ imm8, m512/m64bcst, zmm{k}{z} [AVX512F]
  84119. // * VPSRAQ imm8, zmm, zmm{k}{z} [AVX512F]
  84120. // * VPSRAQ xmm, zmm, zmm{k}{z} [AVX512F]
  84121. // * VPSRAQ m128, zmm, zmm{k}{z} [AVX512F]
  84122. // * VPSRAQ imm8, m128/m64bcst, xmm{k}{z} [AVX512F,AVX512VL]
  84123. // * VPSRAQ imm8, m256/m64bcst, ymm{k}{z} [AVX512F,AVX512VL]
  84124. // * VPSRAQ imm8, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  84125. // * VPSRAQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  84126. // * VPSRAQ m128, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  84127. // * VPSRAQ imm8, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  84128. // * VPSRAQ xmm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  84129. // * VPSRAQ m128, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  84130. //
  84131. func (self *Program) VPSRAQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  84132. p := self.alloc("VPSRAQ", 3, Operands { v0, v1, v2 })
  84133. // VPSRAQ imm8, m512/m64bcst, zmm{k}{z}
  84134. if isImm8(v0) && isM512M64bcst(v1) && isZMMkz(v2) {
  84135. self.require(ISA_AVX512F)
  84136. p.domain = DomainAVX
  84137. p.add(0, func(m *_Encoding, v []interface{}) {
  84138. m.evex(0b01, 0x85, 0b10, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  84139. m.emit(0x72)
  84140. m.mrsd(4, addr(v[1]), 64)
  84141. m.imm1(toImmAny(v[0]))
  84142. })
  84143. }
  84144. // VPSRAQ imm8, zmm, zmm{k}{z}
  84145. if isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  84146. self.require(ISA_AVX512F)
  84147. p.domain = DomainAVX
  84148. p.add(0, func(m *_Encoding, v []interface{}) {
  84149. m.emit(0x62)
  84150. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  84151. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  84152. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x40)
  84153. m.emit(0x72)
  84154. m.emit(0xe0 | lcode(v[1]))
  84155. m.imm1(toImmAny(v[0]))
  84156. })
  84157. }
  84158. // VPSRAQ xmm, zmm, zmm{k}{z}
  84159. if isEVEXXMM(v0) && isZMM(v1) && isZMMkz(v2) {
  84160. self.require(ISA_AVX512F)
  84161. p.domain = DomainAVX
  84162. p.add(0, func(m *_Encoding, v []interface{}) {
  84163. m.emit(0x62)
  84164. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  84165. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  84166. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  84167. m.emit(0xe2)
  84168. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84169. })
  84170. }
  84171. // VPSRAQ m128, zmm, zmm{k}{z}
  84172. if isM128(v0) && isZMM(v1) && isZMMkz(v2) {
  84173. self.require(ISA_AVX512F)
  84174. p.domain = DomainAVX
  84175. p.add(0, func(m *_Encoding, v []interface{}) {
  84176. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  84177. m.emit(0xe2)
  84178. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  84179. })
  84180. }
  84181. // VPSRAQ imm8, m128/m64bcst, xmm{k}{z}
  84182. if isImm8(v0) && isM128M64bcst(v1) && isXMMkz(v2) {
  84183. self.require(ISA_AVX512VL | ISA_AVX512F)
  84184. p.domain = DomainAVX
  84185. p.add(0, func(m *_Encoding, v []interface{}) {
  84186. m.evex(0b01, 0x85, 0b00, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  84187. m.emit(0x72)
  84188. m.mrsd(4, addr(v[1]), 16)
  84189. m.imm1(toImmAny(v[0]))
  84190. })
  84191. }
  84192. // VPSRAQ imm8, m256/m64bcst, ymm{k}{z}
  84193. if isImm8(v0) && isM256M64bcst(v1) && isYMMkz(v2) {
  84194. self.require(ISA_AVX512VL | ISA_AVX512F)
  84195. p.domain = DomainAVX
  84196. p.add(0, func(m *_Encoding, v []interface{}) {
  84197. m.evex(0b01, 0x85, 0b01, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  84198. m.emit(0x72)
  84199. m.mrsd(4, addr(v[1]), 32)
  84200. m.imm1(toImmAny(v[0]))
  84201. })
  84202. }
  84203. // VPSRAQ imm8, xmm, xmm{k}{z}
  84204. if isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  84205. self.require(ISA_AVX512VL | ISA_AVX512F)
  84206. p.domain = DomainAVX
  84207. p.add(0, func(m *_Encoding, v []interface{}) {
  84208. m.emit(0x62)
  84209. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  84210. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  84211. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x00)
  84212. m.emit(0x72)
  84213. m.emit(0xe0 | lcode(v[1]))
  84214. m.imm1(toImmAny(v[0]))
  84215. })
  84216. }
  84217. // VPSRAQ xmm, xmm, xmm{k}{z}
  84218. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  84219. self.require(ISA_AVX512VL | ISA_AVX512F)
  84220. p.domain = DomainAVX
  84221. p.add(0, func(m *_Encoding, v []interface{}) {
  84222. m.emit(0x62)
  84223. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  84224. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  84225. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  84226. m.emit(0xe2)
  84227. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84228. })
  84229. }
  84230. // VPSRAQ m128, xmm, xmm{k}{z}
  84231. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  84232. self.require(ISA_AVX512VL | ISA_AVX512F)
  84233. p.domain = DomainAVX
  84234. p.add(0, func(m *_Encoding, v []interface{}) {
  84235. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  84236. m.emit(0xe2)
  84237. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  84238. })
  84239. }
  84240. // VPSRAQ imm8, ymm, ymm{k}{z}
  84241. if isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  84242. self.require(ISA_AVX512VL | ISA_AVX512F)
  84243. p.domain = DomainAVX
  84244. p.add(0, func(m *_Encoding, v []interface{}) {
  84245. m.emit(0x62)
  84246. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  84247. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  84248. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x20)
  84249. m.emit(0x72)
  84250. m.emit(0xe0 | lcode(v[1]))
  84251. m.imm1(toImmAny(v[0]))
  84252. })
  84253. }
  84254. // VPSRAQ xmm, ymm, ymm{k}{z}
  84255. if isEVEXXMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  84256. self.require(ISA_AVX512VL | ISA_AVX512F)
  84257. p.domain = DomainAVX
  84258. p.add(0, func(m *_Encoding, v []interface{}) {
  84259. m.emit(0x62)
  84260. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  84261. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  84262. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  84263. m.emit(0xe2)
  84264. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84265. })
  84266. }
  84267. // VPSRAQ m128, ymm, ymm{k}{z}
  84268. if isM128(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  84269. self.require(ISA_AVX512VL | ISA_AVX512F)
  84270. p.domain = DomainAVX
  84271. p.add(0, func(m *_Encoding, v []interface{}) {
  84272. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  84273. m.emit(0xe2)
  84274. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  84275. })
  84276. }
  84277. if p.len == 0 {
  84278. panic("invalid operands for VPSRAQ")
  84279. }
  84280. return p
  84281. }
  84282. // VPSRAVD performs "Variable Shift Packed Doubleword Data Right Arithmetic".
  84283. //
  84284. // Mnemonic : VPSRAVD
  84285. // Supported forms : (10 forms)
  84286. //
  84287. // * VPSRAVD xmm, xmm, xmm [AVX2]
  84288. // * VPSRAVD m128, xmm, xmm [AVX2]
  84289. // * VPSRAVD ymm, ymm, ymm [AVX2]
  84290. // * VPSRAVD m256, ymm, ymm [AVX2]
  84291. // * VPSRAVD m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  84292. // * VPSRAVD zmm, zmm, zmm{k}{z} [AVX512F]
  84293. // * VPSRAVD m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  84294. // * VPSRAVD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  84295. // * VPSRAVD m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  84296. // * VPSRAVD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  84297. //
  84298. func (self *Program) VPSRAVD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  84299. p := self.alloc("VPSRAVD", 3, Operands { v0, v1, v2 })
  84300. // VPSRAVD xmm, xmm, xmm
  84301. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  84302. self.require(ISA_AVX2)
  84303. p.domain = DomainAVX
  84304. p.add(0, func(m *_Encoding, v []interface{}) {
  84305. m.emit(0xc4)
  84306. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  84307. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  84308. m.emit(0x46)
  84309. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84310. })
  84311. }
  84312. // VPSRAVD m128, xmm, xmm
  84313. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  84314. self.require(ISA_AVX2)
  84315. p.domain = DomainAVX
  84316. p.add(0, func(m *_Encoding, v []interface{}) {
  84317. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  84318. m.emit(0x46)
  84319. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  84320. })
  84321. }
  84322. // VPSRAVD ymm, ymm, ymm
  84323. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  84324. self.require(ISA_AVX2)
  84325. p.domain = DomainAVX
  84326. p.add(0, func(m *_Encoding, v []interface{}) {
  84327. m.emit(0xc4)
  84328. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  84329. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  84330. m.emit(0x46)
  84331. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84332. })
  84333. }
  84334. // VPSRAVD m256, ymm, ymm
  84335. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  84336. self.require(ISA_AVX2)
  84337. p.domain = DomainAVX
  84338. p.add(0, func(m *_Encoding, v []interface{}) {
  84339. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  84340. m.emit(0x46)
  84341. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  84342. })
  84343. }
  84344. // VPSRAVD m512/m32bcst, zmm, zmm{k}{z}
  84345. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  84346. self.require(ISA_AVX512F)
  84347. p.domain = DomainAVX
  84348. p.add(0, func(m *_Encoding, v []interface{}) {
  84349. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  84350. m.emit(0x46)
  84351. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  84352. })
  84353. }
  84354. // VPSRAVD zmm, zmm, zmm{k}{z}
  84355. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  84356. self.require(ISA_AVX512F)
  84357. p.domain = DomainAVX
  84358. p.add(0, func(m *_Encoding, v []interface{}) {
  84359. m.emit(0x62)
  84360. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  84361. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  84362. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  84363. m.emit(0x46)
  84364. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84365. })
  84366. }
  84367. // VPSRAVD m128/m32bcst, xmm, xmm{k}{z}
  84368. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  84369. self.require(ISA_AVX512VL | ISA_AVX512F)
  84370. p.domain = DomainAVX
  84371. p.add(0, func(m *_Encoding, v []interface{}) {
  84372. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  84373. m.emit(0x46)
  84374. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  84375. })
  84376. }
  84377. // VPSRAVD xmm, xmm, xmm{k}{z}
  84378. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  84379. self.require(ISA_AVX512VL | ISA_AVX512F)
  84380. p.domain = DomainAVX
  84381. p.add(0, func(m *_Encoding, v []interface{}) {
  84382. m.emit(0x62)
  84383. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  84384. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  84385. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  84386. m.emit(0x46)
  84387. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84388. })
  84389. }
  84390. // VPSRAVD m256/m32bcst, ymm, ymm{k}{z}
  84391. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  84392. self.require(ISA_AVX512VL | ISA_AVX512F)
  84393. p.domain = DomainAVX
  84394. p.add(0, func(m *_Encoding, v []interface{}) {
  84395. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  84396. m.emit(0x46)
  84397. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  84398. })
  84399. }
  84400. // VPSRAVD ymm, ymm, ymm{k}{z}
  84401. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  84402. self.require(ISA_AVX512VL | ISA_AVX512F)
  84403. p.domain = DomainAVX
  84404. p.add(0, func(m *_Encoding, v []interface{}) {
  84405. m.emit(0x62)
  84406. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  84407. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  84408. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  84409. m.emit(0x46)
  84410. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84411. })
  84412. }
  84413. if p.len == 0 {
  84414. panic("invalid operands for VPSRAVD")
  84415. }
  84416. return p
  84417. }
  84418. // VPSRAVQ performs "Variable Shift Packed Quadword Data Right Arithmetic".
  84419. //
  84420. // Mnemonic : VPSRAVQ
  84421. // Supported forms : (6 forms)
  84422. //
  84423. // * VPSRAVQ m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  84424. // * VPSRAVQ zmm, zmm, zmm{k}{z} [AVX512F]
  84425. // * VPSRAVQ m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  84426. // * VPSRAVQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  84427. // * VPSRAVQ m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  84428. // * VPSRAVQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  84429. //
  84430. func (self *Program) VPSRAVQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  84431. p := self.alloc("VPSRAVQ", 3, Operands { v0, v1, v2 })
  84432. // VPSRAVQ m512/m64bcst, zmm, zmm{k}{z}
  84433. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  84434. self.require(ISA_AVX512F)
  84435. p.domain = DomainAVX
  84436. p.add(0, func(m *_Encoding, v []interface{}) {
  84437. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  84438. m.emit(0x46)
  84439. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  84440. })
  84441. }
  84442. // VPSRAVQ zmm, zmm, zmm{k}{z}
  84443. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  84444. self.require(ISA_AVX512F)
  84445. p.domain = DomainAVX
  84446. p.add(0, func(m *_Encoding, v []interface{}) {
  84447. m.emit(0x62)
  84448. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  84449. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  84450. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  84451. m.emit(0x46)
  84452. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84453. })
  84454. }
  84455. // VPSRAVQ m128/m64bcst, xmm, xmm{k}{z}
  84456. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  84457. self.require(ISA_AVX512VL | ISA_AVX512F)
  84458. p.domain = DomainAVX
  84459. p.add(0, func(m *_Encoding, v []interface{}) {
  84460. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  84461. m.emit(0x46)
  84462. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  84463. })
  84464. }
  84465. // VPSRAVQ xmm, xmm, xmm{k}{z}
  84466. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  84467. self.require(ISA_AVX512VL | ISA_AVX512F)
  84468. p.domain = DomainAVX
  84469. p.add(0, func(m *_Encoding, v []interface{}) {
  84470. m.emit(0x62)
  84471. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  84472. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  84473. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  84474. m.emit(0x46)
  84475. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84476. })
  84477. }
  84478. // VPSRAVQ m256/m64bcst, ymm, ymm{k}{z}
  84479. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  84480. self.require(ISA_AVX512VL | ISA_AVX512F)
  84481. p.domain = DomainAVX
  84482. p.add(0, func(m *_Encoding, v []interface{}) {
  84483. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  84484. m.emit(0x46)
  84485. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  84486. })
  84487. }
  84488. // VPSRAVQ ymm, ymm, ymm{k}{z}
  84489. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  84490. self.require(ISA_AVX512VL | ISA_AVX512F)
  84491. p.domain = DomainAVX
  84492. p.add(0, func(m *_Encoding, v []interface{}) {
  84493. m.emit(0x62)
  84494. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  84495. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  84496. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  84497. m.emit(0x46)
  84498. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84499. })
  84500. }
  84501. if p.len == 0 {
  84502. panic("invalid operands for VPSRAVQ")
  84503. }
  84504. return p
  84505. }
  84506. // VPSRAVW performs "Variable Shift Packed Word Data Right Arithmetic".
  84507. //
  84508. // Mnemonic : VPSRAVW
  84509. // Supported forms : (6 forms)
  84510. //
  84511. // * VPSRAVW zmm, zmm, zmm{k}{z} [AVX512BW]
  84512. // * VPSRAVW m512, zmm, zmm{k}{z} [AVX512BW]
  84513. // * VPSRAVW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  84514. // * VPSRAVW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  84515. // * VPSRAVW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  84516. // * VPSRAVW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  84517. //
  84518. func (self *Program) VPSRAVW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  84519. p := self.alloc("VPSRAVW", 3, Operands { v0, v1, v2 })
  84520. // VPSRAVW zmm, zmm, zmm{k}{z}
  84521. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  84522. self.require(ISA_AVX512BW)
  84523. p.domain = DomainAVX
  84524. p.add(0, func(m *_Encoding, v []interface{}) {
  84525. m.emit(0x62)
  84526. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  84527. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  84528. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  84529. m.emit(0x11)
  84530. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84531. })
  84532. }
  84533. // VPSRAVW m512, zmm, zmm{k}{z}
  84534. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  84535. self.require(ISA_AVX512BW)
  84536. p.domain = DomainAVX
  84537. p.add(0, func(m *_Encoding, v []interface{}) {
  84538. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  84539. m.emit(0x11)
  84540. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  84541. })
  84542. }
  84543. // VPSRAVW xmm, xmm, xmm{k}{z}
  84544. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  84545. self.require(ISA_AVX512VL | ISA_AVX512BW)
  84546. p.domain = DomainAVX
  84547. p.add(0, func(m *_Encoding, v []interface{}) {
  84548. m.emit(0x62)
  84549. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  84550. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  84551. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  84552. m.emit(0x11)
  84553. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84554. })
  84555. }
  84556. // VPSRAVW m128, xmm, xmm{k}{z}
  84557. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  84558. self.require(ISA_AVX512VL | ISA_AVX512BW)
  84559. p.domain = DomainAVX
  84560. p.add(0, func(m *_Encoding, v []interface{}) {
  84561. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  84562. m.emit(0x11)
  84563. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  84564. })
  84565. }
  84566. // VPSRAVW ymm, ymm, ymm{k}{z}
  84567. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  84568. self.require(ISA_AVX512VL | ISA_AVX512BW)
  84569. p.domain = DomainAVX
  84570. p.add(0, func(m *_Encoding, v []interface{}) {
  84571. m.emit(0x62)
  84572. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  84573. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  84574. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  84575. m.emit(0x11)
  84576. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84577. })
  84578. }
  84579. // VPSRAVW m256, ymm, ymm{k}{z}
  84580. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  84581. self.require(ISA_AVX512VL | ISA_AVX512BW)
  84582. p.domain = DomainAVX
  84583. p.add(0, func(m *_Encoding, v []interface{}) {
  84584. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  84585. m.emit(0x11)
  84586. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  84587. })
  84588. }
  84589. if p.len == 0 {
  84590. panic("invalid operands for VPSRAVW")
  84591. }
  84592. return p
  84593. }
  84594. // VPSRAW performs "Shift Packed Word Data Right Arithmetic".
  84595. //
  84596. // Mnemonic : VPSRAW
  84597. // Supported forms : (18 forms)
  84598. //
  84599. // * VPSRAW imm8, xmm, xmm [AVX]
  84600. // * VPSRAW xmm, xmm, xmm [AVX]
  84601. // * VPSRAW m128, xmm, xmm [AVX]
  84602. // * VPSRAW imm8, ymm, ymm [AVX2]
  84603. // * VPSRAW xmm, ymm, ymm [AVX2]
  84604. // * VPSRAW m128, ymm, ymm [AVX2]
  84605. // * VPSRAW imm8, zmm, zmm{k}{z} [AVX512BW]
  84606. // * VPSRAW xmm, zmm, zmm{k}{z} [AVX512BW]
  84607. // * VPSRAW m128, zmm, zmm{k}{z} [AVX512BW]
  84608. // * VPSRAW imm8, m512, zmm{k}{z} [AVX512BW]
  84609. // * VPSRAW imm8, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  84610. // * VPSRAW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  84611. // * VPSRAW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  84612. // * VPSRAW imm8, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  84613. // * VPSRAW xmm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  84614. // * VPSRAW m128, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  84615. // * VPSRAW imm8, m128, xmm{k}{z} [AVX512BW,AVX512VL]
  84616. // * VPSRAW imm8, m256, ymm{k}{z} [AVX512BW,AVX512VL]
  84617. //
  84618. func (self *Program) VPSRAW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  84619. p := self.alloc("VPSRAW", 3, Operands { v0, v1, v2 })
  84620. // VPSRAW imm8, xmm, xmm
  84621. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  84622. self.require(ISA_AVX)
  84623. p.domain = DomainAVX
  84624. p.add(0, func(m *_Encoding, v []interface{}) {
  84625. m.vex2(1, 0, v[1], hlcode(v[2]))
  84626. m.emit(0x71)
  84627. m.emit(0xe0 | lcode(v[1]))
  84628. m.imm1(toImmAny(v[0]))
  84629. })
  84630. }
  84631. // VPSRAW xmm, xmm, xmm
  84632. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  84633. self.require(ISA_AVX)
  84634. p.domain = DomainAVX
  84635. p.add(0, func(m *_Encoding, v []interface{}) {
  84636. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  84637. m.emit(0xe1)
  84638. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84639. })
  84640. }
  84641. // VPSRAW m128, xmm, xmm
  84642. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  84643. self.require(ISA_AVX)
  84644. p.domain = DomainAVX
  84645. p.add(0, func(m *_Encoding, v []interface{}) {
  84646. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  84647. m.emit(0xe1)
  84648. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  84649. })
  84650. }
  84651. // VPSRAW imm8, ymm, ymm
  84652. if isImm8(v0) && isYMM(v1) && isYMM(v2) {
  84653. self.require(ISA_AVX2)
  84654. p.domain = DomainAVX
  84655. p.add(0, func(m *_Encoding, v []interface{}) {
  84656. m.vex2(5, 0, v[1], hlcode(v[2]))
  84657. m.emit(0x71)
  84658. m.emit(0xe0 | lcode(v[1]))
  84659. m.imm1(toImmAny(v[0]))
  84660. })
  84661. }
  84662. // VPSRAW xmm, ymm, ymm
  84663. if isXMM(v0) && isYMM(v1) && isYMM(v2) {
  84664. self.require(ISA_AVX2)
  84665. p.domain = DomainAVX
  84666. p.add(0, func(m *_Encoding, v []interface{}) {
  84667. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  84668. m.emit(0xe1)
  84669. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84670. })
  84671. }
  84672. // VPSRAW m128, ymm, ymm
  84673. if isM128(v0) && isYMM(v1) && isYMM(v2) {
  84674. self.require(ISA_AVX2)
  84675. p.domain = DomainAVX
  84676. p.add(0, func(m *_Encoding, v []interface{}) {
  84677. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  84678. m.emit(0xe1)
  84679. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  84680. })
  84681. }
  84682. // VPSRAW imm8, zmm, zmm{k}{z}
  84683. if isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  84684. self.require(ISA_AVX512BW)
  84685. p.domain = DomainAVX
  84686. p.add(0, func(m *_Encoding, v []interface{}) {
  84687. m.emit(0x62)
  84688. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  84689. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  84690. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x40)
  84691. m.emit(0x71)
  84692. m.emit(0xe0 | lcode(v[1]))
  84693. m.imm1(toImmAny(v[0]))
  84694. })
  84695. }
  84696. // VPSRAW xmm, zmm, zmm{k}{z}
  84697. if isEVEXXMM(v0) && isZMM(v1) && isZMMkz(v2) {
  84698. self.require(ISA_AVX512BW)
  84699. p.domain = DomainAVX
  84700. p.add(0, func(m *_Encoding, v []interface{}) {
  84701. m.emit(0x62)
  84702. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  84703. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  84704. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  84705. m.emit(0xe1)
  84706. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84707. })
  84708. }
  84709. // VPSRAW m128, zmm, zmm{k}{z}
  84710. if isM128(v0) && isZMM(v1) && isZMMkz(v2) {
  84711. self.require(ISA_AVX512BW)
  84712. p.domain = DomainAVX
  84713. p.add(0, func(m *_Encoding, v []interface{}) {
  84714. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  84715. m.emit(0xe1)
  84716. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  84717. })
  84718. }
  84719. // VPSRAW imm8, m512, zmm{k}{z}
  84720. if isImm8(v0) && isM512(v1) && isZMMkz(v2) {
  84721. self.require(ISA_AVX512BW)
  84722. p.domain = DomainAVX
  84723. p.add(0, func(m *_Encoding, v []interface{}) {
  84724. m.evex(0b01, 0x05, 0b10, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), 0)
  84725. m.emit(0x71)
  84726. m.mrsd(4, addr(v[1]), 64)
  84727. m.imm1(toImmAny(v[0]))
  84728. })
  84729. }
  84730. // VPSRAW imm8, xmm, xmm{k}{z}
  84731. if isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  84732. self.require(ISA_AVX512VL | ISA_AVX512BW)
  84733. p.domain = DomainAVX
  84734. p.add(0, func(m *_Encoding, v []interface{}) {
  84735. m.emit(0x62)
  84736. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  84737. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  84738. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x00)
  84739. m.emit(0x71)
  84740. m.emit(0xe0 | lcode(v[1]))
  84741. m.imm1(toImmAny(v[0]))
  84742. })
  84743. }
  84744. // VPSRAW xmm, xmm, xmm{k}{z}
  84745. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  84746. self.require(ISA_AVX512VL | ISA_AVX512BW)
  84747. p.domain = DomainAVX
  84748. p.add(0, func(m *_Encoding, v []interface{}) {
  84749. m.emit(0x62)
  84750. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  84751. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  84752. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  84753. m.emit(0xe1)
  84754. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84755. })
  84756. }
  84757. // VPSRAW m128, xmm, xmm{k}{z}
  84758. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  84759. self.require(ISA_AVX512VL | ISA_AVX512BW)
  84760. p.domain = DomainAVX
  84761. p.add(0, func(m *_Encoding, v []interface{}) {
  84762. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  84763. m.emit(0xe1)
  84764. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  84765. })
  84766. }
  84767. // VPSRAW imm8, ymm, ymm{k}{z}
  84768. if isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  84769. self.require(ISA_AVX512VL | ISA_AVX512BW)
  84770. p.domain = DomainAVX
  84771. p.add(0, func(m *_Encoding, v []interface{}) {
  84772. m.emit(0x62)
  84773. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  84774. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  84775. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x20)
  84776. m.emit(0x71)
  84777. m.emit(0xe0 | lcode(v[1]))
  84778. m.imm1(toImmAny(v[0]))
  84779. })
  84780. }
  84781. // VPSRAW xmm, ymm, ymm{k}{z}
  84782. if isEVEXXMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  84783. self.require(ISA_AVX512VL | ISA_AVX512BW)
  84784. p.domain = DomainAVX
  84785. p.add(0, func(m *_Encoding, v []interface{}) {
  84786. m.emit(0x62)
  84787. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  84788. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  84789. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  84790. m.emit(0xe1)
  84791. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84792. })
  84793. }
  84794. // VPSRAW m128, ymm, ymm{k}{z}
  84795. if isM128(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  84796. self.require(ISA_AVX512VL | ISA_AVX512BW)
  84797. p.domain = DomainAVX
  84798. p.add(0, func(m *_Encoding, v []interface{}) {
  84799. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  84800. m.emit(0xe1)
  84801. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  84802. })
  84803. }
  84804. // VPSRAW imm8, m128, xmm{k}{z}
  84805. if isImm8(v0) && isM128(v1) && isXMMkz(v2) {
  84806. self.require(ISA_AVX512VL | ISA_AVX512BW)
  84807. p.domain = DomainAVX
  84808. p.add(0, func(m *_Encoding, v []interface{}) {
  84809. m.evex(0b01, 0x05, 0b00, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), 0)
  84810. m.emit(0x71)
  84811. m.mrsd(4, addr(v[1]), 16)
  84812. m.imm1(toImmAny(v[0]))
  84813. })
  84814. }
  84815. // VPSRAW imm8, m256, ymm{k}{z}
  84816. if isImm8(v0) && isM256(v1) && isYMMkz(v2) {
  84817. self.require(ISA_AVX512VL | ISA_AVX512BW)
  84818. p.domain = DomainAVX
  84819. p.add(0, func(m *_Encoding, v []interface{}) {
  84820. m.evex(0b01, 0x05, 0b01, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), 0)
  84821. m.emit(0x71)
  84822. m.mrsd(4, addr(v[1]), 32)
  84823. m.imm1(toImmAny(v[0]))
  84824. })
  84825. }
  84826. if p.len == 0 {
  84827. panic("invalid operands for VPSRAW")
  84828. }
  84829. return p
  84830. }
  84831. // VPSRLD performs "Shift Packed Doubleword Data Right Logical".
  84832. //
  84833. // Mnemonic : VPSRLD
  84834. // Supported forms : (18 forms)
  84835. //
  84836. // * VPSRLD imm8, xmm, xmm [AVX]
  84837. // * VPSRLD xmm, xmm, xmm [AVX]
  84838. // * VPSRLD m128, xmm, xmm [AVX]
  84839. // * VPSRLD imm8, ymm, ymm [AVX2]
  84840. // * VPSRLD xmm, ymm, ymm [AVX2]
  84841. // * VPSRLD m128, ymm, ymm [AVX2]
  84842. // * VPSRLD imm8, m512/m32bcst, zmm{k}{z} [AVX512F]
  84843. // * VPSRLD imm8, zmm, zmm{k}{z} [AVX512F]
  84844. // * VPSRLD xmm, zmm, zmm{k}{z} [AVX512F]
  84845. // * VPSRLD m128, zmm, zmm{k}{z} [AVX512F]
  84846. // * VPSRLD imm8, m128/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  84847. // * VPSRLD imm8, m256/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  84848. // * VPSRLD imm8, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  84849. // * VPSRLD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  84850. // * VPSRLD m128, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  84851. // * VPSRLD imm8, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  84852. // * VPSRLD xmm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  84853. // * VPSRLD m128, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  84854. //
  84855. func (self *Program) VPSRLD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  84856. p := self.alloc("VPSRLD", 3, Operands { v0, v1, v2 })
  84857. // VPSRLD imm8, xmm, xmm
  84858. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  84859. self.require(ISA_AVX)
  84860. p.domain = DomainAVX
  84861. p.add(0, func(m *_Encoding, v []interface{}) {
  84862. m.vex2(1, 0, v[1], hlcode(v[2]))
  84863. m.emit(0x72)
  84864. m.emit(0xd0 | lcode(v[1]))
  84865. m.imm1(toImmAny(v[0]))
  84866. })
  84867. }
  84868. // VPSRLD xmm, xmm, xmm
  84869. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  84870. self.require(ISA_AVX)
  84871. p.domain = DomainAVX
  84872. p.add(0, func(m *_Encoding, v []interface{}) {
  84873. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  84874. m.emit(0xd2)
  84875. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84876. })
  84877. }
  84878. // VPSRLD m128, xmm, xmm
  84879. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  84880. self.require(ISA_AVX)
  84881. p.domain = DomainAVX
  84882. p.add(0, func(m *_Encoding, v []interface{}) {
  84883. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  84884. m.emit(0xd2)
  84885. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  84886. })
  84887. }
  84888. // VPSRLD imm8, ymm, ymm
  84889. if isImm8(v0) && isYMM(v1) && isYMM(v2) {
  84890. self.require(ISA_AVX2)
  84891. p.domain = DomainAVX
  84892. p.add(0, func(m *_Encoding, v []interface{}) {
  84893. m.vex2(5, 0, v[1], hlcode(v[2]))
  84894. m.emit(0x72)
  84895. m.emit(0xd0 | lcode(v[1]))
  84896. m.imm1(toImmAny(v[0]))
  84897. })
  84898. }
  84899. // VPSRLD xmm, ymm, ymm
  84900. if isXMM(v0) && isYMM(v1) && isYMM(v2) {
  84901. self.require(ISA_AVX2)
  84902. p.domain = DomainAVX
  84903. p.add(0, func(m *_Encoding, v []interface{}) {
  84904. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  84905. m.emit(0xd2)
  84906. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84907. })
  84908. }
  84909. // VPSRLD m128, ymm, ymm
  84910. if isM128(v0) && isYMM(v1) && isYMM(v2) {
  84911. self.require(ISA_AVX2)
  84912. p.domain = DomainAVX
  84913. p.add(0, func(m *_Encoding, v []interface{}) {
  84914. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  84915. m.emit(0xd2)
  84916. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  84917. })
  84918. }
  84919. // VPSRLD imm8, m512/m32bcst, zmm{k}{z}
  84920. if isImm8(v0) && isM512M32bcst(v1) && isZMMkz(v2) {
  84921. self.require(ISA_AVX512F)
  84922. p.domain = DomainAVX
  84923. p.add(0, func(m *_Encoding, v []interface{}) {
  84924. m.evex(0b01, 0x05, 0b10, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  84925. m.emit(0x72)
  84926. m.mrsd(2, addr(v[1]), 64)
  84927. m.imm1(toImmAny(v[0]))
  84928. })
  84929. }
  84930. // VPSRLD imm8, zmm, zmm{k}{z}
  84931. if isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  84932. self.require(ISA_AVX512F)
  84933. p.domain = DomainAVX
  84934. p.add(0, func(m *_Encoding, v []interface{}) {
  84935. m.emit(0x62)
  84936. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  84937. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  84938. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x40)
  84939. m.emit(0x72)
  84940. m.emit(0xd0 | lcode(v[1]))
  84941. m.imm1(toImmAny(v[0]))
  84942. })
  84943. }
  84944. // VPSRLD xmm, zmm, zmm{k}{z}
  84945. if isEVEXXMM(v0) && isZMM(v1) && isZMMkz(v2) {
  84946. self.require(ISA_AVX512F)
  84947. p.domain = DomainAVX
  84948. p.add(0, func(m *_Encoding, v []interface{}) {
  84949. m.emit(0x62)
  84950. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  84951. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  84952. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  84953. m.emit(0xd2)
  84954. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  84955. })
  84956. }
  84957. // VPSRLD m128, zmm, zmm{k}{z}
  84958. if isM128(v0) && isZMM(v1) && isZMMkz(v2) {
  84959. self.require(ISA_AVX512F)
  84960. p.domain = DomainAVX
  84961. p.add(0, func(m *_Encoding, v []interface{}) {
  84962. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  84963. m.emit(0xd2)
  84964. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  84965. })
  84966. }
  84967. // VPSRLD imm8, m128/m32bcst, xmm{k}{z}
  84968. if isImm8(v0) && isM128M32bcst(v1) && isXMMkz(v2) {
  84969. self.require(ISA_AVX512VL | ISA_AVX512F)
  84970. p.domain = DomainAVX
  84971. p.add(0, func(m *_Encoding, v []interface{}) {
  84972. m.evex(0b01, 0x05, 0b00, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  84973. m.emit(0x72)
  84974. m.mrsd(2, addr(v[1]), 16)
  84975. m.imm1(toImmAny(v[0]))
  84976. })
  84977. }
  84978. // VPSRLD imm8, m256/m32bcst, ymm{k}{z}
  84979. if isImm8(v0) && isM256M32bcst(v1) && isYMMkz(v2) {
  84980. self.require(ISA_AVX512VL | ISA_AVX512F)
  84981. p.domain = DomainAVX
  84982. p.add(0, func(m *_Encoding, v []interface{}) {
  84983. m.evex(0b01, 0x05, 0b01, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  84984. m.emit(0x72)
  84985. m.mrsd(2, addr(v[1]), 32)
  84986. m.imm1(toImmAny(v[0]))
  84987. })
  84988. }
  84989. // VPSRLD imm8, xmm, xmm{k}{z}
  84990. if isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  84991. self.require(ISA_AVX512VL | ISA_AVX512F)
  84992. p.domain = DomainAVX
  84993. p.add(0, func(m *_Encoding, v []interface{}) {
  84994. m.emit(0x62)
  84995. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  84996. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  84997. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x00)
  84998. m.emit(0x72)
  84999. m.emit(0xd0 | lcode(v[1]))
  85000. m.imm1(toImmAny(v[0]))
  85001. })
  85002. }
  85003. // VPSRLD xmm, xmm, xmm{k}{z}
  85004. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  85005. self.require(ISA_AVX512VL | ISA_AVX512F)
  85006. p.domain = DomainAVX
  85007. p.add(0, func(m *_Encoding, v []interface{}) {
  85008. m.emit(0x62)
  85009. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  85010. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  85011. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  85012. m.emit(0xd2)
  85013. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85014. })
  85015. }
  85016. // VPSRLD m128, xmm, xmm{k}{z}
  85017. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  85018. self.require(ISA_AVX512VL | ISA_AVX512F)
  85019. p.domain = DomainAVX
  85020. p.add(0, func(m *_Encoding, v []interface{}) {
  85021. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  85022. m.emit(0xd2)
  85023. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  85024. })
  85025. }
  85026. // VPSRLD imm8, ymm, ymm{k}{z}
  85027. if isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  85028. self.require(ISA_AVX512VL | ISA_AVX512F)
  85029. p.domain = DomainAVX
  85030. p.add(0, func(m *_Encoding, v []interface{}) {
  85031. m.emit(0x62)
  85032. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  85033. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  85034. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x20)
  85035. m.emit(0x72)
  85036. m.emit(0xd0 | lcode(v[1]))
  85037. m.imm1(toImmAny(v[0]))
  85038. })
  85039. }
  85040. // VPSRLD xmm, ymm, ymm{k}{z}
  85041. if isEVEXXMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  85042. self.require(ISA_AVX512VL | ISA_AVX512F)
  85043. p.domain = DomainAVX
  85044. p.add(0, func(m *_Encoding, v []interface{}) {
  85045. m.emit(0x62)
  85046. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  85047. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  85048. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  85049. m.emit(0xd2)
  85050. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85051. })
  85052. }
  85053. // VPSRLD m128, ymm, ymm{k}{z}
  85054. if isM128(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  85055. self.require(ISA_AVX512VL | ISA_AVX512F)
  85056. p.domain = DomainAVX
  85057. p.add(0, func(m *_Encoding, v []interface{}) {
  85058. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  85059. m.emit(0xd2)
  85060. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  85061. })
  85062. }
  85063. if p.len == 0 {
  85064. panic("invalid operands for VPSRLD")
  85065. }
  85066. return p
  85067. }
  85068. // VPSRLDQ performs "Shift Packed Double Quadword Right Logical".
  85069. //
  85070. // Mnemonic : VPSRLDQ
  85071. // Supported forms : (8 forms)
  85072. //
  85073. // * VPSRLDQ imm8, xmm, xmm [AVX]
  85074. // * VPSRLDQ imm8, ymm, ymm [AVX2]
  85075. // * VPSRLDQ imm8, zmm, zmm [AVX512BW]
  85076. // * VPSRLDQ imm8, m512, zmm [AVX512BW]
  85077. // * VPSRLDQ imm8, xmm, xmm [AVX512BW,AVX512VL]
  85078. // * VPSRLDQ imm8, m128, xmm [AVX512BW,AVX512VL]
  85079. // * VPSRLDQ imm8, ymm, ymm [AVX512BW,AVX512VL]
  85080. // * VPSRLDQ imm8, m256, ymm [AVX512BW,AVX512VL]
  85081. //
  85082. func (self *Program) VPSRLDQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  85083. p := self.alloc("VPSRLDQ", 3, Operands { v0, v1, v2 })
  85084. // VPSRLDQ imm8, xmm, xmm
  85085. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  85086. self.require(ISA_AVX)
  85087. p.domain = DomainAVX
  85088. p.add(0, func(m *_Encoding, v []interface{}) {
  85089. m.vex2(1, 0, v[1], hlcode(v[2]))
  85090. m.emit(0x73)
  85091. m.emit(0xd8 | lcode(v[1]))
  85092. m.imm1(toImmAny(v[0]))
  85093. })
  85094. }
  85095. // VPSRLDQ imm8, ymm, ymm
  85096. if isImm8(v0) && isYMM(v1) && isYMM(v2) {
  85097. self.require(ISA_AVX2)
  85098. p.domain = DomainAVX
  85099. p.add(0, func(m *_Encoding, v []interface{}) {
  85100. m.vex2(5, 0, v[1], hlcode(v[2]))
  85101. m.emit(0x73)
  85102. m.emit(0xd8 | lcode(v[1]))
  85103. m.imm1(toImmAny(v[0]))
  85104. })
  85105. }
  85106. // VPSRLDQ imm8, zmm, zmm
  85107. if isImm8(v0) && isZMM(v1) && isZMM(v2) {
  85108. self.require(ISA_AVX512BW)
  85109. p.domain = DomainAVX
  85110. p.add(0, func(m *_Encoding, v []interface{}) {
  85111. m.emit(0x62)
  85112. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  85113. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  85114. m.emit((0x08 ^ (ecode(v[2]) << 3)) | 0x40)
  85115. m.emit(0x73)
  85116. m.emit(0xd8 | lcode(v[1]))
  85117. m.imm1(toImmAny(v[0]))
  85118. })
  85119. }
  85120. // VPSRLDQ imm8, m512, zmm
  85121. if isImm8(v0) && isM512(v1) && isZMM(v2) {
  85122. self.require(ISA_AVX512BW)
  85123. p.domain = DomainAVX
  85124. p.add(0, func(m *_Encoding, v []interface{}) {
  85125. m.evex(0b01, 0x05, 0b10, 0, addr(v[1]), vcode(v[2]), 0, 0, 0)
  85126. m.emit(0x73)
  85127. m.mrsd(3, addr(v[1]), 64)
  85128. m.imm1(toImmAny(v[0]))
  85129. })
  85130. }
  85131. // VPSRLDQ imm8, xmm, xmm
  85132. if isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) {
  85133. self.require(ISA_AVX512VL | ISA_AVX512BW)
  85134. p.domain = DomainAVX
  85135. p.add(0, func(m *_Encoding, v []interface{}) {
  85136. m.emit(0x62)
  85137. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  85138. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  85139. m.emit((0x08 ^ (ecode(v[2]) << 3)) | 0x00)
  85140. m.emit(0x73)
  85141. m.emit(0xd8 | lcode(v[1]))
  85142. m.imm1(toImmAny(v[0]))
  85143. })
  85144. }
  85145. // VPSRLDQ imm8, m128, xmm
  85146. if isImm8(v0) && isM128(v1) && isEVEXXMM(v2) {
  85147. self.require(ISA_AVX512VL | ISA_AVX512BW)
  85148. p.domain = DomainAVX
  85149. p.add(0, func(m *_Encoding, v []interface{}) {
  85150. m.evex(0b01, 0x05, 0b00, 0, addr(v[1]), vcode(v[2]), 0, 0, 0)
  85151. m.emit(0x73)
  85152. m.mrsd(3, addr(v[1]), 16)
  85153. m.imm1(toImmAny(v[0]))
  85154. })
  85155. }
  85156. // VPSRLDQ imm8, ymm, ymm
  85157. if isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) {
  85158. self.require(ISA_AVX512VL | ISA_AVX512BW)
  85159. p.domain = DomainAVX
  85160. p.add(0, func(m *_Encoding, v []interface{}) {
  85161. m.emit(0x62)
  85162. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  85163. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  85164. m.emit((0x08 ^ (ecode(v[2]) << 3)) | 0x20)
  85165. m.emit(0x73)
  85166. m.emit(0xd8 | lcode(v[1]))
  85167. m.imm1(toImmAny(v[0]))
  85168. })
  85169. }
  85170. // VPSRLDQ imm8, m256, ymm
  85171. if isImm8(v0) && isM256(v1) && isEVEXYMM(v2) {
  85172. self.require(ISA_AVX512VL | ISA_AVX512BW)
  85173. p.domain = DomainAVX
  85174. p.add(0, func(m *_Encoding, v []interface{}) {
  85175. m.evex(0b01, 0x05, 0b01, 0, addr(v[1]), vcode(v[2]), 0, 0, 0)
  85176. m.emit(0x73)
  85177. m.mrsd(3, addr(v[1]), 32)
  85178. m.imm1(toImmAny(v[0]))
  85179. })
  85180. }
  85181. if p.len == 0 {
  85182. panic("invalid operands for VPSRLDQ")
  85183. }
  85184. return p
  85185. }
  85186. // VPSRLQ performs "Shift Packed Quadword Data Right Logical".
  85187. //
  85188. // Mnemonic : VPSRLQ
  85189. // Supported forms : (18 forms)
  85190. //
  85191. // * VPSRLQ imm8, xmm, xmm [AVX]
  85192. // * VPSRLQ xmm, xmm, xmm [AVX]
  85193. // * VPSRLQ m128, xmm, xmm [AVX]
  85194. // * VPSRLQ imm8, ymm, ymm [AVX2]
  85195. // * VPSRLQ xmm, ymm, ymm [AVX2]
  85196. // * VPSRLQ m128, ymm, ymm [AVX2]
  85197. // * VPSRLQ imm8, m512/m64bcst, zmm{k}{z} [AVX512F]
  85198. // * VPSRLQ imm8, zmm, zmm{k}{z} [AVX512F]
  85199. // * VPSRLQ xmm, zmm, zmm{k}{z} [AVX512F]
  85200. // * VPSRLQ m128, zmm, zmm{k}{z} [AVX512F]
  85201. // * VPSRLQ imm8, m128/m64bcst, xmm{k}{z} [AVX512F,AVX512VL]
  85202. // * VPSRLQ imm8, m256/m64bcst, ymm{k}{z} [AVX512F,AVX512VL]
  85203. // * VPSRLQ imm8, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  85204. // * VPSRLQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  85205. // * VPSRLQ m128, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  85206. // * VPSRLQ imm8, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  85207. // * VPSRLQ xmm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  85208. // * VPSRLQ m128, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  85209. //
  85210. func (self *Program) VPSRLQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  85211. p := self.alloc("VPSRLQ", 3, Operands { v0, v1, v2 })
  85212. // VPSRLQ imm8, xmm, xmm
  85213. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  85214. self.require(ISA_AVX)
  85215. p.domain = DomainAVX
  85216. p.add(0, func(m *_Encoding, v []interface{}) {
  85217. m.vex2(1, 0, v[1], hlcode(v[2]))
  85218. m.emit(0x73)
  85219. m.emit(0xd0 | lcode(v[1]))
  85220. m.imm1(toImmAny(v[0]))
  85221. })
  85222. }
  85223. // VPSRLQ xmm, xmm, xmm
  85224. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  85225. self.require(ISA_AVX)
  85226. p.domain = DomainAVX
  85227. p.add(0, func(m *_Encoding, v []interface{}) {
  85228. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  85229. m.emit(0xd3)
  85230. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85231. })
  85232. }
  85233. // VPSRLQ m128, xmm, xmm
  85234. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  85235. self.require(ISA_AVX)
  85236. p.domain = DomainAVX
  85237. p.add(0, func(m *_Encoding, v []interface{}) {
  85238. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  85239. m.emit(0xd3)
  85240. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  85241. })
  85242. }
  85243. // VPSRLQ imm8, ymm, ymm
  85244. if isImm8(v0) && isYMM(v1) && isYMM(v2) {
  85245. self.require(ISA_AVX2)
  85246. p.domain = DomainAVX
  85247. p.add(0, func(m *_Encoding, v []interface{}) {
  85248. m.vex2(5, 0, v[1], hlcode(v[2]))
  85249. m.emit(0x73)
  85250. m.emit(0xd0 | lcode(v[1]))
  85251. m.imm1(toImmAny(v[0]))
  85252. })
  85253. }
  85254. // VPSRLQ xmm, ymm, ymm
  85255. if isXMM(v0) && isYMM(v1) && isYMM(v2) {
  85256. self.require(ISA_AVX2)
  85257. p.domain = DomainAVX
  85258. p.add(0, func(m *_Encoding, v []interface{}) {
  85259. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  85260. m.emit(0xd3)
  85261. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85262. })
  85263. }
  85264. // VPSRLQ m128, ymm, ymm
  85265. if isM128(v0) && isYMM(v1) && isYMM(v2) {
  85266. self.require(ISA_AVX2)
  85267. p.domain = DomainAVX
  85268. p.add(0, func(m *_Encoding, v []interface{}) {
  85269. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  85270. m.emit(0xd3)
  85271. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  85272. })
  85273. }
  85274. // VPSRLQ imm8, m512/m64bcst, zmm{k}{z}
  85275. if isImm8(v0) && isM512M64bcst(v1) && isZMMkz(v2) {
  85276. self.require(ISA_AVX512F)
  85277. p.domain = DomainAVX
  85278. p.add(0, func(m *_Encoding, v []interface{}) {
  85279. m.evex(0b01, 0x85, 0b10, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  85280. m.emit(0x73)
  85281. m.mrsd(2, addr(v[1]), 64)
  85282. m.imm1(toImmAny(v[0]))
  85283. })
  85284. }
  85285. // VPSRLQ imm8, zmm, zmm{k}{z}
  85286. if isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  85287. self.require(ISA_AVX512F)
  85288. p.domain = DomainAVX
  85289. p.add(0, func(m *_Encoding, v []interface{}) {
  85290. m.emit(0x62)
  85291. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  85292. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  85293. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x40)
  85294. m.emit(0x73)
  85295. m.emit(0xd0 | lcode(v[1]))
  85296. m.imm1(toImmAny(v[0]))
  85297. })
  85298. }
  85299. // VPSRLQ xmm, zmm, zmm{k}{z}
  85300. if isEVEXXMM(v0) && isZMM(v1) && isZMMkz(v2) {
  85301. self.require(ISA_AVX512F)
  85302. p.domain = DomainAVX
  85303. p.add(0, func(m *_Encoding, v []interface{}) {
  85304. m.emit(0x62)
  85305. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  85306. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  85307. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  85308. m.emit(0xd3)
  85309. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85310. })
  85311. }
  85312. // VPSRLQ m128, zmm, zmm{k}{z}
  85313. if isM128(v0) && isZMM(v1) && isZMMkz(v2) {
  85314. self.require(ISA_AVX512F)
  85315. p.domain = DomainAVX
  85316. p.add(0, func(m *_Encoding, v []interface{}) {
  85317. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  85318. m.emit(0xd3)
  85319. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  85320. })
  85321. }
  85322. // VPSRLQ imm8, m128/m64bcst, xmm{k}{z}
  85323. if isImm8(v0) && isM128M64bcst(v1) && isXMMkz(v2) {
  85324. self.require(ISA_AVX512VL | ISA_AVX512F)
  85325. p.domain = DomainAVX
  85326. p.add(0, func(m *_Encoding, v []interface{}) {
  85327. m.evex(0b01, 0x85, 0b00, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  85328. m.emit(0x73)
  85329. m.mrsd(2, addr(v[1]), 16)
  85330. m.imm1(toImmAny(v[0]))
  85331. })
  85332. }
  85333. // VPSRLQ imm8, m256/m64bcst, ymm{k}{z}
  85334. if isImm8(v0) && isM256M64bcst(v1) && isYMMkz(v2) {
  85335. self.require(ISA_AVX512VL | ISA_AVX512F)
  85336. p.domain = DomainAVX
  85337. p.add(0, func(m *_Encoding, v []interface{}) {
  85338. m.evex(0b01, 0x85, 0b01, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), bcode(v[1]))
  85339. m.emit(0x73)
  85340. m.mrsd(2, addr(v[1]), 32)
  85341. m.imm1(toImmAny(v[0]))
  85342. })
  85343. }
  85344. // VPSRLQ imm8, xmm, xmm{k}{z}
  85345. if isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  85346. self.require(ISA_AVX512VL | ISA_AVX512F)
  85347. p.domain = DomainAVX
  85348. p.add(0, func(m *_Encoding, v []interface{}) {
  85349. m.emit(0x62)
  85350. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  85351. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  85352. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x00)
  85353. m.emit(0x73)
  85354. m.emit(0xd0 | lcode(v[1]))
  85355. m.imm1(toImmAny(v[0]))
  85356. })
  85357. }
  85358. // VPSRLQ xmm, xmm, xmm{k}{z}
  85359. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  85360. self.require(ISA_AVX512VL | ISA_AVX512F)
  85361. p.domain = DomainAVX
  85362. p.add(0, func(m *_Encoding, v []interface{}) {
  85363. m.emit(0x62)
  85364. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  85365. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  85366. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  85367. m.emit(0xd3)
  85368. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85369. })
  85370. }
  85371. // VPSRLQ m128, xmm, xmm{k}{z}
  85372. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  85373. self.require(ISA_AVX512VL | ISA_AVX512F)
  85374. p.domain = DomainAVX
  85375. p.add(0, func(m *_Encoding, v []interface{}) {
  85376. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  85377. m.emit(0xd3)
  85378. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  85379. })
  85380. }
  85381. // VPSRLQ imm8, ymm, ymm{k}{z}
  85382. if isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  85383. self.require(ISA_AVX512VL | ISA_AVX512F)
  85384. p.domain = DomainAVX
  85385. p.add(0, func(m *_Encoding, v []interface{}) {
  85386. m.emit(0x62)
  85387. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  85388. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  85389. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x20)
  85390. m.emit(0x73)
  85391. m.emit(0xd0 | lcode(v[1]))
  85392. m.imm1(toImmAny(v[0]))
  85393. })
  85394. }
  85395. // VPSRLQ xmm, ymm, ymm{k}{z}
  85396. if isEVEXXMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  85397. self.require(ISA_AVX512VL | ISA_AVX512F)
  85398. p.domain = DomainAVX
  85399. p.add(0, func(m *_Encoding, v []interface{}) {
  85400. m.emit(0x62)
  85401. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  85402. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  85403. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  85404. m.emit(0xd3)
  85405. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85406. })
  85407. }
  85408. // VPSRLQ m128, ymm, ymm{k}{z}
  85409. if isM128(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  85410. self.require(ISA_AVX512VL | ISA_AVX512F)
  85411. p.domain = DomainAVX
  85412. p.add(0, func(m *_Encoding, v []interface{}) {
  85413. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  85414. m.emit(0xd3)
  85415. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  85416. })
  85417. }
  85418. if p.len == 0 {
  85419. panic("invalid operands for VPSRLQ")
  85420. }
  85421. return p
  85422. }
  85423. // VPSRLVD performs "Variable Shift Packed Doubleword Data Right Logical".
  85424. //
  85425. // Mnemonic : VPSRLVD
  85426. // Supported forms : (10 forms)
  85427. //
  85428. // * VPSRLVD xmm, xmm, xmm [AVX2]
  85429. // * VPSRLVD m128, xmm, xmm [AVX2]
  85430. // * VPSRLVD ymm, ymm, ymm [AVX2]
  85431. // * VPSRLVD m256, ymm, ymm [AVX2]
  85432. // * VPSRLVD m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  85433. // * VPSRLVD zmm, zmm, zmm{k}{z} [AVX512F]
  85434. // * VPSRLVD m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  85435. // * VPSRLVD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  85436. // * VPSRLVD m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  85437. // * VPSRLVD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  85438. //
  85439. func (self *Program) VPSRLVD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  85440. p := self.alloc("VPSRLVD", 3, Operands { v0, v1, v2 })
  85441. // VPSRLVD xmm, xmm, xmm
  85442. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  85443. self.require(ISA_AVX2)
  85444. p.domain = DomainAVX
  85445. p.add(0, func(m *_Encoding, v []interface{}) {
  85446. m.emit(0xc4)
  85447. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  85448. m.emit(0x79 ^ (hlcode(v[1]) << 3))
  85449. m.emit(0x45)
  85450. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85451. })
  85452. }
  85453. // VPSRLVD m128, xmm, xmm
  85454. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  85455. self.require(ISA_AVX2)
  85456. p.domain = DomainAVX
  85457. p.add(0, func(m *_Encoding, v []interface{}) {
  85458. m.vex3(0xc4, 0b10, 0x01, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  85459. m.emit(0x45)
  85460. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  85461. })
  85462. }
  85463. // VPSRLVD ymm, ymm, ymm
  85464. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  85465. self.require(ISA_AVX2)
  85466. p.domain = DomainAVX
  85467. p.add(0, func(m *_Encoding, v []interface{}) {
  85468. m.emit(0xc4)
  85469. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  85470. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  85471. m.emit(0x45)
  85472. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85473. })
  85474. }
  85475. // VPSRLVD m256, ymm, ymm
  85476. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  85477. self.require(ISA_AVX2)
  85478. p.domain = DomainAVX
  85479. p.add(0, func(m *_Encoding, v []interface{}) {
  85480. m.vex3(0xc4, 0b10, 0x05, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  85481. m.emit(0x45)
  85482. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  85483. })
  85484. }
  85485. // VPSRLVD m512/m32bcst, zmm, zmm{k}{z}
  85486. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  85487. self.require(ISA_AVX512F)
  85488. p.domain = DomainAVX
  85489. p.add(0, func(m *_Encoding, v []interface{}) {
  85490. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  85491. m.emit(0x45)
  85492. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  85493. })
  85494. }
  85495. // VPSRLVD zmm, zmm, zmm{k}{z}
  85496. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  85497. self.require(ISA_AVX512F)
  85498. p.domain = DomainAVX
  85499. p.add(0, func(m *_Encoding, v []interface{}) {
  85500. m.emit(0x62)
  85501. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  85502. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  85503. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  85504. m.emit(0x45)
  85505. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85506. })
  85507. }
  85508. // VPSRLVD m128/m32bcst, xmm, xmm{k}{z}
  85509. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  85510. self.require(ISA_AVX512VL | ISA_AVX512F)
  85511. p.domain = DomainAVX
  85512. p.add(0, func(m *_Encoding, v []interface{}) {
  85513. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  85514. m.emit(0x45)
  85515. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  85516. })
  85517. }
  85518. // VPSRLVD xmm, xmm, xmm{k}{z}
  85519. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  85520. self.require(ISA_AVX512VL | ISA_AVX512F)
  85521. p.domain = DomainAVX
  85522. p.add(0, func(m *_Encoding, v []interface{}) {
  85523. m.emit(0x62)
  85524. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  85525. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  85526. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  85527. m.emit(0x45)
  85528. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85529. })
  85530. }
  85531. // VPSRLVD m256/m32bcst, ymm, ymm{k}{z}
  85532. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  85533. self.require(ISA_AVX512VL | ISA_AVX512F)
  85534. p.domain = DomainAVX
  85535. p.add(0, func(m *_Encoding, v []interface{}) {
  85536. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  85537. m.emit(0x45)
  85538. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  85539. })
  85540. }
  85541. // VPSRLVD ymm, ymm, ymm{k}{z}
  85542. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  85543. self.require(ISA_AVX512VL | ISA_AVX512F)
  85544. p.domain = DomainAVX
  85545. p.add(0, func(m *_Encoding, v []interface{}) {
  85546. m.emit(0x62)
  85547. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  85548. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  85549. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  85550. m.emit(0x45)
  85551. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85552. })
  85553. }
  85554. if p.len == 0 {
  85555. panic("invalid operands for VPSRLVD")
  85556. }
  85557. return p
  85558. }
  85559. // VPSRLVQ performs "Variable Shift Packed Quadword Data Right Logical".
  85560. //
  85561. // Mnemonic : VPSRLVQ
  85562. // Supported forms : (10 forms)
  85563. //
  85564. // * VPSRLVQ xmm, xmm, xmm [AVX2]
  85565. // * VPSRLVQ m128, xmm, xmm [AVX2]
  85566. // * VPSRLVQ ymm, ymm, ymm [AVX2]
  85567. // * VPSRLVQ m256, ymm, ymm [AVX2]
  85568. // * VPSRLVQ m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  85569. // * VPSRLVQ zmm, zmm, zmm{k}{z} [AVX512F]
  85570. // * VPSRLVQ m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  85571. // * VPSRLVQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  85572. // * VPSRLVQ m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  85573. // * VPSRLVQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  85574. //
  85575. func (self *Program) VPSRLVQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  85576. p := self.alloc("VPSRLVQ", 3, Operands { v0, v1, v2 })
  85577. // VPSRLVQ xmm, xmm, xmm
  85578. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  85579. self.require(ISA_AVX2)
  85580. p.domain = DomainAVX
  85581. p.add(0, func(m *_Encoding, v []interface{}) {
  85582. m.emit(0xc4)
  85583. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  85584. m.emit(0xf9 ^ (hlcode(v[1]) << 3))
  85585. m.emit(0x45)
  85586. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85587. })
  85588. }
  85589. // VPSRLVQ m128, xmm, xmm
  85590. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  85591. self.require(ISA_AVX2)
  85592. p.domain = DomainAVX
  85593. p.add(0, func(m *_Encoding, v []interface{}) {
  85594. m.vex3(0xc4, 0b10, 0x81, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  85595. m.emit(0x45)
  85596. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  85597. })
  85598. }
  85599. // VPSRLVQ ymm, ymm, ymm
  85600. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  85601. self.require(ISA_AVX2)
  85602. p.domain = DomainAVX
  85603. p.add(0, func(m *_Encoding, v []interface{}) {
  85604. m.emit(0xc4)
  85605. m.emit(0xe2 ^ (hcode(v[2]) << 7) ^ (hcode(v[0]) << 5))
  85606. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  85607. m.emit(0x45)
  85608. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85609. })
  85610. }
  85611. // VPSRLVQ m256, ymm, ymm
  85612. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  85613. self.require(ISA_AVX2)
  85614. p.domain = DomainAVX
  85615. p.add(0, func(m *_Encoding, v []interface{}) {
  85616. m.vex3(0xc4, 0b10, 0x85, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  85617. m.emit(0x45)
  85618. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  85619. })
  85620. }
  85621. // VPSRLVQ m512/m64bcst, zmm, zmm{k}{z}
  85622. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  85623. self.require(ISA_AVX512F)
  85624. p.domain = DomainAVX
  85625. p.add(0, func(m *_Encoding, v []interface{}) {
  85626. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  85627. m.emit(0x45)
  85628. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  85629. })
  85630. }
  85631. // VPSRLVQ zmm, zmm, zmm{k}{z}
  85632. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  85633. self.require(ISA_AVX512F)
  85634. p.domain = DomainAVX
  85635. p.add(0, func(m *_Encoding, v []interface{}) {
  85636. m.emit(0x62)
  85637. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  85638. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  85639. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  85640. m.emit(0x45)
  85641. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85642. })
  85643. }
  85644. // VPSRLVQ m128/m64bcst, xmm, xmm{k}{z}
  85645. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  85646. self.require(ISA_AVX512VL | ISA_AVX512F)
  85647. p.domain = DomainAVX
  85648. p.add(0, func(m *_Encoding, v []interface{}) {
  85649. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  85650. m.emit(0x45)
  85651. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  85652. })
  85653. }
  85654. // VPSRLVQ xmm, xmm, xmm{k}{z}
  85655. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  85656. self.require(ISA_AVX512VL | ISA_AVX512F)
  85657. p.domain = DomainAVX
  85658. p.add(0, func(m *_Encoding, v []interface{}) {
  85659. m.emit(0x62)
  85660. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  85661. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  85662. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  85663. m.emit(0x45)
  85664. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85665. })
  85666. }
  85667. // VPSRLVQ m256/m64bcst, ymm, ymm{k}{z}
  85668. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  85669. self.require(ISA_AVX512VL | ISA_AVX512F)
  85670. p.domain = DomainAVX
  85671. p.add(0, func(m *_Encoding, v []interface{}) {
  85672. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  85673. m.emit(0x45)
  85674. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  85675. })
  85676. }
  85677. // VPSRLVQ ymm, ymm, ymm{k}{z}
  85678. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  85679. self.require(ISA_AVX512VL | ISA_AVX512F)
  85680. p.domain = DomainAVX
  85681. p.add(0, func(m *_Encoding, v []interface{}) {
  85682. m.emit(0x62)
  85683. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  85684. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  85685. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  85686. m.emit(0x45)
  85687. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85688. })
  85689. }
  85690. if p.len == 0 {
  85691. panic("invalid operands for VPSRLVQ")
  85692. }
  85693. return p
  85694. }
  85695. // VPSRLVW performs "Variable Shift Packed Word Data Right Logical".
  85696. //
  85697. // Mnemonic : VPSRLVW
  85698. // Supported forms : (6 forms)
  85699. //
  85700. // * VPSRLVW zmm, zmm, zmm{k}{z} [AVX512BW]
  85701. // * VPSRLVW m512, zmm, zmm{k}{z} [AVX512BW]
  85702. // * VPSRLVW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  85703. // * VPSRLVW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  85704. // * VPSRLVW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  85705. // * VPSRLVW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  85706. //
  85707. func (self *Program) VPSRLVW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  85708. p := self.alloc("VPSRLVW", 3, Operands { v0, v1, v2 })
  85709. // VPSRLVW zmm, zmm, zmm{k}{z}
  85710. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  85711. self.require(ISA_AVX512BW)
  85712. p.domain = DomainAVX
  85713. p.add(0, func(m *_Encoding, v []interface{}) {
  85714. m.emit(0x62)
  85715. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  85716. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  85717. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  85718. m.emit(0x10)
  85719. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85720. })
  85721. }
  85722. // VPSRLVW m512, zmm, zmm{k}{z}
  85723. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  85724. self.require(ISA_AVX512BW)
  85725. p.domain = DomainAVX
  85726. p.add(0, func(m *_Encoding, v []interface{}) {
  85727. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  85728. m.emit(0x10)
  85729. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  85730. })
  85731. }
  85732. // VPSRLVW xmm, xmm, xmm{k}{z}
  85733. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  85734. self.require(ISA_AVX512VL | ISA_AVX512BW)
  85735. p.domain = DomainAVX
  85736. p.add(0, func(m *_Encoding, v []interface{}) {
  85737. m.emit(0x62)
  85738. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  85739. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  85740. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  85741. m.emit(0x10)
  85742. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85743. })
  85744. }
  85745. // VPSRLVW m128, xmm, xmm{k}{z}
  85746. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  85747. self.require(ISA_AVX512VL | ISA_AVX512BW)
  85748. p.domain = DomainAVX
  85749. p.add(0, func(m *_Encoding, v []interface{}) {
  85750. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  85751. m.emit(0x10)
  85752. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  85753. })
  85754. }
  85755. // VPSRLVW ymm, ymm, ymm{k}{z}
  85756. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  85757. self.require(ISA_AVX512VL | ISA_AVX512BW)
  85758. p.domain = DomainAVX
  85759. p.add(0, func(m *_Encoding, v []interface{}) {
  85760. m.emit(0x62)
  85761. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  85762. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  85763. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  85764. m.emit(0x10)
  85765. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85766. })
  85767. }
  85768. // VPSRLVW m256, ymm, ymm{k}{z}
  85769. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  85770. self.require(ISA_AVX512VL | ISA_AVX512BW)
  85771. p.domain = DomainAVX
  85772. p.add(0, func(m *_Encoding, v []interface{}) {
  85773. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  85774. m.emit(0x10)
  85775. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  85776. })
  85777. }
  85778. if p.len == 0 {
  85779. panic("invalid operands for VPSRLVW")
  85780. }
  85781. return p
  85782. }
  85783. // VPSRLW performs "Shift Packed Word Data Right Logical".
  85784. //
  85785. // Mnemonic : VPSRLW
  85786. // Supported forms : (18 forms)
  85787. //
  85788. // * VPSRLW imm8, xmm, xmm [AVX]
  85789. // * VPSRLW xmm, xmm, xmm [AVX]
  85790. // * VPSRLW m128, xmm, xmm [AVX]
  85791. // * VPSRLW imm8, ymm, ymm [AVX2]
  85792. // * VPSRLW xmm, ymm, ymm [AVX2]
  85793. // * VPSRLW m128, ymm, ymm [AVX2]
  85794. // * VPSRLW imm8, zmm, zmm{k}{z} [AVX512BW]
  85795. // * VPSRLW xmm, zmm, zmm{k}{z} [AVX512BW]
  85796. // * VPSRLW m128, zmm, zmm{k}{z} [AVX512BW]
  85797. // * VPSRLW imm8, m512, zmm{k}{z} [AVX512BW]
  85798. // * VPSRLW imm8, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  85799. // * VPSRLW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  85800. // * VPSRLW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  85801. // * VPSRLW imm8, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  85802. // * VPSRLW xmm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  85803. // * VPSRLW m128, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  85804. // * VPSRLW imm8, m128, xmm{k}{z} [AVX512BW,AVX512VL]
  85805. // * VPSRLW imm8, m256, ymm{k}{z} [AVX512BW,AVX512VL]
  85806. //
  85807. func (self *Program) VPSRLW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  85808. p := self.alloc("VPSRLW", 3, Operands { v0, v1, v2 })
  85809. // VPSRLW imm8, xmm, xmm
  85810. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  85811. self.require(ISA_AVX)
  85812. p.domain = DomainAVX
  85813. p.add(0, func(m *_Encoding, v []interface{}) {
  85814. m.vex2(1, 0, v[1], hlcode(v[2]))
  85815. m.emit(0x71)
  85816. m.emit(0xd0 | lcode(v[1]))
  85817. m.imm1(toImmAny(v[0]))
  85818. })
  85819. }
  85820. // VPSRLW xmm, xmm, xmm
  85821. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  85822. self.require(ISA_AVX)
  85823. p.domain = DomainAVX
  85824. p.add(0, func(m *_Encoding, v []interface{}) {
  85825. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  85826. m.emit(0xd1)
  85827. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85828. })
  85829. }
  85830. // VPSRLW m128, xmm, xmm
  85831. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  85832. self.require(ISA_AVX)
  85833. p.domain = DomainAVX
  85834. p.add(0, func(m *_Encoding, v []interface{}) {
  85835. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  85836. m.emit(0xd1)
  85837. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  85838. })
  85839. }
  85840. // VPSRLW imm8, ymm, ymm
  85841. if isImm8(v0) && isYMM(v1) && isYMM(v2) {
  85842. self.require(ISA_AVX2)
  85843. p.domain = DomainAVX
  85844. p.add(0, func(m *_Encoding, v []interface{}) {
  85845. m.vex2(5, 0, v[1], hlcode(v[2]))
  85846. m.emit(0x71)
  85847. m.emit(0xd0 | lcode(v[1]))
  85848. m.imm1(toImmAny(v[0]))
  85849. })
  85850. }
  85851. // VPSRLW xmm, ymm, ymm
  85852. if isXMM(v0) && isYMM(v1) && isYMM(v2) {
  85853. self.require(ISA_AVX2)
  85854. p.domain = DomainAVX
  85855. p.add(0, func(m *_Encoding, v []interface{}) {
  85856. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  85857. m.emit(0xd1)
  85858. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85859. })
  85860. }
  85861. // VPSRLW m128, ymm, ymm
  85862. if isM128(v0) && isYMM(v1) && isYMM(v2) {
  85863. self.require(ISA_AVX2)
  85864. p.domain = DomainAVX
  85865. p.add(0, func(m *_Encoding, v []interface{}) {
  85866. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  85867. m.emit(0xd1)
  85868. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  85869. })
  85870. }
  85871. // VPSRLW imm8, zmm, zmm{k}{z}
  85872. if isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  85873. self.require(ISA_AVX512BW)
  85874. p.domain = DomainAVX
  85875. p.add(0, func(m *_Encoding, v []interface{}) {
  85876. m.emit(0x62)
  85877. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  85878. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  85879. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x40)
  85880. m.emit(0x71)
  85881. m.emit(0xd0 | lcode(v[1]))
  85882. m.imm1(toImmAny(v[0]))
  85883. })
  85884. }
  85885. // VPSRLW xmm, zmm, zmm{k}{z}
  85886. if isEVEXXMM(v0) && isZMM(v1) && isZMMkz(v2) {
  85887. self.require(ISA_AVX512BW)
  85888. p.domain = DomainAVX
  85889. p.add(0, func(m *_Encoding, v []interface{}) {
  85890. m.emit(0x62)
  85891. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  85892. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  85893. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  85894. m.emit(0xd1)
  85895. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85896. })
  85897. }
  85898. // VPSRLW m128, zmm, zmm{k}{z}
  85899. if isM128(v0) && isZMM(v1) && isZMMkz(v2) {
  85900. self.require(ISA_AVX512BW)
  85901. p.domain = DomainAVX
  85902. p.add(0, func(m *_Encoding, v []interface{}) {
  85903. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  85904. m.emit(0xd1)
  85905. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  85906. })
  85907. }
  85908. // VPSRLW imm8, m512, zmm{k}{z}
  85909. if isImm8(v0) && isM512(v1) && isZMMkz(v2) {
  85910. self.require(ISA_AVX512BW)
  85911. p.domain = DomainAVX
  85912. p.add(0, func(m *_Encoding, v []interface{}) {
  85913. m.evex(0b01, 0x05, 0b10, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), 0)
  85914. m.emit(0x71)
  85915. m.mrsd(2, addr(v[1]), 64)
  85916. m.imm1(toImmAny(v[0]))
  85917. })
  85918. }
  85919. // VPSRLW imm8, xmm, xmm{k}{z}
  85920. if isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  85921. self.require(ISA_AVX512VL | ISA_AVX512BW)
  85922. p.domain = DomainAVX
  85923. p.add(0, func(m *_Encoding, v []interface{}) {
  85924. m.emit(0x62)
  85925. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  85926. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  85927. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x00)
  85928. m.emit(0x71)
  85929. m.emit(0xd0 | lcode(v[1]))
  85930. m.imm1(toImmAny(v[0]))
  85931. })
  85932. }
  85933. // VPSRLW xmm, xmm, xmm{k}{z}
  85934. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  85935. self.require(ISA_AVX512VL | ISA_AVX512BW)
  85936. p.domain = DomainAVX
  85937. p.add(0, func(m *_Encoding, v []interface{}) {
  85938. m.emit(0x62)
  85939. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  85940. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  85941. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  85942. m.emit(0xd1)
  85943. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85944. })
  85945. }
  85946. // VPSRLW m128, xmm, xmm{k}{z}
  85947. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  85948. self.require(ISA_AVX512VL | ISA_AVX512BW)
  85949. p.domain = DomainAVX
  85950. p.add(0, func(m *_Encoding, v []interface{}) {
  85951. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  85952. m.emit(0xd1)
  85953. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  85954. })
  85955. }
  85956. // VPSRLW imm8, ymm, ymm{k}{z}
  85957. if isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  85958. self.require(ISA_AVX512VL | ISA_AVX512BW)
  85959. p.domain = DomainAVX
  85960. p.add(0, func(m *_Encoding, v []interface{}) {
  85961. m.emit(0x62)
  85962. m.emit(0xf1 ^ (ehcode(v[1]) << 5))
  85963. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  85964. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[2]) | 0x20)
  85965. m.emit(0x71)
  85966. m.emit(0xd0 | lcode(v[1]))
  85967. m.imm1(toImmAny(v[0]))
  85968. })
  85969. }
  85970. // VPSRLW xmm, ymm, ymm{k}{z}
  85971. if isEVEXXMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  85972. self.require(ISA_AVX512VL | ISA_AVX512BW)
  85973. p.domain = DomainAVX
  85974. p.add(0, func(m *_Encoding, v []interface{}) {
  85975. m.emit(0x62)
  85976. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  85977. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  85978. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  85979. m.emit(0xd1)
  85980. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  85981. })
  85982. }
  85983. // VPSRLW m128, ymm, ymm{k}{z}
  85984. if isM128(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  85985. self.require(ISA_AVX512VL | ISA_AVX512BW)
  85986. p.domain = DomainAVX
  85987. p.add(0, func(m *_Encoding, v []interface{}) {
  85988. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  85989. m.emit(0xd1)
  85990. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  85991. })
  85992. }
  85993. // VPSRLW imm8, m128, xmm{k}{z}
  85994. if isImm8(v0) && isM128(v1) && isXMMkz(v2) {
  85995. self.require(ISA_AVX512VL | ISA_AVX512BW)
  85996. p.domain = DomainAVX
  85997. p.add(0, func(m *_Encoding, v []interface{}) {
  85998. m.evex(0b01, 0x05, 0b00, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), 0)
  85999. m.emit(0x71)
  86000. m.mrsd(2, addr(v[1]), 16)
  86001. m.imm1(toImmAny(v[0]))
  86002. })
  86003. }
  86004. // VPSRLW imm8, m256, ymm{k}{z}
  86005. if isImm8(v0) && isM256(v1) && isYMMkz(v2) {
  86006. self.require(ISA_AVX512VL | ISA_AVX512BW)
  86007. p.domain = DomainAVX
  86008. p.add(0, func(m *_Encoding, v []interface{}) {
  86009. m.evex(0b01, 0x05, 0b01, 0, addr(v[1]), vcode(v[2]), kcode(v[2]), zcode(v[2]), 0)
  86010. m.emit(0x71)
  86011. m.mrsd(2, addr(v[1]), 32)
  86012. m.imm1(toImmAny(v[0]))
  86013. })
  86014. }
  86015. if p.len == 0 {
  86016. panic("invalid operands for VPSRLW")
  86017. }
  86018. return p
  86019. }
  86020. // VPSUBB performs "Subtract Packed Byte Integers".
  86021. //
  86022. // Mnemonic : VPSUBB
  86023. // Supported forms : (10 forms)
  86024. //
  86025. // * VPSUBB xmm, xmm, xmm [AVX]
  86026. // * VPSUBB m128, xmm, xmm [AVX]
  86027. // * VPSUBB ymm, ymm, ymm [AVX2]
  86028. // * VPSUBB m256, ymm, ymm [AVX2]
  86029. // * VPSUBB zmm, zmm, zmm{k}{z} [AVX512BW]
  86030. // * VPSUBB m512, zmm, zmm{k}{z} [AVX512BW]
  86031. // * VPSUBB xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  86032. // * VPSUBB m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  86033. // * VPSUBB ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  86034. // * VPSUBB m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  86035. //
  86036. func (self *Program) VPSUBB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  86037. p := self.alloc("VPSUBB", 3, Operands { v0, v1, v2 })
  86038. // VPSUBB xmm, xmm, xmm
  86039. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  86040. self.require(ISA_AVX)
  86041. p.domain = DomainAVX
  86042. p.add(0, func(m *_Encoding, v []interface{}) {
  86043. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  86044. m.emit(0xf8)
  86045. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86046. })
  86047. }
  86048. // VPSUBB m128, xmm, xmm
  86049. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  86050. self.require(ISA_AVX)
  86051. p.domain = DomainAVX
  86052. p.add(0, func(m *_Encoding, v []interface{}) {
  86053. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  86054. m.emit(0xf8)
  86055. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  86056. })
  86057. }
  86058. // VPSUBB ymm, ymm, ymm
  86059. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  86060. self.require(ISA_AVX2)
  86061. p.domain = DomainAVX
  86062. p.add(0, func(m *_Encoding, v []interface{}) {
  86063. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  86064. m.emit(0xf8)
  86065. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86066. })
  86067. }
  86068. // VPSUBB m256, ymm, ymm
  86069. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  86070. self.require(ISA_AVX2)
  86071. p.domain = DomainAVX
  86072. p.add(0, func(m *_Encoding, v []interface{}) {
  86073. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  86074. m.emit(0xf8)
  86075. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  86076. })
  86077. }
  86078. // VPSUBB zmm, zmm, zmm{k}{z}
  86079. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  86080. self.require(ISA_AVX512BW)
  86081. p.domain = DomainAVX
  86082. p.add(0, func(m *_Encoding, v []interface{}) {
  86083. m.emit(0x62)
  86084. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  86085. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  86086. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  86087. m.emit(0xf8)
  86088. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86089. })
  86090. }
  86091. // VPSUBB m512, zmm, zmm{k}{z}
  86092. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  86093. self.require(ISA_AVX512BW)
  86094. p.domain = DomainAVX
  86095. p.add(0, func(m *_Encoding, v []interface{}) {
  86096. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  86097. m.emit(0xf8)
  86098. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  86099. })
  86100. }
  86101. // VPSUBB xmm, xmm, xmm{k}{z}
  86102. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  86103. self.require(ISA_AVX512VL | ISA_AVX512BW)
  86104. p.domain = DomainAVX
  86105. p.add(0, func(m *_Encoding, v []interface{}) {
  86106. m.emit(0x62)
  86107. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  86108. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  86109. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  86110. m.emit(0xf8)
  86111. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86112. })
  86113. }
  86114. // VPSUBB m128, xmm, xmm{k}{z}
  86115. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  86116. self.require(ISA_AVX512VL | ISA_AVX512BW)
  86117. p.domain = DomainAVX
  86118. p.add(0, func(m *_Encoding, v []interface{}) {
  86119. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  86120. m.emit(0xf8)
  86121. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  86122. })
  86123. }
  86124. // VPSUBB ymm, ymm, ymm{k}{z}
  86125. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  86126. self.require(ISA_AVX512VL | ISA_AVX512BW)
  86127. p.domain = DomainAVX
  86128. p.add(0, func(m *_Encoding, v []interface{}) {
  86129. m.emit(0x62)
  86130. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  86131. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  86132. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  86133. m.emit(0xf8)
  86134. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86135. })
  86136. }
  86137. // VPSUBB m256, ymm, ymm{k}{z}
  86138. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  86139. self.require(ISA_AVX512VL | ISA_AVX512BW)
  86140. p.domain = DomainAVX
  86141. p.add(0, func(m *_Encoding, v []interface{}) {
  86142. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  86143. m.emit(0xf8)
  86144. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  86145. })
  86146. }
  86147. if p.len == 0 {
  86148. panic("invalid operands for VPSUBB")
  86149. }
  86150. return p
  86151. }
  86152. // VPSUBD performs "Subtract Packed Doubleword Integers".
  86153. //
  86154. // Mnemonic : VPSUBD
  86155. // Supported forms : (10 forms)
  86156. //
  86157. // * VPSUBD xmm, xmm, xmm [AVX]
  86158. // * VPSUBD m128, xmm, xmm [AVX]
  86159. // * VPSUBD ymm, ymm, ymm [AVX2]
  86160. // * VPSUBD m256, ymm, ymm [AVX2]
  86161. // * VPSUBD m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  86162. // * VPSUBD zmm, zmm, zmm{k}{z} [AVX512F]
  86163. // * VPSUBD m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  86164. // * VPSUBD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  86165. // * VPSUBD m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  86166. // * VPSUBD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  86167. //
  86168. func (self *Program) VPSUBD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  86169. p := self.alloc("VPSUBD", 3, Operands { v0, v1, v2 })
  86170. // VPSUBD xmm, xmm, xmm
  86171. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  86172. self.require(ISA_AVX)
  86173. p.domain = DomainAVX
  86174. p.add(0, func(m *_Encoding, v []interface{}) {
  86175. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  86176. m.emit(0xfa)
  86177. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86178. })
  86179. }
  86180. // VPSUBD m128, xmm, xmm
  86181. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  86182. self.require(ISA_AVX)
  86183. p.domain = DomainAVX
  86184. p.add(0, func(m *_Encoding, v []interface{}) {
  86185. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  86186. m.emit(0xfa)
  86187. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  86188. })
  86189. }
  86190. // VPSUBD ymm, ymm, ymm
  86191. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  86192. self.require(ISA_AVX2)
  86193. p.domain = DomainAVX
  86194. p.add(0, func(m *_Encoding, v []interface{}) {
  86195. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  86196. m.emit(0xfa)
  86197. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86198. })
  86199. }
  86200. // VPSUBD m256, ymm, ymm
  86201. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  86202. self.require(ISA_AVX2)
  86203. p.domain = DomainAVX
  86204. p.add(0, func(m *_Encoding, v []interface{}) {
  86205. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  86206. m.emit(0xfa)
  86207. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  86208. })
  86209. }
  86210. // VPSUBD m512/m32bcst, zmm, zmm{k}{z}
  86211. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  86212. self.require(ISA_AVX512F)
  86213. p.domain = DomainAVX
  86214. p.add(0, func(m *_Encoding, v []interface{}) {
  86215. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  86216. m.emit(0xfa)
  86217. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  86218. })
  86219. }
  86220. // VPSUBD zmm, zmm, zmm{k}{z}
  86221. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  86222. self.require(ISA_AVX512F)
  86223. p.domain = DomainAVX
  86224. p.add(0, func(m *_Encoding, v []interface{}) {
  86225. m.emit(0x62)
  86226. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  86227. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  86228. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  86229. m.emit(0xfa)
  86230. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86231. })
  86232. }
  86233. // VPSUBD m128/m32bcst, xmm, xmm{k}{z}
  86234. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  86235. self.require(ISA_AVX512VL | ISA_AVX512F)
  86236. p.domain = DomainAVX
  86237. p.add(0, func(m *_Encoding, v []interface{}) {
  86238. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  86239. m.emit(0xfa)
  86240. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  86241. })
  86242. }
  86243. // VPSUBD xmm, xmm, xmm{k}{z}
  86244. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  86245. self.require(ISA_AVX512VL | ISA_AVX512F)
  86246. p.domain = DomainAVX
  86247. p.add(0, func(m *_Encoding, v []interface{}) {
  86248. m.emit(0x62)
  86249. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  86250. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  86251. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  86252. m.emit(0xfa)
  86253. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86254. })
  86255. }
  86256. // VPSUBD m256/m32bcst, ymm, ymm{k}{z}
  86257. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  86258. self.require(ISA_AVX512VL | ISA_AVX512F)
  86259. p.domain = DomainAVX
  86260. p.add(0, func(m *_Encoding, v []interface{}) {
  86261. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  86262. m.emit(0xfa)
  86263. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  86264. })
  86265. }
  86266. // VPSUBD ymm, ymm, ymm{k}{z}
  86267. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  86268. self.require(ISA_AVX512VL | ISA_AVX512F)
  86269. p.domain = DomainAVX
  86270. p.add(0, func(m *_Encoding, v []interface{}) {
  86271. m.emit(0x62)
  86272. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  86273. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  86274. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  86275. m.emit(0xfa)
  86276. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86277. })
  86278. }
  86279. if p.len == 0 {
  86280. panic("invalid operands for VPSUBD")
  86281. }
  86282. return p
  86283. }
  86284. // VPSUBQ performs "Subtract Packed Quadword Integers".
  86285. //
  86286. // Mnemonic : VPSUBQ
  86287. // Supported forms : (10 forms)
  86288. //
  86289. // * VPSUBQ xmm, xmm, xmm [AVX]
  86290. // * VPSUBQ m128, xmm, xmm [AVX]
  86291. // * VPSUBQ ymm, ymm, ymm [AVX2]
  86292. // * VPSUBQ m256, ymm, ymm [AVX2]
  86293. // * VPSUBQ m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  86294. // * VPSUBQ zmm, zmm, zmm{k}{z} [AVX512F]
  86295. // * VPSUBQ m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  86296. // * VPSUBQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  86297. // * VPSUBQ m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  86298. // * VPSUBQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  86299. //
  86300. func (self *Program) VPSUBQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  86301. p := self.alloc("VPSUBQ", 3, Operands { v0, v1, v2 })
  86302. // VPSUBQ xmm, xmm, xmm
  86303. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  86304. self.require(ISA_AVX)
  86305. p.domain = DomainAVX
  86306. p.add(0, func(m *_Encoding, v []interface{}) {
  86307. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  86308. m.emit(0xfb)
  86309. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86310. })
  86311. }
  86312. // VPSUBQ m128, xmm, xmm
  86313. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  86314. self.require(ISA_AVX)
  86315. p.domain = DomainAVX
  86316. p.add(0, func(m *_Encoding, v []interface{}) {
  86317. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  86318. m.emit(0xfb)
  86319. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  86320. })
  86321. }
  86322. // VPSUBQ ymm, ymm, ymm
  86323. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  86324. self.require(ISA_AVX2)
  86325. p.domain = DomainAVX
  86326. p.add(0, func(m *_Encoding, v []interface{}) {
  86327. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  86328. m.emit(0xfb)
  86329. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86330. })
  86331. }
  86332. // VPSUBQ m256, ymm, ymm
  86333. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  86334. self.require(ISA_AVX2)
  86335. p.domain = DomainAVX
  86336. p.add(0, func(m *_Encoding, v []interface{}) {
  86337. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  86338. m.emit(0xfb)
  86339. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  86340. })
  86341. }
  86342. // VPSUBQ m512/m64bcst, zmm, zmm{k}{z}
  86343. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  86344. self.require(ISA_AVX512F)
  86345. p.domain = DomainAVX
  86346. p.add(0, func(m *_Encoding, v []interface{}) {
  86347. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  86348. m.emit(0xfb)
  86349. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  86350. })
  86351. }
  86352. // VPSUBQ zmm, zmm, zmm{k}{z}
  86353. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  86354. self.require(ISA_AVX512F)
  86355. p.domain = DomainAVX
  86356. p.add(0, func(m *_Encoding, v []interface{}) {
  86357. m.emit(0x62)
  86358. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  86359. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  86360. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  86361. m.emit(0xfb)
  86362. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86363. })
  86364. }
  86365. // VPSUBQ m128/m64bcst, xmm, xmm{k}{z}
  86366. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  86367. self.require(ISA_AVX512VL | ISA_AVX512F)
  86368. p.domain = DomainAVX
  86369. p.add(0, func(m *_Encoding, v []interface{}) {
  86370. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  86371. m.emit(0xfb)
  86372. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  86373. })
  86374. }
  86375. // VPSUBQ xmm, xmm, xmm{k}{z}
  86376. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  86377. self.require(ISA_AVX512VL | ISA_AVX512F)
  86378. p.domain = DomainAVX
  86379. p.add(0, func(m *_Encoding, v []interface{}) {
  86380. m.emit(0x62)
  86381. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  86382. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  86383. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  86384. m.emit(0xfb)
  86385. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86386. })
  86387. }
  86388. // VPSUBQ m256/m64bcst, ymm, ymm{k}{z}
  86389. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  86390. self.require(ISA_AVX512VL | ISA_AVX512F)
  86391. p.domain = DomainAVX
  86392. p.add(0, func(m *_Encoding, v []interface{}) {
  86393. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  86394. m.emit(0xfb)
  86395. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  86396. })
  86397. }
  86398. // VPSUBQ ymm, ymm, ymm{k}{z}
  86399. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  86400. self.require(ISA_AVX512VL | ISA_AVX512F)
  86401. p.domain = DomainAVX
  86402. p.add(0, func(m *_Encoding, v []interface{}) {
  86403. m.emit(0x62)
  86404. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  86405. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  86406. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  86407. m.emit(0xfb)
  86408. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86409. })
  86410. }
  86411. if p.len == 0 {
  86412. panic("invalid operands for VPSUBQ")
  86413. }
  86414. return p
  86415. }
  86416. // VPSUBSB performs "Subtract Packed Signed Byte Integers with Signed Saturation".
  86417. //
  86418. // Mnemonic : VPSUBSB
  86419. // Supported forms : (10 forms)
  86420. //
  86421. // * VPSUBSB xmm, xmm, xmm [AVX]
  86422. // * VPSUBSB m128, xmm, xmm [AVX]
  86423. // * VPSUBSB ymm, ymm, ymm [AVX2]
  86424. // * VPSUBSB m256, ymm, ymm [AVX2]
  86425. // * VPSUBSB zmm, zmm, zmm{k}{z} [AVX512BW]
  86426. // * VPSUBSB m512, zmm, zmm{k}{z} [AVX512BW]
  86427. // * VPSUBSB xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  86428. // * VPSUBSB m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  86429. // * VPSUBSB ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  86430. // * VPSUBSB m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  86431. //
  86432. func (self *Program) VPSUBSB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  86433. p := self.alloc("VPSUBSB", 3, Operands { v0, v1, v2 })
  86434. // VPSUBSB xmm, xmm, xmm
  86435. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  86436. self.require(ISA_AVX)
  86437. p.domain = DomainAVX
  86438. p.add(0, func(m *_Encoding, v []interface{}) {
  86439. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  86440. m.emit(0xe8)
  86441. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86442. })
  86443. }
  86444. // VPSUBSB m128, xmm, xmm
  86445. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  86446. self.require(ISA_AVX)
  86447. p.domain = DomainAVX
  86448. p.add(0, func(m *_Encoding, v []interface{}) {
  86449. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  86450. m.emit(0xe8)
  86451. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  86452. })
  86453. }
  86454. // VPSUBSB ymm, ymm, ymm
  86455. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  86456. self.require(ISA_AVX2)
  86457. p.domain = DomainAVX
  86458. p.add(0, func(m *_Encoding, v []interface{}) {
  86459. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  86460. m.emit(0xe8)
  86461. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86462. })
  86463. }
  86464. // VPSUBSB m256, ymm, ymm
  86465. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  86466. self.require(ISA_AVX2)
  86467. p.domain = DomainAVX
  86468. p.add(0, func(m *_Encoding, v []interface{}) {
  86469. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  86470. m.emit(0xe8)
  86471. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  86472. })
  86473. }
  86474. // VPSUBSB zmm, zmm, zmm{k}{z}
  86475. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  86476. self.require(ISA_AVX512BW)
  86477. p.domain = DomainAVX
  86478. p.add(0, func(m *_Encoding, v []interface{}) {
  86479. m.emit(0x62)
  86480. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  86481. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  86482. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  86483. m.emit(0xe8)
  86484. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86485. })
  86486. }
  86487. // VPSUBSB m512, zmm, zmm{k}{z}
  86488. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  86489. self.require(ISA_AVX512BW)
  86490. p.domain = DomainAVX
  86491. p.add(0, func(m *_Encoding, v []interface{}) {
  86492. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  86493. m.emit(0xe8)
  86494. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  86495. })
  86496. }
  86497. // VPSUBSB xmm, xmm, xmm{k}{z}
  86498. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  86499. self.require(ISA_AVX512VL | ISA_AVX512BW)
  86500. p.domain = DomainAVX
  86501. p.add(0, func(m *_Encoding, v []interface{}) {
  86502. m.emit(0x62)
  86503. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  86504. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  86505. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  86506. m.emit(0xe8)
  86507. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86508. })
  86509. }
  86510. // VPSUBSB m128, xmm, xmm{k}{z}
  86511. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  86512. self.require(ISA_AVX512VL | ISA_AVX512BW)
  86513. p.domain = DomainAVX
  86514. p.add(0, func(m *_Encoding, v []interface{}) {
  86515. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  86516. m.emit(0xe8)
  86517. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  86518. })
  86519. }
  86520. // VPSUBSB ymm, ymm, ymm{k}{z}
  86521. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  86522. self.require(ISA_AVX512VL | ISA_AVX512BW)
  86523. p.domain = DomainAVX
  86524. p.add(0, func(m *_Encoding, v []interface{}) {
  86525. m.emit(0x62)
  86526. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  86527. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  86528. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  86529. m.emit(0xe8)
  86530. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86531. })
  86532. }
  86533. // VPSUBSB m256, ymm, ymm{k}{z}
  86534. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  86535. self.require(ISA_AVX512VL | ISA_AVX512BW)
  86536. p.domain = DomainAVX
  86537. p.add(0, func(m *_Encoding, v []interface{}) {
  86538. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  86539. m.emit(0xe8)
  86540. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  86541. })
  86542. }
  86543. if p.len == 0 {
  86544. panic("invalid operands for VPSUBSB")
  86545. }
  86546. return p
  86547. }
  86548. // VPSUBSW performs "Subtract Packed Signed Word Integers with Signed Saturation".
  86549. //
  86550. // Mnemonic : VPSUBSW
  86551. // Supported forms : (10 forms)
  86552. //
  86553. // * VPSUBSW xmm, xmm, xmm [AVX]
  86554. // * VPSUBSW m128, xmm, xmm [AVX]
  86555. // * VPSUBSW ymm, ymm, ymm [AVX2]
  86556. // * VPSUBSW m256, ymm, ymm [AVX2]
  86557. // * VPSUBSW zmm, zmm, zmm{k}{z} [AVX512BW]
  86558. // * VPSUBSW m512, zmm, zmm{k}{z} [AVX512BW]
  86559. // * VPSUBSW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  86560. // * VPSUBSW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  86561. // * VPSUBSW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  86562. // * VPSUBSW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  86563. //
  86564. func (self *Program) VPSUBSW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  86565. p := self.alloc("VPSUBSW", 3, Operands { v0, v1, v2 })
  86566. // VPSUBSW xmm, xmm, xmm
  86567. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  86568. self.require(ISA_AVX)
  86569. p.domain = DomainAVX
  86570. p.add(0, func(m *_Encoding, v []interface{}) {
  86571. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  86572. m.emit(0xe9)
  86573. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86574. })
  86575. }
  86576. // VPSUBSW m128, xmm, xmm
  86577. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  86578. self.require(ISA_AVX)
  86579. p.domain = DomainAVX
  86580. p.add(0, func(m *_Encoding, v []interface{}) {
  86581. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  86582. m.emit(0xe9)
  86583. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  86584. })
  86585. }
  86586. // VPSUBSW ymm, ymm, ymm
  86587. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  86588. self.require(ISA_AVX2)
  86589. p.domain = DomainAVX
  86590. p.add(0, func(m *_Encoding, v []interface{}) {
  86591. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  86592. m.emit(0xe9)
  86593. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86594. })
  86595. }
  86596. // VPSUBSW m256, ymm, ymm
  86597. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  86598. self.require(ISA_AVX2)
  86599. p.domain = DomainAVX
  86600. p.add(0, func(m *_Encoding, v []interface{}) {
  86601. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  86602. m.emit(0xe9)
  86603. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  86604. })
  86605. }
  86606. // VPSUBSW zmm, zmm, zmm{k}{z}
  86607. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  86608. self.require(ISA_AVX512BW)
  86609. p.domain = DomainAVX
  86610. p.add(0, func(m *_Encoding, v []interface{}) {
  86611. m.emit(0x62)
  86612. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  86613. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  86614. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  86615. m.emit(0xe9)
  86616. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86617. })
  86618. }
  86619. // VPSUBSW m512, zmm, zmm{k}{z}
  86620. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  86621. self.require(ISA_AVX512BW)
  86622. p.domain = DomainAVX
  86623. p.add(0, func(m *_Encoding, v []interface{}) {
  86624. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  86625. m.emit(0xe9)
  86626. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  86627. })
  86628. }
  86629. // VPSUBSW xmm, xmm, xmm{k}{z}
  86630. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  86631. self.require(ISA_AVX512VL | ISA_AVX512BW)
  86632. p.domain = DomainAVX
  86633. p.add(0, func(m *_Encoding, v []interface{}) {
  86634. m.emit(0x62)
  86635. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  86636. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  86637. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  86638. m.emit(0xe9)
  86639. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86640. })
  86641. }
  86642. // VPSUBSW m128, xmm, xmm{k}{z}
  86643. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  86644. self.require(ISA_AVX512VL | ISA_AVX512BW)
  86645. p.domain = DomainAVX
  86646. p.add(0, func(m *_Encoding, v []interface{}) {
  86647. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  86648. m.emit(0xe9)
  86649. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  86650. })
  86651. }
  86652. // VPSUBSW ymm, ymm, ymm{k}{z}
  86653. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  86654. self.require(ISA_AVX512VL | ISA_AVX512BW)
  86655. p.domain = DomainAVX
  86656. p.add(0, func(m *_Encoding, v []interface{}) {
  86657. m.emit(0x62)
  86658. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  86659. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  86660. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  86661. m.emit(0xe9)
  86662. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86663. })
  86664. }
  86665. // VPSUBSW m256, ymm, ymm{k}{z}
  86666. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  86667. self.require(ISA_AVX512VL | ISA_AVX512BW)
  86668. p.domain = DomainAVX
  86669. p.add(0, func(m *_Encoding, v []interface{}) {
  86670. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  86671. m.emit(0xe9)
  86672. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  86673. })
  86674. }
  86675. if p.len == 0 {
  86676. panic("invalid operands for VPSUBSW")
  86677. }
  86678. return p
  86679. }
  86680. // VPSUBUSB performs "Subtract Packed Unsigned Byte Integers with Unsigned Saturation".
  86681. //
  86682. // Mnemonic : VPSUBUSB
  86683. // Supported forms : (10 forms)
  86684. //
  86685. // * VPSUBUSB xmm, xmm, xmm [AVX]
  86686. // * VPSUBUSB m128, xmm, xmm [AVX]
  86687. // * VPSUBUSB ymm, ymm, ymm [AVX2]
  86688. // * VPSUBUSB m256, ymm, ymm [AVX2]
  86689. // * VPSUBUSB zmm, zmm, zmm{k}{z} [AVX512BW]
  86690. // * VPSUBUSB m512, zmm, zmm{k}{z} [AVX512BW]
  86691. // * VPSUBUSB xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  86692. // * VPSUBUSB m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  86693. // * VPSUBUSB ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  86694. // * VPSUBUSB m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  86695. //
  86696. func (self *Program) VPSUBUSB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  86697. p := self.alloc("VPSUBUSB", 3, Operands { v0, v1, v2 })
  86698. // VPSUBUSB xmm, xmm, xmm
  86699. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  86700. self.require(ISA_AVX)
  86701. p.domain = DomainAVX
  86702. p.add(0, func(m *_Encoding, v []interface{}) {
  86703. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  86704. m.emit(0xd8)
  86705. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86706. })
  86707. }
  86708. // VPSUBUSB m128, xmm, xmm
  86709. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  86710. self.require(ISA_AVX)
  86711. p.domain = DomainAVX
  86712. p.add(0, func(m *_Encoding, v []interface{}) {
  86713. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  86714. m.emit(0xd8)
  86715. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  86716. })
  86717. }
  86718. // VPSUBUSB ymm, ymm, ymm
  86719. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  86720. self.require(ISA_AVX2)
  86721. p.domain = DomainAVX
  86722. p.add(0, func(m *_Encoding, v []interface{}) {
  86723. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  86724. m.emit(0xd8)
  86725. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86726. })
  86727. }
  86728. // VPSUBUSB m256, ymm, ymm
  86729. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  86730. self.require(ISA_AVX2)
  86731. p.domain = DomainAVX
  86732. p.add(0, func(m *_Encoding, v []interface{}) {
  86733. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  86734. m.emit(0xd8)
  86735. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  86736. })
  86737. }
  86738. // VPSUBUSB zmm, zmm, zmm{k}{z}
  86739. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  86740. self.require(ISA_AVX512BW)
  86741. p.domain = DomainAVX
  86742. p.add(0, func(m *_Encoding, v []interface{}) {
  86743. m.emit(0x62)
  86744. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  86745. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  86746. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  86747. m.emit(0xd8)
  86748. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86749. })
  86750. }
  86751. // VPSUBUSB m512, zmm, zmm{k}{z}
  86752. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  86753. self.require(ISA_AVX512BW)
  86754. p.domain = DomainAVX
  86755. p.add(0, func(m *_Encoding, v []interface{}) {
  86756. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  86757. m.emit(0xd8)
  86758. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  86759. })
  86760. }
  86761. // VPSUBUSB xmm, xmm, xmm{k}{z}
  86762. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  86763. self.require(ISA_AVX512VL | ISA_AVX512BW)
  86764. p.domain = DomainAVX
  86765. p.add(0, func(m *_Encoding, v []interface{}) {
  86766. m.emit(0x62)
  86767. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  86768. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  86769. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  86770. m.emit(0xd8)
  86771. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86772. })
  86773. }
  86774. // VPSUBUSB m128, xmm, xmm{k}{z}
  86775. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  86776. self.require(ISA_AVX512VL | ISA_AVX512BW)
  86777. p.domain = DomainAVX
  86778. p.add(0, func(m *_Encoding, v []interface{}) {
  86779. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  86780. m.emit(0xd8)
  86781. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  86782. })
  86783. }
  86784. // VPSUBUSB ymm, ymm, ymm{k}{z}
  86785. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  86786. self.require(ISA_AVX512VL | ISA_AVX512BW)
  86787. p.domain = DomainAVX
  86788. p.add(0, func(m *_Encoding, v []interface{}) {
  86789. m.emit(0x62)
  86790. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  86791. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  86792. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  86793. m.emit(0xd8)
  86794. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86795. })
  86796. }
  86797. // VPSUBUSB m256, ymm, ymm{k}{z}
  86798. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  86799. self.require(ISA_AVX512VL | ISA_AVX512BW)
  86800. p.domain = DomainAVX
  86801. p.add(0, func(m *_Encoding, v []interface{}) {
  86802. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  86803. m.emit(0xd8)
  86804. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  86805. })
  86806. }
  86807. if p.len == 0 {
  86808. panic("invalid operands for VPSUBUSB")
  86809. }
  86810. return p
  86811. }
  86812. // VPSUBUSW performs "Subtract Packed Unsigned Word Integers with Unsigned Saturation".
  86813. //
  86814. // Mnemonic : VPSUBUSW
  86815. // Supported forms : (10 forms)
  86816. //
  86817. // * VPSUBUSW xmm, xmm, xmm [AVX]
  86818. // * VPSUBUSW m128, xmm, xmm [AVX]
  86819. // * VPSUBUSW ymm, ymm, ymm [AVX2]
  86820. // * VPSUBUSW m256, ymm, ymm [AVX2]
  86821. // * VPSUBUSW zmm, zmm, zmm{k}{z} [AVX512BW]
  86822. // * VPSUBUSW m512, zmm, zmm{k}{z} [AVX512BW]
  86823. // * VPSUBUSW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  86824. // * VPSUBUSW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  86825. // * VPSUBUSW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  86826. // * VPSUBUSW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  86827. //
  86828. func (self *Program) VPSUBUSW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  86829. p := self.alloc("VPSUBUSW", 3, Operands { v0, v1, v2 })
  86830. // VPSUBUSW xmm, xmm, xmm
  86831. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  86832. self.require(ISA_AVX)
  86833. p.domain = DomainAVX
  86834. p.add(0, func(m *_Encoding, v []interface{}) {
  86835. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  86836. m.emit(0xd9)
  86837. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86838. })
  86839. }
  86840. // VPSUBUSW m128, xmm, xmm
  86841. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  86842. self.require(ISA_AVX)
  86843. p.domain = DomainAVX
  86844. p.add(0, func(m *_Encoding, v []interface{}) {
  86845. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  86846. m.emit(0xd9)
  86847. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  86848. })
  86849. }
  86850. // VPSUBUSW ymm, ymm, ymm
  86851. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  86852. self.require(ISA_AVX2)
  86853. p.domain = DomainAVX
  86854. p.add(0, func(m *_Encoding, v []interface{}) {
  86855. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  86856. m.emit(0xd9)
  86857. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86858. })
  86859. }
  86860. // VPSUBUSW m256, ymm, ymm
  86861. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  86862. self.require(ISA_AVX2)
  86863. p.domain = DomainAVX
  86864. p.add(0, func(m *_Encoding, v []interface{}) {
  86865. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  86866. m.emit(0xd9)
  86867. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  86868. })
  86869. }
  86870. // VPSUBUSW zmm, zmm, zmm{k}{z}
  86871. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  86872. self.require(ISA_AVX512BW)
  86873. p.domain = DomainAVX
  86874. p.add(0, func(m *_Encoding, v []interface{}) {
  86875. m.emit(0x62)
  86876. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  86877. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  86878. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  86879. m.emit(0xd9)
  86880. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86881. })
  86882. }
  86883. // VPSUBUSW m512, zmm, zmm{k}{z}
  86884. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  86885. self.require(ISA_AVX512BW)
  86886. p.domain = DomainAVX
  86887. p.add(0, func(m *_Encoding, v []interface{}) {
  86888. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  86889. m.emit(0xd9)
  86890. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  86891. })
  86892. }
  86893. // VPSUBUSW xmm, xmm, xmm{k}{z}
  86894. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  86895. self.require(ISA_AVX512VL | ISA_AVX512BW)
  86896. p.domain = DomainAVX
  86897. p.add(0, func(m *_Encoding, v []interface{}) {
  86898. m.emit(0x62)
  86899. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  86900. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  86901. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  86902. m.emit(0xd9)
  86903. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86904. })
  86905. }
  86906. // VPSUBUSW m128, xmm, xmm{k}{z}
  86907. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  86908. self.require(ISA_AVX512VL | ISA_AVX512BW)
  86909. p.domain = DomainAVX
  86910. p.add(0, func(m *_Encoding, v []interface{}) {
  86911. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  86912. m.emit(0xd9)
  86913. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  86914. })
  86915. }
  86916. // VPSUBUSW ymm, ymm, ymm{k}{z}
  86917. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  86918. self.require(ISA_AVX512VL | ISA_AVX512BW)
  86919. p.domain = DomainAVX
  86920. p.add(0, func(m *_Encoding, v []interface{}) {
  86921. m.emit(0x62)
  86922. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  86923. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  86924. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  86925. m.emit(0xd9)
  86926. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86927. })
  86928. }
  86929. // VPSUBUSW m256, ymm, ymm{k}{z}
  86930. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  86931. self.require(ISA_AVX512VL | ISA_AVX512BW)
  86932. p.domain = DomainAVX
  86933. p.add(0, func(m *_Encoding, v []interface{}) {
  86934. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  86935. m.emit(0xd9)
  86936. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  86937. })
  86938. }
  86939. if p.len == 0 {
  86940. panic("invalid operands for VPSUBUSW")
  86941. }
  86942. return p
  86943. }
  86944. // VPSUBW performs "Subtract Packed Word Integers".
  86945. //
  86946. // Mnemonic : VPSUBW
  86947. // Supported forms : (10 forms)
  86948. //
  86949. // * VPSUBW xmm, xmm, xmm [AVX]
  86950. // * VPSUBW m128, xmm, xmm [AVX]
  86951. // * VPSUBW ymm, ymm, ymm [AVX2]
  86952. // * VPSUBW m256, ymm, ymm [AVX2]
  86953. // * VPSUBW zmm, zmm, zmm{k}{z} [AVX512BW]
  86954. // * VPSUBW m512, zmm, zmm{k}{z} [AVX512BW]
  86955. // * VPSUBW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  86956. // * VPSUBW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  86957. // * VPSUBW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  86958. // * VPSUBW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  86959. //
  86960. func (self *Program) VPSUBW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  86961. p := self.alloc("VPSUBW", 3, Operands { v0, v1, v2 })
  86962. // VPSUBW xmm, xmm, xmm
  86963. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  86964. self.require(ISA_AVX)
  86965. p.domain = DomainAVX
  86966. p.add(0, func(m *_Encoding, v []interface{}) {
  86967. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  86968. m.emit(0xf9)
  86969. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86970. })
  86971. }
  86972. // VPSUBW m128, xmm, xmm
  86973. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  86974. self.require(ISA_AVX)
  86975. p.domain = DomainAVX
  86976. p.add(0, func(m *_Encoding, v []interface{}) {
  86977. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  86978. m.emit(0xf9)
  86979. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  86980. })
  86981. }
  86982. // VPSUBW ymm, ymm, ymm
  86983. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  86984. self.require(ISA_AVX2)
  86985. p.domain = DomainAVX
  86986. p.add(0, func(m *_Encoding, v []interface{}) {
  86987. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  86988. m.emit(0xf9)
  86989. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  86990. })
  86991. }
  86992. // VPSUBW m256, ymm, ymm
  86993. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  86994. self.require(ISA_AVX2)
  86995. p.domain = DomainAVX
  86996. p.add(0, func(m *_Encoding, v []interface{}) {
  86997. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  86998. m.emit(0xf9)
  86999. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  87000. })
  87001. }
  87002. // VPSUBW zmm, zmm, zmm{k}{z}
  87003. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  87004. self.require(ISA_AVX512BW)
  87005. p.domain = DomainAVX
  87006. p.add(0, func(m *_Encoding, v []interface{}) {
  87007. m.emit(0x62)
  87008. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87009. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  87010. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  87011. m.emit(0xf9)
  87012. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87013. })
  87014. }
  87015. // VPSUBW m512, zmm, zmm{k}{z}
  87016. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  87017. self.require(ISA_AVX512BW)
  87018. p.domain = DomainAVX
  87019. p.add(0, func(m *_Encoding, v []interface{}) {
  87020. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  87021. m.emit(0xf9)
  87022. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  87023. })
  87024. }
  87025. // VPSUBW xmm, xmm, xmm{k}{z}
  87026. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  87027. self.require(ISA_AVX512VL | ISA_AVX512BW)
  87028. p.domain = DomainAVX
  87029. p.add(0, func(m *_Encoding, v []interface{}) {
  87030. m.emit(0x62)
  87031. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87032. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  87033. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  87034. m.emit(0xf9)
  87035. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87036. })
  87037. }
  87038. // VPSUBW m128, xmm, xmm{k}{z}
  87039. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  87040. self.require(ISA_AVX512VL | ISA_AVX512BW)
  87041. p.domain = DomainAVX
  87042. p.add(0, func(m *_Encoding, v []interface{}) {
  87043. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  87044. m.emit(0xf9)
  87045. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  87046. })
  87047. }
  87048. // VPSUBW ymm, ymm, ymm{k}{z}
  87049. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  87050. self.require(ISA_AVX512VL | ISA_AVX512BW)
  87051. p.domain = DomainAVX
  87052. p.add(0, func(m *_Encoding, v []interface{}) {
  87053. m.emit(0x62)
  87054. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87055. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  87056. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  87057. m.emit(0xf9)
  87058. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87059. })
  87060. }
  87061. // VPSUBW m256, ymm, ymm{k}{z}
  87062. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  87063. self.require(ISA_AVX512VL | ISA_AVX512BW)
  87064. p.domain = DomainAVX
  87065. p.add(0, func(m *_Encoding, v []interface{}) {
  87066. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  87067. m.emit(0xf9)
  87068. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  87069. })
  87070. }
  87071. if p.len == 0 {
  87072. panic("invalid operands for VPSUBW")
  87073. }
  87074. return p
  87075. }
  87076. // VPTERNLOGD performs "Bitwise Ternary Logical Operation on Doubleword Values".
  87077. //
  87078. // Mnemonic : VPTERNLOGD
  87079. // Supported forms : (6 forms)
  87080. //
  87081. // * VPTERNLOGD imm8, m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  87082. // * VPTERNLOGD imm8, zmm, zmm, zmm{k}{z} [AVX512F]
  87083. // * VPTERNLOGD imm8, m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  87084. // * VPTERNLOGD imm8, xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  87085. // * VPTERNLOGD imm8, m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  87086. // * VPTERNLOGD imm8, ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  87087. //
  87088. func (self *Program) VPTERNLOGD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  87089. p := self.alloc("VPTERNLOGD", 4, Operands { v0, v1, v2, v3 })
  87090. // VPTERNLOGD imm8, m512/m32bcst, zmm, zmm{k}{z}
  87091. if isImm8(v0) && isM512M32bcst(v1) && isZMM(v2) && isZMMkz(v3) {
  87092. self.require(ISA_AVX512F)
  87093. p.domain = DomainAVX
  87094. p.add(0, func(m *_Encoding, v []interface{}) {
  87095. m.evex(0b11, 0x05, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  87096. m.emit(0x25)
  87097. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  87098. m.imm1(toImmAny(v[0]))
  87099. })
  87100. }
  87101. // VPTERNLOGD imm8, zmm, zmm, zmm{k}{z}
  87102. if isImm8(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(v3) {
  87103. self.require(ISA_AVX512F)
  87104. p.domain = DomainAVX
  87105. p.add(0, func(m *_Encoding, v []interface{}) {
  87106. m.emit(0x62)
  87107. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  87108. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  87109. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  87110. m.emit(0x25)
  87111. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  87112. m.imm1(toImmAny(v[0]))
  87113. })
  87114. }
  87115. // VPTERNLOGD imm8, m128/m32bcst, xmm, xmm{k}{z}
  87116. if isImm8(v0) && isM128M32bcst(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  87117. self.require(ISA_AVX512VL | ISA_AVX512F)
  87118. p.domain = DomainAVX
  87119. p.add(0, func(m *_Encoding, v []interface{}) {
  87120. m.evex(0b11, 0x05, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  87121. m.emit(0x25)
  87122. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  87123. m.imm1(toImmAny(v[0]))
  87124. })
  87125. }
  87126. // VPTERNLOGD imm8, xmm, xmm, xmm{k}{z}
  87127. if isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  87128. self.require(ISA_AVX512VL | ISA_AVX512F)
  87129. p.domain = DomainAVX
  87130. p.add(0, func(m *_Encoding, v []interface{}) {
  87131. m.emit(0x62)
  87132. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  87133. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  87134. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  87135. m.emit(0x25)
  87136. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  87137. m.imm1(toImmAny(v[0]))
  87138. })
  87139. }
  87140. // VPTERNLOGD imm8, m256/m32bcst, ymm, ymm{k}{z}
  87141. if isImm8(v0) && isM256M32bcst(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  87142. self.require(ISA_AVX512VL | ISA_AVX512F)
  87143. p.domain = DomainAVX
  87144. p.add(0, func(m *_Encoding, v []interface{}) {
  87145. m.evex(0b11, 0x05, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  87146. m.emit(0x25)
  87147. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  87148. m.imm1(toImmAny(v[0]))
  87149. })
  87150. }
  87151. // VPTERNLOGD imm8, ymm, ymm, ymm{k}{z}
  87152. if isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  87153. self.require(ISA_AVX512VL | ISA_AVX512F)
  87154. p.domain = DomainAVX
  87155. p.add(0, func(m *_Encoding, v []interface{}) {
  87156. m.emit(0x62)
  87157. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  87158. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  87159. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  87160. m.emit(0x25)
  87161. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  87162. m.imm1(toImmAny(v[0]))
  87163. })
  87164. }
  87165. if p.len == 0 {
  87166. panic("invalid operands for VPTERNLOGD")
  87167. }
  87168. return p
  87169. }
  87170. // VPTERNLOGQ performs "Bitwise Ternary Logical Operation on Quadword Values".
  87171. //
  87172. // Mnemonic : VPTERNLOGQ
  87173. // Supported forms : (6 forms)
  87174. //
  87175. // * VPTERNLOGQ imm8, m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  87176. // * VPTERNLOGQ imm8, zmm, zmm, zmm{k}{z} [AVX512F]
  87177. // * VPTERNLOGQ imm8, m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  87178. // * VPTERNLOGQ imm8, xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  87179. // * VPTERNLOGQ imm8, m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  87180. // * VPTERNLOGQ imm8, ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  87181. //
  87182. func (self *Program) VPTERNLOGQ(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  87183. p := self.alloc("VPTERNLOGQ", 4, Operands { v0, v1, v2, v3 })
  87184. // VPTERNLOGQ imm8, m512/m64bcst, zmm, zmm{k}{z}
  87185. if isImm8(v0) && isM512M64bcst(v1) && isZMM(v2) && isZMMkz(v3) {
  87186. self.require(ISA_AVX512F)
  87187. p.domain = DomainAVX
  87188. p.add(0, func(m *_Encoding, v []interface{}) {
  87189. m.evex(0b11, 0x85, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  87190. m.emit(0x25)
  87191. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  87192. m.imm1(toImmAny(v[0]))
  87193. })
  87194. }
  87195. // VPTERNLOGQ imm8, zmm, zmm, zmm{k}{z}
  87196. if isImm8(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(v3) {
  87197. self.require(ISA_AVX512F)
  87198. p.domain = DomainAVX
  87199. p.add(0, func(m *_Encoding, v []interface{}) {
  87200. m.emit(0x62)
  87201. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  87202. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  87203. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  87204. m.emit(0x25)
  87205. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  87206. m.imm1(toImmAny(v[0]))
  87207. })
  87208. }
  87209. // VPTERNLOGQ imm8, m128/m64bcst, xmm, xmm{k}{z}
  87210. if isImm8(v0) && isM128M64bcst(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  87211. self.require(ISA_AVX512VL | ISA_AVX512F)
  87212. p.domain = DomainAVX
  87213. p.add(0, func(m *_Encoding, v []interface{}) {
  87214. m.evex(0b11, 0x85, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  87215. m.emit(0x25)
  87216. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  87217. m.imm1(toImmAny(v[0]))
  87218. })
  87219. }
  87220. // VPTERNLOGQ imm8, xmm, xmm, xmm{k}{z}
  87221. if isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  87222. self.require(ISA_AVX512VL | ISA_AVX512F)
  87223. p.domain = DomainAVX
  87224. p.add(0, func(m *_Encoding, v []interface{}) {
  87225. m.emit(0x62)
  87226. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  87227. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  87228. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  87229. m.emit(0x25)
  87230. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  87231. m.imm1(toImmAny(v[0]))
  87232. })
  87233. }
  87234. // VPTERNLOGQ imm8, m256/m64bcst, ymm, ymm{k}{z}
  87235. if isImm8(v0) && isM256M64bcst(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  87236. self.require(ISA_AVX512VL | ISA_AVX512F)
  87237. p.domain = DomainAVX
  87238. p.add(0, func(m *_Encoding, v []interface{}) {
  87239. m.evex(0b11, 0x85, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  87240. m.emit(0x25)
  87241. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  87242. m.imm1(toImmAny(v[0]))
  87243. })
  87244. }
  87245. // VPTERNLOGQ imm8, ymm, ymm, ymm{k}{z}
  87246. if isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  87247. self.require(ISA_AVX512VL | ISA_AVX512F)
  87248. p.domain = DomainAVX
  87249. p.add(0, func(m *_Encoding, v []interface{}) {
  87250. m.emit(0x62)
  87251. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  87252. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  87253. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  87254. m.emit(0x25)
  87255. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  87256. m.imm1(toImmAny(v[0]))
  87257. })
  87258. }
  87259. if p.len == 0 {
  87260. panic("invalid operands for VPTERNLOGQ")
  87261. }
  87262. return p
  87263. }
  87264. // VPTEST performs "Packed Logical Compare".
  87265. //
  87266. // Mnemonic : VPTEST
  87267. // Supported forms : (4 forms)
  87268. //
  87269. // * VPTEST xmm, xmm [AVX]
  87270. // * VPTEST m128, xmm [AVX]
  87271. // * VPTEST ymm, ymm [AVX]
  87272. // * VPTEST m256, ymm [AVX]
  87273. //
  87274. func (self *Program) VPTEST(v0 interface{}, v1 interface{}) *Instruction {
  87275. p := self.alloc("VPTEST", 2, Operands { v0, v1 })
  87276. // VPTEST xmm, xmm
  87277. if isXMM(v0) && isXMM(v1) {
  87278. self.require(ISA_AVX)
  87279. p.domain = DomainAVX
  87280. p.add(0, func(m *_Encoding, v []interface{}) {
  87281. m.emit(0xc4)
  87282. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  87283. m.emit(0x79)
  87284. m.emit(0x17)
  87285. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  87286. })
  87287. }
  87288. // VPTEST m128, xmm
  87289. if isM128(v0) && isXMM(v1) {
  87290. self.require(ISA_AVX)
  87291. p.domain = DomainAVX
  87292. p.add(0, func(m *_Encoding, v []interface{}) {
  87293. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  87294. m.emit(0x17)
  87295. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  87296. })
  87297. }
  87298. // VPTEST ymm, ymm
  87299. if isYMM(v0) && isYMM(v1) {
  87300. self.require(ISA_AVX)
  87301. p.domain = DomainAVX
  87302. p.add(0, func(m *_Encoding, v []interface{}) {
  87303. m.emit(0xc4)
  87304. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  87305. m.emit(0x7d)
  87306. m.emit(0x17)
  87307. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  87308. })
  87309. }
  87310. // VPTEST m256, ymm
  87311. if isM256(v0) && isYMM(v1) {
  87312. self.require(ISA_AVX)
  87313. p.domain = DomainAVX
  87314. p.add(0, func(m *_Encoding, v []interface{}) {
  87315. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  87316. m.emit(0x17)
  87317. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  87318. })
  87319. }
  87320. if p.len == 0 {
  87321. panic("invalid operands for VPTEST")
  87322. }
  87323. return p
  87324. }
  87325. // VPTESTMB performs "Logical AND of Packed Byte Integer Values and Set Mask".
  87326. //
  87327. // Mnemonic : VPTESTMB
  87328. // Supported forms : (6 forms)
  87329. //
  87330. // * VPTESTMB zmm, zmm, k{k} [AVX512BW]
  87331. // * VPTESTMB m512, zmm, k{k} [AVX512BW]
  87332. // * VPTESTMB xmm, xmm, k{k} [AVX512BW,AVX512VL]
  87333. // * VPTESTMB m128, xmm, k{k} [AVX512BW,AVX512VL]
  87334. // * VPTESTMB ymm, ymm, k{k} [AVX512BW,AVX512VL]
  87335. // * VPTESTMB m256, ymm, k{k} [AVX512BW,AVX512VL]
  87336. //
  87337. func (self *Program) VPTESTMB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  87338. p := self.alloc("VPTESTMB", 3, Operands { v0, v1, v2 })
  87339. // VPTESTMB zmm, zmm, k{k}
  87340. if isZMM(v0) && isZMM(v1) && isKk(v2) {
  87341. self.require(ISA_AVX512BW)
  87342. p.domain = DomainAVX
  87343. p.add(0, func(m *_Encoding, v []interface{}) {
  87344. m.emit(0x62)
  87345. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87346. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  87347. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  87348. m.emit(0x26)
  87349. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87350. })
  87351. }
  87352. // VPTESTMB m512, zmm, k{k}
  87353. if isM512(v0) && isZMM(v1) && isKk(v2) {
  87354. self.require(ISA_AVX512BW)
  87355. p.domain = DomainAVX
  87356. p.add(0, func(m *_Encoding, v []interface{}) {
  87357. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  87358. m.emit(0x26)
  87359. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  87360. })
  87361. }
  87362. // VPTESTMB xmm, xmm, k{k}
  87363. if isEVEXXMM(v0) && isEVEXXMM(v1) && isKk(v2) {
  87364. self.require(ISA_AVX512VL | ISA_AVX512BW)
  87365. p.domain = DomainAVX
  87366. p.add(0, func(m *_Encoding, v []interface{}) {
  87367. m.emit(0x62)
  87368. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87369. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  87370. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  87371. m.emit(0x26)
  87372. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87373. })
  87374. }
  87375. // VPTESTMB m128, xmm, k{k}
  87376. if isM128(v0) && isEVEXXMM(v1) && isKk(v2) {
  87377. self.require(ISA_AVX512VL | ISA_AVX512BW)
  87378. p.domain = DomainAVX
  87379. p.add(0, func(m *_Encoding, v []interface{}) {
  87380. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  87381. m.emit(0x26)
  87382. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  87383. })
  87384. }
  87385. // VPTESTMB ymm, ymm, k{k}
  87386. if isEVEXYMM(v0) && isEVEXYMM(v1) && isKk(v2) {
  87387. self.require(ISA_AVX512VL | ISA_AVX512BW)
  87388. p.domain = DomainAVX
  87389. p.add(0, func(m *_Encoding, v []interface{}) {
  87390. m.emit(0x62)
  87391. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87392. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  87393. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  87394. m.emit(0x26)
  87395. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87396. })
  87397. }
  87398. // VPTESTMB m256, ymm, k{k}
  87399. if isM256(v0) && isEVEXYMM(v1) && isKk(v2) {
  87400. self.require(ISA_AVX512VL | ISA_AVX512BW)
  87401. p.domain = DomainAVX
  87402. p.add(0, func(m *_Encoding, v []interface{}) {
  87403. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  87404. m.emit(0x26)
  87405. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  87406. })
  87407. }
  87408. if p.len == 0 {
  87409. panic("invalid operands for VPTESTMB")
  87410. }
  87411. return p
  87412. }
  87413. // VPTESTMD performs "Logical AND of Packed Doubleword Integer Values and Set Mask".
  87414. //
  87415. // Mnemonic : VPTESTMD
  87416. // Supported forms : (6 forms)
  87417. //
  87418. // * VPTESTMD m512/m32bcst, zmm, k{k} [AVX512F]
  87419. // * VPTESTMD zmm, zmm, k{k} [AVX512F]
  87420. // * VPTESTMD m128/m32bcst, xmm, k{k} [AVX512F,AVX512VL]
  87421. // * VPTESTMD xmm, xmm, k{k} [AVX512F,AVX512VL]
  87422. // * VPTESTMD m256/m32bcst, ymm, k{k} [AVX512F,AVX512VL]
  87423. // * VPTESTMD ymm, ymm, k{k} [AVX512F,AVX512VL]
  87424. //
  87425. func (self *Program) VPTESTMD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  87426. p := self.alloc("VPTESTMD", 3, Operands { v0, v1, v2 })
  87427. // VPTESTMD m512/m32bcst, zmm, k{k}
  87428. if isM512M32bcst(v0) && isZMM(v1) && isKk(v2) {
  87429. self.require(ISA_AVX512F)
  87430. p.domain = DomainAVX
  87431. p.add(0, func(m *_Encoding, v []interface{}) {
  87432. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  87433. m.emit(0x27)
  87434. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  87435. })
  87436. }
  87437. // VPTESTMD zmm, zmm, k{k}
  87438. if isZMM(v0) && isZMM(v1) && isKk(v2) {
  87439. self.require(ISA_AVX512F)
  87440. p.domain = DomainAVX
  87441. p.add(0, func(m *_Encoding, v []interface{}) {
  87442. m.emit(0x62)
  87443. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87444. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  87445. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  87446. m.emit(0x27)
  87447. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87448. })
  87449. }
  87450. // VPTESTMD m128/m32bcst, xmm, k{k}
  87451. if isM128M32bcst(v0) && isEVEXXMM(v1) && isKk(v2) {
  87452. self.require(ISA_AVX512VL | ISA_AVX512F)
  87453. p.domain = DomainAVX
  87454. p.add(0, func(m *_Encoding, v []interface{}) {
  87455. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  87456. m.emit(0x27)
  87457. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  87458. })
  87459. }
  87460. // VPTESTMD xmm, xmm, k{k}
  87461. if isEVEXXMM(v0) && isEVEXXMM(v1) && isKk(v2) {
  87462. self.require(ISA_AVX512VL | ISA_AVX512F)
  87463. p.domain = DomainAVX
  87464. p.add(0, func(m *_Encoding, v []interface{}) {
  87465. m.emit(0x62)
  87466. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87467. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  87468. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  87469. m.emit(0x27)
  87470. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87471. })
  87472. }
  87473. // VPTESTMD m256/m32bcst, ymm, k{k}
  87474. if isM256M32bcst(v0) && isEVEXYMM(v1) && isKk(v2) {
  87475. self.require(ISA_AVX512VL | ISA_AVX512F)
  87476. p.domain = DomainAVX
  87477. p.add(0, func(m *_Encoding, v []interface{}) {
  87478. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  87479. m.emit(0x27)
  87480. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  87481. })
  87482. }
  87483. // VPTESTMD ymm, ymm, k{k}
  87484. if isEVEXYMM(v0) && isEVEXYMM(v1) && isKk(v2) {
  87485. self.require(ISA_AVX512VL | ISA_AVX512F)
  87486. p.domain = DomainAVX
  87487. p.add(0, func(m *_Encoding, v []interface{}) {
  87488. m.emit(0x62)
  87489. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87490. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  87491. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  87492. m.emit(0x27)
  87493. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87494. })
  87495. }
  87496. if p.len == 0 {
  87497. panic("invalid operands for VPTESTMD")
  87498. }
  87499. return p
  87500. }
  87501. // VPTESTMQ performs "Logical AND of Packed Quadword Integer Values and Set Mask".
  87502. //
  87503. // Mnemonic : VPTESTMQ
  87504. // Supported forms : (6 forms)
  87505. //
  87506. // * VPTESTMQ m512/m64bcst, zmm, k{k} [AVX512F]
  87507. // * VPTESTMQ zmm, zmm, k{k} [AVX512F]
  87508. // * VPTESTMQ m128/m64bcst, xmm, k{k} [AVX512F,AVX512VL]
  87509. // * VPTESTMQ xmm, xmm, k{k} [AVX512F,AVX512VL]
  87510. // * VPTESTMQ m256/m64bcst, ymm, k{k} [AVX512F,AVX512VL]
  87511. // * VPTESTMQ ymm, ymm, k{k} [AVX512F,AVX512VL]
  87512. //
  87513. func (self *Program) VPTESTMQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  87514. p := self.alloc("VPTESTMQ", 3, Operands { v0, v1, v2 })
  87515. // VPTESTMQ m512/m64bcst, zmm, k{k}
  87516. if isM512M64bcst(v0) && isZMM(v1) && isKk(v2) {
  87517. self.require(ISA_AVX512F)
  87518. p.domain = DomainAVX
  87519. p.add(0, func(m *_Encoding, v []interface{}) {
  87520. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  87521. m.emit(0x27)
  87522. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  87523. })
  87524. }
  87525. // VPTESTMQ zmm, zmm, k{k}
  87526. if isZMM(v0) && isZMM(v1) && isKk(v2) {
  87527. self.require(ISA_AVX512F)
  87528. p.domain = DomainAVX
  87529. p.add(0, func(m *_Encoding, v []interface{}) {
  87530. m.emit(0x62)
  87531. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87532. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  87533. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  87534. m.emit(0x27)
  87535. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87536. })
  87537. }
  87538. // VPTESTMQ m128/m64bcst, xmm, k{k}
  87539. if isM128M64bcst(v0) && isEVEXXMM(v1) && isKk(v2) {
  87540. self.require(ISA_AVX512VL | ISA_AVX512F)
  87541. p.domain = DomainAVX
  87542. p.add(0, func(m *_Encoding, v []interface{}) {
  87543. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  87544. m.emit(0x27)
  87545. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  87546. })
  87547. }
  87548. // VPTESTMQ xmm, xmm, k{k}
  87549. if isEVEXXMM(v0) && isEVEXXMM(v1) && isKk(v2) {
  87550. self.require(ISA_AVX512VL | ISA_AVX512F)
  87551. p.domain = DomainAVX
  87552. p.add(0, func(m *_Encoding, v []interface{}) {
  87553. m.emit(0x62)
  87554. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87555. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  87556. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  87557. m.emit(0x27)
  87558. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87559. })
  87560. }
  87561. // VPTESTMQ m256/m64bcst, ymm, k{k}
  87562. if isM256M64bcst(v0) && isEVEXYMM(v1) && isKk(v2) {
  87563. self.require(ISA_AVX512VL | ISA_AVX512F)
  87564. p.domain = DomainAVX
  87565. p.add(0, func(m *_Encoding, v []interface{}) {
  87566. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  87567. m.emit(0x27)
  87568. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  87569. })
  87570. }
  87571. // VPTESTMQ ymm, ymm, k{k}
  87572. if isEVEXYMM(v0) && isEVEXYMM(v1) && isKk(v2) {
  87573. self.require(ISA_AVX512VL | ISA_AVX512F)
  87574. p.domain = DomainAVX
  87575. p.add(0, func(m *_Encoding, v []interface{}) {
  87576. m.emit(0x62)
  87577. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87578. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  87579. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  87580. m.emit(0x27)
  87581. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87582. })
  87583. }
  87584. if p.len == 0 {
  87585. panic("invalid operands for VPTESTMQ")
  87586. }
  87587. return p
  87588. }
  87589. // VPTESTMW performs "Logical AND of Packed Word Integer Values and Set Mask".
  87590. //
  87591. // Mnemonic : VPTESTMW
  87592. // Supported forms : (6 forms)
  87593. //
  87594. // * VPTESTMW zmm, zmm, k{k} [AVX512BW]
  87595. // * VPTESTMW m512, zmm, k{k} [AVX512BW]
  87596. // * VPTESTMW xmm, xmm, k{k} [AVX512BW,AVX512VL]
  87597. // * VPTESTMW m128, xmm, k{k} [AVX512BW,AVX512VL]
  87598. // * VPTESTMW ymm, ymm, k{k} [AVX512BW,AVX512VL]
  87599. // * VPTESTMW m256, ymm, k{k} [AVX512BW,AVX512VL]
  87600. //
  87601. func (self *Program) VPTESTMW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  87602. p := self.alloc("VPTESTMW", 3, Operands { v0, v1, v2 })
  87603. // VPTESTMW zmm, zmm, k{k}
  87604. if isZMM(v0) && isZMM(v1) && isKk(v2) {
  87605. self.require(ISA_AVX512BW)
  87606. p.domain = DomainAVX
  87607. p.add(0, func(m *_Encoding, v []interface{}) {
  87608. m.emit(0x62)
  87609. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87610. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  87611. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  87612. m.emit(0x26)
  87613. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87614. })
  87615. }
  87616. // VPTESTMW m512, zmm, k{k}
  87617. if isM512(v0) && isZMM(v1) && isKk(v2) {
  87618. self.require(ISA_AVX512BW)
  87619. p.domain = DomainAVX
  87620. p.add(0, func(m *_Encoding, v []interface{}) {
  87621. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  87622. m.emit(0x26)
  87623. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  87624. })
  87625. }
  87626. // VPTESTMW xmm, xmm, k{k}
  87627. if isEVEXXMM(v0) && isEVEXXMM(v1) && isKk(v2) {
  87628. self.require(ISA_AVX512VL | ISA_AVX512BW)
  87629. p.domain = DomainAVX
  87630. p.add(0, func(m *_Encoding, v []interface{}) {
  87631. m.emit(0x62)
  87632. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87633. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  87634. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  87635. m.emit(0x26)
  87636. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87637. })
  87638. }
  87639. // VPTESTMW m128, xmm, k{k}
  87640. if isM128(v0) && isEVEXXMM(v1) && isKk(v2) {
  87641. self.require(ISA_AVX512VL | ISA_AVX512BW)
  87642. p.domain = DomainAVX
  87643. p.add(0, func(m *_Encoding, v []interface{}) {
  87644. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  87645. m.emit(0x26)
  87646. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  87647. })
  87648. }
  87649. // VPTESTMW ymm, ymm, k{k}
  87650. if isEVEXYMM(v0) && isEVEXYMM(v1) && isKk(v2) {
  87651. self.require(ISA_AVX512VL | ISA_AVX512BW)
  87652. p.domain = DomainAVX
  87653. p.add(0, func(m *_Encoding, v []interface{}) {
  87654. m.emit(0x62)
  87655. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87656. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  87657. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  87658. m.emit(0x26)
  87659. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87660. })
  87661. }
  87662. // VPTESTMW m256, ymm, k{k}
  87663. if isM256(v0) && isEVEXYMM(v1) && isKk(v2) {
  87664. self.require(ISA_AVX512VL | ISA_AVX512BW)
  87665. p.domain = DomainAVX
  87666. p.add(0, func(m *_Encoding, v []interface{}) {
  87667. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  87668. m.emit(0x26)
  87669. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  87670. })
  87671. }
  87672. if p.len == 0 {
  87673. panic("invalid operands for VPTESTMW")
  87674. }
  87675. return p
  87676. }
  87677. // VPTESTNMB performs "Logical NAND of Packed Byte Integer Values and Set Mask".
  87678. //
  87679. // Mnemonic : VPTESTNMB
  87680. // Supported forms : (6 forms)
  87681. //
  87682. // * VPTESTNMB zmm, zmm, k{k} [AVX512BW,AVX512F]
  87683. // * VPTESTNMB m512, zmm, k{k} [AVX512BW,AVX512F]
  87684. // * VPTESTNMB xmm, xmm, k{k} [AVX512BW,AVX512VL]
  87685. // * VPTESTNMB m128, xmm, k{k} [AVX512BW,AVX512VL]
  87686. // * VPTESTNMB ymm, ymm, k{k} [AVX512BW,AVX512VL]
  87687. // * VPTESTNMB m256, ymm, k{k} [AVX512BW,AVX512VL]
  87688. //
  87689. func (self *Program) VPTESTNMB(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  87690. p := self.alloc("VPTESTNMB", 3, Operands { v0, v1, v2 })
  87691. // VPTESTNMB zmm, zmm, k{k}
  87692. if isZMM(v0) && isZMM(v1) && isKk(v2) {
  87693. self.require(ISA_AVX512F | ISA_AVX512BW)
  87694. p.domain = DomainAVX
  87695. p.add(0, func(m *_Encoding, v []interface{}) {
  87696. m.emit(0x62)
  87697. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87698. m.emit(0x7e ^ (hlcode(v[1]) << 3))
  87699. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  87700. m.emit(0x26)
  87701. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87702. })
  87703. }
  87704. // VPTESTNMB m512, zmm, k{k}
  87705. if isM512(v0) && isZMM(v1) && isKk(v2) {
  87706. self.require(ISA_AVX512F | ISA_AVX512BW)
  87707. p.domain = DomainAVX
  87708. p.add(0, func(m *_Encoding, v []interface{}) {
  87709. m.evex(0b10, 0x06, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  87710. m.emit(0x26)
  87711. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  87712. })
  87713. }
  87714. // VPTESTNMB xmm, xmm, k{k}
  87715. if isEVEXXMM(v0) && isEVEXXMM(v1) && isKk(v2) {
  87716. self.require(ISA_AVX512VL | ISA_AVX512BW)
  87717. p.domain = DomainAVX
  87718. p.add(0, func(m *_Encoding, v []interface{}) {
  87719. m.emit(0x62)
  87720. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87721. m.emit(0x7e ^ (hlcode(v[1]) << 3))
  87722. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  87723. m.emit(0x26)
  87724. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87725. })
  87726. }
  87727. // VPTESTNMB m128, xmm, k{k}
  87728. if isM128(v0) && isEVEXXMM(v1) && isKk(v2) {
  87729. self.require(ISA_AVX512VL | ISA_AVX512BW)
  87730. p.domain = DomainAVX
  87731. p.add(0, func(m *_Encoding, v []interface{}) {
  87732. m.evex(0b10, 0x06, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  87733. m.emit(0x26)
  87734. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  87735. })
  87736. }
  87737. // VPTESTNMB ymm, ymm, k{k}
  87738. if isEVEXYMM(v0) && isEVEXYMM(v1) && isKk(v2) {
  87739. self.require(ISA_AVX512VL | ISA_AVX512BW)
  87740. p.domain = DomainAVX
  87741. p.add(0, func(m *_Encoding, v []interface{}) {
  87742. m.emit(0x62)
  87743. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87744. m.emit(0x7e ^ (hlcode(v[1]) << 3))
  87745. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  87746. m.emit(0x26)
  87747. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87748. })
  87749. }
  87750. // VPTESTNMB m256, ymm, k{k}
  87751. if isM256(v0) && isEVEXYMM(v1) && isKk(v2) {
  87752. self.require(ISA_AVX512VL | ISA_AVX512BW)
  87753. p.domain = DomainAVX
  87754. p.add(0, func(m *_Encoding, v []interface{}) {
  87755. m.evex(0b10, 0x06, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  87756. m.emit(0x26)
  87757. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  87758. })
  87759. }
  87760. if p.len == 0 {
  87761. panic("invalid operands for VPTESTNMB")
  87762. }
  87763. return p
  87764. }
  87765. // VPTESTNMD performs "Logical NAND of Packed Doubleword Integer Values and Set Mask".
  87766. //
  87767. // Mnemonic : VPTESTNMD
  87768. // Supported forms : (6 forms)
  87769. //
  87770. // * VPTESTNMD m512/m32bcst, zmm, k{k} [AVX512F]
  87771. // * VPTESTNMD zmm, zmm, k{k} [AVX512F]
  87772. // * VPTESTNMD m128/m32bcst, xmm, k{k} [AVX512F,AVX512VL]
  87773. // * VPTESTNMD xmm, xmm, k{k} [AVX512F,AVX512VL]
  87774. // * VPTESTNMD m256/m32bcst, ymm, k{k} [AVX512F,AVX512VL]
  87775. // * VPTESTNMD ymm, ymm, k{k} [AVX512F,AVX512VL]
  87776. //
  87777. func (self *Program) VPTESTNMD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  87778. p := self.alloc("VPTESTNMD", 3, Operands { v0, v1, v2 })
  87779. // VPTESTNMD m512/m32bcst, zmm, k{k}
  87780. if isM512M32bcst(v0) && isZMM(v1) && isKk(v2) {
  87781. self.require(ISA_AVX512F)
  87782. p.domain = DomainAVX
  87783. p.add(0, func(m *_Encoding, v []interface{}) {
  87784. m.evex(0b10, 0x06, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  87785. m.emit(0x27)
  87786. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  87787. })
  87788. }
  87789. // VPTESTNMD zmm, zmm, k{k}
  87790. if isZMM(v0) && isZMM(v1) && isKk(v2) {
  87791. self.require(ISA_AVX512F)
  87792. p.domain = DomainAVX
  87793. p.add(0, func(m *_Encoding, v []interface{}) {
  87794. m.emit(0x62)
  87795. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87796. m.emit(0x7e ^ (hlcode(v[1]) << 3))
  87797. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  87798. m.emit(0x27)
  87799. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87800. })
  87801. }
  87802. // VPTESTNMD m128/m32bcst, xmm, k{k}
  87803. if isM128M32bcst(v0) && isEVEXXMM(v1) && isKk(v2) {
  87804. self.require(ISA_AVX512VL | ISA_AVX512F)
  87805. p.domain = DomainAVX
  87806. p.add(0, func(m *_Encoding, v []interface{}) {
  87807. m.evex(0b10, 0x06, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  87808. m.emit(0x27)
  87809. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  87810. })
  87811. }
  87812. // VPTESTNMD xmm, xmm, k{k}
  87813. if isEVEXXMM(v0) && isEVEXXMM(v1) && isKk(v2) {
  87814. self.require(ISA_AVX512VL | ISA_AVX512F)
  87815. p.domain = DomainAVX
  87816. p.add(0, func(m *_Encoding, v []interface{}) {
  87817. m.emit(0x62)
  87818. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87819. m.emit(0x7e ^ (hlcode(v[1]) << 3))
  87820. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  87821. m.emit(0x27)
  87822. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87823. })
  87824. }
  87825. // VPTESTNMD m256/m32bcst, ymm, k{k}
  87826. if isM256M32bcst(v0) && isEVEXYMM(v1) && isKk(v2) {
  87827. self.require(ISA_AVX512VL | ISA_AVX512F)
  87828. p.domain = DomainAVX
  87829. p.add(0, func(m *_Encoding, v []interface{}) {
  87830. m.evex(0b10, 0x06, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  87831. m.emit(0x27)
  87832. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  87833. })
  87834. }
  87835. // VPTESTNMD ymm, ymm, k{k}
  87836. if isEVEXYMM(v0) && isEVEXYMM(v1) && isKk(v2) {
  87837. self.require(ISA_AVX512VL | ISA_AVX512F)
  87838. p.domain = DomainAVX
  87839. p.add(0, func(m *_Encoding, v []interface{}) {
  87840. m.emit(0x62)
  87841. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87842. m.emit(0x7e ^ (hlcode(v[1]) << 3))
  87843. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  87844. m.emit(0x27)
  87845. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87846. })
  87847. }
  87848. if p.len == 0 {
  87849. panic("invalid operands for VPTESTNMD")
  87850. }
  87851. return p
  87852. }
  87853. // VPTESTNMQ performs "Logical NAND of Packed Quadword Integer Values and Set Mask".
  87854. //
  87855. // Mnemonic : VPTESTNMQ
  87856. // Supported forms : (6 forms)
  87857. //
  87858. // * VPTESTNMQ m512/m64bcst, zmm, k{k} [AVX512F]
  87859. // * VPTESTNMQ zmm, zmm, k{k} [AVX512F]
  87860. // * VPTESTNMQ m128/m64bcst, xmm, k{k} [AVX512F,AVX512VL]
  87861. // * VPTESTNMQ xmm, xmm, k{k} [AVX512F,AVX512VL]
  87862. // * VPTESTNMQ m256/m64bcst, ymm, k{k} [AVX512F,AVX512VL]
  87863. // * VPTESTNMQ ymm, ymm, k{k} [AVX512F,AVX512VL]
  87864. //
  87865. func (self *Program) VPTESTNMQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  87866. p := self.alloc("VPTESTNMQ", 3, Operands { v0, v1, v2 })
  87867. // VPTESTNMQ m512/m64bcst, zmm, k{k}
  87868. if isM512M64bcst(v0) && isZMM(v1) && isKk(v2) {
  87869. self.require(ISA_AVX512F)
  87870. p.domain = DomainAVX
  87871. p.add(0, func(m *_Encoding, v []interface{}) {
  87872. m.evex(0b10, 0x86, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  87873. m.emit(0x27)
  87874. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  87875. })
  87876. }
  87877. // VPTESTNMQ zmm, zmm, k{k}
  87878. if isZMM(v0) && isZMM(v1) && isKk(v2) {
  87879. self.require(ISA_AVX512F)
  87880. p.domain = DomainAVX
  87881. p.add(0, func(m *_Encoding, v []interface{}) {
  87882. m.emit(0x62)
  87883. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87884. m.emit(0xfe ^ (hlcode(v[1]) << 3))
  87885. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  87886. m.emit(0x27)
  87887. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87888. })
  87889. }
  87890. // VPTESTNMQ m128/m64bcst, xmm, k{k}
  87891. if isM128M64bcst(v0) && isEVEXXMM(v1) && isKk(v2) {
  87892. self.require(ISA_AVX512VL | ISA_AVX512F)
  87893. p.domain = DomainAVX
  87894. p.add(0, func(m *_Encoding, v []interface{}) {
  87895. m.evex(0b10, 0x86, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  87896. m.emit(0x27)
  87897. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  87898. })
  87899. }
  87900. // VPTESTNMQ xmm, xmm, k{k}
  87901. if isEVEXXMM(v0) && isEVEXXMM(v1) && isKk(v2) {
  87902. self.require(ISA_AVX512VL | ISA_AVX512F)
  87903. p.domain = DomainAVX
  87904. p.add(0, func(m *_Encoding, v []interface{}) {
  87905. m.emit(0x62)
  87906. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87907. m.emit(0xfe ^ (hlcode(v[1]) << 3))
  87908. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  87909. m.emit(0x27)
  87910. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87911. })
  87912. }
  87913. // VPTESTNMQ m256/m64bcst, ymm, k{k}
  87914. if isM256M64bcst(v0) && isEVEXYMM(v1) && isKk(v2) {
  87915. self.require(ISA_AVX512VL | ISA_AVX512F)
  87916. p.domain = DomainAVX
  87917. p.add(0, func(m *_Encoding, v []interface{}) {
  87918. m.evex(0b10, 0x86, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, bcode(v[0]))
  87919. m.emit(0x27)
  87920. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  87921. })
  87922. }
  87923. // VPTESTNMQ ymm, ymm, k{k}
  87924. if isEVEXYMM(v0) && isEVEXYMM(v1) && isKk(v2) {
  87925. self.require(ISA_AVX512VL | ISA_AVX512F)
  87926. p.domain = DomainAVX
  87927. p.add(0, func(m *_Encoding, v []interface{}) {
  87928. m.emit(0x62)
  87929. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87930. m.emit(0xfe ^ (hlcode(v[1]) << 3))
  87931. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  87932. m.emit(0x27)
  87933. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87934. })
  87935. }
  87936. if p.len == 0 {
  87937. panic("invalid operands for VPTESTNMQ")
  87938. }
  87939. return p
  87940. }
  87941. // VPTESTNMW performs "Logical NAND of Packed Word Integer Values and Set Mask".
  87942. //
  87943. // Mnemonic : VPTESTNMW
  87944. // Supported forms : (6 forms)
  87945. //
  87946. // * VPTESTNMW zmm, zmm, k{k} [AVX512BW,AVX512F]
  87947. // * VPTESTNMW m512, zmm, k{k} [AVX512BW,AVX512F]
  87948. // * VPTESTNMW xmm, xmm, k{k} [AVX512BW,AVX512VL]
  87949. // * VPTESTNMW m128, xmm, k{k} [AVX512BW,AVX512VL]
  87950. // * VPTESTNMW ymm, ymm, k{k} [AVX512BW,AVX512VL]
  87951. // * VPTESTNMW m256, ymm, k{k} [AVX512BW,AVX512VL]
  87952. //
  87953. func (self *Program) VPTESTNMW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  87954. p := self.alloc("VPTESTNMW", 3, Operands { v0, v1, v2 })
  87955. // VPTESTNMW zmm, zmm, k{k}
  87956. if isZMM(v0) && isZMM(v1) && isKk(v2) {
  87957. self.require(ISA_AVX512F | ISA_AVX512BW)
  87958. p.domain = DomainAVX
  87959. p.add(0, func(m *_Encoding, v []interface{}) {
  87960. m.emit(0x62)
  87961. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87962. m.emit(0xfe ^ (hlcode(v[1]) << 3))
  87963. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  87964. m.emit(0x26)
  87965. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87966. })
  87967. }
  87968. // VPTESTNMW m512, zmm, k{k}
  87969. if isM512(v0) && isZMM(v1) && isKk(v2) {
  87970. self.require(ISA_AVX512F | ISA_AVX512BW)
  87971. p.domain = DomainAVX
  87972. p.add(0, func(m *_Encoding, v []interface{}) {
  87973. m.evex(0b10, 0x86, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  87974. m.emit(0x26)
  87975. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  87976. })
  87977. }
  87978. // VPTESTNMW xmm, xmm, k{k}
  87979. if isEVEXXMM(v0) && isEVEXXMM(v1) && isKk(v2) {
  87980. self.require(ISA_AVX512VL | ISA_AVX512BW)
  87981. p.domain = DomainAVX
  87982. p.add(0, func(m *_Encoding, v []interface{}) {
  87983. m.emit(0x62)
  87984. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  87985. m.emit(0xfe ^ (hlcode(v[1]) << 3))
  87986. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  87987. m.emit(0x26)
  87988. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  87989. })
  87990. }
  87991. // VPTESTNMW m128, xmm, k{k}
  87992. if isM128(v0) && isEVEXXMM(v1) && isKk(v2) {
  87993. self.require(ISA_AVX512VL | ISA_AVX512BW)
  87994. p.domain = DomainAVX
  87995. p.add(0, func(m *_Encoding, v []interface{}) {
  87996. m.evex(0b10, 0x86, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  87997. m.emit(0x26)
  87998. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  87999. })
  88000. }
  88001. // VPTESTNMW ymm, ymm, k{k}
  88002. if isEVEXYMM(v0) && isEVEXYMM(v1) && isKk(v2) {
  88003. self.require(ISA_AVX512VL | ISA_AVX512BW)
  88004. p.domain = DomainAVX
  88005. p.add(0, func(m *_Encoding, v []interface{}) {
  88006. m.emit(0x62)
  88007. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  88008. m.emit(0xfe ^ (hlcode(v[1]) << 3))
  88009. m.emit((0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  88010. m.emit(0x26)
  88011. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88012. })
  88013. }
  88014. // VPTESTNMW m256, ymm, k{k}
  88015. if isM256(v0) && isEVEXYMM(v1) && isKk(v2) {
  88016. self.require(ISA_AVX512VL | ISA_AVX512BW)
  88017. p.domain = DomainAVX
  88018. p.add(0, func(m *_Encoding, v []interface{}) {
  88019. m.evex(0b10, 0x86, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), 0, 0)
  88020. m.emit(0x26)
  88021. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  88022. })
  88023. }
  88024. if p.len == 0 {
  88025. panic("invalid operands for VPTESTNMW")
  88026. }
  88027. return p
  88028. }
  88029. // VPUNPCKHBW performs "Unpack and Interleave High-Order Bytes into Words".
  88030. //
  88031. // Mnemonic : VPUNPCKHBW
  88032. // Supported forms : (10 forms)
  88033. //
  88034. // * VPUNPCKHBW xmm, xmm, xmm [AVX]
  88035. // * VPUNPCKHBW m128, xmm, xmm [AVX]
  88036. // * VPUNPCKHBW ymm, ymm, ymm [AVX2]
  88037. // * VPUNPCKHBW m256, ymm, ymm [AVX2]
  88038. // * VPUNPCKHBW zmm, zmm, zmm{k}{z} [AVX512BW]
  88039. // * VPUNPCKHBW m512, zmm, zmm{k}{z} [AVX512BW]
  88040. // * VPUNPCKHBW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  88041. // * VPUNPCKHBW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  88042. // * VPUNPCKHBW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  88043. // * VPUNPCKHBW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  88044. //
  88045. func (self *Program) VPUNPCKHBW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  88046. p := self.alloc("VPUNPCKHBW", 3, Operands { v0, v1, v2 })
  88047. // VPUNPCKHBW xmm, xmm, xmm
  88048. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  88049. self.require(ISA_AVX)
  88050. p.domain = DomainAVX
  88051. p.add(0, func(m *_Encoding, v []interface{}) {
  88052. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  88053. m.emit(0x68)
  88054. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88055. })
  88056. }
  88057. // VPUNPCKHBW m128, xmm, xmm
  88058. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  88059. self.require(ISA_AVX)
  88060. p.domain = DomainAVX
  88061. p.add(0, func(m *_Encoding, v []interface{}) {
  88062. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  88063. m.emit(0x68)
  88064. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  88065. })
  88066. }
  88067. // VPUNPCKHBW ymm, ymm, ymm
  88068. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  88069. self.require(ISA_AVX2)
  88070. p.domain = DomainAVX
  88071. p.add(0, func(m *_Encoding, v []interface{}) {
  88072. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  88073. m.emit(0x68)
  88074. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88075. })
  88076. }
  88077. // VPUNPCKHBW m256, ymm, ymm
  88078. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  88079. self.require(ISA_AVX2)
  88080. p.domain = DomainAVX
  88081. p.add(0, func(m *_Encoding, v []interface{}) {
  88082. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  88083. m.emit(0x68)
  88084. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  88085. })
  88086. }
  88087. // VPUNPCKHBW zmm, zmm, zmm{k}{z}
  88088. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  88089. self.require(ISA_AVX512BW)
  88090. p.domain = DomainAVX
  88091. p.add(0, func(m *_Encoding, v []interface{}) {
  88092. m.emit(0x62)
  88093. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  88094. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  88095. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  88096. m.emit(0x68)
  88097. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88098. })
  88099. }
  88100. // VPUNPCKHBW m512, zmm, zmm{k}{z}
  88101. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  88102. self.require(ISA_AVX512BW)
  88103. p.domain = DomainAVX
  88104. p.add(0, func(m *_Encoding, v []interface{}) {
  88105. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  88106. m.emit(0x68)
  88107. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  88108. })
  88109. }
  88110. // VPUNPCKHBW xmm, xmm, xmm{k}{z}
  88111. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  88112. self.require(ISA_AVX512VL | ISA_AVX512BW)
  88113. p.domain = DomainAVX
  88114. p.add(0, func(m *_Encoding, v []interface{}) {
  88115. m.emit(0x62)
  88116. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  88117. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  88118. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  88119. m.emit(0x68)
  88120. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88121. })
  88122. }
  88123. // VPUNPCKHBW m128, xmm, xmm{k}{z}
  88124. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  88125. self.require(ISA_AVX512VL | ISA_AVX512BW)
  88126. p.domain = DomainAVX
  88127. p.add(0, func(m *_Encoding, v []interface{}) {
  88128. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  88129. m.emit(0x68)
  88130. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  88131. })
  88132. }
  88133. // VPUNPCKHBW ymm, ymm, ymm{k}{z}
  88134. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  88135. self.require(ISA_AVX512VL | ISA_AVX512BW)
  88136. p.domain = DomainAVX
  88137. p.add(0, func(m *_Encoding, v []interface{}) {
  88138. m.emit(0x62)
  88139. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  88140. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  88141. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  88142. m.emit(0x68)
  88143. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88144. })
  88145. }
  88146. // VPUNPCKHBW m256, ymm, ymm{k}{z}
  88147. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  88148. self.require(ISA_AVX512VL | ISA_AVX512BW)
  88149. p.domain = DomainAVX
  88150. p.add(0, func(m *_Encoding, v []interface{}) {
  88151. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  88152. m.emit(0x68)
  88153. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  88154. })
  88155. }
  88156. if p.len == 0 {
  88157. panic("invalid operands for VPUNPCKHBW")
  88158. }
  88159. return p
  88160. }
  88161. // VPUNPCKHDQ performs "Unpack and Interleave High-Order Doublewords into Quadwords".
  88162. //
  88163. // Mnemonic : VPUNPCKHDQ
  88164. // Supported forms : (10 forms)
  88165. //
  88166. // * VPUNPCKHDQ xmm, xmm, xmm [AVX]
  88167. // * VPUNPCKHDQ m128, xmm, xmm [AVX]
  88168. // * VPUNPCKHDQ ymm, ymm, ymm [AVX2]
  88169. // * VPUNPCKHDQ m256, ymm, ymm [AVX2]
  88170. // * VPUNPCKHDQ m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  88171. // * VPUNPCKHDQ zmm, zmm, zmm{k}{z} [AVX512F]
  88172. // * VPUNPCKHDQ m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  88173. // * VPUNPCKHDQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  88174. // * VPUNPCKHDQ m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  88175. // * VPUNPCKHDQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  88176. //
  88177. func (self *Program) VPUNPCKHDQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  88178. p := self.alloc("VPUNPCKHDQ", 3, Operands { v0, v1, v2 })
  88179. // VPUNPCKHDQ xmm, xmm, xmm
  88180. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  88181. self.require(ISA_AVX)
  88182. p.domain = DomainAVX
  88183. p.add(0, func(m *_Encoding, v []interface{}) {
  88184. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  88185. m.emit(0x6a)
  88186. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88187. })
  88188. }
  88189. // VPUNPCKHDQ m128, xmm, xmm
  88190. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  88191. self.require(ISA_AVX)
  88192. p.domain = DomainAVX
  88193. p.add(0, func(m *_Encoding, v []interface{}) {
  88194. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  88195. m.emit(0x6a)
  88196. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  88197. })
  88198. }
  88199. // VPUNPCKHDQ ymm, ymm, ymm
  88200. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  88201. self.require(ISA_AVX2)
  88202. p.domain = DomainAVX
  88203. p.add(0, func(m *_Encoding, v []interface{}) {
  88204. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  88205. m.emit(0x6a)
  88206. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88207. })
  88208. }
  88209. // VPUNPCKHDQ m256, ymm, ymm
  88210. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  88211. self.require(ISA_AVX2)
  88212. p.domain = DomainAVX
  88213. p.add(0, func(m *_Encoding, v []interface{}) {
  88214. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  88215. m.emit(0x6a)
  88216. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  88217. })
  88218. }
  88219. // VPUNPCKHDQ m512/m32bcst, zmm, zmm{k}{z}
  88220. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  88221. self.require(ISA_AVX512F)
  88222. p.domain = DomainAVX
  88223. p.add(0, func(m *_Encoding, v []interface{}) {
  88224. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  88225. m.emit(0x6a)
  88226. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  88227. })
  88228. }
  88229. // VPUNPCKHDQ zmm, zmm, zmm{k}{z}
  88230. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  88231. self.require(ISA_AVX512F)
  88232. p.domain = DomainAVX
  88233. p.add(0, func(m *_Encoding, v []interface{}) {
  88234. m.emit(0x62)
  88235. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  88236. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  88237. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  88238. m.emit(0x6a)
  88239. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88240. })
  88241. }
  88242. // VPUNPCKHDQ m128/m32bcst, xmm, xmm{k}{z}
  88243. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  88244. self.require(ISA_AVX512VL | ISA_AVX512F)
  88245. p.domain = DomainAVX
  88246. p.add(0, func(m *_Encoding, v []interface{}) {
  88247. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  88248. m.emit(0x6a)
  88249. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  88250. })
  88251. }
  88252. // VPUNPCKHDQ xmm, xmm, xmm{k}{z}
  88253. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  88254. self.require(ISA_AVX512VL | ISA_AVX512F)
  88255. p.domain = DomainAVX
  88256. p.add(0, func(m *_Encoding, v []interface{}) {
  88257. m.emit(0x62)
  88258. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  88259. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  88260. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  88261. m.emit(0x6a)
  88262. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88263. })
  88264. }
  88265. // VPUNPCKHDQ m256/m32bcst, ymm, ymm{k}{z}
  88266. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  88267. self.require(ISA_AVX512VL | ISA_AVX512F)
  88268. p.domain = DomainAVX
  88269. p.add(0, func(m *_Encoding, v []interface{}) {
  88270. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  88271. m.emit(0x6a)
  88272. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  88273. })
  88274. }
  88275. // VPUNPCKHDQ ymm, ymm, ymm{k}{z}
  88276. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  88277. self.require(ISA_AVX512VL | ISA_AVX512F)
  88278. p.domain = DomainAVX
  88279. p.add(0, func(m *_Encoding, v []interface{}) {
  88280. m.emit(0x62)
  88281. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  88282. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  88283. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  88284. m.emit(0x6a)
  88285. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88286. })
  88287. }
  88288. if p.len == 0 {
  88289. panic("invalid operands for VPUNPCKHDQ")
  88290. }
  88291. return p
  88292. }
  88293. // VPUNPCKHQDQ performs "Unpack and Interleave High-Order Quadwords into Double Quadwords".
  88294. //
  88295. // Mnemonic : VPUNPCKHQDQ
  88296. // Supported forms : (10 forms)
  88297. //
  88298. // * VPUNPCKHQDQ xmm, xmm, xmm [AVX]
  88299. // * VPUNPCKHQDQ m128, xmm, xmm [AVX]
  88300. // * VPUNPCKHQDQ ymm, ymm, ymm [AVX2]
  88301. // * VPUNPCKHQDQ m256, ymm, ymm [AVX2]
  88302. // * VPUNPCKHQDQ m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  88303. // * VPUNPCKHQDQ zmm, zmm, zmm{k}{z} [AVX512F]
  88304. // * VPUNPCKHQDQ m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  88305. // * VPUNPCKHQDQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  88306. // * VPUNPCKHQDQ m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  88307. // * VPUNPCKHQDQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  88308. //
  88309. func (self *Program) VPUNPCKHQDQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  88310. p := self.alloc("VPUNPCKHQDQ", 3, Operands { v0, v1, v2 })
  88311. // VPUNPCKHQDQ xmm, xmm, xmm
  88312. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  88313. self.require(ISA_AVX)
  88314. p.domain = DomainAVX
  88315. p.add(0, func(m *_Encoding, v []interface{}) {
  88316. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  88317. m.emit(0x6d)
  88318. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88319. })
  88320. }
  88321. // VPUNPCKHQDQ m128, xmm, xmm
  88322. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  88323. self.require(ISA_AVX)
  88324. p.domain = DomainAVX
  88325. p.add(0, func(m *_Encoding, v []interface{}) {
  88326. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  88327. m.emit(0x6d)
  88328. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  88329. })
  88330. }
  88331. // VPUNPCKHQDQ ymm, ymm, ymm
  88332. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  88333. self.require(ISA_AVX2)
  88334. p.domain = DomainAVX
  88335. p.add(0, func(m *_Encoding, v []interface{}) {
  88336. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  88337. m.emit(0x6d)
  88338. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88339. })
  88340. }
  88341. // VPUNPCKHQDQ m256, ymm, ymm
  88342. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  88343. self.require(ISA_AVX2)
  88344. p.domain = DomainAVX
  88345. p.add(0, func(m *_Encoding, v []interface{}) {
  88346. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  88347. m.emit(0x6d)
  88348. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  88349. })
  88350. }
  88351. // VPUNPCKHQDQ m512/m64bcst, zmm, zmm{k}{z}
  88352. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  88353. self.require(ISA_AVX512F)
  88354. p.domain = DomainAVX
  88355. p.add(0, func(m *_Encoding, v []interface{}) {
  88356. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  88357. m.emit(0x6d)
  88358. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  88359. })
  88360. }
  88361. // VPUNPCKHQDQ zmm, zmm, zmm{k}{z}
  88362. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  88363. self.require(ISA_AVX512F)
  88364. p.domain = DomainAVX
  88365. p.add(0, func(m *_Encoding, v []interface{}) {
  88366. m.emit(0x62)
  88367. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  88368. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  88369. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  88370. m.emit(0x6d)
  88371. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88372. })
  88373. }
  88374. // VPUNPCKHQDQ m128/m64bcst, xmm, xmm{k}{z}
  88375. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  88376. self.require(ISA_AVX512VL | ISA_AVX512F)
  88377. p.domain = DomainAVX
  88378. p.add(0, func(m *_Encoding, v []interface{}) {
  88379. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  88380. m.emit(0x6d)
  88381. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  88382. })
  88383. }
  88384. // VPUNPCKHQDQ xmm, xmm, xmm{k}{z}
  88385. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  88386. self.require(ISA_AVX512VL | ISA_AVX512F)
  88387. p.domain = DomainAVX
  88388. p.add(0, func(m *_Encoding, v []interface{}) {
  88389. m.emit(0x62)
  88390. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  88391. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  88392. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  88393. m.emit(0x6d)
  88394. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88395. })
  88396. }
  88397. // VPUNPCKHQDQ m256/m64bcst, ymm, ymm{k}{z}
  88398. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  88399. self.require(ISA_AVX512VL | ISA_AVX512F)
  88400. p.domain = DomainAVX
  88401. p.add(0, func(m *_Encoding, v []interface{}) {
  88402. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  88403. m.emit(0x6d)
  88404. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  88405. })
  88406. }
  88407. // VPUNPCKHQDQ ymm, ymm, ymm{k}{z}
  88408. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  88409. self.require(ISA_AVX512VL | ISA_AVX512F)
  88410. p.domain = DomainAVX
  88411. p.add(0, func(m *_Encoding, v []interface{}) {
  88412. m.emit(0x62)
  88413. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  88414. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  88415. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  88416. m.emit(0x6d)
  88417. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88418. })
  88419. }
  88420. if p.len == 0 {
  88421. panic("invalid operands for VPUNPCKHQDQ")
  88422. }
  88423. return p
  88424. }
  88425. // VPUNPCKHWD performs "Unpack and Interleave High-Order Words into Doublewords".
  88426. //
  88427. // Mnemonic : VPUNPCKHWD
  88428. // Supported forms : (10 forms)
  88429. //
  88430. // * VPUNPCKHWD xmm, xmm, xmm [AVX]
  88431. // * VPUNPCKHWD m128, xmm, xmm [AVX]
  88432. // * VPUNPCKHWD ymm, ymm, ymm [AVX2]
  88433. // * VPUNPCKHWD m256, ymm, ymm [AVX2]
  88434. // * VPUNPCKHWD zmm, zmm, zmm{k}{z} [AVX512BW]
  88435. // * VPUNPCKHWD m512, zmm, zmm{k}{z} [AVX512BW]
  88436. // * VPUNPCKHWD xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  88437. // * VPUNPCKHWD m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  88438. // * VPUNPCKHWD ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  88439. // * VPUNPCKHWD m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  88440. //
  88441. func (self *Program) VPUNPCKHWD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  88442. p := self.alloc("VPUNPCKHWD", 3, Operands { v0, v1, v2 })
  88443. // VPUNPCKHWD xmm, xmm, xmm
  88444. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  88445. self.require(ISA_AVX)
  88446. p.domain = DomainAVX
  88447. p.add(0, func(m *_Encoding, v []interface{}) {
  88448. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  88449. m.emit(0x69)
  88450. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88451. })
  88452. }
  88453. // VPUNPCKHWD m128, xmm, xmm
  88454. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  88455. self.require(ISA_AVX)
  88456. p.domain = DomainAVX
  88457. p.add(0, func(m *_Encoding, v []interface{}) {
  88458. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  88459. m.emit(0x69)
  88460. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  88461. })
  88462. }
  88463. // VPUNPCKHWD ymm, ymm, ymm
  88464. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  88465. self.require(ISA_AVX2)
  88466. p.domain = DomainAVX
  88467. p.add(0, func(m *_Encoding, v []interface{}) {
  88468. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  88469. m.emit(0x69)
  88470. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88471. })
  88472. }
  88473. // VPUNPCKHWD m256, ymm, ymm
  88474. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  88475. self.require(ISA_AVX2)
  88476. p.domain = DomainAVX
  88477. p.add(0, func(m *_Encoding, v []interface{}) {
  88478. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  88479. m.emit(0x69)
  88480. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  88481. })
  88482. }
  88483. // VPUNPCKHWD zmm, zmm, zmm{k}{z}
  88484. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  88485. self.require(ISA_AVX512BW)
  88486. p.domain = DomainAVX
  88487. p.add(0, func(m *_Encoding, v []interface{}) {
  88488. m.emit(0x62)
  88489. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  88490. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  88491. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  88492. m.emit(0x69)
  88493. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88494. })
  88495. }
  88496. // VPUNPCKHWD m512, zmm, zmm{k}{z}
  88497. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  88498. self.require(ISA_AVX512BW)
  88499. p.domain = DomainAVX
  88500. p.add(0, func(m *_Encoding, v []interface{}) {
  88501. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  88502. m.emit(0x69)
  88503. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  88504. })
  88505. }
  88506. // VPUNPCKHWD xmm, xmm, xmm{k}{z}
  88507. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  88508. self.require(ISA_AVX512VL | ISA_AVX512BW)
  88509. p.domain = DomainAVX
  88510. p.add(0, func(m *_Encoding, v []interface{}) {
  88511. m.emit(0x62)
  88512. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  88513. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  88514. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  88515. m.emit(0x69)
  88516. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88517. })
  88518. }
  88519. // VPUNPCKHWD m128, xmm, xmm{k}{z}
  88520. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  88521. self.require(ISA_AVX512VL | ISA_AVX512BW)
  88522. p.domain = DomainAVX
  88523. p.add(0, func(m *_Encoding, v []interface{}) {
  88524. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  88525. m.emit(0x69)
  88526. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  88527. })
  88528. }
  88529. // VPUNPCKHWD ymm, ymm, ymm{k}{z}
  88530. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  88531. self.require(ISA_AVX512VL | ISA_AVX512BW)
  88532. p.domain = DomainAVX
  88533. p.add(0, func(m *_Encoding, v []interface{}) {
  88534. m.emit(0x62)
  88535. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  88536. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  88537. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  88538. m.emit(0x69)
  88539. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88540. })
  88541. }
  88542. // VPUNPCKHWD m256, ymm, ymm{k}{z}
  88543. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  88544. self.require(ISA_AVX512VL | ISA_AVX512BW)
  88545. p.domain = DomainAVX
  88546. p.add(0, func(m *_Encoding, v []interface{}) {
  88547. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  88548. m.emit(0x69)
  88549. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  88550. })
  88551. }
  88552. if p.len == 0 {
  88553. panic("invalid operands for VPUNPCKHWD")
  88554. }
  88555. return p
  88556. }
  88557. // VPUNPCKLBW performs "Unpack and Interleave Low-Order Bytes into Words".
  88558. //
  88559. // Mnemonic : VPUNPCKLBW
  88560. // Supported forms : (10 forms)
  88561. //
  88562. // * VPUNPCKLBW xmm, xmm, xmm [AVX]
  88563. // * VPUNPCKLBW m128, xmm, xmm [AVX]
  88564. // * VPUNPCKLBW ymm, ymm, ymm [AVX2]
  88565. // * VPUNPCKLBW m256, ymm, ymm [AVX2]
  88566. // * VPUNPCKLBW zmm, zmm, zmm{k}{z} [AVX512BW]
  88567. // * VPUNPCKLBW m512, zmm, zmm{k}{z} [AVX512BW]
  88568. // * VPUNPCKLBW xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  88569. // * VPUNPCKLBW m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  88570. // * VPUNPCKLBW ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  88571. // * VPUNPCKLBW m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  88572. //
  88573. func (self *Program) VPUNPCKLBW(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  88574. p := self.alloc("VPUNPCKLBW", 3, Operands { v0, v1, v2 })
  88575. // VPUNPCKLBW xmm, xmm, xmm
  88576. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  88577. self.require(ISA_AVX)
  88578. p.domain = DomainAVX
  88579. p.add(0, func(m *_Encoding, v []interface{}) {
  88580. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  88581. m.emit(0x60)
  88582. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88583. })
  88584. }
  88585. // VPUNPCKLBW m128, xmm, xmm
  88586. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  88587. self.require(ISA_AVX)
  88588. p.domain = DomainAVX
  88589. p.add(0, func(m *_Encoding, v []interface{}) {
  88590. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  88591. m.emit(0x60)
  88592. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  88593. })
  88594. }
  88595. // VPUNPCKLBW ymm, ymm, ymm
  88596. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  88597. self.require(ISA_AVX2)
  88598. p.domain = DomainAVX
  88599. p.add(0, func(m *_Encoding, v []interface{}) {
  88600. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  88601. m.emit(0x60)
  88602. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88603. })
  88604. }
  88605. // VPUNPCKLBW m256, ymm, ymm
  88606. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  88607. self.require(ISA_AVX2)
  88608. p.domain = DomainAVX
  88609. p.add(0, func(m *_Encoding, v []interface{}) {
  88610. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  88611. m.emit(0x60)
  88612. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  88613. })
  88614. }
  88615. // VPUNPCKLBW zmm, zmm, zmm{k}{z}
  88616. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  88617. self.require(ISA_AVX512BW)
  88618. p.domain = DomainAVX
  88619. p.add(0, func(m *_Encoding, v []interface{}) {
  88620. m.emit(0x62)
  88621. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  88622. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  88623. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  88624. m.emit(0x60)
  88625. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88626. })
  88627. }
  88628. // VPUNPCKLBW m512, zmm, zmm{k}{z}
  88629. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  88630. self.require(ISA_AVX512BW)
  88631. p.domain = DomainAVX
  88632. p.add(0, func(m *_Encoding, v []interface{}) {
  88633. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  88634. m.emit(0x60)
  88635. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  88636. })
  88637. }
  88638. // VPUNPCKLBW xmm, xmm, xmm{k}{z}
  88639. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  88640. self.require(ISA_AVX512VL | ISA_AVX512BW)
  88641. p.domain = DomainAVX
  88642. p.add(0, func(m *_Encoding, v []interface{}) {
  88643. m.emit(0x62)
  88644. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  88645. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  88646. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  88647. m.emit(0x60)
  88648. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88649. })
  88650. }
  88651. // VPUNPCKLBW m128, xmm, xmm{k}{z}
  88652. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  88653. self.require(ISA_AVX512VL | ISA_AVX512BW)
  88654. p.domain = DomainAVX
  88655. p.add(0, func(m *_Encoding, v []interface{}) {
  88656. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  88657. m.emit(0x60)
  88658. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  88659. })
  88660. }
  88661. // VPUNPCKLBW ymm, ymm, ymm{k}{z}
  88662. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  88663. self.require(ISA_AVX512VL | ISA_AVX512BW)
  88664. p.domain = DomainAVX
  88665. p.add(0, func(m *_Encoding, v []interface{}) {
  88666. m.emit(0x62)
  88667. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  88668. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  88669. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  88670. m.emit(0x60)
  88671. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88672. })
  88673. }
  88674. // VPUNPCKLBW m256, ymm, ymm{k}{z}
  88675. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  88676. self.require(ISA_AVX512VL | ISA_AVX512BW)
  88677. p.domain = DomainAVX
  88678. p.add(0, func(m *_Encoding, v []interface{}) {
  88679. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  88680. m.emit(0x60)
  88681. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  88682. })
  88683. }
  88684. if p.len == 0 {
  88685. panic("invalid operands for VPUNPCKLBW")
  88686. }
  88687. return p
  88688. }
  88689. // VPUNPCKLDQ performs "Unpack and Interleave Low-Order Doublewords into Quadwords".
  88690. //
  88691. // Mnemonic : VPUNPCKLDQ
  88692. // Supported forms : (10 forms)
  88693. //
  88694. // * VPUNPCKLDQ xmm, xmm, xmm [AVX]
  88695. // * VPUNPCKLDQ m128, xmm, xmm [AVX]
  88696. // * VPUNPCKLDQ ymm, ymm, ymm [AVX2]
  88697. // * VPUNPCKLDQ m256, ymm, ymm [AVX2]
  88698. // * VPUNPCKLDQ m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  88699. // * VPUNPCKLDQ zmm, zmm, zmm{k}{z} [AVX512F]
  88700. // * VPUNPCKLDQ m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  88701. // * VPUNPCKLDQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  88702. // * VPUNPCKLDQ m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  88703. // * VPUNPCKLDQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  88704. //
  88705. func (self *Program) VPUNPCKLDQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  88706. p := self.alloc("VPUNPCKLDQ", 3, Operands { v0, v1, v2 })
  88707. // VPUNPCKLDQ xmm, xmm, xmm
  88708. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  88709. self.require(ISA_AVX)
  88710. p.domain = DomainAVX
  88711. p.add(0, func(m *_Encoding, v []interface{}) {
  88712. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  88713. m.emit(0x62)
  88714. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88715. })
  88716. }
  88717. // VPUNPCKLDQ m128, xmm, xmm
  88718. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  88719. self.require(ISA_AVX)
  88720. p.domain = DomainAVX
  88721. p.add(0, func(m *_Encoding, v []interface{}) {
  88722. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  88723. m.emit(0x62)
  88724. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  88725. })
  88726. }
  88727. // VPUNPCKLDQ ymm, ymm, ymm
  88728. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  88729. self.require(ISA_AVX2)
  88730. p.domain = DomainAVX
  88731. p.add(0, func(m *_Encoding, v []interface{}) {
  88732. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  88733. m.emit(0x62)
  88734. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88735. })
  88736. }
  88737. // VPUNPCKLDQ m256, ymm, ymm
  88738. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  88739. self.require(ISA_AVX2)
  88740. p.domain = DomainAVX
  88741. p.add(0, func(m *_Encoding, v []interface{}) {
  88742. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  88743. m.emit(0x62)
  88744. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  88745. })
  88746. }
  88747. // VPUNPCKLDQ m512/m32bcst, zmm, zmm{k}{z}
  88748. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  88749. self.require(ISA_AVX512F)
  88750. p.domain = DomainAVX
  88751. p.add(0, func(m *_Encoding, v []interface{}) {
  88752. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  88753. m.emit(0x62)
  88754. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  88755. })
  88756. }
  88757. // VPUNPCKLDQ zmm, zmm, zmm{k}{z}
  88758. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  88759. self.require(ISA_AVX512F)
  88760. p.domain = DomainAVX
  88761. p.add(0, func(m *_Encoding, v []interface{}) {
  88762. m.emit(0x62)
  88763. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  88764. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  88765. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  88766. m.emit(0x62)
  88767. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88768. })
  88769. }
  88770. // VPUNPCKLDQ m128/m32bcst, xmm, xmm{k}{z}
  88771. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  88772. self.require(ISA_AVX512VL | ISA_AVX512F)
  88773. p.domain = DomainAVX
  88774. p.add(0, func(m *_Encoding, v []interface{}) {
  88775. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  88776. m.emit(0x62)
  88777. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  88778. })
  88779. }
  88780. // VPUNPCKLDQ xmm, xmm, xmm{k}{z}
  88781. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  88782. self.require(ISA_AVX512VL | ISA_AVX512F)
  88783. p.domain = DomainAVX
  88784. p.add(0, func(m *_Encoding, v []interface{}) {
  88785. m.emit(0x62)
  88786. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  88787. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  88788. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  88789. m.emit(0x62)
  88790. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88791. })
  88792. }
  88793. // VPUNPCKLDQ m256/m32bcst, ymm, ymm{k}{z}
  88794. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  88795. self.require(ISA_AVX512VL | ISA_AVX512F)
  88796. p.domain = DomainAVX
  88797. p.add(0, func(m *_Encoding, v []interface{}) {
  88798. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  88799. m.emit(0x62)
  88800. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  88801. })
  88802. }
  88803. // VPUNPCKLDQ ymm, ymm, ymm{k}{z}
  88804. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  88805. self.require(ISA_AVX512VL | ISA_AVX512F)
  88806. p.domain = DomainAVX
  88807. p.add(0, func(m *_Encoding, v []interface{}) {
  88808. m.emit(0x62)
  88809. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  88810. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  88811. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  88812. m.emit(0x62)
  88813. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88814. })
  88815. }
  88816. if p.len == 0 {
  88817. panic("invalid operands for VPUNPCKLDQ")
  88818. }
  88819. return p
  88820. }
  88821. // VPUNPCKLQDQ performs "Unpack and Interleave Low-Order Quadwords into Double Quadwords".
  88822. //
  88823. // Mnemonic : VPUNPCKLQDQ
  88824. // Supported forms : (10 forms)
  88825. //
  88826. // * VPUNPCKLQDQ xmm, xmm, xmm [AVX]
  88827. // * VPUNPCKLQDQ m128, xmm, xmm [AVX]
  88828. // * VPUNPCKLQDQ ymm, ymm, ymm [AVX2]
  88829. // * VPUNPCKLQDQ m256, ymm, ymm [AVX2]
  88830. // * VPUNPCKLQDQ m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  88831. // * VPUNPCKLQDQ zmm, zmm, zmm{k}{z} [AVX512F]
  88832. // * VPUNPCKLQDQ m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  88833. // * VPUNPCKLQDQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  88834. // * VPUNPCKLQDQ m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  88835. // * VPUNPCKLQDQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  88836. //
  88837. func (self *Program) VPUNPCKLQDQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  88838. p := self.alloc("VPUNPCKLQDQ", 3, Operands { v0, v1, v2 })
  88839. // VPUNPCKLQDQ xmm, xmm, xmm
  88840. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  88841. self.require(ISA_AVX)
  88842. p.domain = DomainAVX
  88843. p.add(0, func(m *_Encoding, v []interface{}) {
  88844. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  88845. m.emit(0x6c)
  88846. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88847. })
  88848. }
  88849. // VPUNPCKLQDQ m128, xmm, xmm
  88850. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  88851. self.require(ISA_AVX)
  88852. p.domain = DomainAVX
  88853. p.add(0, func(m *_Encoding, v []interface{}) {
  88854. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  88855. m.emit(0x6c)
  88856. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  88857. })
  88858. }
  88859. // VPUNPCKLQDQ ymm, ymm, ymm
  88860. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  88861. self.require(ISA_AVX2)
  88862. p.domain = DomainAVX
  88863. p.add(0, func(m *_Encoding, v []interface{}) {
  88864. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  88865. m.emit(0x6c)
  88866. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88867. })
  88868. }
  88869. // VPUNPCKLQDQ m256, ymm, ymm
  88870. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  88871. self.require(ISA_AVX2)
  88872. p.domain = DomainAVX
  88873. p.add(0, func(m *_Encoding, v []interface{}) {
  88874. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  88875. m.emit(0x6c)
  88876. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  88877. })
  88878. }
  88879. // VPUNPCKLQDQ m512/m64bcst, zmm, zmm{k}{z}
  88880. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  88881. self.require(ISA_AVX512F)
  88882. p.domain = DomainAVX
  88883. p.add(0, func(m *_Encoding, v []interface{}) {
  88884. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  88885. m.emit(0x6c)
  88886. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  88887. })
  88888. }
  88889. // VPUNPCKLQDQ zmm, zmm, zmm{k}{z}
  88890. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  88891. self.require(ISA_AVX512F)
  88892. p.domain = DomainAVX
  88893. p.add(0, func(m *_Encoding, v []interface{}) {
  88894. m.emit(0x62)
  88895. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  88896. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  88897. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  88898. m.emit(0x6c)
  88899. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88900. })
  88901. }
  88902. // VPUNPCKLQDQ m128/m64bcst, xmm, xmm{k}{z}
  88903. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  88904. self.require(ISA_AVX512VL | ISA_AVX512F)
  88905. p.domain = DomainAVX
  88906. p.add(0, func(m *_Encoding, v []interface{}) {
  88907. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  88908. m.emit(0x6c)
  88909. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  88910. })
  88911. }
  88912. // VPUNPCKLQDQ xmm, xmm, xmm{k}{z}
  88913. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  88914. self.require(ISA_AVX512VL | ISA_AVX512F)
  88915. p.domain = DomainAVX
  88916. p.add(0, func(m *_Encoding, v []interface{}) {
  88917. m.emit(0x62)
  88918. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  88919. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  88920. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  88921. m.emit(0x6c)
  88922. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88923. })
  88924. }
  88925. // VPUNPCKLQDQ m256/m64bcst, ymm, ymm{k}{z}
  88926. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  88927. self.require(ISA_AVX512VL | ISA_AVX512F)
  88928. p.domain = DomainAVX
  88929. p.add(0, func(m *_Encoding, v []interface{}) {
  88930. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  88931. m.emit(0x6c)
  88932. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  88933. })
  88934. }
  88935. // VPUNPCKLQDQ ymm, ymm, ymm{k}{z}
  88936. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  88937. self.require(ISA_AVX512VL | ISA_AVX512F)
  88938. p.domain = DomainAVX
  88939. p.add(0, func(m *_Encoding, v []interface{}) {
  88940. m.emit(0x62)
  88941. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  88942. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  88943. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  88944. m.emit(0x6c)
  88945. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88946. })
  88947. }
  88948. if p.len == 0 {
  88949. panic("invalid operands for VPUNPCKLQDQ")
  88950. }
  88951. return p
  88952. }
  88953. // VPUNPCKLWD performs "Unpack and Interleave Low-Order Words into Doublewords".
  88954. //
  88955. // Mnemonic : VPUNPCKLWD
  88956. // Supported forms : (10 forms)
  88957. //
  88958. // * VPUNPCKLWD xmm, xmm, xmm [AVX]
  88959. // * VPUNPCKLWD m128, xmm, xmm [AVX]
  88960. // * VPUNPCKLWD ymm, ymm, ymm [AVX2]
  88961. // * VPUNPCKLWD m256, ymm, ymm [AVX2]
  88962. // * VPUNPCKLWD zmm, zmm, zmm{k}{z} [AVX512BW]
  88963. // * VPUNPCKLWD m512, zmm, zmm{k}{z} [AVX512BW]
  88964. // * VPUNPCKLWD xmm, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  88965. // * VPUNPCKLWD m128, xmm, xmm{k}{z} [AVX512BW,AVX512VL]
  88966. // * VPUNPCKLWD ymm, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  88967. // * VPUNPCKLWD m256, ymm, ymm{k}{z} [AVX512BW,AVX512VL]
  88968. //
  88969. func (self *Program) VPUNPCKLWD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  88970. p := self.alloc("VPUNPCKLWD", 3, Operands { v0, v1, v2 })
  88971. // VPUNPCKLWD xmm, xmm, xmm
  88972. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  88973. self.require(ISA_AVX)
  88974. p.domain = DomainAVX
  88975. p.add(0, func(m *_Encoding, v []interface{}) {
  88976. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  88977. m.emit(0x61)
  88978. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88979. })
  88980. }
  88981. // VPUNPCKLWD m128, xmm, xmm
  88982. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  88983. self.require(ISA_AVX)
  88984. p.domain = DomainAVX
  88985. p.add(0, func(m *_Encoding, v []interface{}) {
  88986. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  88987. m.emit(0x61)
  88988. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  88989. })
  88990. }
  88991. // VPUNPCKLWD ymm, ymm, ymm
  88992. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  88993. self.require(ISA_AVX2)
  88994. p.domain = DomainAVX
  88995. p.add(0, func(m *_Encoding, v []interface{}) {
  88996. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  88997. m.emit(0x61)
  88998. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  88999. })
  89000. }
  89001. // VPUNPCKLWD m256, ymm, ymm
  89002. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  89003. self.require(ISA_AVX2)
  89004. p.domain = DomainAVX
  89005. p.add(0, func(m *_Encoding, v []interface{}) {
  89006. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  89007. m.emit(0x61)
  89008. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  89009. })
  89010. }
  89011. // VPUNPCKLWD zmm, zmm, zmm{k}{z}
  89012. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  89013. self.require(ISA_AVX512BW)
  89014. p.domain = DomainAVX
  89015. p.add(0, func(m *_Encoding, v []interface{}) {
  89016. m.emit(0x62)
  89017. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  89018. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  89019. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  89020. m.emit(0x61)
  89021. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  89022. })
  89023. }
  89024. // VPUNPCKLWD m512, zmm, zmm{k}{z}
  89025. if isM512(v0) && isZMM(v1) && isZMMkz(v2) {
  89026. self.require(ISA_AVX512BW)
  89027. p.domain = DomainAVX
  89028. p.add(0, func(m *_Encoding, v []interface{}) {
  89029. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  89030. m.emit(0x61)
  89031. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  89032. })
  89033. }
  89034. // VPUNPCKLWD xmm, xmm, xmm{k}{z}
  89035. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  89036. self.require(ISA_AVX512VL | ISA_AVX512BW)
  89037. p.domain = DomainAVX
  89038. p.add(0, func(m *_Encoding, v []interface{}) {
  89039. m.emit(0x62)
  89040. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  89041. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  89042. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  89043. m.emit(0x61)
  89044. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  89045. })
  89046. }
  89047. // VPUNPCKLWD m128, xmm, xmm{k}{z}
  89048. if isM128(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  89049. self.require(ISA_AVX512VL | ISA_AVX512BW)
  89050. p.domain = DomainAVX
  89051. p.add(0, func(m *_Encoding, v []interface{}) {
  89052. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  89053. m.emit(0x61)
  89054. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  89055. })
  89056. }
  89057. // VPUNPCKLWD ymm, ymm, ymm{k}{z}
  89058. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  89059. self.require(ISA_AVX512VL | ISA_AVX512BW)
  89060. p.domain = DomainAVX
  89061. p.add(0, func(m *_Encoding, v []interface{}) {
  89062. m.emit(0x62)
  89063. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  89064. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  89065. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  89066. m.emit(0x61)
  89067. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  89068. })
  89069. }
  89070. // VPUNPCKLWD m256, ymm, ymm{k}{z}
  89071. if isM256(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  89072. self.require(ISA_AVX512VL | ISA_AVX512BW)
  89073. p.domain = DomainAVX
  89074. p.add(0, func(m *_Encoding, v []interface{}) {
  89075. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  89076. m.emit(0x61)
  89077. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  89078. })
  89079. }
  89080. if p.len == 0 {
  89081. panic("invalid operands for VPUNPCKLWD")
  89082. }
  89083. return p
  89084. }
  89085. // VPXOR performs "Packed Bitwise Logical Exclusive OR".
  89086. //
  89087. // Mnemonic : VPXOR
  89088. // Supported forms : (4 forms)
  89089. //
  89090. // * VPXOR xmm, xmm, xmm [AVX]
  89091. // * VPXOR m128, xmm, xmm [AVX]
  89092. // * VPXOR ymm, ymm, ymm [AVX2]
  89093. // * VPXOR m256, ymm, ymm [AVX2]
  89094. //
  89095. func (self *Program) VPXOR(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  89096. p := self.alloc("VPXOR", 3, Operands { v0, v1, v2 })
  89097. // VPXOR xmm, xmm, xmm
  89098. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  89099. self.require(ISA_AVX)
  89100. p.domain = DomainAVX
  89101. p.add(0, func(m *_Encoding, v []interface{}) {
  89102. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  89103. m.emit(0xef)
  89104. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  89105. })
  89106. }
  89107. // VPXOR m128, xmm, xmm
  89108. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  89109. self.require(ISA_AVX)
  89110. p.domain = DomainAVX
  89111. p.add(0, func(m *_Encoding, v []interface{}) {
  89112. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  89113. m.emit(0xef)
  89114. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  89115. })
  89116. }
  89117. // VPXOR ymm, ymm, ymm
  89118. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  89119. self.require(ISA_AVX2)
  89120. p.domain = DomainAVX
  89121. p.add(0, func(m *_Encoding, v []interface{}) {
  89122. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  89123. m.emit(0xef)
  89124. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  89125. })
  89126. }
  89127. // VPXOR m256, ymm, ymm
  89128. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  89129. self.require(ISA_AVX2)
  89130. p.domain = DomainAVX
  89131. p.add(0, func(m *_Encoding, v []interface{}) {
  89132. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  89133. m.emit(0xef)
  89134. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  89135. })
  89136. }
  89137. if p.len == 0 {
  89138. panic("invalid operands for VPXOR")
  89139. }
  89140. return p
  89141. }
  89142. // VPXORD performs "Bitwise Logical Exclusive OR of Packed Doubleword Integers".
  89143. //
  89144. // Mnemonic : VPXORD
  89145. // Supported forms : (6 forms)
  89146. //
  89147. // * VPXORD m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  89148. // * VPXORD zmm, zmm, zmm{k}{z} [AVX512F]
  89149. // * VPXORD m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  89150. // * VPXORD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  89151. // * VPXORD m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  89152. // * VPXORD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  89153. //
  89154. func (self *Program) VPXORD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  89155. p := self.alloc("VPXORD", 3, Operands { v0, v1, v2 })
  89156. // VPXORD m512/m32bcst, zmm, zmm{k}{z}
  89157. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  89158. self.require(ISA_AVX512F)
  89159. p.domain = DomainAVX
  89160. p.add(0, func(m *_Encoding, v []interface{}) {
  89161. m.evex(0b01, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  89162. m.emit(0xef)
  89163. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  89164. })
  89165. }
  89166. // VPXORD zmm, zmm, zmm{k}{z}
  89167. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  89168. self.require(ISA_AVX512F)
  89169. p.domain = DomainAVX
  89170. p.add(0, func(m *_Encoding, v []interface{}) {
  89171. m.emit(0x62)
  89172. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  89173. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  89174. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  89175. m.emit(0xef)
  89176. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  89177. })
  89178. }
  89179. // VPXORD m128/m32bcst, xmm, xmm{k}{z}
  89180. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  89181. self.require(ISA_AVX512VL | ISA_AVX512F)
  89182. p.domain = DomainAVX
  89183. p.add(0, func(m *_Encoding, v []interface{}) {
  89184. m.evex(0b01, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  89185. m.emit(0xef)
  89186. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  89187. })
  89188. }
  89189. // VPXORD xmm, xmm, xmm{k}{z}
  89190. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  89191. self.require(ISA_AVX512VL | ISA_AVX512F)
  89192. p.domain = DomainAVX
  89193. p.add(0, func(m *_Encoding, v []interface{}) {
  89194. m.emit(0x62)
  89195. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  89196. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  89197. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  89198. m.emit(0xef)
  89199. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  89200. })
  89201. }
  89202. // VPXORD m256/m32bcst, ymm, ymm{k}{z}
  89203. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  89204. self.require(ISA_AVX512VL | ISA_AVX512F)
  89205. p.domain = DomainAVX
  89206. p.add(0, func(m *_Encoding, v []interface{}) {
  89207. m.evex(0b01, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  89208. m.emit(0xef)
  89209. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  89210. })
  89211. }
  89212. // VPXORD ymm, ymm, ymm{k}{z}
  89213. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  89214. self.require(ISA_AVX512VL | ISA_AVX512F)
  89215. p.domain = DomainAVX
  89216. p.add(0, func(m *_Encoding, v []interface{}) {
  89217. m.emit(0x62)
  89218. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  89219. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  89220. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  89221. m.emit(0xef)
  89222. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  89223. })
  89224. }
  89225. if p.len == 0 {
  89226. panic("invalid operands for VPXORD")
  89227. }
  89228. return p
  89229. }
  89230. // VPXORQ performs "Bitwise Logical Exclusive OR of Packed Quadword Integers".
  89231. //
  89232. // Mnemonic : VPXORQ
  89233. // Supported forms : (6 forms)
  89234. //
  89235. // * VPXORQ m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  89236. // * VPXORQ zmm, zmm, zmm{k}{z} [AVX512F]
  89237. // * VPXORQ m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  89238. // * VPXORQ xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  89239. // * VPXORQ m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  89240. // * VPXORQ ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  89241. //
  89242. func (self *Program) VPXORQ(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  89243. p := self.alloc("VPXORQ", 3, Operands { v0, v1, v2 })
  89244. // VPXORQ m512/m64bcst, zmm, zmm{k}{z}
  89245. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  89246. self.require(ISA_AVX512F)
  89247. p.domain = DomainAVX
  89248. p.add(0, func(m *_Encoding, v []interface{}) {
  89249. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  89250. m.emit(0xef)
  89251. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  89252. })
  89253. }
  89254. // VPXORQ zmm, zmm, zmm{k}{z}
  89255. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  89256. self.require(ISA_AVX512F)
  89257. p.domain = DomainAVX
  89258. p.add(0, func(m *_Encoding, v []interface{}) {
  89259. m.emit(0x62)
  89260. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  89261. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  89262. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  89263. m.emit(0xef)
  89264. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  89265. })
  89266. }
  89267. // VPXORQ m128/m64bcst, xmm, xmm{k}{z}
  89268. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  89269. self.require(ISA_AVX512VL | ISA_AVX512F)
  89270. p.domain = DomainAVX
  89271. p.add(0, func(m *_Encoding, v []interface{}) {
  89272. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  89273. m.emit(0xef)
  89274. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  89275. })
  89276. }
  89277. // VPXORQ xmm, xmm, xmm{k}{z}
  89278. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  89279. self.require(ISA_AVX512VL | ISA_AVX512F)
  89280. p.domain = DomainAVX
  89281. p.add(0, func(m *_Encoding, v []interface{}) {
  89282. m.emit(0x62)
  89283. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  89284. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  89285. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  89286. m.emit(0xef)
  89287. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  89288. })
  89289. }
  89290. // VPXORQ m256/m64bcst, ymm, ymm{k}{z}
  89291. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  89292. self.require(ISA_AVX512VL | ISA_AVX512F)
  89293. p.domain = DomainAVX
  89294. p.add(0, func(m *_Encoding, v []interface{}) {
  89295. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  89296. m.emit(0xef)
  89297. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  89298. })
  89299. }
  89300. // VPXORQ ymm, ymm, ymm{k}{z}
  89301. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  89302. self.require(ISA_AVX512VL | ISA_AVX512F)
  89303. p.domain = DomainAVX
  89304. p.add(0, func(m *_Encoding, v []interface{}) {
  89305. m.emit(0x62)
  89306. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  89307. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  89308. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  89309. m.emit(0xef)
  89310. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  89311. })
  89312. }
  89313. if p.len == 0 {
  89314. panic("invalid operands for VPXORQ")
  89315. }
  89316. return p
  89317. }
  89318. // VRANGEPD performs "Range Restriction Calculation For Packed Pairs of Double-Precision Floating-Point Values".
  89319. //
  89320. // Mnemonic : VRANGEPD
  89321. // Supported forms : (7 forms)
  89322. //
  89323. // * VRANGEPD imm8, m512/m64bcst, zmm, zmm{k}{z} [AVX512DQ]
  89324. // * VRANGEPD imm8, {sae}, zmm, zmm, zmm{k}{z} [AVX512DQ]
  89325. // * VRANGEPD imm8, zmm, zmm, zmm{k}{z} [AVX512DQ]
  89326. // * VRANGEPD imm8, m128/m64bcst, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  89327. // * VRANGEPD imm8, xmm, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  89328. // * VRANGEPD imm8, m256/m64bcst, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  89329. // * VRANGEPD imm8, ymm, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  89330. //
  89331. func (self *Program) VRANGEPD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}, vv ...interface{}) *Instruction {
  89332. var p *Instruction
  89333. switch len(vv) {
  89334. case 0 : p = self.alloc("VRANGEPD", 4, Operands { v0, v1, v2, v3 })
  89335. case 1 : p = self.alloc("VRANGEPD", 5, Operands { v0, v1, v2, v3, vv[0] })
  89336. default : panic("instruction VRANGEPD takes 4 or 5 operands")
  89337. }
  89338. // VRANGEPD imm8, m512/m64bcst, zmm, zmm{k}{z}
  89339. if len(vv) == 0 && isImm8(v0) && isM512M64bcst(v1) && isZMM(v2) && isZMMkz(v3) {
  89340. self.require(ISA_AVX512DQ)
  89341. p.domain = DomainAVX
  89342. p.add(0, func(m *_Encoding, v []interface{}) {
  89343. m.evex(0b11, 0x85, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  89344. m.emit(0x50)
  89345. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  89346. m.imm1(toImmAny(v[0]))
  89347. })
  89348. }
  89349. // VRANGEPD imm8, {sae}, zmm, zmm, zmm{k}{z}
  89350. if len(vv) == 1 && isImm8(v0) && isSAE(v1) && isZMM(v2) && isZMM(v3) && isZMMkz(vv[0]) {
  89351. self.require(ISA_AVX512DQ)
  89352. p.domain = DomainAVX
  89353. p.add(0, func(m *_Encoding, v []interface{}) {
  89354. m.emit(0x62)
  89355. m.emit(0xf3 ^ ((hcode(v[4]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[4]) << 4)))
  89356. m.emit(0xfd ^ (hlcode(v[3]) << 3))
  89357. m.emit((zcode(v[4]) << 7) | (0x08 ^ (ecode(v[3]) << 3)) | kcode(v[4]) | 0x10)
  89358. m.emit(0x50)
  89359. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[2]))
  89360. m.imm1(toImmAny(v[0]))
  89361. })
  89362. }
  89363. // VRANGEPD imm8, zmm, zmm, zmm{k}{z}
  89364. if len(vv) == 0 && isImm8(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(v3) {
  89365. self.require(ISA_AVX512DQ)
  89366. p.domain = DomainAVX
  89367. p.add(0, func(m *_Encoding, v []interface{}) {
  89368. m.emit(0x62)
  89369. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  89370. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  89371. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  89372. m.emit(0x50)
  89373. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  89374. m.imm1(toImmAny(v[0]))
  89375. })
  89376. }
  89377. // VRANGEPD imm8, m128/m64bcst, xmm, xmm{k}{z}
  89378. if len(vv) == 0 && isImm8(v0) && isM128M64bcst(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  89379. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  89380. p.domain = DomainAVX
  89381. p.add(0, func(m *_Encoding, v []interface{}) {
  89382. m.evex(0b11, 0x85, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  89383. m.emit(0x50)
  89384. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  89385. m.imm1(toImmAny(v[0]))
  89386. })
  89387. }
  89388. // VRANGEPD imm8, xmm, xmm, xmm{k}{z}
  89389. if len(vv) == 0 && isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  89390. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  89391. p.domain = DomainAVX
  89392. p.add(0, func(m *_Encoding, v []interface{}) {
  89393. m.emit(0x62)
  89394. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  89395. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  89396. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  89397. m.emit(0x50)
  89398. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  89399. m.imm1(toImmAny(v[0]))
  89400. })
  89401. }
  89402. // VRANGEPD imm8, m256/m64bcst, ymm, ymm{k}{z}
  89403. if len(vv) == 0 && isImm8(v0) && isM256M64bcst(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  89404. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  89405. p.domain = DomainAVX
  89406. p.add(0, func(m *_Encoding, v []interface{}) {
  89407. m.evex(0b11, 0x85, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  89408. m.emit(0x50)
  89409. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  89410. m.imm1(toImmAny(v[0]))
  89411. })
  89412. }
  89413. // VRANGEPD imm8, ymm, ymm, ymm{k}{z}
  89414. if len(vv) == 0 && isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  89415. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  89416. p.domain = DomainAVX
  89417. p.add(0, func(m *_Encoding, v []interface{}) {
  89418. m.emit(0x62)
  89419. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  89420. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  89421. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  89422. m.emit(0x50)
  89423. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  89424. m.imm1(toImmAny(v[0]))
  89425. })
  89426. }
  89427. if p.len == 0 {
  89428. panic("invalid operands for VRANGEPD")
  89429. }
  89430. return p
  89431. }
  89432. // VRANGEPS performs "Range Restriction Calculation For Packed Pairs of Single-Precision Floating-Point Values".
  89433. //
  89434. // Mnemonic : VRANGEPS
  89435. // Supported forms : (7 forms)
  89436. //
  89437. // * VRANGEPS imm8, m512/m32bcst, zmm, zmm{k}{z} [AVX512DQ]
  89438. // * VRANGEPS imm8, {sae}, zmm, zmm, zmm{k}{z} [AVX512DQ]
  89439. // * VRANGEPS imm8, zmm, zmm, zmm{k}{z} [AVX512DQ]
  89440. // * VRANGEPS imm8, m128/m32bcst, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  89441. // * VRANGEPS imm8, xmm, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  89442. // * VRANGEPS imm8, m256/m32bcst, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  89443. // * VRANGEPS imm8, ymm, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  89444. //
  89445. func (self *Program) VRANGEPS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}, vv ...interface{}) *Instruction {
  89446. var p *Instruction
  89447. switch len(vv) {
  89448. case 0 : p = self.alloc("VRANGEPS", 4, Operands { v0, v1, v2, v3 })
  89449. case 1 : p = self.alloc("VRANGEPS", 5, Operands { v0, v1, v2, v3, vv[0] })
  89450. default : panic("instruction VRANGEPS takes 4 or 5 operands")
  89451. }
  89452. // VRANGEPS imm8, m512/m32bcst, zmm, zmm{k}{z}
  89453. if len(vv) == 0 && isImm8(v0) && isM512M32bcst(v1) && isZMM(v2) && isZMMkz(v3) {
  89454. self.require(ISA_AVX512DQ)
  89455. p.domain = DomainAVX
  89456. p.add(0, func(m *_Encoding, v []interface{}) {
  89457. m.evex(0b11, 0x05, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  89458. m.emit(0x50)
  89459. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  89460. m.imm1(toImmAny(v[0]))
  89461. })
  89462. }
  89463. // VRANGEPS imm8, {sae}, zmm, zmm, zmm{k}{z}
  89464. if len(vv) == 1 && isImm8(v0) && isSAE(v1) && isZMM(v2) && isZMM(v3) && isZMMkz(vv[0]) {
  89465. self.require(ISA_AVX512DQ)
  89466. p.domain = DomainAVX
  89467. p.add(0, func(m *_Encoding, v []interface{}) {
  89468. m.emit(0x62)
  89469. m.emit(0xf3 ^ ((hcode(v[4]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[4]) << 4)))
  89470. m.emit(0x7d ^ (hlcode(v[3]) << 3))
  89471. m.emit((zcode(v[4]) << 7) | (0x08 ^ (ecode(v[3]) << 3)) | kcode(v[4]) | 0x10)
  89472. m.emit(0x50)
  89473. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[2]))
  89474. m.imm1(toImmAny(v[0]))
  89475. })
  89476. }
  89477. // VRANGEPS imm8, zmm, zmm, zmm{k}{z}
  89478. if len(vv) == 0 && isImm8(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(v3) {
  89479. self.require(ISA_AVX512DQ)
  89480. p.domain = DomainAVX
  89481. p.add(0, func(m *_Encoding, v []interface{}) {
  89482. m.emit(0x62)
  89483. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  89484. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  89485. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  89486. m.emit(0x50)
  89487. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  89488. m.imm1(toImmAny(v[0]))
  89489. })
  89490. }
  89491. // VRANGEPS imm8, m128/m32bcst, xmm, xmm{k}{z}
  89492. if len(vv) == 0 && isImm8(v0) && isM128M32bcst(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  89493. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  89494. p.domain = DomainAVX
  89495. p.add(0, func(m *_Encoding, v []interface{}) {
  89496. m.evex(0b11, 0x05, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  89497. m.emit(0x50)
  89498. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  89499. m.imm1(toImmAny(v[0]))
  89500. })
  89501. }
  89502. // VRANGEPS imm8, xmm, xmm, xmm{k}{z}
  89503. if len(vv) == 0 && isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  89504. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  89505. p.domain = DomainAVX
  89506. p.add(0, func(m *_Encoding, v []interface{}) {
  89507. m.emit(0x62)
  89508. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  89509. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  89510. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  89511. m.emit(0x50)
  89512. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  89513. m.imm1(toImmAny(v[0]))
  89514. })
  89515. }
  89516. // VRANGEPS imm8, m256/m32bcst, ymm, ymm{k}{z}
  89517. if len(vv) == 0 && isImm8(v0) && isM256M32bcst(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  89518. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  89519. p.domain = DomainAVX
  89520. p.add(0, func(m *_Encoding, v []interface{}) {
  89521. m.evex(0b11, 0x05, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  89522. m.emit(0x50)
  89523. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  89524. m.imm1(toImmAny(v[0]))
  89525. })
  89526. }
  89527. // VRANGEPS imm8, ymm, ymm, ymm{k}{z}
  89528. if len(vv) == 0 && isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  89529. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  89530. p.domain = DomainAVX
  89531. p.add(0, func(m *_Encoding, v []interface{}) {
  89532. m.emit(0x62)
  89533. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  89534. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  89535. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  89536. m.emit(0x50)
  89537. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  89538. m.imm1(toImmAny(v[0]))
  89539. })
  89540. }
  89541. if p.len == 0 {
  89542. panic("invalid operands for VRANGEPS")
  89543. }
  89544. return p
  89545. }
  89546. // VRANGESD performs "Range Restriction Calculation For a pair of Scalar Double-Precision Floating-Point Values".
  89547. //
  89548. // Mnemonic : VRANGESD
  89549. // Supported forms : (3 forms)
  89550. //
  89551. // * VRANGESD imm8, m64, xmm, xmm{k}{z} [AVX512DQ]
  89552. // * VRANGESD imm8, {sae}, xmm, xmm, xmm{k}{z} [AVX512DQ]
  89553. // * VRANGESD imm8, xmm, xmm, xmm{k}{z} [AVX512DQ]
  89554. //
  89555. func (self *Program) VRANGESD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}, vv ...interface{}) *Instruction {
  89556. var p *Instruction
  89557. switch len(vv) {
  89558. case 0 : p = self.alloc("VRANGESD", 4, Operands { v0, v1, v2, v3 })
  89559. case 1 : p = self.alloc("VRANGESD", 5, Operands { v0, v1, v2, v3, vv[0] })
  89560. default : panic("instruction VRANGESD takes 4 or 5 operands")
  89561. }
  89562. // VRANGESD imm8, m64, xmm, xmm{k}{z}
  89563. if len(vv) == 0 && isImm8(v0) && isM64(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  89564. self.require(ISA_AVX512DQ)
  89565. p.domain = DomainAVX
  89566. p.add(0, func(m *_Encoding, v []interface{}) {
  89567. m.evex(0b11, 0x85, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  89568. m.emit(0x51)
  89569. m.mrsd(lcode(v[3]), addr(v[1]), 8)
  89570. m.imm1(toImmAny(v[0]))
  89571. })
  89572. }
  89573. // VRANGESD imm8, {sae}, xmm, xmm, xmm{k}{z}
  89574. if len(vv) == 1 && isImm8(v0) && isSAE(v1) && isEVEXXMM(v2) && isEVEXXMM(v3) && isXMMkz(vv[0]) {
  89575. self.require(ISA_AVX512DQ)
  89576. p.domain = DomainAVX
  89577. p.add(0, func(m *_Encoding, v []interface{}) {
  89578. m.emit(0x62)
  89579. m.emit(0xf3 ^ ((hcode(v[4]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[4]) << 4)))
  89580. m.emit(0xfd ^ (hlcode(v[3]) << 3))
  89581. m.emit((zcode(v[4]) << 7) | (0x08 ^ (ecode(v[3]) << 3)) | kcode(v[4]) | 0x10)
  89582. m.emit(0x51)
  89583. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[2]))
  89584. m.imm1(toImmAny(v[0]))
  89585. })
  89586. }
  89587. // VRANGESD imm8, xmm, xmm, xmm{k}{z}
  89588. if len(vv) == 0 && isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  89589. self.require(ISA_AVX512DQ)
  89590. p.domain = DomainAVX
  89591. p.add(0, func(m *_Encoding, v []interface{}) {
  89592. m.emit(0x62)
  89593. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  89594. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  89595. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  89596. m.emit(0x51)
  89597. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  89598. m.imm1(toImmAny(v[0]))
  89599. })
  89600. }
  89601. if p.len == 0 {
  89602. panic("invalid operands for VRANGESD")
  89603. }
  89604. return p
  89605. }
  89606. // VRANGESS performs "Range Restriction Calculation For a pair of Scalar Single-Precision Floating-Point Values".
  89607. //
  89608. // Mnemonic : VRANGESS
  89609. // Supported forms : (3 forms)
  89610. //
  89611. // * VRANGESS imm8, m32, xmm, xmm{k}{z} [AVX512DQ]
  89612. // * VRANGESS imm8, {sae}, xmm, xmm, xmm{k}{z} [AVX512DQ]
  89613. // * VRANGESS imm8, xmm, xmm, xmm{k}{z} [AVX512DQ]
  89614. //
  89615. func (self *Program) VRANGESS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}, vv ...interface{}) *Instruction {
  89616. var p *Instruction
  89617. switch len(vv) {
  89618. case 0 : p = self.alloc("VRANGESS", 4, Operands { v0, v1, v2, v3 })
  89619. case 1 : p = self.alloc("VRANGESS", 5, Operands { v0, v1, v2, v3, vv[0] })
  89620. default : panic("instruction VRANGESS takes 4 or 5 operands")
  89621. }
  89622. // VRANGESS imm8, m32, xmm, xmm{k}{z}
  89623. if len(vv) == 0 && isImm8(v0) && isM32(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  89624. self.require(ISA_AVX512DQ)
  89625. p.domain = DomainAVX
  89626. p.add(0, func(m *_Encoding, v []interface{}) {
  89627. m.evex(0b11, 0x05, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  89628. m.emit(0x51)
  89629. m.mrsd(lcode(v[3]), addr(v[1]), 4)
  89630. m.imm1(toImmAny(v[0]))
  89631. })
  89632. }
  89633. // VRANGESS imm8, {sae}, xmm, xmm, xmm{k}{z}
  89634. if len(vv) == 1 && isImm8(v0) && isSAE(v1) && isEVEXXMM(v2) && isEVEXXMM(v3) && isXMMkz(vv[0]) {
  89635. self.require(ISA_AVX512DQ)
  89636. p.domain = DomainAVX
  89637. p.add(0, func(m *_Encoding, v []interface{}) {
  89638. m.emit(0x62)
  89639. m.emit(0xf3 ^ ((hcode(v[4]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[4]) << 4)))
  89640. m.emit(0x7d ^ (hlcode(v[3]) << 3))
  89641. m.emit((zcode(v[4]) << 7) | (0x08 ^ (ecode(v[3]) << 3)) | kcode(v[4]) | 0x10)
  89642. m.emit(0x51)
  89643. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[2]))
  89644. m.imm1(toImmAny(v[0]))
  89645. })
  89646. }
  89647. // VRANGESS imm8, xmm, xmm, xmm{k}{z}
  89648. if len(vv) == 0 && isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  89649. self.require(ISA_AVX512DQ)
  89650. p.domain = DomainAVX
  89651. p.add(0, func(m *_Encoding, v []interface{}) {
  89652. m.emit(0x62)
  89653. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  89654. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  89655. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  89656. m.emit(0x51)
  89657. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  89658. m.imm1(toImmAny(v[0]))
  89659. })
  89660. }
  89661. if p.len == 0 {
  89662. panic("invalid operands for VRANGESS")
  89663. }
  89664. return p
  89665. }
  89666. // VRCP14PD performs "Compute Approximate Reciprocals of Packed Double-Precision Floating-Point Values".
  89667. //
  89668. // Mnemonic : VRCP14PD
  89669. // Supported forms : (6 forms)
  89670. //
  89671. // * VRCP14PD m512/m64bcst, zmm{k}{z} [AVX512F]
  89672. // * VRCP14PD zmm, zmm{k}{z} [AVX512F]
  89673. // * VRCP14PD m128/m64bcst, xmm{k}{z} [AVX512F,AVX512VL]
  89674. // * VRCP14PD m256/m64bcst, ymm{k}{z} [AVX512F,AVX512VL]
  89675. // * VRCP14PD xmm, xmm{k}{z} [AVX512F,AVX512VL]
  89676. // * VRCP14PD ymm, ymm{k}{z} [AVX512F,AVX512VL]
  89677. //
  89678. func (self *Program) VRCP14PD(v0 interface{}, v1 interface{}) *Instruction {
  89679. p := self.alloc("VRCP14PD", 2, Operands { v0, v1 })
  89680. // VRCP14PD m512/m64bcst, zmm{k}{z}
  89681. if isM512M64bcst(v0) && isZMMkz(v1) {
  89682. self.require(ISA_AVX512F)
  89683. p.domain = DomainAVX
  89684. p.add(0, func(m *_Encoding, v []interface{}) {
  89685. m.evex(0b10, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  89686. m.emit(0x4c)
  89687. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  89688. })
  89689. }
  89690. // VRCP14PD zmm, zmm{k}{z}
  89691. if isZMM(v0) && isZMMkz(v1) {
  89692. self.require(ISA_AVX512F)
  89693. p.domain = DomainAVX
  89694. p.add(0, func(m *_Encoding, v []interface{}) {
  89695. m.emit(0x62)
  89696. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  89697. m.emit(0xfd)
  89698. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  89699. m.emit(0x4c)
  89700. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  89701. })
  89702. }
  89703. // VRCP14PD m128/m64bcst, xmm{k}{z}
  89704. if isM128M64bcst(v0) && isXMMkz(v1) {
  89705. self.require(ISA_AVX512VL | ISA_AVX512F)
  89706. p.domain = DomainAVX
  89707. p.add(0, func(m *_Encoding, v []interface{}) {
  89708. m.evex(0b10, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  89709. m.emit(0x4c)
  89710. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  89711. })
  89712. }
  89713. // VRCP14PD m256/m64bcst, ymm{k}{z}
  89714. if isM256M64bcst(v0) && isYMMkz(v1) {
  89715. self.require(ISA_AVX512VL | ISA_AVX512F)
  89716. p.domain = DomainAVX
  89717. p.add(0, func(m *_Encoding, v []interface{}) {
  89718. m.evex(0b10, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  89719. m.emit(0x4c)
  89720. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  89721. })
  89722. }
  89723. // VRCP14PD xmm, xmm{k}{z}
  89724. if isEVEXXMM(v0) && isXMMkz(v1) {
  89725. self.require(ISA_AVX512VL | ISA_AVX512F)
  89726. p.domain = DomainAVX
  89727. p.add(0, func(m *_Encoding, v []interface{}) {
  89728. m.emit(0x62)
  89729. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  89730. m.emit(0xfd)
  89731. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  89732. m.emit(0x4c)
  89733. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  89734. })
  89735. }
  89736. // VRCP14PD ymm, ymm{k}{z}
  89737. if isEVEXYMM(v0) && isYMMkz(v1) {
  89738. self.require(ISA_AVX512VL | ISA_AVX512F)
  89739. p.domain = DomainAVX
  89740. p.add(0, func(m *_Encoding, v []interface{}) {
  89741. m.emit(0x62)
  89742. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  89743. m.emit(0xfd)
  89744. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  89745. m.emit(0x4c)
  89746. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  89747. })
  89748. }
  89749. if p.len == 0 {
  89750. panic("invalid operands for VRCP14PD")
  89751. }
  89752. return p
  89753. }
  89754. // VRCP14PS performs "Compute Approximate Reciprocals of Packed Single-Precision Floating-Point Values".
  89755. //
  89756. // Mnemonic : VRCP14PS
  89757. // Supported forms : (6 forms)
  89758. //
  89759. // * VRCP14PS m512/m32bcst, zmm{k}{z} [AVX512F]
  89760. // * VRCP14PS zmm, zmm{k}{z} [AVX512F]
  89761. // * VRCP14PS m128/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  89762. // * VRCP14PS m256/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  89763. // * VRCP14PS xmm, xmm{k}{z} [AVX512F,AVX512VL]
  89764. // * VRCP14PS ymm, ymm{k}{z} [AVX512F,AVX512VL]
  89765. //
  89766. func (self *Program) VRCP14PS(v0 interface{}, v1 interface{}) *Instruction {
  89767. p := self.alloc("VRCP14PS", 2, Operands { v0, v1 })
  89768. // VRCP14PS m512/m32bcst, zmm{k}{z}
  89769. if isM512M32bcst(v0) && isZMMkz(v1) {
  89770. self.require(ISA_AVX512F)
  89771. p.domain = DomainAVX
  89772. p.add(0, func(m *_Encoding, v []interface{}) {
  89773. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  89774. m.emit(0x4c)
  89775. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  89776. })
  89777. }
  89778. // VRCP14PS zmm, zmm{k}{z}
  89779. if isZMM(v0) && isZMMkz(v1) {
  89780. self.require(ISA_AVX512F)
  89781. p.domain = DomainAVX
  89782. p.add(0, func(m *_Encoding, v []interface{}) {
  89783. m.emit(0x62)
  89784. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  89785. m.emit(0x7d)
  89786. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  89787. m.emit(0x4c)
  89788. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  89789. })
  89790. }
  89791. // VRCP14PS m128/m32bcst, xmm{k}{z}
  89792. if isM128M32bcst(v0) && isXMMkz(v1) {
  89793. self.require(ISA_AVX512VL | ISA_AVX512F)
  89794. p.domain = DomainAVX
  89795. p.add(0, func(m *_Encoding, v []interface{}) {
  89796. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  89797. m.emit(0x4c)
  89798. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  89799. })
  89800. }
  89801. // VRCP14PS m256/m32bcst, ymm{k}{z}
  89802. if isM256M32bcst(v0) && isYMMkz(v1) {
  89803. self.require(ISA_AVX512VL | ISA_AVX512F)
  89804. p.domain = DomainAVX
  89805. p.add(0, func(m *_Encoding, v []interface{}) {
  89806. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  89807. m.emit(0x4c)
  89808. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  89809. })
  89810. }
  89811. // VRCP14PS xmm, xmm{k}{z}
  89812. if isEVEXXMM(v0) && isXMMkz(v1) {
  89813. self.require(ISA_AVX512VL | ISA_AVX512F)
  89814. p.domain = DomainAVX
  89815. p.add(0, func(m *_Encoding, v []interface{}) {
  89816. m.emit(0x62)
  89817. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  89818. m.emit(0x7d)
  89819. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  89820. m.emit(0x4c)
  89821. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  89822. })
  89823. }
  89824. // VRCP14PS ymm, ymm{k}{z}
  89825. if isEVEXYMM(v0) && isYMMkz(v1) {
  89826. self.require(ISA_AVX512VL | ISA_AVX512F)
  89827. p.domain = DomainAVX
  89828. p.add(0, func(m *_Encoding, v []interface{}) {
  89829. m.emit(0x62)
  89830. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  89831. m.emit(0x7d)
  89832. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  89833. m.emit(0x4c)
  89834. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  89835. })
  89836. }
  89837. if p.len == 0 {
  89838. panic("invalid operands for VRCP14PS")
  89839. }
  89840. return p
  89841. }
  89842. // VRCP14SD performs "Compute Approximate Reciprocal of a Scalar Double-Precision Floating-Point Value".
  89843. //
  89844. // Mnemonic : VRCP14SD
  89845. // Supported forms : (2 forms)
  89846. //
  89847. // * VRCP14SD xmm, xmm, xmm{k}{z} [AVX512F]
  89848. // * VRCP14SD m64, xmm, xmm{k}{z} [AVX512F]
  89849. //
  89850. func (self *Program) VRCP14SD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  89851. p := self.alloc("VRCP14SD", 3, Operands { v0, v1, v2 })
  89852. // VRCP14SD xmm, xmm, xmm{k}{z}
  89853. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  89854. self.require(ISA_AVX512F)
  89855. p.domain = DomainAVX
  89856. p.add(0, func(m *_Encoding, v []interface{}) {
  89857. m.emit(0x62)
  89858. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  89859. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  89860. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  89861. m.emit(0x4d)
  89862. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  89863. })
  89864. }
  89865. // VRCP14SD m64, xmm, xmm{k}{z}
  89866. if isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  89867. self.require(ISA_AVX512F)
  89868. p.domain = DomainAVX
  89869. p.add(0, func(m *_Encoding, v []interface{}) {
  89870. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  89871. m.emit(0x4d)
  89872. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  89873. })
  89874. }
  89875. if p.len == 0 {
  89876. panic("invalid operands for VRCP14SD")
  89877. }
  89878. return p
  89879. }
  89880. // VRCP14SS performs "Compute Approximate Reciprocal of a Scalar Single-Precision Floating-Point Value".
  89881. //
  89882. // Mnemonic : VRCP14SS
  89883. // Supported forms : (2 forms)
  89884. //
  89885. // * VRCP14SS xmm, xmm, xmm{k}{z} [AVX512F]
  89886. // * VRCP14SS m32, xmm, xmm{k}{z} [AVX512F]
  89887. //
  89888. func (self *Program) VRCP14SS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  89889. p := self.alloc("VRCP14SS", 3, Operands { v0, v1, v2 })
  89890. // VRCP14SS xmm, xmm, xmm{k}{z}
  89891. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  89892. self.require(ISA_AVX512F)
  89893. p.domain = DomainAVX
  89894. p.add(0, func(m *_Encoding, v []interface{}) {
  89895. m.emit(0x62)
  89896. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  89897. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  89898. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  89899. m.emit(0x4d)
  89900. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  89901. })
  89902. }
  89903. // VRCP14SS m32, xmm, xmm{k}{z}
  89904. if isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  89905. self.require(ISA_AVX512F)
  89906. p.domain = DomainAVX
  89907. p.add(0, func(m *_Encoding, v []interface{}) {
  89908. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  89909. m.emit(0x4d)
  89910. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  89911. })
  89912. }
  89913. if p.len == 0 {
  89914. panic("invalid operands for VRCP14SS")
  89915. }
  89916. return p
  89917. }
  89918. // VRCP28PD performs "Approximation to the Reciprocal of Packed Double-Precision Floating-Point Values with Less Than 2^-28 Relative Error".
  89919. //
  89920. // Mnemonic : VRCP28PD
  89921. // Supported forms : (3 forms)
  89922. //
  89923. // * VRCP28PD m512/m64bcst, zmm{k}{z} [AVX512ER]
  89924. // * VRCP28PD {sae}, zmm, zmm{k}{z} [AVX512ER]
  89925. // * VRCP28PD zmm, zmm{k}{z} [AVX512ER]
  89926. //
  89927. func (self *Program) VRCP28PD(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  89928. var p *Instruction
  89929. switch len(vv) {
  89930. case 0 : p = self.alloc("VRCP28PD", 2, Operands { v0, v1 })
  89931. case 1 : p = self.alloc("VRCP28PD", 3, Operands { v0, v1, vv[0] })
  89932. default : panic("instruction VRCP28PD takes 2 or 3 operands")
  89933. }
  89934. // VRCP28PD m512/m64bcst, zmm{k}{z}
  89935. if len(vv) == 0 && isM512M64bcst(v0) && isZMMkz(v1) {
  89936. self.require(ISA_AVX512ER)
  89937. p.domain = DomainAVX
  89938. p.add(0, func(m *_Encoding, v []interface{}) {
  89939. m.evex(0b10, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  89940. m.emit(0xca)
  89941. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  89942. })
  89943. }
  89944. // VRCP28PD {sae}, zmm, zmm{k}{z}
  89945. if len(vv) == 1 && isSAE(v0) && isZMM(v1) && isZMMkz(vv[0]) {
  89946. self.require(ISA_AVX512ER)
  89947. p.domain = DomainAVX
  89948. p.add(0, func(m *_Encoding, v []interface{}) {
  89949. m.emit(0x62)
  89950. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  89951. m.emit(0xfd)
  89952. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x18)
  89953. m.emit(0xca)
  89954. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  89955. })
  89956. }
  89957. // VRCP28PD zmm, zmm{k}{z}
  89958. if len(vv) == 0 && isZMM(v0) && isZMMkz(v1) {
  89959. self.require(ISA_AVX512ER)
  89960. p.domain = DomainAVX
  89961. p.add(0, func(m *_Encoding, v []interface{}) {
  89962. m.emit(0x62)
  89963. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  89964. m.emit(0xfd)
  89965. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  89966. m.emit(0xca)
  89967. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  89968. })
  89969. }
  89970. if p.len == 0 {
  89971. panic("invalid operands for VRCP28PD")
  89972. }
  89973. return p
  89974. }
  89975. // VRCP28PS performs "Approximation to the Reciprocal of Packed Single-Precision Floating-Point Values with Less Than 2^-28 Relative Error".
  89976. //
  89977. // Mnemonic : VRCP28PS
  89978. // Supported forms : (3 forms)
  89979. //
  89980. // * VRCP28PS m512/m32bcst, zmm{k}{z} [AVX512ER]
  89981. // * VRCP28PS {sae}, zmm, zmm{k}{z} [AVX512ER]
  89982. // * VRCP28PS zmm, zmm{k}{z} [AVX512ER]
  89983. //
  89984. func (self *Program) VRCP28PS(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  89985. var p *Instruction
  89986. switch len(vv) {
  89987. case 0 : p = self.alloc("VRCP28PS", 2, Operands { v0, v1 })
  89988. case 1 : p = self.alloc("VRCP28PS", 3, Operands { v0, v1, vv[0] })
  89989. default : panic("instruction VRCP28PS takes 2 or 3 operands")
  89990. }
  89991. // VRCP28PS m512/m32bcst, zmm{k}{z}
  89992. if len(vv) == 0 && isM512M32bcst(v0) && isZMMkz(v1) {
  89993. self.require(ISA_AVX512ER)
  89994. p.domain = DomainAVX
  89995. p.add(0, func(m *_Encoding, v []interface{}) {
  89996. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  89997. m.emit(0xca)
  89998. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  89999. })
  90000. }
  90001. // VRCP28PS {sae}, zmm, zmm{k}{z}
  90002. if len(vv) == 1 && isSAE(v0) && isZMM(v1) && isZMMkz(vv[0]) {
  90003. self.require(ISA_AVX512ER)
  90004. p.domain = DomainAVX
  90005. p.add(0, func(m *_Encoding, v []interface{}) {
  90006. m.emit(0x62)
  90007. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  90008. m.emit(0x7d)
  90009. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x18)
  90010. m.emit(0xca)
  90011. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  90012. })
  90013. }
  90014. // VRCP28PS zmm, zmm{k}{z}
  90015. if len(vv) == 0 && isZMM(v0) && isZMMkz(v1) {
  90016. self.require(ISA_AVX512ER)
  90017. p.domain = DomainAVX
  90018. p.add(0, func(m *_Encoding, v []interface{}) {
  90019. m.emit(0x62)
  90020. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  90021. m.emit(0x7d)
  90022. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  90023. m.emit(0xca)
  90024. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  90025. })
  90026. }
  90027. if p.len == 0 {
  90028. panic("invalid operands for VRCP28PS")
  90029. }
  90030. return p
  90031. }
  90032. // VRCP28SD performs "Approximation to the Reciprocal of a Scalar Double-Precision Floating-Point Value with Less Than 2^-28 Relative Error".
  90033. //
  90034. // Mnemonic : VRCP28SD
  90035. // Supported forms : (3 forms)
  90036. //
  90037. // * VRCP28SD m64, xmm, xmm{k}{z} [AVX512ER]
  90038. // * VRCP28SD {sae}, xmm, xmm, xmm{k}{z} [AVX512ER]
  90039. // * VRCP28SD xmm, xmm, xmm{k}{z} [AVX512ER]
  90040. //
  90041. func (self *Program) VRCP28SD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  90042. var p *Instruction
  90043. switch len(vv) {
  90044. case 0 : p = self.alloc("VRCP28SD", 3, Operands { v0, v1, v2 })
  90045. case 1 : p = self.alloc("VRCP28SD", 4, Operands { v0, v1, v2, vv[0] })
  90046. default : panic("instruction VRCP28SD takes 3 or 4 operands")
  90047. }
  90048. // VRCP28SD m64, xmm, xmm{k}{z}
  90049. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  90050. self.require(ISA_AVX512ER)
  90051. p.domain = DomainAVX
  90052. p.add(0, func(m *_Encoding, v []interface{}) {
  90053. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  90054. m.emit(0xcb)
  90055. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  90056. })
  90057. }
  90058. // VRCP28SD {sae}, xmm, xmm, xmm{k}{z}
  90059. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  90060. self.require(ISA_AVX512ER)
  90061. p.domain = DomainAVX
  90062. p.add(0, func(m *_Encoding, v []interface{}) {
  90063. m.emit(0x62)
  90064. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  90065. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  90066. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  90067. m.emit(0xcb)
  90068. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  90069. })
  90070. }
  90071. // VRCP28SD xmm, xmm, xmm{k}{z}
  90072. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  90073. self.require(ISA_AVX512ER)
  90074. p.domain = DomainAVX
  90075. p.add(0, func(m *_Encoding, v []interface{}) {
  90076. m.emit(0x62)
  90077. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  90078. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  90079. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  90080. m.emit(0xcb)
  90081. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  90082. })
  90083. }
  90084. if p.len == 0 {
  90085. panic("invalid operands for VRCP28SD")
  90086. }
  90087. return p
  90088. }
  90089. // VRCP28SS performs "Approximation to the Reciprocal of a Scalar Single-Precision Floating-Point Value with Less Than 2^-28 Relative Error".
  90090. //
  90091. // Mnemonic : VRCP28SS
  90092. // Supported forms : (3 forms)
  90093. //
  90094. // * VRCP28SS m32, xmm, xmm{k}{z} [AVX512ER]
  90095. // * VRCP28SS {sae}, xmm, xmm, xmm{k}{z} [AVX512ER]
  90096. // * VRCP28SS xmm, xmm, xmm{k}{z} [AVX512ER]
  90097. //
  90098. func (self *Program) VRCP28SS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  90099. var p *Instruction
  90100. switch len(vv) {
  90101. case 0 : p = self.alloc("VRCP28SS", 3, Operands { v0, v1, v2 })
  90102. case 1 : p = self.alloc("VRCP28SS", 4, Operands { v0, v1, v2, vv[0] })
  90103. default : panic("instruction VRCP28SS takes 3 or 4 operands")
  90104. }
  90105. // VRCP28SS m32, xmm, xmm{k}{z}
  90106. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  90107. self.require(ISA_AVX512ER)
  90108. p.domain = DomainAVX
  90109. p.add(0, func(m *_Encoding, v []interface{}) {
  90110. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  90111. m.emit(0xcb)
  90112. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  90113. })
  90114. }
  90115. // VRCP28SS {sae}, xmm, xmm, xmm{k}{z}
  90116. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  90117. self.require(ISA_AVX512ER)
  90118. p.domain = DomainAVX
  90119. p.add(0, func(m *_Encoding, v []interface{}) {
  90120. m.emit(0x62)
  90121. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  90122. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  90123. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  90124. m.emit(0xcb)
  90125. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  90126. })
  90127. }
  90128. // VRCP28SS xmm, xmm, xmm{k}{z}
  90129. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  90130. self.require(ISA_AVX512ER)
  90131. p.domain = DomainAVX
  90132. p.add(0, func(m *_Encoding, v []interface{}) {
  90133. m.emit(0x62)
  90134. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  90135. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  90136. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  90137. m.emit(0xcb)
  90138. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  90139. })
  90140. }
  90141. if p.len == 0 {
  90142. panic("invalid operands for VRCP28SS")
  90143. }
  90144. return p
  90145. }
  90146. // VRCPPS performs "Compute Approximate Reciprocals of Packed Single-Precision Floating-Point Values".
  90147. //
  90148. // Mnemonic : VRCPPS
  90149. // Supported forms : (4 forms)
  90150. //
  90151. // * VRCPPS xmm, xmm [AVX]
  90152. // * VRCPPS m128, xmm [AVX]
  90153. // * VRCPPS ymm, ymm [AVX]
  90154. // * VRCPPS m256, ymm [AVX]
  90155. //
  90156. func (self *Program) VRCPPS(v0 interface{}, v1 interface{}) *Instruction {
  90157. p := self.alloc("VRCPPS", 2, Operands { v0, v1 })
  90158. // VRCPPS xmm, xmm
  90159. if isXMM(v0) && isXMM(v1) {
  90160. self.require(ISA_AVX)
  90161. p.domain = DomainAVX
  90162. p.add(0, func(m *_Encoding, v []interface{}) {
  90163. m.vex2(0, hcode(v[1]), v[0], 0)
  90164. m.emit(0x53)
  90165. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  90166. })
  90167. }
  90168. // VRCPPS m128, xmm
  90169. if isM128(v0) && isXMM(v1) {
  90170. self.require(ISA_AVX)
  90171. p.domain = DomainAVX
  90172. p.add(0, func(m *_Encoding, v []interface{}) {
  90173. m.vex2(0, hcode(v[1]), addr(v[0]), 0)
  90174. m.emit(0x53)
  90175. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  90176. })
  90177. }
  90178. // VRCPPS ymm, ymm
  90179. if isYMM(v0) && isYMM(v1) {
  90180. self.require(ISA_AVX)
  90181. p.domain = DomainAVX
  90182. p.add(0, func(m *_Encoding, v []interface{}) {
  90183. m.vex2(4, hcode(v[1]), v[0], 0)
  90184. m.emit(0x53)
  90185. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  90186. })
  90187. }
  90188. // VRCPPS m256, ymm
  90189. if isM256(v0) && isYMM(v1) {
  90190. self.require(ISA_AVX)
  90191. p.domain = DomainAVX
  90192. p.add(0, func(m *_Encoding, v []interface{}) {
  90193. m.vex2(4, hcode(v[1]), addr(v[0]), 0)
  90194. m.emit(0x53)
  90195. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  90196. })
  90197. }
  90198. if p.len == 0 {
  90199. panic("invalid operands for VRCPPS")
  90200. }
  90201. return p
  90202. }
  90203. // VRCPSS performs "Compute Approximate Reciprocal of Scalar Single-Precision Floating-Point Values".
  90204. //
  90205. // Mnemonic : VRCPSS
  90206. // Supported forms : (2 forms)
  90207. //
  90208. // * VRCPSS xmm, xmm, xmm [AVX]
  90209. // * VRCPSS m32, xmm, xmm [AVX]
  90210. //
  90211. func (self *Program) VRCPSS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  90212. p := self.alloc("VRCPSS", 3, Operands { v0, v1, v2 })
  90213. // VRCPSS xmm, xmm, xmm
  90214. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  90215. self.require(ISA_AVX)
  90216. p.domain = DomainAVX
  90217. p.add(0, func(m *_Encoding, v []interface{}) {
  90218. m.vex2(2, hcode(v[2]), v[0], hlcode(v[1]))
  90219. m.emit(0x53)
  90220. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  90221. })
  90222. }
  90223. // VRCPSS m32, xmm, xmm
  90224. if isM32(v0) && isXMM(v1) && isXMM(v2) {
  90225. self.require(ISA_AVX)
  90226. p.domain = DomainAVX
  90227. p.add(0, func(m *_Encoding, v []interface{}) {
  90228. m.vex2(2, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  90229. m.emit(0x53)
  90230. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  90231. })
  90232. }
  90233. if p.len == 0 {
  90234. panic("invalid operands for VRCPSS")
  90235. }
  90236. return p
  90237. }
  90238. // VREDUCEPD performs "Perform Reduction Transformation on Packed Double-Precision Floating-Point Values".
  90239. //
  90240. // Mnemonic : VREDUCEPD
  90241. // Supported forms : (6 forms)
  90242. //
  90243. // * VREDUCEPD imm8, m512/m64bcst, zmm{k}{z} [AVX512DQ]
  90244. // * VREDUCEPD imm8, zmm, zmm{k}{z} [AVX512DQ]
  90245. // * VREDUCEPD imm8, m128/m64bcst, xmm{k}{z} [AVX512DQ,AVX512VL]
  90246. // * VREDUCEPD imm8, m256/m64bcst, ymm{k}{z} [AVX512DQ,AVX512VL]
  90247. // * VREDUCEPD imm8, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  90248. // * VREDUCEPD imm8, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  90249. //
  90250. func (self *Program) VREDUCEPD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  90251. p := self.alloc("VREDUCEPD", 3, Operands { v0, v1, v2 })
  90252. // VREDUCEPD imm8, m512/m64bcst, zmm{k}{z}
  90253. if isImm8(v0) && isM512M64bcst(v1) && isZMMkz(v2) {
  90254. self.require(ISA_AVX512DQ)
  90255. p.domain = DomainAVX
  90256. p.add(0, func(m *_Encoding, v []interface{}) {
  90257. m.evex(0b11, 0x85, 0b10, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  90258. m.emit(0x56)
  90259. m.mrsd(lcode(v[2]), addr(v[1]), 64)
  90260. m.imm1(toImmAny(v[0]))
  90261. })
  90262. }
  90263. // VREDUCEPD imm8, zmm, zmm{k}{z}
  90264. if isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  90265. self.require(ISA_AVX512DQ)
  90266. p.domain = DomainAVX
  90267. p.add(0, func(m *_Encoding, v []interface{}) {
  90268. m.emit(0x62)
  90269. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  90270. m.emit(0xfd)
  90271. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x48)
  90272. m.emit(0x56)
  90273. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  90274. m.imm1(toImmAny(v[0]))
  90275. })
  90276. }
  90277. // VREDUCEPD imm8, m128/m64bcst, xmm{k}{z}
  90278. if isImm8(v0) && isM128M64bcst(v1) && isXMMkz(v2) {
  90279. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  90280. p.domain = DomainAVX
  90281. p.add(0, func(m *_Encoding, v []interface{}) {
  90282. m.evex(0b11, 0x85, 0b00, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  90283. m.emit(0x56)
  90284. m.mrsd(lcode(v[2]), addr(v[1]), 16)
  90285. m.imm1(toImmAny(v[0]))
  90286. })
  90287. }
  90288. // VREDUCEPD imm8, m256/m64bcst, ymm{k}{z}
  90289. if isImm8(v0) && isM256M64bcst(v1) && isYMMkz(v2) {
  90290. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  90291. p.domain = DomainAVX
  90292. p.add(0, func(m *_Encoding, v []interface{}) {
  90293. m.evex(0b11, 0x85, 0b01, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  90294. m.emit(0x56)
  90295. m.mrsd(lcode(v[2]), addr(v[1]), 32)
  90296. m.imm1(toImmAny(v[0]))
  90297. })
  90298. }
  90299. // VREDUCEPD imm8, xmm, xmm{k}{z}
  90300. if isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  90301. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  90302. p.domain = DomainAVX
  90303. p.add(0, func(m *_Encoding, v []interface{}) {
  90304. m.emit(0x62)
  90305. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  90306. m.emit(0xfd)
  90307. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x08)
  90308. m.emit(0x56)
  90309. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  90310. m.imm1(toImmAny(v[0]))
  90311. })
  90312. }
  90313. // VREDUCEPD imm8, ymm, ymm{k}{z}
  90314. if isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  90315. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  90316. p.domain = DomainAVX
  90317. p.add(0, func(m *_Encoding, v []interface{}) {
  90318. m.emit(0x62)
  90319. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  90320. m.emit(0xfd)
  90321. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x28)
  90322. m.emit(0x56)
  90323. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  90324. m.imm1(toImmAny(v[0]))
  90325. })
  90326. }
  90327. if p.len == 0 {
  90328. panic("invalid operands for VREDUCEPD")
  90329. }
  90330. return p
  90331. }
  90332. // VREDUCEPS performs "Perform Reduction Transformation on Packed Single-Precision Floating-Point Values".
  90333. //
  90334. // Mnemonic : VREDUCEPS
  90335. // Supported forms : (6 forms)
  90336. //
  90337. // * VREDUCEPS imm8, m512/m32bcst, zmm{k}{z} [AVX512DQ]
  90338. // * VREDUCEPS imm8, zmm, zmm{k}{z} [AVX512DQ]
  90339. // * VREDUCEPS imm8, m128/m32bcst, xmm{k}{z} [AVX512DQ,AVX512VL]
  90340. // * VREDUCEPS imm8, m256/m32bcst, ymm{k}{z} [AVX512DQ,AVX512VL]
  90341. // * VREDUCEPS imm8, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  90342. // * VREDUCEPS imm8, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  90343. //
  90344. func (self *Program) VREDUCEPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  90345. p := self.alloc("VREDUCEPS", 3, Operands { v0, v1, v2 })
  90346. // VREDUCEPS imm8, m512/m32bcst, zmm{k}{z}
  90347. if isImm8(v0) && isM512M32bcst(v1) && isZMMkz(v2) {
  90348. self.require(ISA_AVX512DQ)
  90349. p.domain = DomainAVX
  90350. p.add(0, func(m *_Encoding, v []interface{}) {
  90351. m.evex(0b11, 0x05, 0b10, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  90352. m.emit(0x56)
  90353. m.mrsd(lcode(v[2]), addr(v[1]), 64)
  90354. m.imm1(toImmAny(v[0]))
  90355. })
  90356. }
  90357. // VREDUCEPS imm8, zmm, zmm{k}{z}
  90358. if isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  90359. self.require(ISA_AVX512DQ)
  90360. p.domain = DomainAVX
  90361. p.add(0, func(m *_Encoding, v []interface{}) {
  90362. m.emit(0x62)
  90363. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  90364. m.emit(0x7d)
  90365. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x48)
  90366. m.emit(0x56)
  90367. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  90368. m.imm1(toImmAny(v[0]))
  90369. })
  90370. }
  90371. // VREDUCEPS imm8, m128/m32bcst, xmm{k}{z}
  90372. if isImm8(v0) && isM128M32bcst(v1) && isXMMkz(v2) {
  90373. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  90374. p.domain = DomainAVX
  90375. p.add(0, func(m *_Encoding, v []interface{}) {
  90376. m.evex(0b11, 0x05, 0b00, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  90377. m.emit(0x56)
  90378. m.mrsd(lcode(v[2]), addr(v[1]), 16)
  90379. m.imm1(toImmAny(v[0]))
  90380. })
  90381. }
  90382. // VREDUCEPS imm8, m256/m32bcst, ymm{k}{z}
  90383. if isImm8(v0) && isM256M32bcst(v1) && isYMMkz(v2) {
  90384. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  90385. p.domain = DomainAVX
  90386. p.add(0, func(m *_Encoding, v []interface{}) {
  90387. m.evex(0b11, 0x05, 0b01, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  90388. m.emit(0x56)
  90389. m.mrsd(lcode(v[2]), addr(v[1]), 32)
  90390. m.imm1(toImmAny(v[0]))
  90391. })
  90392. }
  90393. // VREDUCEPS imm8, xmm, xmm{k}{z}
  90394. if isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  90395. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  90396. p.domain = DomainAVX
  90397. p.add(0, func(m *_Encoding, v []interface{}) {
  90398. m.emit(0x62)
  90399. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  90400. m.emit(0x7d)
  90401. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x08)
  90402. m.emit(0x56)
  90403. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  90404. m.imm1(toImmAny(v[0]))
  90405. })
  90406. }
  90407. // VREDUCEPS imm8, ymm, ymm{k}{z}
  90408. if isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  90409. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  90410. p.domain = DomainAVX
  90411. p.add(0, func(m *_Encoding, v []interface{}) {
  90412. m.emit(0x62)
  90413. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  90414. m.emit(0x7d)
  90415. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x28)
  90416. m.emit(0x56)
  90417. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  90418. m.imm1(toImmAny(v[0]))
  90419. })
  90420. }
  90421. if p.len == 0 {
  90422. panic("invalid operands for VREDUCEPS")
  90423. }
  90424. return p
  90425. }
  90426. // VREDUCESD performs "Perform Reduction Transformation on a Scalar Double-Precision Floating-Point Value".
  90427. //
  90428. // Mnemonic : VREDUCESD
  90429. // Supported forms : (2 forms)
  90430. //
  90431. // * VREDUCESD imm8, xmm, xmm, xmm{k}{z} [AVX512DQ]
  90432. // * VREDUCESD imm8, m64, xmm, xmm{k}{z} [AVX512DQ]
  90433. //
  90434. func (self *Program) VREDUCESD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  90435. p := self.alloc("VREDUCESD", 4, Operands { v0, v1, v2, v3 })
  90436. // VREDUCESD imm8, xmm, xmm, xmm{k}{z}
  90437. if isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  90438. self.require(ISA_AVX512DQ)
  90439. p.domain = DomainAVX
  90440. p.add(0, func(m *_Encoding, v []interface{}) {
  90441. m.emit(0x62)
  90442. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  90443. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  90444. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  90445. m.emit(0x57)
  90446. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  90447. m.imm1(toImmAny(v[0]))
  90448. })
  90449. }
  90450. // VREDUCESD imm8, m64, xmm, xmm{k}{z}
  90451. if isImm8(v0) && isM64(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  90452. self.require(ISA_AVX512DQ)
  90453. p.domain = DomainAVX
  90454. p.add(0, func(m *_Encoding, v []interface{}) {
  90455. m.evex(0b11, 0x85, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  90456. m.emit(0x57)
  90457. m.mrsd(lcode(v[3]), addr(v[1]), 8)
  90458. m.imm1(toImmAny(v[0]))
  90459. })
  90460. }
  90461. if p.len == 0 {
  90462. panic("invalid operands for VREDUCESD")
  90463. }
  90464. return p
  90465. }
  90466. // VREDUCESS performs "Perform Reduction Transformation on a Scalar Single-Precision Floating-Point Value".
  90467. //
  90468. // Mnemonic : VREDUCESS
  90469. // Supported forms : (2 forms)
  90470. //
  90471. // * VREDUCESS imm8, xmm, xmm, xmm{k}{z} [AVX512DQ]
  90472. // * VREDUCESS imm8, m32, xmm, xmm{k}{z} [AVX512DQ]
  90473. //
  90474. func (self *Program) VREDUCESS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  90475. p := self.alloc("VREDUCESS", 4, Operands { v0, v1, v2, v3 })
  90476. // VREDUCESS imm8, xmm, xmm, xmm{k}{z}
  90477. if isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  90478. self.require(ISA_AVX512DQ)
  90479. p.domain = DomainAVX
  90480. p.add(0, func(m *_Encoding, v []interface{}) {
  90481. m.emit(0x62)
  90482. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  90483. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  90484. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  90485. m.emit(0x57)
  90486. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  90487. m.imm1(toImmAny(v[0]))
  90488. })
  90489. }
  90490. // VREDUCESS imm8, m32, xmm, xmm{k}{z}
  90491. if isImm8(v0) && isM32(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  90492. self.require(ISA_AVX512DQ)
  90493. p.domain = DomainAVX
  90494. p.add(0, func(m *_Encoding, v []interface{}) {
  90495. m.evex(0b11, 0x05, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  90496. m.emit(0x57)
  90497. m.mrsd(lcode(v[3]), addr(v[1]), 4)
  90498. m.imm1(toImmAny(v[0]))
  90499. })
  90500. }
  90501. if p.len == 0 {
  90502. panic("invalid operands for VREDUCESS")
  90503. }
  90504. return p
  90505. }
  90506. // VRNDSCALEPD performs "Round Packed Double-Precision Floating-Point Values To Include A Given Number Of Fraction Bits".
  90507. //
  90508. // Mnemonic : VRNDSCALEPD
  90509. // Supported forms : (7 forms)
  90510. //
  90511. // * VRNDSCALEPD imm8, m512/m64bcst, zmm{k}{z} [AVX512F]
  90512. // * VRNDSCALEPD imm8, {sae}, zmm, zmm{k}{z} [AVX512F]
  90513. // * VRNDSCALEPD imm8, zmm, zmm{k}{z} [AVX512F]
  90514. // * VRNDSCALEPD imm8, m128/m64bcst, xmm{k}{z} [AVX512F,AVX512VL]
  90515. // * VRNDSCALEPD imm8, m256/m64bcst, ymm{k}{z} [AVX512F,AVX512VL]
  90516. // * VRNDSCALEPD imm8, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  90517. // * VRNDSCALEPD imm8, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  90518. //
  90519. func (self *Program) VRNDSCALEPD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  90520. var p *Instruction
  90521. switch len(vv) {
  90522. case 0 : p = self.alloc("VRNDSCALEPD", 3, Operands { v0, v1, v2 })
  90523. case 1 : p = self.alloc("VRNDSCALEPD", 4, Operands { v0, v1, v2, vv[0] })
  90524. default : panic("instruction VRNDSCALEPD takes 3 or 4 operands")
  90525. }
  90526. // VRNDSCALEPD imm8, m512/m64bcst, zmm{k}{z}
  90527. if len(vv) == 0 && isImm8(v0) && isM512M64bcst(v1) && isZMMkz(v2) {
  90528. self.require(ISA_AVX512F)
  90529. p.domain = DomainAVX
  90530. p.add(0, func(m *_Encoding, v []interface{}) {
  90531. m.evex(0b11, 0x85, 0b10, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  90532. m.emit(0x09)
  90533. m.mrsd(lcode(v[2]), addr(v[1]), 64)
  90534. m.imm1(toImmAny(v[0]))
  90535. })
  90536. }
  90537. // VRNDSCALEPD imm8, {sae}, zmm, zmm{k}{z}
  90538. if len(vv) == 1 && isImm8(v0) && isSAE(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  90539. self.require(ISA_AVX512F)
  90540. p.domain = DomainAVX
  90541. p.add(0, func(m *_Encoding, v []interface{}) {
  90542. m.emit(0x62)
  90543. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[3]) << 4)))
  90544. m.emit(0xfd)
  90545. m.emit((zcode(v[3]) << 7) | kcode(v[3]) | 0x18)
  90546. m.emit(0x09)
  90547. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[2]))
  90548. m.imm1(toImmAny(v[0]))
  90549. })
  90550. }
  90551. // VRNDSCALEPD imm8, zmm, zmm{k}{z}
  90552. if len(vv) == 0 && isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  90553. self.require(ISA_AVX512F)
  90554. p.domain = DomainAVX
  90555. p.add(0, func(m *_Encoding, v []interface{}) {
  90556. m.emit(0x62)
  90557. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  90558. m.emit(0xfd)
  90559. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x48)
  90560. m.emit(0x09)
  90561. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  90562. m.imm1(toImmAny(v[0]))
  90563. })
  90564. }
  90565. // VRNDSCALEPD imm8, m128/m64bcst, xmm{k}{z}
  90566. if len(vv) == 0 && isImm8(v0) && isM128M64bcst(v1) && isXMMkz(v2) {
  90567. self.require(ISA_AVX512VL | ISA_AVX512F)
  90568. p.domain = DomainAVX
  90569. p.add(0, func(m *_Encoding, v []interface{}) {
  90570. m.evex(0b11, 0x85, 0b00, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  90571. m.emit(0x09)
  90572. m.mrsd(lcode(v[2]), addr(v[1]), 16)
  90573. m.imm1(toImmAny(v[0]))
  90574. })
  90575. }
  90576. // VRNDSCALEPD imm8, m256/m64bcst, ymm{k}{z}
  90577. if len(vv) == 0 && isImm8(v0) && isM256M64bcst(v1) && isYMMkz(v2) {
  90578. self.require(ISA_AVX512VL | ISA_AVX512F)
  90579. p.domain = DomainAVX
  90580. p.add(0, func(m *_Encoding, v []interface{}) {
  90581. m.evex(0b11, 0x85, 0b01, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  90582. m.emit(0x09)
  90583. m.mrsd(lcode(v[2]), addr(v[1]), 32)
  90584. m.imm1(toImmAny(v[0]))
  90585. })
  90586. }
  90587. // VRNDSCALEPD imm8, xmm, xmm{k}{z}
  90588. if len(vv) == 0 && isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  90589. self.require(ISA_AVX512VL | ISA_AVX512F)
  90590. p.domain = DomainAVX
  90591. p.add(0, func(m *_Encoding, v []interface{}) {
  90592. m.emit(0x62)
  90593. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  90594. m.emit(0xfd)
  90595. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x08)
  90596. m.emit(0x09)
  90597. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  90598. m.imm1(toImmAny(v[0]))
  90599. })
  90600. }
  90601. // VRNDSCALEPD imm8, ymm, ymm{k}{z}
  90602. if len(vv) == 0 && isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  90603. self.require(ISA_AVX512VL | ISA_AVX512F)
  90604. p.domain = DomainAVX
  90605. p.add(0, func(m *_Encoding, v []interface{}) {
  90606. m.emit(0x62)
  90607. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  90608. m.emit(0xfd)
  90609. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x28)
  90610. m.emit(0x09)
  90611. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  90612. m.imm1(toImmAny(v[0]))
  90613. })
  90614. }
  90615. if p.len == 0 {
  90616. panic("invalid operands for VRNDSCALEPD")
  90617. }
  90618. return p
  90619. }
  90620. // VRNDSCALEPS performs "Round Packed Single-Precision Floating-Point Values To Include A Given Number Of Fraction Bits".
  90621. //
  90622. // Mnemonic : VRNDSCALEPS
  90623. // Supported forms : (7 forms)
  90624. //
  90625. // * VRNDSCALEPS imm8, m512/m32bcst, zmm{k}{z} [AVX512F]
  90626. // * VRNDSCALEPS imm8, {sae}, zmm, zmm{k}{z} [AVX512F]
  90627. // * VRNDSCALEPS imm8, zmm, zmm{k}{z} [AVX512F]
  90628. // * VRNDSCALEPS imm8, m128/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  90629. // * VRNDSCALEPS imm8, m256/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  90630. // * VRNDSCALEPS imm8, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  90631. // * VRNDSCALEPS imm8, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  90632. //
  90633. func (self *Program) VRNDSCALEPS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  90634. var p *Instruction
  90635. switch len(vv) {
  90636. case 0 : p = self.alloc("VRNDSCALEPS", 3, Operands { v0, v1, v2 })
  90637. case 1 : p = self.alloc("VRNDSCALEPS", 4, Operands { v0, v1, v2, vv[0] })
  90638. default : panic("instruction VRNDSCALEPS takes 3 or 4 operands")
  90639. }
  90640. // VRNDSCALEPS imm8, m512/m32bcst, zmm{k}{z}
  90641. if len(vv) == 0 && isImm8(v0) && isM512M32bcst(v1) && isZMMkz(v2) {
  90642. self.require(ISA_AVX512F)
  90643. p.domain = DomainAVX
  90644. p.add(0, func(m *_Encoding, v []interface{}) {
  90645. m.evex(0b11, 0x05, 0b10, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  90646. m.emit(0x08)
  90647. m.mrsd(lcode(v[2]), addr(v[1]), 64)
  90648. m.imm1(toImmAny(v[0]))
  90649. })
  90650. }
  90651. // VRNDSCALEPS imm8, {sae}, zmm, zmm{k}{z}
  90652. if len(vv) == 1 && isImm8(v0) && isSAE(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  90653. self.require(ISA_AVX512F)
  90654. p.domain = DomainAVX
  90655. p.add(0, func(m *_Encoding, v []interface{}) {
  90656. m.emit(0x62)
  90657. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[3]) << 4)))
  90658. m.emit(0x7d)
  90659. m.emit((zcode(v[3]) << 7) | kcode(v[3]) | 0x18)
  90660. m.emit(0x08)
  90661. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[2]))
  90662. m.imm1(toImmAny(v[0]))
  90663. })
  90664. }
  90665. // VRNDSCALEPS imm8, zmm, zmm{k}{z}
  90666. if len(vv) == 0 && isImm8(v0) && isZMM(v1) && isZMMkz(v2) {
  90667. self.require(ISA_AVX512F)
  90668. p.domain = DomainAVX
  90669. p.add(0, func(m *_Encoding, v []interface{}) {
  90670. m.emit(0x62)
  90671. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  90672. m.emit(0x7d)
  90673. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x48)
  90674. m.emit(0x08)
  90675. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  90676. m.imm1(toImmAny(v[0]))
  90677. })
  90678. }
  90679. // VRNDSCALEPS imm8, m128/m32bcst, xmm{k}{z}
  90680. if len(vv) == 0 && isImm8(v0) && isM128M32bcst(v1) && isXMMkz(v2) {
  90681. self.require(ISA_AVX512VL | ISA_AVX512F)
  90682. p.domain = DomainAVX
  90683. p.add(0, func(m *_Encoding, v []interface{}) {
  90684. m.evex(0b11, 0x05, 0b00, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  90685. m.emit(0x08)
  90686. m.mrsd(lcode(v[2]), addr(v[1]), 16)
  90687. m.imm1(toImmAny(v[0]))
  90688. })
  90689. }
  90690. // VRNDSCALEPS imm8, m256/m32bcst, ymm{k}{z}
  90691. if len(vv) == 0 && isImm8(v0) && isM256M32bcst(v1) && isYMMkz(v2) {
  90692. self.require(ISA_AVX512VL | ISA_AVX512F)
  90693. p.domain = DomainAVX
  90694. p.add(0, func(m *_Encoding, v []interface{}) {
  90695. m.evex(0b11, 0x05, 0b01, ehcode(v[2]), addr(v[1]), 0, kcode(v[2]), zcode(v[2]), bcode(v[1]))
  90696. m.emit(0x08)
  90697. m.mrsd(lcode(v[2]), addr(v[1]), 32)
  90698. m.imm1(toImmAny(v[0]))
  90699. })
  90700. }
  90701. // VRNDSCALEPS imm8, xmm, xmm{k}{z}
  90702. if len(vv) == 0 && isImm8(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  90703. self.require(ISA_AVX512VL | ISA_AVX512F)
  90704. p.domain = DomainAVX
  90705. p.add(0, func(m *_Encoding, v []interface{}) {
  90706. m.emit(0x62)
  90707. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  90708. m.emit(0x7d)
  90709. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x08)
  90710. m.emit(0x08)
  90711. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  90712. m.imm1(toImmAny(v[0]))
  90713. })
  90714. }
  90715. // VRNDSCALEPS imm8, ymm, ymm{k}{z}
  90716. if len(vv) == 0 && isImm8(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  90717. self.require(ISA_AVX512VL | ISA_AVX512F)
  90718. p.domain = DomainAVX
  90719. p.add(0, func(m *_Encoding, v []interface{}) {
  90720. m.emit(0x62)
  90721. m.emit(0xf3 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  90722. m.emit(0x7d)
  90723. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x28)
  90724. m.emit(0x08)
  90725. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  90726. m.imm1(toImmAny(v[0]))
  90727. })
  90728. }
  90729. if p.len == 0 {
  90730. panic("invalid operands for VRNDSCALEPS")
  90731. }
  90732. return p
  90733. }
  90734. // VRNDSCALESD performs "Round Scalar Double-Precision Floating-Point Value To Include A Given Number Of Fraction Bits".
  90735. //
  90736. // Mnemonic : VRNDSCALESD
  90737. // Supported forms : (3 forms)
  90738. //
  90739. // * VRNDSCALESD imm8, m64, xmm, xmm{k}{z} [AVX512F]
  90740. // * VRNDSCALESD imm8, {sae}, xmm, xmm, xmm{k}{z} [AVX512F]
  90741. // * VRNDSCALESD imm8, xmm, xmm, xmm{k}{z} [AVX512F]
  90742. //
  90743. func (self *Program) VRNDSCALESD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}, vv ...interface{}) *Instruction {
  90744. var p *Instruction
  90745. switch len(vv) {
  90746. case 0 : p = self.alloc("VRNDSCALESD", 4, Operands { v0, v1, v2, v3 })
  90747. case 1 : p = self.alloc("VRNDSCALESD", 5, Operands { v0, v1, v2, v3, vv[0] })
  90748. default : panic("instruction VRNDSCALESD takes 4 or 5 operands")
  90749. }
  90750. // VRNDSCALESD imm8, m64, xmm, xmm{k}{z}
  90751. if len(vv) == 0 && isImm8(v0) && isM64(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  90752. self.require(ISA_AVX512F)
  90753. p.domain = DomainAVX
  90754. p.add(0, func(m *_Encoding, v []interface{}) {
  90755. m.evex(0b11, 0x85, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  90756. m.emit(0x0b)
  90757. m.mrsd(lcode(v[3]), addr(v[1]), 8)
  90758. m.imm1(toImmAny(v[0]))
  90759. })
  90760. }
  90761. // VRNDSCALESD imm8, {sae}, xmm, xmm, xmm{k}{z}
  90762. if len(vv) == 1 && isImm8(v0) && isSAE(v1) && isEVEXXMM(v2) && isEVEXXMM(v3) && isXMMkz(vv[0]) {
  90763. self.require(ISA_AVX512F)
  90764. p.domain = DomainAVX
  90765. p.add(0, func(m *_Encoding, v []interface{}) {
  90766. m.emit(0x62)
  90767. m.emit(0xf3 ^ ((hcode(v[4]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[4]) << 4)))
  90768. m.emit(0xfd ^ (hlcode(v[3]) << 3))
  90769. m.emit((zcode(v[4]) << 7) | (0x08 ^ (ecode(v[3]) << 3)) | kcode(v[4]) | 0x10)
  90770. m.emit(0x0b)
  90771. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[2]))
  90772. m.imm1(toImmAny(v[0]))
  90773. })
  90774. }
  90775. // VRNDSCALESD imm8, xmm, xmm, xmm{k}{z}
  90776. if len(vv) == 0 && isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  90777. self.require(ISA_AVX512F)
  90778. p.domain = DomainAVX
  90779. p.add(0, func(m *_Encoding, v []interface{}) {
  90780. m.emit(0x62)
  90781. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  90782. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  90783. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  90784. m.emit(0x0b)
  90785. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  90786. m.imm1(toImmAny(v[0]))
  90787. })
  90788. }
  90789. if p.len == 0 {
  90790. panic("invalid operands for VRNDSCALESD")
  90791. }
  90792. return p
  90793. }
  90794. // VRNDSCALESS performs "Round Scalar Single-Precision Floating-Point Value To Include A Given Number Of Fraction Bits".
  90795. //
  90796. // Mnemonic : VRNDSCALESS
  90797. // Supported forms : (3 forms)
  90798. //
  90799. // * VRNDSCALESS imm8, m32, xmm, xmm{k}{z} [AVX512F]
  90800. // * VRNDSCALESS imm8, {sae}, xmm, xmm, xmm{k}{z} [AVX512F]
  90801. // * VRNDSCALESS imm8, xmm, xmm, xmm{k}{z} [AVX512F]
  90802. //
  90803. func (self *Program) VRNDSCALESS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}, vv ...interface{}) *Instruction {
  90804. var p *Instruction
  90805. switch len(vv) {
  90806. case 0 : p = self.alloc("VRNDSCALESS", 4, Operands { v0, v1, v2, v3 })
  90807. case 1 : p = self.alloc("VRNDSCALESS", 5, Operands { v0, v1, v2, v3, vv[0] })
  90808. default : panic("instruction VRNDSCALESS takes 4 or 5 operands")
  90809. }
  90810. // VRNDSCALESS imm8, m32, xmm, xmm{k}{z}
  90811. if len(vv) == 0 && isImm8(v0) && isM32(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  90812. self.require(ISA_AVX512F)
  90813. p.domain = DomainAVX
  90814. p.add(0, func(m *_Encoding, v []interface{}) {
  90815. m.evex(0b11, 0x05, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), 0)
  90816. m.emit(0x0a)
  90817. m.mrsd(lcode(v[3]), addr(v[1]), 4)
  90818. m.imm1(toImmAny(v[0]))
  90819. })
  90820. }
  90821. // VRNDSCALESS imm8, {sae}, xmm, xmm, xmm{k}{z}
  90822. if len(vv) == 1 && isImm8(v0) && isSAE(v1) && isEVEXXMM(v2) && isEVEXXMM(v3) && isXMMkz(vv[0]) {
  90823. self.require(ISA_AVX512F)
  90824. p.domain = DomainAVX
  90825. p.add(0, func(m *_Encoding, v []interface{}) {
  90826. m.emit(0x62)
  90827. m.emit(0xf3 ^ ((hcode(v[4]) << 7) | (ehcode(v[2]) << 5) | (ecode(v[4]) << 4)))
  90828. m.emit(0x7d ^ (hlcode(v[3]) << 3))
  90829. m.emit((zcode(v[4]) << 7) | (0x08 ^ (ecode(v[3]) << 3)) | kcode(v[4]) | 0x10)
  90830. m.emit(0x0a)
  90831. m.emit(0xc0 | lcode(v[4]) << 3 | lcode(v[2]))
  90832. m.imm1(toImmAny(v[0]))
  90833. })
  90834. }
  90835. // VRNDSCALESS imm8, xmm, xmm, xmm{k}{z}
  90836. if len(vv) == 0 && isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  90837. self.require(ISA_AVX512F)
  90838. p.domain = DomainAVX
  90839. p.add(0, func(m *_Encoding, v []interface{}) {
  90840. m.emit(0x62)
  90841. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  90842. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  90843. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  90844. m.emit(0x0a)
  90845. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  90846. m.imm1(toImmAny(v[0]))
  90847. })
  90848. }
  90849. if p.len == 0 {
  90850. panic("invalid operands for VRNDSCALESS")
  90851. }
  90852. return p
  90853. }
  90854. // VROUNDPD performs "Round Packed Double Precision Floating-Point Values".
  90855. //
  90856. // Mnemonic : VROUNDPD
  90857. // Supported forms : (4 forms)
  90858. //
  90859. // * VROUNDPD imm8, xmm, xmm [AVX]
  90860. // * VROUNDPD imm8, m128, xmm [AVX]
  90861. // * VROUNDPD imm8, ymm, ymm [AVX]
  90862. // * VROUNDPD imm8, m256, ymm [AVX]
  90863. //
  90864. func (self *Program) VROUNDPD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  90865. p := self.alloc("VROUNDPD", 3, Operands { v0, v1, v2 })
  90866. // VROUNDPD imm8, xmm, xmm
  90867. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  90868. self.require(ISA_AVX)
  90869. p.domain = DomainAVX
  90870. p.add(0, func(m *_Encoding, v []interface{}) {
  90871. m.emit(0xc4)
  90872. m.emit(0xe3 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  90873. m.emit(0x79)
  90874. m.emit(0x09)
  90875. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  90876. m.imm1(toImmAny(v[0]))
  90877. })
  90878. }
  90879. // VROUNDPD imm8, m128, xmm
  90880. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  90881. self.require(ISA_AVX)
  90882. p.domain = DomainAVX
  90883. p.add(0, func(m *_Encoding, v []interface{}) {
  90884. m.vex3(0xc4, 0b11, 0x01, hcode(v[2]), addr(v[1]), 0)
  90885. m.emit(0x09)
  90886. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  90887. m.imm1(toImmAny(v[0]))
  90888. })
  90889. }
  90890. // VROUNDPD imm8, ymm, ymm
  90891. if isImm8(v0) && isYMM(v1) && isYMM(v2) {
  90892. self.require(ISA_AVX)
  90893. p.domain = DomainAVX
  90894. p.add(0, func(m *_Encoding, v []interface{}) {
  90895. m.emit(0xc4)
  90896. m.emit(0xe3 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  90897. m.emit(0x7d)
  90898. m.emit(0x09)
  90899. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  90900. m.imm1(toImmAny(v[0]))
  90901. })
  90902. }
  90903. // VROUNDPD imm8, m256, ymm
  90904. if isImm8(v0) && isM256(v1) && isYMM(v2) {
  90905. self.require(ISA_AVX)
  90906. p.domain = DomainAVX
  90907. p.add(0, func(m *_Encoding, v []interface{}) {
  90908. m.vex3(0xc4, 0b11, 0x05, hcode(v[2]), addr(v[1]), 0)
  90909. m.emit(0x09)
  90910. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  90911. m.imm1(toImmAny(v[0]))
  90912. })
  90913. }
  90914. if p.len == 0 {
  90915. panic("invalid operands for VROUNDPD")
  90916. }
  90917. return p
  90918. }
  90919. // VROUNDPS performs "Round Packed Single Precision Floating-Point Values".
  90920. //
  90921. // Mnemonic : VROUNDPS
  90922. // Supported forms : (4 forms)
  90923. //
  90924. // * VROUNDPS imm8, xmm, xmm [AVX]
  90925. // * VROUNDPS imm8, m128, xmm [AVX]
  90926. // * VROUNDPS imm8, ymm, ymm [AVX]
  90927. // * VROUNDPS imm8, m256, ymm [AVX]
  90928. //
  90929. func (self *Program) VROUNDPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  90930. p := self.alloc("VROUNDPS", 3, Operands { v0, v1, v2 })
  90931. // VROUNDPS imm8, xmm, xmm
  90932. if isImm8(v0) && isXMM(v1) && isXMM(v2) {
  90933. self.require(ISA_AVX)
  90934. p.domain = DomainAVX
  90935. p.add(0, func(m *_Encoding, v []interface{}) {
  90936. m.emit(0xc4)
  90937. m.emit(0xe3 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  90938. m.emit(0x79)
  90939. m.emit(0x08)
  90940. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  90941. m.imm1(toImmAny(v[0]))
  90942. })
  90943. }
  90944. // VROUNDPS imm8, m128, xmm
  90945. if isImm8(v0) && isM128(v1) && isXMM(v2) {
  90946. self.require(ISA_AVX)
  90947. p.domain = DomainAVX
  90948. p.add(0, func(m *_Encoding, v []interface{}) {
  90949. m.vex3(0xc4, 0b11, 0x01, hcode(v[2]), addr(v[1]), 0)
  90950. m.emit(0x08)
  90951. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  90952. m.imm1(toImmAny(v[0]))
  90953. })
  90954. }
  90955. // VROUNDPS imm8, ymm, ymm
  90956. if isImm8(v0) && isYMM(v1) && isYMM(v2) {
  90957. self.require(ISA_AVX)
  90958. p.domain = DomainAVX
  90959. p.add(0, func(m *_Encoding, v []interface{}) {
  90960. m.emit(0xc4)
  90961. m.emit(0xe3 ^ (hcode(v[2]) << 7) ^ (hcode(v[1]) << 5))
  90962. m.emit(0x7d)
  90963. m.emit(0x08)
  90964. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  90965. m.imm1(toImmAny(v[0]))
  90966. })
  90967. }
  90968. // VROUNDPS imm8, m256, ymm
  90969. if isImm8(v0) && isM256(v1) && isYMM(v2) {
  90970. self.require(ISA_AVX)
  90971. p.domain = DomainAVX
  90972. p.add(0, func(m *_Encoding, v []interface{}) {
  90973. m.vex3(0xc4, 0b11, 0x05, hcode(v[2]), addr(v[1]), 0)
  90974. m.emit(0x08)
  90975. m.mrsd(lcode(v[2]), addr(v[1]), 1)
  90976. m.imm1(toImmAny(v[0]))
  90977. })
  90978. }
  90979. if p.len == 0 {
  90980. panic("invalid operands for VROUNDPS")
  90981. }
  90982. return p
  90983. }
  90984. // VROUNDSD performs "Round Scalar Double Precision Floating-Point Values".
  90985. //
  90986. // Mnemonic : VROUNDSD
  90987. // Supported forms : (2 forms)
  90988. //
  90989. // * VROUNDSD imm8, xmm, xmm, xmm [AVX]
  90990. // * VROUNDSD imm8, m64, xmm, xmm [AVX]
  90991. //
  90992. func (self *Program) VROUNDSD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  90993. p := self.alloc("VROUNDSD", 4, Operands { v0, v1, v2, v3 })
  90994. // VROUNDSD imm8, xmm, xmm, xmm
  90995. if isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  90996. self.require(ISA_AVX)
  90997. p.domain = DomainAVX
  90998. p.add(0, func(m *_Encoding, v []interface{}) {
  90999. m.emit(0xc4)
  91000. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  91001. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  91002. m.emit(0x0b)
  91003. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  91004. m.imm1(toImmAny(v[0]))
  91005. })
  91006. }
  91007. // VROUNDSD imm8, m64, xmm, xmm
  91008. if isImm8(v0) && isM64(v1) && isXMM(v2) && isXMM(v3) {
  91009. self.require(ISA_AVX)
  91010. p.domain = DomainAVX
  91011. p.add(0, func(m *_Encoding, v []interface{}) {
  91012. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  91013. m.emit(0x0b)
  91014. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  91015. m.imm1(toImmAny(v[0]))
  91016. })
  91017. }
  91018. if p.len == 0 {
  91019. panic("invalid operands for VROUNDSD")
  91020. }
  91021. return p
  91022. }
  91023. // VROUNDSS performs "Round Scalar Single Precision Floating-Point Values".
  91024. //
  91025. // Mnemonic : VROUNDSS
  91026. // Supported forms : (2 forms)
  91027. //
  91028. // * VROUNDSS imm8, xmm, xmm, xmm [AVX]
  91029. // * VROUNDSS imm8, m32, xmm, xmm [AVX]
  91030. //
  91031. func (self *Program) VROUNDSS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  91032. p := self.alloc("VROUNDSS", 4, Operands { v0, v1, v2, v3 })
  91033. // VROUNDSS imm8, xmm, xmm, xmm
  91034. if isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  91035. self.require(ISA_AVX)
  91036. p.domain = DomainAVX
  91037. p.add(0, func(m *_Encoding, v []interface{}) {
  91038. m.emit(0xc4)
  91039. m.emit(0xe3 ^ (hcode(v[3]) << 7) ^ (hcode(v[1]) << 5))
  91040. m.emit(0x79 ^ (hlcode(v[2]) << 3))
  91041. m.emit(0x0a)
  91042. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  91043. m.imm1(toImmAny(v[0]))
  91044. })
  91045. }
  91046. // VROUNDSS imm8, m32, xmm, xmm
  91047. if isImm8(v0) && isM32(v1) && isXMM(v2) && isXMM(v3) {
  91048. self.require(ISA_AVX)
  91049. p.domain = DomainAVX
  91050. p.add(0, func(m *_Encoding, v []interface{}) {
  91051. m.vex3(0xc4, 0b11, 0x01, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  91052. m.emit(0x0a)
  91053. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  91054. m.imm1(toImmAny(v[0]))
  91055. })
  91056. }
  91057. if p.len == 0 {
  91058. panic("invalid operands for VROUNDSS")
  91059. }
  91060. return p
  91061. }
  91062. // VRSQRT14PD performs "Compute Approximate Reciprocals of Square Roots of Packed Double-Precision Floating-Point Values".
  91063. //
  91064. // Mnemonic : VRSQRT14PD
  91065. // Supported forms : (6 forms)
  91066. //
  91067. // * VRSQRT14PD m512/m64bcst, zmm{k}{z} [AVX512F]
  91068. // * VRSQRT14PD zmm, zmm{k}{z} [AVX512F]
  91069. // * VRSQRT14PD m128/m64bcst, xmm{k}{z} [AVX512F,AVX512VL]
  91070. // * VRSQRT14PD m256/m64bcst, ymm{k}{z} [AVX512F,AVX512VL]
  91071. // * VRSQRT14PD xmm, xmm{k}{z} [AVX512F,AVX512VL]
  91072. // * VRSQRT14PD ymm, ymm{k}{z} [AVX512F,AVX512VL]
  91073. //
  91074. func (self *Program) VRSQRT14PD(v0 interface{}, v1 interface{}) *Instruction {
  91075. p := self.alloc("VRSQRT14PD", 2, Operands { v0, v1 })
  91076. // VRSQRT14PD m512/m64bcst, zmm{k}{z}
  91077. if isM512M64bcst(v0) && isZMMkz(v1) {
  91078. self.require(ISA_AVX512F)
  91079. p.domain = DomainAVX
  91080. p.add(0, func(m *_Encoding, v []interface{}) {
  91081. m.evex(0b10, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  91082. m.emit(0x4e)
  91083. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  91084. })
  91085. }
  91086. // VRSQRT14PD zmm, zmm{k}{z}
  91087. if isZMM(v0) && isZMMkz(v1) {
  91088. self.require(ISA_AVX512F)
  91089. p.domain = DomainAVX
  91090. p.add(0, func(m *_Encoding, v []interface{}) {
  91091. m.emit(0x62)
  91092. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  91093. m.emit(0xfd)
  91094. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  91095. m.emit(0x4e)
  91096. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  91097. })
  91098. }
  91099. // VRSQRT14PD m128/m64bcst, xmm{k}{z}
  91100. if isM128M64bcst(v0) && isXMMkz(v1) {
  91101. self.require(ISA_AVX512VL | ISA_AVX512F)
  91102. p.domain = DomainAVX
  91103. p.add(0, func(m *_Encoding, v []interface{}) {
  91104. m.evex(0b10, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  91105. m.emit(0x4e)
  91106. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  91107. })
  91108. }
  91109. // VRSQRT14PD m256/m64bcst, ymm{k}{z}
  91110. if isM256M64bcst(v0) && isYMMkz(v1) {
  91111. self.require(ISA_AVX512VL | ISA_AVX512F)
  91112. p.domain = DomainAVX
  91113. p.add(0, func(m *_Encoding, v []interface{}) {
  91114. m.evex(0b10, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  91115. m.emit(0x4e)
  91116. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  91117. })
  91118. }
  91119. // VRSQRT14PD xmm, xmm{k}{z}
  91120. if isEVEXXMM(v0) && isXMMkz(v1) {
  91121. self.require(ISA_AVX512VL | ISA_AVX512F)
  91122. p.domain = DomainAVX
  91123. p.add(0, func(m *_Encoding, v []interface{}) {
  91124. m.emit(0x62)
  91125. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  91126. m.emit(0xfd)
  91127. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  91128. m.emit(0x4e)
  91129. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  91130. })
  91131. }
  91132. // VRSQRT14PD ymm, ymm{k}{z}
  91133. if isEVEXYMM(v0) && isYMMkz(v1) {
  91134. self.require(ISA_AVX512VL | ISA_AVX512F)
  91135. p.domain = DomainAVX
  91136. p.add(0, func(m *_Encoding, v []interface{}) {
  91137. m.emit(0x62)
  91138. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  91139. m.emit(0xfd)
  91140. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  91141. m.emit(0x4e)
  91142. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  91143. })
  91144. }
  91145. if p.len == 0 {
  91146. panic("invalid operands for VRSQRT14PD")
  91147. }
  91148. return p
  91149. }
  91150. // VRSQRT14PS performs "Compute Approximate Reciprocals of Square Roots of Packed Single-Precision Floating-Point Values".
  91151. //
  91152. // Mnemonic : VRSQRT14PS
  91153. // Supported forms : (6 forms)
  91154. //
  91155. // * VRSQRT14PS m512/m32bcst, zmm{k}{z} [AVX512F]
  91156. // * VRSQRT14PS zmm, zmm{k}{z} [AVX512F]
  91157. // * VRSQRT14PS m128/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  91158. // * VRSQRT14PS m256/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  91159. // * VRSQRT14PS xmm, xmm{k}{z} [AVX512F,AVX512VL]
  91160. // * VRSQRT14PS ymm, ymm{k}{z} [AVX512F,AVX512VL]
  91161. //
  91162. func (self *Program) VRSQRT14PS(v0 interface{}, v1 interface{}) *Instruction {
  91163. p := self.alloc("VRSQRT14PS", 2, Operands { v0, v1 })
  91164. // VRSQRT14PS m512/m32bcst, zmm{k}{z}
  91165. if isM512M32bcst(v0) && isZMMkz(v1) {
  91166. self.require(ISA_AVX512F)
  91167. p.domain = DomainAVX
  91168. p.add(0, func(m *_Encoding, v []interface{}) {
  91169. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  91170. m.emit(0x4e)
  91171. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  91172. })
  91173. }
  91174. // VRSQRT14PS zmm, zmm{k}{z}
  91175. if isZMM(v0) && isZMMkz(v1) {
  91176. self.require(ISA_AVX512F)
  91177. p.domain = DomainAVX
  91178. p.add(0, func(m *_Encoding, v []interface{}) {
  91179. m.emit(0x62)
  91180. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  91181. m.emit(0x7d)
  91182. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  91183. m.emit(0x4e)
  91184. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  91185. })
  91186. }
  91187. // VRSQRT14PS m128/m32bcst, xmm{k}{z}
  91188. if isM128M32bcst(v0) && isXMMkz(v1) {
  91189. self.require(ISA_AVX512VL | ISA_AVX512F)
  91190. p.domain = DomainAVX
  91191. p.add(0, func(m *_Encoding, v []interface{}) {
  91192. m.evex(0b10, 0x05, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  91193. m.emit(0x4e)
  91194. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  91195. })
  91196. }
  91197. // VRSQRT14PS m256/m32bcst, ymm{k}{z}
  91198. if isM256M32bcst(v0) && isYMMkz(v1) {
  91199. self.require(ISA_AVX512VL | ISA_AVX512F)
  91200. p.domain = DomainAVX
  91201. p.add(0, func(m *_Encoding, v []interface{}) {
  91202. m.evex(0b10, 0x05, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  91203. m.emit(0x4e)
  91204. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  91205. })
  91206. }
  91207. // VRSQRT14PS xmm, xmm{k}{z}
  91208. if isEVEXXMM(v0) && isXMMkz(v1) {
  91209. self.require(ISA_AVX512VL | ISA_AVX512F)
  91210. p.domain = DomainAVX
  91211. p.add(0, func(m *_Encoding, v []interface{}) {
  91212. m.emit(0x62)
  91213. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  91214. m.emit(0x7d)
  91215. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  91216. m.emit(0x4e)
  91217. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  91218. })
  91219. }
  91220. // VRSQRT14PS ymm, ymm{k}{z}
  91221. if isEVEXYMM(v0) && isYMMkz(v1) {
  91222. self.require(ISA_AVX512VL | ISA_AVX512F)
  91223. p.domain = DomainAVX
  91224. p.add(0, func(m *_Encoding, v []interface{}) {
  91225. m.emit(0x62)
  91226. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  91227. m.emit(0x7d)
  91228. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  91229. m.emit(0x4e)
  91230. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  91231. })
  91232. }
  91233. if p.len == 0 {
  91234. panic("invalid operands for VRSQRT14PS")
  91235. }
  91236. return p
  91237. }
  91238. // VRSQRT14SD performs "Compute Approximate Reciprocal of a Square Root of a Scalar Double-Precision Floating-Point Value".
  91239. //
  91240. // Mnemonic : VRSQRT14SD
  91241. // Supported forms : (2 forms)
  91242. //
  91243. // * VRSQRT14SD xmm, xmm, xmm{k}{z} [AVX512F]
  91244. // * VRSQRT14SD m64, xmm, xmm{k}{z} [AVX512F]
  91245. //
  91246. func (self *Program) VRSQRT14SD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  91247. p := self.alloc("VRSQRT14SD", 3, Operands { v0, v1, v2 })
  91248. // VRSQRT14SD xmm, xmm, xmm{k}{z}
  91249. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  91250. self.require(ISA_AVX512F)
  91251. p.domain = DomainAVX
  91252. p.add(0, func(m *_Encoding, v []interface{}) {
  91253. m.emit(0x62)
  91254. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  91255. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  91256. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  91257. m.emit(0x4f)
  91258. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  91259. })
  91260. }
  91261. // VRSQRT14SD m64, xmm, xmm{k}{z}
  91262. if isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  91263. self.require(ISA_AVX512F)
  91264. p.domain = DomainAVX
  91265. p.add(0, func(m *_Encoding, v []interface{}) {
  91266. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  91267. m.emit(0x4f)
  91268. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  91269. })
  91270. }
  91271. if p.len == 0 {
  91272. panic("invalid operands for VRSQRT14SD")
  91273. }
  91274. return p
  91275. }
  91276. // VRSQRT14SS performs "Compute Approximate Reciprocal of a Square Root of a Scalar Single-Precision Floating-Point Value".
  91277. //
  91278. // Mnemonic : VRSQRT14SS
  91279. // Supported forms : (2 forms)
  91280. //
  91281. // * VRSQRT14SS xmm, xmm, xmm{k}{z} [AVX512F]
  91282. // * VRSQRT14SS m32, xmm, xmm{k}{z} [AVX512F]
  91283. //
  91284. func (self *Program) VRSQRT14SS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  91285. p := self.alloc("VRSQRT14SS", 3, Operands { v0, v1, v2 })
  91286. // VRSQRT14SS xmm, xmm, xmm{k}{z}
  91287. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  91288. self.require(ISA_AVX512F)
  91289. p.domain = DomainAVX
  91290. p.add(0, func(m *_Encoding, v []interface{}) {
  91291. m.emit(0x62)
  91292. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  91293. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  91294. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  91295. m.emit(0x4f)
  91296. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  91297. })
  91298. }
  91299. // VRSQRT14SS m32, xmm, xmm{k}{z}
  91300. if isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  91301. self.require(ISA_AVX512F)
  91302. p.domain = DomainAVX
  91303. p.add(0, func(m *_Encoding, v []interface{}) {
  91304. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  91305. m.emit(0x4f)
  91306. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  91307. })
  91308. }
  91309. if p.len == 0 {
  91310. panic("invalid operands for VRSQRT14SS")
  91311. }
  91312. return p
  91313. }
  91314. // VRSQRT28PD performs "Approximation to the Reciprocal Square Root of Packed Double-Precision Floating-Point Values with Less Than 2^-28 Relative Error".
  91315. //
  91316. // Mnemonic : VRSQRT28PD
  91317. // Supported forms : (3 forms)
  91318. //
  91319. // * VRSQRT28PD m512/m64bcst, zmm{k}{z} [AVX512ER]
  91320. // * VRSQRT28PD {sae}, zmm, zmm{k}{z} [AVX512ER]
  91321. // * VRSQRT28PD zmm, zmm{k}{z} [AVX512ER]
  91322. //
  91323. func (self *Program) VRSQRT28PD(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  91324. var p *Instruction
  91325. switch len(vv) {
  91326. case 0 : p = self.alloc("VRSQRT28PD", 2, Operands { v0, v1 })
  91327. case 1 : p = self.alloc("VRSQRT28PD", 3, Operands { v0, v1, vv[0] })
  91328. default : panic("instruction VRSQRT28PD takes 2 or 3 operands")
  91329. }
  91330. // VRSQRT28PD m512/m64bcst, zmm{k}{z}
  91331. if len(vv) == 0 && isM512M64bcst(v0) && isZMMkz(v1) {
  91332. self.require(ISA_AVX512ER)
  91333. p.domain = DomainAVX
  91334. p.add(0, func(m *_Encoding, v []interface{}) {
  91335. m.evex(0b10, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  91336. m.emit(0xcc)
  91337. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  91338. })
  91339. }
  91340. // VRSQRT28PD {sae}, zmm, zmm{k}{z}
  91341. if len(vv) == 1 && isSAE(v0) && isZMM(v1) && isZMMkz(vv[0]) {
  91342. self.require(ISA_AVX512ER)
  91343. p.domain = DomainAVX
  91344. p.add(0, func(m *_Encoding, v []interface{}) {
  91345. m.emit(0x62)
  91346. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  91347. m.emit(0xfd)
  91348. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x18)
  91349. m.emit(0xcc)
  91350. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  91351. })
  91352. }
  91353. // VRSQRT28PD zmm, zmm{k}{z}
  91354. if len(vv) == 0 && isZMM(v0) && isZMMkz(v1) {
  91355. self.require(ISA_AVX512ER)
  91356. p.domain = DomainAVX
  91357. p.add(0, func(m *_Encoding, v []interface{}) {
  91358. m.emit(0x62)
  91359. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  91360. m.emit(0xfd)
  91361. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  91362. m.emit(0xcc)
  91363. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  91364. })
  91365. }
  91366. if p.len == 0 {
  91367. panic("invalid operands for VRSQRT28PD")
  91368. }
  91369. return p
  91370. }
  91371. // VRSQRT28PS performs "Approximation to the Reciprocal Square Root of Packed Single-Precision Floating-Point Values with Less Than 2^-28 Relative Error".
  91372. //
  91373. // Mnemonic : VRSQRT28PS
  91374. // Supported forms : (3 forms)
  91375. //
  91376. // * VRSQRT28PS m512/m32bcst, zmm{k}{z} [AVX512ER]
  91377. // * VRSQRT28PS {sae}, zmm, zmm{k}{z} [AVX512ER]
  91378. // * VRSQRT28PS zmm, zmm{k}{z} [AVX512ER]
  91379. //
  91380. func (self *Program) VRSQRT28PS(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  91381. var p *Instruction
  91382. switch len(vv) {
  91383. case 0 : p = self.alloc("VRSQRT28PS", 2, Operands { v0, v1 })
  91384. case 1 : p = self.alloc("VRSQRT28PS", 3, Operands { v0, v1, vv[0] })
  91385. default : panic("instruction VRSQRT28PS takes 2 or 3 operands")
  91386. }
  91387. // VRSQRT28PS m512/m32bcst, zmm{k}{z}
  91388. if len(vv) == 0 && isM512M32bcst(v0) && isZMMkz(v1) {
  91389. self.require(ISA_AVX512ER)
  91390. p.domain = DomainAVX
  91391. p.add(0, func(m *_Encoding, v []interface{}) {
  91392. m.evex(0b10, 0x05, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  91393. m.emit(0xcc)
  91394. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  91395. })
  91396. }
  91397. // VRSQRT28PS {sae}, zmm, zmm{k}{z}
  91398. if len(vv) == 1 && isSAE(v0) && isZMM(v1) && isZMMkz(vv[0]) {
  91399. self.require(ISA_AVX512ER)
  91400. p.domain = DomainAVX
  91401. p.add(0, func(m *_Encoding, v []interface{}) {
  91402. m.emit(0x62)
  91403. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  91404. m.emit(0x7d)
  91405. m.emit((zcode(v[2]) << 7) | kcode(v[2]) | 0x18)
  91406. m.emit(0xcc)
  91407. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  91408. })
  91409. }
  91410. // VRSQRT28PS zmm, zmm{k}{z}
  91411. if len(vv) == 0 && isZMM(v0) && isZMMkz(v1) {
  91412. self.require(ISA_AVX512ER)
  91413. p.domain = DomainAVX
  91414. p.add(0, func(m *_Encoding, v []interface{}) {
  91415. m.emit(0x62)
  91416. m.emit(0xf2 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  91417. m.emit(0x7d)
  91418. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  91419. m.emit(0xcc)
  91420. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  91421. })
  91422. }
  91423. if p.len == 0 {
  91424. panic("invalid operands for VRSQRT28PS")
  91425. }
  91426. return p
  91427. }
  91428. // VRSQRT28SD performs "Approximation to the Reciprocal Square Root of a Scalar Double-Precision Floating-Point Value with Less Than 2^-28 Relative Error".
  91429. //
  91430. // Mnemonic : VRSQRT28SD
  91431. // Supported forms : (3 forms)
  91432. //
  91433. // * VRSQRT28SD m64, xmm, xmm{k}{z} [AVX512ER]
  91434. // * VRSQRT28SD {sae}, xmm, xmm, xmm{k}{z} [AVX512ER]
  91435. // * VRSQRT28SD xmm, xmm, xmm{k}{z} [AVX512ER]
  91436. //
  91437. func (self *Program) VRSQRT28SD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  91438. var p *Instruction
  91439. switch len(vv) {
  91440. case 0 : p = self.alloc("VRSQRT28SD", 3, Operands { v0, v1, v2 })
  91441. case 1 : p = self.alloc("VRSQRT28SD", 4, Operands { v0, v1, v2, vv[0] })
  91442. default : panic("instruction VRSQRT28SD takes 3 or 4 operands")
  91443. }
  91444. // VRSQRT28SD m64, xmm, xmm{k}{z}
  91445. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  91446. self.require(ISA_AVX512ER)
  91447. p.domain = DomainAVX
  91448. p.add(0, func(m *_Encoding, v []interface{}) {
  91449. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  91450. m.emit(0xcd)
  91451. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  91452. })
  91453. }
  91454. // VRSQRT28SD {sae}, xmm, xmm, xmm{k}{z}
  91455. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  91456. self.require(ISA_AVX512ER)
  91457. p.domain = DomainAVX
  91458. p.add(0, func(m *_Encoding, v []interface{}) {
  91459. m.emit(0x62)
  91460. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  91461. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  91462. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  91463. m.emit(0xcd)
  91464. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  91465. })
  91466. }
  91467. // VRSQRT28SD xmm, xmm, xmm{k}{z}
  91468. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  91469. self.require(ISA_AVX512ER)
  91470. p.domain = DomainAVX
  91471. p.add(0, func(m *_Encoding, v []interface{}) {
  91472. m.emit(0x62)
  91473. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  91474. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  91475. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  91476. m.emit(0xcd)
  91477. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  91478. })
  91479. }
  91480. if p.len == 0 {
  91481. panic("invalid operands for VRSQRT28SD")
  91482. }
  91483. return p
  91484. }
  91485. // VRSQRT28SS performs "Approximation to the Reciprocal Square Root of a Scalar Single-Precision Floating-Point Value with Less Than 2^-28 Relative Error".
  91486. //
  91487. // Mnemonic : VRSQRT28SS
  91488. // Supported forms : (3 forms)
  91489. //
  91490. // * VRSQRT28SS m32, xmm, xmm{k}{z} [AVX512ER]
  91491. // * VRSQRT28SS {sae}, xmm, xmm, xmm{k}{z} [AVX512ER]
  91492. // * VRSQRT28SS xmm, xmm, xmm{k}{z} [AVX512ER]
  91493. //
  91494. func (self *Program) VRSQRT28SS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  91495. var p *Instruction
  91496. switch len(vv) {
  91497. case 0 : p = self.alloc("VRSQRT28SS", 3, Operands { v0, v1, v2 })
  91498. case 1 : p = self.alloc("VRSQRT28SS", 4, Operands { v0, v1, v2, vv[0] })
  91499. default : panic("instruction VRSQRT28SS takes 3 or 4 operands")
  91500. }
  91501. // VRSQRT28SS m32, xmm, xmm{k}{z}
  91502. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  91503. self.require(ISA_AVX512ER)
  91504. p.domain = DomainAVX
  91505. p.add(0, func(m *_Encoding, v []interface{}) {
  91506. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  91507. m.emit(0xcd)
  91508. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  91509. })
  91510. }
  91511. // VRSQRT28SS {sae}, xmm, xmm, xmm{k}{z}
  91512. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  91513. self.require(ISA_AVX512ER)
  91514. p.domain = DomainAVX
  91515. p.add(0, func(m *_Encoding, v []interface{}) {
  91516. m.emit(0x62)
  91517. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  91518. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  91519. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  91520. m.emit(0xcd)
  91521. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  91522. })
  91523. }
  91524. // VRSQRT28SS xmm, xmm, xmm{k}{z}
  91525. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  91526. self.require(ISA_AVX512ER)
  91527. p.domain = DomainAVX
  91528. p.add(0, func(m *_Encoding, v []interface{}) {
  91529. m.emit(0x62)
  91530. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  91531. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  91532. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  91533. m.emit(0xcd)
  91534. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  91535. })
  91536. }
  91537. if p.len == 0 {
  91538. panic("invalid operands for VRSQRT28SS")
  91539. }
  91540. return p
  91541. }
  91542. // VRSQRTPS performs "Compute Reciprocals of Square Roots of Packed Single-Precision Floating-Point Values".
  91543. //
  91544. // Mnemonic : VRSQRTPS
  91545. // Supported forms : (4 forms)
  91546. //
  91547. // * VRSQRTPS xmm, xmm [AVX]
  91548. // * VRSQRTPS m128, xmm [AVX]
  91549. // * VRSQRTPS ymm, ymm [AVX]
  91550. // * VRSQRTPS m256, ymm [AVX]
  91551. //
  91552. func (self *Program) VRSQRTPS(v0 interface{}, v1 interface{}) *Instruction {
  91553. p := self.alloc("VRSQRTPS", 2, Operands { v0, v1 })
  91554. // VRSQRTPS xmm, xmm
  91555. if isXMM(v0) && isXMM(v1) {
  91556. self.require(ISA_AVX)
  91557. p.domain = DomainAVX
  91558. p.add(0, func(m *_Encoding, v []interface{}) {
  91559. m.vex2(0, hcode(v[1]), v[0], 0)
  91560. m.emit(0x52)
  91561. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  91562. })
  91563. }
  91564. // VRSQRTPS m128, xmm
  91565. if isM128(v0) && isXMM(v1) {
  91566. self.require(ISA_AVX)
  91567. p.domain = DomainAVX
  91568. p.add(0, func(m *_Encoding, v []interface{}) {
  91569. m.vex2(0, hcode(v[1]), addr(v[0]), 0)
  91570. m.emit(0x52)
  91571. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  91572. })
  91573. }
  91574. // VRSQRTPS ymm, ymm
  91575. if isYMM(v0) && isYMM(v1) {
  91576. self.require(ISA_AVX)
  91577. p.domain = DomainAVX
  91578. p.add(0, func(m *_Encoding, v []interface{}) {
  91579. m.vex2(4, hcode(v[1]), v[0], 0)
  91580. m.emit(0x52)
  91581. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  91582. })
  91583. }
  91584. // VRSQRTPS m256, ymm
  91585. if isM256(v0) && isYMM(v1) {
  91586. self.require(ISA_AVX)
  91587. p.domain = DomainAVX
  91588. p.add(0, func(m *_Encoding, v []interface{}) {
  91589. m.vex2(4, hcode(v[1]), addr(v[0]), 0)
  91590. m.emit(0x52)
  91591. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  91592. })
  91593. }
  91594. if p.len == 0 {
  91595. panic("invalid operands for VRSQRTPS")
  91596. }
  91597. return p
  91598. }
  91599. // VRSQRTSS performs "Compute Reciprocal of Square Root of Scalar Single-Precision Floating-Point Value".
  91600. //
  91601. // Mnemonic : VRSQRTSS
  91602. // Supported forms : (2 forms)
  91603. //
  91604. // * VRSQRTSS xmm, xmm, xmm [AVX]
  91605. // * VRSQRTSS m32, xmm, xmm [AVX]
  91606. //
  91607. func (self *Program) VRSQRTSS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  91608. p := self.alloc("VRSQRTSS", 3, Operands { v0, v1, v2 })
  91609. // VRSQRTSS xmm, xmm, xmm
  91610. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  91611. self.require(ISA_AVX)
  91612. p.domain = DomainAVX
  91613. p.add(0, func(m *_Encoding, v []interface{}) {
  91614. m.vex2(2, hcode(v[2]), v[0], hlcode(v[1]))
  91615. m.emit(0x52)
  91616. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  91617. })
  91618. }
  91619. // VRSQRTSS m32, xmm, xmm
  91620. if isM32(v0) && isXMM(v1) && isXMM(v2) {
  91621. self.require(ISA_AVX)
  91622. p.domain = DomainAVX
  91623. p.add(0, func(m *_Encoding, v []interface{}) {
  91624. m.vex2(2, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  91625. m.emit(0x52)
  91626. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  91627. })
  91628. }
  91629. if p.len == 0 {
  91630. panic("invalid operands for VRSQRTSS")
  91631. }
  91632. return p
  91633. }
  91634. // VSCALEFPD performs "Scale Packed Double-Precision Floating-Point Values With Double-Precision Floating-Point Values".
  91635. //
  91636. // Mnemonic : VSCALEFPD
  91637. // Supported forms : (7 forms)
  91638. //
  91639. // * VSCALEFPD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  91640. // * VSCALEFPD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  91641. // * VSCALEFPD zmm, zmm, zmm{k}{z} [AVX512F]
  91642. // * VSCALEFPD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  91643. // * VSCALEFPD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  91644. // * VSCALEFPD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  91645. // * VSCALEFPD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  91646. //
  91647. func (self *Program) VSCALEFPD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  91648. var p *Instruction
  91649. switch len(vv) {
  91650. case 0 : p = self.alloc("VSCALEFPD", 3, Operands { v0, v1, v2 })
  91651. case 1 : p = self.alloc("VSCALEFPD", 4, Operands { v0, v1, v2, vv[0] })
  91652. default : panic("instruction VSCALEFPD takes 3 or 4 operands")
  91653. }
  91654. // VSCALEFPD m512/m64bcst, zmm, zmm{k}{z}
  91655. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  91656. self.require(ISA_AVX512F)
  91657. p.domain = DomainAVX
  91658. p.add(0, func(m *_Encoding, v []interface{}) {
  91659. m.evex(0b10, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  91660. m.emit(0x2c)
  91661. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  91662. })
  91663. }
  91664. // VSCALEFPD {er}, zmm, zmm, zmm{k}{z}
  91665. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  91666. self.require(ISA_AVX512F)
  91667. p.domain = DomainAVX
  91668. p.add(0, func(m *_Encoding, v []interface{}) {
  91669. m.emit(0x62)
  91670. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  91671. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  91672. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  91673. m.emit(0x2c)
  91674. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  91675. })
  91676. }
  91677. // VSCALEFPD zmm, zmm, zmm{k}{z}
  91678. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  91679. self.require(ISA_AVX512F)
  91680. p.domain = DomainAVX
  91681. p.add(0, func(m *_Encoding, v []interface{}) {
  91682. m.emit(0x62)
  91683. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  91684. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  91685. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  91686. m.emit(0x2c)
  91687. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  91688. })
  91689. }
  91690. // VSCALEFPD m128/m64bcst, xmm, xmm{k}{z}
  91691. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  91692. self.require(ISA_AVX512VL | ISA_AVX512F)
  91693. p.domain = DomainAVX
  91694. p.add(0, func(m *_Encoding, v []interface{}) {
  91695. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  91696. m.emit(0x2c)
  91697. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  91698. })
  91699. }
  91700. // VSCALEFPD xmm, xmm, xmm{k}{z}
  91701. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  91702. self.require(ISA_AVX512VL | ISA_AVX512F)
  91703. p.domain = DomainAVX
  91704. p.add(0, func(m *_Encoding, v []interface{}) {
  91705. m.emit(0x62)
  91706. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  91707. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  91708. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  91709. m.emit(0x2c)
  91710. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  91711. })
  91712. }
  91713. // VSCALEFPD m256/m64bcst, ymm, ymm{k}{z}
  91714. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  91715. self.require(ISA_AVX512VL | ISA_AVX512F)
  91716. p.domain = DomainAVX
  91717. p.add(0, func(m *_Encoding, v []interface{}) {
  91718. m.evex(0b10, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  91719. m.emit(0x2c)
  91720. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  91721. })
  91722. }
  91723. // VSCALEFPD ymm, ymm, ymm{k}{z}
  91724. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  91725. self.require(ISA_AVX512VL | ISA_AVX512F)
  91726. p.domain = DomainAVX
  91727. p.add(0, func(m *_Encoding, v []interface{}) {
  91728. m.emit(0x62)
  91729. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  91730. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  91731. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  91732. m.emit(0x2c)
  91733. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  91734. })
  91735. }
  91736. if p.len == 0 {
  91737. panic("invalid operands for VSCALEFPD")
  91738. }
  91739. return p
  91740. }
  91741. // VSCALEFPS performs "Scale Packed Single-Precision Floating-Point Values With Single-Precision Floating-Point Values".
  91742. //
  91743. // Mnemonic : VSCALEFPS
  91744. // Supported forms : (7 forms)
  91745. //
  91746. // * VSCALEFPS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  91747. // * VSCALEFPS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  91748. // * VSCALEFPS zmm, zmm, zmm{k}{z} [AVX512F]
  91749. // * VSCALEFPS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  91750. // * VSCALEFPS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  91751. // * VSCALEFPS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  91752. // * VSCALEFPS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  91753. //
  91754. func (self *Program) VSCALEFPS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  91755. var p *Instruction
  91756. switch len(vv) {
  91757. case 0 : p = self.alloc("VSCALEFPS", 3, Operands { v0, v1, v2 })
  91758. case 1 : p = self.alloc("VSCALEFPS", 4, Operands { v0, v1, v2, vv[0] })
  91759. default : panic("instruction VSCALEFPS takes 3 or 4 operands")
  91760. }
  91761. // VSCALEFPS m512/m32bcst, zmm, zmm{k}{z}
  91762. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  91763. self.require(ISA_AVX512F)
  91764. p.domain = DomainAVX
  91765. p.add(0, func(m *_Encoding, v []interface{}) {
  91766. m.evex(0b10, 0x05, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  91767. m.emit(0x2c)
  91768. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  91769. })
  91770. }
  91771. // VSCALEFPS {er}, zmm, zmm, zmm{k}{z}
  91772. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  91773. self.require(ISA_AVX512F)
  91774. p.domain = DomainAVX
  91775. p.add(0, func(m *_Encoding, v []interface{}) {
  91776. m.emit(0x62)
  91777. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  91778. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  91779. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  91780. m.emit(0x2c)
  91781. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  91782. })
  91783. }
  91784. // VSCALEFPS zmm, zmm, zmm{k}{z}
  91785. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  91786. self.require(ISA_AVX512F)
  91787. p.domain = DomainAVX
  91788. p.add(0, func(m *_Encoding, v []interface{}) {
  91789. m.emit(0x62)
  91790. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  91791. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  91792. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  91793. m.emit(0x2c)
  91794. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  91795. })
  91796. }
  91797. // VSCALEFPS m128/m32bcst, xmm, xmm{k}{z}
  91798. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  91799. self.require(ISA_AVX512VL | ISA_AVX512F)
  91800. p.domain = DomainAVX
  91801. p.add(0, func(m *_Encoding, v []interface{}) {
  91802. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  91803. m.emit(0x2c)
  91804. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  91805. })
  91806. }
  91807. // VSCALEFPS xmm, xmm, xmm{k}{z}
  91808. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  91809. self.require(ISA_AVX512VL | ISA_AVX512F)
  91810. p.domain = DomainAVX
  91811. p.add(0, func(m *_Encoding, v []interface{}) {
  91812. m.emit(0x62)
  91813. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  91814. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  91815. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  91816. m.emit(0x2c)
  91817. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  91818. })
  91819. }
  91820. // VSCALEFPS m256/m32bcst, ymm, ymm{k}{z}
  91821. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  91822. self.require(ISA_AVX512VL | ISA_AVX512F)
  91823. p.domain = DomainAVX
  91824. p.add(0, func(m *_Encoding, v []interface{}) {
  91825. m.evex(0b10, 0x05, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  91826. m.emit(0x2c)
  91827. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  91828. })
  91829. }
  91830. // VSCALEFPS ymm, ymm, ymm{k}{z}
  91831. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  91832. self.require(ISA_AVX512VL | ISA_AVX512F)
  91833. p.domain = DomainAVX
  91834. p.add(0, func(m *_Encoding, v []interface{}) {
  91835. m.emit(0x62)
  91836. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  91837. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  91838. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  91839. m.emit(0x2c)
  91840. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  91841. })
  91842. }
  91843. if p.len == 0 {
  91844. panic("invalid operands for VSCALEFPS")
  91845. }
  91846. return p
  91847. }
  91848. // VSCALEFSD performs "Scale Scalar Double-Precision Floating-Point Value With a Double-Precision Floating-Point Value".
  91849. //
  91850. // Mnemonic : VSCALEFSD
  91851. // Supported forms : (3 forms)
  91852. //
  91853. // * VSCALEFSD m64, xmm, xmm{k}{z} [AVX512F]
  91854. // * VSCALEFSD {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  91855. // * VSCALEFSD xmm, xmm, xmm{k}{z} [AVX512F]
  91856. //
  91857. func (self *Program) VSCALEFSD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  91858. var p *Instruction
  91859. switch len(vv) {
  91860. case 0 : p = self.alloc("VSCALEFSD", 3, Operands { v0, v1, v2 })
  91861. case 1 : p = self.alloc("VSCALEFSD", 4, Operands { v0, v1, v2, vv[0] })
  91862. default : panic("instruction VSCALEFSD takes 3 or 4 operands")
  91863. }
  91864. // VSCALEFSD m64, xmm, xmm{k}{z}
  91865. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  91866. self.require(ISA_AVX512F)
  91867. p.domain = DomainAVX
  91868. p.add(0, func(m *_Encoding, v []interface{}) {
  91869. m.evex(0b10, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  91870. m.emit(0x2d)
  91871. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  91872. })
  91873. }
  91874. // VSCALEFSD {er}, xmm, xmm, xmm{k}{z}
  91875. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  91876. self.require(ISA_AVX512F)
  91877. p.domain = DomainAVX
  91878. p.add(0, func(m *_Encoding, v []interface{}) {
  91879. m.emit(0x62)
  91880. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  91881. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  91882. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  91883. m.emit(0x2d)
  91884. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  91885. })
  91886. }
  91887. // VSCALEFSD xmm, xmm, xmm{k}{z}
  91888. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  91889. self.require(ISA_AVX512F)
  91890. p.domain = DomainAVX
  91891. p.add(0, func(m *_Encoding, v []interface{}) {
  91892. m.emit(0x62)
  91893. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  91894. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  91895. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  91896. m.emit(0x2d)
  91897. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  91898. })
  91899. }
  91900. if p.len == 0 {
  91901. panic("invalid operands for VSCALEFSD")
  91902. }
  91903. return p
  91904. }
  91905. // VSCALEFSS performs "Scale Scalar Single-Precision Floating-Point Value With a Single-Precision Floating-Point Value".
  91906. //
  91907. // Mnemonic : VSCALEFSS
  91908. // Supported forms : (3 forms)
  91909. //
  91910. // * VSCALEFSS m32, xmm, xmm{k}{z} [AVX512F]
  91911. // * VSCALEFSS {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  91912. // * VSCALEFSS xmm, xmm, xmm{k}{z} [AVX512F]
  91913. //
  91914. func (self *Program) VSCALEFSS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  91915. var p *Instruction
  91916. switch len(vv) {
  91917. case 0 : p = self.alloc("VSCALEFSS", 3, Operands { v0, v1, v2 })
  91918. case 1 : p = self.alloc("VSCALEFSS", 4, Operands { v0, v1, v2, vv[0] })
  91919. default : panic("instruction VSCALEFSS takes 3 or 4 operands")
  91920. }
  91921. // VSCALEFSS m32, xmm, xmm{k}{z}
  91922. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  91923. self.require(ISA_AVX512F)
  91924. p.domain = DomainAVX
  91925. p.add(0, func(m *_Encoding, v []interface{}) {
  91926. m.evex(0b10, 0x05, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  91927. m.emit(0x2d)
  91928. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  91929. })
  91930. }
  91931. // VSCALEFSS {er}, xmm, xmm, xmm{k}{z}
  91932. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  91933. self.require(ISA_AVX512F)
  91934. p.domain = DomainAVX
  91935. p.add(0, func(m *_Encoding, v []interface{}) {
  91936. m.emit(0x62)
  91937. m.emit(0xf2 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  91938. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  91939. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  91940. m.emit(0x2d)
  91941. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  91942. })
  91943. }
  91944. // VSCALEFSS xmm, xmm, xmm{k}{z}
  91945. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  91946. self.require(ISA_AVX512F)
  91947. p.domain = DomainAVX
  91948. p.add(0, func(m *_Encoding, v []interface{}) {
  91949. m.emit(0x62)
  91950. m.emit(0xf2 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  91951. m.emit(0x7d ^ (hlcode(v[1]) << 3))
  91952. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  91953. m.emit(0x2d)
  91954. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  91955. })
  91956. }
  91957. if p.len == 0 {
  91958. panic("invalid operands for VSCALEFSS")
  91959. }
  91960. return p
  91961. }
  91962. // VSCATTERDPD performs "Scatter Packed Double-Precision Floating-Point Values with Signed Doubleword Indices".
  91963. //
  91964. // Mnemonic : VSCATTERDPD
  91965. // Supported forms : (3 forms)
  91966. //
  91967. // * VSCATTERDPD zmm, vm32y{k} [AVX512F]
  91968. // * VSCATTERDPD xmm, vm32x{k} [AVX512F,AVX512VL]
  91969. // * VSCATTERDPD ymm, vm32x{k} [AVX512F,AVX512VL]
  91970. //
  91971. func (self *Program) VSCATTERDPD(v0 interface{}, v1 interface{}) *Instruction {
  91972. p := self.alloc("VSCATTERDPD", 2, Operands { v0, v1 })
  91973. // VSCATTERDPD zmm, vm32y{k}
  91974. if isZMM(v0) && isVMYk(v1) {
  91975. self.require(ISA_AVX512F)
  91976. p.domain = DomainAVX
  91977. p.add(0, func(m *_Encoding, v []interface{}) {
  91978. m.evex(0b10, 0x85, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  91979. m.emit(0xa2)
  91980. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  91981. })
  91982. }
  91983. // VSCATTERDPD xmm, vm32x{k}
  91984. if isEVEXXMM(v0) && isVMXk(v1) {
  91985. self.require(ISA_AVX512VL | ISA_AVX512F)
  91986. p.domain = DomainAVX
  91987. p.add(0, func(m *_Encoding, v []interface{}) {
  91988. m.evex(0b10, 0x85, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  91989. m.emit(0xa2)
  91990. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  91991. })
  91992. }
  91993. // VSCATTERDPD ymm, vm32x{k}
  91994. if isEVEXYMM(v0) && isVMXk(v1) {
  91995. self.require(ISA_AVX512VL | ISA_AVX512F)
  91996. p.domain = DomainAVX
  91997. p.add(0, func(m *_Encoding, v []interface{}) {
  91998. m.evex(0b10, 0x85, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  91999. m.emit(0xa2)
  92000. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  92001. })
  92002. }
  92003. if p.len == 0 {
  92004. panic("invalid operands for VSCATTERDPD")
  92005. }
  92006. return p
  92007. }
  92008. // VSCATTERDPS performs "Scatter Packed Single-Precision Floating-Point Values with Signed Doubleword Indices".
  92009. //
  92010. // Mnemonic : VSCATTERDPS
  92011. // Supported forms : (3 forms)
  92012. //
  92013. // * VSCATTERDPS zmm, vm32z{k} [AVX512F]
  92014. // * VSCATTERDPS xmm, vm32x{k} [AVX512F,AVX512VL]
  92015. // * VSCATTERDPS ymm, vm32y{k} [AVX512F,AVX512VL]
  92016. //
  92017. func (self *Program) VSCATTERDPS(v0 interface{}, v1 interface{}) *Instruction {
  92018. p := self.alloc("VSCATTERDPS", 2, Operands { v0, v1 })
  92019. // VSCATTERDPS zmm, vm32z{k}
  92020. if isZMM(v0) && isVMZk(v1) {
  92021. self.require(ISA_AVX512F)
  92022. p.domain = DomainAVX
  92023. p.add(0, func(m *_Encoding, v []interface{}) {
  92024. m.evex(0b10, 0x05, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  92025. m.emit(0xa2)
  92026. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  92027. })
  92028. }
  92029. // VSCATTERDPS xmm, vm32x{k}
  92030. if isEVEXXMM(v0) && isVMXk(v1) {
  92031. self.require(ISA_AVX512VL | ISA_AVX512F)
  92032. p.domain = DomainAVX
  92033. p.add(0, func(m *_Encoding, v []interface{}) {
  92034. m.evex(0b10, 0x05, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  92035. m.emit(0xa2)
  92036. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  92037. })
  92038. }
  92039. // VSCATTERDPS ymm, vm32y{k}
  92040. if isEVEXYMM(v0) && isVMYk(v1) {
  92041. self.require(ISA_AVX512VL | ISA_AVX512F)
  92042. p.domain = DomainAVX
  92043. p.add(0, func(m *_Encoding, v []interface{}) {
  92044. m.evex(0b10, 0x05, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  92045. m.emit(0xa2)
  92046. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  92047. })
  92048. }
  92049. if p.len == 0 {
  92050. panic("invalid operands for VSCATTERDPS")
  92051. }
  92052. return p
  92053. }
  92054. // VSCATTERPF0DPD performs "Sparse Prefetch Packed Double-Precision Floating-Point Data Values with Signed Doubleword Indices Using T0 Hint with Intent to Write".
  92055. //
  92056. // Mnemonic : VSCATTERPF0DPD
  92057. // Supported forms : (1 form)
  92058. //
  92059. // * VSCATTERPF0DPD vm32y{k} [AVX512PF]
  92060. //
  92061. func (self *Program) VSCATTERPF0DPD(v0 interface{}) *Instruction {
  92062. p := self.alloc("VSCATTERPF0DPD", 1, Operands { v0 })
  92063. // VSCATTERPF0DPD vm32y{k}
  92064. if isVMYk(v0) {
  92065. self.require(ISA_AVX512PF)
  92066. p.domain = DomainAVX
  92067. p.add(0, func(m *_Encoding, v []interface{}) {
  92068. m.evex(0b10, 0x85, 0b10, 0, addr(v[0]), 0, kcode(v[0]), 0, 0)
  92069. m.emit(0xc6)
  92070. m.mrsd(5, addr(v[0]), 8)
  92071. })
  92072. }
  92073. if p.len == 0 {
  92074. panic("invalid operands for VSCATTERPF0DPD")
  92075. }
  92076. return p
  92077. }
  92078. // VSCATTERPF0DPS performs "Sparse Prefetch Packed Single-Precision Floating-Point Data Values with Signed Doubleword Indices Using T0 Hint with Intent to Write".
  92079. //
  92080. // Mnemonic : VSCATTERPF0DPS
  92081. // Supported forms : (1 form)
  92082. //
  92083. // * VSCATTERPF0DPS vm32z{k} [AVX512PF]
  92084. //
  92085. func (self *Program) VSCATTERPF0DPS(v0 interface{}) *Instruction {
  92086. p := self.alloc("VSCATTERPF0DPS", 1, Operands { v0 })
  92087. // VSCATTERPF0DPS vm32z{k}
  92088. if isVMZk(v0) {
  92089. self.require(ISA_AVX512PF)
  92090. p.domain = DomainAVX
  92091. p.add(0, func(m *_Encoding, v []interface{}) {
  92092. m.evex(0b10, 0x05, 0b10, 0, addr(v[0]), 0, kcode(v[0]), 0, 0)
  92093. m.emit(0xc6)
  92094. m.mrsd(5, addr(v[0]), 4)
  92095. })
  92096. }
  92097. if p.len == 0 {
  92098. panic("invalid operands for VSCATTERPF0DPS")
  92099. }
  92100. return p
  92101. }
  92102. // VSCATTERPF0QPD performs "Sparse Prefetch Packed Double-Precision Floating-Point Data Values with Signed Quadword Indices Using T0 Hint with Intent to Write".
  92103. //
  92104. // Mnemonic : VSCATTERPF0QPD
  92105. // Supported forms : (1 form)
  92106. //
  92107. // * VSCATTERPF0QPD vm64z{k} [AVX512PF]
  92108. //
  92109. func (self *Program) VSCATTERPF0QPD(v0 interface{}) *Instruction {
  92110. p := self.alloc("VSCATTERPF0QPD", 1, Operands { v0 })
  92111. // VSCATTERPF0QPD vm64z{k}
  92112. if isVMZk(v0) {
  92113. self.require(ISA_AVX512PF)
  92114. p.domain = DomainAVX
  92115. p.add(0, func(m *_Encoding, v []interface{}) {
  92116. m.evex(0b10, 0x85, 0b10, 0, addr(v[0]), 0, kcode(v[0]), 0, 0)
  92117. m.emit(0xc7)
  92118. m.mrsd(5, addr(v[0]), 8)
  92119. })
  92120. }
  92121. if p.len == 0 {
  92122. panic("invalid operands for VSCATTERPF0QPD")
  92123. }
  92124. return p
  92125. }
  92126. // VSCATTERPF0QPS performs "Sparse Prefetch Packed Single-Precision Floating-Point Data Values with Signed Quadword Indices Using T0 Hint with Intent to Write".
  92127. //
  92128. // Mnemonic : VSCATTERPF0QPS
  92129. // Supported forms : (1 form)
  92130. //
  92131. // * VSCATTERPF0QPS vm64z{k} [AVX512PF]
  92132. //
  92133. func (self *Program) VSCATTERPF0QPS(v0 interface{}) *Instruction {
  92134. p := self.alloc("VSCATTERPF0QPS", 1, Operands { v0 })
  92135. // VSCATTERPF0QPS vm64z{k}
  92136. if isVMZk(v0) {
  92137. self.require(ISA_AVX512PF)
  92138. p.domain = DomainAVX
  92139. p.add(0, func(m *_Encoding, v []interface{}) {
  92140. m.evex(0b10, 0x05, 0b10, 0, addr(v[0]), 0, kcode(v[0]), 0, 0)
  92141. m.emit(0xc7)
  92142. m.mrsd(5, addr(v[0]), 4)
  92143. })
  92144. }
  92145. if p.len == 0 {
  92146. panic("invalid operands for VSCATTERPF0QPS")
  92147. }
  92148. return p
  92149. }
  92150. // VSCATTERPF1DPD performs "Sparse Prefetch Packed Double-Precision Floating-Point Data Values with Signed Doubleword Indices Using T1 Hint with Intent to Write".
  92151. //
  92152. // Mnemonic : VSCATTERPF1DPD
  92153. // Supported forms : (1 form)
  92154. //
  92155. // * VSCATTERPF1DPD vm32y{k} [AVX512PF]
  92156. //
  92157. func (self *Program) VSCATTERPF1DPD(v0 interface{}) *Instruction {
  92158. p := self.alloc("VSCATTERPF1DPD", 1, Operands { v0 })
  92159. // VSCATTERPF1DPD vm32y{k}
  92160. if isVMYk(v0) {
  92161. self.require(ISA_AVX512PF)
  92162. p.domain = DomainAVX
  92163. p.add(0, func(m *_Encoding, v []interface{}) {
  92164. m.evex(0b10, 0x85, 0b10, 0, addr(v[0]), 0, kcode(v[0]), 0, 0)
  92165. m.emit(0xc6)
  92166. m.mrsd(6, addr(v[0]), 8)
  92167. })
  92168. }
  92169. if p.len == 0 {
  92170. panic("invalid operands for VSCATTERPF1DPD")
  92171. }
  92172. return p
  92173. }
  92174. // VSCATTERPF1DPS performs "Sparse Prefetch Packed Single-Precision Floating-Point Data Values with Signed Doubleword Indices Using T1 Hint with Intent to Write".
  92175. //
  92176. // Mnemonic : VSCATTERPF1DPS
  92177. // Supported forms : (1 form)
  92178. //
  92179. // * VSCATTERPF1DPS vm32z{k} [AVX512PF]
  92180. //
  92181. func (self *Program) VSCATTERPF1DPS(v0 interface{}) *Instruction {
  92182. p := self.alloc("VSCATTERPF1DPS", 1, Operands { v0 })
  92183. // VSCATTERPF1DPS vm32z{k}
  92184. if isVMZk(v0) {
  92185. self.require(ISA_AVX512PF)
  92186. p.domain = DomainAVX
  92187. p.add(0, func(m *_Encoding, v []interface{}) {
  92188. m.evex(0b10, 0x05, 0b10, 0, addr(v[0]), 0, kcode(v[0]), 0, 0)
  92189. m.emit(0xc6)
  92190. m.mrsd(6, addr(v[0]), 4)
  92191. })
  92192. }
  92193. if p.len == 0 {
  92194. panic("invalid operands for VSCATTERPF1DPS")
  92195. }
  92196. return p
  92197. }
  92198. // VSCATTERPF1QPD performs "Sparse Prefetch Packed Double-Precision Floating-Point Data Values with Signed Quadword Indices Using T1 Hint with Intent to Write".
  92199. //
  92200. // Mnemonic : VSCATTERPF1QPD
  92201. // Supported forms : (1 form)
  92202. //
  92203. // * VSCATTERPF1QPD vm64z{k} [AVX512PF]
  92204. //
  92205. func (self *Program) VSCATTERPF1QPD(v0 interface{}) *Instruction {
  92206. p := self.alloc("VSCATTERPF1QPD", 1, Operands { v0 })
  92207. // VSCATTERPF1QPD vm64z{k}
  92208. if isVMZk(v0) {
  92209. self.require(ISA_AVX512PF)
  92210. p.domain = DomainAVX
  92211. p.add(0, func(m *_Encoding, v []interface{}) {
  92212. m.evex(0b10, 0x85, 0b10, 0, addr(v[0]), 0, kcode(v[0]), 0, 0)
  92213. m.emit(0xc7)
  92214. m.mrsd(6, addr(v[0]), 8)
  92215. })
  92216. }
  92217. if p.len == 0 {
  92218. panic("invalid operands for VSCATTERPF1QPD")
  92219. }
  92220. return p
  92221. }
  92222. // VSCATTERPF1QPS performs "Sparse Prefetch Packed Single-Precision Floating-Point Data Values with Signed Quadword Indices Using T1 Hint with Intent to Write".
  92223. //
  92224. // Mnemonic : VSCATTERPF1QPS
  92225. // Supported forms : (1 form)
  92226. //
  92227. // * VSCATTERPF1QPS vm64z{k} [AVX512PF]
  92228. //
  92229. func (self *Program) VSCATTERPF1QPS(v0 interface{}) *Instruction {
  92230. p := self.alloc("VSCATTERPF1QPS", 1, Operands { v0 })
  92231. // VSCATTERPF1QPS vm64z{k}
  92232. if isVMZk(v0) {
  92233. self.require(ISA_AVX512PF)
  92234. p.domain = DomainAVX
  92235. p.add(0, func(m *_Encoding, v []interface{}) {
  92236. m.evex(0b10, 0x05, 0b10, 0, addr(v[0]), 0, kcode(v[0]), 0, 0)
  92237. m.emit(0xc7)
  92238. m.mrsd(6, addr(v[0]), 4)
  92239. })
  92240. }
  92241. if p.len == 0 {
  92242. panic("invalid operands for VSCATTERPF1QPS")
  92243. }
  92244. return p
  92245. }
  92246. // VSCATTERQPD performs "Scatter Packed Double-Precision Floating-Point Values with Signed Quadword Indices".
  92247. //
  92248. // Mnemonic : VSCATTERQPD
  92249. // Supported forms : (3 forms)
  92250. //
  92251. // * VSCATTERQPD zmm, vm64z{k} [AVX512F]
  92252. // * VSCATTERQPD xmm, vm64x{k} [AVX512F,AVX512VL]
  92253. // * VSCATTERQPD ymm, vm64y{k} [AVX512F,AVX512VL]
  92254. //
  92255. func (self *Program) VSCATTERQPD(v0 interface{}, v1 interface{}) *Instruction {
  92256. p := self.alloc("VSCATTERQPD", 2, Operands { v0, v1 })
  92257. // VSCATTERQPD zmm, vm64z{k}
  92258. if isZMM(v0) && isVMZk(v1) {
  92259. self.require(ISA_AVX512F)
  92260. p.domain = DomainAVX
  92261. p.add(0, func(m *_Encoding, v []interface{}) {
  92262. m.evex(0b10, 0x85, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  92263. m.emit(0xa3)
  92264. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  92265. })
  92266. }
  92267. // VSCATTERQPD xmm, vm64x{k}
  92268. if isEVEXXMM(v0) && isVMXk(v1) {
  92269. self.require(ISA_AVX512VL | ISA_AVX512F)
  92270. p.domain = DomainAVX
  92271. p.add(0, func(m *_Encoding, v []interface{}) {
  92272. m.evex(0b10, 0x85, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  92273. m.emit(0xa3)
  92274. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  92275. })
  92276. }
  92277. // VSCATTERQPD ymm, vm64y{k}
  92278. if isEVEXYMM(v0) && isVMYk(v1) {
  92279. self.require(ISA_AVX512VL | ISA_AVX512F)
  92280. p.domain = DomainAVX
  92281. p.add(0, func(m *_Encoding, v []interface{}) {
  92282. m.evex(0b10, 0x85, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  92283. m.emit(0xa3)
  92284. m.mrsd(lcode(v[0]), addr(v[1]), 8)
  92285. })
  92286. }
  92287. if p.len == 0 {
  92288. panic("invalid operands for VSCATTERQPD")
  92289. }
  92290. return p
  92291. }
  92292. // VSCATTERQPS performs "Scatter Packed Single-Precision Floating-Point Values with Signed Quadword Indices".
  92293. //
  92294. // Mnemonic : VSCATTERQPS
  92295. // Supported forms : (3 forms)
  92296. //
  92297. // * VSCATTERQPS ymm, vm64z{k} [AVX512F]
  92298. // * VSCATTERQPS xmm, vm64x{k} [AVX512F,AVX512VL]
  92299. // * VSCATTERQPS xmm, vm64y{k} [AVX512F,AVX512VL]
  92300. //
  92301. func (self *Program) VSCATTERQPS(v0 interface{}, v1 interface{}) *Instruction {
  92302. p := self.alloc("VSCATTERQPS", 2, Operands { v0, v1 })
  92303. // VSCATTERQPS ymm, vm64z{k}
  92304. if isEVEXYMM(v0) && isVMZk(v1) {
  92305. self.require(ISA_AVX512F)
  92306. p.domain = DomainAVX
  92307. p.add(0, func(m *_Encoding, v []interface{}) {
  92308. m.evex(0b10, 0x05, 0b10, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  92309. m.emit(0xa3)
  92310. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  92311. })
  92312. }
  92313. // VSCATTERQPS xmm, vm64x{k}
  92314. if isEVEXXMM(v0) && isVMXk(v1) {
  92315. self.require(ISA_AVX512VL | ISA_AVX512F)
  92316. p.domain = DomainAVX
  92317. p.add(0, func(m *_Encoding, v []interface{}) {
  92318. m.evex(0b10, 0x05, 0b00, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  92319. m.emit(0xa3)
  92320. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  92321. })
  92322. }
  92323. // VSCATTERQPS xmm, vm64y{k}
  92324. if isEVEXXMM(v0) && isVMYk(v1) {
  92325. self.require(ISA_AVX512VL | ISA_AVX512F)
  92326. p.domain = DomainAVX
  92327. p.add(0, func(m *_Encoding, v []interface{}) {
  92328. m.evex(0b10, 0x05, 0b01, ehcode(v[0]), addr(v[1]), 0, kcode(v[1]), 0, 0)
  92329. m.emit(0xa3)
  92330. m.mrsd(lcode(v[0]), addr(v[1]), 4)
  92331. })
  92332. }
  92333. if p.len == 0 {
  92334. panic("invalid operands for VSCATTERQPS")
  92335. }
  92336. return p
  92337. }
  92338. // VSHUFF32X4 performs "Shuffle 128-Bit Packed Single-Precision Floating-Point Values".
  92339. //
  92340. // Mnemonic : VSHUFF32X4
  92341. // Supported forms : (4 forms)
  92342. //
  92343. // * VSHUFF32X4 imm8, m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  92344. // * VSHUFF32X4 imm8, zmm, zmm, zmm{k}{z} [AVX512F]
  92345. // * VSHUFF32X4 imm8, m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  92346. // * VSHUFF32X4 imm8, ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  92347. //
  92348. func (self *Program) VSHUFF32X4(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  92349. p := self.alloc("VSHUFF32X4", 4, Operands { v0, v1, v2, v3 })
  92350. // VSHUFF32X4 imm8, m512/m32bcst, zmm, zmm{k}{z}
  92351. if isImm8(v0) && isM512M32bcst(v1) && isZMM(v2) && isZMMkz(v3) {
  92352. self.require(ISA_AVX512F)
  92353. p.domain = DomainAVX
  92354. p.add(0, func(m *_Encoding, v []interface{}) {
  92355. m.evex(0b11, 0x05, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  92356. m.emit(0x23)
  92357. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  92358. m.imm1(toImmAny(v[0]))
  92359. })
  92360. }
  92361. // VSHUFF32X4 imm8, zmm, zmm, zmm{k}{z}
  92362. if isImm8(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(v3) {
  92363. self.require(ISA_AVX512F)
  92364. p.domain = DomainAVX
  92365. p.add(0, func(m *_Encoding, v []interface{}) {
  92366. m.emit(0x62)
  92367. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  92368. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  92369. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  92370. m.emit(0x23)
  92371. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  92372. m.imm1(toImmAny(v[0]))
  92373. })
  92374. }
  92375. // VSHUFF32X4 imm8, m256/m32bcst, ymm, ymm{k}{z}
  92376. if isImm8(v0) && isM256M32bcst(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  92377. self.require(ISA_AVX512VL | ISA_AVX512F)
  92378. p.domain = DomainAVX
  92379. p.add(0, func(m *_Encoding, v []interface{}) {
  92380. m.evex(0b11, 0x05, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  92381. m.emit(0x23)
  92382. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  92383. m.imm1(toImmAny(v[0]))
  92384. })
  92385. }
  92386. // VSHUFF32X4 imm8, ymm, ymm, ymm{k}{z}
  92387. if isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  92388. self.require(ISA_AVX512VL | ISA_AVX512F)
  92389. p.domain = DomainAVX
  92390. p.add(0, func(m *_Encoding, v []interface{}) {
  92391. m.emit(0x62)
  92392. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  92393. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  92394. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  92395. m.emit(0x23)
  92396. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  92397. m.imm1(toImmAny(v[0]))
  92398. })
  92399. }
  92400. if p.len == 0 {
  92401. panic("invalid operands for VSHUFF32X4")
  92402. }
  92403. return p
  92404. }
  92405. // VSHUFF64X2 performs "Shuffle 128-Bit Packed Double-Precision Floating-Point Values".
  92406. //
  92407. // Mnemonic : VSHUFF64X2
  92408. // Supported forms : (4 forms)
  92409. //
  92410. // * VSHUFF64X2 imm8, m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  92411. // * VSHUFF64X2 imm8, zmm, zmm, zmm{k}{z} [AVX512F]
  92412. // * VSHUFF64X2 imm8, m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  92413. // * VSHUFF64X2 imm8, ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  92414. //
  92415. func (self *Program) VSHUFF64X2(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  92416. p := self.alloc("VSHUFF64X2", 4, Operands { v0, v1, v2, v3 })
  92417. // VSHUFF64X2 imm8, m512/m64bcst, zmm, zmm{k}{z}
  92418. if isImm8(v0) && isM512M64bcst(v1) && isZMM(v2) && isZMMkz(v3) {
  92419. self.require(ISA_AVX512F)
  92420. p.domain = DomainAVX
  92421. p.add(0, func(m *_Encoding, v []interface{}) {
  92422. m.evex(0b11, 0x85, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  92423. m.emit(0x23)
  92424. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  92425. m.imm1(toImmAny(v[0]))
  92426. })
  92427. }
  92428. // VSHUFF64X2 imm8, zmm, zmm, zmm{k}{z}
  92429. if isImm8(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(v3) {
  92430. self.require(ISA_AVX512F)
  92431. p.domain = DomainAVX
  92432. p.add(0, func(m *_Encoding, v []interface{}) {
  92433. m.emit(0x62)
  92434. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  92435. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  92436. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  92437. m.emit(0x23)
  92438. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  92439. m.imm1(toImmAny(v[0]))
  92440. })
  92441. }
  92442. // VSHUFF64X2 imm8, m256/m64bcst, ymm, ymm{k}{z}
  92443. if isImm8(v0) && isM256M64bcst(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  92444. self.require(ISA_AVX512VL | ISA_AVX512F)
  92445. p.domain = DomainAVX
  92446. p.add(0, func(m *_Encoding, v []interface{}) {
  92447. m.evex(0b11, 0x85, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  92448. m.emit(0x23)
  92449. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  92450. m.imm1(toImmAny(v[0]))
  92451. })
  92452. }
  92453. // VSHUFF64X2 imm8, ymm, ymm, ymm{k}{z}
  92454. if isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  92455. self.require(ISA_AVX512VL | ISA_AVX512F)
  92456. p.domain = DomainAVX
  92457. p.add(0, func(m *_Encoding, v []interface{}) {
  92458. m.emit(0x62)
  92459. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  92460. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  92461. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  92462. m.emit(0x23)
  92463. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  92464. m.imm1(toImmAny(v[0]))
  92465. })
  92466. }
  92467. if p.len == 0 {
  92468. panic("invalid operands for VSHUFF64X2")
  92469. }
  92470. return p
  92471. }
  92472. // VSHUFI32X4 performs "Shuffle 128-Bit Packed Doubleword Integer Values".
  92473. //
  92474. // Mnemonic : VSHUFI32X4
  92475. // Supported forms : (4 forms)
  92476. //
  92477. // * VSHUFI32X4 imm8, m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  92478. // * VSHUFI32X4 imm8, zmm, zmm, zmm{k}{z} [AVX512F]
  92479. // * VSHUFI32X4 imm8, m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  92480. // * VSHUFI32X4 imm8, ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  92481. //
  92482. func (self *Program) VSHUFI32X4(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  92483. p := self.alloc("VSHUFI32X4", 4, Operands { v0, v1, v2, v3 })
  92484. // VSHUFI32X4 imm8, m512/m32bcst, zmm, zmm{k}{z}
  92485. if isImm8(v0) && isM512M32bcst(v1) && isZMM(v2) && isZMMkz(v3) {
  92486. self.require(ISA_AVX512F)
  92487. p.domain = DomainAVX
  92488. p.add(0, func(m *_Encoding, v []interface{}) {
  92489. m.evex(0b11, 0x05, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  92490. m.emit(0x43)
  92491. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  92492. m.imm1(toImmAny(v[0]))
  92493. })
  92494. }
  92495. // VSHUFI32X4 imm8, zmm, zmm, zmm{k}{z}
  92496. if isImm8(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(v3) {
  92497. self.require(ISA_AVX512F)
  92498. p.domain = DomainAVX
  92499. p.add(0, func(m *_Encoding, v []interface{}) {
  92500. m.emit(0x62)
  92501. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  92502. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  92503. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  92504. m.emit(0x43)
  92505. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  92506. m.imm1(toImmAny(v[0]))
  92507. })
  92508. }
  92509. // VSHUFI32X4 imm8, m256/m32bcst, ymm, ymm{k}{z}
  92510. if isImm8(v0) && isM256M32bcst(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  92511. self.require(ISA_AVX512VL | ISA_AVX512F)
  92512. p.domain = DomainAVX
  92513. p.add(0, func(m *_Encoding, v []interface{}) {
  92514. m.evex(0b11, 0x05, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  92515. m.emit(0x43)
  92516. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  92517. m.imm1(toImmAny(v[0]))
  92518. })
  92519. }
  92520. // VSHUFI32X4 imm8, ymm, ymm, ymm{k}{z}
  92521. if isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  92522. self.require(ISA_AVX512VL | ISA_AVX512F)
  92523. p.domain = DomainAVX
  92524. p.add(0, func(m *_Encoding, v []interface{}) {
  92525. m.emit(0x62)
  92526. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  92527. m.emit(0x7d ^ (hlcode(v[2]) << 3))
  92528. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  92529. m.emit(0x43)
  92530. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  92531. m.imm1(toImmAny(v[0]))
  92532. })
  92533. }
  92534. if p.len == 0 {
  92535. panic("invalid operands for VSHUFI32X4")
  92536. }
  92537. return p
  92538. }
  92539. // VSHUFI64X2 performs "Shuffle 128-Bit Packed Quadword Integer Values".
  92540. //
  92541. // Mnemonic : VSHUFI64X2
  92542. // Supported forms : (4 forms)
  92543. //
  92544. // * VSHUFI64X2 imm8, m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  92545. // * VSHUFI64X2 imm8, zmm, zmm, zmm{k}{z} [AVX512F]
  92546. // * VSHUFI64X2 imm8, m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  92547. // * VSHUFI64X2 imm8, ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  92548. //
  92549. func (self *Program) VSHUFI64X2(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  92550. p := self.alloc("VSHUFI64X2", 4, Operands { v0, v1, v2, v3 })
  92551. // VSHUFI64X2 imm8, m512/m64bcst, zmm, zmm{k}{z}
  92552. if isImm8(v0) && isM512M64bcst(v1) && isZMM(v2) && isZMMkz(v3) {
  92553. self.require(ISA_AVX512F)
  92554. p.domain = DomainAVX
  92555. p.add(0, func(m *_Encoding, v []interface{}) {
  92556. m.evex(0b11, 0x85, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  92557. m.emit(0x43)
  92558. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  92559. m.imm1(toImmAny(v[0]))
  92560. })
  92561. }
  92562. // VSHUFI64X2 imm8, zmm, zmm, zmm{k}{z}
  92563. if isImm8(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(v3) {
  92564. self.require(ISA_AVX512F)
  92565. p.domain = DomainAVX
  92566. p.add(0, func(m *_Encoding, v []interface{}) {
  92567. m.emit(0x62)
  92568. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  92569. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  92570. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  92571. m.emit(0x43)
  92572. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  92573. m.imm1(toImmAny(v[0]))
  92574. })
  92575. }
  92576. // VSHUFI64X2 imm8, m256/m64bcst, ymm, ymm{k}{z}
  92577. if isImm8(v0) && isM256M64bcst(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  92578. self.require(ISA_AVX512VL | ISA_AVX512F)
  92579. p.domain = DomainAVX
  92580. p.add(0, func(m *_Encoding, v []interface{}) {
  92581. m.evex(0b11, 0x85, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  92582. m.emit(0x43)
  92583. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  92584. m.imm1(toImmAny(v[0]))
  92585. })
  92586. }
  92587. // VSHUFI64X2 imm8, ymm, ymm, ymm{k}{z}
  92588. if isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  92589. self.require(ISA_AVX512VL | ISA_AVX512F)
  92590. p.domain = DomainAVX
  92591. p.add(0, func(m *_Encoding, v []interface{}) {
  92592. m.emit(0x62)
  92593. m.emit(0xf3 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  92594. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  92595. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  92596. m.emit(0x43)
  92597. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  92598. m.imm1(toImmAny(v[0]))
  92599. })
  92600. }
  92601. if p.len == 0 {
  92602. panic("invalid operands for VSHUFI64X2")
  92603. }
  92604. return p
  92605. }
  92606. // VSHUFPD performs "Shuffle Packed Double-Precision Floating-Point Values".
  92607. //
  92608. // Mnemonic : VSHUFPD
  92609. // Supported forms : (10 forms)
  92610. //
  92611. // * VSHUFPD imm8, xmm, xmm, xmm [AVX]
  92612. // * VSHUFPD imm8, m128, xmm, xmm [AVX]
  92613. // * VSHUFPD imm8, ymm, ymm, ymm [AVX]
  92614. // * VSHUFPD imm8, m256, ymm, ymm [AVX]
  92615. // * VSHUFPD imm8, m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  92616. // * VSHUFPD imm8, zmm, zmm, zmm{k}{z} [AVX512F]
  92617. // * VSHUFPD imm8, m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  92618. // * VSHUFPD imm8, xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  92619. // * VSHUFPD imm8, m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  92620. // * VSHUFPD imm8, ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  92621. //
  92622. func (self *Program) VSHUFPD(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  92623. p := self.alloc("VSHUFPD", 4, Operands { v0, v1, v2, v3 })
  92624. // VSHUFPD imm8, xmm, xmm, xmm
  92625. if isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  92626. self.require(ISA_AVX)
  92627. p.domain = DomainAVX
  92628. p.add(0, func(m *_Encoding, v []interface{}) {
  92629. m.vex2(1, hcode(v[3]), v[1], hlcode(v[2]))
  92630. m.emit(0xc6)
  92631. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  92632. m.imm1(toImmAny(v[0]))
  92633. })
  92634. }
  92635. // VSHUFPD imm8, m128, xmm, xmm
  92636. if isImm8(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  92637. self.require(ISA_AVX)
  92638. p.domain = DomainAVX
  92639. p.add(0, func(m *_Encoding, v []interface{}) {
  92640. m.vex2(1, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  92641. m.emit(0xc6)
  92642. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  92643. m.imm1(toImmAny(v[0]))
  92644. })
  92645. }
  92646. // VSHUFPD imm8, ymm, ymm, ymm
  92647. if isImm8(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  92648. self.require(ISA_AVX)
  92649. p.domain = DomainAVX
  92650. p.add(0, func(m *_Encoding, v []interface{}) {
  92651. m.vex2(5, hcode(v[3]), v[1], hlcode(v[2]))
  92652. m.emit(0xc6)
  92653. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  92654. m.imm1(toImmAny(v[0]))
  92655. })
  92656. }
  92657. // VSHUFPD imm8, m256, ymm, ymm
  92658. if isImm8(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  92659. self.require(ISA_AVX)
  92660. p.domain = DomainAVX
  92661. p.add(0, func(m *_Encoding, v []interface{}) {
  92662. m.vex2(5, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  92663. m.emit(0xc6)
  92664. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  92665. m.imm1(toImmAny(v[0]))
  92666. })
  92667. }
  92668. // VSHUFPD imm8, m512/m64bcst, zmm, zmm{k}{z}
  92669. if isImm8(v0) && isM512M64bcst(v1) && isZMM(v2) && isZMMkz(v3) {
  92670. self.require(ISA_AVX512F)
  92671. p.domain = DomainAVX
  92672. p.add(0, func(m *_Encoding, v []interface{}) {
  92673. m.evex(0b01, 0x85, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  92674. m.emit(0xc6)
  92675. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  92676. m.imm1(toImmAny(v[0]))
  92677. })
  92678. }
  92679. // VSHUFPD imm8, zmm, zmm, zmm{k}{z}
  92680. if isImm8(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(v3) {
  92681. self.require(ISA_AVX512F)
  92682. p.domain = DomainAVX
  92683. p.add(0, func(m *_Encoding, v []interface{}) {
  92684. m.emit(0x62)
  92685. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  92686. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  92687. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  92688. m.emit(0xc6)
  92689. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  92690. m.imm1(toImmAny(v[0]))
  92691. })
  92692. }
  92693. // VSHUFPD imm8, m128/m64bcst, xmm, xmm{k}{z}
  92694. if isImm8(v0) && isM128M64bcst(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  92695. self.require(ISA_AVX512VL | ISA_AVX512F)
  92696. p.domain = DomainAVX
  92697. p.add(0, func(m *_Encoding, v []interface{}) {
  92698. m.evex(0b01, 0x85, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  92699. m.emit(0xc6)
  92700. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  92701. m.imm1(toImmAny(v[0]))
  92702. })
  92703. }
  92704. // VSHUFPD imm8, xmm, xmm, xmm{k}{z}
  92705. if isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  92706. self.require(ISA_AVX512VL | ISA_AVX512F)
  92707. p.domain = DomainAVX
  92708. p.add(0, func(m *_Encoding, v []interface{}) {
  92709. m.emit(0x62)
  92710. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  92711. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  92712. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  92713. m.emit(0xc6)
  92714. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  92715. m.imm1(toImmAny(v[0]))
  92716. })
  92717. }
  92718. // VSHUFPD imm8, m256/m64bcst, ymm, ymm{k}{z}
  92719. if isImm8(v0) && isM256M64bcst(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  92720. self.require(ISA_AVX512VL | ISA_AVX512F)
  92721. p.domain = DomainAVX
  92722. p.add(0, func(m *_Encoding, v []interface{}) {
  92723. m.evex(0b01, 0x85, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  92724. m.emit(0xc6)
  92725. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  92726. m.imm1(toImmAny(v[0]))
  92727. })
  92728. }
  92729. // VSHUFPD imm8, ymm, ymm, ymm{k}{z}
  92730. if isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  92731. self.require(ISA_AVX512VL | ISA_AVX512F)
  92732. p.domain = DomainAVX
  92733. p.add(0, func(m *_Encoding, v []interface{}) {
  92734. m.emit(0x62)
  92735. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  92736. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  92737. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  92738. m.emit(0xc6)
  92739. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  92740. m.imm1(toImmAny(v[0]))
  92741. })
  92742. }
  92743. if p.len == 0 {
  92744. panic("invalid operands for VSHUFPD")
  92745. }
  92746. return p
  92747. }
  92748. // VSHUFPS performs "Shuffle Packed Single-Precision Floating-Point Values".
  92749. //
  92750. // Mnemonic : VSHUFPS
  92751. // Supported forms : (10 forms)
  92752. //
  92753. // * VSHUFPS imm8, xmm, xmm, xmm [AVX]
  92754. // * VSHUFPS imm8, m128, xmm, xmm [AVX]
  92755. // * VSHUFPS imm8, ymm, ymm, ymm [AVX]
  92756. // * VSHUFPS imm8, m256, ymm, ymm [AVX]
  92757. // * VSHUFPS imm8, m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  92758. // * VSHUFPS imm8, zmm, zmm, zmm{k}{z} [AVX512F]
  92759. // * VSHUFPS imm8, m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  92760. // * VSHUFPS imm8, xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  92761. // * VSHUFPS imm8, m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  92762. // * VSHUFPS imm8, ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  92763. //
  92764. func (self *Program) VSHUFPS(v0 interface{}, v1 interface{}, v2 interface{}, v3 interface{}) *Instruction {
  92765. p := self.alloc("VSHUFPS", 4, Operands { v0, v1, v2, v3 })
  92766. // VSHUFPS imm8, xmm, xmm, xmm
  92767. if isImm8(v0) && isXMM(v1) && isXMM(v2) && isXMM(v3) {
  92768. self.require(ISA_AVX)
  92769. p.domain = DomainAVX
  92770. p.add(0, func(m *_Encoding, v []interface{}) {
  92771. m.vex2(0, hcode(v[3]), v[1], hlcode(v[2]))
  92772. m.emit(0xc6)
  92773. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  92774. m.imm1(toImmAny(v[0]))
  92775. })
  92776. }
  92777. // VSHUFPS imm8, m128, xmm, xmm
  92778. if isImm8(v0) && isM128(v1) && isXMM(v2) && isXMM(v3) {
  92779. self.require(ISA_AVX)
  92780. p.domain = DomainAVX
  92781. p.add(0, func(m *_Encoding, v []interface{}) {
  92782. m.vex2(0, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  92783. m.emit(0xc6)
  92784. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  92785. m.imm1(toImmAny(v[0]))
  92786. })
  92787. }
  92788. // VSHUFPS imm8, ymm, ymm, ymm
  92789. if isImm8(v0) && isYMM(v1) && isYMM(v2) && isYMM(v3) {
  92790. self.require(ISA_AVX)
  92791. p.domain = DomainAVX
  92792. p.add(0, func(m *_Encoding, v []interface{}) {
  92793. m.vex2(4, hcode(v[3]), v[1], hlcode(v[2]))
  92794. m.emit(0xc6)
  92795. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  92796. m.imm1(toImmAny(v[0]))
  92797. })
  92798. }
  92799. // VSHUFPS imm8, m256, ymm, ymm
  92800. if isImm8(v0) && isM256(v1) && isYMM(v2) && isYMM(v3) {
  92801. self.require(ISA_AVX)
  92802. p.domain = DomainAVX
  92803. p.add(0, func(m *_Encoding, v []interface{}) {
  92804. m.vex2(4, hcode(v[3]), addr(v[1]), hlcode(v[2]))
  92805. m.emit(0xc6)
  92806. m.mrsd(lcode(v[3]), addr(v[1]), 1)
  92807. m.imm1(toImmAny(v[0]))
  92808. })
  92809. }
  92810. // VSHUFPS imm8, m512/m32bcst, zmm, zmm{k}{z}
  92811. if isImm8(v0) && isM512M32bcst(v1) && isZMM(v2) && isZMMkz(v3) {
  92812. self.require(ISA_AVX512F)
  92813. p.domain = DomainAVX
  92814. p.add(0, func(m *_Encoding, v []interface{}) {
  92815. m.evex(0b01, 0x04, 0b10, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  92816. m.emit(0xc6)
  92817. m.mrsd(lcode(v[3]), addr(v[1]), 64)
  92818. m.imm1(toImmAny(v[0]))
  92819. })
  92820. }
  92821. // VSHUFPS imm8, zmm, zmm, zmm{k}{z}
  92822. if isImm8(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(v3) {
  92823. self.require(ISA_AVX512F)
  92824. p.domain = DomainAVX
  92825. p.add(0, func(m *_Encoding, v []interface{}) {
  92826. m.emit(0x62)
  92827. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  92828. m.emit(0x7c ^ (hlcode(v[2]) << 3))
  92829. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x40)
  92830. m.emit(0xc6)
  92831. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  92832. m.imm1(toImmAny(v[0]))
  92833. })
  92834. }
  92835. // VSHUFPS imm8, m128/m32bcst, xmm, xmm{k}{z}
  92836. if isImm8(v0) && isM128M32bcst(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  92837. self.require(ISA_AVX512VL | ISA_AVX512F)
  92838. p.domain = DomainAVX
  92839. p.add(0, func(m *_Encoding, v []interface{}) {
  92840. m.evex(0b01, 0x04, 0b00, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  92841. m.emit(0xc6)
  92842. m.mrsd(lcode(v[3]), addr(v[1]), 16)
  92843. m.imm1(toImmAny(v[0]))
  92844. })
  92845. }
  92846. // VSHUFPS imm8, xmm, xmm, xmm{k}{z}
  92847. if isImm8(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(v3) {
  92848. self.require(ISA_AVX512VL | ISA_AVX512F)
  92849. p.domain = DomainAVX
  92850. p.add(0, func(m *_Encoding, v []interface{}) {
  92851. m.emit(0x62)
  92852. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  92853. m.emit(0x7c ^ (hlcode(v[2]) << 3))
  92854. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x00)
  92855. m.emit(0xc6)
  92856. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  92857. m.imm1(toImmAny(v[0]))
  92858. })
  92859. }
  92860. // VSHUFPS imm8, m256/m32bcst, ymm, ymm{k}{z}
  92861. if isImm8(v0) && isM256M32bcst(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  92862. self.require(ISA_AVX512VL | ISA_AVX512F)
  92863. p.domain = DomainAVX
  92864. p.add(0, func(m *_Encoding, v []interface{}) {
  92865. m.evex(0b01, 0x04, 0b01, ehcode(v[3]), addr(v[1]), vcode(v[2]), kcode(v[3]), zcode(v[3]), bcode(v[1]))
  92866. m.emit(0xc6)
  92867. m.mrsd(lcode(v[3]), addr(v[1]), 32)
  92868. m.imm1(toImmAny(v[0]))
  92869. })
  92870. }
  92871. // VSHUFPS imm8, ymm, ymm, ymm{k}{z}
  92872. if isImm8(v0) && isEVEXYMM(v1) && isEVEXYMM(v2) && isYMMkz(v3) {
  92873. self.require(ISA_AVX512VL | ISA_AVX512F)
  92874. p.domain = DomainAVX
  92875. p.add(0, func(m *_Encoding, v []interface{}) {
  92876. m.emit(0x62)
  92877. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  92878. m.emit(0x7c ^ (hlcode(v[2]) << 3))
  92879. m.emit((zcode(v[3]) << 7) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x20)
  92880. m.emit(0xc6)
  92881. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  92882. m.imm1(toImmAny(v[0]))
  92883. })
  92884. }
  92885. if p.len == 0 {
  92886. panic("invalid operands for VSHUFPS")
  92887. }
  92888. return p
  92889. }
  92890. // VSQRTPD performs "Compute Square Roots of Packed Double-Precision Floating-Point Values".
  92891. //
  92892. // Mnemonic : VSQRTPD
  92893. // Supported forms : (11 forms)
  92894. //
  92895. // * VSQRTPD xmm, xmm [AVX]
  92896. // * VSQRTPD m128, xmm [AVX]
  92897. // * VSQRTPD ymm, ymm [AVX]
  92898. // * VSQRTPD m256, ymm [AVX]
  92899. // * VSQRTPD m512/m64bcst, zmm{k}{z} [AVX512F]
  92900. // * VSQRTPD {er}, zmm, zmm{k}{z} [AVX512F]
  92901. // * VSQRTPD zmm, zmm{k}{z} [AVX512F]
  92902. // * VSQRTPD m128/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  92903. // * VSQRTPD m256/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  92904. // * VSQRTPD xmm, xmm{k}{z} [AVX512F,AVX512VL]
  92905. // * VSQRTPD ymm, ymm{k}{z} [AVX512F,AVX512VL]
  92906. //
  92907. func (self *Program) VSQRTPD(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  92908. var p *Instruction
  92909. switch len(vv) {
  92910. case 0 : p = self.alloc("VSQRTPD", 2, Operands { v0, v1 })
  92911. case 1 : p = self.alloc("VSQRTPD", 3, Operands { v0, v1, vv[0] })
  92912. default : panic("instruction VSQRTPD takes 2 or 3 operands")
  92913. }
  92914. // VSQRTPD xmm, xmm
  92915. if len(vv) == 0 && isXMM(v0) && isXMM(v1) {
  92916. self.require(ISA_AVX)
  92917. p.domain = DomainAVX
  92918. p.add(0, func(m *_Encoding, v []interface{}) {
  92919. m.vex2(1, hcode(v[1]), v[0], 0)
  92920. m.emit(0x51)
  92921. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  92922. })
  92923. }
  92924. // VSQRTPD m128, xmm
  92925. if len(vv) == 0 && isM128(v0) && isXMM(v1) {
  92926. self.require(ISA_AVX)
  92927. p.domain = DomainAVX
  92928. p.add(0, func(m *_Encoding, v []interface{}) {
  92929. m.vex2(1, hcode(v[1]), addr(v[0]), 0)
  92930. m.emit(0x51)
  92931. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  92932. })
  92933. }
  92934. // VSQRTPD ymm, ymm
  92935. if len(vv) == 0 && isYMM(v0) && isYMM(v1) {
  92936. self.require(ISA_AVX)
  92937. p.domain = DomainAVX
  92938. p.add(0, func(m *_Encoding, v []interface{}) {
  92939. m.vex2(5, hcode(v[1]), v[0], 0)
  92940. m.emit(0x51)
  92941. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  92942. })
  92943. }
  92944. // VSQRTPD m256, ymm
  92945. if len(vv) == 0 && isM256(v0) && isYMM(v1) {
  92946. self.require(ISA_AVX)
  92947. p.domain = DomainAVX
  92948. p.add(0, func(m *_Encoding, v []interface{}) {
  92949. m.vex2(5, hcode(v[1]), addr(v[0]), 0)
  92950. m.emit(0x51)
  92951. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  92952. })
  92953. }
  92954. // VSQRTPD m512/m64bcst, zmm{k}{z}
  92955. if len(vv) == 0 && isM512M64bcst(v0) && isZMMkz(v1) {
  92956. self.require(ISA_AVX512F)
  92957. p.domain = DomainAVX
  92958. p.add(0, func(m *_Encoding, v []interface{}) {
  92959. m.evex(0b01, 0x85, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  92960. m.emit(0x51)
  92961. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  92962. })
  92963. }
  92964. // VSQRTPD {er}, zmm, zmm{k}{z}
  92965. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMMkz(vv[0]) {
  92966. self.require(ISA_AVX512F)
  92967. p.domain = DomainAVX
  92968. p.add(0, func(m *_Encoding, v []interface{}) {
  92969. m.emit(0x62)
  92970. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  92971. m.emit(0xfd)
  92972. m.emit((zcode(v[2]) << 7) | (vcode(v[0]) << 5) | kcode(v[2]) | 0x18)
  92973. m.emit(0x51)
  92974. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  92975. })
  92976. }
  92977. // VSQRTPD zmm, zmm{k}{z}
  92978. if len(vv) == 0 && isZMM(v0) && isZMMkz(v1) {
  92979. self.require(ISA_AVX512F)
  92980. p.domain = DomainAVX
  92981. p.add(0, func(m *_Encoding, v []interface{}) {
  92982. m.emit(0x62)
  92983. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  92984. m.emit(0xfd)
  92985. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  92986. m.emit(0x51)
  92987. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  92988. })
  92989. }
  92990. // VSQRTPD m128/m32bcst, xmm{k}{z}
  92991. if len(vv) == 0 && isM128M32bcst(v0) && isXMMkz(v1) {
  92992. self.require(ISA_AVX512VL | ISA_AVX512F)
  92993. p.domain = DomainAVX
  92994. p.add(0, func(m *_Encoding, v []interface{}) {
  92995. m.evex(0b01, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  92996. m.emit(0x51)
  92997. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  92998. })
  92999. }
  93000. // VSQRTPD m256/m32bcst, ymm{k}{z}
  93001. if len(vv) == 0 && isM256M32bcst(v0) && isYMMkz(v1) {
  93002. self.require(ISA_AVX512VL | ISA_AVX512F)
  93003. p.domain = DomainAVX
  93004. p.add(0, func(m *_Encoding, v []interface{}) {
  93005. m.evex(0b01, 0x85, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  93006. m.emit(0x51)
  93007. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  93008. })
  93009. }
  93010. // VSQRTPD xmm, xmm{k}{z}
  93011. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  93012. self.require(ISA_AVX512VL | ISA_AVX512F)
  93013. p.domain = DomainAVX
  93014. p.add(0, func(m *_Encoding, v []interface{}) {
  93015. m.emit(0x62)
  93016. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  93017. m.emit(0xfd)
  93018. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  93019. m.emit(0x51)
  93020. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  93021. })
  93022. }
  93023. // VSQRTPD ymm, ymm{k}{z}
  93024. if len(vv) == 0 && isEVEXYMM(v0) && isYMMkz(v1) {
  93025. self.require(ISA_AVX512VL | ISA_AVX512F)
  93026. p.domain = DomainAVX
  93027. p.add(0, func(m *_Encoding, v []interface{}) {
  93028. m.emit(0x62)
  93029. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  93030. m.emit(0xfd)
  93031. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  93032. m.emit(0x51)
  93033. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  93034. })
  93035. }
  93036. if p.len == 0 {
  93037. panic("invalid operands for VSQRTPD")
  93038. }
  93039. return p
  93040. }
  93041. // VSQRTPS performs "Compute Square Roots of Packed Single-Precision Floating-Point Values".
  93042. //
  93043. // Mnemonic : VSQRTPS
  93044. // Supported forms : (11 forms)
  93045. //
  93046. // * VSQRTPS xmm, xmm [AVX]
  93047. // * VSQRTPS m128, xmm [AVX]
  93048. // * VSQRTPS ymm, ymm [AVX]
  93049. // * VSQRTPS m256, ymm [AVX]
  93050. // * VSQRTPS m512/m32bcst, zmm{k}{z} [AVX512F]
  93051. // * VSQRTPS {er}, zmm, zmm{k}{z} [AVX512F]
  93052. // * VSQRTPS zmm, zmm{k}{z} [AVX512F]
  93053. // * VSQRTPS m128/m32bcst, xmm{k}{z} [AVX512F,AVX512VL]
  93054. // * VSQRTPS m256/m32bcst, ymm{k}{z} [AVX512F,AVX512VL]
  93055. // * VSQRTPS xmm, xmm{k}{z} [AVX512F,AVX512VL]
  93056. // * VSQRTPS ymm, ymm{k}{z} [AVX512F,AVX512VL]
  93057. //
  93058. func (self *Program) VSQRTPS(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  93059. var p *Instruction
  93060. switch len(vv) {
  93061. case 0 : p = self.alloc("VSQRTPS", 2, Operands { v0, v1 })
  93062. case 1 : p = self.alloc("VSQRTPS", 3, Operands { v0, v1, vv[0] })
  93063. default : panic("instruction VSQRTPS takes 2 or 3 operands")
  93064. }
  93065. // VSQRTPS xmm, xmm
  93066. if len(vv) == 0 && isXMM(v0) && isXMM(v1) {
  93067. self.require(ISA_AVX)
  93068. p.domain = DomainAVX
  93069. p.add(0, func(m *_Encoding, v []interface{}) {
  93070. m.vex2(0, hcode(v[1]), v[0], 0)
  93071. m.emit(0x51)
  93072. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  93073. })
  93074. }
  93075. // VSQRTPS m128, xmm
  93076. if len(vv) == 0 && isM128(v0) && isXMM(v1) {
  93077. self.require(ISA_AVX)
  93078. p.domain = DomainAVX
  93079. p.add(0, func(m *_Encoding, v []interface{}) {
  93080. m.vex2(0, hcode(v[1]), addr(v[0]), 0)
  93081. m.emit(0x51)
  93082. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  93083. })
  93084. }
  93085. // VSQRTPS ymm, ymm
  93086. if len(vv) == 0 && isYMM(v0) && isYMM(v1) {
  93087. self.require(ISA_AVX)
  93088. p.domain = DomainAVX
  93089. p.add(0, func(m *_Encoding, v []interface{}) {
  93090. m.vex2(4, hcode(v[1]), v[0], 0)
  93091. m.emit(0x51)
  93092. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  93093. })
  93094. }
  93095. // VSQRTPS m256, ymm
  93096. if len(vv) == 0 && isM256(v0) && isYMM(v1) {
  93097. self.require(ISA_AVX)
  93098. p.domain = DomainAVX
  93099. p.add(0, func(m *_Encoding, v []interface{}) {
  93100. m.vex2(4, hcode(v[1]), addr(v[0]), 0)
  93101. m.emit(0x51)
  93102. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  93103. })
  93104. }
  93105. // VSQRTPS m512/m32bcst, zmm{k}{z}
  93106. if len(vv) == 0 && isM512M32bcst(v0) && isZMMkz(v1) {
  93107. self.require(ISA_AVX512F)
  93108. p.domain = DomainAVX
  93109. p.add(0, func(m *_Encoding, v []interface{}) {
  93110. m.evex(0b01, 0x04, 0b10, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  93111. m.emit(0x51)
  93112. m.mrsd(lcode(v[1]), addr(v[0]), 64)
  93113. })
  93114. }
  93115. // VSQRTPS {er}, zmm, zmm{k}{z}
  93116. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMMkz(vv[0]) {
  93117. self.require(ISA_AVX512F)
  93118. p.domain = DomainAVX
  93119. p.add(0, func(m *_Encoding, v []interface{}) {
  93120. m.emit(0x62)
  93121. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  93122. m.emit(0x7c)
  93123. m.emit((zcode(v[2]) << 7) | (vcode(v[0]) << 5) | kcode(v[2]) | 0x18)
  93124. m.emit(0x51)
  93125. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  93126. })
  93127. }
  93128. // VSQRTPS zmm, zmm{k}{z}
  93129. if len(vv) == 0 && isZMM(v0) && isZMMkz(v1) {
  93130. self.require(ISA_AVX512F)
  93131. p.domain = DomainAVX
  93132. p.add(0, func(m *_Encoding, v []interface{}) {
  93133. m.emit(0x62)
  93134. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  93135. m.emit(0x7c)
  93136. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x48)
  93137. m.emit(0x51)
  93138. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  93139. })
  93140. }
  93141. // VSQRTPS m128/m32bcst, xmm{k}{z}
  93142. if len(vv) == 0 && isM128M32bcst(v0) && isXMMkz(v1) {
  93143. self.require(ISA_AVX512VL | ISA_AVX512F)
  93144. p.domain = DomainAVX
  93145. p.add(0, func(m *_Encoding, v []interface{}) {
  93146. m.evex(0b01, 0x04, 0b00, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  93147. m.emit(0x51)
  93148. m.mrsd(lcode(v[1]), addr(v[0]), 16)
  93149. })
  93150. }
  93151. // VSQRTPS m256/m32bcst, ymm{k}{z}
  93152. if len(vv) == 0 && isM256M32bcst(v0) && isYMMkz(v1) {
  93153. self.require(ISA_AVX512VL | ISA_AVX512F)
  93154. p.domain = DomainAVX
  93155. p.add(0, func(m *_Encoding, v []interface{}) {
  93156. m.evex(0b01, 0x04, 0b01, ehcode(v[1]), addr(v[0]), 0, kcode(v[1]), zcode(v[1]), bcode(v[0]))
  93157. m.emit(0x51)
  93158. m.mrsd(lcode(v[1]), addr(v[0]), 32)
  93159. })
  93160. }
  93161. // VSQRTPS xmm, xmm{k}{z}
  93162. if len(vv) == 0 && isEVEXXMM(v0) && isXMMkz(v1) {
  93163. self.require(ISA_AVX512VL | ISA_AVX512F)
  93164. p.domain = DomainAVX
  93165. p.add(0, func(m *_Encoding, v []interface{}) {
  93166. m.emit(0x62)
  93167. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  93168. m.emit(0x7c)
  93169. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x08)
  93170. m.emit(0x51)
  93171. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  93172. })
  93173. }
  93174. // VSQRTPS ymm, ymm{k}{z}
  93175. if len(vv) == 0 && isEVEXYMM(v0) && isYMMkz(v1) {
  93176. self.require(ISA_AVX512VL | ISA_AVX512F)
  93177. p.domain = DomainAVX
  93178. p.add(0, func(m *_Encoding, v []interface{}) {
  93179. m.emit(0x62)
  93180. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  93181. m.emit(0x7c)
  93182. m.emit((zcode(v[1]) << 7) | kcode(v[1]) | 0x28)
  93183. m.emit(0x51)
  93184. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  93185. })
  93186. }
  93187. if p.len == 0 {
  93188. panic("invalid operands for VSQRTPS")
  93189. }
  93190. return p
  93191. }
  93192. // VSQRTSD performs "Compute Square Root of Scalar Double-Precision Floating-Point Value".
  93193. //
  93194. // Mnemonic : VSQRTSD
  93195. // Supported forms : (5 forms)
  93196. //
  93197. // * VSQRTSD xmm, xmm, xmm [AVX]
  93198. // * VSQRTSD m64, xmm, xmm [AVX]
  93199. // * VSQRTSD m64, xmm, xmm{k}{z} [AVX512F]
  93200. // * VSQRTSD {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  93201. // * VSQRTSD xmm, xmm, xmm{k}{z} [AVX512F]
  93202. //
  93203. func (self *Program) VSQRTSD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  93204. var p *Instruction
  93205. switch len(vv) {
  93206. case 0 : p = self.alloc("VSQRTSD", 3, Operands { v0, v1, v2 })
  93207. case 1 : p = self.alloc("VSQRTSD", 4, Operands { v0, v1, v2, vv[0] })
  93208. default : panic("instruction VSQRTSD takes 3 or 4 operands")
  93209. }
  93210. // VSQRTSD xmm, xmm, xmm
  93211. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  93212. self.require(ISA_AVX)
  93213. p.domain = DomainAVX
  93214. p.add(0, func(m *_Encoding, v []interface{}) {
  93215. m.vex2(3, hcode(v[2]), v[0], hlcode(v[1]))
  93216. m.emit(0x51)
  93217. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  93218. })
  93219. }
  93220. // VSQRTSD m64, xmm, xmm
  93221. if len(vv) == 0 && isM64(v0) && isXMM(v1) && isXMM(v2) {
  93222. self.require(ISA_AVX)
  93223. p.domain = DomainAVX
  93224. p.add(0, func(m *_Encoding, v []interface{}) {
  93225. m.vex2(3, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  93226. m.emit(0x51)
  93227. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  93228. })
  93229. }
  93230. // VSQRTSD m64, xmm, xmm{k}{z}
  93231. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  93232. self.require(ISA_AVX512F)
  93233. p.domain = DomainAVX
  93234. p.add(0, func(m *_Encoding, v []interface{}) {
  93235. m.evex(0b01, 0x87, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  93236. m.emit(0x51)
  93237. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  93238. })
  93239. }
  93240. // VSQRTSD {er}, xmm, xmm, xmm{k}{z}
  93241. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  93242. self.require(ISA_AVX512F)
  93243. p.domain = DomainAVX
  93244. p.add(0, func(m *_Encoding, v []interface{}) {
  93245. m.emit(0x62)
  93246. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  93247. m.emit(0xff ^ (hlcode(v[2]) << 3))
  93248. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  93249. m.emit(0x51)
  93250. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  93251. })
  93252. }
  93253. // VSQRTSD xmm, xmm, xmm{k}{z}
  93254. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  93255. self.require(ISA_AVX512F)
  93256. p.domain = DomainAVX
  93257. p.add(0, func(m *_Encoding, v []interface{}) {
  93258. m.emit(0x62)
  93259. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  93260. m.emit(0xff ^ (hlcode(v[1]) << 3))
  93261. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  93262. m.emit(0x51)
  93263. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  93264. })
  93265. }
  93266. if p.len == 0 {
  93267. panic("invalid operands for VSQRTSD")
  93268. }
  93269. return p
  93270. }
  93271. // VSQRTSS performs "Compute Square Root of Scalar Single-Precision Floating-Point Value".
  93272. //
  93273. // Mnemonic : VSQRTSS
  93274. // Supported forms : (5 forms)
  93275. //
  93276. // * VSQRTSS xmm, xmm, xmm [AVX]
  93277. // * VSQRTSS m32, xmm, xmm [AVX]
  93278. // * VSQRTSS m32, xmm, xmm{k}{z} [AVX512F]
  93279. // * VSQRTSS {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  93280. // * VSQRTSS xmm, xmm, xmm{k}{z} [AVX512F]
  93281. //
  93282. func (self *Program) VSQRTSS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  93283. var p *Instruction
  93284. switch len(vv) {
  93285. case 0 : p = self.alloc("VSQRTSS", 3, Operands { v0, v1, v2 })
  93286. case 1 : p = self.alloc("VSQRTSS", 4, Operands { v0, v1, v2, vv[0] })
  93287. default : panic("instruction VSQRTSS takes 3 or 4 operands")
  93288. }
  93289. // VSQRTSS xmm, xmm, xmm
  93290. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  93291. self.require(ISA_AVX)
  93292. p.domain = DomainAVX
  93293. p.add(0, func(m *_Encoding, v []interface{}) {
  93294. m.vex2(2, hcode(v[2]), v[0], hlcode(v[1]))
  93295. m.emit(0x51)
  93296. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  93297. })
  93298. }
  93299. // VSQRTSS m32, xmm, xmm
  93300. if len(vv) == 0 && isM32(v0) && isXMM(v1) && isXMM(v2) {
  93301. self.require(ISA_AVX)
  93302. p.domain = DomainAVX
  93303. p.add(0, func(m *_Encoding, v []interface{}) {
  93304. m.vex2(2, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  93305. m.emit(0x51)
  93306. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  93307. })
  93308. }
  93309. // VSQRTSS m32, xmm, xmm{k}{z}
  93310. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  93311. self.require(ISA_AVX512F)
  93312. p.domain = DomainAVX
  93313. p.add(0, func(m *_Encoding, v []interface{}) {
  93314. m.evex(0b01, 0x06, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  93315. m.emit(0x51)
  93316. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  93317. })
  93318. }
  93319. // VSQRTSS {er}, xmm, xmm, xmm{k}{z}
  93320. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  93321. self.require(ISA_AVX512F)
  93322. p.domain = DomainAVX
  93323. p.add(0, func(m *_Encoding, v []interface{}) {
  93324. m.emit(0x62)
  93325. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  93326. m.emit(0x7e ^ (hlcode(v[2]) << 3))
  93327. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  93328. m.emit(0x51)
  93329. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  93330. })
  93331. }
  93332. // VSQRTSS xmm, xmm, xmm{k}{z}
  93333. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  93334. self.require(ISA_AVX512F)
  93335. p.domain = DomainAVX
  93336. p.add(0, func(m *_Encoding, v []interface{}) {
  93337. m.emit(0x62)
  93338. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  93339. m.emit(0x7e ^ (hlcode(v[1]) << 3))
  93340. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  93341. m.emit(0x51)
  93342. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  93343. })
  93344. }
  93345. if p.len == 0 {
  93346. panic("invalid operands for VSQRTSS")
  93347. }
  93348. return p
  93349. }
  93350. // VSTMXCSR performs "Store MXCSR Register State".
  93351. //
  93352. // Mnemonic : VSTMXCSR
  93353. // Supported forms : (1 form)
  93354. //
  93355. // * VSTMXCSR m32 [AVX]
  93356. //
  93357. func (self *Program) VSTMXCSR(v0 interface{}) *Instruction {
  93358. p := self.alloc("VSTMXCSR", 1, Operands { v0 })
  93359. // VSTMXCSR m32
  93360. if isM32(v0) {
  93361. self.require(ISA_AVX)
  93362. p.domain = DomainAVX
  93363. p.add(0, func(m *_Encoding, v []interface{}) {
  93364. m.vex2(0, 0, addr(v[0]), 0)
  93365. m.emit(0xae)
  93366. m.mrsd(3, addr(v[0]), 1)
  93367. })
  93368. }
  93369. if p.len == 0 {
  93370. panic("invalid operands for VSTMXCSR")
  93371. }
  93372. return p
  93373. }
  93374. // VSUBPD performs "Subtract Packed Double-Precision Floating-Point Values".
  93375. //
  93376. // Mnemonic : VSUBPD
  93377. // Supported forms : (11 forms)
  93378. //
  93379. // * VSUBPD xmm, xmm, xmm [AVX]
  93380. // * VSUBPD m128, xmm, xmm [AVX]
  93381. // * VSUBPD ymm, ymm, ymm [AVX]
  93382. // * VSUBPD m256, ymm, ymm [AVX]
  93383. // * VSUBPD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  93384. // * VSUBPD {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  93385. // * VSUBPD zmm, zmm, zmm{k}{z} [AVX512F]
  93386. // * VSUBPD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  93387. // * VSUBPD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  93388. // * VSUBPD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  93389. // * VSUBPD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  93390. //
  93391. func (self *Program) VSUBPD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  93392. var p *Instruction
  93393. switch len(vv) {
  93394. case 0 : p = self.alloc("VSUBPD", 3, Operands { v0, v1, v2 })
  93395. case 1 : p = self.alloc("VSUBPD", 4, Operands { v0, v1, v2, vv[0] })
  93396. default : panic("instruction VSUBPD takes 3 or 4 operands")
  93397. }
  93398. // VSUBPD xmm, xmm, xmm
  93399. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  93400. self.require(ISA_AVX)
  93401. p.domain = DomainAVX
  93402. p.add(0, func(m *_Encoding, v []interface{}) {
  93403. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  93404. m.emit(0x5c)
  93405. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  93406. })
  93407. }
  93408. // VSUBPD m128, xmm, xmm
  93409. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  93410. self.require(ISA_AVX)
  93411. p.domain = DomainAVX
  93412. p.add(0, func(m *_Encoding, v []interface{}) {
  93413. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  93414. m.emit(0x5c)
  93415. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  93416. })
  93417. }
  93418. // VSUBPD ymm, ymm, ymm
  93419. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  93420. self.require(ISA_AVX)
  93421. p.domain = DomainAVX
  93422. p.add(0, func(m *_Encoding, v []interface{}) {
  93423. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  93424. m.emit(0x5c)
  93425. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  93426. })
  93427. }
  93428. // VSUBPD m256, ymm, ymm
  93429. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  93430. self.require(ISA_AVX)
  93431. p.domain = DomainAVX
  93432. p.add(0, func(m *_Encoding, v []interface{}) {
  93433. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  93434. m.emit(0x5c)
  93435. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  93436. })
  93437. }
  93438. // VSUBPD m512/m64bcst, zmm, zmm{k}{z}
  93439. if len(vv) == 0 && isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  93440. self.require(ISA_AVX512F)
  93441. p.domain = DomainAVX
  93442. p.add(0, func(m *_Encoding, v []interface{}) {
  93443. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  93444. m.emit(0x5c)
  93445. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  93446. })
  93447. }
  93448. // VSUBPD {er}, zmm, zmm, zmm{k}{z}
  93449. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  93450. self.require(ISA_AVX512F)
  93451. p.domain = DomainAVX
  93452. p.add(0, func(m *_Encoding, v []interface{}) {
  93453. m.emit(0x62)
  93454. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  93455. m.emit(0xfd ^ (hlcode(v[2]) << 3))
  93456. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  93457. m.emit(0x5c)
  93458. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  93459. })
  93460. }
  93461. // VSUBPD zmm, zmm, zmm{k}{z}
  93462. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  93463. self.require(ISA_AVX512F)
  93464. p.domain = DomainAVX
  93465. p.add(0, func(m *_Encoding, v []interface{}) {
  93466. m.emit(0x62)
  93467. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  93468. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  93469. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  93470. m.emit(0x5c)
  93471. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  93472. })
  93473. }
  93474. // VSUBPD m128/m64bcst, xmm, xmm{k}{z}
  93475. if len(vv) == 0 && isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  93476. self.require(ISA_AVX512VL | ISA_AVX512F)
  93477. p.domain = DomainAVX
  93478. p.add(0, func(m *_Encoding, v []interface{}) {
  93479. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  93480. m.emit(0x5c)
  93481. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  93482. })
  93483. }
  93484. // VSUBPD xmm, xmm, xmm{k}{z}
  93485. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  93486. self.require(ISA_AVX512VL | ISA_AVX512F)
  93487. p.domain = DomainAVX
  93488. p.add(0, func(m *_Encoding, v []interface{}) {
  93489. m.emit(0x62)
  93490. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  93491. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  93492. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  93493. m.emit(0x5c)
  93494. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  93495. })
  93496. }
  93497. // VSUBPD m256/m64bcst, ymm, ymm{k}{z}
  93498. if len(vv) == 0 && isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  93499. self.require(ISA_AVX512VL | ISA_AVX512F)
  93500. p.domain = DomainAVX
  93501. p.add(0, func(m *_Encoding, v []interface{}) {
  93502. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  93503. m.emit(0x5c)
  93504. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  93505. })
  93506. }
  93507. // VSUBPD ymm, ymm, ymm{k}{z}
  93508. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  93509. self.require(ISA_AVX512VL | ISA_AVX512F)
  93510. p.domain = DomainAVX
  93511. p.add(0, func(m *_Encoding, v []interface{}) {
  93512. m.emit(0x62)
  93513. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  93514. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  93515. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  93516. m.emit(0x5c)
  93517. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  93518. })
  93519. }
  93520. if p.len == 0 {
  93521. panic("invalid operands for VSUBPD")
  93522. }
  93523. return p
  93524. }
  93525. // VSUBPS performs "Subtract Packed Single-Precision Floating-Point Values".
  93526. //
  93527. // Mnemonic : VSUBPS
  93528. // Supported forms : (11 forms)
  93529. //
  93530. // * VSUBPS xmm, xmm, xmm [AVX]
  93531. // * VSUBPS m128, xmm, xmm [AVX]
  93532. // * VSUBPS ymm, ymm, ymm [AVX]
  93533. // * VSUBPS m256, ymm, ymm [AVX]
  93534. // * VSUBPS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  93535. // * VSUBPS {er}, zmm, zmm, zmm{k}{z} [AVX512F]
  93536. // * VSUBPS zmm, zmm, zmm{k}{z} [AVX512F]
  93537. // * VSUBPS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  93538. // * VSUBPS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  93539. // * VSUBPS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  93540. // * VSUBPS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  93541. //
  93542. func (self *Program) VSUBPS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  93543. var p *Instruction
  93544. switch len(vv) {
  93545. case 0 : p = self.alloc("VSUBPS", 3, Operands { v0, v1, v2 })
  93546. case 1 : p = self.alloc("VSUBPS", 4, Operands { v0, v1, v2, vv[0] })
  93547. default : panic("instruction VSUBPS takes 3 or 4 operands")
  93548. }
  93549. // VSUBPS xmm, xmm, xmm
  93550. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  93551. self.require(ISA_AVX)
  93552. p.domain = DomainAVX
  93553. p.add(0, func(m *_Encoding, v []interface{}) {
  93554. m.vex2(0, hcode(v[2]), v[0], hlcode(v[1]))
  93555. m.emit(0x5c)
  93556. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  93557. })
  93558. }
  93559. // VSUBPS m128, xmm, xmm
  93560. if len(vv) == 0 && isM128(v0) && isXMM(v1) && isXMM(v2) {
  93561. self.require(ISA_AVX)
  93562. p.domain = DomainAVX
  93563. p.add(0, func(m *_Encoding, v []interface{}) {
  93564. m.vex2(0, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  93565. m.emit(0x5c)
  93566. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  93567. })
  93568. }
  93569. // VSUBPS ymm, ymm, ymm
  93570. if len(vv) == 0 && isYMM(v0) && isYMM(v1) && isYMM(v2) {
  93571. self.require(ISA_AVX)
  93572. p.domain = DomainAVX
  93573. p.add(0, func(m *_Encoding, v []interface{}) {
  93574. m.vex2(4, hcode(v[2]), v[0], hlcode(v[1]))
  93575. m.emit(0x5c)
  93576. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  93577. })
  93578. }
  93579. // VSUBPS m256, ymm, ymm
  93580. if len(vv) == 0 && isM256(v0) && isYMM(v1) && isYMM(v2) {
  93581. self.require(ISA_AVX)
  93582. p.domain = DomainAVX
  93583. p.add(0, func(m *_Encoding, v []interface{}) {
  93584. m.vex2(4, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  93585. m.emit(0x5c)
  93586. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  93587. })
  93588. }
  93589. // VSUBPS m512/m32bcst, zmm, zmm{k}{z}
  93590. if len(vv) == 0 && isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  93591. self.require(ISA_AVX512F)
  93592. p.domain = DomainAVX
  93593. p.add(0, func(m *_Encoding, v []interface{}) {
  93594. m.evex(0b01, 0x04, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  93595. m.emit(0x5c)
  93596. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  93597. })
  93598. }
  93599. // VSUBPS {er}, zmm, zmm, zmm{k}{z}
  93600. if len(vv) == 1 && isER(v0) && isZMM(v1) && isZMM(v2) && isZMMkz(vv[0]) {
  93601. self.require(ISA_AVX512F)
  93602. p.domain = DomainAVX
  93603. p.add(0, func(m *_Encoding, v []interface{}) {
  93604. m.emit(0x62)
  93605. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  93606. m.emit(0x7c ^ (hlcode(v[2]) << 3))
  93607. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  93608. m.emit(0x5c)
  93609. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  93610. })
  93611. }
  93612. // VSUBPS zmm, zmm, zmm{k}{z}
  93613. if len(vv) == 0 && isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  93614. self.require(ISA_AVX512F)
  93615. p.domain = DomainAVX
  93616. p.add(0, func(m *_Encoding, v []interface{}) {
  93617. m.emit(0x62)
  93618. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  93619. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  93620. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  93621. m.emit(0x5c)
  93622. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  93623. })
  93624. }
  93625. // VSUBPS m128/m32bcst, xmm, xmm{k}{z}
  93626. if len(vv) == 0 && isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  93627. self.require(ISA_AVX512VL | ISA_AVX512F)
  93628. p.domain = DomainAVX
  93629. p.add(0, func(m *_Encoding, v []interface{}) {
  93630. m.evex(0b01, 0x04, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  93631. m.emit(0x5c)
  93632. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  93633. })
  93634. }
  93635. // VSUBPS xmm, xmm, xmm{k}{z}
  93636. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  93637. self.require(ISA_AVX512VL | ISA_AVX512F)
  93638. p.domain = DomainAVX
  93639. p.add(0, func(m *_Encoding, v []interface{}) {
  93640. m.emit(0x62)
  93641. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  93642. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  93643. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  93644. m.emit(0x5c)
  93645. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  93646. })
  93647. }
  93648. // VSUBPS m256/m32bcst, ymm, ymm{k}{z}
  93649. if len(vv) == 0 && isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  93650. self.require(ISA_AVX512VL | ISA_AVX512F)
  93651. p.domain = DomainAVX
  93652. p.add(0, func(m *_Encoding, v []interface{}) {
  93653. m.evex(0b01, 0x04, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  93654. m.emit(0x5c)
  93655. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  93656. })
  93657. }
  93658. // VSUBPS ymm, ymm, ymm{k}{z}
  93659. if len(vv) == 0 && isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  93660. self.require(ISA_AVX512VL | ISA_AVX512F)
  93661. p.domain = DomainAVX
  93662. p.add(0, func(m *_Encoding, v []interface{}) {
  93663. m.emit(0x62)
  93664. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  93665. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  93666. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  93667. m.emit(0x5c)
  93668. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  93669. })
  93670. }
  93671. if p.len == 0 {
  93672. panic("invalid operands for VSUBPS")
  93673. }
  93674. return p
  93675. }
  93676. // VSUBSD performs "Subtract Scalar Double-Precision Floating-Point Values".
  93677. //
  93678. // Mnemonic : VSUBSD
  93679. // Supported forms : (5 forms)
  93680. //
  93681. // * VSUBSD xmm, xmm, xmm [AVX]
  93682. // * VSUBSD m64, xmm, xmm [AVX]
  93683. // * VSUBSD m64, xmm, xmm{k}{z} [AVX512F]
  93684. // * VSUBSD {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  93685. // * VSUBSD xmm, xmm, xmm{k}{z} [AVX512F]
  93686. //
  93687. func (self *Program) VSUBSD(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  93688. var p *Instruction
  93689. switch len(vv) {
  93690. case 0 : p = self.alloc("VSUBSD", 3, Operands { v0, v1, v2 })
  93691. case 1 : p = self.alloc("VSUBSD", 4, Operands { v0, v1, v2, vv[0] })
  93692. default : panic("instruction VSUBSD takes 3 or 4 operands")
  93693. }
  93694. // VSUBSD xmm, xmm, xmm
  93695. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  93696. self.require(ISA_AVX)
  93697. p.domain = DomainAVX
  93698. p.add(0, func(m *_Encoding, v []interface{}) {
  93699. m.vex2(3, hcode(v[2]), v[0], hlcode(v[1]))
  93700. m.emit(0x5c)
  93701. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  93702. })
  93703. }
  93704. // VSUBSD m64, xmm, xmm
  93705. if len(vv) == 0 && isM64(v0) && isXMM(v1) && isXMM(v2) {
  93706. self.require(ISA_AVX)
  93707. p.domain = DomainAVX
  93708. p.add(0, func(m *_Encoding, v []interface{}) {
  93709. m.vex2(3, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  93710. m.emit(0x5c)
  93711. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  93712. })
  93713. }
  93714. // VSUBSD m64, xmm, xmm{k}{z}
  93715. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  93716. self.require(ISA_AVX512F)
  93717. p.domain = DomainAVX
  93718. p.add(0, func(m *_Encoding, v []interface{}) {
  93719. m.evex(0b01, 0x87, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  93720. m.emit(0x5c)
  93721. m.mrsd(lcode(v[2]), addr(v[0]), 8)
  93722. })
  93723. }
  93724. // VSUBSD {er}, xmm, xmm, xmm{k}{z}
  93725. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  93726. self.require(ISA_AVX512F)
  93727. p.domain = DomainAVX
  93728. p.add(0, func(m *_Encoding, v []interface{}) {
  93729. m.emit(0x62)
  93730. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  93731. m.emit(0xff ^ (hlcode(v[2]) << 3))
  93732. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  93733. m.emit(0x5c)
  93734. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  93735. })
  93736. }
  93737. // VSUBSD xmm, xmm, xmm{k}{z}
  93738. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  93739. self.require(ISA_AVX512F)
  93740. p.domain = DomainAVX
  93741. p.add(0, func(m *_Encoding, v []interface{}) {
  93742. m.emit(0x62)
  93743. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  93744. m.emit(0xff ^ (hlcode(v[1]) << 3))
  93745. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  93746. m.emit(0x5c)
  93747. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  93748. })
  93749. }
  93750. if p.len == 0 {
  93751. panic("invalid operands for VSUBSD")
  93752. }
  93753. return p
  93754. }
  93755. // VSUBSS performs "Subtract Scalar Single-Precision Floating-Point Values".
  93756. //
  93757. // Mnemonic : VSUBSS
  93758. // Supported forms : (5 forms)
  93759. //
  93760. // * VSUBSS xmm, xmm, xmm [AVX]
  93761. // * VSUBSS m32, xmm, xmm [AVX]
  93762. // * VSUBSS m32, xmm, xmm{k}{z} [AVX512F]
  93763. // * VSUBSS {er}, xmm, xmm, xmm{k}{z} [AVX512F]
  93764. // * VSUBSS xmm, xmm, xmm{k}{z} [AVX512F]
  93765. //
  93766. func (self *Program) VSUBSS(v0 interface{}, v1 interface{}, v2 interface{}, vv ...interface{}) *Instruction {
  93767. var p *Instruction
  93768. switch len(vv) {
  93769. case 0 : p = self.alloc("VSUBSS", 3, Operands { v0, v1, v2 })
  93770. case 1 : p = self.alloc("VSUBSS", 4, Operands { v0, v1, v2, vv[0] })
  93771. default : panic("instruction VSUBSS takes 3 or 4 operands")
  93772. }
  93773. // VSUBSS xmm, xmm, xmm
  93774. if len(vv) == 0 && isXMM(v0) && isXMM(v1) && isXMM(v2) {
  93775. self.require(ISA_AVX)
  93776. p.domain = DomainAVX
  93777. p.add(0, func(m *_Encoding, v []interface{}) {
  93778. m.vex2(2, hcode(v[2]), v[0], hlcode(v[1]))
  93779. m.emit(0x5c)
  93780. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  93781. })
  93782. }
  93783. // VSUBSS m32, xmm, xmm
  93784. if len(vv) == 0 && isM32(v0) && isXMM(v1) && isXMM(v2) {
  93785. self.require(ISA_AVX)
  93786. p.domain = DomainAVX
  93787. p.add(0, func(m *_Encoding, v []interface{}) {
  93788. m.vex2(2, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  93789. m.emit(0x5c)
  93790. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  93791. })
  93792. }
  93793. // VSUBSS m32, xmm, xmm{k}{z}
  93794. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  93795. self.require(ISA_AVX512F)
  93796. p.domain = DomainAVX
  93797. p.add(0, func(m *_Encoding, v []interface{}) {
  93798. m.evex(0b01, 0x06, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), 0)
  93799. m.emit(0x5c)
  93800. m.mrsd(lcode(v[2]), addr(v[0]), 4)
  93801. })
  93802. }
  93803. // VSUBSS {er}, xmm, xmm, xmm{k}{z}
  93804. if len(vv) == 1 && isER(v0) && isEVEXXMM(v1) && isEVEXXMM(v2) && isXMMkz(vv[0]) {
  93805. self.require(ISA_AVX512F)
  93806. p.domain = DomainAVX
  93807. p.add(0, func(m *_Encoding, v []interface{}) {
  93808. m.emit(0x62)
  93809. m.emit(0xf1 ^ ((hcode(v[3]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[3]) << 4)))
  93810. m.emit(0x7e ^ (hlcode(v[2]) << 3))
  93811. m.emit((zcode(v[3]) << 7) | (vcode(v[0]) << 5) | (0x08 ^ (ecode(v[2]) << 3)) | kcode(v[3]) | 0x10)
  93812. m.emit(0x5c)
  93813. m.emit(0xc0 | lcode(v[3]) << 3 | lcode(v[1]))
  93814. })
  93815. }
  93816. // VSUBSS xmm, xmm, xmm{k}{z}
  93817. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  93818. self.require(ISA_AVX512F)
  93819. p.domain = DomainAVX
  93820. p.add(0, func(m *_Encoding, v []interface{}) {
  93821. m.emit(0x62)
  93822. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  93823. m.emit(0x7e ^ (hlcode(v[1]) << 3))
  93824. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  93825. m.emit(0x5c)
  93826. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  93827. })
  93828. }
  93829. if p.len == 0 {
  93830. panic("invalid operands for VSUBSS")
  93831. }
  93832. return p
  93833. }
  93834. // VTESTPD performs "Packed Double-Precision Floating-Point Bit Test".
  93835. //
  93836. // Mnemonic : VTESTPD
  93837. // Supported forms : (4 forms)
  93838. //
  93839. // * VTESTPD xmm, xmm [AVX]
  93840. // * VTESTPD m128, xmm [AVX]
  93841. // * VTESTPD ymm, ymm [AVX]
  93842. // * VTESTPD m256, ymm [AVX]
  93843. //
  93844. func (self *Program) VTESTPD(v0 interface{}, v1 interface{}) *Instruction {
  93845. p := self.alloc("VTESTPD", 2, Operands { v0, v1 })
  93846. // VTESTPD xmm, xmm
  93847. if isXMM(v0) && isXMM(v1) {
  93848. self.require(ISA_AVX)
  93849. p.domain = DomainAVX
  93850. p.add(0, func(m *_Encoding, v []interface{}) {
  93851. m.emit(0xc4)
  93852. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  93853. m.emit(0x79)
  93854. m.emit(0x0f)
  93855. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  93856. })
  93857. }
  93858. // VTESTPD m128, xmm
  93859. if isM128(v0) && isXMM(v1) {
  93860. self.require(ISA_AVX)
  93861. p.domain = DomainAVX
  93862. p.add(0, func(m *_Encoding, v []interface{}) {
  93863. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  93864. m.emit(0x0f)
  93865. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  93866. })
  93867. }
  93868. // VTESTPD ymm, ymm
  93869. if isYMM(v0) && isYMM(v1) {
  93870. self.require(ISA_AVX)
  93871. p.domain = DomainAVX
  93872. p.add(0, func(m *_Encoding, v []interface{}) {
  93873. m.emit(0xc4)
  93874. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  93875. m.emit(0x7d)
  93876. m.emit(0x0f)
  93877. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  93878. })
  93879. }
  93880. // VTESTPD m256, ymm
  93881. if isM256(v0) && isYMM(v1) {
  93882. self.require(ISA_AVX)
  93883. p.domain = DomainAVX
  93884. p.add(0, func(m *_Encoding, v []interface{}) {
  93885. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  93886. m.emit(0x0f)
  93887. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  93888. })
  93889. }
  93890. if p.len == 0 {
  93891. panic("invalid operands for VTESTPD")
  93892. }
  93893. return p
  93894. }
  93895. // VTESTPS performs "Packed Single-Precision Floating-Point Bit Test".
  93896. //
  93897. // Mnemonic : VTESTPS
  93898. // Supported forms : (4 forms)
  93899. //
  93900. // * VTESTPS xmm, xmm [AVX]
  93901. // * VTESTPS m128, xmm [AVX]
  93902. // * VTESTPS ymm, ymm [AVX]
  93903. // * VTESTPS m256, ymm [AVX]
  93904. //
  93905. func (self *Program) VTESTPS(v0 interface{}, v1 interface{}) *Instruction {
  93906. p := self.alloc("VTESTPS", 2, Operands { v0, v1 })
  93907. // VTESTPS xmm, xmm
  93908. if isXMM(v0) && isXMM(v1) {
  93909. self.require(ISA_AVX)
  93910. p.domain = DomainAVX
  93911. p.add(0, func(m *_Encoding, v []interface{}) {
  93912. m.emit(0xc4)
  93913. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  93914. m.emit(0x79)
  93915. m.emit(0x0e)
  93916. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  93917. })
  93918. }
  93919. // VTESTPS m128, xmm
  93920. if isM128(v0) && isXMM(v1) {
  93921. self.require(ISA_AVX)
  93922. p.domain = DomainAVX
  93923. p.add(0, func(m *_Encoding, v []interface{}) {
  93924. m.vex3(0xc4, 0b10, 0x01, hcode(v[1]), addr(v[0]), 0)
  93925. m.emit(0x0e)
  93926. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  93927. })
  93928. }
  93929. // VTESTPS ymm, ymm
  93930. if isYMM(v0) && isYMM(v1) {
  93931. self.require(ISA_AVX)
  93932. p.domain = DomainAVX
  93933. p.add(0, func(m *_Encoding, v []interface{}) {
  93934. m.emit(0xc4)
  93935. m.emit(0xe2 ^ (hcode(v[1]) << 7) ^ (hcode(v[0]) << 5))
  93936. m.emit(0x7d)
  93937. m.emit(0x0e)
  93938. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  93939. })
  93940. }
  93941. // VTESTPS m256, ymm
  93942. if isM256(v0) && isYMM(v1) {
  93943. self.require(ISA_AVX)
  93944. p.domain = DomainAVX
  93945. p.add(0, func(m *_Encoding, v []interface{}) {
  93946. m.vex3(0xc4, 0b10, 0x05, hcode(v[1]), addr(v[0]), 0)
  93947. m.emit(0x0e)
  93948. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  93949. })
  93950. }
  93951. if p.len == 0 {
  93952. panic("invalid operands for VTESTPS")
  93953. }
  93954. return p
  93955. }
  93956. // VUCOMISD performs "Unordered Compare Scalar Double-Precision Floating-Point Values and Set EFLAGS".
  93957. //
  93958. // Mnemonic : VUCOMISD
  93959. // Supported forms : (5 forms)
  93960. //
  93961. // * VUCOMISD xmm, xmm [AVX]
  93962. // * VUCOMISD m64, xmm [AVX]
  93963. // * VUCOMISD m64, xmm [AVX512F]
  93964. // * VUCOMISD {sae}, xmm, xmm [AVX512F]
  93965. // * VUCOMISD xmm, xmm [AVX512F]
  93966. //
  93967. func (self *Program) VUCOMISD(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  93968. var p *Instruction
  93969. switch len(vv) {
  93970. case 0 : p = self.alloc("VUCOMISD", 2, Operands { v0, v1 })
  93971. case 1 : p = self.alloc("VUCOMISD", 3, Operands { v0, v1, vv[0] })
  93972. default : panic("instruction VUCOMISD takes 2 or 3 operands")
  93973. }
  93974. // VUCOMISD xmm, xmm
  93975. if len(vv) == 0 && isXMM(v0) && isXMM(v1) {
  93976. self.require(ISA_AVX)
  93977. p.domain = DomainAVX
  93978. p.add(0, func(m *_Encoding, v []interface{}) {
  93979. m.vex2(1, hcode(v[1]), v[0], 0)
  93980. m.emit(0x2e)
  93981. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  93982. })
  93983. }
  93984. // VUCOMISD m64, xmm
  93985. if len(vv) == 0 && isM64(v0) && isXMM(v1) {
  93986. self.require(ISA_AVX)
  93987. p.domain = DomainAVX
  93988. p.add(0, func(m *_Encoding, v []interface{}) {
  93989. m.vex2(1, hcode(v[1]), addr(v[0]), 0)
  93990. m.emit(0x2e)
  93991. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  93992. })
  93993. }
  93994. // VUCOMISD m64, xmm
  93995. if len(vv) == 0 && isM64(v0) && isEVEXXMM(v1) {
  93996. self.require(ISA_AVX512F)
  93997. p.domain = DomainAVX
  93998. p.add(0, func(m *_Encoding, v []interface{}) {
  93999. m.evex(0b01, 0x85, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  94000. m.emit(0x2e)
  94001. m.mrsd(lcode(v[1]), addr(v[0]), 8)
  94002. })
  94003. }
  94004. // VUCOMISD {sae}, xmm, xmm
  94005. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isEVEXXMM(vv[0]) {
  94006. self.require(ISA_AVX512F)
  94007. p.domain = DomainAVX
  94008. p.add(0, func(m *_Encoding, v []interface{}) {
  94009. m.emit(0x62)
  94010. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  94011. m.emit(0xfd)
  94012. m.emit(0x18)
  94013. m.emit(0x2e)
  94014. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  94015. })
  94016. }
  94017. // VUCOMISD xmm, xmm
  94018. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) {
  94019. self.require(ISA_AVX512F)
  94020. p.domain = DomainAVX
  94021. p.add(0, func(m *_Encoding, v []interface{}) {
  94022. m.emit(0x62)
  94023. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  94024. m.emit(0xfd)
  94025. m.emit(0x48)
  94026. m.emit(0x2e)
  94027. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  94028. })
  94029. }
  94030. if p.len == 0 {
  94031. panic("invalid operands for VUCOMISD")
  94032. }
  94033. return p
  94034. }
  94035. // VUCOMISS performs "Unordered Compare Scalar Single-Precision Floating-Point Values and Set EFLAGS".
  94036. //
  94037. // Mnemonic : VUCOMISS
  94038. // Supported forms : (5 forms)
  94039. //
  94040. // * VUCOMISS xmm, xmm [AVX]
  94041. // * VUCOMISS m32, xmm [AVX]
  94042. // * VUCOMISS m32, xmm [AVX512F]
  94043. // * VUCOMISS {sae}, xmm, xmm [AVX512F]
  94044. // * VUCOMISS xmm, xmm [AVX512F]
  94045. //
  94046. func (self *Program) VUCOMISS(v0 interface{}, v1 interface{}, vv ...interface{}) *Instruction {
  94047. var p *Instruction
  94048. switch len(vv) {
  94049. case 0 : p = self.alloc("VUCOMISS", 2, Operands { v0, v1 })
  94050. case 1 : p = self.alloc("VUCOMISS", 3, Operands { v0, v1, vv[0] })
  94051. default : panic("instruction VUCOMISS takes 2 or 3 operands")
  94052. }
  94053. // VUCOMISS xmm, xmm
  94054. if len(vv) == 0 && isXMM(v0) && isXMM(v1) {
  94055. self.require(ISA_AVX)
  94056. p.domain = DomainAVX
  94057. p.add(0, func(m *_Encoding, v []interface{}) {
  94058. m.vex2(0, hcode(v[1]), v[0], 0)
  94059. m.emit(0x2e)
  94060. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  94061. })
  94062. }
  94063. // VUCOMISS m32, xmm
  94064. if len(vv) == 0 && isM32(v0) && isXMM(v1) {
  94065. self.require(ISA_AVX)
  94066. p.domain = DomainAVX
  94067. p.add(0, func(m *_Encoding, v []interface{}) {
  94068. m.vex2(0, hcode(v[1]), addr(v[0]), 0)
  94069. m.emit(0x2e)
  94070. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  94071. })
  94072. }
  94073. // VUCOMISS m32, xmm
  94074. if len(vv) == 0 && isM32(v0) && isEVEXXMM(v1) {
  94075. self.require(ISA_AVX512F)
  94076. p.domain = DomainAVX
  94077. p.add(0, func(m *_Encoding, v []interface{}) {
  94078. m.evex(0b01, 0x04, 0b00, ehcode(v[1]), addr(v[0]), 0, 0, 0, 0)
  94079. m.emit(0x2e)
  94080. m.mrsd(lcode(v[1]), addr(v[0]), 4)
  94081. })
  94082. }
  94083. // VUCOMISS {sae}, xmm, xmm
  94084. if len(vv) == 1 && isSAE(v0) && isEVEXXMM(v1) && isEVEXXMM(vv[0]) {
  94085. self.require(ISA_AVX512F)
  94086. p.domain = DomainAVX
  94087. p.add(0, func(m *_Encoding, v []interface{}) {
  94088. m.emit(0x62)
  94089. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[1]) << 5) | (ecode(v[2]) << 4)))
  94090. m.emit(0x7c)
  94091. m.emit(0x18)
  94092. m.emit(0x2e)
  94093. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[1]))
  94094. })
  94095. }
  94096. // VUCOMISS xmm, xmm
  94097. if len(vv) == 0 && isEVEXXMM(v0) && isEVEXXMM(v1) {
  94098. self.require(ISA_AVX512F)
  94099. p.domain = DomainAVX
  94100. p.add(0, func(m *_Encoding, v []interface{}) {
  94101. m.emit(0x62)
  94102. m.emit(0xf1 ^ ((hcode(v[1]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[1]) << 4)))
  94103. m.emit(0x7c)
  94104. m.emit(0x48)
  94105. m.emit(0x2e)
  94106. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  94107. })
  94108. }
  94109. if p.len == 0 {
  94110. panic("invalid operands for VUCOMISS")
  94111. }
  94112. return p
  94113. }
  94114. // VUNPCKHPD performs "Unpack and Interleave High Packed Double-Precision Floating-Point Values".
  94115. //
  94116. // Mnemonic : VUNPCKHPD
  94117. // Supported forms : (10 forms)
  94118. //
  94119. // * VUNPCKHPD xmm, xmm, xmm [AVX]
  94120. // * VUNPCKHPD m128, xmm, xmm [AVX]
  94121. // * VUNPCKHPD ymm, ymm, ymm [AVX]
  94122. // * VUNPCKHPD m256, ymm, ymm [AVX]
  94123. // * VUNPCKHPD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  94124. // * VUNPCKHPD zmm, zmm, zmm{k}{z} [AVX512F]
  94125. // * VUNPCKHPD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  94126. // * VUNPCKHPD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  94127. // * VUNPCKHPD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  94128. // * VUNPCKHPD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  94129. //
  94130. func (self *Program) VUNPCKHPD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  94131. p := self.alloc("VUNPCKHPD", 3, Operands { v0, v1, v2 })
  94132. // VUNPCKHPD xmm, xmm, xmm
  94133. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  94134. self.require(ISA_AVX)
  94135. p.domain = DomainAVX
  94136. p.add(0, func(m *_Encoding, v []interface{}) {
  94137. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  94138. m.emit(0x15)
  94139. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94140. })
  94141. }
  94142. // VUNPCKHPD m128, xmm, xmm
  94143. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  94144. self.require(ISA_AVX)
  94145. p.domain = DomainAVX
  94146. p.add(0, func(m *_Encoding, v []interface{}) {
  94147. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  94148. m.emit(0x15)
  94149. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  94150. })
  94151. }
  94152. // VUNPCKHPD ymm, ymm, ymm
  94153. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  94154. self.require(ISA_AVX)
  94155. p.domain = DomainAVX
  94156. p.add(0, func(m *_Encoding, v []interface{}) {
  94157. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  94158. m.emit(0x15)
  94159. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94160. })
  94161. }
  94162. // VUNPCKHPD m256, ymm, ymm
  94163. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  94164. self.require(ISA_AVX)
  94165. p.domain = DomainAVX
  94166. p.add(0, func(m *_Encoding, v []interface{}) {
  94167. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  94168. m.emit(0x15)
  94169. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  94170. })
  94171. }
  94172. // VUNPCKHPD m512/m64bcst, zmm, zmm{k}{z}
  94173. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  94174. self.require(ISA_AVX512F)
  94175. p.domain = DomainAVX
  94176. p.add(0, func(m *_Encoding, v []interface{}) {
  94177. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  94178. m.emit(0x15)
  94179. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  94180. })
  94181. }
  94182. // VUNPCKHPD zmm, zmm, zmm{k}{z}
  94183. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  94184. self.require(ISA_AVX512F)
  94185. p.domain = DomainAVX
  94186. p.add(0, func(m *_Encoding, v []interface{}) {
  94187. m.emit(0x62)
  94188. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  94189. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  94190. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  94191. m.emit(0x15)
  94192. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94193. })
  94194. }
  94195. // VUNPCKHPD m128/m64bcst, xmm, xmm{k}{z}
  94196. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  94197. self.require(ISA_AVX512VL | ISA_AVX512F)
  94198. p.domain = DomainAVX
  94199. p.add(0, func(m *_Encoding, v []interface{}) {
  94200. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  94201. m.emit(0x15)
  94202. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  94203. })
  94204. }
  94205. // VUNPCKHPD xmm, xmm, xmm{k}{z}
  94206. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  94207. self.require(ISA_AVX512VL | ISA_AVX512F)
  94208. p.domain = DomainAVX
  94209. p.add(0, func(m *_Encoding, v []interface{}) {
  94210. m.emit(0x62)
  94211. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  94212. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  94213. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  94214. m.emit(0x15)
  94215. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94216. })
  94217. }
  94218. // VUNPCKHPD m256/m64bcst, ymm, ymm{k}{z}
  94219. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  94220. self.require(ISA_AVX512VL | ISA_AVX512F)
  94221. p.domain = DomainAVX
  94222. p.add(0, func(m *_Encoding, v []interface{}) {
  94223. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  94224. m.emit(0x15)
  94225. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  94226. })
  94227. }
  94228. // VUNPCKHPD ymm, ymm, ymm{k}{z}
  94229. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  94230. self.require(ISA_AVX512VL | ISA_AVX512F)
  94231. p.domain = DomainAVX
  94232. p.add(0, func(m *_Encoding, v []interface{}) {
  94233. m.emit(0x62)
  94234. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  94235. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  94236. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  94237. m.emit(0x15)
  94238. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94239. })
  94240. }
  94241. if p.len == 0 {
  94242. panic("invalid operands for VUNPCKHPD")
  94243. }
  94244. return p
  94245. }
  94246. // VUNPCKHPS performs "Unpack and Interleave High Packed Single-Precision Floating-Point Values".
  94247. //
  94248. // Mnemonic : VUNPCKHPS
  94249. // Supported forms : (10 forms)
  94250. //
  94251. // * VUNPCKHPS xmm, xmm, xmm [AVX]
  94252. // * VUNPCKHPS m128, xmm, xmm [AVX]
  94253. // * VUNPCKHPS ymm, ymm, ymm [AVX]
  94254. // * VUNPCKHPS m256, ymm, ymm [AVX]
  94255. // * VUNPCKHPS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  94256. // * VUNPCKHPS zmm, zmm, zmm{k}{z} [AVX512F]
  94257. // * VUNPCKHPS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  94258. // * VUNPCKHPS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  94259. // * VUNPCKHPS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  94260. // * VUNPCKHPS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  94261. //
  94262. func (self *Program) VUNPCKHPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  94263. p := self.alloc("VUNPCKHPS", 3, Operands { v0, v1, v2 })
  94264. // VUNPCKHPS xmm, xmm, xmm
  94265. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  94266. self.require(ISA_AVX)
  94267. p.domain = DomainAVX
  94268. p.add(0, func(m *_Encoding, v []interface{}) {
  94269. m.vex2(0, hcode(v[2]), v[0], hlcode(v[1]))
  94270. m.emit(0x15)
  94271. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94272. })
  94273. }
  94274. // VUNPCKHPS m128, xmm, xmm
  94275. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  94276. self.require(ISA_AVX)
  94277. p.domain = DomainAVX
  94278. p.add(0, func(m *_Encoding, v []interface{}) {
  94279. m.vex2(0, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  94280. m.emit(0x15)
  94281. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  94282. })
  94283. }
  94284. // VUNPCKHPS ymm, ymm, ymm
  94285. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  94286. self.require(ISA_AVX)
  94287. p.domain = DomainAVX
  94288. p.add(0, func(m *_Encoding, v []interface{}) {
  94289. m.vex2(4, hcode(v[2]), v[0], hlcode(v[1]))
  94290. m.emit(0x15)
  94291. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94292. })
  94293. }
  94294. // VUNPCKHPS m256, ymm, ymm
  94295. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  94296. self.require(ISA_AVX)
  94297. p.domain = DomainAVX
  94298. p.add(0, func(m *_Encoding, v []interface{}) {
  94299. m.vex2(4, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  94300. m.emit(0x15)
  94301. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  94302. })
  94303. }
  94304. // VUNPCKHPS m512/m32bcst, zmm, zmm{k}{z}
  94305. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  94306. self.require(ISA_AVX512F)
  94307. p.domain = DomainAVX
  94308. p.add(0, func(m *_Encoding, v []interface{}) {
  94309. m.evex(0b01, 0x04, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  94310. m.emit(0x15)
  94311. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  94312. })
  94313. }
  94314. // VUNPCKHPS zmm, zmm, zmm{k}{z}
  94315. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  94316. self.require(ISA_AVX512F)
  94317. p.domain = DomainAVX
  94318. p.add(0, func(m *_Encoding, v []interface{}) {
  94319. m.emit(0x62)
  94320. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  94321. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  94322. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  94323. m.emit(0x15)
  94324. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94325. })
  94326. }
  94327. // VUNPCKHPS m128/m32bcst, xmm, xmm{k}{z}
  94328. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  94329. self.require(ISA_AVX512VL | ISA_AVX512F)
  94330. p.domain = DomainAVX
  94331. p.add(0, func(m *_Encoding, v []interface{}) {
  94332. m.evex(0b01, 0x04, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  94333. m.emit(0x15)
  94334. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  94335. })
  94336. }
  94337. // VUNPCKHPS xmm, xmm, xmm{k}{z}
  94338. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  94339. self.require(ISA_AVX512VL | ISA_AVX512F)
  94340. p.domain = DomainAVX
  94341. p.add(0, func(m *_Encoding, v []interface{}) {
  94342. m.emit(0x62)
  94343. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  94344. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  94345. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  94346. m.emit(0x15)
  94347. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94348. })
  94349. }
  94350. // VUNPCKHPS m256/m32bcst, ymm, ymm{k}{z}
  94351. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  94352. self.require(ISA_AVX512VL | ISA_AVX512F)
  94353. p.domain = DomainAVX
  94354. p.add(0, func(m *_Encoding, v []interface{}) {
  94355. m.evex(0b01, 0x04, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  94356. m.emit(0x15)
  94357. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  94358. })
  94359. }
  94360. // VUNPCKHPS ymm, ymm, ymm{k}{z}
  94361. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  94362. self.require(ISA_AVX512VL | ISA_AVX512F)
  94363. p.domain = DomainAVX
  94364. p.add(0, func(m *_Encoding, v []interface{}) {
  94365. m.emit(0x62)
  94366. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  94367. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  94368. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  94369. m.emit(0x15)
  94370. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94371. })
  94372. }
  94373. if p.len == 0 {
  94374. panic("invalid operands for VUNPCKHPS")
  94375. }
  94376. return p
  94377. }
  94378. // VUNPCKLPD performs "Unpack and Interleave Low Packed Double-Precision Floating-Point Values".
  94379. //
  94380. // Mnemonic : VUNPCKLPD
  94381. // Supported forms : (10 forms)
  94382. //
  94383. // * VUNPCKLPD xmm, xmm, xmm [AVX]
  94384. // * VUNPCKLPD m128, xmm, xmm [AVX]
  94385. // * VUNPCKLPD ymm, ymm, ymm [AVX]
  94386. // * VUNPCKLPD m256, ymm, ymm [AVX]
  94387. // * VUNPCKLPD m512/m64bcst, zmm, zmm{k}{z} [AVX512F]
  94388. // * VUNPCKLPD zmm, zmm, zmm{k}{z} [AVX512F]
  94389. // * VUNPCKLPD m128/m64bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  94390. // * VUNPCKLPD xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  94391. // * VUNPCKLPD m256/m64bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  94392. // * VUNPCKLPD ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  94393. //
  94394. func (self *Program) VUNPCKLPD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  94395. p := self.alloc("VUNPCKLPD", 3, Operands { v0, v1, v2 })
  94396. // VUNPCKLPD xmm, xmm, xmm
  94397. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  94398. self.require(ISA_AVX)
  94399. p.domain = DomainAVX
  94400. p.add(0, func(m *_Encoding, v []interface{}) {
  94401. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  94402. m.emit(0x14)
  94403. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94404. })
  94405. }
  94406. // VUNPCKLPD m128, xmm, xmm
  94407. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  94408. self.require(ISA_AVX)
  94409. p.domain = DomainAVX
  94410. p.add(0, func(m *_Encoding, v []interface{}) {
  94411. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  94412. m.emit(0x14)
  94413. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  94414. })
  94415. }
  94416. // VUNPCKLPD ymm, ymm, ymm
  94417. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  94418. self.require(ISA_AVX)
  94419. p.domain = DomainAVX
  94420. p.add(0, func(m *_Encoding, v []interface{}) {
  94421. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  94422. m.emit(0x14)
  94423. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94424. })
  94425. }
  94426. // VUNPCKLPD m256, ymm, ymm
  94427. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  94428. self.require(ISA_AVX)
  94429. p.domain = DomainAVX
  94430. p.add(0, func(m *_Encoding, v []interface{}) {
  94431. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  94432. m.emit(0x14)
  94433. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  94434. })
  94435. }
  94436. // VUNPCKLPD m512/m64bcst, zmm, zmm{k}{z}
  94437. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  94438. self.require(ISA_AVX512F)
  94439. p.domain = DomainAVX
  94440. p.add(0, func(m *_Encoding, v []interface{}) {
  94441. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  94442. m.emit(0x14)
  94443. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  94444. })
  94445. }
  94446. // VUNPCKLPD zmm, zmm, zmm{k}{z}
  94447. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  94448. self.require(ISA_AVX512F)
  94449. p.domain = DomainAVX
  94450. p.add(0, func(m *_Encoding, v []interface{}) {
  94451. m.emit(0x62)
  94452. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  94453. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  94454. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  94455. m.emit(0x14)
  94456. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94457. })
  94458. }
  94459. // VUNPCKLPD m128/m64bcst, xmm, xmm{k}{z}
  94460. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  94461. self.require(ISA_AVX512VL | ISA_AVX512F)
  94462. p.domain = DomainAVX
  94463. p.add(0, func(m *_Encoding, v []interface{}) {
  94464. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  94465. m.emit(0x14)
  94466. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  94467. })
  94468. }
  94469. // VUNPCKLPD xmm, xmm, xmm{k}{z}
  94470. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  94471. self.require(ISA_AVX512VL | ISA_AVX512F)
  94472. p.domain = DomainAVX
  94473. p.add(0, func(m *_Encoding, v []interface{}) {
  94474. m.emit(0x62)
  94475. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  94476. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  94477. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  94478. m.emit(0x14)
  94479. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94480. })
  94481. }
  94482. // VUNPCKLPD m256/m64bcst, ymm, ymm{k}{z}
  94483. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  94484. self.require(ISA_AVX512VL | ISA_AVX512F)
  94485. p.domain = DomainAVX
  94486. p.add(0, func(m *_Encoding, v []interface{}) {
  94487. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  94488. m.emit(0x14)
  94489. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  94490. })
  94491. }
  94492. // VUNPCKLPD ymm, ymm, ymm{k}{z}
  94493. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  94494. self.require(ISA_AVX512VL | ISA_AVX512F)
  94495. p.domain = DomainAVX
  94496. p.add(0, func(m *_Encoding, v []interface{}) {
  94497. m.emit(0x62)
  94498. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  94499. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  94500. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  94501. m.emit(0x14)
  94502. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94503. })
  94504. }
  94505. if p.len == 0 {
  94506. panic("invalid operands for VUNPCKLPD")
  94507. }
  94508. return p
  94509. }
  94510. // VUNPCKLPS performs "Unpack and Interleave Low Packed Single-Precision Floating-Point Values".
  94511. //
  94512. // Mnemonic : VUNPCKLPS
  94513. // Supported forms : (10 forms)
  94514. //
  94515. // * VUNPCKLPS xmm, xmm, xmm [AVX]
  94516. // * VUNPCKLPS m128, xmm, xmm [AVX]
  94517. // * VUNPCKLPS ymm, ymm, ymm [AVX]
  94518. // * VUNPCKLPS m256, ymm, ymm [AVX]
  94519. // * VUNPCKLPS m512/m32bcst, zmm, zmm{k}{z} [AVX512F]
  94520. // * VUNPCKLPS zmm, zmm, zmm{k}{z} [AVX512F]
  94521. // * VUNPCKLPS m128/m32bcst, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  94522. // * VUNPCKLPS xmm, xmm, xmm{k}{z} [AVX512F,AVX512VL]
  94523. // * VUNPCKLPS m256/m32bcst, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  94524. // * VUNPCKLPS ymm, ymm, ymm{k}{z} [AVX512F,AVX512VL]
  94525. //
  94526. func (self *Program) VUNPCKLPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  94527. p := self.alloc("VUNPCKLPS", 3, Operands { v0, v1, v2 })
  94528. // VUNPCKLPS xmm, xmm, xmm
  94529. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  94530. self.require(ISA_AVX)
  94531. p.domain = DomainAVX
  94532. p.add(0, func(m *_Encoding, v []interface{}) {
  94533. m.vex2(0, hcode(v[2]), v[0], hlcode(v[1]))
  94534. m.emit(0x14)
  94535. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94536. })
  94537. }
  94538. // VUNPCKLPS m128, xmm, xmm
  94539. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  94540. self.require(ISA_AVX)
  94541. p.domain = DomainAVX
  94542. p.add(0, func(m *_Encoding, v []interface{}) {
  94543. m.vex2(0, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  94544. m.emit(0x14)
  94545. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  94546. })
  94547. }
  94548. // VUNPCKLPS ymm, ymm, ymm
  94549. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  94550. self.require(ISA_AVX)
  94551. p.domain = DomainAVX
  94552. p.add(0, func(m *_Encoding, v []interface{}) {
  94553. m.vex2(4, hcode(v[2]), v[0], hlcode(v[1]))
  94554. m.emit(0x14)
  94555. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94556. })
  94557. }
  94558. // VUNPCKLPS m256, ymm, ymm
  94559. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  94560. self.require(ISA_AVX)
  94561. p.domain = DomainAVX
  94562. p.add(0, func(m *_Encoding, v []interface{}) {
  94563. m.vex2(4, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  94564. m.emit(0x14)
  94565. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  94566. })
  94567. }
  94568. // VUNPCKLPS m512/m32bcst, zmm, zmm{k}{z}
  94569. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  94570. self.require(ISA_AVX512F)
  94571. p.domain = DomainAVX
  94572. p.add(0, func(m *_Encoding, v []interface{}) {
  94573. m.evex(0b01, 0x04, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  94574. m.emit(0x14)
  94575. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  94576. })
  94577. }
  94578. // VUNPCKLPS zmm, zmm, zmm{k}{z}
  94579. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  94580. self.require(ISA_AVX512F)
  94581. p.domain = DomainAVX
  94582. p.add(0, func(m *_Encoding, v []interface{}) {
  94583. m.emit(0x62)
  94584. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  94585. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  94586. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  94587. m.emit(0x14)
  94588. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94589. })
  94590. }
  94591. // VUNPCKLPS m128/m32bcst, xmm, xmm{k}{z}
  94592. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  94593. self.require(ISA_AVX512VL | ISA_AVX512F)
  94594. p.domain = DomainAVX
  94595. p.add(0, func(m *_Encoding, v []interface{}) {
  94596. m.evex(0b01, 0x04, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  94597. m.emit(0x14)
  94598. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  94599. })
  94600. }
  94601. // VUNPCKLPS xmm, xmm, xmm{k}{z}
  94602. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  94603. self.require(ISA_AVX512VL | ISA_AVX512F)
  94604. p.domain = DomainAVX
  94605. p.add(0, func(m *_Encoding, v []interface{}) {
  94606. m.emit(0x62)
  94607. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  94608. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  94609. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  94610. m.emit(0x14)
  94611. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94612. })
  94613. }
  94614. // VUNPCKLPS m256/m32bcst, ymm, ymm{k}{z}
  94615. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  94616. self.require(ISA_AVX512VL | ISA_AVX512F)
  94617. p.domain = DomainAVX
  94618. p.add(0, func(m *_Encoding, v []interface{}) {
  94619. m.evex(0b01, 0x04, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  94620. m.emit(0x14)
  94621. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  94622. })
  94623. }
  94624. // VUNPCKLPS ymm, ymm, ymm{k}{z}
  94625. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  94626. self.require(ISA_AVX512VL | ISA_AVX512F)
  94627. p.domain = DomainAVX
  94628. p.add(0, func(m *_Encoding, v []interface{}) {
  94629. m.emit(0x62)
  94630. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  94631. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  94632. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  94633. m.emit(0x14)
  94634. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94635. })
  94636. }
  94637. if p.len == 0 {
  94638. panic("invalid operands for VUNPCKLPS")
  94639. }
  94640. return p
  94641. }
  94642. // VXORPD performs "Bitwise Logical XOR for Double-Precision Floating-Point Values".
  94643. //
  94644. // Mnemonic : VXORPD
  94645. // Supported forms : (10 forms)
  94646. //
  94647. // * VXORPD xmm, xmm, xmm [AVX]
  94648. // * VXORPD m128, xmm, xmm [AVX]
  94649. // * VXORPD ymm, ymm, ymm [AVX]
  94650. // * VXORPD m256, ymm, ymm [AVX]
  94651. // * VXORPD m512/m64bcst, zmm, zmm{k}{z} [AVX512DQ]
  94652. // * VXORPD zmm, zmm, zmm{k}{z} [AVX512DQ]
  94653. // * VXORPD m128/m64bcst, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  94654. // * VXORPD xmm, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  94655. // * VXORPD m256/m64bcst, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  94656. // * VXORPD ymm, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  94657. //
  94658. func (self *Program) VXORPD(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  94659. p := self.alloc("VXORPD", 3, Operands { v0, v1, v2 })
  94660. // VXORPD xmm, xmm, xmm
  94661. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  94662. self.require(ISA_AVX)
  94663. p.domain = DomainAVX
  94664. p.add(0, func(m *_Encoding, v []interface{}) {
  94665. m.vex2(1, hcode(v[2]), v[0], hlcode(v[1]))
  94666. m.emit(0x57)
  94667. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94668. })
  94669. }
  94670. // VXORPD m128, xmm, xmm
  94671. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  94672. self.require(ISA_AVX)
  94673. p.domain = DomainAVX
  94674. p.add(0, func(m *_Encoding, v []interface{}) {
  94675. m.vex2(1, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  94676. m.emit(0x57)
  94677. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  94678. })
  94679. }
  94680. // VXORPD ymm, ymm, ymm
  94681. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  94682. self.require(ISA_AVX)
  94683. p.domain = DomainAVX
  94684. p.add(0, func(m *_Encoding, v []interface{}) {
  94685. m.vex2(5, hcode(v[2]), v[0], hlcode(v[1]))
  94686. m.emit(0x57)
  94687. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94688. })
  94689. }
  94690. // VXORPD m256, ymm, ymm
  94691. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  94692. self.require(ISA_AVX)
  94693. p.domain = DomainAVX
  94694. p.add(0, func(m *_Encoding, v []interface{}) {
  94695. m.vex2(5, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  94696. m.emit(0x57)
  94697. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  94698. })
  94699. }
  94700. // VXORPD m512/m64bcst, zmm, zmm{k}{z}
  94701. if isM512M64bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  94702. self.require(ISA_AVX512DQ)
  94703. p.domain = DomainAVX
  94704. p.add(0, func(m *_Encoding, v []interface{}) {
  94705. m.evex(0b01, 0x85, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  94706. m.emit(0x57)
  94707. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  94708. })
  94709. }
  94710. // VXORPD zmm, zmm, zmm{k}{z}
  94711. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  94712. self.require(ISA_AVX512DQ)
  94713. p.domain = DomainAVX
  94714. p.add(0, func(m *_Encoding, v []interface{}) {
  94715. m.emit(0x62)
  94716. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  94717. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  94718. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  94719. m.emit(0x57)
  94720. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94721. })
  94722. }
  94723. // VXORPD m128/m64bcst, xmm, xmm{k}{z}
  94724. if isM128M64bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  94725. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  94726. p.domain = DomainAVX
  94727. p.add(0, func(m *_Encoding, v []interface{}) {
  94728. m.evex(0b01, 0x85, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  94729. m.emit(0x57)
  94730. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  94731. })
  94732. }
  94733. // VXORPD xmm, xmm, xmm{k}{z}
  94734. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  94735. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  94736. p.domain = DomainAVX
  94737. p.add(0, func(m *_Encoding, v []interface{}) {
  94738. m.emit(0x62)
  94739. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  94740. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  94741. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  94742. m.emit(0x57)
  94743. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94744. })
  94745. }
  94746. // VXORPD m256/m64bcst, ymm, ymm{k}{z}
  94747. if isM256M64bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  94748. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  94749. p.domain = DomainAVX
  94750. p.add(0, func(m *_Encoding, v []interface{}) {
  94751. m.evex(0b01, 0x85, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  94752. m.emit(0x57)
  94753. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  94754. })
  94755. }
  94756. // VXORPD ymm, ymm, ymm{k}{z}
  94757. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  94758. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  94759. p.domain = DomainAVX
  94760. p.add(0, func(m *_Encoding, v []interface{}) {
  94761. m.emit(0x62)
  94762. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  94763. m.emit(0xfd ^ (hlcode(v[1]) << 3))
  94764. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  94765. m.emit(0x57)
  94766. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94767. })
  94768. }
  94769. if p.len == 0 {
  94770. panic("invalid operands for VXORPD")
  94771. }
  94772. return p
  94773. }
  94774. // VXORPS performs "Bitwise Logical XOR for Single-Precision Floating-Point Values".
  94775. //
  94776. // Mnemonic : VXORPS
  94777. // Supported forms : (10 forms)
  94778. //
  94779. // * VXORPS xmm, xmm, xmm [AVX]
  94780. // * VXORPS m128, xmm, xmm [AVX]
  94781. // * VXORPS ymm, ymm, ymm [AVX]
  94782. // * VXORPS m256, ymm, ymm [AVX]
  94783. // * VXORPS m512/m32bcst, zmm, zmm{k}{z} [AVX512DQ]
  94784. // * VXORPS zmm, zmm, zmm{k}{z} [AVX512DQ]
  94785. // * VXORPS m128/m32bcst, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  94786. // * VXORPS xmm, xmm, xmm{k}{z} [AVX512DQ,AVX512VL]
  94787. // * VXORPS m256/m32bcst, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  94788. // * VXORPS ymm, ymm, ymm{k}{z} [AVX512DQ,AVX512VL]
  94789. //
  94790. func (self *Program) VXORPS(v0 interface{}, v1 interface{}, v2 interface{}) *Instruction {
  94791. p := self.alloc("VXORPS", 3, Operands { v0, v1, v2 })
  94792. // VXORPS xmm, xmm, xmm
  94793. if isXMM(v0) && isXMM(v1) && isXMM(v2) {
  94794. self.require(ISA_AVX)
  94795. p.domain = DomainAVX
  94796. p.add(0, func(m *_Encoding, v []interface{}) {
  94797. m.vex2(0, hcode(v[2]), v[0], hlcode(v[1]))
  94798. m.emit(0x57)
  94799. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94800. })
  94801. }
  94802. // VXORPS m128, xmm, xmm
  94803. if isM128(v0) && isXMM(v1) && isXMM(v2) {
  94804. self.require(ISA_AVX)
  94805. p.domain = DomainAVX
  94806. p.add(0, func(m *_Encoding, v []interface{}) {
  94807. m.vex2(0, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  94808. m.emit(0x57)
  94809. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  94810. })
  94811. }
  94812. // VXORPS ymm, ymm, ymm
  94813. if isYMM(v0) && isYMM(v1) && isYMM(v2) {
  94814. self.require(ISA_AVX)
  94815. p.domain = DomainAVX
  94816. p.add(0, func(m *_Encoding, v []interface{}) {
  94817. m.vex2(4, hcode(v[2]), v[0], hlcode(v[1]))
  94818. m.emit(0x57)
  94819. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94820. })
  94821. }
  94822. // VXORPS m256, ymm, ymm
  94823. if isM256(v0) && isYMM(v1) && isYMM(v2) {
  94824. self.require(ISA_AVX)
  94825. p.domain = DomainAVX
  94826. p.add(0, func(m *_Encoding, v []interface{}) {
  94827. m.vex2(4, hcode(v[2]), addr(v[0]), hlcode(v[1]))
  94828. m.emit(0x57)
  94829. m.mrsd(lcode(v[2]), addr(v[0]), 1)
  94830. })
  94831. }
  94832. // VXORPS m512/m32bcst, zmm, zmm{k}{z}
  94833. if isM512M32bcst(v0) && isZMM(v1) && isZMMkz(v2) {
  94834. self.require(ISA_AVX512DQ)
  94835. p.domain = DomainAVX
  94836. p.add(0, func(m *_Encoding, v []interface{}) {
  94837. m.evex(0b01, 0x04, 0b10, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  94838. m.emit(0x57)
  94839. m.mrsd(lcode(v[2]), addr(v[0]), 64)
  94840. })
  94841. }
  94842. // VXORPS zmm, zmm, zmm{k}{z}
  94843. if isZMM(v0) && isZMM(v1) && isZMMkz(v2) {
  94844. self.require(ISA_AVX512DQ)
  94845. p.domain = DomainAVX
  94846. p.add(0, func(m *_Encoding, v []interface{}) {
  94847. m.emit(0x62)
  94848. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  94849. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  94850. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x40)
  94851. m.emit(0x57)
  94852. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94853. })
  94854. }
  94855. // VXORPS m128/m32bcst, xmm, xmm{k}{z}
  94856. if isM128M32bcst(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  94857. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  94858. p.domain = DomainAVX
  94859. p.add(0, func(m *_Encoding, v []interface{}) {
  94860. m.evex(0b01, 0x04, 0b00, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  94861. m.emit(0x57)
  94862. m.mrsd(lcode(v[2]), addr(v[0]), 16)
  94863. })
  94864. }
  94865. // VXORPS xmm, xmm, xmm{k}{z}
  94866. if isEVEXXMM(v0) && isEVEXXMM(v1) && isXMMkz(v2) {
  94867. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  94868. p.domain = DomainAVX
  94869. p.add(0, func(m *_Encoding, v []interface{}) {
  94870. m.emit(0x62)
  94871. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  94872. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  94873. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x00)
  94874. m.emit(0x57)
  94875. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94876. })
  94877. }
  94878. // VXORPS m256/m32bcst, ymm, ymm{k}{z}
  94879. if isM256M32bcst(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  94880. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  94881. p.domain = DomainAVX
  94882. p.add(0, func(m *_Encoding, v []interface{}) {
  94883. m.evex(0b01, 0x04, 0b01, ehcode(v[2]), addr(v[0]), vcode(v[1]), kcode(v[2]), zcode(v[2]), bcode(v[0]))
  94884. m.emit(0x57)
  94885. m.mrsd(lcode(v[2]), addr(v[0]), 32)
  94886. })
  94887. }
  94888. // VXORPS ymm, ymm, ymm{k}{z}
  94889. if isEVEXYMM(v0) && isEVEXYMM(v1) && isYMMkz(v2) {
  94890. self.require(ISA_AVX512VL | ISA_AVX512DQ)
  94891. p.domain = DomainAVX
  94892. p.add(0, func(m *_Encoding, v []interface{}) {
  94893. m.emit(0x62)
  94894. m.emit(0xf1 ^ ((hcode(v[2]) << 7) | (ehcode(v[0]) << 5) | (ecode(v[2]) << 4)))
  94895. m.emit(0x7c ^ (hlcode(v[1]) << 3))
  94896. m.emit((zcode(v[2]) << 7) | (0x08 ^ (ecode(v[1]) << 3)) | kcode(v[2]) | 0x20)
  94897. m.emit(0x57)
  94898. m.emit(0xc0 | lcode(v[2]) << 3 | lcode(v[0]))
  94899. })
  94900. }
  94901. if p.len == 0 {
  94902. panic("invalid operands for VXORPS")
  94903. }
  94904. return p
  94905. }
  94906. // VZEROALL performs "Zero All YMM Registers".
  94907. //
  94908. // Mnemonic : VZEROALL
  94909. // Supported forms : (1 form)
  94910. //
  94911. // * VZEROALL [AVX]
  94912. //
  94913. func (self *Program) VZEROALL() *Instruction {
  94914. p := self.alloc("VZEROALL", 0, Operands { })
  94915. // VZEROALL
  94916. self.require(ISA_AVX)
  94917. p.domain = DomainAVX
  94918. p.add(0, func(m *_Encoding, v []interface{}) {
  94919. m.vex2(4, 0, nil, 0)
  94920. m.emit(0x77)
  94921. })
  94922. return p
  94923. }
  94924. // VZEROUPPER performs "Zero Upper Bits of YMM Registers".
  94925. //
  94926. // Mnemonic : VZEROUPPER
  94927. // Supported forms : (1 form)
  94928. //
  94929. // * VZEROUPPER [AVX]
  94930. //
  94931. func (self *Program) VZEROUPPER() *Instruction {
  94932. p := self.alloc("VZEROUPPER", 0, Operands { })
  94933. // VZEROUPPER
  94934. self.require(ISA_AVX)
  94935. p.domain = DomainAVX
  94936. p.add(0, func(m *_Encoding, v []interface{}) {
  94937. m.vex2(0, 0, nil, 0)
  94938. m.emit(0x77)
  94939. })
  94940. return p
  94941. }
  94942. // XADDB performs "Exchange and Add".
  94943. //
  94944. // Mnemonic : XADD
  94945. // Supported forms : (2 forms)
  94946. //
  94947. // * XADDB r8, r8
  94948. // * XADDB r8, m8
  94949. //
  94950. func (self *Program) XADDB(v0 interface{}, v1 interface{}) *Instruction {
  94951. p := self.alloc("XADDB", 2, Operands { v0, v1 })
  94952. // XADDB r8, r8
  94953. if isReg8(v0) && isReg8(v1) {
  94954. p.domain = DomainGeneric
  94955. p.add(0, func(m *_Encoding, v []interface{}) {
  94956. m.rexo(hcode(v[0]), v[1], isReg8REX(v[0]) || isReg8REX(v[1]))
  94957. m.emit(0x0f)
  94958. m.emit(0xc0)
  94959. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  94960. })
  94961. }
  94962. // XADDB r8, m8
  94963. if isReg8(v0) && isM8(v1) {
  94964. p.domain = DomainGeneric
  94965. p.add(0, func(m *_Encoding, v []interface{}) {
  94966. m.rexo(hcode(v[0]), addr(v[1]), isReg8REX(v[0]))
  94967. m.emit(0x0f)
  94968. m.emit(0xc0)
  94969. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  94970. })
  94971. }
  94972. if p.len == 0 {
  94973. panic("invalid operands for XADDB")
  94974. }
  94975. return p
  94976. }
  94977. // XADDL performs "Exchange and Add".
  94978. //
  94979. // Mnemonic : XADD
  94980. // Supported forms : (2 forms)
  94981. //
  94982. // * XADDL r32, r32
  94983. // * XADDL r32, m32
  94984. //
  94985. func (self *Program) XADDL(v0 interface{}, v1 interface{}) *Instruction {
  94986. p := self.alloc("XADDL", 2, Operands { v0, v1 })
  94987. // XADDL r32, r32
  94988. if isReg32(v0) && isReg32(v1) {
  94989. p.domain = DomainGeneric
  94990. p.add(0, func(m *_Encoding, v []interface{}) {
  94991. m.rexo(hcode(v[0]), v[1], false)
  94992. m.emit(0x0f)
  94993. m.emit(0xc1)
  94994. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  94995. })
  94996. }
  94997. // XADDL r32, m32
  94998. if isReg32(v0) && isM32(v1) {
  94999. p.domain = DomainGeneric
  95000. p.add(0, func(m *_Encoding, v []interface{}) {
  95001. m.rexo(hcode(v[0]), addr(v[1]), false)
  95002. m.emit(0x0f)
  95003. m.emit(0xc1)
  95004. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  95005. })
  95006. }
  95007. if p.len == 0 {
  95008. panic("invalid operands for XADDL")
  95009. }
  95010. return p
  95011. }
  95012. // XADDQ performs "Exchange and Add".
  95013. //
  95014. // Mnemonic : XADD
  95015. // Supported forms : (2 forms)
  95016. //
  95017. // * XADDQ r64, r64
  95018. // * XADDQ r64, m64
  95019. //
  95020. func (self *Program) XADDQ(v0 interface{}, v1 interface{}) *Instruction {
  95021. p := self.alloc("XADDQ", 2, Operands { v0, v1 })
  95022. // XADDQ r64, r64
  95023. if isReg64(v0) && isReg64(v1) {
  95024. p.domain = DomainGeneric
  95025. p.add(0, func(m *_Encoding, v []interface{}) {
  95026. m.emit(0x48 | hcode(v[0]) << 2 | hcode(v[1]))
  95027. m.emit(0x0f)
  95028. m.emit(0xc1)
  95029. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  95030. })
  95031. }
  95032. // XADDQ r64, m64
  95033. if isReg64(v0) && isM64(v1) {
  95034. p.domain = DomainGeneric
  95035. p.add(0, func(m *_Encoding, v []interface{}) {
  95036. m.rexm(1, hcode(v[0]), addr(v[1]))
  95037. m.emit(0x0f)
  95038. m.emit(0xc1)
  95039. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  95040. })
  95041. }
  95042. if p.len == 0 {
  95043. panic("invalid operands for XADDQ")
  95044. }
  95045. return p
  95046. }
  95047. // XADDW performs "Exchange and Add".
  95048. //
  95049. // Mnemonic : XADD
  95050. // Supported forms : (2 forms)
  95051. //
  95052. // * XADDW r16, r16
  95053. // * XADDW r16, m16
  95054. //
  95055. func (self *Program) XADDW(v0 interface{}, v1 interface{}) *Instruction {
  95056. p := self.alloc("XADDW", 2, Operands { v0, v1 })
  95057. // XADDW r16, r16
  95058. if isReg16(v0) && isReg16(v1) {
  95059. p.domain = DomainGeneric
  95060. p.add(0, func(m *_Encoding, v []interface{}) {
  95061. m.emit(0x66)
  95062. m.rexo(hcode(v[0]), v[1], false)
  95063. m.emit(0x0f)
  95064. m.emit(0xc1)
  95065. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  95066. })
  95067. }
  95068. // XADDW r16, m16
  95069. if isReg16(v0) && isM16(v1) {
  95070. p.domain = DomainGeneric
  95071. p.add(0, func(m *_Encoding, v []interface{}) {
  95072. m.emit(0x66)
  95073. m.rexo(hcode(v[0]), addr(v[1]), false)
  95074. m.emit(0x0f)
  95075. m.emit(0xc1)
  95076. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  95077. })
  95078. }
  95079. if p.len == 0 {
  95080. panic("invalid operands for XADDW")
  95081. }
  95082. return p
  95083. }
  95084. // XCHGB performs "Exchange Register/Memory with Register".
  95085. //
  95086. // Mnemonic : XCHG
  95087. // Supported forms : (3 forms)
  95088. //
  95089. // * XCHGB r8, r8
  95090. // * XCHGB m8, r8
  95091. // * XCHGB r8, m8
  95092. //
  95093. func (self *Program) XCHGB(v0 interface{}, v1 interface{}) *Instruction {
  95094. p := self.alloc("XCHGB", 2, Operands { v0, v1 })
  95095. // XCHGB r8, r8
  95096. if isReg8(v0) && isReg8(v1) {
  95097. p.domain = DomainGeneric
  95098. p.add(0, func(m *_Encoding, v []interface{}) {
  95099. m.rexo(hcode(v[0]), v[1], isReg8REX(v[0]) || isReg8REX(v[1]))
  95100. m.emit(0x86)
  95101. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  95102. })
  95103. p.add(0, func(m *_Encoding, v []interface{}) {
  95104. m.rexo(hcode(v[1]), v[0], isReg8REX(v[0]) || isReg8REX(v[1]))
  95105. m.emit(0x86)
  95106. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  95107. })
  95108. }
  95109. // XCHGB m8, r8
  95110. if isM8(v0) && isReg8(v1) {
  95111. p.domain = DomainGeneric
  95112. p.add(0, func(m *_Encoding, v []interface{}) {
  95113. m.rexo(hcode(v[1]), addr(v[0]), isReg8REX(v[1]))
  95114. m.emit(0x86)
  95115. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  95116. })
  95117. }
  95118. // XCHGB r8, m8
  95119. if isReg8(v0) && isM8(v1) {
  95120. p.domain = DomainGeneric
  95121. p.add(0, func(m *_Encoding, v []interface{}) {
  95122. m.rexo(hcode(v[0]), addr(v[1]), isReg8REX(v[0]))
  95123. m.emit(0x86)
  95124. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  95125. })
  95126. }
  95127. if p.len == 0 {
  95128. panic("invalid operands for XCHGB")
  95129. }
  95130. return p
  95131. }
  95132. // XCHGL performs "Exchange Register/Memory with Register".
  95133. //
  95134. // Mnemonic : XCHG
  95135. // Supported forms : (5 forms)
  95136. //
  95137. // * XCHGL r32, eax
  95138. // * XCHGL eax, r32
  95139. // * XCHGL r32, r32
  95140. // * XCHGL m32, r32
  95141. // * XCHGL r32, m32
  95142. //
  95143. func (self *Program) XCHGL(v0 interface{}, v1 interface{}) *Instruction {
  95144. p := self.alloc("XCHGL", 2, Operands { v0, v1 })
  95145. // XCHGL r32, eax
  95146. if isReg32(v0) && v1 == EAX {
  95147. p.domain = DomainGeneric
  95148. p.add(0, func(m *_Encoding, v []interface{}) {
  95149. m.rexo(0, v[0], false)
  95150. m.emit(0x90 | lcode(v[0]))
  95151. })
  95152. }
  95153. // XCHGL eax, r32
  95154. if v0 == EAX && isReg32(v1) {
  95155. p.domain = DomainGeneric
  95156. p.add(0, func(m *_Encoding, v []interface{}) {
  95157. m.rexo(0, v[1], false)
  95158. m.emit(0x90 | lcode(v[1]))
  95159. })
  95160. }
  95161. // XCHGL r32, r32
  95162. if isReg32(v0) && isReg32(v1) {
  95163. p.domain = DomainGeneric
  95164. p.add(0, func(m *_Encoding, v []interface{}) {
  95165. m.rexo(hcode(v[0]), v[1], false)
  95166. m.emit(0x87)
  95167. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  95168. })
  95169. p.add(0, func(m *_Encoding, v []interface{}) {
  95170. m.rexo(hcode(v[1]), v[0], false)
  95171. m.emit(0x87)
  95172. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  95173. })
  95174. }
  95175. // XCHGL m32, r32
  95176. if isM32(v0) && isReg32(v1) {
  95177. p.domain = DomainGeneric
  95178. p.add(0, func(m *_Encoding, v []interface{}) {
  95179. m.rexo(hcode(v[1]), addr(v[0]), false)
  95180. m.emit(0x87)
  95181. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  95182. })
  95183. }
  95184. // XCHGL r32, m32
  95185. if isReg32(v0) && isM32(v1) {
  95186. p.domain = DomainGeneric
  95187. p.add(0, func(m *_Encoding, v []interface{}) {
  95188. m.rexo(hcode(v[0]), addr(v[1]), false)
  95189. m.emit(0x87)
  95190. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  95191. })
  95192. }
  95193. if p.len == 0 {
  95194. panic("invalid operands for XCHGL")
  95195. }
  95196. return p
  95197. }
  95198. // XCHGQ performs "Exchange Register/Memory with Register".
  95199. //
  95200. // Mnemonic : XCHG
  95201. // Supported forms : (5 forms)
  95202. //
  95203. // * XCHGQ r64, rax
  95204. // * XCHGQ rax, r64
  95205. // * XCHGQ r64, r64
  95206. // * XCHGQ m64, r64
  95207. // * XCHGQ r64, m64
  95208. //
  95209. func (self *Program) XCHGQ(v0 interface{}, v1 interface{}) *Instruction {
  95210. p := self.alloc("XCHGQ", 2, Operands { v0, v1 })
  95211. // XCHGQ r64, rax
  95212. if isReg64(v0) && v1 == RAX {
  95213. p.domain = DomainGeneric
  95214. p.add(0, func(m *_Encoding, v []interface{}) {
  95215. m.emit(0x48 | hcode(v[0]))
  95216. m.emit(0x90 | lcode(v[0]))
  95217. })
  95218. }
  95219. // XCHGQ rax, r64
  95220. if v0 == RAX && isReg64(v1) {
  95221. p.domain = DomainGeneric
  95222. p.add(0, func(m *_Encoding, v []interface{}) {
  95223. m.emit(0x48 | hcode(v[1]))
  95224. m.emit(0x90 | lcode(v[1]))
  95225. })
  95226. }
  95227. // XCHGQ r64, r64
  95228. if isReg64(v0) && isReg64(v1) {
  95229. p.domain = DomainGeneric
  95230. p.add(0, func(m *_Encoding, v []interface{}) {
  95231. m.emit(0x48 | hcode(v[0]) << 2 | hcode(v[1]))
  95232. m.emit(0x87)
  95233. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  95234. })
  95235. p.add(0, func(m *_Encoding, v []interface{}) {
  95236. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  95237. m.emit(0x87)
  95238. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  95239. })
  95240. }
  95241. // XCHGQ m64, r64
  95242. if isM64(v0) && isReg64(v1) {
  95243. p.domain = DomainGeneric
  95244. p.add(0, func(m *_Encoding, v []interface{}) {
  95245. m.rexm(1, hcode(v[1]), addr(v[0]))
  95246. m.emit(0x87)
  95247. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  95248. })
  95249. }
  95250. // XCHGQ r64, m64
  95251. if isReg64(v0) && isM64(v1) {
  95252. p.domain = DomainGeneric
  95253. p.add(0, func(m *_Encoding, v []interface{}) {
  95254. m.rexm(1, hcode(v[0]), addr(v[1]))
  95255. m.emit(0x87)
  95256. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  95257. })
  95258. }
  95259. if p.len == 0 {
  95260. panic("invalid operands for XCHGQ")
  95261. }
  95262. return p
  95263. }
  95264. // XCHGW performs "Exchange Register/Memory with Register".
  95265. //
  95266. // Mnemonic : XCHG
  95267. // Supported forms : (5 forms)
  95268. //
  95269. // * XCHGW r16, ax
  95270. // * XCHGW ax, r16
  95271. // * XCHGW r16, r16
  95272. // * XCHGW m16, r16
  95273. // * XCHGW r16, m16
  95274. //
  95275. func (self *Program) XCHGW(v0 interface{}, v1 interface{}) *Instruction {
  95276. p := self.alloc("XCHGW", 2, Operands { v0, v1 })
  95277. // XCHGW r16, ax
  95278. if isReg16(v0) && v1 == AX {
  95279. p.domain = DomainGeneric
  95280. p.add(0, func(m *_Encoding, v []interface{}) {
  95281. m.emit(0x66)
  95282. m.rexo(0, v[0], false)
  95283. m.emit(0x90 | lcode(v[0]))
  95284. })
  95285. }
  95286. // XCHGW ax, r16
  95287. if v0 == AX && isReg16(v1) {
  95288. p.domain = DomainGeneric
  95289. p.add(0, func(m *_Encoding, v []interface{}) {
  95290. m.emit(0x66)
  95291. m.rexo(0, v[1], false)
  95292. m.emit(0x90 | lcode(v[1]))
  95293. })
  95294. }
  95295. // XCHGW r16, r16
  95296. if isReg16(v0) && isReg16(v1) {
  95297. p.domain = DomainGeneric
  95298. p.add(0, func(m *_Encoding, v []interface{}) {
  95299. m.emit(0x66)
  95300. m.rexo(hcode(v[0]), v[1], false)
  95301. m.emit(0x87)
  95302. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  95303. })
  95304. p.add(0, func(m *_Encoding, v []interface{}) {
  95305. m.emit(0x66)
  95306. m.rexo(hcode(v[1]), v[0], false)
  95307. m.emit(0x87)
  95308. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  95309. })
  95310. }
  95311. // XCHGW m16, r16
  95312. if isM16(v0) && isReg16(v1) {
  95313. p.domain = DomainGeneric
  95314. p.add(0, func(m *_Encoding, v []interface{}) {
  95315. m.emit(0x66)
  95316. m.rexo(hcode(v[1]), addr(v[0]), false)
  95317. m.emit(0x87)
  95318. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  95319. })
  95320. }
  95321. // XCHGW r16, m16
  95322. if isReg16(v0) && isM16(v1) {
  95323. p.domain = DomainGeneric
  95324. p.add(0, func(m *_Encoding, v []interface{}) {
  95325. m.emit(0x66)
  95326. m.rexo(hcode(v[0]), addr(v[1]), false)
  95327. m.emit(0x87)
  95328. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  95329. })
  95330. }
  95331. if p.len == 0 {
  95332. panic("invalid operands for XCHGW")
  95333. }
  95334. return p
  95335. }
  95336. // XGETBV performs "Get Value of Extended Control Register".
  95337. //
  95338. // Mnemonic : XGETBV
  95339. // Supported forms : (1 form)
  95340. //
  95341. // * XGETBV
  95342. //
  95343. func (self *Program) XGETBV() *Instruction {
  95344. p := self.alloc("XGETBV", 0, Operands { })
  95345. // XGETBV
  95346. p.domain = DomainGeneric
  95347. p.add(0, func(m *_Encoding, v []interface{}) {
  95348. m.emit(0x0f)
  95349. m.emit(0x01)
  95350. m.emit(0xd0)
  95351. })
  95352. return p
  95353. }
  95354. // XLATB performs "Table Look-up Translation".
  95355. //
  95356. // Mnemonic : XLATB
  95357. // Supported forms : (2 forms)
  95358. //
  95359. // * XLATB
  95360. // * XLATB
  95361. //
  95362. func (self *Program) XLATB() *Instruction {
  95363. p := self.alloc("XLATB", 0, Operands { })
  95364. // XLATB
  95365. p.domain = DomainMisc
  95366. p.add(0, func(m *_Encoding, v []interface{}) {
  95367. m.emit(0xd7)
  95368. })
  95369. // XLATB
  95370. p.domain = DomainMisc
  95371. p.add(0, func(m *_Encoding, v []interface{}) {
  95372. m.emit(0x48)
  95373. m.emit(0xd7)
  95374. })
  95375. return p
  95376. }
  95377. // XORB performs "Logical Exclusive OR".
  95378. //
  95379. // Mnemonic : XOR
  95380. // Supported forms : (6 forms)
  95381. //
  95382. // * XORB imm8, al
  95383. // * XORB imm8, r8
  95384. // * XORB r8, r8
  95385. // * XORB m8, r8
  95386. // * XORB imm8, m8
  95387. // * XORB r8, m8
  95388. //
  95389. func (self *Program) XORB(v0 interface{}, v1 interface{}) *Instruction {
  95390. p := self.alloc("XORB", 2, Operands { v0, v1 })
  95391. // XORB imm8, al
  95392. if isImm8(v0) && v1 == AL {
  95393. p.domain = DomainGeneric
  95394. p.add(0, func(m *_Encoding, v []interface{}) {
  95395. m.emit(0x34)
  95396. m.imm1(toImmAny(v[0]))
  95397. })
  95398. }
  95399. // XORB imm8, r8
  95400. if isImm8(v0) && isReg8(v1) {
  95401. p.domain = DomainGeneric
  95402. p.add(0, func(m *_Encoding, v []interface{}) {
  95403. m.rexo(0, v[1], isReg8REX(v[1]))
  95404. m.emit(0x80)
  95405. m.emit(0xf0 | lcode(v[1]))
  95406. m.imm1(toImmAny(v[0]))
  95407. })
  95408. }
  95409. // XORB r8, r8
  95410. if isReg8(v0) && isReg8(v1) {
  95411. p.domain = DomainGeneric
  95412. p.add(0, func(m *_Encoding, v []interface{}) {
  95413. m.rexo(hcode(v[0]), v[1], isReg8REX(v[0]) || isReg8REX(v[1]))
  95414. m.emit(0x30)
  95415. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  95416. })
  95417. p.add(0, func(m *_Encoding, v []interface{}) {
  95418. m.rexo(hcode(v[1]), v[0], isReg8REX(v[0]) || isReg8REX(v[1]))
  95419. m.emit(0x32)
  95420. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  95421. })
  95422. }
  95423. // XORB m8, r8
  95424. if isM8(v0) && isReg8(v1) {
  95425. p.domain = DomainGeneric
  95426. p.add(0, func(m *_Encoding, v []interface{}) {
  95427. m.rexo(hcode(v[1]), addr(v[0]), isReg8REX(v[1]))
  95428. m.emit(0x32)
  95429. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  95430. })
  95431. }
  95432. // XORB imm8, m8
  95433. if isImm8(v0) && isM8(v1) {
  95434. p.domain = DomainGeneric
  95435. p.add(0, func(m *_Encoding, v []interface{}) {
  95436. m.rexo(0, addr(v[1]), false)
  95437. m.emit(0x80)
  95438. m.mrsd(6, addr(v[1]), 1)
  95439. m.imm1(toImmAny(v[0]))
  95440. })
  95441. }
  95442. // XORB r8, m8
  95443. if isReg8(v0) && isM8(v1) {
  95444. p.domain = DomainGeneric
  95445. p.add(0, func(m *_Encoding, v []interface{}) {
  95446. m.rexo(hcode(v[0]), addr(v[1]), isReg8REX(v[0]))
  95447. m.emit(0x30)
  95448. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  95449. })
  95450. }
  95451. if p.len == 0 {
  95452. panic("invalid operands for XORB")
  95453. }
  95454. return p
  95455. }
  95456. // XORL performs "Logical Exclusive OR".
  95457. //
  95458. // Mnemonic : XOR
  95459. // Supported forms : (8 forms)
  95460. //
  95461. // * XORL imm32, eax
  95462. // * XORL imm8, r32
  95463. // * XORL imm32, r32
  95464. // * XORL r32, r32
  95465. // * XORL m32, r32
  95466. // * XORL imm8, m32
  95467. // * XORL imm32, m32
  95468. // * XORL r32, m32
  95469. //
  95470. func (self *Program) XORL(v0 interface{}, v1 interface{}) *Instruction {
  95471. p := self.alloc("XORL", 2, Operands { v0, v1 })
  95472. // XORL imm32, eax
  95473. if isImm32(v0) && v1 == EAX {
  95474. p.domain = DomainGeneric
  95475. p.add(0, func(m *_Encoding, v []interface{}) {
  95476. m.emit(0x35)
  95477. m.imm4(toImmAny(v[0]))
  95478. })
  95479. }
  95480. // XORL imm8, r32
  95481. if isImm8Ext(v0, 4) && isReg32(v1) {
  95482. p.domain = DomainGeneric
  95483. p.add(0, func(m *_Encoding, v []interface{}) {
  95484. m.rexo(0, v[1], false)
  95485. m.emit(0x83)
  95486. m.emit(0xf0 | lcode(v[1]))
  95487. m.imm1(toImmAny(v[0]))
  95488. })
  95489. }
  95490. // XORL imm32, r32
  95491. if isImm32(v0) && isReg32(v1) {
  95492. p.domain = DomainGeneric
  95493. p.add(0, func(m *_Encoding, v []interface{}) {
  95494. m.rexo(0, v[1], false)
  95495. m.emit(0x81)
  95496. m.emit(0xf0 | lcode(v[1]))
  95497. m.imm4(toImmAny(v[0]))
  95498. })
  95499. }
  95500. // XORL r32, r32
  95501. if isReg32(v0) && isReg32(v1) {
  95502. p.domain = DomainGeneric
  95503. p.add(0, func(m *_Encoding, v []interface{}) {
  95504. m.rexo(hcode(v[0]), v[1], false)
  95505. m.emit(0x31)
  95506. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  95507. })
  95508. p.add(0, func(m *_Encoding, v []interface{}) {
  95509. m.rexo(hcode(v[1]), v[0], false)
  95510. m.emit(0x33)
  95511. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  95512. })
  95513. }
  95514. // XORL m32, r32
  95515. if isM32(v0) && isReg32(v1) {
  95516. p.domain = DomainGeneric
  95517. p.add(0, func(m *_Encoding, v []interface{}) {
  95518. m.rexo(hcode(v[1]), addr(v[0]), false)
  95519. m.emit(0x33)
  95520. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  95521. })
  95522. }
  95523. // XORL imm8, m32
  95524. if isImm8Ext(v0, 4) && isM32(v1) {
  95525. p.domain = DomainGeneric
  95526. p.add(0, func(m *_Encoding, v []interface{}) {
  95527. m.rexo(0, addr(v[1]), false)
  95528. m.emit(0x83)
  95529. m.mrsd(6, addr(v[1]), 1)
  95530. m.imm1(toImmAny(v[0]))
  95531. })
  95532. }
  95533. // XORL imm32, m32
  95534. if isImm32(v0) && isM32(v1) {
  95535. p.domain = DomainGeneric
  95536. p.add(0, func(m *_Encoding, v []interface{}) {
  95537. m.rexo(0, addr(v[1]), false)
  95538. m.emit(0x81)
  95539. m.mrsd(6, addr(v[1]), 1)
  95540. m.imm4(toImmAny(v[0]))
  95541. })
  95542. }
  95543. // XORL r32, m32
  95544. if isReg32(v0) && isM32(v1) {
  95545. p.domain = DomainGeneric
  95546. p.add(0, func(m *_Encoding, v []interface{}) {
  95547. m.rexo(hcode(v[0]), addr(v[1]), false)
  95548. m.emit(0x31)
  95549. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  95550. })
  95551. }
  95552. if p.len == 0 {
  95553. panic("invalid operands for XORL")
  95554. }
  95555. return p
  95556. }
  95557. // XORPD performs "Bitwise Logical XOR for Double-Precision Floating-Point Values".
  95558. //
  95559. // Mnemonic : XORPD
  95560. // Supported forms : (2 forms)
  95561. //
  95562. // * XORPD xmm, xmm [SSE2]
  95563. // * XORPD m128, xmm [SSE2]
  95564. //
  95565. func (self *Program) XORPD(v0 interface{}, v1 interface{}) *Instruction {
  95566. p := self.alloc("XORPD", 2, Operands { v0, v1 })
  95567. // XORPD xmm, xmm
  95568. if isXMM(v0) && isXMM(v1) {
  95569. self.require(ISA_SSE2)
  95570. p.domain = DomainMMXSSE
  95571. p.add(0, func(m *_Encoding, v []interface{}) {
  95572. m.emit(0x66)
  95573. m.rexo(hcode(v[1]), v[0], false)
  95574. m.emit(0x0f)
  95575. m.emit(0x57)
  95576. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  95577. })
  95578. }
  95579. // XORPD m128, xmm
  95580. if isM128(v0) && isXMM(v1) {
  95581. self.require(ISA_SSE2)
  95582. p.domain = DomainMMXSSE
  95583. p.add(0, func(m *_Encoding, v []interface{}) {
  95584. m.emit(0x66)
  95585. m.rexo(hcode(v[1]), addr(v[0]), false)
  95586. m.emit(0x0f)
  95587. m.emit(0x57)
  95588. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  95589. })
  95590. }
  95591. if p.len == 0 {
  95592. panic("invalid operands for XORPD")
  95593. }
  95594. return p
  95595. }
  95596. // XORPS performs "Bitwise Logical XOR for Single-Precision Floating-Point Values".
  95597. //
  95598. // Mnemonic : XORPS
  95599. // Supported forms : (2 forms)
  95600. //
  95601. // * XORPS xmm, xmm [SSE]
  95602. // * XORPS m128, xmm [SSE]
  95603. //
  95604. func (self *Program) XORPS(v0 interface{}, v1 interface{}) *Instruction {
  95605. p := self.alloc("XORPS", 2, Operands { v0, v1 })
  95606. // XORPS xmm, xmm
  95607. if isXMM(v0) && isXMM(v1) {
  95608. self.require(ISA_SSE)
  95609. p.domain = DomainMMXSSE
  95610. p.add(0, func(m *_Encoding, v []interface{}) {
  95611. m.rexo(hcode(v[1]), v[0], false)
  95612. m.emit(0x0f)
  95613. m.emit(0x57)
  95614. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  95615. })
  95616. }
  95617. // XORPS m128, xmm
  95618. if isM128(v0) && isXMM(v1) {
  95619. self.require(ISA_SSE)
  95620. p.domain = DomainMMXSSE
  95621. p.add(0, func(m *_Encoding, v []interface{}) {
  95622. m.rexo(hcode(v[1]), addr(v[0]), false)
  95623. m.emit(0x0f)
  95624. m.emit(0x57)
  95625. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  95626. })
  95627. }
  95628. if p.len == 0 {
  95629. panic("invalid operands for XORPS")
  95630. }
  95631. return p
  95632. }
  95633. // XORQ performs "Logical Exclusive OR".
  95634. //
  95635. // Mnemonic : XOR
  95636. // Supported forms : (8 forms)
  95637. //
  95638. // * XORQ imm32, rax
  95639. // * XORQ imm8, r64
  95640. // * XORQ imm32, r64
  95641. // * XORQ r64, r64
  95642. // * XORQ m64, r64
  95643. // * XORQ imm8, m64
  95644. // * XORQ imm32, m64
  95645. // * XORQ r64, m64
  95646. //
  95647. func (self *Program) XORQ(v0 interface{}, v1 interface{}) *Instruction {
  95648. p := self.alloc("XORQ", 2, Operands { v0, v1 })
  95649. // XORQ imm32, rax
  95650. if isImm32(v0) && v1 == RAX {
  95651. p.domain = DomainGeneric
  95652. p.add(0, func(m *_Encoding, v []interface{}) {
  95653. m.emit(0x48)
  95654. m.emit(0x35)
  95655. m.imm4(toImmAny(v[0]))
  95656. })
  95657. }
  95658. // XORQ imm8, r64
  95659. if isImm8Ext(v0, 8) && isReg64(v1) {
  95660. p.domain = DomainGeneric
  95661. p.add(0, func(m *_Encoding, v []interface{}) {
  95662. m.emit(0x48 | hcode(v[1]))
  95663. m.emit(0x83)
  95664. m.emit(0xf0 | lcode(v[1]))
  95665. m.imm1(toImmAny(v[0]))
  95666. })
  95667. }
  95668. // XORQ imm32, r64
  95669. if isImm32Ext(v0, 8) && isReg64(v1) {
  95670. p.domain = DomainGeneric
  95671. p.add(0, func(m *_Encoding, v []interface{}) {
  95672. m.emit(0x48 | hcode(v[1]))
  95673. m.emit(0x81)
  95674. m.emit(0xf0 | lcode(v[1]))
  95675. m.imm4(toImmAny(v[0]))
  95676. })
  95677. }
  95678. // XORQ r64, r64
  95679. if isReg64(v0) && isReg64(v1) {
  95680. p.domain = DomainGeneric
  95681. p.add(0, func(m *_Encoding, v []interface{}) {
  95682. m.emit(0x48 | hcode(v[0]) << 2 | hcode(v[1]))
  95683. m.emit(0x31)
  95684. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  95685. })
  95686. p.add(0, func(m *_Encoding, v []interface{}) {
  95687. m.emit(0x48 | hcode(v[1]) << 2 | hcode(v[0]))
  95688. m.emit(0x33)
  95689. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  95690. })
  95691. }
  95692. // XORQ m64, r64
  95693. if isM64(v0) && isReg64(v1) {
  95694. p.domain = DomainGeneric
  95695. p.add(0, func(m *_Encoding, v []interface{}) {
  95696. m.rexm(1, hcode(v[1]), addr(v[0]))
  95697. m.emit(0x33)
  95698. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  95699. })
  95700. }
  95701. // XORQ imm8, m64
  95702. if isImm8Ext(v0, 8) && isM64(v1) {
  95703. p.domain = DomainGeneric
  95704. p.add(0, func(m *_Encoding, v []interface{}) {
  95705. m.rexm(1, 0, addr(v[1]))
  95706. m.emit(0x83)
  95707. m.mrsd(6, addr(v[1]), 1)
  95708. m.imm1(toImmAny(v[0]))
  95709. })
  95710. }
  95711. // XORQ imm32, m64
  95712. if isImm32Ext(v0, 8) && isM64(v1) {
  95713. p.domain = DomainGeneric
  95714. p.add(0, func(m *_Encoding, v []interface{}) {
  95715. m.rexm(1, 0, addr(v[1]))
  95716. m.emit(0x81)
  95717. m.mrsd(6, addr(v[1]), 1)
  95718. m.imm4(toImmAny(v[0]))
  95719. })
  95720. }
  95721. // XORQ r64, m64
  95722. if isReg64(v0) && isM64(v1) {
  95723. p.domain = DomainGeneric
  95724. p.add(0, func(m *_Encoding, v []interface{}) {
  95725. m.rexm(1, hcode(v[0]), addr(v[1]))
  95726. m.emit(0x31)
  95727. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  95728. })
  95729. }
  95730. if p.len == 0 {
  95731. panic("invalid operands for XORQ")
  95732. }
  95733. return p
  95734. }
  95735. // XORW performs "Logical Exclusive OR".
  95736. //
  95737. // Mnemonic : XOR
  95738. // Supported forms : (8 forms)
  95739. //
  95740. // * XORW imm16, ax
  95741. // * XORW imm8, r16
  95742. // * XORW imm16, r16
  95743. // * XORW r16, r16
  95744. // * XORW m16, r16
  95745. // * XORW imm8, m16
  95746. // * XORW imm16, m16
  95747. // * XORW r16, m16
  95748. //
  95749. func (self *Program) XORW(v0 interface{}, v1 interface{}) *Instruction {
  95750. p := self.alloc("XORW", 2, Operands { v0, v1 })
  95751. // XORW imm16, ax
  95752. if isImm16(v0) && v1 == AX {
  95753. p.domain = DomainGeneric
  95754. p.add(0, func(m *_Encoding, v []interface{}) {
  95755. m.emit(0x66)
  95756. m.emit(0x35)
  95757. m.imm2(toImmAny(v[0]))
  95758. })
  95759. }
  95760. // XORW imm8, r16
  95761. if isImm8Ext(v0, 2) && isReg16(v1) {
  95762. p.domain = DomainGeneric
  95763. p.add(0, func(m *_Encoding, v []interface{}) {
  95764. m.emit(0x66)
  95765. m.rexo(0, v[1], false)
  95766. m.emit(0x83)
  95767. m.emit(0xf0 | lcode(v[1]))
  95768. m.imm1(toImmAny(v[0]))
  95769. })
  95770. }
  95771. // XORW imm16, r16
  95772. if isImm16(v0) && isReg16(v1) {
  95773. p.domain = DomainGeneric
  95774. p.add(0, func(m *_Encoding, v []interface{}) {
  95775. m.emit(0x66)
  95776. m.rexo(0, v[1], false)
  95777. m.emit(0x81)
  95778. m.emit(0xf0 | lcode(v[1]))
  95779. m.imm2(toImmAny(v[0]))
  95780. })
  95781. }
  95782. // XORW r16, r16
  95783. if isReg16(v0) && isReg16(v1) {
  95784. p.domain = DomainGeneric
  95785. p.add(0, func(m *_Encoding, v []interface{}) {
  95786. m.emit(0x66)
  95787. m.rexo(hcode(v[0]), v[1], false)
  95788. m.emit(0x31)
  95789. m.emit(0xc0 | lcode(v[0]) << 3 | lcode(v[1]))
  95790. })
  95791. p.add(0, func(m *_Encoding, v []interface{}) {
  95792. m.emit(0x66)
  95793. m.rexo(hcode(v[1]), v[0], false)
  95794. m.emit(0x33)
  95795. m.emit(0xc0 | lcode(v[1]) << 3 | lcode(v[0]))
  95796. })
  95797. }
  95798. // XORW m16, r16
  95799. if isM16(v0) && isReg16(v1) {
  95800. p.domain = DomainGeneric
  95801. p.add(0, func(m *_Encoding, v []interface{}) {
  95802. m.emit(0x66)
  95803. m.rexo(hcode(v[1]), addr(v[0]), false)
  95804. m.emit(0x33)
  95805. m.mrsd(lcode(v[1]), addr(v[0]), 1)
  95806. })
  95807. }
  95808. // XORW imm8, m16
  95809. if isImm8Ext(v0, 2) && isM16(v1) {
  95810. p.domain = DomainGeneric
  95811. p.add(0, func(m *_Encoding, v []interface{}) {
  95812. m.emit(0x66)
  95813. m.rexo(0, addr(v[1]), false)
  95814. m.emit(0x83)
  95815. m.mrsd(6, addr(v[1]), 1)
  95816. m.imm1(toImmAny(v[0]))
  95817. })
  95818. }
  95819. // XORW imm16, m16
  95820. if isImm16(v0) && isM16(v1) {
  95821. p.domain = DomainGeneric
  95822. p.add(0, func(m *_Encoding, v []interface{}) {
  95823. m.emit(0x66)
  95824. m.rexo(0, addr(v[1]), false)
  95825. m.emit(0x81)
  95826. m.mrsd(6, addr(v[1]), 1)
  95827. m.imm2(toImmAny(v[0]))
  95828. })
  95829. }
  95830. // XORW r16, m16
  95831. if isReg16(v0) && isM16(v1) {
  95832. p.domain = DomainGeneric
  95833. p.add(0, func(m *_Encoding, v []interface{}) {
  95834. m.emit(0x66)
  95835. m.rexo(hcode(v[0]), addr(v[1]), false)
  95836. m.emit(0x31)
  95837. m.mrsd(lcode(v[0]), addr(v[1]), 1)
  95838. })
  95839. }
  95840. if p.len == 0 {
  95841. panic("invalid operands for XORW")
  95842. }
  95843. return p
  95844. }