asmtestgenerator.pas 251 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406
  1. {
  2. Copyright (C) <avx-testfile-generator> <Torsten Grundke>
  3. This source is free software; you can redistribute it and/or modify it under
  4. the terms of the GNU General Public License as published by the Free
  5. Software Foundation; either version 2 of the License, or (at your option)
  6. any later version.
  7. This code is distributed in the hope that it will be useful, but WITHOUT ANY
  8. WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9. FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  10. details.
  11. A copy of the GNU General Public License is available on the World Wide Web
  12. at <http://www.gnu.org/copyleft/gpl.html>. You can also obtain it by writing
  13. to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  14. MA 02110-1301, USA.
  15. }
  16. {$mode objfpc}
  17. unit asmtestgenerator;
  18. interface
  19. uses BaseList, Classes;
  20. type
  21. TOpType = (otUnknown, otXMMReg, otXMMRM, otXMMRM16, otXMMRM8, otYMMReg, otYMMRM, otZMMReg, otZMMRM, otEAX, otRAX, otMem32,
  22. otMem8, otMem16, otMem64, otMem128, otMem256, otMem512, otREG64, otREG32, otREG16, otREG8, otRM32, otRM64, otIMM8,
  23. otXMEM32, otXMEM64, otYMEM32, otYMEM64, otZMEM32, otZMEM64,
  24. otB32, otB64, otKREG);
  25. TOpMemType = Set of TOpType;
  26. TAsmCompareMode = (cmKORTESTNC, cmXORTestNZ);
  27. TOpMode = (omUnknown,
  28. omMX, omMY, omMZ,
  29. omXB32, omXB64, omYB32, omYB64, omZB32, omZB64,
  30. omXM, omYM, omZM,
  31. omKXM, omKYM, omKZM,
  32. omKXB32, omKXB64, omKYB32, omKYB64, omKZB32, omKZB64,
  33. omKXB32I, omKXB64I, omKXMI, omKYB32I, omKYB64I, omKYMI, omKZB32I, omKZB64I, omKZMI,
  34. omKMI, omKB32I, omKB64I,
  35. omMXI, omMYI, omMZI,
  36. omXXM, omXXB32, omXXB64, omXMI, omXB32I, omXB64I,
  37. omXXMI, omXXB32I, omXXB64I,
  38. omYYM, omYYB32, omYYB64, omYMI, omYB32I, omYB64I,
  39. omYYMI, omYYB32I, omYYB64I,
  40. omZZM, omZZB32, omZZB64, omZMI, omZB32I, omZB64I,
  41. omZZMI, omZZB32I, omZZB64I);
  42. TOperandListItem = class(TObject)
  43. private
  44. FOpActive: boolean;
  45. FOpNumber: integer;
  46. FOpTyp: TOpType;
  47. FValues: TStringList;
  48. public
  49. constructor Create;
  50. destructor Destroy; override;
  51. property OpNumber: integer read FOpNumber write FOpNumber;
  52. property OpTyp: TOpType read FOpTyp write FOpTyp;
  53. property OpActive: boolean read FOpActive write FOpActive;
  54. property Values: TStringList read FValues;
  55. end;
  56. TOperandList = class(TBaseList)
  57. private
  58. function GetItems(aIndex: integer): TOperandListItem;
  59. public
  60. function Add(aItem: TOperandListItem): integer;
  61. property Items[aIndex: integer]: TOperandListItem read GetItems;
  62. end;
  63. { TAsmTestGenerator }
  64. TAsmTestGenerator = class(TObject)
  65. private
  66. FReg8 : TStringList;
  67. FReg16 : TStringList;
  68. FReg32Base : TStringList;
  69. FReg32Index : TStringList;
  70. FReg64Base : TStringList;
  71. FReg64Index : TStringList;
  72. FReg6432Base : TStringList;
  73. FReg6432Index : TStringList;
  74. FReg32XMMIndex : TStringList;
  75. FReg32YMMIndex : TStringList;
  76. FReg32ZMMIndex : TStringList;
  77. FReg64XMMIndex : TStringList;
  78. FReg64YMMIndex : TStringList;
  79. FReg64ZMMIndex : TStringList;
  80. FRegKREG : TStringList;
  81. Fx64: boolean;
  82. FAVX512: boolean;
  83. FSAE: boolean;
  84. procedure MemRegBaseIndexCombi(const aPrefix, aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
  85. procedure MemRegBaseIndexCombiCDISP8N(const aPrefix, aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
  86. procedure VectorMemRegBaseIndexCombi(const aPrefix, aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
  87. function ParseBaseIndexReg(const aOp: string; var aBaseReg, aIndexReg: string): boolean;
  88. function InternalCalcTestData(const aInst, aOp1, aOp2, aOp3, aOp4: String): TStringList;
  89. function InternalCalcTestDataMREF(const aInst, aOp1, aOp2, aOp3, aOp4: String): TStringList;
  90. function InternalCalcTestDataCDISP8(const aInst, aOp1, aOp2, aOp3, aOp4: String): TStringList;
  91. public
  92. constructor Create;
  93. destructor Destroy; override;
  94. class procedure CalcTestData(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList);
  95. class procedure CalcTestDataMREF(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList);
  96. class procedure CalcTestDataCDisp8(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList);
  97. class procedure CalcTestInstFile;
  98. class procedure ListMemRefState;
  99. property x64: boolean read Fx64;
  100. end;
  101. implementation
  102. uses SysUtils, Dialogs, typinfo;
  103. type
  104. TAsmOp={$i ../../../compiler/x86_64/x8664op.inc}
  105. TAttSuffix = (AttSufNONE,AttSufINT,AttSufFPU,AttSufFPUint,AttSufINTdual,AttSufMM,AttSufMMX,AttSufMMS);
  106. TMemRefSizeInfo = (msiUnknown, msiUnsupported, msiNoSize, msiNoMemRef,
  107. msiMultiple, msiMultipleMinSize8, msiMultipleMinSize16, msiMultipleMinSize32,
  108. msiMultipleMinSize64, msiMultipleMinSize128, msiMultipleminSize256, msiMultipleMinSize512,
  109. msiMemRegSize, msiMemRegx16y32, msiMemRegx16y32z64, msiMemRegx32y64, msiMemRegx32y64z128, msiMemRegx64y128, msiMemRegx64y128z256,
  110. msiMemRegx64y256, msiMemRegx64y256z512,
  111. msiMem8, msiMem16, msiMem32, msiBMem32, msiMem64, msiBMem64, msiMem128, msiMem256, msiMem512,
  112. msiXMem32, msiXMem64, msiYMem32, msiYMem64, msiZMem32, msiZMem64,
  113. msiVMemMultiple, msiVMemRegSize,
  114. msiMemRegConst128,msiMemRegConst256,msiMemRegConst512);
  115. TMemRefSizeInfoBCST = (msbUnknown, msbBCST32, msbBCST64, msbMultiple);
  116. TMemRefSizeInfoBCSTType = (btUnknown, bt1to2, bt1to4, bt1to8, bt1to16);
  117. TEVEXTupleState = (etsUnknown, etsIsTuple, etsNotTuple);
  118. TConstSizeInfo = (csiUnknown, csiMultiple, csiNoSize, csiMem8, csiMem16, csiMem32, csiMem64);
  119. TInsTabMemRefSizeInfoRec = record
  120. MemRefSize : TMemRefSizeInfo;
  121. MemRefSizeBCST : TMemRefSizeInfoBCST;
  122. BCSTXMMMultiplicator : byte;
  123. ExistsSSEAVX : boolean;
  124. ConstSize : TConstSizeInfo;
  125. BCSTTypes : Set of TMemRefSizeInfoBCSTType;
  126. RegXMMSizeMask : int64;
  127. RegYMMSizeMask : int64;
  128. RegZMMSizeMask : int64;
  129. end;
  130. TInsTabMemRefSizeInfoCache=array[TasmOp] of TInsTabMemRefSizeInfoRec;
  131. PInsTabMemRefSizeInfoCache=^TInsTabMemRefSizeInfoCache;
  132. TInsTabCache=array[TasmOp] of longint;
  133. PInsTabCache=^TInsTabCache;
  134. const
  135. instabentries = {$i ../../../compiler/x86_64/x8664nop.inc}
  136. gas_needsuffix:array[tasmop] of TAttSuffix={$i ../../../compiler/x86_64/x8664ats.inc}
  137. MemRefMultiples: set of TMemRefSizeInfo = [msiMultiple, msiMultipleMinSize8,
  138. msiMultipleMinSize16, msiMultipleMinSize32,
  139. msiMultipleMinSize64, msiMultipleMinSize128,
  140. msiMultipleMinSize256, msiMultipleMinSize512,
  141. msiVMemMultiple];
  142. MemRefSizeInfoVMems: Set of TMemRefSizeInfo = [msiXMem32, msiXMem64, msiYMem32, msiYMem64,
  143. msiZMem32, msiZMem64,
  144. msiVMemMultiple, msiVMemRegSize];
  145. MEMTYPES: TOpMemType = [otXMMRM, otXMMRM16, otXMMRM8, otYMMRM, otZMMRM,
  146. otMem8, otMem16, otMem32, otMem64, otMem128, otMem256, otMem512,
  147. otRM32, otRM64];
  148. BMEMTYPES: TOpMemType = [otB32, otB64];
  149. var
  150. InsTabCache : PInsTabCache;
  151. InsTabMemRefSizeInfoCache: PInsTabMemRefSizeInfoCache;
  152. type
  153. op2strtable=array[tasmop] of string[16];
  154. {Instruction flags }
  155. tinsflag = (
  156. { please keep these in order and in sync with IF_SMASK }
  157. IF_SM, { size match first two operands }
  158. IF_SM2,
  159. IF_SB, { unsized operands can't be non-byte }
  160. IF_SW, { unsized operands can't be non-word }
  161. IF_SD, { unsized operands can't be nondword }
  162. { unsized argument spec }
  163. { please keep these in order and in sync with IF_ARMASK }
  164. IF_AR0, { SB, SW, SD applies to argument 0 }
  165. IF_AR1, { SB, SW, SD applies to argument 1 }
  166. IF_AR2, { SB, SW, SD applies to argument 2 }
  167. IF_PRIV, { it's a privileged instruction }
  168. IF_SMM, { it's only valid in SMM }
  169. IF_PROT, { it's protected mode only }
  170. IF_NOX86_64, { removed instruction in x86_64 }
  171. IF_UNDOC, { it's an undocumented instruction }
  172. IF_FPU, { it's an FPU instruction }
  173. IF_MMX, { it's an MMX instruction }
  174. { it's a 3DNow! instruction }
  175. IF_3DNOW,
  176. { it's a SSE (KNI, MMX2) instruction }
  177. IF_SSE,
  178. { SSE2 instructions }
  179. IF_SSE2,
  180. { SSE3 instructions }
  181. IF_SSE3,
  182. { SSE64 instructions }
  183. IF_SSE64,
  184. { SVM instructions }
  185. IF_SVM,
  186. { SSE4 instructions }
  187. IF_SSE4,
  188. IF_SSSE3,
  189. IF_SSE41,
  190. IF_SSE42,
  191. IF_MOVBE,
  192. IF_CLMUL,
  193. IF_AVX,
  194. IF_AVX2,
  195. IF_AVX512,
  196. IF_BMI1,
  197. IF_BMI2,
  198. { Intel ADX (Multi-Precision Add-Carry Instruction Extensions) }
  199. IF_ADX,
  200. IF_16BITONLY,
  201. IF_FMA,
  202. IF_FMA4,
  203. IF_TSX,
  204. IF_RAND,
  205. IF_XSAVE,
  206. IF_PREFETCHWT1,
  207. IF_SHA,
  208. { mask for processor level }
  209. { please keep these in order and in sync with IF_PLEVEL }
  210. IF_8086, { 8086 instruction }
  211. IF_186, { 186+ instruction }
  212. IF_286, { 286+ instruction }
  213. IF_386, { 386+ instruction }
  214. IF_486, { 486+ instruction }
  215. IF_PENT, { Pentium instruction }
  216. IF_P6, { P6 instruction }
  217. IF_KATMAI, { Katmai instructions }
  218. IF_WILLAMETTE, { Willamette instructions }
  219. IF_PRESCOTT, { Prescott instructions }
  220. IF_X86_64,
  221. IF_SANDYBRIDGE, { Sandybridge-specific instruction }
  222. IF_NEC, { NEC V20/V30 instruction }
  223. { the following are not strictly part of the processor level, because
  224. they are never used standalone, but always in combination with a
  225. separate processor level flag. Therefore, they use bits outside of
  226. IF_PLEVEL, otherwise they would mess up the processor level they're
  227. used in combination with.
  228. The following combinations are currently used:
  229. [IF_AMD, IF_P6],
  230. [IF_CYRIX, IF_486],
  231. [IF_CYRIX, IF_PENT],
  232. [IF_CYRIX, IF_P6] }
  233. IF_CYRIX, { Cyrix, Centaur or VIA-specific instruction }
  234. IF_AMD, { AMD-specific instruction }
  235. { added flags }
  236. IF_PRE, { it's a prefix instruction }
  237. IF_PASS2, { if the instruction can change in a second pass }
  238. IF_IMM4, { immediate operand is a nibble (must be in range [0..15]) }
  239. IF_IMM3, { immediate operand is a triad (must be in range [0..7]) }
  240. IF_BCST2,
  241. IF_BCST4,
  242. IF_BCST8,
  243. IF_BCST16,
  244. IF_T2, { disp8 - tuple - 2 }
  245. IF_T4, { disp8 - tuple - 4 }
  246. IF_T8, { disp8 - tuple - 8 }
  247. IF_T1S, { disp8 - tuple - 1 scalar }
  248. IF_T1S8,
  249. IF_T1S16,
  250. IF_T1F32,
  251. IF_T1F64,
  252. IF_TMDDUP,
  253. IF_TFV, { disp8 - tuple - full vector }
  254. IF_TFVM, { disp8 - tuple - full vector memory }
  255. IF_TQVM,
  256. IF_TMEM128,
  257. IF_THV,
  258. IF_THVM,
  259. IF_TOVM,
  260. IF_SCL32,
  261. IF_SCL64
  262. );
  263. tinsflags=set of tinsflag;
  264. tinsentry=packed record
  265. opcode : tasmop;
  266. ops : byte;
  267. //optypes : array[0..max_operands-1] of longint;
  268. optypes : array[0..3] of int64; //TG
  269. code : array[0..11] of char;
  270. flags : tinsflags;
  271. end;
  272. pinsentry=^tinsentry;
  273. const
  274. OT_NONE = $00000000;
  275. { Bits 0..7: sizes }
  276. OT_BITS8 = $00000001;
  277. OT_BITS16 = $00000002;
  278. OT_BITS32 = $00000004;
  279. OT_BITS64 = $00000008; { x86_64 and FPU }
  280. //OT_BITS128 = $10000000; { 16 byte SSE }
  281. //OT_BITS256 = $20000000; { 32 byte AVX }
  282. //OT_BITS512 = $40000000; { 64 byte AVX512 }
  283. OT_BITS128 = $20000000; { 16 byte SSE }
  284. OT_BITS256 = $40000000; { 32 byte AVX }
  285. OT_BITS512 = $80000000; { 64 byte AVX512 }
  286. OT_VECTORMASK = $1000000000; { OPTIONAL VECTORMASK AVX512}
  287. OT_VECTORZERO = $2000000000; { OPTIONAL ZERO-FLAG AVX512}
  288. OT_VECTORBCST = $4000000000; { BROADCAST-MEM-FLAG AVX512}
  289. OT_VECTORSAE = $8000000000; { OPTIONAL SAE-FLAG AVX512}
  290. OT_VECTORER = $10000000000; { OPTIONAL ER-FLAG-FLAG AVX512}
  291. OT_BITSB32 = OT_BITS32 or OT_VECTORBCST;
  292. OT_BITSB64 = OT_BITS64 or OT_VECTORBCST;
  293. OT_VECTOR_EXT_MASK = OT_VECTORMASK or OT_VECTORZERO or OT_VECTORBCST;
  294. OT_BITS80 = $00000010; { FPU only }
  295. OT_FAR = $00000020; { this means 16:16 or 16:32, like in CALL/JMP }
  296. OT_NEAR = $00000040;
  297. OT_SHORT = $00000080;
  298. { TODO: FAR/NEAR/SHORT are sizes too, they should be included into size mask,
  299. but this requires adjusting the opcode table }
  300. //OT_SIZE_MASK = $3000001F; { all the size attributes }
  301. OT_SIZE_MASK = $E000001F; { all the size attributes }
  302. OT_NON_SIZE = int64(not int64(OT_SIZE_MASK));
  303. { Bits 8..11: modifiers }
  304. OT_SIGNED = $00000100; { the operand need to be signed -128-127 }
  305. OT_TO = $00000200; { reverse effect in FADD, FSUB &c }
  306. OT_COLON = $00000400; { operand is followed by a colon }
  307. OT_MODIFIER_MASK = $00000F00;
  308. { Bits 12..15: type of operand }
  309. OT_REGISTER = $00001000;
  310. OT_IMMEDIATE = $00002000;
  311. OT_MEMORY = $0000C000; { always includes 'OT_REGMEM' bit as well }
  312. OT_REGMEM = $00008000; { for r/m, ie EA, operands }
  313. OT_TYPE_MASK = OT_REGISTER or OT_IMMEDIATE or OT_MEMORY or OT_REGMEM;
  314. OT_REGNORM = OT_REGISTER or OT_REGMEM; { 'normal' reg, qualifies as EA }
  315. { Bits 20..22, 24..26: register classes
  316. otf_* consts are not used alone, only to build other constants. }
  317. otf_reg_cdt = $00100000;
  318. otf_reg_gpr = $00200000;
  319. otf_reg_sreg = $00400000;
  320. otf_reg_k = $00800000;
  321. otf_reg_fpu = $01000000;
  322. otf_reg_mmx = $02000000;
  323. otf_reg_xmm = $04000000;
  324. otf_reg_ymm = $08000000;
  325. otf_reg_zmm = $10000000;
  326. otf_reg_extra_mask = $0F000000;
  327. { Bits 16..19: subclasses, meaning depends on classes field }
  328. otf_sub0 = $00010000;
  329. otf_sub1 = $00020000;
  330. otf_sub2 = $00040000;
  331. otf_sub3 = $00080000;
  332. OT_REG_SMASK = otf_sub0 or otf_sub1 or otf_sub2 or otf_sub3;
  333. //OT_REG_EXTRA_MASK = $0F000000;
  334. OT_REG_EXTRA_MASK = $1F000000;
  335. OT_REG_TYPMASK = otf_reg_cdt or otf_reg_gpr or otf_reg_sreg or otf_reg_k or otf_reg_extra_mask;
  336. { register class 0: CRx, DRx and TRx }
  337. OT_REG_CDT = OT_REGISTER or otf_reg_cdt or OT_BITS64;
  338. OT_REG_CREG = OT_REG_CDT or otf_sub0; { CRn }
  339. OT_REG_DREG = OT_REG_CDT or otf_sub1; { DRn }
  340. OT_REG_TREG = OT_REG_CDT or otf_sub2; { TRn }
  341. OT_REG_CR4 = OT_REG_CDT or otf_sub3; { CR4 (Pentium only) }
  342. { register class 1: general-purpose registers }
  343. OT_REG_GPR = OT_REGNORM or otf_reg_gpr;
  344. OT_RM_GPR = OT_REGMEM or otf_reg_gpr;
  345. OT_REG8 = OT_REG_GPR or OT_BITS8; { 8-bit GPR }
  346. OT_REG16 = OT_REG_GPR or OT_BITS16;
  347. OT_REG32 = OT_REG_GPR or OT_BITS32;
  348. OT_REG64 = OT_REG_GPR or OT_BITS64;
  349. { GPR subclass 0: accumulator: AL, AX, EAX or RAX }
  350. OT_REG_ACCUM = OT_REG_GPR or otf_sub0;
  351. OT_REG_AL = OT_REG_ACCUM or OT_BITS8;
  352. OT_REG_AX = OT_REG_ACCUM or OT_BITS16;
  353. OT_REG_EAX = OT_REG_ACCUM or OT_BITS32;
  354. OT_REG_RAX = OT_REG_ACCUM or OT_BITS64;
  355. { GPR subclass 1: counter: CL, CX, ECX or RCX }
  356. OT_REG_COUNT = OT_REG_GPR or otf_sub1;
  357. OT_REG_CL = OT_REG_COUNT or OT_BITS8;
  358. OT_REG_CX = OT_REG_COUNT or OT_BITS16;
  359. OT_REG_ECX = OT_REG_COUNT or OT_BITS32;
  360. OT_REG_RCX = OT_REG_COUNT or OT_BITS64;
  361. { GPR subclass 2: data register: DL, DX, EDX or RDX }
  362. OT_REG_DX = OT_REG_GPR or otf_sub2 or OT_BITS16;
  363. OT_REG_EDX = OT_REG_GPR or otf_sub2 or OT_BITS32;
  364. { register class 2: Segment registers }
  365. OT_REG_SREG = OT_REGISTER or otf_reg_sreg or OT_BITS16;
  366. OT_REG_CS = OT_REG_SREG or otf_sub0; { CS }
  367. OT_REG_DESS = OT_REG_SREG or otf_sub1; { DS, ES, SS (non-CS 86 registers) }
  368. OT_REG_FSGS = OT_REG_SREG or otf_sub2; { FS, GS (386 extended registers) }
  369. { register class 3: FPU registers }
  370. OT_FPUREG = OT_REGISTER or otf_reg_fpu;
  371. OT_FPU0 = OT_FPUREG or otf_sub0; { FPU stack register zero }
  372. { register class 4: MMX (both reg and r/m) }
  373. OT_MMXREG = OT_REGNORM or otf_reg_mmx;
  374. OT_MMXRM = OT_REGMEM or otf_reg_mmx;
  375. { register class 5: XMM (both reg and r/m) }
  376. OT_XMMREG = OT_REGNORM or otf_reg_xmm;
  377. OT_XMMRM = OT_REGMEM or otf_reg_xmm;
  378. OT_XMEM32 = OT_REGNORM or otf_reg_xmm or otf_reg_gpr or OT_BITS32;
  379. OT_XMEM32_M = OT_XMEM32 or OT_VECTORMASK;
  380. OT_XMEM64 = OT_REGNORM or otf_reg_xmm or otf_reg_gpr or OT_BITS64;
  381. OT_XMEM64_M = OT_XMEM64 or OT_VECTORMASK;
  382. OT_XMMREG_M = OT_XMMREG or OT_VECTORMASK;
  383. OT_XMMREG_MZ = OT_XMMREG or OT_VECTORMASK or OT_VECTORZERO;
  384. OT_XMMRM_MZ = OT_XMMRM or OT_VECTORMASK or OT_VECTORZERO;
  385. OT_XMMREG_SAE = OT_XMMREG or OT_VECTORSAE;
  386. OT_XMMRM_SAE = OT_XMMRM or OT_VECTORSAE;
  387. OT_XMMREG_ER = OT_XMMREG or OT_VECTORER;
  388. OT_XMMRM_ER = OT_XMMRM or OT_VECTORER;
  389. { register class 5: YMM (both reg and r/m) }
  390. OT_YMMREG = OT_REGNORM or otf_reg_ymm;
  391. OT_YMMRM = OT_REGMEM or otf_reg_ymm;
  392. OT_YMEM32 = OT_REGNORM or otf_reg_ymm or otf_reg_gpr or OT_BITS32;
  393. OT_YMEM32_M = OT_YMEM32 or OT_VECTORMASK;
  394. OT_YMEM64 = OT_REGNORM or otf_reg_ymm or otf_reg_gpr or OT_BITS64;
  395. OT_YMEM64_M = OT_YMEM64 or OT_VECTORMASK;
  396. OT_YMMREG_M = OT_YMMREG or OT_VECTORMASK;
  397. OT_YMMREG_MZ = OT_YMMREG or OT_VECTORMASK or OT_VECTORZERO;
  398. OT_YMMRM_MZ = OT_YMMRM or OT_VECTORMASK or OT_VECTORZERO;
  399. OT_YMMREG_SAE = OT_YMMREG or OT_VECTORSAE;
  400. OT_YMMRM_SAE = OT_YMMRM or OT_VECTORSAE;
  401. OT_YMMREG_ER = OT_YMMREG or OT_VECTORER;
  402. OT_YMMRM_ER = OT_YMMRM or OT_VECTORER;
  403. { register class 5: ZMM (both reg and r/m) }
  404. OT_ZMMREG = OT_REGNORM or otf_reg_zmm;
  405. OT_ZMMRM = OT_REGMEM or otf_reg_zmm;
  406. OT_ZMEM32 = OT_REGNORM or otf_reg_zmm or otf_reg_gpr or OT_BITS32;
  407. OT_ZMEM32_M = OT_ZMEM32 or OT_VECTORMASK;
  408. OT_ZMEM64 = OT_REGNORM or otf_reg_zmm or otf_reg_gpr or OT_BITS64;
  409. OT_ZMEM64_M = OT_ZMEM64 or OT_VECTORMASK;
  410. OT_ZMMREG_M = OT_ZMMREG or OT_VECTORMASK;
  411. OT_ZMMREG_MZ = OT_ZMMREG or OT_VECTORMASK or OT_VECTORZERO;
  412. OT_ZMMRM_MZ = OT_ZMMRM or OT_VECTORMASK or OT_VECTORZERO;
  413. OT_ZMMREG_SAE = OT_ZMMREG or OT_VECTORSAE;
  414. OT_ZMMRM_SAE = OT_ZMMRM or OT_VECTORSAE;
  415. OT_ZMMREG_ER = OT_ZMMREG or OT_VECTORER;
  416. OT_ZMMRM_ER = OT_ZMMRM or OT_VECTORER;
  417. OT_KREG = OT_REGNORM or otf_reg_k;
  418. OT_KREG_M = OT_KREG or OT_VECTORMASK;
  419. { Vector-Memory operands }
  420. OT_VMEM_ANY = OT_XMEM32 or OT_XMEM64 or OT_YMEM32 or OT_YMEM64 or OT_ZMEM32 or OT_ZMEM64;
  421. { Memory operands }
  422. OT_MEM8 = OT_MEMORY or OT_BITS8;
  423. OT_MEM16 = OT_MEMORY or OT_BITS16;
  424. OT_MEM16_M = OT_MEM16 or OT_VECTORMASK;
  425. OT_MEM32 = OT_MEMORY or OT_BITS32;
  426. OT_MEM32_M = OT_MEMORY or OT_BITS32 or OT_VECTORMASK;
  427. OT_BMEM32 = OT_MEMORY or OT_BITS32 or OT_VECTORBCST;
  428. OT_BMEM32_SAE= OT_MEMORY or OT_BITS32 or OT_VECTORBCST or OT_VECTORSAE;
  429. OT_MEM64 = OT_MEMORY or OT_BITS64;
  430. OT_MEM64_M = OT_MEMORY or OT_BITS64 or OT_VECTORMASK;
  431. OT_BMEM64 = OT_MEMORY or OT_BITS64 or OT_VECTORBCST;
  432. OT_BMEM64_SAE= OT_MEMORY or OT_BITS64 or OT_VECTORBCST or OT_VECTORSAE;
  433. OT_MEM128 = OT_MEMORY or OT_BITS128;
  434. OT_MEM128_M = OT_MEMORY or OT_BITS128 or OT_VECTORMASK;
  435. OT_MEM256 = OT_MEMORY or OT_BITS256;
  436. OT_MEM256_M = OT_MEMORY or OT_BITS256 or OT_VECTORMASK;
  437. OT_MEM512 = OT_MEMORY or OT_BITS512;
  438. OT_MEM512_M = OT_MEMORY or OT_BITS512 or OT_VECTORMASK;
  439. OT_MEM80 = OT_MEMORY or OT_BITS80;
  440. OT_MEM_OFFS = OT_MEMORY or otf_sub0; { special type of EA }
  441. { simple [address] offset }
  442. { Matches any type of r/m operand }
  443. OT_MEMORY_ANY = OT_MEMORY or OT_RM_GPR or OT_XMMRM or OT_MMXRM or OT_YMMRM or OT_ZMMRM or OT_REG_EXTRA_MASK;
  444. { Immediate operands }
  445. OT_IMM8 = OT_IMMEDIATE or OT_BITS8;
  446. OT_IMM16 = OT_IMMEDIATE or OT_BITS16;
  447. OT_IMM32 = OT_IMMEDIATE or OT_BITS32;
  448. OT_IMM64 = OT_IMMEDIATE or OT_BITS64;
  449. OT_ONENESS = otf_sub0; { special type of immediate operand }
  450. OT_UNITY = OT_IMMEDIATE or OT_ONENESS; { for shift/rotate instructions }
  451. std_op2str:op2strtable={$i ../../../compiler/x86_64/x8664int.inc}
  452. InsTab:array[0..instabentries-1] of TInsEntry={$i ../../../compiler/x86_64/x8664tab.inc}
  453. procedure BuildInsTabCache;
  454. var
  455. i : longint;
  456. begin
  457. new(instabcache);
  458. FillChar(instabcache^,sizeof(tinstabcache),$ff);
  459. i:=0;
  460. while (i<InsTabEntries) do
  461. begin
  462. if InsTabCache^[InsTab[i].OPcode]=-1 then
  463. InsTabCache^[InsTab[i].OPcode]:=i;
  464. inc(i);
  465. end;
  466. end;
  467. procedure BuildInsTabMemRefSizeInfoCache;
  468. var
  469. AsmOp: TasmOp;
  470. i,j: longint;
  471. insentry : PInsEntry;
  472. MRefInfo: TMemRefSizeInfo;
  473. SConstInfo: TConstSizeInfo;
  474. actRegSize: int64;
  475. actMemSize: int64;
  476. actConstSize: int64;
  477. actRegCount: integer;
  478. actMemCount: integer;
  479. actConstCount: integer;
  480. actRegTypes : int64;
  481. actRegMemTypes: int64;
  482. NewRegSize: int64;
  483. actVMemCount : integer;
  484. actVMemTypes : int64;
  485. RegMMXSizeMask: int64;
  486. RegXMMSizeMask: int64;
  487. RegYMMSizeMask: int64;
  488. RegZMMSizeMask: int64;
  489. RegMMXConstSizeMask: int64;
  490. RegXMMConstSizeMask: int64;
  491. RegYMMConstSizeMask: int64;
  492. RegZMMConstSizeMask: int64;
  493. RegBCSTSizeMask: int64;
  494. RegBCSTXMMSizeMask: int64;
  495. RegBCSTYMMSizeMask: int64;
  496. RegBCSTZMMSizeMask: int64;
  497. ExistsMemRef : boolean;
  498. bitcount : integer;
  499. ExistsCode336 : boolean;
  500. ExistsCode337 : boolean;
  501. ExistsSSEAVXReg : boolean;
  502. begin
  503. new(InsTabMemRefSizeInfoCache);
  504. FillChar(InsTabMemRefSizeInfoCache^,sizeof(TInsTabMemRefSizeInfoCache),0);
  505. for AsmOp := low(TAsmOp) to high(TAsmOp) do
  506. begin
  507. i := InsTabCache^[AsmOp];
  508. if i >= 0 then
  509. begin
  510. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiUnknown;
  511. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSizeBCST := msbUnknown;
  512. InsTabMemRefSizeInfoCache^[AsmOp].BCSTXMMMultiplicator := 0;
  513. InsTabMemRefSizeInfoCache^[AsmOp].ConstSize := csiUnknown;
  514. InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX := false;
  515. InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes := [];
  516. insentry:=@instab[i];
  517. RegMMXSizeMask := 0;
  518. RegXMMSizeMask := 0;
  519. RegYMMSizeMask := 0;
  520. RegZMMSizeMask := 0;
  521. RegMMXConstSizeMask := 0;
  522. RegXMMConstSizeMask := 0;
  523. RegYMMConstSizeMask := 0;
  524. RegZMMConstSizeMask := 0;
  525. RegBCSTSizeMask:= 0;
  526. RegBCSTXMMSizeMask := 0;
  527. RegBCSTYMMSizeMask := 0;
  528. RegBCSTZMMSizeMask := 0;
  529. ExistsMemRef := false;
  530. while (insentry^.opcode=AsmOp) do
  531. begin
  532. MRefInfo := msiUnknown;
  533. actRegSize := 0;
  534. actRegCount := 0;
  535. actRegTypes := 0;
  536. NewRegSize := 0;
  537. actMemSize := 0;
  538. actMemCount := 0;
  539. actRegMemTypes := 0;
  540. actVMemCount := 0;
  541. actVMemTypes := 0;
  542. actConstSize := 0;
  543. actConstCount := 0;
  544. ExistsCode336 := false; // indicate fixed operand size 32 bit
  545. ExistsCode337 := false; // indicate fixed operand size 64 bit
  546. ExistsSSEAVXReg := false;
  547. // parse insentry^.code for &336 and &337
  548. // &336 (octal) = 222 (decimal) == fixed operand size 32 bit
  549. // &337 (octal) = 223 (decimal) == fixed operand size 64 bit
  550. for i := low(insentry^.code) to high(insentry^.code) do
  551. begin
  552. case insentry^.code[i] of
  553. #222: ExistsCode336 := true;
  554. #223: ExistsCode337 := true;
  555. #0,#1,#2,#3: break;
  556. end;
  557. end;
  558. for i := 0 to insentry^.ops -1 do
  559. begin
  560. if (insentry^.optypes[i] and OT_REGISTER) = OT_REGISTER then
  561. case insentry^.optypes[i] and (OT_XMMREG or OT_YMMREG or OT_ZMMREG or OT_KREG or OT_REG_EXTRA_MASK) of
  562. OT_XMMREG,
  563. OT_YMMREG,
  564. OT_ZMMREG: ExistsSSEAVXReg := true;
  565. else;
  566. end;
  567. end;
  568. for j := 0 to insentry^.ops -1 do
  569. begin
  570. if ((insentry^.optypes[j] and OT_XMEM32) = OT_XMEM32) OR
  571. ((insentry^.optypes[j] and OT_XMEM64) = OT_XMEM64) OR
  572. ((insentry^.optypes[j] and OT_YMEM32) = OT_YMEM32) OR
  573. ((insentry^.optypes[j] and OT_YMEM64) = OT_YMEM64) OR
  574. ((insentry^.optypes[j] and OT_ZMEM32) = OT_ZMEM32) OR
  575. ((insentry^.optypes[j] and OT_ZMEM64) = OT_ZMEM64) then
  576. begin
  577. inc(actVMemCount);
  578. case insentry^.optypes[j] and (OT_XMEM32 OR OT_XMEM64 OR OT_YMEM32 OR OT_YMEM64 OR OT_ZMEM32 OR OT_ZMEM64) of
  579. OT_XMEM32: actVMemTypes := actVMemTypes or OT_XMEM32;
  580. OT_XMEM64: actVMemTypes := actVMemTypes or OT_XMEM64;
  581. OT_YMEM32: actVMemTypes := actVMemTypes or OT_YMEM32;
  582. OT_YMEM64: actVMemTypes := actVMemTypes or OT_YMEM64;
  583. OT_ZMEM32: actVMemTypes := actVMemTypes or OT_ZMEM32;
  584. OT_ZMEM64: actVMemTypes := actVMemTypes or OT_ZMEM64;
  585. else;
  586. end;
  587. end
  588. else if (insentry^.optypes[j] and OT_REGISTER) = OT_REGISTER then
  589. begin
  590. inc(actRegCount);
  591. NewRegSize := (insentry^.optypes[j] and OT_SIZE_MASK);
  592. if NewRegSize = 0 then
  593. begin
  594. case insentry^.optypes[j] and (OT_MMXREG or OT_XMMREG or OT_YMMREG or OT_ZMMREG or OT_KREG or OT_REG_EXTRA_MASK) of
  595. OT_MMXREG: begin
  596. NewRegSize := OT_BITS64;
  597. end;
  598. OT_XMMREG: begin
  599. NewRegSize := OT_BITS128;
  600. InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX := true;
  601. end;
  602. OT_YMMREG: begin
  603. NewRegSize := OT_BITS256;
  604. InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX := true;
  605. end;
  606. OT_ZMMREG: begin
  607. NewRegSize := OT_BITS512;
  608. InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX := true;
  609. end;
  610. OT_KREG: begin
  611. InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX := true;
  612. end;
  613. else NewRegSize := not(0);
  614. end;
  615. end;
  616. actRegSize := actRegSize or NewRegSize;
  617. actRegTypes := actRegTypes or (insentry^.optypes[j] and (OT_MMXREG or OT_XMMREG or OT_YMMREG or OT_ZMMREG or OT_KREG or OT_REG_EXTRA_MASK));
  618. end
  619. else if ((insentry^.optypes[j] and OT_MEMORY) <> 0) then
  620. begin
  621. inc(actMemCount);
  622. if ExistsSSEAVXReg and ExistsCode336 then
  623. actMemSize := actMemSize or OT_BITS32
  624. else if ExistsSSEAVXReg and ExistsCode337 then
  625. actMemSize := actMemSize or OT_BITS64
  626. else
  627. actMemSize:=actMemSize or (insentry^.optypes[j] and (OT_SIZE_MASK OR OT_VECTORBCST));
  628. if (insentry^.optypes[j] and OT_REGMEM) = OT_REGMEM then
  629. begin
  630. actRegMemTypes := actRegMemTypes or insentry^.optypes[j];
  631. end;
  632. end
  633. else if ((insentry^.optypes[j] and OT_IMMEDIATE) = OT_IMMEDIATE) then
  634. begin
  635. inc(actConstCount);
  636. actConstSize := actConstSize or (insentry^.optypes[j] and OT_SIZE_MASK);
  637. end
  638. end;
  639. if actConstCount > 0 then
  640. begin
  641. case actConstSize of
  642. 0: SConstInfo := csiNoSize;
  643. OT_BITS8: SConstInfo := csiMem8;
  644. OT_BITS16: SConstInfo := csiMem16;
  645. OT_BITS32: SConstInfo := csiMem32;
  646. OT_BITS64: SConstInfo := csiMem64;
  647. else SConstInfo := csiMultiple;
  648. end;
  649. if InsTabMemRefSizeInfoCache^[AsmOp].ConstSize = csiUnknown then
  650. begin
  651. InsTabMemRefSizeInfoCache^[AsmOp].ConstSize := SConstInfo;
  652. end
  653. else if InsTabMemRefSizeInfoCache^[AsmOp].ConstSize <> SConstInfo then
  654. begin
  655. InsTabMemRefSizeInfoCache^[AsmOp].ConstSize := csiMultiple;
  656. end;
  657. end;
  658. if actVMemCount > 0 then
  659. begin
  660. if actVMemCount = 1 then
  661. begin
  662. if actVMemTypes > 0 then
  663. begin
  664. case actVMemTypes of
  665. OT_XMEM32: MRefInfo := msiXMem32;
  666. OT_XMEM64: MRefInfo := msiXMem64;
  667. OT_YMEM32: MRefInfo := msiYMem32;
  668. OT_YMEM64: MRefInfo := msiYMem64;
  669. OT_ZMEM32: MRefInfo := msiZMem32;
  670. OT_ZMEM64: MRefInfo := msiZMem64;
  671. else;
  672. end;
  673. case actRegTypes of
  674. OT_XMMREG: case MRefInfo of
  675. msiXMem32,
  676. msiXMem64: RegXMMSizeMask := RegXMMSizeMask or OT_BITS128;
  677. msiYMem32,
  678. msiYMem64: RegXMMSizeMask := RegXMMSizeMask or OT_BITS256;
  679. msiZMem32,
  680. msiZMem64: RegXMMSizeMask := RegXMMSizeMask or OT_BITS512;
  681. else;
  682. end;
  683. OT_YMMREG: case MRefInfo of
  684. msiXMem32,
  685. msiXMem64: RegYMMSizeMask := RegYMMSizeMask or OT_BITS128;
  686. msiYMem32,
  687. msiYMem64: RegYMMSizeMask := RegYMMSizeMask or OT_BITS256;
  688. msiZMem32,
  689. msiZMem64: RegYMMSizeMask := RegYMMSizeMask or OT_BITS512;
  690. else;
  691. end;
  692. OT_ZMMREG: case MRefInfo of
  693. msiXMem32,
  694. msiXMem64: RegZMMSizeMask := RegZMMSizeMask or OT_BITS128;
  695. msiYMem32,
  696. msiYMem64: RegZMMSizeMask := RegZMMSizeMask or OT_BITS256;
  697. msiZMem32,
  698. msiZMem64: RegZMMSizeMask := RegZMMSizeMask or OT_BITS512;
  699. else;
  700. end;
  701. //else InternalError(777209);
  702. end;
  703. if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize = msiUnknown then
  704. begin
  705. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := MRefInfo;
  706. end
  707. else if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize <> MRefInfo then
  708. begin
  709. if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize in [msiXMem32, msiXMem64, msiYMem32, msiYMem64, msiZMem32, msiZMem64] then
  710. begin
  711. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiVMemMultiple;
  712. end
  713. else if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize <> msiVMemMultiple then;
  714. end;
  715. end;
  716. end
  717. else;
  718. end
  719. else
  720. begin
  721. if (actMemCount=2) and ((AsmOp=A_MOVS) or (AsmOp=A_CMPS)) then actMemCount:=1;
  722. ExistsMemRef := ExistsMemRef or (actMemCount > 0);
  723. case actMemCount of
  724. 0: ; // nothing todo
  725. 1: begin
  726. MRefInfo := msiUnknown;
  727. if not(ExistsCode336 or ExistsCode337) then
  728. case actRegMemTypes and (OT_MMXRM or OT_XMMRM or OT_YMMRM or OT_ZMMRM or OT_REG_EXTRA_MASK) of
  729. OT_MMXRM: actMemSize := actMemSize or OT_BITS64;
  730. OT_XMMRM: actMemSize := actMemSize or OT_BITS128;
  731. OT_YMMRM: actMemSize := actMemSize or OT_BITS256;
  732. OT_ZMMRM: actMemSize := actMemSize or OT_BITS512;
  733. end;
  734. case actMemSize of
  735. 0: MRefInfo := msiNoSize;
  736. OT_BITS8: MRefInfo := msiMem8;
  737. OT_BITS16: MRefInfo := msiMem16;
  738. OT_BITS32: MRefInfo := msiMem32;
  739. OT_BITSB32: MRefInfo := msiBMem32;
  740. OT_BITS64: MRefInfo := msiMem64;
  741. OT_BITSB64: MRefInfo := msiBMem64;
  742. OT_BITS128: MRefInfo := msiMem128;
  743. OT_BITS256: MRefInfo := msiMem256;
  744. OT_BITS512: MRefInfo := msiMem512;
  745. OT_BITS80,
  746. OT_FAR,
  747. OT_NEAR,
  748. OT_SHORT: ; // ignore
  749. else
  750. begin
  751. bitcount := popcnt(qword(actMemSize));
  752. if bitcount > 1 then MRefInfo := msiMultiple
  753. else;
  754. end;
  755. end;
  756. if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize = msiUnknown then
  757. begin
  758. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := MRefInfo;
  759. end
  760. else
  761. begin
  762. // ignore broadcast-memory
  763. if not(MRefInfo in [msiBMem32, msiBMem64]) then
  764. begin
  765. if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize <> MRefInfo then
  766. begin
  767. with InsTabMemRefSizeInfoCache^[AsmOp] do
  768. begin
  769. if ((MemRefSize in [msiMem8, msiMULTIPLEMinSize8]) OR (MRefInfo = msiMem8)) then MemRefSize := msiMultipleMinSize8
  770. else if ((MemRefSize in [ msiMem16, msiMULTIPLEMinSize16]) OR (MRefInfo = msiMem16)) then MemRefSize := msiMultipleMinSize16
  771. else if ((MemRefSize in [ msiMem32, msiMULTIPLEMinSize32]) OR (MRefInfo = msiMem32)) then MemRefSize := msiMultipleMinSize32
  772. else if ((MemRefSize in [ msiMem64, msiMULTIPLEMinSize64]) OR (MRefInfo = msiMem64)) then MemRefSize := msiMultipleMinSize64
  773. else if ((MemRefSize in [msiMem128, msiMULTIPLEMinSize128]) OR (MRefInfo = msiMem128)) then MemRefSize := msiMultipleMinSize128
  774. else if ((MemRefSize in [msiMem256, msiMULTIPLEMinSize256]) OR (MRefInfo = msiMem256)) then MemRefSize := msiMultipleMinSize256
  775. else if ((MemRefSize in [msiMem512, msiMULTIPLEMinSize512]) OR (MRefInfo = msiMem512)) then MemRefSize := msiMultipleMinSize512
  776. else MemRefSize := msiMultiple;
  777. end;
  778. end;
  779. end;
  780. end;
  781. //if not(MRefInfo in [msiBMem32, msiBMem64]) and (actRegCount > 0) then
  782. if actRegCount > 0 then
  783. begin
  784. if MRefInfo in [msiBMem32, msiBMem64] then
  785. begin
  786. if IF_BCST2 in insentry^.flags then InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes := InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes + [bt1to2];
  787. if IF_BCST4 in insentry^.flags then InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes := InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes + [bt1to4];
  788. if IF_BCST8 in insentry^.flags then InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes := InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes + [bt1to8];
  789. if IF_BCST16 in insentry^.flags then InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes := InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes + [bt1to16];
  790. //InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes
  791. // BROADCAST - OPERAND
  792. RegBCSTSizeMask := RegBCSTSizeMask or actMemSize;
  793. case actRegTypes and (OT_XMMREG or OT_YMMREG or OT_ZMMREG or OT_REG_EXTRA_MASK) of
  794. OT_XMMREG: RegBCSTXMMSizeMask := RegBCSTXMMSizeMask or actMemSize;
  795. OT_YMMREG: RegBCSTYMMSizeMask := RegBCSTYMMSizeMask or actMemSize;
  796. OT_ZMMREG: RegBCSTZMMSizeMask := RegBCSTZMMSizeMask or actMemSize;
  797. else begin
  798. RegBCSTXMMSizeMask := not(0);
  799. RegBCSTYMMSizeMask := not(0);
  800. RegBCSTZMMSizeMask := not(0);
  801. end;
  802. end;
  803. end
  804. else
  805. case actRegTypes and (OT_MMXREG or OT_XMMREG or OT_YMMREG or OT_ZMMREG or OT_REG_EXTRA_MASK) of
  806. OT_MMXREG: if actConstCount > 0 then RegMMXConstSizeMask := RegMMXConstSizeMask or actMemSize
  807. else RegMMXSizeMask := RegMMXSizeMask or actMemSize;
  808. OT_XMMREG: if actConstCount > 0 then RegXMMConstSizeMask := RegXMMConstSizeMask or actMemSize
  809. else RegXMMSizeMask := RegXMMSizeMask or actMemSize;
  810. OT_YMMREG: if actConstCount > 0 then RegYMMConstSizeMask := RegYMMConstSizeMask or actMemSize
  811. else RegYMMSizeMask := RegYMMSizeMask or actMemSize;
  812. OT_ZMMREG: if actConstCount > 0 then RegZMMConstSizeMask := RegZMMConstSizeMask or actMemSize
  813. else RegZMMSizeMask := RegZMMSizeMask or actMemSize;
  814. else begin
  815. RegMMXSizeMask := not(0);
  816. RegXMMSizeMask := not(0);
  817. RegYMMSizeMask := not(0);
  818. RegZMMSizeMask := not(0);
  819. RegMMXConstSizeMask := not(0);
  820. RegXMMConstSizeMask := not(0);
  821. RegYMMConstSizeMask := not(0);
  822. RegZMMConstSizeMask := not(0);
  823. end;
  824. end;
  825. end
  826. else
  827. end
  828. else;
  829. end;
  830. end;
  831. inc(insentry);
  832. end;
  833. if InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX then
  834. begin
  835. case RegBCSTSizeMask of
  836. 0: ; // ignore;
  837. OT_BITSB32: begin
  838. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSizeBCST := msbBCST32;
  839. InsTabMemRefSizeInfoCache^[AsmOp].BCSTXMMMultiplicator := 4;
  840. end;
  841. OT_BITSB64: begin
  842. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSizeBCST := msbBCST64;
  843. InsTabMemRefSizeInfoCache^[AsmOp].BCSTXMMMultiplicator := 2;
  844. end;
  845. else begin
  846. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSizeBCST := msbMultiple;
  847. end;
  848. end;
  849. end;
  850. if (InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize in MemRefMultiples) and
  851. (InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX)then
  852. begin
  853. if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize = msiVMemMultiple then
  854. begin
  855. if ((RegXMMSizeMask = OT_BITS128) or (RegXMMSizeMask = 0)) and
  856. ((RegYMMSizeMask = OT_BITS256) or (RegYMMSizeMask = 0)) and
  857. ((RegZMMSizeMask = OT_BITS512) or (RegZMMSizeMask = 0)) and
  858. ((RegXMMSizeMask or RegYMMSizeMask or RegZMMSizeMask) <> 0) then
  859. begin
  860. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiVMemRegSize;
  861. end;
  862. end
  863. else if (RegMMXSizeMask or RegMMXConstSizeMask) <> 0 then
  864. begin
  865. if ((RegMMXSizeMask or RegMMXConstSizeMask) = OT_BITS64) and
  866. ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS128) and
  867. ((RegYMMSizeMask or RegYMMConstSizeMask) = 0) and
  868. ((RegZMMSizeMask or RegZMMConstSizeMask) = 0) then
  869. begin
  870. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegSize;
  871. end;
  872. end
  873. else if (((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS128) or ((RegXMMSizeMask or RegXMMConstSizeMask) = 0)) and
  874. (((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS256) or ((RegYMMSizeMask or RegYMMConstSizeMask) = 0)) and
  875. (((RegZMMSizeMask or RegZMMConstSizeMask) = OT_BITS512) or ((RegZMMSizeMask or RegZMMConstSizeMask) = 0)) and
  876. (((RegXMMSizeMask or RegXMMConstSizeMask or
  877. RegYMMSizeMask or RegYMMConstSizeMask or
  878. RegZMMSizeMask or RegZMMConstSizeMask)) <> 0) then
  879. begin
  880. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegSize;
  881. end
  882. else if (RegXMMSizeMask or RegXMMConstSizeMask = OT_BITS16) and
  883. (RegYMMSizeMask or RegYMMConstSizeMask = OT_BITS32) and
  884. (RegZMMSizeMask or RegZMMConstSizeMask = 0) then
  885. begin
  886. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx16y32;
  887. end
  888. else if (RegXMMSizeMask or RegXMMConstSizeMask = OT_BITS16) and
  889. (RegYMMSizeMask or RegYMMConstSizeMask = OT_BITS32) and
  890. (RegZMMSizeMask or RegZMMConstSizeMask = OT_BITS64) then
  891. begin
  892. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx16y32z64;
  893. end
  894. else if ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS32) and
  895. ((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS64) then
  896. begin
  897. if ((RegZMMSizeMask or RegZMMConstSizeMask) = 0) then
  898. begin
  899. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx32y64;
  900. end
  901. else if ((RegZMMSizeMask or RegZMMConstSizeMask) = OT_BITS128) then
  902. begin
  903. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx32y64z128;
  904. end;
  905. end
  906. else if ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS64) and
  907. ((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS128) and
  908. ((RegZMMSizeMask or RegZMMConstSizeMask) = 0) then
  909. begin
  910. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx64y128;
  911. end
  912. else if ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS64) and
  913. ((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS128) and
  914. ((RegZMMSizeMask or RegZMMConstSizeMask) = OT_BITS256) then
  915. begin
  916. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx64y128z256;
  917. end
  918. else if ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS64) and
  919. ((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS256) and
  920. ((RegZMMSizeMask or RegZMMConstSizeMask) = 0) then
  921. begin
  922. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx64y256;
  923. end
  924. else if ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS64) and
  925. ((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS256) and
  926. ((RegZMMSizeMask or RegZMMConstSizeMask) = OT_BITS512) then
  927. begin
  928. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx64y256z512;
  929. end
  930. else if ((RegXMMConstSizeMask = 0) or (RegXMMConstSizeMask = OT_BITS128)) and
  931. ((RegYMMConstSizeMask = 0) or (RegYMMConstSizeMask = OT_BITS256)) and
  932. ((RegZMMConstSizeMask = 0) or (RegZMMConstSizeMask = OT_BITS512)) and
  933. ((RegXMMConstSizeMask or RegYMMConstSizeMask or RegZMMConstSizeMask) <> 0) and
  934. (
  935. ((RegXMMSizeMask or RegYMMSizeMask or RegZMMSizeMask) = OT_BITS128) or
  936. ((RegXMMSizeMask or RegYMMSizeMask or RegZMMSizeMask) = OT_BITS256) or
  937. ((RegXMMSizeMask or RegYMMSizeMask or RegZMMSizeMask) = OT_BITS512)
  938. ) then
  939. begin
  940. case RegXMMSizeMask or RegYMMSizeMask or RegZMMSizeMask of
  941. OT_BITS128: InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegConst128;
  942. OT_BITS256: InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegConst256;
  943. OT_BITS512: InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegConst512;
  944. else InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMultiple;
  945. end;
  946. end
  947. else
  948. begin
  949. if not(
  950. (AsmOp = A_CVTSI2SS) or
  951. (AsmOp = A_CVTSI2SD) or
  952. (AsmOp = A_CVTPD2DQ) or
  953. (AsmOp = A_VCVTPD2DQ) or
  954. (AsmOp = A_VCVTPD2PS) or
  955. (AsmOp = A_VCVTSI2SD) or
  956. (AsmOp = A_VCVTSI2SS) or
  957. (AsmOp = A_VCVTTPD2DQ) or
  958. (AsmOp = A_VCVTPD2UDQ) or
  959. (AsmOp = A_VCVTQQ2PS) or
  960. (AsmOp = A_VCVTTPD2UDQ) or
  961. (AsmOp = A_VCVTUQQ2PS) or
  962. (AsmOp = A_VCVTUSI2SD) or
  963. (AsmOp = A_VCVTUSI2SS) or
  964. // TODO check
  965. (AsmOp = A_VCMPSS)
  966. ) then;
  967. end;
  968. end
  969. else if (InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX) and
  970. (InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize = msiUnknown) and
  971. (not(ExistsMemRef)) then
  972. begin
  973. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiNoMemRef;
  974. end;
  975. InsTabMemRefSizeInfoCache^[AsmOp].RegXMMSizeMask:=RegXMMSizeMask;
  976. InsTabMemRefSizeInfoCache^[AsmOp].RegYMMSizeMask:=RegYMMSizeMask;
  977. InsTabMemRefSizeInfoCache^[AsmOp].RegZMMSizeMask:=RegZMMSizeMask;
  978. end;
  979. end;
  980. for AsmOp := low(TAsmOp) to high(TAsmOp) do
  981. begin
  982. // only supported intructiones with SSE- or AVX-operands
  983. if not(InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX) then
  984. begin
  985. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiUnknown;
  986. InsTabMemRefSizeInfoCache^[AsmOp].ConstSize := csiUnknown;
  987. end;
  988. end;
  989. end;
  990. { TOperandListItem }
  991. constructor TOperandListItem.Create;
  992. begin
  993. inherited;
  994. FOpActive := false;
  995. FOpNumber := -1;
  996. FOpTyp := otUnknown;
  997. FValues := TStringList.Create;
  998. end;
  999. destructor TOperandListItem.Destroy;
  1000. begin
  1001. FreeAndNil(FValues);
  1002. inherited;
  1003. end;
  1004. { TOperandList }
  1005. function TOperandList.Add(aItem: TOperandListItem): integer;
  1006. begin
  1007. result := FList.Add(aItem);
  1008. end;
  1009. function TOperandList.GetItems(aIndex: integer): TOperandListItem;
  1010. begin
  1011. result := TOperandListItem(FList[aIndex]);
  1012. end;
  1013. { TAsmTestGenerator }
  1014. function TAsmTestGenerator.InternalCalcTestData(const aInst, aOp1, aOp2, aOp3,
  1015. aOp4: String): TStringList;
  1016. var
  1017. i: integer;
  1018. Item: TOperandListItem;
  1019. OItem1: TOperandListItem;
  1020. OItem2: TOperandListItem;
  1021. OItem3: TOperandListItem;
  1022. OItem4: TOperandListItem;
  1023. il_Op: integer;
  1024. il_Op1: integer;
  1025. il_Op2: integer;
  1026. il_Op3: integer;
  1027. il_Op4: integer;
  1028. sSuffix: string;
  1029. sl_Operand: String;
  1030. sl_Inst : String;
  1031. sl_RegCombi: String;
  1032. sl_Prefix: String;
  1033. UsePrefix: boolean;
  1034. il_Operands: integer;
  1035. UsedParams: cardinal;
  1036. UseDefault: boolean;
  1037. sl_RegCombi1: string;
  1038. sl_RegCombi2: string;
  1039. sl_RegCombi3: string;
  1040. MaskRegNeeded:boolean;
  1041. function PrepareOperandTyp(const aTyp: String): String;
  1042. begin
  1043. result := aTyp;
  1044. if copy(result, length(result), 1) = '*' then result := copy(result, 1, length(result) - 1);
  1045. if result = 'XMMRM128' then result := 'XMMRM';
  1046. if result = 'YMMRM256' then result := 'YMMRM';
  1047. end;
  1048. begin
  1049. result := TStringList.Create;
  1050. OItem1 := TOperandListItem.Create;
  1051. try
  1052. OItem2 := TOperandListItem.Create;
  1053. try
  1054. OItem3 := TOperandListItem.Create;
  1055. try
  1056. OItem4 := TOperandListItem.Create;
  1057. try
  1058. UsePrefix := (UpperCase(aInst) = 'VCVTPD2DQ') OR
  1059. (UpperCase(aInst) = 'VCVTPD2PS') OR
  1060. (UpperCase(aInst) = 'VCVTSI2SD') OR
  1061. (UpperCase(aInst) = 'VCVTSI2SS') OR
  1062. (UpperCase(aInst) = 'VCVTTPD2DQ') or
  1063. (UpperCase(aInst) = 'VPMOVZXWQ') or
  1064. (UpperCase(aInst) = 'VCVTPD2UDQ') or
  1065. (UpperCase(aInst) = 'VCVTPD2UDQ') or
  1066. (UpperCase(aInst) = 'VCVTTPD2UDQ') or
  1067. (UpperCase(aInst) = 'VCVTUQQ2PS') or
  1068. (UpperCase(aInst) = 'VCVTQQ2PS') or
  1069. (UpperCase(aInst) = 'VCVTUSI2SD') or
  1070. (UpperCase(aInst) = 'VCVTUSI2SS') or
  1071. (UpperCase(aInst) = 'VFPCLASSPD') or
  1072. (UpperCase(aInst) = 'VFPCLASSPS') or
  1073. (UpperCase(aInst) = 'VCMPSS')
  1074. ;
  1075. MaskRegNeeded := (Pos('VGATHER', Uppercase(aInst)) = 1) or
  1076. (Pos('VPGATHER', Uppercase(aInst)) = 1) or
  1077. (Pos('VPSCATTER', Uppercase(aInst)) = 1) or
  1078. (Pos('VSCATTER', Uppercase(aInst)) = 1);
  1079. for il_Op := 1 to 4 do
  1080. begin
  1081. sl_Prefix := '';
  1082. case il_Op of
  1083. 1: begin
  1084. Item := OItem1;
  1085. sl_Operand := aOp1;
  1086. end;
  1087. 2: begin
  1088. Item := OItem2;
  1089. sl_Operand := aOp2;
  1090. end;
  1091. 3: begin
  1092. Item := OItem3;
  1093. sl_Operand := aOp3;
  1094. end;
  1095. 4: begin
  1096. Item := OItem4;
  1097. sl_Operand := aOp4;
  1098. end;
  1099. end;
  1100. sl_Operand := PrepareOperandTyp(sl_Operand);
  1101. if (AnsiSameText(sl_Operand, 'XMMREG')) or
  1102. (AnsiSameText(sl_Operand, 'XMMREG_M')) or
  1103. (AnsiSameText(sl_Operand, 'XMMREG_MZ')) or
  1104. (AnsiSameText(sl_Operand, 'XMMREG_ER')) or
  1105. (AnsiSameText(sl_Operand, 'XMMREG_SAE')) then
  1106. begin
  1107. Item.OpNumber := il_Op;
  1108. Item.OpTyp := otXMMReg;
  1109. Item.OpActive := true;
  1110. sSuffix := '';
  1111. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  1112. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1113. if Pos('_ER', sl_Operand) > 0 then sSuffix := ', {ru-sae}'
  1114. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  1115. Item.Values.Add('XMM0' + sSuffix);
  1116. Item.Values.Add('XMM1' + sSuffix);
  1117. Item.Values.Add('XMM2' + sSuffix);
  1118. Item.Values.Add('XMM3' + sSuffix);
  1119. Item.Values.Add('XMM4' + sSuffix);
  1120. Item.Values.Add('XMM5' + sSuffix);
  1121. Item.Values.Add('XMM6' + sSuffix);
  1122. Item.Values.Add('XMM7' + sSuffix);
  1123. if x64 then
  1124. begin
  1125. Item.Values.Clear;
  1126. if FAVX512 then
  1127. begin
  1128. Item.Values.Add('XMM0' + sSuffix);
  1129. Item.Values.Add('XMM9' + sSuffix);
  1130. Item.Values.Add('XMM18' + sSuffix);
  1131. Item.Values.Add('XMM27' + sSuffix);
  1132. Item.Values.Add('XMM31' + sSuffix);
  1133. if (sSuffix <> '') and
  1134. (MaskRegNeeded = false) then
  1135. begin
  1136. Item.Values.Add('XMM0');
  1137. Item.Values.Add('XMM9');
  1138. Item.Values.Add('XMM18');
  1139. Item.Values.Add('XMM27');
  1140. Item.Values.Add('XMM31');
  1141. end;
  1142. end
  1143. else
  1144. begin
  1145. Item.Values.Add('XMM0' + sSuffix);
  1146. Item.Values.Add('XMM4' + sSuffix);
  1147. Item.Values.Add('XMM8' + sSuffix);
  1148. Item.Values.Add('XMM12' + sSuffix);
  1149. Item.Values.Add('XMM15' + sSuffix);
  1150. if (sSuffix <> '') and
  1151. (MaskRegNeeded = false) then
  1152. begin
  1153. Item.Values.Add('XMM0');
  1154. Item.Values.Add('XMM4');
  1155. Item.Values.Add('XMM8');
  1156. Item.Values.Add('XMM12');
  1157. Item.Values.Add('XMM15');
  1158. end;
  1159. end;
  1160. end;
  1161. end
  1162. else if (AnsiSameText(sl_Operand, 'XMMRM')) or
  1163. (AnsiSameText(sl_Operand, 'XMMRM_M')) or
  1164. (AnsiSameText(sl_Operand, 'XMMRM_MZ')) or
  1165. (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
  1166. (AnsiSameText(sl_Operand, 'XMMRM_SAE')) then
  1167. begin
  1168. Item.OpNumber := il_Op;
  1169. Item.OpTyp := otXMMRM;
  1170. Item.OpActive := true;
  1171. if UsePrefix then sl_Prefix := 'oword ';
  1172. sSuffix := '';
  1173. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  1174. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1175. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  1176. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  1177. Item.Values.Add('XMM0' + sSuffix);
  1178. Item.Values.Add('XMM1' + sSuffix);
  1179. Item.Values.Add('XMM2' + sSuffix);
  1180. Item.Values.Add('XMM3' + sSuffix);
  1181. Item.Values.Add('XMM4' + sSuffix);
  1182. Item.Values.Add('XMM5' + sSuffix);
  1183. Item.Values.Add('XMM6' + sSuffix);
  1184. Item.Values.Add('XMM7' + sSuffix);
  1185. if x64 then
  1186. begin
  1187. Item.Values.Clear;
  1188. if FAVX512 then
  1189. begin
  1190. Item.Values.Add('XMM0' + sSuffix);
  1191. Item.Values.Add('XMM0');
  1192. Item.Values.Add('XMM9' + sSuffix);
  1193. Item.Values.Add('XMM9');
  1194. Item.Values.Add('XMM18' + sSuffix);
  1195. Item.Values.Add('XMM18');
  1196. Item.Values.Add('XMM27' + sSuffix);
  1197. Item.Values.Add('XMM27');
  1198. Item.Values.Add('XMM31' + sSuffix);
  1199. Item.Values.Add('XMM31');
  1200. end
  1201. else
  1202. begin
  1203. Item.Values.Add('XMM0' + sSuffix);
  1204. Item.Values.Add('XMM0');
  1205. Item.Values.Add('XMM4' + sSuffix);
  1206. Item.Values.Add('XMM4');
  1207. Item.Values.Add('XMM8' + sSuffix);
  1208. Item.Values.Add('XMM8');
  1209. Item.Values.Add('XMM12' + sSuffix);
  1210. Item.Values.Add('XMM15');
  1211. Item.Values.Add('XMM15' + sSuffix);
  1212. end;
  1213. MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  1214. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1215. end
  1216. else
  1217. begin
  1218. MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
  1219. end;
  1220. end
  1221. else if (AnsiSameText(sl_Operand, 'XMMRM8')) or
  1222. (AnsiSameText(sl_Operand, 'XMMRM8_M')) or
  1223. (AnsiSameText(sl_Operand, 'XMMRM8_MZ')) or
  1224. (AnsiSameText(sl_Operand, 'XMMRM8_ER')) or
  1225. (AnsiSameText(sl_Operand, 'XMMRM8_SAE')) then
  1226. begin
  1227. Item.OpNumber := il_Op;
  1228. Item.OpTyp := otXMMRM8;
  1229. Item.OpActive := true;
  1230. if UsePrefix then sl_Prefix := 'byte ';
  1231. sSuffix := '';
  1232. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  1233. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1234. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  1235. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  1236. Item.Values.Add('XMM0' + sSuffix);
  1237. Item.Values.Add('XMM1' + sSuffix);
  1238. Item.Values.Add('XMM2' + sSuffix);
  1239. Item.Values.Add('XMM3' + sSuffix);
  1240. Item.Values.Add('XMM4' + sSuffix);
  1241. Item.Values.Add('XMM5' + sSuffix);
  1242. Item.Values.Add('XMM6' + sSuffix);
  1243. Item.Values.Add('XMM7' + sSuffix);
  1244. if x64 then
  1245. begin
  1246. Item.Values.Clear;
  1247. if FAVX512 then
  1248. begin
  1249. Item.Values.Add('XMM0' + sSuffix);
  1250. Item.Values.Add('XMM0');
  1251. Item.Values.Add('XMM9' + sSuffix);
  1252. Item.Values.Add('XMM9');
  1253. Item.Values.Add('XMM18' + sSuffix);
  1254. Item.Values.Add('XMM18');
  1255. Item.Values.Add('XMM27' + sSuffix);
  1256. Item.Values.Add('XMM27');
  1257. Item.Values.Add('XMM31' + sSuffix);
  1258. Item.Values.Add('XMM31');
  1259. end
  1260. else
  1261. begin
  1262. Item.Values.Add('XMM0' + sSuffix);
  1263. Item.Values.Add('XMM0');
  1264. Item.Values.Add('XMM4' + sSuffix);
  1265. Item.Values.Add('XMM4');
  1266. Item.Values.Add('XMM8' + sSuffix);
  1267. Item.Values.Add('XMM8');
  1268. Item.Values.Add('XMM12' + sSuffix);
  1269. Item.Values.Add('XMM12');
  1270. Item.Values.Add('XMM15' + sSuffix);
  1271. Item.Values.Add('XMM15');
  1272. end;
  1273. //Item.Values.Add('[RIP]');
  1274. //Item.Values.Add('[RIP + 16]');
  1275. MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  1276. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1277. end
  1278. else
  1279. begin
  1280. MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
  1281. end;
  1282. end
  1283. else if (AnsiSameText(sl_Operand, 'XMMRM16')) or
  1284. (AnsiSameText(sl_Operand, 'XMMRM16_M')) or
  1285. (AnsiSameText(sl_Operand, 'XMMRM16_MZ')) or
  1286. (AnsiSameText(sl_Operand, 'XMMRM16_ER')) or
  1287. (AnsiSameText(sl_Operand, 'XMMRM16_SAE'))
  1288. then
  1289. begin
  1290. Item.OpNumber := il_Op;
  1291. Item.OpTyp := otXMMRM16;
  1292. Item.OpActive := true;
  1293. if UsePrefix then sl_Prefix := 'word ';
  1294. sSuffix := '';
  1295. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  1296. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1297. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  1298. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  1299. Item.Values.Add('XMM0' + sSuffix);
  1300. Item.Values.Add('XMM1' + sSuffix);
  1301. Item.Values.Add('XMM2' + sSuffix);
  1302. Item.Values.Add('XMM3' + sSuffix);
  1303. Item.Values.Add('XMM4' + sSuffix);
  1304. Item.Values.Add('XMM5' + sSuffix);
  1305. Item.Values.Add('XMM6' + sSuffix);
  1306. Item.Values.Add('XMM7' + sSuffix);
  1307. if x64 then
  1308. begin
  1309. Item.Values.Clear;
  1310. if FAVX512 then
  1311. begin
  1312. Item.Values.Add('XMM0' + sSuffix);
  1313. Item.Values.Add('XMM0');
  1314. Item.Values.Add('XMM9' + sSuffix);
  1315. Item.Values.Add('XMM9');
  1316. Item.Values.Add('XMM18' + sSuffix);
  1317. Item.Values.Add('XMM18');
  1318. Item.Values.Add('XMM27' + sSuffix);
  1319. Item.Values.Add('XMM27');
  1320. Item.Values.Add('XMM31' + sSuffix);
  1321. Item.Values.Add('XMM31');
  1322. end
  1323. else
  1324. begin
  1325. Item.Values.Add('XMM0' + sSuffix);
  1326. Item.Values.Add('XMM0');
  1327. Item.Values.Add('XMM4' + sSuffix);
  1328. Item.Values.Add('XMM4');
  1329. Item.Values.Add('XMM8' + sSuffix);
  1330. Item.Values.Add('XMM8');
  1331. Item.Values.Add('XMM12' + sSuffix);
  1332. Item.Values.Add('XMM12');
  1333. Item.Values.Add('XMM15' + sSuffix);
  1334. Item.Values.Add('XMM15');
  1335. end;
  1336. //Item.Values.Add('[RIP]');
  1337. //Item.Values.Add('[RIP + 16]');
  1338. MemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64Index, Item.Values);
  1339. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1340. end
  1341. else
  1342. begin
  1343. MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
  1344. end;
  1345. end
  1346. else if (AnsiSameText(sl_Operand, 'YMMREG')) or
  1347. (AnsiSameText(sl_Operand, 'YMMREG_M')) or
  1348. (AnsiSameText(sl_Operand, 'YMMREG_MZ')) or
  1349. (AnsiSameText(sl_Operand, 'YMMREG_ER')) or
  1350. (AnsiSameText(sl_Operand, 'YMMREG_SAE'))
  1351. then
  1352. begin
  1353. Item.OpNumber := il_Op;
  1354. Item.OpTyp := otYMMReg;
  1355. Item.OpActive := true;
  1356. sSuffix := '';
  1357. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  1358. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1359. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  1360. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  1361. Item.Values.Add('YMM0' + sSuffix);
  1362. Item.Values.Add('YMM1' + sSuffix);
  1363. Item.Values.Add('YMM2' + sSuffix);
  1364. Item.Values.Add('YMM3' + sSuffix);
  1365. Item.Values.Add('YMM4' + sSuffix);
  1366. Item.Values.Add('YMM5' + sSuffix);
  1367. Item.Values.Add('YMM6' + sSuffix);
  1368. Item.Values.Add('YMM7' + sSuffix);
  1369. if x64 then
  1370. begin
  1371. Item.Values.Clear;
  1372. if FAVX512 then
  1373. begin
  1374. Item.Values.Add('YMM0' + sSuffix);
  1375. Item.Values.Add('YMM9' + sSuffix);
  1376. Item.Values.Add('YMM18' + sSuffix);
  1377. Item.Values.Add('YMM27' + sSuffix);
  1378. Item.Values.Add('YMM31' + sSuffix);
  1379. if (sSuffix <> '') and
  1380. (MaskRegNeeded = false) then
  1381. begin
  1382. Item.Values.Add('YMM0');
  1383. Item.Values.Add('YMM9');
  1384. Item.Values.Add('YMM18');
  1385. Item.Values.Add('YMM27');
  1386. Item.Values.Add('YMM31');
  1387. end;
  1388. end
  1389. else
  1390. begin
  1391. Item.Values.Add('YMM0' + sSuffix);
  1392. Item.Values.Add('YMM4' + sSuffix);
  1393. Item.Values.Add('YMM8' + sSuffix);
  1394. Item.Values.Add('YMM12' + sSuffix);
  1395. Item.Values.Add('YMM15' + sSuffix);
  1396. if (sSuffix <> '') and
  1397. (MaskRegNeeded = false) then
  1398. begin
  1399. Item.Values.Add('YMM0');
  1400. Item.Values.Add('YMM4');
  1401. Item.Values.Add('YMM8');
  1402. Item.Values.Add('YMM12');
  1403. Item.Values.Add('YMM15');
  1404. end;
  1405. end;
  1406. end;
  1407. end
  1408. else if (AnsiSameText(sl_Operand, 'YMMRM')) or
  1409. (AnsiSameText(sl_Operand, 'YMMRM_M')) or
  1410. (AnsiSameText(sl_Operand, 'YMMRM_MZ')) or
  1411. (AnsiSameText(sl_Operand, 'YMMRM_ER')) or
  1412. (AnsiSameText(sl_Operand, 'YMMRM_SAE'))
  1413. then
  1414. begin
  1415. Item.OpNumber := il_Op;
  1416. Item.OpTyp := otYMMRM;
  1417. Item.OpActive := true;
  1418. if UsePrefix then sl_Prefix := 'yword ';
  1419. sSuffix := '';
  1420. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  1421. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1422. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  1423. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  1424. Item.Values.Add('YMM0' + sSuffix);
  1425. Item.Values.Add('YMM1' + sSuffix);
  1426. Item.Values.Add('YMM2' + sSuffix);
  1427. Item.Values.Add('YMM3' + sSuffix);
  1428. Item.Values.Add('YMM4' + sSuffix);
  1429. Item.Values.Add('YMM5' + sSuffix);
  1430. Item.Values.Add('YMM6' + sSuffix);
  1431. Item.Values.Add('YMM7' + sSuffix);
  1432. if x64 then
  1433. begin
  1434. Item.Values.Clear;
  1435. if FAVX512 then
  1436. begin
  1437. Item.Values.Add('YMM0' + sSuffix);
  1438. Item.Values.Add('YMM9' + sSuffix);
  1439. Item.Values.Add('YMM18' + sSuffix);
  1440. Item.Values.Add('YMM27' + sSuffix);
  1441. Item.Values.Add('YMM31' + sSuffix);
  1442. if (sSuffix <> '') and
  1443. (MaskRegNeeded = false) then
  1444. begin
  1445. Item.Values.Add('YMM0');
  1446. Item.Values.Add('YMM9');
  1447. Item.Values.Add('YMM18');
  1448. Item.Values.Add('YMM27');
  1449. Item.Values.Add('YMM31');
  1450. end;
  1451. end
  1452. else
  1453. begin
  1454. Item.Values.Add('YMM0' + sSuffix);
  1455. Item.Values.Add('YMM4' + sSuffix);
  1456. Item.Values.Add('YMM8' + sSuffix);
  1457. Item.Values.Add('YMM12' + sSuffix);
  1458. Item.Values.Add('YMM15' + sSuffix);
  1459. if (sSuffix <> '') and
  1460. (MaskRegNeeded = false) then
  1461. begin
  1462. Item.Values.Add('YMM0');
  1463. Item.Values.Add('YMM4');
  1464. Item.Values.Add('YMM8');
  1465. Item.Values.Add('YMM12');
  1466. Item.Values.Add('YMM15');
  1467. end;
  1468. end;
  1469. MemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64Index, Item.Values);
  1470. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1471. end
  1472. else
  1473. begin
  1474. MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
  1475. end;
  1476. end
  1477. else if (AnsiSameText(sl_Operand, 'ZMMREG')) or
  1478. (AnsiSameText(sl_Operand, 'ZMMREG_M')) or
  1479. (AnsiSameText(sl_Operand, 'ZMMREG_MZ')) or
  1480. (AnsiSameText(sl_Operand, 'ZMMREG_ER')) or
  1481. (AnsiSameText(sl_Operand, 'ZMMREG_SAE'))
  1482. then
  1483. begin
  1484. Item.OpNumber := il_Op;
  1485. Item.OpTyp := otZMMReg;
  1486. Item.OpActive := true;
  1487. sSuffix := '';
  1488. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  1489. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1490. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  1491. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  1492. Item.Values.Add('ZMM0' + sSuffix);
  1493. Item.Values.Add('ZMM1' + sSuffix);
  1494. Item.Values.Add('ZMM2' + sSuffix);
  1495. Item.Values.Add('ZMM3' + sSuffix);
  1496. Item.Values.Add('ZMM4' + sSuffix);
  1497. Item.Values.Add('ZMM5' + sSuffix);
  1498. Item.Values.Add('ZMM6' + sSuffix);
  1499. Item.Values.Add('ZMM7' + sSuffix);
  1500. if x64 then
  1501. begin
  1502. Item.Values.Clear;
  1503. if FAVX512 then
  1504. begin
  1505. Item.Values.Add('ZMM0' + sSuffix);
  1506. Item.Values.Add('ZMM9' + sSuffix);
  1507. Item.Values.Add('ZMM18' + sSuffix);
  1508. Item.Values.Add('ZMM27' + sSuffix);
  1509. Item.Values.Add('ZMM31' + sSuffix);
  1510. if (sSuffix <> '') and
  1511. (MaskRegNeeded = false) then
  1512. begin
  1513. Item.Values.Add('ZMM0');
  1514. Item.Values.Add('ZMM9');
  1515. Item.Values.Add('ZMM18');
  1516. Item.Values.Add('ZMM27');
  1517. Item.Values.Add('ZMM31');
  1518. end;
  1519. end
  1520. else
  1521. begin
  1522. Item.Values.Add('ZMM0' + sSuffix);
  1523. Item.Values.Add('ZMM4' + sSuffix);
  1524. Item.Values.Add('ZMM8' + sSuffix);
  1525. Item.Values.Add('ZMM12' + sSuffix);
  1526. Item.Values.Add('ZMM15' + sSuffix);
  1527. end;
  1528. end;
  1529. end
  1530. else if (AnsiSameText(sl_Operand, 'ZMMRM')) or
  1531. (AnsiSameText(sl_Operand, 'ZMMRM_M')) or
  1532. (AnsiSameText(sl_Operand, 'ZMMRM_MZ')) or
  1533. (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
  1534. (AnsiSameText(sl_Operand, 'XMMRM_SAE'))
  1535. then
  1536. begin
  1537. Item.OpNumber := il_Op;
  1538. Item.OpTyp := otZMMRM;
  1539. Item.OpActive := true;
  1540. if UsePrefix then sl_Prefix := 'zword ';
  1541. sSuffix := '';
  1542. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  1543. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1544. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  1545. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  1546. Item.Values.Add('ZMM0' + sSuffix);
  1547. Item.Values.Add('ZMM1' + sSuffix);
  1548. Item.Values.Add('ZMM2' + sSuffix);
  1549. Item.Values.Add('ZMM3' + sSuffix);
  1550. Item.Values.Add('ZMM4' + sSuffix);
  1551. Item.Values.Add('ZMM5' + sSuffix);
  1552. Item.Values.Add('ZMM6' + sSuffix);
  1553. Item.Values.Add('ZMM7' + sSuffix);
  1554. if x64 then
  1555. begin
  1556. Item.Values.Clear;
  1557. if FAVX512 then
  1558. begin
  1559. Item.Values.Add('ZMM0' + sSuffix);
  1560. Item.Values.Add('ZMM9' + sSuffix);
  1561. Item.Values.Add('ZMM18' + sSuffix);
  1562. Item.Values.Add('ZMM27' + sSuffix);
  1563. Item.Values.Add('ZMM31' + sSuffix);
  1564. if (sSuffix <> '') and
  1565. (MaskRegNeeded = false) then
  1566. begin
  1567. Item.Values.Add('ZMM0');
  1568. Item.Values.Add('ZMM9');
  1569. Item.Values.Add('ZMM18');
  1570. Item.Values.Add('ZMM27');
  1571. Item.Values.Add('ZMM31');
  1572. end;
  1573. end
  1574. else
  1575. begin
  1576. Item.Values.Add('ZMM0' + sSuffix);
  1577. Item.Values.Add('ZMM4' + sSuffix);
  1578. Item.Values.Add('ZMM8' + sSuffix);
  1579. Item.Values.Add('ZMM12' + sSuffix);
  1580. Item.Values.Add('ZMM15' + sSuffix);
  1581. end;
  1582. MemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64Index, Item.Values);
  1583. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1584. end
  1585. else
  1586. begin
  1587. MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
  1588. end;
  1589. end
  1590. else if AnsiSameText(sl_Operand, 'MEM8') then
  1591. begin
  1592. Item.OpNumber := il_Op;
  1593. Item.OpTyp := otMEM8;
  1594. Item.OpActive := true;
  1595. if UsePrefix then sl_Prefix := 'byte ';
  1596. sSuffix := '';
  1597. if x64 then
  1598. begin
  1599. MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  1600. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1601. end
  1602. else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
  1603. end
  1604. else if AnsiSameText(sl_Operand, 'MEM16') or
  1605. AnsiSameText(sl_Operand, 'MEM16_M') then
  1606. begin
  1607. Item.OpNumber := il_Op;
  1608. Item.OpTyp := otMEM16;
  1609. Item.OpActive := true;
  1610. if UsePrefix then sl_Prefix := 'word ';
  1611. sSuffix := '';
  1612. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1613. if x64 then
  1614. begin
  1615. MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  1616. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1617. end
  1618. else MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1619. end
  1620. else if AnsiSameText(sl_Operand, 'MEM32') or
  1621. AnsiSameText(sl_Operand, 'MEM32_M') or
  1622. AnsiSameText(sl_Operand, 'MEM32_MZ') then
  1623. begin
  1624. Item.OpNumber := il_Op;
  1625. Item.OpTyp := otMEM32;
  1626. Item.OpActive := true;
  1627. if UsePrefix then sl_Prefix := 'dword ';
  1628. sSuffix := '';
  1629. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1630. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  1631. if x64 then
  1632. begin
  1633. MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  1634. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1635. end
  1636. else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1637. end
  1638. else if (AnsiSameText(sl_Operand, 'MEM64')) or
  1639. (AnsiSameText(sl_Operand, 'MEM64_M')) or
  1640. (AnsiSameText(sl_Operand, 'MEM64_MZ')) then
  1641. begin
  1642. Item.OpNumber := il_Op;
  1643. Item.OpTyp := otMEM64;
  1644. Item.OpActive := true;
  1645. if UsePrefix then sl_Prefix := 'qword ';
  1646. sSuffix := '';
  1647. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1648. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  1649. if x64 then
  1650. begin
  1651. MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  1652. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1653. end
  1654. else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1655. end
  1656. else if (AnsiSameText(sl_Operand, 'MEM128')) or
  1657. (AnsiSameText(sl_Operand, 'MEM128_M')) or
  1658. (AnsiSameText(sl_Operand, 'MEM128_MZ')) then
  1659. begin
  1660. Item.OpNumber := il_Op;
  1661. Item.OpTyp := otMEM128;
  1662. Item.OpActive := true;
  1663. if UsePrefix then sl_Prefix := 'oword ';
  1664. sSuffix := '';
  1665. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1666. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  1667. if x64 then
  1668. begin
  1669. MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  1670. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1671. end
  1672. else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1673. end
  1674. else if (AnsiSameText(sl_Operand, 'MEM256')) or
  1675. (AnsiSameText(sl_Operand, 'MEM256_M')) or
  1676. (AnsiSameText(sl_Operand, 'MEM256_MZ')) then
  1677. begin
  1678. Item.OpNumber := il_Op;
  1679. Item.OpTyp := otMEM256;
  1680. Item.OpActive := true;
  1681. if UsePrefix then sl_Prefix := 'yword ';
  1682. sSuffix := '';
  1683. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1684. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  1685. if x64 then
  1686. begin
  1687. MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  1688. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1689. end
  1690. else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1691. end
  1692. else if (AnsiSameText(sl_Operand, 'MEM512')) or
  1693. (AnsiSameText(sl_Operand, 'MEM512_M')) or
  1694. (AnsiSameText(sl_Operand, 'MEM512_MZ')) then
  1695. begin
  1696. Item.OpNumber := il_Op;
  1697. Item.OpTyp := otMEM512;
  1698. Item.OpActive := true;
  1699. if UsePrefix then sl_Prefix := 'zword ';
  1700. sSuffix := '';
  1701. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1702. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  1703. if x64 then
  1704. begin
  1705. MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  1706. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1707. end
  1708. else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1709. end
  1710. else if AnsiSameText(sl_Operand, 'REG8') then
  1711. begin
  1712. Item.OpNumber := il_Op;
  1713. Item.OpTyp := otREG8;
  1714. Item.OpActive := true;
  1715. if x64 then
  1716. begin
  1717. Item.Values.AddStrings(FReg8);
  1718. end
  1719. else Item.Values.AddStrings(FReg8);
  1720. end
  1721. else if AnsiSameText(sl_Operand, 'REG16') then
  1722. begin
  1723. Item.OpNumber := il_Op;
  1724. Item.OpTyp := otREG16;
  1725. Item.OpActive := true;
  1726. if x64 then
  1727. begin
  1728. Item.Values.AddStrings(FReg16);
  1729. end
  1730. else Item.Values.AddStrings(FReg16);
  1731. end
  1732. else if AnsiSameText(sl_Operand, 'REG32') then
  1733. begin
  1734. Item.OpNumber := il_Op;
  1735. Item.OpTyp := otREG32;
  1736. Item.OpActive := true;
  1737. if x64 then
  1738. begin
  1739. Item.Values.AddStrings(FReg32Base);
  1740. end
  1741. else Item.Values.AddStrings(FReg32Base);
  1742. end
  1743. else if AnsiSameText(sl_Operand, 'REG64') then
  1744. begin
  1745. Item.OpNumber := il_Op;
  1746. Item.OpTyp := otREG64;
  1747. Item.OpActive := true;
  1748. if x64 then
  1749. begin
  1750. Item.Values.AddStrings(FReg64Base);
  1751. end;
  1752. end
  1753. else if AnsiSameText(sl_Operand, 'RM32') then
  1754. begin
  1755. Item.OpNumber := il_Op;
  1756. Item.OpTyp := otRM32;
  1757. Item.OpActive := true;
  1758. Item.Values.AddStrings(FReg32Base);
  1759. if UsePrefix then sl_Prefix := 'dword ';
  1760. if x64 then
  1761. begin
  1762. MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  1763. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1764. end
  1765. else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
  1766. end
  1767. else if AnsiSameText(sl_Operand, 'RM64') then
  1768. begin
  1769. Item.OpNumber := il_Op;
  1770. Item.OpTyp := otRM32;
  1771. Item.OpActive := true;
  1772. if UsePrefix then sl_Prefix := 'qword ';
  1773. if x64 then
  1774. begin
  1775. Item.Values.AddStrings(FReg64Base);
  1776. MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  1777. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1778. end
  1779. else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
  1780. end
  1781. else if AnsiSameText(sl_Operand, 'IMM8') then
  1782. begin
  1783. Item.OpNumber := il_Op;
  1784. Item.OpTyp := otIMM8;
  1785. Item.OpActive := true;
  1786. Item.Values.Add('0');
  1787. end
  1788. else if AnsiSameText(sl_Operand, 'XMEM32') or
  1789. AnsiSameText(sl_Operand, 'XMEM32_M') then
  1790. begin
  1791. Item.OpNumber := il_Op;
  1792. Item.OpTyp := otXMEM32;
  1793. Item.OpActive := true;
  1794. if UsePrefix then sl_Prefix := 'oword ';
  1795. sSuffix := '';
  1796. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1797. if x64 then
  1798. begin
  1799. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64XMMIndex, Item.Values);
  1800. if (sSuffix <> '') and
  1801. (MaskRegNeeded = false) then
  1802. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64XMMIndex, Item.Values);
  1803. end
  1804. else
  1805. begin
  1806. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32XMMIndex, Item.Values);
  1807. if (sSuffix <> '') and
  1808. (MaskRegNeeded = false) then
  1809. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32XMMIndex, Item.Values);
  1810. end;
  1811. end
  1812. else if AnsiSameText(sl_Operand, 'XMEM64') or
  1813. AnsiSameText(sl_Operand, 'XMEM64_M') then
  1814. begin
  1815. Item.OpNumber := il_Op;
  1816. Item.OpTyp := otXMEM64;
  1817. Item.OpActive := true;
  1818. //if UsePrefix then sl_Prefix := 'oword ';
  1819. //
  1820. //if x64 then
  1821. //begin
  1822. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64XMMIndex, Item.Values);
  1823. //end
  1824. //else
  1825. //begin
  1826. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32XMMIndex, Item.Values);
  1827. //end;
  1828. sSuffix := '';
  1829. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1830. if x64 then
  1831. begin
  1832. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64XMMIndex, Item.Values);
  1833. if (sSuffix <> '') and
  1834. (MaskRegNeeded = false)
  1835. then
  1836. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64XMMIndex, Item.Values);
  1837. end
  1838. else
  1839. begin
  1840. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32XMMIndex, Item.Values);
  1841. if (sSuffix <> '') and
  1842. (MaskRegNeeded = false)
  1843. then
  1844. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32XMMIndex, Item.Values);
  1845. end;
  1846. end
  1847. else if AnsiSameText(sl_Operand, 'YMEM32') or
  1848. AnsiSameText(sl_Operand, 'YMEM32_M') then
  1849. begin
  1850. Item.OpNumber := il_Op;
  1851. Item.OpTyp := otYMEM32;
  1852. Item.OpActive := true;
  1853. if UsePrefix then sl_Prefix := 'yword ';
  1854. //if x64 then
  1855. //begin
  1856. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64YMMIndex, Item.Values);
  1857. //end
  1858. //else
  1859. //begin
  1860. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32YMMIndex, Item.Values);
  1861. //end;
  1862. sSuffix := '';
  1863. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1864. if x64 then
  1865. begin
  1866. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64YMMIndex, Item.Values);
  1867. if (sSuffix <> '') and
  1868. (MaskRegNeeded = false)
  1869. then
  1870. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64YMMIndex, Item.Values);
  1871. end
  1872. else
  1873. begin
  1874. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32YMMIndex, Item.Values);
  1875. if (sSuffix <> '') and
  1876. (MaskRegNeeded = false)
  1877. then
  1878. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32YMMIndex, Item.Values);
  1879. end;
  1880. end
  1881. else if AnsiSameText(sl_Operand, 'YMEM64') or
  1882. AnsiSameText(sl_Operand, 'YMEM64_M') then
  1883. begin
  1884. Item.OpNumber := il_Op;
  1885. Item.OpTyp := otYMEM64;
  1886. Item.OpActive := true;
  1887. if UsePrefix then sl_Prefix := 'yword ';
  1888. //if x64 then
  1889. //begin
  1890. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64YMMIndex, Item.Values);
  1891. //end
  1892. //else
  1893. //begin
  1894. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32YMMIndex, Item.Values);
  1895. //end;
  1896. sSuffix := '';
  1897. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1898. if x64 then
  1899. begin
  1900. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64YMMIndex, Item.Values);
  1901. if (sSuffix <> '') and
  1902. (MaskRegNeeded = false)
  1903. then
  1904. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64YMMIndex, Item.Values);
  1905. end
  1906. else
  1907. begin
  1908. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32YMMIndex, Item.Values);
  1909. if (sSuffix <> '') and
  1910. (MaskRegNeeded = false)
  1911. then
  1912. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32YMMIndex, Item.Values);
  1913. end;
  1914. end
  1915. else if AnsiSameText(sl_Operand, 'ZMEM32') or
  1916. AnsiSameText(sl_Operand, 'ZMEM32_M') then
  1917. begin
  1918. Item.OpNumber := il_Op;
  1919. Item.OpTyp := otZMEM32;
  1920. Item.OpActive := true;
  1921. if UsePrefix then sl_Prefix := 'zword ';
  1922. //if x64 then
  1923. //begin
  1924. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64ZMMIndex, Item.Values);
  1925. //end
  1926. //else
  1927. //begin
  1928. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32ZMMIndex, Item.Values);
  1929. //end;
  1930. sSuffix := '';
  1931. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1932. if x64 then
  1933. begin
  1934. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64ZMMIndex, Item.Values);
  1935. if (sSuffix <> '') and
  1936. (MaskRegNeeded = false)
  1937. then
  1938. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64ZMMIndex, Item.Values);
  1939. end
  1940. else
  1941. begin
  1942. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32ZMMIndex, Item.Values);
  1943. if (sSuffix <> '') and
  1944. (MaskRegNeeded = false)
  1945. then
  1946. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32ZMMIndex, Item.Values);
  1947. end;
  1948. end
  1949. else if AnsiSameText(sl_Operand, 'ZMEM64') or
  1950. AnsiSameText(sl_Operand, 'ZMEM64_M') then
  1951. begin
  1952. Item.OpNumber := il_Op;
  1953. Item.OpTyp := otZMEM64;
  1954. Item.OpActive := true;
  1955. if UsePrefix then sl_Prefix := 'zword ';
  1956. //if x64 then
  1957. //begin
  1958. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64ZMMIndex, Item.Values);
  1959. //end
  1960. //else
  1961. //begin
  1962. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32ZMMIndex, Item.Values);
  1963. //end;
  1964. sSuffix := '';
  1965. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1966. if x64 then
  1967. begin
  1968. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64ZMMIndex, Item.Values);
  1969. if (sSuffix <> '') and
  1970. (MaskRegNeeded = false)
  1971. then
  1972. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64ZMMIndex, Item.Values);
  1973. end
  1974. else
  1975. begin
  1976. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32ZMMIndex, Item.Values);
  1977. if (sSuffix <> '') and
  1978. (MaskRegNeeded = false)
  1979. then
  1980. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32ZMMIndex, Item.Values);
  1981. end;
  1982. end
  1983. else if AnsiSameText(sl_Operand, '2B32') then
  1984. begin
  1985. Item.OpNumber := il_Op;
  1986. Item.OpTyp := otB32;
  1987. Item.OpActive := true;
  1988. if x64 then
  1989. begin
  1990. MemRegBaseIndexCombi(sl_Prefix, ' {1to2}', FReg64Base, FReg64Index, Item.Values);
  1991. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1992. end
  1993. else MemRegBaseIndexCombi(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
  1994. end
  1995. else if AnsiSameText(sl_Operand, '4B32') then
  1996. begin
  1997. Item.OpNumber := il_Op;
  1998. Item.OpTyp := otB32;
  1999. Item.OpActive := true;
  2000. if x64 then
  2001. begin
  2002. MemRegBaseIndexCombi(sl_Prefix, ' {1to4}', FReg64Base, FReg64Index, Item.Values);
  2003. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  2004. end
  2005. else MemRegBaseIndexCombi(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
  2006. end
  2007. else if AnsiSameText(sl_Operand, '8B32') then
  2008. begin
  2009. Item.OpNumber := il_Op;
  2010. Item.OpTyp := otB32;
  2011. Item.OpActive := true;
  2012. if x64 then
  2013. begin
  2014. MemRegBaseIndexCombi(sl_Prefix, ' {1to8}', FReg64Base, FReg64Index, Item.Values);
  2015. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  2016. end
  2017. else MemRegBaseIndexCombi(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
  2018. end
  2019. else if AnsiSameText(sl_Operand, '16B32') then
  2020. begin
  2021. Item.OpNumber := il_Op;
  2022. Item.OpTyp := otB32;
  2023. Item.OpActive := true;
  2024. if x64 then
  2025. begin
  2026. MemRegBaseIndexCombi(sl_Prefix, ' {1to16}', FReg64Base, FReg64Index, Item.Values);
  2027. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  2028. end
  2029. else MemRegBaseIndexCombi(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
  2030. end
  2031. else if AnsiSameText(sl_Operand, '2B64') then
  2032. begin
  2033. Item.OpNumber := il_Op;
  2034. Item.OpTyp := otB64;
  2035. Item.OpActive := true;
  2036. if x64 then
  2037. begin
  2038. MemRegBaseIndexCombi(sl_Prefix, ' {1to2}', FReg64Base, FReg64Index, Item.Values);
  2039. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  2040. end
  2041. else MemRegBaseIndexCombi(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
  2042. end
  2043. else if AnsiSameText(sl_Operand, '4B64') then
  2044. begin
  2045. Item.OpNumber := il_Op;
  2046. Item.OpTyp := otB64;
  2047. Item.OpActive := true;
  2048. if x64 then
  2049. begin
  2050. MemRegBaseIndexCombi(sl_Prefix, ' {1to4}', FReg64Base, FReg64Index, Item.Values);
  2051. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  2052. end
  2053. else MemRegBaseIndexCombi(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
  2054. end
  2055. else if AnsiSameText(sl_Operand, '8B64') then
  2056. begin
  2057. Item.OpNumber := il_Op;
  2058. Item.OpTyp := otB64;
  2059. Item.OpActive := true;
  2060. if x64 then
  2061. begin
  2062. MemRegBaseIndexCombi(sl_Prefix, ' {1to8}', FReg64Base, FReg64Index, Item.Values);
  2063. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  2064. end
  2065. else MemRegBaseIndexCombi(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
  2066. end
  2067. else if AnsiSameText(sl_Operand, '16B64') then
  2068. begin
  2069. Item.OpNumber := il_Op;
  2070. Item.OpTyp := otB64;
  2071. Item.OpActive := true;
  2072. if x64 then
  2073. begin
  2074. MemRegBaseIndexCombi(sl_Prefix, ' {1to16}', FReg64Base, FReg64Index, Item.Values);
  2075. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  2076. end
  2077. else MemRegBaseIndexCombi(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
  2078. end
  2079. else if AnsiSameText(sl_Operand, 'KREG') or
  2080. AnsiSameText(sl_Operand, 'KREG_M') then
  2081. begin
  2082. Item.OpNumber := il_Op;
  2083. Item.OpTyp := otKREG;
  2084. Item.OpActive := true;
  2085. sSuffix := '';
  2086. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  2087. if UsePrefix then sl_Prefix := '';
  2088. for i := 0 to FRegKREG.Count - 1 do
  2089. Item.Values.Add(FRegKREG[i] + sSuffix);
  2090. end
  2091. else if trim(sl_Operand) = '' then
  2092. begin
  2093. Item.OpNumber := il_Op;
  2094. Item.OpTyp := otUnknown;
  2095. Item.OpActive := false;
  2096. Item.Values.Add('');
  2097. end
  2098. else
  2099. begin
  2100. Item.OpNumber := il_Op;
  2101. Item.OpTyp := otUnknown;
  2102. Item.OpActive := false;
  2103. Item.Values.Add('?' + sl_Operand);
  2104. end
  2105. end;
  2106. sl_RegCombi := '';
  2107. il_Operands := 0;
  2108. UsedParams := 0;
  2109. if OItem1.OpActive then
  2110. begin
  2111. inc(il_Operands);
  2112. UsedParams := UsedParams or 1;
  2113. end;
  2114. if OItem2.OpActive then
  2115. begin
  2116. inc(il_Operands);
  2117. UsedParams := UsedParams or 2;
  2118. end;
  2119. if OItem3.OpActive then
  2120. begin
  2121. inc(il_Operands);
  2122. UsedParams := UsedParams or 4;
  2123. end;
  2124. if OItem4.OpActive then
  2125. begin
  2126. inc(il_Operands);
  2127. UsedParams := UsedParams or 8;
  2128. end;
  2129. case il_Operands of
  2130. 1: UseDefault := UsedParams <> 1;
  2131. 2: UseDefault := UsedParams <> 3;
  2132. 3: UseDefault := UsedParams <> 7;
  2133. 4: UseDefault := UsedParams <> 15;
  2134. else UseDefault := true;
  2135. end;
  2136. //UseDefault := true;
  2137. if UseDefault then
  2138. begin
  2139. sl_Inst := format('%-20s', [aInst]);
  2140. for il_Op1 := 0 to OItem1.Values.Count - 1 do
  2141. begin
  2142. for il_Op2 := 0 to OItem2.Values.Count - 1 do
  2143. begin
  2144. for il_Op3 := 0 to OItem3.Values.Count - 1 do
  2145. begin
  2146. for il_Op4 := 0 to OItem4.Values.Count - 1 do
  2147. begin
  2148. sl_RegCombi := '';
  2149. if OItem1.OpActive then
  2150. begin
  2151. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  2152. sl_RegCombi := sl_RegCombi + OItem1.Values[il_Op1];
  2153. end;
  2154. if OItem2.OpActive then
  2155. begin
  2156. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  2157. sl_RegCombi := sl_RegCombi + OItem2.Values[il_Op2];
  2158. end;
  2159. if OItem3.OpActive then
  2160. begin
  2161. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  2162. sl_RegCombi := sl_RegCombi + OItem3.Values[il_Op3];
  2163. end;
  2164. if OItem4.OpActive then
  2165. begin
  2166. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  2167. sl_RegCombi := sl_RegCombi + OItem4.Values[il_Op4];
  2168. end;
  2169. if sl_RegCombi <> '' then
  2170. begin
  2171. //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
  2172. result.Add(sl_Inst + sl_RegCombi);
  2173. sl_RegCombi := '';
  2174. end;
  2175. end;
  2176. end;
  2177. end;
  2178. end;
  2179. end
  2180. else
  2181. begin
  2182. sl_Inst := format('%-20s', [aInst]);
  2183. for il_Op1 := 0 to OItem1.Values.Count - 1 do
  2184. begin
  2185. if OItem1.OpActive then
  2186. begin
  2187. sl_RegCombi1 := OItem1.Values[il_Op1];
  2188. end
  2189. else sl_RegCombi1 := '';
  2190. for il_Op2 := 0 to OItem2.Values.Count - 1 do
  2191. begin
  2192. if OItem2.OpActive then
  2193. begin
  2194. sl_RegCombi2 := sl_RegCombi1 + ', ' + OItem2.Values[il_Op2];
  2195. end
  2196. else sl_RegCombi2 := sl_RegCombi1;
  2197. for il_Op3 := 0 to OItem3.Values.Count - 1 do
  2198. begin
  2199. if OItem3.OpActive then
  2200. begin
  2201. sl_RegCombi3 := sl_RegCombi2 + ', ' + OItem3.Values[il_Op3];
  2202. end
  2203. else sl_RegCombi3 := sl_RegCombi2;
  2204. for il_Op4 := 0 to OItem4.Values.Count - 1 do
  2205. begin
  2206. if OItem4.OpActive then
  2207. begin
  2208. sl_RegCombi := sl_RegCombi3 + ', ' + OItem4.Values[il_Op4];
  2209. end
  2210. else sl_RegCombi := sl_RegCombi3;
  2211. if sl_RegCombi <> '' then
  2212. begin
  2213. //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
  2214. result.Add(sl_Inst + sl_RegCombi);
  2215. sl_RegCombi := '';
  2216. end;
  2217. end;
  2218. end;
  2219. end;
  2220. end;
  2221. end;
  2222. finally
  2223. FreeAndNil(OItem4);
  2224. end;
  2225. finally
  2226. FreeAndNil(OItem3);
  2227. end;
  2228. finally
  2229. FreeAndNil(OItem2);
  2230. end;
  2231. finally
  2232. FreeAndNil(OItem1);
  2233. end;
  2234. end;
  2235. function TAsmTestGenerator.InternalCalcTestDataMREF(const aInst, aOp1, aOp2, aOp3,
  2236. aOp4: String): TStringList;
  2237. var
  2238. i: integer;
  2239. Item: TOperandListItem;
  2240. OItem1: TOperandListItem;
  2241. OItem2: TOperandListItem;
  2242. OItem3: TOperandListItem;
  2243. OItem4: TOperandListItem;
  2244. il_Op: integer;
  2245. il_Op1: integer;
  2246. il_Op2: integer;
  2247. il_Op3: integer;
  2248. il_Op4: integer;
  2249. sSuffix: string;
  2250. sl_Operand: String;
  2251. sl_Inst : String;
  2252. sl_RegCombi: String;
  2253. sl_Prefix: String;
  2254. UsePrefix: boolean;
  2255. il_Operands: integer;
  2256. UsedParams: cardinal;
  2257. UseDefault: boolean;
  2258. sl_RegCombi1: string;
  2259. sl_RegCombi2: string;
  2260. sl_RegCombi3: string;
  2261. function PrepareOperandTyp(const aTyp: String): String;
  2262. begin
  2263. result := aTyp;
  2264. if copy(result, length(result), 1) = '*' then result := copy(result, 1, length(result) - 1);
  2265. if result = 'XMMRM128' then result := 'XMMRM';
  2266. if result = 'YMMRM256' then result := 'YMMRM';
  2267. end;
  2268. begin
  2269. result := TStringList.Create;
  2270. OItem1 := TOperandListItem.Create;
  2271. try
  2272. OItem2 := TOperandListItem.Create;
  2273. try
  2274. OItem3 := TOperandListItem.Create;
  2275. try
  2276. OItem4 := TOperandListItem.Create;
  2277. try
  2278. UsePrefix := (UpperCase(aInst) = 'VCVTPD2DQ') OR
  2279. (UpperCase(aInst) = 'VCVTPD2PS') OR
  2280. (UpperCase(aInst) = 'VCVTSI2SD') OR
  2281. (UpperCase(aInst) = 'VCVTSI2SS') OR
  2282. (UpperCase(aInst) = 'VCVTTPD2DQ') or
  2283. (UpperCase(aInst) = 'VPMOVZXWQ') or
  2284. (UpperCase(aInst) = 'VCVTPD2UDQ') or
  2285. (UpperCase(aInst) = 'VCVTPD2UDQ') or
  2286. (UpperCase(aInst) = 'VCVTTPD2UDQ') or
  2287. (UpperCase(aInst) = 'VCVTUQQ2PS') or
  2288. (UpperCase(aInst) = 'VCVTQQ2PS') or
  2289. (UpperCase(aInst) = 'VCVTUSI2SD') or
  2290. (UpperCase(aInst) = 'VCVTUSI2SS') or
  2291. (UpperCase(aInst) = 'VFPCLASSPD') or
  2292. (UpperCase(aInst) = 'VFPCLASSPS') or
  2293. (UpperCase(aInst) = 'VCMPSS')
  2294. ;
  2295. for il_Op := 1 to 4 do
  2296. begin
  2297. sl_Prefix := '';
  2298. case il_Op of
  2299. 1: begin
  2300. Item := OItem1;
  2301. sl_Operand := aOp1;
  2302. end;
  2303. 2: begin
  2304. Item := OItem2;
  2305. sl_Operand := aOp2;
  2306. end;
  2307. 3: begin
  2308. Item := OItem3;
  2309. sl_Operand := aOp3;
  2310. end;
  2311. 4: begin
  2312. Item := OItem4;
  2313. sl_Operand := aOp4;
  2314. end;
  2315. end;
  2316. sl_Operand := PrepareOperandTyp(sl_Operand);
  2317. if (AnsiSameText(sl_Operand, 'XMMREG')) or
  2318. (AnsiSameText(sl_Operand, 'XMMREG_M')) or
  2319. (AnsiSameText(sl_Operand, 'XMMREG_MZ')) or
  2320. (AnsiSameText(sl_Operand, 'XMMREG_ER')) or
  2321. (AnsiSameText(sl_Operand, 'XMMREG_SAE')) then
  2322. begin
  2323. Item.OpNumber := il_Op;
  2324. Item.OpTyp := otXMMReg;
  2325. Item.OpActive := true;
  2326. Item.Values.Add('XMM0');
  2327. end
  2328. else if (AnsiSameText(sl_Operand, 'XMMRM')) or
  2329. (AnsiSameText(sl_Operand, 'XMMRM_M')) or
  2330. (AnsiSameText(sl_Operand, 'XMMRM_MZ')) or
  2331. (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
  2332. (AnsiSameText(sl_Operand, 'XMMRM_SAE')) then
  2333. begin
  2334. Item.OpNumber := il_Op;
  2335. Item.OpTyp := otXMMRM;
  2336. Item.OpActive := true;
  2337. if UsePrefix then sl_Prefix := 'oword ';
  2338. Item.Values.Add(' lOWord');
  2339. Item.Values.Add(' gOWord');
  2340. Item.Values.Add(' clOWord');
  2341. Item.Values.Add(' cgOWord');
  2342. Item.Values.Add(' oword lOWord');
  2343. Item.Values.Add(' oword gOWord');
  2344. Item.Values.Add(' oword clOWord');
  2345. Item.Values.Add(' oword cgOWord');
  2346. Item.Values.Add(' byte lOWord');
  2347. Item.Values.Add(' byte gOWord');
  2348. Item.Values.Add(' byte clOWord');
  2349. Item.Values.Add(' byte cgOWord');
  2350. Item.Values.Add(' lRec');
  2351. Item.Values.Add(' gRec');
  2352. Item.Values.Add(' oword lRec');
  2353. Item.Values.Add(' oword gRec');
  2354. Item.Values.Add(' oword lRec.rOWord');
  2355. Item.Values.Add(' oword gRec.rOWord');
  2356. Item.Values.Add(' lRec.rByte');
  2357. Item.Values.Add(' gRec.rByte');
  2358. Item.Values.Add(' lRec.rWord');
  2359. Item.Values.Add(' gRec.rWord');
  2360. Item.Values.Add(' lRec.rDWord');
  2361. Item.Values.Add(' gRec.rDWord');
  2362. Item.Values.Add(' lRec.rQWord');
  2363. Item.Values.Add(' gRec.rQWord');
  2364. Item.Values.Add(' lRec.rOWord');
  2365. Item.Values.Add(' gRec.rOWord');
  2366. Item.Values.Add(' lRec.rYWord');
  2367. Item.Values.Add(' gRec.rYWord');
  2368. Item.Values.Add(' lRec.rZWord');
  2369. Item.Values.Add(' gRec.rZWord');
  2370. end
  2371. else if (AnsiSameText(sl_Operand, 'XMMRM8')) or
  2372. (AnsiSameText(sl_Operand, 'XMMRM8_M')) or
  2373. (AnsiSameText(sl_Operand, 'XMMRM8_MZ')) or
  2374. (AnsiSameText(sl_Operand, 'XMMRM8_ER')) or
  2375. (AnsiSameText(sl_Operand, 'XMMRM8_SAE')) then
  2376. begin
  2377. Item.OpNumber := il_Op;
  2378. Item.OpTyp := otXMMRM8;
  2379. Item.OpActive := true;
  2380. if UsePrefix then sl_Prefix := 'byte ';
  2381. Item.Values.Add('lbyte');
  2382. Item.Values.Add('gbyte');
  2383. Item.Values.Add('clbyte');
  2384. Item.Values.Add('cgbyte');
  2385. Item.Values.Add('byte lbyte');
  2386. Item.Values.Add('byte gbyte');
  2387. Item.Values.Add('byte clbyte');
  2388. Item.Values.Add('byte cgbyte');
  2389. Item.Values.Add(' lRec');
  2390. Item.Values.Add(' gRec');
  2391. Item.Values.Add(' byte lRec');
  2392. Item.Values.Add(' byte gRec');
  2393. Item.Values.Add(' lRec');
  2394. Item.Values.Add(' gRec');
  2395. Item.Values.Add(' lRec.rByte');
  2396. Item.Values.Add(' gRec.rByte');
  2397. Item.Values.Add(' lRec.rWord');
  2398. Item.Values.Add(' gRec.rWord');
  2399. Item.Values.Add(' lRec.rDWord');
  2400. Item.Values.Add(' gRec.rDWord');
  2401. Item.Values.Add(' lRec.rQWord');
  2402. Item.Values.Add(' gRec.rQWord');
  2403. Item.Values.Add(' lRec.rOWord');
  2404. Item.Values.Add(' gRec.rOWord');
  2405. Item.Values.Add(' lRec.rYWord');
  2406. Item.Values.Add(' gRec.rYWord');
  2407. Item.Values.Add(' lRec.rZWord');
  2408. Item.Values.Add(' gRec.rZWord');
  2409. end
  2410. else if (AnsiSameText(sl_Operand, 'XMMRM16')) or
  2411. (AnsiSameText(sl_Operand, 'XMMRM16_M')) or
  2412. (AnsiSameText(sl_Operand, 'XMMRM16_MZ')) or
  2413. (AnsiSameText(sl_Operand, 'XMMRM16_ER')) or
  2414. (AnsiSameText(sl_Operand, 'XMMRM16_SAE'))
  2415. then
  2416. begin
  2417. Item.OpNumber := il_Op;
  2418. Item.OpTyp := otXMMRM16;
  2419. Item.OpActive := true;
  2420. Item.Values.Add('lword');
  2421. Item.Values.Add('gword');
  2422. Item.Values.Add('clword');
  2423. Item.Values.Add('cgword');
  2424. Item.Values.Add('word lword');
  2425. Item.Values.Add('word gword');
  2426. Item.Values.Add('word clword');
  2427. Item.Values.Add('word cgword');
  2428. Item.Values.Add(' lRec');
  2429. Item.Values.Add(' gRec');
  2430. Item.Values.Add(' word lRec');
  2431. Item.Values.Add(' word gRec');
  2432. Item.Values.Add(' lRec.rByte');
  2433. Item.Values.Add(' gRec.rByte');
  2434. Item.Values.Add(' lRec.rWord');
  2435. Item.Values.Add(' gRec.rWord');
  2436. Item.Values.Add(' lRec.rDWord');
  2437. Item.Values.Add(' gRec.rDWord');
  2438. Item.Values.Add(' lRec.rQWord');
  2439. Item.Values.Add(' gRec.rQWord');
  2440. Item.Values.Add(' lRec.rOWord');
  2441. Item.Values.Add(' gRec.rOWord');
  2442. Item.Values.Add(' lRec.rYWord');
  2443. Item.Values.Add(' gRec.rYWord');
  2444. Item.Values.Add(' lRec.rZWord');
  2445. Item.Values.Add(' gRec.rZWord');
  2446. end
  2447. else if (AnsiSameText(sl_Operand, 'YMMREG')) or
  2448. (AnsiSameText(sl_Operand, 'YMMREG_M')) or
  2449. (AnsiSameText(sl_Operand, 'YMMREG_MZ')) or
  2450. (AnsiSameText(sl_Operand, 'YMMREG_ER')) or
  2451. (AnsiSameText(sl_Operand, 'YMMREG_SAE'))
  2452. then
  2453. begin
  2454. Item.OpNumber := il_Op;
  2455. Item.OpTyp := otYMMReg;
  2456. Item.OpActive := true;
  2457. Item.Values.Add('YMM0');
  2458. end
  2459. else if (AnsiSameText(sl_Operand, 'YMMRM')) or
  2460. (AnsiSameText(sl_Operand, 'YMMRM_M')) or
  2461. (AnsiSameText(sl_Operand, 'YMMRM_MZ')) or
  2462. (AnsiSameText(sl_Operand, 'YMMRM_ER')) or
  2463. (AnsiSameText(sl_Operand, 'YMMRM_SAE'))
  2464. then
  2465. begin
  2466. Item.OpNumber := il_Op;
  2467. Item.OpTyp := otYMMRM;
  2468. Item.OpActive := true;
  2469. Item.Values.Add('lYWord');
  2470. Item.Values.Add('gYWord');
  2471. Item.Values.Add('clYWord');
  2472. Item.Values.Add('cgYWord');
  2473. Item.Values.Add('yword lYWord');
  2474. Item.Values.Add('yword gYWord');
  2475. Item.Values.Add('yword clYWord');
  2476. Item.Values.Add('yword cgYWord');
  2477. Item.Values.Add(' lRec');
  2478. Item.Values.Add(' gRec');
  2479. Item.Values.Add(' yword lRec');
  2480. Item.Values.Add(' yword gRec');
  2481. Item.Values.Add(' lRec.rByte');
  2482. Item.Values.Add(' gRec.rByte');
  2483. Item.Values.Add(' lRec.rWord');
  2484. Item.Values.Add(' gRec.rWord');
  2485. Item.Values.Add(' lRec.rDWord');
  2486. Item.Values.Add(' gRec.rDWord');
  2487. Item.Values.Add(' lRec.rQWord');
  2488. Item.Values.Add(' gRec.rQWord');
  2489. Item.Values.Add(' lRec.rOWord');
  2490. Item.Values.Add(' gRec.rOWord');
  2491. Item.Values.Add(' lRec.rYWord');
  2492. Item.Values.Add(' gRec.rYWord');
  2493. Item.Values.Add(' lRec.rZWord');
  2494. Item.Values.Add(' gRec.rZWord');
  2495. end
  2496. else if (AnsiSameText(sl_Operand, 'ZMMREG')) or
  2497. (AnsiSameText(sl_Operand, 'ZMMREG_M')) or
  2498. (AnsiSameText(sl_Operand, 'ZMMREG_MZ')) or
  2499. (AnsiSameText(sl_Operand, 'ZMMREG_ER')) or
  2500. (AnsiSameText(sl_Operand, 'ZMMREG_SAE'))
  2501. then
  2502. begin
  2503. Item.OpNumber := il_Op;
  2504. Item.OpTyp := otZMMReg;
  2505. Item.OpActive := true;
  2506. Item.Values.Add('ZMM0');
  2507. end
  2508. else if (AnsiSameText(sl_Operand, 'ZMMRM')) or
  2509. (AnsiSameText(sl_Operand, 'ZMMRM_M')) or
  2510. (AnsiSameText(sl_Operand, 'ZMMRM_MZ')) or
  2511. (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
  2512. (AnsiSameText(sl_Operand, 'XMMRM_SAE'))
  2513. then
  2514. begin
  2515. Item.OpNumber := il_Op;
  2516. Item.OpTyp := otZMMRM;
  2517. Item.OpActive := true;
  2518. Item.Values.Add('lZWord');
  2519. Item.Values.Add('gZWord');
  2520. Item.Values.Add('clZWord');
  2521. Item.Values.Add('cgZWord');
  2522. Item.Values.Add('zword lZWord');
  2523. Item.Values.Add('zword gZWord');
  2524. Item.Values.Add('zword clZWord');
  2525. Item.Values.Add('zword cgZWord');
  2526. Item.Values.Add(' lRec');
  2527. Item.Values.Add(' gRec');
  2528. Item.Values.Add(' zword lRec');
  2529. Item.Values.Add(' zword gRec');
  2530. Item.Values.Add(' lRec.rByte');
  2531. Item.Values.Add(' gRec.rByte');
  2532. Item.Values.Add(' lRec.rWord');
  2533. Item.Values.Add(' gRec.rWord');
  2534. Item.Values.Add(' lRec.rDWord');
  2535. Item.Values.Add(' gRec.rDWord');
  2536. Item.Values.Add(' lRec.rQWord');
  2537. Item.Values.Add(' gRec.rQWord');
  2538. Item.Values.Add(' lRec.rOWord');
  2539. Item.Values.Add(' gRec.rOWord');
  2540. Item.Values.Add(' lRec.rYWord');
  2541. Item.Values.Add(' gRec.rYWord');
  2542. Item.Values.Add(' lRec.rZWord');
  2543. Item.Values.Add(' gRec.rZWord');
  2544. end
  2545. else if AnsiSameText(sl_Operand, 'MEM8') then
  2546. begin
  2547. Item.OpNumber := il_Op;
  2548. Item.OpTyp := otMEM8;
  2549. Item.OpActive := true;
  2550. Item.Values.Add('lByte');
  2551. Item.Values.Add('gByte');
  2552. Item.Values.Add('clByte');
  2553. Item.Values.Add('cgByte');
  2554. Item.Values.Add('byte lByte');
  2555. Item.Values.Add('byte gByte');
  2556. Item.Values.Add('byte clByte');
  2557. Item.Values.Add('byte cgByte');
  2558. Item.Values.Add(' lRec');
  2559. Item.Values.Add(' gRec');
  2560. Item.Values.Add(' byte lRec');
  2561. Item.Values.Add(' byte gRec');
  2562. Item.Values.Add(' lRec.rByte');
  2563. Item.Values.Add(' gRec.rByte');
  2564. end
  2565. else if AnsiSameText(sl_Operand, 'MEM16') or
  2566. AnsiSameText(sl_Operand, 'MEM16_M') then
  2567. begin
  2568. Item.OpNumber := il_Op;
  2569. Item.OpTyp := otMEM16;
  2570. Item.OpActive := true;
  2571. Item.Values.Add('lWord');
  2572. Item.Values.Add('gWord');
  2573. Item.Values.Add('clWord');
  2574. Item.Values.Add('cgWord');
  2575. Item.Values.Add('word lWord');
  2576. Item.Values.Add('word gWord');
  2577. Item.Values.Add('word clWord');
  2578. Item.Values.Add('word cgWord');
  2579. Item.Values.Add(' word lRec');
  2580. Item.Values.Add(' word gRec');
  2581. Item.Values.Add(' lRec.rWord');
  2582. Item.Values.Add(' gRec.rWord');
  2583. end
  2584. else if AnsiSameText(sl_Operand, 'MEM32') or
  2585. AnsiSameText(sl_Operand, 'MEM32_M') or
  2586. AnsiSameText(sl_Operand, 'MEM32_MZ') then
  2587. begin
  2588. Item.OpNumber := il_Op;
  2589. Item.OpTyp := otMEM32;
  2590. Item.OpActive := true;
  2591. Item.Values.Add('lDWord');
  2592. Item.Values.Add('gDWord');
  2593. Item.Values.Add('clDWord');
  2594. Item.Values.Add('cgDWord');
  2595. Item.Values.Add('dword lDWord');
  2596. Item.Values.Add('dword gDWord');
  2597. Item.Values.Add('dword clDWord');
  2598. Item.Values.Add('dword cgDWord');
  2599. Item.Values.Add(' dword lRec');
  2600. Item.Values.Add(' dword gRec');
  2601. Item.Values.Add(' lRec.rDWord');
  2602. Item.Values.Add(' gRec.rDWord');
  2603. end
  2604. else if (AnsiSameText(sl_Operand, 'MEM64')) or
  2605. (AnsiSameText(sl_Operand, 'MEM64_M')) or
  2606. (AnsiSameText(sl_Operand, 'MEM64_MZ')) then
  2607. begin
  2608. Item.OpNumber := il_Op;
  2609. Item.OpTyp := otMEM64;
  2610. Item.OpActive := true;
  2611. Item.Values.Add('lQWord');
  2612. Item.Values.Add('gQWord');
  2613. Item.Values.Add('clQWord');
  2614. Item.Values.Add('cgQWord');
  2615. Item.Values.Add('qword lQWord');
  2616. Item.Values.Add('qword gQWord');
  2617. Item.Values.Add('qword clQWord');
  2618. Item.Values.Add('qword cgQWord');
  2619. Item.Values.Add(' qword lRec');
  2620. Item.Values.Add(' qword gRec');
  2621. Item.Values.Add(' lRec.rQWord');
  2622. Item.Values.Add(' gRec.rQWord');
  2623. end
  2624. else if (AnsiSameText(sl_Operand, 'MEM128')) or
  2625. (AnsiSameText(sl_Operand, 'MEM128_M')) or
  2626. (AnsiSameText(sl_Operand, 'MEM128_MZ')) then
  2627. begin
  2628. Item.OpNumber := il_Op;
  2629. Item.OpTyp := otMEM128;
  2630. Item.OpActive := true;
  2631. Item.Values.Add('lOWord');
  2632. Item.Values.Add('gOWord');
  2633. Item.Values.Add('clOWord');
  2634. Item.Values.Add('cgOWord');
  2635. Item.Values.Add('oword lOWord');
  2636. Item.Values.Add('oword gOWord');
  2637. Item.Values.Add('oword clOWord');
  2638. Item.Values.Add('oword cgOWord');
  2639. Item.Values.Add(' lRec');
  2640. Item.Values.Add(' gRec');
  2641. Item.Values.Add(' oword lRec');
  2642. Item.Values.Add(' oword gRec');
  2643. Item.Values.Add(' lRec.rByte');
  2644. Item.Values.Add(' gRec.rByte');
  2645. Item.Values.Add(' lRec.rWord');
  2646. Item.Values.Add(' gRec.rWord');
  2647. Item.Values.Add(' lRec.rDWord');
  2648. Item.Values.Add(' gRec.rDWord');
  2649. Item.Values.Add(' lRec.rQWord');
  2650. Item.Values.Add(' gRec.rQWord');
  2651. Item.Values.Add(' lRec.rOWord');
  2652. Item.Values.Add(' gRec.rOWord');
  2653. Item.Values.Add(' lRec.rYWord');
  2654. Item.Values.Add(' gRec.rYWord');
  2655. Item.Values.Add(' lRec.rZWord');
  2656. Item.Values.Add(' gRec.rZWord');
  2657. end
  2658. else if (AnsiSameText(sl_Operand, 'MEM256')) or
  2659. (AnsiSameText(sl_Operand, 'MEM256_M')) or
  2660. (AnsiSameText(sl_Operand, 'MEM256_MZ')) then
  2661. begin
  2662. Item.OpNumber := il_Op;
  2663. Item.OpTyp := otMEM256;
  2664. Item.OpActive := true;
  2665. Item.Values.Add('lYWord');
  2666. Item.Values.Add('gYWord');
  2667. Item.Values.Add('clYWord');
  2668. Item.Values.Add('cgYWord');
  2669. Item.Values.Add('yword lYWord');
  2670. Item.Values.Add('yword gYWord');
  2671. Item.Values.Add('yword clYWord');
  2672. Item.Values.Add('yword cgYWord');
  2673. Item.Values.Add(' lRec');
  2674. Item.Values.Add(' gRec');
  2675. Item.Values.Add(' yword lRec');
  2676. Item.Values.Add(' yword gRec');
  2677. Item.Values.Add(' lRec.rByte');
  2678. Item.Values.Add(' gRec.rByte');
  2679. Item.Values.Add(' lRec.rWord');
  2680. Item.Values.Add(' gRec.rWord');
  2681. Item.Values.Add(' lRec.rDWord');
  2682. Item.Values.Add(' gRec.rDWord');
  2683. Item.Values.Add(' lRec.rQWord');
  2684. Item.Values.Add(' gRec.rQWord');
  2685. Item.Values.Add(' lRec.rOWord');
  2686. Item.Values.Add(' gRec.rOWord');
  2687. Item.Values.Add(' lRec.rYWord');
  2688. Item.Values.Add(' gRec.rYWord');
  2689. Item.Values.Add(' lRec.rZWord');
  2690. Item.Values.Add(' gRec.rZWord');
  2691. end
  2692. else if (AnsiSameText(sl_Operand, 'MEM512')) or
  2693. (AnsiSameText(sl_Operand, 'MEM512_M')) or
  2694. (AnsiSameText(sl_Operand, 'MEM512_MZ')) then
  2695. begin
  2696. Item.OpNumber := il_Op;
  2697. Item.OpTyp := otMEM512;
  2698. Item.OpActive := true;
  2699. Item.Values.Add('lZWord');
  2700. Item.Values.Add('gZWord');
  2701. Item.Values.Add('clZWord');
  2702. Item.Values.Add('cgZWord');
  2703. Item.Values.Add('zword lZWord');
  2704. Item.Values.Add('zword gZWord');
  2705. Item.Values.Add('zword clZWord');
  2706. Item.Values.Add('zword cgZWord');
  2707. Item.Values.Add(' lRec');
  2708. Item.Values.Add(' gRec');
  2709. Item.Values.Add(' zword lRec');
  2710. Item.Values.Add(' zword gRec');
  2711. end
  2712. else if AnsiSameText(sl_Operand, 'REG8') then
  2713. begin
  2714. Item.OpNumber := il_Op;
  2715. Item.OpTyp := otREG8;
  2716. Item.OpActive := true;
  2717. Item.Values.Add('al');
  2718. end
  2719. else if AnsiSameText(sl_Operand, 'REG16') then
  2720. begin
  2721. Item.OpNumber := il_Op;
  2722. Item.OpTyp := otREG16;
  2723. Item.OpActive := true;
  2724. Item.Values.Add('ax');
  2725. end
  2726. else if AnsiSameText(sl_Operand, 'REG32') then
  2727. begin
  2728. Item.OpNumber := il_Op;
  2729. Item.OpTyp := otREG32;
  2730. Item.OpActive := true;
  2731. Item.Values.Add('eax');
  2732. end
  2733. else if AnsiSameText(sl_Operand, 'REG64') then
  2734. begin
  2735. Item.OpNumber := il_Op;
  2736. Item.OpTyp := otREG64;
  2737. Item.OpActive := true;
  2738. Item.Values.Add('rax');
  2739. end
  2740. else if AnsiSameText(sl_Operand, 'RM32') then
  2741. begin
  2742. Item.OpNumber := il_Op;
  2743. Item.OpTyp := otRM32;
  2744. Item.OpActive := true;
  2745. Item.Values.Add('lDWord');
  2746. Item.Values.Add('gDWord');
  2747. end
  2748. else if AnsiSameText(sl_Operand, 'RM64') then
  2749. begin
  2750. Item.OpNumber := il_Op;
  2751. Item.OpTyp := otRM64;
  2752. Item.OpActive := true;
  2753. Item.Values.Add('lQWord');
  2754. Item.Values.Add('gQWord');
  2755. end
  2756. else if AnsiSameText(sl_Operand, 'IMM8') then
  2757. begin
  2758. Item.OpNumber := il_Op;
  2759. Item.OpTyp := otIMM8;
  2760. Item.OpActive := true;
  2761. Item.Values.Add('0');
  2762. end
  2763. else if AnsiSameText(sl_Operand, 'XMEM32') or
  2764. AnsiSameText(sl_Operand, 'XMEM32_M') then
  2765. begin
  2766. Item.OpNumber := il_Op;
  2767. Item.OpTyp := otXMEM32;
  2768. Item.OpActive := true;
  2769. end
  2770. else if AnsiSameText(sl_Operand, 'XMEM64') or
  2771. AnsiSameText(sl_Operand, 'XMEM64_M') then
  2772. begin
  2773. Item.OpNumber := il_Op;
  2774. Item.OpTyp := otXMEM64;
  2775. Item.OpActive := true;
  2776. end
  2777. else if AnsiSameText(sl_Operand, 'YMEM32') or
  2778. AnsiSameText(sl_Operand, 'YMEM32_M') then
  2779. begin
  2780. Item.OpNumber := il_Op;
  2781. Item.OpTyp := otYMEM32;
  2782. Item.OpActive := true;
  2783. end
  2784. else if AnsiSameText(sl_Operand, 'YMEM64') or
  2785. AnsiSameText(sl_Operand, 'YMEM64_M') then
  2786. begin
  2787. Item.OpNumber := il_Op;
  2788. Item.OpTyp := otYMEM64;
  2789. Item.OpActive := true;
  2790. if UsePrefix then sl_Prefix := 'yword ';
  2791. end
  2792. else if AnsiSameText(sl_Operand, 'ZMEM32') or
  2793. AnsiSameText(sl_Operand, 'ZMEM32_M') then
  2794. begin
  2795. Item.OpNumber := il_Op;
  2796. Item.OpTyp := otZMEM32;
  2797. Item.OpActive := true;
  2798. if UsePrefix then sl_Prefix := 'zword ';
  2799. end
  2800. else if AnsiSameText(sl_Operand, 'ZMEM64') or
  2801. AnsiSameText(sl_Operand, 'ZMEM64_M') then
  2802. begin
  2803. Item.OpNumber := il_Op;
  2804. Item.OpTyp := otZMEM64;
  2805. Item.OpActive := true;
  2806. if UsePrefix then sl_Prefix := 'zword ';
  2807. end
  2808. else if AnsiSameText(sl_Operand, '2B32') then
  2809. begin
  2810. Item.OpNumber := il_Op;
  2811. Item.OpTyp := otB32;
  2812. Item.OpActive := true;
  2813. Item.Values.Add('lDWord {1to2}');
  2814. Item.Values.Add('gDWord {1to2}');
  2815. end
  2816. else if AnsiSameText(sl_Operand, '4B32') then
  2817. begin
  2818. Item.OpNumber := il_Op;
  2819. Item.OpTyp := otB32;
  2820. Item.OpActive := true;
  2821. Item.Values.Add('lDWord {1to4}');
  2822. Item.Values.Add('gDWord {1to4}');
  2823. end
  2824. else if AnsiSameText(sl_Operand, '8B32') then
  2825. begin
  2826. Item.OpNumber := il_Op;
  2827. Item.OpTyp := otB32;
  2828. Item.OpActive := true;
  2829. Item.Values.Add('lDWord {1to8}');
  2830. Item.Values.Add('gDWord {1to8}');
  2831. end
  2832. else if AnsiSameText(sl_Operand, '16B32') then
  2833. begin
  2834. Item.OpNumber := il_Op;
  2835. Item.OpTyp := otB32;
  2836. Item.OpActive := true;
  2837. Item.Values.Add('lDWord {1to16}');
  2838. Item.Values.Add('gDWord {1to16}');
  2839. end
  2840. else if AnsiSameText(sl_Operand, '2B64') then
  2841. begin
  2842. Item.OpNumber := il_Op;
  2843. Item.OpTyp := otB64;
  2844. Item.OpActive := true;
  2845. Item.Values.Add('lQWord {1to2}');
  2846. Item.Values.Add('gQWord {1to2}');
  2847. end
  2848. else if AnsiSameText(sl_Operand, '4B64') then
  2849. begin
  2850. Item.OpNumber := il_Op;
  2851. Item.OpTyp := otB64;
  2852. Item.OpActive := true;
  2853. Item.Values.Add('lQWord {1to4}');
  2854. Item.Values.Add('gQWord {1to4}');
  2855. end
  2856. else if AnsiSameText(sl_Operand, '8B64') then
  2857. begin
  2858. Item.OpNumber := il_Op;
  2859. Item.OpTyp := otB64;
  2860. Item.OpActive := true;
  2861. Item.Values.Add('lQWord {1to8}');
  2862. Item.Values.Add('gQWord {1to8}');
  2863. end
  2864. else if AnsiSameText(sl_Operand, '16B64') then
  2865. begin
  2866. Item.OpNumber := il_Op;
  2867. Item.OpTyp := otB64;
  2868. Item.OpActive := true;
  2869. Item.Values.Add('lQWord {1to16}');
  2870. Item.Values.Add('gQWord {1to16}');
  2871. end
  2872. else if AnsiSameText(sl_Operand, 'KREG') or
  2873. AnsiSameText(sl_Operand, 'KREG_M') then
  2874. begin
  2875. Item.OpNumber := il_Op;
  2876. Item.OpTyp := otKREG;
  2877. Item.OpActive := true;
  2878. Item.Values.Add('k1');
  2879. end
  2880. else if trim(sl_Operand) = '' then
  2881. begin
  2882. Item.OpNumber := il_Op;
  2883. Item.OpTyp := otUnknown;
  2884. Item.OpActive := false;
  2885. Item.Values.Add('');
  2886. end
  2887. else
  2888. begin
  2889. Item.OpNumber := il_Op;
  2890. Item.OpTyp := otUnknown;
  2891. Item.OpActive := false;
  2892. Item.Values.Add('?' + sl_Operand);
  2893. end
  2894. end;
  2895. sl_RegCombi := '';
  2896. il_Operands := 0;
  2897. UsedParams := 0;
  2898. if OItem1.OpActive then
  2899. begin
  2900. inc(il_Operands);
  2901. UsedParams := UsedParams or 1;
  2902. end;
  2903. if OItem2.OpActive then
  2904. begin
  2905. inc(il_Operands);
  2906. UsedParams := UsedParams or 2;
  2907. end;
  2908. if OItem3.OpActive then
  2909. begin
  2910. inc(il_Operands);
  2911. UsedParams := UsedParams or 4;
  2912. end;
  2913. if OItem4.OpActive then
  2914. begin
  2915. inc(il_Operands);
  2916. UsedParams := UsedParams or 8;
  2917. end;
  2918. case il_Operands of
  2919. 1: UseDefault := UsedParams <> 1;
  2920. 2: UseDefault := UsedParams <> 3;
  2921. 3: UseDefault := UsedParams <> 7;
  2922. 4: UseDefault := UsedParams <> 15;
  2923. else UseDefault := true;
  2924. end;
  2925. //UseDefault := true;
  2926. if UseDefault then
  2927. begin
  2928. sl_Inst := format('%-20s', [aInst]);
  2929. for il_Op1 := 0 to OItem1.Values.Count - 1 do
  2930. begin
  2931. for il_Op2 := 0 to OItem2.Values.Count - 1 do
  2932. begin
  2933. for il_Op3 := 0 to OItem3.Values.Count - 1 do
  2934. begin
  2935. for il_Op4 := 0 to OItem4.Values.Count - 1 do
  2936. begin
  2937. sl_RegCombi := '';
  2938. if OItem1.OpActive then
  2939. begin
  2940. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  2941. sl_RegCombi := sl_RegCombi + OItem1.Values[il_Op1];
  2942. end;
  2943. if OItem2.OpActive then
  2944. begin
  2945. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  2946. sl_RegCombi := sl_RegCombi + OItem2.Values[il_Op2];
  2947. end;
  2948. if OItem3.OpActive then
  2949. begin
  2950. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  2951. sl_RegCombi := sl_RegCombi + OItem3.Values[il_Op3];
  2952. end;
  2953. if OItem4.OpActive then
  2954. begin
  2955. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  2956. sl_RegCombi := sl_RegCombi + OItem4.Values[il_Op4];
  2957. end;
  2958. if sl_RegCombi <> '' then
  2959. begin
  2960. //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
  2961. result.Add(sl_Inst + sl_RegCombi);
  2962. sl_RegCombi := '';
  2963. end;
  2964. end;
  2965. end;
  2966. end;
  2967. end;
  2968. end
  2969. else
  2970. begin
  2971. sl_Inst := format('%-20s', [aInst]);
  2972. for il_Op1 := 0 to OItem1.Values.Count - 1 do
  2973. begin
  2974. if OItem1.OpActive then
  2975. begin
  2976. sl_RegCombi1 := OItem1.Values[il_Op1];
  2977. end
  2978. else sl_RegCombi1 := '';
  2979. for il_Op2 := 0 to OItem2.Values.Count - 1 do
  2980. begin
  2981. if OItem2.OpActive then
  2982. begin
  2983. sl_RegCombi2 := sl_RegCombi1 + ', ' + OItem2.Values[il_Op2];
  2984. end
  2985. else sl_RegCombi2 := sl_RegCombi1;
  2986. for il_Op3 := 0 to OItem3.Values.Count - 1 do
  2987. begin
  2988. if OItem3.OpActive then
  2989. begin
  2990. sl_RegCombi3 := sl_RegCombi2 + ', ' + OItem3.Values[il_Op3];
  2991. end
  2992. else sl_RegCombi3 := sl_RegCombi2;
  2993. for il_Op4 := 0 to OItem4.Values.Count - 1 do
  2994. begin
  2995. if OItem4.OpActive then
  2996. begin
  2997. sl_RegCombi := sl_RegCombi3 + ', ' + OItem4.Values[il_Op4];
  2998. end
  2999. else sl_RegCombi := sl_RegCombi3;
  3000. if sl_RegCombi <> '' then
  3001. begin
  3002. //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
  3003. result.Add(sl_Inst + sl_RegCombi);
  3004. sl_RegCombi := '';
  3005. end;
  3006. end;
  3007. end;
  3008. end;
  3009. end;
  3010. end;
  3011. finally
  3012. FreeAndNil(OItem4);
  3013. end;
  3014. finally
  3015. FreeAndNil(OItem3);
  3016. end;
  3017. finally
  3018. FreeAndNil(OItem2);
  3019. end;
  3020. finally
  3021. FreeAndNil(OItem1);
  3022. end;
  3023. end;
  3024. function TAsmTestGenerator.InternalCalcTestDataCDISP8(const aInst, aOp1, aOp2,
  3025. aOp3, aOp4: String): TStringList;
  3026. var
  3027. i: integer;
  3028. Item: TOperandListItem;
  3029. OItem1: TOperandListItem;
  3030. OItem2: TOperandListItem;
  3031. OItem3: TOperandListItem;
  3032. OItem4: TOperandListItem;
  3033. il_Op: integer;
  3034. il_Op1: integer;
  3035. il_Op2: integer;
  3036. il_Op3: integer;
  3037. il_Op4: integer;
  3038. iAsmCounter: integer;
  3039. sSuffix: string;
  3040. sReg: string;
  3041. sl_Operand: String;
  3042. sl_Inst : String;
  3043. sRegCombi: String;
  3044. sRegCombi1: String;
  3045. sRegCombi2: String;
  3046. sRegCombi3: String;
  3047. sRegCombi4: String;
  3048. sBaseReg : String;
  3049. sIndexReg : String;
  3050. sl_Prefix: String;
  3051. UsePrefix: boolean;
  3052. il_Operands: integer;
  3053. UsedParams: cardinal;
  3054. UseDefault: boolean;
  3055. sl_RegCombi1: string;
  3056. sl_RegCombi2: string;
  3057. sl_RegCombi3: string;
  3058. sInstruction: string;
  3059. sMREF: string;
  3060. sLogMsg: string;
  3061. MaskRegNeeded:boolean;
  3062. slRegCombi: TStringList;
  3063. OpMode: TOpMode;
  3064. iOpNumMRef: integer;
  3065. function PrepareOperandTyp(const aTyp: String): String;
  3066. begin
  3067. result := aTyp;
  3068. if copy(result, length(result), 1) = '*' then result := copy(result, 1, length(result) - 1);
  3069. if result = 'XMMRM128' then result := 'XMMRM';
  3070. if result = 'YMMRM256' then result := 'YMMRM';
  3071. end;
  3072. procedure SplitOperands(const aOperand1, aOperand2, aOperand3, aOperand4: string; var aRegCombi0, aRegCombi1, aRegCombi2, aRegCombi3, aRegCombi4: string);
  3073. var
  3074. i: integer;
  3075. s1: string;
  3076. s2: string;
  3077. s3: string;
  3078. s4: string;
  3079. iCnt1: integer;
  3080. iCnt2: integer;
  3081. iCnt3: integer;
  3082. iCnt4: integer;
  3083. iMaxCnt: integer;
  3084. begin
  3085. with TStringList.Create do
  3086. try
  3087. Text := StringReplace(trim(aOperand1), '|', #13#10, [rfReplaceAll]);
  3088. iCnt1 := Count;
  3089. Text := StringReplace(trim(aOperand2), '|', #13#10, [rfReplaceAll]);
  3090. iCnt2 := Count;
  3091. Text := StringReplace(trim(aOperand3), '|', #13#10, [rfReplaceAll]);
  3092. iCnt3 := Count;
  3093. Text := StringReplace(trim(aOperand4), '|', #13#10, [rfReplaceAll]);
  3094. iCnt4 := Count;
  3095. iMaxCnt := iCnt1;
  3096. if iCnt2 > iMaxCnt then iMaxCnt := iCnt2;
  3097. if iCnt3 > iMaxCnt then iMaxCnt := iCnt3;
  3098. if iCnt4 > iMaxCnt then iMaxCnt := iCnt4;
  3099. if (aOperand1 <> '') and (aRegCombi0 <> '') then
  3100. begin
  3101. aRegCombi0 := aRegCombi0 + ',';
  3102. aRegCombi1 := aRegCombi1 + ',';
  3103. aRegCombi2 := aRegCombi2 + ',';
  3104. aRegCombi3 := aRegCombi3 + ',';
  3105. aRegCombi4 := aRegCombi4 + ',';
  3106. end;
  3107. Text := StringReplace(trim(aOperand1), '|', #13#10, [rfReplaceAll]);
  3108. if Count = iMaxCnt then
  3109. begin
  3110. for i := 0 to iMaxCnt - 1 do
  3111. begin
  3112. case i of
  3113. 0: aRegCombi0 := aRegCombi0 + ',' + Strings[i];
  3114. 1: aRegCombi1 := aRegCombi1 + ',' + Strings[i];
  3115. 2: aRegCombi2 := aRegCombi2 + ',' + Strings[i];
  3116. 3: aRegCombi3 := aRegCombi3 + ',' + Strings[i];
  3117. 4: aRegCombi4 := aRegCombi4 + ',' + Strings[i];
  3118. end;
  3119. end;
  3120. end
  3121. else
  3122. begin
  3123. if Count = 1 then
  3124. begin
  3125. for i := 0 to iMaxCnt - 1 do
  3126. begin
  3127. case i of
  3128. 0: aRegCombi0 := aRegCombi0 + ',' + Strings[0];
  3129. 1: aRegCombi1 := aRegCombi1 + ',' + Strings[0];
  3130. 2: aRegCombi2 := aRegCombi2 + ',' + Strings[0];
  3131. 3: aRegCombi3 := aRegCombi3 + ',' + Strings[0];
  3132. 4: aRegCombi4 := aRegCombi4 + ',' + Strings[0];
  3133. end;
  3134. end;
  3135. end
  3136. else
  3137. begin
  3138. // TODO log
  3139. end;
  3140. end;
  3141. finally
  3142. Free;
  3143. end;
  3144. end;
  3145. function MapOperand(aOpTyp: TOpType): String;
  3146. begin
  3147. case aOpTyp of
  3148. otXMMReg: result := 'X';
  3149. otYMMReg: result := 'Y';
  3150. otZMMReg: result := 'Z';
  3151. otEAX,
  3152. otRAX,
  3153. otREG64,
  3154. otREG32,
  3155. otREG16,
  3156. otREG8: result := 'R';
  3157. otRM32,
  3158. otRM64,
  3159. otXMMRM,
  3160. otXMMRM8,
  3161. otXMMRM16,
  3162. otYMMRM,
  3163. otZMMRM,
  3164. otMem32,
  3165. otMem8,
  3166. otMem16,
  3167. otMem64,
  3168. otMem128,
  3169. otMem256,
  3170. otMem512: result := 'M';
  3171. otIMM8: result := 'I';
  3172. otXMEM32: result := 'X32';
  3173. otXMEM64: result := 'X64';
  3174. otYMEM32: result := 'Y32';
  3175. otYMEM64: result := 'Y64';
  3176. otZMEM32: result := 'Z32';
  3177. otZMEM64: result := 'Z64';
  3178. otB32: result := 'B32';
  3179. otB64: result := 'B64';
  3180. otKREG: result := 'K';
  3181. else result := '';
  3182. end;
  3183. end;
  3184. function AsmCodeBlockCompare(aAsmCounter: integer; aCompareMode: TAsmCompareMode): String;
  3185. var
  3186. sReg: string;
  3187. begin
  3188. result := '';
  3189. case Fx64 of
  3190. true: sReg := 'RAX';
  3191. else sReg := 'EAX';
  3192. end;
  3193. with TStringList.Create do
  3194. try
  3195. Add(format('%20s%6s ', [' push', sReg]));
  3196. Add(format('%20s%6s,%s', [' mov', sReg, inttostr(aAsmCounter)]));
  3197. Add(format('%20s%6s,%s', [' kmovd', 'K7', 'EAX']));
  3198. Add(format('%20s%6s', [' pop', sReg]));
  3199. case aComparemode of
  3200. //cmKORTESTNC: begin
  3201. // Add(format('%20s%6s, %s', ['ktestb', 'K2', 'K1']));
  3202. // Add(format('%20s %6s', [' jnc', '@@CHECKRESULT']));
  3203. // end;
  3204. //cmXORTestNZ: begin
  3205. // Add(format('%20s%6s, %s', ['kortestq', 'K2', 'K2']));
  3206. // Add(format('%20s %6s', [' jnz', '@@CHECKRESULT']));
  3207. // end;
  3208. cmKORTESTNC: begin
  3209. Add(format('%20s%6s, %s', ['ktestb', 'K2', 'K1']));
  3210. Add(format('%20s%6s, %s', [' kmovq', 'R10', 'K6']));
  3211. Add(format('%20s%6s, @@%d[RIP]', ['cmovc', 'R10', aAsmCounter]));
  3212. Add(format('%20s %6s', [' jmp', 'R10']));
  3213. Add(format(' @@%d%s', [aAsmCounter, ':']));
  3214. end;
  3215. cmXORTestNZ: begin
  3216. Add(format('%20s%6s, %s', ['kortestq', 'K2', 'K2']));
  3217. Add(format('%20s%6s, %s', [' kmovq', 'R10', 'K6']));
  3218. Add(format('%20s%6s, @@%d[RIP]', ['cmovz', 'R10', aAsmCounter]));
  3219. Add(format('%20s %6s', [' jmp', 'R10']));
  3220. Add(format(' @@%d%s', [aAsmCounter, ':']));
  3221. end;
  3222. end;
  3223. result := Text;
  3224. finally
  3225. Free;
  3226. end;
  3227. end;
  3228. begin
  3229. result := TStringList.Create;
  3230. iAsmCounter := 0;
  3231. OItem1 := TOperandListItem.Create;
  3232. try
  3233. OItem2 := TOperandListItem.Create;
  3234. try
  3235. OItem3 := TOperandListItem.Create;
  3236. try
  3237. OItem4 := TOperandListItem.Create;
  3238. try
  3239. UsePrefix := (UpperCase(aInst) = 'VCVTPD2DQ') OR
  3240. (UpperCase(aInst) = 'VCVTPD2PS') OR
  3241. (UpperCase(aInst) = 'VCVTSI2SD') OR
  3242. (UpperCase(aInst) = 'VCVTSI2SS') OR
  3243. (UpperCase(aInst) = 'VCVTTPD2DQ') or
  3244. (UpperCase(aInst) = 'VPMOVZXWQ') or
  3245. (UpperCase(aInst) = 'VCVTPD2UDQ') or
  3246. (UpperCase(aInst) = 'VCVTPD2UDQ') or
  3247. (UpperCase(aInst) = 'VCVTTPD2UDQ') or
  3248. (UpperCase(aInst) = 'VCVTUQQ2PS') or
  3249. (UpperCase(aInst) = 'VCVTQQ2PS') or
  3250. (UpperCase(aInst) = 'VCVTUSI2SD') or
  3251. (UpperCase(aInst) = 'VCVTUSI2SS') or
  3252. (UpperCase(aInst) = 'VFPCLASSPD') or
  3253. (UpperCase(aInst) = 'VFPCLASSPS') or
  3254. (UpperCase(aInst) = 'VCMPSS')
  3255. ;
  3256. MaskRegNeeded := (Pos('VGATHER', Uppercase(aInst)) = 1) or
  3257. (Pos('VPGATHER', Uppercase(aInst)) = 1) or
  3258. (Pos('VPSCATTER', Uppercase(aInst)) = 1) or
  3259. (Pos('VSCATTER', Uppercase(aInst)) = 1);
  3260. for il_Op := 1 to 4 do
  3261. begin
  3262. sl_Prefix := '';
  3263. case il_Op of
  3264. 1: begin
  3265. Item := OItem1;
  3266. sl_Operand := aOp1;
  3267. end;
  3268. 2: begin
  3269. Item := OItem2;
  3270. sl_Operand := aOp2;
  3271. end;
  3272. 3: begin
  3273. Item := OItem3;
  3274. sl_Operand := aOp3;
  3275. end;
  3276. 4: begin
  3277. Item := OItem4;
  3278. sl_Operand := aOp4;
  3279. end;
  3280. end;
  3281. sl_Operand := PrepareOperandTyp(sl_Operand);
  3282. if (AnsiSameText(sl_Operand, 'XMMREG')) then
  3283. begin
  3284. Item.OpNumber := il_Op;
  3285. Item.OpTyp := otXMMReg;
  3286. Item.OpActive := true;
  3287. Item.Values.Add('XMM16');
  3288. end
  3289. else if (AnsiSameText(sl_Operand, 'XMMREG_M')) or
  3290. (AnsiSameText(sl_Operand, 'XMMREG_MZ')) or
  3291. (AnsiSameText(sl_Operand, 'XMMREG_ER')) or
  3292. (AnsiSameText(sl_Operand, 'XMMREG_SAE')) then
  3293. begin
  3294. Item.OpNumber := il_Op;
  3295. Item.OpTyp := otXMMReg;
  3296. Item.OpActive := true;
  3297. //sSuffix := '';
  3298. //if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  3299. // else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  3300. //
  3301. //if Pos('_ER', sl_Operand) > 0 then sSuffix := ', {ru-sae}'
  3302. // else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  3303. //
  3304. //Item.Values.Add('XMM0' + sSuffix);
  3305. //if (sSuffix <> '') and
  3306. // (MaskRegNeeded = false) then Item.Values.Add('XMM0');
  3307. Item.Values.Add('XMM16');
  3308. end
  3309. else if (AnsiSameText(sl_Operand, 'XMMRM')) or
  3310. (AnsiSameText(sl_Operand, 'XMMRM_M')) or
  3311. (AnsiSameText(sl_Operand, 'XMMRM_MZ')) or
  3312. (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
  3313. (AnsiSameText(sl_Operand, 'XMMRM_SAE')) then
  3314. begin
  3315. Item.OpNumber := il_Op;
  3316. Item.OpTyp := otXMMRM;
  3317. Item.OpActive := true;
  3318. if UsePrefix then sl_Prefix := 'oword ';
  3319. if x64 then MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
  3320. else MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
  3321. end
  3322. else if (AnsiSameText(sl_Operand, 'XMMRM8')) or
  3323. (AnsiSameText(sl_Operand, 'XMMRM8_M')) or
  3324. (AnsiSameText(sl_Operand, 'XMMRM8_MZ')) or
  3325. (AnsiSameText(sl_Operand, 'XMMRM8_ER')) or
  3326. (AnsiSameText(sl_Operand, 'XMMRM8_SAE')) then
  3327. begin
  3328. Item.OpNumber := il_Op;
  3329. Item.OpTyp := otXMMRM8;
  3330. Item.OpActive := true;
  3331. if UsePrefix then sl_Prefix := 'byte ';
  3332. if x64 then MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
  3333. else MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
  3334. end
  3335. else if (AnsiSameText(sl_Operand, 'XMMRM16')) or
  3336. (AnsiSameText(sl_Operand, 'XMMRM16_M')) or
  3337. (AnsiSameText(sl_Operand, 'XMMRM16_MZ')) or
  3338. (AnsiSameText(sl_Operand, 'XMMRM16_ER')) or
  3339. (AnsiSameText(sl_Operand, 'XMMRM16_SAE'))
  3340. then
  3341. begin
  3342. Item.OpNumber := il_Op;
  3343. Item.OpTyp := otXMMRM16;
  3344. Item.OpActive := true;
  3345. if UsePrefix then sl_Prefix := 'word ';
  3346. if x64 then MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
  3347. else MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
  3348. end
  3349. else if (AnsiSameText(sl_Operand, 'YMMREG')) then
  3350. begin
  3351. Item.OpNumber := il_Op;
  3352. Item.OpTyp := otYMMReg;
  3353. Item.OpActive := true;
  3354. Item.Values.Add('YMM16');
  3355. end
  3356. else if (AnsiSameText(sl_Operand, 'YMMREG_M')) or
  3357. (AnsiSameText(sl_Operand, 'YMMREG_MZ')) or
  3358. (AnsiSameText(sl_Operand, 'YMMREG_ER')) or
  3359. (AnsiSameText(sl_Operand, 'YMMREG_SAE'))
  3360. then
  3361. begin
  3362. Item.OpNumber := il_Op;
  3363. Item.OpTyp := otYMMReg;
  3364. Item.OpActive := true;
  3365. //sSuffix := '';
  3366. //if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  3367. // else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  3368. //
  3369. //if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  3370. // else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  3371. //
  3372. //Item.Values.Add('YMM0' + sSuffix);
  3373. //if (sSuffix <> '') and
  3374. // (MaskRegNeeded = false) then Item.Values.Add('YMM0');
  3375. Item.Values.Add('YMM16');
  3376. end
  3377. else if (AnsiSameText(sl_Operand, 'YMMRM')) or
  3378. (AnsiSameText(sl_Operand, 'YMMRM_M')) or
  3379. (AnsiSameText(sl_Operand, 'YMMRM_MZ')) or
  3380. (AnsiSameText(sl_Operand, 'YMMRM_ER')) or
  3381. (AnsiSameText(sl_Operand, 'YMMRM_SAE'))
  3382. then
  3383. begin
  3384. Item.OpNumber := il_Op;
  3385. Item.OpTyp := otYMMRM;
  3386. Item.OpActive := true;
  3387. if UsePrefix then sl_Prefix := 'yword ';
  3388. //sSuffix := '';
  3389. //if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  3390. // else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  3391. //
  3392. //if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  3393. // else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  3394. if x64 then MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
  3395. else MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
  3396. end
  3397. else if (AnsiSameText(sl_Operand, 'ZMMREG')) then
  3398. begin
  3399. Item.OpNumber := il_Op;
  3400. Item.OpTyp := otZMMReg;
  3401. Item.OpActive := true;
  3402. Item.Values.Add('ZMM16');
  3403. end
  3404. else if (AnsiSameText(sl_Operand, 'ZMMREG_M')) or
  3405. (AnsiSameText(sl_Operand, 'ZMMREG_MZ')) or
  3406. (AnsiSameText(sl_Operand, 'ZMMREG_ER')) or
  3407. (AnsiSameText(sl_Operand, 'ZMMREG_SAE'))
  3408. then
  3409. begin
  3410. Item.OpNumber := il_Op;
  3411. Item.OpTyp := otZMMReg;
  3412. Item.OpActive := true;
  3413. //sSuffix := '';
  3414. //if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  3415. // else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  3416. //
  3417. //if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  3418. // else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  3419. Item.Values.Add('ZMM16');
  3420. end
  3421. else if (AnsiSameText(sl_Operand, 'ZMMRM')) or
  3422. (AnsiSameText(sl_Operand, 'ZMMRM_M')) or
  3423. (AnsiSameText(sl_Operand, 'ZMMRM_MZ')) or
  3424. (AnsiSameText(sl_Operand, 'ZMMRM_ER')) or
  3425. (AnsiSameText(sl_Operand, 'ZMMRM_SAE'))
  3426. then
  3427. begin
  3428. Item.OpNumber := il_Op;
  3429. Item.OpTyp := otZMMRM;
  3430. Item.OpActive := true;
  3431. if UsePrefix then sl_Prefix := 'zword ';
  3432. //sSuffix := '';
  3433. //if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  3434. // else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  3435. //
  3436. //if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  3437. // else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  3438. if x64 then MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
  3439. else MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
  3440. end
  3441. else if AnsiSameText(sl_Operand, 'MEM8') then
  3442. begin
  3443. Item.OpNumber := il_Op;
  3444. Item.OpTyp := otMEM8;
  3445. Item.OpActive := true;
  3446. if UsePrefix then sl_Prefix := 'byte ';
  3447. sSuffix := '';
  3448. if x64 then
  3449. begin
  3450. MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  3451. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  3452. end
  3453. else MemRegBaseIndexCombiCDISP8N(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
  3454. end
  3455. else if AnsiSameText(sl_Operand, 'MEM16') or
  3456. AnsiSameText(sl_Operand, 'MEM16_M') then
  3457. begin
  3458. Item.OpNumber := il_Op;
  3459. Item.OpTyp := otMEM16;
  3460. Item.OpActive := true;
  3461. if UsePrefix then sl_Prefix := 'word ';
  3462. sSuffix := '';
  3463. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  3464. if x64 then
  3465. begin
  3466. MemRegBaseIndexCombiCDISP8N(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  3467. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  3468. end
  3469. else MemRegBaseIndexCombiCDISP8N(sl_Prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  3470. end
  3471. else if AnsiSameText(sl_Operand, 'MEM32') or
  3472. AnsiSameText(sl_Operand, 'MEM32_M') or
  3473. AnsiSameText(sl_Operand, 'MEM32_MZ') then
  3474. begin
  3475. Item.OpNumber := il_Op;
  3476. Item.OpTyp := otMEM32;
  3477. Item.OpActive := true;
  3478. if UsePrefix then sl_Prefix := 'dword ';
  3479. sSuffix := '';
  3480. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  3481. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  3482. if x64 then
  3483. begin
  3484. MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  3485. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  3486. end
  3487. else MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  3488. end
  3489. else if (AnsiSameText(sl_Operand, 'MEM64')) or
  3490. (AnsiSameText(sl_Operand, 'MEM64_M')) or
  3491. (AnsiSameText(sl_Operand, 'MEM64_MZ')) then
  3492. begin
  3493. Item.OpNumber := il_Op;
  3494. Item.OpTyp := otMEM64;
  3495. Item.OpActive := true;
  3496. if UsePrefix then sl_Prefix := 'qword ';
  3497. sSuffix := '';
  3498. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  3499. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  3500. if x64 then
  3501. begin
  3502. MemRegBaseIndexCombiCDISP8N(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  3503. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  3504. end
  3505. else MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  3506. end
  3507. else if (AnsiSameText(sl_Operand, 'MEM128')) or
  3508. (AnsiSameText(sl_Operand, 'MEM128_M')) or
  3509. (AnsiSameText(sl_Operand, 'MEM128_MZ')) then
  3510. begin
  3511. Item.OpNumber := il_Op;
  3512. Item.OpTyp := otMEM128;
  3513. Item.OpActive := true;
  3514. if UsePrefix then sl_Prefix := 'oword ';
  3515. sSuffix := '';
  3516. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  3517. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  3518. if x64 then
  3519. begin
  3520. MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  3521. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  3522. end
  3523. else MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  3524. end
  3525. else if (AnsiSameText(sl_Operand, 'MEM256')) or
  3526. (AnsiSameText(sl_Operand, 'MEM256_M')) or
  3527. (AnsiSameText(sl_Operand, 'MEM256_MZ')) then
  3528. begin
  3529. Item.OpNumber := il_Op;
  3530. Item.OpTyp := otMEM256;
  3531. Item.OpActive := true;
  3532. if UsePrefix then sl_Prefix := 'yword ';
  3533. sSuffix := '';
  3534. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  3535. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  3536. if x64 then
  3537. begin
  3538. MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  3539. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  3540. end
  3541. else MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  3542. end
  3543. else if (AnsiSameText(sl_Operand, 'MEM512')) or
  3544. (AnsiSameText(sl_Operand, 'MEM512_M')) or
  3545. (AnsiSameText(sl_Operand, 'MEM512_MZ')) then
  3546. begin
  3547. Item.OpNumber := il_Op;
  3548. Item.OpTyp := otMEM512;
  3549. Item.OpActive := true;
  3550. if UsePrefix then sl_Prefix := 'zword ';
  3551. sSuffix := '';
  3552. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  3553. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  3554. if x64 then
  3555. begin
  3556. MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  3557. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  3558. end
  3559. else MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  3560. end
  3561. else if AnsiSameText(sl_Operand, 'REG8') then
  3562. begin
  3563. Item.OpNumber := il_Op;
  3564. Item.OpTyp := otREG8;
  3565. Item.OpActive := true;
  3566. if x64 then
  3567. begin
  3568. Item.Values.AddStrings(FReg8);
  3569. end
  3570. else Item.Values.AddStrings(FReg8);
  3571. end
  3572. else if AnsiSameText(sl_Operand, 'REG16') then
  3573. begin
  3574. Item.OpNumber := il_Op;
  3575. Item.OpTyp := otREG16;
  3576. Item.OpActive := true;
  3577. if x64 then
  3578. begin
  3579. Item.Values.AddStrings(FReg16);
  3580. end
  3581. else Item.Values.AddStrings(FReg16);
  3582. end
  3583. else if AnsiSameText(sl_Operand, 'REG32') then
  3584. begin
  3585. Item.OpNumber := il_Op;
  3586. Item.OpTyp := otREG32;
  3587. Item.OpActive := true;
  3588. if x64 then
  3589. begin
  3590. Item.Values.AddStrings(FReg32Base);
  3591. end
  3592. else Item.Values.AddStrings(FReg32Base);
  3593. end
  3594. else if AnsiSameText(sl_Operand, 'REG64') then
  3595. begin
  3596. Item.OpNumber := il_Op;
  3597. Item.OpTyp := otREG64;
  3598. Item.OpActive := true;
  3599. if x64 then
  3600. begin
  3601. Item.Values.AddStrings(FReg64Base);
  3602. end;
  3603. end
  3604. else if AnsiSameText(sl_Operand, 'RM32') then
  3605. begin
  3606. Item.OpNumber := il_Op;
  3607. Item.OpTyp := otRM32;
  3608. Item.OpActive := true;
  3609. Item.Values.AddStrings(FReg32Base);
  3610. if UsePrefix then sl_Prefix := 'dword ';
  3611. if x64 then
  3612. begin
  3613. MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  3614. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  3615. end
  3616. else MemRegBaseIndexCombiCDISP8N(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
  3617. end
  3618. else if AnsiSameText(sl_Operand, 'RM64') then
  3619. begin
  3620. Item.OpNumber := il_Op;
  3621. Item.OpTyp := otRM32;
  3622. Item.OpActive := true;
  3623. if UsePrefix then sl_Prefix := 'qword ';
  3624. if x64 then
  3625. begin
  3626. Item.Values.AddStrings(FReg64Base);
  3627. MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  3628. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  3629. end
  3630. else MemRegBaseIndexCombiCDISP8N(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
  3631. end
  3632. else if AnsiSameText(sl_Operand, 'IMM8') then
  3633. begin
  3634. Item.OpNumber := il_Op;
  3635. Item.OpTyp := otIMM8;
  3636. Item.OpActive := true;
  3637. Item.Values.Add('0');
  3638. end
  3639. else if AnsiSameText(sl_Operand, 'XMEM32') or
  3640. AnsiSameText(sl_Operand, 'XMEM32_M') then
  3641. begin
  3642. Item.OpNumber := il_Op;
  3643. Item.OpTyp := otXMEM32;
  3644. Item.OpActive := true;
  3645. if UsePrefix then sl_Prefix := 'oword ';
  3646. sSuffix := '';
  3647. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  3648. if x64 then
  3649. begin
  3650. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64XMMIndex, Item.Values);
  3651. if (sSuffix <> '') and
  3652. (MaskRegNeeded = false) then
  3653. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64XMMIndex, Item.Values);
  3654. end
  3655. else
  3656. begin
  3657. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32XMMIndex, Item.Values);
  3658. if (sSuffix <> '') and
  3659. (MaskRegNeeded = false) then
  3660. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32XMMIndex, Item.Values);
  3661. end;
  3662. end
  3663. else if AnsiSameText(sl_Operand, 'XMEM64') or
  3664. AnsiSameText(sl_Operand, 'XMEM64_M') then
  3665. begin
  3666. Item.OpNumber := il_Op;
  3667. Item.OpTyp := otXMEM64;
  3668. Item.OpActive := true;
  3669. //if UsePrefix then sl_Prefix := 'oword ';
  3670. //
  3671. //if x64 then
  3672. //begin
  3673. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64XMMIndex, Item.Values);
  3674. //end
  3675. //else
  3676. //begin
  3677. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32XMMIndex, Item.Values);
  3678. //end;
  3679. sSuffix := '';
  3680. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  3681. if x64 then
  3682. begin
  3683. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64XMMIndex, Item.Values);
  3684. if (sSuffix <> '') and
  3685. (MaskRegNeeded = false)
  3686. then
  3687. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64XMMIndex, Item.Values);
  3688. end
  3689. else
  3690. begin
  3691. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32XMMIndex, Item.Values);
  3692. if (sSuffix <> '') and
  3693. (MaskRegNeeded = false)
  3694. then
  3695. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32XMMIndex, Item.Values);
  3696. end;
  3697. end
  3698. else if AnsiSameText(sl_Operand, 'YMEM32') or
  3699. AnsiSameText(sl_Operand, 'YMEM32_M') then
  3700. begin
  3701. Item.OpNumber := il_Op;
  3702. Item.OpTyp := otYMEM32;
  3703. Item.OpActive := true;
  3704. if UsePrefix then sl_Prefix := 'yword ';
  3705. //if x64 then
  3706. //begin
  3707. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64YMMIndex, Item.Values);
  3708. //end
  3709. //else
  3710. //begin
  3711. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32YMMIndex, Item.Values);
  3712. //end;
  3713. sSuffix := '';
  3714. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  3715. if x64 then
  3716. begin
  3717. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64YMMIndex, Item.Values);
  3718. if (sSuffix <> '') and
  3719. (MaskRegNeeded = false)
  3720. then
  3721. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64YMMIndex, Item.Values);
  3722. end
  3723. else
  3724. begin
  3725. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32YMMIndex, Item.Values);
  3726. if (sSuffix <> '') and
  3727. (MaskRegNeeded = false)
  3728. then
  3729. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32YMMIndex, Item.Values);
  3730. end;
  3731. end
  3732. else if AnsiSameText(sl_Operand, 'YMEM64') or
  3733. AnsiSameText(sl_Operand, 'YMEM64_M') then
  3734. begin
  3735. Item.OpNumber := il_Op;
  3736. Item.OpTyp := otYMEM64;
  3737. Item.OpActive := true;
  3738. if UsePrefix then sl_Prefix := 'yword ';
  3739. //if x64 then
  3740. //begin
  3741. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64YMMIndex, Item.Values);
  3742. //end
  3743. //else
  3744. //begin
  3745. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32YMMIndex, Item.Values);
  3746. //end;
  3747. sSuffix := '';
  3748. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  3749. if x64 then
  3750. begin
  3751. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64YMMIndex, Item.Values);
  3752. if (sSuffix <> '') and
  3753. (MaskRegNeeded = false)
  3754. then
  3755. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64YMMIndex, Item.Values);
  3756. end
  3757. else
  3758. begin
  3759. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32YMMIndex, Item.Values);
  3760. if (sSuffix <> '') and
  3761. (MaskRegNeeded = false)
  3762. then
  3763. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32YMMIndex, Item.Values);
  3764. end;
  3765. end
  3766. else if AnsiSameText(sl_Operand, 'ZMEM32') or
  3767. AnsiSameText(sl_Operand, 'ZMEM32_M') then
  3768. begin
  3769. Item.OpNumber := il_Op;
  3770. Item.OpTyp := otZMEM32;
  3771. Item.OpActive := true;
  3772. if UsePrefix then sl_Prefix := 'zword ';
  3773. //if x64 then
  3774. //begin
  3775. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64ZMMIndex, Item.Values);
  3776. //end
  3777. //else
  3778. //begin
  3779. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32ZMMIndex, Item.Values);
  3780. //end;
  3781. sSuffix := '';
  3782. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  3783. if x64 then
  3784. begin
  3785. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64ZMMIndex, Item.Values);
  3786. if (sSuffix <> '') and
  3787. (MaskRegNeeded = false)
  3788. then
  3789. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64ZMMIndex, Item.Values);
  3790. end
  3791. else
  3792. begin
  3793. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32ZMMIndex, Item.Values);
  3794. if (sSuffix <> '') and
  3795. (MaskRegNeeded = false)
  3796. then
  3797. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32ZMMIndex, Item.Values);
  3798. end;
  3799. end
  3800. else if AnsiSameText(sl_Operand, 'ZMEM64') or
  3801. AnsiSameText(sl_Operand, 'ZMEM64_M') then
  3802. begin
  3803. Item.OpNumber := il_Op;
  3804. Item.OpTyp := otZMEM64;
  3805. Item.OpActive := true;
  3806. if UsePrefix then sl_Prefix := 'zword ';
  3807. //if x64 then
  3808. //begin
  3809. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64ZMMIndex, Item.Values);
  3810. //end
  3811. //else
  3812. //begin
  3813. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32ZMMIndex, Item.Values);
  3814. //end;
  3815. sSuffix := '';
  3816. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  3817. if x64 then
  3818. begin
  3819. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64ZMMIndex, Item.Values);
  3820. if (sSuffix <> '') and
  3821. (MaskRegNeeded = false)
  3822. then
  3823. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64ZMMIndex, Item.Values);
  3824. end
  3825. else
  3826. begin
  3827. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32ZMMIndex, Item.Values);
  3828. if (sSuffix <> '') and
  3829. (MaskRegNeeded = false)
  3830. then
  3831. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32ZMMIndex, Item.Values);
  3832. end;
  3833. end
  3834. else if AnsiSameText(sl_Operand, '2B32') then
  3835. begin
  3836. Item.OpNumber := il_Op;
  3837. Item.OpTyp := otB32;
  3838. Item.OpActive := true;
  3839. if x64 then
  3840. begin
  3841. MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to2}', FReg64Base, FReg64Index, Item.Values);
  3842. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  3843. end
  3844. else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
  3845. end
  3846. else if AnsiSameText(sl_Operand, '4B32') then
  3847. begin
  3848. Item.OpNumber := il_Op;
  3849. Item.OpTyp := otB32;
  3850. Item.OpActive := true;
  3851. if x64 then
  3852. begin
  3853. MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to4}', FReg64Base, FReg64Index, Item.Values);
  3854. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  3855. end
  3856. else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
  3857. end
  3858. else if AnsiSameText(sl_Operand, '8B32') then
  3859. begin
  3860. Item.OpNumber := il_Op;
  3861. Item.OpTyp := otB32;
  3862. Item.OpActive := true;
  3863. if x64 then
  3864. begin
  3865. MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to8}', FReg64Base, FReg64Index, Item.Values);
  3866. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  3867. end
  3868. else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
  3869. end
  3870. else if AnsiSameText(sl_Operand, '16B32') then
  3871. begin
  3872. Item.OpNumber := il_Op;
  3873. Item.OpTyp := otB32;
  3874. Item.OpActive := true;
  3875. if x64 then
  3876. begin
  3877. MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to16}', FReg64Base, FReg64Index, Item.Values);
  3878. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  3879. end
  3880. else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
  3881. end
  3882. else if AnsiSameText(sl_Operand, '2B64') then
  3883. begin
  3884. Item.OpNumber := il_Op;
  3885. Item.OpTyp := otB64;
  3886. Item.OpActive := true;
  3887. if x64 then
  3888. begin
  3889. MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to2}', FReg64Base, FReg64Index, Item.Values);
  3890. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  3891. end
  3892. else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
  3893. end
  3894. else if AnsiSameText(sl_Operand, '4B64') then
  3895. begin
  3896. Item.OpNumber := il_Op;
  3897. Item.OpTyp := otB64;
  3898. Item.OpActive := true;
  3899. if x64 then
  3900. begin
  3901. MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to4}', FReg64Base, FReg64Index, Item.Values);
  3902. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  3903. end
  3904. else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
  3905. end
  3906. else if AnsiSameText(sl_Operand, '8B64') then
  3907. begin
  3908. Item.OpNumber := il_Op;
  3909. Item.OpTyp := otB64;
  3910. Item.OpActive := true;
  3911. if x64 then
  3912. begin
  3913. MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to8}', FReg64Base, FReg64Index, Item.Values);
  3914. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  3915. end
  3916. else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
  3917. end
  3918. else if AnsiSameText(sl_Operand, '16B64') then
  3919. begin
  3920. Item.OpNumber := il_Op;
  3921. Item.OpTyp := otB64;
  3922. Item.OpActive := true;
  3923. if x64 then
  3924. begin
  3925. MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to16}', FReg64Base, FReg64Index, Item.Values);
  3926. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  3927. end
  3928. else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
  3929. end
  3930. else if AnsiSameText(sl_Operand, 'KREG') or
  3931. AnsiSameText(sl_Operand, 'KREG_M') then
  3932. begin
  3933. Item.OpNumber := il_Op;
  3934. Item.OpTyp := otKREG;
  3935. Item.OpActive := true;
  3936. Item.Values.Add('K1');
  3937. end
  3938. else if trim(sl_Operand) = '' then
  3939. begin
  3940. Item.OpNumber := il_Op;
  3941. Item.OpTyp := otUnknown;
  3942. Item.OpActive := false;
  3943. Item.Values.Add('');
  3944. end
  3945. else
  3946. begin
  3947. Item.OpNumber := il_Op;
  3948. Item.OpTyp := otUnknown;
  3949. Item.OpActive := false;
  3950. Item.Values.Add('?' + sl_Operand);
  3951. end
  3952. end;
  3953. //sl_RegCombi := '';
  3954. il_Operands := 0;
  3955. UsedParams := 0;
  3956. if OItem1.OpActive then
  3957. begin
  3958. inc(il_Operands);
  3959. UsedParams := UsedParams or 1;
  3960. end;
  3961. if OItem2.OpActive then
  3962. begin
  3963. inc(il_Operands);
  3964. UsedParams := UsedParams or 2;
  3965. end;
  3966. if OItem3.OpActive then
  3967. begin
  3968. inc(il_Operands);
  3969. UsedParams := UsedParams or 4;
  3970. end;
  3971. if OItem4.OpActive then
  3972. begin
  3973. inc(il_Operands);
  3974. UsedParams := UsedParams or 8;
  3975. end;
  3976. case il_Operands of
  3977. 1: UseDefault := UsedParams <> 1;
  3978. 2: UseDefault := UsedParams <> 3;
  3979. 3: UseDefault := UsedParams <> 7;
  3980. 4: UseDefault := UsedParams <> 15;
  3981. else UseDefault := true;
  3982. end;
  3983. // TODO deaktivieren
  3984. //UseDefault := true;
  3985. if UseDefault then
  3986. begin
  3987. sl_Inst := format('%-20s', [aInst]);
  3988. for il_Op1 := 0 to OItem1.Values.Count - 1 do
  3989. begin
  3990. for il_Op2 := 0 to OItem2.Values.Count - 1 do
  3991. begin
  3992. for il_Op3 := 0 to OItem3.Values.Count - 1 do
  3993. begin
  3994. for il_Op4 := 0 to OItem4.Values.Count - 1 do
  3995. begin
  3996. slRegCombi := TStringList.Create;
  3997. try
  3998. while slRegCombi.Count < 5 do
  3999. slRegCombi.Add('');
  4000. //SplitOperands(OItem1.Values[il_Op1], OItem2.Values[il_Op2], OItem3.Values[il_Op3], OItem4.Values[il_Op4]
  4001. if OItem1.OpActive then
  4002. begin
  4003. // SplitOperand(OItem1.Values[il_Op1], sRegCombi0,sRegCombi1,sRegCombi2,sRegCombi3,sRegCombi4);
  4004. //
  4005. end;
  4006. finally
  4007. FreeAndNil(slRegCombi);
  4008. end;
  4009. //sRegCombi0 := '';
  4010. //sRegCombi1 := '';
  4011. //sRegCombi2 := '';
  4012. //sRegCombi3 := '';
  4013. //sRegCombi4 := '';
  4014. //
  4015. //if OItem1.OpActive then
  4016. //begin
  4017. // if sRegCombi0 <> '' then
  4018. // begin
  4019. // sRegCombi0 := sRegCombi0 + ', ';
  4020. // sRegCombi1 := sRegCombi1 + ', ';
  4021. // sRegCombi2 := sRegCombi2 + ', ';
  4022. // sRegCombi3 := sRegCombi3 + ', ';
  4023. // sRegCombi4 := sRegCombi4 + ', ';
  4024. // end;
  4025. //
  4026. // if Pos('|', OItem1.Values[il_Op1]) > 0 then
  4027. // begin
  4028. // with TStringList.Create do
  4029. // try
  4030. // Text := Stringreplace(OItem1.Values[il_Op1], '|', #13#10,[rfReplaceAll]);
  4031. // iCnt := Count;
  4032. // while Count < 5 do Add('');
  4033. //
  4034. // sRegCombi0 := sRegCombi0 + Strings[0];
  4035. // sRegCombi1 := sRegCombi1 + Strings[1];
  4036. // sRegCombi2 := sRegCombi2 + Strings[2];
  4037. // sRegCombi3 := sRegCombi3 + Strings[3];
  4038. // sRegCombi4 := sRegCombi4 + Strings[4];
  4039. //
  4040. // finally
  4041. // Free;
  4042. // end;
  4043. // end
  4044. // else
  4045. // begin
  4046. // sRegCombi0 := sRegCombi0 + OItem1.Values[il_Op1];
  4047. // sRegCombi1 := sRegCombi1 + OItem1.Values[il_Op1];
  4048. // sRegCombi2 := sRegCombi2 + OItem1.Values[il_Op1];
  4049. // sRegCombi3 := sRegCombi3 + OItem1.Values[il_Op1];
  4050. // sRegCombi4 := sRegCombi4 + OItem1.Values[il_Op1];
  4051. // end;
  4052. //end;
  4053. //
  4054. //if OItem2.OpActive then
  4055. //begin
  4056. // if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  4057. // sl_RegCombi := sl_RegCombi + OItem2.Values[il_Op2];
  4058. //end;
  4059. //
  4060. //if OItem3.OpActive then
  4061. //begin
  4062. // if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  4063. // sl_RegCombi := sl_RegCombi + OItem3.Values[il_Op3];
  4064. //end;
  4065. //
  4066. //if OItem4.OpActive then
  4067. //begin
  4068. // if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  4069. // sl_RegCombi := sl_RegCombi + OItem4.Values[il_Op4];
  4070. //end;
  4071. //
  4072. //if sl_RegCombi <> '' then
  4073. //begin
  4074. // //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
  4075. // result.Add(sl_Inst + sl_RegCombi);
  4076. // sl_RegCombi := '';
  4077. //end;
  4078. end;
  4079. end;
  4080. end;
  4081. end;
  4082. end
  4083. else
  4084. begin
  4085. OpMode := omUnknown;
  4086. iOpNumMRef := -1;
  4087. if (OItem1.OpTyp in MEMTYPES) or
  4088. (OItem1.OpTyp in BMEMTYPES) then iOpNumMRef := 1
  4089. else if (OItem2.OpTyp in MEMTYPES) or
  4090. (OItem2.OpTyp in BMEMTYPES) then iOpNumMRef := 2
  4091. else if (OItem3.OpTyp in MEMTYPES) or
  4092. (OItem3.OpTyp in BMEMTYPES) then iOpNumMRef := 3
  4093. else if (OItem4.OpTyp in MEMTYPES) or
  4094. (OItem4.OpTyp in BMEMTYPES) then iOpNumMRef := 4;
  4095. // TODO delete
  4096. //if il_Operands = 4 then
  4097. case il_Operands of
  4098. 2: begin
  4099. if (OItem1.OpTyp in MEMTYPES) and
  4100. (OItem2.OpTyp = otXMMReg) then OpMode := omMX
  4101. else if (OItem1.OpTyp in MEMTYPES) and
  4102. (OItem2.OpTyp = otYMMReg) then OpMode := omMY
  4103. else if (OItem1.OpTyp in MEMTYPES) and
  4104. (OItem2.OpTyp = otZMMReg) then OpMode := omMZ
  4105. else if (OItem1.OpTyp = otXMMReg) and
  4106. (OItem2.OpTyp = otB32) then OpMode := omXB32
  4107. else if (OItem1.OpTyp = otXMMReg) and
  4108. (OItem2.OpTyp = otB64) then OpMode := omXB64
  4109. else if (OItem1.OpTyp = otYMMReg) and
  4110. (OItem2.OpTyp = otB32) then OpMode := omYB32
  4111. else if (OItem1.OpTyp = otYMMReg) and
  4112. (OItem2.OpTyp = otB64) then OpMode := omYB64
  4113. else if (OItem1.OpTyp = otZMMReg) and
  4114. (OItem2.OpTyp = otB32) then OpMode := omZB32
  4115. else if (OItem1.OpTyp = otZMMReg) and
  4116. (OItem2.OpTyp = otB64) then OpMode := omZB64
  4117. else if (OItem1.OpTyp = otXMMReg) and
  4118. (OItem2.OpTyp in MEMTYPES) then OpMode := omXM
  4119. else if (OItem1.OpTyp = otYMMReg) and
  4120. (OItem2.OpTyp in MEMTYPES) then OpMode := omYM
  4121. else if (OItem1.OpTyp = otZMMReg) and
  4122. (OItem2.OpTyp in MEMTYPES) then OpMode := omZM
  4123. else
  4124. begin
  4125. sLogMsg := '';
  4126. sLogMsg := MapOperand(OItem1.Optyp) + MapOperand(OItem2.Optyp) + MapOperand(OItem3.Optyp);
  4127. if sLogMsg <> '' then
  4128. begin
  4129. if (sLogMsg <> 'KX') and
  4130. (sLogMsg <> 'KY') and
  4131. (sLogMsg <> 'KZ') and
  4132. (sLogMsg <> 'RM') and
  4133. (sLogMsg <> 'RX') and
  4134. (sLogMsg <> 'XK') and
  4135. (sLogMsg <> 'XR') and
  4136. (sLogMsg <> 'XX') and
  4137. (sLogMsg <> 'XY') and
  4138. (sLogMsg <> 'XZ') and
  4139. (sLogMsg <> 'YK') and
  4140. (sLogMsg <> 'YR') and
  4141. (sLogMsg <> 'YX') and
  4142. (sLogMsg <> 'YY') and
  4143. (sLogMsg <> 'YZ') and
  4144. (sLogMsg <> 'ZK') and
  4145. (sLogMsg <> 'ZR') and
  4146. (sLogMsg <> 'ZX') and
  4147. (sLogMsg <> 'ZY') and
  4148. (sLogMsg <> 'ZZ') then
  4149. writeln('offen : ' + sLogMsg + ' (' + aInst + ')');
  4150. end;
  4151. end;
  4152. end;
  4153. 3: if (OItem1.OpTyp = otKReg) and
  4154. (OItem2.OpTyp = otXMMReg) and
  4155. (OItem3.OpTyp in MEMTYPES) then OpMode := omKXM
  4156. else if (OItem1.OpTyp = otKReg) and
  4157. (OItem2.OpTyp = otYMMReg) and
  4158. (OItem3.OpTyp in MEMTYPES) then OpMode := omKYM
  4159. else if (OItem1.OpTyp = otKReg) and
  4160. (OItem2.OpTyp = otZMMReg) and
  4161. (OItem3.OpTyp in MEMTYPES) then OpMode := omKZM
  4162. else if (OItem1.OpTyp = otKReg) and
  4163. (OItem2.OpTyp = otXMMReg) and
  4164. (OItem3.OpTyp = otB32) then OpMode := omKXB32
  4165. else if (OItem1.OpTyp = otKReg) and
  4166. (OItem2.OpTyp = otXMMReg) and
  4167. (OItem3.OpTyp = otB64) then OpMode := omKXB64
  4168. else if (OItem1.OpTyp = otKReg) and
  4169. (OItem2.OpTyp = otYMMReg) and
  4170. (OItem3.OpTyp = otB32) then OpMode := omKYB32
  4171. else if (OItem1.OpTyp = otKReg) and
  4172. (OItem2.OpTyp = otYMMReg) and
  4173. (OItem3.OpTyp = otB64) then OpMode := omKYB64
  4174. else if (OItem1.OpTyp = otKReg) and
  4175. (OItem2.OpTyp = otZMMReg) and
  4176. (OItem3.OpTyp = otB32) then OpMode := omKZB32
  4177. else if (OItem1.OpTyp = otKReg) and
  4178. (OItem2.OpTyp = otZMMReg) and
  4179. (OItem3.OpTyp = otB64) then OpMode := omKZB64
  4180. else if (OItem1.OpTyp = otKReg) and
  4181. (OItem2.OpTyp in MEMTYPES) and
  4182. (OItem3.OpTyp = otIMM8) then OpMode := omKMI
  4183. else if (OItem1.OpTyp = otKReg) and
  4184. (OItem2.OpTyp = otB32) and
  4185. (OItem3.OpTyp = otIMM8) then OpMode := omKB32I
  4186. else if (OItem1.OpTyp = otKReg) and
  4187. (OItem2.OpTyp = otB64) and
  4188. (OItem3.OpTyp = otIMM8) then OpMode := omKB64I
  4189. else if (OItem1.OpTyp in MEMTYPES) and
  4190. (OItem2.OpTyp = otXMMReg) and
  4191. (OItem3.OpTyp = otIMM8) then OpMode := omMXI
  4192. else if (OItem1.OpTyp in MEMTYPES) and
  4193. (OItem2.OpTyp = otYMMReg) and
  4194. (OItem3.OpTyp = otIMM8) then OpMode := omMYI
  4195. else if (OItem1.OpTyp in MEMTYPES) and
  4196. (OItem2.OpTyp = otZMMReg) and
  4197. (OItem3.OpTyp = otIMM8) then OpMode := omMZI
  4198. else if (OItem1.OpTyp = otXMMReg) and
  4199. (OItem2.OpTyp = otXMMReg) and
  4200. (OItem3.OpTyp in MEMTYPES) then OpMode := omXXM
  4201. else if (OItem1.OpTyp = otXMMReg) and
  4202. (OItem2.OpTyp = otXMMReg) and
  4203. (OItem3.OpTyp = otB32) then OpMode := omXXB32
  4204. else if (OItem1.OpTyp = otXMMReg) and
  4205. (OItem2.OpTyp = otXMMReg) and
  4206. (OItem3.OpTyp = otB64) then OpMode := omXXB64
  4207. else if (OItem1.OpTyp = otXMMReg) and
  4208. (OItem2.OpTyp = otB32) and
  4209. (OItem3.OpTyp = otIMM8) then OpMode := omXB32I
  4210. else if (OItem1.OpTyp = otXMMReg) and
  4211. (OItem2.OpTyp = otB64) and
  4212. (OItem3.OpTyp = otIMM8) then OpMode := omXB64I
  4213. else if (OItem1.OpTyp = otXMMReg) and
  4214. (OItem2.OpTyp in MEMTYPES) and
  4215. (OItem3.OpTyp = otIMM8) then OpMode := omXMI
  4216. else if (OItem1.OpTyp = otYMMReg) and
  4217. (OItem2.OpTyp = otYMMReg) and
  4218. (OItem3.OpTyp in MEMTYPES) then OpMode := omYYM
  4219. else if (OItem1.OpTyp = otYMMReg) and
  4220. (OItem2.OpTyp = otYMMReg) and
  4221. (OItem3.OpTyp = otB32) then OpMode := omYYB32
  4222. else if (OItem1.OpTyp = otYMMReg) and
  4223. (OItem2.OpTyp = otYMMReg) and
  4224. (OItem3.OpTyp = otB64) then OpMode := omYYB64
  4225. else if (OItem1.OpTyp = otYMMReg) and
  4226. (OItem2.OpTyp = otB32) and
  4227. (OItem3.OpTyp = otIMM8) then OpMode := omYB32I
  4228. else if (OItem1.OpTyp = otYMMReg) and
  4229. (OItem2.OpTyp = otB64) and
  4230. (OItem3.OpTyp = otIMM8) then OpMode := omYB64I
  4231. else if (OItem1.OpTyp = otYMMReg) and
  4232. (OItem2.OpTyp in MEMTYPES) and
  4233. (OItem3.OpTyp = otIMM8) then OpMode := omYMI
  4234. else if (OItem1.OpTyp = otZMMReg) and
  4235. (OItem2.OpTyp = otZMMReg) and
  4236. (OItem3.OpTyp in MEMTYPES) then OpMode := omZZM
  4237. else if (OItem1.OpTyp = otZMMReg) and
  4238. (OItem2.OpTyp = otZMMReg) and
  4239. (OItem3.OpTyp = otB32) then OpMode := omZZB32
  4240. else if (OItem1.OpTyp = otZMMReg) and
  4241. (OItem2.OpTyp = otZMMReg) and
  4242. (OItem3.OpTyp = otB64) then OpMode := omZZB64
  4243. else if (OItem1.OpTyp = otZMMReg) and
  4244. (OItem2.OpTyp = otB32) and
  4245. (OItem3.OpTyp = otIMM8) then OpMode := omZB32I
  4246. else if (OItem1.OpTyp = otZMMReg) and
  4247. (OItem2.OpTyp = otB64) and
  4248. (OItem3.OpTyp = otIMM8) then OpMode := omZB64I
  4249. else if (OItem1.OpTyp = otZMMReg) and
  4250. (OItem2.OpTyp in MEMTYPES) and
  4251. (OItem3.OpTyp = otIMM8) then OpMode := omZMI
  4252. else
  4253. begin
  4254. sLogMsg := '';
  4255. sLogMsg := MapOperand(OItem1.Optyp) + MapOperand(OItem2.Optyp) + MapOperand(OItem3.Optyp);
  4256. if sLogMsg <> '' then
  4257. begin
  4258. if (sLogMsg <> 'RMI') and
  4259. (sLogMsg <> 'RRM') and
  4260. (sLogMsg <> 'RMR') and
  4261. (sLogMsg <> 'KKK') and
  4262. (sLogMsg <> 'KKI') and
  4263. (sLogMsg <> 'XXX') and
  4264. (sLogMsg <> 'YYY') and
  4265. (sLogMsg <> 'ZZZ') and
  4266. (sLogMsg <> 'XXI') and
  4267. (sLogMsg <> 'YYI') and
  4268. (sLogMsg <> 'ZZI') and
  4269. (sLogMsg <> 'XYI') and
  4270. (sLogMsg <> 'YZI') and
  4271. (sLogMsg <> 'XZI') and
  4272. (sLogMsg <> 'RXI') and
  4273. (sLogMsg <> 'RYI') and
  4274. (sLogMsg <> 'RZI') and
  4275. (sLogMsg <> 'XXR') then
  4276. writeln('offen : ' + sLogMsg + ' (' + aInst + ')');
  4277. end;
  4278. end;
  4279. 4: if (OItem1.OpTyp = otKReg) and
  4280. (OItem2.OpTyp = otXMMReg) and
  4281. (OItem3.OpTyp = otB32) and
  4282. (OItem4.OpTyp = otIMM8) then OpMode := omKXB32I
  4283. else if (OItem1.OpTyp = otKReg) and
  4284. (OItem2.OpTyp = otXMMReg) and
  4285. (OItem3.OpTyp = otB64) and
  4286. (OItem4.OpTyp = otIMM8) then OpMode := omKXB64I
  4287. else if (OItem1.OpTyp = otKReg) and
  4288. (OItem2.OpTyp = otXMMReg) and
  4289. (OItem3.OpTyp in MEMTYPES) and
  4290. (OItem4.OpTyp = otIMM8) then OpMode := omKXMI
  4291. else if (OItem1.OpTyp = otKReg) and
  4292. (OItem2.OpTyp = otYMMReg) and
  4293. (OItem3.OpTyp = otB32) and
  4294. (OItem4.OpTyp = otIMM8) then OpMode := omKYB32I
  4295. else if (OItem1.OpTyp = otKReg) and
  4296. (OItem2.OpTyp = otYMMReg) and
  4297. (OItem3.OpTyp = otB64) and
  4298. (OItem4.OpTyp = otIMM8) then OpMode := omKYB64I
  4299. else if (OItem1.OpTyp = otKReg) and
  4300. (OItem2.OpTyp = otYMMReg) and
  4301. (OItem3.OpTyp in MEMTYPES) and
  4302. (OItem4.OpTyp = otIMM8) then OpMode := omKYMI
  4303. else if (OItem1.OpTyp = otKReg) and
  4304. (OItem2.OpTyp = otZMMReg) and
  4305. (OItem3.OpTyp = otB32) and
  4306. (OItem4.OpTyp = otIMM8) then OpMode := omKZB32I
  4307. else if (OItem1.OpTyp = otKReg) and
  4308. (OItem2.OpTyp = otZMMReg) and
  4309. (OItem3.OpTyp = otB64) and
  4310. (OItem4.OpTyp = otIMM8) then OpMode := omKZB64I
  4311. else if (OItem1.OpTyp = otKReg) and
  4312. (OItem2.OpTyp = otZMMReg) and
  4313. (OItem3.OpTyp in MEMTYPES) and
  4314. (OItem4.OpTyp = otIMM8) then OpMode := omKZMI
  4315. else if (OItem1.OpTyp = otXMMReg) and
  4316. (OItem2.OpTyp = otXMMReg) and
  4317. (OItem3.OpTyp = otB32) and
  4318. (OItem4.OpTyp = otIMM8) then OpMode := omXXB32I
  4319. else if (OItem1.OpTyp = otXMMReg) and
  4320. (OItem2.OpTyp = otXMMReg) and
  4321. (OItem3.OpTyp = otB64) and
  4322. (OItem4.OpTyp = otIMM8) then OpMode := omXXB64I
  4323. else if (OItem1.OpTyp = otYMMReg) and
  4324. (OItem2.OpTyp = otYMMReg) and
  4325. (OItem3.OpTyp = otB32) and
  4326. (OItem4.OpTyp = otIMM8) then OpMode := omYYB32I
  4327. else if (OItem1.OpTyp = otYMMReg) and
  4328. (OItem2.OpTyp = otYMMReg) and
  4329. (OItem3.OpTyp = otB64) and
  4330. (OItem4.OpTyp = otIMM8) then OpMode := omYYB64I
  4331. else if (OItem1.OpTyp = otZMMReg) and
  4332. (OItem2.OpTyp = otZMMReg) and
  4333. (OItem3.OpTyp = otB32) and
  4334. (OItem4.OpTyp = otIMM8) then OpMode := omZZB32I
  4335. else if (OItem1.OpTyp = otZMMReg) and
  4336. (OItem2.OpTyp = otZMMReg) and
  4337. (OItem3.OpTyp = otB64) and
  4338. (OItem4.OpTyp = otIMM8) then OpMode := omZZB64I
  4339. else if (OItem1.OpTyp = otXMMReg) and
  4340. (OItem2.OpTyp = otXMMReg) and
  4341. (OItem3.OpTyp in MEMTYPES) and
  4342. (OItem4.OpTyp = otIMM8) then OpMode := omXXMI
  4343. else if (OItem1.OpTyp = otYMMReg) and
  4344. (OItem2.OpTyp = otYMMReg) and
  4345. (OItem3.OpTyp in MEMTYPES) and
  4346. (OItem4.OpTyp = otIMM8) then OpMode := omYYMI
  4347. else if (OItem1.OpTyp = otZMMReg) and
  4348. (OItem2.OpTyp = otZMMReg) and
  4349. (OItem3.OpTyp in MEMTYPES) and
  4350. (OItem4.OpTyp = otIMM8) then OpMode := omZZMI
  4351. else
  4352. begin
  4353. sLogMsg := '';
  4354. sLogMsg := MapOperand(OItem1.Optyp) + MapOperand(OItem2.Optyp) + MapOperand(OItem3.Optyp) + MapOperand(OItem4.Optyp);
  4355. if sLogMsg <> '' then
  4356. begin
  4357. if (sLogMsg <> 'KXXI') and
  4358. (sLogMsg <> 'KYYI') and
  4359. (sLogMsg <> 'KZZI') and
  4360. (sLogMsg <> 'XXRI') and
  4361. (sLogMsg <> 'XXXI') and
  4362. (sLogMsg <> 'YYYI') and
  4363. (sLogMsg <> 'ZZZI') then
  4364. writeln('offen : ' + sLogMsg + ' (' + aInst + ')');
  4365. end;
  4366. end;
  4367. else;
  4368. end;
  4369. if OpMode <> omUnknown then
  4370. begin
  4371. sInstruction := format('%20s', [aInst]);
  4372. for il_Op1 := 0 to OItem1.Values.Count - 1 do
  4373. begin
  4374. for il_Op2 := 0 to OItem2.Values.Count - 1 do
  4375. begin
  4376. for il_Op3 := 0 to OItem3.Values.Count - 1 do
  4377. begin
  4378. for il_Op4 := 0 to OItem4.Values.Count - 1 do
  4379. begin
  4380. sRegCombi := '';
  4381. if OItem1.OpActive then
  4382. begin
  4383. if sRegCombi <> '' then sRegCombi := sRegCombi + ', ';
  4384. sRegCombi := sRegCombi + OItem1.Values[il_Op1];
  4385. end;
  4386. if OItem2.OpActive then
  4387. begin
  4388. if sRegCombi <> '' then sRegCombi := sRegCombi + ', ';
  4389. sRegCombi := sRegCombi + OItem2.Values[il_Op2];
  4390. end;
  4391. if OItem3.OpActive then
  4392. begin
  4393. if sRegCombi <> '' then sRegCombi := sRegCombi + ', ';
  4394. sRegCombi := sRegCombi + OItem3.Values[il_Op3];
  4395. end;
  4396. if OItem4.OpActive then
  4397. begin
  4398. if sRegCombi <> '' then sRegCombi := sRegCombi + ', ';
  4399. sRegCombi := sRegCombi + OItem4.Values[il_Op4];
  4400. end;
  4401. if sRegCombi <> '' then
  4402. begin
  4403. case iOpNumMRef of
  4404. 1: sMRef := OItem1.Values[il_Op1];
  4405. 2: sMRef := OItem2.Values[il_Op2];
  4406. 3: sMRef := OItem3.Values[il_Op3];
  4407. 4: sMRef := OItem1.Values[il_Op4];
  4408. else sMRef := '';
  4409. end;
  4410. if ParseBaseIndexReg(sMRef, sBaseReg, sIndexReg) then
  4411. begin
  4412. result.Add(format('%20s %s', [' pop', sBaseReg]));
  4413. result.Add(format('%20s %s', [' push', sBaseReg]));
  4414. if trim(sIndexReg) <> '' then
  4415. result.Add(format('%20s%6s, %s', [' xor', sIndexReg, sIndexReg]));
  4416. if OpMode in [omMXI, omMYI, omMZI] then
  4417. begin
  4418. case Fx64 of
  4419. true: begin
  4420. result.Add(format('%20s %6s', ['push', 'RDI']));
  4421. result.Add(format('%20s %6s', ['push', 'RCX']));
  4422. result.Add(format('%20s %6s', ['push', 'RAX']));
  4423. result.Add(format('%20s %6s', ['push', sBaseReg]));
  4424. result.Add(format('%20s %6s', ['pop', 'RDI']));
  4425. result.Add(format('%20s %6s', ['mov', 'RCX, sizeof(DataBlock)']));
  4426. result.Add(format('%20s %6s, %s', ['xor', 'RAX', 'RAX']));
  4427. result.Add(format('%20s ', ['rep stosb']));
  4428. result.Add(format('%20s %6s', ['pop', 'RAX']));
  4429. result.Add(format('%20s %6s', ['pop', 'RCX']));
  4430. result.Add(format('%20s %6s', ['pop', 'RDI']));
  4431. end;
  4432. else begin
  4433. result.Add(format('%20s %6s', ['push', 'EDI']));
  4434. result.Add(format('%20s %6s', ['push', 'ECX']));
  4435. result.Add(format('%20s %6s', ['push', 'EAX']));
  4436. result.Add(format('%20s %6s', ['push', sBaseReg]));
  4437. result.Add(format('%20s %6s', ['pop', 'EDI']));
  4438. result.Add(format('%20s %6s', ['mov', 'ECX, sizeof(DataBlock)']));
  4439. result.Add(format('%20s %6s, %s', ['xor', 'EAX', 'EAX']));
  4440. result.Add(format('%20s ', ['rep stosb']));
  4441. result.Add(format('%20s %6s', ['pop', 'EAX']));
  4442. result.Add(format('%20s %6s', ['pop', 'ECX']));
  4443. result.Add(format('%20s %6s', ['pop', 'EDI']));
  4444. end;
  4445. end;
  4446. end;
  4447. end;
  4448. //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
  4449. result.Add(format('%-20s %6s', [sInstruction, sRegCombi]));
  4450. inc(iAsmCounter);
  4451. case OpMode of
  4452. omKXM,
  4453. omKYM,
  4454. omKZM: begin
  4455. result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3] ]));
  4456. result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
  4457. result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
  4458. end;
  4459. omKXB32,
  4460. omKXB64,
  4461. omKYB32,
  4462. omKYB64,
  4463. omKZB32,
  4464. omKZB64: begin
  4465. sMREF := OItem3.Values[il_Op3];
  4466. //if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
  4467. // else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
  4468. // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
  4469. result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'K2', OItem2.Values[il_Op2], sMREF]));
  4470. result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
  4471. result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
  4472. end;
  4473. omKMI: begin
  4474. result.Add(format('%20s %6s,%6s + $2000, %s', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3] ]));
  4475. result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
  4476. result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
  4477. end;
  4478. omKB32I,
  4479. omKB64I:
  4480. begin
  4481. result.Add(format('%20s %6s,%6s + $2000, %s', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3] ]));
  4482. result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
  4483. result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
  4484. end;
  4485. omMX: begin
  4486. result.Add(format('%20s %6s + $2000, %s', [aInst, OItem1.Values[il_Op1], OItem2.Values[il_Op2]]));
  4487. result.Add(format('%20s %6s, %s', ['vmovdqu', 'xmm0', OItem1.Values[il_Op1]]));
  4488. result.Add(format('%20s %6s, %s + $2000', ['vmovdqu', 'xmm1', OItem1.Values[il_Op1]]));
  4489. result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqw', 'K2', 'XMM0', 'XMM1']));
  4490. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4491. end;
  4492. omMXI: begin
  4493. result.Add(format('%20s %6s + $2000, %6s, %s', [aInst, OItem1.Values[il_Op1], OItem2.Values[il_Op2], OItem3.Values[il_Op3] ]));
  4494. result.Add(format('%20s %6s, %s', ['vmovdqu', 'xmm0', OItem1.Values[il_Op1]]));
  4495. result.Add(format('%20s %6s, %s + $2000', ['vmovdqu', 'xmm1', OItem1.Values[il_Op1]]));
  4496. result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqw', 'K2', 'XMM0', 'XMM1']));
  4497. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4498. end;
  4499. omMY: begin
  4500. result.Add(format('%20s %6s + $2000, %s', [aInst, OItem1.Values[il_Op1], OItem2.Values[il_Op2]]));
  4501. result.Add(format('%20s %6s, %s', ['vmovdqu', 'ymm0', OItem1.Values[il_Op1]]));
  4502. result.Add(format('%20s %6s, %s + $2000', ['vmovdqu', 'ymm1', OItem1.Values[il_Op1]]));
  4503. result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqd', 'K2', 'YMM0', 'YMM1']));
  4504. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4505. end;
  4506. omMYI: begin
  4507. result.Add(format('%20s %6s + $2000, %6s, %s', [aInst, OItem1.Values[il_Op1], OItem2.Values[il_Op2], OItem3.Values[il_Op3] ]));
  4508. result.Add(format('%20s %6s, %s', ['vmovdqu', 'ymm0', OItem1.Values[il_Op1]]));
  4509. result.Add(format('%20s %6s, %s + $2000', ['vmovdqu', 'ymm1', OItem1.Values[il_Op1]]));
  4510. result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqd', 'K2', 'YMM0', 'YMM1']));
  4511. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4512. end;
  4513. omMZ: begin
  4514. result.Add(format('%20s %6s + $2000, %s', [aInst, OItem1.Values[il_Op1], OItem2.Values[il_Op2]]));
  4515. result.Add(format('%20s %6s, %s', ['vmovdqu8', 'zmm0', OItem1.Values[il_Op1]]));
  4516. result.Add(format('%20s %6s, %s + $2000', ['vmovdqu8', 'zmm1', OItem1.Values[il_Op1]]));
  4517. result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqq', 'K2', 'ZMM0', 'ZMM1']));
  4518. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4519. end;
  4520. omMZI: begin
  4521. result.Add(format('%20s %6s + $2000, %6s, %s', [aInst, OItem1.Values[il_Op1], OItem2.Values[il_Op2], OItem3.Values[il_Op3] ]));
  4522. result.Add(format('%20s %6s, %s', ['vmovdqu8', 'zmm0', OItem1.Values[il_Op1]]));
  4523. result.Add(format('%20s %6s, %s + $2000', ['vmovdqu8', 'zmm1', OItem1.Values[il_Op1]]));
  4524. result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqq', 'K2', 'ZMM0', 'ZMM1']));
  4525. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4526. end;
  4527. omXB32,
  4528. omXB64: begin
  4529. sMREF := OItem2.Values[il_Op2];
  4530. result.Add(format('%20s%6s,%6s + $2000', [aInst, 'XMM1', sMREF]));
  4531. result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
  4532. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4533. end;
  4534. omXB32I,
  4535. omXB64I: begin
  4536. sMREF := OItem2.Values[il_Op2];
  4537. //if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
  4538. // else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
  4539. // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
  4540. result.Add(format('%20s%6s,%6s + $2000, %s', [aInst, 'XMM1', sMREF, OItem3.Values[il_Op3]]));
  4541. result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
  4542. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4543. end;
  4544. omXM: begin
  4545. result.Add(format('%20s %6s, %s + $2000', [aInst, 'XMM1', OItem2.Values[il_Op2] ]));
  4546. result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
  4547. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4548. end;
  4549. omXXM: begin
  4550. result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'XMM1', 'XMM1', OItem3.Values[il_Op3] ]));
  4551. result.Add(format('%20s %6s,%6s, %s', ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
  4552. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4553. end;
  4554. omXXB32,
  4555. omXXB64: begin
  4556. sMREF := OItem3.Values[il_Op3];
  4557. //if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
  4558. // else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
  4559. // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
  4560. result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'XMM1', 'XMM1', sMREF]));
  4561. result.Add(format('%20s %6s,%6s, %s', ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
  4562. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4563. end;
  4564. omXMI: begin
  4565. result.Add(format('%20s %6s,%6s + $2000, %s', [aInst, 'XMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
  4566. result.Add(format('%20s %6s,%6s, %s', ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
  4567. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4568. end;
  4569. omYB32,
  4570. omYB64: begin
  4571. sMREF := OItem2.Values[il_Op2];
  4572. result.Add(format('%20s%6s,%6s + $2000', [aInst, 'YMM1', sMREF]));
  4573. result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
  4574. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4575. end;
  4576. omYB32I,
  4577. omYB64I:
  4578. begin
  4579. sMREF := OItem2.Values[il_Op2];
  4580. //if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
  4581. // else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
  4582. // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
  4583. //result.Add(format('%20s%6s,%6s + $00, %s', [aInst, 'XMM1', sMREF, OItem3.Values[il_Op3]]));
  4584. //result.Add(format('%20s%6s,%6s + $10, %s', [aInst, 'XMM2', sMREF, OItem3.Values[il_Op3]]));
  4585. //
  4586. //result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'YMM1', 'YMM1', 'XMM2']));
  4587. //result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'YMM1']));
  4588. //result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
  4589. //result.Add('');
  4590. result.Add(format('%20s%6s,%6s + $2000, %s', [aInst, 'YMM1', sMREF, OItem3.Values[il_Op3]]));
  4591. result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
  4592. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4593. end;
  4594. omYM: begin
  4595. result.Add(format('%20s %6s, %s + $2000', [aInst, 'YMM1', OItem2.Values[il_Op2] ]));
  4596. result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
  4597. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4598. end;
  4599. omYYM: begin
  4600. //result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', 'XMM1', OItem3.Values[il_Op3]]));
  4601. //result.Add(format('%20s%6s,%6s, %s + $10', [aInst, 'XMM2', 'XMM2', OItem3.Values[il_Op3]]));
  4602. //
  4603. //result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'YMM1', 'YMM1', 'XMM2']));
  4604. //result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'YMM1']));
  4605. //result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
  4606. //result.Add('');
  4607. result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'YMM1', 'YMM1', OItem3.Values[il_Op3] ]));
  4608. result.Add(format('%20s %6s,%6s, %s', ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
  4609. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4610. end;
  4611. omYYB32,
  4612. omYYB64: begin
  4613. sMREF := OItem3.Values[il_Op3];
  4614. //if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
  4615. // else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
  4616. // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
  4617. //result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', 'XMM1', sMREF]));
  4618. //result.Add(format('%20s%6s,%6s, %s + $10', [aInst, 'XMM2', 'XMM2', sMREF]));
  4619. //
  4620. //result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'YMM1', 'YMM1', 'XMM2']));
  4621. //result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'YMM1']));
  4622. //result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
  4623. //result.Add('');
  4624. result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'YMM1', 'YMM1', sMREF]));
  4625. result.Add(format('%20s %6s,%6s, %s', ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
  4626. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4627. end;
  4628. omYMI: begin
  4629. //result.Add(format('%20s%6s,%6s + $00, %s', [aInst, 'XMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
  4630. //result.Add(format('%20s%6s,%6s + $10, %s', [aInst, 'XMM2', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
  4631. //
  4632. //result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'YMM1', 'YMM1', 'XMM2']));
  4633. //result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'YMM1']));
  4634. //result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
  4635. //result.Add('');
  4636. result.Add(format('%20s %6s,%6s + $2000, %s', [aInst, 'YMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
  4637. result.Add(format('%20s %6s,%6s, %s', ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
  4638. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4639. end;
  4640. omZB32,
  4641. omZB64: begin
  4642. sMREF := OItem2.Values[il_Op2];
  4643. result.Add(format('%20s%6s,%6s + $2000', [aInst, 'ZMM1', sMREF]));
  4644. result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
  4645. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4646. end;
  4647. omZB32I,
  4648. omZB64I:
  4649. begin
  4650. sMREF := OItem2.Values[il_Op2];
  4651. //if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to2}', [])
  4652. // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to4}', []);
  4653. //result.Add(format('%20s%6s,%6s + $00, %s', [aInst, 'XMM1', sMREF, OItem3.Values[il_Op3]]));
  4654. //result.Add(format('%20s%6s,%6s + $10, %s', [aInst, 'XMM2', sMREF, OItem3.Values[il_Op3]]));
  4655. //result.Add(format('%20s%6s,%6s + $20, %s', [aInst, 'XMM3', sMREF, OItem3.Values[il_Op3]]));
  4656. //
  4657. //result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM2']));
  4658. //result.Add(format('%20s%6s,%6s, %s, 02', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM3']));
  4659. //result.Add(format('%20s%6s,%6s, %s, 03', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM4']));
  4660. //
  4661. //result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
  4662. //result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
  4663. //result.Add('');
  4664. result.Add(format('%20s %6s,%6s + $2000, %s', [aInst, 'ZMM1', sMREF, OItem3.Values[il_Op3]]));
  4665. result.Add(format('%20s %6s,%6s, %s', ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
  4666. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4667. end;
  4668. omZM: begin
  4669. result.Add(format('%20s %6s, %s + $2000', [aInst, 'ZMM1', OItem2.Values[il_Op2] ]));
  4670. result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
  4671. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4672. end;
  4673. omZZM: begin
  4674. //result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', 'XMM1', OItem3.Values[il_Op3]]));
  4675. //result.Add(format('%20s%6s,%6s, %s + $10', [aInst, 'XMM2', 'XMM2', OItem3.Values[il_Op3]]));
  4676. //result.Add(format('%20s%6s,%6s, %s + $20', [aInst, 'XMM3', 'XMM3', OItem3.Values[il_Op3]]));
  4677. //result.Add(format('%20s%6s,%6s, %s + $30', [aInst, 'XMM4', 'XMM4', OItem3.Values[il_Op3]]));
  4678. //
  4679. //result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM2']));
  4680. //result.Add(format('%20s%6s,%6s, %s, 02', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM3']));
  4681. //result.Add(format('%20s%6s,%6s, %s, 03', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM4']));
  4682. //
  4683. //result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
  4684. //result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
  4685. //result.Add('');
  4686. result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'ZMM1', 'ZMM1', OItem3.Values[il_Op3] ]));
  4687. result.Add(format('%20s %6s,%6s, %s', ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
  4688. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4689. end;
  4690. omZZB32,
  4691. omZZB64: begin
  4692. sMREF := OItem3.Values[il_Op3];
  4693. //if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to2}', [])
  4694. // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to4}', []);
  4695. //result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', 'XMM1', sMREF]));
  4696. //result.Add(format('%20s%6s,%6s, %s + $10', [aInst, 'XMM2', 'XMM2', sMREF]));
  4697. //result.Add(format('%20s%6s,%6s, %s + $20', [aInst, 'XMM3', 'XMM3', sMREF]));
  4698. //result.Add(format('%20s%6s,%6s, %s + $30', [aInst, 'XMM4', 'XMM4', sMREF]));
  4699. //
  4700. //result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM2']));
  4701. //result.Add(format('%20s%6s,%6s, %s, 02', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM3']));
  4702. //result.Add(format('%20s%6s,%6s, %s, 03', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM4']));
  4703. //
  4704. //result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
  4705. //result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
  4706. //result.Add('');
  4707. result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'ZMM1', 'ZMM1', sMREF]));
  4708. result.Add(format('%20s %6s,%6s, %s', ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
  4709. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4710. end;
  4711. omZMI: begin
  4712. //result.Add(format('%20s%6s,%6s + $00, %s', [aInst, 'XMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
  4713. //result.Add(format('%20s%6s,%6s + $10, %s', [aInst, 'XMM2', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
  4714. //result.Add(format('%20s%6s,%6s + $20, %s', [aInst, 'XMM3', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
  4715. //result.Add(format('%20s%6s,%6s + $30, %s', [aInst, 'XMM4', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
  4716. //
  4717. //result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM2']));
  4718. //result.Add(format('%20s%6s,%6s, %s, 02', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM3']));
  4719. //result.Add(format('%20s%6s,%6s, %s, 03', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM4']));
  4720. //
  4721. //result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
  4722. //result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
  4723. //result.Add('');
  4724. result.Add(format('%20s %6s,%6s + $2000, %s', [aInst, 'ZMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
  4725. result.Add(format('%20s %6s,%6s, %s', ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
  4726. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4727. end;
  4728. omKXB32I,
  4729. omKXB64I:
  4730. begin
  4731. result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3], OItem4.Values[il_Op4]]));
  4732. result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
  4733. result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
  4734. end;
  4735. omKXMI:
  4736. begin
  4737. result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3], OItem4.Values[il_Op4]]));
  4738. result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
  4739. result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
  4740. end;
  4741. omKYB32I,
  4742. omKYB64I:
  4743. begin
  4744. result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3], OItem4.Values[il_Op4]]));
  4745. result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
  4746. result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
  4747. end;
  4748. omKYMI:
  4749. begin
  4750. result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3], OItem4.Values[il_Op4]]));
  4751. result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
  4752. result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
  4753. end;
  4754. omXXB32I,
  4755. omXXB64I:
  4756. begin
  4757. sMREF := OItem3.Values[il_Op3];
  4758. result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'XMM1', OItem2.Values[il_Op2], sMREF, OItem4.Values[il_Op4]]));
  4759. result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
  4760. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4761. end;
  4762. omXXMI:
  4763. begin
  4764. sMREF := OItem3.Values[il_Op3];
  4765. result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'XMM1', OItem2.Values[il_Op2], sMREF, OItem4.Values[il_Op4]]));
  4766. result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
  4767. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4768. end;
  4769. omYYB32I,
  4770. omYYB64I,
  4771. omYYMI:
  4772. begin
  4773. sMREF := OItem3.Values[il_Op3];
  4774. result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'YMM1', OItem2.Values[il_Op2], sMREF, OItem4.Values[il_Op4]]));
  4775. result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
  4776. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4777. end;
  4778. omKZB32I,
  4779. omKZB64I,
  4780. omKZMI:
  4781. begin
  4782. result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3], OItem4.Values[il_Op4]]));
  4783. result.Add(format('%20s %6s, %6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
  4784. result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
  4785. end;
  4786. //omKZMI:
  4787. // begin
  4788. // sMREF := OItem3.Values[il_Op3];
  4789. //
  4790. // result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'ZMM1', OItem2.Values[il_Op2], sMREF, OItem4.Values[il_Op4]]));
  4791. // result.Add(format('%20s %6s, %6s, %6s, %s', ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
  4792. //
  4793. // result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4794. // end;
  4795. omZZB32I,
  4796. omZZB64I,
  4797. omZZMI:
  4798. begin
  4799. sMREF := OItem3.Values[il_Op3];
  4800. result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'ZMM1', OItem2.Values[il_Op2], sMREF, OItem4.Values[il_Op4]]));
  4801. result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
  4802. result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
  4803. end;
  4804. else begin
  4805. sLogMsg := '';
  4806. sLogMsg := MapOperand(OItem1.Optyp) + MapOperand(OItem2.Optyp) + MapOperand(OItem3.Optyp);
  4807. writeln('offen - : ' + sLogMsg + ' (' + aInst + ')');
  4808. end;
  4809. end;
  4810. sRegCombi := '';
  4811. end;
  4812. end;
  4813. end;
  4814. end;
  4815. end;
  4816. end;
  4817. //sl_Inst := format('%-20s', [aInst]);
  4818. //
  4819. //for il_Op1 := 0 to OItem1.Values.Count - 1 do
  4820. //begin
  4821. // if OItem1.OpActive then
  4822. // begin
  4823. // sl_RegCombi1 := OItem1.Values[il_Op1];
  4824. // end
  4825. // else sl_RegCombi1 := '';
  4826. //
  4827. // for il_Op2 := 0 to OItem2.Values.Count - 1 do
  4828. // begin
  4829. // if OItem2.OpActive then
  4830. // begin
  4831. // sl_RegCombi2 := sl_RegCombi1 + ', ' + OItem2.Values[il_Op2];
  4832. // end
  4833. // else sl_RegCombi2 := sl_RegCombi1;
  4834. //
  4835. // for il_Op3 := 0 to OItem3.Values.Count - 1 do
  4836. // begin
  4837. // if OItem3.OpActive then
  4838. // begin
  4839. // sl_RegCombi3 := sl_RegCombi2 + ', ' + OItem3.Values[il_Op3];
  4840. // end
  4841. // else sl_RegCombi3 := sl_RegCombi2;
  4842. //
  4843. // for il_Op4 := 0 to OItem4.Values.Count - 1 do
  4844. // begin
  4845. // if OItem4.OpActive then
  4846. // begin
  4847. // sl_RegCombi := sl_RegCombi3 + ', ' + OItem4.Values[il_Op4];
  4848. // end
  4849. // else sl_RegCombi := sl_RegCombi3;
  4850. //
  4851. // if (sl_RegCombi <> '') and
  4852. // (
  4853. // (OItem1.OpActive and (OItem1.OpTyp in OTMEMTYPES)) or
  4854. // (OItem2.OpActive and (OItem2.OpTyp in OTMEMTYPES)) or
  4855. // (OItem3.OpActive and (OItem3.OpTyp in OTMEMTYPES)) or
  4856. // (OItem4.OpActive and (OItem4.OpTyp in OTMEMTYPES))
  4857. // ) then
  4858. // begin
  4859. // //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
  4860. // result.Add(sl_Inst + sl_RegCombi);
  4861. //
  4862. //
  4863. //
  4864. // sl_RegCombi := '';
  4865. // end;
  4866. // end;
  4867. // end;
  4868. // end;
  4869. //end;
  4870. end;
  4871. finally
  4872. FreeAndNil(OItem4);
  4873. end;
  4874. finally
  4875. FreeAndNil(OItem3);
  4876. end;
  4877. finally
  4878. FreeAndNil(OItem2);
  4879. end;
  4880. finally
  4881. FreeAndNil(OItem1);
  4882. end;
  4883. end;
  4884. constructor TAsmTestGenerator.Create;
  4885. begin
  4886. inherited;
  4887. FX64 := true;
  4888. FAVX512 := false;
  4889. FReg8 := TStringList.Create;
  4890. FReg16 := TStringList.Create;
  4891. FReg32Base := TStringList.Create;
  4892. FReg32Index := TStringList.Create;
  4893. FReg64Base := TStringList.Create;
  4894. FReg64Index := TStringList.Create;
  4895. FReg6432Base := TStringList.Create;
  4896. FReg6432Index := TStringList.Create;
  4897. FReg32XMMIndex := TStringList.Create;
  4898. FReg32YMMIndex := TStringList.Create;
  4899. FReg32ZMMIndex := TStringList.Create;
  4900. FReg64XMMIndex := TStringList.Create;
  4901. FReg64YMMIndex := TStringList.Create;
  4902. FReg64ZMMIndex := TStringList.Create;
  4903. FRegKREG := TStringList.Create;
  4904. FReg8.Add('AL');
  4905. FReg8.Add('BL');
  4906. FReg8.Add('CL');
  4907. FReg8.Add('DL');
  4908. FReg16.Add('AX');
  4909. FReg16.Add('BX');
  4910. FReg16.Add('CX');
  4911. FReg16.Add('DX');
  4912. FReg32Base.Add('EAX');
  4913. FReg32Base.Add('EBX');
  4914. FReg32Base.Add('ECX');
  4915. FReg32Base.Add('EDX');
  4916. //FReg32Base.Add('ESP');
  4917. //FReg32Base.Add('EBP');
  4918. FReg32Base.Add('EDI');
  4919. FReg32Base.Add('ESI');
  4920. FReg32Index.Add('EAX');
  4921. FReg32Index.Add('EBX');
  4922. FReg32Index.Add('ECX');
  4923. FReg32Index.Add('EDX');
  4924. //FReg32Index.Add('EBP');
  4925. FReg32Index.Add('EDI');
  4926. FReg32Index.Add('ESI');
  4927. FReg64Base.Add('RAX');
  4928. FReg64Base.Add('RBX');
  4929. FReg64Base.Add('RCX');
  4930. FReg64Base.Add('RDX');
  4931. //FReg64Base.Add('RSP');
  4932. //FReg64Base.Add('RBP');
  4933. FReg64Base.Add('RDI');
  4934. FReg64Base.Add('RSI');
  4935. FReg64Base.Add('R8');
  4936. FReg64Base.Add('R9');
  4937. FReg64Base.Add('R10');
  4938. FReg64Base.Add('R11');
  4939. FReg64Base.Add('R12');
  4940. FReg64Base.Add('R13');
  4941. FReg64Base.Add('R14');
  4942. FReg64Base.Add('R15');
  4943. FReg64Index.Add('RAX');
  4944. FReg64Index.Add('RBX');
  4945. FReg64Index.Add('RCX');
  4946. FReg64Index.Add('RDX');
  4947. //FReg64Index.Add('RBP');
  4948. FReg64Index.Add('RDI');
  4949. FReg64Index.Add('RSI');
  4950. FReg64Index.Add('R8');
  4951. FReg64Index.Add('R9');
  4952. FReg64Index.Add('R10');
  4953. FReg64Index.Add('R11');
  4954. FReg64Index.Add('R12');
  4955. FReg64Index.Add('R13');
  4956. FReg64Index.Add('R14');
  4957. FReg64Index.Add('R15');
  4958. FReg6432Base.Add('EAX');
  4959. FReg6432Base.Add('EBX');
  4960. FReg6432Base.Add('ECX');
  4961. FReg6432Base.Add('EDX');
  4962. FReg6432Base.Add('ESP');
  4963. //FReg6432Base.Add('EBP');
  4964. FReg6432Base.Add('EDI');
  4965. FReg6432Base.Add('ESI');
  4966. FReg6432Base.Add('R8D');
  4967. FReg6432Base.Add('R9D');
  4968. FReg6432Base.Add('R10D');
  4969. FReg6432Base.Add('R11D');
  4970. FReg6432Base.Add('R12D');
  4971. FReg6432Base.Add('R13D');
  4972. FReg6432Base.Add('R14D');
  4973. FReg6432Base.Add('R15D');
  4974. FReg6432Index.Add('EAX');
  4975. FReg6432Index.Add('EBX');
  4976. FReg6432Index.Add('ECX');
  4977. FReg6432Index.Add('EDX');
  4978. //FReg6432Index.Add('EBP');
  4979. FReg6432Index.Add('EDI');
  4980. FReg6432Index.Add('ESI');
  4981. FReg6432Index.Add('R8D');
  4982. FReg6432Index.Add('R9D');
  4983. FReg6432Index.Add('R10D');
  4984. FReg6432Index.Add('R11D');
  4985. FReg6432Index.Add('R12D');
  4986. FReg6432Index.Add('R13D');
  4987. FReg6432Index.Add('R14D');
  4988. FReg6432Index.Add('R15D');
  4989. FReg32XMMIndex.ADD('XMM0');
  4990. FReg32XMMIndex.ADD('XMM1');
  4991. FReg32XMMIndex.ADD('XMM2');
  4992. FReg32XMMIndex.ADD('XMM3');
  4993. FReg32XMMIndex.ADD('XMM4');
  4994. FReg32XMMIndex.ADD('XMM5');
  4995. FReg32XMMIndex.ADD('XMM6');
  4996. FReg32XMMIndex.ADD('XMM7');
  4997. FReg32YMMIndex.ADD('YMM0');
  4998. FReg32YMMIndex.ADD('YMM1');
  4999. FReg32YMMIndex.ADD('YMM2');
  5000. FReg32YMMIndex.ADD('YMM3');
  5001. FReg32YMMIndex.ADD('YMM4');
  5002. FReg32YMMIndex.ADD('YMM5');
  5003. FReg32YMMIndex.ADD('YMM6');
  5004. FReg32YMMIndex.ADD('YMM7');
  5005. FReg32ZMMIndex.ADD('ZMM0');
  5006. FReg32ZMMIndex.ADD('ZMM1');
  5007. FReg32ZMMIndex.ADD('ZMM2');
  5008. FReg32ZMMIndex.ADD('ZMM3');
  5009. FReg32ZMMIndex.ADD('ZMM4');
  5010. FReg32ZMMIndex.ADD('ZMM5');
  5011. FReg32ZMMIndex.ADD('ZMM6');
  5012. FReg32ZMMIndex.ADD('ZMM7');
  5013. FReg64XMMIndex.ADD('XMM0');
  5014. FReg64XMMIndex.ADD('XMM1');
  5015. FReg64XMMIndex.ADD('XMM2');
  5016. FReg64XMMIndex.ADD('XMM3');
  5017. FReg64XMMIndex.ADD('XMM4');
  5018. FReg64XMMIndex.ADD('XMM5');
  5019. FReg64XMMIndex.ADD('XMM6');
  5020. FReg64XMMIndex.ADD('XMM7');
  5021. FReg64XMMIndex.ADD('XMM8');
  5022. FReg64XMMIndex.ADD('XMM9');
  5023. FReg64XMMIndex.ADD('XMM10');
  5024. FReg64XMMIndex.ADD('XMM11');
  5025. FReg64XMMIndex.ADD('XMM12');
  5026. FReg64XMMIndex.ADD('XMM13');
  5027. FReg64XMMIndex.ADD('XMM14');
  5028. FReg64XMMIndex.ADD('XMM15');
  5029. FReg64YMMIndex.ADD('YMM0');
  5030. FReg64YMMIndex.ADD('YMM1');
  5031. FReg64YMMIndex.ADD('YMM2');
  5032. FReg64YMMIndex.ADD('YMM3');
  5033. FReg64YMMIndex.ADD('YMM4');
  5034. FReg64YMMIndex.ADD('YMM5');
  5035. FReg64YMMIndex.ADD('YMM6');
  5036. FReg64YMMIndex.ADD('YMM7');
  5037. FReg64YMMIndex.ADD('YMM8');
  5038. FReg64YMMIndex.ADD('YMM9');
  5039. FReg64YMMIndex.ADD('YMM10');
  5040. FReg64YMMIndex.ADD('YMM11');
  5041. FReg64YMMIndex.ADD('YMM12');
  5042. FReg64YMMIndex.ADD('YMM13');
  5043. FReg64YMMIndex.ADD('YMM14');
  5044. FReg64YMMIndex.ADD('YMM15');
  5045. FReg64ZMMIndex.ADD('ZMM0');
  5046. FReg64ZMMIndex.ADD('ZMM1');
  5047. FReg64ZMMIndex.ADD('ZMM2');
  5048. FReg64ZMMIndex.ADD('ZMM3');
  5049. FReg64ZMMIndex.ADD('ZMM4');
  5050. FReg64ZMMIndex.ADD('ZMM5');
  5051. FReg64ZMMIndex.ADD('ZMM6');
  5052. FReg64ZMMIndex.ADD('ZMM7');
  5053. FReg64ZMMIndex.ADD('ZMM8');
  5054. FReg64ZMMIndex.ADD('ZMM9');
  5055. FReg64ZMMIndex.ADD('ZMM10');
  5056. FReg64ZMMIndex.ADD('ZMM11');
  5057. FReg64ZMMIndex.ADD('ZMM12');
  5058. FReg64ZMMIndex.ADD('ZMM13');
  5059. FReg64ZMMIndex.ADD('ZMM14');
  5060. FReg64ZMMIndex.ADD('ZMM15');
  5061. FReg64ZMMIndex.ADD('ZMM16');
  5062. FReg64ZMMIndex.ADD('ZMM17');
  5063. FReg64ZMMIndex.ADD('ZMM18');
  5064. FReg64ZMMIndex.ADD('ZMM19');
  5065. FReg64ZMMIndex.ADD('ZMM20');
  5066. FReg64ZMMIndex.ADD('ZMM21');
  5067. FReg64ZMMIndex.ADD('ZMM22');
  5068. FReg64ZMMIndex.ADD('ZMM23');
  5069. FReg64ZMMIndex.ADD('ZMM24');
  5070. FReg64ZMMIndex.ADD('ZMM25');
  5071. FReg64ZMMIndex.ADD('ZMM26');
  5072. FReg64ZMMIndex.ADD('ZMM27');
  5073. FReg64ZMMIndex.ADD('ZMM28');
  5074. FReg64ZMMIndex.ADD('ZMM29');
  5075. FReg64ZMMIndex.ADD('ZMM30');
  5076. FReg64ZMMIndex.ADD('ZMM31');
  5077. FRegKREG.ADD('K0');
  5078. FRegKREG.ADD('K1');
  5079. FRegKREG.ADD('K2');
  5080. FRegKREG.ADD('K3');
  5081. FRegKREG.ADD('K4');
  5082. FRegKREG.ADD('K5');
  5083. FRegKREG.ADD('K6');
  5084. FRegKREG.ADD('K7');
  5085. end;
  5086. destructor TAsmTestGenerator.Destroy;
  5087. begin
  5088. FreeAndNil(FReg8);
  5089. FreeAndNil(FReg16);
  5090. FreeAndNil(FReg32Base);
  5091. FreeAndNil(FReg32Index);
  5092. FreeAndNil(FReg64Base);
  5093. FreeAndNil(FReg64Index);
  5094. FreeAndNil(FReg6432Base);
  5095. FreeAndNil(FReg6432Index);
  5096. FreeAndNil(FReg32XMMIndex);
  5097. FreeAndNil(FReg32YMMIndex);
  5098. FreeAndNil(FReg32ZMMIndex);
  5099. FreeAndNil(FReg64XMMIndex);
  5100. FreeAndNil(FReg64YMMIndex);
  5101. FreeAndNil(FReg64ZMMIndex);
  5102. FreeAndnil(FRegKREG);
  5103. inherited;
  5104. end;
  5105. procedure TAsmTestGenerator.MemRegBaseIndexCombi(const aPrefix, aSuffix: String; aSLBaseReg,
  5106. aSLIndexReg, aRList: TStringList);
  5107. var
  5108. il_Base: integer;
  5109. il_Index: integer;
  5110. begin
  5111. for il_Base := 0 to aSLBaseReg.Count - 1 do
  5112. begin
  5113. aRList.Add(format(aPrefix + '[%s]%s', [aSLBaseReg[il_Base], aSuffix]));
  5114. for il_Index := 0 to aSLIndexReg.Count - 1 do
  5115. begin
  5116. aRList.Add(format(aPrefix + '[%s + %s]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  5117. aRList.Add(format(aPrefix + '[%s + %s + $10]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  5118. aRList.Add(format(aPrefix + '[%s + %s + $40]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  5119. aRList.Add(format(aPrefix + '[%s + %s - $10]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  5120. aRList.Add(format(aPrefix + '[%s + %s - $40]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  5121. aRList.Add(format(aPrefix + '[%s + %s * 2]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  5122. aRList.Add(format(aPrefix + '[%s + %s * 4]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  5123. aRList.Add(format(aPrefix + '[%s + %s * 8]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  5124. aRList.Add(format(aPrefix + '[%s + %s * 2 + 16]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  5125. aRList.Add(format(aPrefix + '[%s + %s * 4 + 32]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  5126. aRList.Add(format(aPrefix + '[%s + %s * 8 + 64]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  5127. end;
  5128. end;
  5129. end;
  5130. procedure TAsmTestGenerator.MemRegBaseIndexCombiCDISP8N(const aPrefix,
  5131. aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
  5132. var
  5133. iBase: integer;
  5134. iIndex: integer;
  5135. iOffset: integer;
  5136. begin
  5137. for iBase := 0 to aSLBaseReg.Count - 1 do
  5138. begin
  5139. for iOffset := 0 to 63 do
  5140. begin
  5141. aRList.Add(format(aPrefix + '[%s +%2d]', [aSLBaseReg[iBase], iOffset]));
  5142. for iIndex := 0 to aSLIndexReg.Count - 1 do
  5143. begin
  5144. if aSLBaseReg[iBase] <> aSLIndexReg[iIndex] then
  5145. begin
  5146. aRList.Add(format(aPrefix + '[%s + %s + %2d]', [aSLBaseReg[iBase], aSLIndexReg[iIndex], iOffset]));
  5147. aRList.Add(format(aPrefix + '[%s + %s * 2 + %2d]', [aSLBaseReg[iBase], aSLIndexReg[iIndex], iOffset]));
  5148. aRList.Add(format(aPrefix + '[%s + %s * 4 + %2d]', [aSLBaseReg[iBase], aSLIndexReg[iIndex], iOffset]));
  5149. aRList.Add(format(aPrefix + '[%s + %s * 8 + %2d]', [aSLBaseReg[iBase], aSLIndexReg[iIndex], iOffset]));
  5150. end;
  5151. end;
  5152. end;
  5153. end;
  5154. end;
  5155. procedure TAsmTestGenerator.VectorMemRegBaseIndexCombi(const aPrefix, aSuffix: String;
  5156. aSLBaseReg, aSLIndexReg, aRList: TStringList);
  5157. var
  5158. il_Base: integer;
  5159. il_Index: integer;
  5160. begin
  5161. //for il_Index := 0 to aSLIndexReg.Count - 1 do
  5162. //begin
  5163. // aRList.Add(format(aPrefix + '[%s]', [aSLIndexReg[il_Index]]));
  5164. //
  5165. // aRList.Add(format(aPrefix + '[%s * 2]', [aSLIndexReg[il_Index]]));
  5166. // aRList.Add(format(aPrefix + '[%s * 4]', [aSLIndexReg[il_Index]]));
  5167. // aRList.Add(format(aPrefix + '[%s * 8]', [aSLIndexReg[il_Index]]));
  5168. //
  5169. // aRList.Add(format(aPrefix + '[%s * 2 + 16]', [aSLIndexReg[il_Index]]));
  5170. // aRList.Add(format(aPrefix + '[%s * 4 + 32]', [aSLIndexReg[il_Index]]));
  5171. // aRList.Add(format(aPrefix + '[%s * 8 + 48]', [aSLIndexReg[il_Index]]));
  5172. //end;
  5173. for il_Base := 0 to aSLBaseReg.Count - 1 do
  5174. begin
  5175. //aRList.Add(format(aPrefix + '[%s]', [aSLBaseReg[il_Base]]));
  5176. for il_Index := 0 to aSLIndexReg.Count - 1 do
  5177. begin
  5178. aRList.Add(format(aPrefix + '[%s + %s]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  5179. aRList.Add(format(aPrefix + '[%s + %s * 2]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  5180. aRList.Add(format(aPrefix + '[%s + %s * 4]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  5181. aRList.Add(format(aPrefix + '[%s + %s * 8]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  5182. //aRList.Add(format(aPrefix + '[%s + %s * 2 + 16]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
  5183. //aRList.Add(format(aPrefix + '[%s + %s * 4 + 32]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
  5184. //aRList.Add(format(aPrefix + '[%s + %s * 8 + 48]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
  5185. aRList.Add(format(aPrefix + '[%s + %s]%s', [aSLIndexReg[il_Index], aSLBaseReg[il_Base], aSuffix]));
  5186. //aRList.Add(format(aPrefix + '[%s + %s + 16]', [aSLIndexReg[il_Index], aSLBaseReg[il_Base]]));
  5187. end;
  5188. end;
  5189. end;
  5190. function TAsmTestGenerator.ParseBaseIndexReg(const aOp: string; var aBaseReg,
  5191. aIndexReg: string): boolean;
  5192. var
  5193. iStartPos: integer;
  5194. iEndPos: integer;
  5195. iPos: integer;
  5196. sOp: string;
  5197. sBaseReg: string;
  5198. sIndexReg: string;
  5199. begin
  5200. result := false;
  5201. aBaseReg := '';
  5202. aIndexReg := '';
  5203. iStartPos := Pos('[', aOp);
  5204. iEndPos := Pos(']', aOp);
  5205. if (iStartPos > 0) and
  5206. (iEndPos > 0) and
  5207. (iStartPos < iEndPos) then
  5208. begin
  5209. sOp := trim(copy(aOp, iStartPos + 1, iEndPos - iStartPos - 1));
  5210. with TStringList.Create do
  5211. try
  5212. CommaText := StringReplace(sOp, '+', ',', [rfReplaceAll]);
  5213. while Count < 2 do Add('');
  5214. sBaseReg := trim(Strings[0]);
  5215. if (FReg32Base.IndexOf(sBasereg) >= 0) or
  5216. (FReg64Base.IndexOf(sBasereg) >= 0) or
  5217. (FReg6432Base.IndexOf(sBasereg) >= 0) then
  5218. aBaseReg := sBaseReg;
  5219. sIndexReg := trim(Strings[1]);
  5220. if (FReg32Index.IndexOf(sIndexReg) >= 0) or
  5221. (FReg64Index.IndexOf(sIndexReg) >= 0) or
  5222. (FReg6432Index.IndexOf(sIndexReg) >= 0) then
  5223. aIndexReg := sIndexReg;
  5224. result := trim(aBasereg) <> '';
  5225. finally
  5226. Free;
  5227. end;
  5228. end;
  5229. end;
  5230. class procedure TAsmTestGenerator.CalcTestData(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3,
  5231. aOp4: String; aSL: TStringList);
  5232. var
  5233. sl: TStringList;
  5234. begin
  5235. with TAsmTestGenerator.Create do
  5236. try
  5237. Fx64 := aX64;
  5238. FAVX512 := aAVX512;
  5239. FSAE := aSAE;
  5240. sl := InternalCalcTestData(aInst, aOp1, aOp2, aOp3, aOp4);
  5241. try
  5242. aSL.AddStrings(sl);
  5243. finally
  5244. FreeAndNil(sl);
  5245. end;
  5246. finally
  5247. Free;
  5248. end;
  5249. end;
  5250. class procedure TAsmTestGenerator.CalcTestDataMREF(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3,
  5251. aOp4: String; aSL: TStringList);
  5252. var
  5253. sl: TStringList;
  5254. begin
  5255. with TAsmTestGenerator.Create do
  5256. try
  5257. Fx64 := aX64;
  5258. FAVX512 := aAVX512;
  5259. FSAE := aSAE;
  5260. sl := InternalCalcTestDataMREF(aInst, aOp1, aOp2, aOp3, aOp4);
  5261. try
  5262. aSL.AddStrings(sl);
  5263. finally
  5264. FreeAndNil(sl);
  5265. end;
  5266. finally
  5267. Free;
  5268. end;
  5269. end;
  5270. class procedure TAsmTestGenerator.CalcTestDataCDisp8(aX64, aAVX512,
  5271. aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList);
  5272. var
  5273. sl: TStringList;
  5274. begin
  5275. with TAsmTestGenerator.Create do
  5276. try
  5277. Fx64 := aX64;
  5278. FAVX512 := aAVX512;
  5279. FSAE := aSAE;
  5280. sl := InternalCalcTestDataCDisp8(aInst, aOp1, aOp2, aOp3, aOp4);
  5281. try
  5282. aSL.AddStrings(sl);
  5283. finally
  5284. FreeAndNil(sl);
  5285. end;
  5286. finally
  5287. Free;
  5288. end;
  5289. end;
  5290. class procedure TAsmTestGenerator.CalcTestInstFile;
  5291. var
  5292. i,j: integer;
  5293. sInst: string;
  5294. sI386: string;
  5295. sX8664: string;
  5296. sAVX512: string;
  5297. sOperands: string;
  5298. sLine: string;
  5299. sl: TStringList;
  5300. bVEX: boolean;
  5301. bEVEX: boolean;
  5302. b256 : boolean;
  5303. b512 : boolean;
  5304. begin
  5305. sl := TStringList.Create;
  5306. try
  5307. //tinsentry=packed record
  5308. // opcode : tasmop;
  5309. // ops : byte;
  5310. // //optypes : array[0..max_operands-1] of longint;
  5311. // optypes : array[0..3] of int64; //TG
  5312. // code : array[0..11] of char;
  5313. // flags : tinsflags;
  5314. //end;
  5315. for i := 0 to length(InsTab) - 1 do
  5316. begin
  5317. bVEX := false;
  5318. bEVEX := false;
  5319. b256 := false;
  5320. b512 := false;
  5321. //TG TODO delete
  5322. if instab[i].opcode = a_vtestps then
  5323. begin
  5324. b512 := b512;
  5325. end;
  5326. for j := 0 to length(InsTab[i].code) - 1 do
  5327. begin
  5328. case ord(InsTab[i].code[j]) of
  5329. 0: break;
  5330. 1,2,3: break;
  5331. 232: bEVEX := true;
  5332. 233: b512 := true;
  5333. 242: bVEX := true;
  5334. 244: b256 := true;
  5335. end;
  5336. end;
  5337. if bVEX or bEVEX then
  5338. begin
  5339. sInst := std_op2str[InsTab[i].opcode];
  5340. sI386 := '1';
  5341. sX8664 := '1';
  5342. if IF_X86_64 in InsTab[i].flags then
  5343. begin
  5344. sI386 := '0';
  5345. end;
  5346. if bEVEX then sAVX512 := '1'
  5347. else sAVX512 := '0';
  5348. sOperands := '';
  5349. for j := 0 to 3 do
  5350. begin
  5351. case InsTab[i].optypes[j] of
  5352. OT_XMMREG: sOperands := sOperands + 'XMMREG,';
  5353. OT_XMMREG_M: sOperands := sOperands + 'XMMREG_M,';
  5354. OT_XMMREG_MZ: sOperands := sOperands + 'XMMREG_MZ,';
  5355. OT_XMMREG_ER: sOperands := sOperands + 'XMMREG_ER,';
  5356. OT_XMMREG_SAE: sOperands := sOperands + 'XMMREG_SAE,';
  5357. OT_XMMRM: sOperands := sOperands + 'XMMRM,';
  5358. OT_XMMRM_MZ: sOperands := sOperands + 'XMMRM_MZ,';
  5359. OT_YMMREG: sOperands := sOperands + 'YMMREG,';
  5360. OT_YMMREG_M: sOperands := sOperands + 'YMMREG_M,';
  5361. OT_YMMREG_MZ: sOperands := sOperands + 'YMMREG_MZ,';
  5362. OT_YMMREG_ER: sOperands := sOperands + 'YMMREG_ER,';
  5363. OT_YMMREG_SAE: sOperands := sOperands + 'YMMREG_SAE,';
  5364. OT_YMMRM: sOperands := sOperands + 'YMMRM,';
  5365. OT_YMMRM_MZ: sOperands := sOperands + 'YMMRM_MZ,';
  5366. OT_ZMMREG: sOperands := sOperands + 'ZMMREG,';
  5367. OT_ZMMREG_M: sOperands := sOperands + 'ZMMREG_M,';
  5368. OT_ZMMREG_MZ: sOperands := sOperands + 'ZMMREG_MZ,';
  5369. OT_ZMMREG_ER: sOperands := sOperands + 'ZMMREG_ER,';
  5370. OT_ZMMREG_SAE: sOperands := sOperands + 'ZMMREG_SAE,';
  5371. OT_ZMMRM: sOperands := sOperands + 'ZMMRM,';
  5372. OT_ZMMRM_MZ: sOperands := sOperands + 'ZMMRM_MZ,';
  5373. OT_MEM32: sOperands := sOperands + 'MEM32,';
  5374. OT_MEM64: sOperands := sOperands + 'MEM64,';
  5375. OT_MEM128: sOperands := sOperands + 'MEM128,';
  5376. OT_MEM256: sOperands := sOperands + 'MEM256,';
  5377. OT_MEM512: sOperands := sOperands + 'MEM512,';
  5378. OT_REG32: sOperands := sOperands + 'REG32,';
  5379. OT_REG64: sOperands := sOperands + 'REG64,';
  5380. ot_rm_gpr or ot_bits32:
  5381. sOperands := sOperands + 'RM32,';
  5382. ot_rm_gpr or ot_bits64:
  5383. sOperands := sOperands + 'RM64,';
  5384. OT_XMEM32: sOperands := sOperands + 'XMEM32,';
  5385. OT_XMEM64: sOperands := sOperands + 'XMEM64,';
  5386. OT_YMEM32: sOperands := sOperands + 'YMEM32,';
  5387. OT_YMEM64: sOperands := sOperands + 'YMEM64,';
  5388. OT_IMM8: sOperands := sOperands + 'IMM8,';
  5389. OT_NONE: sOperands := sOperands + ',';
  5390. OT_BMEM32: if b512 then sOperands := sOperands + '16B32,'
  5391. else if b256 then sOperands := sOperands + '8B32,'
  5392. else sOperands := sOperands + '4B32,';
  5393. OT_BMEM64: if b512 then sOperands := sOperands + '8B32,'
  5394. else if b256 then sOperands := sOperands + '4B32,'
  5395. else sOperands := sOperands + '2B64,';
  5396. OT_KREG: sOperands := sOperands + 'KREG,';
  5397. OT_KREG_M: sOperands := sOperands + 'KREG_M,';
  5398. else sOperands := sOperands;
  5399. end;
  5400. end;
  5401. sOperands := copy(sOperands, 1, length(sOperands) - 1);
  5402. sl.Add(format('FOpCodeList.Add(''%s,%s,%s,%s,%s'');', [sInst, sI386, sX8664, sAVX512, sOperands]));
  5403. end;
  5404. end;
  5405. sl.Savetofile('/tmp/fpcavx512.txt');
  5406. // std_op2str
  5407. finally
  5408. FreeAndnil(sl);
  5409. end;
  5410. end;
  5411. class procedure TAsmTestGenerator.ListMemRefState;
  5412. var
  5413. i: integer;
  5414. sGasSufffix: string;
  5415. mrsize: TMemRefSizeInfo;
  5416. opcode: tasmop;
  5417. sl: TStringList;
  5418. slEmpty: TStringList;
  5419. begin
  5420. BuildInsTabCache;
  5421. BuildInsTabMemRefSizeInfoCache;
  5422. slEmpty := TStringList.Create;
  5423. try
  5424. for mrsize := low(TMemRefSizeInfo) to high(TMemRefSizeInfo) do
  5425. begin
  5426. sl := TStringList.Create;
  5427. try
  5428. for opcode:=low(tasmop) to high(tasmop) do
  5429. begin
  5430. if InsTabMemRefSizeInfoCache^[opcode].MemRefSize = mrsize then
  5431. begin
  5432. sGasSufffix:='';
  5433. if gas_needsuffix[opcode] <> AttSufNone then
  5434. sGasSufffix:=GetEnumName(Typeinfo(TAttSuffix), ord(gas_needsuffix[opcode]));
  5435. sl.add(format('%-25s: %s: %s', [GetEnumName(Typeinfo(TMemRefSizeInfo), ord(mrsize)), std_op2str[opcode], sGasSufffix]));
  5436. end;
  5437. end;
  5438. sl.Sort;
  5439. if sl.Count > 0 then
  5440. begin
  5441. writeln;
  5442. writeln(sl.text);
  5443. end
  5444. else slEmpty.Add(GetEnumName(Typeinfo(TMemRefSizeInfo), ord(mrsize)));
  5445. finally
  5446. FreeAndNil(sl);
  5447. end;
  5448. end;
  5449. slEmpty.Sort;
  5450. writeln('');
  5451. writeln(slEmpty.Text);
  5452. finally
  5453. FreeAndNil(slEmpty);
  5454. end;
  5455. if assigned(instabcache) then
  5456. begin
  5457. dispose(instabcache);
  5458. instabcache:=nil;
  5459. end;
  5460. if assigned(InsTabMemRefSizeInfoCache) then
  5461. begin
  5462. dispose(InsTabMemRefSizeInfoCache);
  5463. InsTabMemRefSizeInfoCache:=nil;
  5464. end;
  5465. end;
  5466. end.