asmtestgenerator.pas 251 KB

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